@@ -33,6 +33,18 @@ open class Host: NSObject {
33
33
}
34
34
35
35
static internal func currentHostName( ) -> String {
36
+ #if os(Windows)
37
+ var dwLength : DWORD = 0
38
+ GetComputerNameExA ( ComputerNameDnsHostname, nil , & dwLength)
39
+
40
+ let hostname : UnsafeMutablePointer < Int8 > ? =
41
+ UnsafeMutableBufferPointer < Int8 >
42
+ . allocate ( capacity: Int ( dwLength + 1 ) )
43
+ . baseAddress
44
+ defer { hostname? . deallocate ( ) }
45
+ GetComputerNameExA ( ComputerNameDnsHostname, hostname, & dwLength)
46
+ return String ( cString: hostname!)
47
+ #else
36
48
let hname = UnsafeMutablePointer< Int8> . allocate( capacity: Int ( NI_MAXHOST) )
37
49
defer {
38
50
hname. deallocate ( )
@@ -42,6 +54,7 @@ open class Host: NSObject {
42
54
return " localhost "
43
55
}
44
56
return String ( cString: hname)
57
+ #endif
45
58
}
46
59
47
60
open class func current( ) -> Host {
@@ -63,6 +76,39 @@ open class Host: NSObject {
63
76
internal func _resolveCurrent( ) {
64
77
#if os(Android)
65
78
return
79
+ #elseif os(Windows)
80
+ var ulResult : ULONG = 0
81
+
82
+ var ulSize : ULONG = 0
83
+ var arAdapterInfo : UnsafeMutablePointer < IP_ADAPTER_ADDRESSES > ?
84
+
85
+ var buffer : UnsafeMutablePointer < Int8 > =
86
+ UnsafeMutablePointer< Int8> . allocate( capacity: Int ( NI_MAXHOST) )
87
+ defer { buffer. deallocate ( ) }
88
+
89
+ ulResult = GetAdapterAddresses ( AF_UNSPEC, 0 , nil , nil , & ulSize)
90
+ arAdapterInfo = UnsafeMutablePointer< IP_ADAPTER_ADDRESSES>
91
+ . allocate( capacity: ulSize / MemoryLayout< IP_ADAPTER_ADDRESSES> . size)
92
+ defer { arAdapterInfo. deallocate ( ) }
93
+
94
+ ulResult = GetAdapterAddresses ( AF_UNSPEC, 0 , nil , & arAdapterInfo, & ulSize)
95
+ while arAdapterInfo != nil {
96
+ var address = arAdapterInfo. FirstUnicastAddress
97
+ while address != nil {
98
+ switch address. lpSockaddr. sa_family {
99
+ case AF_INET, AF_INET6:
100
+ if GetNameInfoW ( address. lpSockaddr, address. iSockaddrLength,
101
+ buffer, socklen_t ( NI_MAXHOST) , nil , 0 ,
102
+ NI_NUMERICHOST) == 0 {
103
+ _addresses. append ( String ( cString: buffer) )
104
+ }
105
+ default : break
106
+ }
107
+ address = address. Next
108
+ }
109
+ arAdapterInfo = arAdapterInfo. Next
110
+ }
111
+ _resolved = true
66
112
#else
67
113
var ifaddr : UnsafeMutablePointer < ifaddrs > ? = nil
68
114
if getifaddrs ( & ifaddr) != 0 {
@@ -91,12 +137,67 @@ open class Host: NSObject {
91
137
}
92
138
93
139
internal func _resolve( ) {
140
+ guard _resolved == false else { return }
94
141
#if os(Android)
95
142
return
96
- #else
97
- if _resolved {
98
- return
143
+ #elseif os(Windows)
144
+ if let info = _info {
145
+ if _type == . current { return _resolveCurrent ( ) }
146
+
147
+ var hints : ADDRINFOW = ADDRINFOW ( )
148
+ ZeroMemory ( & hints, MemoryLayout< ADDRINFOW> . size)
149
+
150
+ switch ( _type) {
151
+ case . name:
152
+ hints. ai_flags = AI_PASSIVE | AI_CANONNAME
153
+ case . address:
154
+ hints. ai_flags = AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST
155
+ case . current:
156
+ break
157
+ }
158
+ hints. ai_family = AF_UNSPEC
159
+ hints. ai_socktype = SOCK_STREAM
160
+ hints. ai_protocol = IPPROTO_TCP
161
+
162
+ var aiResult : UnsafeMutablePointer < ADDRINFOW > ?
163
+ if GetAddrInfoW ( info, nil , & hints, & aiResult) != 0 { return }
164
+ defer { FreeAddrInfoW ( aiResult) }
165
+
166
+ let szHostName =
167
+ UnsafeMutablePointer< Int8> . allocate( capacity: Int ( NI_MAXHOST) )
168
+ defer { szHostName. deallocate ( ) }
169
+
170
+ while aiResult != nil {
171
+ let aiInfo : ADDRINFOW = aiResult. pointee
172
+ let sa_len : socklen_t = 0
173
+
174
+ switch aiInfo. ai_family {
175
+ case AF_INET:
176
+ sa_len = MemoryLayout< sockaddr_in> . size
177
+ case AF_INET6:
178
+ sa_len = MemoryLayout< sockaddr_in6> . size
179
+ default :
180
+ result = aiInfo. ai_next
181
+ continue
182
+ }
183
+
184
+ let lookup = { ( content: inout [ String ] , flags: Int32 ) in
185
+ if GetNameInfoW ( aiInfo. ai_addr, sa_len, szHostName,
186
+ socklen_t ( NI_MAXHOST) , nil , 0 , flags) == 0 {
187
+ content. append ( String ( cString: szHostName) )
188
+ }
189
+ }
190
+
191
+ lookup ( & _addresses, NI_NUMERICHOST)
192
+ lookup ( & _names, NI_NAMEREQD)
193
+ lookup ( & _names, NI_NOFQDN | NI_NAMEREQD)
194
+
195
+ aiResult = aiInfo. ai_next
196
+ }
197
+
198
+ _resolved = true
99
199
}
200
+ #else
100
201
if let info = _info {
101
202
var flags : Int32 = 0
102
203
switch ( _type) {
0 commit comments