add ID keywords
[unix-history] / usr / src / usr.sbin / sendmail / src / alias.c
CommitLineData
b3cbe40f
EA
1# include <stdio.h>
2# include <ctype.h>
3# include <pwd.h>
4# include "dlvrmail.h"
5
916b3375
EA
6static char SccsId[] = "@(#)alias.c 1.2 %G%";
7
b3cbe40f
EA
8/*
9** ALIAS -- Compute aliases.
10**
11** Scans the file /usr/lib/mailaliases for a set of aliases.
12** If found, it arranges to deliver to them by inserting the
13** new names onto the SendQ queue.
14**
15** Parameters:
16** none
17**
18** Returns:
19** none
20**
21** Side Effects:
22** Aliases found on SendQ are removed and put onto
23** AliasQ; replacements are added to SendQ. This is
24** done until no such replacement occurs.
25**
26** Defined Constants:
27** MAXRCRSN -- the maximum recursion depth.
28** ALIASFILE -- the pathname of the alias file.
29**
30** Requires:
31** fopen (stdio)
32** fgets (stdio)
33** rewind (stdio)
34** isspace (sys)
35** printf (sys)
36** sendto
37** syserr
38** parse
39** nxtinq
40** sameaddr
41** tkoffq
42** putonq
43** fclose (sys)
44**
45** Called By:
46** main
47**
48** Files:
49** /usr/lib/mailaliases -- the mail aliases.
50**
51** Notes:
52** If NoAlias (the "-n" flag) is set, no aliasing is
53** done.
54**
55** Deficiencies:
56** It should complain about names that are aliased to
57** nothing.
58** It is unsophisticated about line overflows.
59**
60** History:
61** 3/5/80 -- extensive mods to change internal address
62** format.
63** 12/27/79 -- written.
64*/
65
66
67# define ALIASFILE "/usr/lib/mailaliases"
68# define MAXRCRSN 10
69
70
71alias()
72{
73 register addrq *q;
74 FILE *af;
75 char line[MAXLINE+1];
76 register char *p;
77 extern int errno;
78 bool didalias;
79 bool gotmatch;
80 auto addrq al;
81 extern bool sameaddr();
82 extern addrq *parse();
83
84 if (NoAlias)
85 return;
86# ifdef DEBUG
87 if (Debug)
88 printf("--- alias ---\n");
89# endif
90
91 /* open alias file if not already open */
92# ifdef DEBUG
93 if (Debug && (af = fopen("mailaliases", "r")) != NULL)
94 printf(" [using local alias file]\n");
95 else
96# endif
97 if ((af = fopen(ALIASFILE, "r")) == NULL)
98 {
99# ifdef DEBUG
100 if (Debug)
101 printf("Can't open %s\n", ALIASFILE);
102# endif
103 errno = 0;
104 return;
105 }
106
107 /*
108 ** Scan alias file.
109 ** If we find any user that any line matches any user, we
110 ** will send to the line rather than to the user.
111 **
112 ** We pass through the file several times. Didalias tells
113 ** us if we took some alias on this pass through the file;
114 ** when it goes false at the top of the loop we don't have
115 ** to scan any more. Gotmatch tells the same thing, but
116 ** on a line-by-line basis; it is used for processing
117 ** continuation lines.
118 */
119
120 didalias = TRUE;
121 while (didalias)
122 {
123 didalias = FALSE;
124 gotmatch = FALSE;
125 rewind(af);
126 while (fgets(line, sizeof line, af) != NULL)
127 {
128 /* comments begin with `#' */
129 if (line[0] == '#')
130 continue;
131
132 /* check for continuation lines */
133 if (isspace(line[0]))
134 {
135 if (gotmatch)
136 {
137# ifdef DEBUG
138 if (Debug)
139 printf(" ... also aliased to %s", line);
140# endif
141 sendto(line, 1);
142 }
143 continue;
144 }
145 gotmatch = FALSE;
146
147 /*
148 ** Check to see if this pseudonym exists in SendQ.
149 ** Turn the alias into canonical form.
150 ** Then scan SendQ until you do (or do not)
151 ** find that address.
152 */
153
154 /* Get a canonical form for the alias. */
155 for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++)
156 continue;
157 if (*p == '\0' || *p == '\n')
158 {
159 syntaxerr:
160 syserr("Bad alias line `%s'", line);
161 continue;
162 }
163 *p++ = '\0';
164 if (parse(line, &al, -1) == NULL)
165 {
166 *--p = ':';
167 goto syntaxerr;
168 }
169
170 /* Scan SendQ for that canonical form. */
171 for (q = &SendQ; (q = nxtinq(q)) != NULL; )
172 {
173 if (sameaddr(&al, q, TRUE))
174 break;
175 }
176 if (q != NULL)
177 {
178 /*
179 ** Match on Alias.
180 ** Deliver to the target list.
181 ** Remove the alias from the send queue
182 ** and put it on the Alias queue.
183 */
184
185# ifdef DEBUG
186 if (Debug)
187 printf("%s (%s, %s) aliased to %s (%s,%s,%s)\n",
188 q->q_paddr, q->q_host, q->q_user,
189 p, al.q_paddr, al.q_host, al.q_user);
190# endif
191 tkoffq(q, &SendQ);
192 putonq(q, &AliasQ);
193 didalias++;
194 gotmatch++;
195 sendto(p, 1);
196 }
197 }
198 }
199 fclose(af);
200}
201\f/*
202** FORWARD -- Try to forward mail
203**
204** This is similar but not identical to aliasing.
205**
206** Currently it is undefined, until the protocol for userinfo
207** databases is finalized.
208**
209** Parameters:
210** user -- the name of the user who's mail we
211** would like to forward to.
212**
213** Returns:
214** TRUE -- we have forwarded it somewhere.
215** FALSE -- not forwarded; go ahead & deliver.
216**
217** Side Effects:
218** New names are added to SendQ.
219**
220** Requires:
221** none
222**
223** Called By:
224** recipient
225**
226** History:
227** 3/5/80 -- return value changed.
228** 1/23/80 -- null version written.
229*/
230
231bool
232forward(user)
233 addrq *user;
234{
235 return (FALSE);
236}