diff -r 8bf1d9688698 -r fefe4b6f1048 dav/scfg.c --- a/dav/scfg.c Sat Sep 28 09:24:30 2019 +0200 +++ b/dav/scfg.c Sun Sep 29 12:57:13 2019 +0200 @@ -164,6 +164,36 @@ return 0; } +Filter* parse_filter(xmlNode *node) { + UcxList *include = NULL; + UcxList *exclude = NULL; + UcxList *tags = NULL; + + if(scfg_load_filter(node, &include, &exclude, &tags)) { + return NULL; + } + + Filter *filter = malloc(sizeof(Filter)); + filter->include = include; + filter->exclude = exclude; + filter->tags = tags; +} + +void init_default_filter(Filter *filter) { + if(!filter->include) { + regex_t *matchall = malloc(sizeof(regex_t)); + regcomp(matchall, ".*", REG_NOSUB); + filter->include = ucx_list_append(NULL, matchall); + } + /* + if(!filter->exclude) { + regex_t *matchnothing = malloc(sizeof(regex_t)); + regcomp(matchnothing, "///", REG_NOSUB); + filter->exclude = ucx_list_append(NULL, matchnothing); + } + */ +} + static TagFormat str2tagformat(const char *str) { if(!strcmp(str, "text")) { return TAG_FORMAT_TEXT; @@ -250,19 +280,24 @@ } static SplitConfig* parse_split(xmlNode *node) { - char *pattern = NULL; + Filter *filter = NULL; char *minsize = NULL; char *blocksize = NULL; xmlNode *c = node->children; while(c) { - char *value = util_xml_get_text(c); - if(xstreq(c->name, "pattern")) { - pattern = value; + if(xstreq(c->name, "filter")) { + filter = parse_filter(node); + if(filter->tags) { + fprintf(stderr, "splitconfig: tag filter not supported\n"); + free_filter(*filter); + free(filter); + return NULL; + } } else if(xstreq(c->name, "minsize")) { - minsize = value; + minsize = util_xml_get_text(c); } else if(xstreq(c->name, "blocksize")) { - blocksize = value; + blocksize = util_xml_get_text(c); } c = c->next; } @@ -283,8 +318,8 @@ return NULL; } - if(!pattern && !minsize) { - fprintf(stderr, "splitconfig: pattern or minsize must be specified\n"); + if(!filter && !minsize) { + fprintf(stderr, "splitconfig: filter or minsize must be specified\n"); return NULL; } @@ -299,13 +334,8 @@ } SplitConfig *sc = calloc(1, sizeof(SplitConfig)); - if(pattern) { - regex_t *regex = malloc(sizeof(regex_t)); - if (regcomp(regex, pattern, REG_EXTENDED|REG_NOSUB)) { - fprintf(stderr, "Invalid regular expression (%s)\n", pattern); - } else { - sc->pattern = regex; - } + if(filter) { + init_default_filter(filter); } sc->minsize = minsz; sc->blocksize = (size_t)sz; @@ -609,21 +639,10 @@ dir->db_settings |= DB_STORE_OWNER; } - if (include) { - dir->include = include; - } else { - regex_t *matchall = malloc(sizeof(regex_t)); - regcomp(matchall, ".*", REG_NOSUB); - dir->include = ucx_list_append(NULL, matchall); - } - if (exclude) { - dir->exclude = exclude; - } else { - regex_t *matchnothing = malloc(sizeof(regex_t)); - regcomp(matchnothing, "///", REG_NOSUB); - dir->exclude = ucx_list_append(NULL, matchnothing); - } - dir->tagfilter = tagfilter; + dir->filter.include = include; + dir->filter.exclude = exclude; + dir->filter.tags = tagfilter; + init_default_filter(&dir->filter); if (trash && sstrtrim(sstr(trash)).length > 0) { if (trash[0] == '/' || trash[0] == '$') { @@ -856,6 +875,18 @@ return dbname; } +void free_filter(Filter filter) { + UCX_FOREACH(elm, filter.include) { + regfree(elm->data); + free(elm->data); + } + ucx_list_free(filter.include); + UCX_FOREACH(elm, filter.exclude) { + regfree(elm->data); + free(elm->data); + } + ucx_list_free(filter.exclude); +} void free_sync_config() { if(directories) { @@ -874,16 +905,7 @@ free(dir->trash); } - UCX_FOREACH(elm, dir->include) { - regfree(elm->data); - free(elm->data); - } - ucx_list_free(dir->include); - UCX_FOREACH(elm, dir->exclude) { - regfree(elm->data); - free(elm->data); - } - ucx_list_free(dir->exclude); + free_filter(dir->filter); free(dir); }