module Network.TUNTAP where
import Foreign
import Foreign.C.String
import Data.Bits
import System.Posix.IOCtl
data Flag = TUN | TAP | NO_PI | MULTI_QUEUE
deriving (Eq)
data Ifreq = Ifreq { flags :: [Flag]
, name :: String}
sheet = [ (1, TUN)
, (2, TAP)
, (4096, NO_PI)
, (256, MULTI_QUEUE)
]
instance Storable Ifreq where
alignment _ = (8)
sizeOf _ = (40)
peek ptr = do
flags_ <- (\hsc_ptr -> peekByteOff hsc_ptr 16) ptr :: IO (Int16)
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
return (Ifreq flags name)
poke ptr (Ifreq flags name) = do
(\hsc_ptr -> pokeByteOff hsc_ptr 16) ptr
((foldr (\a b -> if elem (snd a) flags then b .|. (fst a) else b) 0 sheet) :: Int16)
withCStringLen (take maxLen name) $ uncurry (copyArray $ (\hsc_ptr -> hsc_ptr `plusPtr` 0) ptr)
where maxLen = 16
data TUNSETIFF = TUNSETIFF
instance IOControl TUNSETIFF Ifreq where
ioctlReq _ = 1074025674