|
|
@@ -33,6 +33,7 @@
|
|
|
|
|
|
#include <misc/debug.h>
|
|
|
#include <misc/byteorder.h>
|
|
|
+#include <misc/parse_number.h>
|
|
|
|
|
|
struct ipv4_ifaddr {
|
|
|
uint32_t addr;
|
|
|
@@ -41,47 +42,18 @@ struct ipv4_ifaddr {
|
|
|
|
|
|
static int ipaddr_parse_ipv4_addr_bin (char *name, size_t name_len, uint32_t *out_addr);
|
|
|
static int ipaddr_parse_ipv4_addr (char *name, uint32_t *out_addr);
|
|
|
+static int ipaddr_parse_ipv4_prefix_bin (char *str, size_t str_len, int *num);
|
|
|
static int ipaddr_parse_ipv4_prefix (char *str, int *num);
|
|
|
static int ipaddr_parse_ipv4_ifaddr (char *str, struct ipv4_ifaddr *out);
|
|
|
static int ipaddr_ipv4_ifaddr_from_addr_mask (uint32_t addr, uint32_t mask, struct ipv4_ifaddr *out);
|
|
|
static int ipaddr_ipv4_mask_from_prefix (int prefix);
|
|
|
static int ipaddr_ipv4_addrs_in_network (uint32_t addr1, uint32_t addr2, int netprefix);
|
|
|
|
|
|
-static int ipaddr_char_is_digit (char c)
|
|
|
-{
|
|
|
- return (c >= '0' && c <= '9');
|
|
|
-}
|
|
|
-
|
|
|
-static int ipaddr_parse_number (char *data, size_t data_len, int *out)
|
|
|
-{
|
|
|
- if (data_len == 0) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- for (size_t i = 0; i < data_len; i++) {
|
|
|
- if (!ipaddr_char_is_digit(data[i])) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- char data2[data_len + 1];
|
|
|
- memcpy(data2, data, data_len);
|
|
|
- data2[data_len] = '\0';
|
|
|
-
|
|
|
- *out = atoi(data2);
|
|
|
-
|
|
|
- return 1;
|
|
|
-}
|
|
|
-
|
|
|
int ipaddr_parse_ipv4_addr_bin (char *name, size_t name_len, uint32_t *out_addr)
|
|
|
{
|
|
|
for (size_t i = 0; ; i++) {
|
|
|
size_t j;
|
|
|
- for (j = 0; j < name_len && name[j] != '.'; j++) {
|
|
|
- if (!ipaddr_char_is_digit(name[j])) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
- }
|
|
|
+ for (j = 0; j < name_len && name[j] != '.'; j++);
|
|
|
|
|
|
if ((j == name_len && i < 3) || (j < name_len && i == 3)) {
|
|
|
return 0;
|
|
|
@@ -91,8 +63,8 @@ int ipaddr_parse_ipv4_addr_bin (char *name, size_t name_len, uint32_t *out_addr)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- int d;
|
|
|
- if (!ipaddr_parse_number(name, j, &d)) {
|
|
|
+ uintmax_t d;
|
|
|
+ if (!parse_unsigned_integer_bin(name, j, &d)) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
@@ -116,17 +88,25 @@ int ipaddr_parse_ipv4_addr (char *name, uint32_t *out_addr)
|
|
|
return ipaddr_parse_ipv4_addr_bin(name, strlen(name), out_addr);
|
|
|
}
|
|
|
|
|
|
-int ipaddr_parse_ipv4_prefix (char *str, int *num)
|
|
|
+int ipaddr_parse_ipv4_prefix_bin (char *str, size_t str_len, int *num)
|
|
|
{
|
|
|
- if (strlen(str) > 2 || !ipaddr_parse_number(str, strlen(str), num)) {
|
|
|
+ uintmax_t d;
|
|
|
+ if (!parse_unsigned_integer_bin(str, str_len, &d)) {
|
|
|
return 0;
|
|
|
}
|
|
|
- if (*num > 32) {
|
|
|
+ if (d > 32) {
|
|
|
return 0;
|
|
|
}
|
|
|
+
|
|
|
+ *num = d;
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
+int ipaddr_parse_ipv4_prefix (char *str, int *num)
|
|
|
+{
|
|
|
+ return ipaddr_parse_ipv4_prefix_bin(str, strlen(str), num);
|
|
|
+}
|
|
|
+
|
|
|
int ipaddr_parse_ipv4_ifaddr (char *str, struct ipv4_ifaddr *out)
|
|
|
{
|
|
|
char *slash = strstr(str, "/");
|
|
|
@@ -145,11 +125,7 @@ int ipaddr_parse_ipv4_ifaddr (char *str, struct ipv4_ifaddr *out)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
- if (!ipaddr_parse_number(prefix, prefix_len, &out->prefix)) {
|
|
|
- return 0;
|
|
|
- }
|
|
|
-
|
|
|
- if (out->prefix > 32) {
|
|
|
+ if (!ipaddr_parse_ipv4_prefix_bin(prefix, prefix_len, &out->prefix)) {
|
|
|
return 0;
|
|
|
}
|
|
|
|