chiark / gitweb /
journal: add matching support to gatewayd
authorLennart Poettering <lennart@poettering.net>
Mon, 8 Oct 2012 23:17:29 +0000 (01:17 +0200)
committerLennart Poettering <lennart@poettering.net>
Mon, 8 Oct 2012 23:17:29 +0000 (01:17 +0200)
src/journal/journal-gatewayd.c

index 0957dcbe5a6f423d4d447bcf43b9ca5944033e1b..9599e891daf34db930f7b8b7772bc8bbf7baf14c 100644 (file)
@@ -45,6 +45,8 @@ typedef struct RequestMeta {
 
         FILE *tmp;
         uint64_t delta, size;
+
+        int argument_parse_error;
 } RequestMeta;
 
 static const char* const mime_types[_OUTPUT_MODE_MAX] = {
@@ -337,6 +339,51 @@ static int request_parse_range(
         return 0;
 }
 
+static int request_parse_arguments_iterator(
+                void *cls,
+                enum MHD_ValueKind kind,
+                const char *key,
+                const char *value) {
+
+        RequestMeta *m = cls;
+        _cleanup_free_ char *p = NULL;
+        int r;
+
+        assert(m);
+
+        if (isempty(key)) {
+                m->argument_parse_error = -EINVAL;
+                return MHD_NO;
+        }
+
+        p = strjoin(key, "=", strempty(value), NULL);
+        if (!p) {
+                m->argument_parse_error = log_oom();
+                return MHD_NO;
+        }
+
+        r = sd_journal_add_match(m->journal, p, 0);
+        if (r < 0) {
+                m->argument_parse_error = r;
+                return MHD_NO;
+        }
+
+        return MHD_YES;
+}
+
+static int request_parse_arguments(
+                RequestMeta *m,
+                struct MHD_Connection *connection) {
+
+        assert(m);
+        assert(connection);
+
+        m->argument_parse_error = 0;
+        MHD_get_connection_values(connection, MHD_GET_ARGUMENT_KIND, request_parse_arguments_iterator, m);
+
+        return m->argument_parse_error;
+}
+
 static int request_handler_entries(
                 struct MHD_Connection *connection,
                 void **connection_cls) {
@@ -362,6 +409,9 @@ static int request_handler_entries(
         if (request_parse_range(m, connection) < 0)
                 return respond_error(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse Range header.\n");
 
+        if (request_parse_arguments(m, connection) < 0)
+                return respond_error(connection, MHD_HTTP_BAD_REQUEST, "Failed to parse URL arguments.\n");
+
         /* log_info("cursor = %s", m->cursor); */
         /* log_info("skip = %lli", m->n_skip); */
         /* if (!m->n_entries_set) */