|  | @@ -11,33 +11,17 @@
 | 
	
		
			
				|  |  |  module System.IO.Uniform (
 | 
	
		
			
				|  |  |    UniformIO(..),
 | 
	
		
			
				|  |  |    TlsSettings(..),
 | 
	
		
			
				|  |  | -  SomeIO(..), TlsIO,
 | 
	
		
			
				|  |  | +  SomeIO(..),
 | 
	
		
			
				|  |  |    mapOverInput
 | 
	
		
			
				|  |  |    ) where
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -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(..))
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  -- |
 | 
	
		
			
				|  |  |  -- Typeclass for uniform IO targets.
 | 
	
		
			
				|  |  |  class UniformIO a where
 | 
	
	
		
			
				|  | @@ -61,7 +45,7 @@ class UniformIO a where
 | 
	
		
			
				|  |  |    -- | startTLS fd
 | 
	
		
			
				|  |  |    --
 | 
	
		
			
				|  |  |    --  Starts a TLS connection over the IO target.
 | 
	
		
			
				|  |  | -  startTls :: TlsSettings -> a -> IO TlsIO
 | 
	
		
			
				|  |  | +  startTls :: TlsSettings -> a -> IO a
 | 
	
		
			
				|  |  |    -- | isSecure fd
 | 
	
		
			
				|  |  |    --
 | 
	
		
			
				|  |  |    --  Indicates whether the data written or read from fd is secure at transport.
 | 
	
	
		
			
				|  | @@ -74,7 +58,7 @@ instance UniformIO SomeIO where
 | 
	
		
			
				|  |  |    uRead (SomeIO s) n = uRead s n
 | 
	
		
			
				|  |  |    uPut (SomeIO s) t  = uPut s t
 | 
	
		
			
				|  |  |    uClose (SomeIO s) = uClose s
 | 
	
		
			
				|  |  | -  startTls set (SomeIO s) = startTls set s
 | 
	
		
			
				|  |  | +  startTls set (SomeIO s) = SomeIO <$> startTls set s
 | 
	
		
			
				|  |  |    isSecure (SomeIO s) = isSecure s
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  -- | Settings for starttls functions.
 | 
	
	
		
			
				|  | @@ -83,33 +67,6 @@ data TlsSettings = TlsSettings {tlsPrivateKeyFile :: String, tlsCertificateChain
 | 
	
		
			
				|  |  |  instance Default TlsSettings where
 | 
	
		
			
				|  |  |    def = TlsSettings "" "" ""
 | 
	
		
			
				|  |  |    
 | 
	
		
			
				|  |  | --- | UniformIO wrapper that applies TLS to communication on IO target.
 | 
	
		
			
				|  |  | --- This type is constructed by calling startTls on other targets.
 | 
	
		
			
				|  |  | -instance UniformIO TlsIO where
 | 
	
		
			
				|  |  | -  uRead s n = do
 | 
	
		
			
				|  |  | -    allocaArray n (
 | 
	
		
			
				|  |  | -      \b -> do
 | 
	
		
			
				|  |  | -        count <- c_recvTls (tls 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_sendTls (tls s) str $ fromIntegral n
 | 
	
		
			
				|  |  | -        if count < 0
 | 
	
		
			
				|  |  | -          then throwErrno "could not write"
 | 
	
		
			
				|  |  | -          else return ()
 | 
	
		
			
				|  |  | -      )
 | 
	
		
			
				|  |  | -  uClose s = do
 | 
	
		
			
				|  |  | -    d <- c_closeTls (tls s)
 | 
	
		
			
				|  |  | -    f <- Fd <$> c_prepareToClose d
 | 
	
		
			
				|  |  | -    closeFd f
 | 
	
		
			
				|  |  | -  startTls _ s = return s
 | 
	
		
			
				|  |  | -  isSecure _ = True
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  -- | mapOverInput io block_size f initial
 | 
	
		
			
				|  |  |  --   Reads io untill the end of file, evaluating a(i) <- f a(i-1) read_data
 | 
	
		
			
				|  |  |  --   where a(0) = initial and the last value after io reaches EOF is returned.
 |