diff --git a/src/journal/journal-gatewayd.c b/src/journal/journal-gatewayd.c index 9599e891da..b6a9a2a281 100644 --- a/src/journal/journal-gatewayd.c +++ b/src/journal/journal-gatewayd.c @@ -47,6 +47,8 @@ typedef struct RequestMeta { uint64_t delta, size; int argument_parse_error; + + bool follow; } RequestMeta; static const char* const mime_types[_OUTPUT_MODE_MAX] = { @@ -194,8 +196,20 @@ static ssize_t request_reader_entries( if (r < 0) { log_error("Failed to advance journal pointer: %s", strerror(-r)); return MHD_CONTENT_READER_END_WITH_ERROR; - } else if (r == 0) + } else if (r == 0) { + + if (m->follow) { + r = sd_journal_wait(m->journal, (uint64_t) -1); + if (r < 0) { + log_error("Couldn't wait for journal event: %s", strerror(-r)); + return MHD_CONTENT_READER_END_WITH_ERROR; + } + + continue; + } + return MHD_CONTENT_READER_END_OF_STREAM; + } pos -= m->size; m->delta += m->size; @@ -356,6 +370,22 @@ static int request_parse_arguments_iterator( return MHD_NO; } + if (streq(key, "follow")) { + if (isempty(value)) { + m->follow = true; + return MHD_YES; + } + + r = parse_boolean(value); + if (r < 0) { + m->argument_parse_error = r; + return MHD_NO; + } + + m->follow = r; + return MHD_YES; + } + p = strjoin(key, "=", strempty(value), NULL); if (!p) { m->argument_parse_error = log_oom(); diff --git a/src/journal/journalctl.c b/src/journal/journalctl.c index cbf9833184..b6f9b2f222 100644 --- a/src/journal/journalctl.c +++ b/src/journal/journalctl.c @@ -915,7 +915,7 @@ int main(int argc, char *argv[]) { r = sd_journal_wait(j, (uint64_t) -1); if (r < 0) { - log_error("Couldn't wait for log event: %s", strerror(-r)); + log_error("Couldn't wait for journal event: %s", strerror(-r)); goto finish; } }