Provided by: manpages-pl-dev_4.27.0-1_all bug

NAZWA

       chown, fchown, lchown, fchownat - zmieniają właściciela pliku

BIBLIOTEKA

       Standardowa biblioteka C (libc, -lc)

SKŁADNIA

       #include <unistd.h>

       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 <fcntl.h>           /* Definicja stałych AT_* */
       #include <unistd.h>

       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  wywołania systemowe zmieniają właściciela i grupę pliku. Wywołania systemowe chown(), fchown()
       i lchown() różnią się jedynie sposobem określenia pliku:

       •  chown() zmienia właściciela pliku określonego ścieżką pathname, która jest  rozwiązywana,  jeśli  jest
          dowiązaniem symbolicznym.

       •  fchown() zmienia właściciela pliku określonego deskryptorem otwartego pliku fd.

       •  lchown() jest podobne do chown(), lecz nie podąża za dowiązaniami symbolicznymi.

       Zmiany  właściciela  pliku  może  dokonać  jedynie  proces  uprzywilejowany  (Linux:  z przywilejem (ang.
       capability) CAP_CHOWN). Właściciel  pliku  może  zmienić  grupę  pliku  na  dowolną  grupę,  której  jest
       członkiem. Proces uprzywilejowany (Linux: z przywilejem CAP_CHOWN) może zmienić grupę w sposób dowolny.

       Jeśli owner lub group jest podane jako -1, to ten identyfikator nie jest wtedy zmieniany.

       Jeśli  właściciel  lub  grupa pliku wykonywalnego są zmieniane przez użytkownika nieuprzywilejowanego, to
       bity trybu S_ISUID i S_ISGID są usuwane. Standard POSIX nie precyzuje, czy powinno  to  nastąpić  również
       przy wykonaniu przez roota chown(); zachowanie w Linuksie zależy od wersji jądra, od Linuksa 2.2.13, root
       jest  traktowany  tak  samo jak inni użytkownicy. W przypadku pliku, który nie jest wykonywalny dla grupy
       (tj. którego bit S_IXGRP nie jest ustawiony), bit S_ISGID oznacza obowiązkowe blokowanie pliku i  wówczas
       nie jest usuwany przez chown.

       Jeśli  właściciel  lub  grupa  pliku  wykonywalnego  zostanie  zmieniona  (przez  dowolnego użytkownika),
       wszystkie zbiory przywilejów pliku zostaną usunięte.

   fchownat()
       Wywołanie systemowe fchownat() operuje w dokładnie taki  sam  sposób  jak  chown(),  z  wyjątkiem  różnic
       opisanych tutaj.

       Jeśli  ścieżka  podana  w  pathname  jest  względna,  jest to interpretowane w odniesieniu do katalogu do
       którego odnosi się deskryptor pliku dirfd (zamiast w odniesieniu do bieżącego katalogu roboczego  procesu
       wywołującego, jak w stosunku do ścieżek względnych robi to chown()).

       Jeśli  pathname  jest  względna  a dirfd ma wartość specjalną AT_FDCWD, to pathname jest interpretowana w
       odniesieniu do bieżącego katalogu roboczego procesu wywołującego (jak chown()).

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

       Parametr flags jest maską bitową, utworzoną  jako  suma  logiczna  (OR)  zera  lub  więcej  następujących
       wartości;

       AT_EMPTY_PATH (od Linuksa 2.6.39)
              Jeśli  pathname 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 pathname jest dowiązaniem symbolicznym,  nie  podąża  za  nim,  w  zamian  działa  na  samym
              dowiązaniu, jak lchown(). Domyślnie fchownat() podąża za dowiązaniami symbolicznymi, jak chown().

       Więcej informacji o potrzebie wprowadzenia fchownat() można znaleźć w podręczniku 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.

       Ogólne błędy chown() to:

       EACCES Brak praw do przeszukiwania dla składowej ścieżki (zob. także path_resolution(7)).

       EBADF  (fchown())  fd nie jest prawidłowym otwartym deskryptorem pliku.

       EBADF  (fchownat())  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 (fchownat())  Podano nieprawidłową opcję w flags.

       EIO    (fchown())  Niskopoziomowy błąd wejścia/wyjścia podczas modyfikacji i-węzła.

       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
              (fchownat())  pathname jest względna a dirfd jest  deskryptorem  pliku  odnoszącym  się  do  pliku
              zamiast do katalogu.

       EPERM  Wywołujący proces nie ma wymaganych uprawnień (zob. wyżej) do zmiany właściciela i/lub grupy.

       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

       Wersja 4.4BSD może być użyta jedynie przez superużytkownika  (tj.  zwykły  użytkownik  nie  może  oddawać
       plików).

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

   Własność nowych plików
       Przy  tworzeniu  nowego pliku (przez np. open(2) lub mkdir(2)), jego właścicielem staje się identyfikator
       użytkownika systemu plików tworzącego procesu. Grupa zależy  od  wielu  czynników,  w  tym  typu  systemu
       plików, opcji użytych przy jego zamontowaniu oraz tego, czy dla jego katalogu ustawiono bit ustawienia ID
       grupy  podczas  wykonania  (sgid). Jeśli system plików obsługuje opcje montowania mount(8): -o grpid (lub
       równoważnie -o bsdgroups) i -o nogrpid (lub równoważnie -o sysvgroups), to zasady są następujące:

       •  Jeśli system plików zamontowano z opcją -o grpid, to grupa nowego pliku jest taka sama jak grupa  jego
          katalogu.

       •  Jeśli  system plików zamontowano z opcją -o nogrpid i bit ustawienia ID grupy podczas wykonania (sgid)
          jest wyłączony dla jego katalogu, to grupa nowego pliku jest taka sama jak grupa  systemu  plików  dla
          procesu go tworzącego.

       •  Jeśli  system plików zamontowano z opcją -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 aktualnością na jądro Linux 4.12, opcje montowania -o grpid i -o nogrpid są obsługiwane  przez  systemy
       plików ext2, ext3, ext4 i XFS. Systemy plików nieobsługujące tych opcji, przestrzegają reguł -o nogrpid.

   Uwagi dla glibc
       Na  starszych wersjach jądra Linux, gdzie fchownat() nie jest dostępne, funkcja opakowująca z glibc wraca
       do używania chown() i lchown(). Gdy pathname jest względną ścieżką, glibc  konstruuje  ścieżkę  na  bazie
       dowiązania symbolicznego w /proc/self/fd, które odpowiada argumentowi dirfd.

   NFS
       Semantyka  chown()  jest  pogwałcona  na  systemach  plików  NFS,  z włączonym mapowaniem UID. Dodatkowo,
       semantyka wszystkich wywołań systemowych, które  uzyskują  dostęp  do  zawartości  plików  jest  dla  NFS
       pogwałcona,  bo  chown()  może  spowodować  natychmiastowe unieważnienie dostępu do już otwartych plików.
       Buforowanie po stronie klienta może spowodować opóźnienie możliwości uzyskania  dostępu  do  pliku  przez
       użytkowników  innych  stacji  klienckich w stosunku do chwili dokonania zmiany właściciela umożliwiającej
       ten dostęp.

   Detale historyczne
       Oryginalne linuksowe wywołania  systemowe  chown(),  fchown()  i  lchown()  obsługiwały  tylko  16-bitowe
       identyfikatory  użytkownika  i grupy. Następnie w Linuksie 2.4 dodano chown32(), fchown32() i lchown32(),
       obsługujące 32-bitowe identyfikatory. Funkcje opakowujące chown(), fchown() i lchown() z glibc  obsługują
       te warianty wywołań w różnych wersjach jądra w sposób przezroczysty dla użytkownika.

       Przed  Linuksem  2.1.81  (z wyjątkiem 2.1.46) chown() nie podąża za dowiązaniami symbolicznymi. Od wersji
       2.1.81 Linuksa chown() podąża za dowiązaniami symbolicznymi, została także dodana nowa funkcja  systemowa
       lchown(),  która  nie  podąża  za  dowiązaniami  symbolicznymi. Od wersji 2.1.86 Linuksa, ta nowa funkcja
       (mająca taką samą semantykę jak stare chown() ma taki sam numer funkcji, a chown() otrzymała nowy numer.

PRZYKŁADY

       Poniższy program zmienia właściciela pliku nazwanego w  drugim  argumencie  wiersza  poleceń  na  wartość
       podaną  w pierwszych argumencie wiersza poleceń. Nowego właściciela pliku można podać albo za pomocą jego
       numerycznego identyfikatora użytkownika, albo jako nazwę użytkownika (konwertowaną do  identyfikatora  za
       pomocą getpwnam(3), aby wykonać zapytanie w systemowym pliku haseł).

   Kod źródłowy programu
       #include <pwd.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <sys/types.h>
       #include <unistd.h>

       int
       main(int argc, char *argv[])
       {
           char           *endptr;
           uid_t          uid;
           struct passwd  *pwd;

           if (argc != 3 || argv[1][0] == '\0') {
               fprintf(stderr, "%s <owner> <file>\n", argv[0]);
               exit(EXIT_FAILURE);
           }

           uid = strtol(argv[1], &endptr, 10);  /* Akceptuje łańcuch numeryczny */

           if (*endptr != '\0') {         /* Nie był to łańcuch czysto numer. */
               pwd = getpwnam(argv[1]);   /* Próba uzyskania UID dla nazwy użytk. */
               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 TAKŻE

       chgrp(1), chown(1), chmod(2), flock(2), 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   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.

Linux man-pages 6.9.1                          15 czerwca 2024 r.                                       chown(2)