}
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;
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;
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);
}
#include <libubox/blobmsg_json.h>
-typedef void (*script_dump_cb)(const char *name, json_object *obj);
+typedef void (*script_dump_cb)(const char *script, const char *name, json_object *obj);
static inline json_object *
json_check_type(json_object *obj, json_type type)
return obj;
}
+static inline json_object *
+json_get_field(json_object *obj, const char *name, json_type type)
+{
+ return json_check_type(json_object_object_get(obj, name), type);
+}
+
int netifd_open_subdir(const char *name);
void netifd_init_script_handlers(int dir_fd, script_dump_cb cb);
char *netifd_handler_parse_config(struct uci_blob_param_list *config, json_object *obj);
return NULL;
}
-static inline json_object *
-get_field(json_object *obj, const char *name, json_type type)
-{
- return json_check_type(json_object_object_get(obj, name), type);
-}
-
static void
-proto_shell_add_handler(const char *script, json_object *obj)
+proto_shell_add_handler(const char *script, const char *name, json_object *obj)
{
struct proto_shell_handler *handler;
struct proto_handler *proto;
json_object *config, *tmp;
- const char *name;
char *str;
- if (!json_check_type(obj, json_type_object))
- return;
-
- tmp = get_field(obj, "name", json_type_string);
- if (!tmp)
- return;
-
- name = json_object_get_string(tmp);
-
handler = calloc_a(sizeof(*handler) + strlen(script) + 1,
&str, strlen(name) + 1);
if (!handler)
proto->config_params = &handler->config;
proto->attach = proto_shell_attach;
- tmp = get_field(obj, "no-device", json_type_boolean);
+ tmp = json_get_field(obj, "no-device", json_type_boolean);
if (tmp && json_object_get_boolean(tmp))
handler->proto.flags |= PROTO_FLAG_NODEV;
- tmp = get_field(obj, "available", json_type_boolean);
+ tmp = json_get_field(obj, "available", json_type_boolean);
if (tmp && json_object_get_boolean(tmp))
handler->proto.flags |= PROTO_FLAG_INIT_AVAILABLE;
- config = get_field(obj, "config", json_type_array);
+ config = json_get_field(obj, "config", json_type_array);
if (config)
handler->config_buf = netifd_handler_parse_config(&handler->config, config);