Commit | Line | Data |
---|---|---|
4bec325f | 1 | #ifndef lint |
379dcc38 | 2 | static 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 | |
17 | struct rtentry route; | |
18 | int options; | |
19 | int s; | |
20 | struct sockaddr_in sin = { AF_INET }; | |
379dcc38 | 21 | struct in_addr inet_makeaddr(); |
4bec325f BJ |
22 | |
23 | main(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 | ||
46 | newroute(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 | ||
73 | changeroute(argc, argv) | |
74 | int argc; | |
75 | char *argv[]; | |
76 | { | |
77 | printf("not supported\n"); | |
78 | } | |
79 | ||
80 | error(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 | ||
95 | getaddr(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 | } |