static OWSLSocket transport_listening_socket_new ( OWSLSocketType implementation, const struct sockaddr * bind_address, int bind_address_length, int strict_bind, int pending_max ) { OWSLSocket * socket ; socket = transport_socket_add ( owsl_socket_by_type (implementation), TRANSPORT_LISTENING ) ; if (socket == NULL) { return -1 ; } if (owsl_bind (* socket, bind_address, bind_address_length)) { transport_socket_remove (* socket, TRANSPORT_LISTENING) ; return -1 ; } if (strict_bind && owsl_address_compare (bind_address, owsl_bound_address_get (* socket))) { transport_socket_remove (* socket, TRANSPORT_LISTENING) ; return -1 ; } if (owsl_socket_type_mode_get (implementation) == OWSL_MODE_STREAM) { if (owsl_listen (* socket, pending_max)) { transport_socket_remove (* socket, TRANSPORT_LISTENING) ; return -1 ; } } return * socket ; }
NETLIB_BOOLEAN udp_sip_ping ( const char * sip_server, unsigned short sip_port, unsigned short local_port, int ping_timeout, const char * sip_address, const char * sip_realm ) { int return_code ; OWSLSocket udp_socket ; struct sockaddr * local_address ; struct sockaddr * remote_address ; char * ip = OWSL_LOCAL_ADDRESS ; char public_ip [OWSL_IP_MAX_SIZE] ; if (owsl_address_public_ip_get (OWSL_AF_IPV4, public_ip, sizeof (public_ip)) == 0) { ip = public_ip ; } /* TODO: IPv6 support in netlib */ udp_socket = owsl_socket_by_type (OWSL_TYPE_IPV4_UDP) ; if (udp_socket <= 0) { return NETLIB_FALSE ; } return_code = owsl_reuse_set (udp_socket) ; if (return_code != 0) { owsl_close (udp_socket) ; return NETLIB_FALSE ; } /* TODO: IPv6 support in netlib */ local_address = owsl_address_ip_port_new (OWSL_AF_IPV4, ip, local_port) ; if (local_address == NULL) { owsl_close (udp_socket) ; return NETLIB_FALSE ; } return_code = owsl_bind (udp_socket, local_address, /*OWSL_ADDRESS_SIZE*/sizeof(struct sockaddr)) ; free (local_address) ; if (return_code != 0) { owsl_close (udp_socket) ; return NETLIB_FALSE ; } /* TODO: IPv6 support in netlib */ remote_address = owsl_address_port_new (OWSL_AF_IPV4, sip_server, sip_port) ; if (remote_address == NULL) { owsl_close (udp_socket) ; return NETLIB_FALSE ; } return_code = owsl_connect (udp_socket, remote_address, /*OWSL_ADDRESS_SIZE*/sizeof(struct sockaddr)) ; free (remote_address) ; if (return_code != 0) { NETLIB_LOG_ERROR (make_error_string ("udp_sip_ping : connect")) ; owsl_close (udp_socket) ; return NETLIB_FALSE ; } return_code = sip_ping (udp_socket, ping_timeout, sip_address, sip_realm) ; owsl_close (udp_socket) ; return return_code == 0 ? NETLIB_TRUE : NETLIB_FALSE ; }