X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=src%2Fjournal-remote%2Fjournal-remote.c;h=d2050eff9f984cc9edbea11ce09d5663c42aecbe;hp=d78607c541e13881a87b0fe77791d2da36375337;hb=0a1beeb64207eaa88ab9236787b1cbc2f704ae14;hpb=1af719edc5958c01c19204fb68d6fc45c9eea85c diff --git a/src/journal-remote/journal-remote.c b/src/journal-remote/journal-remote.c index d78607c54..d2050eff9 100644 --- a/src/journal-remote/journal-remote.c +++ b/src/journal-remote/journal-remote.c @@ -149,15 +149,15 @@ static int spawn_getter(const char *getter, const char *url) { _cleanup_strv_free_ char **words = NULL; assert(getter); - r = strv_split_quoted(&words, getter); + r = strv_split_quoted(&words, getter, false); if (r < 0) { - log_error("Failed to split getter option: %s", strerror(-r)); + log_error_errno(-r, "Failed to split getter option: %m"); return r; } r = strv_extend(&words, url); if (r < 0) { - log_error("Failed to create command line: %s", strerror(-r)); + log_error_errno(-r, "Failed to create command line: %m"); return r; } @@ -398,9 +398,9 @@ static int add_source(RemoteServer *s, int fd, char* name, bool own_name) { goto error; } - r = sd_event_source_set_name(source->event, name); + r = sd_event_source_set_description(source->event, name); if (r < 0) { - log_error("Failed to set source name for fd:%d: %s", fd, strerror(-r)); + log_error_errno(-r, "Failed to set source name for fd:%d: %m", fd); goto error; } @@ -426,7 +426,7 @@ static int add_raw_socket(RemoteServer *s, int fd) { snprintf(name, sizeof(name), "raw-socket-%d", fd); - r = sd_event_source_set_name(s->listen_event, name); + r = sd_event_source_set_description(s->listen_event, name); if (r < 0) return r; @@ -449,33 +449,32 @@ static int setup_raw_socket(RemoteServer *s, const char *address) { ********************************************************************** **********************************************************************/ -static RemoteSource *request_meta(void **connection_cls, int fd, char *hostname) { +static int request_meta(void **connection_cls, int fd, char *hostname) { RemoteSource *source; Writer *writer; int r; assert(connection_cls); if (*connection_cls) - return *connection_cls; + return 0; r = get_writer(server, hostname, &writer); if (r < 0) { log_warning("Failed to get writer for source %s: %s", hostname, strerror(-r)); - return NULL; + return r; } source = source_new(fd, true, hostname, writer); if (!source) { - log_oom(); writer_unref(writer); - return NULL; + return log_oom(); } log_debug("Added RemoteSource as connection metadata %p", source); *connection_cls = source; - return source; + return 0; } static void request_meta_free(void *cls, @@ -487,9 +486,11 @@ static void request_meta_free(void *cls, assert(connection_cls); s = *connection_cls; - log_debug("Cleaning up connection metadata %p", s); - source_free(s); - *connection_cls = NULL; + if (s) { + log_debug("Cleaning up connection metadata %p", s); + source_free(s); + *connection_cls = NULL; + } } static int process_http_upload( @@ -504,11 +505,11 @@ static int process_http_upload( assert(source); - log_debug("request_handler_upload: connection %p, %zu bytes", - connection, *upload_data_size); + log_trace("%s: connection %p, %zu bytes", + __func__, connection, *upload_data_size); if (*upload_data_size) { - log_debug("Received %zu bytes", *upload_data_size); + log_trace("Received %zu bytes", *upload_data_size); r = push_data(source, upload_data, *upload_data_size); if (r < 0) @@ -571,7 +572,7 @@ static int request_handler( assert(url); assert(method); - log_debug("Handling a connection %s %s %s", method, url, version); + log_trace("Handling a connection %s %s %s", method, url, version); if (*connection_cls) return process_http_upload(connection, @@ -622,8 +623,13 @@ static int request_handler( assert(hostname); - if (!request_meta(connection_cls, fd, hostname)) + r = request_meta(connection_cls, fd, hostname); + if (r == -ENOMEM) return respond_oom(connection); + else if (r < 0) + return mhd_respond(connection, MHD_HTTP_INTERNAL_SERVER_ERROR, + strerror(-r)); + hostname = NULL; return MHD_YES; } @@ -656,7 +662,7 @@ static int setup_microhttpd_server(RemoteServer *s, r = fd_nonblock(fd, true); if (r < 0) { - log_error("Failed to make fd:%d nonblocking: %s", fd, strerror(-r)); + log_error_errno(-r, "Failed to make fd:%d nonblocking: %m", fd); return r; } @@ -714,13 +720,13 @@ static int setup_microhttpd_server(RemoteServer *s, epoll_fd, EPOLLIN, dispatch_http_event, d); if (r < 0) { - log_error("Failed to add event callback: %s", strerror(-r)); + log_error_errno(-r, "Failed to add event callback: %m"); goto error; } - r = sd_event_source_set_name(d->event, "epoll-fd"); + r = sd_event_source_set_description(d->event, "epoll-fd"); if (r < 0) { - log_error("Failed to set source name: %s", strerror(-r)); + log_error_errno(-r, "Failed to set source name: %m"); goto error; } @@ -732,7 +738,7 @@ static int setup_microhttpd_server(RemoteServer *s, r = hashmap_put(s->daemons, &d->fd, d); if (r < 0) { - log_error("Failed to add daemon to hashmap: %s", strerror(-r)); + log_error_errno(-r, "Failed to add daemon to hashmap: %m"); goto error; } @@ -797,18 +803,10 @@ static int setup_signals(RemoteServer *s) { if (r < 0) return r; - r = sd_event_source_set_name(s->sigterm_event, "sigterm"); - if (r < 0) - return r; - r = sd_event_add_signal(s->events, &s->sigint_event, SIGINT, NULL, s); if (r < 0) return r; - r = sd_event_source_set_name(s->sigint_event, "sigint"); - if (r < 0) - return r; - return 0; } @@ -843,7 +841,7 @@ static int remoteserver_init(RemoteServer *s, r = sd_event_default(&s->events); if (r < 0) { - log_error("Failed to allocate event loop: %s", strerror(-r)); + log_error_errno(-r, "Failed to allocate event loop: %m"); return r; } @@ -884,7 +882,7 @@ static int remoteserver_init(RemoteServer *s, r = getnameinfo_pretty(fd, &hostname); if (r < 0) { - log_error("Failed to retrieve remote name: %s", strerror(-r)); + log_error_errno(-r, "Failed to retrieve remote name: %m"); return r; } @@ -1053,7 +1051,7 @@ static int dispatch_raw_source_event(sd_event_source *event, } else if (r == -EAGAIN) { return 0; } else if (r < 0) { - log_info("Closing connection: %s", strerror(-r)); + log_info_errno(-r, "Closing connection: %m"); remove_source(server, fd); return 0; } else @@ -1086,7 +1084,7 @@ static int accept_connection(const char* type, int fd, r = socket_address_print(addr, &a); if (r < 0) { - log_error("socket_address_print(): %s", strerror(-r)); + log_error_errno(-r, "socket_address_print(): %m"); close(fd2); return r; } @@ -1166,24 +1164,25 @@ static int parse_config(void) { static void help(void) { printf("%s [OPTIONS...] {FILE|-}...\n\n" "Write external journal events to journal file(s).\n\n" - " -h --help Show this help\n" - " --version Show package version\n" - " --url=URL Read events from systemd-journal-gatewayd at URL\n" - " --getter=COMMAND Read events from the output of COMMAND\n" - " --listen-raw=ADDR Listen for connections at ADDR\n" - " --listen-http=ADDR Listen for HTTP connections at ADDR\n" - " --listen-https=ADDR Listen for HTTPS connections at ADDR\n" - " -o --output=FILE|DIR Write output to FILE or DIR/external-*.journal\n" - " --compress[=BOOL] Use XZ-compression in the output journal (default: yes)\n" - " --seal[=BOOL] Use Event sealing in the output journal (default: no)\n" - " --key=FILENAME Specify key in PEM format (default:\n" - " \"" PRIV_KEY_FILE "\")\n" - " --cert=FILENAME Specify certificate in PEM format (default:\n" - " \"" CERT_FILE "\")\n" - " --trust=FILENAME|all Specify CA certificate or disable checking (default:\n" - " \"" TRUST_FILE "\")\n" + " -h --help Show this help\n" + " --version Show package version\n" + " --url=URL Read events from systemd-journal-gatewayd at URL\n" + " --getter=COMMAND Read events from the output of COMMAND\n" + " --listen-raw=ADDR Listen for connections at ADDR\n" + " --listen-http=ADDR Listen for HTTP connections at ADDR\n" + " --listen-https=ADDR Listen for HTTPS connections at ADDR\n" + " -o --output=FILE|DIR Write output to FILE or DIR/external-*.journal\n" + " --compress[=BOOL] XZ-compress the output journal (default: yes)\n" + " --seal[=BOOL] Use event sealing (default: no)\n" + " --key=FILENAME SSL key in PEM format (default:\n" + " \"" PRIV_KEY_FILE "\")\n" + " --cert=FILENAME SSL certificate in PEM format (default:\n" + " \"" CERT_FILE "\")\n" + " --trust=FILENAME|all SSL CA certificate or disable checking (default:\n" + " \"" TRUST_FILE "\")\n" " --gnutls-log=CATEGORY...\n" - " Specify a list of gnutls logging categories\n" + " Specify a list of gnutls logging categories\n" + " --split-mode=none|host How many output files to create\n" "\n" "Note: file descriptors from sd_listen_fds() will be consumed, too.\n" , program_invocation_short_name); @@ -1541,7 +1540,11 @@ int main(int argc, char **argv) { if (remoteserver_init(&s, key, cert, trust) < 0) return EXIT_FAILURE; - sd_event_set_watchdog(s.events, true); + r = sd_event_set_watchdog(s.events, true); + if (r < 0) + log_error_errno(-r, "Failed to enable watchdog: %m"); + else + log_debug("Watchdog is %s.", r > 0 ? "enabled" : "disabled"); log_debug("%s running as pid "PID_FMT, program_invocation_short_name, getpid()); @@ -1558,7 +1561,7 @@ int main(int argc, char **argv) { r = sd_event_run(s.events, -1); if (r < 0) { - log_error("Failed to run event loop: %s", strerror(-r)); + log_error_errno(-r, "Failed to run event loop: %m"); break; } }