X-Git-Url: https://git.decadent.org.uk/gitweb/?p=nfs-utils.git;a=blobdiff_plain;f=support%2Fnfs%2Fconffile.c;h=5015e945691a7c513700c093c0f37b76a2b7532b;hp=b19b73923f7ba8d89e268381ffa96cf4f831ca50;hb=3ce15aeaa66a2f523c6fa92bfe818734bdedfcea;hpb=8414d150cee62ba0554cfd645956a88dba02a7eb diff --git a/support/nfs/conffile.c b/support/nfs/conffile.c index b19b739..5015e94 100644 --- a/support/nfs/conffile.c +++ b/support/nfs/conffile.c @@ -49,7 +49,9 @@ #include "conffile.h" #include "xlog.h" -static void conf_load_defaults (int); +#pragma GCC visibility push(hidden) + +static void conf_load_defaults(void); static int conf_set(int , char *, char *, char *, char *, int , int ); @@ -211,17 +213,14 @@ static void conf_parse_line(int trans, char *line, size_t sz) { char *val, *ptr; - size_t i; - int j; + size_t i, valsize; + size_t j; static char *section = 0; static char *arg = 0; static int ln = 0; /* Lines starting with '#' or ';' are comments. */ ln++; - if (*line == '#' || *line == ';') - return; - /* Ignore blank lines */ if (*line == '\0') return; @@ -230,6 +229,9 @@ conf_parse_line(int trans, char *line, size_t sz) while (isblank(*line)) line++; + if (*line == '#' || *line == ';') + return; + /* '[section]' parsing... */ if (*line == '[') { line++; @@ -244,24 +246,26 @@ conf_parse_line(int trans, char *line, size_t sz) if (section) free(section); if (i == sz) { - xlog_warn("conf_parse_line: %d:" + xlog_warn("config file error: line %d: " "non-matched ']', ignoring until next section", ln); section = 0; return; } /* Strip off any blanks before ']' */ val = line; + j=0; while (*val && !isblank(*val)) val++, j++; if (*val) i = j; - section = malloc(i); + section = malloc(i+1); if (!section) { xlog_warn("conf_parse_line: %d: malloc (%lu) failed", ln, (unsigned long)i); return; } strncpy(section, line, i); + section[i] = '\0'; if (arg) free(arg); @@ -271,10 +275,10 @@ conf_parse_line(int trans, char *line, size_t sz) if (ptr == NULL) return; line = ++ptr; - while (*ptr && *ptr != '"') + while (*ptr && *ptr != '"' && *ptr != ']') ptr++; - if (*ptr == '\0') { - xlog_warn("conf_parse_line: line %d:" + if (*ptr == '\0' || *ptr == ']') { + xlog_warn("config file error: line %d: " "non-matched '\"', ignoring until next section", ln); } else { *ptr = '\0'; @@ -290,15 +294,22 @@ conf_parse_line(int trans, char *line, size_t sz) 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); + xlog_warn("config file error: 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'; + valsize = 0; + while (val[valsize++]); + + /* Skip trailing spaces and comments */ + for (j = 0; j < valsize; j++) { + if (val[j] == '#' || val[j] == ';' || isspace(val[j])) { + val[j] = '\0'; + break; + } + } /* XXX Perhaps should we not ignore errors? */ conf_set(trans, section, arg, line, val, 0, 0); return; @@ -307,7 +318,7 @@ conf_parse_line(int trans, char *line, size_t sz) /* Other non-empty lines are weird. */ i = strspn(line, " \t"); if (line[i]) - xlog_warn("conf_parse_line: %d: syntax error", ln); + xlog_warn("config file error: line %d:", ln); return; } @@ -339,7 +350,7 @@ conf_parse(int trans, char *buf, size_t sz) } static void -conf_load_defaults(int tr) +conf_load_defaults(void) { /* No defaults */ return; @@ -398,7 +409,7 @@ conf_reinit(void) trans = conf_begin(); /* Load default configuration values. */ - conf_load_defaults(trans); + conf_load_defaults(); /* Free potential existing configuration. */ if (conf_addr) {