X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=handler.c;h=f81a7c581510fe6b4dd7613388cafa8dcdbbd3e3;hp=4d0a57a91b85bf529eebfa71d18589b64b3a77c7;hb=d788b74c31d95a13630b0d61f69c5bd3eab63ca4;hpb=f16a15c39c872c5f42eb554deb4d956264c0c823 diff --git a/handler.c b/handler.c index 4d0a57a..f81a7c5 100644 --- a/handler.c +++ b/handler.c @@ -16,7 +16,6 @@ #include #include #include -#include #include "netifd.h" #include "system.h" @@ -28,14 +27,14 @@ netifd_dir_push(int fd) int prev_fd = open(".", O_RDONLY | O_DIRECTORY); system_fd_set_cloexec(prev_fd); if (fd >= 0) - fchdir(fd); + if (fchdir(fd)) {} return prev_fd; } static void netifd_dir_pop(int prev_fd) { - fchdir(prev_fd); + if (fchdir(prev_fd)) {} close(prev_fd); } @@ -60,7 +59,24 @@ out: } static void -netifd_init_script_handler(const char *name, script_dump_cb cb) +netifd_init_script_handler(const char *script, json_object *obj, script_dump_cb cb) +{ + json_object *tmp; + const char *name; + + if (!json_check_type(obj, json_type_object)) + return; + + tmp = json_get_field(obj, "name", json_type_string); + if (!tmp) + return; + + name = json_object_get_string(tmp); + cb(script, name, obj); +} + +static void +netifd_parse_script_handler(const char *name, script_dump_cb cb) { struct json_tokener *tok = NULL; json_object *obj; @@ -90,7 +106,7 @@ netifd_init_script_handler(const char *name, script_dump_cb cb) obj = json_tokener_parse_ex(tok, start, len); if (!is_error(obj)) { - cb(name, obj); + netifd_init_script_handler(name, obj, cb); json_object_put(obj); json_tokener_free(tok); tok = NULL; @@ -114,6 +130,79 @@ void netifd_init_script_handlers(int dir_fd, script_dump_cb cb) prev_fd = netifd_dir_push(dir_fd); glob("./*.sh", 0, NULL, &g); for (i = 0; i < g.gl_pathc; i++) - netifd_init_script_handler(g.gl_pathv[i], cb); + netifd_parse_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; + char const **validate; + 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; + + validate = calloc(1, sizeof(char*) * config->n_params); + if (!validate) + goto error; + + config->params = attrs; + config->validate = validate; + 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; + char *delim; + + attrs[i].name = str_cur; + str_cur += sprintf(str_cur, "%s", name) + 1; + delim = strchr(attrs[i].name, ':'); + if (delim) { + *delim = '\0'; + validate[i] = ++delim; + } else { + validate[i] = NULL; + } + } + + return str_buf; + +error: + free(attrs); + if (validate) + free(validate); + config->n_params = 0; + return NULL; +}