1 87a52e04 2005-12-26 devnull #include <u.h>
2 87a52e04 2005-12-26 devnull #include <libc.h>
3 87a52e04 2005-12-26 devnull #include <ip.h>
4 87a52e04 2005-12-26 devnull #include "dat.h"
5 87a52e04 2005-12-26 devnull #include "protos.h"
9 87a52e04 2005-12-26 devnull Maxoptlen= 312-4,
11 87a52e04 2005-12-26 devnull /* dhcp types */
12 87a52e04 2005-12-26 devnull Discover= 1,
13 87a52e04 2005-12-26 devnull Offer= 2,
14 87a52e04 2005-12-26 devnull Request= 3,
15 87a52e04 2005-12-26 devnull Decline= 4,
18 87a52e04 2005-12-26 devnull Release= 7,
19 87a52e04 2005-12-26 devnull Inform= 8,
21 87a52e04 2005-12-26 devnull /* bootp option types */
22 87a52e04 2005-12-26 devnull OBend= 255,
23 87a52e04 2005-12-26 devnull OBpad= 0,
24 87a52e04 2005-12-26 devnull OBmask= 1,
25 87a52e04 2005-12-26 devnull OBtimeoff= 2,
26 87a52e04 2005-12-26 devnull OBrouter= 3,
27 87a52e04 2005-12-26 devnull OBtimeserver= 4,
28 87a52e04 2005-12-26 devnull OBnameserver= 5,
29 87a52e04 2005-12-26 devnull OBdnserver= 6,
30 87a52e04 2005-12-26 devnull OBlogserver= 7,
31 87a52e04 2005-12-26 devnull OBcookieserver= 8,
32 87a52e04 2005-12-26 devnull OBlprserver= 9,
33 87a52e04 2005-12-26 devnull OBimpressserver= 10,
34 87a52e04 2005-12-26 devnull OBrlserver= 11,
35 87a52e04 2005-12-26 devnull OBhostname= 12, /* 0xc0 */
36 87a52e04 2005-12-26 devnull OBbflen= 13,
37 87a52e04 2005-12-26 devnull OBdumpfile= 14,
38 87a52e04 2005-12-26 devnull OBdomainname= 15,
39 87a52e04 2005-12-26 devnull OBswapserver= 16, /* 0x10 */
40 87a52e04 2005-12-26 devnull OBrootpath= 17,
41 87a52e04 2005-12-26 devnull OBextpath= 18,
42 87a52e04 2005-12-26 devnull OBipforward= 19,
43 87a52e04 2005-12-26 devnull OBnonlocal= 20,
44 87a52e04 2005-12-26 devnull OBpolicyfilter= 21,
45 87a52e04 2005-12-26 devnull OBmaxdatagram= 22,
46 87a52e04 2005-12-26 devnull OBttl= 23,
47 87a52e04 2005-12-26 devnull OBpathtimeout= 24,
48 87a52e04 2005-12-26 devnull OBpathplateau= 25,
49 87a52e04 2005-12-26 devnull OBmtu= 26,
50 87a52e04 2005-12-26 devnull OBsubnetslocal= 27,
51 87a52e04 2005-12-26 devnull OBbaddr= 28,
52 87a52e04 2005-12-26 devnull OBdiscovermask= 29,
53 87a52e04 2005-12-26 devnull OBsupplymask= 30,
54 87a52e04 2005-12-26 devnull OBdiscoverrouter= 31,
55 87a52e04 2005-12-26 devnull OBrsserver= 32, /* 0x20 */
56 87a52e04 2005-12-26 devnull OBstaticroutes= 33,
57 87a52e04 2005-12-26 devnull OBtrailerencap= 34,
58 87a52e04 2005-12-26 devnull OBarptimeout= 35,
59 87a52e04 2005-12-26 devnull OBetherencap= 36,
60 87a52e04 2005-12-26 devnull OBtcpttl= 37,
61 87a52e04 2005-12-26 devnull OBtcpka= 38,
62 87a52e04 2005-12-26 devnull OBtcpkag= 39,
63 87a52e04 2005-12-26 devnull OBnisdomain= 40,
64 87a52e04 2005-12-26 devnull OBniserver= 41,
65 87a52e04 2005-12-26 devnull OBntpserver= 42,
66 87a52e04 2005-12-26 devnull OBvendorinfo= 43, /* 0x2b */
67 87a52e04 2005-12-26 devnull OBnetbiosns= 44,
68 87a52e04 2005-12-26 devnull OBnetbiosdds= 45,
69 87a52e04 2005-12-26 devnull OBnetbiostype= 46,
70 87a52e04 2005-12-26 devnull OBnetbiosscope= 47,
71 87a52e04 2005-12-26 devnull OBxfontserver= 48, /* 0x30 */
72 87a52e04 2005-12-26 devnull OBxdispmanager= 49,
73 87a52e04 2005-12-26 devnull OBnisplusdomain= 64, /* 0x40 */
74 87a52e04 2005-12-26 devnull OBnisplusserver= 65,
75 87a52e04 2005-12-26 devnull OBhomeagent= 68,
76 87a52e04 2005-12-26 devnull OBsmtpserver= 69,
77 87a52e04 2005-12-26 devnull OBpop3server= 70,
78 87a52e04 2005-12-26 devnull OBnntpserver= 71,
79 87a52e04 2005-12-26 devnull OBwwwserver= 72,
80 87a52e04 2005-12-26 devnull OBfingerserver= 73,
81 87a52e04 2005-12-26 devnull OBircserver= 74,
82 87a52e04 2005-12-26 devnull OBstserver= 75,
83 87a52e04 2005-12-26 devnull OBstdaserver= 76,
85 87a52e04 2005-12-26 devnull /* dhcp options */
86 87a52e04 2005-12-26 devnull ODipaddr= 50, /* 0x32 */
87 87a52e04 2005-12-26 devnull ODlease= 51,
88 87a52e04 2005-12-26 devnull ODoverload= 52,
89 87a52e04 2005-12-26 devnull ODtype= 53, /* 0x35 */
90 87a52e04 2005-12-26 devnull ODserverid= 54, /* 0x36 */
91 87a52e04 2005-12-26 devnull ODparams= 55, /* 0x37 */
92 87a52e04 2005-12-26 devnull ODmessage= 56,
93 87a52e04 2005-12-26 devnull ODmaxmsg= 57,
94 87a52e04 2005-12-26 devnull ODrenewaltime= 58,
95 87a52e04 2005-12-26 devnull ODrebindingtime= 59,
96 87a52e04 2005-12-26 devnull ODvendorclass= 60,
97 87a52e04 2005-12-26 devnull ODclientid= 61, /* 0x3d */
98 87a52e04 2005-12-26 devnull ODtftpserver= 66,
99 87a52e04 2005-12-26 devnull ODbootfile= 67,
101 87a52e04 2005-12-26 devnull /* plan9 vendor info options */
102 87a52e04 2005-12-26 devnull OP9fs= 128, // plan9 file servers
103 87a52e04 2005-12-26 devnull OP9auth= 129, // plan9 auth servers
106 87a52e04 2005-12-26 devnull static void
107 87a52e04 2005-12-26 devnull p_compile(Filter *f)
109 a38a1836 2006-02-14 devnull sysfatal("unknown dhcp field: %s", f->s);
113 87a52e04 2005-12-26 devnull * convert a byte array to hex
115 87a52e04 2005-12-26 devnull static char
116 87a52e04 2005-12-26 devnull hex(int x)
118 87a52e04 2005-12-26 devnull if(x < 10)
119 87a52e04 2005-12-26 devnull return x + '0';
120 87a52e04 2005-12-26 devnull return x - 10 + 'a';
122 87a52e04 2005-12-26 devnull static char*
123 87a52e04 2005-12-26 devnull phex(char *p, char *e, char *tag, uchar *o, int n)
125 87a52e04 2005-12-26 devnull p = seprint(p, e, "%s=", tag);
127 87a52e04 2005-12-26 devnull for(; p+2 < e && n > 0; n--){
128 87a52e04 2005-12-26 devnull *p++ = hex(*o>>4);
129 87a52e04 2005-12-26 devnull *p++ = hex(*o & 0xf);
132 87a52e04 2005-12-26 devnull return p;
135 87a52e04 2005-12-26 devnull static char*
136 87a52e04 2005-12-26 devnull pstring(char *p, char *e, char *tag, uchar *o, int n)
138 87a52e04 2005-12-26 devnull char msg[256];
140 87a52e04 2005-12-26 devnull if(n > sizeof msg - 1)
141 87a52e04 2005-12-26 devnull n = sizeof msg - 1;
142 87a52e04 2005-12-26 devnull memmove(msg, o, n);
143 87a52e04 2005-12-26 devnull msg[n] = 0;
144 87a52e04 2005-12-26 devnull return seprint(p, e, "%s=%s", tag, msg);
147 87a52e04 2005-12-26 devnull static char*
148 87a52e04 2005-12-26 devnull pint(char *p, char *e, char *tag, uchar *o, int n)
152 87a52e04 2005-12-26 devnull x = *(char*)o++;
153 87a52e04 2005-12-26 devnull for(; n > 1; n--)
154 87a52e04 2005-12-26 devnull x = (x<<8)|*o++;
155 87a52e04 2005-12-26 devnull return seprint(p, e, "%s=%d", tag, x);
158 87a52e04 2005-12-26 devnull static char*
159 87a52e04 2005-12-26 devnull puint(char *p, char *e, char *tag, uchar *o, int n)
163 87a52e04 2005-12-26 devnull x = *o++;
164 87a52e04 2005-12-26 devnull for(; n > 1; n--)
165 87a52e04 2005-12-26 devnull x = (x<<8)|*o++;
166 87a52e04 2005-12-26 devnull return seprint(p, e, "%s=%ud", tag, x);
169 87a52e04 2005-12-26 devnull static char*
170 87a52e04 2005-12-26 devnull pserver(char *p, char *e, char *tag, uchar *o, int n)
172 87a52e04 2005-12-26 devnull p = seprint(p, e, "%s=(", tag);
173 87a52e04 2005-12-26 devnull while(n >= 4){
174 87a52e04 2005-12-26 devnull p = seprint(p, e, " %V", o);
178 87a52e04 2005-12-26 devnull p = seprint(p, e, ")");
179 87a52e04 2005-12-26 devnull return p;
182 87a52e04 2005-12-26 devnull static char *dhcptype[256] =
184 87a52e04 2005-12-26 devnull [Discover] "Discover",
185 87a52e04 2005-12-26 devnull [Offer] "Offer",
186 87a52e04 2005-12-26 devnull [Request] "Request",
187 87a52e04 2005-12-26 devnull [Decline] "Decline",
188 87a52e04 2005-12-26 devnull [Ack] "Ack",
189 87a52e04 2005-12-26 devnull [Nak] "Nak",
190 87a52e04 2005-12-26 devnull [Release] "Release",
191 87a52e04 2005-12-26 devnull [Inform] "Inform",
195 87a52e04 2005-12-26 devnull static char*
196 87a52e04 2005-12-26 devnull ptype(char *p, char *e, uchar val)
198 87a52e04 2005-12-26 devnull char *x;
200 87a52e04 2005-12-26 devnull x = dhcptype[val];
201 87a52e04 2005-12-26 devnull if(x != nil)
202 87a52e04 2005-12-26 devnull return seprint(p, e, "t=%s", x);
204 87a52e04 2005-12-26 devnull return seprint(p, e, "t=%d", val);
207 87a52e04 2005-12-26 devnull static int
208 87a52e04 2005-12-26 devnull p_seprint(Msg *m)
210 87a52e04 2005-12-26 devnull int i, n, code;
211 87a52e04 2005-12-26 devnull uchar *o, *ps;
212 87a52e04 2005-12-26 devnull char *p, *e;
213 87a52e04 2005-12-26 devnull char msg[64];
215 87a52e04 2005-12-26 devnull /* no next proto */
216 87a52e04 2005-12-26 devnull m->pr = nil;
218 87a52e04 2005-12-26 devnull p = m->p;
219 87a52e04 2005-12-26 devnull e = m->e;
220 87a52e04 2005-12-26 devnull ps = m->ps;
222 87a52e04 2005-12-26 devnull while(ps < m->pe){
223 87a52e04 2005-12-26 devnull code = *ps++;
224 87a52e04 2005-12-26 devnull if(code == 255)
226 87a52e04 2005-12-26 devnull if(code == 0)
227 87a52e04 2005-12-26 devnull continue;
229 87a52e04 2005-12-26 devnull /* ignore anything that's too long */
230 87a52e04 2005-12-26 devnull n = *ps++;
232 87a52e04 2005-12-26 devnull ps += n;
233 87a52e04 2005-12-26 devnull if(ps > m->pe)
236 87a52e04 2005-12-26 devnull switch(code){
237 87a52e04 2005-12-26 devnull case ODipaddr: /* requested ip address */
238 87a52e04 2005-12-26 devnull p = pserver(p, e, "ipaddr", o, n);
240 87a52e04 2005-12-26 devnull case ODlease: /* requested lease time */
241 87a52e04 2005-12-26 devnull p = pint(p, e, "lease", o, n);
243 87a52e04 2005-12-26 devnull case ODtype:
244 87a52e04 2005-12-26 devnull p = ptype(p, e, *o);
246 87a52e04 2005-12-26 devnull case ODserverid:
247 87a52e04 2005-12-26 devnull p = pserver(p, e, "serverid", o, n);
249 87a52e04 2005-12-26 devnull case ODmessage:
250 87a52e04 2005-12-26 devnull p = pstring(p, e, "message", o, n);
252 87a52e04 2005-12-26 devnull case ODmaxmsg:
253 87a52e04 2005-12-26 devnull p = puint(p, e, "maxmsg", o, n);
255 87a52e04 2005-12-26 devnull case ODclientid:
256 87a52e04 2005-12-26 devnull p = phex(p, e, "clientid", o, n);
258 87a52e04 2005-12-26 devnull case ODparams:
259 87a52e04 2005-12-26 devnull p = seprint(p, e, " requested=(");
260 87a52e04 2005-12-26 devnull for(i = 0; i < n; i++){
261 87a52e04 2005-12-26 devnull if(i != 0)
262 87a52e04 2005-12-26 devnull p = seprint(p, e, " ");
263 87a52e04 2005-12-26 devnull p = seprint(p, e, "%ud", o[i]);
265 87a52e04 2005-12-26 devnull p = seprint(p, e, ")");
267 87a52e04 2005-12-26 devnull case ODvendorclass:
268 87a52e04 2005-12-26 devnull p = pstring(p, e, "vendorclass", o, n);
270 87a52e04 2005-12-26 devnull case OBmask:
271 87a52e04 2005-12-26 devnull p = pserver(p, e, "mask", o, n);
273 87a52e04 2005-12-26 devnull case OBtimeoff:
274 87a52e04 2005-12-26 devnull p = pint(p, e, "timeoff", o, n);
276 87a52e04 2005-12-26 devnull case OBrouter:
277 87a52e04 2005-12-26 devnull p = pserver(p, e, "router", o, n);
279 87a52e04 2005-12-26 devnull case OBtimeserver:
280 87a52e04 2005-12-26 devnull p = pserver(p, e, "timesrv", o, n);
282 87a52e04 2005-12-26 devnull case OBnameserver:
283 87a52e04 2005-12-26 devnull p = pserver(p, e, "namesrv", o, n);
285 87a52e04 2005-12-26 devnull case OBdnserver:
286 87a52e04 2005-12-26 devnull p = pserver(p, e, "dnssrv", o, n);
288 87a52e04 2005-12-26 devnull case OBlogserver:
289 87a52e04 2005-12-26 devnull p = pserver(p, e, "logsrv", o, n);
291 87a52e04 2005-12-26 devnull case OBcookieserver:
292 87a52e04 2005-12-26 devnull p = pserver(p, e, "cookiesrv", o, n);
294 87a52e04 2005-12-26 devnull case OBlprserver:
295 87a52e04 2005-12-26 devnull p = pserver(p, e, "lprsrv", o, n);
297 87a52e04 2005-12-26 devnull case OBimpressserver:
298 87a52e04 2005-12-26 devnull p = pserver(p, e, "impresssrv", o, n);
300 87a52e04 2005-12-26 devnull case OBrlserver:
301 87a52e04 2005-12-26 devnull p = pserver(p, e, "rlsrv", o, n);
303 87a52e04 2005-12-26 devnull case OBhostname:
304 87a52e04 2005-12-26 devnull p = pstring(p, e, "hostname", o, n);
306 87a52e04 2005-12-26 devnull case OBbflen:
308 87a52e04 2005-12-26 devnull case OBdumpfile:
309 87a52e04 2005-12-26 devnull p = pstring(p, e, "dumpfile", o, n);
311 87a52e04 2005-12-26 devnull case OBdomainname:
312 87a52e04 2005-12-26 devnull p = pstring(p, e, "domname", o, n);
314 87a52e04 2005-12-26 devnull case OBswapserver:
315 87a52e04 2005-12-26 devnull p = pserver(p, e, "swapsrv", o, n);
317 87a52e04 2005-12-26 devnull case OBrootpath:
318 87a52e04 2005-12-26 devnull p = pstring(p, e, "rootpath", o, n);
320 87a52e04 2005-12-26 devnull case OBextpath:
321 87a52e04 2005-12-26 devnull p = pstring(p, e, "extpath", o, n);
323 87a52e04 2005-12-26 devnull case OBipforward:
324 87a52e04 2005-12-26 devnull p = phex(p, e, "ipforward", o, n);
326 87a52e04 2005-12-26 devnull case OBnonlocal:
327 87a52e04 2005-12-26 devnull p = phex(p, e, "nonlocal", o, n);
329 87a52e04 2005-12-26 devnull case OBpolicyfilter:
330 87a52e04 2005-12-26 devnull p = phex(p, e, "policyfilter", o, n);
332 87a52e04 2005-12-26 devnull case OBmaxdatagram:
333 87a52e04 2005-12-26 devnull p = phex(p, e, "maxdatagram", o, n);
335 87a52e04 2005-12-26 devnull case OBttl:
336 87a52e04 2005-12-26 devnull p = puint(p, e, "ttl", o, n);
338 87a52e04 2005-12-26 devnull case OBpathtimeout:
339 87a52e04 2005-12-26 devnull p = puint(p, e, "pathtimeout", o, n);
341 87a52e04 2005-12-26 devnull case OBpathplateau:
342 87a52e04 2005-12-26 devnull p = phex(p, e, "pathplateau", o, n);
344 87a52e04 2005-12-26 devnull case OBmtu:
345 87a52e04 2005-12-26 devnull p = puint(p, e, "mtu", o, n);
347 87a52e04 2005-12-26 devnull case OBsubnetslocal:
348 87a52e04 2005-12-26 devnull p = pserver(p, e, "subnet", o, n);
350 87a52e04 2005-12-26 devnull case OBbaddr:
351 87a52e04 2005-12-26 devnull p = pserver(p, e, "baddr", o, n);
353 87a52e04 2005-12-26 devnull case OBdiscovermask:
354 87a52e04 2005-12-26 devnull p = pserver(p, e, "discovermsak", o, n);
356 87a52e04 2005-12-26 devnull case OBsupplymask:
357 87a52e04 2005-12-26 devnull p = pserver(p, e, "rousupplymaskter", o, n);
359 87a52e04 2005-12-26 devnull case OBdiscoverrouter:
360 87a52e04 2005-12-26 devnull p = pserver(p, e, "discoverrouter", o, n);
362 87a52e04 2005-12-26 devnull case OBrsserver:
363 87a52e04 2005-12-26 devnull p = pserver(p, e, "rsrouter", o, n);
365 87a52e04 2005-12-26 devnull case OBstaticroutes:
366 87a52e04 2005-12-26 devnull p = phex(p, e, "staticroutes", o, n);
368 87a52e04 2005-12-26 devnull case OBtrailerencap:
369 87a52e04 2005-12-26 devnull p = phex(p, e, "trailerencap", o, n);
371 87a52e04 2005-12-26 devnull case OBarptimeout:
372 87a52e04 2005-12-26 devnull p = puint(p, e, "arptimeout", o, n);
374 87a52e04 2005-12-26 devnull case OBetherencap:
375 87a52e04 2005-12-26 devnull p = phex(p, e, "etherencap", o, n);
377 87a52e04 2005-12-26 devnull case OBtcpttl:
378 87a52e04 2005-12-26 devnull p = puint(p, e, "tcpttl", o, n);
380 87a52e04 2005-12-26 devnull case OBtcpka:
381 87a52e04 2005-12-26 devnull p = puint(p, e, "tcpka", o, n);
383 87a52e04 2005-12-26 devnull case OBtcpkag:
384 87a52e04 2005-12-26 devnull p = phex(p, e, "tcpkag", o, n);
386 87a52e04 2005-12-26 devnull case OBnisdomain:
387 87a52e04 2005-12-26 devnull p = pstring(p, e, "nisdomain", o, n);
389 87a52e04 2005-12-26 devnull case OBniserver:
390 87a52e04 2005-12-26 devnull p = pserver(p, e, "nisrv", o, n);
392 87a52e04 2005-12-26 devnull case OBntpserver:
393 87a52e04 2005-12-26 devnull p = pserver(p, e, "ntpsrv", o, n);
395 87a52e04 2005-12-26 devnull case OBvendorinfo:
396 87a52e04 2005-12-26 devnull p = phex(p, e, "vendorinfo", o, n);
398 87a52e04 2005-12-26 devnull case OBnetbiosns:
399 87a52e04 2005-12-26 devnull p = pserver(p, e, "biosns", o, n);
401 87a52e04 2005-12-26 devnull case OBnetbiosdds:
402 87a52e04 2005-12-26 devnull p = phex(p, e, "biosdds", o, n);
404 87a52e04 2005-12-26 devnull case OBnetbiostype:
405 87a52e04 2005-12-26 devnull p = phex(p, e, "biostype", o, n);
407 87a52e04 2005-12-26 devnull case OBnetbiosscope:
408 87a52e04 2005-12-26 devnull p = phex(p, e, "biosscope", o, n);
410 87a52e04 2005-12-26 devnull case OBxfontserver:
411 87a52e04 2005-12-26 devnull p = pserver(p, e, "fontsrv", o, n);
413 87a52e04 2005-12-26 devnull case OBxdispmanager:
414 87a52e04 2005-12-26 devnull p = pserver(p, e, "xdispmgr", o, n);
416 87a52e04 2005-12-26 devnull case OBnisplusdomain:
417 87a52e04 2005-12-26 devnull p = pstring(p, e, "nisplusdomain", o, n);
419 87a52e04 2005-12-26 devnull case OBnisplusserver:
420 87a52e04 2005-12-26 devnull p = pserver(p, e, "nisplussrv", o, n);
422 87a52e04 2005-12-26 devnull case OBhomeagent:
423 87a52e04 2005-12-26 devnull p = pserver(p, e, "homeagent", o, n);
425 87a52e04 2005-12-26 devnull case OBsmtpserver:
426 87a52e04 2005-12-26 devnull p = pserver(p, e, "smtpsrv", o, n);
428 87a52e04 2005-12-26 devnull case OBpop3server:
429 87a52e04 2005-12-26 devnull p = pserver(p, e, "pop3srv", o, n);
431 87a52e04 2005-12-26 devnull case OBnntpserver:
432 87a52e04 2005-12-26 devnull p = pserver(p, e, "ntpsrv", o, n);
434 87a52e04 2005-12-26 devnull case OBwwwserver:
435 87a52e04 2005-12-26 devnull p = pserver(p, e, "wwwsrv", o, n);
437 87a52e04 2005-12-26 devnull case OBfingerserver:
438 87a52e04 2005-12-26 devnull p = pserver(p, e, "fingersrv", o, n);
440 87a52e04 2005-12-26 devnull case OBircserver:
441 87a52e04 2005-12-26 devnull p = pserver(p, e, "ircsrv", o, n);
443 87a52e04 2005-12-26 devnull case OBstserver:
444 87a52e04 2005-12-26 devnull p = pserver(p, e, "stsrv", o, n);
446 87a52e04 2005-12-26 devnull case OBstdaserver:
447 87a52e04 2005-12-26 devnull p = pserver(p, e, "stdasrv", o, n);
449 87a52e04 2005-12-26 devnull case OBend:
450 87a52e04 2005-12-26 devnull goto out;
451 87a52e04 2005-12-26 devnull default:
452 87a52e04 2005-12-26 devnull snprint(msg, sizeof msg, " T%ud", code);
453 87a52e04 2005-12-26 devnull p = phex(p, e, msg, o, n);
456 87a52e04 2005-12-26 devnull if(*ps != OBend)
457 87a52e04 2005-12-26 devnull p = seprint(p, e, " ");
460 87a52e04 2005-12-26 devnull m->p = p;
461 87a52e04 2005-12-26 devnull m->ps = ps;
462 87a52e04 2005-12-26 devnull return 0;
465 87a52e04 2005-12-26 devnull Proto dhcp =
468 87a52e04 2005-12-26 devnull p_compile,
470 87a52e04 2005-12-26 devnull p_seprint,
474 87a52e04 2005-12-26 devnull defaultframer,