516b5db346482e24500854deef4fbc0c4267aef5
[awesomized/libmemcached] / lib / memcached_connect.c
1 #include "common.h"
2
3 memcached_return memcached_server_add(memcached_st *ptr, char *hostname, unsigned int port)
4 {
5 memcached_server_st *new_host_list;
6 char *new_hostname;
7 LIBMEMCACHED_MEMCACHED_SERVER_ADD_START();
8
9 if (!port)
10 port= MEMCACHED_DEFAULT_PORT;
11
12 if (!hostname)
13 hostname= "localhost";
14
15
16 new_host_list= (memcached_server_st *)realloc(ptr->hosts, sizeof(memcached_server_st) * (ptr->number_of_hosts+1));
17 if (!new_host_list)
18 return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
19 memset(&new_host_list[ptr->number_of_hosts], 0, sizeof(memcached_server_st));
20
21 if (!new_host_list)
22 return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
23
24 ptr->hosts= new_host_list;
25
26 new_hostname=
27 (char *)malloc(sizeof(char) * (strlen(hostname)+1));
28 if (!new_hostname)
29 return MEMCACHED_MEMORY_ALLOCATION_FAILURE;
30
31 memset(new_hostname, 0, strlen(hostname)+1);
32 memcpy(new_hostname, hostname, strlen(hostname));
33 ptr->hosts[ptr->number_of_hosts].hostname= new_hostname;
34 ptr->hosts[ptr->number_of_hosts].port= port;
35 ptr->hosts[ptr->number_of_hosts].fd= -1;
36 ptr->number_of_hosts++;
37
38 LIBMEMCACHED_MEMCACHED_SERVER_ADD_END();
39
40 return MEMCACHED_SUCCESS;
41 }
42
43 memcached_return memcached_connect(memcached_st *ptr)
44 {
45 unsigned int x;
46 struct sockaddr_in localAddr, servAddr;
47 struct hostent *h;
48
49 LIBMEMCACHED_MEMCACHED_CONNECT_START();
50
51 if (ptr->connected == ptr->number_of_hosts)
52 return MEMCACHED_SUCCESS;
53
54 if (!ptr->hosts)
55 {
56 return MEMCACHED_NO_SERVERS;
57 }
58
59 for (x= 0; x < ptr->number_of_hosts; x++)
60 {
61 if (ptr->hosts[x].fd == -1)
62 {
63 if ((h= gethostbyname(ptr->hosts[x].hostname)) == NULL)
64 return MEMCACHED_HOST_LOCKUP_FAILURE;
65
66 servAddr.sin_family= h->h_addrtype;
67 memcpy((char *) &servAddr.sin_addr.s_addr, h->h_addr_list[0], h->h_length);
68 servAddr.sin_port = htons(ptr->hosts[x].port);
69
70 /* Create the socket */
71 if ((ptr->hosts[0].fd= socket(AF_INET, SOCK_STREAM, 0)) < 0)
72 return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE;
73
74
75 /* bind any port number */
76 localAddr.sin_family = AF_INET;
77 localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
78 localAddr.sin_port = htons(0);
79
80 if (bind(ptr->hosts[0].fd, (struct sockaddr *) &localAddr, sizeof(localAddr)) < 0)
81 return(MEMCACHED_CONNECTION_BIND_FAILURE);
82
83 /* connect to server */
84 if (connect(ptr->hosts[0].fd, (struct sockaddr *) &servAddr, sizeof(servAddr)) < 0)
85 return MEMCACHED_HOST_LOCKUP_FAILURE;
86
87 ptr->connected++;
88 }
89 }
90 LIBMEMCACHED_MEMCACHED_CONNECT_END();
91
92 return MEMCACHED_SUCCESS;
93 }