aboutsummaryrefslogtreecommitdiff
path: root/e2fsprogs/e2fs_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'e2fsprogs/e2fs_lib.c')
-rw-r--r--e2fsprogs/e2fs_lib.c21
1 files changed, 4 insertions, 17 deletions
diff --git a/e2fsprogs/e2fs_lib.c b/e2fsprogs/e2fs_lib.c
index 3e8d95687..70ae1f407 100644
--- a/e2fsprogs/e2fs_lib.c
+++ b/e2fsprogs/e2fs_lib.c
@@ -28,33 +28,20 @@ static void close_silently(int fd)
28 28
29/* Iterate a function on each entry of a directory */ 29/* Iterate a function on each entry of a directory */
30int iterate_on_dir(const char *dir_name, 30int iterate_on_dir(const char *dir_name,
31 int (*func)(const char *, struct dirent *, void *), 31 int FAST_FUNC (*func)(const char *, struct dirent *, void *),
32 void * private) 32 void *private)
33{ 33{
34 DIR *dir; 34 DIR *dir;
35 struct dirent *de, *dep; 35 struct dirent *de;
36 int max_len, len;
37
38 max_len = PATH_MAX + sizeof(struct dirent);
39 de = xmalloc(max_len+1);
40 memset(de, 0, max_len+1);
41 36
42 dir = opendir(dir_name); 37 dir = opendir(dir_name);
43 if (dir == NULL) { 38 if (dir == NULL) {
44 free(de);
45 return -1; 39 return -1;
46 } 40 }
47 while ((dep = readdir(dir))) { 41 while ((de = readdir(dir)) != NULL) {
48 len = sizeof(struct dirent);
49 if (len < dep->d_reclen)
50 len = dep->d_reclen;
51 if (len > max_len)
52 len = max_len;
53 memcpy(de, dep, len);
54 func(dir_name, de, private); 42 func(dir_name, de, private);
55 } 43 }
56 closedir(dir); 44 closedir(dir);
57 free(de);
58 return 0; 45 return 0;
59} 46}
60 47