diff options
author | Joey Hess <joeyh@joeyh.name> | 2015-11-16 14:27:23 -0400 |
---|---|---|
committer | Joey Hess <joeyh@joeyh.name> | 2015-11-16 14:34:30 -0400 |
commit | 8055c761751e5c6a913f76293281389e29378545 (patch) | |
tree | cd49ae0d803cfe65dbea48144fc030df8e8fc7a8 /Utility | |
parent | 4e9fc72e2dc1bb4e5251b1e0eb7b4290e0aa2988 (diff) |
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.
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Daemon.hs | 20 |
1 files changed, 11 insertions, 9 deletions
diff --git a/Utility/Daemon.hs b/Utility/Daemon.hs index d7f0407be..3cc2eb261 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') |