diff options
author | Lennart Poettering <lennart@poettering.net> | 2012-10-09 01:31:27 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2012-10-09 01:31:27 +0200 |
commit | 7a69007a24cfff30158ea80665cb6c3c9d3251b0 (patch) | |
tree | 3bdf7f51129b41142ea3ee9bd645bb5a3013ba90 /src/journal/journal-gatewayd.c | |
parent | 98206c93194ced5dffe41e72939e337f851f3fb4 (diff) |
journal: implement follow mode for HTTP GET in gatewayd
Diffstat (limited to 'src/journal/journal-gatewayd.c')
-rw-r--r-- | src/journal/journal-gatewayd.c | 32 |
1 files changed, 31 insertions, 1 deletions
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(); |