From: Fredrik Tolf Date: Sat, 15 Jan 2011 04:11:33 +0000 (+0100) Subject: dirplex: Added directory-locality to matches. X-Git-Tag: 0.5~4 X-Git-Url: http://www.dolda2000.com/gitweb/?p=ashd.git;a=commitdiff_plain;h=7711283ce85263a4177b9d27762fd5a4bc5cee41 dirplex: Added directory-locality to matches. --- diff --git a/doc/dirplex.doc b/doc/dirplex.doc index cc243e0..8798235 100644 --- a/doc/dirplex.doc +++ b/doc/dirplex.doc @@ -219,6 +219,12 @@ The following rules are recognized: Matches if and only if no *match* stanza without a *default* rule has matched. +*local*:: + + Valid only in `.htrc` files, *local* matches if an only if the + file under consideration resides in the same directory as the + containing `.htrc` file. + In addition to the rules, a *match* stanza must contain exactly one follow-up line specifying the action to take if it matches. The following actions are recognized: diff --git a/src/dirplex/conf.c b/src/dirplex/conf.c index e83d847..8494050 100644 --- a/src/dirplex/conf.c +++ b/src/dirplex/conf.c @@ -164,6 +164,8 @@ static struct pattern *parsepattern(struct cfstate *s) newrule(pat)->type = PAT_ALL; } else if(!strcmp(s->argv[0], "default")) { newrule(pat)->type = PAT_DEFAULT; + } else if(!strcmp(s->argv[0], "local")) { + newrule(pat)->type = PAT_LOCAL; } else if(!strcmp(s->argv[0], "handler")) { if(s->argc < 2) { flog(LOG_WARNING, "%s:%i: missing child name for `handler' directive", s->file, s->lno); @@ -363,6 +365,7 @@ struct pattern *findmatch(char *file, int trydefault, int dir) struct config **cfs; struct pattern *pat; struct rule *rule; + size_t pl; if((bn = strrchr(file, '/')) != NULL) bn++; @@ -394,6 +397,12 @@ struct pattern *findmatch(char *file, int trydefault, int dir) } else if(rule->type == PAT_DEFAULT) { 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, '/'))) + break; } } if(!rule) diff --git a/src/dirplex/dirplex.h b/src/dirplex/dirplex.h index 34402e3..028a3d9 100644 --- a/src/dirplex/dirplex.h +++ b/src/dirplex/dirplex.h @@ -5,6 +5,7 @@ #define PAT_PATHNAME 1 #define PAT_ALL 2 #define PAT_DEFAULT 3 +#define PAT_LOCAL 4 #define PT_FILE 0 #define PT_DIR 1