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