mgcp-client: Create alloc() and free() internal APIs for mgcp_client_pool_member

Related: SYS#5987
Change-Id: Ibd2bf976885c777fe944652af6fe6eb0f1820468
diff --git a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
index 148a5cf..582090c 100644
--- a/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
+++ b/include/osmocom/mgcp_client/mgcp_client_pool_internal.h
@@ -45,4 +45,6 @@
 
 struct mgcp_client_pool_member *mgcp_client_pool_find_member_by_nr(struct mgcp_client_pool *pool, unsigned int nr);
 
+struct mgcp_client_pool_member *mgcp_client_pool_member_alloc(struct mgcp_client_pool *pool, unsigned int nr);
+void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member);
 const char *mgcp_client_pool_member_name(const struct mgcp_client_pool_member *pool_member);
diff --git a/src/libosmo-mgcp-client/mgcp_client_pool.c b/src/libosmo-mgcp-client/mgcp_client_pool.c
index 0555ff3..c8282fe 100644
--- a/src/libosmo-mgcp-client/mgcp_client_pool.c
+++ b/src/libosmo-mgcp-client/mgcp_client_pool.c
@@ -228,3 +228,38 @@
 		}
 	}
 }
+
+/***************************
+ * mgcp_client_pool_member:
+ ***************************/
+
+/*! Allocate an mgcp_client_pool_member.
+ *  \param[in] pool MGCP client pool descriptor.
+ *  \param[in] nr Reference number of the pool member.
+ */
+struct mgcp_client_pool_member *mgcp_client_pool_member_alloc(struct mgcp_client_pool *pool, unsigned int nr)
+{
+	struct mgcp_client_pool_member *pool_member;
+
+	pool_member = talloc_zero(pool, struct mgcp_client_pool_member);
+	OSMO_ASSERT(pool_member);
+	mgcp_client_conf_init(&pool_member->conf);
+	pool_member->nr = nr;
+	llist_add_tail(&pool_member->list, &pool->member_list);
+	return pool_member;
+}
+
+/*! Free an mgcp_client_pool_member allocated through mgcp_client_pool_member_alloc().
+ *  \param[in] pool_member MGCP client pool descriptor.
+ *
+ * It also frees the associated MGCP client if present.
+ */
+void mgcp_client_pool_member_free(struct mgcp_client_pool_member *pool_member)
+{
+	llist_del(&pool_member->list);
+	if (pool_member->client) {
+		mgcp_client_disconnect(pool_member->client);
+		talloc_free(pool_member->client);
+	}
+	talloc_free(pool_member);
+}
diff --git a/src/libosmo-mgcp-client/mgcp_client_vty.c b/src/libosmo-mgcp-client/mgcp_client_vty.c
index 748042f..505f3ab 100644
--- a/src/libosmo-mgcp-client/mgcp_client_vty.c
+++ b/src/libosmo-mgcp-client/mgcp_client_vty.c
@@ -345,11 +345,8 @@
 
 	pool_member = mgcp_client_pool_find_member_by_nr(global_mgcp_client_pool, nr);
 	if (!pool_member) {
-		pool_member = talloc_zero(global_mgcp_client_pool, struct mgcp_client_pool_member);
+		pool_member = mgcp_client_pool_member_alloc(global_mgcp_client_pool, nr);
 		OSMO_ASSERT(pool_member);
-		mgcp_client_conf_init(&pool_member->conf);
-		pool_member->nr = nr;
-		llist_add_tail(&pool_member->list, &global_mgcp_client_pool->member_list);
 	}
 
 	vty->index = &pool_member->conf;
@@ -379,12 +376,7 @@
 		return CMD_WARNING;
 	}
 
-	llist_del(&pool_member->list);
-	if (pool_member->client) {
-		mgcp_client_disconnect(pool_member->client);
-		talloc_free(pool_member->client);
-	}
-	talloc_free(pool_member);
+	mgcp_client_pool_member_free(pool_member);
 
 	return CMD_SUCCESS;
 }