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