Ejemplo n.º 1
0
/* recv_msg */
int recv_msg(	const int socket_fd, msg_header_t *msg,
				const in_addr_t block_ip, bool *blocked	)
{

	int rx_bytes = 0;

	// 1) read UDP message from network level
	if ( ( rx_bytes = recvmsg(socket_fd, msg, 0) ) < 0 )
	{
		log_sys_error("recv_msg: wrong <recvmsg> call. ");
		return(EX_ERR);
	}

	in_addr_t src_addr = get_source_address(msg);

	if ( block_ip == src_addr )
		{ *blocked = true; }
	else
		{ *blocked = false; }

	return(rx_bytes);

}
Ejemplo n.º 2
0
static int tr_globalAddress(int af, void* addr, int* addr_len)
{
    struct sockaddr_storage ss;
    socklen_t sslen = sizeof(ss);
    struct sockaddr_in sin;
    struct sockaddr_in6 sin6;
    struct sockaddr* sa;
    socklen_t salen;
    int rc;

    switch (af)
    {
    case AF_INET:
        memset(&sin, 0, sizeof(sin));
        sin.sin_family = AF_INET;
        evutil_inet_pton(AF_INET, "91.121.74.28", &sin.sin_addr);
        sin.sin_port = htons(6969);
        sa = (struct sockaddr*)&sin;
        salen = sizeof(sin);
        break;

    case AF_INET6:
        memset(&sin6, 0, sizeof(sin6));
        sin6.sin6_family = AF_INET6;
        /* In order for address selection to work right, this should be
           a native IPv6 address, not Teredo or 6to4. */
        evutil_inet_pton(AF_INET6, "2001:1890:1112:1::20", &sin6.sin6_addr);
        sin6.sin6_port = htons(6969);
        sa = (struct sockaddr*)&sin6;
        salen = sizeof(sin6);
        break;

    default:
        return -1;
    }

    rc = get_source_address(sa, salen, (struct sockaddr*)&ss, &sslen);

    if (rc < 0)
    {
        return -1;
    }

    if (global_unicast_address((struct sockaddr*)&ss) == 0)
    {
        return -1;
    }

    switch (af)
    {
    case AF_INET:
        if (*addr_len < 4)
        {
            return -1;
        }

        memcpy(addr, &((struct sockaddr_in*)&ss)->sin_addr, 4);
        *addr_len = 4;
        return 1;

    case AF_INET6:
        if (*addr_len < 16)
        {
            return -1;
        }

        memcpy(addr, &((struct sockaddr_in6*)&ss)->sin6_addr, 16);
        *addr_len = 16;
        return 1;

    default:
        return -1;
    }
}