freepattern(pat);
}
freeca(cf->index);
+ if(cf->capture != NULL)
+ free(cf->capture);
free(cf);
}
cf->index = NULL;
if(s->argc > 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);
+ continue;
+ }
+ if(cf->capture != NULL)
+ free(cf->capture);
+ cf->capture = sstrdup(s->argv[1]);
} else if(!strcmp(s->argv[0], "eof")) {
break;
} else {
return(cf);
}
+static void mergechildren(struct config *dst, struct config *src)
+{
+ struct child *ch1, *ch2;
+
+ for(ch1 = dst->children; ch1 != NULL; ch1 = ch1->next) {
+ for(ch2 = src->children; ch2 != NULL; ch2 = ch2->next) {
+ if(!strcmp(ch1->name, ch2->name)) {
+ ch1->fd = ch2->fd;
+ ch2->fd = -1;
+ break;
+ }
+ }
+ }
+}
+
struct config *getconfig(char *path)
{
- struct config *cf;
+ struct config *cf, *ocf;
struct stat sb;
char *fn;
time_t mtime;
for(cf = cflist; cf != NULL; cf = cf->next) {
if(!strcmp(cf->path, path)) {
if(now - cf->lastck > 5) {
- if(stat(fn, &sb) || (sb.st_mtime != cf->mtime)) {
- freeconfig(cf);
+ if(stat(fn, &sb) || (sb.st_mtime != cf->mtime))
break;
- }
}
cf->lastck = now;
return(cf);
}
}
+ ocf = cf;
if(access(fn, R_OK) || stat(fn, &sb)) {
cf = emptyconfig();
mtime = 0;
return(NULL);
mtime = sb.st_mtime;
}
+ if(ocf != NULL) {
+ mergechildren(cf, ocf);
+ freeconfig(ocf);
+ }
cf->path = sstrdup(path);
cf->mtime = mtime;
cf->lastck = now;
return(ret = buf.b);
}
-struct child *findchild(char *file, char *name)
+struct child *findchild(char *file, char *name, struct config **cf)
{
int i;
struct config **cfs;
cfs = getconfigs(file);
for(i = 0; cfs[i] != NULL; i++) {
- if((ch = getchild(cfs[i], name)) != NULL)
- break;
+ if((ch = getchild(cfs[i], name)) != NULL) {
+ if(cf != NULL)
+ *cf = cfs[i];
+ return(ch);
+ }
}
- return(ch);
+ return(NULL);
}
struct pattern *findmatch(char *file, int trydefault, int dir)