@@ -81,14 +81,26 @@ aiFlagMapping =
81
81
#else
82
82
(AI_ALL , 0 ),
83
83
#endif
84
+ #if HAVE_DECL_AI_CANONNAME
84
85
(AI_CANONNAME , # const AI_CANONNAME ),
86
+ #else
87
+ (AI_CANONNAME , 0 ),
88
+ #endif
89
+ #if HAVE_DECL_AI_NUMERICHOST
85
90
(AI_NUMERICHOST , # const AI_NUMERICHOST ),
91
+ #else
92
+ (AI_NUMERICHOST , 0 ),
93
+ #endif
86
94
#if HAVE_DECL_AI_NUMERICSERV
87
95
(AI_NUMERICSERV , # const AI_NUMERICSERV ),
88
96
#else
89
97
(AI_NUMERICSERV , 0 ),
90
98
#endif
99
+ #if HAVE_DECL_AI_PASSIVE
91
100
(AI_PASSIVE , # const AI_PASSIVE ),
101
+ #else
102
+ (AI_PASSIVE , 0 ),
103
+ #endif
92
104
#if HAVE_DECL_AI_V4MAPPED
93
105
(AI_V4MAPPED , # const AI_V4MAPPED )
94
106
#else
@@ -110,6 +122,7 @@ data AddrInfo = AddrInfo {
110
122
, addrCanonName :: Maybe String
111
123
} deriving (Eq , Show )
112
124
125
+ #if HAVE_STRUCT_ADDRINFO
113
126
instance Storable AddrInfo where
114
127
sizeOf ~ _ = # const sizeof(struct addrinfo)
115
128
alignment ~ _ = alignment (0 :: CInt )
@@ -149,6 +162,8 @@ instance Storable AddrInfo where
149
162
(# poke struct addrinfo, ai_addr) p nullPtr
150
163
(# poke struct addrinfo, ai_canonname) p nullPtr
151
164
(# poke struct addrinfo, ai_next) p nullPtr
165
+ #else
166
+ #endif
152
167
153
168
-- | Flags that control the querying behaviour of 'getNameInfo'.
154
169
-- For more information, see <https://tools.ietf.org/html/rfc3493#page-30>
@@ -176,11 +191,34 @@ data NameInfoFlag =
176
191
177
192
niFlagMapping :: [(NameInfoFlag , CInt )]
178
193
179
- niFlagMapping = [(NI_DGRAM , # const NI_DGRAM ),
180
- (NI_NAMEREQD , # const NI_NAMEREQD ),
181
- (NI_NOFQDN , # const NI_NOFQDN ),
182
- (NI_NUMERICHOST , # const NI_NUMERICHOST ),
183
- (NI_NUMERICSERV , # const NI_NUMERICSERV )]
194
+ niFlagMapping =
195
+ [
196
+ #if HAVE_DECL_NI_
197
+ (NI_DGRAM , # const NI_DGRAM ),
198
+ #else
199
+ (NI_DGRAM , 0 ),
200
+ #endif
201
+ #if HAVE_DECL_NI_NAMEREQD
202
+ (NI_NAMEREQD , # const NI_NAMEREQD ),
203
+ #else
204
+ (NI_NAMEREQD , 0 ),
205
+ #endif
206
+ #if HAVE_DECL_NI_NOFQDN
207
+ (NI_NOFQDN , # const NI_NOFQDN ),
208
+ #else
209
+ (NI_NOFQDN , 0 ),
210
+ #endif
211
+ #if HAVE_DECL_NI_NUMERICHOST
212
+ (NI_NUMERICHOST , # const NI_NUMERICHOST ),
213
+ #else
214
+ (NI_NUMERICHOST , 0 ),
215
+ #endif
216
+ #if HAVE_DECL_NI_NUMERICSERV
217
+ (NI_NUMERICSERV , # const NI_NUMERICSERV )
218
+ #else
219
+ (NI_NUMERICSERV , 0 )
220
+ #endif
221
+ ]
184
222
185
223
-- | Default hints for address lookup with 'getAddrInfo'.
186
224
--
@@ -268,6 +306,7 @@ getAddrInfoNE
268
306
-> Maybe HostName -- ^ host name to look up
269
307
-> Maybe ServiceName -- ^ service name to look up
270
308
-> IO (NonEmpty AddrInfo ) -- ^ resolved addresses, with "best" first
309
+ #if HAVE_GETADDRINFO
271
310
getAddrInfoNE hints node service = alloc getaddrinfo
272
311
where
273
312
alloc body = withSocketsDo $ maybeWith withCString node $ \ c_node ->
@@ -308,15 +347,6 @@ getAddrInfoNE hints node service = alloc getaddrinfo
308
347
filteredHints = hints
309
348
#endif
310
349
311
- getAddrInfoList
312
- :: Maybe AddrInfo
313
- -> Maybe HostName
314
- -> Maybe ServiceName
315
- -> IO [AddrInfo ]
316
- getAddrInfoList hints node service =
317
- -- getAddrInfo never returns an empty list.
318
- NE. toList <$> getAddrInfoNE hints node service
319
-
320
350
followAddrInfo :: Ptr AddrInfo -> IO (NonEmpty AddrInfo )
321
351
followAddrInfo ptr_ai
322
352
-- POSIX requires that getaddrinfo(3) returns at least one addrinfo.
@@ -342,6 +372,10 @@ foreign import ccall safe "hsnet_getaddrinfo"
342
372
343
373
foreign import ccall safe " hsnet_freeaddrinfo"
344
374
c_freeaddrinfo :: Ptr AddrInfo -> IO ()
375
+ #else
376
+ getAddrInfoNE _ _ _ = unsupported " getAddrInfoNE"
377
+ {-# WARNING getAddrInfo "operation will throw 'IOError' \"unsupported operation\"" #-}
378
+ #endif
345
379
346
380
gai_strerror :: CInt -> IO String
347
381
@@ -354,6 +388,15 @@ foreign import ccall safe "gai_strerror"
354
388
gai_strerror n = ioError $ userError $ " Network.Socket.gai_strerror not supported: " ++ show n
355
389
#endif
356
390
391
+ getAddrInfoList
392
+ :: Maybe AddrInfo
393
+ -> Maybe HostName
394
+ -> Maybe ServiceName
395
+ -> IO [AddrInfo ]
396
+ getAddrInfoList hints node service =
397
+ -- getAddrInfo never returns an empty list.
398
+ NE. toList <$> getAddrInfoNE hints node service
399
+
357
400
-----------------------------------------------------------------------------
358
401
359
402
withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a ) -> IO a
@@ -382,6 +425,7 @@ getNameInfo
382
425
-> Bool -- ^ whether to look up a service name
383
426
-> SockAddr -- ^ the address to look up
384
427
-> IO (Maybe HostName , Maybe ServiceName )
428
+ #if HAVE_GETNAMEINFO
385
429
getNameInfo flags doHost doService addr = alloc getnameinfo
386
430
where
387
431
alloc body = withSocketsDo $
@@ -423,6 +467,10 @@ getNameInfo flags doHost doService addr = alloc getnameinfo
423
467
foreign import ccall safe " hsnet_getnameinfo"
424
468
c_getnameinfo :: Ptr SockAddr -> CInt {- CSockLen???-} -> CString -> CSize -> CString
425
469
-> CSize -> CInt -> IO CInt
470
+ #else
471
+ getNameInfo _ _ _ _ = unsupported " getNameInfo"
472
+ {-# WARNING getNameInfo "operation will throw 'IOError' \"unsupported operation\"" #-}
473
+ #endif
426
474
427
475
-- | Pack a list of values into a bitmask. The possible mappings from
428
476
-- value to bit-to-set are given as the first argument. We assume
0 commit comments