avoid crashing in checkDaemon when fcntl locking is not supported
Instead, just assume the daemon isn't running. Since the pid file locking fails on such a filesystem, we know it's not running.
This commit is contained in:
parent
b5df6c7b93
commit
be86081ff4
1 changed files with 11 additions and 9 deletions
|
@ -119,16 +119,18 @@ alreadyRunning = error "Daemon is already running."
|
|||
- If it's running, returns its pid. -}
|
||||
checkDaemon :: FilePath -> IO (Maybe PID)
|
||||
#ifndef mingw32_HOST_OS
|
||||
checkDaemon pidfile = do
|
||||
v <- catchMaybeIO $
|
||||
openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags
|
||||
case v of
|
||||
Just fd -> do
|
||||
locked <- getLock fd (ReadLock, AbsoluteSeek, 0, 0)
|
||||
p <- readish <$> readFile pidfile
|
||||
closeFd fd `after` return (check locked p)
|
||||
Nothing -> return Nothing
|
||||
checkDaemon pidfile = bracket setup cleanup go
|
||||
where
|
||||
setup = catchMaybeIO $
|
||||
openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags
|
||||
cleanup (Just fd) = closeFd fd
|
||||
cleanup Nothing = return ()
|
||||
go (Just fd) = catchDefaultIO Nothing $ do
|
||||
locked <- getLock fd (ReadLock, AbsoluteSeek, 0, 0)
|
||||
p <- readish <$> readFile pidfile
|
||||
return (check locked p)
|
||||
go Nothing = return Nothing
|
||||
|
||||
check Nothing _ = Nothing
|
||||
check _ Nothing = Nothing
|
||||
check (Just (pid, _)) (Just pid')
|
||||
|
|
Loading…
Reference in a new issue