{-# LINE 1 "src/Network/TUNTAP.hsc" #-}
{-# LANGUAGE ForeignFunctionInterface #-}
{-# LINE 2 "src/Network/TUNTAP.hsc" #-}
module Network.TUNTAP where

import Foreign
import Foreign.C.String

import Data.Bits

import System.Posix.IOCtl


{-# LINE 12 "src/Network/TUNTAP.hsc" #-}

{-# LINE 13 "src/Network/TUNTAP.hsc" #-}

{-# LINE 14 "src/Network/TUNTAP.hsc" #-}

{-# LINE 15 "src/Network/TUNTAP.hsc" #-}

data Flag = TUN | TAP | NO_PI | MULTI_QUEUE
  deriving (Eq)

data Ifreq = Ifreq { flags :: [Flag]
                   , name :: String}

sheet = [ (1, TUN)
{-# LINE 23 "src/Network/TUNTAP.hsc" #-}
        , (2, TAP)
{-# LINE 24 "src/Network/TUNTAP.hsc" #-}
        , (4096, NO_PI)
{-# LINE 25 "src/Network/TUNTAP.hsc" #-}
        , (256, MULTI_QUEUE)
{-# LINE 26 "src/Network/TUNTAP.hsc" #-}
        ]

instance Storable Ifreq where
  alignment _ = (8)
{-# LINE 30 "src/Network/TUNTAP.hsc" #-}
  sizeOf _ = (40)
{-# LINE 31 "src/Network/TUNTAP.hsc" #-}
  peek ptr = do 
    flags_ <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO (Int16)
{-# LINE 33 "src/Network/TUNTAP.hsc" #-}
    let flags = foldr (\a b -> if ((fst a) .&. flags_) /= 0 then (snd a) : b else b) [] sheet 
    name <- peekCString $ (\hsc_ptr -> hsc_ptr `plusPtr` 0) ptr
{-# LINE 35 "src/Network/TUNTAP.hsc" #-}
    return (Ifreq flags name)
  poke ptr (Ifreq flags name) = do
    (\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr
{-# LINE 38 "src/Network/TUNTAP.hsc" #-}
      ((foldr (\a b -> if elem (snd a) flags then b .|. (fst a) else b) 0 sheet) :: Int16)
{-# LINE 39 "src/Network/TUNTAP.hsc" #-}
    withCStringLen (take maxLen name) $ uncurry (copyArray $ (\hsc_ptr -> hsc_ptr `plusPtr` 0) ptr)
{-# LINE 40 "src/Network/TUNTAP.hsc" #-}
    where maxLen = 16
{-# LINE 41 "src/Network/TUNTAP.hsc" #-}

--foreign import ccall "tunsetiff" tunsetiff :: CInt

data TUNSETIFF = TUNSETIFF

instance IOControl TUNSETIFF Ifreq where
  ioctlReq _ = 1074025674
{-# LINE 48 "src/Network/TUNTAP.hsc" #-}