- eof = 0;
- state = 0;
- w = NULL;
- lno = 0;
- do {
- if(fgets(line, sizeof(line), s) == NULL) {
- eof = 1;
- line[0] = 0;
- }
- lno++;
- for(p = line; *p; p++) {
- if(*p == '#')
- continue;
- if(!isspace(*p))
- break;
- }
- ind = isspace(line[0]);
- w = tokenize(line);
- argc = calen(w);
-
- retry:
- if(state == 0) {
- if(ind) {
- flog(LOG_WARNING, "%s%i: unexpected line indentation in global scope", path, lno);
- goto next;
- } else {
- if(!w[0]) {
- } else if(!strcmp(w[0], "child")) {
- if(argc < 2) {
- flog(LOG_WARNING, "%s:%i: missing name in child declaration", path, lno);
- goto next;
- }
- child = newchild(w[1], CH_SOCKET);
- state = 1;
- } else if(!strcmp(w[0], "fchild")) {
- if(argc < 2) {
- flog(LOG_WARNING, "%s:%i: missing name in child declaration", path, lno);
- goto next;
- }
- child = newchild(w[1], CH_FORK);
- state = 1;
- } else if(!strcmp(w[0], "match")) {
- pat = newpattern();
- state = 2;
- } else {
- flog(LOG_WARNING, "%s:%i: unknown directive %s", path, lno, w[0]);
- }
- }
- } else if(state == 1) {
- if(ind) {
- if(!w[0]) {
- } else if(!strcmp(w[0], "exec")) {
- if(argc < 2) {
- flog(LOG_WARNING, "%s:%i: too few parameters to `exec'", path, lno);
- goto next;
- }
- child->argv = szmalloc(sizeof(*child->argv) * argc);
- for(i = 0; i < argc - 1; i++)
- child->argv[i] = sstrdup(w[i + 1]);
- } else {
- flog(LOG_WARNING, "%s:%i: unknown directive %s", path, lno, w[0]);
- }
- } else {
- state = 0;
- if(child->argv == NULL) {
- flog(LOG_WARNING, "%s:%i: missing `exec' in child declaration %s", path, lno, child->name);
- freechild(child);
- goto retry;
- }
- child->next = cf->children;
- cf->children = child;
- goto retry;
- }
- } else if(state == 2) {
- if(ind) {
- if(!w[0]) {
- } else if(!strcmp(w[0], "filename")) {
- if(argc < 2) {
- flog(LOG_WARNING, "%s:%i: missing pattern for `filename' match", path, lno);
- goto next;
- }
- rule = newrule(pat);
- rule->type = PAT_BASENAME;
- rule->pattern = sstrdup(w[1]);
- } else if(!strcmp(w[0], "pathname")) {
- if(argc < 2) {
- flog(LOG_WARNING, "%s:%i: missing pattern for `pathname' match", path, lno);
- goto next;
- }
- rule = newrule(pat);
- rule->type = PAT_PATHNAME;
- rule->pattern = sstrdup(w[1]);
- } else if(!strcmp(w[0], "all")) {
- newrule(pat)->type = PAT_ALL;
- } else if(!strcmp(w[0], "default")) {
- newrule(pat)->type = PAT_DEFAULT;
- } else if(!strcmp(w[0], "handler")) {
- if(argc < 2) {
- flog(LOG_WARNING, "%s:%i: missing child name for `handler' directive", path, lno);
- goto next;
- }
- if(pat->childnm != NULL)
- free(pat->childnm);
- pat->childnm = sstrdup(w[1]);
- } else {
- flog(LOG_WARNING, "%s:%i: unknown directive %s", path, lno, w[0]);
- }
- } else {
- state = 0;
- if(pat->rules[0] == NULL) {
- flog(LOG_WARNING, "%s:%i: missing rules in match declaration", path, lno);
- freepattern(pat);
- goto retry;
- }
- if(pat->childnm == NULL) {
- flog(LOG_WARNING, "%s:%i: missing handler in match declaration", path, lno);
- freepattern(pat);
- goto retry;
- }
- pat->next = cf->patterns;
- cf->patterns = pat;
- goto retry;
- }