Ambroz Bizjak 11 лет назад
Родитель
Сommit
64e54ba888

+ 3 - 3
examples/ipaddr6_test.c

@@ -42,7 +42,7 @@
         ipaddr6_print_addr(addr, str); \
         ipaddr6_print_addr(addr, str); \
         ASSERT_FORCE(!strcmp(str, (string))); \
         ASSERT_FORCE(!strcmp(str, (string))); \
         struct ipv6_addr parsed_addr; \
         struct ipv6_addr parsed_addr; \
-        int res = ipaddr6_parse_ipv6_addr_bin(str, strlen(str), &parsed_addr); \
+        int res = ipaddr6_parse_ipv6_addr(MemRef_MakeCstr(str), &parsed_addr); \
         ASSERT_FORCE(res); \
         ASSERT_FORCE(res); \
         ASSERT_FORCE(!memcmp(parsed_addr.bytes, addr.bytes, 16)); \
         ASSERT_FORCE(!memcmp(parsed_addr.bytes, addr.bytes, 16)); \
     }
     }
@@ -51,7 +51,7 @@
     { \
     { \
         struct ipv6_addr exp_addr = {addr_bytes}; \
         struct ipv6_addr exp_addr = {addr_bytes}; \
         struct ipv6_addr addr; \
         struct ipv6_addr addr; \
-        int res = ipaddr6_parse_ipv6_addr_bin((string), strlen((string)), &addr); \
+        int res = ipaddr6_parse_ipv6_addr(MemRef_MakeCstr((string)), &addr); \
         ASSERT_FORCE(res); \
         ASSERT_FORCE(res); \
         ASSERT_FORCE(!memcmp(addr.bytes, exp_addr.bytes, 16)); \
         ASSERT_FORCE(!memcmp(addr.bytes, exp_addr.bytes, 16)); \
     }
     }
@@ -59,7 +59,7 @@
 #define PARSE_FAIL_TEST(string) \
 #define PARSE_FAIL_TEST(string) \
     { \
     { \
         struct ipv6_addr addr; \
         struct ipv6_addr addr; \
-        int res = ipaddr6_parse_ipv6_addr_bin((string), strlen((string)), &addr); \
+        int res = ipaddr6_parse_ipv6_addr(MemRef_MakeCstr((string)), &addr); \
         ASSERT_FORCE(!res); \
         ASSERT_FORCE(!res); \
     }
     }
 
 

+ 20 - 37
misc/ipaddr6.h

@@ -44,6 +44,7 @@
 #include <misc/parse_number.h>
 #include <misc/parse_number.h>
 #include <misc/find_char.h>
 #include <misc/find_char.h>
 #include <misc/print_macros.h>
 #include <misc/print_macros.h>
+#include <misc/memref.h>
 
 
 struct ipv6_addr {
 struct ipv6_addr {
     uint8_t bytes[16];
     uint8_t bytes[16];
@@ -54,12 +55,9 @@ struct ipv6_ifaddr {
     int prefix;
     int prefix;
 };
 };
 
 
-static int ipaddr6_parse_ipv6_addr_bin (const char *name, size_t name_len, struct ipv6_addr *out_addr);
-static int ipaddr6_parse_ipv6_addr (const char *name, struct ipv6_addr *out_addr);
-static int ipaddr6_parse_ipv6_prefix_bin (const char *str, size_t str_len, int *out_num);
-static int ipaddr6_parse_ipv6_prefix (const char *str, int *out_num);
-static int ipaddr6_parse_ipv6_ifaddr_bin (const char *str, size_t str_len, struct ipv6_ifaddr *out);
-static int ipaddr6_parse_ipv6_ifaddr (const char *str, struct ipv6_ifaddr *out);
+static int ipaddr6_parse_ipv6_addr (MemRef name, struct ipv6_addr *out_addr);
+static int ipaddr6_parse_ipv6_prefix (MemRef str, int *out_num);
+static int ipaddr6_parse_ipv6_ifaddr (MemRef str, struct ipv6_ifaddr *out);
 static int ipaddr6_ipv6_ifaddr_from_addr_mask (struct ipv6_addr addr, struct ipv6_addr mask, struct ipv6_ifaddr *out);
 static int ipaddr6_ipv6_ifaddr_from_addr_mask (struct ipv6_addr addr, struct ipv6_addr mask, struct ipv6_ifaddr *out);
 static void ipaddr6_ipv6_mask_from_prefix (int prefix, struct ipv6_addr *out_mask);
 static void ipaddr6_ipv6_mask_from_prefix (int prefix, struct ipv6_addr *out_mask);
 static int ipaddr6_ipv6_prefix_from_mask (struct ipv6_addr mask, int *out_prefix);
 static int ipaddr6_ipv6_prefix_from_mask (struct ipv6_addr mask, int *out_prefix);
@@ -70,7 +68,7 @@ static int ipaddr6_ipv6_addrs_in_network (struct ipv6_addr addr1, struct ipv6_ad
 static void ipaddr6_print_addr (struct ipv6_addr addr, char *out_buf);
 static void ipaddr6_print_addr (struct ipv6_addr addr, char *out_buf);
 static void ipaddr6_print_ifaddr (struct ipv6_ifaddr addr, char *out_buf);
 static void ipaddr6_print_ifaddr (struct ipv6_ifaddr addr, char *out_buf);
 
 
-int ipaddr6_parse_ipv6_addr_bin (const char *name, size_t name_len, struct ipv6_addr *out_addr)
+int ipaddr6_parse_ipv6_addr (MemRef name, struct ipv6_addr *out_addr)
 {
 {
     int num_blocks = 0;
     int num_blocks = 0;
     int compress_pos = -1;
     int compress_pos = -1;
@@ -79,11 +77,11 @@ int ipaddr6_parse_ipv6_addr_bin (const char *name, size_t name_len, struct ipv6_
     
     
     size_t i = 0;
     size_t i = 0;
     
     
-    while (i < name_len) {
-        if (name[i] == '.') {
+    while (i < name.len) {
+        if (name.ptr[i] == '.') {
             goto ipv4_ending;
             goto ipv4_ending;
-        } else if (name[i] == ':') {
-            int is_double = (i + 1 < name_len && name[i + 1] == ':');
+        } else if (name.ptr[i] == ':') {
+            int is_double = (i + 1 < name.len && name.ptr[i + 1] == ':');
             
             
             if (i > 0) {
             if (i > 0) {
                 if (empty || num_blocks == 7) {
                 if (empty || num_blocks == 7) {
@@ -108,7 +106,7 @@ int ipaddr6_parse_ipv6_addr_bin (const char *name, size_t name_len, struct ipv6_
             
             
             i += 1 + is_double;
             i += 1 + is_double;
         } else {
         } else {
-            int digit = decode_hex_digit(name[i]);
+            int digit = decode_hex_digit(name.ptr[i]);
             if (digit < 0) {
             if (digit < 0) {
                 return 0;
                 return 0;
             }
             }
@@ -153,7 +151,7 @@ ipv4_ending:
         return 0;
         return 0;
     }
     }
     
     
-    while (name[i - 1] != ':') {
+    while (name.ptr[i - 1] != ':') {
         i--;
         i--;
     }
     }
     
     
@@ -162,8 +160,8 @@ ipv4_ending:
     uint8_t byte = 0;
     uint8_t byte = 0;
     empty = 1;
     empty = 1;
     
     
-    while (i < name_len) {
-        if (name[i] == '.') {
+    while (i < name.len) {
+        if (name.ptr[i] == '.') {
             if (empty || cur_byte == 3) {
             if (empty || cur_byte == 3) {
                 return 0;
                 return 0;
             }
             }
@@ -175,7 +173,7 @@ ipv4_ending:
             if (!empty && byte == 0) {
             if (!empty && byte == 0) {
                 return 0;
                 return 0;
             }
             }
-            int digit = decode_decimal_digit(name[i]);
+            int digit = decode_decimal_digit(name.ptr[i]);
             if (digit < 0) {
             if (digit < 0) {
                 return 0;
                 return 0;
             }
             }
@@ -206,15 +204,10 @@ ipv4_ending:
     goto ipv4_done;
     goto ipv4_done;
 }
 }
 
 
-int ipaddr6_parse_ipv6_addr (const char *name, struct ipv6_addr *out_addr)
-{
-    return ipaddr6_parse_ipv6_addr_bin(name, strlen(name), out_addr);
-}
-
-int ipaddr6_parse_ipv6_prefix_bin (const char *str, size_t str_len, int *out_num)
+int ipaddr6_parse_ipv6_prefix (MemRef str, int *out_num)
 {
 {
     uintmax_t d;
     uintmax_t d;
-    if (!parse_unsigned_integer_bin(str, str_len, &d)) {
+    if (!parse_unsigned_integer_bin(str.ptr, str.len, &d)) {
         return 0;
         return 0;
     }
     }
     if (d > 128) {
     if (d > 128) {
@@ -225,25 +218,15 @@ int ipaddr6_parse_ipv6_prefix_bin (const char *str, size_t str_len, int *out_num
     return 1;
     return 1;
 }
 }
 
 
-int ipaddr6_parse_ipv6_prefix (const char *str, int *out_num)
-{
-    return ipaddr6_parse_ipv6_prefix_bin(str, strlen(str), out_num);
-}
-
-int ipaddr6_parse_ipv6_ifaddr_bin (const char *str, size_t str_len, struct ipv6_ifaddr *out)
+int ipaddr6_parse_ipv6_ifaddr (MemRef str, struct ipv6_ifaddr *out)
 {
 {
     size_t slash_pos;
     size_t slash_pos;
-    if (!b_find_char_bin(str, str_len, '/', &slash_pos)) {
+    if (!MemRef_FindChar(str, '/', &slash_pos)) {
         return 0;
         return 0;
     }
     }
     
     
-    return (ipaddr6_parse_ipv6_addr_bin(str, slash_pos, &out->addr) &&
-            ipaddr6_parse_ipv6_prefix_bin(str + slash_pos + 1, str_len - slash_pos - 1, &out->prefix));
-}
-
-int ipaddr6_parse_ipv6_ifaddr (const char *str, struct ipv6_ifaddr *out)
-{
-    return ipaddr6_parse_ipv6_ifaddr_bin(str, strlen(str), out);
+    return (ipaddr6_parse_ipv6_addr(MemRef_SubTo(str, slash_pos), &out->addr) &&
+            ipaddr6_parse_ipv6_prefix(MemRef_SubFrom(str, slash_pos + 1), &out->prefix));
 }
 }
 
 
 int ipaddr6_ipv6_ifaddr_from_addr_mask (struct ipv6_addr addr, struct ipv6_addr mask, struct ipv6_ifaddr *out)
 int ipaddr6_ipv6_ifaddr_from_addr_mask (struct ipv6_addr addr, struct ipv6_addr mask, struct ipv6_ifaddr *out)

+ 1 - 1
ncd/extra/address_utils.h

@@ -107,7 +107,7 @@ static int ncd_read_baddr (NCDValRef val, BAddr *out)
         addr.type = BADDR_TYPE_IPV6;
         addr.type = BADDR_TYPE_IPV6;
         
         
         struct ipv6_addr i6addr;
         struct ipv6_addr i6addr;
-        if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(ipaddr_val), NCDVal_StringLength(ipaddr_val), &i6addr)) {
+        if (!ipaddr6_parse_ipv6_addr(NCDVal_StringMemRef(ipaddr_val), &i6addr)) {
             goto fail;
             goto fail;
         }
         }
         memcpy(addr.ipv6.ip, i6addr.bytes, 16);
         memcpy(addr.ipv6.ip, i6addr.bytes, 16);

+ 3 - 3
ncd/modules/net_ipv6_addr.c

@@ -84,17 +84,17 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     }
     }
     
     
     if (NCDVal_IsInvalid(prefix_arg)) {
     if (NCDVal_IsInvalid(prefix_arg)) {
-        if (!ipaddr6_parse_ipv6_ifaddr_bin(NCDVal_StringData(addr_arg), NCDVal_StringLength(addr_arg), &o->ifaddr)) {
+        if (!ipaddr6_parse_ipv6_ifaddr(NCDVal_StringMemRef(addr_arg), &o->ifaddr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation address");
             ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation address");
             goto fail1;
             goto fail1;
         }
         }
     } else {
     } else {
-        if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(addr_arg), NCDVal_StringLength(addr_arg), &o->ifaddr.addr)) {
+        if (!ipaddr6_parse_ipv6_addr(NCDVal_StringMemRef(addr_arg), &o->ifaddr.addr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong address");
             ModuleLog(o->i, BLOG_ERROR, "wrong address");
             goto fail1;
             goto fail1;
         }
         }
         
         
-        if (!ipaddr6_parse_ipv6_prefix_bin(NCDVal_StringData(prefix_arg), NCDVal_StringLength(prefix_arg), &o->ifaddr.prefix)) {
+        if (!ipaddr6_parse_ipv6_prefix(NCDVal_StringMemRef(prefix_arg), &o->ifaddr.prefix)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong prefix");
             ModuleLog(o->i, BLOG_ERROR, "wrong prefix");
             goto fail1;
             goto fail1;
         }
         }

+ 4 - 4
ncd/modules/net_ipv6_addr_in_network.c

@@ -82,7 +82,7 @@ static void func_new_common (void *vo, NCDModuleInst *i, const struct NCDModuleI
     
     
     // parse addr
     // parse addr
     struct ipv6_addr addr;
     struct ipv6_addr addr;
-    if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(arg_addr), NCDVal_StringLength(arg_addr), &addr)) {
+    if (!ipaddr6_parse_ipv6_addr(NCDVal_StringMemRef(arg_addr), &addr)) {
         ModuleLog(o->i, BLOG_ERROR, "bad address");
         ModuleLog(o->i, BLOG_ERROR, "bad address");
         goto fail0;
         goto fail0;
     }
     }
@@ -90,16 +90,16 @@ static void func_new_common (void *vo, NCDModuleInst *i, const struct NCDModuleI
     // parse network
     // parse network
     struct ipv6_ifaddr network;
     struct ipv6_ifaddr network;
     if (NCDVal_IsInvalid(arg_net_prefix)) {
     if (NCDVal_IsInvalid(arg_net_prefix)) {
-        if (!ipaddr6_parse_ipv6_ifaddr_bin(NCDVal_StringData(arg_net_addr), NCDVal_StringLength(arg_net_addr), &network)) {
+        if (!ipaddr6_parse_ipv6_ifaddr(NCDVal_StringMemRef(arg_net_addr), &network)) {
             ModuleLog(o->i, BLOG_ERROR, "bad network in CIDR notation");
             ModuleLog(o->i, BLOG_ERROR, "bad network in CIDR notation");
             goto fail0;
             goto fail0;
         }
         }
     } else {
     } else {
-        if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(arg_net_addr), NCDVal_StringLength(arg_net_addr), &network.addr)) {
+        if (!ipaddr6_parse_ipv6_addr(NCDVal_StringMemRef(arg_net_addr), &network.addr)) {
             ModuleLog(o->i, BLOG_ERROR, "bad network address");
             ModuleLog(o->i, BLOG_ERROR, "bad network address");
             goto fail0;
             goto fail0;
         }
         }
-        if (!ipaddr6_parse_ipv6_prefix_bin(NCDVal_StringData(arg_net_prefix), NCDVal_StringLength(arg_net_prefix), &network.prefix)) {
+        if (!ipaddr6_parse_ipv6_prefix(NCDVal_StringMemRef(arg_net_prefix), &network.prefix)) {
             ModuleLog(o->i, BLOG_ERROR, "bad network prefix");
             ModuleLog(o->i, BLOG_ERROR, "bad network prefix");
             goto fail0;
             goto fail0;
         }
         }

+ 4 - 4
ncd/modules/net_ipv6_route.c

@@ -95,16 +95,16 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     
     
     // read dest
     // read dest
     if (NCDVal_IsInvalid(dest_prefix_arg)) {
     if (NCDVal_IsInvalid(dest_prefix_arg)) {
-        if (!ipaddr6_parse_ipv6_ifaddr_bin(NCDVal_StringData(dest_arg), NCDVal_StringLength(dest_arg), &o->dest)) {
+        if (!ipaddr6_parse_ipv6_ifaddr(NCDVal_StringMemRef(dest_arg), &o->dest)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation dest");
             ModuleLog(o->i, BLOG_ERROR, "wrong CIDR notation dest");
             goto fail0;
             goto fail0;
         }
         }
     } else {
     } else {
-        if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(dest_arg), NCDVal_StringLength(dest_arg), &o->dest.addr)) {
+        if (!ipaddr6_parse_ipv6_addr(NCDVal_StringMemRef(dest_arg), &o->dest.addr)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong dest addr");
             ModuleLog(o->i, BLOG_ERROR, "wrong dest addr");
             goto fail0;
             goto fail0;
         }
         }
-        if (!ipaddr6_parse_ipv6_prefix_bin(NCDVal_StringData(dest_prefix_arg), NCDVal_StringLength(dest_prefix_arg), &o->dest.prefix)) {
+        if (!ipaddr6_parse_ipv6_prefix(NCDVal_StringMemRef(dest_prefix_arg), &o->dest.prefix)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong dest prefix");
             ModuleLog(o->i, BLOG_ERROR, "wrong dest prefix");
             goto fail0;
             goto fail0;
         }
         }
@@ -117,7 +117,7 @@ static void func_new (void *vo, NCDModuleInst *i, const struct NCDModuleInst_new
     else if (NCDVal_StringEquals(gateway_arg, "blackhole")) {
     else if (NCDVal_StringEquals(gateway_arg, "blackhole")) {
         o->type = TYPE_BLACKHOLE;
         o->type = TYPE_BLACKHOLE;
     } else {
     } else {
-        if (!ipaddr6_parse_ipv6_addr_bin(NCDVal_StringData(gateway_arg), NCDVal_StringLength(gateway_arg), &o->gateway)) {
+        if (!ipaddr6_parse_ipv6_addr(NCDVal_StringMemRef(gateway_arg), &o->gateway)) {
             ModuleLog(o->i, BLOG_ERROR, "wrong gateway");
             ModuleLog(o->i, BLOG_ERROR, "wrong gateway");
             goto fail0;
             goto fail0;
         }
         }

+ 2 - 2
ncd/modules/parse.c

@@ -137,7 +137,7 @@ static int parse_ipv4_addr (NCDModuleInst *i, const char *str, size_t str_len, N
 static int parse_ipv6_addr (NCDModuleInst *i, const char *str, size_t str_len, NCDValMem *mem, NCDValRef *out)
 static int parse_ipv6_addr (NCDModuleInst *i, const char *str, size_t str_len, NCDValMem *mem, NCDValRef *out)
 {
 {
     struct ipv6_addr addr;
     struct ipv6_addr addr;
-    if (!ipaddr6_parse_ipv6_addr_bin(str, str_len, &addr)) {
+    if (!ipaddr6_parse_ipv6_addr(MemRef_Make(str, str_len), &addr)) {
         ModuleLog(i, BLOG_ERROR, "failed to parse ipv6 addresss");
         ModuleLog(i, BLOG_ERROR, "failed to parse ipv6 addresss");
         return 0;
         return 0;
     }
     }
@@ -301,7 +301,7 @@ static void ipv6_cidr_addr_func_new (void *vo, NCDModuleInst *i, const struct NC
         goto fail0;
         goto fail0;
     }
     }
     
     
-    o->succeeded = ipaddr6_parse_ipv6_ifaddr_bin(NCDVal_StringData(str_arg), NCDVal_StringLength(str_arg), &o->ifaddr);
+    o->succeeded = ipaddr6_parse_ipv6_ifaddr(NCDVal_StringMemRef(str_arg), &o->ifaddr);
     
     
     NCDModuleInst_Backend_Up(i);
     NCDModuleInst_Backend_Up(i);
     return;
     return;

+ 1 - 1
tun2socks/tun2socks.c

@@ -778,7 +778,7 @@ int process_arguments (void)
     
     
     // parse IP6 address
     // parse IP6 address
     if (options.netif_ip6addr) {
     if (options.netif_ip6addr) {
-        if (!ipaddr6_parse_ipv6_addr(options.netif_ip6addr, &netif_ip6addr)) {
+        if (!ipaddr6_parse_ipv6_addr(MemRef_MakeCstr(options.netif_ip6addr), &netif_ip6addr)) {
             BLog(BLOG_ERROR, "netif ip6addr: incorrect");
             BLog(BLOG_ERROR, "netif ip6addr: incorrect");
             return 0;
             return 0;
         }
         }