Hi,

Prepare the route command for using 64 bit route expire time and
fix the relative expire time calculations.

ok?

bluhm

Index: sbin/route/route.c
===================================================================
RCS file: /data/mirror/openbsd/cvs/src/sbin/route/route.c,v
retrieving revision 1.163
diff -u -p -u -p -r1.163 route.c
--- sbin/route/route.c  19 Jul 2013 20:10:23 -0000      1.163
+++ sbin/route/route.c  28 Sep 2013 22:46:01 -0000
@@ -362,17 +362,23 @@ flushroutes(int argc, char **argv)
 void
 set_metric(char *value, int key)
 {
-       int flag = 0;
-       u_int noval, *valp = &noval;
+       long long relative_expire;
        const char *errstr;
+       int flag = 0;
 
        switch (key) {
        case K_MTU:
-               valp = &rt_metrics.rmx_mtu;
+               rt_metrics.rmx_mtu = strtonum(value, 0, UINT_MAX, &errstr);
+               if (errstr)
+                       errx(1, "set_metric mtu: %s is %s", value, errstr);
                flag = RTV_MTU;
                break;
        case K_EXPIRE:
-               valp = &rt_metrics.rmx_expire;
+               relative_expire = strtonum(value, 0, INT_MAX, &errstr);
+               if (errstr)
+                       errx(1, "set_metric expire: %s is %s", value, errstr);
+               rt_metrics.rmx_expire = relative_expire ?
+                   relative_expire + time(NULL) : 0;
                flag = RTV_EXPIRE;
                break;
        case K_HOPCOUNT:
@@ -391,9 +397,6 @@ set_metric(char *value, int key)
                rt_metrics.rmx_locks |= flag;
        if (locking)
                locking = 0;
-       *valp = strtonum(value, 0, UINT_MAX, &errstr);
-       if (errstr)
-               errx(1, "set_metric: %s is %s", value, errstr);
 }
 
 int
@@ -1274,6 +1277,7 @@ get_linkstate(int mt, int link_state)
 void
 print_rtmsg(struct rt_msghdr *rtm, int msglen)
 {
+       long long relative_expire;
        struct if_msghdr *ifm;
        struct ifa_msghdr *ifam;
        struct if_announcemsghdr *ifan;
@@ -1340,12 +1344,12 @@ print_rtmsg(struct rt_msghdr *rtm, int m
                bprintf(stdout, rtm->rtm_flags, routeflags);
                if (verbose) {
 #define lock(f)        ((rtm->rtm_rmx.rmx_locks & __CONCAT(RTV_,f)) ? 'L' : ' 
')
-                       if (rtm->rtm_rmx.rmx_expire)
-                               rtm->rtm_rmx.rmx_expire -= time(NULL);
-                       printf("\nuse: %8llu   mtu: %8u%c   expire: %8d%c",
+                       relative_expire = rtm->rtm_rmx.rmx_expire ?
+                           rtm->rtm_rmx.rmx_expire - time(NULL) : 0;
+                       printf("\nuse: %8llu   mtu: %8u%c   expire: %8lld%c",
                            rtm->rtm_rmx.rmx_pksent,
                            rtm->rtm_rmx.rmx_mtu, lock(MTU),
-                           rtm->rtm_rmx.rmx_expire, lock(EXPIRE));
+                           relative_expire, lock(EXPIRE));
 #undef lock
                }
                pmsg_common(rtm);
@@ -1380,6 +1384,7 @@ priorityname(u_int8_t prio)
 void
 print_getmsg(struct rt_msghdr *rtm, int msglen)
 {
+       long long relative_expire;
        struct sockaddr *dst = NULL, *gate = NULL, *mask = NULL, *ifa = NULL;
        struct sockaddr_dl *ifp = NULL;
        struct sockaddr_rtlabel *sa_rl = NULL;
@@ -1465,12 +1470,13 @@ print_getmsg(struct rt_msghdr *rtm, int 
                printf("      label: %s\n", sa_rl->sr_label);
 
 #define lock(f)        ((rtm->rtm_rmx.rmx_locks & __CONCAT(RTV_,f)) ? 'L' : ' 
')
-       printf("%s\n", "     use       mtu    expire");
-       printf("%8llu  ", rtm->rtm_rmx.rmx_pksent);
-       printf("%8u%c ", rtm->rtm_rmx.rmx_mtu, lock(MTU));
-       if (rtm->rtm_rmx.rmx_expire)
-               rtm->rtm_rmx.rmx_expire -= time(NULL);
-       printf("%8d%c\n", rtm->rtm_rmx.rmx_expire, lock(EXPIRE));
+       relative_expire = rtm->rtm_rmx.rmx_expire ?
+           rtm->rtm_rmx.rmx_expire - time(NULL) : 0;
+       printf("     use       mtu    expire\n");
+       printf("%8llu  %8u%c %8lld%c\n",
+           rtm->rtm_rmx.rmx_pksent,
+           rtm->rtm_rmx.rmx_mtu, lock(MTU),
+           relative_expire, lock(EXPIRE));
 #undef lock
 #define        RTA_IGN 
(RTA_DST|RTA_GATEWAY|RTA_NETMASK|RTA_IFP|RTA_IFA|RTA_BRD)
        if (verbose)

Reply via email to