X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=apps%2Fmainloop.c;h=25718c48685f55fd183ab7949a9fe32b3c1b4e15;hb=f60aec0020b71eed78aab22f3f16e1ea3ba62d7a;hp=e674b2e06dd61237ba87adcbbe7b8dbc74ffdfeb;hpb=4145f7369d761b32a10309a2623d98e64de7f444;p=sympathy.git diff --git a/apps/mainloop.c b/apps/mainloop.c index e674b2e..25718c4 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -6,10 +6,44 @@ * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = + "$Id$"; /* * $Log$ + * 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 *** + * + * Revision 1.16 2008/02/27 09:42:21 james + * *** empty log message *** + * + * Revision 1.15 2008/02/27 01:31:38 james + * *** empty log message *** + * + * Revision 1.14 2008/02/27 01:31:14 james + * *** empty log message *** + * + * Revision 1.13 2008/02/26 23:56:12 james + * *** empty log message *** + * + * Revision 1.12 2008/02/26 23:23:16 james + * *** empty log message *** + * + * Revision 1.11 2008/02/24 00:43:55 james + * *** empty log message *** + * * Revision 1.10 2008/02/23 13:05:57 staffcvs * *** empty log message *** * @@ -84,8 +118,9 @@ static char rcsid[] = "$Id$"; #include "clients.h" -typedef struct -{ +Context *context; + +typedef struct { int nclients; int lines; int baud; @@ -122,11 +157,10 @@ get_status (TTY * t, Clients * cs) cd = (tty_status.lines & TIOCM_CD) ? 1 : 0; - if (cd != last_cd_state) - { - gettimeofday (&last_cd_edge, NULL); - last_cd_state = cd; - } + if (cd != last_cd_state) { + gettimeofday (&last_cd_edge, NULL); + last_cd_state = cd; + } gettimeofday (&now, NULL); timersub (&now, &last_cd_edge, &dif); @@ -139,45 +173,44 @@ static char * line_to_name (int l) { - switch (l) - { + switch (l) { #ifdef TIOCM_LE - case TIOCM_LE: - return "LE"; + case TIOCM_LE: + return "LE"; #endif #ifdef TIOCM_DTR - case TIOCM_DTR: - return "DTR"; + case TIOCM_DTR: + return "DTR"; #endif #ifdef TIOCM_RTS - case TIOCM_RTS: - return "RTS"; + case TIOCM_RTS: + return "RTS"; #endif #ifdef TIOCM_ST - case TIOCM_ST: - return "ST"; + case TIOCM_ST: + return "ST"; #endif #ifdef TIOCM_SR - case TIOCM_SR: - return "SR"; + case TIOCM_SR: + return "SR"; #endif #ifdef TIOCM_CTS - case TIOCM_CTS: - return "CTS"; + case TIOCM_CTS: + return "CTS"; #endif #ifdef TIOCM_CD - case TIOCM_CD: - return "CD"; + case TIOCM_CD: + return "CD"; #endif #ifdef TIOCM_RI - case TIOCM_RI: - return "RI"; + case TIOCM_RI: + return "RI"; #endif #ifdef TIOCM_DSR - case TIOCM_DSR: - return "DSR"; + case TIOCM_DSR: + return "DSR"; #endif - } + } return "??"; } @@ -199,20 +232,18 @@ log_line_changes (Context * ctx, int old, int new) while (*n) *(ptr++) = *(n++); - while (dif >= c) - { + while (dif >= c) { - if (dif & c) - { - *(ptr++) = ' '; - *(ptr++) = (new & c) ? '+' : '-'; - n = line_to_name (c); - while (*n) - *(ptr++) = *(n++); - } - - c <<= 1; + if (dif & c) { + *(ptr++) = ' '; + *(ptr++) = (new & c) ? '+' : '-'; + n = line_to_name (c); + while (*n) + *(ptr++) = *(n++); } + + c <<= 1; + } *(ptr++) = '>'; *ptr = 0; @@ -273,55 +304,45 @@ check_status (Context * c, Clients * cs) ptr = do_line (ptr, status.lines, TIOCM_RI); ptr = do_line (ptr, status.lines, TIOCM_CD); - if (status.blocked) - { - t = ", Locked"; - while (*t) - *(ptr++) = *(t++); - } - - if (status.crtscts) - { - t = ", Flow"; - while (*t) - *(ptr++) = *(t++); - } - + if (status.blocked) { + t = ", Locked"; + while (*t) + *(ptr++) = *(t++); + } + + if (status.crtscts) { + t = ", Flow"; + while (*t) + *(ptr++) = *(t++); + } #if 0 - if (status.lines & TIOCM_CD) - { - ptr += - sprintf (ptr, ", On %d.%d", status.cd_edge_sec / 60, - status.cd_edge_sec % 60); - } - else - { - ptr += - sprintf (ptr, ", Off %d.%d", status.cd_edge_sec / 60, - status.cd_edge_sec % 60); - } + if (status.lines & TIOCM_CD) { + ptr += + sprintf (ptr, ", On %d.%d", status.cd_edge_sec / 60, + status.cd_edge_sec % 60); + } else { + ptr += + sprintf (ptr, ", Off %d.%d", status.cd_edge_sec / 60, + status.cd_edge_sec % 60); + } #endif ptr += sprintf (ptr, ", %d client%s", status.nclients, (status.nclients == 1) ? "" : "s"); - if (c->tp->biterrs) - { + if (c->tp->biterrs) { - ptr += - sprintf (ptr, ", %d err%s", c->tp->biterrs, - (c->tp->biterrs == 1) ? "" : "s"); + ptr += + sprintf (ptr, ", %d err%s", c->tp->biterrs, + (c->tp->biterrs == 1) ? "" : "s"); - if (c->tp->guessed_baud == -1) - { - ptr += sprintf (ptr, " try higher"); - } - else if (c->tp->guessed_baud > 0) - { - ptr += sprintf (ptr, " try %db", c->tp->guessed_baud); - } + if (c->tp->guessed_baud == -1) { + ptr += sprintf (ptr, " try higher"); + } else if (c->tp->guessed_baud > 0) { + ptr += sprintf (ptr, " try %db", c->tp->guessed_baud); } + } *ptr = 0; @@ -340,198 +361,181 @@ check_status (Context * c, Clients * cs) static int msg_from_server (ANSI * a, IPC_Msg * m, Context * c) { - switch (m->hdr.type) - { + switch (m->hdr.type) { - case IPC_MSG_TYPE_NOOP: - break; - case IPC_MSG_TYPE_DEBUG: + 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; - - if (a->one_shot) - { - a->one_shot (a, &c->v->crt); - return 1; - } - //FIXME HTML hook - break; - case IPC_MSG_TYPE_TERM: - tty_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); + 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; + + if (a->one_shot) { + a->one_shot (a, &c->v->crt); + return 1; } + break; + case IPC_MSG_TYPE_TERM: + tty_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); + } return 0; } void mainloop (TTY * tty, Socket * server_socket, Socket * client_socket, - ANSI * ansi, Log * log, int nhistory) + ANSI * ansi, Log * log, int nhistory, CRT_Pos * size) { fd_set rfds, wfds; Context c = { 0 }; Clients *clients; + context = &c; + c.tp = tty_parser_new (); c.u = utf8_new (); - c.v = vt102_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); - } - else - { - if (!tty) - abort (); - c.t = tty; - c.k = keydis_vt102_new (); - } + if (client_socket) { + if (server_socket) + abort (); + 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; - } + if (ansi) { + c.d = cmd_new (); + } else { + c.d = NULL; + } - if (server_socket) - { - if (client_socket) - abort (); - clients = clients_new (); - } - else - { - clients = NULL; - } + vt102_reset (&c); - for (;;) - { - struct timeval tv = { 0, 250000 }; - if ((c.d) && (c.d->disconnect)) - break; + if (server_socket) { + if (client_socket) + abort (); + clients = clients_new (); + } else { + clients = NULL; + } - /*update the status lines, locally or remotely */ - if (c.t) - check_status (&c, clients); + for (;;) { + struct timeval tv = { 0, 250000 }; - FD_ZERO (&rfds); - FD_ZERO (&wfds); + if ((c.d) && (c.d->disconnect)) + break; - if (c.t) - tty_pre_select (c.t, &rfds, &wfds); + /*update the status lines, locally or remotely */ + if (c.t) + check_status (&c, clients); - if (server_socket) - { - FD_SET (server_socket->fd, &rfds); - clients_pre_select (clients, &rfds, &wfds); - } + FD_ZERO (&rfds); + FD_ZERO (&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 (client_socket) - socket_pre_select (client_socket, &rfds, &wfds); + if (client_socket) + socket_pre_select (client_socket, &rfds, &wfds); - if (ansi && ansi->terminal) - tty_pre_select (ansi->terminal, &rfds, &wfds); + if (ansi && ansi->terminal) + tty_pre_select (ansi->terminal, &rfds, &wfds); - select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); + select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); - /*any message from clients, or new connexions */ - if (server_socket) + /*any message from clients, or new connexions */ + if (server_socket) { + Socket *new_client_socket; + if (FD_ISSET (server_socket->fd, &rfds) + && ((new_client_socket = socket_accept (server_socket)))) { { - Socket *new_client_socket; - if (FD_ISSET (server_socket->fd, &rfds) - && ((new_client_socket = socket_accept (server_socket)))) - { - { - Client *new_client; - /*New client connexion */ - new_client = - 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); + Client *new_client; + /*New client connexion */ + new_client = clients_new_client (clients, new_client_socket, &c); + + send_history (c.h, new_client); + send_vt102 (c.v, new_client); + } + } - /*any data from the port */ - if (c.t && FD_ISSET (c.t->rfd, &rfds)) - { - char buf[IPC_MAX_BUF]; - int red; + clients_post_select (clients, &c, &rfds, &wfds); + } - red = c.t->recv (c.t, buf, sizeof (buf)); + /*any data from the port */ + if (c.t && FD_ISSET (c.t->rfd, &rfds)) { + char buf[IPC_MAX_BUF]; + int red; - if (red < 0) - break; + red = c.t->recv (c.t, buf, sizeof (buf)); - if (red) - { - if (clients) - send_output (clients, buf, red); - tty_parse (&c, buf, red); - } - } + if (red < 0) + break; + if (red) { + if (clients) + send_output (clients, buf, red); + tty_parse (&c, buf, red); + } + } - /*any data from the server */ - if (client_socket) - { - int one_shot; - if (socket_post_select (client_socket, &rfds, &wfds)) - break; - - while (client_socket->msg) - { - if (msg_from_server (ansi, client_socket->msg, &c)) - one_shot++; - - socket_consume_msg (client_socket); - } - if (one_shot) - break; - } + /*any data from the server */ + if (client_socket) { + int one_shot; + if (socket_post_select (client_socket, &rfds, &wfds)) + break; - /*update our local screen */ - if (ansi) - { - if (ansi->dispatch) - ansi->dispatch (ansi, &c); + while (client_socket->msg) { + if (msg_from_server (ansi, client_socket->msg, &c)) + one_shot++; - if (ansi->update) - ansi->update (ansi, &c); - } + socket_consume_msg (client_socket); + } + if (one_shot) + break; + } + + + /*update our local screen */ + if (ansi) { + if (ansi->dispatch) + ansi->dispatch (ansi, &c); + + if (ansi->update) + ansi->update (ansi, &c); } + } if (clients) clients_shutdown (clients);