summaryrefslogtreecommitdiff
path: root/P2P
diff options
context:
space:
mode:
authorGravatar Joey Hess <joeyh@joeyh.name>2016-12-22 13:59:21 -0400
committerGravatar Joey Hess <joeyh@joeyh.name>2016-12-22 13:59:21 -0400
commit6c089cff615bc44ca94cc4ca77dc69f281dd2ab8 (patch)
tree028c8958b20c841864e4f9925389f0ea1fcd8bc8 /P2P
parent4218d2a77aa4aab0bb09d31463670cce3067bd9c (diff)
close
Diffstat (limited to 'P2P')
-rw-r--r--P2P/IO.hs29
1 files changed, 29 insertions, 0 deletions
diff --git a/P2P/IO.hs b/P2P/IO.hs
index 3e0999775..49f28bff1 100644
--- a/P2P/IO.hs
+++ b/P2P/IO.hs
@@ -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