ein Kapitel zurück                                           ein Kapitel weiter

Mit dem Systemaufruf chmod können sie, wie auch mit dem gleichnamigen Shellkommando, die Zugriffsrechte auf einer Datei ändern. Vorrausgesetzt natürlich, der Prozess hat die Benutzererkennung 0 (root) oder die Benutzererkennung entspricht dem Eigentümer der Datei. Hier der Syntax zu chmod.....

#include <sys\stat.h>     //MS-DOS
#include <sys\types.h>    //MS-DOS
#include <io.h>           //MS-DOS
#include <sys/stat.h>     //Linux/Unix
#include <sys/types.h>    //Linux/Unix

int chmod(const char *pfad, int modus);

Die Funktion gibt bei Erfolg 0 und bei Fehler -1 zurück. Für den Modus gelten in UNIX/LINUX folgende Konstanten die in <sys/stat.h> deklariert sind...

Konstante Bedeutung
S_IRUSR read(user; Leserecht für Eigentümer)
S_IWUSR write(user; Schreibrecht für Eigentümer)
S_IXUSR execute(user; Ausführrecht für Eigentümer)
S_IRWXU read,write,execute(user; Lese-,Schreib-,Ausführungsrecht für Eigentümer)
S_IRGRP read(group; Leserecht für Gruppe)
S_IWGRP write(group; Schreibrecht für Gruppe)
S_IXGRP execute(group; Ausführungsrecht für Gruppe)
S_IRWXG read,write,execute(group; Lese-,Schreib,-Ausführungsrecht für Eigentümer)
S_IROTH read(other; Leserecht für alle anderen Benutzer)
S_IWOTH write(other; Schreibrecht für alle anderen Benutzer)
S_IXOTH execute(other; Ausführungsrecht für alle anderen Benutzer)
S_IRWXO read,write,execute(other; Lese-,Schreib-,Ausführungsrecht für alle anderen Benutzer)


Und unter DOS haben sie folgende 2 Möglichkeiten die in <sys\stat.h> deklariert sind...

Konstante Bedeutung
S_IWRITE Schreiben erlauben
S_IREAD Lesen erlauben


Nun noch 2 Programme. 1 für UNIX/LINUX und eins für DOS. Zuerst für LINUX. Wir schreiben ein Programm mit dem sie alle Programme die sie in der Kommandozeile eingeben, Leserechte für alle anderen erteilen (nur lesbar für alle anderen Benutzer).....

/*Download:chmod1.c*/
#include <sys/stat.h> #include <sys/types.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc == 1) { fprintf(stderr,"Geben sie mindestens eine Datei an!!!\n"); exit (1); } while(*++argv) { printf("%s : ",*argv); if(chmod(*argv, S_IROTH) == -1) printf("...nicht lesbar fuer alle anderen!!\n"); else printf("Leserecht für alle gesetzt!!\n"); } return 0; }

Das selbe nun auch für DOS. Alle Dateien der Kommandozeile werden Versucht nur Leserechte zu erteilen.....

/*Download:chmod2.c*/
#include <sys\stat.h> #include <sys\types.h> #include <io.h> #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc == 1) { fprintf(stderr,"Geben sie mindestens eine Datei an!!!\n"); exit (1); } while(*++argv) { printf("%s : ",*argv); if(chmod(*argv, S_IREAD) == -1) printf("...nicht lesbar fuer alle anderen!!\n"); else printf("Leserecht für alle gesetzt!!\n"); } return 0; }

Diese Beispiele sind natürlich belanglos. Unter Linux/Unix sind sie chmod ja folgendermaßen gewohnt....

Wir wollen einer Datei jedliche Schreibrechte wegnehmen. Wir machen dies in der Shell entweder so.....

chmod a-w programmname

...oder als oktale Darstellung...

chmod 0444 programmname

Nun hat niemand mehr Schreibrecht auf diese Datei. Nun wollen wir uns die 2.Möglichkeit ansehen wie wir dies in einem C-Programm realisieren können. Also.......

mychmod 0444 programmname1 programmname2 programmname3 ...... programmnamen

Das einzige Problem dürfte in diesem Fall sein den "oktalen" String in einem int-Wert umzuwandeln. Folgendermaßen sind die Zugriffsrechte in der Headerdatei /usr/include/linux/stat.h deklariert.......

#define S_IRWXU 00700 (Dezimal 448)
#define S_IRUSR 00400 (Dezimal 256)
#define S_IWUSR 00200 (Dezimal 128)
#define S_IXUSR 00100 (Dezimal  64)

#define S_IRWXG 00070 (Dezimal  56)
#define S_IRGRP 00040 (Dezimal  32)
#define S_IWGRP 00020 (Dezimal  16)
#define S_IXGRP 00010

#define S_IRWXO 00007 (Dezimal  7)
#define S_IROTH 00004 (Dezimal  4)
#define S_IWOTH 00002 (Dezimal  2)
#define S_IXOTH 00001 (Dezimal  1)

Die Dezimalwerte wurden von mir angefügt. Wie könne wir praktisch jetzt einen "oktalen" String in diese dezimale Werte kovertieren......

int oct2int(char *o_string)
{
 int rechte;
 for(rechte=0; *o_string>='0' && *o_string <='7'; *o_string++)
    rechte = (rechte * 8) + (*o_string - '0');
 return rechte;
}

Sie können die Rechnung gerne auf einem Blatt Papier nachvollziehen. Jetzt das Programm mychown dazu.......

/*Download:mychmod.c*/
#include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> int oct2int(char *o_string) { int rechte; for(rechte=0; *o_string>='0' && *o_string <='7'; *o_string++) rechte = (rechte * 8) + (*o_string - '0'); return rechte; } int main(int argc, char *argv[]) { int permissions; int i; if(argc < 3) { fprintf(stderr, "Verwendung : %s Rechte(oktal) programmname ...\n"); exit(0); } permissions = oct2int(argv[1]); for(i=2; argv[i]!=NULL; i++) { if( chmod(argv[i], permissions) == -1) fprintf(stderr, "Konnte Zugriffsrechte für %s nicht ändern\n",argv[i]); } return 0; }

Mit diesem kurzem Programm können sie wie mit chown die Zugriffrechte für mehrer Dateien gleichzeitig ändern.

Des weiteren gibt es für Linux/Unix noch die Funktion fchmod womit die Zugriffsrechte einer bereits geöffneten Datei mit dem Filedeskriptor geändert werden kann....

int fchmod(int fd, mode_t modus);

Der Unterschied zwischen chmod und fchmod ist das die Zugriffsrechte bei chmod geändert werden können bei einer nicht geöffneten Datei und bei fchmod auf eine bereits mit dem Filedeskriptor geöffnete Datei.

ein Kapitel zurück          nach oben           ein Kapitel weiter


© 2001,2002 Jürgen Wolf