static char sccsid
[] = "@(#)route.c 4.2 82/08/19";
struct sockaddr_in sin
= { AF_INET
};
printf("usage: route [ cmd ] [ args ]\n"), exit(1);
s
= socket(SOCK_RAW
, 0, 0, options
);
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
);
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 (in_lnaof(sin
->sin_addr
) != 0)
route
.rt_flags
|= RTF_HOST
;
if (argc
> 3 && atoi(argv
[3]) > 0)
route
.rt_flags
|= RTF_GATEWAY
;
printf("%s %x: gateway %x, flags %x\n", cmd
, sin
->sin_addr
,
((struct sockaddr_in
*)&route
.rt_gateway
)->sin_addr
,
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");
sin
->sin_family
= AF_INET
;
if ((sin
->sin_addr
.s_addr
= rhost(&s
)) != -1)
fprintf(stderr
, "%s: unknown host\n", s
);
sin
->sin_addr
.s_addr
= atoi(s
);
if (sin
->sin_addr
.s_addr
== -1) {
fprintf(stderr
, "%s: bad value\n", s
);
* Return the local network address portion of an
* internet address; handles class a/b/c network
(((in).s_addr&IN_CLASSA) == 0 ? (in).s_addr&IN_CLASSA_LNA : \
((in).s_addr&IN_CLASSB) == 0 ? (in).s_addr&IN_CLASSB_LNA : \
(in).s_addr&IN_CLASSC_LNA)
return ((int)htonl((u_long
)IN_LNAOF(in
)));