File.hs 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. -- Not implemented yet.
  52. startTls _ _ = return . TlsIO $ nullPtr
  53. isSecure _ = False
  54. -- | Open a file for bidirectional IO.
  55. openFile :: String -> IO FileIO
  56. openFile fileName = do
  57. r <- withCString fileName (
  58. \f -> fmap FileIO $ c_createFile f
  59. )
  60. if fd r == nullPtr
  61. then throwErrno "could not open file"
  62. else return r