308 |
308 |
309 if((listener->server_socket6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) { |
309 if((listener->server_socket6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1) { |
310 perror("Error: http_listener_new: socket v6"); |
310 perror("Error: http_listener_new: socket v6"); |
311 return NULL; |
311 return NULL; |
312 } |
312 } |
313 |
313 |
314 int o = 1; |
314 int o = 1; |
315 setsockopt( |
315 setsockopt( |
316 listener->server_socket, |
316 listener->server_socket, |
317 SOL_SOCKET, SO_REUSEADDR, |
317 SOL_SOCKET, SO_REUSEADDR, |
318 &o, |
318 &o, |
321 setsockopt( |
321 setsockopt( |
322 listener->server_socket6, |
322 listener->server_socket6, |
323 SOL_SOCKET, SO_REUSEADDR, |
323 SOL_SOCKET, SO_REUSEADDR, |
324 &o, |
324 &o, |
325 sizeof(int)); |
325 sizeof(int)); |
|
326 |
|
327 #ifdef LINUX |
|
328 o = 1; |
|
329 setsockopt( |
|
330 listener->server_socket6, |
|
331 IPPROTO_IPV6, |
|
332 IPV6_V6ONLY, |
|
333 &o, |
|
334 sizeof(int)); |
|
335 #endif |
326 |
336 |
327 /* bind server socket to address */ |
337 /* bind server socket to address */ |
328 if(bind(listener->server_socket, (struct sockaddr*)&servaddr, sizeof(servaddr))){ |
338 if(bind(listener->server_socket, (struct sockaddr*)&servaddr, sizeof(servaddr))){ |
329 log_ereport(LOG_FAILURE, "http_listener_new: bind failed. Port: %d", conf->port); |
339 log_ereport(LOG_FAILURE, "http_listener_new: bind failed. Port: %d", conf->port); |
330 return NULL; |
340 return NULL; |
352 return 0; |
362 return 0; |
353 } |
363 } |
354 log_ereport(LOG_INFORM, "start listener on port %d", listener->port); |
364 log_ereport(LOG_INFORM, "start listener on port %d", listener->port); |
355 |
365 |
356 if (listen(listener->server_socket, 256) == -1) { |
366 if (listen(listener->server_socket, 256) == -1) { |
357 log_ereport(LOG_FAILURE, "http_listener_start: listen failed"); |
367 log_ereport(LOG_FAILURE, "http_listener_start: listen failed: %s", strerror(errno)); |
358 return -1; |
368 return -1; |
359 } |
369 } |
360 if (listen(listener->server_socket6, 256) == -1) { |
370 if (listen(listener->server_socket6, 256) == -1) { |
361 log_ereport(LOG_FAILURE, "http_listener_start: listen failed"); |
371 log_ereport(LOG_FAILURE, "http_listener_start: listen v6 failed: %s", strerror(errno)); |
362 return -1; |
372 return -1; |
363 } |
373 } |
364 |
374 |
365 /* start acceptor threads */ |
375 /* start acceptor threads */ |
366 for (int i=0;i<listener->nacceptors;i++) { |
376 for (int i=0;i<listener->nacceptors;i++) { |