sysctl: avoid stat() on every item if in -w mode
authorDenys Vlasenko <vda.linux@googlemail.com>
Fri, 8 Feb 2019 13:27:21 +0000 (14:27 +0100)
committerDenys Vlasenko <vda.linux@googlemail.com>
Fri, 8 Feb 2019 13:27:21 +0000 (14:27 +0100)
function                                             old     new   delta
sysctl_act_recursive                                 163     167      +4

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
procps/sysctl.c

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