summaryrefslogtreecommitdiffstats
path: root/sbin/route
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2013-10-17 19:04:05 +0000
committerhrs <hrs@FreeBSD.org>2013-10-17 19:04:05 +0000
commit30cf0627ff47f8fea19a71c46de24ddc7d4af72b (patch)
tree7b830d70992f55594c7c473b7ec71218b7470f16 /sbin/route
parent188c164b5a7ed4a84ea1e2fb4ff5a7a61faa1def (diff)
downloadFreeBSD-src-30cf0627ff47f8fea19a71c46de24ddc7d4af72b.zip
FreeBSD-src-30cf0627ff47f8fea19a71c46de24ddc7d4af72b.tar.gz
- Add relative specification in expiration time.
- Add proto3 option for RTF_PROTO3. - Use %lu for members of struct rt_metrics.
Diffstat (limited to 'sbin/route')
-rw-r--r--sbin/route/keywords1
-rw-r--r--sbin/route/route.814
-rw-r--r--sbin/route/route.c39
3 files changed, 43 insertions, 11 deletions
diff --git a/sbin/route/keywords b/sbin/route/keywords
index adfba7c..f3fd1d8 100644
--- a/sbin/route/keywords
+++ b/sbin/route/keywords
@@ -39,6 +39,7 @@ osi
prefixlen
proto1
proto2
+proto3
proxy
recvpipe
reject
diff --git a/sbin/route/route.8 b/sbin/route/route.8
index b786106..ea41cb6 100644
--- a/sbin/route/route.8
+++ b/sbin/route/route.8
@@ -28,7 +28,7 @@
.\" @(#)route.8 8.3 (Berkeley) 3/19/94
.\" $FreeBSD$
.\"
-.Dd November 17, 2012
+.Dd October 17, 2013
.Dt ROUTE 8
.Os
.Sh NAME
@@ -301,6 +301,7 @@ by indicating the following corresponding modifiers:
-blackhole RTF_BLACKHOLE - silently discard pkts (during updates)
-proto1 RTF_PROTO1 - set protocol specific routing flag #1
-proto2 RTF_PROTO2 - set protocol specific routing flag #2
+-proto3 RTF_PROTO3 - set protocol specific routing flag #3
.Ed
.Pp
The optional modifiers
@@ -324,6 +325,17 @@ specify that all ensuing metrics may be locked by the
.Fl lockrest
meta-modifier.
.Pp
+Note that
+.Fl expire
+accepts expiration time of the route as the number of seconds since the
+Epoch
+.Pq see Xr time 3 .
+When the first character of the number is
+.Dq +
+or
+.Dq - ,
+it is interpreted as a value relative to the current time.
+.Pp
The optional modifier
.Fl fib Ar number
specifies that the command will be applied to a non-default FIB.
diff --git a/sbin/route/route.c b/sbin/route/route.c
index 6c2bbe2..a4a7469 100644
--- a/sbin/route/route.c
+++ b/sbin/route/route.c
@@ -67,6 +67,7 @@ __FBSDID("$FreeBSD$");
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
+#include <time.h>
#include <unistd.h>
#include <ifaddrs.h>
@@ -723,6 +724,7 @@ static void
set_metric(char *value, int key)
{
int flag = 0;
+ char *endptr;
u_long noval, *valp = &noval;
switch (key) {
@@ -742,7 +744,18 @@ set_metric(char *value, int key)
rt_metrics.rmx_locks |= flag;
if (locking)
locking = 0;
- *valp = atoi(value);
+ errno = 0;
+ *valp = strtol(value, &endptr, 0);
+ if (errno == 0 && *endptr != '\0')
+ errno = EINVAL;
+ if (errno)
+ err(EX_USAGE, "%s", value);
+ if (flag & RTV_EXPIRE && (value[0] == '+' || value[0] == '-')) {
+ struct timespec ts;
+
+ clock_gettime(CLOCK_REALTIME_FAST, &ts);
+ *valp += ts.tv_sec;
+ }
}
#define F_ISHOST 0x01
@@ -827,6 +840,9 @@ newroute(int argc, char **argv)
case K_PROTO2:
flags |= RTF_PROTO2;
break;
+ case K_PROTO3:
+ flags |= RTF_PROTO3;
+ break;
case K_PROXY:
nrflags |= F_PROXY;
break;
@@ -1681,6 +1697,7 @@ static void
print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
{
struct sockaddr *sp[RTAX_MAX];
+ struct timespec ts;
char *cp;
int i;
@@ -1733,15 +1750,17 @@ print_getmsg(struct rt_msghdr *rtm, int msglen, int fib)
#define msec(u) (((u) + 500) / 1000) /* usec to msec */
printf("\n%9s %9s %9s %9s %9s %10s %9s\n", "recvpipe",
"sendpipe", "ssthresh", "rtt,msec", "mtu ", "weight", "expire");
- printf("%8ld%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE));
- printf("%8ld%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE));
- printf("%8ld%c ", rtm->rtm_rmx.rmx_ssthresh, lock(SSTHRESH));
- printf("%8ld%c ", msec(rtm->rtm_rmx.rmx_rtt), lock(RTT));
- printf("%8ld%c ", rtm->rtm_rmx.rmx_mtu, lock(MTU));
- printf("%8ld%c ", rtm->rtm_rmx.rmx_weight, lock(WEIGHT));
- if (rtm->rtm_rmx.rmx_expire)
- rtm->rtm_rmx.rmx_expire -= time(0);
- printf("%8ld%c\n", rtm->rtm_rmx.rmx_expire, lock(EXPIRE));
+ printf("%8lu%c ", rtm->rtm_rmx.rmx_recvpipe, lock(RPIPE));
+ printf("%8lu%c ", rtm->rtm_rmx.rmx_sendpipe, lock(SPIPE));
+ printf("%8lu%c ", rtm->rtm_rmx.rmx_ssthresh, lock(SSTHRESH));
+ printf("%8lu%c ", msec(rtm->rtm_rmx.rmx_rtt), lock(RTT));
+ printf("%8lu%c ", rtm->rtm_rmx.rmx_mtu, lock(MTU));
+ printf("%8lu%c ", rtm->rtm_rmx.rmx_weight, lock(WEIGHT));
+ if (rtm->rtm_rmx.rmx_expire > 0)
+ clock_gettime(CLOCK_REALTIME_FAST, &ts);
+ else
+ ts.tv_sec = 0;
+ printf("%8ld%c\n", rtm->rtm_rmx.rmx_expire - ts.tv_sec, lock(EXPIRE));
#undef lock
#undef msec
#define RTA_IGN (RTA_DST|RTA_GATEWAY|RTA_NETMASK|RTA_IFP|RTA_IFA|RTA_BRD)
OpenPOWER on IntegriCloud