diff options
-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) |