X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fsymsocket.c;h=ee5869a23c3220c4d95f637789ac91717074a695;hb=82aed0c41cd917fdf9cdb20db788fe9da0662eba;hp=061ff6d3f7329376fdef4d08b73079db5be4490c;hpb=d20265fbf33e22b30b5c2879cff7ae5c22d3fc29;p=sympathy.git diff --git a/src/symsocket.c b/src/symsocket.c index 061ff6d..ee5869a 100644 --- a/src/symsocket.c +++ b/src/symsocket.c @@ -11,6 +11,12 @@ static char rcsid[] = /* * $Log$ + * 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 *** * @@ -29,6 +35,38 @@ static char rcsid[] = #define BUF_SIZE 16384 #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) @@ -39,7 +77,29 @@ 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); } @@ -89,6 +149,7 @@ socket_listen (char *path) ret->write_buf = NULL; ret->fd = fd; + ret->path_to_unlink = strdup (path); return ret; @@ -215,7 +276,7 @@ socket_post_select (Socket * s, fd_set * rfds, fd_set * 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); + n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n); if (n > 0) slide_consume (s->write_buf, n); if (n < 0) @@ -227,7 +288,7 @@ 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 = wrap_read (s->fd, SLIDE_WPTR (s->read_buf), n); + n = wrap_recv (s->fd, SLIDE_WPTR (s->read_buf), n); if (n > 0) slide_added (s->read_buf, n); if (n < 0) @@ -253,7 +314,7 @@ 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); + n = wrap_send (s->fd, SLIDE_RPTR (s->write_buf), n); { uint8_t *c = SLIDE_RPTR (s->write_buf); }