Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Aug 1999 07:30:02 -0700 (PDT)
From:      Ben April <ben@test.destek.net>
To:        freebsd-bugs@FreeBSD.org
Subject:   Re: bin/12898: Added a command-line switch to netstat to output the  number of routes in the routing table.
Message-ID:  <199908171430.HAA38129@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR bin/12898; it has been noted by GNATS.

From: Ben April <ben@test.destek.net>
To: freebsd-gnats-submit@freebsd.org, ben@destek.net
Cc:  
Subject: Re: bin/12898: Added a command-line switch to netstat to output the 
 number of routes in the routing table.
Date: Tue, 17 Aug 1999 10:28:45 -0400

 The diffs done correctly.
 
 --- main.c.old  Sat Jul 24 12:12:53 1999
 +++ main.c      Sun Jul 25 22:02:16 1999
 @@ -221,7 +221,7 @@
 
         af = AF_UNSPEC;
 
 -       while ((ch = getopt(argc, argv, "Aabdf:ghI:iM:mN:np:rstuw:")) !=
 -1)
 +       while ((ch = getopt(argc, argv, "Aabcdf:ghI:iM:mN:np:rstuw:"))
 != -1)
                 switch(ch) {
                 case 'A':
                         Aflag = 1;
 @@ -232,6 +232,10 @@
                 case 'b':
                         bflag = 1;
                         break;
 +               case 'c':
 +                       cflag = 1;
 +                       nflag = 1;
 +                       break;
                 case 'd':
                         dflag = 1;
                         break;
 @@ -377,6 +381,11 @@
                 intpr(interval, nl[N_IFNET].n_value);
                 exit(0);
         }
 +       if (cflag) {
 +               kread(0, 0, 0);
 +               routecount(nl[N_RTREE].n_value);
 +               exit(0);
 +       }
         if (rflag) {
                 kread(0, 0, 0);
                 if (sflag)
 @@ -562,11 +571,12 @@
  static void
  usage()
  {
 -       (void)fprintf(stderr, "%s\n%s\n%s\n%s\n",
 +       (void)fprintf(stderr, "%s\n%s\n%s\n%s\n%s\n",
  "usage: netstat [-Aan] [-f address_family] [-M core] [-N system]",
  "       netstat [-bdghimnrs] [-f address_family] [-M core] [-N
 system]",
  "       netstat [-bdn] [-I interface] [-M core] [-N system] [-w wait]",
 
 -"       netstat [-M core] [-N system] [-p protocol]");
 +"       netstat [-M core] [-N system] [-p protocol]",
 +"       netstat [-c]");
         exit(1);
  }
 
 --- netstat.1.old       Sat Jul 24 13:21:41 1999
 +++ netstat.1   Mon Jul 26 07:52:39 1999
 @@ -58,6 +58,8 @@
  .Op Fl p Ar protocol
  .Op Fl M Ar core
  .Op Fl N Ar system
 +.Nm netstat
 +.Op Fl c
  .Sh DESCRIPTION
  The
  .Nm netstat
 @@ -92,6 +94,14 @@
  .Fl i
  , as described below),
  show the number of bytes in and out.
 +.It Fl c
 +prints the number of routes in the kernel table to stdout.
 +A faster equivlant to
 +.Nm netstat
 +.Fl rn
 +|
 +.Nm wc
 +.Fl l
  .It Fl d
  With either interface display (option
  .Fl i
 
 --- route.c.old Sat Jul 24 12:10:49 1999
 +++ route.c     Sat Jul 24 14:16:41 1999
 @@ -114,15 +114,18 @@
  struct radix_node_head *rt_tables[AF_MAX+1];
 
  int    NewTree = 0;
 +int    total = 0;
 
  static struct sockaddr *kgetsa __P((struct sockaddr *));
  static void p_tree __P((struct radix_node *));
 +static void c_tree __P((struct radix_node *));
  static void p_rtnode __P((void));
  static void ntreestuff __P((void));
  static void np_rtentry __P((struct rt_msghdr *));
  static void p_sockaddr __P((struct sockaddr *, struct sockaddr *, int,
 int));
  static void p_flags __P((int, char *));
  static void p_rtentry __P((struct rtentry *));
 +static void c_rtentry __P((struct rtentry *));
  static u_long forgemask __P((u_long));
  static void domask __P((char *, u_long, u_long));
 
 @@ -877,4 +880,89 @@
                         *p += ('A' - 'a');
                         break;
                 }
 +}
 +
 +void
 +routecount(rtree)
 +        u_long rtree;
 +{
 +        struct radix_node_head *rnh, head;
 +        int i;
 +
 +        printf("Routing tables\n");
 +
 +        if (Aflag == 0 && NewTree)
 +                ntreestuff();
 +        else {
 +                if (rtree == 0) {
 +                        printf("rt_tables: symbol not in namelist\n");
 +                        return;
 +                }
 +
 +                kget(rtree, rt_tables);
 +                for (i = 0; i <= AF_MAX; i++) {
 +                        if ((rnh = rt_tables[i]) == 0)
 +                                continue;
 +                        kget(rnh, head);
 +                        if (i == AF_UNSPEC) {
 +                                if (Aflag && af == 0) {
 +                                        printf("Netmasks:\n");
 +                                        c_tree(head.rnh_treetop);
 +                                }
 +                        } else if (af == AF_UNSPEC || af == i) {
 +                                pr_family(i);
 +                                do_rtent = 1;
 +                               total=0;
 +                                c_tree(head.rnh_treetop);
 +                               printf("%d Routes\n",total);
 +                        }
 +                }
 +        }
 +}
 +
 +static void
 +c_tree(rn)
 +        struct radix_node *rn;
 +{
 +
 +again:
 +        kget(rn, rnode);
 +        if (rnode.rn_b < 0) {
 +                if (Aflag)
 +                        printf("%-8.8lx ", (u_long)rn);
 +                if (rnode.rn_flags & RNF_ROOT) {
 +                        if (Aflag)
 +                                printf("(root node)%s",
 +                                    rnode.rn_dupedkey ? " =>\n" :
 "\n");
 +                } else if (do_rtent) {
 +                        kget(rn, rtentry);
 +                        c_rtentry(&rtentry);
 +                        if (Aflag)
 +                                p_rtnode();
 +                } else {
 +                        p_sockaddr(kgetsa((struct sockaddr
 *)rnode.rn_key),
 +                                   NULL, 0, 44);
 +                        putchar('\n');
 +                }
 +                if ((rn = rnode.rn_dupedkey))
 +                        goto again;
 +        } else {
 +                if (Aflag && do_rtent) {
 +                        printf("%-8.8lx ", (u_long)rn);
 +                        p_rtnode();
 +                }
 +                rn = rnode.rn_r;
 +                c_tree(rnode.rn_l);
 +                c_tree(rn);
 +        }
 +}
 +
 +
 +static void
 +c_rtentry(rt)
 +       register struct rtentry *rt;
 +{
 +                       if (!(rt->rt_parent && !aflag)) {
 +                       ++total;
 +                       }
  }
 
 
 


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199908171430.HAA38129>