17.2 Prüfen des Zugriffsrechts – »access()« 

Mit der Funktion access() können Sie feststellen, ob ein Prozess bestimmte Berechtigungen für den Zugriff auf eine Datei hat. Die Syntax zur Funktion access() lautet:
#include <unistd.h> /* für UNIX/LINUX */ #include <io.h> /* für MS-DOS */ int access(const char *pfad, int modus);
So wird überprüft, ob der pfad der Datei existiert und die Zugriffsrechte laut modus besitzt. Folgende Zugriffsrechte (Modi) existieren (siehe Tabelle 17.5).
Modus | Bedeutung |
00 oder F_OK |
Die Datei existiert. |
01 oder X_OK |
Die Datei ist ausführbar (nur Linux/UNIX). |
02 oder W_OK |
Die Datei ist beschreibbar. |
04 oder R_OK |
Die Datei ist lesbar. |
06 oder W_OK|R_OK |
Die Datei ist lesbar und beschreibbar. |
Bei Erfolg gibt diese Funktion den Wert 0 zurück, ansonsten – bei einem Fehler –1. Das folgende Listing überprüft die Zugriffsrechte aller in der Kommandozeile eingegebenen Programme mit der Funktion access():
/* check_access.c */ #ifdef __unix__ #include <unistd.h> #define EXIST F_OK #define EXEC X_OK #define WRITE W_OK #define READ R_OK #else #include <io.h> #define EXIST 00 #define EXEC 01 #define WRITE 02 #define READ 04 #endif #include <stdio.h> #include <stdlib.h> int main(int argc, char *argv[]) { if(argc == 1) { fprintf(stderr, "Mindestens eine Datei angeben!\n"); return EXIT_FAILURE; } while(*++argv) { printf("%s : \n", *argv); /* Existiert die Datei? */ if(access(*argv, EXIST) != -1) { /* Lesen und Schreiben nicht erlaubt */ if(access(*argv, WRITE|READ) == -1) { /* Nur lesen? */ if(access(*argv, READ) != -1) printf("... ist lesbar\n"); /* Nur schreiben? */ else if(access(*argv, WRITE) != -1) printf("... ist schreibbar\n"); } else printf("ist Lesen und Schreiben erlaubt\n"); /* Datei ausführbar? */ if(access(*argv, EXEC) != -1) printf("... ist ausführbar\n"); } else { fprintf(stderr, "...existiert nicht\n"); return EXIT_FAILURE; } } return EXIT_SUCCESS; }
Zuerst wird überprüft, ob die Datei überhaupt existiert:
if(access(*argv, EXIST) != -1)
Ob die Datei zum Lesen und Schreiben freigegeben ist, wird anschließend mit der folgenden Zeile überprüft:
if(access(*argv, WRITE|READ) != -1)
Trifft dies nicht zu, werden die einzelnen Zugriffsmöglichkeiten getestet:
if(access(*argv, READ) != -1) printf("... ist lesbar\n"); else if(access(*argv, WRITE) != -1) printf("... ist schreibbar\n");
Die Überprüfung, ob die Datei ausführbar ist, mit
if(access(*argv, EXEC) != -1)
kann bei Windows/MS-DOS entfernt werden, da sie nur unter UNIX/Linux einen Sinn ergibt. In diesem Listing wurden die Konstanten der einzelnen Zugriffsrechte hinter Makros versteckt, damit das Programm möglichst portabel bleibt.
Unter Linux/UNIX werden übrigens nur die ersten drei User-Bits der UID überprüft (rwx), also die Zugriffsrechte des Datei-Eigentümers. Es ist auch möglich, access() mit mehreren Konstanten zu verknüpfen:
if( (access(*argv,F_OK|R_OK) ) != -1) /* if( (access(*argv,00|04) ) != -1) */
Hier wird z. B. ermittelt, ob die Datei existiert und ob für sie Leserechte vorhanden sind.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.