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