chiark / gitweb /
journalctl: show systemd messages about unit for -u
[elogind.git] / src / journal / journal-gatewayd.c
index 613b5394a869e937e2cac0144ca1286d866691eb..7e29c905e2a191087cafa05452c573f52ce3bd13 100644 (file)
@@ -35,6 +35,7 @@
 #include "microhttpd-util.h"
 #include "virt.h"
 #include "build.h"
+#include "fileio.h"
 
 typedef struct RequestMeta {
         sd_journal *journal;
@@ -482,18 +483,14 @@ static int request_parse_arguments(
 
 static int request_handler_entries(
                 struct MHD_Connection *connection,
-                void **connection_cls) {
+                void *connection_cls) {
 
         struct MHD_Response *response;
-        RequestMeta *m;
+        RequestMeta *m = connection_cls;
         int r;
 
         assert(connection);
-        assert(connection_cls);
-
-        m = request_meta(connection_cls);
-        if (!m)
-                return respond_oom(connection);
+        assert(m);
 
         r = open_journal(m);
         if (r < 0)
@@ -651,15 +648,11 @@ static int request_handler_fields(
                 void *connection_cls) {
 
         struct MHD_Response *response;
-        RequestMeta *m;
+        RequestMeta *m = connection_cls;
         int r;
 
         assert(connection);
-        assert(connection_cls);
-
-        m = request_meta(connection_cls);
-        if (!m)
-                return respond_oom(connection);
+        assert(m);
 
         r = open_journal(m);
         if (r < 0)
@@ -750,10 +743,10 @@ static int request_handler_file(
 
 static int request_handler_machine(
                 struct MHD_Connection *connection,
-                void **connection_cls) {
+                void *connection_cls) {
 
         struct MHD_Response *response;
-        RequestMeta *m;
+        RequestMeta *m = connection_cls;
         int r;
         _cleanup_free_ char* hostname = NULL, *os_name = NULL;
         uint64_t cutoff_from, cutoff_to, usage;
@@ -762,10 +755,7 @@ static int request_handler_machine(
         const char *v = "bare";
 
         assert(connection);
-
-        m = request_meta(connection_cls);
-        if (!m)
-                return respond_oom(connection);
+        assert(m);
 
         r = open_journal(m);
         if (r < 0)
@@ -840,30 +830,52 @@ static int request_handler(
                 void **connection_cls) {
 
         assert(connection);
+        assert(connection_cls);
         assert(url);
         assert(method);
 
         if (!streq(method, "GET"))
-                return MHD_NO;
+                return respond_error(connection, MHD_HTTP_METHOD_NOT_ACCEPTABLE,
+                                     "Unsupported method.\n");
+
+
+        if (!*connection_cls) {
+                if (!request_meta(connection_cls))
+                        return respond_oom(connection);
+                return MHD_YES;
+        }
 
         if (streq(url, "/"))
                 return request_handler_redirect(connection, "/browse");
 
         if (streq(url, "/entries"))
-                return request_handler_entries(connection, connection_cls);
+                return request_handler_entries(connection, *connection_cls);
 
         if (startswith(url, "/fields/"))
-                return request_handler_fields(connection, url + 8, connection_cls);
+                return request_handler_fields(connection, url + 8, *connection_cls);
 
         if (streq(url, "/browse"))
                 return request_handler_file(connection, DOCUMENT_ROOT "/browse.html", "text/html");
 
         if (streq(url, "/machine"))
-                return request_handler_machine(connection, connection_cls);
+                return request_handler_machine(connection, *connection_cls);
 
         return respond_error(connection, MHD_HTTP_NOT_FOUND, "Not found.\n");
 }
 
+static int help(void) {
+
+        printf("%s [OPTIONS...] ...\n\n"
+               "HTTP server for journal events.\n\n"
+               "  -h --help           Show this help\n"
+               "     --version        Show package version\n"
+               "     --cert=CERT.PEM  Specify server certificate in PEM format\n"
+               "     --key=KEY.PEM    Specify server key in PEM format\n",
+               program_invocation_short_name);
+
+        return 0;
+}
+
 static char *key_pem = NULL;
 static char *cert_pem = NULL;
 
@@ -877,6 +889,7 @@ static int parse_argv(int argc, char *argv[]) {
         int r, c;
 
         static const struct option options[] = {
+                { "help",    no_argument,       NULL, 'h'         },
                 { "version", no_argument,       NULL, ARG_VERSION },
                 { "key",     required_argument, NULL, ARG_KEY     },
                 { "cert",    required_argument, NULL, ARG_CERT    },
@@ -886,13 +899,16 @@ static int parse_argv(int argc, char *argv[]) {
         assert(argc >= 0);
         assert(argv);
 
-        while ((c = getopt_long(argc, argv, "", options, NULL)) >= 0)
+        while ((c = getopt_long(argc, argv, "h", options, NULL)) >= 0)
                 switch(c) {
                 case ARG_VERSION:
                         puts(PACKAGE_STRING);
                         puts(SYSTEMD_FEATURES);
                         return 0;
 
+                case 'h':
+                        return help();
+
                 case ARG_KEY:
                         if (key_pem) {
                                 log_error("Key file specified twice");