]> source.dussan.org Git - rspamd.git/commitdiff
[CritFix] Fix systemd sockets activation
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 18 Jul 2016 13:54:40 +0000 (14:54 +0100)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 18 Jul 2016 13:54:40 +0000 (14:54 +0100)
src/rspamd.c

index c4aba793db784fb846535641c25e3eee5b4e7106..9bea4b5c039db967c2725f9df8beb32881e42e8f 100644 (file)
@@ -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",