summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjoe <joe@jerkface.net>2013-07-04 23:23:18 -0400
committerjoe <joe@jerkface.net>2013-07-04 23:23:18 -0400
commit45d1ca9da3a7652af535c50614bae73a57a669b3 (patch)
tree2d7d77f7b07de67cff51e18ebc3cfc4847292444
parentdb62ca46312b15c696f9a175fc0daf70c2c1a053 (diff)
search parent pids for tty and fall back to DISPLAY variable.
-rw-r--r--whosocket.hs41
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
77ttyOrDisplay pid ttydev | take 8 ttydev == "/dev/tty" = return (drop 5 ttydev)
78ttyOrDisplay pid ttydev = do 77ttyOrDisplay 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
96searchParentsForTTY pid ttydev | take 8 ttydev == "/dev/tty" = return . Just $ drop 5 ttydev
97searchParentsForTTY "1" ttydev | otherwise = return Nothing
98searchParentsForTTY 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