diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-04-04 13:42:36 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2016-04-04 13:42:36 +0100 |
commit | 4bd75d888a4110b3cfa89c8fb33610e6ad95d899 (patch) | |
tree | 1faa6e6033ac5bf9faf9a2cb46e6288861b60e93 /src/libserver/rspamd_control.c | |
parent | b0ff4a4833a848c5e7a56b8bc12834fb7059926e (diff) | |
download | rspamd-4bd75d888a4110b3cfa89c8fb33610e6ad95d899.tar.gz rspamd-4bd75d888a4110b3cfa89c8fb33610e6ad95d899.zip |
[Feature] Allow to attach file descriptors to control commands
Diffstat (limited to 'src/libserver/rspamd_control.c')
-rw-r--r-- | src/libserver/rspamd_control.c | 30 |
1 files changed, 25 insertions, 5 deletions
diff --git a/src/libserver/rspamd_control.c b/src/libserver/rspamd_control.c index 138809a84..84f68de02 100644 --- a/src/libserver/rspamd_control.c +++ b/src/libserver/rspamd_control.c @@ -491,6 +491,7 @@ struct rspamd_worker_control_data { static void rspamd_control_default_cmd_handler (gint fd, + gint attached_fd, struct rspamd_worker_control_data *cd, struct rspamd_control_command *cmd) { @@ -557,10 +558,21 @@ rspamd_control_default_worker_handler (gint fd, short what, gpointer ud) { struct rspamd_worker_control_data *cd = ud; struct rspamd_control_command cmd; - + struct msghdr msg; + struct iovec iov; + guchar fdspace[CMSG_SPACE(sizeof (int))]; + gint rfd = -1; gssize r; - r = read (fd, &cmd, sizeof (cmd)); + iov.iov_base = &cmd; + iov.iov_len = sizeof (cmd); + 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 control socket: %s", @@ -582,12 +594,20 @@ rspamd_control_default_worker_handler (gint fd, short what, gpointer ud) } else if ((gint)cmd.type >= 0 && cmd.type < RSPAMD_CONTROL_MAX) { + if (msg.msg_controllen >= CMSG_SPACE(sizeof (int))) { + rfd = *(int *) CMSG_DATA(CMSG_FIRSTHDR (&msg)); + } + if (cd->handlers[cmd.type].handler) { - cd->handlers[cmd.type].handler (cd->worker->srv, cd->worker, - fd, &cmd, cd->handlers[cmd.type].ud); + cd->handlers[cmd.type].handler (cd->worker->srv, + cd->worker, + fd, + rfd, + &cmd, + cd->handlers[cmd.type].ud); } else { - rspamd_control_default_cmd_handler (fd, cd, &cmd); + rspamd_control_default_cmd_handler (fd, rfd, cd, &cmd); } } else { |