@@ -513,6 +513,12 @@ static int sys_listen(void *obj, Socket sock, int backlog)
513513 return listen (net_socket_to_native (sock ), backlog );
514514}
515515
516+ non_null ()
517+ static int sys_connect (void * obj , Socket sock , const Network_Addr * addr )
518+ {
519+ return connect (net_socket_to_native (sock ), (const struct sockaddr * )& addr -> addr , addr -> size );
520+ }
521+
516522non_null ()
517523static int sys_recvbuf (void * obj , Socket sock )
518524{
@@ -591,6 +597,7 @@ static const Network_Funcs os_network_funcs = {
591597 sys_accept ,
592598 sys_bind ,
593599 sys_listen ,
600+ sys_connect ,
594601 sys_recvbuf ,
595602 sys_recv ,
596603 sys_recvfrom ,
@@ -1921,22 +1928,21 @@ bool addr_resolve_or_parse_ip(const Network *ns, const char *address, IP *to, IP
19211928 return true;
19221929}
19231930
1924- bool net_connect (const Memory * mem , const Logger * log , Socket sock , const IP_Port * ip_port )
1931+ bool net_connect (const Network * ns , const Memory * mem , const Logger * log , Socket sock , const IP_Port * ip_port )
19251932{
1926- struct sockaddr_storage addr = {0 };
1927- size_t addrsize ;
1933+ Network_Addr addr = {{0 }};
19281934
19291935 if (net_family_is_ipv4 (ip_port -> ip .family )) {
1930- struct sockaddr_in * addr4 = (struct sockaddr_in * )& addr ;
1936+ struct sockaddr_in * addr4 = (struct sockaddr_in * )& addr . addr ;
19311937
1932- addrsize = sizeof (struct sockaddr_in );
1938+ addr . size = sizeof (struct sockaddr_in );
19331939 addr4 -> sin_family = AF_INET ;
19341940 fill_addr4 (& ip_port -> ip .ip .v4 , & addr4 -> sin_addr );
19351941 addr4 -> sin_port = ip_port -> port ;
19361942 } else if (net_family_is_ipv6 (ip_port -> ip .family )) {
1937- struct sockaddr_in6 * addr6 = (struct sockaddr_in6 * )& addr ;
1943+ struct sockaddr_in6 * addr6 = (struct sockaddr_in6 * )& addr . addr ;
19381944
1939- addrsize = sizeof (struct sockaddr_in6 );
1945+ addr . size = sizeof (struct sockaddr_in6 );
19401946 addr6 -> sin6_family = AF_INET6 ;
19411947 fill_addr6 (& ip_port -> ip .ip .v6 , & addr6 -> sin6_addr );
19421948 addr6 -> sin6_port = ip_port -> port ;
@@ -1958,7 +1964,7 @@ bool net_connect(const Memory *mem, const Logger *log, Socket sock, const IP_Por
19581964 net_socket_to_native (sock ), net_ip_ntoa (& ip_port -> ip , & ip_str ), net_ntohs (ip_port -> port ));
19591965 errno = 0 ;
19601966
1961- if (connect (net_socket_to_native ( sock ), ( struct sockaddr * ) & addr , addrsize ) == -1 ) {
1967+ if (ns -> funcs -> connect (ns -> obj , sock , & addr ) == -1 ) {
19621968 const int error = net_error ();
19631969
19641970 // Non-blocking socket: "Operation in progress" means it's connecting.
0 commit comments