summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2017-04-16 19:17:10 +0200
committerHarald Welte <laforge@gnumonks.org>2017-04-27 09:50:33 +0200
commitf85861d6eb6ebc962bc710ac2d481536e6be7053 (patch)
treee57ba9de9dfc7572cb6efedd2dfc5ef2378e2e17
parent79c137c65446ef4139dde63a9e9c023fe9139f80 (diff)
control_if: Add helper function for 'local execution' of control command
Sometimes (particularly when testing), we may want to parse+execute an arbitrary control command simply form a string buffer, rather than from a msgb. Let's add a helper for that. Change-Id: Iaca748e0d942bb2a1ee7c2776b37485e1439eb0c
-rw-r--r--include/osmocom/ctrl/control_if.h1
-rw-r--r--src/ctrl/control_if.c28
-rw-r--r--tests/Makefile.am2
3 files changed, 30 insertions, 1 deletions
diff --git a/include/osmocom/ctrl/control_if.h b/include/osmocom/ctrl/control_if.h
index 0d379593..4cd33699 100644
--- a/include/osmocom/ctrl/control_if.h
+++ b/include/osmocom/ctrl/control_if.h
@@ -30,5 +30,6 @@ struct ctrl_handle *ctrl_interface_setup_dynip(void *data,
ctrl_cmd_lookup lookup);
struct ctrl_connection *osmo_ctrl_conn_alloc(void *ctx, void *data);
int ctrl_cmd_handle(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd, void *data);
+struct ctrl_cmd *ctrl_cmd_exec_from_string(struct ctrl_handle *ch, const char *cmdstr);
int ctrl_lookup_register(ctrl_cmd_lookup lookup);
diff --git a/src/ctrl/control_if.c b/src/ctrl/control_if.c
index 28f696b2..c8b47226 100644
--- a/src/ctrl/control_if.c
+++ b/src/ctrl/control_if.c
@@ -810,3 +810,31 @@ int ctrl_lookup_register(ctrl_cmd_lookup lookup)
llist_add_tail(&lh->list, &ctrl_lookup_helpers);
return 0;
}
+
+/*! \brief Helper for "local execution" of a CTRL command from a string
+ * The function will parse + execute the given control command string
+ * and return a corresponding ctrl_cmd. Caller is responsible to
+ * talloc_free() the return value.
+ * \param[in] Control Interface Command String
+ * \returns parsed command, including reply; NULL on error */
+struct ctrl_cmd *ctrl_cmd_exec_from_string(struct ctrl_handle *ch, const char *cmdstr)
+{
+ struct msgb *msg = msgb_alloc(1024, "ctrl-cmd");
+ struct ctrl_cmd *cmd;
+
+ if (!msg)
+ return NULL;
+ msg->l2h = msg->data;
+ osmo_strlcpy((char *)msg->data, cmdstr, msgb_tailroom(msg));
+ msgb_put(msg, strlen(cmdstr));
+
+ cmd = ctrl_cmd_parse(ch, msg);
+ msgb_free(msg);
+ if (!cmd)
+ return NULL;
+ if (ctrl_cmd_handle(ch, cmd, NULL) < 0) {
+ talloc_free(cmd);
+ return NULL;
+ }
+ return cmd;
+}
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 352b5a74..ab80c1af 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -139,7 +139,7 @@ oap_oap_test_SOURCES = oap/oap_test.c
oap_oap_test_LDADD = $(top_builddir)/src/gsm/libosmogsm.la $(top_builddir)/src/libosmocore.la
fsm_fsm_test_SOURCES = fsm/fsm_test.c
-fsm_fsm_test_LDADD = $(top_builddir)/src/libosmocore.la
+fsm_fsm_test_LDADD = $(top_builddir)/src/libosmocore.la $(top_builddir)/src/ctrl/libosmoctrl.la
write_queue_wqueue_test_SOURCES = write_queue/wqueue_test.c
write_queue_wqueue_test_LDADD = $(top_builddir)/src/libosmocore.la