From 4cff9eb6ee12e63bb8815e81c2447175dee51a53 Mon Sep 17 00:00:00 2001 From: lion Date: Wed, 17 Sep 2025 13:07:35 +0800 Subject: [PATCH] ip parse / to_string / compare util function is ready --- binding/c/test_util | Bin 17720 -> 22104 bytes binding/c/test_util.c | 179 +++++++++++++++++++++++++++++++++--------- binding/c/xdb_api.h | 16 +++- binding/c/xdb_util.c | 135 ++++++++++++++++++++++--------- 4 files changed, 252 insertions(+), 78 deletions(-) diff --git a/binding/c/test_util b/binding/c/test_util index 6f2c779ba84e35826c806baeca3fb8422218ff3b..43fd7331bebd4a2b57b66620538a89fc722cf8d6 100755 GIT binary patch literal 22104 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 CQoD`- literal 17720 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 E3)CGo9{>OV diff --git a/binding/c/test_util.c b/binding/c/test_util.c index 9a9fcb6..190382c 100644 --- a/binding/c/test_util.c +++ b/binding/c/test_util.c @@ -9,32 +9,12 @@ #include "stdio.h" #include "xdb_api.h" -void test_check_ip() { - char *ip_list[] = { - "1.2.3.4", "192.168.2.3", "120.24.78.129", "255.255.255.0", - "256.7.12.9", "12.56.78.320", "32.12.45.192", "222.221.220.219", - "192.168.1.101 ", "132.96.12.98a", "x23.12.2.12" - }; - - int errcode, i; - unsigned int ip; - char ip_buff[16] = {'\0'}; - for (i = 0; i < 11; i++) { - errcode = xdb_check_ip(ip_list[i], &ip); - if (errcode != 0) { - printf("invalid ip address `%s`\n", ip_list[i]); - continue; - } - - xdb_long2ip(ip, ip_buff); - printf("long(%-15s)=%-10u, long2ip(%-10u)=%-15s", ip_list[i], ip, ip, ip_buff); - if (strcmp(ip_list[i], ip_buff) != 0) { - printf(" --[Failed]\n"); - } else { - printf(" --[Ok]\n"); - } - } -} +typedef void (* test_func_ptr) (); +struct test_func_entry { + char *name; + test_func_ptr func; +}; +typedef struct test_func_entry test_func_t; void test_load_header() { xdb_header_t *header = xdb_load_header_from_file("../../data/ip2region_v4.xdb"); @@ -79,23 +59,146 @@ void test_load_content() { xdb_free_content(content); } +void test_parse_ip() { + const char *ip_list[] = { + "1.0.0.0", "58.251.30.115", "192.168.1.100", + "::", "2c0f:fff0::", "2fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "240e:982:e617:ffff:ffff:ffff:ffff:ffff", + "219.xx.xx.11", "::xx:ffff", + NULL + }; + + int errcode; + bytes_ip_t ip_bytes[17] = {'\0'}; + string_ip_t ip_string[INET6_ADDRSTRLEN + 1] = {'\0'}; + + // init the sock env (for windows) + if ((errcode = xdb_init_winsock()) != 0) { + printf("failed to init the winsock"); + return; + } + + for (int i = 0;; i++) { + if (ip_list[i] == NULL) { + break; + } + + errcode = xdb_parse_ip(ip_list[i], ip_bytes, sizeof(ip_bytes)); + if (errcode == -1) { + printf("failed to parse ip `%s`\n", ip_list[i]); + continue; + } + + xdb_ip_to_string(ip_bytes, errcode, ip_string, sizeof(ip_string)); + printf("ip: %s (version=v%d), toString: %s\n", ip_list[i], errcode, ip_string); + } + + // clean up the winsock + xdb_clean_winsock(); +} + +struct ip_pair { + const char *sip; + const char *eip; +}; +void test_ip_compare() { + struct ip_pair ip_pair_list[] = { + {"1.0.0.0", "1.0.0.1"}, + {"192.168.1.101", "192.168.1.90"}, + {"219.133.111.87", "114.114.114.114"}, + {"1.0.4.0", "1.0.1.0"}, + {"1.0.4.0", "1.0.3.255"}, + {"2000::", "2000:ffff:ffff:ffff:ffff:ffff:ffff:ffff"}, + {"2001:4:112::", "2001:4:112:ffff:ffff:ffff:ffff:ffff"}, + {"ffff::", "2001:4:ffff:ffff:ffff:ffff:ffff:ffff"}, + {NULL, NULL} + }; + + struct ip_pair *pair_ptr = NULL; + bytes_ip_t sip_bytes[16] = {'\0'}; + bytes_ip_t eip_bytes[16] = {'\0'}; + int sip_version, eip_version, bytes, errcode; + + // init the sock env (for windows) + if ((errcode = xdb_init_winsock()) != 0) { + printf("failed to init the winsock"); + return; + } + + for (int i = 0; ;i++) { + pair_ptr = &ip_pair_list[i]; + if (pair_ptr->sip == NULL) { + break; + } + + sip_version = xdb_parse_ip(pair_ptr->sip, sip_bytes, sizeof(sip_bytes)); + if (sip_version == -1) { + printf("failed to parse sip `%s`", pair_ptr->sip); + continue; + } + + eip_version = xdb_parse_ip(pair_ptr->eip, eip_bytes, sizeof(eip_bytes)); + if (eip_version == -1) { + printf("failed to parse eip `%s`", pair_ptr->eip); + continue; + } + + bytes = sip_version == xdb_ipv4_version_no ? xdb_ipv4_bytes : xdb_ipv6_bytes; + printf( + "ip_sub_compare(%s, %s): %d\n", + pair_ptr->sip, pair_ptr->eip, + xdb_ip_sub_compare(sip_bytes, bytes, eip_bytes, 0) + ); + } + + // clean up the winsock + xdb_clean_winsock(); +} + +// please register your function heare +static test_func_t _test_function_list[] = { + // xdb buffer + {"test_load_header", test_load_header}, + {"test_load_vector_index", test_load_vector_index}, + {"test_load_content", test_load_content}, + + // ip utils + {"test_parse_ip", test_parse_ip}, + {"test_ip_compare", test_ip_compare}, + + {NULL, NULL} +}; + // valgrind --tool=memcheck --leak-check=full ./a.out int main(int argc, char *argv[]) { - printf("test check ip ... \n"); - test_check_ip(); - printf("|--done\n\n"); + int i; + char *name; - printf("test load header ... \n"); - test_load_header(); - printf("|--done\n\n"); + // check and call the function + if (argc < 2) { + printf("please specified the function name to call\n"); + return 1; + } - printf("test load vector index ... \n"); - test_load_vector_index(); - printf("|--done\n\n"); + name = argv[1]; + test_func_ptr func = NULL; + for (i = 0; ; i++) { + if (_test_function_list[i].name == NULL) { + break; + } - printf("test load content ... \n"); - test_load_content(); - printf("|--done\n\n"); + if (strcmp(name, _test_function_list[i].name) == 0) { + func = _test_function_list[i].func; + break; + } + } + + if (func == NULL) { + printf("can't find test function `%s`\n", name); + return 1; + } + + // call the function + func(); return 0; } diff --git a/binding/c/xdb_api.h b/binding/c/xdb_api.h index af846cc..244f1c5 100644 --- a/binding/c/xdb_api.h +++ b/binding/c/xdb_api.h @@ -17,10 +17,17 @@ # define XDB_PUBLIC(type) extern __declspec(dllexport) type # define XDB_PRIVATE(type) static type # define XDB_WINDOWS +#include +#include +#include +#pragma comment(lib, "ws2_32.lib") #elif ( defined(linux) || defined(_UNIX) || defined(__APPLE__) ) # define XDB_PUBLIC(type) extern type # define XDB_PRIVATE(type) static inline type # define XDB_LINUX +#include +#include +#include #endif #define xdb_calloc( _blocks, _bytes ) calloc( _blocks, _bytes ) @@ -37,6 +44,8 @@ // --- ip version info #define xdb_ipv4_version_no 4 #define xdb_ipv6_version_no 6 +#define xdb_ipv4_bytes 4 +#define xdb_ipv6_bytes 16 #define XDB_IPV4 4 #define XDB_IPv6 6 @@ -49,6 +58,11 @@ typedef unsigned char bytes_ip_t; // --- xdb util functions +// to compatiable with the windows +// returns: 0 for ok and -1 for failed +XDB_PUBLIC(int) xdb_init_winsock(); +XDB_PUBLIC(void) xdb_clean_winsock(); + // get the current time in microseconds XDB_PUBLIC(long) xdb_now(); @@ -79,7 +93,7 @@ XDB_PUBLIC(int) xdb_parse_v6_ip(const string_ip_t *, bytes_ip_t *, size_t); // convert a specified ip bytes to humen-readable string. // returns: 0 for success or -1 for failed. -XDB_PUBLIC(int) xdb_ip_to_string(const bytes_ip_t *, size_t, char *, size_t); +XDB_PUBLIC(int) xdb_ip_to_string(const bytes_ip_t *, int, char *, size_t); // ipv4 bytes to string XDB_PUBLIC(int) xdb_v4_ip_to_string(const bytes_ip_t *, char *, size_t); diff --git a/binding/c/xdb_util.c b/binding/c/xdb_util.c index 812f7b4..0f48b42 100644 --- a/binding/c/xdb_util.c +++ b/binding/c/xdb_util.c @@ -15,7 +15,27 @@ // @Note: since 2023/10/13 to compatible with the windows system #ifdef XDB_WINDOWS -#include +static int winsock_initialized = 0; +XDB_PUBLIC(int) xdb_init_winsock() { + if (winsock_initialized == 1) { + return 0; + } + + WSADATA wsaData; + if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { + return -1; + } + winsock_initialized = 1; + return 0; +} + +XDB_PUBLIC(void) xdb_clean_winsock() { + if (winsock_initialized == 1) { + WSACleanup(); + winsock_initialized = 0; + } +} + XDB_PRIVATE(int) gettimeofday(struct timeval* tp, void* tzp) { time_t clock; struct tm tm; @@ -33,6 +53,9 @@ XDB_PRIVATE(int) gettimeofday(struct timeval* tp, void* tzp) { tp->tv_usec = wtm.wMilliseconds * 1000; return (0); } +#else +XDB_PUBLIC(int) xdb_init_winsock() {return 0;} +XDB_PUBLIC(void) xdb_clean_winsock() {} #endif XDB_PUBLIC(long) xdb_now() { @@ -96,66 +119,100 @@ XDB_PUBLIC(void) xdb_long2ip(unsigned int ip, char *buffer) { sprintf(buffer, "%d.%d.%d.%d", (ip >> 24) & 0xFF, (ip >> 16) & 0xFF, (ip >> 8) & 0xFF, ip & 0xFF); } -XDB_PUBLIC(int) xdb_parse_ip(const string_ip_t *ip, bytes_ip_t *buffer, size_t length) { - // where there is a . there is a IPV4 even though there are IPv6 wrapped IPv4 like - // ::ffff:192.168.1.100, lets just keep it in this way. - if (strchr(ip, '.') != NULL) { - return xdb_parse_v4_ip(ip, buffer, length); - } else if (strchr(ip, ':') != NULL) { - return xdb_parse_v6_ip(ip, buffer, length); +XDB_PUBLIC(int) xdb_parse_ip(const string_ip_t *ip_string, bytes_ip_t *buffer, size_t length) { + // version check + if (strchr(ip_string, '.') != NULL && strchr(ip_string, ':') == NULL) { + return xdb_parse_v4_ip(ip_string, buffer, length); + } else if (strchr(ip_string, ':') != NULL) { + return xdb_parse_v6_ip(ip_string, buffer, length); } return -1; } -XDB_PUBLIC(int) xdb_parse_v4_ip(const string_ip_t *ip, bytes_ip_t *buffer, size_t length) { - return 0; +XDB_PUBLIC(int) xdb_parse_v4_ip(const string_ip_t *ip_string, bytes_ip_t *buffer, size_t length) { + struct in_addr addr; + + // buffer length checking + if (length < xdb_ipv4_bytes) { + return -1; + } + + if (inet_pton(AF_INET, ip_string, &addr) != 1) { + return -1; + } + + // encode the address to buffer with big endian byte bufffer. + buffer[0] = (addr.s_addr) & 0xFF; + buffer[1] = (addr.s_addr >> 8) & 0xFF; + buffer[2] = (addr.s_addr >> 16) & 0xFF; + buffer[3] = (addr.s_addr >> 24) & 0xFF; + return xdb_ipv4_version_no; } -XDB_PUBLIC(int) xdb_parse_v6_ip(const string_ip_t *ip, bytes_ip_t *buffer, size_t length) { - return 0; +XDB_PUBLIC(int) xdb_parse_v6_ip(const string_ip_t *ip_string, bytes_ip_t *buffer, size_t length) { + struct in6_addr addr; + + // buffer length checking + if (length < xdb_ipv6_bytes) { + return -1; + } + + if (inet_pton(AF_INET6, ip_string, &addr) != 1) { + return -1; + } + + memcpy(buffer, addr.s6_addr, xdb_ipv6_bytes); + return xdb_ipv6_version_no; } -XDB_PUBLIC(int) xdb_ip_to_string(const bytes_ip_t *ip, size_t bytes, char *buffer, size_t length) { - if (bytes == 4) { - return xdb_v4_ip_to_string(ip, buffer, length); - } else if (bytes == 16) { - return xdb_v6_ip_to_string(ip, buffer, length); +XDB_PUBLIC(int) xdb_ip_to_string(const bytes_ip_t *ip_bytes, int version, char *ip_string, size_t length) { + if (version == xdb_ipv4_version_no) { + return xdb_v4_ip_to_string(ip_bytes, ip_string, length); + } else if (version == xdb_ipv6_version_no) { + return xdb_v6_ip_to_string(ip_bytes, ip_string, length); } return -1; } -XDB_PUBLIC(int) xdb_v4_ip_to_string(const bytes_ip_t *ip, char *buffer, size_t length) { - snprintf( - buffer, length, - "%d.%d.%d.%d", - ip[0], ip[1], ip[2], ip[3] - ); +XDB_PUBLIC(int) xdb_v4_ip_to_string(const bytes_ip_t *ip_bytes, char *ip_string, size_t length) { + if (!ip_bytes || !ip_string || length == 0) { + return -1; + } + + // buffer length checking + if (length < INET_ADDRSTRLEN) { + return -1; + } + + if (inet_ntop(AF_INET, ip_bytes, ip_string, length) == NULL) { + return -1; + } + return 0; } -XDB_PUBLIC(int) xdb_v6_ip_to_string(const bytes_ip_t *ip, char *buffer, size_t length) { - // temp solution for testing ONLY, we will handle the :: later - snprintf( - buffer, length, - "%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x:%x%x", - ip[0], ip[1], - ip[2], ip[3], - ip[4], ip[5], - ip[6], ip[7], - ip[8], ip[9], - ip[10], ip[11], - ip[12], ip[13], - ip[14], ip[15] - ); +XDB_PUBLIC(int) xdb_v6_ip_to_string(const bytes_ip_t *ip_bytes, char *ip_string, size_t length) { + if (!ip_bytes || !ip_string || length == 0) { + return -1; + } + + if (length < INET6_ADDRSTRLEN) { + return -1; + } + + if (inet_ntop(AF_INET6, ip_bytes, ip_string, length) == NULL) { + return -1; + } + return 0; } XDB_PUBLIC(int) xdb_ip_sub_compare(const bytes_ip_t *ip1, size_t length, const char *buffer, int offset) { - int i, i1, i2; + register int i, i1, i2; for (i = 0; i < length; i++) { - i1 = ip1[i] & 0xFF; + i1 = ip1[i]; i2 = buffer[offset + i] & 0xFF; if (i1 > i2) { return 1;