]> git.lizzy.rs Git - dragonnet.git/blob - addr.c
d675674150a9b6e84fccb20e30b0cbbc4a16edb1
[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         for (size_t i = 0; i < strlen(str); ++i) {
22                 if (i < colon_i)
23                         addr.ip[i] = str[i];
24                 else if (i > colon_i)
25                         addr.port[i-colon_i-1] = 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 }