@ -100,21 +100,30 @@ int getaddrinfo(const char *restrict host, const char *restrict serv, const stru
}
}
if ( ! host ) {
if ( ! host ) {
if ( family = = AF_UNSPEC ) family = AF_INET ;
if ( family = = AF_UNSPEC ) {
buf = calloc ( sizeof * buf , 1 + EXTRA ) ;
cnt = 2 ; family = AF_INET ;
} else {
cnt = 1 ;
}
buf = calloc ( sizeof * buf , cnt ) ;
if ( ! buf ) return EAI_MEMORY ;
if ( ! buf ) return EAI_MEMORY ;
buf - > ai . ai_protocol = proto ;
for ( i = 0 ; i < cnt ; i + + ) {
buf - > ai . ai_socktype = type ;
if ( i ) family = AF_INET6 ;
buf - > ai . ai_addr = ( void * ) & buf - > sa ;
buf [ i ] . ai . ai_protocol = proto ;
buf - > ai . ai_addrlen = family = = AF_INET6 ? sizeof sa . sin6 : sizeof sa . sin ;
buf [ i ] . ai . ai_socktype = type ;
buf - > ai . ai_family = family ;
buf [ i ] . ai . ai_addr = ( void * ) & buf [ i ] . sa ;
buf - > sa . sin . sin_family = family ;
buf [ i ] . ai . ai_addrlen = family = = AF_INET6
buf - > sa . sin . sin_port = port ;
? sizeof sa . sin6 : sizeof sa . sin ;
if ( ! ( flags & AI_PASSIVE ) ) {
buf [ i ] . ai . ai_family = family ;
if ( family = = AF_INET ) {
buf [ i ] . sa . sin . sin_family = family ;
0 [ ( uint8_t * ) & buf - > sa . sin . sin_addr . s_addr ] = 127 ;
buf [ i ] . sa . sin . sin_port = port ;
3 [ ( uint8_t * ) & buf - > sa . sin . sin_addr . s_addr ] = 1 ;
if ( i + 1 < cnt ) buf [ i ] . ai . ai_next = & buf [ i + 1 ] . ai ;
} else buf [ 0 ] . sa . sin6 . sin6_addr . s6_addr [ 15 ] = 1 ;
if ( ! ( flags & AI_PASSIVE ) ) {
if ( family = = AF_INET ) {
0 [ ( uint8_t * ) & buf [ i ] . sa . sin . sin_addr . s_addr ] = 127 ;
3 [ ( uint8_t * ) & buf [ i ] . sa . sin . sin_addr . s_addr ] = 1 ;
} else buf [ i ] . sa . sin6 . sin6_addr . s6_addr [ 15 ] = 1 ;
}
}
}
* res = & buf - > ai ;
* res = & buf - > ai ;
return 0 ;
return 0 ;