diff options
Diffstat (limited to 'networking/libiproute/utils.c')
-rw-r--r-- | networking/libiproute/utils.c | 121 |
1 files changed, 33 insertions, 88 deletions
diff --git a/networking/libiproute/utils.c b/networking/libiproute/utils.c index 6b9f6a7f5..c84d018eb 100644 --- a/networking/libiproute/utils.c +++ b/networking/libiproute/utils.c | |||
@@ -15,102 +15,46 @@ | |||
15 | #include "utils.h" | 15 | #include "utils.h" |
16 | #include "inet_common.h" | 16 | #include "inet_common.h" |
17 | 17 | ||
18 | int get_integer(int *val, char *arg, int base) | 18 | unsigned get_unsigned(char *arg, const char *errmsg) |
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) | ||
33 | { | ||
34 | unsigned long res; | ||
35 | char *ptr; | ||
36 | |||
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) | ||
47 | { | 19 | { |
48 | unsigned long res; | 20 | unsigned long res; |
49 | char *ptr; | 21 | char *ptr; |
50 | 22 | ||
51 | if (!arg || !*arg) | 23 | if (*arg) { |
52 | return -1; | 24 | res = strtoul(arg, &ptr, 0); |
53 | res = strtoul(arg, &ptr, base); | 25 | if (!*ptr && res <= UINT_MAX) { |
54 | if (!ptr || ptr == arg || *ptr || res > 0xFFFFFFFFUL) | 26 | return res; |
55 | return -1; | 27 | } |
56 | *val = res; | 28 | } |
57 | return 0; | 29 | invarg(arg, errmsg); /* does not return */ |
58 | } | 30 | } |
59 | 31 | ||
60 | int get_u16(uint16_t *val, char *arg, int base) | 32 | uint32_t get_u32(char *arg, const char *errmsg) |
61 | { | 33 | { |
62 | unsigned long res; | 34 | unsigned long res; |
63 | char *ptr; | 35 | char *ptr; |
64 | 36 | ||
65 | if (!arg || !*arg) | 37 | if (*arg) { |
66 | return -1; | 38 | res = strtoul(arg, &ptr, 0); |
67 | res = strtoul(arg, &ptr, base); | 39 | if (!*ptr && res <= 0xFFFFFFFFUL) { |
68 | if (!ptr || ptr == arg || *ptr || res > 0xFFFF) | 40 | return res; |
69 | return -1; | 41 | } |
70 | *val = res; | 42 | } |
71 | return 0; | 43 | invarg(arg, errmsg); /* does not return */ |
72 | } | 44 | } |
73 | 45 | ||
74 | int get_u8(uint8_t *val, char *arg, int base) | 46 | uint16_t get_u16(char *arg, const char *errmsg) |
75 | { | 47 | { |
76 | unsigned long res; | 48 | unsigned long res; |
77 | char *ptr; | 49 | char *ptr; |
78 | 50 | ||
79 | if (!arg || !*arg) | 51 | if (*arg) { |
80 | return -1; | 52 | res = strtoul(arg, &ptr, 0); |
81 | res = strtoul(arg, &ptr, base); | 53 | if (!*ptr && res <= 0xFFFF) { |
82 | if (!ptr || ptr == arg || *ptr || res > 0xFF) | 54 | return res; |
83 | return -1; | 55 | } |
84 | *val = res; | 56 | } |
85 | return 0; | 57 | invarg(arg, errmsg); /* does not return */ |
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 | } | 58 | } |
115 | 59 | ||
116 | int get_addr_1(inet_prefix *addr, char *name, int family) | 60 | int get_addr_1(inet_prefix *addr, char *name, int family) |
@@ -161,8 +105,8 @@ static int get_prefix_1(inet_prefix *dst, char *arg, int family) | |||
161 | || strcmp(arg, "any") == 0 | 105 | || strcmp(arg, "any") == 0 |
162 | ) { | 106 | ) { |
163 | dst->family = family; | 107 | dst->family = family; |
164 | dst->bytelen = 0; | 108 | /*dst->bytelen = 0; - done by memset */ |
165 | dst->bitlen = 0; | 109 | /*dst->bitlen = 0;*/ |
166 | return 0; | 110 | return 0; |
167 | } | 111 | } |
168 | 112 | ||
@@ -176,7 +120,8 @@ static int get_prefix_1(inet_prefix *dst, char *arg, int family) | |||
176 | inet_prefix netmask_pfx; | 120 | inet_prefix netmask_pfx; |
177 | 121 | ||
178 | netmask_pfx.family = AF_UNSPEC; | 122 | netmask_pfx.family = AF_UNSPEC; |
179 | if ((get_unsigned(&plen, slash + 1, 0) || plen > dst->bitlen) | 123 | plen = bb_strtou(slash + 1, NULL, 0); |
124 | if ((errno || plen > dst->bitlen) | ||
180 | && (get_addr_1(&netmask_pfx, slash + 1, family))) | 125 | && (get_addr_1(&netmask_pfx, slash + 1, family))) |
181 | err = -1; | 126 | err = -1; |
182 | else if (netmask_pfx.family == AF_INET) { | 127 | else if (netmask_pfx.family == AF_INET) { |
@@ -262,7 +207,7 @@ int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits) | |||
262 | { | 207 | { |
263 | uint32_t *a1 = a->data; | 208 | uint32_t *a1 = a->data; |
264 | uint32_t *a2 = b->data; | 209 | uint32_t *a2 = b->data; |
265 | int words = bits >> 0x05; | 210 | int words = bits >> 5; |
266 | 211 | ||
267 | bits &= 0x1f; | 212 | bits &= 0x1f; |
268 | 213 | ||
@@ -286,7 +231,7 @@ int inet_addr_match(inet_prefix *a, inet_prefix *b, int bits) | |||
286 | return 0; | 231 | return 0; |
287 | } | 232 | } |
288 | 233 | ||
289 | const char *rt_addr_n2a(int af, int UNUSED_PARAM len, | 234 | const char *rt_addr_n2a(int af, |
290 | void *addr, char *buf, int buflen) | 235 | void *addr, char *buf, int buflen) |
291 | { | 236 | { |
292 | switch (af) { | 237 | switch (af) { |
@@ -298,9 +243,9 @@ const char *rt_addr_n2a(int af, int UNUSED_PARAM len, | |||
298 | } | 243 | } |
299 | } | 244 | } |
300 | 245 | ||
246 | #ifdef RESOLVE_HOSTNAMES | ||
301 | const char *format_host(int af, int len, void *addr, char *buf, int buflen) | 247 | const char *format_host(int af, int len, void *addr, char *buf, int buflen) |
302 | { | 248 | { |
303 | #ifdef RESOLVE_HOSTNAMES | ||
304 | if (resolve_hosts) { | 249 | if (resolve_hosts) { |
305 | struct hostent *h_ent; | 250 | struct hostent *h_ent; |
306 | 251 | ||
@@ -323,6 +268,6 @@ const char *format_host(int af, int len, void *addr, char *buf, int buflen) | |||
323 | } | 268 | } |
324 | } | 269 | } |
325 | } | 270 | } |
326 | #endif | 271 | return rt_addr_n2a(af, addr, buf, buflen); |
327 | return rt_addr_n2a(af, len, addr, buf, buflen); | ||
328 | } | 272 | } |
273 | #endif | ||