[Pkg-haskell-commits] [SCM] haskell-testpack branch, master, updated. debian/1.0.2-1-4-gb0d6b36

John Goerzen jgoerzen at complete.org
Fri Apr 23 14:53:31 UTC 2010


The following commit has been merged in the master branch:
commit ee49c03108e5f24dd641a7b531de717784e6772e
Author: John Goerzen <jgoerzen at complete.org>
Date:   Thu Dec 23 02:30:28 2004 +0100

    Checkpointing passive support
    
    Keywords:
    
    
    (jgoerzen at complete.org--projects/missingh--head--0.7--patch-145)

diff --git a/ChangeLog b/ChangeLog
index e235209..f520c42 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,19 @@
 # arch-tag: automatic-ChangeLog--jgoerzen at complete.org--projects/missingh--head--0.7
 #
 
+2004-12-22 19:30:28 GMT	John Goerzen <jgoerzen at complete.org>	patch-145
+
+    Summary:
+      Checkpointing passive support
+    Revision:
+      missingh--head--0.7--patch-145
+
+
+    modified files:
+     ChangeLog libsrc/MissingH/Network/FTP/Server.hs
+     libsrc/MissingH/Network/SocketServer.hs
+
+
 2004-12-22 17:01:31 GMT	John Goerzen <jgoerzen at complete.org>	patch-144
 
     Summary:
diff --git a/libsrc/MissingH/Network/FTP/Server.hs b/libsrc/MissingH/Network/FTP/Server.hs
index bc93057..b852a9c 100644
--- a/libsrc/MissingH/Network/FTP/Server.hs
+++ b/libsrc/MissingH/Network/FTP/Server.hs
@@ -44,12 +44,14 @@ module MissingH.Network.FTP.Server(
                                   )
 where
 import MissingH.Network.FTP.ParserServer
+import MissingH.Network.FTP.ParserClient
 import Network.BSD
 import Network.Socket
 import qualified Network
 import System.IO
 import MissingH.Logging.Logger
 import MissingH.Network
+import MissingH.Network.SocketServer
 import MissingH.Str
 import MissingH.Printf
 import MissingH.IO.HVIO
@@ -67,8 +69,9 @@ data AuthState = NoAuth
               | Authenticated String
                 deriving (Eq, Show)
 data DataChan = NoChannel
-              | PassiveMode Socket SockAddr
+              | PassiveMode SocketServer
               | PortMode SockAddr
+              | ActivePort Socket
 data FTPState = FTPState
               { auth :: IORef AuthState,
                 datatype :: IORef DataType,
@@ -157,6 +160,7 @@ commands =
     ,("PWD",  (forceLogin cmd_pwd,   help_pwd))
     ,("MODE", (forceLogin cmd_mode,  help_mode))
     ,("STRU", (forceLogin cmd_stru,  help_stru))
+    ,("PASV", (forceLogin cmd_pasv,  help_pasv))
     ]
 
 commandLoop :: FTPServer -> IO ()
@@ -262,6 +266,41 @@ cmd_type h@(FTPServer _ _ state) args =
          "AT" -> changetype ASCII
          _ -> do sendReply h 504 $ "Type \"" ++ args ++ "\" not supported."
                  return True
+
+closeconn :: FTPServer -> IO ()
+closeconn h@(FTPServer _ _ state) =
+    do dc <- readIORef (datachan state)
+       case dc of 
+           NoChannel -> return ()
+           PassiveMode ss -> closeSocketServer ss
+           PortMode _ -> return ()
+           ActivePort sock -> sClose sock
+       writeIORef (datachan state) NoChannel
+
+help_pasv = ("Initiate a passive-mode connection", "")
+cmd_pasv :: CommandHandler
+cmd_pasv h@(FTPServer _ _ state) args =
+    do closeconn h                      -- Close any existing connection
+       addr <- case (local state) of 
+                    (SockAddrInet _ ha) -> return ha
+                    _ -> fail "Require IPv4 sockets"
+       let ssopts = InetServerOptions 
+                    { listenQueueSize = 1,
+                      portNumber = aNY_PORT,
+                      interface = addr,
+                      reuse = False,
+                      family = AF_INET,
+                      sockType = Stream,
+                      protoStr = "tcp"
+                    }
+       ss <- setupSocketServer ssopts
+       sa <- getSocketName (sockSS ss)
+       portstring <- toPortString sa
+       sendReply h 227 $ "Entering passive mode (" ++ portstring ++ ")"
+       writeIORef (datachan state) (PassiveMode ss)
+       return True
+                 
+                                        
        
 help_noop = ("Do nothing", "")
 cmd_noop :: CommandHandler
diff --git a/libsrc/MissingH/Network/SocketServer.hs b/libsrc/MissingH/Network/SocketServer.hs
index 0776f1d..827f639 100644
--- a/libsrc/MissingH/Network/SocketServer.hs
+++ b/libsrc/MissingH/Network/SocketServer.hs
@@ -45,6 +45,7 @@ module MissingH.Network.SocketServer(-- * Generic Options and Types
                                      setupSocketServer,
                                      handleOne,
                                      serveForever,
+                                     closeSocketServer,
                                      -- * Combinators
                                      loggingHandler,
                                      threadedHandler,
@@ -60,7 +61,7 @@ import qualified MissingH.Logging.Logger
 
 {- | Options for your server. -}
 data InetServerOptions  = InetServerOptions {listenQueueSize :: Int,
-                                             portNumber :: Int,
+                                             portNumber :: PortNumber,
                                              interface :: HostAddress,
                                              reuse :: Bool,
                                              family :: Family,
@@ -83,7 +84,7 @@ type HandlerT = Socket -> SockAddr -> SockAddr -> IO ()
 simpleTCPOptions :: Int                -- ^ Port Number
                  -> InetServerOptions
 simpleTCPOptions p = InetServerOptions {listenQueueSize = 5,
-                                        portNumber = p,
+                                        portNumber = (fromIntegral p),
                                         interface = iNADDR_ANY,
                                         reuse = False,
                                         family = AF_INET,
@@ -104,10 +105,16 @@ setupSocketServer opts =
        setSocketOption s ReuseAddr (case (reuse opts) of
                                     True -> 1
                                     False -> 0)
-       bindSocket s (SockAddrInet (fromIntegral (portNumber opts)) 
+       bindSocket s (SockAddrInet (portNumber opts)
                      (interface opts))
        listen s (listenQueueSize opts)
        return $ SocketServer {optionsSS = opts, sockSS = s}
+
+{- | Close the socket server.  Does not terminate active
+handlers, if any. -}
+closeSocketServer :: SocketServer -> IO ()
+closeSocketServer ss =
+    sClose (sockSS ss)
        
 {- | Handle one incoming request from the given 'SocketServer'. -}
 handleOne :: SocketServer -> HandlerT -> IO ()

-- 
haskell-testpack



More information about the Pkg-haskell-commits mailing list