From be86081ff4a98b45e08921fdd0b8eba3fca7ea64 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Mon, 16 Nov 2015 14:27:23 -0400 Subject: [PATCH] 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. --- Utility/Daemon.hs | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs index d7f0407bef..3cc2eb2613 100644 --- a/Utility/Daemon.hs +++ b/Utility/Daemon.hs @@ -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')