summaryrefslogtreecommitdiff
path: root/Presence
diff options
context:
space:
mode:
Diffstat (limited to 'Presence')
-rw-r--r--Presence/Server.hs18
-rw-r--r--Presence/main.hs19
-rw-r--r--Presence/monitortty.c10
3 files changed, 30 insertions, 17 deletions
diff --git a/Presence/Server.hs b/Presence/Server.hs
index adc3de84..deab779b 100644
--- a/Presence/Server.hs
+++ b/Presence/Server.hs
@@ -24,6 +24,8 @@ import Control.Exception (handle,SomeException(..))
24import Data.HList 24import Data.HList
25import Data.HList.TypeEqGeneric1() 25import Data.HList.TypeEqGeneric1()
26import Data.HList.TypeCastGeneric1() 26import Data.HList.TypeCastGeneric1()
27import System.IO.Error
28import ByteStringOperators
27 29
28 30
29newtype ConnId = ConnId Int 31newtype ConnId = ConnId Int
@@ -50,9 +52,6 @@ doServer port g startCon = runServer2 port (runConn2 g)
50 hSetBuffering h NoBuffering 52 hSetBuffering h NoBuffering
51 st'' <- startCon sock (h .*. st) 53 st'' <- startCon sock (h .*. st)
52 let doException (SomeException e) = Prelude.putStrLn ("\n\nexception: " ++ show e ++ "\n\n") 54 let doException (SomeException e) = Prelude.putStrLn ("\n\nexception: " ++ show e ++ "\n\n")
53 handle doException $ do
54 -- PEER CRED: (0,4294967295,4294967295)
55 -- PEER NAME: 127.0.0.1:37253
56 handle doException $ fix $ \loop -> do 55 handle doException $ fix $ \loop -> do
57 let continue () = hIsEOF h >>= flip when loop . not 56 let continue () = hIsEOF h >>= flip when loop . not
58 packet <- getPacket h 57 packet <- getPacket h
@@ -73,12 +72,19 @@ doServer port g startCon = runServer2 port (runConn2 g)
73 listen sock 2 72 listen sock 2
74 forkIO $ do 73 forkIO $ do
75 mainLoop sock (ConnId 0) go 74 mainLoop sock (ConnId 0) go
76 L.putStrLn $ "quit accept loop" 75 -- L.putStrLn $ "quit accept loop"
77 return sock 76 return sock
78 where 77 where
79 mainLoop sock idnum@(ConnId n) go = do 78 mainLoop sock idnum@(ConnId n) go = do
80 let doException (SomeException e) = do 79 let doException ioerror = do
81 Prelude.putStrLn ("\n\naccept-loop exception: " ++ show e ++ "\n\n") 80 let typ = ioeGetErrorType ioerror
81 if -- typ == InvalidArgument
82 -- but the symbol is not exported :/
83 bshow typ=="invalid argument"
84 then do
85 L.putStrLn $ "quit accept-loop."
86 else do
87 L.putStrLn ("accept-loop exception: " <++> bshow ioerror <++> "\n")
82 return Nothing 88 return Nothing
83 mcon <- handle doException $ fix $ \loop -> do 89 mcon <- handle doException $ fix $ \loop -> do
84 con <- accept sock 90 con <- accept sock
diff --git a/Presence/main.hs b/Presence/main.hs
index dd6bfb2e..36796b6e 100644
--- a/Presence/main.hs
+++ b/Presence/main.hs
@@ -30,7 +30,7 @@ import Control.Exception
30import LocalPeerCred 30import LocalPeerCred
31import System.Posix.User 31import System.Posix.User
32import qualified Data.Set as Set 32import qualified Data.Set as Set
33import Data.Set (Set) 33import Data.Set as Set (Set,(\\))
34 34
35import ByteStringOperators 35import ByteStringOperators
36import qualified Data.ByteString.Lazy.Char8 as L 36import qualified Data.ByteString.Lazy.Char8 as L
@@ -48,15 +48,21 @@ toJabberId host (user,tty,_) =
48 48
49track_login :: IORef (Set L.ByteString) -> t -> IO () 49track_login :: IORef (Set L.ByteString) -> t -> IO ()
50track_login tracked e = do 50track_login tracked e = do
51 -- print e
52 putStrLn "---"
53#ifndef NOUTMP 51#ifndef NOUTMP
54 us <- users 52 us <- users
55#else 53#else
56 let us = [] 54 let us = []
57#endif 55#endif
58 let ids = mapMaybe (toJabberId "localhost") us 56 let ids = Set.fromList $ mapMaybe (toJabberId "localhost") us
59 forM_ ids L.putStrLn 57 -- forM_ ids L.putStrLn
58 state <- readIORef tracked
59 let arrivals = ids \\ state
60 departures = state \\ ids
61 forM_ (Set.toList departures) $ \id -> do
62 putStrLn $ id <++> " logged out."
63 forM_ (Set.toList arrivals) $ \id -> do
64 putStrLn $ id <++> " logged in."
65 writeIORef tracked ids
60 66
61data UnixSession = UnixSession { 67data UnixSession = UnixSession {
62 unix_uid :: (IORef (Maybe UserID)), 68 unix_uid :: (IORef (Maybe UserID)),
@@ -101,19 +107,18 @@ start = do
101 tracked <- newIORef Set.empty 107 tracked <- newIORef Set.empty
102 let dologin e = track_login tracked e 108 let dologin e = track_login tracked e
103 dologin :: t -> IO () 109 dologin :: t -> IO ()
110 dologin ()
104#ifndef NOUTMP 111#ifndef NOUTMP
105 installHandler sigUSR1 (Catch (dologin (userError "signaled"))) Nothing 112 installHandler sigUSR1 (Catch (dologin (userError "signaled"))) Nothing
106#endif 113#endif
107 -- installHandler sigTERM (CatchOnce (dologin (userError "term signaled"))) Nothing 114 -- installHandler sigTERM (CatchOnce (dologin (userError "term signaled"))) Nothing
108 inotify <- initINotify 115 inotify <- initINotify
109 print inotify
110#ifndef NOUTMP 116#ifndef NOUTMP
111 wd <- addWatch 117 wd <- addWatch
112 inotify 118 inotify
113 [CloseWrite] -- [Open,Close,Access,Modify,Move] 119 [CloseWrite] -- [Open,Close,Access,Modify,Move]
114 utmp_file 120 utmp_file
115 dologin 121 dologin
116 print wd
117#endif 122#endif
118 mtty <- monitorTTY on_chvt 123 mtty <- monitorTTY on_chvt
119 sock <- listenForXmppClients UnixSessions 5222 HNil 124 sock <- listenForXmppClients UnixSessions 5222 HNil
diff --git a/Presence/monitortty.c b/Presence/monitortty.c
index 7b5dc82c..675abe5c 100644
--- a/Presence/monitortty.c
+++ b/Presence/monitortty.c
@@ -110,7 +110,7 @@ int tty = -1;
110 110
111void *write_vtch(void *pfd) { 111void *write_vtch(void *pfd) {
112 int fd = (int)(intptr_t)pfd; 112 int fd = (int)(intptr_t)pfd;
113 printf("START write_vtch fd=%i\n",fd); 113 printf("started VT_WAITEVENT loop fd=%i\n",fd);
114 pthread_mutex_lock(&mu); 114 pthread_mutex_lock(&mu);
115 tty = ttyfd(); 115 tty = ttyfd();
116 pthread_mutex_unlock(&mu); 116 pthread_mutex_unlock(&mu);
@@ -131,6 +131,7 @@ void *write_vtch(void *pfd) {
131 } 131 }
132 do { 132 do {
133 vt_wait(tty); 133 vt_wait(tty);
134 // printf("vt_wait() finished. tty=%d fd=%d\n",tty,fd);
134 active_tty = get_active(tty); 135 active_tty = get_active(tty);
135 } while (active_tty==reported_tty); 136 } while (active_tty==reported_tty);
136 } 137 }
@@ -138,7 +139,7 @@ void *write_vtch(void *pfd) {
138 // TODO: 139 // TODO:
139 // use VT_GETSTATE 140 // use VT_GETSTATE
140 // use VT_WAITEVENT 141 // use VT_WAITEVENT
141 printf("QUIT write_vtch\n"); 142 printf("stopped VT_WAITEVENT loop\n");
142 tty = -1; 143 tty = -1;
143 pthread_mutex_destroy(&mu); 144 pthread_mutex_destroy(&mu);
144 return NULL; 145 return NULL;
@@ -147,7 +148,7 @@ void *write_vtch(void *pfd) {
147 148
148void monitorTTY(int fd) { 149void monitorTTY(int fd) {
149 pthread_mutex_init(&mu,NULL); 150 pthread_mutex_init(&mu,NULL);
150 printf ("Hello world.\n"); 151 // printf ("Hello world.\n");
151 pthread_create (&mt, NULL, write_vtch, (void*)(intptr_t)fd); 152 pthread_create (&mt, NULL, write_vtch, (void*)(intptr_t)fd);
152} 153}
153 154
@@ -158,8 +159,9 @@ void closeTTY() {
158 active = get_active(tty); 159 active = get_active(tty);
159 fd = tty; 160 fd = tty;
160 pthread_mutex_unlock(&mu); 161 pthread_mutex_unlock(&mu);
161 pthread_cancel(mt); 162 // pthread_cancel(mt);
162 char cmd[40]; cmd[39] = '\0'; 163 char cmd[40]; cmd[39] = '\0';
164 // Hack to wake up from VT_WAITEVENT ioctl
163 snprintf(cmd,39,"chvt %i;chvt %i",active+1,active); 165 snprintf(cmd,39,"chvt %i;chvt %i",active+1,active);
164 system(cmd); 166 system(cmd);
165 pthread_join(mt,NULL); 167 pthread_join(mt,NULL);