@@ -999,4 +999,76 @@ w32_gethostname(char *name_utf8, size_t len) {
999
999
memcpy (name_utf8 , tmp_name_utf8 , strlen (tmp_name_utf8 ) + 1 );
1000
1000
free (tmp_name_utf8 );
1001
1001
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