aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDenis Vlasenko <vda.linux@googlemail.com>2009-03-03 14:55:29 +0000
committerDenis Vlasenko <vda.linux@googlemail.com>2009-03-03 14:55:29 +0000
commit787a492f23bbd567fb9bf2486ce9994bd19ebec2 (patch)
tree3f635aef8838bc5a6b211dc5d833c924c3295ea4
parent230997bd61eec4096e6ae70850e965b63c8886cf (diff)
downloadbusybox-w32-787a492f23bbd567fb9bf2486ce9994bd19ebec2.tar.gz
busybox-w32-787a492f23bbd567fb9bf2486ce9994bd19ebec2.tar.bz2
busybox-w32-787a492f23bbd567fb9bf2486ce9994bd19ebec2.zip
ip: in "ip rule add from all table 1", "all" is taken as 0.0.0.0/32,
whereas "any" and "default" would be 0.0.0.0/0. They must be all 0.0.0.0/0. Closes bug 57.
-rw-r--r--networking/libiproute/utils.c38
-rw-r--r--networking/libiproute/utils.h2
2 files changed, 22 insertions, 18 deletions
diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c
index cd101f176..6b9f6a7f5 100644
--- a/networking/libiproute/utils.c
+++ b/networking/libiproute/utils.c
@@ -43,7 +43,7 @@ int get_unsigned(unsigned *val, char *arg, int base)
43 return 0; 43 return 0;
44} 44}
45 45
46int get_u32(uint32_t * val, char *arg, int base) 46int get_u32(uint32_t *val, char *arg, int base)
47{ 47{
48 unsigned long res; 48 unsigned long res;
49 char *ptr; 49 char *ptr;
@@ -57,7 +57,7 @@ int get_u32(uint32_t * val, char *arg, int base)
57 return 0; 57 return 0;
58} 58}
59 59
60int get_u16(uint16_t * val, char *arg, int base) 60int get_u16(uint16_t *val, char *arg, int base)
61{ 61{
62 unsigned long res; 62 unsigned long res;
63 char *ptr; 63 char *ptr;
@@ -71,7 +71,7 @@ int get_u16(uint16_t * val, char *arg, int base)
71 return 0; 71 return 0;
72} 72}
73 73
74int get_u8(uint8_t * val, char *arg, int base) 74int get_u8(uint8_t *val, char *arg, int base)
75{ 75{
76 unsigned long res; 76 unsigned long res;
77 char *ptr; 77 char *ptr;
@@ -85,7 +85,7 @@ int get_u8(uint8_t * val, char *arg, int base)
85 return 0; 85 return 0;
86} 86}
87 87
88int get_s16(int16_t * val, char *arg, int base) 88int get_s16(int16_t *val, char *arg, int base)
89{ 89{
90 long res; 90 long res;
91 char *ptr; 91 char *ptr;
@@ -99,7 +99,7 @@ int get_s16(int16_t * val, char *arg, int base)
99 return 0; 99 return 0;
100} 100}
101 101
102int get_s8(int8_t * val, char *arg, int base) 102int get_s8(int8_t *val, char *arg, int base)
103{ 103{
104 long res; 104 long res;
105 char *ptr; 105 char *ptr;
@@ -113,12 +113,14 @@ int get_s8(int8_t * val, char *arg, int base)
113 return 0; 113 return 0;
114} 114}
115 115
116int get_addr_1(inet_prefix * addr, char *name, int family) 116int get_addr_1(inet_prefix *addr, char *name, int family)
117{ 117{
118 memset(addr, 0, sizeof(*addr)); 118 memset(addr, 0, sizeof(*addr));
119 119
120 if (strcmp(name, bb_str_default) == 0 || 120 if (strcmp(name, bb_str_default) == 0
121 strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { 121 || strcmp(name, "all") == 0
122 || strcmp(name, "any") == 0
123 ) {
122 addr->family = family; 124 addr->family = family;
123 addr->bytelen = (family == AF_INET6 ? 16 : 4); 125 addr->bytelen = (family == AF_INET6 ? 16 : 4);
124 addr->bitlen = -1; 126 addr->bitlen = -1;
@@ -146,7 +148,7 @@ int get_addr_1(inet_prefix * addr, char *name, int family)
146 return 0; 148 return 0;
147} 149}
148 150
149int get_prefix_1(inet_prefix * dst, char *arg, int family) 151static int get_prefix_1(inet_prefix *dst, char *arg, int family)
150{ 152{
151 int err; 153 int err;
152 unsigned plen; 154 unsigned plen;
@@ -154,7 +156,10 @@ int get_prefix_1(inet_prefix * dst, char *arg, int family)
154 156
155 memset(dst, 0, sizeof(*dst)); 157 memset(dst, 0, sizeof(*dst));
156 158
157 if (strcmp(arg, bb_str_default) == 0 || strcmp(arg, "any") == 0) { 159 if (strcmp(arg, bb_str_default) == 0
160 || strcmp(arg, "all") == 0
161 || strcmp(arg, "any") == 0
162 ) {
158 dst->family = family; 163 dst->family = family;
159 dst->bytelen = 0; 164 dst->bytelen = 0;
160 dst->bitlen = 0; 165 dst->bitlen = 0;
@@ -172,7 +177,7 @@ int get_prefix_1(inet_prefix * dst, char *arg, int family)
172 177
173 netmask_pfx.family = AF_UNSPEC; 178 netmask_pfx.family = AF_UNSPEC;
174 if ((get_unsigned(&plen, slash + 1, 0) || plen > dst->bitlen) 179 if ((get_unsigned(&plen, slash + 1, 0) || plen > dst->bitlen)
175 && (get_addr_1(&netmask_pfx, slash + 1, family))) 180 && (get_addr_1(&netmask_pfx, slash + 1, family)))
176 err = -1; 181 err = -1;
177 else if (netmask_pfx.family == AF_INET) { 182 else if (netmask_pfx.family == AF_INET) {
178 /* fill in prefix length of dotted quad */ 183 /* fill in prefix length of dotted quad */
@@ -184,8 +189,8 @@ int get_prefix_1(inet_prefix * dst, char *arg, int family)
184 for (plen = 0; mask; mask <<= 1) 189 for (plen = 0; mask; mask <<= 1)
185 ++plen; 190 ++plen;
186 if (plen >= 0 && plen <= dst->bitlen) { 191 if (plen >= 0 && plen <= dst->bitlen) {
187 dst->bitlen = plen; 192 dst->bitlen = plen;
188 /* dst->flags |= PREFIXLEN_SPECIFIED; */ 193 /* dst->flags |= PREFIXLEN_SPECIFIED; */
189 } else 194 } else
190 err = -1; 195 err = -1;
191 } else 196 } else
@@ -201,7 +206,7 @@ int get_prefix_1(inet_prefix * dst, char *arg, int family)
201 return err; 206 return err;
202} 207}
203 208
204int get_addr(inet_prefix * dst, char *arg, int family) 209int get_addr(inet_prefix *dst, char *arg, int family)
205{ 210{
206 if (family == AF_PACKET) { 211 if (family == AF_PACKET) {
207 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "address"); 212 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "address");
@@ -212,7 +217,7 @@ int get_addr(inet_prefix * dst, char *arg, int family)
212 return 0; 217 return 0;
213} 218}
214 219
215int get_prefix(inet_prefix * dst, char *arg, int family) 220int get_prefix(inet_prefix *dst, char *arg, int family)
216{ 221{
217 if (family == AF_PACKET) { 222 if (family == AF_PACKET) {
218 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix"); 223 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix");
@@ -253,7 +258,7 @@ void duparg2(const char *key, const char *arg)
253 bb_error_msg_and_die("either \"%s\" is duplicate, or \"%s\" is garbage", key, arg); 258 bb_error_msg_and_die("either \"%s\" is duplicate, or \"%s\" is garbage", key, arg);
254} 259}
255 260
256int inet_addr_match(inet_prefix * a, inet_prefix * b, int bits) 261int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits)
257{ 262{
258 uint32_t *a1 = a->data; 263 uint32_t *a1 = a->data;
259 uint32_t *a2 = b->data; 264 uint32_t *a2 = b->data;
@@ -293,7 +298,6 @@ const char *rt_addr_n2a(int af, int UNUSED_PARAM len,
293 } 298 }
294} 299}
295 300
296
297const char *format_host(int af, int len, void *addr, char *buf, int buflen) 301const char *format_host(int af, int len, void *addr, char *buf, int buflen)
298{ 302{
299#ifdef RESOLVE_HOSTNAMES 303#ifdef RESOLVE_HOSTNAMES
diff --git a/networking/libiproute/utils.h b/networking/libiproute/utils.h
index 1af39ffe1..c1dbc6e8b 100644
--- a/networking/libiproute/utils.h
+++ b/networking/libiproute/utils.h
@@ -60,7 +60,7 @@ struct ipx_addr {
60 60
61extern uint32_t get_addr32(char *name); 61extern uint32_t get_addr32(char *name);
62extern int get_addr_1(inet_prefix *dst, char *arg, int family); 62extern int get_addr_1(inet_prefix *dst, char *arg, int family);
63extern int get_prefix_1(inet_prefix *dst, char *arg, int family); 63/*extern int get_prefix_1(inet_prefix *dst, char *arg, int family);*/
64extern int get_addr(inet_prefix *dst, char *arg, int family); 64extern int get_addr(inet_prefix *dst, char *arg, int family);
65extern int get_prefix(inet_prefix *dst, char *arg, int family); 65extern int get_prefix(inet_prefix *dst, char *arg, int family);
66 66