mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-24 20:08:10 +01:00
76 lines
1.8 KiB
Text
76 lines
1.8 KiB
Text
|
From: "Stewart Smith" <stewart@flamingspork.com>
|
||
|
To: notmuch@notmuchmail.org
|
||
|
Date: Wed, 18 Nov 2009 13:22:20 +1100
|
||
|
Subject: [notmuch] [PATCH] count_files: sort directory in inode order before
|
||
|
statting
|
||
|
Message-ID: <1258510940-7018-1-git-send-email-stewart@flamingspork.com>
|
||
|
|
||
|
---
|
||
|
notmuch-new.c | 30 ++++++++++--------------------
|
||
|
1 files changed, 10 insertions(+), 20 deletions(-)
|
||
|
|
||
|
diff --git a/notmuch-new.c b/notmuch-new.c
|
||
|
index 11fad8c..c5f841a 100644
|
||
|
--- a/notmuch-new.c
|
||
|
+++ b/notmuch-new.c
|
||
|
@@ -308,36 +308,26 @@ add_files (notmuch_database_t *notmuch,
|
||
|
static void
|
||
|
count_files (const char *path, int *count)
|
||
|
{
|
||
|
- DIR *dir;
|
||
|
- struct dirent *e, *entry = NULL;
|
||
|
- int entry_length;
|
||
|
- int err;
|
||
|
+ struct dirent *entry = NULL;
|
||
|
char *next;
|
||
|
struct stat st;
|
||
|
+ struct dirent **namelist = NULL;
|
||
|
|
||
|
- dir = opendir (path);
|
||
|
+ int n_entries= scandir(path, &namelist, 0, ino_cmp);
|
||
|
|
||
|
- if (dir == NULL) {
|
||
|
+ if (n_entries == -1) {
|
||
|
fprintf (stderr, "Warning: failed to open directory %s: %s\n",
|
||
|
path, strerror (errno));
|
||
|
goto DONE;
|
||
|
}
|
||
|
|
||
|
- entry_length = offsetof (struct dirent, d_name) +
|
||
|
- pathconf (path, _PC_NAME_MAX) + 1;
|
||
|
- entry = malloc (entry_length);
|
||
|
+ int i=0;
|
||
|
|
||
|
while (!interrupted) {
|
||
|
- err = readdir_r (dir, entry, &e);
|
||
|
- if (err) {
|
||
|
- fprintf (stderr, "Error reading directory: %s\n",
|
||
|
- strerror (errno));
|
||
|
- free (entry);
|
||
|
- goto DONE;
|
||
|
- }
|
||
|
+ if (i == n_entries)
|
||
|
+ break;
|
||
|
|
||
|
- if (e == NULL)
|
||
|
- break;
|
||
|
+ entry= namelist[i++];
|
||
|
|
||
|
/* Ignore special directories to avoid infinite recursion.
|
||
|
* Also ignore the .notmuch directory.
|
||
|
@@ -376,8 +366,8 @@ count_files (const char *path, int *count)
|
||
|
DONE:
|
||
|
if (entry)
|
||
|
free (entry);
|
||
|
-
|
||
|
- closedir (dir);
|
||
|
+ if (namelist)
|
||
|
+ free (namelist);
|
||
|
}
|
||
|
|
||
|
int
|
||
|
--
|
||
|
1.6.3.3
|
||
|
|
||
|
|