From: sof Date: Mon, 20 Jul 1998 09:43:38 +0000 (+0000) Subject: [project @ 1998-07-20 09:43:38 by sof] X-Git-Tag: Approx_2487_patches~512 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=a69724d81e0290a898b9992ae5a8a11d01982fa4;p=ghc-hetmet.git [project @ 1998-07-20 09:43:38 by sof] In a moment of boredom, converted to use do notation --- diff --git a/ghc/lib/misc/Socket.lhs b/ghc/lib/misc/Socket.lhs index 34e99b6..94b97d8 100644 --- a/ghc/lib/misc/Socket.lhs +++ b/ghc/lib/misc/Socket.lhs @@ -55,7 +55,7 @@ signalling that the current hostname applies. \begin{code} data PortID = Service String -- Service Name eg "ftp" - | PortNumber Int -- User defined Port Number + | PortNumber PortNumber -- User defined Port Number #ifndef cygwin32_TARGET_OS | UnixSocket String -- Unix family socket in file system #endif @@ -73,25 +73,25 @@ connectTo :: Hostname -- Hostname -> PortID -- Port Identifier -> IO Handle -- Connected Socket -connectTo hostname (Service serv) = - getProtocolNumber "tcp" >>= \ proto -> - socket AF_INET Stream proto >>= \ sock -> - getServicePortNumber serv >>= \ port -> - getHostByName hostname >>= \ (HostEntry _ _ _ haddrs) -> - connect sock (SockAddrInet port (head haddrs)) >> - socketToHandle sock ReadWriteMode >>= \ h -> - return h -connectTo hostname (PortNumber port) = - getProtocolNumber "tcp" >>= \ proto -> - socket AF_INET Stream proto >>= \ sock -> - getHostByName hostname >>= \ (HostEntry _ _ _ haddrs) -> - connect sock (SockAddrInet port (head haddrs)) >> +connectTo hostname (Service serv) = do + proto <- getProtocolNumber "tcp" + sock <- socket AF_INET Stream proto + port <- getServicePortNumber serv + he <- getHostByName hostname + connect sock (SockAddrInet port (hostAddress he)) + socketToHandle sock ReadWriteMode + +connectTo hostname (PortNumber port) = do + proto <- getProtocolNumber "tcp" + sock <- socket AF_INET Stream proto + he <- getHostByName hostname + connect sock (SockAddrInet port (hostAddress he)) socketToHandle sock ReadWriteMode #ifndef cygwin32_TARGET_OS -connectTo _ (UnixSocket path) = - socket AF_UNIX Datagram 0 >>= \ sock -> - connect sock (SockAddrUnix path) >> +connectTo _ (UnixSocket path) = do + sock <- socket AF_UNIX Datagram 0 + connect sock (SockAddrUnix path) socketToHandle sock ReadWriteMode #endif @@ -104,23 +104,25 @@ socket which has been bound to the specified port. listenOn :: PortID -- Port Identifier -> IO Socket -- Connected Socket -listenOn (Service serv) = - getProtocolNumber "tcp" >>= \ proto -> - socket AF_INET Stream proto >>= \ sock -> - getServicePortNumber serv >>= \ port -> - bindSocket sock (SockAddrInet port iNADDR_ANY) >> - listen sock maxListenQueue >> +listenOn (Service serv) = do + proto <- getProtocolNumber "tcp" + sock <- socket AF_INET Stream proto + port <- getServicePortNumber serv + bindSocket sock (SockAddrInet port iNADDR_ANY) + listen sock maxListenQueue return sock -listenOn (PortNumber port) = - getProtocolNumber "tcp" >>= \ proto -> - socket AF_INET Stream proto >>= \ sock -> - bindSocket sock (SockAddrInet port iNADDR_ANY) >> - listen sock maxListenQueue >> + +listenOn (PortNumber port) = do + proto <- getProtocolNumber "tcp" + sock <- socket AF_INET Stream proto + bindSocket sock (SockAddrInet port iNADDR_ANY) + listen sock maxListenQueue return sock + #ifndef cygwin32_TARGET_OS -listenOn (UnixSocket path) = - socket AF_UNIX Datagram 0 >>= \ sock -> - bindSocket sock (SockAddrUnix path) >> +listenOn (UnixSocket path) = do + sock <- socket AF_UNIX Datagram 0 + bindSocket sock (SockAddrUnix path) return sock #endif \end{code} @@ -129,12 +131,12 @@ listenOn (UnixSocket path) = accept :: Socket -- Listening Socket -> IO (Handle, -- StdIO Handle for read/write HostName) -- HostName of Peer socket - -accept sock = - SocketPrim.accept sock >>= \ (sock', (SockAddrInet _ haddr)) -> - getHostByAddr AF_INET haddr >>= \ (HostEntry peer _ _ _) -> - socketToHandle sock ReadWriteMode >>= \ handle -> +accept sock = do + ~(sock', (SockAddrInet _ haddr)) <- SocketPrim.accept sock + (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr + handle <- socketToHandle sock ReadWriteMode return (handle, peer) + \end{code} Send and recived data from/to the given host and port number. These @@ -148,45 +150,48 @@ sendTo :: Hostname -- Hostname -> PortID -- Port Number -> String -- Message to send -> IO () -sendTo h p msg = - connectTo h p >>= \ s -> - hPutStr s msg >> - hClose s +sendTo h p msg = do + s <- connectTo h p + hPutStr s msg + hClose s recvFrom :: Hostname -- Hostname -> PortID -- Port Number -> IO String -- Received Data -recvFrom host port = - listenOn port >>= \ s -> +recvFrom host port = do + s <- listenOn port let - waiting = - SocketPrim.accept s >>= \ (s', (SockAddrInet _ haddr)) -> - getHostByAddr AF_INET haddr >>= \ (HostEntry peer _ _ _) -> - if peer /= host then - sClose s' >> - waiting - else - readSocketAll s' >>= \ msg -> - sClose s' >> - return msg - in - waiting >>= \ message -> - sClose s >> + waiting = do + ~(s', SockAddrInet _ haddr) <- SocketPrim.accept s + (HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr + if peer /= host + then do + sClose s' + waiting + else do + msg <- readSocketAll s' + sClose s' + return msg + + message <- waiting + sClose s return message + \end{code} Access function returning the port type/id of socket. \begin{code} socketPort :: Socket -> IO PortID -socketPort s = - getSocketName s >>= \ sockaddr -> - return (case sockaddr of - SockAddrInet port _ -> - (PortNumber port) +socketPort s = do + sockaddr <- getSocketName s + return (portID sockaddr) + where + portID sa = + case sa of + SockAddrInet port _ -> PortNumber port #ifndef cygwin32_TARGET_OS - SockAddrUnix path -> - (UnixSocket path) + SockAddrUnix path -> UnixSocket path #endif - ) + \end{code}