|
|
1.1 root 1: /* pathalias -- by steve bellovin, as told to peter honeyman */
2: #ifndef lint
3: static char *sccsid = "@(#)printit.c 8.2 (down!honey) 86/01/29";
4: #endif
5:
6: #include "def.h"
7:
8: /* use lots of char bufs -- profiling indicates this costs about 5 kbytes */
9:
10: /* in practice, even the longest paths are < 100 bytes */
11: #define PSIZE 512
12:
13: printit()
14: { link *l;
15: char pbuf[PSIZE];
16:
17: /* print home */
18: if (Cflag)
19: printf("%ld\t", (long) Home->n_cost);
20: printf("%s\t%%s\n", Home->n_name);
21:
22: strcpy(pbuf, "%s");
23: for (l = Home->n_link; l; l = l->l_next) {
24: if (l->l_flag & LTREE) {
25: preorder(l, pbuf);
26: strcpy(pbuf, "%s");
27: }
28: }
29: }
30:
31: /* preorder traversal of shortest path tree */
32: preorder(l, ppath)
33: register link *l;
34: char *ppath;
35: {
36: register node *n;
37: char npath[PSIZE];
38:
39: setpath(l, ppath, npath);
40: n = l->l_to;
41: if ((n->n_flag & NNET) || ISADOMAIN(n))
42: printnet(n, npath, n->n_cost);
43: else
44: printhost(n, npath, n->n_cost);
45: for (l = n->n_link; l; l = l->l_next)
46: if (l->l_flag & LTREE)
47: preorder(l, npath);
48: }
49:
50: setpath(l, ppath, npath)
51: link *l;
52: register char *ppath, *npath;
53: {
54: register node *next;
55: char netchar;
56: extern char *hostpath();
57:
58: next = l->l_to;
59: /*
60: * for magic @-% conversion.
61: * assume that gateways to domains want no @'s
62: */
63: if (next->n_parent->n_flag & ATSIGN || ISADOMAIN(next))
64: next->n_flag |= ATSIGN;
65:
66: /* special handling for aliases , domains, and nets */
67: if ((l->l_flag & LALIAS) || (next->n_flag & NNET) || ISADOMAIN(next)) {
68: strcpy(npath, ppath);
69: return;
70: }
71:
72: netchar = NETCHAR(l);
73: if (netchar == '@')
74: if (next->n_flag & ATSIGN)
75: netchar = '%'; /* shazam? shaman? */
76: else
77: next->n_flag |= ATSIGN;
78:
79: /* remainder should be a sprintf -- foo on '%' as an operator */
80: for ( ; *npath = *ppath; ppath++) {
81: if (*ppath == '%') {
82: switch(ppath[1]) {
83: case 's':
84: ppath++;
85: npath = hostpath(npath, l, netchar);
86: break;
87:
88: case '%':
89: *++npath = *++ppath;
90: npath++;
91: break;
92:
93: default:
94: fprintf(stderr, "%s: %%%c found in setpath\n",
95: ProgName, ppath[1]);
96: badmagic(1);
97: break;
98: }
99: } else
100: npath++;
101: }
102: }
103:
104: char *
105: hostpath(path, l, netchar)
106: register char *path;
107: register link *l;
108: char netchar;
109: {
110: register node *prev;
111:
112: prev = l->l_to->n_parent;
113: if (NETDIR(l) == LLEFT) {
114: /* host!user */
115: strcpy(path, l->l_to->n_name);
116: path += strlen(path);
117: while (ISADOMAIN(prev)) {
118: strcpy(path, prev->n_name);
119: path += strlen(path);
120: prev = prev->n_parent;
121: }
122: *path++ = netchar;
123: if (netchar == '%')
124: *path++ = '%';
125: *path++ = '%';
126: *path++ = 's';
127: } else {
128: /* %s@host */
129: *path++ = '%';
130: *path++ = 's';
131: *path++ = netchar;
132: if (netchar == '%')
133: *path++ = '%';
134: strcpy(path, l->l_to->n_name);
135: path += strlen(path);
136: while (ISADOMAIN(prev)) {
137: strcpy(path, prev->n_name);
138: path += strlen(path);
139: prev = prev->n_parent;
140: }
141: }
142: return(path);
143: }
144:
145: STATIC
146: printhost(n, path, cost)
147: node *n;
148: char *path;
149: Cost cost;
150: {
151: /* skip private hosts */
152: if ((n->n_flag & ISPRIVATE) == 0) {
153: if (Cflag)
154: printf("%ld\t", (long) cost);
155: fputs(n->n_name, stdout);
156: putchar('\t');
157: puts(path);
158: }
159: }
160:
161: STATIC
162: printnet(n, path, cost)
163: node *n;
164: char *path;
165: Cost cost;
166: {
167: node *parent;
168:
169: /* print domains only */
170: if (!ISADOMAIN(n))
171: return;
172:
173: /* print top-level domain */
174: if (!ISADOMAIN(n->n_parent)) {
175: if (n->n_flag & ISPRIVATE)
176: fprintf(stderr, "%s: warning: private top-level domain %s ignored\n", ProgName, n->n_name);
177: else
178: printdomain(n, path, cost);
179: return;
180: }
181:
182: /* remainder is for subdomains */
183:
184: /* don't print if it has a non-private ancestor */
185: for (parent = n->n_parent; parent; parent = parent->n_parent)
186: if (ISADOMAIN(parent) && (parent->n_flag & ISPRIVATE) == 0)
187: return;
188:
189: /* don't print if this domain is also private */
190: if (n->n_flag & ISPRIVATE)
191: return;
192:
193: /* ancestors all private, this domain not private */
194: printdomain(n, path, cost);
195: }
196:
197: STATIC
198: printdomain(n, path, cost)
199: node *n;
200: char *path;
201: Cost cost;
202: {
203: /* skip subdomains, since the gateway to the parent suffices */
204: if (ISADOMAIN(n->n_parent))
205: return;
206: if (Cflag)
207: printf("%ld\t", (long) cost);
208: do {
209: fputs(n->n_name, stdout);
210: n = n->n_parent;
211: } while (ISADOMAIN(n));
212: putchar('\t');
213: puts(path);
214: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.