aboutsummaryrefslogtreecommitdiffstats
path: root/src/libserver/rspamd_control.c
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-04 13:42:36 +0100
committerVsevolod Stakhov <vsevolod@highsecure.ru>2016-04-04 13:42:36 +0100
commit4bd75d888a4110b3cfa89c8fb33610e6ad95d899 (patch)
tree1faa6e6033ac5bf9faf9a2cb46e6288861b60e93 /src/libserver/rspamd_control.c
parentb0ff4a4833a848c5e7a56b8bc12834fb7059926e (diff)
downloadrspamd-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.c30
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 {