2 |
/* |
/* |
3 |
* See README for additional information |
* See README for additional information |
4 |
* |
* |
5 |
* This file can be redistributed under the terms of the GNU Library General |
* Licensed under GPLv2, see file LICENSE in this tarball for details. |
|
* Public License |
|
6 |
*/ |
*/ |
7 |
|
|
8 |
#include "libbb.h" |
#include "libbb.h" |
28 |
|
|
29 |
/* Iterate a function on each entry of a directory */ |
/* Iterate a function on each entry of a directory */ |
30 |
int iterate_on_dir(const char *dir_name, |
int iterate_on_dir(const char *dir_name, |
31 |
int (*func)(const char *, struct dirent *, void *), |
int FAST_FUNC (*func)(const char *, struct dirent *, void *), |
32 |
void * private) |
void *private) |
33 |
{ |
{ |
34 |
DIR *dir; |
DIR *dir; |
35 |
struct dirent *de, *dep; |
struct dirent *de; |
|
int max_len, len; |
|
|
|
|
|
max_len = PATH_MAX + sizeof(struct dirent); |
|
|
de = xmalloc(max_len+1); |
|
|
memset(de, 0, max_len+1); |
|
36 |
|
|
37 |
dir = opendir(dir_name); |
dir = opendir(dir_name); |
38 |
if (dir == NULL) { |
if (dir == NULL) { |
|
free(de); |
|
39 |
return -1; |
return -1; |
40 |
} |
} |
41 |
while ((dep = readdir(dir))) { |
while ((de = readdir(dir)) != NULL) { |
|
len = sizeof(struct dirent); |
|
|
if (len < dep->d_reclen) |
|
|
len = dep->d_reclen; |
|
|
if (len > max_len) |
|
|
len = max_len; |
|
|
memcpy(de, dep, len); |
|
42 |
func(dir_name, de, private); |
func(dir_name, de, private); |
43 |
} |
} |
44 |
closedir(dir); |
closedir(dir); |
|
free(de); |
|
45 |
return 0; |
return 0; |
46 |
} |
} |
47 |
|
|
53 |
int fd, r; |
int fd, r; |
54 |
IF_LONG_IS_WIDER(int ver;) |
IF_LONG_IS_WIDER(int ver;) |
55 |
|
|
56 |
fd = open(name, O_NONBLOCK); |
fd = open(name, O_RDONLY | O_NONBLOCK); |
57 |
if (fd == -1) |
if (fd == -1) |
58 |
return -1; |
return -1; |
59 |
if (!get_version) { |
if (!get_version) { |
95 |
) { |
) { |
96 |
goto notsupp; |
goto notsupp; |
97 |
} |
} |
98 |
fd = open(name, O_NONBLOCK); /* neither read nor write asked for */ |
fd = open(name, O_RDONLY | O_NONBLOCK); /* neither read nor write asked for */ |
99 |
if (fd == -1) |
if (fd == -1) |
100 |
return -1; |
return -1; |
101 |
|
|