From: OMOJOLA JOSHUA Date: Sun, 6 Aug 2023 16:09:27 +0000 (+0100) Subject: systemd-bsod: Add "--continuous" option X-Git-Tag: v255-rc1~695^2~1 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=77d0917ea319bac420b8d9ac0cc63bc4ff562269;p=thirdparty%2Fsystemd.git systemd-bsod: Add "--continuous" option --- diff --git a/man/systemd-bsod.xml b/man/systemd-bsod.xml index 7a64f4f004a..86efb29db08 100644 --- a/man/systemd-bsod.xml +++ b/man/systemd-bsod.xml @@ -43,7 +43,16 @@ + + + + + + Used to make systemd-bsod wait continuously for changes in the + journal's status if doesn't find any emergency messages on initial attempt. + + diff --git a/src/journal/bsod.c b/src/journal/bsod.c index 7d106eb48ab..a421714f215 100644 --- a/src/journal/bsod.c +++ b/src/journal/bsod.c @@ -22,6 +22,8 @@ #include "sysctl-util.h" #include "terminal-util.h" +static bool arg_continuous = false; + static int help(void) { _cleanup_free_ char *link = NULL; int r; @@ -36,6 +38,8 @@ static int help(void) { "as a string and a QR code.\n\n%s" " -h --help Show this help\n" " --version Show package version\n" + " -c --continuous Make systemd-bsod wait continuously\n" + "for changes in the journal\n" "\nSee the %s for details.\n", program_invocation_short_name, ansi_highlight(), @@ -75,13 +79,24 @@ static int acquire_first_emergency_log_message(char **ret) { if (r < 0) return log_error_errno(r, "Failed to seek to start of jornal: %m"); - r = sd_journal_next(j); - if (r < 0) - return log_error_errno(r, "Failed to read next journal entry: %m"); - if (r == 0) { - log_debug("No emergency level entries in the journal"); - *ret = NULL; - return 0; + for(;;) { + r = sd_journal_next(j); + if (r < 0) + return log_error_errno(r, "Failed to read next journal entry: %m"); + if (r > 0) + break; + + if (!arg_continuous) { + log_debug("No emergency level entries in the journal"); + *ret = NULL; + return 0; + } + + r = sd_journal_wait(j, (uint64_t) -1); + if (r < 0) + return log_error_errno(r, "Failed to wait for changes: %m"); + + continue; } r = sd_journal_get_data(j, "MESSAGE", &d, &l); @@ -210,6 +225,7 @@ static int parse_argv(int argc, char * argv[]) { static const struct option options[] = { { "help", no_argument, NULL, 'h' }, { "version", no_argument, NULL, ARG_VERSION }, + { "continuous", no_argument, NULL, 'c' }, {} }; @@ -218,7 +234,7 @@ static int parse_argv(int argc, char * argv[]) { assert(argc >= 0); assert(argv); - while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0) + while ((c = getopt_long(argc, argv, "hc", options, NULL)) >= 0) switch (c) { @@ -228,6 +244,10 @@ static int parse_argv(int argc, char * argv[]) { case ARG_VERSION: return version(); + case 'c': + arg_continuous = true; + break; + case '?': return -EINVAL; diff --git a/units/meson.build b/units/meson.build index 5161ec50299..221bfa706b6 100644 --- a/units/meson.build +++ b/units/meson.build @@ -60,6 +60,11 @@ units = [ 'conditions' : ['ENABLE_INITRD'], 'symlinks' : ['initrd.target.wants/'], }, + { + 'file' : 'systemd-bsod.service.in', + 'conditions' : ['HAVE_QRENCODE','ENABLE_INITRD'], + 'symlinks' : ['initrd.target.wants/'], + }, { 'file' : 'initrd-cleanup.service', 'conditions' : ['ENABLE_INITRD'], diff --git a/units/systemd-bsod.service.in b/units/systemd-bsod.service.in new file mode 100644 index 00000000000..306d4a66239 --- /dev/null +++ b/units/systemd-bsod.service.in @@ -0,0 +1,21 @@ +# SPDX-License-Identifier: LGPL-2.1-or-later +# +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description=Displays emergency message full screen. +Documentation=man:systemd-bsod(8) +ConditionVirtualization=no +DefaultDependencies=no +Conflicts=shutdown.target +Before=shutdown.target +After=systemd-battery-check.service + +[Service] +RemainAfterExit=yes +ExecStart={{LIBEXECDIR}}/systemd-bsod --continuous