X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=apps%2Fmainloop.c;h=beffbbdbaf44cca52590e69d0b1cba807ddec186;hb=32762931a77913e0363cc909df40f7e91c1d8406;hp=e9c299cd4d8d620fd3d2ed20af2d2be1cf92e88a;hpb=ef165de929f001e59ca869ea3913d1e3e9333fc2;p=sympathy.git diff --git a/apps/mainloop.c b/apps/mainloop.c index e9c299c..beffbbd 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -1,16 +1,64 @@ -/* +/* * mainloop.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ static char rcsid[] = - "$Id$"; + "$Id: mainloop.c,v 1.33 2008/05/09 12:35:57 james Exp $"; -/* - * $Log$ +/* + * $Log: mainloop.c,v $ + * Revision 1.33 2008/05/09 12:35:57 james + * *** empty log message *** + * + * Revision 1.32 2008/03/11 17:56:50 james + * *** empty log message *** + * + * Revision 1.31 2008/03/11 17:56:04 james + * *** empty log message *** + * + * Revision 1.30 2008/03/11 17:47:24 james + * *** empty log message *** + * + * Revision 1.29 2008/03/10 11:49:32 james + * *** empty log message *** + * + * Revision 1.28 2008/03/07 13:56:39 james + * *** empty log message *** + * + * Revision 1.27 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.26 2008/03/06 21:34:09 james + * *** empty log message *** + * + * Revision 1.25 2008/03/06 21:33:02 james + * *** empty log message *** + * + * Revision 1.24 2008/03/06 16:49:39 james + * *** empty log message *** + * + * Revision 1.23 2008/03/06 16:49:05 james + * *** empty log message *** + * + * Revision 1.22 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.21 2008/03/02 10:27:24 james + * *** empty log message *** + * + * Revision 1.20 2008/02/28 16:57:51 james + * *** empty log message *** + * + * Revision 1.19 2008/02/28 16:37:16 james + * *** empty log message *** + * + * Revision 1.18 2008/02/28 11:27:48 james + * *** empty log message *** + * * Revision 1.17 2008/02/27 09:42:53 james * *** empty log message *** * @@ -106,7 +154,6 @@ static char rcsid[] = #include "clients.h" -Context *context; typedef struct { @@ -310,7 +357,6 @@ check_status (Context * c, Clients * cs) while (*t) *(ptr++) = *(t++); } - #if 0 if (status.lines & TIOCM_CD) { @@ -364,32 +410,33 @@ check_status (Context * c, Clients * cs) static int msg_from_server (ANSI * a, IPC_Msg * m, Context * c) { + int err = 0; 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 ); + // 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 (); + crash_out ("sizeof(VT102) differs in client and server"); *(c->v) = m->vt102.vt102; if (a->one_shot) { a->one_shot (a, &c->v->crt); - return 1; + err++; /* Simulate a fatal write error enclosing tty + */ } - //FIXME HTML hook break; case IPC_MSG_TYPE_TERM: - tty_parse (c, m->term.term, m->term.len); + err += tty_parse (c, m->term.term, m->term.len); break; case IPC_MSG_TYPE_STATUS: cmd_new_status (c->d, c, m->status.status); @@ -397,57 +444,53 @@ msg_from_server (ANSI * a, IPC_Msg * m, Context * c) default: fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); } - return 0; + return err; } void -mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, - ANSI * ansi, Log * log, int nhistory, CRT_Pos * size) +mainloop (Context * c, ANSI * ansi, Socket * server_socket, + Socket * client_socket) { fd_set rfds, wfds; - Context c = { 0 }; Clients *clients; - context = &c; + c->tp = tty_parser_new (); + c->u = utf8_new (); - c.tp = tty_parser_new (); - c.u = utf8_new (); - - c.v = vt102_new (size); - c.h = history_new (nhistory); - c.l = log; /* are we being fed by a tty or a socket */ if (client_socket) { if (server_socket) - abort (); - c.k = keydis_ipc_new (client_socket); + crash_out ("mainloop cannot both be a server and a client"); + c->k = keydis_ipc_new (client_socket); } else { - if (!tty) - abort (); - c.t = tty; - c.k = keydis_vt102_new (); + if (!c->t) + crash_out ("mainloop must have either a client_socket or a terminal"); + 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 (); + c->d = cmd_new (); } else { - c.d = NULL; + c->d = NULL; } + vt102_reset (c); + + if (server_socket) { if (client_socket) - abort (); + crash_out ("mainloop cannot both be a server and a client"); clients = clients_new (); } else @@ -459,18 +502,18 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, { struct timeval tv = { 0, 250000 }; - if ((c.d) && (c.d->disconnect)) + if ((c->d) && (c->d->disconnect)) break; - /*update the status lines, locally or remotely */ - if (c.t) - check_status (&c, clients); + /* update the status lines, locally or remotely */ + if (c->t) + 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) { @@ -486,7 +529,7 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); - /*any message from clients, or new connexions */ + /* any message from clients, or new connexions */ if (server_socket) { Socket *new_client_socket; @@ -495,26 +538,24 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, { { Client *new_client; - /*New client connexion */ + /* New client connexion */ new_client = - clients_new_client (clients, new_client_socket, &c); + clients_new_client (clients, new_client_socket, c); - 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 */ - if (c.t && FD_ISSET (c.t->rfd, &rfds)) + /* any data from the port */ + if (c->t && FD_ISSET (c->t->rfd, &rfds)) { char buf[IPC_MAX_BUF]; int red; - red = c.t->recv (c.t, buf, sizeof (buf)); + red = c->t->recv (c->t, buf, sizeof (buf)); if (red < 0) break; @@ -523,42 +564,46 @@ mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, { if (clients) send_output (clients, buf, red); - tty_parse (&c, buf, red); + if (tty_parse (c, buf, red)) + break; } } - /*any data from the server */ + /* any data from the server */ if (client_socket) { - int one_shot; + int err = 0; + if (socket_post_select (client_socket, &rfds, &wfds)) break; - while (client_socket->msg) + while (client_socket->msg && !err) { - if (msg_from_server (ansi, client_socket->msg, &c)) - one_shot++; - + err += msg_from_server (ansi, client_socket->msg, c); socket_consume_msg (client_socket); } - if (one_shot) + + if (err) break; } - /*update our local screen */ + /* update our local screen */ if (ansi) { if (ansi->dispatch) - ansi->dispatch (ansi, &c); + if (ansi->dispatch (ansi, c)) + break; if (ansi->update) - ansi->update (ansi, &c); + if (ansi->update (ansi, c)) + break; } } if (clients) - clients_shutdown (clients); + clients_shutdown (clients, c); + log_f (c->l, ""); }