module System.Win32.DHCP.HOST_INFO
( HOST_INFO (..)
, hostInfo
) where
import Control.Applicative
import Foreign
import System.Win32.Types
import Data.Ip
import System.Win32.DHCP.DhcpStructure
import Utils
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