Browse Source

[Feature] Allow to attach fd when broadcasting to workers

tags/1.2.3
Vsevolod Stakhov 8 years ago
parent
commit
8857738c6c
1 changed files with 30 additions and 4 deletions
  1. 30
    4
      src/libserver/rspamd_control.c

+ 30
- 4
src/libserver/rspamd_control.c View File

@@ -374,20 +374,46 @@ rspamd_control_error_handler (struct rspamd_http_connection *conn, GError *err)
static struct rspamd_control_reply_elt *
rspamd_control_broadcast_cmd (struct rspamd_main *rspamd_main,
struct rspamd_control_command *cmd,
gint attached_fd,
void (*handler) (int, short, void *), gpointer ud)
{
GHashTableIter it;
struct rspamd_worker *wrk;
struct rspamd_control_reply_elt *rep_elt, *res = NULL;
gpointer k, v;
struct msghdr msg;
struct cmsghdr *cmsg;
struct iovec iov;
guchar fdspace[CMSG_SPACE(sizeof (int))];
gssize r;

g_hash_table_iter_init (&it, rspamd_main->workers);

while (g_hash_table_iter_next (&it, &k, &v)) {
wrk = v;

if (write (wrk->control_pipe[0], cmd,
sizeof (*cmd)) == sizeof (*cmd)) {
memset (&msg, 0, sizeof (msg));

/* Attach fd to the message */
if (attached_fd != -1) {
memset (fdspace, 0, sizeof (fdspace));
msg.msg_control = fdspace;
msg.msg_controllen = sizeof (fdspace);
cmsg = CMSG_FIRSTHDR (&msg);
cmsg->cmsg_level = SOL_SOCKET;
cmsg->cmsg_type = SCM_RIGHTS;
cmsg->cmsg_len = CMSG_LEN (sizeof (int));
memcpy (CMSG_DATA (cmsg), &attached_fd, sizeof (int));
}

iov.iov_base = cmd;
iov.iov_len = sizeof (*cmd);
msg.msg_iov = &iov;
msg.msg_iovlen = 1;

r = sendmsg (wrk->control_pipe[0], &msg, 0);

if (r == sizeof (*cmd)) {

rep_elt = g_slice_alloc0 (sizeof (*rep_elt));
rep_elt->wrk = wrk;
@@ -447,7 +473,7 @@ rspamd_control_finish_handler (struct rspamd_http_connection *conn,
else {
/* Send command to all workers */
session->replies = rspamd_control_broadcast_cmd (
session->rspamd_main, &session->cmd,
session->rspamd_main, &session->cmd, -1,
rspamd_control_wrk_io, session);

DL_FOREACH (session->replies, cur) {
@@ -756,7 +782,7 @@ rspamd_srv_handler (gint fd, short what, gpointer ud)
*/
wcmd.cmd.hs_loaded.cache_dir = cmd.cmd.hs_loaded.cache_dir;
wcmd.cmd.hs_loaded.forced = cmd.cmd.hs_loaded.forced;
rspamd_control_broadcast_cmd (srv, &wcmd,
rspamd_control_broadcast_cmd (srv, &wcmd, -1,
rspamd_control_hs_io_handler, NULL);
break;
default:

Loading…
Cancel
Save