File.hs 1.6 KB

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