From 45c04464dcae75d842fe0f7819290bb43c3eca32 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Mon, 15 Sep 2025 18:18:31 +0200 Subject: [PATCH] shutdown: move printk changing code int generic code --- src/shared/meson.build | 1 + src/shared/printk-util.c | 42 ++++++++++++++++++++++++++++++++++++++++ src/shared/printk-util.h | 5 +++++ src/shutdown/shutdown.c | 33 +++---------------------------- 4 files changed, 51 insertions(+), 30 deletions(-) create mode 100644 src/shared/printk-util.c create mode 100644 src/shared/printk-util.h diff --git a/src/shared/meson.build b/src/shared/meson.build index 9acb83a47e7..71735aaaa24 100644 --- a/src/shared/meson.build +++ b/src/shared/meson.build @@ -154,6 +154,7 @@ shared_sources = files( 'polkit-agent.c', 'portable-util.c', 'pretty-print.c', + 'printk-util.c', 'prompt-util.c', 'ptyfwd.c', 'qrcode-util.c', diff --git a/src/shared/printk-util.c b/src/shared/printk-util.c new file mode 100644 index 00000000000..0f2221b3b24 --- /dev/null +++ b/src/shared/printk-util.c @@ -0,0 +1,42 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ + +#include "alloc-util.h" +#include "extract-word.h" +#include "log.h" +#include "parse-util.h" +#include "printk-util.h" +#include "sysctl-util.h" + +int sysctl_printk_read(void) { + int r; + + _cleanup_free_ char *sysctl_printk_vals = NULL; + r = sysctl_read("kernel/printk", &sysctl_printk_vals); + if (r < 0) + return log_debug_errno(r, "Cannot read sysctl kernel.printk: %m"); + + _cleanup_free_ char *sysctl_printk_curr = NULL; + const char *p = sysctl_printk_vals; + r = extract_first_word(&p, &sysctl_printk_curr, NULL, 0); + if (r < 0) + return log_debug_errno(r, "Failed to split out kernel printk priority: %m"); + if (r == 0) + return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Short read while reading kernel.printk sysctl"); + + int current_lvl; + r = safe_atoi(sysctl_printk_curr, ¤t_lvl); + if (r < 0) + return log_debug_errno(r, "Failed to parse kernel.printk sysctl: %s", sysctl_printk_vals); + + return current_lvl; +} + +int sysctl_printk_write(int l) { + int r; + + r = sysctl_writef("kernel/printk", "%i", l); + if (r < 0) + return log_debug_errno(r, "Failed to set kernel.printk to %i: %m", l); + + return 0; +} diff --git a/src/shared/printk-util.h b/src/shared/printk-util.h new file mode 100644 index 00000000000..e2bd0db46a3 --- /dev/null +++ b/src/shared/printk-util.h @@ -0,0 +1,5 @@ +/* SPDX-License-Identifier: LGPL-2.1-or-later */ +#pragma once + +int sysctl_printk_read(void); +int sysctl_printk_write(int l); diff --git a/src/shutdown/shutdown.c b/src/shutdown/shutdown.c index 9a114d9be54..97ae7d119ce 100644 --- a/src/shutdown/shutdown.c +++ b/src/shutdown/shutdown.c @@ -36,6 +36,7 @@ #include "log.h" #include "parse-util.h" #include "pidref.h" +#include "printk-util.h" #include "process-util.h" #include "reboot-util.h" #include "rlimit-util.h" @@ -272,42 +273,14 @@ int sync_with_progress(int fd) { return r; } -static int read_current_sysctl_printk_log_level(void) { - _cleanup_free_ char *sysctl_printk_vals = NULL, *sysctl_printk_curr = NULL; - int current_lvl; - const char *p; - int r; - - r = sysctl_read("kernel/printk", &sysctl_printk_vals); - if (r < 0) - return log_debug_errno(r, "Cannot read sysctl kernel.printk: %m"); - - p = sysctl_printk_vals; - r = extract_first_word(&p, &sysctl_printk_curr, NULL, 0); - if (r < 0) - return log_debug_errno(r, "Failed to split out kernel printk priority: %m"); - if (r == 0) - return log_debug_errno(SYNTHETIC_ERRNO(EINVAL), "Short read while reading kernel.printk sysctl"); - - r = safe_atoi(sysctl_printk_curr, ¤t_lvl); - if (r < 0) - return log_debug_errno(r, "Failed to parse kernel.printk sysctl: %s", sysctl_printk_vals); - - return current_lvl; -} - static void bump_sysctl_printk_log_level(int min_level) { - int current_lvl, r; - /* Set the logging level to be able to see messages with log level smaller or equal to min_level */ - current_lvl = read_current_sysctl_printk_log_level(); + int current_lvl = sysctl_printk_read(); if (current_lvl < 0 || current_lvl >= min_level + 1) return; - r = sysctl_writef("kernel/printk", "%i", min_level + 1); - if (r < 0) - log_debug_errno(r, "Failed to bump kernel.printk to %i: %m", min_level + 1); + (void) sysctl_printk_write(min_level + 1); } static void init_watchdog(void) { -- 2.47.3