dav/config.c

changeset 254
d7c4ba50b7d8
parent 252
6b8e287269fc
child 294
dd5c0ebdf54f
--- a/dav/config.c	Mon Nov 14 19:02:40 2016 +0100
+++ b/dav/config.c	Fri Nov 18 13:39:20 2016 +0100
@@ -41,13 +41,17 @@
 #define xstreq(a,b) xmlStrEqual(BAD_CAST a, BAD_CAST b)
 #define xstrEQ(a,b) !xmlStrcasecmp(BAD_CAST a, BAD_CAST b)
 
-#define print_error(...) \
+#define print_error(lineno, ...) \
     do {\
-        fprintf(stderr, "Error (config.xml): " __VA_ARGS__); \
+        fprintf(stderr, "Error (config.xml line %u): ", lineno); \
+        fprintf(stderr, __VA_ARGS__); \
         fprintf(stderr, "Abort.\n"); \
     } while(0);
-#define print_warning(...) \
-    fprintf(stderr, "Warning (config.xml): " __VA_ARGS__);
+#define print_warning(lineno, ...) \
+    do {\
+        fprintf(stderr, "Warning (config.xml line %u): ", lineno); \
+        fprintf(stderr, __VA_ARGS__); \
+    } while(0);
 
 #ifdef _WIN32
 #define ENV_HOME getenv("USERPROFILE")
@@ -182,45 +186,17 @@
     return repo;
 }
 
-int load_repository(xmlNode *reponode) {
-    Repository *repo = repository_new();
-    {
-        xmlNode *node = reponode->children;
-        int ret = 0;
-        while(node && !ret) {
-            if(node->type == XML_ELEMENT_NODE) {
-                char *name = (char*)node->name;
-                char *value = util_xml_get_text(node);
-                ret = repo_add_config(repo, name, value);
-            }
-            node = node->next;
-        }
-        if(ret) {
-            free(repo);
-            return 1;
-        }
-    }
-    
-    if(!repo->name) {
-        print_error("missing name for repository.\n");
-        return 1;
-    }
-    if(!repo->url) {
-        print_error("missing url for repository '%s'.\n", repo->name);
-        return 1;
-    }
-    
-    ucx_map_cstr_put(repos, repo->name, repo);
-    return 0;
-}
+static int repo_add_config(Repository *repo, const xmlNode* node) {
+    unsigned short lineno = node->line;
+    char *key = (char*)node->name;
+    char *value = util_xml_get_text(node);
 
-int repo_add_config(Repository *repo, char *key, char *value) {
     /* every key needs a value */
     if(!value) {
         /* TODO: maybe this should only be reported, if the key is valid
          * But this makes the code very ugly.
          */
-        print_error("missing value for config element: %s\n", key);
+        print_error(lineno, "missing value for config element: %s\n", key);
         return 1;
     }
     
@@ -279,7 +255,7 @@
 #endif
 #endif
         else {
-            print_warning("unknown ssl version: %s\n", value);
+            print_warning(lineno, "unknown ssl version: %s\n", value);
         }
     } else if(xstreq(key, "authmethods")) {
         repo->authmethods = CURLAUTH_NONE;
@@ -300,19 +276,51 @@
             } else if(xstrEQ(value, "none")) {
                 /* skip */
             } else {
-                print_warning("unknown authentication method: %s\n", value);
+                print_warning(lineno,
+                        "unknown authentication method: %s\n", value);
             }
             meth = strtok(NULL, delims);
         }
         free(meths);
     } else {
-        print_error("unkown repository config element: %s\n", key);
+        print_error(lineno, "unkown repository config element: %s\n", key);
         return 1;
     }
     return 0;
 }
 
-int load_proxy(DavProxy *proxy, xmlNode *proxynode, int type) {
+int load_repository(const xmlNode *reponode) {
+    Repository *repo = repository_new();
+    {
+        xmlNode *node = reponode->children;
+        int ret = 0;
+        while(node && !ret) {
+            if(node->type == XML_ELEMENT_NODE) {
+                ret = repo_add_config(repo, node);
+            }
+            node = node->next;
+        }
+        if(ret) {
+            free(repo);
+            return 1;
+        }
+    }
+    
+    if(!repo->name) {
+        print_error(reponode->line, "missing name for repository.\n");
+        return 1;
+    }
+    if(!repo->url) {
+        print_error(reponode->line,
+                "missing url for repository '%s'.\n", repo->name);
+        return 1;
+    }
+    
+    ucx_map_cstr_put(repos, repo->name, repo);
+    return 0;
+}
+
+int load_proxy(DavProxy *proxy, const xmlNode *proxynode, int type) {
     const char *stype;
     if(type == HTTPS_PROXY) {
         stype = "https";
@@ -321,7 +329,8 @@
     }
     
     if(!proxy) {
-        print_error("no memory reserved for %s proxy.\n", stype);
+        // no xml error - so report this directly via fprintf
+        fprintf(stderr, "no memory reserved for %s proxy.\n", stype);
         return 1;
     }
     
@@ -348,13 +357,14 @@
                     proxy->no_proxy = strdup(value);
                 }
             } else {
-                print_error("invalid element for proxy config: %s\n",
-                        node->name);
+                print_error(node->line,
+                        "invalid element for proxy config: %s\n", node->name);
                 ret = 1;
             }
             if (reportmissingvalue) {
-                print_error("missing value for proxy configuration "
-                        "element '%s'.\n", node->name);
+                print_error(node->line,
+                        "missing value for proxy configuration element: %s\n",
+                        node->name);
                 ret = 1;
             }
         }
@@ -362,14 +372,14 @@
     }
     
     if(!ret && !proxy->url) {
-        print_error("missing url for %s proxy.\n", stype);
+        print_error(proxynode->line, "missing url for %s proxy.\n", stype);
         return 1;
     }
     
     return ret;
 }
 
-int load_key(xmlNode *keynode) {
+int load_key(const xmlNode *keynode) {
     xmlNode *node = keynode->children;
     Key *key = calloc(1, sizeof(Key));
     key->type = KEY_AES256;
@@ -389,7 +399,8 @@
                     key->data = key_data.ptr;
                     key->length = key_data.length;
                 } else {
-                    print_error("cannot get key from file: %s\n", value);
+                    print_error(node->line,
+                            "cannot get key from file: %s\n", value);
                     error = 1;
                 }
             } else if(xstreq(node->name, "type")) {
@@ -398,7 +409,7 @@
                 } else if(!strcmp(value, "aes256")) {
                     key->type = KEY_AES256;
                 } else {
-                    print_error("unknown key type %s\n", value);
+                    print_error(node->line, "unknown key type %s\n", value);
                     error = 1;
                 }
             }
@@ -417,7 +428,7 @@
             expected_length = 32;
         }
         if(key->length < expected_length) {
-            print_error("key %s is too small (%zu < %zu)\n",
+            print_error(keynode->line, "key %s is too small (%zu < %zu)\n",
                     key->name,
                     key->length,
                     expected_length);

mercurial