protect ucimap.h against multiple inclusions
[project/uci.git] / util.c
diff --git a/util.c b/util.c
index 177bd1408d3fa24ce4a33b38917644b9e6bfa632..f0b2094810bcd8c75cb6097b62a76dbaabbc45da 100644 (file)
--- a/util.c
+++ b/util.c
@@ -23,6 +23,7 @@
 #include <unistd.h>
 #include <ctype.h>
 #include <fcntl.h>
+#include <errno.h>
 
 #define LINEBUF        32
 #define LINEBUF_MAX    4096
@@ -86,7 +87,7 @@ __plugin bool uci_validate_str(const char *str, bool name)
                return false;
 
        while (*str) {
-               char c = *str;
+               unsigned char c = *str;
                if (!isalnum(c) && c != '_') {
                        if (name || (c < 33) || (c > 126))
                                return false;
@@ -96,6 +97,16 @@ __plugin bool uci_validate_str(const char *str, bool name)
        return true;
 }
 
+static inline bool uci_validate_package(const char *str)
+{
+       return uci_validate_str(str, false);
+}
+
+static inline bool uci_validate_type(const char *str)
+{
+       return uci_validate_str(str, false);
+}
+
 static inline bool uci_validate_name(const char *str)
 {
        return uci_validate_str(str, true);
@@ -104,8 +115,9 @@ static inline bool uci_validate_name(const char *str)
 bool uci_validate_text(const char *str)
 {
        while (*str) {
-               if ((*str == '\r') || (*str == '\n') ||
-                       ((*str < 32) && (*str != '\t')))
+               unsigned char c = *str;
+               if ((c == '\r') || (c == '\n') ||
+                       ((c < 32) && (c != '\t')))
                        return false;
                str++;
        }
@@ -159,7 +171,7 @@ int uci_parse_ptr(struct uci_context *ctx, struct uci_ptr *ptr, char *str)
                goto error;
 
 lastval:
-       if (ptr->package && !uci_validate_str(ptr->package, false))
+       if (ptr->package && !uci_validate_package(ptr->package))
                goto error;
        if (ptr->section && !uci_validate_name(ptr->section))
                ptr->flags |= UCI_LOOKUP_EXTENDED;
@@ -442,7 +454,8 @@ static FILE *uci_open_stream(struct uci_context *ctx, const char *filename, int
        if (fd < 0)
                goto error;
 
-       if (flock(fd, (write ? LOCK_EX : LOCK_SH)) < 0)
+       ret = flock(fd, (write ? LOCK_EX : LOCK_SH));
+       if ((ret < 0) && (errno != ENOSYS))
                goto error;
 
        ret = lseek(fd, 0, pos);
@@ -467,6 +480,7 @@ static void uci_close_stream(FILE *stream)
        if (!stream)
                return;
 
+       fflush(stream);
        fd = fileno(stream);
        flock(fd, LOCK_UN);
        fclose(stream);