chmod(2) chmod(2)
NAME
chmod, fchmod - Dateimodus ändern
SYNTAX
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path, modet mode);
int fchmod(int fildes, modet mode);
BESCHREIBUNG
chmod() und fchmod() setzen den Zugriffsberechtigungsteil des Modus
der durch path angegebenen oder durch den Deskriptor fildes ausgewie-
senen Datei entsprechend dem in mode enthaltenen Bitmuster. Die
Zugriffsberechtigungsbits werden in <sys/stat.h> [siehe stat(5)]
beschrieben und wie folgt interpretiert:
SISUID 04000 Benutzer-ID bei Ausführung setzen.
SISGID 020#0 Gruppen-ID bei Ausführung setzen, wenn # den Wert 7,
5, 3 oder 1 hat. Aktivieren der obligatorischen
Sperre von Dateien/Datensätzen, wenn # 6, 4, 2 oder
0 ist.
SISVTX 01000 Textsegment nach Ausführung sichern.
SIRWXU 00700 Lesen, Schreiben, Ausführen (Durchsuchen) durch
Eigentümer.
SIRUSR 00400 Lesen durch Eigentümer.
SIWUSR 00200 Schreiben durch Eigentümer.
SIXUSR 00100 Ausführen durch Eigentümer (Durchsuchen, wenn es
sich um ein Verzeichnis handelt).
SIRWXG 00070 Lesen, Schreiben, Ausführen (Durchsuchen) durch
Gruppe.
SIRGRP 00040 Lesen durch Gruppe.
SIWGRP 00020 Schreiben durch Gruppe.
SIXGRP 00010 Ausführen durch Gruppe.
SIRWXO 00007 Lesen, Schreiben, Ausführen (Durchsuchen) durch
andere.
SIROTH 00004 Lesen durch andere.
SIWOTH 00002 Schreiben durch andere.
SIXOTH 00001 Ausführen durch andere.
Andere Modi werden durch bitweise OR-Verküpfung der Zugriffsberechti-
gungsbits erzeugt.
Die effektive Benutzer-ID des Prozesses muß mit der des Eigentümers
der Datei übereinstimmen, oder der Prozeß muß die entsprechende
Berechtigung zum Ändern des Modus einer Datei haben.
Wenn der Prozeß kein privilegierter Prozeß und die Datei kein Ver-
zeichnis ist, wird das Modusbit 01000 (Textsegment bei Ausführung
sichern) gelöscht.
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
chmod(2) chmod(2)
Wenn weder der Prozeß, noch ein Mitglied der anhängenden Gruppenliste
privilegiert ist und die effektive Gruppen-ID des Prozesses nicht mit
der Gruppen-ID der Datei übereinstimmt, wird das Modusbit 02000
(Gruppen-ID bei Ausführung setzen) gelöscht.
Wenn bei einer ausführbaren Datei des Typs 0410 das Sticky-Bit (Modus-
bit 01000) gesetzt ist, löscht das Betriebssystem den Programmtext
nicht aus dem Swap-Bereich, wenn der letzte Benutzerprozeß beendet
wird. Wenn das Sticky-Bit bei einer ausführbaren Datei des Typs 413
oder ELF gesetzt ist, löscht das Betriebssystem den Programmtext nicht
aus dem Speicher, wenn der letzte Benutzerprozeß beendet wird. In bei-
den Fällen ist beim Setzen des Sticky-Bits der Text bereits (entweder
in einem Swap-Bereich oder im Speicher) vorhanden, wenn der nächste
Benutzer diese Datei ausführt. Die Ausführung wird dadurch beschleu-
nigt.
Wenn in ein Verzeichnis geschrieben werden kann und das Sticky-Bit
gesetzt ist, können Dateien in diesem Verzeichnis nur dann entfernt
(gelöscht) oder umbenannt werden, wenn mindestens eine der folgenden
Bedingungen zutrifft [siehe unlink(2) und rename(2)]:
- Der Benutzer ist Eigentümer der Datei.
- Der Benutzer ist Eigentümer des Verzeichnisses.
- Der Benutzer hat das Recht, in die Datei zu schreiben.
- Der Benutzer ist ein privilegierter Benutzer.
Wenn das Modusbit 02000 (Gruppen-ID bei Ausführung setzen) gesetzt und
das Modusbit 00010 (Ausführen oder Durchsuchen durch Gruppe) nicht
gesetzt ist, isr das obligatorische Sperren von Dateien/Datensätzen
bei einer normalen Datei aktiviert. Dies kann zukünftige Aufrufe von
open(2), creat(2), read(2) und write(2) auf diese Datei beeinflussen.
Bei einer erfolgreichen Beendigung markieren chmod und fchmod das Feld
stctime der Datei zur Aktualisierung.
FEHLER
Die folgenden Beschreibungen der Fehlercodes sind funktionsspezifisch.
Eine allgemeingültige Beschreibung finden Sie in introprm2(2) bzw. in
errno(5).
chmod schlägt fehl und der Dateimodus bleibt unverändert, wenn einer
oder mehrere der folgenden Punkte zutreffen:
EACCES Eine Komponente von path darf nicht durchsucht werden.
EFAULT path weist über den zugewiesenen Adreßraum des Prozesses
hinaus.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
chmod(2) chmod(2)
EIO Ein E/A-Fehler trat während des Lesens vom oder Schrei-
bens auf das Dateisystem auf.
ELOOP Während der Auflösung von path wurden zu viele symboli-
sche Links angetroffen.
EMULTIHOP Komponenten von path erfordern den Sprung auf mehrere
ferne Rechner, und der Dateisystemtyp läßt dies nicht
zu.
ENAMETOOLONG Die Länge des Arguments path überschreitet PATHMAX,
oder die Länge einer Komponente von path überschreitet
NAMEMAX.
ENOTDIR Eine Komponente des Pfads path ist kein Verzeichnis.
ENOENT Entweder eine Komponente des Pfads oder die Datei, auf
welche durch path verwiesen wurde, existiert nicht oder
ist ein leerer Pfadname.
ENOLINK fildes weist auf einen fernen Rechner, und die Verbin-
dung zu diesem Rechner ist nicht mehr aktiv.
EPERM Die effektive Benutzer-ID entspricht nicht der des
Dateieigentümers oder der Prozeß ist nicht entsprechend
privilegiert.
EROFS Die durch path angegebene Datei steht in einem schreib-
geschützten Dateisystem.
Die Funktion chmod() kann bei folgenden Bedingungen fehlschlagen:
EINTR Während der Ausführung der Funktion wurde ein Signal
abgefangen.
EINVAL Der Wert des Arguments mode ist ungültig.
ENAMETOOLONG Die Auflösung des Pfadnamens eines symbolischen Links
hat ein Zwischenergebnis erzeugt, dessen Länge PATHMAX
überschreitet.
fchmod() schlägt fehl und der Dateimodus wird nicht verändert, wenn
EBADF fildes ist kein offener Dateideskriptor.
EIO Beim Lesens von oder Schreiben auf das Dateisystem ist
ein E/A-Fehler aufgetreten.
EINTR Während der Ausführung des Systemaufrufs fchmod() wurde
ein Signal abgefangen.
EINVAL Der Wert des Arguments mode ist ungültig.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
chmod(2) chmod(2)
ENOLINK path weist auf einen fernen Rechner, und die Verbindung
zu diesem Rechner ist nicht mehr aktiv.
EPERM Die effektive Benutzer-ID entspricht nicht der des
Dateieigentümers, oder der Prozeß ist nicht entsprechend
privilegiert.
EROFS Die durch fildes angegebene Datei steht in einem
schreibgeschützten Dateisystem.
ERGEBNIS
Nach erfolgreicher Beendigung wird 0 zurückgegeben. Andernfalls wird
-1 zurückgegeben und errno zur Anzeige des Fehlers gesetzt.
HINWEISE
SISUID, SISGID und die Dateizugriffsbits sind in <sys/stat.h> [siehe
stat(5)] beschrieben.
Wenn in ein Verzeichnis geschrieben werden kann, und das Modusbit
SISVTX für das Verzeichnis gesetzt ist, kann ein Prozeß Dateien in
diesem Verzeichnis nur dann löschen oder umbenennen, wenn eine der
folgenden Bedingungen zutrifft:
- Die effektive Benutzer-ID des Prozesses stimmt mit der des Dateiei-
gentümers überein.
- Die effektive Benutzer-ID des Prozesses stimmt mit der des Ver-
zeichniseigentümers überein.
- Der Prozeß ist entsprechend privilegiert.
Wenn das SISVTX-Bit in einer Datei außerhalb eines Verzeichnisses
gesetzt ist, ist das Verhalten unbestimmt.
Um sicherzustellen, daß die Bits SISUID und SISGID gesetzt sind,
sollte eine Anwendung, für die dies erforderlich ist, nach erfolgrei-
cher Ausführung von chmod() die Funktion stat() verwenden.
Alle Dateideskriptoren, die derzeit von einem Prozeß geöffnet sind,
können ungültig werden, wenn der Modus der Datei in einen Wert geän-
dert wird, der den Zugriff auf diesen Prozeß verweigern würde. Dies
kann zum Beispiel bei einem Dateisystem auftreten, das keinen Status
aufweist.
SIEHE AUCH
chmod(1), chown(2), creat(2), fcntl(2), mknod(2), open(2), read(2),
stat(2), write(2), mkfifo(3C), stat(5), types(5).
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98