init_fuzzy, /* Init function */
start_fuzzy, /* Start function */
RSPAMD_WORKER_HAS_SOCKET | RSPAMD_WORKER_NO_STRICT_CONFIG,
- RSPAMD_WORKER_SOCKET_UDP, /* UDP socket */
- RSPAMD_WORKER_VER /* Version info */
+ RSPAMD_WORKER_SOCKET_UDP | RSPAMD_WORKER_SOCKET_TCP, /* UDP + TCP socket */
+ RSPAMD_WORKER_VER /* Version info */
};
struct fuzzy_global_stat {
struct sockaddr_un su;
struct sockaddr_storage ss;
};
+
+static void
+accept_tcp_fuzzy_socket(EV_P_ ev_io *w, int revents)
+{
+ struct rspamd_worker *worker = (struct rspamd_worker *) w->data;
+ struct rspamd_fuzzy_storage_ctx *ctx;
+ struct fuzzy_session *session;
+
+ ctx = (struct rspamd_fuzzy_storage_ctx *) worker->ctx;
+
+ int nfd;
+ rspamd_inet_addr_t *addr = NULL;
+
+ if ((nfd =
+ rspamd_accept_from_socket(w->fd, &addr,
+ rspamd_worker_throttle_accept_events, worker->accept_events)) == -1) {
+ msg_err("accept failed: %s", strerror(errno));
+ return;
+ }
+
+ if (!rspamd_fuzzy_check_client(worker->ctx, addr)) {
+ /* Disallow forbidden clients silently (maybe we should even tarpit?) */
+ rspamd_inet_address_free(addr);
+ close(nfd);
+
+ return;
+ }
+}
+
+
/*
* Accept new connection and construct task
*/
static void
-accept_fuzzy_socket(EV_P_ ev_io *w, int revents)
+accept_udp_fuzzy_socket(EV_P_ ev_io *w, int revents)
{
struct rspamd_worker *worker = (struct rspamd_worker *) w->data;
struct rspamd_fuzzy_storage_ctx *ctx;
ac_ev = g_malloc0(sizeof(*ac_ev));
ac_ev->accept_ev.data = worker;
ac_ev->event_loop = ctx->event_loop;
- ev_io_init(&ac_ev->accept_ev, accept_fuzzy_socket, ls->fd,
+ ev_io_init(&ac_ev->accept_ev, accept_udp_fuzzy_socket, ls->fd,
EV_READ);
ev_io_start(ctx->event_loop, &ac_ev->accept_ev);
DL_APPEND(worker->accept_events, ac_ev);
}
else {
- /* We allow TCP listeners only for a update worker */
- g_assert_not_reached();
+ ac_ev = g_malloc0(sizeof(*ac_ev));
+ ac_ev->accept_ev.data = worker;
+ ac_ev->event_loop = ctx->event_loop;
+ ev_io_init(&ac_ev->accept_ev, accept_tcp_fuzzy_socket, ls->fd,
+ EV_READ);
+ ev_io_start(ctx->event_loop, &ac_ev->accept_ev);
+ DL_APPEND(worker->accept_events, ac_ev);
}
}