route.c (97650) | route.c (97878) |
---|---|
1/* 2 * Copyright (c) 1983, 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35#if 0 36static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95"; 37#endif 38static const char rcsid[] = | 1/* 2 * Copyright (c) 1983, 1988, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 22 unchanged lines hidden (view full) --- 31 * SUCH DAMAGE. 32 */ 33 34#ifndef lint 35#if 0 36static char sccsid[] = "From: @(#)route.c 8.6 (Berkeley) 4/28/95"; 37#endif 38static const char rcsid[] = |
39 "$FreeBSD: head/usr.bin/netstat/route.c 97650 2002-05-31 04:36:55Z silby $"; | 39 "$FreeBSD: head/usr.bin/netstat/route.c 97878 2002-06-05 18:29:26Z kbyanc $"; |
40#endif /* not lint */ 41 42#include <sys/param.h> 43#include <sys/protosw.h> 44#include <sys/socket.h> 45#include <sys/time.h> 46 47#include <net/ethernet.h> --- 73 unchanged lines hidden (view full) --- 121struct rtentry rtentry; 122struct radix_node rnode; 123struct radix_mask rmask; 124struct radix_node_head *rt_tables[AF_MAX+1]; 125 126int NewTree = 0; 127 128static struct sockaddr *kgetsa (struct sockaddr *); | 40#endif /* not lint */ 41 42#include <sys/param.h> 43#include <sys/protosw.h> 44#include <sys/socket.h> 45#include <sys/time.h> 46 47#include <net/ethernet.h> --- 73 unchanged lines hidden (view full) --- 121struct rtentry rtentry; 122struct radix_node rnode; 123struct radix_mask rmask; 124struct radix_node_head *rt_tables[AF_MAX+1]; 125 126int NewTree = 0; 127 128static struct sockaddr *kgetsa (struct sockaddr *); |
129static void size_cols (int ef, struct radix_node *rn); 130static void size_cols_tree (struct radix_node *rn); 131static void size_cols_rtentry (struct rtentry *rt); |
|
129static void p_tree (struct radix_node *); 130static void p_rtnode (void); 131static void ntreestuff (void); 132static void np_rtentry (struct rt_msghdr *); 133static void p_sockaddr (struct sockaddr *, struct sockaddr *, int, int); | 132static void p_tree (struct radix_node *); 133static void p_rtnode (void); 134static void ntreestuff (void); 135static void np_rtentry (struct rt_msghdr *); 136static void p_sockaddr (struct sockaddr *, struct sockaddr *, int, int); |
137static const char *fmt_sockaddr (struct sockaddr *sa, struct sockaddr *mask, 138 int flags); |
|
134static void p_flags (int, char *); | 139static void p_flags (int, char *); |
140static const char *fmt_flags(int f); |
|
135static void p_rtentry (struct rtentry *); 136static u_long forgemask (u_long); 137static void domask (char *, u_long, u_long); 138 139/* 140 * Print routing tables. 141 */ 142void --- 18 unchanged lines hidden (view full) --- 161 continue; 162 kget(rnh, head); 163 if (i == AF_UNSPEC) { 164 if (Aflag && af == 0) { 165 printf("Netmasks:\n"); 166 p_tree(head.rnh_treetop); 167 } 168 } else if (af == AF_UNSPEC || af == i) { | 141static void p_rtentry (struct rtentry *); 142static u_long forgemask (u_long); 143static void domask (char *, u_long, u_long); 144 145/* 146 * Print routing tables. 147 */ 148void --- 18 unchanged lines hidden (view full) --- 167 continue; 168 kget(rnh, head); 169 if (i == AF_UNSPEC) { 170 if (Aflag && af == 0) { 171 printf("Netmasks:\n"); 172 p_tree(head.rnh_treetop); 173 } 174 } else if (af == AF_UNSPEC || af == i) { |
175 size_cols(i, head.rnh_treetop); |
|
169 pr_family(i); 170 do_rtent = 1; 171 pr_rthdr(i); 172 p_tree(head.rnh_treetop); 173 } 174 } 175 } 176} --- 42 unchanged lines hidden (view full) --- 219 if (afname) 220 printf("\n%s:\n", afname); 221 else 222 printf("\nProtocol Family %d:\n", af); 223} 224 225/* column widths; each followed by one space */ 226#ifndef INET6 | 176 pr_family(i); 177 do_rtent = 1; 178 pr_rthdr(i); 179 p_tree(head.rnh_treetop); 180 } 181 } 182 } 183} --- 42 unchanged lines hidden (view full) --- 226 if (afname) 227 printf("\n%s:\n", afname); 228 else 229 printf("\nProtocol Family %d:\n", af); 230} 231 232/* column widths; each followed by one space */ 233#ifndef INET6 |
227#define WID_DST(af) 18 /* width of destination column */ 228#define WID_GW(af) 18 /* width of gateway column */ 229#define WID_IF(af) 6 /* width of netif column */ | 234#define WID_DST_DEFAULT(af) 18 /* width of destination column */ 235#define WID_GW_DEFAULT(af) 18 /* width of gateway column */ 236#define WID_IF_DEFAULT(af) 6 /* width of netif column */ |
230#else | 237#else |
231#define WID_DST(af) \ 232 ((af) == AF_INET6 ? (Wflag ? 39 : (numeric_addr ? 33: 18)) : 18) 233#define WID_GW(af) \ 234 ((af) == AF_INET6 ? (Wflag ? 31 : (numeric_addr ? 29 : 18)) : 18) 235#define WID_IF(af) ((af) == AF_INET6 ? 8 : 6) | 238#define WID_DST_DEFAULT(af) \ 239 ((af) == AF_INET6 ? (numeric_addr ? 33: 18) : 18) 240#define WID_GW_DEFAULT(af) \ 241 ((af) == AF_INET6 ? (numeric_addr ? 29 : 18) : 18) 242#define WID_IF_DEFAULT(af) ((af) == AF_INET6 ? 8 : 6) |
236#endif /*INET6*/ 237 | 243#endif /*INET6*/ 244 |
245static int wid_dst; 246static int wid_gw; 247static int wid_flags; 248static int wid_refs; 249static int wid_use; 250static int wid_mtu; 251static int wid_if; 252static int wid_expire; 253 254static void 255size_cols(int ef, struct radix_node *rn) 256{ 257 wid_dst = WID_DST_DEFAULT(ef); 258 wid_gw = WID_GW_DEFAULT(ef); 259 wid_flags = 6; 260 wid_refs = 6; 261 wid_use = 8; 262 wid_mtu = 6; 263 wid_if = WID_IF_DEFAULT(ef); 264 wid_expire = 6; 265 266 if (Wflag) 267 size_cols_tree(rn); 268} 269 270static void 271size_cols_tree(struct radix_node *rn) 272{ 273again: 274 kget(rn, rnode); 275 if (rnode.rn_bit < 0) { 276 if ((rnode.rn_flags & RNF_ROOT) == 0) { 277 kget(rn, rtentry); 278 size_cols_rtentry(&rtentry); 279 } 280 if ((rn = rnode.rn_dupedkey)) 281 goto again; 282 } else { 283 rn = rnode.rn_right; 284 size_cols_tree(rnode.rn_left); 285 size_cols_tree(rn); 286 } 287} 288 289static void 290size_cols_rtentry(struct rtentry *rt) 291{ 292 static struct ifnet ifnet, *lastif; 293 struct rtentry parent; 294 static char buffer[100]; 295 const char *bp; 296 struct sockaddr *sa; 297 sa_u addr, mask; 298 int len; 299 300 /* 301 * Don't print protocol-cloned routes unless -a. 302 */ 303 if (rt->rt_flags & RTF_WASCLONED && !aflag) { 304 kget(rt->rt_parent, parent); 305 if (parent.rt_flags & RTF_PRCLONING) 306 return; 307 } 308 309 bzero(&addr, sizeof(addr)); 310 if ((sa = kgetsa(rt_key(rt)))) 311 bcopy(sa, &addr, sa->sa_len); 312 bzero(&mask, sizeof(mask)); 313 if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt)))) 314 bcopy(sa, &mask, sa->sa_len); 315 bp = fmt_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags); 316 len = strlen(bp); 317 wid_dst = MAX(len, wid_dst); 318 319 bp = fmt_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST); 320 len = strlen(bp); 321 wid_gw = MAX(len, wid_gw); 322 323 bp = fmt_flags(rt->rt_flags); 324 len = strlen(bp); 325 wid_flags = MAX(len, wid_flags); 326 327 if (addr.u_sa.sa_family == AF_INET || Wflag) { 328 len = snprintf(buffer, sizeof(buffer), "%ld", rt->rt_refcnt); 329 wid_refs = MAX(len, wid_refs); 330 len = snprintf(buffer, sizeof(buffer), "%lu", rt->rt_use); 331 wid_use = MAX(len, wid_use); 332 if (Wflag && rt->rt_rmx.rmx_mtu != 0) { 333 len = snprintf(buffer, sizeof(buffer), 334 "%lu", rt->rt_rmx.rmx_mtu); 335 wid_mtu = MAX(len, wid_mtu); 336 } 337 } 338 if (rt->rt_ifp) { 339 if (rt->rt_ifp != lastif) { 340 len = snprintf(buffer, sizeof(buffer), "%d", 341 ifnet.if_unit); 342 kget(rt->rt_ifp, ifnet); 343 kread((u_long)ifnet.if_name, buffer, sizeof(buffer)); 344 lastif = rt->rt_ifp; 345 len += strlen(buffer); 346 wid_if = MAX(len, wid_if); 347 } 348 if (rt->rt_rmx.rmx_expire) { 349 time_t expire_time; 350 351 if ((expire_time = 352 rt->rt_rmx.rmx_expire - time(NULL)) > 0) { 353 len = snprintf(buffer, sizeof(buffer), "%d", 354 (int)expire_time); 355 wid_expire = MAX(len, wid_expire); 356 } 357 } 358 } 359} 360 361 |
|
238/* 239 * Print header for routing table columns. 240 */ 241void 242pr_rthdr(int af) 243{ 244 245 if (Aflag) 246 printf("%-8.8s ","Address"); | 362/* 363 * Print header for routing table columns. 364 */ 365void 366pr_rthdr(int af) 367{ 368 369 if (Aflag) 370 printf("%-8.8s ","Address"); |
247 if (af == AF_INET || Wflag) 248 if (Wflag) 249 printf("%-*.*s %-*.*s %-6.6s %6.6s %8.8s %6.6s %*.*s %6s\n", 250 WID_DST(af), WID_DST(af), "Destination", 251 WID_GW(af), WID_GW(af), "Gateway", 252 "Flags", "Refs", "Use", "Mtu", 253 WID_IF(af), WID_IF(af), "Netif", "Expire"); 254 else 255 printf("%-*.*s %-*.*s %-6.6s %6.6s %8.8s %*.*s %6s\n", 256 WID_DST(af), WID_DST(af), "Destination", 257 WID_GW(af), WID_GW(af), "Gateway", 258 "Flags", "Refs", "Use", 259 WID_IF(af), WID_IF(af), "Netif", "Expire"); 260 else 261 printf("%-*.*s %-*.*s %-6.6s %8.8s %6s\n", 262 WID_DST(af), WID_DST(af), "Destination", 263 WID_GW(af), WID_GW(af), "Gateway", 264 "Flags", "Netif", "Expire"); | 371 if (af == AF_INET || Wflag) { 372 if (Wflag) { 373 printf("%-*.*s %-*.*s %-*.*s %*.*s %*.*s %*.*s %*.*s %*s\n", 374 wid_dst, wid_dst, "Destination", 375 wid_gw, wid_gw, "Gateway", 376 wid_flags, wid_flags, "Flags", 377 wid_refs, wid_refs, "Refs", 378 wid_use, wid_use, "Use", 379 wid_mtu, wid_mtu, "Mtu", 380 wid_if, wid_if, "Netif", 381 wid_expire, "Expire"); 382 } else { 383 printf("%-*.*s %-*.*s %-*.*s %*.*s %*.*s %*.*s %*s\n", 384 wid_dst, wid_dst, "Destination", 385 wid_gw, wid_gw, "Gateway", 386 wid_flags, wid_flags, "Flags", 387 wid_refs, wid_refs, "Refs", 388 wid_use, wid_use, "Use", 389 wid_if, wid_if, "Netif", 390 wid_expire, "Expire"); 391 } 392 } else { 393 printf("%-*.*s %-*.*s %-*.*s %*.*s %*s\n", 394 wid_dst, wid_dst, "Destination", 395 wid_gw, wid_gw, "Gateway", 396 wid_flags, wid_flags, "Flags", 397 wid_if, wid_if, "Netif", 398 wid_expire, "Expire"); 399 } |
265} 266 267static struct sockaddr * 268kgetsa(struct sockaddr *dst) 269{ 270 271 kget(dst, pt_u.u_sa); 272 if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa)) --- 144 unchanged lines hidden (view full) --- 417 } 418 p_flags(rtm->rtm_flags & interesting, "%-6.6s "); 419 putchar('\n'); 420} 421 422static void 423p_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags, int width) 424{ | 400} 401 402static struct sockaddr * 403kgetsa(struct sockaddr *dst) 404{ 405 406 kget(dst, pt_u.u_sa); 407 if (pt_u.u_sa.sa_len > sizeof (pt_u.u_sa)) --- 144 unchanged lines hidden (view full) --- 552 } 553 p_flags(rtm->rtm_flags & interesting, "%-6.6s "); 554 putchar('\n'); 555} 556 557static void 558p_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags, int width) 559{ |
425 char workbuf[128], *cplim; 426 register char *cp = workbuf; | 560 const char *cp; |
427 | 561 |
562 cp = fmt_sockaddr(sa, mask, flags); 563 564 if (width < 0 ) 565 printf("%s ", cp); 566 else { 567 if (numeric_addr) 568 printf("%-*s ", width, cp); 569 else 570 printf("%-*.*s ", width, width, cp); 571 } 572} 573 574static const char * 575fmt_sockaddr(struct sockaddr *sa, struct sockaddr *mask, int flags) 576{ 577 static char workbuf[128]; 578 char *cplim; 579 char *cp = workbuf; 580 |
|
428 switch(sa->sa_family) { 429 case AF_INET: 430 { 431 register struct sockaddr_in *sin = (struct sockaddr_in *)sa; 432 433 if ((sin->sin_addr.s_addr == INADDR_ANY) && 434 mask && 435 ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr) --- 101 unchanged lines hidden (view full) --- 537 while (s < slim && cp < cplim) { 538 cp += sprintf(cp, " %02x", *s++); 539 if (s < slim) 540 cp += sprintf(cp, "%02x", *s++); 541 } 542 cp = workbuf; 543 } 544 } | 581 switch(sa->sa_family) { 582 case AF_INET: 583 { 584 register struct sockaddr_in *sin = (struct sockaddr_in *)sa; 585 586 if ((sin->sin_addr.s_addr == INADDR_ANY) && 587 mask && 588 ntohl(((struct sockaddr_in *)mask)->sin_addr.s_addr) --- 101 unchanged lines hidden (view full) --- 690 while (s < slim && cp < cplim) { 691 cp += sprintf(cp, " %02x", *s++); 692 if (s < slim) 693 cp += sprintf(cp, "%02x", *s++); 694 } 695 cp = workbuf; 696 } 697 } |
545 if (width < 0 ) 546 printf("%s ", cp); 547 else { 548 if (numeric_addr) 549 printf("%-*s ", width, cp); 550 else 551 printf("%-*.*s ", width, width, cp); 552 } | 698 699 return (cp); |
553} 554 555static void 556p_flags(int f, char *format) 557{ | 700} 701 702static void 703p_flags(int f, char *format) 704{ |
558 char name[33], *flags; 559 register struct bits *p = bits; | 705 printf(format, fmt_flags(f)); 706} |
560 | 707 |
708static const char * 709fmt_flags(int f) 710{ 711 static char name[33]; 712 char *flags; 713 struct bits *p = bits; 714 |
|
561 for (flags = name; p->b_mask; p++) 562 if (p->b_mask & f) 563 *flags++ = p->b_val; 564 *flags = '\0'; | 715 for (flags = name; p->b_mask; p++) 716 if (p->b_mask & f) 717 *flags++ = p->b_val; 718 *flags = '\0'; |
565 printf(format, name); | 719 return (name); |
566} 567 568static void 569p_rtentry(struct rtentry *rt) 570{ 571 static struct ifnet ifnet, *lastif; 572 struct rtentry parent; | 720} 721 722static void 723p_rtentry(struct rtentry *rt) 724{ 725 static struct ifnet ifnet, *lastif; 726 struct rtentry parent; |
573 static char name[16]; 574 static char prettyname[9]; | 727 static char buffer[128]; 728 static char prettyname[128]; |
575 struct sockaddr *sa; 576 sa_u addr, mask; 577 578 /* 579 * Don't print protocol-cloned routes unless -a. 580 */ 581 if (rt->rt_flags & RTF_WASCLONED && !aflag) { 582 kget(rt->rt_parent, parent); 583 if (parent.rt_flags & RTF_PRCLONING) 584 return; 585 } 586 587 bzero(&addr, sizeof(addr)); 588 if ((sa = kgetsa(rt_key(rt)))) 589 bcopy(sa, &addr, sa->sa_len); 590 bzero(&mask, sizeof(mask)); 591 if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt)))) 592 bcopy(sa, &mask, sa->sa_len); | 729 struct sockaddr *sa; 730 sa_u addr, mask; 731 732 /* 733 * Don't print protocol-cloned routes unless -a. 734 */ 735 if (rt->rt_flags & RTF_WASCLONED && !aflag) { 736 kget(rt->rt_parent, parent); 737 if (parent.rt_flags & RTF_PRCLONING) 738 return; 739 } 740 741 bzero(&addr, sizeof(addr)); 742 if ((sa = kgetsa(rt_key(rt)))) 743 bcopy(sa, &addr, sa->sa_len); 744 bzero(&mask, sizeof(mask)); 745 if (rt_mask(rt) && (sa = kgetsa(rt_mask(rt)))) 746 bcopy(sa, &mask, sa->sa_len); |
593 p_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags, 594 WID_DST(addr.u_sa.sa_family)); 595 p_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST, 596 WID_GW(addr.u_sa.sa_family)); 597 p_flags(rt->rt_flags, "%-6.6s "); | 747 p_sockaddr(&addr.u_sa, &mask.u_sa, rt->rt_flags, wid_dst); 748 p_sockaddr(kgetsa(rt->rt_gateway), NULL, RTF_HOST, wid_gw); 749 snprintf(buffer, sizeof(buffer), "%%-%d.%ds ", wid_flags, wid_flags); 750 p_flags(rt->rt_flags, buffer); |
598 if (addr.u_sa.sa_family == AF_INET || Wflag) { | 751 if (addr.u_sa.sa_family == AF_INET || Wflag) { |
599 printf("%6ld %8lu ", rt->rt_refcnt, rt->rt_use); | 752 printf("%*ld %*lu ", wid_refs, rt->rt_refcnt, 753 wid_use, rt->rt_use); |
600 if (Wflag) { 601 if (rt->rt_rmx.rmx_mtu != 0) | 754 if (Wflag) { 755 if (rt->rt_rmx.rmx_mtu != 0) |
602 printf("%6lu ", rt->rt_rmx.rmx_mtu); | 756 printf("%*lu ", wid_mtu, rt->rt_rmx.rmx_mtu); |
603 else | 757 else |
604 printf("%6s ", ""); | 758 printf("%*s ", wid_mtu, ""); |
605 } 606 } 607 if (rt->rt_ifp) { 608 if (rt->rt_ifp != lastif) { 609 kget(rt->rt_ifp, ifnet); | 759 } 760 } 761 if (rt->rt_ifp) { 762 if (rt->rt_ifp != lastif) { 763 kget(rt->rt_ifp, ifnet); |
610 kread((u_long)ifnet.if_name, name, 16); | 764 kread((u_long)ifnet.if_name, buffer, sizeof(buffer)); |
611 lastif = rt->rt_ifp; | 765 lastif = rt->rt_ifp; |
612 snprintf(prettyname, sizeof prettyname, 613 "%s%d", name, ifnet.if_unit); | 766 snprintf(prettyname, sizeof(prettyname), 767 "%s%d", buffer, ifnet.if_unit); |
614 } | 768 } |
615 printf("%*.*s", WID_IF(addr.u_sa.sa_family), 616 WID_IF(addr.u_sa.sa_family), prettyname); | 769 printf("%*.*s", wid_if, wid_if, prettyname); |
617 if (rt->rt_rmx.rmx_expire) { 618 time_t expire_time; 619 620 if ((expire_time = 621 rt->rt_rmx.rmx_expire - time((time_t *)0)) > 0) | 770 if (rt->rt_rmx.rmx_expire) { 771 time_t expire_time; 772 773 if ((expire_time = 774 rt->rt_rmx.rmx_expire - time((time_t *)0)) > 0) |
622 printf(" %6d", (int)expire_time); | 775 printf(" %*d", wid_expire, (int)expire_time); |
623 } 624 if (rt->rt_nodes[0].rn_dupedkey) 625 printf(" =>"); 626 } 627 putchar('\n'); 628} 629 630char * --- 431 unchanged lines hidden --- | 776 } 777 if (rt->rt_nodes[0].rn_dupedkey) 778 printf(" =>"); 779 } 780 putchar('\n'); 781} 782 783char * --- 431 unchanged lines hidden --- |