@@ -88,35 +88,53 @@ static void add_peers(WorkerConfig *cfg)
88
88
/* Returns the created socket, or -1 if failed. */
89
89
static int create_listening_socket (const char * host , int port ) {
90
90
int optval ;
91
- struct sockaddr_in addr ;
92
- int s = socket (AF_INET , SOCK_STREAM , 0 );
93
- if (s == -1 ) {
94
- fprintf (stderr , "cannot create the listening socket: %s\n" , strerror (errno ));
91
+ struct addrinfo * addrs = NULL ;
92
+ struct addrinfo hint ;
93
+ struct addrinfo * a ;
94
+ char portstr [6 ];
95
+ int rc ;
96
+
97
+ memset (& hint , 0 , sizeof (hint ));
98
+ hint .ai_socktype = SOCK_STREAM ;
99
+ hint .ai_family = AF_INET ;
100
+ snprintf (portstr , 6 , "%d" , port );
101
+ hint .ai_protocol = getprotobyname ("tcp" )-> p_proto ;
102
+
103
+ if ((rc = getaddrinfo (host , portstr , & hint , & addrs )))
104
+ {
105
+ elog (WARNING , "failed to resolve address '%s:%d': %s" ,
106
+ host , port , gai_strerror (rc ));
95
107
return -1 ;
96
108
}
97
109
98
- optval = 1 ;
99
- setsockopt (s , IPPROTO_TCP , TCP_NODELAY , (char const * )& optval , sizeof (optval ));
100
- setsockopt (s , SOL_SOCKET , SO_REUSEADDR , (char const * )& optval , sizeof (optval ));
110
+ for (a = addrs ; a != NULL ; a = a -> ai_next )
111
+ {
112
+ int s = socket (AF_INET , SOCK_STREAM , 0 );
113
+ if (s == -1 ) {
114
+ elog (WARNING , "cannot create the listening socket: %s" , strerror (errno ));
115
+ continue ;
116
+ }
101
117
102
- addr .sin_family = AF_INET ;
103
- if (inet_aton (host , & addr .sin_addr ) == 0 ) {
104
- fprintf (stderr , "cannot convert the host string '%s' to a valid address\n" , host );
105
- return -1 ;
106
- }
107
- addr .sin_port = htons (port );
108
- fprintf (stderr , "binding tcp %s:%d\n" , host , port );
109
- if (bind (s , (struct sockaddr * )& addr , sizeof (addr )) == -1 ) {
110
- fprintf (stderr , "cannot bind the listening socket: %s\n" , strerror (errno ));
111
- return -1 ;
112
- }
118
+ optval = 1 ;
119
+ setsockopt (s , IPPROTO_TCP , TCP_NODELAY , (char const * )& optval , sizeof (optval ));
120
+ setsockopt (s , SOL_SOCKET , SO_REUSEADDR , (char const * )& optval , sizeof (optval ));
121
+
122
+ fprintf (stderr , "binding tcp %s:%d\n" , host , port );
123
+ if (bind (s , a -> ai_addr , a -> ai_addrlen ) < 0 ) {
124
+ elog (WARNING , "cannot bind the listening socket: %s" , strerror (errno ));
125
+ close (s );
126
+ continue ;
127
+ }
113
128
114
- if (listen (s , LISTEN_QUEUE_SIZE ) == -1 ) {
115
- fprintf (stderr , "failed to listen the socket: %s\n" , strerror (errno ));
116
- return -1 ;
129
+ if (listen (s , LISTEN_QUEUE_SIZE ) == -1 ) {
130
+ elog (WARNING , "failed to listen the socket: %s" , strerror (errno ));
131
+ close (s );
132
+ continue ;
133
+ }
134
+ return s ;
117
135
}
118
-
119
- return s ;
136
+ elog ( WARNING , "failed to find proper protocol" );
137
+ return -1 ;
120
138
}
121
139
122
140
static bool add_socket (int sock )
0 commit comments