diff options
Diffstat (limited to 'apps/mainloop.c')
-rw-r--r-- | apps/mainloop.c | 400 |
1 files changed, 219 insertions, 181 deletions
diff --git a/apps/mainloop.c b/apps/mainloop.c index fe9fa50..5237bfe 100644 --- a/apps/mainloop.c +++ b/apps/mainloop.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * 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 *** * @@ -152,7 +155,8 @@ static char rcsid[] = #include "clients.h" -typedef struct { +typedef struct +{ int nclients; int lines; int baud; @@ -189,10 +193,11 @@ 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); @@ -205,44 +210,45 @@ 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 "??"; } @@ -264,18 +270,20 @@ 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++); - } + if (dif & c) + { + *(ptr++) = ' '; + *(ptr++) = (new & c) ? '+' : '-'; + n = line_to_name (c); + while (*n) + *(ptr++) = *(n++); + } - c <<= 1; - } + c <<= 1; + } *(ptr++) = '>'; *ptr = 0; @@ -336,45 +344,54 @@ 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; @@ -394,37 +411,39 @@ 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) - 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 + 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); } - 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; } @@ -440,130 +459,149 @@ 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) - 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 (); - } + 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) - crash_out ("mainloop cannot both be a server and a client"); - 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) { - Socket *new_client_socket; - if (FD_ISSET (server_socket->fd, &rfds) - && ((new_client_socket = socket_accept (server_socket)))) { + /* any message from clients, or new connexions */ + if (server_socket) { - Client *new_client; - /* New client connexion */ - new_client = clients_new_client (clients, new_client_socket, c); + 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); + } + } + + 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)) + { + char buf[IPC_MAX_BUF]; + int red; - /* 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; - if (red < 0) - break; - - if (red) { - if (clients) - send_output (clients, buf, red); - if (tty_parse (c, buf, red)) - 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; + /* any data from the server */ + if (client_socket) + { + int err = 0; - if (socket_post_select (client_socket, &rfds, &wfds)) - break; + if (socket_post_select (client_socket, &rfds, &wfds)) + break; - while (client_socket->msg && !err) { - err += msg_from_server (ansi, client_socket->msg, c); - socket_consume_msg (client_socket); - } + while (client_socket->msg && !err) + { + err += msg_from_server (ansi, client_socket->msg, c); + socket_consume_msg (client_socket); + } - if (err) - break; - } + if (err) + break; + } - /* update our local screen */ - if (ansi) { - if (ansi->dispatch) - if (ansi->dispatch (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 (ansi->update) + if (ansi->update (ansi, c)) + break; + } } - } if (clients) clients_shutdown (clients, c); |