]> git.lizzy.rs Git - dragonnet.git/blob - addr.c
gen_messages: Use dragontype numbers instead of stdint
[dragonnet.git] / addr.c
1 #include <stdbool.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5
6 #include "addr.h"
7
8 DragonnetAddr dragonnet_addr_parse_str(char *str)
9 {
10         // Reverse string for easier splitting
11         char buf[1+strlen(str)];
12         memset(buf, 0, sizeof buf);
13
14         for (size_t i = 0; i < strlen(str); ++i)
15                 buf[i] = str[strlen(str)-1-i];
16
17         char *r_port = strtok(buf, ":");
18         char r_ip_addr[2+INET6_ADDRSTRLEN];
19
20         char *tok = NULL;
21         while (tok != NULL) {
22                 tok = strtok(NULL, ":");
23                 strcat(r_ip_addr, tok);
24         }
25
26         // Reverse strings again
27         char ip_addr[1+strlen(r_ip_addr)];
28         memset(ip_addr, 0, sizeof ip_addr);
29
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];
32
33         char port[1+strlen(r_port)];
34         memset(port, 0, sizeof port);
35
36         for (size_t i = 0; i < strlen(r_port); ++i)
37                 port[i] = r_port[strlen(r_port)-1-i];
38
39         DragonnetAddr addr = {0};
40         strcpy(addr.ip, ip_addr);
41         strcpy(addr.port, port);
42
43         return addr;
44 }
45
46 void dragonnet_addr_str(char dst[7+INET6_ADDRSTRLEN], DragonnetAddr addr)
47 {
48         memset(dst, 0, 7+INET6_ADDRSTRLEN);
49         sprintf(dst, "[%s]:%s", addr.ip, addr.port);
50 }
51
52 DragonnetAddr dragonnet_addr_parse_sock(struct sockaddr_in6 ai_addr)
53 {
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);
57
58         return addr;
59 }
60
61 struct sockaddr_in6 dragonnet_addr_sock(DragonnetAddr addr)
62 {
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);
68
69         return ai_addr;
70 }