]> git.lizzy.rs Git - dragonnet.git/blob - addr.c
Add type enum generation
[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         // Reverse string for easier splitting
12         char buf[1+strlen(str)];
13         memset(buf, 0, sizeof buf);
14
15         for (size_t i = 0; i < strlen(str); ++i)
16                 buf[i] = str[strlen(str)-1-i];
17
18         char *r_port = strtok(buf, ":");
19         char r_ip_addr[2+INET6_ADDRSTRLEN];
20
21         char *tok = NULL;
22         while (tok != NULL) {
23                 tok = strtok(NULL, ":");
24                 strcat(r_ip_addr, tok);
25         }
26
27         // Reverse strings again
28         char ip_addr[1+strlen(r_ip_addr)];
29         memset(ip_addr, 0, sizeof ip_addr);
30
31         for (size_t i = 0; i < strlen(r_ip_addr); ++i)
32                 ip_addr[i] = r_ip_addr[strlen(r_ip_addr)-1-i];
33
34         char port[1+strlen(r_port)];
35         memset(port, 0, sizeof port);
36
37         for (size_t i = 0; i < strlen(r_port); ++i)
38                 port[i] = r_port[strlen(r_port)-1-i];
39
40         DragonnetAddr addr = {0};
41         strcpy(addr.ip, ip_addr);
42         strcpy(addr.port, port);
43
44         return addr;
45 }
46
47 char *dragonnet_addr_str(DragonnetAddr addr)
48 {
49         char *ptr;
50         asprintf(&ptr, "[%s]:%s", addr.ip, addr.port);
51         return ptr;
52 }
53
54 DragonnetAddr dragonnet_addr_parse_sock(struct sockaddr_in6 ai_addr)
55 {
56         DragonnetAddr addr = {0};
57         sprintf(addr.port, "%d", ntohs(ai_addr.sin6_port));
58         inet_ntop(AF_INET6, &ai_addr.sin6_addr, addr.ip, INET6_ADDRSTRLEN);
59
60         return addr;
61 }
62
63 struct sockaddr_in6 dragonnet_addr_sock(DragonnetAddr addr)
64 {
65         struct sockaddr_in6 ai_addr = {0};
66         ai_addr.sin6_family = AF_INET6;
67         ai_addr.sin6_flowinfo = 0;
68         ai_addr.sin6_port = htons(atoi(addr.port));
69         inet_pton(AF_INET6, addr.ip, &ai_addr.sin6_addr);
70
71         return ai_addr;
72 }