X-Git-Url: https://git.lizzy.rs/?a=blobdiff_plain;f=addr.c;h=370519a9fc20033748a1317ca6af1bd9f5d1f8e9;hb=4e8c6809edc239dcfae1f9333375776e4c488dff;hp=226e0fde14a63280fb87a51f2fc6f3390ae8fef1;hpb=d9e507892700f2bbe570c0a1de6a4c9ae74786c3;p=dragonnet.git diff --git a/addr.c b/addr.c index 226e0fd..370519a 100644 --- a/addr.c +++ b/addr.c @@ -1,22 +1,56 @@ -#include +#include +#include +#include +#include +#include #include -#include "addr.h" - -DragonnetAddr dragonnet_addr_parse(char *addr) +DragonnetAddr dragonnet_addr_parse_str(char *str) { - DragonnetAddr net_addr; - - size_t port_i = 0; - for (size_t i = 0; i < strlen(addr); ++i) { - if (!port_i) { - if (addr[i] != ':') - net_addr.ip[i] = addr[i]; - else - port_i = i+1; - } else - net_addr.port[i-port_i] = addr[i]; + DragonnetAddr addr = {0}; + + size_t colon_i = 0; + for (ssize_t i = strlen(str)-1; i >= 0; --i) { + if (str[i] == ':') { + colon_i = i; + break; + } + } + + size_t ip_addr_i = 0, port_i = 0; + for (size_t i = 0; i < strlen(str); ++i) { + if (i < colon_i && str[i] != '[' && str[i] != ']') + addr.ip[ip_addr_i++] = str[i]; + else if (i > colon_i) + addr.port[port_i++] = str[i]; } - return net_addr; + return addr; +} + +char *dragonnet_addr_str(DragonnetAddr addr) +{ + char *ptr; + asprintf(&ptr, "[%s]:%s", addr.ip, addr.port); + return ptr; +} + +DragonnetAddr dragonnet_addr_parse_sock(struct sockaddr_in6 ai_addr) +{ + DragonnetAddr addr = {0}; + sprintf(addr.port, "%d", ntohs(ai_addr.sin6_port)); + inet_ntop(AF_INET6, &ai_addr.sin6_addr, addr.ip, INET6_ADDRSTRLEN); + + return addr; +} + +struct sockaddr_in6 dragonnet_addr_sock(DragonnetAddr addr) +{ + struct sockaddr_in6 ai_addr = {0}; + ai_addr.sin6_family = AF_INET6; + ai_addr.sin6_flowinfo = 0; + ai_addr.sin6_port = htons(atoi(addr.port)); + inet_pton(AF_INET6, addr.ip, &ai_addr.sin6_addr); + + return ai_addr; }