/* 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); }
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; } }