xref: /original-bsd/usr.sbin/sendmail/src/readcf.c (revision 6c57d260)
1 # include <stdio.h>
2 # include "sendmail.h"
3 # include <ctype.h>
4 
5 static char SccsId[] = "@(#)readcf.c	3.3	03/28/81";
6 
7 /*
8 **  READCF -- read control file.
9 **
10 **	This routine reads the control file and builds the internal
11 **	form.
12 **
13 **	Parameters:
14 **		cfname -- control file name.
15 **
16 **	Returns:
17 **		none.
18 **
19 **	Side Effects:
20 **		Builds several internal tables.
21 */
22 
23 struct rewrite	*RewriteRules;
24 
25 
26 readcf(cfname)
27 	char *cfname;
28 {
29 	FILE *cf;
30 	char buf[MAXLINE];
31 	register char *p;
32 	struct rewrite *rwp = NULL;
33 	extern char *xalloc();
34 	extern char **prescan();
35 	extern char **copyplist();
36 	extern char *rindex();
37 	extern char *newstr();
38 
39 	cf = fopen(cfname, "r");
40 	if (cf == NULL)
41 	{
42 		syserr("cannot open %s", cfname);
43 		exit(EX_OSFILE);
44 	}
45 
46 	while (fgets(buf, sizeof buf, cf) != NULL)
47 	{
48 		p = rindex(buf, '\n');
49 		if (p != NULL)
50 			*p = '\0';
51 
52 		switch (buf[0])
53 		{
54 		  case '\n':
55 		  case '\0':
56 		  case ' ':
57 		  case '\t':
58 		  case '#':		/* comment */
59 			break;
60 
61 		  case 'R':		/* rewriting rule */
62 			for (p = &buf[1]; *p != '\0' && *p != '\t'; p++)
63 				continue;
64 
65 			if (*p == '\0')
66 				syserr("invalid rewrite line \"%s\"", buf);
67 			else
68 			{
69 				if (rwp == NULL)
70 					RewriteRules = rwp = (struct rewrite *) xalloc(sizeof *rwp);
71 				else
72 				{
73 					rwp->r_next = (struct rewrite *) xalloc(sizeof *rwp);
74 					rwp = rwp->r_next;
75 				}
76 				rwp->r_next = NULL;
77 
78 				rwp->r_lhs = prescan(&buf[1], '\t');
79 				if (rwp->r_lhs != NULL)
80 					rwp->r_lhs = copyplist(rwp->r_lhs, TRUE);
81 				while (*p == '\t')
82 					p++;
83 				rwp->r_rhs = prescan(p, '\t');
84 				if (rwp->r_rhs != NULL)
85 					rwp->r_rhs = copyplist(rwp->r_rhs, TRUE);
86 			}
87 			break;
88 
89 		  case 'D':		/* macro definition */
90 			define(buf[1], newstr(&buf[2]));
91 			break;
92 
93 		  case 'H':		/* required header line */
94 			chompheader(&buf[1], TRUE);
95 			break;
96 
97 		  default:
98 			syserr("unknown control line \"%s\"", buf);
99 		}
100 	}
101 
102 /*
103 	printrules();
104 */
105 }
106 /*
107 **  RWCRACK -- crack rewrite line.
108 **
109 **	Parameters:
110 **		l -- line to crack.
111 **
112 **	Returns:
113 **		local copy of cracked line.
114 **
115 **	Side Effects:
116 **		none.
117 */
118 
119 char **
120 rwcrack(l)
121 	register char *l;
122 {
123 	char *av[MAXATOM];
124 	int ac = 0;
125 	register char **avp;
126 	char buf[MAXNAME];
127 	register char *b;
128 	bool wasdelim = FALSE;
129 	char *delims = ":@!^.";
130 	extern char *index();
131 	bool tchange;
132 	extern char *newstr(), *xalloc();
133 
134 	for (avp = av; *l != '\0' && *l != '\n'; avp++)
135 	{
136 		b = buf;
137 		tchange = FALSE;
138 		while (!tchange)
139 		{
140 			if (*l != '$')
141 			{
142 				if (wasdelim || index(delims, *l) != NULL)
143 					tchange = TRUE;
144 				wasdelim = (index(delims, *l) != NULL);
145 				if (wasdelim)
146 					tchange = TRUE;
147 				*b++ = *l++;
148 				continue;
149 			}
150 
151 			tchange = TRUE;
152 			switch (*++l)
153 			{
154 			  case '$':		/* literal $ */
155 				*b++ = *l;
156 				break;
157 
158 			  case '+':		/* match anything */
159 				*b++ = MATCHANY;
160 				*b++ = *++l;
161 				break;
162 
163 			  case '-':		/* match one token */
164 				*b++ = MATCHONE;
165 				*b++ = *++l;
166 				break;
167 
168 			  case '#':		/* canonical net name */
169 				*b++ = CANONNET;
170 				break;
171 
172 			  case '@':		/* canonical host name */
173 				*b++ = CANONHOST;
174 				break;
175 
176 			  case ':':		/* canonical user name */
177 				*b++ = CANONUSER;
178 				break;
179 
180 			  default:
181 				*b++ = '$';
182 				l--;
183 				break;
184 			}
185 			l++;
186 		}
187 
188 		/* save the argument we have collected */
189 		*b = '\0';
190 		*avp = newstr(buf);
191 		ac++;
192 	}
193 
194 	/* allocate new space for vector */
195 	ac++;
196 	*avp = NULL;
197 	avp = (char **) xalloc(ac * sizeof *av);
198 	bmove(av, avp, ac * sizeof *av);
199 
200 	return (avp);
201 }
202 /*
203 **  PRINTRULES -- print rewrite rules (for debugging)
204 **
205 **	Parameters:
206 **		none.
207 **
208 **	Returns:
209 **		none.
210 **
211 **	Side Effects:
212 **		prints rewrite rules.
213 */
214 
215 printrules()
216 {
217 	register struct rewrite *rwp;
218 
219 	for (rwp = RewriteRules; rwp != NULL; rwp = rwp->r_next)
220 	{
221 		register char **av;
222 
223 		printf("\n");
224 		for (av = rwp->r_lhs; *av != NULL; av++)
225 		{
226 			xputs(*av);
227 			putchar('_');
228 		}
229 		printf("\n\t");
230 		for (av = rwp->r_rhs; *av != NULL; av++)
231 		{
232 			xputs(*av);
233 			putchar('_');
234 		}
235 		printf("\n");
236 	}
237 }
238