chown(2)

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 jest 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ładnik ś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 <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.