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: