support Android's crippled lsof

This commit is contained in:
Joey Hess 2013-02-11 17:24:12 -04:00
parent a7ef05a988
commit 5737c49804
3 changed files with 28 additions and 7 deletions

View file

@ -281,7 +281,10 @@ safeToAdd delayadd pending inprocess = do
void $ liftIO $ tryIO $ removeFile $ contentLocation ks
canceladd _ = noop
openwrite (_file, mode, _pid) =
mode == Lsof.OpenWriteOnly || mode == Lsof.OpenReadWrite
openwrite (_file, mode, _pid)
| mode == Lsof.OpenWriteOnly = True
| mode == Lsof.OpenReadWrite = True
| mode == Lsof.OpenUnknown = True
| otherwise = False
allRight = return . map Right

View file

@ -5,7 +5,7 @@
- Licensed under the GNU GPL version 3 or higher.
-}
{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE BangPatterns, CPP #-}
module Utility.Lsof where
@ -52,6 +52,15 @@ query opts =
where
p = proc "lsof" ("-F0can" : opts)
type LsofParser = String -> [(FilePath, LsofOpenMode, ProcessInfo)]
parse :: LsofParser
#ifdef WITH_ANDROID
parse = parseDefault
#else
parse = parseFormatted
#endif
{- Parsing null-delimited output like:
-
- pPID\0cCMDLINE\0
@ -62,8 +71,8 @@ query opts =
- Where each new process block is started by a pid, and a process can
- have multiple files open.
-}
parse :: String -> [(FilePath, LsofOpenMode, ProcessInfo)]
parse s = bundle $ go [] $ lines s
parseFormatted :: LsofParser
parseFormatted s = bundle $ go [] $ lines s
where
bundle = concatMap (\(fs, p) -> map (\(f, m) -> (f, m, p)) fs)
@ -97,3 +106,14 @@ parse s = bundle $ go [] $ lines s
splitnull = split "\0"
parsefail = error $ "failed to parse lsof output: " ++ show s
{- Parses lsof's default output format. -}
parseDefault :: LsofParser
parseDefault = catMaybes . map parse . drop 1 . lines
where
parse l = case words l of
(command : spid : _user : _fd : _type : _device : _size : _node : rest) ->
case readish spid of
Nothing -> Nothing
Just pid -> Just (unwords rest, OpenUnknown, ProcessInfo pid command)
_ -> Nothing

View file

@ -24,8 +24,6 @@ and also have to `cabal install` all necessary dependencies.
* git-annex sets `#!/bin/sh` in hook script, but that is not
a valid path on android, and the right path needs to be determined at runtime.
* support Android lsof output in lsof parser, needed for watch mode
### Android specific features
The app should be aware of power status, and avoid expensive background