MINOR: spoa-server: Allow registering message processors
This function register processor executed by any language for processing
an SPOP message.
diff --git a/contrib/spoa_server/spoa.c b/contrib/spoa_server/spoa.c
index 6645c8c..73b7133 100644
--- a/contrib/spoa_server/spoa.c
+++ b/contrib/spoa_server/spoa.c
@@ -98,6 +98,7 @@
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 @@
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 c8f9861..22d6788 100644
--- a/contrib/spoa_server/spoa.h
+++ b/contrib/spoa_server/spoa.h
@@ -89,12 +89,21 @@
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 { \