summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrew Potter <agpotter@gmail.com>2010-12-29 17:23:28 -0800
committerAndrew Potter <agpotter@gmail.com>2010-12-29 17:23:28 -0800
commit785c837d0d57944f48c5be0d4dc9f924c1320b3e (patch)
tree3a9c603b21ce18742518e6ec0118d6da9a3c3a5a /src
parent779de2316baff0915faa3ffa6a5ff972360c5ae7 (diff)
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.c33
-rw-r--r--src/filelist.h1
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);