]> granicus.if.org Git - procps-ng/commitdiff
sysctl: ignore errors from lines starting with -
authorCraig Small <csmall@dropbear.xyz>
Sat, 21 Sep 2019 05:50:53 +0000 (15:50 +1000)
committerCraig Small <csmall@dropbear.xyz>
Sat, 21 Sep 2019 05:53:45 +0000 (15:53 +1000)
The systemd sysctl ignores errors from preload files that start
with a hyphen.  This change brings the procps sysctl into line with
their change.

References:
    procps-ng/procps#138
    https://github.com/systemd/systemd/pull/13191
    https://github.com/systemd/systemd/pull/13141

sysctl.c
sysctl.conf.5

index e5ca8038049c1358db873096491961404e7b9e6d..12fdafcec05ed57badf7d6557530b498b84758b2 100644 (file)
--- a/sysctl.c
+++ b/sysctl.c
@@ -375,6 +375,7 @@ static int WriteSetting(const char *setting)
        char *tmpname;
        char *outname;
        char *last_dot;
+       bool ignore_failure;
 
        FILE *fp;
        struct stat ts;
@@ -399,6 +400,10 @@ static int WriteSetting(const char *setting)
                return -2;
        }
 
+       ignore_failure = name[0] == '-';
+       if (ignore_failure)
+           name++;
+
        /* used to open the file */
        tmpname = xmalloc(equals - name + 1 + strlen(PROC_PATH));
        strcpy(tmpname, PROC_PATH);
@@ -443,19 +448,22 @@ static int WriteSetting(const char *setting)
                switch (errno) {
                case ENOENT:
                        if (!IgnoreError) {
-                               xwarnx(_("\"%s\" is an unknown key"), outname);
-                               rc = -1;
+                               xwarnx(_("\"%s\" is an unknown key%s"), outname, (ignore_failure?_(", ignoring"):""));
+                               if (!ignore_failure)
+                                   rc = -1;
                        }
                        break;
+               case EPERM:
+               case EROFS:
                case EACCES:
-                       xwarnx(_("permission denied on key '%s'"), outname);
-                       rc = -1;
+                       xwarnx(_("permission denied on key \"%s\"%s"), outname, (ignore_failure?_(", ignoring"):""));
                        break;
                default:
-                       xwarn(_("setting key \"%s\""), outname);
-                       rc = -1;
+                       xwarn(_("setting key \"%s\"%s"), outname, (ignore_failure?_(", ignoring"):""));
                        break;
                }
+               if (!ignore_failure && errno != ENOENT)
+                   rc = -1;
        } else {
                rc = fprintf(fp, "%s\n", value);
                if (0 < rc)
index 18fcdfd57a61a78d655deadf282565be961fa542..762a1ffe94419df07e65ec922d3e534bf9edf2d6 100644 (file)
@@ -6,7 +6,7 @@
 .\" but WITHOUT ANY WARRANTY; without even the implied warranty of
 .\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 .\" GNU General Public License for more details."
-.TH SYSCTL.CONF "5" "January 2012" "procps-ng" "File Formats"
+.TH SYSCTL.CONF "5" "2019-09-21" "procps-ng" "File Formats"
 .SH NAME
 sysctl.conf \- sysctl preload/configuration file
 .SH DESCRIPTION
@@ -28,6 +28,10 @@ token = value
 Note that blank lines are ignored, and whitespace before and after a token or
 value is ignored, although a value can contain whitespace within.  Lines which
 begin with a # or ; are considered comments and ignored.
+
+If a line begins with a single \-, any attempts to set the value that fail will be
+ignored.
+
 .SH NOTES
 As the
 .BR /etc/sysctl.conf