Add osmo_fsm_find_by_name() and avoid registering FSM with same name

This addresses a FIXME in the fsm.c code: osmo_fsm_register() should
fail in case a FSM with the given name already exists.

Change-Id: I5fd882939859c79581eba70c14cbafd64560b583
diff --git a/src/fsm.c b/src/fsm.c
index 19705b9..666dbe3 100644
--- a/src/fsm.c
+++ b/src/fsm.c
@@ -20,6 +20,7 @@
 
 #include <errno.h>
 #include <stdbool.h>
+#include <string.h>
 
 #include <osmocom/core/fsm.h>
 #include <osmocom/core/talloc.h>
@@ -102,6 +103,16 @@
 	fsm_log_addr = log_addr;
 }
 
+struct osmo_fsm *osmo_fsm_find_by_name(const char *name)
+{
+	struct osmo_fsm *fsm;
+	llist_for_each_entry(fsm, &g_fsms, list) {
+		if (!strcmp(name, fsm->name))
+			return fsm;
+	}
+	return NULL;
+}
+
 /*! \brief register a FSM with the core
  *
  *  A FSM descriptor needs to be registered with the core before any
@@ -112,7 +123,8 @@
  */
 int osmo_fsm_register(struct osmo_fsm *fsm)
 {
-	/* FIXME:check for duplicate name? */
+	if (osmo_fsm_find_by_name(fsm->name))
+		return -EEXIST;
 	llist_add_tail(&fsm->list, &g_fsms);
 	INIT_LLIST_HEAD(&fsm->instances);