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:
Joey Hess 2015-11-16 14:27:23 -04:00
parent b5df6c7b93
commit be86081ff4
Failed to extract signature

View file

@ -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 $
checkDaemon pidfile = bracket setup cleanup go
where
setup = catchMaybeIO $
openFd pidfile ReadOnly (Just stdFileMode) defaultFileFlags
case v of
Just fd -> do
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
closeFd fd `after` return (check locked p)
Nothing -> return Nothing
where
return (check locked p)
go Nothing = return Nothing
check Nothing _ = Nothing
check _ Nothing = Nothing
check (Just (pid, _)) (Just pid')