CHOWN(2)

BEZEICHNUNG
chown, fchown, lchown - Besitzverhältnisse einer Datei ändern

ÜBERSICHT
#include <sys/types.h>
#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

BESCHREIBUNG
Die Besitzverhältnisse der Datei, die durch path bzw. fd gegeben ist, werden geändert: neuer Eigentümer ist owner, neue Gruppe ist group. Nur der Super-User kann den Eigentümer einer Datei ändern. Der Eigentümer einer Datei kann die Gruppenzugehörigkeit der Datei in jede Gruppe ändern, der er selber angehört. Der Super-User kann die Gruppenzugehörigkeit beliebig ändern.

Wird als owner oder group -1 übergeben, wird die entsprechende ID nicht geändert.

Werden Eigentümer oder Gruppe einer ausführbaren Datei von einem Nicht-Super-User geändert, werden die Modus-Bits S_ISUID und S_ISGID gelöscht. POSIX legt nicht fest, ob dies auch dann geschehen sollte, wenn der Super-User chown durchführt. Das Verhalten von Linux ist in diesem Falle abhängig von der Kernelversion. Ist die Datei nicht ausführbar (d.h. das S_IXGRP Bit ist gelöscht), bedeutet ein gesetztes S_ISGID Bit verbindliche Sperren (mandatory locks) für die Datei. Dieses Bit wird dann von chown nicht geändert.

RÜCKGABEWERT
Bei Erfolg gibt chown Null zurück. Bei einem Fehler wird -1 zurückgegeben und errno entsprechend gesetzt.

FEHLER
Die häufigsten Fehler für chown sind unten aufgeführt. Je nach Dateisystem können andere Fehler zurückgegeben werden.

EPERM
    Die effektive UID (Benutzer ID) entspricht nicht dem Eigentümer der Datei und ist auch nicht Null (d.h. Super-User). EPERM kann auch anzeigen, dass Eigentümer (owner) oder Gruppe (group) falsch angegeben wurden.

EROFS
    Die angegebene Datei liegt auf einem schreibgeschützten (read-only) Dateisystem.

EFAULT
    path zeigt auf eine Adresse außerhalb des gültigen Adressraums.

ENAMETOOLONG
    path ist zu lang.

ENOENT
    Die Datei ist nicht vorhanden.

ENOMEM
    Es war nicht ausreichend Kernel-Speicher verfügbar.

ENOTDIR
    Eine Komponente im Verzeichnisteil des Pfades (d.i. der vordere Teil bis zum Dateinamen ausschließlich) ist kein Verzeichnis.

EACCES
    Die Berechtigung zum Durchsuchen eines Verzeichnisses im Pfad ist nicht gegeben.

ELOOP
    Es wurden zu viele symbolische Links beim Auflösen von path gefunden.

Folgende Fehler können von fchown zurückgegeben werden:

EBADF
    Der Dateideskriptor fd ist ungültig.

ENOENT
    Siehe oben.

EPERM
    Siehe oben.

EROFS
    Siehe oben.

EIO Ein (low-level) Ein-/Ausgabe-Fehler ist während der Änderung des Inodes aufgetreten.

ANMERKUNGEN
In Linux-Versionen vor 2.1.81 (außer 2.1.46) folgte chown nicht symbolischen Links. Ab Linux 2.1.81 folgt chown symbolischen Links und es gibt einen neuen Systemaufruf lchown, der symbolischen Links nicht folgt. Ab Linux 2.1.86 hat dieser neue Aufruf (der die gleiche Semantik wie das alte chown besitzt) die gleiche Systemaufruf-Nummer (syscall number) und chown erhielt die neu eingeführte Nummer.

Der Prototyp für fchown ist nur dann verfügbar, wenn __USE_BSD definiert ist.

KONFORM ZU
chown ist konform zu SVr4, SVID, POSIX und X/OPEN. Die 4.4BSD-Version kann nur vom Super-User benutzt werden (d.h. dass normale Benutzer keine Dateien abgeben können). SVr4 dokumentiert die Fehler EINVAL, EINTR, ENOLINK und EMULTIHOP, aber nicht ENOMEM. POSIX.1 dokumentiert nicht die Fehler ENOMEM und ELOOP.

Der fchown-Aufruf ist konform zu 4.4BSD und SVr4. SVr4 dokumentiert zusätzlich die Fehler EINVAL, EIO, EINTR und ENOLINK.

EINSCHRÄNKUNGEN
Die Semantik von chown() wird auf NFS-Dateisystemen mit aktiviertem UID-mapping (Umsetzung der Benutzerkennungen zwischen verschiedenen Rechnern) bewusst verletzt. Außerdem wird bei allen Systemaufrufen, die auf den Dateiinhalt zugreifen, die Semantik verletzt, da chown() einen sofortigen Entzug des Zugriffs bei bereits geöffneten Dateien bewirken kann. Zwischenspeicherung (caching) seitens des Clients kann zu einer Verzögerung zwischen dem Zeitpunkt der Änderung der Besitzverhältnisse, um einem Benutzer Zugriff zu ermöglichen, und dem Zeitpunkt, zu dem er auf anderen Clients tatsächlich zugreifen kann, führen.

SIEHE AUCH
chmod(2), flock(2).