Fix for non-Linux platforms.
[awesomized/libmemcached] / libmemcached / server.c
index 516cd2c460c62ed4bd9e8602f4514499e347e7c0..f480750d8679079c5003ce4448c834777da91c6d 100644 (file)
@@ -19,6 +19,7 @@ static inline void _server_init(memcached_server_st *self, const memcached_st *r
                                 uint32_t weight, memcached_connection_t type)
 {
   self->options.sockaddr_inited= false;
+  self->options.is_shutting_down= false;
   self->number_of_hosts= 0;
   self->cursor_active= 0;
   self->port= port;
@@ -53,14 +54,14 @@ static inline void _server_init(memcached_server_st *self, const memcached_st *r
   if (hostname == NULL)
     self->hostname[0]= 0;
   else
-    strncpy(self->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1);
+    strncpy(self->hostname, hostname, NI_MAXHOST - 1);
 }
 
 static memcached_server_st *_server_create(memcached_server_st *self, const memcached_st *memc)
 {
   if (self == NULL)
   {
-   self= (memcached_server_st *)memc->call_malloc(memc, sizeof(memcached_server_st));
+   self= (memcached_server_st *)libmemcached_malloc(memc, sizeof(memcached_server_st));
 
     if (! self)
       return NULL; /*  MEMCACHED_MEMORY_ALLOCATION_FAILURE */
@@ -100,7 +101,7 @@ memcached_server_st *memcached_server_create_with(const memcached_st *memc, memc
 
 void memcached_server_free(memcached_server_st *self)
 {
-  memcached_quit_server(self, 0);
+  memcached_quit_server(self, false);
 
   if (self->cached_server_error)
     free(self->cached_server_error);
@@ -110,7 +111,7 @@ void memcached_server_free(memcached_server_st *self)
 
   if (memcached_is_allocated(self))
   {
-    self->root->call_free(self->root, self);
+    libmemcached_free(self->root, self);
   }
   else
   {
@@ -227,3 +228,38 @@ void memcached_server_list_free(memcached_server_st *ptr)
 {
   server_list_free(NULL, ptr);
 }
+
+/**
+  @todo allow lists to query themselves even if they lack a root
+*/
+memcached_return_t memcached_server_remove(memcached_server_st *st_ptr)
+{
+  uint32_t x, host_index;
+  memcached_st *root= (memcached_st *)st_ptr->root;
+  memcached_server_st *list;
+
+  if (root == NULL)
+    return MEMCACHED_FAILURE;
+
+  list= memcached_server_list(root);
+
+  for (x= 0, host_index= 0; x < memcached_server_count(root); x++)
+  {
+    if (strncmp(list[x].hostname, st_ptr->hostname, NI_MAXHOST) != 0 || list[x].port != st_ptr->port)
+    {
+      if (host_index != x)
+        memcpy(list+host_index, list+x, sizeof(memcached_server_st));
+      host_index++;
+    }
+  }
+  root->number_of_hosts= host_index;
+
+  if (st_ptr->address_info)
+  {
+    freeaddrinfo(st_ptr->address_info);
+    st_ptr->address_info= NULL;
+  }
+  run_distribution(root);
+
+  return MEMCACHED_SUCCESS;
+}