]> git.decadent.org.uk Git - nfs-utils.git/blobdiff - support/nfs/conffile.c
rpc.idmap: Hide global symbols from libidmap plugins
[nfs-utils.git] / support / nfs / conffile.c
index b19b73923f7ba8d89e268381ffa96cf4f831ca50..5015e945691a7c513700c093c0f37b76a2b7532b 100644 (file)
@@ -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) {