|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ctype.h> ! 3: # include "dlvrmail.h" ! 4: ! 5: static char SccsId[] = "@(#)newaliases.c 1.2 10/18/80"; ! 6: ! 7: typedef struct { char *dptr; int dsize; } datum; ! 8: char *aliases = ALIASFILE; ! 9: char dirbuf[100]; ! 10: char pagbuf[100]; ! 11: int LineNo; ! 12: char *To; ! 13: int ExitStat; ! 14: int Errors; ! 15: # ifdef DEBUG ! 16: bool Debug; ! 17: # endif DEBUG ! 18: ! 19: main(argc, argv) ! 20: int argc; ! 21: char *argv[]; ! 22: { ! 23: int f; ! 24: char line[BUFSIZ]; ! 25: char line2[MAXLINE]; ! 26: register char *p; ! 27: char *cp, *p2; ! 28: char *rhs; ! 29: int naliases, bytes, longest; ! 30: datum key, content; ! 31: bool skipping; ! 32: addrq al, bl; ! 33: extern char *prescan(); ! 34: extern addrq *parse(); ! 35: bool contin; ! 36: ! 37: # ifdef DEBUG ! 38: if (argc > 1 && strcmp(argv[1], "-T") == 0) ! 39: { ! 40: Debug++; ! 41: argc--; ! 42: argv++; ! 43: } ! 44: # endif DEBUG ! 45: if (argc > 1) ! 46: aliases = argv[1]; ! 47: ! 48: strcpy(dirbuf, aliases); ! 49: strcat(dirbuf, ".dir"); ! 50: strcpy(pagbuf, aliases); ! 51: strcat(pagbuf, ".pag"); ! 52: f = creat(dirbuf, 0666); ! 53: if (f < 0) { ! 54: perror(dirbuf); ! 55: exit(1); ! 56: } ! 57: close(f); ! 58: f = creat(pagbuf, 0666); ! 59: if (f < 0) { ! 60: perror(pagbuf); ! 61: exit(1); ! 62: } ! 63: close(f); ! 64: if (dbminit(aliases) < 0) ! 65: exit(1); ! 66: if (freopen(aliases, "r", stdin) == 0) { ! 67: perror(aliases); ! 68: exit(1); ! 69: } ! 70: ! 71: /* read and interpret lines */ ! 72: LineNo = 0; ! 73: naliases = 0; ! 74: bytes = 0; ! 75: longest = 0; ! 76: skipping = FALSE; ! 77: while (fgets(line, sizeof (line), stdin) != NULL) ! 78: { ! 79: LineNo++; ! 80: switch (line[0]) ! 81: { ! 82: case '#': ! 83: case '\n': ! 84: case '\0': ! 85: skipping = FALSE; ! 86: continue; ! 87: ! 88: case ' ': ! 89: case '\t': ! 90: if (!skipping) ! 91: usrerr("Non-continuation line starts with space"); ! 92: skipping = TRUE; ! 93: continue; ! 94: } ! 95: skipping = FALSE; ! 96: ! 97: /* process the LHS */ ! 98: for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++) ! 99: continue; ! 100: if (*p == '\0' || *p == '\n') ! 101: { ! 102: syntaxerr: ! 103: usrerr("missing colon"); ! 104: continue; ! 105: } ! 106: *p++ = '\0'; ! 107: if (parse(line, &al, 1) == NULL) ! 108: { ! 109: *--p = ':'; ! 110: goto syntaxerr; ! 111: } ! 112: rhs = cp = p; ! 113: contin = FALSE; ! 114: for (;;) ! 115: { ! 116: register char c; ! 117: ! 118: /* do parsing & compression of addresses */ ! 119: c = *p; ! 120: while (c != '\0') ! 121: { ! 122: p2 = p; ! 123: while (*p != '\n' && *p != ',' && *p != '\0') ! 124: p++; ! 125: c = *p; ! 126: *p++ = '\0'; ! 127: if (prescan(p2, cp, &line[sizeof line - 1], ',') == NULL) ! 128: continue; ! 129: contin = FALSE; ! 130: if (parse(cp, &bl, -1) != NULL) ! 131: cp += strlen(cp); ! 132: if (c == ',') ! 133: { ! 134: *cp++ = ','; ! 135: contin = TRUE; ! 136: } ! 137: } ! 138: ! 139: /* see if there should be a continuation line */ ! 140: if (!contin) ! 141: break; ! 142: ! 143: /* read continuation line */ ! 144: if (fgets(line2, sizeof (line2), stdin) == NULL) ! 145: break; ! 146: LineNo++; ! 147: ! 148: if (!isspace(line2[0])) ! 149: usrerr("continuation line missing"); ! 150: ! 151: p = line2; ! 152: } ! 153: if (al.q_mailer != &Mailer[0]) ! 154: { ! 155: usrerr("cannot alias non-local names"); ! 156: continue; ! 157: } ! 158: naliases++; ! 159: key.dsize = strlen(al.q_user) + 1; ! 160: key.dptr = al.q_user; ! 161: content.dsize = strlen(rhs) + 1; ! 162: if (content.dsize > longest) ! 163: longest = content.dsize; ! 164: content.dptr = rhs; ! 165: bytes += key.dsize + content.dsize; ! 166: if (store(key, content), 0) ! 167: /* if (f = store(key, content)) */ ! 168: usrerr("Dbm internal error return %d from store\n", f); ! 169: } ! 170: fprintf(stderr, "%d aliases, %d bytes, longest %d bytes, %d errors\n", ! 171: naliases, bytes, longest, Errors); ! 172: ! 173: exit(ExitStat); ! 174: } ! 175: ! 176: usrerr(fmt, a, b, c, d, e) ! 177: char *fmt; ! 178: { ! 179: Errors++; ! 180: fprintf(stderr, "line %d: ", LineNo); ! 181: fprintf(stderr, fmt, a, b, c, d, e); ! 182: fprintf(stderr, "\n"); ! 183: return (-1); ! 184: } ! 185: ! 186: syserr(fmt, a, b, c, d, e) ! 187: char *fmt; ! 188: { ! 189: return (usrerr(fmt, a, b, c, d, e)); ! 190: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.