239 struct addrinfo *aiHead;
240 struct addrinfo hints = { .ai_flags = AI_PASSIVE,
241 .ai_family = PF_UNSPEC };
242 size_t maxDescs = *descSize;
246 while ( *descSize > 0 )
253 if ( strcmp( protocol,
"tcp" ) == 0 )
255 hints.ai_socktype = SOCK_STREAM;
256 hints.ai_protocol = IPPROTO_TCP;
258 else if ( strcmp( protocol,
"udp" ) == 0 )
260 hints.ai_socktype = SOCK_DGRAM;
261 hints.ai_protocol = IPPROTO_UDP;
266 "%s (line %d): ERROR - Unknown transport " 267 "layer protocol \"%s\".\n",
280 if ( ( aiErr = getaddrinfo( NULL,
286 "%s (line %d): ERROR - %s.\n",
289 gai_strerror( aiErr ) );
297 ( ai != NULL ) && ( *descSize < maxDescs );
307 "Setting up a passive socket based on the " 308 "following address info:\n" 309 " ai_flags = %#02X\n" 310 " ai_family = %d (PF_INET = %d, PF_INET6 = %d)\n" 311 " ai_socktype = %d (SOCK_STREAM = %d, SOCK_DGRAM = %d)\n" 312 " ai_protocol = %d (IPPROTO_TCP = %d, IPPROTO_UDP = %d)\n" 313 " ai_addrlen = %d (sockaddr_in = %lu, " 314 "sockaddr_in6 = %lu)\n",
326 sizeof(
struct sockaddr_in ),
327 sizeof(
struct sockaddr_in6 ) );
333 getnameinfo( ai->ai_addr,
339 NI_NUMERICHOST | NI_NUMERICSERV );
340 switch ( ai->ai_family )
344 struct sockaddr_in *p = (
struct sockaddr_in*) ai->ai_addr;
346 " ai_addr = sin_family: %d (AF_INET = %d, " 359 struct sockaddr_in6 *p = (
struct sockaddr_in6*) ai->ai_addr;
361 " ai_addr = sin6_family: %d (AF_INET = %d, " 365 " sin6_flowinfo: %d\n" 366 " sin6_scope_id: %d\n",
379 "%s (line %d): ERROR - Unknown protocol family (%d).\n",
383 freeaddrinfo( aiHead );
391 CHK( desc[ *descSize ] = socket( ai->ai_family,
399 if ( ai->ai_family == PF_INET6 )
401 #if defined( IPV6_V6ONLY ) 406 CHK( setsockopt( desc[ *descSize ],
410 sizeof( v6Only ) ) );
428 "%s (line %d): WARNING - Cannot set IPV6_V6ONLY socket " 429 "option. Closing IPv6 %s socket.\n",
432 ai->ai_protocol == IPPROTO_TCP ?
"TCP" :
"UDP" );
440 CHK( bind( desc[ *descSize ],
447 if ( ai->ai_socktype == SOCK_STREAM )
449 CHK( listen( desc[ *descSize ],
460 if (
verbose && ( ai != NULL ) )
463 "%s (line %d): WARNING - Some address records were " 464 "not processed due to insufficient array space.\n",
471 freeaddrinfo( aiHead );
static const char * pgmName
static char servBfr[NI_MAXSERV]
static char hostBfr[NI_MAXHOST]