@@ -39,29 +39,6 @@ struct listening_socket_s {
39
39
40
40
static struct fpm_array_s sockets_list ;
41
41
42
- static int fpm_sockets_resolve_af_inet (char * node , char * service , struct sockaddr_in * addr ) /* {{{ */
43
- {
44
- struct addrinfo * res ;
45
- struct addrinfo hints ;
46
- int ret ;
47
-
48
- memset (& hints , 0 , sizeof (hints ));
49
- hints .ai_family = AF_INET ;
50
- ret = getaddrinfo (node , service , & hints , & res );
51
-
52
- if (ret != 0 ) {
53
- zlog (ZLOG_ERROR , "can't resolve hostname '%s%s%s': getaddrinfo said: %s%s%s\n" ,
54
- node , service ? ":" : "" , service ? service : "" ,
55
- gai_strerror (ret ), ret == EAI_SYSTEM ? ", system error: " : "" , ret == EAI_SYSTEM ? strerror (errno ) : "" );
56
- return -1 ;
57
- }
58
-
59
- * addr = * (struct sockaddr_in * ) res -> ai_addr ;
60
- freeaddrinfo (res );
61
- return 0 ;
62
- }
63
- /* }}} */
64
-
65
42
enum { FPM_GET_USE_SOCKET = 1 , FPM_STORE_SOCKET = 2 , FPM_STORE_USE_SOCKET = 3 };
66
43
67
44
static void fpm_sockets_cleanup (int which , void * arg ) /* {{{ */
@@ -98,14 +75,23 @@ static void fpm_sockets_cleanup(int which, void *arg) /* {{{ */
98
75
}
99
76
/* }}} */
100
77
78
+ static void * fpm_get_in_addr (struct sockaddr * sa ) /* {{{ */
79
+ {
80
+ if (sa -> sa_family == AF_INET ) {
81
+ return & (((struct sockaddr_in * )sa )-> sin_addr );
82
+ }
83
+
84
+ return & (((struct sockaddr_in6 * )sa )-> sin6_addr );
85
+ }
86
+ /* }}} */
87
+
101
88
static int fpm_sockets_hash_op (int sock , struct sockaddr * sa , char * key , int type , int op ) /* {{{ */
102
89
{
103
90
if (key == NULL ) {
104
91
switch (type ) {
105
92
case FPM_AF_INET : {
106
- struct sockaddr_in * sa_in = (struct sockaddr_in * ) sa ;
107
- key = alloca (sizeof ("xxx.xxx.xxx.xxx:ppppp" ));
108
- sprintf (key , "%u.%u.%u.%u:%u" , IPQUAD (& sa_in -> sin_addr ), (unsigned int ) ntohs (sa_in -> sin_port ));
93
+ key = alloca (INET6_ADDRSTRLEN );
94
+ inet_ntop (sa -> sa_family , fpm_get_in_addr (sa ), key , sizeof key );
109
95
break ;
110
96
}
111
97
@@ -254,11 +240,14 @@ enum fpm_address_domain fpm_sockets_domain_from_address(char *address) /* {{{ */
254
240
255
241
static int fpm_socket_af_inet_listening_socket (struct fpm_worker_pool_s * wp ) /* {{{ */
256
242
{
257
- struct sockaddr_in sa_in ;
243
+ struct addrinfo hints , * servinfo , * p ;
258
244
char * dup_address = strdup (wp -> config -> listen_address );
259
- char * port_str = strchr (dup_address , ':' );
245
+ char * port_str = strrchr (dup_address , ':' );
260
246
char * addr = NULL ;
247
+ int addr_len ;
261
248
int port = 0 ;
249
+ int sock ;
250
+ int status ;
262
251
263
252
if (port_str ) { /* this is host:port pair */
264
253
* port_str ++ = '\0' ;
@@ -274,23 +263,35 @@ static int fpm_socket_af_inet_listening_socket(struct fpm_worker_pool_s *wp) /*
274
263
return -1 ;
275
264
}
276
265
277
- memset (& sa_in , 0 , sizeof (sa_in ));
278
-
279
- if (addr ) {
280
- sa_in .sin_addr .s_addr = inet_addr (addr );
281
- if (sa_in .sin_addr .s_addr == INADDR_NONE ) { /* do resolve */
282
- if (0 > fpm_sockets_resolve_af_inet (addr , NULL , & sa_in )) {
283
- return -1 ;
284
- }
285
- zlog (ZLOG_NOTICE , "address '%s' resolved as %u.%u.%u.%u" , addr , IPQUAD (& sa_in .sin_addr ));
266
+ // strip brackets from address for getaddrinfo
267
+ if (addr != NULL ) {
268
+ addr_len = strlen (addr );
269
+ if (addr [0 ] == '[' && addr [addr_len - 1 ] == ']' ) {
270
+ addr [addr_len - 1 ] = '\0' ;
271
+ addr ++ ;
286
272
}
287
- } else {
288
- sa_in .sin_addr .s_addr = htonl (INADDR_ANY );
289
273
}
290
- sa_in .sin_family = AF_INET ;
291
- sa_in .sin_port = htons (port );
274
+
275
+ memset (& hints , 0 , sizeof hints );
276
+ hints .ai_family = AF_UNSPEC ;
277
+ hints .ai_socktype = SOCK_STREAM ;
278
+
279
+ if ((status = getaddrinfo (addr , port_str , & hints , & servinfo )) != 0 ) {
280
+ zlog (ZLOG_ERROR , "getaddrinfo: %s\n" , gai_strerror (status ));
281
+ return -1 ;
282
+ }
283
+
292
284
free (dup_address );
293
- return fpm_sockets_get_listening_socket (wp , (struct sockaddr * ) & sa_in , sizeof (struct sockaddr_in ));
285
+
286
+ for (p = servinfo ; p != NULL ; p = p -> ai_next ) {
287
+ if ((sock = fpm_sockets_get_listening_socket (wp , p -> ai_addr , p -> ai_addrlen )) != -1 ) {
288
+ break ;
289
+ }
290
+ }
291
+
292
+ freeaddrinfo (servinfo );
293
+
294
+ return sock ;
294
295
}
295
296
/* }}} */
296
297
0 commit comments