diff --git a/acinclude.m4 b/acinclude.m4 index 05abe18..97484c9 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -631,7 +631,6 @@ case $host in if test "${ac_cv_header_systemd_sd_daemon_h}" = "no" || test -z "${SYSTEMD_LIBS}"; then AC_MSG_WARN([Your system does not support systemd.]) else - APR_ADDTO(HTTPD_LIBS, [$SYSTEMD_LIBS]) AC_DEFINE(HAVE_SYSTEMD, 1, [Define if systemd is supported]) fi fi diff --git a/modules/arch/unix/mod_systemd.c b/modules/arch/unix/mod_systemd.c index eda1272..fc059fc 100644 --- a/modules/arch/unix/mod_systemd.c +++ b/modules/arch/unix/mod_systemd.c @@ -35,6 +35,15 @@ #include #endif +APR_DECLARE_OPTIONAL_FN(int, + ap_find_systemd_socket, (process_rec *, apr_port_t)); + +APR_DECLARE_OPTIONAL_FN(int, + ap_systemd_listen_fds, (int)); + +APR_DECLARE_OPTIONAL_FN(int, + ap_systemd_journal_stream_fd, (const char *, int, int)); + static char describe_listeners[30]; static int systemd_pre_config(apr_pool_t *pconf, apr_pool_t *plog, @@ -145,8 +154,47 @@ static int systemd_monitor(apr_pool_t *p, server_rec *s) return DECLINED; } +static int ap_find_systemd_socket(process_rec * process, apr_port_t port) { + int fdcount, fd; + int sdc = sd_listen_fds(0); + + if (sdc < 0) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, sdc, process->pool, APLOGNO(02486) + "find_systemd_socket: Error parsing enviroment, sd_listen_fds returned %d", + sdc); + return -1; + } + + if (sdc == 0) { + ap_log_perror(APLOG_MARK, APLOG_CRIT, sdc, process->pool, APLOGNO(02487) + "find_systemd_socket: At least one socket must be set."); + return -1; + } + + fdcount = atoi(getenv("LISTEN_FDS")); + for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + fdcount; fd++) { + if (sd_is_socket_inet(fd, 0, 0, -1, port) > 0) { + return fd; + } + } + + return -1; +} + +static int ap_systemd_listen_fds(int unset_environment){ + return sd_listen_fds(unset_environment); +} + +static int ap_systemd_journal_stream_fd(const char *identifier, int priority, int level_prefix){ + return sd_journal_stream_fd("httpd", priority, 0); +} + static void systemd_register_hooks(apr_pool_t *p) { + APR_REGISTER_OPTIONAL_FN(ap_systemd_listen_fds); + APR_REGISTER_OPTIONAL_FN(ap_find_systemd_socket); + APR_REGISTER_OPTIONAL_FN(ap_systemd_journal_stream_fd); + /* Enable ap_extended_status. */ ap_hook_pre_config(systemd_pre_config, NULL, NULL, APR_HOOK_LAST); /* Signal service is ready. */ diff --git a/modules/loggers/config.m4 b/modules/loggers/config.m4 index 0848d2e..8af2299 100644 --- a/modules/loggers/config.m4 +++ b/modules/loggers/config.m4 @@ -5,7 +5,6 @@ dnl APACHE_MODULE(name, helptext[, objects[, structname[, default[, config]]]]) APACHE_MODPATH_INIT(loggers) APACHE_MODULE(log_config, logging configuration. You won't be able to log requests to the server without this module., , , yes) -APR_ADDTO(MOD_LOG_CONFIG_LDADD, [$SYSTEMD_LIBS]) APACHE_MODULE(log_debug, configurable debug logging, , , most) APACHE_MODULE(log_forensic, forensic logging) diff --git a/modules/loggers/mod_log_config.c b/modules/loggers/mod_log_config.c index 0b11f60..04f08ca 100644 --- a/modules/loggers/mod_log_config.c +++ b/modules/loggers/mod_log_config.c @@ -172,14 +172,16 @@ #include #endif -#ifdef HAVE_SYSTEMD -#include -#endif - #define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b" module AP_MODULE_DECLARE_DATA log_config_module; +#ifdef HAVE_SYSTEMD +APR_DECLARE_OPTIONAL_FN(int, + ap_systemd_journal_stream_fd, (const char *, int, int)); + +#endif + static int xfer_flags = (APR_WRITE | APR_APPEND | APR_CREATE | APR_LARGEFILE); static apr_fileperms_t xfer_perms = APR_OS_DEFAULT; @@ -1640,8 +1642,15 @@ static apr_status_t wrap_journal_stream(apr_pool_t *p, apr_file_t **outfd, { #ifdef HAVE_SYSTEMD int fd; + APR_OPTIONAL_FN_TYPE(ap_systemd_journal_stream_fd) *systemd_journal_stream_fd; + + systemd_journal_stream_fd = APR_RETRIEVE_OPTIONAL_FN(ap_systemd_journal_stream_fd); + if (systemd_journal_stream_fd == NULL) { + return APR_ENOTIMPL; + } - fd = sd_journal_stream_fd("httpd", priority, 0); + fd = systemd_journal_stream_fd("httpd", priority, 0); + if (fd < 0) return fd; /* This is an AF_UNIX socket fd so is more pipe-like than diff --git a/server/listen.c b/server/listen.c index e2e028a..217caf2 100644 --- a/server/listen.c +++ b/server/listen.c @@ -34,10 +34,6 @@ #include #endif -#ifdef HAVE_SYSTEMD -#include -#endif - /* we know core's module_index is 0 */ #undef APLOG_MODULE_INDEX #define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX @@ -65,6 +61,12 @@ static int send_buffer_size; static int receive_buffer_size; #ifdef HAVE_SYSTEMD static int use_systemd = -1; + +APR_DECLARE_OPTIONAL_FN(int, + ap_find_systemd_socket, (process_rec *, apr_port_t)); + +APR_DECLARE_OPTIONAL_FN(int, + ap_systemd_listen_fds, (int)); #endif /* TODO: make_sock is just begging and screaming for APR abstraction */ @@ -325,34 +327,6 @@ static int find_listeners(ap_listen_rec **from, ap_listen_rec **to, } #ifdef HAVE_SYSTEMD - -static int find_systemd_socket(process_rec * process, apr_port_t port) { - int fdcount, fd; - int sdc = sd_listen_fds(0); - - if (sdc < 0) { - ap_log_perror(APLOG_MARK, APLOG_CRIT, sdc, process->pool, APLOGNO(02486) - "find_systemd_socket: Error parsing enviroment, sd_listen_fds returned %d", - sdc); - return -1; - } - - if (sdc == 0) { - ap_log_perror(APLOG_MARK, APLOG_CRIT, sdc, process->pool, APLOGNO(02487) - "find_systemd_socket: At least one socket must be set."); - return -1; - } - - fdcount = atoi(getenv("LISTEN_FDS")); - for (fd = SD_LISTEN_FDS_START; fd < SD_LISTEN_FDS_START + fdcount; fd++) { - if (sd_is_socket_inet(fd, 0, 0, -1, port) > 0) { - return fd; - } - } - - return -1; -} - static apr_status_t alloc_systemd_listener(process_rec * process, int fd, const char *proto, ap_listen_rec **out_rec) @@ -412,6 +386,14 @@ static const char *set_systemd_listener(process_rec *process, apr_port_t port, { ap_listen_rec *last, *new; apr_status_t rv; + APR_OPTIONAL_FN_TYPE(ap_find_systemd_socket) *find_systemd_socket; + + find_systemd_socket = APR_RETRIEVE_OPTIONAL_FN(ap_find_systemd_socket); + + if (!find_systemd_socket) + return "Systemd socket activation is used, but mod_systemd is probably" + "not loaded"; + int fd = find_systemd_socket(process, port); if (fd < 0) { return "Systemd socket activation is used, but this port is not " @@ -438,7 +420,6 @@ static const char *set_systemd_listener(process_rec *process, apr_port_t port, return NULL; } - #endif /* HAVE_SYSTEMD */ static const char *alloc_listener(process_rec *process, const char *addr, @@ -707,6 +688,9 @@ AP_DECLARE(int) ap_setup_listeners(server_rec *s) int num_listeners = 0; const char* proto; int found; +#ifdef HAVE_SYSTEMD + APR_OPTIONAL_FN_TYPE(ap_systemd_listen_fds) *systemd_listen_fds; +#endif for (ls = s; ls; ls = ls->next) { proto = ap_get_server_protocol(ls); @@ -746,7 +730,10 @@ AP_DECLARE(int) ap_setup_listeners(server_rec *s) apr_pool_cleanup_null, s->process->pool); } else { - sd_listen_fds(1); + systemd_listen_fds = APR_RETRIEVE_OPTIONAL_FN(ap_systemd_listen_fds); + if (systemd_listen_fds != NULL) { + systemd_listen_fds(1); + } } } else @@ -963,6 +950,9 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy, apr_port_t port; apr_status_t rv; const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY); +#ifdef HAVE_SYSTEMD + APR_OPTIONAL_FN_TYPE(ap_systemd_listen_fds) *systemd_listen_fds; +#endif if (err != NULL) { return err; @@ -973,7 +963,10 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy, } #ifdef HAVE_SYSTEMD if (use_systemd == -1) { - use_systemd = sd_listen_fds(0) > 0; + systemd_listen_fds = APR_RETRIEVE_OPTIONAL_FN(ap_systemd_listen_fds); + if (systemd_listen_fds != NULL) { + use_systemd = systemd_listen_fds(0) > 0; + } } #endif