]> git.lizzy.rs Git - dragonnet.git/blobdiff - addr.c
Fix #include order
[dragonnet.git] / addr.c
diff --git a/addr.c b/addr.c
index 226e0fde14a63280fb87a51f2fc6f3390ae8fef1..370519a9fc20033748a1317ca6af1bd9f5d1f8e9 100644 (file)
--- a/addr.c
+++ b/addr.c
@@ -1,22 +1,56 @@
-#include <arpa/inet.h>
+#include <dragonnet/addr.h>
+#include <dragonport/asprintf.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <stdlib.h>
 #include <string.h>
 
-#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;
 }