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