X-Git-Url: http://git.archive.openwrt.org/?p=project%2Fnetifd.git;a=blobdiff_plain;f=handler.c;h=8608a9751ea9f5705b182b762cb0a9b5b8090852;hp=531b509c3f43f508e03e6f84939d2db873db3f22;hb=HEAD;hpb=72adf25cf21490aef012bb9314357f9b381934f9 diff --git a/handler.c b/handler.c index 531b509..8608a97 100644 --- a/handler.c +++ b/handler.c @@ -16,7 +16,6 @@ #include #include #include -#include #include "netifd.h" #include "system.h" @@ -28,14 +27,17 @@ 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 (prev_fd < 0) + return; + + if (fchdir(prev_fd)) {} close(prev_fd); } @@ -106,7 +108,7 @@ netifd_parse_script_handler(const char *name, script_dump_cb cb) tok = json_tokener_new(); obj = json_tokener_parse_ex(tok, start, len); - if (!is_error(obj)) { + if (obj) { netifd_init_script_handler(name, obj, cb); json_object_put(obj); json_tokener_free(tok); @@ -129,10 +131,16 @@ void netifd_init_script_handlers(int dir_fd, script_dump_cb cb) int i, prev_fd; prev_fd = netifd_dir_push(dir_fd); - glob("./*.sh", 0, NULL, &g); + if (glob("./*.sh", 0, NULL, &g)) { + netifd_dir_pop(prev_fd); + return; + } + for (i = 0; i < g.gl_pathc; i++) netifd_parse_script_handler(g.gl_pathv[i], cb); netifd_dir_pop(prev_fd); + + globfree(&g); } char * @@ -140,6 +148,7 @@ 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; @@ -148,7 +157,12 @@ netifd_handler_parse_config(struct uci_blob_param_list *config, json_object *obj 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; @@ -179,15 +193,25 @@ netifd_handler_parse_config(struct uci_blob_param_list *config, json_object *obj 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; }