@ -247,13 +247,10 @@ finish:
grpc_error * grpc_tcp_client_prepare_fd ( const grpc_channel_args * channel_args ,
const grpc_resolved_address * addr ,
grpc_resolved_address * mapped_addr ,
grpc_fd * * fdobj ) {
int * fd ) {
grpc_dualstack_mode dsmode ;
int fd ;
grpc_error * error ;
char * name ;
char * addr_str ;
* fdobj = nullptr ;
* fd = - 1 ;
/* Use dualstack sockets where available. Set mapped to v6 or v4 mapped to
v6 . */
if ( ! grpc_sockaddr_to_v4mapped ( addr , mapped_addr ) ) {
@ -261,7 +258,7 @@ grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args,
memcpy ( mapped_addr , addr , sizeof ( * mapped_addr ) ) ;
}
error =
grpc_create_dualstack_socket ( mapped_addr , SOCK_STREAM , 0 , & dsmode , & fd ) ;
grpc_create_dualstack_socket ( mapped_addr , SOCK_STREAM , 0 , & dsmode , fd ) ;
if ( error ! = GRPC_ERROR_NONE ) {
return error ;
}
@ -271,29 +268,32 @@ grpc_error* grpc_tcp_client_prepare_fd(const grpc_channel_args* channel_args,
memcpy ( mapped_addr , addr , sizeof ( * mapped_addr ) ) ;
}
}
if ( ( error = prepare_socket ( mapped_addr , fd , channel_args ) ) ! =
if ( ( error = prepare_socket ( mapped_addr , * fd , channel_args ) ) ! =
GRPC_ERROR_NONE ) {
return error ;
}
addr_str = grpc_sockaddr_to_uri ( mapped_addr ) ;
gpr_asprintf ( & name , " tcp-client:%s " , addr_str ) ;
* fdobj = grpc_fd_create ( fd , name , true ) ;
gpr_free ( name ) ;
gpr_free ( addr_str ) ;
return GRPC_ERROR_NONE ;
}
void grpc_tcp_client_create_from_prepared_fd (
grpc_pollset_set * interested_parties , grpc_closure * closure , grpc_fd * fdobj ,
grpc_pollset_set * interested_parties , grpc_closure * closure , const int fd ,
const grpc_channel_args * channel_args , const grpc_resolved_address * addr ,
grpc_millis deadline , grpc_endpoint * * ep ) {
const int fd = grpc_fd_wrapped_fd ( fdobj ) ;
int err ;
async_connect * ac ;
do {
err = connect ( fd , reinterpret_cast < const grpc_sockaddr * > ( addr - > addr ) ,
addr - > len ) ;
} while ( err < 0 & & errno = = EINTR ) ;
char * name ;
char * addr_str ;
addr_str = grpc_sockaddr_to_uri ( addr ) ;
gpr_asprintf ( & name , " tcp-client:%s " , addr_str ) ;
grpc_fd * fdobj = grpc_fd_create ( fd , name , true ) ;
gpr_free ( name ) ;
gpr_free ( addr_str ) ;
if ( err > = 0 ) {
char * addr_str = grpc_sockaddr_to_uri ( addr ) ;
* ep = grpc_tcp_client_create_from_fd ( fdobj , channel_args , addr_str ) ;
@ -340,15 +340,15 @@ static void tcp_connect(grpc_closure* closure, grpc_endpoint** ep,
const grpc_resolved_address * addr ,
grpc_millis deadline ) {
grpc_resolved_address mapped_addr ;
grpc_fd * fdobj = nullptr ;
int fd = - 1 ;
grpc_error * error ;
* ep = nullptr ;
if ( ( error = grpc_tcp_client_prepare_fd ( channel_args , addr , & mapped_addr ,
& fdobj ) ) ! = GRPC_ERROR_NONE ) {
& fd ) ) ! = GRPC_ERROR_NONE ) {
grpc_core : : ExecCtx : : Run ( DEBUG_LOCATION , closure , error ) ;
return ;
}
grpc_tcp_client_create_from_prepared_fd ( interested_parties , closure , fdobj ,
grpc_tcp_client_create_from_prepared_fd ( interested_parties , closure , fd ,
channel_args , & mapped_addr , deadline ,
ep ) ;
}