NAZWA
chmod, fchmod, fchmodat - zmiana praw do pliku
SKŁADNIA
#include <sys/stat.h>
int
chmod(const char *pathname, mode_t
mode);
int fchmod(int fd, mode_t
mode);
#include
<fcntl.h> /* Definition of AT_* constants */
#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 2.23
_POSIX_C_SOURCE
Glibc 2.16 do 2.19:
_BSD_SOURCE || _POSIX_C_SOURCE
Glibc 2.12 do 2.16:
_BSD_SOURCE || _XOPEN_SOURCE >= 500 ||
_POSIX_C_SOURCE >= 200809L
Glibc 2.11 oraz 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 sticky bitu.) 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ązana, jeśli jest to link symboliczny. | ||
* |
fchmod() zmienia tryb pliku przypisanego do deskryptora otwartego pliku fd. |
Tryb nowego pliku jest określony w mode, który jest maską bitową stworzoną przez ORing łącznie zero 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 sticky (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ć funkcjonalność CAP_FOWNER
Jeśli wywołany proces nie jest uprzywilejowany (Linux: nie ma funkcjonalności 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 Linuxie, zdarza się to jeśli zapisujący proces nie ma funkcjonalności CAP_FSETID.) Na niektórych systemach plików, tylko superużytkownik może ustawić bit "sticky", który może mieć specjalne znaczenie. Znaczenie bitów "sticky", 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 sa 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ólna wartość AT_FDCWD, wtedy ścieżka jest interpretowana względnie do obecnego katalogu roboczego wywołanego procesu (jak w chmod()).
Jeśli pathname jest bezwzględna, wtedy dirfd jest ignorowane.
flags
mogą być 0 lub zawierać następujące
flagi:
AT_SYMLINK_NOFOLLOW
Jeśli pathname jest linkiem symbolicznym, nie rozwiązuje go: w zamian operuje na samym linku. Ta flaga nie jest obecnie zaimplementowana.
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 odpowiednio ustawiane jest errno.
BŁĘDY
W zależności od systemu plików, mogą wystąpić błędy nie wymienione poniżej.
Powszechniejsze błędy fchmod są następujące:
EACCES |
Brak praw do przeszukiwania dla składnika ścieżki. (Sprawdź również path_resolution(7).) | ||
EFAULT |
pathname wskazuje poza dostępną dla użytkownika przestrzeń adresową. | ||
EIO |
Wystąpił błąd we/wy. | ||
ELOOP |
Podczas rozwiązywania pathname napotkano zbyt wiele dowiązań symbolicznych. |
ENAMETOOLONG
pathname jest zbyt długie.
ENOENT |
Plik nie istnieje. |
|||
ENOMEM |
Brak pamięci jądra. |
ENOTDIR
Element składowy ścieżki nie jest katalogiem.
EPERM |
Efektywny UID nie odpoiwada właścicielowi pliku, a proces nie jest uprzywilejowany (Linux: nie ma funkcjonalności CAP_FOWNER). | ||
EPERM |
Plik jest oznaczony jako tylko do odczytu lub tylko do nadpisu. (Sprawdź również ioctl_iflags(2).) | ||
EROFS |
Podany plik znajduje się na systemie plików przeznaczonym tylko do odczytu. |
Ogólne błędy fchmod() to:
EBADF |
Deskryptor pliku fd jest nieprawidłowy. |
|||
EIO |
Zobacz wyżej. |
|||
EPERM |
Zobacz wyżej. |
|||
EROFS |
Zobacz wyżej. |
Błędy, które mogą wystąpić w chmod() mogą również wystąpić w fchmodat(). Następujące dodatkowe błędy mogą wystąpić w fchmodat().
EBADF |
dirfd nie jest poprawnym deskryptorem pliku. |
|||
EINVAL |
Niepoprawna flaga zdefiniowana w flags. |
ENOTDIR
pathname jest względna, a dirfd jest deskryptorem pliku odnoszącym się do pliku nie będącego katalogiem.
ENOTSUP
flags określono na AT_SYMLINK_NOFOLLOW, który nie jest wspierany.
WERSJE
fchmodat() został dodany do jądra Linuxa w wersji 2.6.16; wsparcie dla biblioteki zostało dodane do glibc w wersji 2.4.
ZGODNE Z
chmod(), fchmod(): 4.4BSD, SVr4, POSIX.1-2001i, POSIX.1-2008.
fchmodat(): POSIX.1-2008.
UWAGI
Biblioteka
C/Różnice w jądrze Linuxa
Funkcja wrapper fchmodat() z biblioteki GNU C
implementuje określony przez POSIX’a interfejs
opisany na tej stronie. Ten interfejs różni
się od zaszytego w Linuxie 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
wrappera z glibc wraca do używania chmod().
Kiedy pathname jest względną
ścieżką, glibc konstruuje
ścieżkę na bazie linku symbolicznego w
/proc/self/fd, który odpowiada argumentowi
dirfd.
ZOBACZ TAKŻE
chmod(1), chown(2), execve(2), open(2), stat(2), inode(7), path_resolution(7), symlink(7)
O STRONIE
Angielska wersja tej strony pochodzi z wydania 5.07 projektu Linux man-pages. Opis projektu, informacje dotyczące zgłaszania błędów oraz najnowszą wersję oryginału można znaleźć pod adresem https://www.kernel.org/doc/man-pages/.
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika są: Przemek Borys <pborys [AT] dione.pl> i Andrzej Krzysztofowicz <ankry [AT] green.pl>
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 lub nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy zgłaszać na adres <manpages-pl-list [AT] lists.net>.