1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 |
- module System.IO.Uniform.File (
- FileIO,
- openFile
- ) where
- import System.IO.Uniform
- import System.IO.Uniform.External
- import Foreign
- --import Foreign.C.Types
- import Foreign.C.String
- import Foreign.C.Error
- --import qualified Data.IP as IP
- --import Data.ByteString (ByteString)
- import qualified Data.ByteString as BS
- --import qualified Data.ByteString.Lazy as LBS
- --import qualified Data.ByteString.Builder as BSBuild
- --import qualified Data.List as L
- --import Control.Exception
- import Control.Applicative ((<$>))
- --import Data.Monoid (mappend)
- --import qualified Network.Socket as Soc
- --import System.IO.Error
- --import Control.Concurrent.MVar
- --import Data.Default.Class
- import System.Posix.Types (Fd(..))
- -- | UniformIO type for file IO.
- instance UniformIO FileIO where
- uRead s n = do
- allocaArray n (
- \b -> do
- count <- c_recv (fd s) b $ fromIntegral n
- if count < 0
- then throwErrno "could not read"
- else BS.packCStringLen (b, fromIntegral count)
- )
- uPut s t = do
- BS.useAsCStringLen t (
- \(str, n) -> do
- count <- c_send (fd s) str $ fromIntegral n
- if count < 0
- then throwErrno "could not write"
- else return ()
- )
- uClose s = do
- f <- Fd <$> c_prepareToClose (fd s)
- closeFd f
- startTls _ f = return f
- isSecure _ = True
-
-
- -- | Open a file for bidirectional IO.
- openFile :: String -> IO FileIO
- openFile fileName = do
- r <- withCString fileName (
- \f -> fmap FileIO $ c_createFile f
- )
- if fd r == nullPtr
- then throwErrno "could not open file"
- else return r
|