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