summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Small <csmall@dropbear.xyz>2022-04-09 14:18:28 +1000
committerCraig Small <csmall@dropbear.xyz>2022-04-09 14:33:34 +1000
commita7aaeaef652106c7545e278f90872785b8a6fd74 (patch)
treee8e44e5c4a0ab17a093a8c17010321b4a668511d
parent99fed92200ee92cb12a2f3775cb0ced7d03c9262 (diff)
downloadprocps-ng-a7aaeaef652106c7545e278f90872785b8a6fd74.tar.gz
sysctl: print dotted keys again
When the globbing update was put into sysctl, you could no longer simply use the keys because one key could potentially be multiple paths once the glob expansion occured. Using the path instead gave a unique output. Except certain programs, such as salt, expected the output to use the dotted path "kernel.hostname" and not "kernel/hostname". We can no longer use the original key, so now for each path: Copy the path strip off /proc/ convert all / to . The sysctl testsuite was also updated to check for a few different types of conversion failures. References: commit 6389deca5bf667f5fab5912acde78ba8e0febbc7 https://www.freelists.org/post/procps/some-procpsn4400-fixes,4 https://repo.saltproject.io/ Signed-off-by: Craig Small <csmall@dropbear.xyz>
-rw-r--r--NEWS10
-rw-r--r--sysctl.c33
-rw-r--r--testsuite/sysctl.test/sysctl_write.exp14
-rw-r--r--testsuite/sysctl_slash_test.conf1
4 files changed, 44 insertions, 14 deletions
diff --git a/NEWS b/NEWS
index a0ac258..62fac07 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,14 @@
procps-ng-NEXT
+<<<<<<< HEAD
+=======
+ * library
+ Re-add elogind support merge #151
+ * ps: threads again display when -L is used with -q issue #234
+ * ps: proper aix format string behavior was restored
+ * sysctl: print dotted keys again
+
+procps-ng-4.0.0
+>>>>>>> b159c198 (sysctl: print dotted keys again)
---------------
* Rename pwait to pidwait
* sysctl: Add support for systemd glob patterns issue #191
diff --git a/sysctl.c b/sysctl.c
index d26cd11..3139152 100644
--- a/sysctl.c
+++ b/sysctl.c
@@ -152,7 +152,7 @@ static SysctlSetting *setting_new(
strcat(path + proc_len, key+1);
else
strcat(path + proc_len, key);
- /* change . to / */
+ /* change . to / for path */
slashdot(path + proc_len, '.', '/');
s = xmalloc(sizeof(SysctlSetting));
@@ -510,7 +510,8 @@ static int WriteSetting(
int rc = EXIT_SUCCESS;
FILE *fp;
- struct stat ts;
+ struct stat ts;
+ char *dotted_key;
if (!key || !path)
return rc;
@@ -523,13 +524,22 @@ static int WriteSetting(
return rc;
}
- if ((ts.st_mode & S_IWUSR) == 0) {
- xwarn(_("setting key \"%s\""), key);
+ /* Convert the globbed path into a dotted key */
+ if ( (dotted_key = strdup(path + strlen(PROC_PATH))) == NULL) {
+ xerrx(EXIT_FAILURE, _("strdup key"));
+ return EXIT_FAILURE;
+ }
+ slashdot(dotted_key, '/', '.');
+
+ if ((ts.st_mode & S_IWUSR) == 0) {
+ xwarn(_("setting key \"%s\""), dotted_key);
+ free(dotted_key);
return rc;
}
- if (S_ISDIR(ts.st_mode)) {
- xwarn(_("setting key \"%s\""), key);
+ if (S_ISDIR(ts.st_mode)) {
+ xwarn(_("setting key \"%s\""), dotted_key);
+ free(dotted_key);
return rc;
}
@@ -539,7 +549,7 @@ static int WriteSetting(
case ENOENT:
if (!IgnoreError) {
xwarnx(_("\"%s\" is an unknown key%s"),
- key, (ignore_failure?_(", ignoring"):""));
+ dotted_key, (ignore_failure?_(", ignoring"):""));
if (!ignore_failure)
rc = EXIT_FAILURE;
}
@@ -548,11 +558,11 @@ static int WriteSetting(
case EROFS:
case EACCES:
xwarnx(_("permission denied on key \"%s\"%s"),
- key, (ignore_failure?_(", ignoring"):""));
+ dotted_key, (ignore_failure?_(", ignoring"):""));
break;
default:
xwarn(_("setting key \"%s\"%s"),
- key, (ignore_failure?_(", ignoring"):""));
+ dotted_key, (ignore_failure?_(", ignoring"):""));
break;
}
if (!ignore_failure && errno != ENOENT)
@@ -561,7 +571,7 @@ static int WriteSetting(
if (0 < fprintf(fp, "%s\n", value))
rc = EXIT_SUCCESS;
if (close_stream(fp) != 0) {
- xwarn(_("setting key \"%s\""), path);
+ xwarn(_("setting key \"%s\""), dotted_key);
return rc;
}
}
@@ -571,7 +581,7 @@ static int WriteSetting(
printf("%s\n", value);
} else {
if (PrintName) {
- printf("%s = %s\n", path, value);
+ printf("%s = %s\n", dotted_key, value);
} else {
if (PrintNewline)
printf("%s\n", value);
@@ -580,6 +590,7 @@ static int WriteSetting(
}
}
}
+ free(dotted_key);
return rc;
}
diff --git a/testsuite/sysctl.test/sysctl_write.exp b/testsuite/sysctl.test/sysctl_write.exp
index 5a74dec..ff4b4a2 100644
--- a/testsuite/sysctl.test/sysctl_write.exp
+++ b/testsuite/sysctl.test/sysctl_write.exp
@@ -3,11 +3,19 @@ set sysctl ${topdir}sysctl
set test "sysctl write from command line"
spawn $sysctl --dry-run kernel.hostname=procps-test
-expect_pass "$test" "/proc/sys/kernel/hostname = procps-test"
+expect_pass "$test" "kernel.hostname = procps-test"
+
+set test "sysctl write from command line using slash"
+spawn $sysctl --dry-run kernel/hostname=procps-test
+expect_pass "$test" "kernel.hostname = procps-test"
set test "sysctl write from configuration file"
spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_glob_test.conf
-expect_pass "$test" "/proc/sys/fs/protected_fifos = 2\\s+/proc/sys/fs/protected_symlinks = 2\\s+/proc/sys/fs/protected_hardlinks = 1"
+expect_pass "$test" "fs.protected_fifos = 2\\s+fs.protected_symlinks = 2\\s+fs.protected_hardlinks = 1"
+
+set test "sysctl write from file with slashes"
+spawn $sysctl --dry-run -f ${topdir}testsuite/sysctl_slash_test.conf
+expect_pass "$test" "kernel.hostname = procps-test"
set hostname_file "/proc/sys/kernel/hostname"
if {[file exists ${hostname_file}]} {
@@ -25,5 +33,5 @@ if {[file exists ${hostname_file}]} {
expect_spawn_retval "$test" 0
}
} else {
- unsupported "sysctl write: hostname file doe not exist"
+ unsupported "sysctl write: hostname file does not exist"
}
diff --git a/testsuite/sysctl_slash_test.conf b/testsuite/sysctl_slash_test.conf
new file mode 100644
index 0000000..77e9b37
--- /dev/null
+++ b/testsuite/sysctl_slash_test.conf
@@ -0,0 +1 @@
+kernel/hostname = procps-test