Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Remove libsystemd dependency from main httpd binary #312

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion acinclude.m4
Original file line number Diff line number Diff line change
Expand Up @@ -831,7 +831,6 @@ case $host in
if test "${ac_cv_header_systemd_sd_daemon_h}" = "no"; 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
Expand Down
10 changes: 10 additions & 0 deletions include/ap_listen.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#include "apr_network_io.h"
#include "httpd.h"
#include "http_config.h"
#include "apr_optional.h"

#ifdef __cplusplus
extern "C" {
Expand Down Expand Up @@ -161,6 +162,15 @@ AP_DECLARE_NONSTD(const char *) ap_set_accept_errors_nonfatal(cmd_parms *cmd,
void *dummy,
int flag);

#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)"), \
Expand Down
40 changes: 40 additions & 0 deletions modules/arch/unix/mod_systemd.c
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
#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));

static int systemd_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
apr_pool_t *ptemp)
{
Expand Down Expand Up @@ -96,8 +102,42 @@ 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 void systemd_register_hooks(apr_pool_t *p)
{
APR_REGISTER_OPTIONAL_FN(ap_systemd_listen_fds);
APR_REGISTER_OPTIONAL_FN(ap_find_systemd_socket);

/* Enable ap_extended_status. */
ap_hook_pre_config(systemd_pre_config, NULL, NULL, APR_HOOK_LAST);
/* Signal service is ready. */
Expand Down
62 changes: 26 additions & 36 deletions server/listen.c
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,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
Expand Down Expand Up @@ -309,34 +305,6 @@ static apr_status_t close_listeners_on_exec(void *v)

#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 environment, 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)
Expand Down Expand Up @@ -395,7 +363,16 @@ static const char *set_systemd_listener(process_rec *process, apr_port_t port,
{
ap_listen_rec *last, *new;
apr_status_t rv;
int fd = find_systemd_socket(process, port);
APR_OPTIONAL_FN_TYPE(ap_find_systemd_socket) *find_systemd_socket;
int fd;

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";

fd = find_systemd_socket(process, port);
if (fd < 0) {
return "Systemd socket activation is used, but this port is not "
"configured in systemd";
Expand All @@ -420,7 +397,6 @@ static const char *set_systemd_listener(process_rec *process, apr_port_t port,

return NULL;
}

#endif /* HAVE_SYSTEMD */

/* Returns non-zero if socket address SA matches hostname, port and
Expand Down Expand Up @@ -761,6 +737,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);
Expand Down Expand Up @@ -800,7 +779,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
Expand Down Expand Up @@ -1070,6 +1052,9 @@ AP_DECLARE_NONSTD(const char *) ap_set_listener(cmd_parms *cmd, void *dummy,
apr_status_t rv;
const char *err = ap_check_cmd_context(cmd, GLOBAL_ONLY);
apr_uint32_t flags = 0;
#ifdef HAVE_SYSTEMD
APR_OPTIONAL_FN_TYPE(ap_systemd_listen_fds) *systemd_listen_fds;
#endif

if (err != NULL) {
return err;
Expand All @@ -1080,7 +1065,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

Expand Down