diff options
author | Andrew Potter <agpotter@gmail.com> | 2010-12-29 17:23:28 -0800 |
---|---|---|
committer | Andrew Potter <agpotter@gmail.com> | 2010-12-29 17:23:28 -0800 |
commit | 785c837d0d57944f48c5be0d4dc9f924c1320b3e (patch) | |
tree | 3a9c603b21ce18742518e6ec0118d6da9a3c3a5a /src | |
parent | 779de2316baff0915faa3ffa6a5ff972360c5ae7 (diff) | |
download | feh-785c837d0d57944f48c5be0d4dc9f924c1320b3e.zip |
o Add each directory's files to the filelist alphanumerically, rather
than the filesystem's (possibly random) order.
Diffstat (limited to 'src')
-rw-r--r-- | src/filelist.c | 33 | ||||
-rw-r--r-- | src/filelist.h | 1 |
2 files changed, 27 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)); diff --git a/src/filelist.h b/src/filelist.h index 842e3af..617236f 100644 --- a/src/filelist.h +++ b/src/filelist.h @@ -60,6 +60,7 @@ void feh_file_free(feh_file * file); feh_file_info *feh_file_info_new(void); void feh_file_info_free(feh_file_info * info); gib_list *feh_file_rm_and_free(gib_list * list, gib_list * file); +int file_selector_all(const struct dirent *unused); void add_file_to_filelist_recursively(char *origpath, unsigned char level); void add_file_to_rm_filelist(char *file); void delete_rm_files(void); |