#include #include #include #include #include #include int main() { // Das aktuelle Verzeichnis ist immer durch den "."-Eintrag ermittelbar. DIR *dir = opendir("."); if (!dir) { perror("opendir"); exit(EXIT_FAILURE); } struct dirent *ent; // Wichtig: errno vor jedem readdir(3)-Aufruf setzen! Nur so ist die // Fehlerbehandlung nach der while-Schleife moeglich. // Die Bedingung der while-Schleife ist hier das hinter dem Komma, wobei es // implizit "true" ist, wenn die Zuweisung ungleich NULL ist; also quasi so // wie "while ((ent = readdir(dir)) != NULL)", nur dass die errno jedes Mal // zurueckgesetzt wird. while (errno = 0, ent = readdir(dir)) { struct stat s; // Wir wollen nur Symlinks ausgeben, also brauchen wir lstat(2), damit // wir Symlinks nicht verfolgen, sondern Informationen ueber sie // bekommen. if (lstat(ent->d_name, &s) == -1) { perror("stat"); continue; } if (S_ISLNK(s.st_mode)) { if (printf("%s\n", ent->d_name) < 0) { perror("printf"); exit(EXIT_FAILURE); // Prinzipiell auch ohne exit(3) denkbar. } } } if (errno != 0) { perror("readdir"); exit(EXIT_FAILURE); } closedir(dir); // fflush(3) nicht vergessen. ;) if (fflush(stdout)) { perror("fflush"); exit(EXIT_FAILURE); } }