8 DragonnetAddr dragonnet_addr_parse_str(char *str)
10 // Reverse string for easier splitting
11 char buf[1+strlen(str)];
12 memset(buf, 0, sizeof buf);
14 for (size_t i = 0; i < strlen(str); ++i)
15 buf[i] = str[strlen(str)-1-i];
17 char *r_port = strtok(buf, ":");
18 char r_ip_addr[2+INET6_ADDRSTRLEN];
22 tok = strtok(NULL, ":");
23 strcat(r_ip_addr, tok);
26 // Reverse strings again
27 char ip_addr[1+strlen(r_ip_addr)];
28 memset(ip_addr, 0, sizeof ip_addr);
30 for (size_t i = 0; i < strlen(r_ip_addr); ++i)
31 ip_addr[i] = r_ip_addr[strlen(r_ip_addr)-1-i];
33 char port[1+strlen(r_port)];
34 memset(port, 0, sizeof port);
36 for (size_t i = 0; i < strlen(r_port); ++i)
37 port[i] = r_port[strlen(r_port)-1-i];
39 DragonnetAddr addr = {0};
40 strcpy(addr.ip, ip_addr);
41 strcpy(addr.port, port);
46 void dragonnet_addr_str(char dst[7+INET6_ADDRSTRLEN], DragonnetAddr addr)
48 memset(dst, 0, 7+INET6_ADDRSTRLEN);
49 sprintf(dst, "[%s]:%s", addr.ip, addr.port);
52 DragonnetAddr dragonnet_addr_parse_sock(struct sockaddr_in6 ai_addr)
54 DragonnetAddr addr = {0};
55 sprintf(addr.port, "%d", ntohs(ai_addr.sin6_port));
56 inet_ntop(AF_INET6, &ai_addr.sin6_addr, addr.ip, INET6_ADDRSTRLEN);
61 struct sockaddr_in6 dragonnet_addr_sock(DragonnetAddr addr)
63 struct sockaddr_in6 ai_addr = {0};
64 ai_addr.sin6_family = AF_INET6;
65 ai_addr.sin6_flowinfo = 0;
66 ai_addr.sin6_port = htons(atoi(addr.port));
67 inet_pton(AF_INET6, addr.ip, &ai_addr.sin6_addr);