cleanup and from sun
[unix-history] / usr / src / sbin / route / route.c
CommitLineData
4bec325f 1#ifndef lint
accbc2e3 2static char sccsid[] = "@(#)route.c 4.3 82/10/07";
4bec325f
BJ
3#endif
4
5#include <stdio.h>
6#include <sys/types.h>
7#include <sys/socket.h>
8#include <sys/ioctl.h>
9#include <net/route.h>
10#include <net/in.h>
11#include <errno.h>
12#include <ctype.h>
accbc2e3 13#include <netdb.h>
4bec325f
BJ
14
15struct rtentry route;
16int options;
17int s;
18struct sockaddr_in sin = { AF_INET };
19
20main(argc, argv)
21 int argc;
22 char *argv[];
23{
24
25 if (argc < 2)
26 printf("usage: route [ cmd ] [ args ]\n"), exit(1);
27 s = socket(SOCK_RAW, 0, 0, options);
28 if (s < 0) {
29 perror("socket");
30 exit(1);
31 }
32 argc--, argv++;
33 if (strcmp(*argv, "add") == 0)
34 newroute(argc, argv);
35 else if (strcmp(*argv, "delete") == 0)
36 newroute(argc, argv);
37 else if (strcmp(*argv, "change") == 0)
38 changeroute(argc-1, argv+1);
39 else
40 printf("%s: huh?\n", *argv);
41}
42
43newroute(argc, argv)
44 int argc;
45 char *argv[];
46{
47 struct sockaddr_in *sin;
48 char *cmd;
49
183ef13b
SL
50 if (argc < 3 || argc > 4) {
51 printf("usage: %s destination gateway [ metric ]\n", argv[0]);
4bec325f
BJ
52 return;
53 }
183ef13b
SL
54 cmd = argv[0];
55 getaddr(argv[1], &route.rt_dst);
56 getaddr(argv[2], &route.rt_gateway);
4bec325f
BJ
57 sin = (struct sockaddr_in *)&route.rt_dst;
58 route.rt_flags = RTF_UP;
accbc2e3 59 if (inet_lnaof(sin->sin_addr) != 0)
4bec325f 60 route.rt_flags |= RTF_HOST;
183ef13b
SL
61 if (argc > 3 && atoi(argv[3]) > 0)
62 route.rt_flags |= RTF_GATEWAY;
63 printf("%s %x: gateway %x, flags %x\n", cmd, sin->sin_addr,
64 ((struct sockaddr_in *)&route.rt_gateway)->sin_addr,
65 route.rt_flags);
4bec325f
BJ
66 if (ioctl(s, *cmd == 'a' ? SIOCADDRT : SIOCDELRT, (caddr_t)&route))
67 error(cmd);
68}
69
70changeroute(argc, argv)
71 int argc;
72 char *argv[];
73{
74 printf("not supported\n");
75}
76
77error(cmd)
78 char *cmd;
79{
80 extern int errno;
81
82 if (errno == ESRCH)
83 fprintf(stderr, "not in table\n");
84 else if (errno == EBUSY)
85 fprintf(stderr, "entry in use\n");
86 else if (errno == ENOBUFS)
87 fprintf(stderr, "routing table overflow\n");
88 else
89 perror(cmd);
90}
91
92getaddr(s, sin)
93 char *s;
94 struct sockaddr_in *sin;
95{
accbc2e3
SL
96 struct hostent *hp;
97
98 hp = gethostbyname(s);
99 if (hp == 0) {
100 sin->sin_addr.s_addr = inet_addr(s);
101 if (sin->sin_addr.s_addr == -1) {
102 fprintf(stderr, "%s: bad value\n", s);
103 exit(1);
104 }
105 sin->sin_family = AF_INET;
4bec325f 106 return;
4bec325f 107 }
accbc2e3
SL
108 sin->sin_family = hp->h_addrtype;
109 bcopy(hp->h_addr, &sin->sin_addr, hp->h_length);
183ef13b 110}