3 1998-07-01 - Arnaldo Carvalho de Melo - GNU gettext instead of catgets
10 #include <sys/param.h>
11 #include <sys/types.h>
12 #include <sys/socket.h>
13 #include <netinet/in.h>
14 #include <arpa/inet.h>
15 #include <arpa/nameser.h>
17 #include <sys/ioctl.h>
27 #include <net/route.h>
29 #include <netinet6/ipv6_route.h> /* glibc does not have this */
32 #include "net-support.h"
33 #include "pathnames.h"
35 #include "net-features.h"
39 extern struct aftype inet6_aftype;
44 static int usage(void)
46 fprintf(stderr, _("Usage: inet6_route [-vF] del Target\n"));
47 fprintf(stderr, _(" inet6_route [-vF] add Target [gw Gw] [metric M] [[dev] If]\n"));
48 fprintf(stderr, _(" inet6_route [-FC] flush NOT supported\n"));
53 static int INET6_setroute(int action, int options, char **args)
57 struct sockaddr_in6 sa6;
58 char target[128], gateway[128] = "NONE";
59 int metric, prefix_len;
66 strcpy(target, *args++);
67 if (!strcmp(target, "default")) {
69 memset(&sa6, 0, sizeof(sa6));
71 if ((cp = strchr(target, '/'))) {
72 prefix_len = atol(cp + 1);
73 if ((prefix_len < 0) || (prefix_len > 128))
79 if (inet6_aftype.input(1, target, (struct sockaddr *) &sa6) < 0
80 && inet6_aftype.input(0, target, (struct sockaddr *) &sa6) < 0) {
81 inet6_aftype.herror(target);
86 /* Clean out the RTREQ structure. */
87 memset((char *) &rt, 0, sizeof(struct in6_rtmsg));
89 memcpy(&rt.rtmsg_dst, sa6.sin6_addr.s6_addr, sizeof(struct in6_addr));
91 /* Fill in the other fields. */
92 rt.rtmsg_flags = RTF_UP;
93 if (prefix_len == 128)
94 rt.rtmsg_flags |= RTF_HOST;
96 rt.rtmsg_dst_len = prefix_len;
99 if (!strcmp(*args, "metric")) {
102 if (!*args || !isdigit(**args))
104 metric = atoi(*args);
105 rt.rtmsg_metric = metric;
109 if (!strcmp(*args, "gw") || !strcmp(*args, "gateway")) {
113 if (rt.rtmsg_flags & RTF_GATEWAY)
115 strcpy(gateway, *args);
116 if (inet6_aftype.input(1, gateway,
117 (struct sockaddr *) &sa6) < 0) {
118 inet6_aftype.herror(gateway);
121 memcpy(&rt.rtmsg_gateway, sa6.sin6_addr.s6_addr,
122 sizeof(struct in6_addr));
123 rt.rtmsg_flags |= RTF_GATEWAY;
127 if (!strcmp(*args, "mod")) {
129 rt.rtmsg_flags |= RTF_MODIFIED;
132 if (!strcmp(*args, "dyn")) {
134 rt.rtmsg_flags |= RTF_DYNAMIC;
137 if (!strcmp(*args, "device") || !strcmp(*args, "dev")) {
148 /* Create a socket to the INET6 kernel. */
149 if ((skfd = socket(AF_INET6, SOCK_DGRAM, 0)) < 0) {
154 memset(&ifr, 0, sizeof(ifr));
155 strcpy(ifr.ifr_name, devname);
157 if (ioctl(skfd, SIOGIFINDEX, &ifr) < 0) {
158 perror("SIOGIFINDEX");
161 rt.rtmsg_ifindex = ifr.ifr_ifindex;
163 rt.rtmsg_ifindex = 0;
165 /* Tell the kernel to accept this route. */
166 if (action == RTACTION_DEL) {
167 if (ioctl(skfd, SIOCDELRT, &rt) < 0) {
173 if (ioctl(skfd, SIOCADDRT, &rt) < 0) {
180 /* Close the socket. */
185 int INET6_rinput(int action, int options, char **args)
187 if (action == RTACTION_FLUSH) {
188 fprintf(stderr, _("Flushing `inet6' routing table not supported\n"));
191 if ((*args == NULL) || (action == RTACTION_HELP))
194 return (INET6_setroute(action, options, args));
196 #endif /* HAVE_AFINET6 */