From cd414751eb1367ac4d0da57630785fed7389d982 Mon Sep 17 00:00:00 2001 From: james Date: Thu, 14 Feb 2008 10:34:30 +0000 Subject: [PATCH] *** empty log message *** --- apps/client.c | 8 ++ apps/clients.c | 86 +++++++++++++++++++-- apps/clients.h | 24 ++++-- apps/sympathyd.c | 25 ++++--- src/tty.c | 189 +++++++++++++++++++++++++++++++++++++++++++++++ src/tty.h | 9 +++ 6 files changed, 319 insertions(+), 22 deletions(-) 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 49dd312..352b6a9 100644 --- a/apps/sympathyd.c +++ b/apps/sympathyd.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.9 2008/02/14 10:34:47 james + * *** empty log message *** + * * Revision 1.8 2008/02/14 10:34:30 james * *** empty log message *** * @@ -174,7 +177,7 @@ log_line_changes (Context * ctx, int old, int new) } static char * -do_line (char *ptr,int lines, int line) +do_line (char *ptr, int lines, int line) { char *lname; @@ -207,8 +210,9 @@ check_status (Context * c, Clients * cs) log_line_changes (c, old_status.lines, status.lines); - t=c->t->name; - if (!strncmp(t,"/dev/",5)) t+=5; + t = c->t->name; + if (!strncmp (t, "/dev/", 5)) + t += 5; while (*t) *(ptr++) = *(t++); @@ -220,12 +224,13 @@ check_status (Context * c, Clients * cs) 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.crtscts) + { + t = ", Flow"; + while (*t) + *(ptr++) = *(t++); } - + if (status.lines & TIOCM_CD) { ptr += @@ -239,7 +244,9 @@ check_status (Context * c, Clients * cs) status.cd_edge_sec % 60); } - ptr += sprintf (ptr, ", %d client%s", status.nclients,(status.nclients==1) ? "":"s"); + ptr += + sprintf (ptr, ", %d client%s", status.nclients, + (status.nclients == 1) ? "" : "s"); *ptr = 0; diff --git a/src/tty.c b/src/tty.c index ca4936b..fb60246 100644 --- a/src/tty.c +++ b/src/tty.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.7 2008/02/14 10:34:30 james + * *** empty log message *** + * * Revision 1.6 2008/02/13 16:59:34 james * *** empty log message *** * @@ -27,12 +30,198 @@ static char rcsid[] = "$Id$"; #include "project.h" +static int +speed_t_to_baud (speed_t s) +{ + switch (s) + { +#ifdef B0 + case B0: + return 0; +#endif +#ifdef B50 + case B50: + return 50; +#endif +#ifdef B75 + case B75: + return 75; +#endif +#ifdef B110 + case B110: + return 110; +#endif +#ifdef B134 + case B134: + return 134; +#endif +#ifdef B150 + case B150: + return 150; +#endif +#ifdef B200 + case B200: + return 200; +#endif +#ifdef B300 + case B300: + return 300; +#endif +#ifdef B600 + case B600: + return 600; +#endif +#ifdef B1200 + case B1200: + return 1200; +#endif +#ifdef B1800 + case B1800: + return 1800; +#endif +#ifdef B2400 + case B2400: + return 2400; +#endif +#ifdef B4800 + case B4800: + return 4800; +#endif +#ifdef B9600 + case B9600: + return 9600; +#endif +#ifdef B19200 + case B19200: + return 19200; +#endif +#ifdef B38400 + case B38400: + return 38400; +#endif +#ifdef B57600 + case B57600: + return 57600; +#endif +#ifdef B115200 + case B115200: + return 115200; +#endif +#ifdef B230400 + case B230400: + return 230400; +#endif + } + + return -1; +} + +static speed_t +baud_to_speed_t (int baud) +{ + switch (baud) + { +#ifdef B0 + case 0: + return B0; +#endif +#ifdef B50 + case 50: + return B50; +#endif +#ifdef B75 + case 75: + return B75; +#endif +#ifdef B110 + case 110: + return B110; +#endif +#ifdef B134 + case 134: + return B134; +#endif +#ifdef B150 + case 150: + return B150; +#endif +#ifdef B200 + case 200: + return B200; +#endif +#ifdef B300 + case 300: + return B300; +#endif +#ifdef B600 + case 600: + return B600; +#endif +#ifdef B1200 + case 1200: + return B1200; +#endif +#ifdef B1800 + case 1800: + return B1800; +#endif +#ifdef B2400 + case 2400: + return B2400; +#endif +#ifdef B4800 + case 4800: + return B4800; +#endif +#ifdef B9600 + case 9600: + return B9600; +#endif +#ifdef B19200 + case 19200: + return B19200; +#endif +#ifdef B38400 + case 38400: + return B38400; +#endif +#ifdef B57600 + case 57600: + return B57600; +#endif +#ifdef B115200 + case 115200: + return B115200; +#endif +#ifdef B230400 + case 230400: + return B230400; +#endif + } + return -1; +} + void tty_pre_select (TTY * t, fd_set * rfds, fd_set * wfds) { FD_SET (t->rfd, rfds); } +int +tty_get_status (TTY * t, TTY_Status * s) +{ + + s->lines=0; + ioctl (t->rfd, TIOCMGET, &s->lines); + + if (tcgetattr (t->rfd, &s->termios)) + return -1; + + s->baud=speed_t_to_baud(cfgetispeed(&s->termios)); + + return 0; +} + #if 0 int tty_post_select (Context * c, fd_set * rfds, fd_set * wfds) diff --git a/src/tty.h b/src/tty.h index 91b14c6..5286c28 100644 --- a/src/tty.h +++ b/src/tty.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.6 2008/02/14 10:34:30 james + * *** empty log message *** + * * Revision 1.5 2008/02/13 09:12:21 james * *** empty log message *** * @@ -46,4 +49,10 @@ typedef struct TTY_struct TTY_SIGNATURE; } TTY; +typedef struct { + int lines; + struct termios termios; + int baud; +} TTY_Status; + #endif /* __TTY_H__ */ -- 2.30.2