Blame


1 d1f529f4 2005-10-29 devnull #include "common.h"
2 d1f529f4 2005-10-29 devnull
3 d1f529f4 2005-10-29 devnull /*
4 d1f529f4 2005-10-29 devnull * WARNING! This turns all upper case names into lower case
5 d1f529f4 2005-10-29 devnull * local ones.
6 d1f529f4 2005-10-29 devnull */
7 d1f529f4 2005-10-29 devnull
8 d1f529f4 2005-10-29 devnull /* predeclared */
9 d1f529f4 2005-10-29 devnull static String *getdbfiles(void);
10 d1f529f4 2005-10-29 devnull static int translate(char*, char**, String*, String*);
11 d1f529f4 2005-10-29 devnull static int lookup(String**, String*, String*);
12 d1f529f4 2005-10-29 devnull static int compare(String*, char*);
13 d1f529f4 2005-10-29 devnull static char* mklower(char*);
14 d1f529f4 2005-10-29 devnull
15 d1f529f4 2005-10-29 devnull static int debug;
16 d1f529f4 2005-10-29 devnull static int from;
17 d1f529f4 2005-10-29 devnull static char *namefiles = "namefiles";
18 d1f529f4 2005-10-29 devnull #define DEBUG if(debug)
19 d1f529f4 2005-10-29 devnull
20 d1f529f4 2005-10-29 devnull /* loop through the names to be translated */
21 d1f529f4 2005-10-29 devnull void
22 d1f529f4 2005-10-29 devnull main(int argc, char *argv[])
23 d1f529f4 2005-10-29 devnull {
24 d1f529f4 2005-10-29 devnull String *s;
25 d1f529f4 2005-10-29 devnull String *alias; /* the alias for the name */
26 d1f529f4 2005-10-29 devnull char **names; /* names of this system */
27 d1f529f4 2005-10-29 devnull String *files; /* list of files to search */
28 d1f529f4 2005-10-29 devnull int i, rv;
29 d1f529f4 2005-10-29 devnull char *p;
30 d1f529f4 2005-10-29 devnull
31 d1f529f4 2005-10-29 devnull ARGBEGIN {
32 d1f529f4 2005-10-29 devnull case 'd':
33 d1f529f4 2005-10-29 devnull debug = 1;
34 d1f529f4 2005-10-29 devnull break;
35 d1f529f4 2005-10-29 devnull case 'f':
36 d1f529f4 2005-10-29 devnull from = 1;
37 d1f529f4 2005-10-29 devnull break;
38 d1f529f4 2005-10-29 devnull case 'n':
39 d1f529f4 2005-10-29 devnull namefiles = ARGF();
40 d1f529f4 2005-10-29 devnull break;
41 d1f529f4 2005-10-29 devnull } ARGEND
42 d1f529f4 2005-10-29 devnull
43 b5f65921 2006-02-11 devnull if (chdir(UPASLIB) < 0)
44 b5f65921 2006-02-11 devnull sysfatal("aliasmail chdir %s: %r", UPASLIB);
45 b5f65921 2006-02-11 devnull
46 d1f529f4 2005-10-29 devnull /* get environmental info */
47 d1f529f4 2005-10-29 devnull names = sysnames_read();
48 d1f529f4 2005-10-29 devnull files = getdbfiles();
49 d1f529f4 2005-10-29 devnull alias = s_new();
50 d1f529f4 2005-10-29 devnull
51 d1f529f4 2005-10-29 devnull /* loop through the names to be translated (from standard input) */
52 d1f529f4 2005-10-29 devnull for(i=0; i<argc; i++) {
53 d1f529f4 2005-10-29 devnull s = unescapespecial(s_copy(mklower(argv[i])));
54 d1f529f4 2005-10-29 devnull if(strchr(s_to_c(s), '!') == 0)
55 d1f529f4 2005-10-29 devnull rv = translate(s_to_c(s), names, files, alias);
56 d1f529f4 2005-10-29 devnull else
57 d1f529f4 2005-10-29 devnull rv = -1;
58 d1f529f4 2005-10-29 devnull if(from){
59 d1f529f4 2005-10-29 devnull if (rv >= 0 && *s_to_c(alias) != '\0'){
60 d1f529f4 2005-10-29 devnull p = strchr(s_to_c(alias), '\n');
61 d1f529f4 2005-10-29 devnull if(p)
62 d1f529f4 2005-10-29 devnull *p = 0;
63 d1f529f4 2005-10-29 devnull p = strchr(s_to_c(alias), '!');
64 d1f529f4 2005-10-29 devnull if(p) {
65 d1f529f4 2005-10-29 devnull *p = 0;
66 d1f529f4 2005-10-29 devnull print("%s", s_to_c(alias));
67 d1f529f4 2005-10-29 devnull } else {
68 d1f529f4 2005-10-29 devnull p = strchr(s_to_c(alias), '@');
69 d1f529f4 2005-10-29 devnull if(p)
70 d1f529f4 2005-10-29 devnull print("%s", p+1);
71 d1f529f4 2005-10-29 devnull else
72 d1f529f4 2005-10-29 devnull print("%s", s_to_c(alias));
73 d1f529f4 2005-10-29 devnull }
74 d1f529f4 2005-10-29 devnull }
75 d1f529f4 2005-10-29 devnull } else {
76 d1f529f4 2005-10-29 devnull if (rv < 0 || *s_to_c(alias) == '\0')
77 d1f529f4 2005-10-29 devnull print("local!%s\n", s_to_c(s));
78 d1f529f4 2005-10-29 devnull else {
79 d1f529f4 2005-10-29 devnull /* this must be a write, not a print */
80 d1f529f4 2005-10-29 devnull write(1, s_to_c(alias), strlen(s_to_c(alias)));
81 d1f529f4 2005-10-29 devnull }
82 d1f529f4 2005-10-29 devnull }
83 d1f529f4 2005-10-29 devnull s_free(s);
84 d1f529f4 2005-10-29 devnull }
85 d1f529f4 2005-10-29 devnull exits(0);
86 d1f529f4 2005-10-29 devnull }
87 d1f529f4 2005-10-29 devnull
88 d1f529f4 2005-10-29 devnull /* get the list of dbfiles to search */
89 d1f529f4 2005-10-29 devnull static String *
90 d1f529f4 2005-10-29 devnull getdbfiles(void)
91 d1f529f4 2005-10-29 devnull {
92 d1f529f4 2005-10-29 devnull Sinstack *sp;
93 d1f529f4 2005-10-29 devnull String *files = s_new();
94 d1f529f4 2005-10-29 devnull char *nf;
95 d1f529f4 2005-10-29 devnull
96 d1f529f4 2005-10-29 devnull if(from)
97 d1f529f4 2005-10-29 devnull nf = "fromfiles";
98 d1f529f4 2005-10-29 devnull else
99 d1f529f4 2005-10-29 devnull nf = namefiles;
100 d1f529f4 2005-10-29 devnull
101 d1f529f4 2005-10-29 devnull /* system wide aliases */
102 d1f529f4 2005-10-29 devnull if ((sp = s_allocinstack(nf)) != 0){
103 d1f529f4 2005-10-29 devnull while(s_rdinstack(sp, files))
104 d1f529f4 2005-10-29 devnull s_append(files, " ");
105 d1f529f4 2005-10-29 devnull s_freeinstack(sp);
106 d1f529f4 2005-10-29 devnull }
107 d1f529f4 2005-10-29 devnull
108 d1f529f4 2005-10-29 devnull
109 d1f529f4 2005-10-29 devnull DEBUG print("files are %s\n", s_to_c(files));
110 d1f529f4 2005-10-29 devnull
111 d1f529f4 2005-10-29 devnull return files;
112 d1f529f4 2005-10-29 devnull }
113 d1f529f4 2005-10-29 devnull
114 d1f529f4 2005-10-29 devnull /* loop through the translation files */
115 d1f529f4 2005-10-29 devnull static int
116 d1f529f4 2005-10-29 devnull translate(char *name, /* name to translate */
117 d1f529f4 2005-10-29 devnull char **namev, /* names of this system */
118 d1f529f4 2005-10-29 devnull String *files, /* names of system alias files */
119 d1f529f4 2005-10-29 devnull String *alias) /* where to put the alias */
120 d1f529f4 2005-10-29 devnull {
121 d1f529f4 2005-10-29 devnull String *file = s_new();
122 d1f529f4 2005-10-29 devnull String **fullnamev;
123 d1f529f4 2005-10-29 devnull int n, rv;
124 d1f529f4 2005-10-29 devnull
125 d1f529f4 2005-10-29 devnull rv = -1;
126 d1f529f4 2005-10-29 devnull
127 d1f529f4 2005-10-29 devnull DEBUG print("translate(%s, %s, %s)\n", name,
128 d1f529f4 2005-10-29 devnull s_to_c(files), s_to_c(alias));
129 d1f529f4 2005-10-29 devnull
130 d1f529f4 2005-10-29 devnull /* create the full name to avoid loops (system!name) */
131 d1f529f4 2005-10-29 devnull for(n = 0; namev[n]; n++)
132 d1f529f4 2005-10-29 devnull ;
133 d1f529f4 2005-10-29 devnull fullnamev = (String**)malloc(sizeof(String*)*(n+2));
134 d1f529f4 2005-10-29 devnull n = 0;
135 d1f529f4 2005-10-29 devnull fullnamev[n++] = s_copy(name);
136 d1f529f4 2005-10-29 devnull for(; *namev; namev++){
137 d1f529f4 2005-10-29 devnull fullnamev[n] = s_copy(*namev);
138 d1f529f4 2005-10-29 devnull s_append(fullnamev[n], "!");
139 d1f529f4 2005-10-29 devnull s_append(fullnamev[n], name);
140 d1f529f4 2005-10-29 devnull n++;
141 d1f529f4 2005-10-29 devnull }
142 d1f529f4 2005-10-29 devnull fullnamev[n] = 0;
143 d1f529f4 2005-10-29 devnull
144 d1f529f4 2005-10-29 devnull /* look at system-wide names */
145 d1f529f4 2005-10-29 devnull s_restart(files);
146 d1f529f4 2005-10-29 devnull while (s_parse(files, s_restart(file)) != 0) {
147 d1f529f4 2005-10-29 devnull if (lookup(fullnamev, file, alias)==0) {
148 d1f529f4 2005-10-29 devnull rv = 0;
149 d1f529f4 2005-10-29 devnull goto out;
150 d1f529f4 2005-10-29 devnull }
151 d1f529f4 2005-10-29 devnull }
152 d1f529f4 2005-10-29 devnull
153 d1f529f4 2005-10-29 devnull out:
154 d1f529f4 2005-10-29 devnull for(n = 0; fullnamev[n]; n++)
155 d1f529f4 2005-10-29 devnull s_free(fullnamev[n]);
156 d1f529f4 2005-10-29 devnull s_free(file);
157 d1f529f4 2005-10-29 devnull free(fullnamev);
158 d1f529f4 2005-10-29 devnull return rv;
159 d1f529f4 2005-10-29 devnull }
160 d1f529f4 2005-10-29 devnull
161 d1f529f4 2005-10-29 devnull /*
162 d1f529f4 2005-10-29 devnull * very dumb conversion to bang format
163 d1f529f4 2005-10-29 devnull */
164 d1f529f4 2005-10-29 devnull static String*
165 d1f529f4 2005-10-29 devnull attobang(String *token)
166 d1f529f4 2005-10-29 devnull {
167 d1f529f4 2005-10-29 devnull char *p;
168 d1f529f4 2005-10-29 devnull String *tok;
169 d1f529f4 2005-10-29 devnull
170 d1f529f4 2005-10-29 devnull p = strchr(s_to_c(token), '@');
171 d1f529f4 2005-10-29 devnull if(p == 0)
172 d1f529f4 2005-10-29 devnull return token;
173 d1f529f4 2005-10-29 devnull
174 d1f529f4 2005-10-29 devnull p++;
175 d1f529f4 2005-10-29 devnull tok = s_copy(p);
176 d1f529f4 2005-10-29 devnull s_append(tok, "!");
177 d1f529f4 2005-10-29 devnull s_nappend(tok, s_to_c(token), p - s_to_c(token) - 1);
178 d1f529f4 2005-10-29 devnull
179 d1f529f4 2005-10-29 devnull return tok;
180 d1f529f4 2005-10-29 devnull }
181 d1f529f4 2005-10-29 devnull
182 d1f529f4 2005-10-29 devnull /* Loop through the entries in a translation file looking for a match.
183 d1f529f4 2005-10-29 devnull * Return 0 if found, -1 otherwise.
184 d1f529f4 2005-10-29 devnull */
185 d1f529f4 2005-10-29 devnull static int
186 d1f529f4 2005-10-29 devnull lookup(
187 d1f529f4 2005-10-29 devnull String **namev,
188 d1f529f4 2005-10-29 devnull String *file,
189 d1f529f4 2005-10-29 devnull String *alias) /* returned String */
190 d1f529f4 2005-10-29 devnull {
191 d1f529f4 2005-10-29 devnull String *line = s_new();
192 d1f529f4 2005-10-29 devnull String *token = s_new();
193 d1f529f4 2005-10-29 devnull String *bangtoken;
194 d1f529f4 2005-10-29 devnull int i, rv = -1;
195 d1f529f4 2005-10-29 devnull char *name = s_to_c(namev[0]);
196 d1f529f4 2005-10-29 devnull Sinstack *sp;
197 d1f529f4 2005-10-29 devnull
198 d1f529f4 2005-10-29 devnull DEBUG print("lookup(%s, %s, %s, %s)\n", s_to_c(namev[0]), s_to_c(namev[1]),
199 d1f529f4 2005-10-29 devnull s_to_c(file), s_to_c(alias));
200 d1f529f4 2005-10-29 devnull
201 d1f529f4 2005-10-29 devnull s_reset(alias);
202 d1f529f4 2005-10-29 devnull if ((sp = s_allocinstack(s_to_c(file))) == 0)
203 d1f529f4 2005-10-29 devnull return -1;
204 d1f529f4 2005-10-29 devnull
205 d1f529f4 2005-10-29 devnull /* look for a match */
206 d1f529f4 2005-10-29 devnull while (s_rdinstack(sp, s_restart(line))!=0) {
207 d1f529f4 2005-10-29 devnull DEBUG print("line is %s\n", s_to_c(line));
208 d1f529f4 2005-10-29 devnull s_restart(token);
209 d1f529f4 2005-10-29 devnull if (s_parse(s_restart(line), token)==0)
210 d1f529f4 2005-10-29 devnull continue;
211 d1f529f4 2005-10-29 devnull if (compare(token, "#include")==0){
212 d1f529f4 2005-10-29 devnull if(s_parse(line, s_restart(token))!=0) {
213 d1f529f4 2005-10-29 devnull if(lookup(namev, line, alias) == 0)
214 d1f529f4 2005-10-29 devnull break;
215 d1f529f4 2005-10-29 devnull }
216 d1f529f4 2005-10-29 devnull continue;
217 d1f529f4 2005-10-29 devnull }
218 d1f529f4 2005-10-29 devnull if (compare(token, name)!=0)
219 d1f529f4 2005-10-29 devnull continue;
220 d1f529f4 2005-10-29 devnull /* match found, get the alias */
221 d1f529f4 2005-10-29 devnull while(s_parse(line, s_restart(token))!=0) {
222 d1f529f4 2005-10-29 devnull bangtoken = attobang(token);
223 d1f529f4 2005-10-29 devnull
224 d1f529f4 2005-10-29 devnull /* avoid definition loops */
225 d1f529f4 2005-10-29 devnull for(i = 0; namev[i]; i++)
226 d1f529f4 2005-10-29 devnull if(compare(bangtoken, s_to_c(namev[i]))==0) {
227 d1f529f4 2005-10-29 devnull s_append(alias, "local");
228 d1f529f4 2005-10-29 devnull s_append(alias, "!");
229 d1f529f4 2005-10-29 devnull s_append(alias, name);
230 d1f529f4 2005-10-29 devnull break;
231 d1f529f4 2005-10-29 devnull }
232 d1f529f4 2005-10-29 devnull
233 d1f529f4 2005-10-29 devnull if(namev[i] == 0)
234 d1f529f4 2005-10-29 devnull s_append(alias, s_to_c(token));
235 d1f529f4 2005-10-29 devnull s_append(alias, "\n");
236 d1f529f4 2005-10-29 devnull
237 d1f529f4 2005-10-29 devnull if(bangtoken != token)
238 d1f529f4 2005-10-29 devnull s_free(bangtoken);
239 d1f529f4 2005-10-29 devnull }
240 d1f529f4 2005-10-29 devnull rv = 0;
241 d1f529f4 2005-10-29 devnull break;
242 d1f529f4 2005-10-29 devnull }
243 d1f529f4 2005-10-29 devnull s_free(line);
244 d1f529f4 2005-10-29 devnull s_free(token);
245 d1f529f4 2005-10-29 devnull s_freeinstack(sp);
246 d1f529f4 2005-10-29 devnull return rv;
247 d1f529f4 2005-10-29 devnull }
248 d1f529f4 2005-10-29 devnull
249 d1f529f4 2005-10-29 devnull #define lower(c) ((c)>='A' && (c)<='Z' ? (c)-('A'-'a'):(c))
250 d1f529f4 2005-10-29 devnull
251 d1f529f4 2005-10-29 devnull /* compare two Strings (case insensitive) */
252 d1f529f4 2005-10-29 devnull static int
253 d1f529f4 2005-10-29 devnull compare(String *s1,
254 d1f529f4 2005-10-29 devnull char *p2)
255 d1f529f4 2005-10-29 devnull {
256 d1f529f4 2005-10-29 devnull char *p1 = s_to_c(s1);
257 d1f529f4 2005-10-29 devnull int rv;
258 d1f529f4 2005-10-29 devnull
259 d1f529f4 2005-10-29 devnull DEBUG print("comparing %s to %s\n", p1, p2);
260 d1f529f4 2005-10-29 devnull while((rv = lower(*p1) - lower(*p2)) == 0) {
261 d1f529f4 2005-10-29 devnull if (*p1 == '\0')
262 d1f529f4 2005-10-29 devnull break;
263 d1f529f4 2005-10-29 devnull p1++;
264 d1f529f4 2005-10-29 devnull p2++;
265 d1f529f4 2005-10-29 devnull }
266 d1f529f4 2005-10-29 devnull return rv;
267 d1f529f4 2005-10-29 devnull }
268 d1f529f4 2005-10-29 devnull
269 d1f529f4 2005-10-29 devnull static char*
270 d1f529f4 2005-10-29 devnull mklower(char *name)
271 d1f529f4 2005-10-29 devnull {
272 d1f529f4 2005-10-29 devnull char *p;
273 d1f529f4 2005-10-29 devnull char c;
274 d1f529f4 2005-10-29 devnull
275 d1f529f4 2005-10-29 devnull for(p = name; *p; p++){
276 d1f529f4 2005-10-29 devnull c = *p;
277 d1f529f4 2005-10-29 devnull *p = lower(c);
278 d1f529f4 2005-10-29 devnull }
279 d1f529f4 2005-10-29 devnull return name;
280 d1f529f4 2005-10-29 devnull }