diff --git a/contrib/spoa_server/spoa.c b/contrib/spoa_server/spoa.c index 6645c8ca3..73b713385 100644 --- a/contrib/spoa_server/spoa.c +++ b/contrib/spoa_server/spoa.c @@ -98,6 +98,7 @@ static const char *spoe_frm_err_reasons[SPOE_FRM_ERRS] = { bool debug = false; pthread_key_t worker_id; static struct ps *ps_list = NULL; +static struct ps_message *ps_messages = NULL; void ps_register(struct ps *ps) { @@ -105,6 +106,35 @@ void ps_register(struct ps *ps) ps_list = ps; } +void ps_register_message(struct ps *ps, const char *name, void *ref) +{ + struct ps_message *msg; + + /* Look for already registered name */ + for (msg = ps_messages; msg; msg = msg->next) { + if (strcmp(name, msg->name) == 0) { + LOG("Message \"%s\" already registered\n", name); + exit(EXIT_FAILURE); + } + } + + msg = calloc(1, sizeof(*msg)); + if (msg == NULL) { + LOG("Out of memory error\n"); + exit(EXIT_FAILURE); + } + + msg->next = ps_messages; + ps_messages = msg; + msg->name = strdup(name); + if (msg->name == NULL) { + LOG("Out of memory error\n"); + exit(EXIT_FAILURE); + } + msg->ref = ref; + msg->ps = ps; +} + static void check_ipv4_reputation(struct worker *w, struct in_addr *ipv4) { diff --git a/contrib/spoa_server/spoa.h b/contrib/spoa_server/spoa.h index c8f9861b9..22d678851 100644 --- a/contrib/spoa_server/spoa.h +++ b/contrib/spoa_server/spoa.h @@ -89,12 +89,21 @@ struct ps { struct ps *next; char *ext; int (*init_worker)(struct worker *w); + int (*exec_message)(struct worker *w, void *ref, int nargs, struct spoe_kv *args); +}; + +struct ps_message { + struct ps_message *next; + const char *name; + struct ps *ps; + void *ref; }; extern bool debug; extern pthread_key_t worker_id; void ps_register(struct ps *ps); +void ps_register_message(struct ps *ps, const char *name, void *ref); #define LOG(fmt, args...) \ do { \