X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fserver.c;h=6fd685feac76dcece0dce6aaaa498f2fe094ef37;hb=6773e61da2d38f47d9c70212d618a91cf889491e;hp=fe62b4e9715da2d651da5869910fad2cabfc77cb;hpb=720028f73260fa1ff8a1d49c8572de04deadea57;p=m6w6%2Flibmemcached diff --git a/libmemcached/server.c b/libmemcached/server.c index fe62b4e9..6fd685fe 100644 --- a/libmemcached/server.c +++ b/libmemcached/server.c @@ -50,14 +50,17 @@ static inline void _server_init(memcached_server_st *self, const memcached_st *r self->root= root; self->limit_maxbytes= 0; - strncpy(self->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1); + if (hostname == NULL) + self->hostname[0]= 0; + else + 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 */ @@ -107,7 +110,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 { @@ -224,3 +227,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; +}