chmod(2)

NAZWA
chmod, fchmod, fchmodat - zmienia prawa do pliku

BIBLIOTEKA
Standardowa biblioteka C (libc, -lc)

SKŁADNIA
#include <sys/stat.h>

int chmod(const char *path, 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 *path, 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 path, 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 path 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 path jest względna a dirfd ma wartość specjalną AT_FDCWD, to path jest interpretowana w odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak chmod()).

Jeśli ścieżka path jest bezwzględna, to dirfd jest ignorowane.

flags mogą być 0 lub zawierać następujące znaczniki:

AT_EMPTY_PATH (od Linuksa 6.6)
    Jeśli path jest pustym łańcuchem, działa na pliku do którego odnosi się dirfd (który mógł być pozyskany za pomocą znacznika O_PATH open(2)). W tym przypadku dirfd może odnosić się do dowolnego typu pliku, a nie tylko katalogu. Jeśli dirfd wynosi AT_FDCWD, to wywołanie działa na bieżącym katalogu roboczym. Znacznik ten jest charakterystyczny dla Linuksa; należy zdefiniować _GNU_SOURCE, aby pozyskać jego definicję.

AT_SYMLINK_NOFOLLOW
    Jeśli path jest dowiązaniem symbolicznym, nie rozwiązuje go: w zamian operuje na samym dowiązaniu.

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()) path jest względna, lecz dirfd nie wynosi ani AT_FDCWD, ani nie jest prawidłowym deskryptorem pliku.

EFAULT
    path 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 path napotkano zbyt wiele dowiązań symbolicznych.

ENAMETOOLONG
    path jest zbyt długie.

ENOENT
    Plik nie istnieje.

ENOMEM
    Brak pamięci jądra.

ENOTDIR
    Składowa ścieżki nie jest katalogiem.

ENOTDIR
    (fchmodat()) path 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ż FS_IOC_SETFLAGS(2const)).

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 path 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-2024.

HISTORIA

chmod()
    SVr4, POSIX.1-1988, 4.4BSD.

fchmod()
    SVr4, 4.4BSD, SUSv1, POSIX.1-1996.

fchmodat()
    POSIX.1-2008. Linux 2.6.16, glibc 2.4.

AT_SYMLINK_NOFOLLOW
    POSIX.1-2008, glibc 2.32, Linux 6.5.

ZOBACZ TAKŻE
chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7)

TŁUMACZENIE
Tłumaczenie niniejszej strony podręcznika: 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.