/** * config_alloc - allocate a new configuration * @name: name of the config * * This function creates new &config structure, attaches a resource * pool and a linear memory pool to it and makes it available for * further use. Returns a pointer to the structure. */ struct config * config_alloc(byte *name) { pool *p = rp_new(&root_pool, "Config"); linpool *l = lp_new(p, 4080); struct config *c = lp_allocz(l, sizeof(struct config)); c->mrtdump_file = -1; /* Hack, this should be sysdep-specific */ c->pool = p; cfg_mem = c->mem = l; c->file_name = cfg_strdup(name); c->load_time = now; c->tf_base.fmt1 = c->tf_log.fmt1 = "%d-%m-%Y %T"; return c; }
/* * Public * * Extract a scalar as a string */ char *cfg_get_string(const struct cfg *self, const char *name, enum cfg_status *status) { char *str=NULL; const struct cfg_field *field=NULL; field = cfg_find(self, name, status); if (*status==CFG_SUCCESS) { if (CFG_TYPE_SCALAR != CFG_FIELD_TYPE(field)) { *status = CFG_TYPE_ERROR; } else { if (0==CFG_FIELD_ARR_SIZE(field)) { *status = CFG_EMPTY; } else { str = cfg_strdup( CFG_FIELD_GET_DATA(field, 0) ); } } } return str; }
/** * config_alloc - allocate a new configuration * @name: name of the config * * This function creates new &config structure, attaches a resource * pool and a linear memory pool to it and makes it available for * further use. Returns a pointer to the structure. */ struct config * config_alloc(byte *name) { pool *p = rp_new(&root_pool, "Config"); linpool *l = lp_new(p, 4080); struct config *c = lp_allocz(l, sizeof(struct config)); c->mrtdump_file = -1; /* Hack, this should be sysdep-specific */ c->pool = p; cfg_mem = c->mem = l; c->file_name = cfg_strdup(name); c->load_time = now; c->tf_route = c->tf_proto = (struct timeformat){"%T", "%F", 20*3600}; c->tf_base = c->tf_log = (struct timeformat){"%F %T", NULL, 0}; return c; } /** * config_parse - parse a configuration * @c: configuration * * config_parse() reads input by calling a hook function pointed to * by @cf_read_hook and parses it according to the configuration * grammar. It also calls all the preconfig and postconfig hooks * before, resp. after parsing. * * Result: 1 if the config has been parsed successfully, 0 if any * error has occurred (such as anybody calling cf_error()) and * the @err_msg field has been set to the error message. */ int config_parse(struct config *c) { DBG("Parsing configuration file `%s'\n", c->file_name); new_config = c; cfg_mem = c->mem; if (setjmp(conf_jmpbuf)) return 0; cf_lex_init(0, c); sysdep_preconfig(c); protos_preconfig(c); rt_preconfig(c); roa_preconfig(c); cf_parse(); protos_postconfig(c); if (EMPTY_LIST(c->protos)) cf_error("No protocol is specified in the config file"); #ifdef IPV6 if (!c->router_id) cf_error("Router ID must be configured manually on IPv6 routers"); #endif return 1; } /** * cli_parse - parse a CLI command * @c: temporary config structure * * cli_parse() is similar to config_parse(), but instead of a configuration, * it parses a CLI command. See the CLI module for more information. */ int cli_parse(struct config *c) { new_config = c; c->sym_fallback = config->sym_hash; cfg_mem = c->mem; if (setjmp(conf_jmpbuf)) return 0; cf_lex_init(1, c); cf_parse(); return 1; }