chmod(2) System Calls Manual chmod(2) NAZWA chmod, fchmod, fchmodat - zmienia prawa do pliku BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); #include /* Definicja stalych AT_* */ #include int fchmodat(int dirfd, const char *pathname, mode_t mode, int flags); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): fchmod(): Od glibc 2.24: _POSIX_C_SOURCE >= 199309L glibc 2.19 do glibc 2.23 _POSIX_C_SOURCE glibc 2.16 do glibc 2.19: _BSD_SOURCE || _POSIX_C_SOURCE glibc 2.12 do glibc 2.16: _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _POSIX_C_SOURCE >= 200809L glibc 2.11 i wczesniejsze: _BSD_SOURCE || _XOPEN_SOURCE >= 500 fchmodat(): Od glibc 2.10: _POSIX_C_SOURCE >= 200809L Przed glibc 2.10: _ATFILE_SOURCE OPIS Wywolania systemowe chmod() oraz fchmod() modyfikuja bity trybu pliku. (Tryb pliku sklada sie z bitow uprawnien do pliku plus set-user-ID, set-group-ID oraz bitu lepkosci). Te wywolania systemowe roznia sie tylko sposobem okreslenia pliku: o chmod() zmienia tryb okreslonego pliku, ktorego sciezka jest podana w pathname, ktora jest rozwiazywana, jesli jest to dowiazanie symboliczne. o fchmod() zmienia tryb pliku przypisanego do deskryptora otwartego pliku fd. Tryb nowego pliku jest okreslony w mode, ktory jest maska bitowa stworzona jako suma logiczna (OR) zera lub wiecej nastepujacych: S_ISUID (04000) set-user-ID (ustawia efektywny ID uzytkownika procesu na execve(2)) S_ISGID (02000) set-group-ID (ustawia efektywny ID grupy na procesie na execve(2); obowiazkowe blokowanie, jak opisano w fcntl(2); bierze grupe nowego pliku z katalogu nadrzednego, jak opisano w chown(2) i mkdir(2)) S_ISVTX (01000) bit lepkosci (flaga ograniczonego usuwania, jak opisano w unlink(2)) S_IRUSR (00400) odczyt przez wlasciciela S_IWUSR (00200) zapis przez wlasciciela S_IXUSR (00100) wykonanie/wyszukiwanie przez wlasciciela (,,wyszukiwanie" dotyczy katalogow, oraz oznacza mozliwosc wejscia do katalogu) S_IRGRP (00040) odczyt przez grupe S_IWGRP (00020) zapis przez grupe S_IXGRP (00010) uruchomianie/przeszukiwanie przez grupe S_IROTH (00004) odczyt przez pozostalych S_IWOTH (00002) zapis przez pozostalych S_IXOTH (00001) uruchomianie/przeszukiwanie przez pozostalych Efektywny UID wywolywanego procesu musi zgadzac sie z wlascicielem pliku, lub proces musi byc uprzywilejowany (Linux: musi miec przywilej (ang. capability) CAP_FOWNER). Jesli wywolany proces nie jest uprzywilejowany (Linux: nie ma przywileju CAP_FSETID), oraz grupa pliku nie zgadza sie z efektywnym ID grupy procesu lub jednej z jego dodatkowych ID grupy, S_ISGID zostanie wylaczony, lecz nie spowoduje to zwrocenia bledu. Jako wyznacznik bezpieczenstwa, zaleznie od systemu plikow, bity SUID i SGID moga zostac wylaczone podczas zapisywania pliku (na Linuksie, zdarza sie to jesli zapisujacy proces nie ma przywileju CAP_FSETID). Na niektorych systemach plikow, tylko superuzytkownik moze ustawic bit lepkosci, ktory moze miec specjalne znaczenie. Znaczenie bitow lepkosci, SUID i SGID dla katalogow opisano w inode(7). Na systemach plikow NFS, ograniczanie praw bedzie mialo natychmiastowy wplyw na aktualnie otwarte pliki, gdyz kontrola dostepu dokonywana jest na serwerze, a otwarte pliki obslugiwane sa przez klienta. Rozszerzenie uprawnien moze zostac udostepnione z opoznieniem innym klientom, jesli maja wlaczone buforowanie atrybutow. fchmodat() Wywolanie systemowe fchmodat() operuje w dokladnie taki sam sposob jak chmod(), z wyjatkiem roznic opisanych tutaj. Jesli sciezka podana w sciezka jest wzgledna, wtedy jest ona interpretowana wzgledem katalogu przypisanego przez deskryptor pliku dirfd (zamiast wzgledem obecnego katalogu roboczego wywolanego procesu, tak jak dzieje sie to w przypadku chmod() dla wzglednych sciezek. Jesli sciezka jest wzgledna, a dirdf ma szczegolna wartosc AT_FDCWD, wtedy sciezka jest interpretowana wzglednie do obecnego katalogu roboczego wywolanego procesu (jak w chmod()). Jesli sciezka pathname jest bezwzgledna, to dirfd jest ignorowane. flags moga byc 0 lub zawierac nastepujace znaczniki: AT_SYMLINK_NOFOLLOW Jesli pathname jest dowiazaniem symbolicznym, nie rozwiazuje go: w zamian operuje na samym dowiazaniu. Ten znacznik nie jest obecnie zaimplementowany. Potrzeba fchmodat() jest wyjasniona w openat(2) WARTOSC ZWRACANA Po pomyslnym zakonczeniu zwracane jest zero. Po bledzie zwracane jest -1 i ustawiane jest errno wskazujac blad. BLEDY W zaleznosci od systemu plikow, moga wystapic bledy niewymienione ponizej. Powszechniejsze bledy fchmod sa nastepujace: EACCES Brak praw do przeszukiwania dla skladowej sciezki (zob. takze path_resolution(7)). EBADF (fchmod()) Deskryptor pliku fd jest nieprawidlowy. EBADF (fchmodat()) pathname jest wzgledne, lecz dirfd nie wynosi ani AT_FDCWD, ani nie jest prawidlowym deskryptorem pliku. EFAULT pathname wskazuje poza dostepna dla uzytkownika przestrzen adresowa. EINVAL (fchmodat()) Podano nieprawidlowy znacznik w flags. EIO Wystapil blad wejscia/wyjscia. ELOOP Podczas rozwiazywania pathname napotkano zbyt wiele dowiazan symbolicznych. ENAMETOOLONG Sciezka pathname jest zbyt dluga. ENOENT Plik nie istnieje. ENOMEM Brak pamieci jadra. ENOTDIR Skladnik sciezki nie jest katalogiem. ENOTDIR (fchmodat()) pathname jest wzgledna a dirfd jest deskryptorem pliku odnoszacym sie do pliku zamiast do katalogu. ENOTSUP (fchmodat()) flags okreslono na AT_SYMLINK_NOFOLLOW, ktory nie jest obslugiwany. EPERM Efektywny UID nie odpowiada wlascicielowi pliku, a proces nie jest uprzywilejowany (Linux: nie ma przywileju CAP_FOWNER). EPERM Plik jest oznaczony jako tylko do odczytu lub tylko do nadpisu (zob. rowniez ioctl_iflags(2)). EROFS Podany plik znajduje sie na systemie plikow przeznaczonym tylko do odczytu. WERSJE Roznice biblioteki C/jadra Funkcja opakowujaca fchmodat() z biblioteki GNU C implementuje okreslony w POSIX interfejs opisany na tej stronie. Ten interfejs rozni sie od zaszytego w Linuksie wywolania systemowego, ktore nie ma argumentu flags. Uwagi dla glibc Na starszych wersjach jadra Linuxa gdzie fchmodat() nie bylo dostepne, funkcja opakowujaca z glibc wraca do uzywania chmod(). Kiedy pathname jest wzgledna sciezka, glibc konstruuje sciezke na bazie dowiazania symbolicznego w /proc/self/fd, ktory odpowiada argumentowi dirfd. STANDARDY POSIX.1-2008. HISTORIA chmod() fchmod() 4.4BSD, SVr4, POSIX.1-2001. fchmodat() POSIX.1-2008. Linux 2.6.16, glibc 2.4. ZOBACZ TAKZE chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7) TLUMACZENIE Autorami polskiego tlumaczenia niniejszej strony podrecznika sa: Przemek Borys , Andrzej Krzysztofowicz i Michal Kulach Niniejsze tlumaczenie jest wolna dokumentacja. Blizsze informacje o warunkach licencji mozna uzyskac zapoznajac sie z GNU General Public License w wersji 3 lub nowszej. Nie przyjmuje sie ZADNEJ ODPOWIEDZIALNOSCI. Bledy w tlumaczeniu strony podrecznika prosimy zglaszac na adres listy dyskusyjnej . Linux man-pages 6.06 31 pazdziernika 2023 r. chmod(2)