diff options
author | Joey Hess <joeyh@joeyh.name> | 2016-12-22 13:59:21 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2016-12-22 13:59:21 -0400 |
commit | 6c089cff615bc44ca94cc4ca77dc69f281dd2ab8 (patch) | |
tree | 028c8958b20c841864e4f9925389f0ea1fcd8bc8 /P2P/IO.hs | |
parent | 4218d2a77aa4aab0bb09d31463670cce3067bd9c (diff) |
close
Diffstat (limited to 'P2P/IO.hs')
-rw-r--r-- | P2P/IO.hs | 29 |
1 files changed, 29 insertions, 0 deletions
@@ -68,6 +68,35 @@ closeConnection conn = do hClose (connIhdl conn) hClose (connOhdl conn) +-- Serves the protocol on a unix socket. +-- +-- The callback is run to serve a connection, and is responsible for +-- closing the Handle when done. +-- +-- Note that while the callback is running, other connections won't be +-- processes, so longterm work should be run in a separate thread by +-- the callback. +serveUnixSocket :: FilePath -> (Handle -> IO ()) -> IO () +serveUnixSocket unixsocket serveconn = do + nukeFile unixsocket + soc <- S.socket S.AF_UNIX S.Stream S.defaultProtocol + S.bind soc (S.SockAddrUnix unixsocket) + -- Allow everyone to read and write to the socket, + -- so a daemon like tor, that is probably running as a different + -- de sock $ addModes + -- user, can access it. + -- + -- Connections have to authenticate to do anything, + -- so it's fine that other local users can connect to the + -- socket. + modifyFileMode unixsocket $ addModes + [groupReadMode, groupWriteMode, otherReadMode, otherWriteMode] + S.listen soc 2 + forever $ do + (conn, _) <- S.accept soc + h <- setupHandle conn + serveconn conn + setupHandle :: Socket -> IO Handle setupHandle s = do h <- socketToHandle s ReadWriteMode |