From a756e349cf57ac9468161439a1452490dc009c94 Mon Sep 17 00:00:00 2001 From: Fredrik Tolf Date: Sun, 5 Sep 2010 06:04:36 +0200 Subject: [PATCH] dirplex: Merge children with identical names when reloading configuration. --- src/dirplex/conf.c | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/src/dirplex/conf.c b/src/dirplex/conf.c index 96a7704..ffa4313 100644 --- a/src/dirplex/conf.c +++ b/src/dirplex/conf.c @@ -240,9 +240,24 @@ struct config *readconfig(char *file) 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; @@ -251,15 +266,14 @@ struct config *getconfig(char *path) 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; @@ -268,6 +282,10 @@ struct config *getconfig(char *path) return(NULL); mtime = sb.st_mtime; } + if(ocf != NULL) { + mergechildren(cf, ocf); + freeconfig(ocf); + } cf->path = sstrdup(path); cf->mtime = mtime; cf->lastck = now; -- 2.11.0