]> git.lizzy.rs Git - dragonnet.git/blob - addr.c
Implement deallocators
[dragonnet.git] / addr.c
1 #include <dragonnet/addr.h>
2 #include <dragonport/asprintf.h>
3 #include <stdbool.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <string.h>
7
8 DragonnetAddr dragonnet_addr_parse_str(char *str)
9 {
10         DragonnetAddr addr = {0};
11
12         size_t colon_i = 0;
13         for (ssize_t i = strlen(str)-1; i >= 0; --i) {
14                 if (str[i] == ':') {
15                         colon_i = i;
16                         break;
17                 }
18         }
19
20         size_t ip_addr_i = 0, port_i = 0;
21         for (size_t i = 0; i < strlen(str); ++i) {
22                 if (i < colon_i && str[i] != '[' && str[i] != ']')
23                         addr.ip[ip_addr_i++] = str[i];
24                 else if (i > colon_i)
25                         addr.port[port_i++] = str[i];
26         }
27
28         return addr;
29 }
30
31 char *dragonnet_addr_str(DragonnetAddr addr)
32 {
33         char *ptr;
34         asprintf(&ptr, "[%s]:%s", addr.ip, addr.port);
35         return ptr;
36 }
37
38 DragonnetAddr dragonnet_addr_parse_sock(struct sockaddr_in6 ai_addr)
39 {
40         DragonnetAddr addr = {0};
41         sprintf(addr.port, "%d", ntohs(ai_addr.sin6_port));
42         inet_ntop(AF_INET6, &ai_addr.sin6_addr, addr.ip, INET6_ADDRSTRLEN);
43
44         return addr;
45 }
46
47 struct sockaddr_in6 dragonnet_addr_sock(DragonnetAddr addr)
48 {
49         struct sockaddr_in6 ai_addr = {0};
50         ai_addr.sin6_family = AF_INET6;
51         ai_addr.sin6_flowinfo = 0;
52         ai_addr.sin6_port = htons(atoi(addr.port));
53         inet_pton(AF_INET6, addr.ip, &ai_addr.sin6_addr);
54
55         return ai_addr;
56 }