{-# LINE 1 "src/System/Socket/Address/SockAddrUn.hsc" #-}
module System.Socket.Address.SockAddrUn
{-# LINE 2 "src/System/Socket/Address/SockAddrUn.hsc" #-}
  ( SockAddrUn (..)
  ) where

import Data.Word
import qualified Data.ByteString as BS

import Foreign.Ptr
import Foreign.Storable
import Foreign.Marshal.Utils

import System.Socket.Address
import System.Socket.Internal.FFI


{-# LINE 16 "src/System/Socket/Address/SockAddrUn.hsc" #-}

{-# LINE 17 "src/System/Socket/Address/SockAddrUn.hsc" #-}

{-# LINE 18 "src/System/Socket/Address/SockAddrUn.hsc" #-}

{-# LINE 19 "src/System/Socket/Address/SockAddrUn.hsc" #-}

{-# LINE 20 "src/System/Socket/Address/SockAddrUn.hsc" #-}

instance Address SockAddrUn where
  addressFamilyNumber _ = (1)
{-# LINE 23 "src/System/Socket/Address/SockAddrUn.hsc" #-}

data SockAddrUn
   = SockAddrUn
     { sunPath :: BS.ByteString
     } deriving (Eq, Ord, Show)

instance Storable SockAddrUn where
  sizeOf    _ = ((110))
{-# LINE 31 "src/System/Socket/Address/SockAddrUn.hsc" #-}
  alignment _ = (2)
{-# LINE 32 "src/System/Socket/Address/SockAddrUn.hsc" #-}
  peek ptr    = do
    path <- BS.packCString (sun_path ptr) :: IO BS.ByteString
    return (SockAddrUn path)
    where
      sun_path = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
{-# LINE 37 "src/System/Socket/Address/SockAddrUn.hsc" #-}
  poke ptr (SockAddrUn path) = do
    c_memset ptr 0 (110)
{-# LINE 39 "src/System/Socket/Address/SockAddrUn.hsc" #-}
    -- useAsCString null-terminates the CString
    BS.useAsCString truncatedPath $ \cs-> do
      copyBytes (sun_path ptr) cs (BS.length truncatedPath + 1)-- copyBytes dest from count
    where
      sun_path      = ((\hsc_ptr -> hsc_ptr `plusPtr` 2))
{-# LINE 44 "src/System/Socket/Address/SockAddrUn.hsc" #-}
      truncatedPath = BS.take ( sizeOf (undefined :: SockAddrUn)
                              - sizeOf (undefined :: Word16)
                              - 1 ) path