diff options
author | joe <joe@jerkface.net> | 2013-07-04 23:23:18 -0400 |
---|---|---|
committer | joe <joe@jerkface.net> | 2013-07-04 23:23:18 -0400 |
commit | 45d1ca9da3a7652af535c50614bae73a57a669b3 (patch) | |
tree | 2d7d77f7b07de67cff51e18ebc3cfc4847292444 | |
parent | db62ca46312b15c696f9a175fc0daf70c2c1a053 (diff) |
search parent pids for tty and fall back to DISPLAY variable.
-rw-r--r-- | whosocket.hs | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/whosocket.hs b/whosocket.hs index 5968b152..6955830a 100644 --- a/whosocket.hs +++ b/whosocket.hs | |||
@@ -74,18 +74,31 @@ scanProc uid inode = do | |||
74 | 74 | ||
75 | fmap (fmap (first (read :: String -> CPid))) $ searchPids pids | 75 | fmap (fmap (first (read :: String -> CPid))) $ searchPids pids |
76 | 76 | ||
77 | ttyOrDisplay pid ttydev | take 8 ttydev == "/dev/tty" = return (drop 5 ttydev) | ||
78 | ttyOrDisplay pid ttydev = do | 77 | ttyOrDisplay pid ttydev = do |
79 | env <- handleIO_ (return "") . readFile $ "/proc/"++show pid++"/environ" | 78 | ptty <- searchParentsForTTY (show pid) ttydev |
80 | let vs = unzero $ groupBy (\_ c->c/='\0') env | 79 | case ptty of |
81 | unzero [] = [] | 80 | Just tty -> return tty |
82 | unzero (v:vs) = v:map tail vs | 81 | Nothing -> do |
83 | keyvalue xs = (key,value) | 82 | env <- handleIO_ (return "") . readFile $ "/proc/"++show pid++"/environ" |
84 | where | 83 | let vs = unzero $ groupBy (\_ c->c/='\0') env |
85 | (key,ys) = break (=='=') xs | 84 | unzero [] = [] |
86 | value = case ys of { [] -> []; (_:ys') -> ys' } | 85 | unzero (v:vs) = v:map tail vs |
87 | display = listToMaybe . filter ((=="DISPLAY").fst) . map keyvalue $ vs | 86 | keyvalue xs = (key,value) |
88 | putStrLn $ "display = " ++ show display | 87 | where |
89 | case display of | 88 | (key,ys) = break (=='=') xs |
90 | Just (_,disp) -> return disp | 89 | value = case ys of { [] -> []; (_:ys') -> ys' } |
91 | _ -> return ttydev | 90 | display = listToMaybe . filter ((=="DISPLAY").fst) . map keyvalue $ vs |
91 | putStrLn $ "display = " ++ show display | ||
92 | case display of | ||
93 | Just (_,disp) -> return disp | ||
94 | _ -> return ttydev | ||
95 | |||
96 | searchParentsForTTY pid ttydev | take 8 ttydev == "/dev/tty" = return . Just $ drop 5 ttydev | ||
97 | searchParentsForTTY "1" ttydev | otherwise = return Nothing | ||
98 | searchParentsForTTY pid ttydev = do | ||
99 | stat <- handleIO_ (return "") . readFile $ "/proc/"++pid++"/stat" | ||
100 | case words stat ?? 3 of | ||
101 | Nothing -> return Nothing | ||
102 | Just ppid -> do | ||
103 | tty <- handleIO_ (return "") $ readSymbolicLink $ "/proc/"++ppid++"/fd/0" | ||
104 | searchParentsForTTY ppid tty | ||