Fix for bad name servers.
[awesomized/libmemcached] / libmemcached / io.c
index f1afc6695322fe961edc7a9dbd2c41a402def199..070af6b19462d9056f7a3181ba4944e26ae7b9cf 100644 (file)
@@ -64,20 +64,25 @@ static memcached_return_t io_wait(memcached_server_write_instance_st ptr,
     case 1:
       return MEMCACHED_SUCCESS;
     case 0:
-      return MEMCACHED_TIMEOUT;
-#ifdef TARGET_OS_LINUX
-    case ERESTART:
-#endif
-    case EINTR:
       continue;
     default:
-      ptr->cached_errno= error;
-      memcached_quit_server(ptr, true);
+      WATCHPOINT_ERRNO(errno);
+      {
+        switch (errno)
+        {
+        default:
+          ptr->cached_errno= error;
+          memcached_quit_server(ptr, true);
 
-      return MEMCACHED_FAILURE;
+          return MEMCACHED_FAILURE;
+        }
+      }
     }
   }
 
+  if (loop_max == 0 && error == 0)
+    return MEMCACHED_TIMEOUT;
+
   /* Imposssible for anything other then -1 */
   WATCHPOINT_ASSERT(error == -1);
   ptr->cached_errno= error;
@@ -326,8 +331,8 @@ memcached_return_t memcached_io_read(memcached_server_write_instance_st ptr,
   return MEMCACHED_SUCCESS;
 }
 
-ssize_t memcached_io_write(memcached_server_write_instance_st ptr,
-                           const void *buffer, size_t length, bool with_flush)
+static ssize_t _io_write(memcached_server_write_instance_st ptr,
+                         const void *buffer, size_t length, bool with_flush)
 {
   size_t original_length;
   const char* buffer_ptr;
@@ -403,6 +408,41 @@ ssize_t memcached_io_write(memcached_server_write_instance_st ptr,
   return (ssize_t) original_length;
 }
 
+ssize_t memcached_io_write(memcached_server_write_instance_st ptr,
+                           const void *buffer, size_t length, bool with_flush)
+{
+  return _io_write(ptr, buffer, length, with_flush);
+}
+
+ssize_t memcached_io_writev(memcached_server_write_instance_st ptr,
+                            const struct __write_vector_st *vector,
+                            size_t number_of, bool with_flush)
+{
+  ssize_t total= 0;
+
+  for (size_t x= 0; x < number_of; x++, vector++)
+  {
+    ssize_t returnable;
+
+    if ((returnable= _io_write(ptr, vector->buffer, vector->length, false)) == -1)
+    {
+      return -1;
+    }
+    total+= returnable;
+  }
+
+  if (with_flush)
+  {
+    if (memcached_io_write(ptr, NULL, 0, true) == -1)
+    {
+      return -1;
+    }
+  }
+
+  return total;
+}
+
+
 memcached_return_t memcached_io_close(memcached_server_write_instance_st ptr)
 {
   if (ptr->fd == -1)
@@ -548,6 +588,7 @@ static ssize_t io_flush(memcached_server_write_instance_st ptr,
     if (sent_length == -1)
     {
       ptr->cached_errno= errno;
+      WATCHPOINT_ERRNO(errno);
       switch (errno)
       {
       case ENOBUFS: