journal-remote.c revision cc64d0175a3c2c974709e9962c00fbe04d74c43f
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen This file is part of systemd.
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen Copyright 2012 Zbigniew Jędrzejewski-Szmek
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen systemd is free software; you can redistribute it and/or modify it
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen under the terms of the GNU Lesser General Public License as published by
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen the Free Software Foundation; either version 2.1 of the License, or
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen (at your option) any later version.
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen systemd is distributed in the hope that it will be useful, but
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen WITHOUT ANY WARRANTY; without even the implied warranty of
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen Lesser General Public License for more details.
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen You should have received a copy of the GNU Lesser General Public License
eac684ef1c29684b1bcd27a89c38c202e568e469Tom Gundersen along with systemd; If not, see <http://www.gnu.org/licenses/>.
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "journal-remote-parse.h"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#include "journal-remote-write.h"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek#define REMOTE_JOURNAL_PATH "/var/log/journal/" SD_ID128_FORMAT_STR "/remote-%s.journal"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic bool arg_stdin = false;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic char* arg_listen_raw = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic char* arg_listen_http = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic char* arg_listen_https = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int arg_seal = false;
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen/**********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************/
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int spawn_child(const char* child, char** argv) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to create pager pipe: %m");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to fork: %m");
a22e1850c36e52cb9d593b99be59b6ba7639d80aLennart Poettering /* In the child */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to dup pipe to stdout: %m");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_warning("Failed to close pipe fds: %m");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* Make sure the child goes away when the parent dies */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (prctl(PR_SET_PDEATHSIG, SIGTERM) < 0)
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen /* Check whether our parent died before we were able
5256e00e8b9015dd1a976d647fc71dc7efbd8cf8Tom Gundersen * to set the death signal */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to exec child %s: %m", child);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_warning("Failed to close write end of pipe: %m");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int spawn_curl(char* url) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int spawn_getter(char *getter, char *url) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char _cleanup_strv_free_ **words = NULL, **words2 = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek words = strv_split_quoted(getter);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = spawn_child(words[0], words);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to spawn getter %s: %m", getter);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int open_output(Writer *s, const char* url) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char _cleanup_free_ *name, *output = NULL;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for(c = name; *c; c++) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (*c == '/' || *c == ':' || *c == ' ')
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek else if (*c == '?') {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_id128_get_machine(&machine);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("failed to determine machine ID128: %s", strerror(-r));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = asprintf(&output, REMOTE_JOURNAL_PATH,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek SD_ID128_FORMAT_VAL(machine), name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "%s/remote-%s.journal", arg_output, name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = journal_file_open_reliably(output,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to open output journal %s: %s",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_info("Opened output file %s", s->journal->path);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/**********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************/
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmektypedef struct MHDDaemonWrapper {
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmek sd_event_source *sigterm_event, *sigint_event, *listen_event;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/* This should go away as soon as µhttpd allows state to be passed around. */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int dispatch_raw_source_event(sd_event_source *event,
d0d6a4cd70477970812bff0a37e70f66208d7c14Tom Gundersenstatic int dispatch_raw_connection_event(sd_event_source *event,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int dispatch_http_event(sd_event_source *event,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int get_source_for_fd(RemoteServer *s, int fd, RemoteSource **source) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!GREEDY_REALLOC0_T(s->sources, s->sources_size, fd + 1))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int remove_source(RemoteServer *s, int fd) {
0d4ad91dd4fc831c31a9775b0eadf97fea6cd7f6Alin Rautastatic int add_source(RemoteServer *s, int fd, const char* name) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = asprintf(&realname, "fd:%d", fd);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_debug("Creating source for fd:%d (%s)", fd, name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = get_source_for_fd(s, fd, &source);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to create source for fd:%d (%s)", fd, name);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_event_add_io(s->events, &source->event,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek fd, EPOLLIN, dispatch_raw_source_event, s);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to register event source for fd:%d: %s",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int setup_raw_socket(RemoteServer *s, const char *address) {
3ba3a79df4ae094d1008c04a9af8d1ff970124c4Zbigniew Jędrzejewski-Szmek fd = make_socket_fd(LOG_INFO, address, SOCK_STREAM | SOCK_CLOEXEC);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_event_add_io(s->events, &s->listen_event, fd, EPOLLIN,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek dispatch_raw_connection_event, s);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek/**********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************/
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic RemoteSource *request_meta(void **connection_cls) {
4046d8361c55c80ab8577aea52523b9e6eab0d0cLennart Poettering log_debug("Added RemoteSource as connection metadata %p", source);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_debug("Cleaning up connection metadata %p", s);
1f0d9695125bf8e66d0e53e37d454755a84899bbLennart Poettering log_debug("request_handler_upload: connection %p, %zu bytes",
1f0d9695125bf8e66d0e53e37d454755a84899bbLennart Poettering log_info("Received %zu bytes", *upload_data_size);
a46e37cb1225a36a33e8728005693e825cdbc01aSusant Sahani r = push_data(source, upload_data, *upload_data_size);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to store received data of size %zu: %s",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek *upload_data_size, strerror(-r));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return respond_oom_internal(connection);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = process_source(source, &server->writer, arg_compress, arg_seal);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_warning("Entry too big, skipped");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek else if (r == -EAGAIN || r == -EWOULDBLOCK)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek else if (r < 0) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_warning("Failed to process data for connection %p", connection);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return respond_error(connection, MHD_HTTP_UNPROCESSABLE_ENTITY,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Processing failed: %s", strerror(-r));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek /* The upload is finished */
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_warning("EOF reached with incomplete data");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return respond_error(connection, MHD_HTTP_EXPECTATION_FAILED,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Trailing data not processed.");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return respond_error(connection, MHD_HTTP_ACCEPTED, "OK.\n");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek struct MHD_Connection *connection,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_debug("Handling a connection %s %s %s", method, url, version);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return process_http_upload(connection,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return respond_error(connection, MHD_HTTP_METHOD_NOT_ACCEPTABLE,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Unsupported method.\n");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return respond_error(connection, MHD_HTTP_NOT_FOUND,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Not found.\n");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek header = MHD_lookup_connection_value(connection,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek MHD_HEADER_KIND, "Content-Type");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!header || !streq(header, "application/vnd.fdo.journal"))
3ba3a79df4ae094d1008c04a9af8d1ff970124c4Zbigniew Jędrzejewski-Szmek return respond_error(connection, MHD_HTTP_UNSUPPORTED_MEDIA_TYPE,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek "Content-Type: application/vnd.fdo.journal"
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek " is required.\n");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = check_permissions(connection, &code);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (!request_meta(connection_cls))
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int setup_microhttpd_server(RemoteServer *s, int fd, bool https) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek struct MHD_OptionItem opts[] = {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek { MHD_OPTION_NOTIFY_COMPLETED, (intptr_t) request_meta_free},
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek { MHD_OPTION_EXTERNAL_LOGGER, (intptr_t) microhttpd_logger},
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek { MHD_OPTION_LISTEN_SOCKET, fd},
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const union MHD_DaemonInfo *info;
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to make fd:%d nonblocking: %s", fd, strerror(-r));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek opts[opts_pos++] = (struct MHD_OptionItem)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek {MHD_OPTION_HTTPS_MEM_KEY, 0, key_pem};
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek opts[opts_pos++] = (struct MHD_OptionItem)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek {MHD_OPTION_HTTPS_MEM_CERT, 0, cert_pem};
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek d->daemon = MHD_start_daemon(flags, 0,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to start µhttp daemon");
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmek log_debug("Started MHD %s daemon on fd:%d (wrapper @ %p)",
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmek https ? "HTTPS" : "HTTP", fd, d);
301f4073fe1c2757e602aef24cee9ccf5f81a3a3Michael Marineau info = MHD_get_daemon_info(d->daemon, MHD_DAEMON_INFO_EPOLL_FD_LINUX_ONLY);
301f4073fe1c2757e602aef24cee9ccf5f81a3a3Michael Marineau log_error("µhttp returned NULL daemon info");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("µhttp epoll fd is invalid");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_event_add_io(s->events, &d->event,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek epoll_fd, EPOLLIN, dispatch_http_event, d);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to add event callback: %s", strerror(-r));
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_ensure_allocated(&s->daemons, uint64_hash_func, uint64_compare_func);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = hashmap_put(s->daemons, &d->fd, d);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to add daemon to hashmap: %s", strerror(-r));
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmekstatic int setup_microhttpd_socket(RemoteServer *s,
e88d8021ba34be32ef5ace32e7243da798b0d1c5Zbigniew Jędrzejewski-Szmek fd = make_socket_fd(LOG_INFO, address, SOCK_STREAM | SOCK_CLOEXEC);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek return setup_microhttpd_server(s, fd, https);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int dispatch_http_event(sd_event_source *event,
3e43b2cd97bd82efe6a09e8b9b2e6b5f33f578a0Jan Janssen // XXX: unregister daemon
3e43b2cd97bd82efe6a09e8b9b2e6b5f33f578a0Jan Janssen/**********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek **********************************************************************/
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int dispatch_sigterm(sd_event_source *event,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek const struct signalfd_siginfo *si,
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_received_signal(LOG_INFO, si);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int setup_signals(RemoteServer *s) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert_se(sigemptyset(&mask) == 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sigset_add_many(&mask, SIGINT, SIGTERM, -1);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert_se(sigprocmask(SIG_SETMASK, &mask, NULL) == 0);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_event_add_signal(s->events, &s->sigterm_event, SIGTERM, dispatch_sigterm, s);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = sd_event_add_signal(s->events, &s->sigint_event, SIGINT, dispatch_sigterm, s);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int remoteserver_init(RemoteServer *s) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Failed to read listening file descriptors from environment: %s",
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_info("Received %d descriptors", n);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + n; fd++) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek if (sd_is_socket(fd, AF_UNSPEC, 0, false)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert_not_reached("not implemented");
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek } else if (sd_is_socket(fd, AF_UNSPEC, 0, true)) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_info("Received a connection socket (fd:%d)", fd);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Unknown socket passed on fd:%d", fd);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek char _cleanup_free_ *url = NULL;
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen char _cleanup_strv_free_ **urlv = strv_new(arg_url, "/entries", NULL);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_info("Spawning getter %s...", url);
f47c5c47d1a7bcfa1842ff7cc52b1f7fc1d86bcfpoma if (r < 0)
f47c5c47d1a7bcfa1842ff7cc52b1f7fc1d86bcfpoma r = setup_microhttpd_socket(s, arg_listen_http, false);
12b42c76672a66c2d4ea7212c14f8f1b5a62b78dTom Gundersen r = setup_microhttpd_socket(s, arg_listen_https, true);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek r = add_source(s, STDIN_FILENO, "stdin");
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen if (s->active == 0) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek log_error("Zarro sources specified");
0a8a0fad010018be0f46d1c2e077ade0eb27c7dbTom Gundersen if (!!n + !!arg_url + !!arg_listen_raw + !!arg_stdin > 1)
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmekstatic int server_destroy(RemoteServer *s) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek while ((d = hashmap_steal_first(s->daemons))) {
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek sd_event_source_unref(d->event);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek assert(s->sources_size == 0 || s->sources);
798d3a524ea57aaf40cb53858aaa45ec702f012dZbigniew Jędrzejewski-Szmek for (i = 0; i < s->sources_size; i++)
int fd,
void *userdata) {
} else if (r == -E2BIG) {
int fd2, r;
if (fd2 < 0) {
return -errno;
case AF_INET:
case AF_INET6: {
type,
return fd2;
return -EINVAL;
int fd,
void *userdata) {
int fd2;
if (fd2 < 0)
return fd2;
static int help(void) {
help();
case ARG_VERSION:
case ARG_URL:
if (arg_url) {
return -EINVAL;
case ARG_GETTER:
if (arg_getter) {
return -EINVAL;
case ARG_LISTEN_RAW:
if (arg_listen_raw) {
return -EINVAL;
case ARG_LISTEN_HTTP:
if (arg_listen_http) {
return -EINVAL;
case ARG_LISTEN_HTTPS:
if (arg_listen_https) {
return -EINVAL;
case ARG_KEY:
if (key_pem) {
return -EINVAL;
case ARG_CERT:
if (cert_pem) {
return -EINVAL;
case ARG_TRUST:
#ifdef HAVE_GNUTLS
if (trust_pem) {
return -EINVAL;
case ARG_STDIN:
arg_stdin = true;
if (arg_output) {
return -EINVAL;
case ARG_COMPRESS:
arg_compress = true;
case ARG_NO_COMPRESS:
arg_compress = false;
case ARG_SEAL:
arg_seal = true;
case ARG_NO_SEAL:
arg_seal = false;
return -EINVAL;
return -EINVAL;
return -EINVAL;
return -EINVAL;
static int setup_gnutls_logger(void) {
#ifdef HAVE_GNUTLS
RemoteServer s = {};
int r, r2;
log_show_color(true);
r = setup_gnutls_logger();
return EXIT_FAILURE;
if (remoteserver_init(&s) < 0)
return EXIT_FAILURE;
sd_notify(false,
while (s.active) {
if (r == SD_EVENT_FINISHED)