From b3143ffcf8fbfedc962f893069a6bcd5edfa3ced Mon Sep 17 00:00:00 2001 From: malloc Date: Thu, 31 Jan 2019 13:00:47 -0600 Subject: [PATCH] you can now parse b00b::d00d/88 --- src/server/main.c | 2 +- src/server/util/ipaddr.c | 20 ++++++++++++++++---- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/server/main.c b/src/server/main.c index 356576a..0ef11a0 100644 --- a/src/server/main.c +++ b/src/server/main.c @@ -2,6 +2,6 @@ #include "util/ipaddr.h" int main(int argc, char** argv) { - ipaddr_t test = glv_ip_aton("192.168.1.150/24"); + ipaddr_t test = glv_ip_aton("1234::/64"); return 0; } \ No newline at end of file diff --git a/src/server/util/ipaddr.c b/src/server/util/ipaddr.c index bb07200..db909a9 100644 --- a/src/server/util/ipaddr.c +++ b/src/server/util/ipaddr.c @@ -6,7 +6,7 @@ ipaddr_t glv_ip_aton(const char* addr) { const int length = strlen(addr); ipaddr_t addr_out = {{0, 0, 0, 0, 0, 0, 0, 0}, 128}; char token[5] = {0, 0, 0, 0, 0}; - int i, j = 0, k = 0, cidr = 0, gap = -1, valid, tmp; + int i, j = 0, k = 0, cidr = 0, gap = -2, valid, tmp; if(strchr(addr, ':') != NULL && strchr(addr, '.') != NULL) return error_addr; @@ -75,8 +75,13 @@ ipaddr_t glv_ip_aton(const char* addr) { if(addr[i] == ':' || addr[i] == '/' || i == length - 1) { valid = 1; - if(j == 0 && !(k == 0 && i != length - 1 && addr[i + 1] == ':')) + if (j == 0 && + !(k == 0 && i != length - 1 && addr[i + 1] == ':') && + !(i - 2 >= 0 && addr[i] == '/' && + addr[i - 1] == ':' && addr[i - 2] == ':')) + { return error_addr; + } token[j] = 0; tmp = cidr ? atoi(token) : axtoi(token); @@ -85,7 +90,7 @@ ipaddr_t glv_ip_aton(const char* addr) { if(tmp > 128) return error_addr; addr_out.cidr = tmp; - } else { + } else if(j != 0) { addr_out.addr[k] = tmp; j = 0; ++k; @@ -99,7 +104,7 @@ ipaddr_t glv_ip_aton(const char* addr) { if(i == length - 1) return error_addr; if(addr[i + 1] == ':') { - if(gap == -1) { + if(gap == -2) { ++i; gap = k - 1; continue; @@ -112,6 +117,13 @@ ipaddr_t glv_ip_aton(const char* addr) { if(!valid) return error_addr; } + + if(gap > -2) { + for(i = k - 1; i > gap; --i) { + addr_out.addr[7 - (k - 1 - i)] = addr_out.addr[i]; + addr_out.addr[i] = 0; + } + } } return addr_out;