chiark
/
gitweb
/
~ianmdlvl
/
elogind.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
journal: fix iteration when we go backwards from the beginning of an array chain...
[elogind.git]
/
src
/
journal
/
journal-gatewayd.c
diff --git
a/src/journal/journal-gatewayd.c
b/src/journal/journal-gatewayd.c
index 6922ebcf9c1c154f83cee9b24ca448e79e8a1bbb..384137b2bd614f573e6227a7c90918a955c1cf23 100644
(file)
--- a/
src/journal/journal-gatewayd.c
+++ b/
src/journal/journal-gatewayd.c
@@
-31,9
+31,12
@@
#include "util.h"
#include "sd-journal.h"
#include "sd-daemon.h"
#include "util.h"
#include "sd-journal.h"
#include "sd-daemon.h"
+#include "sd-bus.h"
+#include "bus-util.h"
#include "logs-show.h"
#include "logs-show.h"
-#include "
virt
.h"
+#include "
microhttpd-util
.h"
#include "build.h"
#include "build.h"
+#include "fileio.h"
typedef struct RequestMeta {
sd_journal *journal;
typedef struct RequestMeta {
sd_journal *journal;
@@
-105,11
+108,10
@@
static int open_journal(RequestMeta *m) {
if (m->journal)
return 0;
if (m->journal)
return 0;
- return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM
_ONLY
);
+ return sd_journal_open(&m->journal, SD_JOURNAL_LOCAL_ONLY|SD_JOURNAL_SYSTEM);
}
}
-
-static int respond_oom(struct MHD_Connection *connection) {
+static int respond_oom_internal(struct MHD_Connection *connection) {
struct MHD_Response *response;
const char m[] = "Out of memory.\n";
int ret;
struct MHD_Response *response;
const char m[] = "Out of memory.\n";
int ret;
@@
-127,6
+129,8
@@
static int respond_oom(struct MHD_Connection *connection) {
return ret;
}
return ret;
}
+#define respond_oom(connection) log_oom(), respond_oom_internal(connection)
+
static int respond_error(
struct MHD_Connection *connection,
unsigned code,
static int respond_error(
struct MHD_Connection *connection,
unsigned code,
@@
-243,7
+247,7
@@
static ssize_t request_reader_entries(
}
}
}
}
- r = output_journal(m->tmp, m->journal, m->mode, 0, OUTPUT_FULL_WIDTH);
+ r = output_journal(m->tmp, m->journal, m->mode, 0, OUTPUT_FULL_WIDTH
, NULL
);
if (r < 0) {
log_error("Failed to serialize item: %s", strerror(-r));
return MHD_CONTENT_READER_END_WITH_ERROR;
if (r < 0) {
log_error("Failed to serialize item: %s", strerror(-r));
return MHD_CONTENT_READER_END_WITH_ERROR;
@@
-330,7
+334,7
@@
static int request_parse_range(
colon2 = strchr(colon + 1, ':');
if (colon2) {
colon2 = strchr(colon + 1, ':');
if (colon2) {
-
char _cleanup_free_
*t;
+
_cleanup_free_ char
*t;
t = strndup(colon + 1, colon2 - colon - 1);
if (!t)
t = strndup(colon + 1, colon2 - colon - 1);
if (!t)
@@
-479,18
+483,14
@@
static int request_parse_arguments(
static int request_handler_entries(
struct MHD_Connection *connection,
static int request_handler_entries(
struct MHD_Connection *connection,
- void *
*
connection_cls) {
+ void *connection_cls) {
struct MHD_Response *response;
struct MHD_Response *response;
- RequestMeta *m;
+ RequestMeta *m
= connection_cls
;
int r;
assert(connection);
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)
r = open_journal(m);
if (r < 0)
@@
-648,15
+648,11
@@
static int request_handler_fields(
void *connection_cls) {
struct MHD_Response *response;
void *connection_cls) {
struct MHD_Response *response;
- RequestMeta *m;
+ RequestMeta *m
= connection_cls
;
int r;
assert(connection);
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)
r = open_journal(m);
if (r < 0)
@@
-745,24
+741,51
@@
static int request_handler_file(
return ret;
}
return ret;
}
+static int get_virtualization(char **v) {
+ _cleanup_bus_unref_ sd_bus *bus = NULL;
+ char *b;
+ int r;
+
+ r = sd_bus_default_system(&bus);
+ if (r < 0)
+ return r;
+
+ r = sd_bus_get_property_string(
+ bus,
+ "org.freedesktop.systemd1",
+ "/org/freedesktop/systemd1",
+ "org.freedesktop.systemd1.Manager",
+ "Virtualization",
+ NULL,
+ &b);
+ if (r < 0)
+ return r;
+
+ if (isempty(b)) {
+ free(b);
+ *v = NULL;
+ return 0;
+ }
+
+ *v = b;
+ return 1;
+}
+
static int request_handler_machine(
struct MHD_Connection *connection,
static int request_handler_machine(
struct MHD_Connection *connection,
- void *
*
connection_cls) {
+ void *connection_cls) {
struct MHD_Response *response;
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;
char *json;
sd_id128_t mid, bid;
int r;
_cleanup_free_ char* hostname = NULL, *os_name = NULL;
uint64_t cutoff_from, cutoff_to, usage;
char *json;
sd_id128_t mid, bid;
-
const char *v = "bare"
;
+
_cleanup_free_ char *v = NULL
;
assert(connection);
assert(connection);
-
- m = request_meta(connection_cls);
- if (!m)
- return respond_oom(connection);
+ assert(m);
r = open_journal(m);
if (r < 0)
r = open_journal(m);
if (r < 0)
@@
-790,7
+813,7
@@
static int request_handler_machine(
parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL);
parse_env_file("/etc/os-release", NEWLINE, "PRETTY_NAME", &os_name, NULL);
-
detec
t_virtualization(&v);
+
ge
t_virtualization(&v);
r = asprintf(&json,
"{ \"machine_id\" : \"" SD_ID128_FORMAT_STR "\","
r = asprintf(&json,
"{ \"machine_id\" : \"" SD_ID128_FORMAT_STR "\","
@@
-798,17
+821,17
@@
static int request_handler_machine(
"\"hostname\" : \"%s\","
"\"os_pretty_name\" : \"%s\","
"\"virtualization\" : \"%s\","
"\"hostname\" : \"%s\","
"\"os_pretty_name\" : \"%s\","
"\"virtualization\" : \"%s\","
- "\"usage\" : \"%
llu
\","
- "\"cutoff_from_realtime\" : \"%
llu
\","
- "\"cutoff_to_realtime\" : \"%
llu
\" }\n",
+ "\"usage\" : \"%
"PRIu64"
\","
+ "\"cutoff_from_realtime\" : \"%
"PRIu64"
\","
+ "\"cutoff_to_realtime\" : \"%
"PRIu64"
\" }\n",
SD_ID128_FORMAT_VAL(mid),
SD_ID128_FORMAT_VAL(bid),
SD_ID128_FORMAT_VAL(mid),
SD_ID128_FORMAT_VAL(bid),
- hostname_cleanup(hostname),
+ hostname_cleanup(hostname
, false
),
os_name ? os_name : "Linux",
os_name ? os_name : "Linux",
- v,
-
(unsigned long long)
usage,
-
(unsigned long long)
cutoff_from,
-
(unsigned long long)
cutoff_to);
+ v
? v : "bare"
,
+ usage,
+ cutoff_from,
+ cutoff_to);
if (r < 0)
return respond_oom(connection);
if (r < 0)
return respond_oom(connection);
@@
-837,30
+860,52
@@
static int request_handler(
void **connection_cls) {
assert(connection);
void **connection_cls) {
assert(connection);
+ assert(connection_cls);
assert(url);
assert(method);
if (!streq(method, "GET"))
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"))
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/"))
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"))
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");
}
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;
static char *key_pem = NULL;
static char *cert_pem = NULL;
@@
-874,17
+919,23
@@
static int parse_argv(int argc, char *argv[]) {
int r, c;
static const struct option options[] = {
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 },
{ "version", no_argument, NULL, ARG_VERSION },
{ "key", required_argument, NULL, ARG_KEY },
{ "cert", required_argument, NULL, ARG_CERT },
- {
NULL, 0, NULL, 0
}
+ {}
};
assert(argc >= 0);
assert(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) {
switch(c) {
+
+ case 'h':
+ return help();
+
case ARG_VERSION:
puts(PACKAGE_STRING);
puts(SYSTEMD_FEATURES);
case ARG_VERSION:
puts(PACKAGE_STRING);
puts(SYSTEMD_FEATURES);
@@
-920,8
+971,7
@@
static int parse_argv(int argc, char *argv[]) {
return -EINVAL;
default:
return -EINVAL;
default:
- log_error("Unknown option code %c", c);
- return -EINVAL;
+ assert_not_reached("Unhandled option");
}
if (optind < argc) {
}
if (optind < argc) {
@@
-962,11
+1012,13
@@
int main(int argc, char *argv[]) {
struct MHD_OptionItem opts[] = {
{ MHD_OPTION_NOTIFY_COMPLETED,
(intptr_t) request_meta_free, NULL },
struct MHD_OptionItem opts[] = {
{ MHD_OPTION_NOTIFY_COMPLETED,
(intptr_t) request_meta_free, NULL },
+ { MHD_OPTION_EXTERNAL_LOGGER,
+ (intptr_t) microhttpd_logger, NULL },
{ MHD_OPTION_END, 0, NULL },
{ MHD_OPTION_END, 0, NULL },
{ MHD_OPTION_END, 0, NULL },
{ MHD_OPTION_END, 0, NULL }};
{ MHD_OPTION_END, 0, NULL },
{ MHD_OPTION_END, 0, NULL },
{ MHD_OPTION_END, 0, NULL },
{ MHD_OPTION_END, 0, NULL }};
- int opts_pos =
1
;
+ int opts_pos =
2
;
int flags = MHD_USE_THREAD_PER_CONNECTION|MHD_USE_POLL|MHD_USE_DEBUG;
if (n > 0)
int flags = MHD_USE_THREAD_PER_CONNECTION|MHD_USE_POLL|MHD_USE_DEBUG;
if (n > 0)