]> source.dussan.org Git - rspamd.git/commitdiff
Allow fd attaching to control replies
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 14 Dec 2015 14:21:54 +0000 (14:21 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Mon, 14 Dec 2015 14:21:54 +0000 (14:21 +0000)
src/libserver/rspamd_control.c

index 8b85c745a4d11295cd458143254753f2e9c21004..d1eed7d24a3312e011bcf441aeb642b5406bea4e 100644 (file)
@@ -49,6 +49,7 @@ struct rspamd_control_reply_elt {
        struct event io_ev;
        struct rspamd_worker *wrk;
        gpointer ud;
+       gint attached_fd;
        struct rspamd_control_reply_elt *prev, *next;
 };
 
@@ -244,14 +245,32 @@ rspamd_control_wrk_io (gint fd, short what, gpointer ud)
 {
        struct rspamd_control_reply_elt *elt = ud;
        struct rspamd_control_session *session;
+       guchar fdspace[CMSG_SPACE(sizeof (int))];
+       struct iovec iov;
+       struct msghdr msg;
+       gssize r;
 
        session = elt->ud;
-
-       if (read (elt->wrk->control_pipe[0], &elt->reply, sizeof (elt->reply)) !=
-                               sizeof (elt->reply)) {
+       elt->attached_fd = -1;
+
+       iov.iov_base = &elt->reply;
+       iov.iov_len = sizeof (elt->reply);
+       memset (&msg, 0, sizeof (msg));
+       msg.msg_control = fdspace;
+       msg.msg_controllen = sizeof (fdspace);
+       msg.msg_iov = &iov;
+       msg.msg_iovlen = 1;
+
+       r = recvmsg (fd, &msg, 0);
+       if (r == -1) {
                msg_err ("cannot read request from the worker %P (%s): %s",
                                elt->wrk->pid, g_quark_to_string (elt->wrk->type), strerror (errno));
        }
+       else if (r >= (gssize)sizeof (elt->reply)) {
+               if (msg.msg_controllen >= CMSG_SPACE(sizeof (int))) {
+                       elt->attached_fd = *(int *) CMSG_DATA(CMSG_FIRSTHDR (&msg));
+               }
+       }
 
        session->replies_remain --;
        event_del (&elt->io_ev);