freeca(cf->index);
if(cf->capture != NULL)
free(cf->capture);
+ if(cf->reparse != NULL)
+ free(cf->reparse);
free(cf);
}
if((s->argc > 1) && !strcmp(s->argv[1], "directory"))
pat->type = PT_DIR;
+ else if((s->argc > 1) && !strcmp(s->argv[1], "notfound"))
+ pat->type = PT_NOTFOUND;
+ else
+ pat->type = PT_FILE;
sl = s->lno;
while(1) {
getcfline(s);
cf->patterns = pat;
} else if(!strcmp(s->argv[0], "index-file")) {
freeca(cf->index);
- cf->index = NULL;
- if(s->argc > 1)
- cf->index = cadup(s->argv + 1);
+ cf->index = cadup(s->argv + 1);
} else if(!strcmp(s->argv[0], "capture")) {
if(s->argc < 2) {
flog(LOG_WARNING, "%s:%i: missing argument to capture declaration", s->file, s->lno);
if(cf->capture != NULL)
free(cf->capture);
cf->capture = sstrdup(s->argv[1]);
+ cf->caproot = 0;
+ if((s->argc > 2) && strchr(s->argv[2], 'D'))
+ cf->caproot = 1;
+ } else if(!strcmp(s->argv[0], "reparse")) {
+ if(s->argc < 2) {
+ flog(LOG_WARNING, "%s:%i: missing argument to reparse declaration", s->file, s->lno);
+ continue;
+ }
+ if(cf->reparse != NULL)
+ free(cf->reparse);
+ cf->reparse = sstrdup(s->argv[1]);
+ cf->parsecomb = 0;
+ if((s->argc > 2) && strchr(s->argv[2], 'c'))
+ cf->parsecomb = 1;
} else if(!strcmp(s->argv[0], "eof")) {
break;
} else {
return(NULL);
}
-struct pattern *findmatch(char *file, int trydefault, int dir)
+struct pattern *findmatch(char *file, int trydefault, int type)
{
int i, o, c;
- char *bn;
+ char *bn, *ln;
struct config **cfs;
struct pattern *pat;
struct rule *rule;
bn = file;
cfs = getconfigs(file);
for(c = 0; cfs[c] != NULL; c++) {
+ if(cfs[c]->path == NULL) {
+ ln = file;
+ } else {
+ pl = strlen(cfs[c]->path);
+ if((strlen(file) > pl) && !strncmp(file, cfs[c]->path, pl) && (file[pl] == '/'))
+ ln = file + pl + 1;
+ else
+ ln = file; /* This should only happen in the base directory. */
+ }
for(pat = cfs[c]->patterns; pat != NULL; pat = pat->next) {
- if(!dir && (pat->type == PT_DIR))
- continue;
- if(dir && (pat->type != PT_DIR))
+ if(pat->type != type)
continue;
for(i = 0; (rule = pat->rules[i]) != NULL; i++) {
if(rule->type == PAT_BASENAME) {
break;
} else if(rule->type == PAT_PATHNAME) {
for(o = 0; rule->patterns[o] != NULL; o++) {
- if(!fnmatch(rule->patterns[o], file, FNM_PATHNAME))
+ if(!fnmatch(rule->patterns[o], ln, FNM_PATHNAME))
break;
}
if(rule->patterns[o] == NULL)
if(!trydefault)
break;
} else if(rule->type == PAT_LOCAL) {
- if(cfs[c]->path == NULL)
- break;
- pl = strlen(cfs[c]->path);
- if(!((strlen(file) > pl) && !strncmp(file, cfs[c]->path, pl) && (file[pl] == '/') && !strchr(file + pl + 1, '/')))
+ if(strchr(ln, '/'))
break;
}
}
}
}
if(!trydefault)
- return(findmatch(file, 1, dir));
+ return(findmatch(file, 1, type));
return(NULL);
}