diff options
author | Felix Fietkau <nbd@openwrt.org> | 2013-09-24 11:01:07 +0200 |
---|---|---|
committer | Felix Fietkau <nbd@openwrt.org> | 2013-10-22 14:10:33 +0200 |
commit | f88b0173d22e7f86ad8441c9a5bc76cee77f721a (patch) | |
tree | 54a3d4837e5c07c3ab57b6625d81275d5ef118f5 /handler.c | |
parent | f16a15c39c872c5f42eb554deb4d956264c0c823 (diff) |
proto-shell: move script handler config parse code to handler.c
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Diffstat (limited to 'handler.c')
-rw-r--r-- | handler.c | 57 |
1 files changed, 57 insertions, 0 deletions
@@ -117,3 +117,60 @@ void netifd_init_script_handlers(int dir_fd, script_dump_cb cb) netifd_init_script_handler(g.gl_pathv[i], cb); netifd_dir_pop(prev_fd); } + +char * +netifd_handler_parse_config(struct uci_blob_param_list *config, json_object *obj) +{ + struct blobmsg_policy *attrs; + char *str_buf, *str_cur; + int str_len = 0; + int i; + + config->n_params = json_object_array_length(obj); + attrs = calloc(1, sizeof(*attrs) * config->n_params); + if (!attrs) + return NULL; + + config->params = attrs; + for (i = 0; i < config->n_params; i++) { + json_object *cur, *name, *type; + + cur = json_check_type(json_object_array_get_idx(obj, i), json_type_array); + if (!cur) + goto error; + + name = json_check_type(json_object_array_get_idx(cur, 0), json_type_string); + if (!name) + goto error; + + type = json_check_type(json_object_array_get_idx(cur, 1), json_type_int); + if (!type) + goto error; + + attrs[i].name = json_object_get_string(name); + attrs[i].type = json_object_get_int(type); + if (attrs[i].type > BLOBMSG_TYPE_LAST) + goto error; + + str_len += strlen(attrs[i].name) + 1; + } + + str_buf = malloc(str_len); + if (!str_buf) + goto error; + + str_cur = str_buf; + for (i = 0; i < config->n_params; i++) { + const char *name = attrs[i].name; + + attrs[i].name = str_cur; + str_cur += sprintf(str_cur, "%s", name) + 1; + } + + return str_buf; + +error: + free(attrs); + config->n_params = 0; + return NULL; +} |