@@ -38,10 +38,14 @@ open class Host: NSObject {
38
38
GetComputerNameExA ( ComputerNameDnsHostname, nil , & dwLength)
39
39
guard dwLength > 0 else { return " localhost " }
40
40
41
- let hostname : UnsafeMutablePointer < Int8 > =
42
- UnsafeMutableBufferPointer < Int8 > . allocate ( capacity: Int ( dwLength + 1 ) ) . baseAddress
41
+ guard let hostname: UnsafeMutablePointer < Int8 > =
42
+ UnsafeMutableBufferPointer < Int8 >
43
+ . allocate ( capacity: Int ( dwLength + 1 ) )
44
+ . baseAddress else {
45
+ return " localhost "
46
+ }
43
47
defer { hostname. deallocate ( ) }
44
- guard GetComputerNameExA ( ComputerNameDnsHostname, hostname, & dwLength) else {
48
+ guard GetComputerNameExA ( ComputerNameDnsHostname, hostname, & dwLength) != FALSE else {
45
49
return " localhost "
46
50
}
47
51
return String ( cString: hostname)
@@ -78,36 +82,42 @@ open class Host: NSObject {
78
82
#if os(Android)
79
83
return
80
84
#elseif os(Windows)
81
- var ulResult : ULONG = 0
82
-
83
85
var ulSize : ULONG = 0
84
- var arAdapterInfo : UnsafeMutablePointer < IP_ADAPTER_ADDRESSES > ?
85
-
86
- var buffer : UnsafeMutablePointer < Int8 > =
87
- UnsafeMutablePointer< Int8> . allocate( capacity: Int ( NI_MAXHOST) )
88
- defer { buffer. deallocate ( ) }
86
+ var ulResult : ULONG =
87
+ GetAdaptersAddresses ( ULONG ( AF_UNSPEC) , 0 , nil , nil , & ulSize)
89
88
90
- ulResult = GetAdapterAddresses ( AF_UNSPEC , 0 , nil , nil , & ulSize )
91
- arAdapterInfo = UnsafeMutablePointer< IP_ADAPTER_ADDRESSES >
92
- . allocate( capacity: ulSize / MemoryLayout< IP_ADAPTER_ADDRESSES> . size)
89
+ let arAdapterInfo : UnsafeMutablePointer < IP_ADAPTER_ADDRESSES > =
90
+ UnsafeMutablePointer< IP_ADAPTER_ADDRESSES_LH >
91
+ . allocate( capacity: Int ( ulSize) / MemoryLayout< IP_ADAPTER_ADDRESSES> . size)
93
92
defer { arAdapterInfo. deallocate ( ) }
94
93
95
- ulResult = GetAdapterAddresses ( AF_UNSPEC, 0 , nil , & arAdapterInfo, & ulSize)
96
- while arAdapterInfo != nil {
97
- var address = arAdapterInfo. FirstUnicastAddress
98
- while address != nil {
99
- switch address. lpSockaddr. sa_family {
100
- case AF_INET, AF_INET6:
101
- if GetNameInfoW ( address. lpSockaddr, address. iSockaddrLength,
102
- buffer, socklen_t ( NI_MAXHOST) , nil , 0 ,
103
- NI_NUMERICHOST) == 0 {
104
- _addresses. append ( String ( cString: buffer) )
94
+ ulResult = GetAdaptersAddresses ( ULONG ( AF_UNSPEC) , 0 , nil , arAdapterInfo, & ulSize)
95
+
96
+ var buffer : UnsafeMutablePointer < WCHAR > =
97
+ UnsafeMutablePointer< WCHAR> . allocate( capacity: Int ( NI_MAXHOST) )
98
+ defer { buffer. deallocate ( ) }
99
+
100
+ var arCurrentAdapterInfo : UnsafeMutablePointer < IP_ADAPTER_ADDRESSES > ? =
101
+ arAdapterInfo
102
+ while arCurrentAdapterInfo != nil {
103
+ var arAddress : UnsafeMutablePointer < IP_ADAPTER_UNICAST_ADDRESS > ? =
104
+ arCurrentAdapterInfo!. pointee. FirstUnicastAddress
105
+ while arAddress != nil {
106
+ let arCurrentAddress : IP_ADAPTER_UNICAST_ADDRESS = arAddress!. pointee
107
+ switch arCurrentAddress. Address. lpSockaddr. pointee. sa_family {
108
+ case ADDRESS_FAMILY ( AF_INET) , ADDRESS_FAMILY ( AF_INET6) :
109
+ if GetNameInfoW ( arCurrentAddress. Address. lpSockaddr,
110
+ arCurrentAddress. Address. iSockaddrLength,
111
+ buffer, DWORD ( NI_MAXHOST) ,
112
+ nil , 0 , NI_NUMERICHOST) == 0 {
113
+ _addresses. append ( String ( decodingCString: buffer,
114
+ as: UTF16 . self) )
105
115
}
106
116
default : break
107
117
}
108
- address = address . Next
118
+ arAddress = arCurrentAddress . Next
109
119
}
110
- arAdapterInfo = arAdapterInfo . Next
120
+ arCurrentAdapterInfo = arCurrentAdapterInfo! . pointee . Next
111
121
}
112
122
_resolved = true
113
123
#else
@@ -146,7 +156,7 @@ open class Host: NSObject {
146
156
if _type == . current { return _resolveCurrent ( ) }
147
157
148
158
var hints : ADDRINFOW = ADDRINFOW ( )
149
- ZeroMemory ( & hints, MemoryLayout< ADDRINFOW> . size)
159
+ memset ( & hints, 0 , MemoryLayout< ADDRINFOW> . size)
150
160
151
161
switch ( _type) {
152
162
case . name:
@@ -158,34 +168,41 @@ open class Host: NSObject {
158
168
}
159
169
hints. ai_family = AF_UNSPEC
160
170
hints. ai_socktype = SOCK_STREAM
161
- hints. ai_protocol = IPPROTO_TCP
171
+ hints. ai_protocol = IPPROTO_TCP . rawValue
162
172
163
173
var aiResult : UnsafeMutablePointer < ADDRINFOW > ?
164
- if GetAddrInfoW ( info, nil , & hints, & aiResult) != 0 { return }
174
+ var bSucceeded : Bool = false
175
+ info. withCString ( encodedAs: UTF16 . self) {
176
+ if GetAddrInfoW ( $0, nil , & hints, & aiResult) == 0 {
177
+ bSucceeded = true
178
+ }
179
+ }
180
+ guard bSucceeded == true else { return }
165
181
defer { FreeAddrInfoW ( aiResult) }
166
182
167
- let szHostName =
168
- UnsafeMutablePointer< Int8 > . allocate( capacity: Int ( NI_MAXHOST) )
169
- defer { szHostName . deallocate ( ) }
183
+ let wszHostName =
184
+ UnsafeMutablePointer< WCHAR > . allocate( capacity: Int ( NI_MAXHOST) )
185
+ defer { wszHostName . deallocate ( ) }
170
186
171
187
while aiResult != nil {
172
- let aiInfo : ADDRINFOW = aiResult. pointee
173
- let sa_len : socklen_t = 0
188
+ let aiInfo : ADDRINFOW = aiResult! . pointee
189
+ var sa_len : socklen_t = 0
174
190
175
191
switch aiInfo. ai_family {
176
192
case AF_INET:
177
- sa_len = MemoryLayout< sockaddr_in> . size
193
+ sa_len = socklen_t ( MemoryLayout< sockaddr_in> . size)
178
194
case AF_INET6:
179
- sa_len = MemoryLayout< sockaddr_in6> . size
195
+ sa_len = socklen_t ( MemoryLayout< sockaddr_in6> . size)
180
196
default :
181
- result = aiInfo. ai_next
197
+ aiResult = aiInfo. ai_next
182
198
continue
183
199
}
184
200
185
201
let lookup = { ( content: inout [ String ] , flags: Int32 ) in
186
- if GetNameInfoW ( aiInfo. ai_addr, sa_len, szHostName,
187
- socklen_t ( NI_MAXHOST) , nil , 0 , flags) == 0 {
188
- content. append ( String ( cString: szHostName) )
202
+ if GetNameInfoW ( aiInfo. ai_addr, sa_len, wszHostName,
203
+ DWORD ( NI_MAXHOST) , nil , 0 , flags) == 0 {
204
+ content. append ( String ( decodingCString: wszHostName,
205
+ as: UTF16 . self) )
189
206
}
190
207
}
191
208
0 commit comments