Esempio n. 1
0
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 ;
}
Esempio n. 2
0
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 ;
}