static char sccsid
[] = "@(#)route.c 4.9 (Berkeley) 84/05/11";
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
));
subnet
= inet_subnetof(in
);
np
= getnetbyaddr(net
, AF_INET
);
} else if ((subnet
!= net
) && ((lna
& 0xff) == 0) &&
(np
= getnetbyaddr(subnet
, AF_INET
))) {
struct in_addr subnaddr
, inet_makeaddr();
subnaddr
= inet_makeaddr(subnet
, INADDR_ANY
);
if (bcmp(&in
, &subnaddr
, sizeof(in
)) == 0)
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
= 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
;
return(inet_lnaof(sin
->sin_addr
) != INADDR_ANY
);
sin
->sin_addr
= inet_makeaddr(val
, INADDR_ANY
);
fprintf(stderr
, "%s: bad value\n", s
);
* Return the possible subnetwork number from an internet address.
* If the address is of the form of a subnet address (most significant
* bit of the host part is set), believe the subnet exists.
* Otherwise, return the network number.
* SHOULD FIND OUT WHETHER THIS IS A LOCAL NETWORK BEFORE LOOKING
* INSIDE OF THE HOST PART. We can only believe this if we have other
* information (e.g., we can find a name for this number).
register u_long i
= ntohl(in
.s_addr
);
return ((i
& IN_CLASSA_SUBNET
) >> IN_CLASSA_SUBNSHIFT
);
return ((i
& IN_CLASSA_NET
) >> IN_CLASSA_NSHIFT
);
} else if (IN_CLASSB(i
)) {
return ((i
& IN_CLASSB_SUBNET
) >> IN_CLASSB_SUBNSHIFT
);
return ((i
& IN_CLASSB_NET
) >> IN_CLASSB_NSHIFT
);
return ((i
& IN_CLASSC_NET
) >> IN_CLASSC_NSHIFT
);