fac037070c8a6e2b7da59a3efe74a8668eb93d02
[awesomized/libmemcached] / lib / memcached_hosts.c
1 #include <memcached.h>
2 #include "common.h"
3
4 /* Protoypes (static) */
5 static memcached_return server_add(memcached_st *ptr, char *hostname,
6 unsigned int port,
7 memcached_connection type);
8
9 static void host_reset(memcached_server_st *host, char *hostname, unsigned int port,
10 memcached_connection type)
11 {
12 memset(host, 0, sizeof(memcached_server_st));
13 host->hostname= strdup(hostname);
14 host->port= port;
15 host->fd= -1;
16 host->type= type;
17 host->read_ptr= host->read_buffer;
18 host->write_ptr= host->write_buffer;
19 host->sockaddr_inited= MEMCACHED_NOT_ALLOCATED;
20 }
21
22 memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list)
23 {
24 unsigned int x;
25 uint16_t count;
26 memcached_server_st *new_host_list;
27
28 if (!list)
29 return MEMCACHED_SUCCESS;
30
31 count= list[0].count;
32
33 new_host_list=
34 (memcached_server_st *)realloc(ptr->hosts,
35 sizeof(memcached_server_st) * (count + ptr->number_of_hosts));
36
37 if (!new_host_list)
38 return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
39
40 ptr->hosts= new_host_list;
41
42 for (x= 0; x < count; x++)
43 {
44 WATCHPOINT_ASSERT(list[x].hostname);
45 host_reset(&ptr->hosts[ptr->number_of_hosts], list[x].hostname,
46 list[x].port, list[x].type);
47 ptr->number_of_hosts++;
48 }
49 ptr->hosts[0].count= ptr->number_of_hosts;
50
51 return MEMCACHED_SUCCESS;
52 }
53
54 memcached_return memcached_server_add_unix_socket(memcached_st *ptr, char *filename)
55 {
56 if (!filename)
57 return MEMCACHED_FAILURE;
58
59 return server_add(ptr, filename, 0, MEMCACHED_CONNECTION_UNIX_SOCKET);
60 }
61
62 memcached_return memcached_server_add_udp(memcached_st *ptr,
63 char *hostname,
64 unsigned int port)
65 {
66 if (!port)
67 port= MEMCACHED_DEFAULT_PORT;
68
69 if (!hostname)
70 hostname= "localhost";
71
72 return server_add(ptr, hostname, port, MEMCACHED_CONNECTION_UDP);
73 }
74
75 memcached_return memcached_server_add(memcached_st *ptr,
76 char *hostname,
77 unsigned int port)
78 {
79 if (!port)
80 port= MEMCACHED_DEFAULT_PORT;
81
82 if (!hostname)
83 hostname= "localhost";
84
85 return server_add(ptr, hostname, port, MEMCACHED_CONNECTION_TCP);
86 }
87
88 static memcached_return server_add(memcached_st *ptr, char *hostname,
89 unsigned int port,
90 memcached_connection type)
91 {
92 memcached_server_st *new_host_list;
93 LIBMEMCACHED_MEMCACHED_SERVER_ADD_START();
94
95
96 new_host_list= (memcached_server_st *)realloc(ptr->hosts,
97 sizeof(memcached_server_st) * (ptr->number_of_hosts+1));
98 if (!new_host_list)
99 return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
100
101 ptr->hosts= new_host_list;
102
103 host_reset(&ptr->hosts[ptr->number_of_hosts], hostname, port, type);
104 ptr->number_of_hosts++;
105 ptr->hosts[0].count++;
106
107 LIBMEMCACHED_MEMCACHED_SERVER_ADD_END();
108
109 return MEMCACHED_SUCCESS;
110 }
111
112 memcached_server_st *memcached_server_list_append(memcached_server_st *ptr,
113 char *hostname, unsigned int port,
114 memcached_return *error)
115 {
116 unsigned int count;
117 memcached_server_st *new_host_list;
118
119 if (!hostname)
120 return ptr;
121
122 if (!port)
123 port= MEMCACHED_DEFAULT_PORT;
124
125 /* Increment count for hosts */
126 count= 1;
127 if (ptr != NULL)
128 {
129 count+= ptr[0].count;
130 }
131
132 new_host_list= (memcached_server_st *)realloc(ptr, sizeof(memcached_server_st) * count);
133 if (!new_host_list)
134 {
135 *error= MEMCACHED_MEMORY_ALLOCATION_FAILURE;
136 return NULL;
137 }
138
139 host_reset(&new_host_list[count-1], hostname, port, MEMCACHED_CONNECTION_TCP);
140 new_host_list[0].count++;
141
142
143 *error= MEMCACHED_SUCCESS;
144 return new_host_list;
145 }
146
147 unsigned int memcached_server_list_count(memcached_server_st *ptr)
148 {
149
150 if (ptr == NULL)
151 return 0;
152
153 return ptr[0].count;
154 }
155
156 void memcached_server_list_free(memcached_server_st *ptr)
157 {
158 unsigned int x;
159
160 if (ptr == NULL)
161 return;
162
163 for (x= 0; x < ptr[0].count; x++)
164 free(ptr[x].hostname);
165
166 free(ptr);
167 }