X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=lib%2Fcf.c;h=719fcad9ba162130119b4c0e3d0d32bdce96982b;hb=13975be5892675874bea8c86d7d8140f5790e7e6;hp=82e5fba56d14e931563743f7534ee25bcbaf196f;hpb=b390f906b00859da9cf7c0ec7e0ca034010e5fce;p=ashd.git diff --git a/lib/cf.c b/lib/cf.c index 82e5fba..719fcad 100644 --- a/lib/cf.c +++ b/lib/cf.c @@ -22,6 +22,7 @@ #include #include #include +#include #include #ifdef HAVE_CONFIG_H @@ -36,15 +37,52 @@ #define CH_SOCKET 0 #define CH_FORK 1 -static int parsefile(struct cfstate *s, FILE *in) +static int parsefile(struct cfstate *s, FILE *in); + +static int doinclude(struct cfstate *s, char *spec) { - int i, o, ret; + int rv, i; + FILE *inc; glob_t globm; + char *fbk, *dir, *fspec; + + rv = 0; + fbk = s->file; + if(spec[0] == '/') { + fspec = spec; + } else { + dir = sstrdup(fbk); + fspec = sprintf3("%s/%s", dirname(dir), spec); + free(dir); + } + if(glob(fspec, 0, NULL, &globm)) + return(0); + for(i = 0; i < globm.gl_pathc; i++) { + if((inc = fopen(globm.gl_pathv[i], "r")) != NULL) { + s->file = globm.gl_pathv[i]; + if(parsefile(s, inc)) { + fclose(inc); + rv = 1; + goto out; + } + fclose(inc); + inc = NULL; + } + } + +out: + globfree(&globm); + s->file = fbk; + return(rv); +} + +static int parsefile(struct cfstate *s, FILE *in) +{ + int i; char line[1024]; int eof, argc; int ind, indst[80], indl; - char *p, **w, *fbk; - FILE *inc; + char *p, **w; s->lno = 0; indst[indl = 0] = 0; @@ -55,11 +93,13 @@ static int parsefile(struct cfstate *s, FILE *in) line[0] = 0; } s->lno++; - for(p = line + strlen(line) - 1; p >= line; p--) { - if(isspace(*p)) - *p = 0; - else - break; + if(line[0]) { + for(p = line + strlen(line) - 1; p >= line; p--) { + if(isspace(*p)) + *p = 0; + else + break; + } } for(ind = 0, p = line; *p; p++) { if(*p == ' ') { @@ -114,26 +154,13 @@ static int parsefile(struct cfstate *s, FILE *in) if(indl == 0) { if(!strcmp(w[0], "include")) { - fbk = s->file; for(i = 1; i < argc; i++) { - if((ret = glob(w[i], 0, NULL, &globm)) == 0) { - for(o = 0; o < globm.gl_pathc; o++) { - if((inc = fopen(globm.gl_pathv[o], "r")) != NULL) { - s->file = globm.gl_pathv[o]; - if(parsefile(s, inc)) { - fclose(inc); - globfree(&globm); - freeca(w); - return(1); - } - fclose(inc); - } - } - globfree(&globm); + if(doinclude(s, w[i])) { + freeca(w); + return(1); } } freeca(w); - s->file = fbk; continue; } } @@ -194,6 +221,27 @@ void freecfparser(struct cfstate *s) free(s); } +char *findstdconf(char *name) +{ + char *path, *p, *p2, *t; + + if((path = getenv("PATH")) == NULL) + return(NULL); + path = sstrdup(path); + for(p = strtok(path, ":"); p != NULL; p = strtok(NULL, ":")) { + if((p2 = strrchr(p, '/')) == NULL) + continue; + *p2 = 0; + if(!access(t = sprintf2("%s/etc/%s", p, name), R_OK)) { + free(path); + return(t); + } + free(t); + } + free(path); + return(NULL); +} + static struct child *newchild(char *name, int type) { struct child *ch;