Skip to content

Commit 0af8ae3

Browse files
committed
Unicode enabled on getaddrinfo (unicode targets are now supported)
1 parent 4676c9f commit 0af8ae3

File tree

3 files changed

+78
-1
lines changed

3 files changed

+78
-1
lines changed

contrib/win32/win32compat/inc/sys/socket.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,5 @@
2020
#define send(a,b,c,d) w32_send((a), (b), (c), (d))
2121
#define shutdown(a,b) w32_shutdown((a), (b))
2222
#define socketpair(a,b,c,d) w32_socketpair((a), (b), (c), (d))
23+
#define freeaddrinfo w32_freeaddrinfo
24+
#define getaddrinfo w32_getaddrinfo

contrib/win32/win32compat/inc/w32posix.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,9 @@ int w32_sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
7171
int w32_raise(int sig);
7272
int w32_kill(int pid, int sig);
7373
int w32_gethostname(char *, size_t);
74+
void w32_freeaddrinfo(struct addrinfo *);
75+
int w32_getaddrinfo(const char *, const char *,
76+
const struct addrinfo *, struct addrinfo **);
7477
FILE* w32_fopen_utf8(const char *, const char *);
7578

7679

contrib/win32/win32compat/socketio.c

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -999,4 +999,76 @@ w32_gethostname(char *name_utf8, size_t len) {
999999
memcpy(name_utf8, tmp_name_utf8, strlen(tmp_name_utf8) + 1);
10001000
free(tmp_name_utf8);
10011001
return 0;
1002-
}
1002+
}
1003+
1004+
void
1005+
w32_freeaddrinfo(struct addrinfo *ai) {
1006+
struct addrinfo *cur;
1007+
while (ai) {
1008+
cur = ai;
1009+
ai = ai->ai_next;
1010+
if (cur->ai_addr)
1011+
free(cur->ai_addr);
1012+
if (cur->ai_canonname)
1013+
free(cur->ai_canonname);
1014+
free(cur);
1015+
}
1016+
}
1017+
1018+
int
1019+
w32_getaddrinfo(const char *node_utf8, const char *service_utf8,
1020+
const struct addrinfo *hints, struct addrinfo **res) {
1021+
int ret = 0;
1022+
wchar_t *node_utf16 = NULL, *service_utf16 = NULL;
1023+
struct addrinfoW *info_w = NULL;
1024+
*res = NULL;
1025+
1026+
if ((node_utf8 && (node_utf16 = utf8_to_utf16(node_utf8)) == NULL) ||
1027+
(service_utf8 && (service_utf16 = utf8_to_utf16(service_utf8)) == NULL)) {
1028+
ret = EAI_MEMORY;
1029+
goto done;
1030+
}
1031+
1032+
if ((ret = GetAddrInfoW(node_utf16, service_utf16, (ADDRINFOW*)hints, &info_w)) != 0)
1033+
goto done;
1034+
1035+
/* copy info_w to res */
1036+
{
1037+
struct addrinfoW **cur_w = &info_w;
1038+
struct addrinfo **cur = res;
1039+
1040+
while (*cur_w) {
1041+
if ((*cur = malloc(sizeof(struct addrinfo))) == NULL) {
1042+
ret = EAI_MEMORY;
1043+
goto done;
1044+
}
1045+
memcpy(*cur, *cur_w, sizeof(struct addrinfo));
1046+
(*cur)->ai_next = NULL;
1047+
if (((*cur_w)->ai_canonname && ((*cur)->ai_canonname = utf16_to_utf8((*cur_w)->ai_canonname)) == NULL) ||
1048+
((*cur_w)->ai_addrlen && ((*cur)->ai_addr = malloc((*cur_w)->ai_addrlen)) == NULL) ) {
1049+
ret = EAI_MEMORY;
1050+
goto done;
1051+
1052+
}
1053+
if ((*cur_w)->ai_addrlen)
1054+
memcpy((*cur)->ai_addr, (*cur_w)->ai_addr, (*cur_w)->ai_addrlen);
1055+
cur_w = &(*cur_w)->ai_next;
1056+
cur = &(*cur)->ai_next;
1057+
}
1058+
}
1059+
1060+
done:
1061+
if (node_utf16)
1062+
free(node_utf16);
1063+
if (service_utf16)
1064+
free(service_utf16);
1065+
if (info_w)
1066+
FreeAddrInfoW(info_w);
1067+
if (ret != 0 && *res) {
1068+
w32_freeaddrinfo(*res);
1069+
*res = NULL;
1070+
}
1071+
return ret;
1072+
}
1073+
1074+

0 commit comments

Comments
 (0)