Zugriffsrechte mit einem C Programm ausgeben



  • Hi, langsam weiss ich nicht mehr weiter 😕 ich soll Zugriffsrechte für eine Datei / Verzeichnis ausgeben, aber ich komme über das normale rwxrwxrwx nicht hinaus, sticky, uid und gid bit bekomme ich da nicht vernünftig raus, vielleicht hat einer von euch eine gute idee:

    #include <stdio.h> 
    #include <sys/types.h> 
    #include <sys/stat.h> 
    
    int main(int argc, char** argv) 
    { 
      int i, err; 
      mode_t typ, perm;
      struct stat buf; 
      char* ptr;
      int bitmaske[] = {S_ISUID, S_ISGID, S_ISVTX,
    		    S_IRUSR, S_IWUSR, S_IXUSR, 
    		    S_IRGRP, S_IWGRP, S_IXGRP, 
    		    S_IROTH, S_IWOTH, S_IXOTH
    		    };
    
      for (i = 1; i < argc; i++) {   /* Schleife ueber alle Argumente */
        printf("%s: ", argv[i]);     /* Ausgabe des Dateinamens       */
    
        err = lstat(argv[i], &buf);  /* Ermittlung der Informationen ueber die 
                                        Datei argv[i], der Rueckgabewert ist 0 
                                        bei Erfolg, sonst < 0, 
                                        in buf stehen die Informationen */
    
        if (err < 0) {                           /* Abfrage auf Fehler */
          fprintf(stderr, "Fehler in lstat\n");   /* Fehlermeldung ausgeben */
          continue;                         /* weiter mit dem naechsten Argument */
        } 
    
        /* Ermittlung des Dateityps */
    
        typ = buf.st_mode >> 12;             /* die unteren Bits rausschieben, nur 
                                              die oberen 4 Bits werden benoetigt  */
        switch (typ) { 
        case 010: printf("Regulaere Datei,"); break;
        case 004: printf("Verzeichnis, "); break;
        case 002: printf("Zeichen-Geraetedatei, "); break; 
        case 006: printf("Block-Geraetedatei, "); break; 
        case 001: printf("FIFO, "); break; 
        case 012: printf("Symbolischer Link, "); break; 
        case 014: printf("Socket, "); break;
        default:  printf("unbekannter Typ,");
        }
    
        perm = buf.st_mode & 0777;   /* Nur die unteren 12 Bits ausgeben */
        printf("Zugriffsrechte: 0%o\n", perm); /* Rechte als Oktalzahl ausgeben */
    
        printf("\nUID: %d\n", buf.st_uid);
        printf("GID: %d\n", buf.st_gid);
    
       if(buf.st_mode & bitmaske[3]) printf("[r"); else printf("[-");
       if(buf.st_mode & bitmaske[4]) printf("w"); else printf("-");
       if((buf.st_mode & bitmaske[5]) & bitmaske[0]) printf("s"); 
    	else if(buf.st_mode & bitmaske[0]) printf("S");
    	else if(buf.st_mode & bitmaske[5]) printf("x"); 
    	else printf("-");
       if(buf.st_mode & bitmaske[6]) printf("r"); else printf("-");
       if(buf.st_mode & bitmaske[7]) printf("w"); else printf("-");
       if((buf.st_mode & bitmaske[8]) & bitmaske[1]) printf("s");
    	else if(buf.st_mode & bitmaske[1]) printf("S"); 
    	else if(buf.st_mode & bitmaske[8]) printf("x"); 
    	else printf("-");
       if(buf.st_mode & bitmaske[9]) printf("r"); else printf("-");
       if(buf.st_mode & bitmaske[10]) printf("w"); else printf("-");
       if(buf.st_mode & bitmaske[11] & bitmaske[2]) printf("t]\n"); 
    	else if(buf.st_mode & bitmaske[11]) printf("x]\n"); 
    	else if(buf.st_mode & bitmaske[2]) printf("T]\n"); 
    	else (printf("-]\n"));
    
     } 
      return 0;
    }
    

    gruss Robert



  • Was du suchst sind sind die Konstanten:

    S_ISUID // UserID Bit
    S_ISGID // GroupID Bit
    S_ISVTX // Sticky Bit
    

    So verwendest dus z.B.:

    if(buf.st_mode & S_ISVTX)
       printf("sticky bit gesetzt\n");
    else
       printf("sticky bit nicht gesetzt\n");
    

    :xmas1:


Anmelden zum Antworten