X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fuqmi.git;a=blobdiff_plain;f=commands.c;h=198b6abacd1c0637d4cd9ce1b81c20d370f5a1e5;hp=044760e7f7dd7530b00814ef4f9925d1ee01cc59;hb=cef8ce433b5a29b49dfe8700fa7b0ddc2bbb9d20;hpb=1be9ca91ee992982ac2b48b08d4a6f872c28a7bd diff --git a/commands.c b/commands.c index 044760e..198b6ab 100644 --- a/commands.c +++ b/commands.c @@ -5,11 +5,13 @@ #include #include +#include #include "uqmi.h" #include "commands.h" static struct blob_buf status; +bool single_line = false; static void no_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg) { @@ -18,16 +20,20 @@ static void no_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg * static void cmd_version_cb(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg) { struct qmi_ctl_get_version_info_response res; + void *c; char name_buf[16]; int i; qmi_parse_ctl_get_version_info_response(msg, &res); + + c = blobmsg_open_table(&status, NULL); for (i = 0; i < res.data.service_list_n; i++) { sprintf(name_buf, "service_%d", res.data.service_list[i].service); blobmsg_printf(&status, name_buf, "%d,%d", res.data.service_list[i].major_version, res.data.service_list[i].minor_version); } + blobmsg_close_table(&status, c); } static enum qmi_cmd_result @@ -93,9 +99,46 @@ cmd_set_client_id_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct q return QMI_CMD_DONE; } +static int +qmi_get_array_idx(const char **array, int size, const char *str) +{ + int i; + + for (i = 0; i < size; i++) { + if (!array[i]) + continue; + + if (!strcmp(array[i], str)) + return i; + } + + return -1; +} + +#define cmd_ctl_set_data_format_cb no_cb +static enum qmi_cmd_result +cmd_ctl_set_data_format_prepare(struct qmi_dev *qmi, struct qmi_request *req, struct qmi_msg *msg, char *arg) +{ + struct qmi_ctl_set_data_format_request sreq = {}; + const char *modes[] = { + [QMI_CTL_DATA_LINK_PROTOCOL_802_3] = "802.3", + [QMI_CTL_DATA_LINK_PROTOCOL_RAW_IP] = "raw-ip", + }; + int mode = qmi_get_array_idx(modes, ARRAY_SIZE(modes), arg); + + if (mode < 0) { + uqmi_add_error("Invalid mode (modes: 802.3, raw-ip)"); + return QMI_CMD_EXIT; + } + + qmi_set_ctl_set_data_format_request(msg, &sreq); + return QMI_CMD_DONE; +} + #include "commands-wds.c" #include "commands-dms.c" #include "commands-nas.c" +#include "commands-wms.c" #define __uqmi_command(_name, _optname, _arg, _type) \ [__UQMI_COMMAND_##_name] = { \ @@ -124,22 +167,17 @@ void uqmi_add_command(char *arg, int cmd) static void uqmi_print_result(struct blob_attr *data) { - struct blob_attr *cur; - int rem; - - blob_for_each_attr(cur, data, rem) { - switch (blobmsg_type(cur)) { - case BLOBMSG_TYPE_STRING: - printf("%s=%s\n", blobmsg_name(cur), (char *) blobmsg_data(cur)); - break; - case BLOBMSG_TYPE_INT32: - printf("%s=%d\n", blobmsg_name(cur), (int32_t) blobmsg_get_u32(cur)); - break; - case BLOBMSG_TYPE_INT8: - printf("%s=%s\n", blobmsg_name(cur), blobmsg_get_u8(cur) ? "true" : "false"); - break; - } - } + char *str; + + if (!blob_len(data)) + return; + + str = blobmsg_format_json_indent(blob_data(data), false, single_line ? -1 : 0); + if (!str) + return; + + printf("%s\n", str); + free(str); } static bool __uqmi_run_commands(struct qmi_dev *qmi, bool option) @@ -159,7 +197,7 @@ static bool __uqmi_run_commands(struct qmi_dev *qmi, bool option) blob_buf_init(&status, 0); if (cmds[i].handler->type > QMI_SERVICE_CTL && qmi_service_connect(qmi, cmds[i].handler->type, -1)) { - blobmsg_printf(&status, "error", "failed to connect to service"); + uqmi_add_error("Failed to connect to service"); res = QMI_CMD_EXIT; } else { res = cmds[i].handler->prepare(qmi, &req, (void *) buf, cmds[i].arg); @@ -168,8 +206,10 @@ static bool __uqmi_run_commands(struct qmi_dev *qmi, bool option) if (res == QMI_CMD_REQUEST) { qmi_request_start(qmi, &req, (void *) buf, cmds[i].handler->cb); req.no_error_cb = true; - if (qmi_request_wait(qmi, &req)) - blobmsg_add_string(&status, "error", qmi_get_error_str(req.ret)); + if (qmi_request_wait(qmi, &req)) { + uqmi_add_error(qmi_get_error_str(req.ret)); + do_break = true; + } } else if (res == QMI_CMD_EXIT) { do_break = true; } @@ -181,11 +221,22 @@ static bool __uqmi_run_commands(struct qmi_dev *qmi, bool option) return true; } -void uqmi_run_commands(struct qmi_dev *qmi) +int uqmi_add_error(const char *msg) +{ + blobmsg_add_string(&status, NULL, msg); + return QMI_CMD_EXIT; +} + +bool uqmi_run_commands(struct qmi_dev *qmi) { - if (__uqmi_run_commands(qmi, true)) - __uqmi_run_commands(qmi, false); + bool ret; + + ret = __uqmi_run_commands(qmi, true) && + __uqmi_run_commands(qmi, false); + free(cmds); cmds = NULL; n_cmds = 0; + + return ret; }