1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
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
|