@@ -33,6 +33,9 @@ import Prelude hiding (catch)
3333#if WINDOWS
3434import qualified Control.Concurrent.MVar as MV
3535import Network.Socket (withSocketsDo)
36+#else
37+import System.Posix.IO (FdOption(CloseOnExec), setFdOption)
38+import Network.Socket (fdSocket)
3639#endif
3740
3841#if SENDFILEFD
@@ -90,11 +93,13 @@ runSettings set app = withSocketsDo $ do
9093 runSettingsSocket set s app)
9194 forever (threadDelay maxBound) `finally` clean
9295#else
93−runSettings set =
96+runSettings set app =
9497 bracket
9598 (bindPort (settingsPort set) (settingsHost set))
96− sClose .
97− flip (runSettingsSocket set)
99+ sClose
100+ (\socket -> do
101+ setSocketCloseOnExec socket
102+ runSettingsSocket set socket app)
98103#endif
99104
100105-- | Same as 'runSettings', but uses a user-supplied socket instead of opening
@@ -109,6 +114,7 @@ runSettingsSocket set socket app =
109114 where
110115 getter = do
111116 (conn, sa) <- accept socket
117+ setSocketCloseOnExec socket
112118 return (socketConnection conn, sa)
113119
114120runSettingsConnection :: Settings -> IO (Connection, SockAddr) -> Application -> IO ()
@@ -210,3 +216,12 @@ connSource Connection { connRecv = recv } th = src
210216 when (S.length bs >= 2048) $ liftIO $ T.tickle th
211217 yield bs
212218 src
219+
220+-- Copied from: https://github.com/mzero/plush/blob/master/src/Plush/Server/Warp.hs
221+setSocketCloseOnExec :: Socket -> IO ()
222+#if WINDOWS
223+setSocketCloseOnExec _ = return ()
224+#else
225+setSocketCloseOnExec socket =
226+ setFdOption (fromIntegral $ fdSocket socket) CloseOnExec True
227+#endif