(Darren Moffat supplied the initial version of this library.)
The BSD module provides functions to get at system-database info; pretty straightforward if you're into this sort of thing:
type HostName = String getHostName :: IO Hostname data ServiceEntry = ServiceEntry { serviceName :: ServiceName, -- Official Name serviceAliases :: [ServiceName], -- aliases servicePort :: PortNumber, -- Port Number (network byte order) serviceProtocol :: ProtocolName -- Protocol } type ServiceName = String getServiceByName :: ServiceName -> ProtocolName -> IO ServiceEntry getServiceByPort :: PortNumber -> ProtocolName -> IO ServiceEntry getServicePortNumber :: ServiceName -> IO PortNumber -- not available con Cygwin/Mingw getServiceEntry :: IO ServiceEntry setServiceEntry :: Bool -> IO () endServiceEntry :: IO () getServiceEntries :: Bool -> IO [ServiceEntry] type ProtocolName = String type ProtocolNumber = Int -- from SocketPrim data ProtocolEntry = ProtocolEntry { protoName :: ProtocolName, -- Official Name protoAliases :: [ProtocolName], -- aliases protoNumber :: ProtocolNumber -- Protocol Number } getProtocolByName :: ProtocolName -> IO ProtocolEntry getProtocolByNumber :: ProtocolNumber -> IO ProtcolEntry getProtocolNumber :: ProtocolName -> ProtocolNumber -- not available con Cygwin/Mingw setProtocolEntry :: Bool -> IO () getProtocolEntry :: IO ProtocolEntry endProtocolEntry :: IO () getProtocolEntries :: Bool -> IO [ProtocolEntry] -- from SocketPrim newtype PortNumber = -- instance of Eq, Ord, Enum, Num, Real, Integral, Show PNum Int -- 16-bit value stored in network byte order. mkPortNumber :: Int -> PortNumber data HostEntry = HostEntry { hostName :: HostName, -- Official Name hostAliases :: [HostName], -- aliases hostFamily :: Family, -- Host Type (currently AF_INET) hostAddresses :: [HostAddress] -- Set of Network Addresses (in network byte order) } getHostByName :: HostName -> IO HostEntry getHostByAddr :: HostAddress -> Family -> IO HostEntry hostAddress :: HostEntry -> HostAddress -- not available con Cygwin/Mingw setHostEntry :: Bool -> IO () getHostEntry :: IO HostEntry endHostEntry :: IO () getHostEntries :: Bool -> IO [HostEntry] type NetworkAddr = Word -- host byte order type NetworkName = String data NetworkEntry = NetworkEntry { networkName :: NetworkName, -- official name networkAliases :: [NetworkName], -- aliases networkFamily :: Family, -- type networkAddress :: NetworkAddr } -- not available con Cygwin/Mingw getNetworkByName :: NetworkName -> IO NetworkEntry getNetworkByAddr :: NetworkAddr -> Family -> IO NetworkEntry setNetworkEntry :: Bool -> IO () getNetworkEntry :: IO NetworkEntry endNetworkEntry :: IO () getNetworkEntries :: Bool -> IO [NetworkEntry] -- if available symlink :: String -> String -> IO () readlink :: String -> IO String |