From ebc45e6c571fcd68aca4241293718646031704a6 Mon Sep 17 00:00:00 2001 From: Vsevolod Stakhov Date: Mon, 18 Jul 2016 14:54:40 +0100 Subject: [PATCH] [CritFix] Fix systemd sockets activation --- src/rspamd.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/src/rspamd.c b/src/rspamd.c index c4aba793d..9bea4b5c0 100644 --- a/src/rspamd.c +++ b/src/rspamd.c @@ -388,6 +388,14 @@ systemd_get_socket (struct rspamd_main *rspamd_main, gint number) struct stat st; /* XXX: can we trust the current choice ? */ static const int sd_listen_fds_start = 3; + struct rspamd_worker_listen_socket *ls; + + union { + struct sockaddr_storage ss; + struct sockaddr sa; + } addr_storage; + socklen_t slen = sizeof (addr_storage); + gint stype; e = getenv ("LISTEN_FDS"); if (e != NULL) { @@ -412,7 +420,34 @@ systemd_get_socket (struct rspamd_main *rspamd_main, gint number) rspamd_socket_nonblocking (sock); - result = g_list_prepend (result, GINT_TO_POINTER (sock)); + if (getsockname (sock, &addr_storage.sa, &slen) == -1) { + msg_warn_main ("cannot get name for systemd descriptor %d: %s", + sock, strerror (errno)); + errno = EINVAL; + return NULL; + } + + ls = g_slice_alloc0 (sizeof (*ls)); + ls->addr = rspamd_inet_address_from_sa (&addr_storage.sa, slen); + ls->fd = sock; + + slen = sizeof (stype); + if (getsockopt (sock, SOL_SOCKET, SO_TYPE, &stype, &slen) != -1) { + if (stype == SOCK_STREAM) { + ls->type = RSPAMD_WORKER_SOCKET_TCP; + } + else { + ls->type = RSPAMD_WORKER_SOCKET_UDP; + } + } + else { + msg_warn_main ("cannot get type for systemd descriptor %d: %s", + sock, strerror (errno)); + ls->type = RSPAMD_WORKER_SOCKET_TCP; + } + + + result = g_list_prepend (result, ls); } else if (num_passed <= number) { msg_err_main ("systemd LISTEN_FDS does not contain the expected fd: %d", -- 2.39.5