2 * netifd - network interface daemon
3 * Copyright (C) 2012-2013 Felix Fietkau <nbd@openwrt.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2
7 * as published by the Free Software Foundation
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
26 netifd_dir_push(int fd
)
28 int prev_fd
= open(".", O_RDONLY
| O_DIRECTORY
);
29 system_fd_set_cloexec(prev_fd
);
36 netifd_dir_pop(int prev_fd
)
42 int netifd_open_subdir(const char *name
)
47 prev_dir
= netifd_dir_push(-1);
48 if (chdir(main_path
)) {
49 perror("chdir(main path)");
53 ret
= open(name
, O_RDONLY
| O_DIRECTORY
);
55 system_fd_set_cloexec(ret
);
58 netifd_dir_pop(prev_dir
);
63 netifd_init_script_handler(const char *script
, json_object
*obj
, script_dump_cb cb
)
68 if (!json_check_type(obj
, json_type_object
))
71 tmp
= json_get_field(obj
, "name", json_type_string
);
75 name
= json_object_get_string(tmp
);
76 cb(script
, name
, obj
);
80 netifd_parse_script_handler(const char *name
, script_dump_cb cb
)
82 struct json_tokener
*tok
= NULL
;
89 #define DUMP_SUFFIX " '' dump"
91 cmd
= alloca(strlen(name
) + 1 + sizeof(DUMP_SUFFIX
));
92 sprintf(cmd
, "%s" DUMP_SUFFIX
, name
);
99 start
= fgets(buf
, sizeof(buf
), f
);
106 tok
= json_tokener_new();
108 obj
= json_tokener_parse_ex(tok
, start
, len
);
109 if (!is_error(obj
)) {
110 netifd_init_script_handler(name
, obj
, cb
);
111 json_object_put(obj
);
112 json_tokener_free(tok
);
114 } else if (start
[len
- 1] == '\n') {
115 json_tokener_free(tok
);
118 } while (!feof(f
) && !ferror(f
));
121 json_tokener_free(tok
);
126 void netifd_init_script_handlers(int dir_fd
, script_dump_cb cb
)
131 prev_fd
= netifd_dir_push(dir_fd
);
132 glob("./*.sh", 0, NULL
, &g
);
133 for (i
= 0; i
< g
.gl_pathc
; i
++)
134 netifd_parse_script_handler(g
.gl_pathv
[i
], cb
);
135 netifd_dir_pop(prev_fd
);
139 netifd_handler_parse_config(struct uci_blob_param_list
*config
, json_object
*obj
)
141 struct blobmsg_policy
*attrs
;
142 char *str_buf
, *str_cur
;
146 config
->n_params
= json_object_array_length(obj
);
147 attrs
= calloc(1, sizeof(*attrs
) * config
->n_params
);
151 config
->params
= attrs
;
152 for (i
= 0; i
< config
->n_params
; i
++) {
153 json_object
*cur
, *name
, *type
;
155 cur
= json_check_type(json_object_array_get_idx(obj
, i
), json_type_array
);
159 name
= json_check_type(json_object_array_get_idx(cur
, 0), json_type_string
);
163 type
= json_check_type(json_object_array_get_idx(cur
, 1), json_type_int
);
167 attrs
[i
].name
= json_object_get_string(name
);
168 attrs
[i
].type
= json_object_get_int(type
);
169 if (attrs
[i
].type
> BLOBMSG_TYPE_LAST
)
172 str_len
+= strlen(attrs
[i
].name
) + 1;
175 str_buf
= malloc(str_len
);
180 for (i
= 0; i
< config
->n_params
; i
++) {
181 const char *name
= attrs
[i
].name
;
183 attrs
[i
].name
= str_cur
;
184 str_cur
+= sprintf(str_cur
, "%s", name
) + 1;
191 config
->n_params
= 0;