int ConfigImpl::do_load(fstream& in_stream) { int rv = 0; char c = 0; int limit = 0; _lr = new LineReader(in_stream); while (((limit = _lr->readline()) >= 0) &&(rv == 0)) { c = _lr->_linebuf[0]; switch(c) { case '[': rv = parse_section_line(); break; case '#': case '!': rv =parse_comment_line(); break; default: rv = parse_normal_line(); break; } } delete _lr; _lr = NULL; return rv; }
int config_read(char *name, struct config *cfg) { enum config_section current_section = UNKNOWN_SECTION; enum parser_result parser_res; FILE *fp; char buf[1024], *line, *c, *option, *value; int current_port, line_num; fp = 0 == strncmp(name, "-", 2) ? stdin : fopen(name, "r"); if (!fp) { fprintf(stderr, "failed to open configuration file %s: %m\n", name); return -1; } for (line_num = 1; fgets(buf, sizeof(buf), fp); line_num++) { c = buf; /* skip whitespace characters */ while (isspace(*c)) c++; /* ignore empty lines and comments */ if (*c == '#' || *c == '\n' || *c == '\0') continue; line = c; /* remove trailing whitespace characters and \n */ c += strlen(line) - 1; while (c > line && (*c == '\n' || isspace(*c))) *c-- = '\0'; if (parse_section_line(line, ¤t_section) == PARSED_OK) { if (current_section == PORT_SECTION) { char port[17]; if (1 != sscanf(line, " %16s", port)) { fprintf(stderr, "could not parse port name on line %d\n", line_num); goto parse_error; } current_port = config_create_interface(port, cfg); if (current_port < 0) goto parse_error; } continue; } switch (current_section) { case GLOBAL_SECTION: case PORT_SECTION: if (parse_setting_line(line, &option, &value)) { fprintf(stderr, "could not parse line %d in %s section\n", line_num, current_section == GLOBAL_SECTION ? "global" : cfg->iface[current_port].name); goto parse_error; } if (current_section == GLOBAL_SECTION) parser_res = parse_global_setting(option, value, cfg); else parser_res = parse_port_setting(option, value, cfg, current_port); switch (parser_res) { case PARSED_OK: break; case NOT_PARSED: fprintf(stderr, "unknown option %s at line %d in %s section\n", option, line_num, current_section == GLOBAL_SECTION ? "global" : cfg->iface[current_port].name); goto parse_error; case BAD_VALUE: fprintf(stderr, "%s is a bad value for option %s at line %d\n", value, option, line_num); goto parse_error; } break; case UNKNOWN_SECTION: fprintf(stderr, "line %d is not in a section\n", line_num); goto parse_error; default: continue; } } fclose(fp); return 0; parse_error: fprintf(stderr, "failed to parse configuration file %s\n", name); fclose(fp); return -2; }