extern int trans_net(unsigned int clientaddr, unsigned int *addr, unsigned short *port) { t_elem const *curr; t_trans *entry; char temp1[32]; char temp2[32]; char temp3[32]; char temp4[32]; #ifdef DEBUG_TRANS eventlog(eventlog_level_debug, __FUNCTION__, "checking %s for client %s ...", addr_num_to_addr_str(*addr, *port), addr_num_to_ip_str(clientaddr)); #endif if (trans_head) { LIST_TRAVERSE_CONST(trans_head, curr) { if (!(entry = (t_trans*)elem_get_data(curr))) { eventlog(eventlog_level_error, __FUNCTION__, "found NULL entry in list"); continue; } #ifdef DEBUG_TRANS eventlog(eventlog_level_debug, __FUNCTION__, "against entry -> %s output %s network %s", addr_get_addr_str(entry->input, temp1, sizeof(temp1)), addr_get_addr_str(entry->output, temp2, sizeof(temp2)), netaddr_get_addr_str(entry->network, temp3, sizeof(temp3))); #endif if (addr_get_ip(entry->input) != *addr || addr_get_port(entry->input) != *port) { #ifdef DEBUG_TRANS eventlog(eventlog_level_debug, __FUNCTION__, "entry does match input address"); #endif continue; } if (netaddr_contains_addr_num(entry->network, clientaddr) == 0) { #ifdef DEBUG_TRANS eventlog(eventlog_level_debug, __FUNCTION__, "client is not in the correct network"); #endif continue; } #ifdef DEBUG_TRANS eventlog(eventlog_level_debug, __FUNCTION__, "%s translated to %s", addr_num_to_addr_str(*addr, *port), addr_get_addr_str(entry->output, temp4, sizeof(temp4))); #endif *addr = addr_get_ip(entry->output); *port = addr_get_port(entry->output); return 1; /* match found in list */ } } #ifdef DEBUG_TRANS eventlog(eventlog_level_debug, __FUNCTION__, "no match found for %s (not translated)", addr_num_to_addr_str(*addr, *port)); #endif return 0; /* no match found in list */ }
extern void gametrans_net(unsigned int vaddr, unsigned short vport, unsigned int laddr, unsigned short lport, unsigned int * addr, unsigned short * port) { const t_elem *curr; t_gametrans *entry; #ifdef DEBUGGAMETRANS char temp1[32]; char temp2[32]; char temp3[32]; char temp4[32]; #endif #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","checking client %s (viewer on %s connected to %s)...", addr_num_to_addr_str(*addr,*port), addr_num_to_addr_str(vaddr,vport), addr_num_to_addr_str(laddr,lport)); #else (void)vport; #endif if (gametrans_head) { LIST_TRAVERSE_CONST(gametrans_head,curr) { if (!(entry = elem_get_data(curr))) { eventlog(eventlog_level_error,"gametrans_net","found NULL entry in list"); continue; } #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","against entry viewerint=%s client=%s output=%s viewerex=%s", addr_get_addr_str(entry->viewer,temp1,sizeof(temp1)), addr_get_addr_str(entry->client,temp2,sizeof(temp2)), addr_get_addr_str(entry->output,temp3,sizeof(temp3)), netaddr_get_addr_str(entry->exclude,temp4,sizeof(temp4))); #endif if (addr_get_ip(entry->viewer)!=0 && addr_get_ip(entry->viewer)!=laddr) { #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","viewer is not on right interface IP"); #endif continue; } if (addr_get_port(entry->viewer)!=0 && addr_get_port(entry->viewer)!=lport) { #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","view is not on right interface port"); #endif continue; } if (addr_get_ip(entry->client)!=0 && addr_get_ip(entry->client)!=*addr) { #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","client is not on the right IP"); #endif continue; } if (addr_get_port(entry->client)!=0 && addr_get_port(entry->client)!=*port) { #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","client is not on the right port"); #endif continue; } if (netaddr_contains_addr_num(entry->exclude,vaddr)==1) { #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","viewer is in the excluded network"); #endif continue; } *addr = addr_get_ip(entry->output); *port = addr_get_port(entry->output); #ifdef DEBUGGAMETRANS eventlog(eventlog_level_debug,"gametrans_net","did translation"); #endif return; } } }