]> git.lizzy.rs Git - dragonnet.git/blob - addr.c
Fix getnameinfo failure
[dragonnet.git] / addr.c
1 #include <dragonnet/addr.h>
2 #include <stdbool.h>
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6
7 struct addrinfo *dragonnet_str2addr(const char *str)
8 {
9         const char *port = str + strlen(str) - 1;
10         while (port >= str && *port != ':')
11                 port--;
12         port++;
13
14         const char *host_begin = str;
15         if (*host_begin == '[')
16                 host_begin++;
17
18         const char *host_end = port - 2;
19         if (host_end >= str && *host_end == ']')
20                 host_end--;
21
22         ssize_t host_len = host_end - host_begin + 1;
23         if (host_len < 0)
24                 host_len = 0;
25
26         char host[host_len + 1];
27         host[host_len] = '\0';
28         memcpy(host, host_begin, host_len);
29
30         struct addrinfo *result, hints = {0};
31         hints.ai_family = AF_UNSPEC;
32         hints.ai_socktype = SOCK_STREAM;
33
34         int err;
35         if ((err = getaddrinfo(host, port, &hints, &result))) {
36                 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
37                 return NULL;
38         }
39
40         return result;
41 }
42
43 char *dragonnet_addr2str(struct sockaddr *addr, socklen_t addr_len)
44 {
45         char host[NI_MAXHOST], port[NI_MAXSERV];
46
47         int err;
48         if ((err = getnameinfo(addr, addr_len, host, NI_MAXHOST, port, NI_MAXSERV, NI_NUMERICHOST | NI_NUMERICSERV))) {
49                 fprintf(stderr, "getnameinfo: %s\n", gai_strerror(err));
50                 return NULL;
51         }
52
53         char str[1 + strlen(host) + 1 + 1 + strlen(port) + 1];
54         sprintf(str, "[%s]:%s", host, port);
55         return strdup(str);
56 }