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 | ||
