netifd: Fix printf calls + function declarations.
[project/netifd.git] / handler.c
index 531b509..0c4627f 100644 (file)
--- a/handler.c
+++ b/handler.c
@@ -16,7 +16,6 @@
 #include <glob.h>
 #include <fcntl.h>
 #include <stdio.h>
-#include <unistd.h>
 
 #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);
 }
 
@@ -129,10 +128,14 @@ 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))
+               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 +143,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 +152,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 +188,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;
 }