Commit additional test for remote...
[awesomized/libmemcached] / libmemcached / version.c
index 54545cb9d46ff59112b4b30a028a4fb5877d0766..8fcc11a0fb6b95b2ed95eedd17a9a69735f768f3 100644 (file)
@@ -45,9 +45,14 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     memcached_server_write_instance_st instance=
       memcached_server_instance_fetch(ptr, x);
 
+    // Optimization, we only fetch version once.
+    if (instance->major_version != UINT8_MAX)
+      continue;
+
     rrc= memcached_do(instance, command, send_length, true);
     if (rrc != MEMCACHED_SUCCESS)
     {
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -55,6 +60,7 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     rrc= memcached_response(instance, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, NULL);
     if (rrc != MEMCACHED_SUCCESS)
     {
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
       rc= MEMCACHED_SOME_ERRORS;
       continue;
     }
@@ -64,12 +70,33 @@ static inline memcached_return_t memcached_version_textual(memcached_st *ptr)
     response_ptr++;
 
     instance->major_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10);
+    if (errno == ERANGE)
+    {
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+      rc= MEMCACHED_SOME_ERRORS;
+      continue;
+    }
+
     response_ptr= index(response_ptr, '.');
     response_ptr++;
+
     instance->minor_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10);
+    if (errno == ERANGE)
+    {
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+      rc= MEMCACHED_SOME_ERRORS;
+      continue;
+    }
+
     response_ptr= index(response_ptr, '.');
     response_ptr++;
     instance->micro_version= (uint8_t)strtol(response_ptr, (char **)NULL, 10);
+    if (errno == ERANGE)
+    {
+      instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+      rc= MEMCACHED_SOME_ERRORS;
+      continue;
+    }
   }
 
   return rc;
@@ -91,6 +118,9 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
     memcached_server_write_instance_st instance=
       memcached_server_instance_fetch(ptr, x);
 
+    if (instance->major_version != UINT8_MAX)
+      continue;
+
     rrc= memcached_do(instance, request.bytes, sizeof(request.bytes), true);
     if (rrc != MEMCACHED_SUCCESS) 
     {
@@ -105,6 +135,9 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
     memcached_server_write_instance_st instance=
       memcached_server_instance_fetch(ptr, x);
 
+    if (instance->major_version != UINT8_MAX)
+      continue;
+
     if (memcached_server_response_count(instance) > 0) 
     {
       memcached_return_t rrc;
@@ -120,8 +153,29 @@ static inline memcached_return_t memcached_version_binary(memcached_st *ptr)
       }
 
       instance->major_version= (uint8_t)strtol(buffer, &p, 10);
+      if (errno == ERANGE)
+      {
+        instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+        rc= MEMCACHED_SOME_ERRORS;
+        continue;
+      }
+
       instance->minor_version= (uint8_t)strtol(p + 1, &p, 10);
+      if (errno == ERANGE)
+      {
+        instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+        rc= MEMCACHED_SOME_ERRORS;
+        continue;
+      }
+
       instance->micro_version= (uint8_t)strtol(p + 1, NULL, 10);
+      if (errno == ERANGE)
+      {
+        instance->major_version= instance->minor_version= instance->micro_version= UINT8_MAX;
+        rc= MEMCACHED_SOME_ERRORS;
+        continue;
+      }
+
     }
   }