1 #include <dragonnet/addr.h>
7 struct addrinfo *dragonnet_str2addr(const char *str)
9 const char *port = str + strlen(str) - 1;
10 while (port >= str && *port != ':')
14 const char *host_begin = str;
15 if (*host_begin == '[')
18 const char *host_end = port - 2;
19 if (host_end >= str && *host_end == ']')
22 ssize_t host_len = host_end - host_begin + 1;
26 char host[host_len + 1];
27 host[host_len] = '\0';
28 memcpy(host, host_begin, host_len);
30 struct addrinfo *result, hints = {0};
31 hints.ai_family = AF_UNSPEC;
32 hints.ai_socktype = SOCK_STREAM;
35 if ((err = getaddrinfo(host, port, &hints, &result))) {
36 fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(err));
43 char *dragonnet_addr2str(struct sockaddr *addr, socklen_t addr_len)
45 char host[NI_MAXHOST], port[NI_MAXSERV];
48 if ((err = getnameinfo(addr, addr_len, host, NI_MAXHOST, port, NI_MAXSERV, NI_NUMERICSERV))) {
49 fprintf(stderr, "getnameinfo: %s\n", gai_strerror(err));
53 char str[1 + strlen(host) + 1 + 1 + strlen(port) + 1];
54 sprintf(str, "[%s]:%s", host, port);