From 7686f3f16c9cf9b8a1e84676143c6f5d0a7216d3 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 8 Aug 2023 14:18:38 +0200 Subject: [PATCH 1/4] vconsole-setup: port to main-func.h boilerplate --- src/vconsole/vconsole-setup.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 921e587e94..11f57f9e02 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -29,6 +29,7 @@ #include "locale-util.h" #include "lock-util.h" #include "log.h" +#include "main-func.h" #include "proc-cmdline.h" #include "process-util.h" #include "signal-util.h" @@ -568,7 +569,7 @@ static int verify_source_vc(char **ret_path, const char *src_vc) { return TAKE_FD(fd); } -int main(int argc, char **argv) { +static int run(int argc, char **argv) { _cleanup_(context_done) Context c = {}; _cleanup_free_ char *vc = NULL; _cleanup_close_ int fd = -EBADF; @@ -585,7 +586,7 @@ int main(int argc, char **argv) { else fd = find_source_vc(&vc, &idx); if (fd < 0) - return EXIT_FAILURE; + return fd; utf8 = is_locale_utf8(); @@ -594,10 +595,8 @@ int main(int argc, char **argv) { /* Take lock around the remaining operation to avoid being interrupted by a tty reset operation * performed for services with TTYVHangup=yes. */ r = lock_generic(fd, LOCK_BSD, LOCK_EX); - if (r < 0) { - log_error_errno(r, "Failed to lock console: %m"); - return EXIT_FAILURE; - } + if (r < 0) + return log_error_errno(r, "Failed to lock console: %m"); (void) toggle_utf8_sysfs(utf8); (void) toggle_utf8_vc(vc, fd, utf8); @@ -619,3 +618,5 @@ int main(int argc, char **argv) { return IN_SET(r, 0, EX_OSERR) && keyboard_ok ? EXIT_SUCCESS : EXIT_FAILURE; } + +DEFINE_MAIN_FUNCTION_WITH_POSITIVE_FAILURE(run); From bc6059844d6c06130ec3eef715c7bb3c57d7bf73 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 8 Aug 2023 14:18:50 +0200 Subject: [PATCH 2/4] vconsole-setup: use FOREACH_ARRAY() at one more place --- src/vconsole/vconsole-setup.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 11f57f9e02..add0a00e0c 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -79,8 +79,8 @@ static const char * const vc_env_names[_VC_META_MAX] = { static void context_done(Context *c) { assert(c); - for (VCMeta i = 0; i < _VC_META_MAX; i++) - free(c->config[i]); + FOREACH_ARRAY(cc, c->config, _VC_META_MAX) + free(*cc); } static void context_merge_config( From 7b218ef9309f40f47a597c15bbd134f0e0d113a7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 8 Aug 2023 14:19:21 +0200 Subject: [PATCH 3/4] vconsole-setup: simplify path allocation Let's code this straighforwadly, and just allocate the string as we need it, instead of doing pre-allocation. This is not performance sensitive, as this will almost certainly just return /dev/tty1 after the first transition. --- src/vconsole/vconsole-setup.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index add0a00e0c..5f595bf124 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -503,12 +503,12 @@ static void setup_remaining_vcs(int src_fd, unsigned src_idx, bool utf8) { static int find_source_vc(char **ret_path, unsigned *ret_idx) { int r, err = 0; - _cleanup_free_ char *path = new(char, sizeof("/dev/tty63")); - if (!path) - return log_oom(); + assert(ret_path); + assert(ret_idx); for (unsigned i = 1; i <= 63; i++) { _cleanup_close_ int fd = -EBADF; + _cleanup_free_ char *path = NULL; r = verify_vc_allocation(i); if (r < 0) { @@ -517,7 +517,9 @@ static int find_source_vc(char **ret_path, unsigned *ret_idx) { continue; } - sprintf(path, "/dev/tty%u", i); + if (asprintf(&path, "/dev/tty%u", i) < 0) + return log_oom(); + fd = open_terminal(path, O_RDWR|O_CLOEXEC|O_NOCTTY); if (fd < 0) { if (!err) From 6433f1f6a29fd5a063bf2e043421c01d018ce928 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 8 Aug 2023 14:20:17 +0200 Subject: [PATCH 4/4] vconsole-setup: simplify error handling no need to negate an error which we don't need negated. also, add debug log about errors we ignore. --- src/vconsole/vconsole-setup.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/vconsole/vconsole-setup.c b/src/vconsole/vconsole-setup.c index 5f595bf124..73fc0f22da 100644 --- a/src/vconsole/vconsole-setup.c +++ b/src/vconsole/vconsole-setup.c @@ -512,8 +512,8 @@ static int find_source_vc(char **ret_path, unsigned *ret_idx) { r = verify_vc_allocation(i); if (r < 0) { - if (!err) - err = -r; + log_debug_errno(r, "VC %u existance check failed, skipping: %m", i); + RET_GATHER(err, r); continue; } @@ -522,14 +522,14 @@ static int find_source_vc(char **ret_path, unsigned *ret_idx) { fd = open_terminal(path, O_RDWR|O_CLOEXEC|O_NOCTTY); if (fd < 0) { - if (!err) - err = -fd; + log_debug_errno(fd, "Failed to open terminal %s, ignoring: %m", path); + RET_GATHER(err, r); continue; } r = verify_vc_kbmode(fd); if (r < 0) { - if (!err) - err = -r; + log_debug_errno(r, "Failed to check VC %s keyboard mode: %m", path); + RET_GATHER(err, r); continue; }