diff --git a/src/xpdev/ini_file.c b/src/xpdev/ini_file.c index 49f75b714d7572c97506de7c9d964c697b451dc3..4f9452eef86bd5d0a7d63a293f37b84713cce6a1 100644 --- a/src/xpdev/ini_file.c +++ b/src/xpdev/ini_file.c @@ -577,10 +577,14 @@ char* iniSetIpAddress(str_list_t* list, const char* section, const char* key, ul char* iniSetIp6Address(str_list_t* list, const char* section, const char* key, struct in6_addr value ,ini_style_t* style) { - char addr[INET6_ADDRSTRLEN]; + char addrstr[INET6_ADDRSTRLEN]; + union xp_sockaddr addr = {0}; - inet_ntop(AF_INET6, &value, addr, sizeof(addr)); - return iniSetString(list, section, key, addr, style); + addr.in6.sin6_addr = value; + addr.in6.sin6_family = AF_INET6; + addr.in6.sin6_len = sizeof(addr.in6); + inet_addrtop(&addr, addrstr, sizeof(addrstr)); + return iniSetString(list, section, key, addrstr, style); } #endif @@ -1355,9 +1359,24 @@ static ulong parseIpAddress(const char* value) static struct in6_addr parseIp6Address(const char* value) { - struct in6_addr ret; + struct addrinfo hints = {0}; + struct addrinfo *res, *cur; + struct in6_addr ret = {0}; - inet_pton(AF_INET6, value, &ret); + hints.ai_flags = AI_NUMERICHOST|AI_PASSIVE; + if(getaddrinfo(value, NULL, &hints, &res)) + return ret; + + for(cur = res; cur; cur++) { + if(cur->ai_addr->sa_family == AF_INET6) + break; + } + if(!cur) { + freeaddrinfo(res); + return ret; + } + memcpy(&ret, &((struct sockaddr_in6 *)(cur->ai_addr))->sin6_addr, sizeof(ret)); + freeaddrinfo(res); return ret; }