module System.Socket.Address.SockAddrIn
( SockAddrIn (..)
) where
import Data.Word
import Data.List
import qualified Data.ByteString as BS
import qualified Data.ByteString.Unsafe as BS
import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Utils
import System.Socket.Address
import System.Socket.Internal.FFI
instance Address SockAddrIn where
addressFamilyNumber _ = (2)
data SockAddrIn
= SockAddrIn
{ sinPort :: Word16
, sinAddr :: BS.ByteString
} deriving (Eq, Ord)
instance Show SockAddrIn where
show (SockAddrIn p a) =
"\"" ++ (concat $ intersperse "." $ map show $ BS.unpack a) ++ ":" ++ show p ++ "\""
instance Storable SockAddrIn where
sizeOf _ = ((16))
alignment _ = (4)
peek ptr = do
ph <- peekByteOff (sin_port ptr) 0 :: IO Word8
pl <- peekByteOff (sin_port ptr) 1 :: IO Word8
a <- BS.packCStringLen (sin_addr ptr, 4) :: IO BS.ByteString
return (SockAddrIn (fromIntegral ph * 256 + fromIntegral pl) a)
where
sin_port = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
sin_addr = ((\hsc_ptr -> hsc_ptr `plusPtr` 0)) . ((\hsc_ptr -> hsc_ptr `plusPtr` 4))
poke ptr (SockAddrIn p a) = do
c_memset ptr 0 (16)
poke (sin_family ptr) ((2) :: Word16)
pokeByteOff (sin_port ptr) 0 (fromIntegral $ rem (quot p 256) 256 :: Word8)
pokeByteOff (sin_port ptr) 1 (fromIntegral $ rem p 256 :: Word8)
BS.unsafeUseAsCString a $ \a'-> do
copyBytes (sin_addr ptr) a' (min 4 $ BS.length a)
where
sin_family = ((\hsc_ptr -> hsc_ptr `plusPtr` 0))
sin_port = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
sin_addr = ((\hsc_ptr -> hsc_ptr `plusPtr` 0)) . ((\hsc_ptr -> hsc_ptr `plusPtr` 4))