M boot/bootip.c => boot/bootip.c +1 -0
@@ 61,6 61,7 @@ configip(void)
case -1:
fatal("configuring ip: %r");
case 0:
+ print("exec-ing ipconfig\n");
exec("/boot/ipconfig", arg);
fatal("execing /ipconfig");
default:
M ip/ip.h => ip/ip.h +1 -1
@@ 440,10 440,10 @@ enum
struct Routewalk
{
- int n;
int o;
int h;
char* p;
+ char* e;
void* state;
void (*walk)(Route*, Routewalk*);
};
M ip/ipaux.c => ip/ipaux.c +11 -7
@@ 282,13 282,16 @@ eipfmt(Fmt *f)
switch(f->r) {
case 'E': /* Ethernet address */
p = va_arg(f->args, uchar*);
- return fmtprint(f, efmt, p[0], p[1], p[2], p[3], p[4], p[5]);
+ snprint(buf, sizeof buf, efmt, p[0], p[1], p[2], p[3], p[4], p[5]);
+ return fmtstrcpy(f, buf);
case 'I': /* Ip address */
p = va_arg(f->args, uchar*);
common:
- if(memcmp(p, v4prefix, 12) == 0)
- return fmtprint(f, ifmt, p[12], p[13], p[14], p[15]);
+ if(memcmp(p, v4prefix, 12) == 0){
+ snprint(buf, sizeof buf, ifmt, p[12], p[13], p[14], p[15]);
+ return fmtstrcpy(f, buf);
+ }
/* find longest elision */
eln = eli = -1;
@@ 326,7 329,8 @@ common:
case 'V': /* v4 ip address */
p = va_arg(f->args, uchar*);
- return fmtprint(f, ifmt, p[0], p[1], p[2], p[3]);
+ snprint(buf, sizeof buf, ifmt, p[0], p[1], p[2], p[3]);
+ return fmtstrcpy(f, buf);
case 'M': /* ip mask */
p = va_arg(f->args, uchar*);
@@ 346,10 350,10 @@ common:
n = 8*16;
/* got one, use /xx format */
- return fmtprint(f, "/%d", n);
-
+ snprint(buf, sizeof buf, "/%d", n);
+ return fmtstrcpy(f, buf);
}
- return fmtprint(f, "(eipfmt)");
+ return fmtstrcpy(f, "(eipfmt)");
}
#define CLASS(p) ((*(uchar*)(p))>>6)
M ip/iproute.c => ip/iproute.c +24 -29
@@ 617,12 617,7 @@ routetype(int type, char *p)
*p = 'p';
}
-enum
-{
- Rlinelen= 137,
-};
-
-char *rformat = "%-40.40I %-40.40M %-40.40I %4.4s %4.4s %3s\n";
+char *rformat = "%-15I %-4M %-15I %4.4s %4.4s %3s\n";
void
convroute(Route *r, uchar *addr, uchar *mask, uchar *gate, char *t, int *nifc)
@@ 658,21 653,27 @@ convroute(Route *r, uchar *addr, uchar *mask, uchar *gate, char *t, int *nifc)
static void
sprintroute(Route *r, Routewalk *rw)
{
- int nifc;
+ int nifc, n;
char t[5], *iname, ifbuf[5];
uchar addr[IPaddrlen], mask[IPaddrlen], gate[IPaddrlen];
+ char *p;
- if(rw->o >= 0) {
- convroute(r, addr, mask, gate, t, &nifc);
- iname = "-";
- if(nifc != -1) {
- iname = ifbuf;
- sprint(ifbuf, "%d", nifc);
- }
- sprint(rw->p, rformat, addr, mask, gate, t, r->tag, iname);
- rw->p += Rlinelen;
+ convroute(r, addr, mask, gate, t, &nifc);
+ iname = "-";
+ if(nifc != -1) {
+ iname = ifbuf;
+ sprint(ifbuf, "%d", nifc);
}
- rw->o++;
+ p = seprint(rw->p, rw->e, rformat, addr, mask, gate, t, r->tag, iname);
+ if(rw->o < 0){
+ n = p - rw->p;
+ if(n > -rw->o){
+ memmove(rw->p, rw->p-rw->o, n+rw->o);
+ rw->p = p + rw->o;
+ }
+ rw->o += n;
+ } else
+ rw->p = p;
}
/*
@@ 683,7 684,7 @@ rr(Route *r, Routewalk *rw)
{
int h;
- if(rw->n <= rw->o)
+ if(rw->e <= rw->p)
return 0;
if(r == nil)
return 1;
@@ 709,12 710,12 @@ void
ipwalkroutes(Fs *f, Routewalk *rw)
{
rlock(&routelock);
- if(rw->n > rw->o) {
+ if(rw->e > rw->p) {
for(rw->h = 0; rw->h < nelem(f->v4root); rw->h++)
if(rr(f->v4root[rw->h], rw) == 0)
break;
}
- if(rw->n > rw->o) {
+ if(rw->e > rw->p) {
for(rw->h = 0; rw->h < nelem(f->v6root); rw->h++)
if(rr(f->v6root[rw->h], rw) == 0)
break;
@@ 727,20 728,14 @@ routeread(Fs *f, char *p, ulong offset, int n)
{
Routewalk rw;
- if(offset % Rlinelen)
- return 0;
-
rw.p = p;
- rw.n = n/Rlinelen;
- rw.o = -(offset/Rlinelen);
+ rw.e = p+n;
+ rw.o = -offset;
rw.walk = sprintroute;
ipwalkroutes(f, &rw);
- if(rw.o < 0)
- rw.o = 0;
-
- return rw.o*Rlinelen;
+ return rw.p - p;
}
/*