sysctl: avoid stat() on every item if in -w mode

function                                             old     new   delta
sysctl_act_recursive                                 163     167      +4

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2019-02-08 14:27:21 +01:00
parent 317498f3b3
commit 679c30e73e

View File

@ -205,19 +205,21 @@ static int sysctl_act_on_setting(char *setting)
static int sysctl_act_recursive(const char *path) static int sysctl_act_recursive(const char *path)
{ {
DIR *dirp;
struct stat buf; struct stat buf;
struct dirent *entry;
char *next;
int retval = 0; int retval = 0;
stat(path, &buf); if (!(option_mask32 & FLAG_WRITE)
if (S_ISDIR(buf.st_mode) && !(option_mask32 & FLAG_WRITE)) { && stat(path, &buf) == 0
&& S_ISDIR(buf.st_mode)
) {
struct dirent *entry;
DIR *dirp;
dirp = opendir(path); dirp = opendir(path);
if (dirp == NULL) if (dirp == NULL)
return -1; return -1;
while ((entry = readdir(dirp)) != NULL) { while ((entry = readdir(dirp)) != NULL) {
next = concat_subpath_file(path, entry->d_name); char *next = concat_subpath_file(path, entry->d_name);
if (next == NULL) if (next == NULL)
continue; /* d_name is "." or ".." */ continue; /* d_name is "." or ".." */
/* if path was ".", drop "./" prefix: */ /* if path was ".", drop "./" prefix: */
@ -305,6 +307,8 @@ int sysctl_main(int argc UNUSED_PARAM, char **argv)
return sysctl_act_recursive("."); return sysctl_act_recursive(".");
} }
//TODO: if(!argv[0]) bb_show_usage() ?
retval = 0; retval = 0;
while (*argv) { while (*argv) {
sysctl_dots_to_slashes(*argv); sysctl_dots_to_slashes(*argv);