static char sccsid
[] = "@(#)route.c 4.14 (Berkeley) 85/06/03";
struct sockaddr_in sin
= { AF_INET
};
struct in_addr
inet_makeaddr();
printf("usage: route [ -f ] [ [ -h ] [ -n ] cmd args ]\n"),
s
= socket(AF_INET
, SOCK_RAW
, 0);
for (; argc
> 0 && argv
[0][0] == '-'; argc
--, argv
++) {
for (argv
[0]++; *argv
[0]; argv
[0]++)
if (forcehost
&& forcenet
) {
fprintf(stderr
, "-n and -h are incompatible\n");
if (strcmp(*argv
, "add") == 0)
else if (strcmp(*argv
, "delete") == 0)
else if (strcmp(*argv
, "change") == 0)
changeroute(argc
-1, argv
+1);
printf("%s: huh?\n", *argv
);
* Purge all entries in the routing tables not
* associated with network interfaces.
register struct rtentry
*rt
;
int rthashsize
, i
, doinghost
= 1, kmem
;
if (nl
[N_RTHOST
].n_value
== 0) {
printf("route: \"rthost\", symbol not in namelist\n");
if (nl
[N_RTNET
].n_value
== 0) {
printf("route: \"rtnet\", symbol not in namelist\n");
if (nl
[N_RTHASHSIZE
].n_value
== 0) {
printf("route: \"rthashsize\", symbol not in namelist\n");
kmem
= open("/dev/kmem", 0);
perror("route: /dev/kmem");
lseek(kmem
, nl
[N_RTHASHSIZE
].n_value
, 0);
read(kmem
, &rthashsize
, sizeof (rthashsize
));
routehash
= (struct mbuf
**)malloc(rthashsize
*sizeof (struct mbuf
*));
lseek(kmem
, nl
[N_RTHOST
].n_value
, 0);
read(kmem
, routehash
, rthashsize
*sizeof (struct mbuf
*));
printf("Flushing routing tables:\n");
for (i
= 0; i
< rthashsize
; i
++) {
read(kmem
, &mb
, sizeof (mb
));
rt
= mtod(&mb
, struct rtentry
*);
if (rt
->rt_flags
& RTF_GATEWAY
) {
sin
= (struct sockaddr_in
*)&rt
->rt_dst
;
printf("%-15.15s ", routename(sin
->sin_addr
));
sin
= (struct sockaddr_in
*)&rt
->rt_gateway
;
printf("%-15.15s ", routename(sin
->sin_addr
));
if (ioctl(s
, SIOCDELRT
, (caddr_t
)rt
) < 0)
lseek(kmem
, nl
[N_RTNET
].n_value
, 0);
read(kmem
, routehash
, rthashsize
*sizeof (struct mbuf
*));
if (in
.s_addr
== INADDR_ANY
)
if (cp
== 0 && (lna
== INADDR_ANY
|| forcenet
)) {
np
= getnetbyaddr(net
, AF_INET
);
hp
= gethostbyaddr(&in
, sizeof (struct in_addr
), AF_INET
);
u_char
*ucp
= (u_char
*)&in
;
sprintf(line
, "%u.%u.%u", ucp
[0], ucp
[1], ucp
[2]);
sprintf(line
, "%u.%u.%u.%u", ucp
[0], ucp
[1],
printf("usage: %s destination gateway metric\n", cmd
);
printf("(metric of 0 if gateway is this host)\n");
printf("usage: %s destination gateway\n", cmd
);
ishost
= getaddr(argv
[1], &route
.rt_dst
);
(void) getaddr(argv
[2], &route
.rt_gateway
);
sin
= (struct sockaddr_in
*)&route
.rt_dst
;
route
.rt_flags
|= RTF_HOST
;
route
.rt_flags
|= RTF_GATEWAY
;
printf("%s %s: gateway ", cmd
, routename(sin
->sin_addr
));
sin
= (struct sockaddr_in
*)&route
.rt_gateway
;
printf("%s, flags %x\n", routename(sin
->sin_addr
), route
.rt_flags
);
if (ioctl(s
, *cmd
== 'a' ? SIOCADDRT
: SIOCDELRT
, (caddr_t
)&route
))
printf("not supported\n");
fprintf(stderr
, "not in table\n");
fprintf(stderr
, "entry in use\n");
else if (errno
== ENOBUFS
)
fprintf(stderr
, "routing table overflow\n");
* Interpret an argument as a network address of some kind,
* returning 1 if a host address, 0 if a network address.
if (strcmp(s
, "default") == 0) {
sin
->sin_family
= AF_INET
;
sin
->sin_addr
= inet_makeaddr(0, INADDR_ANY
);
sin
->sin_family
= np
->n_addrtype
;
sin
->sin_addr
= inet_makeaddr(np
->n_net
, INADDR_ANY
);
sin
->sin_family
= hp
->h_addrtype
;
bcopy(hp
->h_addr
, &sin
->sin_addr
, hp
->h_length
);
sin
->sin_family
= AF_INET
;
sin
->sin_addr
.s_addr
= val
;
return(inet_lnaof(sin
->sin_addr
) != INADDR_ANY
);
sin
->sin_addr
= inet_makeaddr(val
, INADDR_ANY
);
fprintf(stderr
, "%s: bad value\n", s
);