]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
Merge branch 'review/sockreq' into scfinal
authorMichal 'vorner' Vaner <michal.vaner@nic.cz>
Thu, 5 Jan 2012 08:53:57 +0000 (09:53 +0100)
committerMichal 'vorner' Vaner <michal.vaner@nic.cz>
Thu, 5 Jan 2012 08:53:57 +0000 (09:53 +0100)
Conflicts:
src/lib/server_common/socket_request.cc
src/lib/util/io/fd.cc

1  2 
src/lib/util/io/fd.cc

index f9b17a783c719ef2d906572b5df2fed73d3c23ba,2797015a11b42fc0cfe3f6a3577931d1e6a2dbc1..49aac397a162e15f1ca4ef4352c2a82ef41c4617
@@@ -23,30 -23,20 +23,30 @@@ namespace io 
  
  bool
  write_data(const int fd, const void *buffer_v, const size_t length) {
      const unsigned char* buffer(static_cast<const unsigned char*>(buffer_v));
 -    size_t rest(length);
 +    size_t remaining = length;  // Amount remaining to be written
 +
+     // Just keep writing until all is written
 -    while (rest) {
 -        const int written = write(fd, buffer, rest);
 +    while (remaining > 0) {
-         ssize_t amount = write(fd, buffer, remaining);
-         if (amount == -1) {
-             // Some error.  Ignore interrupted system calls otherwise return
-             // an error indication.
-             if (errno != EINTR) {
-                 return false;
++        const int written = write(fd, buffer, remaining);
+         if (written == -1) {
+             if (errno == EINTR) { // Just keep going
+                 continue;
+             } else {
+                 return (false);
              }
 -        } else { // Wrote something
 -            rest -= written;
 +
-         } else if (amount > 0) {
-             // Wrote "amount" bytes from the buffer
-             remaining -= amount;
-             buffer += amount;
++        } else if (written > 0) {
++            // Wrote "written" bytes from the buffer
++            remaining -= written;
+             buffer += written;
 +
 +        } else {
 +            // Wrote zero bytes from the buffer. We should not get here as any
 +            // error that causes zero bytes to be written should have returned
 +            // -1.  However, write(2) can return 0, and in this case we
 +            // interpret it as an error.
 +            return (false);
          }
      }
      return (true);
  
  ssize_t
  read_data(const int fd, void *buffer_v, const size_t length) {
 -    unsigned char *buffer(static_cast<unsigned char *>(buffer_v));
 -    size_t rest(length), already(0);
 -    while (rest) { // Stil something to read
 -        const int amount = read(fd, buffer, rest);
 +    unsigned char* buffer(static_cast<unsigned char*>(buffer_v));
 +    size_t remaining = length;   // Amount remaining to be read
 +
 +    while (remaining > 0) {
-         ssize_t amount = read(fd, buffer, remaining);
++        const int amount = read(fd, buffer, remaining);
          if (amount == -1) {
-             // Some error.  Ignore interrupted system calls otherwise return
-             // an error indication.
-             if (errno != EINTR) {
-                 return -1;
+             if (errno == EINTR) { // Continue on interrupted call
+                 continue;
+             } else {
+                 return (-1);
              }
 -        } else if (amount) {
 -            already += amount;
 -            rest -= amount;
 +        } else if (amount > 0) {
 +            // Read "amount" bytes into the buffer
 +            remaining -= amount;
              buffer += amount;
 -        } else { // EOF
 -            return (already);
 +        } else {
 +            // EOF - end the read
 +            break;
          }
      }
 -    return (already);
 +
 +    // Return total number of bytes read
 +    return (static_cast<ssize_t>(length - remaining));
  }
  
  }