|
|
1.1 root 1: /* ali.c - the new ali */
2:
3: #include "../h/mh.h"
4: #include "../h/addrsbr.h"
5: #include "../h/aliasbr.h"
6: #include <stdio.h>
7:
8:
9: #define NVEC 50 /* maximum number of names */
10:
11: /* */
12:
13: static struct swit switches[] = {
14: #define ALIASW 0
15: "alias aliasfile", 0,
16: #define NALIASW 1
17: "noalias", -7,
18:
19: #define LISTSW 2
20: "list", 0,
21: #define NLISTSW 3
22: "nolist", 0,
23:
24: #define NORMSW 4
25: "normalize", 0,
26: #define NNORMSW 5
27: "nonormalize", 0,
28:
29: #define USERSW 6
30: "user", 0,
31: #define NUSERSW 7
32: "nouser", 0,
33:
34: #define HELPSW 8
35: "help", 4,
36:
37: NULL, NULL
38: };
39:
40: /* */
41:
42: static int pos = 1;
43:
44: extern struct aka *akahead;
45:
46: /* */
47:
48: /* ARGSUSED */
49:
50: main(argc, argv)
51: int argc;
52: char *argv[];
53: {
54: int i,
55: vecp = 0,
56: inverted = 0,
57: list = 0,
58: noalias = 0,
59: normalize = AD_NHST;
60: char *cp,
61: **ap,
62: **argp,
63: buf[100],
64: *vec[NVEC],
65: *arguments[MAXARGS];
66: struct aka *ak;
67:
68: invo_name = r1bindex (argv[0], '/');
69: mts_init (invo_name);
70: if ((cp = m_find (invo_name)) != NULL) {
71: ap = brkstring (cp = getcpy (cp), " ", "\n");
72: ap = copyip (ap, arguments);
73: }
74: else
75: ap = arguments;
76: (void) copyip (argv + 1, ap);
77: argp = arguments;
78:
79: /* */
80:
81: while (cp = *argp++) {
82: if (*cp == '-')
83: switch (smatch (++cp, switches)) {
84: case AMBIGSW:
85: ambigsw (cp, switches);
86: done (1);
87: case UNKWNSW:
88: adios (NULLCP, "-%s unknown", cp);
89: case HELPSW:
90: (void) sprintf (buf, "%s [switches] aliases ...",
91: invo_name);
92: help (buf, switches);
93: done (1);
94:
95: case ALIASW:
96: if (!(cp = *argp++) || *cp == '-')
97: adios (NULLCP, "missing argument to %s", argp[-2]);
98: if ((i = alias (cp)) != AK_OK)
99: adios (NULLCP, "aliasing error in %s - %s",
100: cp, akerror (i));
101: continue;
102: case NALIASW:
103: noalias++;
104: continue;
105:
106: case LISTSW:
107: list++;
108: continue;
109: case NLISTSW:
110: list = 0;
111: continue;
112:
113: case NORMSW:
114: normalize = AD_HOST;
115: continue;
116: case NNORMSW:
117: normalize = AD_NHST;
118: continue;
119:
120: case USERSW:
121: inverted++;
122: continue;
123: case NUSERSW:
124: inverted = 0;
125: continue;
126: }
127: vec[vecp++] = cp;
128: }
129:
130: if (!noalias)
131: (void) alias (AliasFile);
132:
133: /* */
134:
135: if (vecp)
136: for (i = 0; i < vecp; i++)
137: if (inverted)
138: print_usr (vec[i], list, normalize);
139: else
140: print_aka (akvalue (vec[i]), list, 0);
141: else {
142: if (inverted)
143: adios (NULLCP, "usage: %s addresses ... (you forgot the addresses)",
144: invo_name);
145:
146: for (ak = akahead; ak; ak = ak -> ak_next) {
147: printf ("%s: ", ak -> ak_name);
148: pos += strlen (ak -> ak_name) + 1;
149: print_aka (akresult (ak), list, pos);
150: }
151: }
152:
153: done (0);
154: }
155:
156: /* */
157:
158: print_aka(p, list, margin)
159: register char *p;
160: int list, margin;
161: {
162: register char c;
163:
164: if (p == NULL) {
165: printf ("<empty>\n");
166: return;
167: }
168:
169: while (c = *p++)
170: switch (c) {
171: case ',':
172: if (*p)
173: if (list)
174: printf ("\n%*s", margin, "");
175: else
176: if (pos >= 68) {
177: printf (",\n ");
178: pos = 2;
179: }
180: else {
181: printf (", ");
182: pos += 2;
183: }
184:
185: case NULL:
186: break;
187:
188: default:
189: pos++;
190: (void) putchar (c);
191: }
192:
193: (void) putchar ('\n');
194: pos = 1;
195: }
196:
197: /* */
198:
199: print_usr(s, list, norm)
200: register char *s;
201: int list, norm;
202: {
203: register char *cp,
204: *pp,
205: *vp;
206: register struct aka *ak;
207: register struct mailname *mp,
208: *np;
209:
210: if ((pp = getname (s)) == NULL)
211: adios (NULLCP, "no address in \"%s\"", s);
212: if ((mp = getm (pp, NULLCP, 0, norm, NULLCP)) == NULL)
213: adios (NULLCP, "bad address \"%s\"", s);
214: while (getname (""))
215: continue;
216:
217: vp = NULL;
218: for (ak = akahead; ak; ak = ak -> ak_next) {
219: pp = akresult (ak);
220: while (cp = getname (pp)) {
221: if ((np = getm (cp, NULLCP, 0, norm, NULLCP)) == NULL)
222: continue;
223: if (uleq (mp -> m_host, np -> m_host)
224: && uleq (mp -> m_mbox, np -> m_mbox)) {
225: vp = vp ? add (ak -> ak_name, add (",", vp))
226: : getcpy (ak -> ak_name);
227: mnfree (np);
228: while (getname (""))
229: continue;
230: break;
231: }
232: mnfree (np);
233: }
234: }
235: mnfree (mp);
236:
237: printf ("%s: ", s);
238: print_aka (vp ? vp : s, list, pos += strlen (s) + 1);
239: if (vp)
240: free (vp);
241: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.