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.