diff options
author | Daniel Friesel <ghub@derf.homelinux.org> | 2011-04-27 10:56:15 -0700 |
---|---|---|
committer | Daniel Friesel <ghub@derf.homelinux.org> | 2011-04-27 10:56:15 -0700 |
commit | 05224903fd4e5a9c4619d41476f117c418091f24 (patch) | |
tree | 200a92cfd64606ec97f7c607bad3da44a533cfab | |
parent | 62d0331156461884fdf8d5fdcaedc96ba6de774e (diff) | |
parent | 785c837d0d57944f48c5be0d4dc9f924c1320b3e (diff) |
Merged pull request #20 from talisein/sortdir.
Add directory's files to filelist alphanumerically
-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 b4b481a..fa1735d 100644 --- a/src/filelist.c +++ b/src/filelist.c @@ -112,6 +112,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) { @@ -176,8 +181,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")); @@ -187,13 +193,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 */ @@ -203,9 +221,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); |