diff --git a/src/jconf.c b/src/jconf.c index 00eb4d2a..8ca0c077 100644 --- a/src/jconf.c +++ b/src/jconf.c @@ -59,7 +59,7 @@ void free_addr(ss_addr_t *addr) void parse_addr(const char *str, ss_addr_t *addr) { - int ret = -1, n = 0; + int ipv6 = 0, ret = -1, n = 0; char *pch; pch = strchr(str, ':'); while (pch != NULL) { @@ -68,15 +68,22 @@ void parse_addr(const char *str, ss_addr_t *addr) pch = strchr(pch + 1, ':'); } if (n > 1) { - if (strcmp(str + ret, "]") != 0) { + ipv6 = 1; + if (str[ret - 1] != ']') { ret = -1; } } if (ret == -1) { - addr->host = strdup(str); + if (ipv6) + addr->host = ss_strndup(str + 1, strlen(str) - 2); + else + addr->host = strdup(str); addr->port = NULL; } else { - addr->host = ss_strndup(str, ret); + if (ipv6) + addr->host = ss_strndup(str + 1, ret - 2); + else + addr->host = ss_strndup(str, ret); addr->port = strdup(str + ret + 1); } } diff --git a/src/udprelay.c b/src/udprelay.c index 84bc39e9..1b81dbd3 100644 --- a/src/udprelay.c +++ b/src/udprelay.c @@ -421,7 +421,7 @@ static void query_resolve_cb(EV_P_ ev_io *w, int revents) err = asyncns_getaddrinfo_done(asyncns, query, &result); if (err) { - ERROR("[udp] getaddrinfo"); + ERROR("[udp] asysncns_getaddrinfo"); } else { // Use IPV4 address if possible for (rp = result; rp != NULL; rp = rp->ai_next) { @@ -819,7 +819,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents) asyncns_query_t *query; memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; - hints.ai_socktype = SOCK_STREAM; + hints.ai_socktype = SOCK_DGRAM; query = asyncns_getaddrinfo(server_ctx->asyncns, host, port, &hints);