Win32-dhcp-server-0.3.2: src/System/Win32/DHCP/HOST_INFO.hs
{-# LANGUAGE RankNTypes #-}
module System.Win32.DHCP.HOST_INFO
( HOST_INFO (..)
, hostInfo
) where
import Data.Ip
import Import
import System.Win32.DHCP.DhcpStructure
-- typedef struct _DHCP_HOST_INFO {
-- DHCP_IP_ADDRESS IpAddress;
-- LPWSTR NetBiosName;
-- LPWSTR HostName;
-- } DHCP_HOST_INFO, *LPDHCP_HOST_INFO;
data HOST_INFO = HOST_INFO !Ip (Maybe String) (Maybe String)
hostInfo :: DhcpStructure HOST_INFO
hostInfo = DhcpStructure
{ peekDhcp = peekHostInfo
, freeDhcpChildren = freeHostInfoChildren
, withDhcp' = withHostInfo'
, sizeDhcp = 12
}
peekHostInfo :: Ptr HOST_INFO -> IO HOST_INFO
peekHostInfo ptr = do
pnetBiosName <- peek $ ppnetBiosName ptr
phostName <- peek $ pphostName ptr
HOST_INFO <$> peek (castPtr ptr) <*> peekMaybeTString pnetBiosName
<*> peekMaybeTString phostName
withHostInfo' :: HOST_INFO -> Ptr HOST_INFO -> IO r -> IO r
withHostInfo' (HOST_INFO ip netbiosname hostname) ptr f =
withMaybeTString netbiosname $ \pnetbiosname ->
withMaybeTString hostname $ \phostname -> do
poke (castPtr ptr) ip
pokeByteOff (castPtr ptr) 4 pnetbiosname
pokeByteOff (castPtr ptr) 8 phostname
f
freeHostInfoChildren :: (forall x. Ptr x -> IO ()) -> Ptr HOST_INFO -> IO ()
freeHostInfoChildren rpcfree phi = do
rpcfree `scrubbing_` ppnetBiosName phi
rpcfree `scrubbing_` pphostName phi
ppnetBiosName :: Ptr HOST_INFO -> Ptr LPWSTR
ppnetBiosName ptr = castPtr ptr `plusPtr` 4
pphostName :: Ptr HOST_INFO -> Ptr LPWSTR
pphostName ptr = castPtr ptr `plusPtr` 8