#include #include #include #include #include #include #include #define DIM(x) (sizeof((x)) / sizeof(*(x))) typedef struct flags { char flag; // Auszugebender Character int mask; // zu verknuepfendes Bitmuster } FLAGS; static FLAGS rights[] = { // Tabelle der einzelnen Rechte { 'r', S_IRUSR }, // fuer den Besitzer der Datei { 'w', S_IWUSR }, { 'x', S_IXUSR }, { 'r', S_IRGRP }, // fuer die Gruppe { 'w', S_IWGRP }, { 'x', S_IXGRP }, { 'r', S_IROTH }, // fuer den Rest der Welt { 'w', S_IWOTH }, { 'x', S_IXOTH } }; void flags(struct stat st) { int i; switch (st.st_mode & S_IFMT) { // S_IFMT waehlt die ersten // 4 Bits-aus case S_IFBLK: putchar('b'); break; // Block-Device case S_IFCHR: putchar('c'); break; // Char-Device case S_IFDIR: putchar('d'); break; // Directory case S_IFLNK: putchar('l'); break; // Link case S_IFIFO: putchar('p'); break; // FIFO case S_IFSOCK: putchar('s'); break; // Socket case S_IFREG: putchar('-'); break; // Regular-File default: putchar('?'); break; } for (i = 0; i < DIM(rights); i++) //Rechte-Bearbeitung if (rights[i].mask & st.st_mode) putchar(rights[i].flag); else putchar('-'); } static void attribute(char *file) { struct stat st; if (stat(file, &st)) { fprintf(stderr, "Error: can't stat %s\n", file); exit(2); } printf(" %20s",file); // Dateiname printf("%10ld ", st.st_ino); // Inode-Nummer flags(st); // Ausgabe der Dir.+Rechteflags printf(" %4ld", st.st_nlink); // Linkcounter printf(" %-8d", st.st_uid); // Benutzername printf(" %-8d", st.st_gid); // Grupppenname printf(" %7ld", st.st_size); // Dateigroesse printf(" %s", ctime(&st.st_mtime)); // Ausgabe der Modificationzeit } void recursivedir( char *dir, int rek) { char buf[256]; struct stat st; struct dirent *entry; DIR *dirp = opendir(dir); // Verzeichnis oeffnen if (!dirp) { // aktuelles Directory oeffnen fprintf(stderr, "cannot open Dir %s\n", dir); exit(1); } while ((entry = readdir(dirp)) != NULL) { // ueber alle Dir-Eintraege sprintf(buf, "%s/%s", dir, entry->d_name); if (stat(buf, &st)) { // keine Zugriffsrechte fprintf(stderr, "Fehler bei %s: keine Zugriffsrechte\n", buf); } if((st.st_mode & S_IFMT) == S_IFDIR) { // wir haben ein Verzeichnis if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")){ if(rek) { recursivedir(buf, rek); } } } attribute(buf); // Ausgabe der Attribute } } int main(int argc, char *argv[]) { int rek = 0; char *dir = "."; if( argc > 3) { printf("usage: %s [-r] [directory]\n", argv[0]); return -1; } while ( --argc) { if(argv[argc][0] == '-') { rek = !strcmp(argv[argc], "-r"); } else { dir = argv[argc]; } } recursivedir(dir, rek); return(0); }