/* * Split up the line into <variable> <value> pairs */ static void parse_default(config_type_t type, struct configinfo *list, char *argvec[], int argcount, struct confvar *defaults) { if (debug & D_CONFIG) logmsg(LOG_DEBUG, "parse_default: argc %d\n", argcount); while (argcount >= 2) { parse_var_value(type, list, argvec[0], argvec[1], defaults); argcount -= 2; argvec += 2; } if (argcount != 0) conferr("Trailing text <%s> ignored\n", argvec[0]); }
/* * Returns true if ok; otherwise false. */ static void parse_if(struct configinfo *list, char *argvec[], int argcount) { char *ifname; struct phyint *pi; char save[sizeof (pi->pi_config)]; if (debug & D_CONFIG) logmsg(LOG_DEBUG, "parse_if: argc %d\n", argcount); if (argcount < 1) { conferr("Missing interface name\n"); return; } ifname = argvec[0]; argvec++; argcount--; pi = phyint_lookup(ifname); if (pi == NULL) { /* * Create the physical interface structure. * Note, phyint_create() sets the interface * defaults in pi_config. */ pi = phyint_create(ifname); if (pi == NULL) { conferr("Unable to use interface %s\n", ifname); return; } } (void) memcpy(save, pi->pi_config, sizeof (save)); while (argcount >= 2) { parse_var_value(CONFIG_IF, list, argvec[0], argvec[1], pi->pi_config); argcount -= 2; argvec += 2; } if (argcount != 0) logmsg(LOG_ERR, "Trailing text <%s> ignored\n", argvec[0]); check_if_var_consistency(pi->pi_config, save, sizeof (save)); }
static void parse_prefix(struct configinfo *list, char *argvec[], int argcount) { char *ifname, *prefix; struct phyint *pi; struct adv_prefix *adv_pr; struct in6_addr in6; int prefixlen; char save[sizeof (adv_pr->adv_pr_config)]; if (debug & D_CONFIG) logmsg(LOG_DEBUG, "parse_prefix: argc %d\n", argcount); if (argcount < 2) { conferr("Missing prefix and/or interface name\n"); return; } prefix = argvec[0]; ifname = argvec[1]; argvec += 2; argcount -= 2; prefixlen = parse_addrprefix(prefix, &in6); if (prefixlen == -1) { conferr("Bad prefix %s\n", prefix); return; } pi = phyint_lookup(ifname); if (pi == NULL) { /* * Create the physical interface structure. * Note, phyint_create() sets the interface * defaults in pi_config. */ pi = phyint_create(ifname); if (pi == NULL) { conferr("Unable to use interface %s\n", ifname); return; } } adv_pr = adv_prefix_lookup(pi, in6, prefixlen); if (adv_pr == NULL) { int i; adv_pr = adv_prefix_create(pi, in6, prefixlen); if (adv_pr == NULL) { conferr("Unable to create prefix %s\n", prefix); return; } /* * Copy the defaults from the default array. */ for (i = 0; i < I_PREFIXSIZE; i++) { adv_pr->adv_pr_config[i].cf_value = prefixdefaults[i].cf_value; adv_pr->adv_pr_config[i].cf_notdefault = prefixdefaults[i].cf_notdefault; } } (void) memcpy(save, adv_pr->adv_pr_config, sizeof (save)); while (argcount >= 2) { parse_var_value(CONFIG_PREFIX, list, argvec[0], argvec[1], adv_pr->adv_pr_config); argcount -= 2; argvec += 2; } check_var_consistency(adv_pr->adv_pr_config, save, sizeof (save)); if (argcount != 0) logmsg(LOG_ERR, "Trailing text <%s> ignored\n", argvec[0]); }
/** read the config file * * * * \return -1 if the config file is unavailable */ static int read_config_file(void) { FILE *f = open_savedat("config", "rt"); char config_word[32 + 1]; int err = 0, res = 0, i = 0; char c[2]; if (!f) { INFO1("could not open config file"); return -1; } while (1) { /* skip comments */ if ((res = fscanf(f, " %1[#]", c)) == 1) goto skip_newline; if (res == EOF) break; /* get configuration variable name */ /** \note config variables may be 32 characters of alphas plus dash and underscore */ res = fscanf(f, "%32[a-zA-Z_-]", config_word); /* do we have a match? */ if (res == 1) { for (i = 0; i < (int) ARRAY_LENGTH(config_strings); ++i) { if (strcmp(config_word, config_strings[i].name) == 0) { res = parse_var_value(f, i); if (res != 0 && feof(f)) goto skip_newline; else if (res != 0) { NOTICE2("wrong value type for variable `%s'", config_word); goto skip_newline; } else break; } } /* none matched */ if (i == (int) ARRAY_LENGTH(config_strings)) { NOTICE2("unknown variable in file `%s'", config_word); goto skip_newline; } } else if (res == EOF) break; else { NOTICE1("expected variable name"); goto skip_newline; } skip_newline: if (EOF == skip_past_newline(f)) break; } err = !feof(f); fclose(f); return -err; }