summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2018-07-12 17:51:16 +0200
committerHarald Welte <laforge@gnumonks.org>2018-07-16 17:56:25 +0000
commit239ed3b3ee4c8a2079c1d5beb9a471deb72692cc (patch)
tree809e546ab2c5c95b92dab9a50432c851a4dabf13 /src
parented7d2ddb155f3fd27d728a096f84a7b6ed074793 (diff)
ctrl: Introduce ctrl_cmd_parse3 API
Callers require to know whether the returned ERROR cmd was received or generated locally, in order to send it or do something with it locally. Related: OS#3394 Change-Id: Ide9170e5c31967c353f8fe4e8227e64130b91eae
Diffstat (limited to 'src')
-rw-r--r--src/ctrl/control_cmd.c21
-rw-r--r--src/ctrl/libosmoctrl.map1
2 files changed, 21 insertions, 1 deletions
diff --git a/src/ctrl/control_cmd.c b/src/ctrl/control_cmd.c
index 14ff9065..33496bd8 100644
--- a/src/ctrl/control_cmd.c
+++ b/src/ctrl/control_cmd.c
@@ -316,9 +316,25 @@ static bool id_str_valid(const char *str)
* \param[in] msg message buffer containing command to be decoded
* \returns callee-allocated decoded CTRL command; NULL on allocation failure,
* ctrl->type == CTRL_TYPE_ERROR and an error message in ctrl->reply on any error.
- * The caller is responsible to talloc_free() the returned struct pointer. */
+ * The caller is responsible to talloc_free() the returned struct pointer.
+ * If information of the origin of the ERROR cmd returned is required (received
+ * or local parsing failure), use \ref ctrl_cmd_parse3 instead. */
struct ctrl_cmd *ctrl_cmd_parse2(void *ctx, struct msgb *msg)
{
+ bool unused;
+ return ctrl_cmd_parse3(ctx, msg, &unused);
+}
+
+/*! Parse/Decode CTRL from \ref msgb into command struct.
+ * \param[in] ctx talloc context from which to allocate
+ * \param[in] msg message buffer containing command to be decoded
+ * \param[out] parse_failed Whether returned ERROR cmd was generatd locally
+ * (due to parse failure) or was received.
+ * \returns callee-allocated decoded CTRL command; NULL on allocation failure,
+ * ctrl->type == CTRL_TYPE_ERROR and an error message in ctrl->reply on any error.
+ * The caller is responsible to talloc_free() the returned struct pointer. */
+struct ctrl_cmd *ctrl_cmd_parse3(void *ctx, struct msgb *msg, bool *parse_failed)
+{
char *str, *tmp, *saveptr = NULL;
char *var, *val;
struct ctrl_cmd *cmd;
@@ -326,6 +342,7 @@ struct ctrl_cmd *ctrl_cmd_parse2(void *ctx, struct msgb *msg)
cmd = talloc_zero(ctx, struct ctrl_cmd);
if (!cmd) {
LOGP(DLCTRL, LOGL_ERROR, "Failed to allocate.\n");
+ *parse_failed = true;
return NULL;
}
@@ -483,12 +500,14 @@ struct ctrl_cmd *ctrl_cmd_parse2(void *ctx, struct msgb *msg)
goto err;
}
+ *parse_failed = false;
return cmd;
oom:
cmd->type = CTRL_TYPE_ERROR;
cmd->id = "err";
cmd->reply = "OOM";
err:
+ *parse_failed = true;
return cmd;
}
diff --git a/src/ctrl/libosmoctrl.map b/src/ctrl/libosmoctrl.map
index 5b888a2d..f995467b 100644
--- a/src/ctrl/libosmoctrl.map
+++ b/src/ctrl/libosmoctrl.map
@@ -13,6 +13,7 @@ ctrl_cmd_install;
ctrl_cmd_make;
ctrl_cmd_parse;
ctrl_cmd_parse2;
+ctrl_cmd_parse3;
ctrl_cmd_send;
ctrl_cmd_send_to_all;
ctrl_cmd_send_trap;