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
This commit is contained in:
Neels Hofmeyr 2017-12-16 01:05:25 +01:00 committed by Harald Welte
parent 1b8b152e79
commit f2e83ad40d
2 changed files with 17 additions and 2 deletions

View File

@ -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);

View File

@ -269,7 +269,22 @@ 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;
@ -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)