diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2017-12-16 01:05:25 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-12-18 23:05:50 +0000 |
commit | f2e83ad40d231e87e2604ec4c97c810a8182e145 (patch) | |
tree | 89870f38e0f9977172ce13942507228046f22866 | |
parent | 1b8b152e791df579035f7b7c8dd621938f7de3c0 (diff) |
add ctrl_cmd_parse2() to return parsing errors
If a control command fails to parse, we so far discard specific error messages
and instead send just "Command parser error".
In ctrl_cmd_parse() we actually compose detailed error replies, but in the end
simply talloc_free() them and return NULL.
A first step to report these errors to the ctrl command issuer is to not return
NULL and instead return the cmd with type = CTRL_TYPE_ERROR. Add
ctrl_cmd_parse2() to return such instead of NULL.
To stay API compatible, provide ctrl_cmd_parse2() to return a cmd on errors.
ctrl_cmd_parse() retains identical behavior but becomes just a simple wrapper
around ctrl_cmd_parse2() which discards the cmd on error.
No need really to deprecate ctrl_cmd_parse() yet; especially as long as
compiler warnings might break jenkins builds.
Change-Id: I5047c9f977d70b03eea77cbcfd2b96d43ea46880
-rw-r--r-- | include/osmocom/ctrl/control_cmd.h | 1 | ||||
-rw-r--r-- | src/ctrl/control_cmd.c | 18 |
2 files changed, 17 insertions, 2 deletions
diff --git a/include/osmocom/ctrl/control_cmd.h b/include/osmocom/ctrl/control_cmd.h index 4372e257..865b006b 100644 --- a/include/osmocom/ctrl/control_cmd.h +++ b/include/osmocom/ctrl/control_cmd.h @@ -103,6 +103,7 @@ int ctrl_cmd_exec(vector vline, struct ctrl_cmd *command, vector node, void *dat int ctrl_cmd_install(enum ctrl_node_type node, struct ctrl_cmd_element *cmd); int ctrl_cmd_send(struct osmo_wqueue *queue, struct ctrl_cmd *cmd); int ctrl_cmd_send_to_all(struct ctrl_handle *ctrl, struct ctrl_cmd *cmd); +struct ctrl_cmd *ctrl_cmd_parse2(void *ctx, struct msgb *msg); struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg); struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd); struct ctrl_cmd *ctrl_cmd_cpy(void *ctx, struct ctrl_cmd *cmd); diff --git a/src/ctrl/control_cmd.c b/src/ctrl/control_cmd.c index f6164795..c2ce2be4 100644 --- a/src/ctrl/control_cmd.c +++ b/src/ctrl/control_cmd.c @@ -269,8 +269,23 @@ err: return NULL; } +/*! Parse CTRL command struct from msgb, return NULL on any error. + * The caller is responsible to talloc_free() the returned struct pointer. */ struct ctrl_cmd *ctrl_cmd_parse(void *ctx, struct msgb *msg) { + struct ctrl_cmd *res = ctrl_cmd_parse2(ctx, msg); + if (res->type == CTRL_TYPE_ERROR) { + talloc_free(res); + return NULL; + } + return res; +} + +/*! Parse CTRL command struct from msgb, return 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_parse2(void *ctx, struct msgb *msg) +{ char *str, *tmp, *saveptr = NULL; char *var, *val; struct ctrl_cmd *cmd; @@ -382,8 +397,7 @@ oom: cmd->id = "err"; cmd->reply = "OOM"; err: - talloc_free(cmd); - return NULL; + return cmd; } struct msgb *ctrl_cmd_make(struct ctrl_cmd *cmd) |