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