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