CSY27FWPSKRAT37RJNIEQRVDNIO6L4QLENSPOE3XLIGGQZDETGRAC import Control.Concurrent (forkIO)import Control.Exception (catch, try, SomeException)
import Control.Concurrent (forkIO, MVar, newEmptyMVar, putMVar, takeMVar, killThread, forkFinally, isEmptyMVar)import Control.Exception (catch, try, SomeException, IOException)
-- Clean up old socket if existscatch (removeFile socketPath) (\(_::SomeException) -> pure ())
-- Clean up any existing socket filecatch (removeFile socketPath)(\(e :: IOException) ->if isDoesNotExistError e then pure () else ioError e)-- Create and bind the UNIX domain socket
listen sock 1
listen sock 10-- Run the accept loop in a separate threadacceptThread <- forkIO $acceptLoop sock stopFlag (\conn -> handleClient conn ip raw)-- Wait until SIGTERMtakeMVar stopFlagputStrLn "Received SIGTERM, shutting down gracefully..."--clear the iptablesstop ip raw
-- | Loop accepting connections until stopFlag is setacceptLoop :: Socket -> MVar () -> (Socket -> IO ()) -> IO ()acceptLoop sock stopFlag handleConn = dolet loop = dostillRunning <- isEmptyMVar stopFlagwhen stillRunning $ do(conn, _) <- accept sockvoid $ forkFinally (handleConn conn) (\_ -> close conn)looploop