summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Friesel <ghub@derf.homelinux.org>2011-04-27 10:56:15 -0700
committerDaniel Friesel <ghub@derf.homelinux.org>2011-04-27 10:56:15 -0700
commit05224903fd4e5a9c4619d41476f117c418091f24 (patch)
tree200a92cfd64606ec97f7c607bad3da44a533cfab
parent62d0331156461884fdf8d5fdcaedc96ba6de774e (diff)
parent785c837d0d57944f48c5be0d4dc9f924c1320b3e (diff)
Merged pull request #20 from talisein/sortdir.
Add directory's files to filelist alphanumerically
-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 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);