Changed safe_write() to fully send all the data in the buffer it was
authorRobert James Kaes <rjkaes@users.sourceforge.net>
Sat, 15 Dec 2001 20:04:04 +0000 (20:04 +0000)
committerRobert James Kaes <rjkaes@users.sourceforge.net>
Sat, 15 Dec 2001 20:04:04 +0000 (20:04 +0000)
passed. Also safe_write() and safe_read() now use char pointer buffers
rather than the void pointer style.

src/sock.c
src/sock.h

index fd071d709a89b56eb610835346ea0e4e1e3ad825..67825b9b4e980e67489518b7654df61126e6a7ce 100644 (file)
@@ -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;
 
index 2622822980118bae4c9da00948473c604c1a61c4..5b09f6324c8768f413816d34a8c4d5c1d444a9aa 100644 (file)
@@ -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);