diff options
author | Robert James Kaes <rjkaes@users.sourceforge.net> | 2001-12-15 20:04:04 +0000 |
---|---|---|
committer | Robert James Kaes <rjkaes@users.sourceforge.net> | 2001-12-15 20:04:04 +0000 |
commit | b969ed430228ffc2300c2aa1eb1356a362171302 (patch) | |
tree | 7d8cc2f9e6a1fb413e94799f9b5eb7025e2b49f8 | |
parent | cad9a5d11b2e1034135123c0936c24303f674bc6 (diff) | |
download | tinyproxy-b969ed430228ffc2300c2aa1eb1356a362171302.tar.gz tinyproxy-b969ed430228ffc2300c2aa1eb1356a362171302.zip |
Changed safe_write() to fully send all the data in the buffer it was
passed. Also safe_write() and safe_read() now use char pointer buffers
rather than the void pointer style.
-rw-r--r-- | src/sock.c | 32 | ||||
-rw-r--r-- | src/sock.h | 6 |
2 files changed, 27 insertions, 11 deletions
@@ -1,4 +1,4 @@ -/* $Id: sock.c,v 1.19 2001-12-15 05:58:30 rjkaes Exp $ +/* $Id: sock.c,v 1.20 2001-12-15 20:04:04 rjkaes Exp $ * * Sockets are created and destroyed here. When a new connection comes in from * a client, we need to copy the socket and the create a second socket to the @@ -271,18 +271,34 @@ getpeer_string(int fd, char *string) /* * Write the buffer to the socket. If an EINTR occurs, pick up and try - * again. + * again. Keep sending until the buffer has been sent. */ ssize_t -safe_write(int fd, const void *buffer, size_t count) +safe_write(int fd, const char *buffer, size_t count) { ssize_t len; + size_t bytestosend; - do { - len = write(fd, buffer, count); - } while (len < 0 && errno == EINTR); + bytestosend = count; - return len; + while (1) { + len = write(fd, buffer, bytestosend); + + if (len < 0) { + if (errno == EINTR) + continue; + else + return -errno; + } + + if (len == bytestosend) + break; + + buffer += len; + bytestosend -= len; + } + + return count; } /* @@ -290,7 +306,7 @@ safe_write(int fd, const void *buffer, size_t count) * again. */ ssize_t -safe_read(int fd, void *buffer, size_t count) +safe_read(int fd, char *buffer, size_t count) { ssize_t len; @@ -1,4 +1,4 @@ -/* $Id: sock.h,v 1.7 2001-11-22 00:19:18 rjkaes Exp $ +/* $Id: sock.h,v 1.8 2001-12-15 20:04:04 rjkaes Exp $ * * See 'sock.c' for a detailed description. * @@ -35,8 +35,8 @@ extern int socket_blocking(int sock); extern char *getpeer_ip(int fd, char *ipaddr); extern char *getpeer_string(int fd, char *string); -extern ssize_t safe_write(int fd, const void *buffer, size_t count); -extern ssize_t safe_read(int fd, void *buffer, size_t count); +extern ssize_t safe_write(int fd, const char *buffer, size_t count); +extern ssize_t safe_read(int fd, char *buffer, size_t count); extern ssize_t readline(int fd, char **whole_buffer); |