Changeset 3232 in MondoRescue for branches/3.2/mindi-busybox/networking/libiproute/utils.c
- Timestamp:
- Jan 1, 2014, 12:47:38 AM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3.2/mindi-busybox/networking/libiproute/utils.c
r2725 r3232 84 84 } 85 85 86 addr->family = AF_INET;87 86 if (family != AF_UNSPEC && family != AF_INET) 88 87 return -1; 88 89 /* Try to parse it as IPv4 */ 90 addr->family = AF_INET; 91 #if 0 /* Doesn't handle e.g. "10.10", for example, "ip r l root 10.10/16" */ 89 92 if (inet_pton(AF_INET, name, addr->data) <= 0) 90 93 return -1; 94 #else 95 { 96 unsigned i = 0; 97 unsigned n = 0; 98 const char *cp = name - 1; 99 while (*++cp) { 100 if ((unsigned char)(*cp - '0') <= 9) { 101 n = 10 * n + (unsigned char)(*cp - '0'); 102 if (n >= 256) 103 return -1; 104 ((uint8_t*)addr->data)[i] = n; 105 continue; 106 } 107 if (*cp == '.' && ++i <= 3) { 108 n = 0; 109 continue; 110 } 111 return -1; 112 } 113 } 114 #endif 91 115 addr->bytelen = 4; 92 116 addr->bitlen = -1; 117 93 118 return 0; 94 119 } 95 120 96 static int get_prefix_1(inet_prefix *dst, char *arg, int family) 97 { 98 int err; 99 unsigned plen; 121 static void get_prefix_1(inet_prefix *dst, char *arg, int family) 122 { 100 123 char *slash; 101 124 … … 109 132 /*dst->bytelen = 0; - done by memset */ 110 133 /*dst->bitlen = 0;*/ 111 return 0;134 return; 112 135 } 113 136 … … 115 138 if (slash) 116 139 *slash = '\0'; 117 err = get_addr_1(dst, arg, family); 118 if ( err== 0) {140 141 if (get_addr_1(dst, arg, family) == 0) { 119 142 dst->bitlen = (dst->family == AF_INET6) ? 128 : 32; 120 143 if (slash) { 144 unsigned plen; 121 145 inet_prefix netmask_pfx; 122 146 … … 124 148 plen = bb_strtou(slash + 1, NULL, 0); 125 149 if ((errno || plen > dst->bitlen) 126 && (get_addr_1(&netmask_pfx, slash + 1, family))) 127 err = -1; 128 else if (netmask_pfx.family == AF_INET) { 150 && get_addr_1(&netmask_pfx, slash + 1, family) != 0 151 ) { 152 goto bad; 153 } 154 if (netmask_pfx.family == AF_INET) { 129 155 /* fill in prefix length of dotted quad */ 130 156 uint32_t mask = ntohl(netmask_pfx.data[0]); … … 132 158 133 159 /* 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; 147 } 148 } 149 } 160 if (host & (host + 1)) 161 goto bad; 162 163 for (plen = 0; mask; mask <<= 1) 164 ++plen; 165 if (plen > dst->bitlen) 166 goto bad; 167 /* dst->flags |= PREFIXLEN_SPECIFIED; */ 168 } 169 dst->bitlen = plen; 170 } 171 } 172 150 173 if (slash) 151 174 *slash = '/'; 152 return err; 175 return; 176 bad: 177 bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "prefix", arg); 153 178 } 154 179 … … 164 189 } 165 190 166 intget_prefix(inet_prefix *dst, char *arg, int family)191 void get_prefix(inet_prefix *dst, char *arg, int family) 167 192 { 168 193 if (family == AF_PACKET) { 169 194 bb_error_msg_and_die("\"%s\" may be inet %s, but it is not allowed in this context", arg, "prefix"); 170 195 } 171 if (get_prefix_1(dst, arg, family)) { 172 bb_error_msg_and_die("an %s %s is expected rather than \"%s\"", "inet", "prefix", arg); 173 } 174 return 0; 196 get_prefix_1(dst, arg, family); 175 197 } 176 198 … … 205 227 } 206 228 207 int inet_addr_match( inet_prefix *a,inet_prefix *b, int bits)208 { 209 uint32_t *a1 = a->data;210 uint32_t *a2 = b->data;229 int inet_addr_match(const inet_prefix *a, const inet_prefix *b, int bits) 230 { 231 const uint32_t *a1 = a->data; 232 const uint32_t *a2 = b->data; 211 233 int words = bits >> 5; 212 234
Note:
See TracChangeset
for help on using the changeset viewer.