|
|
1.1 ! root 1: #include <ctype.h> ! 2: #include <regexp.h> /* FIXME: use Posix interface. */ ! 3: #include <stdio.h> ! 4: #include <stdlib.h> ! 5: #include <string.h> ! 6: #include "conf.h" ! 7: #include "dist.h" ! 8: ! 9: static char * ! 10: gettok(char *tok, char *src) ! 11: { ! 12: while (!isspace(*src)) { ! 13: if (!*src) ! 14: break; ! 15: *tok++ = *src++; ! 16: } ! 17: while (isspace(*src)) ! 18: ++src; ! 19: return src; ! 20: } ! 21: ! 22: /* return the next line of the config file matching the given args. ! 23: and argument can be NULL and will be assumed to match. the return ! 24: value is in a static data area. */ ! 25: struct conf * ! 26: confread(FILE *fp, char *host, char *user, char *file) ! 27: { ! 28: static char confline[MAXLINE]; ! 29: static char confhost[MAXLINE], confuser[MAXLINE], conffile[MAXLINE]; ! 30: char *next; ! 31: static struct conf conf = { confhost, confuser, conffile }; ! 32: int len, flag; ! 33: regexp *re; ! 34: regsubexp match[1]; ! 35: ! 36: for (;;) { ! 37: if (!fgets(confline, MAXLINE, fp)) ! 38: return NULL; ! 39: if (confline[0] == '#') ! 40: continue; ! 41: len = strlen(confline); ! 42: if (confline[len - 1] != '\n') { ! 43: if (feof(fp)) ! 44: eprintf("readconf: incomplete last line!"); ! 45: else ! 46: eprintf("readconf: line too long or embedded NUL!"); ! 47: exit(1); ! 48: } ! 49: next = gettok(confhost, confline); ! 50: next = gettok(confuser, next); ! 51: conf.cmds = gettok(conffile, next); ! 52: if (host) { ! 53: re = regcomp(confhost); ! 54: flag = regexec(re, host, match, 1); ! 55: free(re); ! 56: if (!flag || match[0].ep - match[0].sp != strlen(host)) ! 57: continue; ! 58: } ! 59: if (user) { ! 60: re = regcomp(confuser); ! 61: flag = regexec(re, user, match, 1); ! 62: free(re); ! 63: if (!flag || match[0].ep - match[0].sp != strlen(user)) ! 64: continue; ! 65: } ! 66: if (file) { ! 67: re = regcomp(conffile); ! 68: flag = regexec(re, file, match, 1); ! 69: free(re); ! 70: if (!flag || match[0].ep - match[0].sp != strlen(file)) ! 71: continue; ! 72: } ! 73: return &conf; ! 74: } ! 75: } ! 76: ! 77: /* call functions associated with the commands in the given string ! 78: return the total of the return values */ ! 79: int ! 80: confexec(char *cmdstr, struct confcmds cmdtab[]) ! 81: { ! 82: char cmd[MAXLINE], arg[MAXLINE]; ! 83: int i, np, ret; ! 84: ! 85: ret = 0; ! 86: while (*cmdstr) { ! 87: for (i = 0; isalnum(*cmdstr); ++cmdstr) ! 88: cmd[i++] = *cmdstr; ! 89: cmd[i] = 0; ! 90: if (*cmdstr == '(') ! 91: for (i = 0, np = 1, ++cmdstr; *cmdstr && np; ++cmdstr) { ! 92: if (*cmdstr == '(') ! 93: ++np; ! 94: if (*cmdstr == ')' && !--np) ! 95: continue; ! 96: arg[i++] = *cmdstr; ! 97: } ! 98: for (i = 0; cmdtab[i].name; ++i) ! 99: if (!strcmp(cmd, cmdtab[i].name)) { ! 100: ret += (*cmdtab[i].func)(arg); ! 101: break; ! 102: } ! 103: while (*cmdstr && !isalnum(*cmdstr)) ! 104: ++cmdstr; ! 105: } ! 106: return ret; ! 107: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.