@@ -81,14 +81,26 @@ aiFlagMapping =
8181#else
8282 (AI_ALL , 0 ),
8383#endif
84+ #if HAVE_DECL_AI_CANONNAME
8485 (AI_CANONNAME , # const AI_CANONNAME ),
86+ #else
87+ (AI_CANONNAME , 0 ),
88+ #endif
89+ #if HAVE_DECL_AI_NUMERICHOST
8590 (AI_NUMERICHOST , # const AI_NUMERICHOST ),
91+ #else
92+ (AI_NUMERICHOST , 0 ),
93+ #endif
8694#if HAVE_DECL_AI_NUMERICSERV
8795 (AI_NUMERICSERV , # const AI_NUMERICSERV ),
8896#else
8997 (AI_NUMERICSERV , 0 ),
9098#endif
99+ #if HAVE_DECL_AI_PASSIVE
91100 (AI_PASSIVE , # const AI_PASSIVE ),
101+ #else
102+ (AI_PASSIVE , 0 ),
103+ #endif
92104#if HAVE_DECL_AI_V4MAPPED
93105 (AI_V4MAPPED , # const AI_V4MAPPED )
94106#else
@@ -110,6 +122,7 @@ data AddrInfo = AddrInfo {
110122 , addrCanonName :: Maybe String
111123 } deriving (Eq , Show )
112124
125+ #if HAVE_STRUCT_ADDRINFO
113126instance Storable AddrInfo where
114127 sizeOf ~ _ = # const sizeof(struct addrinfo)
115128 alignment ~ _ = alignment (0 :: CInt )
@@ -149,6 +162,8 @@ instance Storable AddrInfo where
149162 (# poke struct addrinfo, ai_addr) p nullPtr
150163 (# poke struct addrinfo, ai_canonname) p nullPtr
151164 (# poke struct addrinfo, ai_next) p nullPtr
165+ #else
166+ #endif
152167
153168-- | Flags that control the querying behaviour of 'getNameInfo'.
154169-- For more information, see <https://tools.ietf.org/html/rfc3493#page-30>
@@ -176,11 +191,34 @@ data NameInfoFlag =
176191
177192niFlagMapping :: [(NameInfoFlag , CInt )]
178193
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+ ]
184222
185223-- | Default hints for address lookup with 'getAddrInfo'.
186224--
@@ -268,6 +306,7 @@ getAddrInfoNE
268306 -> Maybe HostName -- ^ host name to look up
269307 -> Maybe ServiceName -- ^ service name to look up
270308 -> IO (NonEmpty AddrInfo ) -- ^ resolved addresses, with "best" first
309+ #if HAVE_GETADDRINFO
271310getAddrInfoNE hints node service = alloc getaddrinfo
272311 where
273312 alloc body = withSocketsDo $ maybeWith withCString node $ \ c_node ->
@@ -308,15 +347,6 @@ getAddrInfoNE hints node service = alloc getaddrinfo
308347 filteredHints = hints
309348#endif
310349
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-
320350followAddrInfo :: Ptr AddrInfo -> IO (NonEmpty AddrInfo )
321351followAddrInfo ptr_ai
322352 -- POSIX requires that getaddrinfo(3) returns at least one addrinfo.
@@ -342,6 +372,10 @@ foreign import ccall safe "hsnet_getaddrinfo"
342372
343373foreign import ccall safe " hsnet_freeaddrinfo"
344374 c_freeaddrinfo :: Ptr AddrInfo -> IO ()
375+ #else
376+ getAddrInfoNE _ _ _ = unsupported " getAddrInfoNE"
377+ {-# WARNING getAddrInfo "operation will throw 'IOError' \"unsupported operation\"" #-}
378+ #endif
345379
346380gai_strerror :: CInt -> IO String
347381
@@ -354,6 +388,15 @@ foreign import ccall safe "gai_strerror"
354388gai_strerror n = ioError $ userError $ " Network.Socket.gai_strerror not supported: " ++ show n
355389#endif
356390
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+
357400-----------------------------------------------------------------------------
358401
359402withCStringIf :: Bool -> Int -> (CSize -> CString -> IO a ) -> IO a
@@ -382,6 +425,7 @@ getNameInfo
382425 -> Bool -- ^ whether to look up a service name
383426 -> SockAddr -- ^ the address to look up
384427 -> IO (Maybe HostName , Maybe ServiceName )
428+ #if HAVE_GETNAMEINFO
385429getNameInfo flags doHost doService addr = alloc getnameinfo
386430 where
387431 alloc body = withSocketsDo $
@@ -423,6 +467,10 @@ getNameInfo flags doHost doService addr = alloc getnameinfo
423467foreign import ccall safe " hsnet_getnameinfo"
424468 c_getnameinfo :: Ptr SockAddr -> CInt {- CSockLen???-} -> CString -> CSize -> CString
425469 -> CSize -> CInt -> IO CInt
470+ #else
471+ getNameInfo _ _ _ _ = unsupported " getNameInfo"
472+ {-# WARNING getNameInfo "operation will throw 'IOError' \"unsupported operation\"" #-}
473+ #endif
426474
427475-- | Pack a list of values into a bitmask. The possible mappings from
428476-- value to bit-to-set are given as the first argument. We assume
0 commit comments