10 // XXX: manually initialize once to placate the Sun monster
11 uchar prefixvals[256];
13 uchar prefixvals[256] =
31 static char *efmt = "%.2lux%.2lux%.2lux%.2lux%.2lux%.2lux";
32 static char *ifmt = "%d.%d.%d.%d";
36 int i, j, n, eln, eli;
38 static int once = 0; // XXX: placate the Sun monster
42 memset(prefixvals, 0, sizeof(prefixvals));
43 prefixvals[0x00] = 0 | Isprefix;
44 prefixvals[0x80] = 1 | Isprefix;
45 prefixvals[0xC0] = 2 | Isprefix;
46 prefixvals[0xE0] = 3 | Isprefix;
47 prefixvals[0xF0] = 4 | Isprefix;
48 prefixvals[0xF8] = 5 | Isprefix;
49 prefixvals[0xFC] = 6 | Isprefix;
50 prefixvals[0xFE] = 7 | Isprefix;
51 prefixvals[0xFF] = 8 | Isprefix;
55 case 'E': /* Ethernet address */
56 p = va_arg(f->args, uchar*);
57 snprint(buf, sizeof buf, efmt, p[0], p[1], p[2], p[3], p[4], p[5]);
58 return fmtstrcpy(f, buf);
60 case 'I': /* Ip address */
61 p = va_arg(f->args, uchar*);
63 if(memcmp(p, v4prefix, 12) == 0){
64 snprint(buf, sizeof buf, ifmt, p[12], p[13], p[14], p[15]);
65 return fmtstrcpy(f, buf);
68 /* find longest elision */
70 for(i = 0; i < 16; i += 2){
71 for(j = i; j < 16; j += 2)
72 if(p[j] != 0 || p[j+1] != 0)
74 if(j > i && j - i > eln){
80 /* print with possible elision */
82 for(i = 0; i < 16; i += 2){
84 n += sprint(buf+n, "::");
89 n += sprint(buf+n, ":");
90 s = (p[i]<<8) + p[i+1];
91 n += sprint(buf+n, "%ux", s);
93 return fmtstrcpy(f, buf);
95 case 'i': /* v6 address as 4 longs */
96 lp = va_arg(f->args, ulong*);
97 for(i = 0; i < 4; i++)
98 hnputl(ip+4*i, *lp++);
102 case 'V': /* v4 ip address */
103 p = va_arg(f->args, uchar*);
104 snprint(buf, sizeof buf, ifmt, p[0], p[1], p[2], p[3]);
105 return fmtstrcpy(f, buf);
107 case 'M': /* ip mask */
108 p = va_arg(f->args, uchar*);
110 /* look for a prefix mask */
111 for(i = 0; i < 16; i++)
115 if((prefixvals[p[i]] & Isprefix) == 0)
117 for(j = i+1; j < 16; j++)
120 n = 8*i + (prefixvals[p[i]] & ~Isprefix);
124 /* got one, use /xx format */
125 snprint(buf, sizeof buf, "/%d", n);
126 return fmtstrcpy(f, buf);
128 return fmtstrcpy(f, "(eipfmt)");