I have a lot of routes from various sources and would like to just look
at the ones from a particular source. So I figure this would help
me. Make sense to anyone else? Or is '-v' and grep deemed sufficient?

.... Ken

Index: route.8
===================================================================
RCS file: /cvs/src/sbin/route/route.8,v
retrieving revision 1.64
diff -u -p -r1.64 route.8
--- route.8     20 Dec 2009 15:35:13 -0000      1.64
+++ route.8     20 Sep 2010 04:24:05 -0000
@@ -165,6 +165,7 @@ are shown.
 .Cm show
 .Op Ar family
 .Op Fl gateway
+.Op Fl label Ar label
 .Xc
 Print out the route table similar to "netstat -r" (see
 .Xr netstat 1 ) .
@@ -173,6 +174,10 @@ If
 .Fl gateway
 is specified, only routes whose gateway are in the
 same address family as the destination are shown.
+.Pp
+If
+.Fl label
+is specified, only routes with the specified label are shown.
 .El
 .Pp
 The other commands relating to adding, changing, or deleting routes
Index: route.c
===================================================================
RCS file: /cvs/src/sbin/route/route.c,v
retrieving revision 1.149
diff -u -p -r1.149 route.c
--- route.c     4 Sep 2010 08:06:09 -0000       1.149
+++ route.c     20 Sep 2010 04:24:05 -0000
@@ -63,14 +63,7 @@
 const struct if_status_description
                        if_status_descriptions[] = LINK_STATE_DESCRIPTIONS;
 
-union  sockunion {
-       struct sockaddr         sa;
-       struct sockaddr_in      sin;
-       struct sockaddr_in6     sin6;
-       struct sockaddr_dl      sdl;
-       struct sockaddr_rtlabel rtlabel;
-       struct sockaddr_mpls    smpls;
-} so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp, so_label, so_src;
+union sockunion so_dst, so_gate, so_mask, so_genmask, so_ifa, so_ifp, 
so_label, so_src;
 
 typedef union sockunion *sup;
 pid_t  pid;
@@ -681,6 +674,11 @@ show(int argc, char *argv[])
                                break;
                        case K_GATEWAY:
                                Fflag = 1;
+                               break;
+                       case K_LABEL:
+                               if (!--argc)
+                                       usage(1+*argv);
+                               getlabel(*++argv);
                                break;
                        default:
                                usage(*argv);
Index: show.c
===================================================================
RCS file: /cvs/src/sbin/route/show.c,v
retrieving revision 1.87
diff -u -p -r1.87 show.c
--- show.c      29 Jul 2010 16:35:40 -0000      1.87
+++ show.c      20 Sep 2010 04:24:05 -0000
@@ -64,6 +64,7 @@ char  *label_print(struct sockaddr *);
 extern int nflag;
 extern int Fflag;
 extern int verbose;
+extern union sockunion so_label;
 
 #define PLEN  (LONG_BIT / 4 + 2) /* XXX this is also defined in netstat.h */
 
@@ -285,14 +286,26 @@ p_rtentry(struct rt_msghdr *rtm)
        struct sockaddr *sa = (struct sockaddr *)((char *)rtm + 
rtm->rtm_hdrlen);
        struct sockaddr *mask, *rti_info[RTAX_MAX];
        char             ifbuf[IF_NAMESIZE];
+       char            *label;
 
        if (sa->sa_family == AF_KEY)
                return;
 
        get_rtaddrs(rtm->rtm_addrs, sa, rti_info);
+
        if (Fflag && rti_info[RTAX_GATEWAY]->sa_family != sa->sa_family) {
                return;
        }
+
+       if (strlen(so_label.rtlabel.sr_label)) {
+               if (!rti_info[RTAX_LABEL])
+                       return;
+               label = ((struct sockaddr_rtlabel *)rti_info[RTAX_LABEL])->
+                   sr_label;
+               if (strcmp(label, so_label.rtlabel.sr_label))
+                       return;
+       }
+
        if (old_af != sa->sa_family) {
                old_af = sa->sa_family;
                pr_family(sa->sa_family);
Index: show.h
===================================================================
RCS file: /cvs/src/sbin/route/show.h,v
retrieving revision 1.7
diff -u -p -r1.7 show.h
--- show.h      23 Mar 2010 15:01:50 -0000      1.7
+++ show.h      20 Sep 2010 04:24:05 -0000
@@ -19,6 +19,15 @@
 #ifndef __SHOW_H__
 #define __SHOW_H__
 
+union sockunion {
+       struct sockaddr         sa;
+       struct sockaddr_in      sin;
+       struct sockaddr_in6     sin6;
+       struct sockaddr_dl      sdl;
+       struct sockaddr_rtlabel rtlabel;
+       struct sockaddr_mpls    smpls;
+};
+
 void    p_rttables(int, u_int);
 char   *routename(struct sockaddr *);
 char   *netname(struct sockaddr *, struct sockaddr *);

Reply via email to