You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
286 lines
9.5 KiB
286 lines
9.5 KiB
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/include/ap_listen.h b/include/ap_listen.h |
|
index 58c2574..d5ed968 100644 |
|
--- a/include/ap_listen.h |
|
+++ b/include/ap_listen.h |
|
@@ -29,6 +29,7 @@ |
|
#include "apr_network_io.h" |
|
#include "httpd.h" |
|
#include "http_config.h" |
|
+#include "apr_optional.h" |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
@@ -143,6 +144,15 @@ AP_DECLARE_NONSTD(const char *) ap_set_receive_buffer_size(cmd_parms *cmd, |
|
void *dummy, |
|
const char *arg); |
|
|
|
+#ifdef HAVE_SYSTEMD |
|
+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 |
|
+ |
|
+ |
|
#define LISTEN_COMMANDS \ |
|
AP_INIT_TAKE1("ListenBacklog", ap_set_listenbacklog, NULL, RSRC_CONF, \ |
|
"Maximum length of the queue of pending connections, as used by listen(2)"), \ |
|
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 <unistd.h> |
|
#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..c3f0a51 100644 |
|
--- a/modules/loggers/mod_log_config.c |
|
+++ b/modules/loggers/mod_log_config.c |
|
@@ -172,10 +172,6 @@ |
|
#include <limits.h> |
|
#endif |
|
|
|
-#ifdef HAVE_SYSTEMD |
|
-#include <systemd/sd-journal.h> |
|
-#endif |
|
- |
|
#define DEFAULT_LOG_FORMAT "%h %l %u %t \"%r\" %>s %b" |
|
|
|
module AP_MODULE_DECLARE_DATA log_config_module; |
|
@@ -1640,8 +1636,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/modules/loggers/mod_log_config.h b/modules/loggers/mod_log_config.h |
|
index 877a593..bd52a98 100644 |
|
--- a/modules/loggers/mod_log_config.h |
|
+++ b/modules/loggers/mod_log_config.h |
|
@@ -69,6 +69,10 @@ APR_DECLARE_OPTIONAL_FN(ap_log_writer_init*, ap_log_set_writer_init,(ap_log_writ |
|
*/ |
|
APR_DECLARE_OPTIONAL_FN(ap_log_writer*, ap_log_set_writer, (ap_log_writer* func)); |
|
|
|
+#ifdef HAVE_SYSTEMD |
|
+APR_DECLARE_OPTIONAL_FN(int, ap_systemd_journal_stream_fd, (const char *, int, int)); |
|
+#endif |
|
+ |
|
#endif /* MOD_LOG_CONFIG */ |
|
/** @} */ |
|
|
|
diff --git a/server/listen.c b/server/listen.c |
|
index e2e028a..5d1c0e1 100644 |
|
--- a/server/listen.c |
|
+++ b/server/listen.c |
|
@@ -34,10 +34,6 @@ |
|
#include <unistd.h> |
|
#endif |
|
|
|
-#ifdef HAVE_SYSTEMD |
|
-#include <systemd/sd-daemon.h> |
|
-#endif |
|
- |
|
/* we know core's module_index is 0 */ |
|
#undef APLOG_MODULE_INDEX |
|
#define APLOG_MODULE_INDEX AP_CORE_MODULE_INDEX |
|
@@ -325,34 +321,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 +380,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 +414,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 +682,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 +724,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 +944,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 +957,12 @@ 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; |
|
+ } else { |
|
+ use_systemd = 0; |
|
+ } |
|
} |
|
#endif |
|
|
|
|