1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
|
module Program.Mighty.Network (
daemonize
) where
import Control.Monad
import System.Exit
import System.Posix
-- | Run a program detaching its terminal.
daemonize :: IO () -> IO ()
daemonize program = ensureDetachTerminalCanWork $ do
detachTerminal
ensureNeverAttachTerminal $ do
changeWorkingDirectory "/"
void $ setFileCreationMask 0
mapM_ closeFd [stdInput, stdOutput, stdError]
program
where
ensureDetachTerminalCanWork p = do
void $ forkProcess p
exitSuccess
ensureNeverAttachTerminal p = do
void $ forkProcess p
exitSuccess
detachTerminal = void createSession
|