19.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 modus besitzt. Folgende Zugriffsrechte (Modus) existieren:
Tabelle 19.5
Modi zum Prüfen des Zugriffsrechts
modus
|
Bedeutung
|
00 oder F_OK
|
Datei existiert
|
01 oder X_OK
|
Datei ausführbar (nur Linux/UNIX)
|
02 oder W_OK
|
Datei beschreibbar
|
04 oder R_OK
|
Datei lesbar
|
06 oder W_OK|R_OK
|
Datei lesbar und beschreibbar
|
Bei Erfolg gibt diese Funktion den Wert 0 zurück, ansonsten bei 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
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 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.
|