Changeset 2725 in MondoRescue for branches/2.2.9/mindi-busybox/networking/libiproute/utils.c
- Timestamp:
- Feb 25, 2011, 9:26:54 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/2.2.9/mindi-busybox/networking/libiproute/utils.c
r1765 r2725 1 1 /* vi: set sw=4 ts=4: */ 2 2 /* 3 * utils.c3 * Licensed under GPLv2 or later, see file LICENSE in this source tree. 4 4 * 5 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. 6 * 7 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 5 * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru> 8 6 * 9 7 * Changes: 10 8 * 11 * Rani Assaf <rani@magic.metawire.com> 980929: 9 * Rani Assaf <rani@magic.metawire.com> 980929: resolve addresses 12 10 */ 13 11 … … 16 14 #include "inet_common.h" 17 15 18 int get_integer(int *val, char *arg, int base) 19 { 20 long res; 21 char *ptr; 22 23 if (!arg || !*arg) 24 return -1; 25 res = strtol(arg, &ptr, base); 26 if (!ptr || ptr == arg || *ptr || res > INT_MAX || res < INT_MIN) 27 return -1; 28 *val = res; 29 return 0; 30 } 31 //XXX: FIXME: use some libbb function instead 32 int get_unsigned(unsigned *val, char *arg, int base) 16 unsigned get_unsigned(char *arg, const char *errmsg) 33 17 { 34 18 unsigned long res; 35 19 char *ptr; 36 20 37 if (!arg || !*arg) 38 return -1; 39 res = strtoul(arg, &ptr, base); 40 if (!ptr || ptr == arg || *ptr || res > UINT_MAX) 41 return -1; 42 *val = res; 43 return 0; 44 } 45 46 int get_u32(uint32_t * val, char *arg, int base) 21 if (*arg) { 22 res = strtoul(arg, &ptr, 0); 23 //FIXME: "" will be accepted too, is it correct?! 24 if (!*ptr && res <= UINT_MAX) { 25 return res; 26 } 27 } 28 invarg(arg, errmsg); /* does not return */ 29 } 30 31 uint32_t get_u32(char *arg, const char *errmsg) 47 32 { 48 33 unsigned long res; 49 34 char *ptr; 50 35 51 if (!arg || !*arg) 52 return -1; 53 res = strtoul(arg, &ptr, base); 54 if (!ptr || ptr == arg || *ptr || res > 0xFFFFFFFFUL) 55 return -1; 56 *val = res; 57 return 0; 58 } 59 60 int get_u16(uint16_t * val, char *arg, int base) 36 if (*arg) { 37 res = strtoul(arg, &ptr, 0); 38 //FIXME: "" will be accepted too, is it correct?! 39 if (!*ptr && res <= 0xFFFFFFFFUL) { 40 return res; 41 } 42 } 43 invarg(arg, errmsg); /* does not return */ 44 } 45 46 uint16_t get_u16(char *arg, const char *errmsg) 61 47 { 62 48 unsigned long res; 63 49 char *ptr; 64 50 65 if (!arg || !*arg) 66 return -1; 67 res = strtoul(arg, &ptr, base); 68 if (!ptr || ptr == arg || *ptr || res > 0xFFFF) 69 return -1; 70 *val = res; 71 return 0; 72 } 73 74 int get_u8(uint8_t * val, char *arg, int base) 75 { 76 unsigned long res; 77 char *ptr; 78 79 if (!arg || !*arg) 80 return -1; 81 res = strtoul(arg, &ptr, base); 82 if (!ptr || ptr == arg || *ptr || res > 0xFF) 83 return -1; 84 *val = res; 85 return 0; 86 } 87 88 int get_s16(int16_t * val, char *arg, int base) 89 { 90 long res; 91 char *ptr; 92 93 if (!arg || !*arg) 94 return -1; 95 res = strtol(arg, &ptr, base); 96 if (!ptr || ptr == arg || *ptr || res > 0x7FFF || res < -0x8000) 97 return -1; 98 *val = res; 99 return 0; 100 } 101 102 int get_s8(int8_t * val, char *arg, int base) 103 { 104 long res; 105 char *ptr; 106 107 if (!arg || !*arg) 108 return -1; 109 res = strtol(arg, &ptr, base); 110 if (!ptr || ptr == arg || *ptr || res > 0x7F || res < -0x80) 111 return -1; 112 *val = res; 113 return 0; 114 } 115 116 int get_addr_1(inet_prefix * addr, char *name, int family) 117 { 118 char *cp; 119 unsigned char *ap = (unsigned char *) addr->data; 120 int i; 121 51 if (*arg) { 52 res = strtoul(arg, &ptr, 0); 53 //FIXME: "" will be accepted too, is it correct?! 54 if (!*ptr && res <= 0xFFFF) { 55 return res; 56 } 57 } 58 invarg(arg, errmsg); /* does not return */ 59 } 60 61 int get_addr_1(inet_prefix *addr, char *name, int family) 62 { 122 63 memset(addr, 0, sizeof(*addr)); 123 64 124 if (strcmp(name, bb_str_default) == 0 || 125 strcmp(name, "all") == 0 || strcmp(name, "any") == 0) { 65 if (strcmp(name, "default") == 0 66 || strcmp(name, "all") == 0 67 || strcmp(name, "any") == 0 68 ) { 126 69 addr->family = family; 127 70 addr->bytelen = (family == AF_INET6 ? 16 : 4); … … 144 87 if (family != AF_UNSPEC && family != AF_INET) 145 88 return -1; 89 if (inet_pton(AF_INET, name, addr->data) <= 0) 90 return -1; 146 91 addr->bytelen = 4; 147 92 addr->bitlen = -1; 148 for (cp = name, i = 0; *cp; cp++) { 149 if (*cp <= '9' && *cp >= '0') { 150 ap[i] = 10 * ap[i] + (*cp - '0'); 151 continue; 152 } 153 if (*cp == '.' && ++i <= 3) 154 continue; 155 return -1; 156 } 157 return 0; 158 } 159 160 int get_prefix_1(inet_prefix * dst, char *arg, int family) 93 return 0; 94 } 95 96 static int get_prefix_1(inet_prefix *dst, char *arg, int family) 161 97 { 162 98 int err; 163 intplen;99 unsigned plen; 164 100 char *slash; 165 101 166 102 memset(dst, 0, sizeof(*dst)); 167 103 168 if (strcmp(arg, bb_str_default) == 0 || strcmp(arg, "any") == 0) { 104 if (strcmp(arg, "default") == 0 105 || strcmp(arg, "all") == 0 106 || strcmp(arg, "any") == 0 107 ) { 169 108 dst->family = family; 170 dst->bytelen = 0;171 dst->bitlen = 0;109 /*dst->bytelen = 0; - done by memset */ 110 /*dst->bitlen = 0;*/ 172 111 return 0; 173 112 } … … 178 117 err = get_addr_1(dst, arg, family); 179 118 if (err == 0) { 180 switch (dst->family) { 181 case AF_INET6: 182 dst->bitlen = 128; 183 break; 184 default: 185 case AF_INET: 186 dst->bitlen = 32; 187 } 119 dst->bitlen = (dst->family == AF_INET6) ? 128 : 32; 188 120 if (slash) { 189 if (get_integer(&plen, slash + 1, 0) || plen > dst->bitlen) { 121 inet_prefix netmask_pfx; 122 123 netmask_pfx.family = AF_UNSPEC; 124 plen = bb_strtou(slash + 1, NULL, 0); 125 if ((errno || plen > dst->bitlen) 126 && (get_addr_1(&netmask_pfx, slash + 1, family))) 190 127 err = -1; 191 goto done; 128 else if (netmask_pfx.family == AF_INET) { 129 /* fill in prefix length of dotted quad */ 130 uint32_t mask = ntohl(netmask_pfx.data[0]); 131 uint32_t host = ~mask; 132 133 /* a valid netmask must be 2^n - 1 */ 134 if (!(host & (host + 1))) { 135 for (plen = 0; mask; mask <<= 1) 136 ++plen; 137 if (plen <= dst->bitlen) { 138 dst->bitlen = plen; 139 /* dst->flags |= PREFIXLEN_SPECIFIED; */ 140 } else 141 err = -1; 142 } else 143 err = -1; 144 } else { 145 /* plain prefix */ 146 dst->bitlen = plen; 192 147 } 193 dst->bitlen = plen; 194 } 195 } 196 done: 148 } 149 } 197 150 if (slash) 198 151 *slash = '/'; … … 200 153 } 201 154 202 int get_addr(inet_prefix * 155 int get_addr(inet_prefix *dst, char *arg, int family) 203 156 { 204 157 if (family == AF_PACKET) { 205 bb_error_msg_and_die("\"%s\" may be inet address, but it is not allowed in this context", arg);158 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "address"); 206 159 } 207 160 if (get_addr_1(dst, arg, family)) { 208 bb_error_msg_and_die("an inet address is expected rather than \"%s\"", arg);209 } 210 return 0; 211 } 212 213 int get_prefix(inet_prefix * 161 bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "address", arg); 162 } 163 return 0; 164 } 165 166 int get_prefix(inet_prefix *dst, char *arg, int family) 214 167 { 215 168 if (family == AF_PACKET) { 216 bb_error_msg_and_die("\"%s\" may be inet address, but it is not allowed in this context", arg);169 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix"); 217 170 } 218 171 if (get_prefix_1(dst, arg, family)) { 219 bb_error_msg_and_die("an inet address is expected rather than \"%s\"", arg);172 bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "prefix", arg); 220 173 } 221 174 return 0; … … 227 180 228 181 if (get_addr_1(&addr, name, AF_INET)) { 229 bb_error_msg_and_die("an IP address is expected rather than \"%s\"", name);182 bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "IP", "address", name); 230 183 } 231 184 return addr.data[0]; … … 252 205 } 253 206 254 int inet_addr_match(inet_prefix * a, inet_prefix *b, int bits)207 int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits) 255 208 { 256 209 uint32_t *a1 = a->data; 257 210 uint32_t *a2 = b->data; 258 int words = bits >> 0x05;211 int words = bits >> 5; 259 212 260 213 bits &= 0x1f; … … 280 233 } 281 234 282 const char *rt_addr_n2a(int af, int ATTRIBUTE_UNUSED len,235 const char *rt_addr_n2a(int af, 283 236 void *addr, char *buf, int buflen) 284 237 { … … 292 245 } 293 246 294 247 #ifdef RESOLVE_HOSTNAMES 295 248 const char *format_host(int af, int len, void *addr, char *buf, int buflen) 296 249 { 297 #ifdef RESOLVE_HOSTNAMES298 250 if (resolve_hosts) { 299 251 struct hostent *h_ent; … … 318 270 } 319 271 } 272 return rt_addr_n2a(af, addr, buf, buflen); 273 } 320 274 #endif 321 return rt_addr_n2a(af, len, addr, buf, buflen);322 }
Note:
See TracChangeset
for help on using the changeset viewer.