aboutsummaryrefslogtreecommitdiff
path: root/networking/libiproute/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'networking/libiproute/utils.c')
-rw-r--r--networking/libiproute/utils.c121
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
18int get_integer(int *val, char *arg, int base) 18unsigned 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
32int 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
46int 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
60int get_u16(uint16_t *val, char *arg, int base) 32uint32_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
74int get_u8(uint8_t *val, char *arg, int base) 46uint16_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
88int 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
102int 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
116int get_addr_1(inet_prefix *addr, char *name, int family) 60int 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
289const char *rt_addr_n2a(int af, int UNUSED_PARAM len, 234const 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
301const char *format_host(int af, int len, void *addr, char *buf, int buflen) 247const 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