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=89a680dcb77d98304562ec21add36d4350181a26;hp=5c3c671033991a809733b79b73ee83849905121f;hb=da927ba997d68401563b927f92e6e40e021a8e5c;hpb=42b6bf75e414c4e6ff5b92cda1c76b6b73677cb7 diff --git a/src/journal-remote/journal-remote.c b/src/journal-remote/journal-remote.c index 5c3c67103..89a680dcb 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,6 +398,12 @@ static int add_source(RemoteServer *s, int fd, char* name, bool own_name) { goto error; } + r = sd_event_source_set_description(source->event, name); + if (r < 0) { + log_error_errno(r, "Failed to set source name for fd:%d: %m", fd); + goto error; + } + return 1; /* work to do */ error: @@ -407,15 +413,24 @@ static int add_source(RemoteServer *s, int fd, char* name, bool own_name) { static int add_raw_socket(RemoteServer *s, int fd) { int r; + _cleanup_close_ int fd_ = fd; + char name[strlen("raw-socket-") + DECIMAL_STR_MAX(int)]; + + assert(fd >= 0); r = sd_event_add_io(s->events, &s->listen_event, fd, EPOLLIN, dispatch_raw_connection_event, s); - if (r < 0) { - close(fd); + if (r < 0) return r; - } + snprintf(name, sizeof(name), "raw-socket-%d", fd); + + r = sd_event_source_set_description(s->listen_event, name); + if (r < 0) + return r; + + fd_ = -1; s->active ++; return 0; } @@ -434,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, @@ -472,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( @@ -489,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) @@ -556,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, @@ -607,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; } @@ -641,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; } @@ -699,7 +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_description(d->event, "epoll-fd"); + if (r < 0) { + log_error_errno(r, "Failed to set source name: %m"); goto error; } @@ -711,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; } @@ -762,19 +789,6 @@ static int dispatch_http_event(sd_event_source *event, ********************************************************************** **********************************************************************/ -static int dispatch_sigterm(sd_event_source *event, - const struct signalfd_siginfo *si, - void *userdata) { - RemoteServer *s = userdata; - - assert(s); - - log_received_signal(LOG_INFO, si); - - sd_event_exit(s->events, 0); - return 0; -} - static int setup_signals(RemoteServer *s) { sigset_t mask; int r; @@ -785,11 +799,11 @@ static int setup_signals(RemoteServer *s) { sigset_add_many(&mask, SIGINT, SIGTERM, -1); assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0); - r = sd_event_add_signal(s->events, &s->sigterm_event, SIGTERM, dispatch_sigterm, s); + r = sd_event_add_signal(s->events, &s->sigterm_event, SIGTERM, NULL, s); if (r < 0) return r; - r = sd_event_add_signal(s->events, &s->sigint_event, SIGINT, dispatch_sigterm, s); + r = sd_event_add_signal(s->events, &s->sigint_event, SIGINT, NULL, s); if (r < 0) return r; @@ -827,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; } @@ -868,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; } @@ -1037,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 @@ -1070,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; } @@ -1150,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); @@ -1525,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()); @@ -1542,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; } }