- }
- if (doinghost) {
- lseek(kmem, nl[N_RTNET].n_value, 0);
- read(kmem, routehash, rthashsize*sizeof (struct mbuf *));
- doinghost = 0;
- goto again;
- }
- close(kmem);
- free(routehash);
- return;
-}
-typedef u_char blob[128];
-
-struct rtbatch {
- struct rtbatch *nb;
- int ifree;
- struct x {
- struct rtentry rt;
- union {
- struct sockaddr sa;
- blob data;
- } dst, gate, mask;
- } x[100];
-} firstbatch, *curbatch = &firstbatch;
-
-w_tree(rn)
-struct radix_node *rn;
-{
-
- struct radix_node rnode;
- register struct rtentry *rt;
- struct sockaddr *dst;
- register struct x *x;
-
- kget(rn, rnode);
- if (rnode.rn_b < 0) {
- if ((rnode.rn_flags & RNF_ROOT) == 0) {
- register struct rtbatch *b = curbatch;
- if ((rnode.rn_flags & RNF_ACTIVE) == 0) {
- printf("Dead entry in tree: %x\n", rn);
- exit(1);
- }
- if (b->ifree >= 100) {
- R_Malloc(b->nb, struct rtbatch *,
- sizeof (*b));
- if (b->nb) {
- b = b->nb;
- Bzero(b, sizeof(*b));
- curbatch = b;
- } else {
- printf("out of space\n");
- exit(1);
- }
- }
- x = b->x + b->ifree;
- rt = &x->rt;
- kget(rn, *rt);
- dst = &x->dst.sa;
- kget(rt_key(rt), *dst);
- if (dst->sa_len > sizeof (*dst))
- kget(rt_key(rt), x->dst);
- rt->rt_nodes->rn_key = (char *)dst;
- kget(rt->rt_gateway, x->gate.sa);
- if (x->gate.sa.sa_len > sizeof (*dst))
- kget(rt->rt_gateway, x->gate);
- rt->rt_gateway = &x->gate.sa;
- if (sflag) {
- kget(rt_mask(rt), x->mask.sa);
- if (x->mask.sa.sa_len > sizeof(x->mask.sa))
- kget(rt_mask(rt), x->mask);
- rt->rt_nodes->rn_mask = (char *)&x->mask.sa;
- }
- b->ifree++;
+ rtm->rtm_type = RTM_DELETE;
+ rtm->rtm_seq = seqno;
+ if ((rlen = write(s, next, rtm->rtm_msglen)) < 0) {
+ perror("writing to routing socket");
+ printf("got only %d for rlen\n", rlen);
+ break;