From be42afab1c325fae5c3c270876a3447220adcca5 Mon Sep 17 00:00:00 2001 From: james <> Date: Fri, 7 Mar 2008 13:16:02 +0000 Subject: *** empty log message *** --- apps/mainloop.c | 408 ++++++++++++++++++++++++++------------------------------ 1 file changed, 188 insertions(+), 220 deletions(-) (limited to 'apps/mainloop.c') diff --git a/apps/mainloop.c b/apps/mainloop.c index a3697f3..6eec7be 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -1,4 +1,4 @@ -/* +/* * mainloop.c: * * Copyright (c) 2008 James McKenzie , @@ -9,8 +9,11 @@ static char rcsid[] = "$Id$"; -/* +/* * $Log$ + * 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 *** * @@ -172,11 +175,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); @@ -189,45 +191,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 "??"; } @@ -249,20 +250,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; @@ -323,54 +322,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; @@ -390,38 +380,37 @@ 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 ); - 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); - err++; /*Simulate a fatal write error enclosing tty */ - } - break; - case IPC_MSG_TYPE_TERM: - 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); - break; - default: - fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); + 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) + 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); + err++; /* Simulate a fatal write error enclosing tty + */ } + break; + case IPC_MSG_TYPE_TERM: + 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); + break; + default: + fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); + } return err; } @@ -437,151 +426,130 @@ mainloop (Context * c, ANSI * ansi, Socket * server_socket, c->u = utf8_new (); /* 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 (!c->t) - abort (); - c->k = keydis_vt102_new (); - } + if (client_socket) { + if (server_socket) + crash_out("mainloop cannot both be a server and a client"); + c->k = keydis_ipc_new (client_socket); + } else { + 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 (); - } - else - { - c->d = NULL; - } + if (ansi) { + c->d = cmd_new (); + } else { + c->d = NULL; + } vt102_reset (c); - if (server_socket) - { - if (client_socket) - abort (); - clients = clients_new (); - } - else - { - clients = NULL; - } + if (server_socket) { + if (client_socket) + crash_out("mainloop cannot both be a server and a client"); + clients = clients_new (); + } else { + clients = NULL; + } - for (;;) - { - struct timeval tv = { 0, 250000 }; + for (;;) { + struct timeval tv = { 0, 250000 }; - if ((c->d) && (c->d->disconnect)) - break; + 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); + 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 && 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); + + } + } - /*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); - if (tty_parse (c, buf, red)) - break; - } - } + if (red < 0) + break; + if (red) { + if (clients) + send_output (clients, buf, red); + if (tty_parse (c, buf, red)) + break; + } + } - /*any data from the server */ - if (client_socket) - { - int err = 0; - if (socket_post_select (client_socket, &rfds, &wfds)) - break; + /* any data from the server */ + if (client_socket) { + int err = 0; - while (client_socket->msg && !err) - { - err += msg_from_server (ansi, client_socket->msg, c); - socket_consume_msg (client_socket); - } + if (socket_post_select (client_socket, &rfds, &wfds)) + break; - if (err) - break; - } + while (client_socket->msg && !err) { + err += msg_from_server (ansi, client_socket->msg, c); + socket_consume_msg (client_socket); + } + if (err) + break; + } - /*update our local screen */ - if (ansi) - { - if (ansi->dispatch) - if (ansi->dispatch (ansi, c)) - break; - if (ansi->update) - if (ansi->update (ansi, c)) - break; - } + /* update our local screen */ + if (ansi) { + if (ansi->dispatch) + if (ansi->dispatch (ansi, c)) + break; + + if (ansi->update) + if (ansi->update (ansi, c)) + break; } + } if (clients) clients_shutdown (clients); -- cgit v1.2.3