diff options
Diffstat (limited to 'e2fsprogs/e2fs_lib.c')
-rw-r--r-- | e2fsprogs/e2fs_lib.c | 21 |
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 */ |
30 | int iterate_on_dir(const char *dir_name, | 30 | int 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 | ||