From db6be819024985738c7e846ce11f40f4fc8d1aa6 Mon Sep 17 00:00:00 2001 From: james Date: Thu, 14 Feb 2008 00:57:58 +0000 Subject: [PATCH] *** empty log message *** --- apps/Makefile.am | 5 +- apps/client.c | 50 ++++++++++++++++++ apps/client.h | 6 +++ apps/clients.c | 125 +++++++++++++++++++++++++++++++++++++++++---- apps/clients.h | 4 +- apps/sympathy.c | 8 ++- apps/sympathyd.c | 42 +++++++++++++--- src/libsympathy.c | 4 +- src/prototypes.h | 8 ++- src/slide.c | 9 +++- src/symsocket.c | 126 +++++++++++++++++++++++++--------------------- src/terminal.c | 5 +- test/test.c | 6 +-- 13 files changed, 314 insertions(+), 84 deletions(-) diff --git a/apps/Makefile.am b/apps/Makefile.am index 6b4d868..f0f5881 100644 --- a/apps/Makefile.am +++ b/apps/Makefile.am @@ -7,6 +7,9 @@ # $Id$ # # $Log$ +# Revision 1.4 2008/02/14 00:57:58 james +# *** empty log message *** +# # Revision 1.3 2008/02/13 18:05:06 james # *** empty log message *** # @@ -26,7 +29,7 @@ noinst_PROGRAMS = sympathyd sympathy noinst_HEADERS=clients.h client.h sympathy_SOURCES = sympathy.c client.c -sympathy_LDADD = ../src/libsympathy.la -lutil +sympathy_LDADD = ../src/libsympathy.a -lutil sympathyd_SOURCES = sympathyd.c clients.c client.c sympathyd_LDADD = ../src/libsympathy.la -lutil diff --git a/apps/client.c b/apps/client.c index e1b650e..54f4c33 100644 --- a/apps/client.c +++ b/apps/client.c @@ -10,8 +10,58 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/13 18:05:06 james * *** empty log message *** * */ +#include +#include "client.h" + +static void client_msg(s) +{ + printf ("%p [%d] %s\n", s->msg, s->msg->hdr.size , s->msg->debug.msg ); + + + +} +void +client (void) +{ + Socket *s; + fd_set rfds, wfds; + + s = socket_connect ("socket"); + + + if (!s) + { + printf ("no socket"); + return; + } + + for (;;) + { + struct timeval tv = { 0, 100000 }; + + + FD_ZERO (&rfds); + FD_ZERO (&wfds); + + socket_pre_select (s, &rfds, &wfds); + + select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); + + socket_post_select (s, &rfds, &wfds); + + while (s->msg) + { + client_msg(s); + socket_consume_msg (s); + } + } + +} diff --git a/apps/client.h b/apps/client.h index 52293d1..1f46781 100644 --- a/apps/client.h +++ b/apps/client.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/13 18:05:06 james * *** empty log message *** * @@ -20,4 +23,7 @@ #ifndef __CLIENT_H__ #define __CLIENT_H__ +void client(void); + + #endif /* __CLIENT_H__ */ diff --git a/apps/clients.c b/apps/clients.c index 234c0ed..6c70e9d 100644 --- a/apps/clients.c +++ b/apps/clients.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/13 18:05:06 james * *** empty log message *** * @@ -19,43 +22,145 @@ static char rcsid[] = "$Id$"; #include "clients.h" -void clients_output (Clients *c, void *_buf, int len) +void +client_free (Client * c) { + if (c->s) + socket_free (c->s); + free (c); + fprintf(stderr,"Client at %p freed\n",c); } -Clients *clients_new(void) +Client * +clients_new_client (Clients * cs, Socket * s, Context * ctx) { + Client *c; + + c = (Client *) malloc (sizeof (Client)); + + c->dead = 0; + c->s = s; + c->next = cs->head; + + cs->head = c; + cs->n++; + fprintf(stderr,"Client at %p created\n",c); -return NULL; + if (ipc_msg_send_debug (s, "new_client")) + c->dead++; + + return c; +} + +void +clients_reap (Clients * cs) +{ + Client **p, *c; + + + for (p = &cs->head; *p;) + { + Client *c = *p; + + if (c->dead) + { + *p = c->next; + client_free (c); + cs->n--; + } + else + { + p = &(c->next); + } + } } -void clients_pre_select (Clients *c, fd_set *rfds, fd_set *wfds) +Clients * +clients_new (void) { + Clients *ret = (Clients *) malloc (sizeof (Clients)); + ret->n = 0; + ret->head = NULL; + return ret; } -void clients_post_select(Clients *c,Context *ctx, fd_set *rfds, fd_set *wfds) +void +clients_pre_select (Clients * cs, fd_set * rfds, fd_set * wfds) { + Client *c; + for (c = cs->head; c; c = c->next) + { + socket_pre_select (c->s, rfds, wfds); + } +} +void +clients_post_select (Clients * cs, Context * ctx, fd_set * rfds, + fd_set * wfds) +{ + Client *c; + int deaded = 0; + + for (c = cs->head; c; c = c->next) + { + if (socket_post_select (c->s, rfds, wfds)) + { + c->dead++; + deaded++; + } + } + + if (deaded) + clients_reap (cs); } -Client * clients_new_client(Clients *c,Socket *s,Context *ctx) +void +clients_output (Clients * cs, void *_buf, int len) { +uint8_t *buf=(uint8_t *) _buf; +Client *c; + +#define DEBUG_MSG_LEN 128 + + char mbuf[sizeof (IPC_Msg_hdr) + DEBUG_MSG_LEN]; + IPC_Msg *m; +int i; + +if (!len) return; + + m = (IPC_Msg *) mbuf; + m->debug.type = IPC_MSG_TYPE_DEBUG; + i=sprintf(m->debug.msg,"buf[0]=%d len=%d",buf[0],len); + m->debug.size = sizeof (IPC_Msg_hdr) + i + 1; + + + + for (c = cs->head; c; c = c->next) + { + if (!c->dead) + if (ipc_msg_send(c->s,m)) + c->dead++; + } -ipc_msg_send_debug(s,"fishsoup"); -socket_free(s); -return NULL; } -void clients_shutdown(Clients *c) +void +clients_shutdown (Clients * cs) { + Client *c; + for (c = cs->head; c; c = c->next) + { + c->dead++; + } + clients_reap (cs); } diff --git a/apps/clients.h b/apps/clients.h index 78ecdc3..da5fd01 100644 --- a/apps/clients.h +++ b/apps/clients.h @@ -12,6 +12,9 @@ /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/13 18:05:06 james * *** empty log message *** * @@ -22,7 +25,6 @@ typedef struct Client_struct { struct Client_struct *next; - Socket *s; int dead; } Client; diff --git a/apps/sympathy.c b/apps/sympathy.c index 8bed929..a9140f8 100644 --- a/apps/sympathy.c +++ b/apps/sympathy.c @@ -10,13 +10,19 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/05 14:25:49 james * *** empty log message *** * */ -#include "sympathy.h" +#include +#include "client.h" int main(int argc,char *argv[]) { + +client(); } diff --git a/apps/sympathyd.c b/apps/sympathyd.c index 2e45ed1..6480713 100644 --- a/apps/sympathyd.c +++ b/apps/sympathyd.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.6 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.5 2008/02/13 18:05:06 james * *** empty log message *** * @@ -32,6 +35,27 @@ static char rcsid[] = "$Id$"; #include "client.h" #include "clients.h" + +static void send_history(History *h,Client *c) +{ +int rptr=h->wptr; + +HISTORY_INC(h,rptr); + +HISTORY_INC(h,rptr); +while (rptr!=h->wptr) +{ +History_ent *l=&h->lines[rptr]; +if (l->valid) { + +if (ipc_msg_send_history(c->s,l)) + c->dead++; + +} +HISTORY_INC(h,rptr); +} +} + int main (int argc,char *argv[]) { fd_set rfds, wfds; @@ -64,21 +88,25 @@ int main (int argc,char *argv[]) FD_ZERO (&wfds); tty_pre_select (c.t, &rfds,&wfds); - tty_pre_select (a.terminal, &rfds,&wfds); + + FD_SET(s->fd,&rfds); socket_pre_select (s, &rfds, &wfds); clients_pre_select (clients,&rfds,&wfds); - select (FD_SETSIZE, &rfds, NULL, NULL, &tv); - - cs = socket_post_select (s, &rfds, &wfds); + select (FD_SETSIZE, &rfds, &wfds, NULL, &tv); - if (cs) + if (FD_ISSET (s->fd, &rfds) && ((cs=socket_accept (s)))) { { + Client *cl; /*New client connexion */ - clients_new_client (clients, cs, &c); + cl=clients_new_client (clients, cs, &c); + + send_history(c.h,cl); + } + } clients_post_select (clients, &c, &rfds, &wfds); @@ -102,6 +130,8 @@ int main (int argc,char *argv[]) ansi_dispatch (&a, &c); ansi_update (&a, &c); + + } clients_shutdown (clients); diff --git a/src/libsympathy.c b/src/libsympathy.c index d05ad13..70cdcfd 100644 --- a/src/libsympathy.c +++ b/src/libsympathy.c @@ -11,6 +11,9 @@ static char rcsid[] = /* * $Log$ + * Revision 1.18 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.17 2008/02/13 16:57:29 james * *** empty log message *** * @@ -66,4 +69,3 @@ static char rcsid[] = */ #include "project.h" - diff --git a/src/prototypes.h b/src/prototypes.h index ee95d30..dc88c14 100644 --- a/src/prototypes.h +++ b/src/prototypes.h @@ -103,6 +103,10 @@ extern void default_termios(struct termios *termios); extern Log *file_log_new(char *fn); /* ipc.c */ extern IPC_Msg *ipc_check_for_message_in_slide(Slide *s); +extern void ipc_consume_message_in_slide(Slide *s); +extern int ipc_msg_send(Socket *s, IPC_Msg *m); +extern int ipc_msg_send_debug(Socket *s, char *msg); +extern int ipc_msg_send_history(Socket *s, History_ent *l); /* slide.c */ extern void slide_free(Slide *s); extern void slide_consume(Slide *s, int n); @@ -114,7 +118,7 @@ extern void socket_free(Socket *s); extern Socket *socket_listen(char *path); extern Socket *socket_accept(Socket *l); extern Socket *socket_connect(char *path); -extern Socket *socket_post_select(Socket *s, fd_set *rfds, fd_set *wfds); extern void socket_consume_msg(Socket *s); extern void socket_pre_select(Socket *s, fd_set *rfds, fd_set *wfds); -extern IPC_Msg *ipc_check_for_message_in_slide(Slide *s); +extern int socket_post_select(Socket *s, fd_set *rfds, fd_set *wfds); +extern int socket_write(Socket *s, void *buf, int len); diff --git a/src/slide.c b/src/slide.c index e20d0be..d032421 100644 --- a/src/slide.c +++ b/src/slide.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/13 16:57:29 james * *** empty log message *** * @@ -37,9 +40,13 @@ void slide_consume (Slide * s, int n) { s->nbytes -= n; + + if (s->nbytes<0) + abort(); + memmove (s->slide, s->slide + n, s->nbytes); - if ((s->size > s->target_size) && (s->nbytes <= s->size)) + if ((s->size > s->target_size) && (s->nbytes <= s->target_size)) { s->size = s->target_size; s->slide = realloc (s->slide, s->size); diff --git a/src/symsocket.c b/src/symsocket.c index fde1b2d..25657db 100644 --- a/src/symsocket.c +++ b/src/symsocket.c @@ -6,10 +6,14 @@ * */ -static char rcsid[] = "$Id$"; +static char rcsid[] = + "$Id$"; /* * $Log$ + * Revision 1.2 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.1 2008/02/13 18:05:06 james * *** empty log message *** * @@ -23,12 +27,16 @@ static char rcsid[] = "$Id$"; #define MAX_TXN 4096 -void socket_free(Socket *s) +void +socket_free (Socket * s) { -if (!s) return; -if (s->read_buf) slide_free(s->read_buf); -if (s->write_buf) slide_free(s->write_buf); -close(s->fd); + if (!s) + return; + if (s->read_buf) + slide_free (s->read_buf); + if (s->write_buf) + slide_free (s->write_buf); + close (s->fd); } @@ -122,7 +130,6 @@ socket_connect (char *path) struct sockaddr_un *sun; Socket *ret; - unlink (path); fd = socket (PF_UNIX, SOCK_STREAM, 0); @@ -157,30 +164,57 @@ socket_connect (char *path) return ret; } +void +socket_consume_msg (Socket * s) +{ + int n; -Socket * -socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds) + if (!s->msg) + return; + + ipc_consume_message_in_slide(s->read_buf); + s->msg = ipc_check_for_message_in_slide (s->read_buf); + +} + +void +socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds) { char buf[1024]; int n; + /*Server socket */ if (SOCKET_IS_LISTENER (s)) { - if (!FD_ISSET (s->fd, rfds)) - return NULL; - - return socket_accept (s); + FD_SET (s->fd, rfds); + return; } + if (!SLIDE_EMPTY (s->write_buf)) + FD_SET (s->fd, wfds); + + if (!SLIDE_FULL (s->read_buf)) + FD_SET (s->fd, rfds); + +} + +int +socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds) +{ + char buf[1024]; + int n; + int error=0; + if ((!SLIDE_EMPTY (s->write_buf)) && FD_ISSET (s->fd, wfds)) { n = (SLIDE_BYTES (s->write_buf) > MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf); - n = write (s->fd, SLIDE_RPTR (s->write_buf), n); + n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n); if (n > 0) slide_consume (s->write_buf, n); + if (n<0) error=-1; } if (!SLIDE_FULL (s->read_buf) && FD_ISSET (s->fd, rfds)) @@ -188,62 +222,40 @@ socket_post_select (Socket * s, fd_set * rfds, fd_set * wfds) n = (SLIDE_SPACE (s->read_buf) > MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf); - n = read (s->fd, SLIDE_RPTR (s->read_buf), n); - + n = wrap_read (s->fd, SLIDE_WPTR (s->read_buf), n); if (n > 0) slide_added (s->read_buf, n); + if (n<0) error=-1; } - if (SLIDE_BYTES (s->read_buf) >= sizeof (IPC_Msg)) - { - s->msg = ipc_check_for_message_in_slide(s->read_buf); - } else { - s->msg=NULL; - } - + s->msg = ipc_check_for_message_in_slide (s->read_buf); - return NULL; + return error; } -void socket_consume_msg(Socket *s) -{ -int n; - -if (!s->msg) return; - -n=s->msg->size; - -slide_consume(s->read_buf,n); - - if (SLIDE_BYTES (s->read_buf) >= sizeof (IPC_Msg)) - { - s->msg = ipc_check_for_message_in_slide(s->read_buf); - } else { - s->msg=NULL; - } - -} -void -socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds) +int +socket_write (Socket * s, void *buf, int len) { - char buf[1024]; int n; - /*Server socket */ - if (SOCKET_IS_LISTENER (s)) - { - FD_SET (s->fd, rfds); - return; - } + slide_expand (s->write_buf, len); + memcpy (SLIDE_WPTR (s->write_buf), buf, len); + slide_added (s->write_buf, len); - if (!SLIDE_EMPTY (s->write_buf)) - FD_SET (s->fd, wfds); + n = + (SLIDE_BYTES (s->write_buf) > + MAX_TXN) ? MAX_TXN : SLIDE_BYTES (s->write_buf); + n = wrap_write (s->fd, SLIDE_RPTR (s->write_buf), n); + { + uint8_t *c=SLIDE_RPTR(s->write_buf); + } - if (!SLIDE_FULL (s->read_buf)) - FD_SET (s->fd, rfds); + if (n > 0) + slide_consume (s->write_buf, n); + + if (n<0) return -1; + return len; } - - diff --git a/src/terminal.c b/src/terminal.c index 03ac5d4..0a75f71 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.6 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.5 2008/02/13 18:05:06 james * *** empty log message *** * @@ -153,7 +156,7 @@ terminal_dispatch (void) terminal_winches = 0; for (t = terminal_list; t; t = t->next) - terminal_getsize ((TTY *)t); + terminal_getsize ((TTY *) t); } diff --git a/test/test.c b/test/test.c index f9b2016..92ffdda 100644 --- a/test/test.c +++ b/test/test.c @@ -10,6 +10,9 @@ static char rcsid[] = "$Id$"; /* * $Log$ + * Revision 1.4 2008/02/14 00:57:58 james + * *** empty log message *** + * * Revision 1.3 2008/02/13 18:05:06 james * *** empty log message *** * @@ -26,9 +29,6 @@ static char rcsid[] = "$Id$"; int main(int argc,char *argv[]) { -ring_test(); -return 0; -testy(); return 0; } -- 2.30.2