Mercurial > hg > toybox
annotate toys/pending/route.c @ 1363:e65f9a9ba62d draft
Cleanup pass on mkpasswd.c
author | Rob Landley <rob@landley.net> |
---|---|
date | Wed, 25 Jun 2014 22:54:59 -0500 |
parents | 9482222e51f5 |
children | 41efba077b75 |
rev | line source |
---|---|
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
1 /* route.c - Display routing table. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
2 * |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
3 * Copyright 2012 Ranjan Kumar <ranjankumar.bth@gmail.com> |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
4 * Copyright 2013 Kyungwan Han <asura321@gmail.com> |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
5 * |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
6 * No Standard |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
7 * |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
8 USE_ROUTE(NEWTOY(route, "?neA:", TOYFLAG_BIN)) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
9 config ROUTE |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
10 bool "route" |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
11 default n |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
12 help |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
13 usage: route -neA inet{6} / [{add|del}] |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
14 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
15 Display/Edit kernel routing tables. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
16 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
17 -n Don't resolve names |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
18 -e Display other/more information |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
19 -A inet{6} Select Address Family |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
20 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
21 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
22 #define FOR_route |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
23 #include "toys.h" |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
24 #include <net/route.h> |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
25 #include <sys/param.h> |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
26 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
27 GLOBALS( |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
28 char *family; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
29 ) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
30 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
31 #define DEFAULT_PREFIXLEN 128 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
32 #define INVALID_ADDR 0xffffffffUL |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
33 #define IPV6_ADDR_LEN 40 //32 + 7 (':') + 1 ('\0') |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
34 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
35 #define TEST_ARGV(argv) if (!*argv) show_route_help() |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
36 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
37 struct _arglist { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
38 char *arg; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
39 int action; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
40 }; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
41 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
42 static struct _arglist arglist1[] = { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
43 { "add", 1 }, { "del", 2 }, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
44 { "delete", 2 }, { NULL, 0 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
45 }; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
46 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
47 static struct _arglist arglist2[] = { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
48 { "-net", 1 }, { "-host", 2 }, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
49 { NULL, 0 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
50 }; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
51 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
52 // display help info and exit. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
53 static void show_route_help(void) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
54 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
55 toys.exithelp = 1; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
56 error_exit("Invalid Argument"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
57 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
58 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
59 // to get the host name from the given ip. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
60 static int get_hostname(char *ipstr, struct sockaddr_in *sockin) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
61 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
62 struct hostent *host; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
63 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
64 sockin->sin_family = AF_INET; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
65 sockin->sin_port = 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
66 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
67 if (!strcmp(ipstr, "default")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
68 sockin->sin_addr.s_addr = INADDR_ANY; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
69 return 1; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
70 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
71 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
72 if (inet_aton(ipstr, &sockin->sin_addr)) return 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
73 if (!(host = gethostbyname(ipstr))) return -1; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
74 memcpy(&sockin->sin_addr, host->h_addr_list[0], sizeof(struct in_addr)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
75 return 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
76 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
77 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
78 // used to extract the address info from the given ip. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
79 static int get_addrinfo(char *ip, struct sockaddr_in6 *sock_in6) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
80 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
81 struct addrinfo hints, *result; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
82 int status = 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
83 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
84 memset(&hints, 0, sizeof(struct addrinfo)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
85 hints.ai_family = AF_INET6; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
86 if ((status = getaddrinfo(ip, NULL, &hints, &result))) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
87 perror_msg("getaddrinfo: %s", gai_strerror(status)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
88 return -1; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
89 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
90 if (result) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
91 memcpy(sock_in6, result->ai_addr, sizeof(*sock_in6)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
92 freeaddrinfo(result); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
93 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
94 return 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
95 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
96 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
97 //get the flag values for route command. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
98 static void get_flag_value(char *str, int flags) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
99 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
100 int i = 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
101 static unsigned flagarray[] = { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
102 RTF_GATEWAY, RTF_HOST, RTF_REINSTATE, RTF_DYNAMIC, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
103 RTF_MODIFIED, RTF_DEFAULT, RTF_ADDRCONF, RTF_CACHE |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
104 }; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
105 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
106 *str++ = 'U'; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
107 while ((*str = "GHRDMDAC"[i])) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
108 if (flags & flagarray[i++]) ++str; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
109 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
110 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
111 // extract inet4 route info from /proc/net/route file and display it. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
112 static void display_routes(void) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
113 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
114 unsigned long dest, gate, mask; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
115 int flags, ref, use, metric, mss, win, irtt, items; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
116 char iface[64] = {0,}, flag_val[10]; //there are 9 flags "UGHRDMDAC" for route. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
117 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
118 FILE *fp = xfopen("/proc/net/route", "r"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
119 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
120 xprintf("Kernel IP routing table\n" |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
121 "Destination Gateway Genmask Flags %s Iface\n", |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
122 (toys.optflags & FLAG_e)? " MSS Window irtt" : "Metric Ref Use"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
123 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
124 if (fscanf(fp, "%*[^\n]\n") < 0) perror_exit("fscanf"); //skip 1st line |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
125 while ((items = fscanf(fp, "%63s%lx%lx%X%d%d%d%lx%d%d%d\n", iface, &dest, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
126 &gate, &flags, &ref, &use, &metric, &mask, &mss, &win, &irtt)) == 11) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
127 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
128 char *destip = toybuf, *gateip = toybuf+32, *maskip = toybuf+64; //ip string 16 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
129 memset(flag_val, 0, 10); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
130 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
131 if (!(flags & RTF_UP)) continue; //skip down interfaces. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
132 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
133 if (!dest && !(toys.optflags & FLAG_n)) strcpy( destip, "default"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
134 else if (!inet_ntop(AF_INET, &dest, destip, 32)) perror_exit("inet"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
135 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
136 if (!gate && !(toys.optflags & FLAG_n)) strcpy( gateip, "*"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
137 else if (!inet_ntop(AF_INET, &gate, gateip, 32)) perror_exit("inet"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
138 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
139 if (!inet_ntop(AF_INET, &mask, maskip, 32)) perror_exit("inet"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
140 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
141 //Get flag Values |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
142 get_flag_value(flag_val, (flags & (RTF_GATEWAY|RTF_HOST|RTF_REINSTATE |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
143 |RTF_DYNAMIC|RTF_MODIFIED))); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
144 if (flags & RTF_REJECT) flag_val[0] = '!'; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
145 xprintf("%-15.15s %-15.15s %-16s%-6s", destip, gateip, maskip, flag_val); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
146 if (toys.optflags & FLAG_e) xprintf("%5d %-5d %6d %s\n", mss, win, irtt, iface); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
147 else xprintf("%-6d %-2d %7d %s\n", metric, ref, use, iface); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
148 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
149 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
150 if (items > 0 && feof(fp)) perror_exit("fscanf %d", items); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
151 fclose(fp); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
152 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
153 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
154 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
155 /* |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
156 * find the given parameter in list like add/del/net/host. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
157 * and if match found return the appropriate action. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
158 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
159 static int get_action(char ***argv, struct _arglist *list) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
160 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
161 struct _arglist *alist; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
162 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
163 if (!**argv) return 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
164 for (alist = list; alist->arg; alist++) { //find the given parameter in list |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
165 if (!strcmp(**argv, alist->arg)) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
166 *argv += 1; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
167 return alist->action; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
168 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
169 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
170 return 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
171 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
172 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
173 /* |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
174 * get prefix len (if any) and remove the prefix from target ip. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
175 * if no prefix then set netmask as default. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
176 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
177 static void is_prefix(char **tip, char **netmask, struct rtentry *rt) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
178 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
179 char *prefix = strchr(*tip, '/'); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
180 if (prefix) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
181 unsigned long plen; |
1164
9482222e51f5
The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents:
1104
diff
changeset
|
182 plen = atolx_range(prefix + 1, 0, 32); |
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
183 //used to verify the netmask and route conflict. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
184 (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
185 = htonl( ~(INVALID_ADDR >> plen)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
186 *prefix = '\0'; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
187 rt->rt_genmask.sa_family = AF_INET; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
188 } else *netmask = "default"; //default netmask. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
189 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
190 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
191 /* |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
192 * used to get the params like: metric, netmask, gw, mss, window, irtt, dev and their values. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
193 * additionally set the flag values for reject, mod, dyn and reinstate. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
194 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
195 static void get_next_params(char **argv, struct rtentry *rt, char **netmask) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
196 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
197 while (*argv) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
198 //set the metric field in the routing table. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
199 if (!strcmp(*argv, "metric")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
200 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
201 TEST_ARGV(argv); |
1164
9482222e51f5
The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents:
1104
diff
changeset
|
202 rt->rt_metric = atolx_range(*argv, 0, ULONG_MAX) + 1; |
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
203 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
204 } else if (!strcmp(*argv, "netmask")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
205 //when adding a network route, the netmask to be used. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
206 struct sockaddr sock; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
207 unsigned int addr_mask = (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
208 if (addr_mask) show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
209 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
210 TEST_ARGV(argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
211 *netmask = *argv; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
212 if (get_hostname(*netmask, (struct sockaddr_in *) &sock) < 0) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
213 perror_exit("resolving '%s'", *netmask); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
214 rt->rt_genmask = sock; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
215 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
216 } else if (!strcmp(*argv, "gw")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
217 //route packets via a gateway. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
218 if (!(rt->rt_flags & RTF_GATEWAY)) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
219 int ishost; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
220 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
221 TEST_ARGV(argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
222 if ((ishost = get_hostname(*argv, (struct sockaddr_in *) &rt->rt_gateway)) == 0) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
223 rt->rt_flags |= RTF_GATEWAY; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
224 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
225 } else if (ishost < 0) perror_exit("resolving '%s'", *argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
226 else perror_exit("gateway '%s' is a NETWORK", *argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
227 } else show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
228 } else if (!strcmp(*argv, "mss")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
229 //set the TCP Maximum Segment Size for connections over this route. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
230 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
231 TEST_ARGV(argv); |
1164
9482222e51f5
The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents:
1104
diff
changeset
|
232 rt->rt_mss = atolx_range(*argv, 64, 32768); //MSS low and max |
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
233 rt->rt_flags |= RTF_MSS; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
234 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
235 } else if (!strcmp(*argv, "window")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
236 //set the TCP window size for connections over this route to W bytes. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
237 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
238 TEST_ARGV(argv); |
1164
9482222e51f5
The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents:
1104
diff
changeset
|
239 rt->rt_window = atolx_range(*argv, 128, INT_MAX); //win low |
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
240 rt->rt_flags |= RTF_WINDOW; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
241 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
242 } else if (!strcmp(*argv, "irtt")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
243 long nclock_ticks = sysconf(_SC_CLK_TCK); //number of clock ticks per second. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
244 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
245 TEST_ARGV(argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
246 nclock_ticks /= 100; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
247 rt->rt_irtt = strtoul(*argv, NULL, 10); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
248 if (nclock_ticks > 0) rt->rt_irtt *= nclock_ticks; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
249 rt->rt_flags |= 0x0100; //RTF_IRTT |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
250 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
251 } else if (!strcmp(*argv, "dev")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
252 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
253 TEST_ARGV(argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
254 if ((!rt->rt_dev)) rt->rt_dev = *argv; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
255 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
256 } else if (!strcmp(*argv, "reject")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
257 rt->rt_flags |= RTF_REJECT; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
258 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
259 } else if (!strcmp(*argv, "mod")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
260 rt->rt_flags |= RTF_MODIFIED; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
261 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
262 } else if (!strcmp(*argv, "dyn")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
263 rt->rt_flags |= RTF_DYNAMIC; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
264 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
265 } else if (!strcmp(*argv, "reinstate")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
266 rt->rt_flags |= RTF_REINSTATE; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
267 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
268 } else show_route_help(); //No match found; exit form the application. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
269 }//end of while loop. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
270 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
271 if (!rt->rt_dev && (rt->rt_flags & RTF_REJECT)) rt->rt_dev = (char *)"lo"; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
272 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
273 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
274 // verify the netmask and conflict in netmask and route address. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
275 static void verify_netmask(struct rtentry *rt, char *netmask) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
276 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
277 unsigned int addr_mask = (((struct sockaddr_in *)&((rt)->rt_genmask))->sin_addr.s_addr); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
278 unsigned int router_addr = ~(unsigned int)(((struct sockaddr_in *)&((rt)->rt_dst))->sin_addr.s_addr); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
279 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
280 if (addr_mask) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
281 addr_mask = ~ntohl(addr_mask); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
282 if ((rt->rt_flags & RTF_HOST) && addr_mask != INVALID_ADDR) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
283 perror_exit("conflicting netmask and host route"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
284 if (addr_mask & (addr_mask + 1)) perror_exit("wrong netmask '%s'", netmask); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
285 addr_mask = ((struct sockaddr_in *) &rt->rt_dst)->sin_addr.s_addr; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
286 if (addr_mask & router_addr) perror_exit("conflicting netmask and route address"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
287 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
288 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
289 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
290 // add/del a route. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
291 static void setroute(char **argv) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
292 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
293 struct rtentry rt; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
294 char *netmask = NULL, *targetip; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
295 int is_net_or_host = 0, sokfd, arg2_action; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
296 int action = get_action(&argv, arglist1); //verify the arg for add/del. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
297 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
298 if (!action || !*argv) show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
299 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
300 arg2_action = get_action(&argv, arglist2); //verify the arg for -net or -host |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
301 if (!*argv) show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
302 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
303 memset(&rt, 0, sizeof(struct rtentry)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
304 targetip = *argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
305 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
306 is_prefix((char **)&targetip, (char **)&netmask, &rt); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
307 if ((is_net_or_host = get_hostname(targetip, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
308 (struct sockaddr_in *) &rt.rt_dst)) < 0) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
309 perror_exit("resolving '%s'", targetip); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
310 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
311 if (arg2_action) is_net_or_host = arg2_action & 1; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
312 rt.rt_flags = ((is_net_or_host) ? RTF_UP : (RTF_UP | RTF_HOST)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
313 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
314 get_next_params(argv, &rt, (char **)&netmask); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
315 verify_netmask(&rt, (char *)netmask); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
316 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
317 if ((action == 1) && (rt.rt_flags & RTF_HOST)) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
318 (((struct sockaddr_in *)&((rt).rt_genmask))->sin_addr.s_addr) = INVALID_ADDR; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
319 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
320 sokfd = xsocket(AF_INET, SOCK_DGRAM, 0); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
321 if (action == 1) xioctl(sokfd, SIOCADDRT, &rt); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
322 else xioctl(sokfd, SIOCDELRT, &rt); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
323 xclose(sokfd); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
324 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
325 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
326 /* |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
327 * get prefix len (if any) and remove the prefix from target ip. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
328 * if no prefix then set default prefix len. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
329 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
330 static void is_prefix_inet6(char **tip, struct in6_rtmsg *rt) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
331 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
332 unsigned long plen; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
333 char *prefix = strchr(*tip, '/'); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
334 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
335 if (prefix) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
336 *prefix = '\0'; |
1164
9482222e51f5
The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents:
1104
diff
changeset
|
337 plen = atolx_range(prefix + 1, 0, 128); //DEFAULT_PREFIXLEN); |
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
338 } else plen = DEFAULT_PREFIXLEN; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
339 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
340 rt->rtmsg_flags = (plen == DEFAULT_PREFIXLEN) ? (RTF_UP | RTF_HOST) : RTF_UP; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
341 rt->rtmsg_dst_len = plen; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
342 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
343 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
344 /* |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
345 * used to get the params like: metric, gw, dev and their values. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
346 * additionally set the flag values for mod and dyn. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
347 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
348 static void get_next_params_inet6(char **argv, struct sockaddr_in6 *sock_in6, struct in6_rtmsg *rt, char **dev_name) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
349 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
350 while (*argv) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
351 if (!strcmp(*argv, "metric")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
352 //set the metric field in the routing table. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
353 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
354 TEST_ARGV(argv); |
1164
9482222e51f5
The recent switch from get_int_value to to atolx_range left route
Isaac Dunham <ibid.ag@gmail.com>
parents:
1104
diff
changeset
|
355 rt->rtmsg_metric = atolx_range(*argv, 0, ULONG_MAX); |
1055
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
356 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
357 } else if (!strcmp(*argv, "gw")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
358 //route packets via a gateway. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
359 if (!(rt->rtmsg_flags & RTF_GATEWAY)) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
360 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
361 TEST_ARGV(argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
362 if (!get_addrinfo(*argv, (struct sockaddr_in6 *) &sock_in6)) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
363 memcpy(&rt->rtmsg_gateway, sock_in6->sin6_addr.s6_addr, sizeof(struct in6_addr)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
364 rt->rtmsg_flags |= RTF_GATEWAY; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
365 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
366 } else perror_exit("resolving '%s'", *argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
367 } else show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
368 } else if (!strcmp(*argv, "dev")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
369 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
370 TEST_ARGV(argv); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
371 if (!*dev_name) *dev_name = *argv; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
372 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
373 } else if (!strcmp(*argv, "mod")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
374 rt->rtmsg_flags |= RTF_MODIFIED; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
375 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
376 } else if (!strcmp(*argv, "dyn")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
377 rt->rtmsg_flags |= RTF_DYNAMIC; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
378 argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
379 } else show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
380 }//end of while loop. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
381 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
382 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
383 // add/del a route. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
384 static void setroute_inet6(char **argv) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
385 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
386 struct sockaddr_in6 sock_in6; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
387 struct in6_rtmsg rt; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
388 char *targetip; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
389 int sockfd, action = get_action(&argv, arglist1); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
390 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
391 if (!action || !*argv) show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
392 memset(&sock_in6, 0, sizeof(struct sockaddr_in6)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
393 memset(&rt, 0, sizeof(struct in6_rtmsg)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
394 targetip = *argv++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
395 if (*argv) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
396 unsigned long plen = 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
397 char *dev_name = NULL; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
398 if (!strcmp(targetip, "default")) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
399 rt.rtmsg_flags = RTF_UP; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
400 rt.rtmsg_dst_len = plen; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
401 } else { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
402 is_prefix_inet6((char **)&targetip, &rt); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
403 if (get_addrinfo(targetip, (struct sockaddr_in6 *) &sock_in6)) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
404 perror_exit("resolving '%s'", targetip); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
405 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
406 rt.rtmsg_metric = 1; //default metric. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
407 memcpy(&rt.rtmsg_dst, sock_in6.sin6_addr.s6_addr, sizeof(struct in6_addr)); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
408 get_next_params_inet6(argv, &sock_in6, &rt, (char **)&dev_name); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
409 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
410 sockfd = xsocket(AF_INET6, SOCK_DGRAM, 0); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
411 if (dev_name) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
412 char ifre_buf[sizeof(struct ifreq)] = {0,}; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
413 struct ifreq *ifre = (struct ifreq*)ifre_buf; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
414 strncpy(ifre->ifr_name, dev_name, IFNAMSIZ-1); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
415 xioctl(sockfd, SIOGIFINDEX, ifre); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
416 rt.rtmsg_ifindex = ifre->ifr_ifindex; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
417 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
418 if (action == 1) xioctl(sockfd, SIOCADDRT, &rt); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
419 else xioctl(sockfd, SIOCDELRT, &rt); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
420 xclose(sockfd); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
421 } else show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
422 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
423 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
424 /* |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
425 * format the dest and src address in ipv6 format. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
426 * e.g. 2002:6b6d:26c8:d:ea03:9aff:fe65:9d62 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
427 */ |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
428 static void ipv6_addr_formating(char *ptr, char *addr) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
429 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
430 int i = 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
431 while (i <= IPV6_ADDR_LEN) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
432 if (!*ptr) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
433 if (i == IPV6_ADDR_LEN) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
434 addr[IPV6_ADDR_LEN - 1] = 0; //NULL terminating the ':' seperated address. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
435 break; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
436 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
437 error_exit("IPv6 ip format error"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
438 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
439 addr[i++] = *ptr++; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
440 if (!((i+1) % 5)) addr[i++] = ':'; //put ':' after 4th bit |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
441 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
442 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
443 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
444 static void display_routes6(void) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
445 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
446 char iface[16] = {0,}, ipv6_dest_addr[41]; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
447 char ipv6_src_addr[41], flag_val[10], buf2[INET6_ADDRSTRLEN]; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
448 int prefixlen, metric, use, refcount, flag, items = 0; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
449 unsigned char buf[sizeof(struct in6_addr)]; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
450 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
451 FILE *fp = xfopen("/proc/net/ipv6_route", "r"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
452 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
453 xprintf("Kernel IPv6 routing table\n" |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
454 "%-43s%-40s Flags Metric Ref Use Iface\n", "Destination", "Next Hop"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
455 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
456 while ((items = fscanf(fp, "%32s%x%*s%*x%32s%x%x%x%x%10s\n", ipv6_dest_addr+8, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
457 &prefixlen, ipv6_src_addr+8, &metric, &use, &refcount, &flag, |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
458 iface)) == 8) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
459 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
460 memset(flag_val, 0, 10); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
461 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
462 if (!(flag & RTF_UP)) continue; //skip down interfaces. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
463 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
464 //ipv6_dest_addr+8: as the values are filled from the 8th location of the array. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
465 ipv6_addr_formating(ipv6_dest_addr+8, ipv6_dest_addr); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
466 ipv6_addr_formating(ipv6_src_addr+8, ipv6_src_addr); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
467 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
468 get_flag_value(flag_val, (flag & (RTF_GATEWAY|RTF_HOST|RTF_DEFAULT| |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
469 RTF_ADDRCONF|RTF_CACHE))); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
470 if (inet_pton(AF_INET6, ipv6_dest_addr, buf) <= 0) perror_exit("inet"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
471 if (inet_ntop(AF_INET6, buf, buf2, INET6_ADDRSTRLEN)) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
472 sprintf(toybuf, "%s/%d", buf2, prefixlen); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
473 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
474 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
475 if (inet_pton(AF_INET6, ipv6_src_addr, buf) <= 0) perror_exit("inet"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
476 if (inet_ntop(AF_INET6, buf, buf2, INET6_ADDRSTRLEN)) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
477 xprintf("%-43s %-39s %-5s %-6d %-4d %5d %-8s\n", |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
478 toybuf, buf2, flag_val, metric, refcount, use, iface); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
479 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
480 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
481 if ((items > 0) && feof(fp)) perror_exit("fscanf"); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
482 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
483 fclose(fp); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
484 } |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
485 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
486 void route_main(void) |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
487 { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
488 if (!(toys.optflags & FLAG_A)) TT.family = "inet"; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
489 if (!*toys.optargs) { |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
490 if (!strcmp(TT.family, "inet")) display_routes(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
491 else if (!strcmp(TT.family, "inet6")) display_routes6(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
492 else show_route_help(); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
493 return; |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
494 }//End of if statement. |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
495 |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
496 if (!strcmp(TT.family, "inet6")) setroute_inet6(toys.optargs); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
497 else setroute(toys.optargs); |
f8824260d057
Ashwini Sharma submitted route.c, adding it to pending.
Rob Landley <rob@landley.net>
parents:
diff
changeset
|
498 } |