diff --git a/sysctl.c b/sysctl.c index e5ca8038..12fdafce 100644 --- 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) diff --git a/sysctl.conf.5 b/sysctl.conf.5 index 18fcdfd5..762a1ffe 100644 --- a/sysctl.conf.5 +++ b/sysctl.conf.5 @@ -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