diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-03 14:55:29 +0000 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2009-03-03 14:55:29 +0000 |
commit | 787a492f23bbd567fb9bf2486ce9994bd19ebec2 (patch) | |
tree | 3f635aef8838bc5a6b211dc5d833c924c3295ea4 | |
parent | 230997bd61eec4096e6ae70850e965b63c8886cf (diff) | |
download | busybox-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.c | 38 | ||||
-rw-r--r-- | networking/libiproute/utils.h | 2 |
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 | ||
46 | int get_u32(uint32_t * val, char *arg, int base) | 46 | int 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 | ||
60 | int get_u16(uint16_t * val, char *arg, int base) | 60 | int 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 | ||
74 | int get_u8(uint8_t * val, char *arg, int base) | 74 | int 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 | ||
88 | int get_s16(int16_t * val, char *arg, int base) | 88 | int 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 | ||
102 | int get_s8(int8_t * val, char *arg, int base) | 102 | int 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 | ||
116 | int get_addr_1(inet_prefix * addr, char *name, int family) | 116 | int 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 | ||
149 | int get_prefix_1(inet_prefix * dst, char *arg, int family) | 151 | static 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 | ||
204 | int get_addr(inet_prefix * dst, char *arg, int family) | 209 | int 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 | ||
215 | int get_prefix(inet_prefix * dst, char *arg, int family) | 220 | int 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 | ||
256 | int inet_addr_match(inet_prefix * a, inet_prefix * b, int bits) | 261 | int 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 | |||
297 | const char *format_host(int af, int len, void *addr, char *buf, int buflen) | 301 | const 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 | ||
61 | extern uint32_t get_addr32(char *name); | 61 | extern uint32_t get_addr32(char *name); |
62 | extern int get_addr_1(inet_prefix *dst, char *arg, int family); | 62 | extern int get_addr_1(inet_prefix *dst, char *arg, int family); |
63 | extern int get_prefix_1(inet_prefix *dst, char *arg, int family); | 63 | /*extern int get_prefix_1(inet_prefix *dst, char *arg, int family);*/ |
64 | extern int get_addr(inet_prefix *dst, char *arg, int family); | 64 | extern int get_addr(inet_prefix *dst, char *arg, int family); |
65 | extern int get_prefix(inet_prefix *dst, char *arg, int family); | 65 | extern int get_prefix(inet_prefix *dst, char *arg, int family); |
66 | 66 | ||