diff options
author | Daniel Willmann <daniel@totalueberwachung.de> | 2011-08-18 13:48:26 +0200 |
---|---|---|
committer | Daniel Willmann <daniel@totalueberwachung.de> | 2011-08-22 19:27:49 +0200 |
commit | ccdc490c335be5f2ed5582edfa875cdb96dcb5b2 (patch) | |
tree | 890a18936aac03eaf9d235ede9502c88458f0265 /openbsc/src/libctrl | |
parent | 65e4168e8e9d095b781c7a2174cca9451a59e8a9 (diff) |
ctrl: Improve error messages in ctrl_cmd_handle
Diffstat (limited to 'openbsc/src/libctrl')
-rw-r--r-- | openbsc/src/libctrl/control_if.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/openbsc/src/libctrl/control_if.c b/openbsc/src/libctrl/control_if.c index 4c2d933bb..12b8753ce 100644 --- a/openbsc/src/libctrl/control_if.c +++ b/openbsc/src/libctrl/control_if.c @@ -141,8 +141,10 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data) vline = cmd_make_strvec(request); talloc_free(request); - if (!vline) + if (!vline) { + cmd->reply = "cmd_make_strvec failed."; goto err; + } for (i=0;i<vector_active(vline);i++) { token = vector_slot(vline, i); @@ -152,47 +154,47 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data) if (!strcmp(token, "net")) { net = gsmnet; if (!net) - break; + goto err_missing; cmd->node = net; node = CTRL_NODE_NET; } else if (!strcmp(token, "bts")) { if (!net) - break; + goto err_missing; i++; if (i >= vector_active(vline)) - break; + goto err_index; token = vector_slot(vline, i); num = atoi(token); bts = gsm_bts_num(net, num); if (!bts) - break; + goto err_missing; cmd->node = bts; node = CTRL_NODE_BTS; } else if (!strcmp(token, "trx")) { if (!bts) - break; + goto err_missing; i++; if (i >= vector_active(vline)) - break; + goto err_index; token = vector_slot(vline, i); num = atoi(token); trx = gsm_bts_trx_num(bts, num); if (!trx) - break; + goto err_missing; cmd->node = trx; node = CTRL_NODE_TRX; } else if (!strcmp(token, "ts")) { if (!trx) - break; + goto err_missing; i++; if (i >= vector_active(vline)) - break; + goto err_index; token = vector_slot(vline, i); num = atoi(token); if ((num >= 0) && (num < TRX_NR_TS)) ts = &trx->ts[num]; if (!ts) - break; + goto err_missing; cmd->node = ts; node = CTRL_NODE_TS; } else { @@ -206,7 +208,7 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data) cmds_vec = vector_lookup(ctrl_node_vec, node); if (!cmds_vec) { - cmd->reply = "Command not found"; + cmd->reply = "Command not found."; vector_free(cmdvec); break; } @@ -216,6 +218,9 @@ int ctrl_cmd_handle(struct ctrl_cmd *cmd, void *data) vector_free(cmdvec); break; } + + if (i+1 == vector_active(vline)) + cmd->reply = "Command not present."; } cmd_free_strvec(vline); @@ -224,6 +229,17 @@ err: if (ret == CTRL_CMD_ERROR) cmd->type = CTRL_TYPE_ERROR; return ret; + +err_missing: + cmd_free_strvec(vline); + cmd->type = CTRL_TYPE_ERROR; + cmd->reply = "Error while resolving object"; + return ret; +err_index: + cmd_free_strvec(vline); + cmd->type = CTRL_TYPE_ERROR; + cmd->reply = "Error while parsing the index."; + return ret; } static void control_close_conn(struct ctrl_connection *ccon) |