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. 
 |