+ } break;
+
+ case PROTOCOL_BINARY_CMD_VERSION: {
+ char version_buffer[32]; // @todo document this number
+ memset(version_buffer, 0, sizeof(version_buffer));
+
+ if (memcached_safe_read(instance, version_buffer, bodylen) != MEMCACHED_SUCCESS) {
+ return MEMCACHED_UNKNOWN_READ_FAILURE;
+ }
+
+ char *endptr;
+ errno = 0;
+ long int version = strtol(version_buffer, &endptr, 10);
+ if (errno or version == LONG_MIN or version == LONG_MAX or version > UINT8_MAX
+ or version == 0) {
+ instance->major_version = instance->minor_version = instance->micro_version = UINT8_MAX;
+ return memcached_set_error(
+ *instance, MEMCACHED_UNKNOWN_READ_FAILURE, MEMCACHED_AT,
+ memcached_literal_param("strtol() failed to parse major version"));
+ }
+ instance->major_version = uint8_t(version);
+
+ endptr++;
+ errno = 0;
+ version = strtol(endptr, &endptr, 10);
+ if (errno or version == LONG_MIN or version == LONG_MAX or version > UINT8_MAX) {
+ instance->major_version = instance->minor_version = instance->micro_version = UINT8_MAX;
+ return memcached_set_error(
+ *instance, MEMCACHED_UNKNOWN_READ_FAILURE, MEMCACHED_AT,
+ memcached_literal_param("strtol() failed to parse minor version"));
+ }
+ instance->minor_version = uint8_t(version);
+
+ endptr++;
+ errno = 0;
+ version = strtol(endptr, &endptr, 10);
+ if (errno or version == LONG_MIN or version == LONG_MAX or version > UINT8_MAX) {
+ instance->major_version = instance->minor_version = instance->micro_version = UINT8_MAX;
+ return memcached_set_error(
+ *instance, MEMCACHED_UNKNOWN_READ_FAILURE, MEMCACHED_AT,
+ memcached_literal_param("strtol() failed to parse micro version"));
+ }
+ instance->micro_version = uint8_t(version);
+ } break;
+
+ case PROTOCOL_BINARY_CMD_TOUCH: {
+ rc = MEMCACHED_SUCCESS;
+ if (bodylen == 4) // The four byte read is a bug?
+ {
+ char touch_buffer[4]; // @todo document this number
+ rc = memcached_safe_read(instance, touch_buffer, sizeof(touch_buffer));