X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsymsocket.c;h=05b6e3e66039407096fc712cfc438d1ca03ecf57;hb=a17e36f776907ddb4f582912243f5359d6e43107;hp=25657db7c8a4bc2fd39b4dcc7a68db3c363bcabe;hpb=db6be819024985738c7e846ce11f40f4fc8d1aa6;p=sympathy.git diff --git a/src/symsocket.c b/src/symsocket.c index 25657db..05b6e3e 100644 --- a/src/symsocket.c +++ b/src/symsocket.c @@ -1,16 +1,49 @@ -/* +/* * symsocket.c: * - * Copyright (c) 2008 James McKenzie , + * Copyright (c) 2008 James McKenzie , * All rights reserved. * */ static char rcsid[] = - "$Id$"; + "$Id: symsocket.c,v 1.13 2008/03/07 14:13:40 james Exp $"; -/* - * $Log$ +/* + * $Log: symsocket.c,v $ + * Revision 1.13 2008/03/07 14:13:40 james + * *** empty log message *** + * + * Revision 1.12 2008/03/07 13:16:02 james + * *** empty log message *** + * + * Revision 1.11 2008/03/07 12:37:04 james + * *** empty log message *** + * + * Revision 1.10 2008/03/03 18:16:16 james + * *** empty log message *** + * + * Revision 1.9 2008/03/03 18:15:19 james + * *** empty log message *** + * + * Revision 1.8 2008/03/03 06:04:42 james + * *** empty log message *** + * + * Revision 1.7 2008/03/02 10:37:56 james + * *** empty log message *** + * + * Revision 1.6 2008/02/27 00:27:22 james + * *** empty log message *** + * + * Revision 1.5 2008/02/20 22:54:22 staffcvs + * *** empty log message *** + * + * Revision 1.4 2008/02/20 18:31:53 james + * *** empty log message *** + * + * Revision 1.3 2008/02/14 02:46:44 james + * *** empty log message *** + * * Revision 1.2 2008/02/14 00:57:58 james * *** empty log message *** * @@ -23,9 +56,41 @@ static char rcsid[] = #include #include -#define BUF_SIZE 16384 +#define BUF_SIZE 65536 #define MAX_TXN 4096 +int +wrap_recv (int fd, void *buf, int len) +{ + int red; + + red = recv (fd, buf, len, 0); + if (!red) + return -1; + + if ((red < 0) && (errno == EAGAIN)) + red = 0; + + return red; +} + +int +wrap_send (int fd, void *buf, int len) +{ + int writ; + + errno = 0; + + writ = send (fd, buf, len, MSG_NOSIGNAL); + + if (!writ) + return -1; + + if ((writ < 0) && (errno == EAGAIN)) + writ = 0; + + return writ; +} void socket_free (Socket * s) @@ -36,7 +101,28 @@ socket_free (Socket * s) slide_free (s->read_buf); if (s->write_buf) slide_free (s->write_buf); + if (s->path_to_unlink) { + unlink (s->path_to_unlink); + free (s->path_to_unlink); + } + close (s->fd); + free (s); +} + +void +socket_free_parent (Socket * s) +{ + if (!s) + return; + if (s->read_buf) + slide_free (s->read_buf); + if (s->write_buf) + slide_free (s->write_buf); + if (s->path_to_unlink) + free (s->path_to_unlink); close (s->fd); + + free (s); } @@ -57,35 +143,34 @@ socket_listen (char *path) return NULL; n = strlen (path) + sizeof (struct sockaddr_un); - sun = (struct sockaddr_un *) malloc (n); + sun = (struct sockaddr_un *) xmalloc (n); memset (sun, 0, n); sun->sun_family = AF_UNIX; strcpy (sun->sun_path, path); - if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0) - { - free (sun); - close (fd); - return NULL; - } + if (bind (fd, (struct sockaddr *) sun, SUN_LEN (sun)) < 0) { + free (sun); + close (fd); + return NULL; + } free (sun); - if (listen (fd, 5) < 0) - { - close (fd); - return NULL; - } + if (listen (fd, 5) < 0) { + close (fd); + return NULL; + } set_nonblocking (fd); - ret = (Socket *) malloc (sizeof (Socket)); + ret = (Socket *) xmalloc (sizeof (Socket)); memset (ret, 0, sizeof (Socket)); ret->read_buf = NULL; ret->write_buf = NULL; ret->fd = fd; + ret->path_to_unlink = strdup (path); return ret; @@ -107,7 +192,7 @@ socket_accept (Socket * l) return NULL; - ret = (Socket *) malloc (sizeof (Socket)); + ret = (Socket *) xmalloc (sizeof (Socket)); memset (ret, 0, sizeof (Socket)); set_nonblocking (fd); @@ -121,7 +206,7 @@ socket_accept (Socket * l) } -/*Blocking for now*/ +/* Blocking for now */ Socket * socket_connect (char *path) { @@ -137,24 +222,23 @@ socket_connect (char *path) return NULL; n = strlen (path) + sizeof (struct sockaddr_un); - sun = (struct sockaddr_un *) malloc (n); + sun = (struct sockaddr_un *) xmalloc (n); memset (sun, 0, n); sun->sun_family = AF_UNIX; strcpy (sun->sun_path, path); - if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun))) - { - free (sun); - close (fd); - return NULL; - } + if (connect (fd, (struct sockaddr *) sun, SUN_LEN (sun))) { + free (sun); + close (fd); + return NULL; + } free (sun); set_nonblocking (fd); - ret = (Socket *) malloc (sizeof (Socket)); + ret = (Socket *) xmalloc (sizeof (Socket)); memset (ret, 0, sizeof (Socket)); ret->fd = fd; @@ -164,6 +248,7 @@ socket_connect (char *path) return ret; } + void socket_consume_msg (Socket * s) { @@ -172,7 +257,7 @@ socket_consume_msg (Socket * s) if (!s->msg) return; - ipc_consume_message_in_slide(s->read_buf); + ipc_consume_message_in_slide (s->read_buf); s->msg = ipc_check_for_message_in_slide (s->read_buf); } @@ -183,12 +268,11 @@ socket_pre_select (Socket * s, fd_set * rfds, fd_set * wfds) char buf[1024]; int n; - /*Server socket */ - if (SOCKET_IS_LISTENER (s)) - { - FD_SET (s->fd, rfds); - return; - } + /* Server socket */ + if (SOCKET_IS_LISTENER (s)) { + FD_SET (s->fd, rfds); + return; + } if (!SLIDE_EMPTY (s->write_buf)) FD_SET (s->fd, wfds); @@ -203,30 +287,30 @@ 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 = 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)) - { - n = - (SLIDE_SPACE (s->read_buf) > - MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf); - 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; - } + 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 = wrap_send (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)) { + n = + (SLIDE_SPACE (s->read_buf) > + MAX_TXN) ? MAX_TXN : SLIDE_SPACE (s->read_buf); + n = wrap_recv (s->fd, SLIDE_WPTR (s->read_buf), n); + if (n > 0) + slide_added (s->read_buf, n); + if (n < 0) + error = -1; + } s->msg = ipc_check_for_message_in_slide (s->read_buf); @@ -247,15 +331,16 @@ socket_write (Socket * s, void *buf, int len) 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); + n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n); + { + uint8_t *c = SLIDE_RPTR (s->write_buf); } if (n > 0) slide_consume (s->write_buf, n); - - if (n<0) return -1; + + if (n < 0) + return -1; return len; }