947d2a10bc
ghc 8.8.4 seems to have changed something that broke code that has been successfully using forkProcess since 2012. Likely a change to GC internals. Since forkProcess has never had clear documentation about how to use it safely, avoid using it at all. Instead, when git-annex needs to daemonize itself, re-run the git-annex command, in a new process group and session. This commit was sponsored by Luke Shumaker on Patreon.
35 lines
918 B
Haskell
35 lines
918 B
Haskell
{- git-annex command
|
|
-
|
|
- Copyright 2014-2016 Joey Hess <id@joeyh.name>
|
|
-
|
|
- Licensed under the GNU AGPL version 3 or higher.
|
|
-}
|
|
|
|
{-# LANGUAGE CPP #-}
|
|
|
|
module Command.RemoteDaemon where
|
|
|
|
import Command
|
|
import RemoteDaemon.Core
|
|
import Utility.Daemon
|
|
import Annex.Path
|
|
|
|
cmd :: Command
|
|
cmd = noCommit $
|
|
command "remotedaemon" SectionCommon
|
|
"persistent communication with remotes"
|
|
paramNothing (run <$$> const (parseDaemonOptions False))
|
|
|
|
run :: DaemonOptions -> CommandSeek
|
|
run o
|
|
| stopDaemonOption o = error "--stop not implemented for remotedaemon"
|
|
| foregroundDaemonOption o = liftIO runInteractive
|
|
| otherwise = do
|
|
#ifndef mingw32_HOST_OS
|
|
git_annex <- liftIO programPath
|
|
ps <- gitAnnexDaemonizeParams
|
|
let logfd = openFd "/dev/null" ReadOnly Nothing defaultFileFlags
|
|
liftIO $ daemonize git_annex ps logfd Nothing False runNonInteractive
|
|
#else
|
|
liftIO $ foreground Nothing runNonInteractive
|
|
#endif
|