Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
GHC
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Requirements
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Locked files
Build
Pipelines
Jobs
Pipeline schedules
Test cases
Artifacts
Deploy
Releases
Package Registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Code review analytics
Issue analytics
Insights
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
alexbiehl-gc
GHC
Commits
a69724d8
Commit
a69724d8
authored
26 years ago
by
sof
Browse files
Options
Downloads
Patches
Plain Diff
[project @ 1998-07-20 09:43:38 by sof]
In a moment of boredom, converted to use do notation
parent
c818b1b8
Loading
Loading
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
ghc/lib/misc/Socket.lhs
+68
-63
68 additions, 63 deletions
ghc/lib/misc/Socket.lhs
with
68 additions
and
63 deletions
ghc/lib/misc/Socket.lhs
+
68
−
63
View file @
a69724d8
...
@@ -55,7 +55,7 @@ signalling that the current hostname applies.
...
@@ -55,7 +55,7 @@ signalling that the current hostname applies.
\begin{code}
\begin{code}
data PortID =
data PortID =
Service String -- Service Name eg "ftp"
Service String -- Service Name eg "ftp"
| PortNumber
Int
-- User defined Port Number
| PortNumber
PortNumber
-- User defined Port Number
#ifndef cygwin32_TARGET_OS
#ifndef cygwin32_TARGET_OS
| UnixSocket String -- Unix family socket in file system
| UnixSocket String -- Unix family socket in file system
#endif
#endif
...
@@ -73,25 +73,25 @@ connectTo :: Hostname -- Hostname
...
@@ -73,25 +73,25 @@ connectTo :: Hostname -- Hostname
-> PortID -- Port Identifier
-> PortID -- Port Identifier
-> IO Handle -- Connected Socket
-> IO Handle -- Connected Socket
connectTo hostname (Service serv) =
connectTo hostname (Service serv) =
do
getProtocolNumber "tcp"
>>= \ proto ->
proto <-
getProtocolNumber "tcp"
socket AF_INET Stream proto
>>= \ sock ->
sock <-
socket AF_INET Stream proto
getServicePortNumber serv
>>= \ port ->
port <-
getServicePortNumber serv
getHostByName hostname
>>= \ (HostEntry _ _ _ haddrs) ->
he <-
getHostByName hostname
connect sock (SockAddrInet port (h
ead haddrs)) >>
connect sock (SockAddrInet port (h
ostAddress he))
socketToHandle sock ReadWriteMode
>>= \ h ->
socketToHandle sock ReadWriteMode
return h
connectTo hostname (PortNumber port) =
connectTo hostname (PortNumber port) =
do
getProtocolNumber "tcp"
>>= \ proto ->
proto <-
getProtocolNumber "tcp"
socket AF_INET Stream proto
>>= \ sock ->
sock <-
socket AF_INET Stream proto
getHostByName hostname
>>= \ (HostEntry _ _ _ haddrs) ->
he <-
getHostByName hostname
connect sock (SockAddrInet port (h
ead haddrs)) >>
connect sock (SockAddrInet port (h
ostAddress he))
socketToHandle sock ReadWriteMode
socketToHandle sock ReadWriteMode
#ifndef cygwin32_TARGET_OS
#ifndef cygwin32_TARGET_OS
connectTo _ (UnixSocket path) =
connectTo _ (UnixSocket path) =
do
socket AF_UNIX Datagram 0
>>= \ sock ->
sock <-
socket AF_UNIX Datagram 0
connect sock (SockAddrUnix path)
>>
connect sock (SockAddrUnix path)
socketToHandle sock ReadWriteMode
socketToHandle sock ReadWriteMode
#endif
#endif
...
@@ -104,23 +104,25 @@ socket which has been bound to the specified port.
...
@@ -104,23 +104,25 @@ socket which has been bound to the specified port.
listenOn :: PortID -- Port Identifier
listenOn :: PortID -- Port Identifier
-> IO Socket -- Connected Socket
-> IO Socket -- Connected Socket
listenOn (Service serv) =
listenOn (Service serv) =
do
getProtocolNumber "tcp"
>>= \ proto ->
proto <-
getProtocolNumber "tcp"
socket AF_INET Stream proto
>>= \ sock ->
sock <-
socket AF_INET Stream proto
getServicePortNumber serv
>>= \ port ->
port <-
getServicePortNumber serv
bindSocket sock (SockAddrInet port iNADDR_ANY)
>>
bindSocket sock (SockAddrInet port iNADDR_ANY)
listen sock maxListenQueue
>>
listen sock maxListenQueue
return sock
return sock
listenOn (PortNumber port) =
getProtocolNumber "tcp" >>= \ proto ->
listenOn (PortNumber port) = do
socket AF_INET Stream proto >>= \ sock ->
proto <- getProtocolNumber "tcp"
bindSocket sock (SockAddrInet port iNADDR_ANY) >>
sock <- socket AF_INET Stream proto
listen sock maxListenQueue >>
bindSocket sock (SockAddrInet port iNADDR_ANY)
listen sock maxListenQueue
return sock
return sock
#ifndef cygwin32_TARGET_OS
#ifndef cygwin32_TARGET_OS
listenOn (UnixSocket path) =
listenOn (UnixSocket path) =
do
socket AF_UNIX Datagram 0
>>= \ sock ->
sock <-
socket AF_UNIX Datagram 0
bindSocket sock (SockAddrUnix path)
>>
bindSocket sock (SockAddrUnix path)
return sock
return sock
#endif
#endif
\end{code}
\end{code}
...
@@ -129,12 +131,12 @@ listenOn (UnixSocket path) =
...
@@ -129,12 +131,12 @@ listenOn (UnixSocket path) =
accept :: Socket -- Listening Socket
accept :: Socket -- Listening Socket
-> IO (Handle, -- StdIO Handle for read/write
-> IO (Handle, -- StdIO Handle for read/write
HostName) -- HostName of Peer socket
HostName) -- HostName of Peer socket
accept sock = do
accept sock =
~(sock', (SockAddrInet _ haddr)) <- SocketPrim.accept sock
SocketPrim.accept sock >>= \ (sock', (SockAddrInet _ haddr)) ->
(HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr
getHostByAddr AF_INET haddr >>= \ (HostEntry peer _ _ _) ->
handle <- socketToHandle sock ReadWriteMode
socketToHandle sock ReadWriteMode >>= \ handle ->
return (handle, peer)
return (handle, peer)
\end{code}
\end{code}
Send and recived data from/to the given host and port number. These
Send and recived data from/to the given host and port number. These
...
@@ -148,45 +150,48 @@ sendTo :: Hostname -- Hostname
...
@@ -148,45 +150,48 @@ sendTo :: Hostname -- Hostname
-> PortID -- Port Number
-> PortID -- Port Number
-> String -- Message to send
-> String -- Message to send
-> IO ()
-> IO ()
sendTo h p msg =
sendTo h p msg =
do
connectTo h p
>>= \ s ->
s <-
connectTo h p
hPutStr s msg
>>
hPutStr s msg
hClose s
hClose s
recvFrom :: Hostname -- Hostname
recvFrom :: Hostname -- Hostname
-> PortID -- Port Number
-> PortID -- Port Number
-> IO String -- Received Data
-> IO String -- Received Data
recvFrom host port =
recvFrom host port =
do
listenOn port
>>= \ s ->
s <-
listenOn port
let
let
waiting =
waiting = do
SocketPrim.accept s >>= \ (s', (SockAddrInet _ haddr)) ->
~(s', SockAddrInet _ haddr) <- SocketPrim.accept s
getHostByAddr AF_INET haddr >>= \ (HostEntry peer _ _ _) ->
(HostEntry peer _ _ _) <- getHostByAddr AF_INET haddr
if peer /= host then
if peer /= host
sClose s' >>
then do
waiting
sClose s'
else
waiting
readSocketAll s' >>= \ msg ->
else do
sClose s' >>
msg <- readSocketAll s'
return msg
sClose s'
in
return msg
waiting >>= \ message ->
sClose s >>
message <- waiting
sClose s
return message
return message
\end{code}
\end{code}
Access function returning the port type/id of socket.
Access function returning the port type/id of socket.
\begin{code}
\begin{code}
socketPort :: Socket -> IO PortID
socketPort :: Socket -> IO PortID
socketPort s =
socketPort s = do
getSocketName s >>= \ sockaddr ->
sockaddr <- getSocketName s
return (case sockaddr of
return (portID sockaddr)
SockAddrInet port _ ->
where
(PortNumber port)
portID sa =
case sa of
SockAddrInet port _ -> PortNumber port
#ifndef cygwin32_TARGET_OS
#ifndef cygwin32_TARGET_OS
SockAddrUnix path ->
SockAddrUnix path -> UnixSocket path
(UnixSocket path)
#endif
#endif
)
\end{code}
\end{code}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment