Hal Daume wrote:

> I have a C function that, for simplicity, has its definition as
> something like:
> 
> > void myCFun(FILE *fd);
> 
> I have a Handle I've opened in Haskell using openFileEx and would like
> to pass this to the function.

GHC's Handle type is based upon a descriptor rather than a FILE*, so
you will have to manufacture the FILE*, e.g. with fdopen().

> I've tried a bunch of things, the most
> recent being:
> 
> > foreign import ccall "myHFile.h myCFun" c__myCFun :: Ptr CInt -> IO ()
> > myCFun :: Handle -> IO ()
> > myCFun (FileHandle handleMV) = do
> >   h__ <- readMVar handleMV
> >   ptr <- malloc
> >   poke ptr (toCInt $ haFD h__)
> >   c__initVars ptr
> 
> i've also tried it with just CInt -> IO (), without the ptr, but that
> doesn't work either.
> 
> Surely someone has done this at some point...or is it even possible
> (please say it is)...

For Unix, use Posix.handleToFd to get a descriptor, then fdopen() (in
C, or write a foreign import) to get a FILE*.

Also, don't forget about synchronisation issues between the C and
Haskell interfaces to the descriptor (e.g. buffering).

-- 
Glynn Clements <[EMAIL PROTECTED]>
_______________________________________________
Glasgow-haskell-users mailing list
[EMAIL PROTECTED]
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users

Reply via email to