#define _GNU_SOURCE 1 #include #include #include #include #include #include #include #ifdef __LCLINT__ /address@hidden@*//address@hidden@*/ extern /address@hidden@*//address@hidden@*/ struct dirent * readdir (DIR *dirp) /address@hidden address@hidden/; extern int closedir (/address@hidden@*/DIR *dirp) /address@hidden address@hidden/; /address@hidden@*//address@hidden@*/ #endif int main (int argc, char *argv[]) { DIR *dir; struct stat filestat; struct dirent *ent; int i; if (argc != 2) { fprintf (stderr, "Usage: dirtest \n"); return 1; } if (stat (argv[1], &filestat) < 0) { fprintf (stderr, "Could not stat %s", argv[1]); perror (NULL); return 1; } else if (!(filestat.st_mode & S_IFDIR)) { fprintf (stderr, "%s is no directory.\n", argv[1]); return 1; } i = (int)strlen (argv[1]) - 1; if (argv[1][i] == '/') { argv[1][i] = '\0'; } if ((dir = opendir (argv[1])) == NULL) { perror ("Opening directory"); return 1; } for (i = 1; (ent = readdir (dir)) != NULL; i++) { /address@hidden@*/char *tmptr; printf ("%d: ", i); if ((tmptr = malloc ((strlen (ent->d_name) + strlen (argv[1]) + 2) * sizeof (char))) == NULL) { fprintf (stderr, "Error allocating memory.\n"); (void)closedir (dir); return 1; } sprintf (tmptr, "%s/%s", argv[1], ent->d_name); if (stat (tmptr, &filestat) < 0) { fprintf (stderr, "Could not stat %s", tmptr); perror (NULL); } else if ((filestat.st_mode & S_IFDIR)) { printf ("Dir: %s\n", tmptr); } else { printf ("File: %s\n", tmptr); } free (tmptr); } if (errno) { perror ("Reading directory"); } else { printf ("No error while reading.\n"); } (void)closedir (dir); return 0; }