On Feb 8, 2008 10:57 AM, Galchin Vasili <[EMAIL PROTECTED]> wrote:
> basically I am trying to implement ioctl for the Posix library .. so a
> possible signtaure would be:
>
> fdIoctl :: Fd -> Int -> Ptr Word 8 -> IO( Ptr Word8) ????

Ah, ok. You could cover many of the ioctls (the ones which only take a
single primitive) by using the Storable class and the types CInt etc.
Define the FFI call to ioctl with a type of CInt -> Int -> Ptr () ->
IO CInt and then

ioctlCInt :: CInt -> CInt -> CInt -> IO CInt
ioctlCInt fd call arg = do
  allocaBytes $ \ptr -> do
    poke ptr arg
    result <- ioctl fd call (cast ptr)
    when (result < 0) $ fail "ioctl error"
    peek ptr

(untested, might work ;)

... and likewise for the other C types. However, for those ioctls which take a
complex structure (e.g. many of the networking ones), you'll need to marshal
yourself:

data SomeIOCtlStruct = CInt CInt CInt

ioctlSomeIOCtlStruct :: CInt -> CInt -> SomeIOCtlStruct -> IO ()
ioctlSomeIOCtlStruct = do
  ...  (see the above linked to pointers to hsc2hs and c2hs about how to write
  this function)



AGL

--
Adam Langley                                      [EMAIL PROTECTED]
http://www.imperialviolet.org                       650-283-9641
_______________________________________________
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe

Reply via email to