chown(2) System Calls Manual chown(2) NAZWA chown, fchown, lchown, fchownat - zmieniaja wlasciciela pliku BIBLIOTEKA Standardowa biblioteka C (libc, -lc) SKLADNIA #include int chown(const char *pathname, uid_t owner, gid_t group); int fchown(int fd, uid_t owner, gid_t group); int lchown(const char *pathname, uid_t owner, gid_t group); #include /* Definicja stalych AT_* */ #include int fchownat(int dirfd, const char *pathname, uid_t owner, gid_t group, int flags); Wymagane ustawienia makr biblioteki glibc (patrz feature_test_macros(7)): fchown(), lchown(): /* Od glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 500 || /* glibc <= 2.19: */ _BSD_SOURCE fchownat(): Od glibc 2.10: _POSIX_C_SOURCE >= 200809L Przed glibc 2.10: _ATFILE_SOURCE OPIS Niniejsze wywolania systemowe zmieniaja wlasciciela i grupe pliku. Wywolania systemowe chown(), fchown() i lchown() roznia sie jedynie sposobem okreslenia pliku: o chown() zmienia wlasciciela pliku okreslonego sciezka pathname, ktora jest rozwiazywana, jesli jest dowiazaniem symbolicznym. o fchown() zmienia wlasciciela pliku okreslonego deskryptorem otwartego pliku fd. o lchown() jest podobne do chown(), lecz nie podaza za dowiazaniami symbolicznymi. Zmiany wlasciciela pliku moze dokonac jedynie proces uprzywilejowany (Linux: z przywilejem (ang. capability) CAP_CHOWN). Wlasciciel pliku moze zmienic grupe pliku na dowolna grupe, ktorej jest czlonkiem. Proces uprzywilejowany (Linux: z przywilejem CAP_CHOWN) moze zmienic grupe w sposob dowolny. Jesli owner lub group jest podane jako -1, to ten identyfikator nie jest wtedy zmieniany. Jesli wlasciciel lub grupa pliku wykonywalnego sa zmieniane przez uzytkownika nieuprzywilejowanego, to bity trybu S_ISUID i S_ISGID sa usuwane. Standard POSIX nie precyzuje, czy powinno to nastapic rowniez przy wykonaniu przez roota chown(); zachowanie w Linuksie zalezy od wersji jadra, od Linuksa 2.2.13, root jest traktowany tak samo jak inni uzytkownicy. W przypadku pliku, ktory nie jest wykonywalny dla grupy (tj. ktorego bit S_IXGRP nie jest ustawiony), bit S_ISGID oznacza obowiazkowe blokowanie pliku i wowczas nie jest usuwany przez chown. Jesli wlasciciel lub grupa pliku wykonywalnego zostanie zmieniona (przez dowolnego uzytkownika), wszystkie zbiory przywilejow pliku zostana usuniete. fchownat() Wywolanie systemowe fchownat() operuje w dokladnie taki sam sposob jak chown(), z wyjatkiem roznic opisanych tutaj. Jesli sciezka podana w pathname jest wzgledna, jest to interpretowane w odniesieniu do katalogu do ktorego odnosi sie deskryptor pliku dirfd (zamiast w odniesieniu do biezacego katalogu roboczego procesu wywolujacego, jak w stosunku do sciezek wzglednych robi to chown()). Jesli pathname jest wzgledna a dirfd ma wartosc specjalna AT_FDCWD, to pathname jest interpretowana w odniesieniu do biezacego katalogu roboczego procesu wywolujacego (jak chown()). Jesli sciezka pathname jest bezwzgledna, to dirfd jest ignorowane. Parametr flags jest maska bitowa, utworzona jako suma logiczna (OR) zera lub wiecej nastepujacych wartosci; AT_EMPTY_PATH (od Linuksa 2.6.39) Jesli pathname jest pustym lancuchem, dziala na pliku do ktorego odnosi sie dirfd (ktory mogl byc pozyskany za pomoca znacznika O_PATH open(2)). W tym przypadku dirfd moze odnosic sie do dowolnego typu pliku, a nie tylko katalogu. Jesli dirfd wynosi AT_FDCWD, to wywolanie dziala na biezacym katalogu roboczym. Znacznik ten jest charakterystyczny dla Linuksa; nalezy zdefiniowac _GNU_SOURCE, aby pozyskac jego definicje. AT_SYMLINK_NOFOLLOW Jesli pathname jest dowiazaniem symbolicznym, nie podaza za nim, w zamian dziala na samym dowiazaniu, jak lchown(). Domyslnie fchownat() podaza za dowiazaniami symbolicznymi, jak chown(). Wiecej informacji o potrzebie wprowadzenia fchownat() mozna znalezc w podreczniku 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. Ogolne bledy chown() to: EACCES Brak praw do przeszukiwania dla skladowej sciezki (zob. takze path_resolution(7)). EBADF (fchown()) fd nie jest prawidlowym otwartym deskryptorem pliku. EBADF (fchownat()) 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 (fchownat()) Podano nieprawidlowa opcje w flags. EIO (fchown()) Niskopoziomowy blad wejscia/wyjscia podczas modyfikacji i-wezla. 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 (fchownat()) pathname jest wzgledna a dirfd jest deskryptorem pliku odnoszacym sie do pliku zamiast do katalogu. EPERM Wywolujacy proces nie ma wymaganych uprawnien (zob. wyzej) do zmiany wlasciciela i/lub grupy. 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 Wersja 4.4BSD moze byc uzyta jedynie przez superuzytkownika (tj. zwykly uzytkownik nie moze oddawac plikow). STANDARDY POSIX.1-2008. HISTORIA chown() fchown() lchown() 4.4BSD, SVr4, POSIX.1-2001. fchownat() POSIX.1-2008. Linux 2.6.16, glibc 2.4. UWAGI Wlasnosc nowych plikow Przy tworzeniu nowego pliku (przez np. open(2) lub mkdir(2)), jego wlascicielem staje sie identyfikator uzytkownika systemu plikow tworzacego procesu. Grupa zalezy od wielu czynnikow, w tym typu systemu plikow, opcji uzytych przy jego zamontowaniu oraz tego, czy dla jego katalogu ustawiono bit ustawienia ID grupy podczas wykonania (sgid). Jesli system plikow obsluguje opcje montowania mount(8): -o grpid (lub rownowaznie -o bsdgroups) i -o nogrpid (lub rownowaznie -o sysvgroups), to zasady sa nastepujace: o Jesli system plikow zamontowano z opcja -o grpid, to grupa nowego pliku jest taka sama jak grupa jego katalogu. o Jesli system plikow zamontowano z opcja -o nogrpid i bit ustawienia ID grupy podczas wykonania (sgid) jest wylaczony dla jego katalogu, to grupa nowego pliku jest taka sama jak grupa systemu plikow dla procesu go tworzacego. o Jesli system plikow zamontowano z opcja -o nogrpid i bit ustawienia ID grupy podczas wykonania (sgid) jest ustawiony dla jego katalogu, to grupa nowego pliku jest taka sama jak grupa jego katalogu. Z aktualnoscia na jadro Linux 4.12, opcje montowania -o grpid i -o nogrpid sa obslugiwane przez systemy plikow ext2, ext3, ext4 i XFS. Systemy plikow nieobslugujace tych opcji, przestrzegaja regul -o nogrpid. Uwagi dla glibc Na starszych wersjach jadra Linux, gdzie fchownat() nie jest dostepne, funkcja opakowujaca z glibc wraca do uzywania chown() i lchown(). Gdy pathname jest wzgledna sciezka, glibc konstruuje sciezke na bazie dowiazania symbolicznego w /proc/self/fd, ktore odpowiada argumentowi dirfd. NFS Semantyka chown() jest pogwalcona na systemach plikow NFS, z wlaczonym mapowaniem UID. Dodatkowo, semantyka wszystkich wywolan systemowych, ktore uzyskuja dostep do zawartosci plikow jest dla NFS pogwalcona, bo chown() moze spowodowac natychmiastowe uniewaznienie dostepu do juz otwartych plikow. Buforowanie po stronie klienta moze spowodowac opoznienie mozliwosci uzyskania dostepu do pliku przez uzytkownikow innych stacji klienckich w stosunku do chwili dokonania zmiany wlasciciela umozliwiajacej ten dostep. Detale historyczne Oryginalne linuksowe wywolania systemowe chown(), fchown() i lchown() obslugiwaly tylko 16-bitowe identyfikatory uzytkownika i grupy. Nastepnie w Linuksie 2.4 dodano chown32(), fchown32() i lchown32(), obslugujace 32-bitowe identyfikatory. Funkcje opakowujace chown(), fchown() i lchown() z glibc obsluguja te warianty wywolan w roznych wersjach jadra w sposob przezroczysty dla uzytkownika. Przed Linuksem 2.1.81 (z wyjatkiem 2.1.46) chown() nie podaza za dowiazaniami symbolicznymi. Od wersji 2.1.81 Linuksa chown() podaza za dowiazaniami symbolicznymi, zostala takze dodana nowa funkcja systemowa lchown(), ktora nie podaza za dowiazaniami symbolicznymi. Od wersji 2.1.86 Linuksa, ta nowa funkcja (majaca taka sama semantyke jak stare chown() ma taki sam numer funkcji, a chown() otrzymala nowy numer. PRZYKLADY Ponizszy program zmienia wlasciciela pliku nazwanego w drugim argumencie wiersza polecen na wartosc podana w pierwszych argumencie wiersza polecen. Nowego wlasciciela pliku mozna podac albo za pomoca jego numerycznego identyfikatora uzytkownika, albo jako nazwe uzytkownika (konwertowana do identyfikatora za pomoca getpwnam(3), aby wykonac zapytanie w systemowym pliku hasel). Kod zrodlowy programu #include #include #include #include int main(int argc, char *argv[]) { char *endptr; uid_t uid; struct passwd *pwd; if (argc != 3 || argv[1][0] == '\0') { fprintf(stderr, "%s \n", argv[0]); exit(EXIT_FAILURE); } uid = strtol(argv[1], &endptr, 10); /* Akceptuje lancuch numeryczny */ if (*endptr != '\0') { /* Nie byl to lancuch czysto numer. */ pwd = getpwnam(argv[1]); /* Proba uzyskania UID dla nazwy uzytk. */ if (pwd == NULL) { perror("getpwnam"); exit(EXIT_FAILURE); } uid = pwd->pw_uid; } if (chown(argv[2], uid, -1) == -1) { perror("chown"); exit(EXIT_FAILURE); } exit(EXIT_SUCCESS); } ZOBACZ TAKZE chgrp(1), chown(1), chmod(2), flock(2), 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. chown(2)