Std.hs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. -- {-# LANGUAGE OverloadedStrings #-}
  2. -- {-# LANGUAGE ExistentialQuantification #-}
  3. -- {-# LANGUAGE ForeignFunctionInterface #-}
  4. -- {-# LANGUAGE InterruptibleFFI #-}
  5. -- {-# LANGUAGE EmptyDataDecls #-}
  6. module System.IO.Uniform.Std (
  7. StdIO
  8. ) where
  9. import System.IO.Uniform
  10. import System.IO.Uniform.External
  11. import Foreign
  12. --import Foreign.C.Types
  13. --import Foreign.C.String
  14. import Foreign.C.Error
  15. --import qualified Data.IP as IP
  16. --import Data.ByteString (ByteString)
  17. import qualified Data.ByteString as BS
  18. --import qualified Data.ByteString.Lazy as LBS
  19. --import qualified Data.ByteString.Builder as BSBuild
  20. --import qualified Data.List as L
  21. --import Control.Exception
  22. --import Control.Applicative ((<$>))
  23. --import Data.Monoid (mappend)
  24. --import qualified Network.Socket as Soc
  25. --import System.IO.Error
  26. --import Control.Concurrent.MVar
  27. --import Data.Default.Class
  28. --import System.Posix.Types (Fd(..))
  29. -- | UniformIO that reads from stdin and writes to stdout.
  30. instance UniformIO StdIO where
  31. uRead _ n = do
  32. allocaArray n (
  33. \b -> do
  34. count <- c_recvStd b (fromIntegral n)
  35. if count < 0
  36. then throwErrno "could not read"
  37. else BS.packCStringLen (b, fromIntegral count)
  38. )
  39. uPut _ t = do
  40. BS.useAsCStringLen t (
  41. \(str, n) -> do
  42. count <- c_sendStd str $ fromIntegral n
  43. if count < 0
  44. then throwErrno "could not write"
  45. else return ()
  46. )
  47. uClose _ = return ()
  48. startTls _ a = return a
  49. isSecure _ = True