summaryrefslogtreecommitdiffstats
path: root/src/journal/bsod.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/journal/bsod.c')
-rw-r--r--src/journal/bsod.c36
1 files changed, 28 insertions, 8 deletions
diff --git a/src/journal/bsod.c b/src/journal/bsod.c
index 2ae06dee52..76907d2e5c 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;