On Aug. 06, 2009, 21:40 +0300, Steve Dickson <SteveD@xxxxxxxxxx> wrote: <snip> > +/* > + * Parse the line LINE of SZ bytes. Skip Comments, recognize section > + * headers and feed tag-value pairs into our configuration database. > + */ > +static void > +conf_parse_line(int trans, char *line, size_t sz) > +{ > + char *val; > + size_t i; > + int j; > + static char *section = 0; > + static int ln = 0; > + > + /* Lines starting with '#' or ';' are comments. */ > + ln++; > + if (*line == '#' || *line == ';') > + return; > + > + /* '[section]' parsing... */ > + if (*line == '[') { > + for (i = 1; i < sz; i++) > + if (line[i] == ']') > + break; > + if (section) > + free (section); > + if (i == sz) { > + xlog_warn("conf_parse_line: %d:" > + "non-matched ']', ignoring until next section", ln); > + section = 0; > + return; > + } > + section = malloc(i); > + if (!section) { > + xlog_warn("conf_parse_line: %d: malloc (%lu) failed", ln, > + (unsigned long)i); > + return; > + } > + strlcpy(section, line + 1, i); > + return; > + } > + > + /* Deal with assignments. */ > + for (i = 0; i < sz; i++) { > + if (line[i] == '=') { > + /* If no section, we are ignoring the lines. */ > + if (!section) { > + xlog_warn("conf_parse_line: %d: ignoring line due to no section", > + ln); > + return; > + } > + line[strcspn (line, " \t=")] = '\0'; > + val = line + i + 1 + strspn (line + i + 1, " \t"); > + /* Skip trailing whitespace, if any */ > + for (j = sz - (val - line) - 1; j > 0 && isspace(val[j]); j--) > + val[j] = '\0'; Should we break on the first non space? This will allow spaces in the value... Should we skip trailing comments as well (';' in particular)? I.e.: /* Skip trailing comments, if any */ for (j = 0; j < sz - (val - line); j++) { if (val[j] == '#' || val[j] == ';') { val[j] = '\0'; break; } } /* Skip trailing whitespace, if any */ for (j--; j > 0; j--) { if (isspace(val[j])) val[j] = '\0'; else break; } Benny > + /* XXX Perhaps should we not ignore errors? */ > + conf_set(trans, section, line, val, 0, 0); > + return; > + } > + } > + /* Other non-empty lines are weird. */ > + i = strspn(line, " \t"); > + if (line[i]) > + xlog_warn("conf_parse_line: %d: syntax error", ln); > + > + return; > +} > + -- To unsubscribe from this list: send the line "unsubscribe linux-nfs" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html