Browse Source

[Feature] Allow to attach file descriptors to control commands

tags/1.2.3
Vsevolod Stakhov 8 years ago
parent
commit
4bd75d888a
5 changed files with 42 additions and 6 deletions
  1. 3
    0
      src/fuzzy_storage.c
  2. 1
    0
      src/hs_helper.c
  3. 25
    5
      src/libserver/rspamd_control.c
  4. 6
    1
      src/libserver/rspamd_control.h
  5. 7
    0
      src/worker.c

+ 3
- 0
src/fuzzy_storage.c View File

@@ -813,6 +813,7 @@ sync_callback (gint fd, short what, void *arg)
static gboolean
rspamd_fuzzy_storage_sync (struct rspamd_main *rspamd_main,
struct rspamd_worker *worker, gint fd,
gint attached_fd,
struct rspamd_control_command *cmd,
gpointer ud)
{
@@ -852,6 +853,7 @@ rspamd_fuzzy_storage_sync (struct rspamd_main *rspamd_main,
static gboolean
rspamd_fuzzy_storage_reload (struct rspamd_main *rspamd_main,
struct rspamd_worker *worker, gint fd,
gint attached_fd,
struct rspamd_control_command *cmd,
gpointer ud)
{
@@ -1037,6 +1039,7 @@ rspamd_fuzzy_stat_to_ucl (struct rspamd_fuzzy_storage_ctx *ctx, gboolean ip_stat
static gboolean
rspamd_fuzzy_storage_stat (struct rspamd_main *rspamd_main,
struct rspamd_worker *worker, gint fd,
gint attached_fd,
struct rspamd_control_command *cmd,
gpointer ud)
{

+ 1
- 0
src/hs_helper.c View File

@@ -203,6 +203,7 @@ rspamd_rs_compile (struct hs_helper_ctx *ctx, struct rspamd_worker *worker,
static gboolean
rspamd_hs_helper_reload (struct rspamd_main *rspamd_main,
struct rspamd_worker *worker, gint fd,
gint attached_fd,
struct rspamd_control_command *cmd,
gpointer ud)
{

+ 25
- 5
src/libserver/rspamd_control.c View File

@@ -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 {

+ 6
- 1
src/libserver/rspamd_control.h View File

@@ -126,11 +126,16 @@ struct rspamd_srv_reply {
struct {
gint forced;
} hs_loaded;
struct {
enum rspamd_log_pipe_type type;
} log_pipe;
} reply;
};

typedef gboolean (*rspamd_worker_control_handler) (struct rspamd_main *rspamd_main,
struct rspamd_worker *worker, gint fd,
struct rspamd_worker *worker,
gint fd,
gint attached_fd,
struct rspamd_control_command *cmd,
gpointer ud);


+ 7
- 0
src/worker.c View File

@@ -71,6 +71,12 @@ worker_t normal_worker = {
G_STRFUNC, \
__VA_ARGS__)

struct rspamd_worker_log_pipe {
gint fd;
enum rspamd_log_pipe_type type;
struct rspamd_worker_log_pipe *prev, *next;
};

/*
* Worker's context
*/
@@ -358,6 +364,7 @@ accept_socket (gint fd, short what, void *arg)
static gboolean
rspamd_worker_hyperscan_ready (struct rspamd_main *rspamd_main,
struct rspamd_worker *worker, gint fd,
gint attached_fd,
struct rspamd_control_command *cmd,
gpointer ud)
{

Loading…
Cancel
Save