--- 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);