aboutsummaryrefslogtreecommitdiffstats
path: root/apps/mainloop.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/mainloop.c')
-rw-r--r--apps/mainloop.c204
1 files changed, 144 insertions, 60 deletions
diff --git a/apps/mainloop.c b/apps/mainloop.c
index e3d2190..f515478 100644
--- a/apps/mainloop.c
+++ b/apps/mainloop.c
@@ -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");
}