chiark / gitweb /
*** empty log message ***
authorjames <james>
Wed, 20 Feb 2008 02:11:35 +0000 (02:11 +0000)
committerjames <james>
Wed, 20 Feb 2008 02:11:35 +0000 (02:11 +0000)
apps/mainloop.c
apps/sympathy.c
apps/usage.c

index e3d2190420e2a95c94a8de9c4d87dee351954a91..f515478810cf824ca0fb9ce251c025019ac41a5e 100644 (file)
@@ -6,11 +6,13 @@
  *
  */
 
-static char rcsid[] =
-  "$Id$";
+static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.3  2008/02/20 02:11:35  james
+ * *** empty log message ***
+ *
  * Revision 1.2  2008/02/16 10:58:52  james
  * *** empty log message ***
  *
@@ -86,7 +88,12 @@ get_status (TTY * t, Clients * cs)
   tty_get_status (t, &tty_status);
 
   status.bootstrap = 1;
-  status.nclients = cs->n;
+
+  if (cs)
+    status.nclients = cs->n;
+  else
+    status.nclients = 0;
+
   status.lines = tty_status.lines;
   status.baud = tty_status.baud;
   status.crtscts = (tty_status.termios.c_cflag & CRTSCTS) ? 1 : 0;
@@ -280,95 +287,148 @@ check_status (Context * c, Clients * cs)
 
   *ptr = 0;
 
-  send_status (cs, buf);
+  if (cs)
+    send_status (cs, buf);
+  else
+    cmd_new_status (c->d, c, m->status.status);
+
 }
 
 
-  TTY *t;
-  Log *l;
-  t= ptty_open (NULL, NULL);
-  //t = serial_open ("/dev/cellmodem", 0);
-l=file_log_new ("log");
+static void
+msg_from_server (IPC_Msg * m, Context * c)
+{
+  switch (m->hdr.type)
+    {
+
+    case IPC_MSG_TYPE_NOOP:
+      break;
+    case IPC_MSG_TYPE_DEBUG:
+//          fprintf (stderr,"%p [%d] %s\n", m, m->hdr.size , m->debug.msg );
+      break;
+    case IPC_MSG_TYPE_HISTORY:
+      history_add (c->h, m->history.history.line);
+      break;
+    case IPC_MSG_TYPE_VT102:
+      if (sizeof (VT102) != m->vt102.len)
+        abort ();
+
+      *(c->v) = m->vt102.vt102;
+       //FIXME HTML hook
+      break;
+    case IPC_MSG_TYPE_TERM:
+      vt102_parse (c, m->term.term, m->term.len);
+      break;
+    case IPC_MSG_TYPE_STATUS:
+      cmd_new_status (c->d, c, m->status.status);
+      break;
+    default:
+      fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type);
+    }
+}
 
 
-void mainloop (TTY *tty,Socket *server_socket,Socket *client_socket,Ansi *a,Log *log)
+void
+mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, Ansi * a,
+          Log * log)
 {
   fd_set rfds, wfds;
   Context c;
   Clients *clients;
 
+
   c.v = vt102_new ();
   c.h = history_new (200);
   c.l = log
+    /* are we being fed by a tty or a socket */
+    if (client_socket)
+    {
+      if (server_socket)
+        abort ();
+      c.s = client_socket;
+      c.k = keydis_ipc_new (client_socket);
+    }
+  else
+    {
+      if (!tty)
+        abort ();
+      c.t = tty;
+      c.k = keydis_vt102_new ();
+    }
+
+  /* do we have an upstream terminal to talk to */
+  /* if so start a command parser */
+  if (ansi)
+    {
+      c.d = cmd_new ();
+    }
+  else
+    {
+      c.d = NULL;
+    }
+
 
-  /* are we being fed by a tty or a socket */
-  if (client_socket) {
-       if (server_socket) abort();
-       c.s = client_socket;  
-        c.k = keydis_ipc_new (client_socket);
-  } else {
-       if (!tty) abort();
-       c.t = tty;
-       c.k = keydis_vt102_new ();
-  }
-
-  /* do we have an upstream terminal to talk to*/
-  if (ansi) {
-       c.d = cmd_new ();
-  } else {
-       c.d = NULL;
-  }
-
-
-  if (server_socket) {
-       if(client_socket) abort();
-       clients = clients_new ();
-  } else {
-       clients=NULL;
-  }
+  if (server_socket)
+    {
+      if (client_socket)
+        abort ();
+      clients = clients_new ();
+    }
+  else
+    {
+      clients = NULL;
+    }
 
   for (;;)
     {
       struct timeval tv = { 1, 0 };
 
+      /*update the status lines, locally or remotely*/
       check_status (&c, clients);
 
       FD_ZERO (&rfds);
       FD_ZERO (&wfds);
 
-       if (c.t)
-          tty_pre_select (c.t, &rfds, &wfds);
+      if (c.t)
+        tty_pre_select (c.t, &rfds, &wfds);
 
-       if (server_socket) {
-      FD_SET (server_socket->fd, &rfds);
-      clients_pre_select (clients, &rfds, &wfds);
-       }
+      if (server_socket)
+        {
+          FD_SET (server_socket->fd, &rfds);
+          clients_pre_select (clients, &rfds, &wfds);
+        }
 
-       if (client_socket)
-      socket_pre_select (client_socket, &rfds, &wfds);
+      if (client_socket)
+        socket_pre_select (client_socket, &rfds, &wfds);
+
+      if (ansi)
+        tty_pre_select (ansi->terminal, &rfds, &wfds);
 
       select (FD_SETSIZE, &rfds, &wfds, NULL, &tv);
 
-      /*any message from clients, or new connexions*/
-      if (server_socket) {
-      Socket *cs;
-      if (FD_ISSET (server_socket->fd, &rfds) && ((cs = socket_accept (s))))
+      /*any message from clients, or new connexions */
+      if (server_socket)
         {
-          {
-            Client *cl;
-            /*New client connexion */
-            cl = clients_new_client (clients, cs, &c);
+          Socket *new_client_socket;
+          if (FD_ISSET (server_socket->fd, &rfds)
+              && ((new_client_socket = socket_accept (s))))
+            {
+              {
+                Client *new_client;
+                /*New client connexion */
+                new_client =
+                  clients_new_client (clients, new_client_socket, &c);
 
-            send_history (c.h, cl);
-            send_vt102 (c.v, cl);
+                send_history (c.h, new_client);
+                send_vt102 (c.v, new_client);
 
-          }
-        }
+              }
+            }
 
-      clients_post_select (clients, &c, &rfds, &wfds);
-      }
+          clients_post_select (clients, &c, &rfds, &wfds);
+        }
 
-      /*any data from the port*/
+      /*any data from the port */
       if (c.t && FD_ISSET (c.t->rfd, &rfds))
         {
           char buf[IPC_MAX_BUF];
@@ -388,9 +448,33 @@ void mainloop (TTY *tty,Socket *server_socket,Socket *client_socket,Ansi *a,Log
 
 
 
+      /*any data from the server*/
+      if (client_socket)
+        {
+          if (socket_post_select (client_socket, &rfds, &wfds))
+            break;
+
+          while (client_socket->msg)
+            {
+              msg_from_server (client_socket->msg, &c);
+              socket_consume_msg (client_socket);
+            }
+        }
+
+
+      /*update our local screen*/
+      if (ansi)
+        {
+          if (ansi_dispatch (ansi, &c))
+            break;
+
+          ansi_update (ansi, &c);
+        }
     }
 
-  clients_shutdown (clients);
-  terminal_atexit ();
+  if (clients)
+    {
+      clients_shutdown (clients);
+    }
   printf ("QUAT\n");
 }
index e11df1e61db521b3585860ddf23e81de66c3ef13..4b67502d5e74f112466ce25426845c31326089f1 100644 (file)
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.4  2008/02/20 02:11:35  james
+ * *** empty log message ***
+ *
  * Revision 1.3  2008/02/14 02:46:44  james
  * *** empty log message ***
  *
@@ -22,11 +25,57 @@ static char rcsid[] = "$Id$";
  */
 
 #include <sympathy.h>
-#include "client.h"
+#include "mainloop.h"
 
 int
 main (int argc, char *argv[])
 {
+int c;
+extern char *optarg;
+extern int optind, opterr, optopt;
+
+int tflag=0,cflag=0,sflag=0,rflag=0;
+int lflag=0,dflag=0,bflag=0,pflag=0;
+int kflag=0;
+
+int nhistory=200;
+int baud=-1;
+char *rid,*device_path;
+char *socket_path;
+
+while ((c=getopt(argc,argv,"tscr:d:pb:fL:Fk:n:"))!=EOF) {
+switch(c) {
+       case 't':
+               tflag++;
+               break;
+       case 's':
+               sflag++;
+               break;
+       case 'c':
+               cflag++;
+       
+
+
+
+
+
+
+default:
+       usage();
+}
+}
+
+
+
+
+           "sympathy -t      [-l] [-d serialdev|-p] [-b baud] [-f] [-L log]\n"
+           "sympathy -s      [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-F] [-k skt]\n"
+          "                      [-n hlines]\n"
+           "sympathy [-s -c] [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-k skt]\n"
+          "                      [-n hlines]\n"
+           "sympathy -c      [-H] -k skt\n"
+           "sympathy -r id   [-H]\n"
+           "\n"
 
   client ();
 }
index c0b81f376b052fd7a11d3a8f27761b35d7c188ce..f86fa20906148e97e56880e83e0515dfa39e872d 100644 (file)
@@ -10,6 +10,9 @@ static char rcsid[] = "$Id$";
 
 /*
  * $Log$
+ * Revision 1.3  2008/02/20 02:11:35  james
+ * *** empty log message ***
+ *
  * Revision 1.2  2008/02/16 10:58:52  james
  * *** empty log message ***
  *
@@ -24,20 +27,23 @@ usage (void)
 {
 
   fprintf (stderr, "Usage:\n"
-           "sympathy -t      [-l] [-d serialdev|-p] [-b baud] [-h] [-L log]\n"
-           "sympathy -s      [-l] [-d serialdev|-p] [-b baud] [-h] [-L log] [-f] [-k skt]\n"
-           "sympathy [-s -c] [-l] [-d serialdev|-p] [-b baud] [-h] [-L log] [-k skt]\n"
+           "sympathy -t      [-l] [-d serialdev|-p] [-b baud] [-f] [-L log]\n"
+           "sympathy -s      [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-F] [-k skt]\n"
+          "                      [-n hlines]\n"
+           "sympathy [-s -c] [-l] [-d serialdev|-p] [-b baud] [-f] [-L log] [-k skt]\n"
+          "                      [-n hlines]\n"
            "sympathy -c      [-H] -k skt\n"
            "sympathy -r id   [-H]\n"
+           "sympathy -h\n"
            "\n"
            "Main mode:\n"
            "   -t  terminal emulator mode: one process is started which reads from\n"
            "          the serial device or ptty and writes to the users terminal.\n"
-           "   -s  server mode: a process is started (and daemonized unless -f is\n"
+           "   -s  server mode: a process is started (and daemonized unless -F is\n"
            "          given) which listens on a socket, and reads from the serial\n"
            "          device or ptty.\n"
            "   -s -c  server and client mode. Fork a server and connect a client\n"
-           "            incompatible with -f. This is the default mode\n"
+           "            incompatible with -F. This is the default mode\n"
            "   -c     client mode: connect to server mode process\n"
            "   -r id  client mode: connect to server mode process on socket\n"
            "             ~/.sympathy/id\n"
@@ -54,14 +60,17 @@ usage (void)
            "           no -d option is specified\n"
            "   -b baud  the baudrate to set. If omitted sympathy does not set\n"
            "              a baudrate and uses the current setting\n"
-           "   -h  set RTS/CTS flowcontrol. By default sympathy disables flow\n"
+           "   -f  set RTS/CTS flowcontrol. By default sympathy disables flow\n"
            "         control\n"
            "   -k socket  explicity set the name of the socket, by default\n"
            "                sympathy will use ~/.sympathy/$pid\n"
-           "   -f  do not detach, run the server in the foreground\n"
+           "   -F  do not detach, run the server in the foreground\n"
            "   -H  instead of connecting the user's terminal to the session\n"
            "         emit HTML of the current state of the screen on stdout\n"
-           "   -L  log activity on the device to the file log\n");
+           "   -L  log activity on the device to the file log\n"
+          "   -n  hlines  the number of lines of history to store in the\n"
+           "                 server, that are replayed on connexion\n"
+);
 
   exit (1);
 }