File.hs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. -- {-# LANGUAGE OverloadedStrings #-}
  2. -- {-# LANGUAGE ExistentialQuantification #-}
  3. -- {-# LANGUAGE ForeignFunctionInterface #-}
  4. -- {-# LANGUAGE InterruptibleFFI #-}
  5. -- {-# LANGUAGE EmptyDataDecls #-}
  6. module System.IO.Uniform.File (
  7. FileIO,
  8. openFile
  9. ) where
  10. import System.IO.Uniform
  11. import System.IO.Uniform.External
  12. import Foreign
  13. --import Foreign.C.Types
  14. import Foreign.C.String
  15. import Foreign.C.Error
  16. --import qualified Data.IP as IP
  17. --import Data.ByteString (ByteString)
  18. import qualified Data.ByteString as BS
  19. --import qualified Data.ByteString.Lazy as LBS
  20. --import qualified Data.ByteString.Builder as BSBuild
  21. --import qualified Data.List as L
  22. --import Control.Exception
  23. import Control.Applicative ((<$>))
  24. --import Data.Monoid (mappend)
  25. --import qualified Network.Socket as Soc
  26. --import System.IO.Error
  27. --import Control.Concurrent.MVar
  28. --import Data.Default.Class
  29. import System.Posix.Types (Fd(..))
  30. -- | UniformIO type for file IO.
  31. instance UniformIO FileIO where
  32. uRead s n = do
  33. allocaArray n (
  34. \b -> do
  35. count <- c_recv (fd s) b $ fromIntegral n
  36. if count < 0
  37. then throwErrno "could not read"
  38. else BS.packCStringLen (b, fromIntegral count)
  39. )
  40. uPut s t = do
  41. BS.useAsCStringLen t (
  42. \(str, n) -> do
  43. count <- c_send (fd s) str $ fromIntegral n
  44. if count < 0
  45. then throwErrno "could not write"
  46. else return ()
  47. )
  48. uClose s = do
  49. f <- Fd <$> c_prepareToClose (fd s)
  50. closeFd f
  51. startTls _ f = return f
  52. isSecure _ = True
  53. -- | Open a file for bidirectional IO.
  54. openFile :: String -> IO FileIO
  55. openFile fileName = do
  56. r <- withCString fileName (
  57. \f -> fmap FileIO $ c_createFile f
  58. )
  59. if fd r == nullPtr
  60. then throwErrno "could not open file"
  61. else return r