Provided by: manpages-pl-dev_4.23.1-1_all
NAZWA
chmod, fchmod, fchmodat - zmienia prawa do pliku
BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)
SKŁADNIA
#include <sys/stat.h> int chmod(const char *pathname, mode_t mode); int fchmod(int fd, mode_t mode); #include <fcntl.h> /* Definicja stałych AT_* */ #include <sys/stat.h> 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 wcześniejsze: _BSD_SOURCE || _XOPEN_SOURCE >= 500 fchmodat(): Od glibc 2.10: _POSIX_C_SOURCE >= 200809L Przed glibc 2.10: _ATFILE_SOURCE
OPIS
Wywołania systemowe chmod() oraz fchmod() modyfikują bity trybu pliku. (Tryb pliku składa się z bitów uprawnień do pliku plus set-user-ID, set-group-ID oraz bitu lepkości). Te wywołania systemowe różnią się tylko sposobem określenia pliku: • chmod() zmienia tryb określonego pliku, którego ścieżka jest podana w pathname, która jest rozwiązywana, jeśli jest to dowiązanie symboliczne. • fchmod() zmienia tryb pliku przypisanego do deskryptora otwartego pliku fd. Tryb nowego pliku jest określony w mode, który jest maską bitową stworzoną jako suma logiczna (OR) zera lub więcej następujących: S_ISUID (04000) set-user-ID (ustawia efektywny ID użytkownika procesu na execve(2)) S_ISGID (02000) set-group-ID (ustawia efektywny ID grupy na procesie na execve(2); obowiązkowe blokowanie, jak opisano w fcntl(2); bierze grupę nowego pliku z katalogu nadrzędnego, jak opisano w chown(2) i mkdir(2)) S_ISVTX (01000) bit lepkości (flaga ograniczonego usuwania, jak opisano w unlink(2)) S_IRUSR (00400) odczyt przez właściciela S_IWUSR (00200) zapis przez właściciela S_IXUSR (00100) wykonanie/wyszukiwanie przez właściciela („wyszukiwanie” dotyczy katalogów, oraz oznacza możliwość wejścia do katalogu) S_IRGRP (00040) odczyt przez grupę S_IWGRP (00020) zapis przez grupę S_IXGRP (00010) uruchomianie/przeszukiwanie przez grupę S_IROTH (00004) odczyt przez pozostałych S_IWOTH (00002) zapis przez pozostałych S_IXOTH (00001) uruchomianie/przeszukiwanie przez pozostałych Efektywny UID wywoływanego procesu musi zgadzać się z właścicielem pliku, lub proces musi być uprzywilejowany (Linux: musi mieć przywilej (ang. capability) CAP_FOWNER). Jeśli wywołany proces nie jest uprzywilejowany (Linux: nie ma przywileju CAP_FSETID), oraz grupa pliku nie zgadza się z efektywnym ID grupy procesu lub jednej z jego dodatkowych ID grupy, S_ISGID zostanie wyłączony, lecz nie spowoduje to zwrócenia błędu. Jako wyznacznik bezpieczeństwa, zależnie od systemu plików, bity SUID i SGID mogą zostać wyłączone podczas zapisywania pliku (na Linuksie, zdarza się to jeśli zapisujący proces nie ma przywileju CAP_FSETID). Na niektórych systemach plików, tylko superużytkownik może ustawić bit lepkości, który może mieć specjalne znaczenie. Znaczenie bitów lepkości, SUID i SGID dla katalogów opisano w inode(7). Na systemach plików NFS, ograniczanie praw będzie miało natychmiastowy wpływ na aktualnie otwarte pliki, gdyż kontrola dostępu dokonywana jest na serwerze, a otwarte pliki obsługiwane są przez klienta. Rozszerzenie uprawnień może zostać udostępnione z opóźnieniem innym klientom, jeśli mają włączone buforowanie atrybutów. fchmodat() Wywołanie systemowe fchmodat() operuje w dokładnie taki sam sposób jak chmod(), z wyjątkiem różnic opisanych tutaj. Jeśli ścieżka podana w ścieżka jest względna, wtedy jest ona interpretowana względem katalogu przypisanego przez deskryptor pliku dirfd (zamiast względem obecnego katalogu roboczego wywołanego procesu, tak jak dzieje się to w przypadku chmod() dla względnych ścieżek. Jeśli ścieżka jest względna, a dirdf ma szczególną wartość AT_FDCWD, wtedy ścieżka jest interpretowana względnie do obecnego katalogu roboczego wywołanego procesu (jak w chmod()). Jeśli ścieżka pathname jest bezwzględna, to dirfd jest ignorowane. flags mogą być 0 lub zawierać następujące znaczniki: AT_SYMLINK_NOFOLLOW Jeśli pathname jest dowiązaniem symbolicznym, nie rozwiązuje go: w zamian operuje na samym dowiązaniu. Ten znacznik nie jest obecnie zaimplementowany. Potrzeba fchmodat() jest wyjaśniona w openat(2)
WARTOŚĆ ZWRACANA
Po pomyślnym zakończeniu zwracane jest zero. Po błędzie zwracane jest -1 i ustawiane errno, wskazując błąd.
BŁĘDY
W zależności od systemu plików, mogą wystąpić błędy niewymienione poniżej. Powszechniejsze błędy fchmod są następujące: EACCES Brak praw do przeszukiwania dla składowej ścieżki (zob. także path_resolution(7)). EBADF (fchmod()) Deskryptor pliku fd jest nieprawidłowy. EBADF (fchmodat()) pathname jest względne, lecz dirfd nie wynosi ani AT_FDCWD, ani nie jest prawidłowym deskryptorem pliku. EFAULT pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową. EINVAL (fchmodat()) Podano nieprawidłowy znacznik w flags. EIO Wystąpił błąd wejścia/wyjścia. ELOOP Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań symbolicznych. ENAMETOOLONG Ścieżka pathname jest zbyt długa. ENOENT Plik nie istnieje. ENOMEM Brak pamięci jądra. ENOTDIR Składowa ścieżki nie jest katalogiem. ENOTDIR (fchmodat()) pathname jest względna a dirfd jest deskryptorem pliku odnoszącym się do pliku zamiast do katalogu. ENOTSUP (fchmodat()) flags określono na AT_SYMLINK_NOFOLLOW, który nie jest obsługiwany. EPERM Efektywny UID nie odpowiada właścicielowi 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. również ioctl_iflags(2)). EROFS Podany plik znajduje się na systemie plików przeznaczonym tylko do odczytu.
WERSJE
Różnice biblioteki C/jądra Funkcja opakowująca fchmodat() z biblioteki GNU C implementuje określony w POSIX interfejs opisany na tej stronie. Ten interfejs różni się od zaszytego w Linuksie wywołania systemowego, które nie ma argumentu flags. Uwagi dla glibc Na starszych wersjach jądra Linuxa gdzie fchmodat() nie było dostępne, funkcja opakowująca z glibc wraca do używania chmod(). Kiedy pathname jest względną ścieżką, glibc konstruuje ścieżkę na bazie dowiązania symbolicznego w /proc/self/fd, który 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 TAKŻE
chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7)
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys@dione.ids.pl>, Andrzej Krzysztofowicz <ankry@green.mf.pg.gda.pl> i Michał Kułach <michal.kulach@gmail.com> Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje o warunkach licencji można uzyskać zapoznając się z GNU General Public License w wersji 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI. Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres listy dyskusyjnej ⟨manpages-pl-list@lists.sourceforge.net⟩.