/* * Systemnahe Software I WS 98/99 Blatt 8 (c) mg SAI * rekursives Aufsummieren des verbrauchten Speicherplatz in den Directories */ #include #include #include #include #include /* * Summiert den verbrauchten Speicherplatz auf dem aktuellen Dir auf und liefert * den Wert zurueck * falls rek == TRUE ist, geht die Prozedur rekursiv in die Unterverzeichnisse */ static long sdir(char *dir, int rek) { struct stat st; struct dirent *entry; DIR *dp = opendir(dir); long sum = 0l; long help; char buf[200]; if (!strcmp(dir, "/")) /* Sonderfall Root! */ { return 0l; } if (!dp) { fprintf(stderr, "cannot open Dir %s\n", dir); return 0l; } while ((entry = readdir(dp)) != NULL) { /* ueber alle Dir-Eintraege */ sprintf(buf, "%s/%s", dir, entry->d_name); if (stat(buf, &st)) /* keine Zugriffsrechte ? */ { fprintf(stderr, "cannot stat %s\n", buf); } else /* Stat-Zugriff hat geklappt */ { switch (st.st_mode&S_IFMT) { case S_IFDIR: /* Directory ???*/ /* Achtung bei "." und ".." */ if (strcmp(entry->d_name, ".") && strcmp(entry->d_name, "..")) { if (rek)/* Rekursion ???*/ { help = sdir(buf, rek); printf("-----------------------------\n"); printf("Groesse von %s ist \t%ld KB\n\n\n", entry->d_name, help/1024); sum += help; } } break; case S_IFREG: /* Datei ??? */ printf("%s \tGroesse: \t%ld KB\n",entry->d_name, (long)st.st_size/1024); sum += (long)st.st_size; break; default: ; /* relax */ } } } closedir(dp); return sum; } int main(int argc, char **argv) { int rek = 0; /* rekursives Besuchen der SubDirs j/n */ char *dir = "."; /* Pointer auf Startdirectory */ char *home_dir = "."; home_dir = getenv("HOME"); if (strcmp(home_dir, ".") == 0) { printf("HOME ist nicht definiert!\n"); } dir = home_dir; if (argc >3) { printf("usage: %s [-r] [directory]\n", argv[0]); return -1; } while (--argc) /* ueber alle Argumente */ { if (argv[argc][0] == '-') rek = !strcmp(argv[argc], "-r"); else dir = argv[argc]; } printf("Groesse in Kbytes von %s ist: %ld KB\n", dir, sdir(dir, rek)/1024); return 0; }