oracular (2) lchown.2.gz

Provided by: manpages-pl-dev_4.23.1-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ż ioctl_iflags(2)).

       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

       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⟩.