annotate sbr/addrsbr.c @ 0:bce86c4163a3

Initial revision
author kono
date Mon, 18 Apr 2005 23:46:02 +0900
parents
children 441a2190cfae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
bce86c4163a3 Initial revision
kono
parents:
diff changeset
1 /* addrsbr.c - parse addresses 822-style */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
2 #ifndef lint
bce86c4163a3 Initial revision
kono
parents:
diff changeset
3 static char ident[] = "@(#)$Id$";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
4 #endif /* lint */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
5
bce86c4163a3 Initial revision
kono
parents:
diff changeset
6 #include "../h/mh.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
7 #include "../h/addrsbr.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
8 #include "../zotnet/mf.h"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
9 #include <stdio.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
10 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
11 #include <ctype.h>
bce86c4163a3 Initial revision
kono
parents:
diff changeset
12 #endif /* BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
13
bce86c4163a3 Initial revision
kono
parents:
diff changeset
14 /* High level parsing of addresses:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
15
bce86c4163a3 Initial revision
kono
parents:
diff changeset
16 The routines in zotnet/mf/mf.c parse the syntactic representations of
bce86c4163a3 Initial revision
kono
parents:
diff changeset
17 addresses. The routines in sbr/addrsbr.c associate semantics with those
bce86c4163a3 Initial revision
kono
parents:
diff changeset
18 addresses.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
19
bce86c4163a3 Initial revision
kono
parents:
diff changeset
20 If #ifdef BERK is in effect, the routines in mf.c aren't called and only
bce86c4163a3 Initial revision
kono
parents:
diff changeset
21 the most rudimentary syntax parse is done. The parse is not 822-conformant.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
22 This causes problems as there is no semantics associated with the address
bce86c4163a3 Initial revision
kono
parents:
diff changeset
23 at all--it's just a string. (the author of the BERK code disagrees with
bce86c4163a3 Initial revision
kono
parents:
diff changeset
24 the preceding, of course. BERK solves problems for incoming mail
bce86c4163a3 Initial revision
kono
parents:
diff changeset
25 because it will accept damn near any address. BERK was intended to be
bce86c4163a3 Initial revision
kono
parents:
diff changeset
26 used when spost is the interface to the mail delivery system which means
bce86c4163a3 Initial revision
kono
parents:
diff changeset
27 all outgoing address interpretation is left to sendmail. It is possible,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
28 though unlikely, for BERK address parsing to interact poorly with
bce86c4163a3 Initial revision
kono
parents:
diff changeset
29 "post". - van@monet.berkeley.edu).
bce86c4163a3 Initial revision
kono
parents:
diff changeset
30
bce86c4163a3 Initial revision
kono
parents:
diff changeset
31 Instead, if #ifdef DUMB is in effect, a full 822-style parser is called
bce86c4163a3 Initial revision
kono
parents:
diff changeset
32 for syntax recongition. This breaks each address into its components.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
33 Note however that no semantics are assumed about the parts or their
bce86c4163a3 Initial revision
kono
parents:
diff changeset
34 totality. This means that implicit hostnames aren't made explicit,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
35 and explicit hostnames aren't expanded to their "official" represenations.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
36
bce86c4163a3 Initial revision
kono
parents:
diff changeset
37 If neither BERK nor DUMB is in effect, then this module does some
bce86c4163a3 Initial revision
kono
parents:
diff changeset
38 high-level thinking about what the addresses are. If #ifdef MF is in
bce86c4163a3 Initial revision
kono
parents:
diff changeset
39 effect, then MH will deduce UUCP-style addressing masquerading as
bce86c4163a3 Initial revision
kono
parents:
diff changeset
40 822-style addresses.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
41
bce86c4163a3 Initial revision
kono
parents:
diff changeset
42 1. for MMDF systems:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
43
bce86c4163a3 Initial revision
kono
parents:
diff changeset
44 string%<uucp>@<local> -> string
bce86c4163a3 Initial revision
kono
parents:
diff changeset
45
bce86c4163a3 Initial revision
kono
parents:
diff changeset
46 2. for non-MMDF systems:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
47
bce86c4163a3 Initial revision
kono
parents:
diff changeset
48 string@host.<uucp> -> host!string
bce86c4163a3 Initial revision
kono
parents:
diff changeset
49
bce86c4163a3 Initial revision
kono
parents:
diff changeset
50 3. for any system, an address interpreted relative to the local host:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
51
bce86c4163a3 Initial revision
kono
parents:
diff changeset
52 string@<uucp> -> string
bce86c4163a3 Initial revision
kono
parents:
diff changeset
53
bce86c4163a3 Initial revision
kono
parents:
diff changeset
54 For cases (1) and (3) above, the leftmost host is extracted. If it's not
bce86c4163a3 Initial revision
kono
parents:
diff changeset
55 present, the local host is used. If #ifdef MF is not in effect or the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
56 tests above fail, the address is considered to be a real 822-style address.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
57
bce86c4163a3 Initial revision
kono
parents:
diff changeset
58 If an explicit host is not present, then MH checks for a bang to indicate
bce86c4163a3 Initial revision
kono
parents:
diff changeset
59 an explicit UUCP-style address. If so, this is noted. If not, the host is
bce86c4163a3 Initial revision
kono
parents:
diff changeset
60 defaulted, typically to the local host. The lack of an explict host is
bce86c4163a3 Initial revision
kono
parents:
diff changeset
61 also noted.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
62
bce86c4163a3 Initial revision
kono
parents:
diff changeset
63 If an explicit 822-style host is present, then MH checks to see if it
bce86c4163a3 Initial revision
kono
parents:
diff changeset
64 can expand this to the official name for the host. If the hostname is
bce86c4163a3 Initial revision
kono
parents:
diff changeset
65 unknown, the address is so typed.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
66
bce86c4163a3 Initial revision
kono
parents:
diff changeset
67 To summarize, when we're all done, here's what MH knows about the address:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
68
bce86c4163a3 Initial revision
kono
parents:
diff changeset
69 BERK - type: local
bce86c4163a3 Initial revision
kono
parents:
diff changeset
70 nohost: set if no '@' or '!' in mailbox
bce86c4163a3 Initial revision
kono
parents:
diff changeset
71 text: exact copy of address
bce86c4163a3 Initial revision
kono
parents:
diff changeset
72 mbox: lowercase version of mailbox
bce86c4163a3 Initial revision
kono
parents:
diff changeset
73
bce86c4163a3 Initial revision
kono
parents:
diff changeset
74 DUMB - type: local, uucp, or network
bce86c4163a3 Initial revision
kono
parents:
diff changeset
75 host: not locally defaulted, not explicitly expanded
bce86c4163a3 Initial revision
kono
parents:
diff changeset
76 everything else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
77
bce86c4163a3 Initial revision
kono
parents:
diff changeset
78 other - type: local, uucp, network, unknown
bce86c4163a3 Initial revision
kono
parents:
diff changeset
79 everything else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
80 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
81
bce86c4163a3 Initial revision
kono
parents:
diff changeset
82 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
83
bce86c4163a3 Initial revision
kono
parents:
diff changeset
84 #if !defined(DUMB) && defined(SENDMTS) && !defined(BANG)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
85 #define MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
86 #define UucpChan() "UUCP"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
87 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
88
bce86c4163a3 Initial revision
kono
parents:
diff changeset
89 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
90 static char *err = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
91 static char adrtext[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
92 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
93 static int ingrp = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
94
bce86c4163a3 Initial revision
kono
parents:
diff changeset
95 static char *pers = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
96 static char *mbox = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
97 static char *host = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
98 static char *route = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
99 static char *grp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
100 static char *note = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
101
bce86c4163a3 Initial revision
kono
parents:
diff changeset
102 static char err[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
103 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
104 static char adr[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
105
bce86c4163a3 Initial revision
kono
parents:
diff changeset
106
bce86c4163a3 Initial revision
kono
parents:
diff changeset
107 char *getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
108
bce86c4163a3 Initial revision
kono
parents:
diff changeset
109 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
110
bce86c4163a3 Initial revision
kono
parents:
diff changeset
111 char *getname (addrs)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
112 register char *addrs;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
113 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
114 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
115 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
116 * Berkeley uses a very simple parser since Sendmail does all the work.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
117 * The only thing that does address parsing if BERK is defined is the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
118 * routine "ismybox" used by "scan" & "repl" to identify the current
bce86c4163a3 Initial revision
kono
parents:
diff changeset
119 * users maildrop.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
120 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
121 * This routine does essentially the same address interpretation as the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
122 * routine "prescan" in "sendmail". The intent is that MH should
bce86c4163a3 Initial revision
kono
parents:
diff changeset
123 * make minimum assumptions about address forms since it doesn't
bce86c4163a3 Initial revision
kono
parents:
diff changeset
124 * have access to the information in the sendmail config file
bce86c4163a3 Initial revision
kono
parents:
diff changeset
125 * (God forbid that anything but sendmail has to deal with a sendmail
bce86c4163a3 Initial revision
kono
parents:
diff changeset
126 * config file) and, therefore, hasn't the faintest idea of what will
bce86c4163a3 Initial revision
kono
parents:
diff changeset
127 * or won't be a legal address.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
128 *
bce86c4163a3 Initial revision
kono
parents:
diff changeset
129 * Since this parse is only used by "ismybox" and repl, it just does
bce86c4163a3 Initial revision
kono
parents:
diff changeset
130 * two things: split multiple addr on a line into separate addresses and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
131 * locate the "mailbox" portion of an address. The parse uses rfc-822
bce86c4163a3 Initial revision
kono
parents:
diff changeset
132 * metacharacters and quoting but is much less restrictive that rfc-822.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
133 * In detail, `,' or eos terminate addresses. "Empty" addresses
bce86c4163a3 Initial revision
kono
parents:
diff changeset
134 * (e.g., `,,') are ignored. Double quote ("), backslash, left & right
bce86c4163a3 Initial revision
kono
parents:
diff changeset
135 * paren and left and right angle brackets are metacharacters. Left &
bce86c4163a3 Initial revision
kono
parents:
diff changeset
136 * right parens must balance as must left & right angle brackets. Any
bce86c4163a3 Initial revision
kono
parents:
diff changeset
137 * metacharacter may be escaped by preceding it with a backslash.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
138 * Any text between parens is considered a comment and ignored (i.e.,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
139 * only `(', `)' and `\' are metacharacters following a `('). Text
bce86c4163a3 Initial revision
kono
parents:
diff changeset
140 * between double quotes is considered escaped (i.e., only `"' and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
141 * `\' are metacharacters following a `"'). The `mailbox' portion
bce86c4163a3 Initial revision
kono
parents:
diff changeset
142 * of an address is the non-comment text between angle-brackets if
bce86c4163a3 Initial revision
kono
parents:
diff changeset
143 * the address contains any angle brackets. Otherwise, it is all the
bce86c4163a3 Initial revision
kono
parents:
diff changeset
144 * non-comment text. Blanks, tabs & newlines will not be included
bce86c4163a3 Initial revision
kono
parents:
diff changeset
145 * in the mailbox portion of an address unless they are escaped.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
146 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
147
bce86c4163a3 Initial revision
kono
parents:
diff changeset
148 /* Scanner states */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
149 #define NORMAL (0<<8)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
150 #define QS (1<<8) /* in quoted string */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
151 #define COM (2<<8) /* in comment (...) */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
152 #define ERR (3<<8) /* found an error */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
153 #define EOA (4<<8) /* end of address */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
154
bce86c4163a3 Initial revision
kono
parents:
diff changeset
155 static char *saved_addr = NULL; /* saved address line ptr */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
156 static char *adr_ptr = NULL; /* where to start looking for
bce86c4163a3 Initial revision
kono
parents:
diff changeset
157 next address on line */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
158 register char *nxtout = adr; /* where to put next character of
bce86c4163a3 Initial revision
kono
parents:
diff changeset
159 `mailbox' part of address */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
160 register unsigned char c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
161 register int state = NORMAL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
162 register char *adrcopy = adrtext; /* where to put next character of
bce86c4163a3 Initial revision
kono
parents:
diff changeset
163 address */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
164 register int lbcnt = 0; /* number of unmatched "(" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
165 register int lpcnt = 0; /* number of unmatched "<" */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
166
bce86c4163a3 Initial revision
kono
parents:
diff changeset
167 err = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
168 if (! addrs) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
169 adr_ptr = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
170 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
171 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
172 if (adr_ptr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
173 addrs = adr_ptr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
174 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
175 addrs = saved_addr = getcpy(addrs ? addrs : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
176
bce86c4163a3 Initial revision
kono
parents:
diff changeset
177 /* skip any leading whitespace or commas. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
178 while ( (c = *addrs++) == ',' || isspace(c))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
179 ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
180
bce86c4163a3 Initial revision
kono
parents:
diff changeset
181 *nxtout = *adrcopy = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
182 while (state != EOA) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
183 *adrcopy++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
184 if (state != COM)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
185 *nxtout++ = (isalpha(c) && isupper (c)) ? tolower (c) : c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
186 switch (state+c) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
187
bce86c4163a3 Initial revision
kono
parents:
diff changeset
188 case NORMAL+'\n': /* discard newlines */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
189 case QS+'\n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
190 case ERR+'\n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
191 --nxtout;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
192 --adrcopy;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
193 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
194 case COM+'\n':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
195 --adrcopy;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
196 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
197
bce86c4163a3 Initial revision
kono
parents:
diff changeset
198 case NORMAL+' ': /* skip unquoted whitespace */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
199 case NORMAL+'\t':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
200 --nxtout;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
201 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
202
bce86c4163a3 Initial revision
kono
parents:
diff changeset
203 case NORMAL+'"': /* start quoted string */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
204 state = QS;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
205 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
206
bce86c4163a3 Initial revision
kono
parents:
diff changeset
207 case QS+'"': /* end quoted string */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
208 state = NORMAL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
209 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
210
bce86c4163a3 Initial revision
kono
parents:
diff changeset
211 case NORMAL+'<':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
212 nxtout = adr; /* start over accumulating address */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
213 lbcnt++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
214 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
215
bce86c4163a3 Initial revision
kono
parents:
diff changeset
216 case NORMAL+'>':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
217 --lbcnt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
218 if (lbcnt < 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
219 state = ERR;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
220 err = "extra >";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
221 } else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
222 *(nxtout-1) = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
223 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
224
bce86c4163a3 Initial revision
kono
parents:
diff changeset
225 case NORMAL+'(':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
226 state = COM;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
227 --nxtout;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
228 case COM+'(':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
229 lpcnt++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
230 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
231
bce86c4163a3 Initial revision
kono
parents:
diff changeset
232 case COM+')':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
233 --lpcnt;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
234 if (lpcnt < 0) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
235 state = ERR;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
236 err = "extra )";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
237 } else if (lpcnt == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
238 state = NORMAL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
239 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
240
bce86c4163a3 Initial revision
kono
parents:
diff changeset
241 case NORMAL+'\\':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
242 case QS+'\\':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
243 case COM+'\\':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
244 if ((c = *addrs++) == '\n' || c == '\0') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
245 state = EOA;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
246 err = "illegal \\";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
247 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
248 *adrcopy++ = c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
249 *nxtout++ = (isalpha(c) && isupper (c)) ? tolower (c) : c;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
250 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
251
bce86c4163a3 Initial revision
kono
parents:
diff changeset
252 case NORMAL+',':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
253 case ERR+',':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
254 case NORMAL+'\0':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
255 case ERR+'\0':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
256 state = EOA;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
257 if (lbcnt)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
258 err = "missing >";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
259 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
260
bce86c4163a3 Initial revision
kono
parents:
diff changeset
261 case COM+'\0':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
262 state = EOA;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
263 err = "missing )";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
264 if (nxtout == adr)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
265 nxtout++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
266 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
267
bce86c4163a3 Initial revision
kono
parents:
diff changeset
268 case QS+'\0':
bce86c4163a3 Initial revision
kono
parents:
diff changeset
269 state = EOA;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
270 err = "missing \"";
bce86c4163a3 Initial revision
kono
parents:
diff changeset
271 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
272 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
273 if (c != '\0')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
274 c = *addrs++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
275 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
276 /*
bce86c4163a3 Initial revision
kono
parents:
diff changeset
277 * at this point adr contains the `mailbox' part of the address
bce86c4163a3 Initial revision
kono
parents:
diff changeset
278 * in lower case & minus any comment or unquoted whitespace.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
279 * adrtext contains an exact copy of the address and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
280 * addr points to where we should start scanning next time.
bce86c4163a3 Initial revision
kono
parents:
diff changeset
281 */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
282 *(nxtout-1) = *(adrcopy-1) = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
283 if (*adr && !err) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
284 adr_ptr = addrs-1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
285 return adrtext;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
286 } else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
287 free (saved_addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
288 adr_ptr = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
289 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
290 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
291 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
292 register struct adrx *ap;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
293
bce86c4163a3 Initial revision
kono
parents:
diff changeset
294 pers = mbox = host = route = grp = note = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
295 err[0] = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
296
bce86c4163a3 Initial revision
kono
parents:
diff changeset
297 if ((ap = getadrx (addrs ? addrs : "")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
298 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
299
bce86c4163a3 Initial revision
kono
parents:
diff changeset
300 (void) strcpy (adr, ap -> text);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
301 pers = ap -> pers;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
302 mbox = ap -> mbox;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
303 host = ap -> host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
304 route = ap -> path;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
305 grp = ap -> grp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
306 ingrp = ap -> ingrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
307 note = ap -> note;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
308 if (ap -> err && *ap -> err)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
309 (void) strcpy (err, ap -> err);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
310
bce86c4163a3 Initial revision
kono
parents:
diff changeset
311 return adr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
312 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
313 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
314
bce86c4163a3 Initial revision
kono
parents:
diff changeset
315 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
316
bce86c4163a3 Initial revision
kono
parents:
diff changeset
317 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
318 /* ARGSUSED */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
319 #endif /* BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
320
bce86c4163a3 Initial revision
kono
parents:
diff changeset
321 struct mailname *getm (str, dfhost, dftype, wanthost, eresult)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
322 register char *str,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
323 *eresult;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
324 char *dfhost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
325 int dftype,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
326 wanthost;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
327 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
328 #ifndef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
329 register char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
330 #ifndef DUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
331 register char *dp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
332 #endif /* not DUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
333 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
334 char *up = UucpChan ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
335 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
336 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
337 register struct mailname *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
338
bce86c4163a3 Initial revision
kono
parents:
diff changeset
339 if (err && err[0]) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
340 if (eresult)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
341 (void) strcpy (eresult, err);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
342 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
343 if (wanthost == AD_HOST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
344 admonish (NULLCP, "bad address '%s' - %s", str, err);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
345 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
346 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
347 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
348 if (str == NULL || *str == '\0') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
349 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
350 if (pers == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
351 && mbox == NULL && host == NULL && route == NULL
bce86c4163a3 Initial revision
kono
parents:
diff changeset
352 && grp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
353 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
354 if (eresult)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
355 (void) strcpy (eresult, "null address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
356 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
357 if (wanthost == AD_HOST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
358 admonish (NULLCP, "null address '%s'", str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
359 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
360 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
361 #ifndef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
362 if (mbox == NULL && grp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
363 if (eresult)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
364 (void) strcpy (eresult, "no mailbox in address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
365 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
366 if (wanthost == AD_HOST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
367 admonish (NULLCP, "no mailbox in address '%s'", str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
368 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
369 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
370
bce86c4163a3 Initial revision
kono
parents:
diff changeset
371 if (dfhost == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
372 dfhost = LocalName ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
373 dftype = LOCALHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
374 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
375 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
376
bce86c4163a3 Initial revision
kono
parents:
diff changeset
377 mp = (struct mailname *) calloc ((unsigned) 1, sizeof *mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
378 if (mp == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
379 if (eresult)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
380 (void) strcpy (eresult, "insufficient memory to represent address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
381 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
382 if (wanthost == AD_HOST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
383 adios (NULLCP, "insufficient memory to represent address");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
384 return NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
385 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
386
bce86c4163a3 Initial revision
kono
parents:
diff changeset
387 mp -> m_next = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
388 mp -> m_text = getcpy (str);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
389 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
390 mp -> m_type = LOCALHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
391 mp -> m_mbox = getcpy (adr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
392 if (!index (adr, '@') && !index (adr, '!'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
393 mp -> m_nohost = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
394 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
395 if (pers)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
396 mp -> m_pers = getcpy (pers);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
397
bce86c4163a3 Initial revision
kono
parents:
diff changeset
398 if (mbox == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
399 mp -> m_type = BADHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
400 mp -> m_nohost = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
401 mp -> m_ingrp = ingrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
402 mp -> m_gname = getcpy (grp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
403 if (note)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
404 mp -> m_note = getcpy (note);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
405 return mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
406 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
407
bce86c4163a3 Initial revision
kono
parents:
diff changeset
408 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
409
bce86c4163a3 Initial revision
kono
parents:
diff changeset
410 if (host) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
411 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
412 #ifdef MMDFMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
413 if (up && uleq (host, LocalName ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
414 && (pp = rindex (mbox, '%'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
415 && uleq (up, pp + 1)) {/* uucpaddr%<uucp>@<local> */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
416 *pp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
417 goto get_uucp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
418 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
419 #else /* not MMDFMTS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
420 if (up && (pp = index (host, '.'))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
421 && uleq (up, pp + 1)) {/* uucpaddr@host.<uucp> */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
422 *pp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
423 mp -> m_host = getcpy (host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
424 mp -> m_mbox = getcpy (mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
425 mp -> m_type = UUCPHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
426 goto got_host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
427 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
428 #endif /* not MMDFMTS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
429 if (up && uleq (dfhost, LocalName ())
bce86c4163a3 Initial revision
kono
parents:
diff changeset
430 && uleq (up, host)) {/* uucpaddr@<uucp> [local] */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
431 if (pp = index (mbox, '!')) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
432 *pp++ = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
433 mp -> m_host = getcpy (mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
434 mp -> m_mbox = getcpy (pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
435 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
436 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
437 mp -> m_host = getcpy (SystemName ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
438 mp -> m_mbox = getcpy (mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
439 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
440 mp -> m_type = UUCPHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
441 goto got_host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
442 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
443 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
444 mp -> m_mbox = getcpy (mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
445 mp -> m_host = getcpy (host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
446 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
447 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
448 if (pp = index (mbox, '!')) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
449 *pp++ = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
450 mp -> m_mbox = getcpy (pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
451 mp -> m_host = getcpy (mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
452 mp -> m_type = UUCPHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
453 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
454 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
455 mp -> m_nohost = 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
456 mp -> m_mbox = getcpy (mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
457 #ifdef DUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
458 if (route == NULL && dftype == LOCALHOST) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
459 mp -> m_host = NULLCP;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
460 mp -> m_type = dftype;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
461 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
462 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
463 #endif /* DUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
464 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
465 mp -> m_host = route ? NULLCP : getcpy (dfhost);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
466 mp -> m_type = route ? NETHOST : dftype;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
467 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
468 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
469 goto got_host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
470 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
471
bce86c4163a3 Initial revision
kono
parents:
diff changeset
472 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
473
bce86c4163a3 Initial revision
kono
parents:
diff changeset
474 if (wanthost == AD_NHST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
475 mp -> m_type = uleq (LocalName (), mp -> m_host)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
476 ? LOCALHOST : NETHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
477 #ifdef DUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
478 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
479 mp -> m_type = uleq (LocalName (), mp -> m_host) ? LOCALHOST
bce86c4163a3 Initial revision
kono
parents:
diff changeset
480 : NETHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
481 #else /* not DUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
482 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
483 if (pp = OfficialName (mp -> m_host)) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
484 got_real_host: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
485 free (mp -> m_host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
486 mp -> m_host = getcpy (pp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
487 mp -> m_type = uleq (LocalName (), mp -> m_host) ? LOCALHOST
bce86c4163a3 Initial revision
kono
parents:
diff changeset
488 : NETHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
489 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
490 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
491 if (dp = index (mp -> m_host, '.')) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
492 *dp = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
493 if (pp = OfficialName (mp -> m_host))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
494 goto got_real_host;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
495 *dp = '.';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
496 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
497 mp -> m_type = BADHOST;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
498 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
499 #endif /* not DUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
500
bce86c4163a3 Initial revision
kono
parents:
diff changeset
501 got_host: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
502 if (route)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
503 mp -> m_path = getcpy (route);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
504 mp -> m_ingrp = ingrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
505 if (grp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
506 mp -> m_gname = getcpy (grp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
507 if (note)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
508 mp -> m_note = getcpy (note);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
509 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
510
bce86c4163a3 Initial revision
kono
parents:
diff changeset
511 return mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
512 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
513
bce86c4163a3 Initial revision
kono
parents:
diff changeset
514 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
515
bce86c4163a3 Initial revision
kono
parents:
diff changeset
516 void mnfree (mp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
517 register struct mailname *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
518 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
519 if (!mp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
520 return;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
521
bce86c4163a3 Initial revision
kono
parents:
diff changeset
522 if (mp -> m_text)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
523 free (mp -> m_text);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
524 if (mp -> m_pers)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
525 free (mp -> m_pers);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
526 if (mp -> m_mbox)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
527 free (mp -> m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
528 if (mp -> m_host)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
529 free (mp -> m_host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
530 if (mp -> m_path)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
531 free (mp -> m_path);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
532 if (mp -> m_gname)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
533 free (mp -> m_gname);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
534 if (mp -> m_note)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
535 free (mp -> m_note);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
536 #ifdef MHMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
537 if (mp -> m_aka)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
538 free (mp -> m_aka);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
539 #endif /* MHMTS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
540
bce86c4163a3 Initial revision
kono
parents:
diff changeset
541 free ((char *) mp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
542 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
543
bce86c4163a3 Initial revision
kono
parents:
diff changeset
544 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
545
bce86c4163a3 Initial revision
kono
parents:
diff changeset
546 char *auxformat (mp, extras)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
547 register struct mailname *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
548 int extras;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
549 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
550 #ifndef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
551 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
552 char *up = UucpChan ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
553 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
554 static char addr[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
555 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
556 static char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
557
bce86c4163a3 Initial revision
kono
parents:
diff changeset
558 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
559 /* this "if" is a crufty hack to handle "visible" aliases */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
560 if (mp->m_pers && !extras)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
561 (void) sprintf (buffer, "%s <%s>", mp->m_pers, mp->m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
562 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
563 (void) strcpy (buffer, mp -> m_text);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
564 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
565
bce86c4163a3 Initial revision
kono
parents:
diff changeset
566 #ifdef MF
bce86c4163a3 Initial revision
kono
parents:
diff changeset
567 if (up && mp -> m_type == UUCPHOST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
568 #ifdef MMDFMTS
bce86c4163a3 Initial revision
kono
parents:
diff changeset
569 (void) sprintf (addr, "%s!%s%%%s@%s", mp -> m_host, mp -> m_mbox,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
570 up, LocalName ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
571 #else /* not MMDFMTS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
572 (void) sprintf (addr, "%s@%s.%s", mp -> m_mbox, mp -> m_host, up);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
573 #endif /* not MMDFMTS */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
574 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
575 #endif /* MF */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
576
bce86c4163a3 Initial revision
kono
parents:
diff changeset
577 #ifdef DUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
578 if (mp -> m_nohost)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
579 (void) strcpy (addr, mp -> m_mbox ? mp -> m_mbox : "");
bce86c4163a3 Initial revision
kono
parents:
diff changeset
580 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
581 #endif /* DUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
582
bce86c4163a3 Initial revision
kono
parents:
diff changeset
583 #ifndef BANG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
584 if (mp -> m_type != UUCPHOST)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
585 (void) sprintf (addr, mp -> m_host ? "%s%s@%s" : "%s%s",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
586 mp -> m_path ? mp -> m_path : "", mp -> m_mbox, mp -> m_host);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
587 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
588 #endif /* not BANG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
589 (void) sprintf (addr, "%s!%s", mp -> m_host, mp -> m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
590
bce86c4163a3 Initial revision
kono
parents:
diff changeset
591 if (!extras)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
592 return addr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
593
bce86c4163a3 Initial revision
kono
parents:
diff changeset
594 if (mp -> m_pers || mp -> m_path)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
595 if (mp -> m_note)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
596 (void) sprintf (buffer, "%s %s <%s>",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
597 legal_person (mp -> m_pers ? mp -> m_pers : mp -> m_mbox),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
598 mp -> m_note, addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
599 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
600 (void) sprintf (buffer, "%s <%s>",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
601 legal_person (mp -> m_pers ? mp -> m_pers : mp -> m_mbox),
bce86c4163a3 Initial revision
kono
parents:
diff changeset
602 addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
603 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
604 if (mp -> m_note)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
605 (void) sprintf (buffer, "%s %s", addr, mp -> m_note);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
606 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
607 (void) strcpy (buffer, addr);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
608 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
609
bce86c4163a3 Initial revision
kono
parents:
diff changeset
610 return buffer;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
611 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
612
bce86c4163a3 Initial revision
kono
parents:
diff changeset
613 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
614
bce86c4163a3 Initial revision
kono
parents:
diff changeset
615 #if defined(BERK) || (defined(DUMB) && !defined(MMDFMTS) && !defined(SMTP))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
616 #define REALLYDUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
617 #else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
618 #undef REALLYDUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
619 #endif
bce86c4163a3 Initial revision
kono
parents:
diff changeset
620
bce86c4163a3 Initial revision
kono
parents:
diff changeset
621 char *adrsprintf (local, domain)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
622 char *local,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
623 *domain;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
624 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
625 static char addr[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
626
bce86c4163a3 Initial revision
kono
parents:
diff changeset
627 if (local == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
628 #ifdef REALLYDUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
629 return getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
630 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
631 #endif /* REALLYDUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
632 local = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
633
bce86c4163a3 Initial revision
kono
parents:
diff changeset
634 if (domain == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
635 #ifdef REALLYDUMB
bce86c4163a3 Initial revision
kono
parents:
diff changeset
636 return local;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
637 else
bce86c4163a3 Initial revision
kono
parents:
diff changeset
638 #endif /* REALLYDUMB */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
639 domain = LocalName ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
640
bce86c4163a3 Initial revision
kono
parents:
diff changeset
641 #ifndef BANG
bce86c4163a3 Initial revision
kono
parents:
diff changeset
642 (void) sprintf (addr, "%s@%s", local, domain);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
643 #else /* BANG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
644 (void) sprintf (addr, "%s!%s", domain, local);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
645 #endif /* BANG */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
646
bce86c4163a3 Initial revision
kono
parents:
diff changeset
647 return addr;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
648 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
649
bce86c4163a3 Initial revision
kono
parents:
diff changeset
650 /* */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
651
bce86c4163a3 Initial revision
kono
parents:
diff changeset
652 #define W_NIL 0x0000
bce86c4163a3 Initial revision
kono
parents:
diff changeset
653 #define W_MBEG 0x0001
bce86c4163a3 Initial revision
kono
parents:
diff changeset
654 #define W_MEND 0x0002
bce86c4163a3 Initial revision
kono
parents:
diff changeset
655 #define W_MBOX (W_MBEG | W_MEND)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
656 #define W_HBEG 0x0004
bce86c4163a3 Initial revision
kono
parents:
diff changeset
657 #define W_HEND 0x0008
bce86c4163a3 Initial revision
kono
parents:
diff changeset
658 #define W_HOST (W_HBEG | W_HEND)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
659 #define WBITS "\020\01MBEG\02MEND\03HBEG\04HEND"
bce86c4163a3 Initial revision
kono
parents:
diff changeset
660
bce86c4163a3 Initial revision
kono
parents:
diff changeset
661
bce86c4163a3 Initial revision
kono
parents:
diff changeset
662 int ismymbox (np)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
663 register struct mailname *np;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
664 {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
665 int oops;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
666 register int len,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
667 i;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
668 register char *cp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
669 #ifndef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
670 register char *pp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
671 char buffer[BUFSIZ];
bce86c4163a3 Initial revision
kono
parents:
diff changeset
672 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
673 register struct mailname *mp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
674 static char *am = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
675 static struct mailname mq={NULL};
bce86c4163a3 Initial revision
kono
parents:
diff changeset
676
bce86c4163a3 Initial revision
kono
parents:
diff changeset
677 /* if this is the first call, init. alternate mailboxes list */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
678 if (am == NULL) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
679 mq.m_next = NULL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
680 mq.m_mbox = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
681 if ((am = m_find ("alternate-mailboxes")) == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
682 am = getusr ();
bce86c4163a3 Initial revision
kono
parents:
diff changeset
683 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
684 mp = &mq;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
685 oops = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
686 while (cp = getname (am))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
687 if ((mp -> m_next = getm (cp, NULLCP, 0, AD_NAME, NULLCP))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
688 == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
689 admonish (NULLCP, "illegal address: %s", cp), oops++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
690 else {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
691 mp = mp -> m_next;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
692 mp -> m_type = W_NIL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
693 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
694 /* check for wildcards on the mailbox name and
bce86c4163a3 Initial revision
kono
parents:
diff changeset
695 set m_type accordingly. */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
696 mp -> m_ingrp = strlen (mp -> m_mbox);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
697 if (*(mp -> m_mbox) == '*') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
698 mp -> m_type |= W_MBEG;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
699 mp -> m_mbox++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
700 --mp -> m_ingrp;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
701 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
702 if (mp -> m_mbox[mp -> m_ingrp - 1] == '*') {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
703 mp -> m_type |= W_MEND;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
704 mp -> m_ingrp--;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
705 mp -> m_mbox[mp -> m_ingrp] = 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
706 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
707 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
708 /* owing to screwy munging, wildcarding is a great idea
bce86c4163a3 Initial revision
kono
parents:
diff changeset
709 even under #ifndef BERK, so... */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
710 mp -> m_type = W_NIL;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
711 if (*mp -> m_mbox == '*')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
712 mp -> m_type |= W_MBEG, mp -> m_mbox++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
713 if (*(cp = mp -> m_mbox + strlen (mp -> m_mbox) - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
714 == '*')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
715 mp -> m_type |= W_MEND, *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
716 if (mp -> m_host) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
717 if (*mp -> m_host == '*')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
718 mp -> m_type |= W_HBEG, mp -> m_host++;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
719 if (*(cp = mp -> m_host + strlen (mp -> m_host) - 1)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
720 == '*')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
721 mp -> m_type |= W_HEND, *cp = '\0';
bce86c4163a3 Initial revision
kono
parents:
diff changeset
722 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
723 if ((cp = getenv ("MHWDEBUG")) && *cp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
724 fprintf (stderr, "mbox=\"%s\" host=\"%s\" %s\n",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
725 mp -> m_mbox, mp -> m_host,
bce86c4163a3 Initial revision
kono
parents:
diff changeset
726 sprintb (buffer, (unsigned) mp -> m_type, WBITS));
bce86c4163a3 Initial revision
kono
parents:
diff changeset
727 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
728 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
729 if (oops)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
730 advise (NULLCP, "please fix the %s: entry in your %s file",
bce86c4163a3 Initial revision
kono
parents:
diff changeset
731 "alternate-mailboxes", mh_profile);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
732 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
733 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
734 if (np == NULL) /* XXX */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
735 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
736
bce86c4163a3 Initial revision
kono
parents:
diff changeset
737 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
738 cp = np -> m_mbox;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
739 if (strcmp (cp, mq.m_mbox) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
740 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
741 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
742 switch (np -> m_type) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
743 case NETHOST:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
744 len = strlen (cp = LocalName ());
bce86c4163a3 Initial revision
kono
parents:
diff changeset
745 if (!uprf (np -> m_host, cp) || np -> m_host[len] != '.')
bce86c4163a3 Initial revision
kono
parents:
diff changeset
746 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
747 goto local_test;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
748
bce86c4163a3 Initial revision
kono
parents:
diff changeset
749 case UUCPHOST:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
750 if (!uleq (np -> m_host, SystemName ()))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
751 break; /* fall */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
752 case LOCALHOST:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
753 local_test: ;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
754 if (uleq (np -> m_mbox, mq.m_mbox))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
755 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
756 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
757
bce86c4163a3 Initial revision
kono
parents:
diff changeset
758 default:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
759 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
760 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
761 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
762
bce86c4163a3 Initial revision
kono
parents:
diff changeset
763 #ifdef BERK
bce86c4163a3 Initial revision
kono
parents:
diff changeset
764 len = strlen (cp);
bce86c4163a3 Initial revision
kono
parents:
diff changeset
765 for (mp = &mq; mp = mp -> m_next;)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
766 if (len >= mp -> m_ingrp)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
767 switch (mp -> m_type) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
768 case W_NIL: /* no wildcards */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
769 if (strcmp (cp, mp -> m_mbox) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
770 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
771 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
772
bce86c4163a3 Initial revision
kono
parents:
diff changeset
773 case W_MBEG: /* wildcard at beginning */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
774 if (strcmp (&cp[len - mp -> m_ingrp], mp -> m_mbox) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
775 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
776 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
777
bce86c4163a3 Initial revision
kono
parents:
diff changeset
778 case W_MEND: /* wildcard at end */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
779 if (strncmp (cp, mp -> m_mbox, mp -> m_ingrp) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
780 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
781 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
782
bce86c4163a3 Initial revision
kono
parents:
diff changeset
783 case W_MBEG | W_MEND: /* wildcard at beginning & end */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
784 for (i = 0; i <= len - mp -> m_ingrp; i++)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
785 if (strncmp (&cp[i], mp -> m_mbox, mp -> m_ingrp) == 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
786 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
787 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
788 #else /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
789 for (mp = &mq; mp = mp -> m_next;) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
790 if (np -> m_mbox == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
791 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
792 if ((len = strlen (cp = np -> m_mbox))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
793 < (i = strlen (pp = mp -> m_mbox)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
794 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
795 switch (mp -> m_type & W_MBOX) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
796 case W_NIL:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
797 if (!uleq (cp, pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
798 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
799 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
800 case W_MBEG:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
801 if (!uleq (cp + len - i, pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
802 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
803 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
804 case W_MEND:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
805 if (!uprf (cp, pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
806 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
807 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
808 case W_MBEG | W_MEND:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
809 if (stringdex (pp, cp) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
810 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
811 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
812 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
813
bce86c4163a3 Initial revision
kono
parents:
diff changeset
814 if (mp -> m_nohost)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
815 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
816 if (np -> m_host == NULL)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
817 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
818 if ((len = strlen (cp = np -> m_host))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
819 < (i = strlen (pp = mp -> m_host)))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
820 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
821 switch (mp -> m_type & W_HOST) {
bce86c4163a3 Initial revision
kono
parents:
diff changeset
822 case W_NIL:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
823 if (!uleq (cp, pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
824 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
825 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
826 case W_HBEG:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
827 if (!uleq (cp + len - i, pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
828 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
829 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
830 case W_HEND:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
831 if (!uprf (cp, pp))
bce86c4163a3 Initial revision
kono
parents:
diff changeset
832 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
833 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
834 case W_HBEG | W_HEND:
bce86c4163a3 Initial revision
kono
parents:
diff changeset
835 if (stringdex (pp, cp) < 0)
bce86c4163a3 Initial revision
kono
parents:
diff changeset
836 continue;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
837 break;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
838 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
839 return 1;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
840 }
bce86c4163a3 Initial revision
kono
parents:
diff changeset
841 #endif /* not BERK */
bce86c4163a3 Initial revision
kono
parents:
diff changeset
842
bce86c4163a3 Initial revision
kono
parents:
diff changeset
843 return 0;
bce86c4163a3 Initial revision
kono
parents:
diff changeset
844 }