70 const char* expression,
73 when_true(amxc_htable_contains(mibs, name), exit);
76 when_null(info, exit);
79 info->
file = strdup(file);
81 amxc_htable_insert(mibs, name, &info->
hit);
88 amxc_string_t* filename,
92 FILE* odlfile = fopen(amxc_string_get(filename, 0),
"r");
94 name[strlen(name) - 4] = 0;
95 read = getline(first_line, &len, odlfile);
108 amxc_string_t* filename,
111 const char* name = NULL;
112 const char* expression = NULL;
115 name = basename(ep->d_name);
117 if(strncmp(first_line,
"/*expr:", 7) == 0) {
118 first_line[ strlen(first_line) - 3 ] = 0;
119 expression = first_line + 7;
120 }
else if(strncmp(first_line,
"#expr:", 6) == 0) {
121 first_line[ strlen(first_line) - 3 ] = 0;
122 expression = first_line + 6;
124 if(amxp_expr_init(&expr, expression) == amxp_expr_status_ok) {
128 amxc_string_get(filename, 0));
132 amxp_expr_clean(&expr);
142 FILE* odlfile = NULL;
144 amxc_string_t filename;
146 amxc_string_init(&filename, 128);
151 for(ep = readdir(dp); ep; ep = readdir(dp)) {
152 const char* extension = strstr(ep->d_name,
".odl");
153 if((extension == NULL) || (extension[4] != 0)) {
157 amxc_string_reset(&filename);
158 amxc_string_setf(&filename,
"%s/%s", path, ep->d_name);
160 if(odlfile == NULL) {
174 amxc_string_clean(&filename);
179 amxc_htable_it_t* it) {
189 char* current_wd = getcwd(NULL, 0);
190 char* real_path = NULL;
191 amxc_string_t res_path;
192 amxc_string_init(&res_path, 0);
194 when_null(parser, exit);
195 when_str_empty(path, exit);
197 real_path = realpath(path, NULL);
198 if(real_path != NULL) {
203 amxc_string_clean(&res_path);
212 amxc_string_t res_path;
213 amxc_string_init(&res_path, 0);
215 when_null(parser, exit);
219 when_null(dirs, exit);
220 when_true(amxc_var_type_of(dirs) != AMXC_VAR_ID_LIST, exit);
222 amxc_var_for_each(var_path, dirs) {
223 const char* path = amxc_var_constcast(cstring_t, var_path);
227 if(amxc_string_set_resolved(&res_path, path, &parser->
config) > 0) {
228 path = amxc_string_get(&res_path, 0);
234 amxc_string_reset(&res_path);
238 amxc_string_clean(&res_path);
243 const char* mib_name) {
244 const char* file = NULL;
246 amxc_htable_it_t* it = NULL;
248 when_null(parser, exit);
249 when_str_empty(mib_name, exit);
251 it = amxc_htable_get(&parser->
mibs, mib_name);
252 while(it == NULL && parser->
parent != NULL) {
254 it = amxc_htable_get(&parser->
mibs, mib_name);
257 info = amxc_htable_it_get_data(it,
mib_info_t, hit);
267 const char* mib_name) {
269 amxd_status_t status = amxd_status_ok;
270 amxd_object_t* mib = NULL;
272 when_null(parser, exit);
273 when_str_empty(mib_name, exit);
276 mib = amxd_dm_get_mib(dm, mib_name);
279 amxd_object_t* root = amxd_dm_get_root(dm);
281 when_true(retval != 0, exit);
284 retval = status == amxd_status_ok ? 0 : -1;
292 amxd_object_t*
object,
293 const char* mib_name) {
295 amxd_status_t status = amxd_status_ok;
296 amxd_dm_t* dm = NULL;
298 when_null(parser, exit);
299 when_null(
object, exit);
300 when_str_empty(mib_name, exit);
302 dm = amxd_object_get_dm(
object);
306 when_failed(retval, exit);
308 status = amxd_object_add_mib(
object, mib_name);
309 retval = status == amxd_status_ok ? 0 : -1;
316 amxd_object_t*
object,
320 when_null(parser, exit);
321 when_null(
object, exit);
324 amxc_htable_for_each(it, (&parser->
mibs)) {
325 const char* mib_name = amxc_htable_it_get_key(it);
329 if(fn(
object, &expr)) {
334 amxp_expr_clean(&expr);
342 amxd_object_t*
object,
346 when_null(parser, exit);
347 when_null(
object, exit);
350 amxc_htable_for_each(it, (&parser->
mibs)) {
351 const char* mib_name = amxc_htable_it_get_key(it);
354 if(!amxd_object_has_mib(
object, mib_name)) {
358 if(!fn(
object, &expr)) {
359 if(amxd_object_remove_mib(
object, mib_name) == amxd_status_ok) {
363 amxp_expr_clean(&expr);
371 amxd_object_t*
object,
375 when_null(parser, exit);
376 when_null(
object, exit);
379 amxc_htable_for_each(it, (&parser->
mibs)) {
380 const char* mib_name = amxc_htable_it_get_key(it);
384 if(fn(
object, &expr)) {
389 if(amxd_object_remove_mib(
object, mib_name) == amxd_status_ok) {
393 amxp_expr_clean(&expr);
bool(* amxo_evaluate_expr_fn_t)(amxd_object_t *object, amxp_expr_t *expr)
struct _mib_info mib_info_t
static bool amxo_parser_build_mib_info(amxo_parser_t *parser, struct dirent *ep, amxc_string_t *filename, char *first_line)
static void amxo_parser_add_mib_info(amxc_htable_t *mibs, const char *name, const char *expression, const char *file)
static int amxo_parser_scan(amxo_parser_t *parser, const char *path)
void amxo_parser_del_mib_info(UNUSED const char *key, amxc_htable_it_t *it)
static FILE * amxo_parser_open_mib_file(char *name, amxc_string_t *filename, char **first_line)
amxc_var_t * amxo_parser_get_config(amxo_parser_t *parser, const char *path)
Gets a configuration option.
int amxo_parser_remove_mibs(amxo_parser_t *parser, amxd_object_t *object, amxo_evaluate_expr_fn_t fn)
Removes zero, one or more MIBs from a data model object.
int amxo_parser_scan_mib_dir(amxo_parser_t *parser, const char *path)
Scans a directory for MIB odl files.
int amxo_parser_scan_mib_dirs(amxo_parser_t *parser, amxc_var_t *dirs)
Scans multiple directories for MIB odl files.
const char * amxo_parser_get_mib_file(amxo_parser_t *parser, const char *mib_name)
Get full path and file name of odl file describing a mib.
int amxo_parser_apply_mibs(amxo_parser_t *parser, amxd_object_t *object, amxo_evaluate_expr_fn_t fn)
Applies zero, one or more MIBs to a data model object.
int amxo_parser_apply_mib(amxo_parser_t *parser, amxd_object_t *object, const char *mib_name)
Unconditionally applies a MIB to a data model object.
int amxo_parser_load_mib(amxo_parser_t *parser, amxd_dm_t *dm, const char *mib_name)
Loads the mib definition.
int amxo_parser_add_mibs(amxo_parser_t *parser, amxd_object_t *object, amxo_evaluate_expr_fn_t fn)
Adds zero, one or more MIBs to a data model object.
int amxo_parser_parse_file(amxo_parser_t *parser, const char *file_path, amxd_object_t *object)
Parses an odl file.
The ODL parser structure.