work around getAddrInfo segfault on Android

For an unknown reason, getAddrInfo currently is segfaulting. Note that
in February, I had used warpDebug, which uses getAddrInfo, and it worked.
Don't know if my toolchain has changed and broke it, or it's due to having
a different Android device now. Anyway, work around it by hardcoding the
address to use.
This commit is contained in:
Joey Hess 2013-05-02 16:48:14 -04:00
parent ce47f4cb20
commit abe8464026

View file

@ -72,7 +72,7 @@ webAppSettings = defaultSettings
} }
{- Binds to a local socket, or if specified, to a socket on the specified {- Binds to a local socket, or if specified, to a socket on the specified
- hostname or address. Selets any free port, unless the hostname ends with - hostname or address. Selects any free port, unless the hostname ends with
- ":port" - ":port"
- -
- Prefers to bind to the ipv4 address rather than the ipv6 address - Prefers to bind to the ipv4 address rather than the ipv6 address
@ -80,6 +80,18 @@ webAppSettings = defaultSettings
-} -}
getSocket :: Maybe HostName -> IO Socket getSocket :: Maybe HostName -> IO Socket
getSocket h = do getSocket h = do
#ifdef __ANDROID__
-- getAddrInfo currently segfaults on Android.
-- The HostName is ignored by this code.
when (isJust h) $
error "getSocket with HostName not supported on Android"
addr <- inet_addr "127.0.0.1"
sock <- socket AF_INET Stream defaultProtocol
preparesocket sock
bindSocket sock (SockAddrInet aNY_PORT addr)
use sock
where
#else
addrs <- getAddrInfo (Just hints) (Just hostname) port addrs <- getAddrInfo (Just hints) (Just hostname) port
case (partition (\a -> addrFamily a == AF_INET) addrs) of case (partition (\a -> addrFamily a == AF_INET) addrs) of
(v4addr:_, _) -> go v4addr (v4addr:_, _) -> go v4addr
@ -94,12 +106,16 @@ getSocket h = do
go' :: Int -> AddrInfo -> IO Socket go' :: Int -> AddrInfo -> IO Socket
go' 0 _ = error "unable to bind to local socket" go' 0 _ = error "unable to bind to local socket"
go' n addr = do go' n addr = do
r <- tryIO $ bracketOnError (open addr) sClose (use addr) r <- tryIO $ bracketOnError (open addr) sClose (useaddr addr)
either (const $ go' (pred n) addr) return r either (const $ go' (pred n) addr) return r
open addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr) open addr = socket (addrFamily addr) (addrSocketType addr) (addrProtocol addr)
use addr sock = do useaddr addr sock = do
setSocketOption sock ReuseAddr 1 preparesocket sock
bindSocket sock (addrAddress addr) bindSocket sock (addrAddress addr)
use sock
#endif
preparesocket sock = setSocketOption sock ReuseAddr 1
use sock = do
listen sock maxListenQueue listen sock maxListenQueue
return sock return sock