Compatibility with ghc-7.6
[hsv4l2:v4l2.git] / Graphics / V4L2 / IOCtl.hs
1 {-# LANGUAGE ForeignFunctionInterface #-}
2 module Graphics.V4L2.IOCtl
3   ( ioctl
4   , ioctl_
5   , ioctl'
6   , zero
7   ) where
8
9 import Foreign (Ptr, Storable, alloca, castPtr, peek, sizeOf, with)
10 import Foreign.C (CInt(..), CSize(..), throwErrnoIfMinus1_)
11 import System.Posix.IOCtl (IOControl(ioctlReq))
12 import System.IO.Unsafe (unsafePerformIO)
13
14 import Bindings.LibV4L2 (c'v4l2_ioctl)
15
16 import Graphics.V4L2.Device (Device)
17
18 c_ioctl' :: IOControl req d => Device -> req -> Ptr d -> IO ()
19 c_ioctl' f req p =
20     throwErrnoIfMinus1_ "ioctl" $
21         c'v4l2_ioctl (fromIntegral f) (fromIntegral $ ioctlReq req) (castPtr p)
22
23 -- | Calls a ioctl reading the structure after the call
24 ioctl :: IOControl req d
25       => Device -- ^ The file descriptor 
26       -> req -- ^ The request
27       -> d -- ^ The data
28       -> IO d -- ^ The data after the call
29 ioctl f req d = with d $ \p -> c_ioctl' f req p >> peek p
30
31 -- | Call a ioctl ignoring the result
32 ioctl_ :: IOControl req d
33        => Device -- ^ The file descriptor
34        -> req -- ^ The request
35        -> d -- ^ The data
36        -> IO ()
37 ioctl_ f req d = with d $ \p -> c_ioctl' f req p
38
39 -- | Call a ioctl with uninitialized data
40 ioctl' :: IOControl req d
41        => Device -- ^ The file descriptor
42        -> req -- ^ The request
43        -> IO d -- ^ The data
44 ioctl' f req = alloca $ \p -> c_ioctl' f req p >> peek p
45
46
47 zero :: Storable a => IO a
48 zero = alloca $ \p -> c'memset p 0 (fromIntegral $ sizeOf (undefined `asTypeOf` unsafePerformIO (peek p))) >> peek p
49
50 foreign import ccall "string.h memset" c'memset :: Ptr a -> CInt -> CSize -> IO (Ptr a)