summaryrefslogtreecommitdiff
path: root/src/journal/journal-gatewayd.c
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2012-10-09 01:31:27 +0200
committerLennart Poettering <lennart@poettering.net>2012-10-09 01:31:27 +0200
commit7a69007a24cfff30158ea80665cb6c3c9d3251b0 (patch)
tree3bdf7f51129b41142ea3ee9bd645bb5a3013ba90 /src/journal/journal-gatewayd.c
parent98206c93194ced5dffe41e72939e337f851f3fb4 (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.c32
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();