From 77c86f1e81b90ad59726ee3704a479f07c34786b Mon Sep 17 00:00:00 2001 From: james <> Date: Thu, 14 Feb 2008 10:34:30 +0000 Subject: *** empty log message *** --- apps/Makefile.am | 5 +- apps/client.c | 8 ++ apps/clients.c | 86 +++++++++++++++++++-- apps/clients.h | 24 ++++-- apps/sympathyd.c | 229 ++++++++++++++++++++++++++++++++++++++++++++++--------- 5 files changed, 304 insertions(+), 48 deletions(-) (limited to 'apps') diff --git a/apps/Makefile.am b/apps/Makefile.am index b14601c..dd6b433 100644 --- a/apps/Makefile.am +++ b/apps/Makefile.am @@ -7,6 +7,9 @@ # $Id$ # # $Log$ +# Revision 1.6 2008/02/14 10:34:30 james +# *** empty log message *** +# # Revision 1.5 2008/02/14 02:46:44 james # *** empty log message *** # @@ -35,7 +38,7 @@ sympathy_SOURCES = sympathy.c client.c sympathy_LDADD = ../src/libsympathy.a -lutil sympathyd_SOURCES = sympathyd.c clients.c client.c -sympathyd_LDADD = ../src/libsympathy.la -lutil +sympathyd_LDADD = ../src/libsympathy.a -lutil AM_CFLAGS=-g -Werror diff --git a/apps/client.c b/apps/client.c index 90bcf60..28526f2 100644 --- a/apps/client.c +++ b/apps/client.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.4 2008/02/14 10:34:30 james + * *** empty log message *** + * * Revision 1.3 2008/02/14 02:46:44 james * *** empty log message *** * @@ -24,6 +27,8 @@ static char rcsid[] = "$Id$"; #include #include "client.h" + //vt102_status_line (v, "VT102 foo bar baz I'm the urban spaceman baby"); + static void server_msg (IPC_Msg * m, Context * c) { @@ -47,6 +52,9 @@ server_msg (IPC_Msg * m, Context * c) case IPC_MSG_TYPE_TERM: vt102_parse (c, m->term.term, m->term.len); break; + case IPC_MSG_TYPE_STATUS: + vt102_status_line(c->v,m->status.status); + break; default: fprintf (stderr, "Unhandeled message type %d\n", m->hdr.type); } diff --git a/apps/clients.c b/apps/clients.c index b5bafcd..cd7bcee 100644 --- a/apps/clients.c +++ b/apps/clients.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.4 2008/02/14 10:34:30 james + * *** empty log message *** + * * Revision 1.3 2008/02/14 02:46:44 james * *** empty log message *** * @@ -148,8 +151,61 @@ clients_post_select (Clients * cs, Context * ctx, fd_set * rfds, clients_reap (cs); } + +void +clients_shutdown (Clients * cs) +{ + Client *c; + + for (c = cs->head; c; c = c->next) + { + c->dead++; + } + + + clients_reap (cs); +} + + + + + + int -clients_output (Clients * cs, void *buf, int len) +send_status (Clients * cs, char *msg) +{ + char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_status)]; + IPC_Msg_status *m = (IPC_Msg_status *) mbuf; + int len; + + Client *c; + + if (!msg) return; + len=strlen(msg)+1; + + if (!len) + return; + if (len > IPC_MAX_BUF) + len = IPC_MAX_BUF; + + m->size = len + sizeof (IPC_Msg_status); + m->type = IPC_MSG_TYPE_STATUS; + strncpy(m->status,msg, IPC_MAX_BUF); + m->status[IPC_MAX_BUF-1]=0; + + for (c = cs->head; c; c = c->next) + { + if (!c->dead) + if (ipc_msg_send (c->s, (IPC_Msg *) m)) + c->dead++; + } + + return len; +} + + +int +send_output (Clients * cs, void *buf, int len) { char mbuf[IPC_MAX_BUF + sizeof (IPC_Msg_term)]; IPC_Msg_term *m = (IPC_Msg_term *) mbuf; @@ -178,15 +234,33 @@ clients_output (Clients * cs, void *buf, int len) } void -clients_shutdown (Clients * cs) +send_history (History * h, Client * c) { - Client *c; + int rptr = h->wptr; - for (c = cs->head; c; c = c->next) + HISTORY_INC (h, rptr); + + HISTORY_INC (h, rptr); + while (rptr != h->wptr) { - c->dead++; + History_ent *l = &h->lines[rptr]; + if (l->valid) + { + + if (ipc_msg_send_history (c->s, l)) + c->dead++; + + } + HISTORY_INC (h, rptr); } +} +void +send_vt102 (VT102 * v, Client * c) +{ + if (ipc_msg_send_vt102 (c->s, v)) + c->dead++; - clients_reap (cs); } + + diff --git a/apps/clients.h b/apps/clients.h index c59a521..605b3cd 100644 --- a/apps/clients.h +++ b/apps/clients.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.4 2008/02/14 10:34:30 james + * *** empty log message *** + * * Revision 1.3 2008/02/14 02:46:44 james * *** empty log message *** * @@ -40,11 +43,18 @@ typedef struct } Clients; -extern Clients *clients_new (void); -extern void clients_pre_select (Clients *, fd_set *, fd_set *); -extern void clients_post_select (Clients *, Context *, fd_set *, fd_set *); -extern Client *clients_new_client (Clients *, Socket *, Context *); -extern void clients_shutdown (Clients *); -extern int clients_output (Clients *, void *, int); +/* clients.c */ +extern void client_free(Client *c); +extern Client *clients_new_client(Clients *cs, Socket *s, Context *ctx); +extern void clients_reap(Clients *cs); +extern Clients *clients_new(void); +extern void clients_pre_select(Clients *cs, fd_set *rfds, fd_set *wfds); +extern void clients_post_select(Clients *cs, Context *ctx, fd_set *rfds, fd_set *wfds); +extern void clients_shutdown(Clients *cs); + +extern int send_output(Clients *cs, void *buf, int len); +extern int send_status(Clients *cs, char *msg); +extern void send_history(History *h, Client *c); +extern void send_vt102(VT102 *v, Client *c); -#endif /* __CLIENTS_H__ */ +#endif diff --git a/apps/sympathyd.c b/apps/sympathyd.c index 8f45ca5..49dd312 100644 --- a/apps/sympathyd.c +++ b/apps/sympathyd.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.8 2008/02/14 10:34:30 james + * *** empty log message *** + * * Revision 1.7 2008/02/14 02:46:44 james * *** empty log message *** * @@ -34,47 +37,219 @@ static char rcsid[] = * */ +#include #include #include "client.h" #include "clients.h" +typedef struct +{ + int nclients; + int lines; + int baud; + int crtscts; + int cd_edge_sec; + int bootstrap; +} Status; + +static Status +get_status (TTY * t, Clients * cs) +{ + static struct timeval last_cd_edge = { 0 }; + static int last_cd_state = -1; + int cd; + struct timeval now, dif; + + TTY_Status tty_status = { 0 }; + Status status; + + tty_get_status (t, &tty_status); + + status.bootstrap = 1; + status.nclients = cs->n; + status.lines = tty_status.lines; + status.baud = tty_status.baud; + status.crtscts = (tty_status.termios.c_cflag & CRTSCTS) ? 1 : 0; + + cd = (tty_status.lines & TIOCM_CD) ? 1 : 0; + + if (cd != last_cd_state) + { + gettimeofday (&last_cd_edge, NULL); + last_cd_state = cd; + } + + gettimeofday (&now, NULL); + timersub (&now, &last_cd_edge, &dif); + status.cd_edge_sec = dif.tv_sec; + + return status; +} + +static char * +line_to_name (int l) +{ + + switch (l) + { +#ifdef TIOCM_LE + case TIOCM_LE: + return "LE"; +#endif +#ifdef TIOCM_DTR + case TIOCM_DTR: + return "DTR"; +#endif +#ifdef TIOCM_RTS + case TIOCM_RTS: + return "RTS"; +#endif +#ifdef TIOCM_ST + case TIOCM_ST: + return "ST"; +#endif +#ifdef TIOCM_SR + case TIOCM_SR: + return "SR"; +#endif +#ifdef TIOCM_CTS + case TIOCM_CTS: + return "CTS"; +#endif +#ifdef TIOCM_CD + case TIOCM_CD: + return "CD"; +#endif +#ifdef TIOCM_RI + case TIOCM_RI: + return "RI"; +#endif +#ifdef TIOCM_DSR + case TIOCM_DSR: + return "DSR"; +#endif + } + return "??"; +} static void -send_history (History * h, Client * c) +log_line_changes (Context * ctx, int old, int new) { - int rptr = h->wptr; + int dif = old ^ new; + int c = 1; + char buf[1024], *ptr = buf; + char *n; - HISTORY_INC (h, rptr); + if (!dif) + return; + if (!ctx->l) + return; - HISTORY_INC (h, rptr); - while (rptr != h->wptr) - { - History_ent *l = &h->lines[rptr]; - if (l->valid) - { + n = "s, l)) - c->dead++; + while (*n) + *(ptr++) = *(n++); + + while (dif >= c) + { + if (dif & c) + { + *(ptr++) = ' '; + *(ptr++) = (new & c) ? '+' : '-'; + n = line_to_name (c); + while (*n) + *(ptr++) = *(n++); } - HISTORY_INC (h, rptr); + + c <<= 1; } + *(ptr++) = '>'; + *ptr = 0; + + + ctx->l->log (ctx->l, buf); + } +static char * +do_line (char *ptr,int lines, int line) +{ + char *lname; + + if (!(lines & line)) + return ptr; + lname = line_to_name (line); + + while (*lname) + *(ptr++) = *(lname++); + + return ptr; +} + + + static void -send_vt102 (VT102 * v, Client * c) +check_status (Context * c, Clients * cs) { - if (ipc_msg_send_vt102 (c->s, v)) - c->dead++; + static Status old_status = { 0 }; + Status status; + char buf[1024]; + char *ptr = buf; + char *t; + + status = get_status (c->t, cs); + if (!memcmp (&status, &old_status, sizeof (status))) + return; + old_status = status; + + + log_line_changes (c, old_status.lines, status.lines); + + t=c->t->name; + if (!strncmp(t,"/dev/",5)) t+=5; + while (*t) + *(ptr++) = *(t++); + ptr += sprintf (ptr, " %db", status.baud); + + ptr = do_line (ptr, status.lines, TIOCM_RTS); + ptr = do_line (ptr, status.lines, TIOCM_CTS); + ptr = do_line (ptr, status.lines, TIOCM_DTR); + ptr = do_line (ptr, status.lines, TIOCM_DSR); + ptr = do_line (ptr, status.lines, TIOCM_RI); + + if (status.crtscts) { + t=", Flow"; + while (*t) + *(ptr++) = *(t++); + } + + 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); + } + + ptr += sprintf (ptr, ", %d client%s", status.nclients,(status.nclients==1) ? "":"s"); + + *ptr = 0; + + send_status (cs, buf); } int main (int argc, char *argv[]) { fd_set rfds, wfds; -// ANSI a = { 0 }; Context c; Socket *s, *cs; Clients *clients; @@ -88,26 +263,19 @@ main (int argc, char *argv[]) c.l = file_log_new ("log"); c.k = keydis_vt102_new (&c); -#if 0 - terminal_register_handlers (); - a.terminal = terminal_open (0, 1); - - ansi_reset (&a, NULL); -#endif clients = clients_new (); for (;;) { - struct timeval tv = { 10, 0 }; + struct timeval tv = { 1, 0 }; + + check_status (&c, clients); FD_ZERO (&rfds); FD_ZERO (&wfds); tty_pre_select (c.t, &rfds, &wfds); -#if 0 - tty_pre_select (a.terminal, &rfds, &wfds); -#endif FD_SET (s->fd, &rfds); @@ -145,23 +313,16 @@ main (int argc, char *argv[]) if (red) { - clients_output (clients, buf, red); + send_output (clients, buf, red); vt102_parse (&c, buf, red); } } -#if 0 - ansi_dispatch (&a, &c); - ansi_update (&a, &c); -#endif } clients_shutdown (clients); -#if 0 - ansi_terminal_reset (&a); -#endif terminal_atexit (); printf ("QUAT\n"); } -- cgit v1.2.3