summaryrefslogtreecommitdiff
path: root/src/filelist.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/filelist.c')
-rw-r--r--src/filelist.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/src/filelist.c b/src/filelist.c
index 5c0777d..e1b4055 100644
--- a/src/filelist.c
+++ b/src/filelist.c
@@ -111,6 +111,11 @@ gib_list *feh_file_remove_from_list(gib_list * list, gib_list * l)
return(gib_list_remove(list, l));
}
+int file_selector_all(const struct dirent *unused __attribute__((unused)))
+{
+ return 1;
+}
+
/* Recursive */
void add_file_to_filelist_recursively(char *origpath, unsigned char level)
{
@@ -175,8 +180,9 @@ void add_file_to_filelist_recursively(char *origpath, unsigned char level)
}
if ((S_ISDIR(st.st_mode)) && (level != FILELIST_LAST)) {
- struct dirent *de;
+ struct dirent **de;
DIR *dir;
+ int cnt, n;
D(("It is a directory\n"));
@@ -186,13 +192,25 @@ void add_file_to_filelist_recursively(char *origpath, unsigned char level)
free(path);
return;
}
- de = readdir(dir);
- while (de != NULL) {
- if (strcmp(de->d_name, ".")
- && strcmp(de->d_name, "..")) {
+ n = scandir(path, &de, file_selector_all, alphasort);
+ if (n < 0) {
+ switch (errno) {
+ case ENOMEM:
+ if (!opt.quiet)
+ weprintf("Insufficient memory to scan directory %s:", path);
+ break;
+ default:
+ if (!opt.quiet)
+ weprintf("Failed to scan directory %s:", path);
+ }
+ }
+
+ for (cnt = 0; cnt < n; cnt++) {
+ if (strcmp(de[cnt]->d_name, ".")
+ && strcmp(de[cnt]->d_name, "..")) {
char *newfile;
- newfile = estrjoin("", path, "/", de->d_name, NULL);
+ newfile = estrjoin("", path, "/", de[cnt]->d_name, NULL);
/* This ensures we go down one level even if not fully recursive
- this way "feh some_dir" expands to some_dir's contents */
@@ -202,9 +220,10 @@ void add_file_to_filelist_recursively(char *origpath, unsigned char level)
add_file_to_filelist_recursively(newfile, FILELIST_LAST);
free(newfile);
+ free(de[cnt]);
}
- de = readdir(dir);
}
+ free(de);
closedir(dir);
} else if (S_ISREG(st.st_mode)) {
D(("Adding regular file %s to filelist\n", path));