static char sccsid
[] = "@(#)route.c 4.8 (Berkeley) 83/08/21";
struct sockaddr_in sin
= { AF_INET
};
struct in_addr
inet_makeaddr();
printf("usage: route [ -f ] [ cmd args ]\n"), exit(1);
s
= socket(AF_INET
, SOCK_RAW
, 0, 0);
if (strcmp(*argv
, "-f") == 0) {
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
;
struct mbuf
*routehash
[RTHASHSIZ
];
int 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");
kmem
= open("/dev/kmem", 0);
perror("route: /dev/kmem");
lseek(kmem
, nl
[N_RTHOST
].n_value
, 0);
read(kmem
, routehash
, sizeof (routehash
));
printf("Flushing routing tables:\n");
for (i
= 0; i
< RTHASHSIZ
; 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
, sizeof (routehash
));
struct netent
*np
= getnetbyaddr(net
, AF_INET
);
hp
= gethostbyaddr(&in
, sizeof (struct in_addr
),
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],
if (argc
< 3 || argc
> 4) {
printf("usage: %s destination gateway [ metric ]\n", argv
[0]);
getaddr(argv
[1], &route
.rt_dst
);
getaddr(argv
[2], &route
.rt_gateway
);
sin
= (struct sockaddr_in
*)&route
.rt_dst
;
if (inet_lnaof(sin
->sin_addr
) != 0)
route
.rt_flags
|= RTF_HOST
;
if (argc
> 3 && atoi(argv
[3]) > 0)
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");
if (strcmp(s
, "default") == 0) {
sin
->sin_family
= AF_INET
;
sin
->sin_addr
= inet_makeaddr(0, INADDR_ANY
);
sin
->sin_family
= hp
->h_addrtype
;
bcopy(hp
->h_addr
, &sin
->sin_addr
, hp
->h_length
);
sin
->sin_family
= np
->n_addrtype
;
sin
->sin_addr
= inet_makeaddr(np
->n_net
, INADDR_ANY
);
sin
->sin_family
= AF_INET
;
sin
->sin_addr
.s_addr
= val
;
sin
->sin_addr
= inet_makeaddr(val
, INADDR_ANY
);
fprintf(stderr
, "%s: bad value\n", s
);