Fix for config to not be stored into filesystem.
[awesomized/libmemcached] / libmemcached / memcached_io.c
index 506dfd7a1013c5f3b9790105830c132c53ec220e..2431ac744b24f1353b03da2433113b2e3748da24 100644 (file)
@@ -30,6 +30,7 @@ static memcached_return io_wait(memcached_server_st *ptr,
   fds[0].fd= ptr->fd;
   fds[0].events= flags;
 
+#ifdef NOT_DONE
   /*
   ** We are going to block on write, but at least on Solaris we might block
   ** on write if we haven't read anything from our input buffer..
@@ -39,7 +40,11 @@ static memcached_return io_wait(memcached_server_st *ptr,
   ** the test.
   */
   if (read_or_write == MEM_WRITE)
-    memcached_purge(ptr);
+  {
+    if (memcached_purge(ptr) != MEMCACHED_SUCCESS || memcached_purge(ptr) != MEMCACHED_STORED)
+      return MEMCACHED_FAILURE;
+  }
+#endif
 
   error= poll(fds, 1, ptr->root->poll_timeout);
 
@@ -94,7 +99,6 @@ ssize_t memcached_io_read(memcached_server_st *ptr,
 
   while (length)
   {
-    uint8_t found_eof= 0;
     if (!ptr->read_buffer_length)
     {
       ssize_t data_read;
@@ -131,8 +135,17 @@ ssize_t memcached_io_read(memcached_server_st *ptr,
         }
         else
         {
-          found_eof= 1;
-          break;
+          /*
+            EOF. Any data received so far is incomplete
+            so discard it. This always reads by byte in case of TCP
+            and protocol enforcement happens at memcached_response()
+            looking for '\n'. We do not care for UDB which requests 8 bytes
+            at once. Generally, this means that connection went away. Since
+            for blocking I/O we do not return 0 and for non-blocking case
+            it will return EGAIN if data is not immediatly available.
+          */
+          memcached_quit_server(ptr, 1);
+          return -1;
         }
       }
 
@@ -162,9 +175,6 @@ ssize_t memcached_io_read(memcached_server_st *ptr,
       buffer_ptr++;
       break;
     }
-
-    if (found_eof)
-      break;
   }
 
   return (size_t)(buffer_ptr - (char*)buffer);
@@ -176,6 +186,8 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
   size_t original_length;
   const char* buffer_ptr;
 
+  WATCHPOINT_ASSERT(ptr->fd != -1);
+
   original_length= length;
   buffer_ptr= buffer;
 
@@ -199,6 +211,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
       memcached_return rc;
       ssize_t sent_length;
 
+      WATCHPOINT_ASSERT(ptr->fd != -1);
       sent_length= io_flush(ptr, &rc);
       if (sent_length == -1)
         return -1;
@@ -210,6 +223,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
   if (with_flush)
   {
     memcached_return rc;
+    WATCHPOINT_ASSERT(ptr->fd != -1);
     if (io_flush(ptr, &rc) == -1)
       return -1;
   }
@@ -258,6 +272,8 @@ static ssize_t io_flush(memcached_server_st *ptr,
 
   *error= MEMCACHED_SUCCESS;
 
+  WATCHPOINT_ASSERT(ptr->fd != -1);
+
   if (ptr->write_buffer_offset == 0)
     return 0;
 
@@ -271,6 +287,7 @@ static ssize_t io_flush(memcached_server_st *ptr,
   return_length= 0;
   while (write_length)
   {
+    WATCHPOINT_ASSERT(ptr->fd != -1);
     WATCHPOINT_ASSERT(write_length > 0);
     sent_length= 0;
     if (ptr->type == MEMCACHED_CONNECTION_UDP)
@@ -303,15 +320,25 @@ static ssize_t io_flush(memcached_server_st *ptr,
     }
     else
     {
+#ifdef NOT_DONE
       /*
       ** We might want to purge the input buffer if we haven't consumed
       ** any output yet... The test for the limits is the purge is inline
       ** in the purge function to avoid duplicating the logic..
       */
-      memcached_purge(ptr);
+      {
+        memcached_return rc;
+        WATCHPOINT_ASSERT(ptr->fd != -1);
+        rc= memcached_purge(ptr);
+
+        if (rc != MEMCACHED_SUCCESS || rc != MEMCACHED_STORED)
+          return -1;
+      }
+#endif
 
+      WATCHPOINT_ASSERT(ptr->fd != -1);
       if ((sent_length= write(ptr->fd, local_write_ptr, 
-                                       write_length)) == -1)
+                              write_length)) == -1)
       {
         switch (errno)
         {