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
