diff --git a/mkstubs.pl b/mkstubs.pl index 0115b55..9be892a 100644 --- a/mkstubs.pl +++ b/mkstubs.pl @@ -71,7 +71,7 @@ foreach my $func(@stubs) { if($do_logging) { print CODE "\tpush\t$f_name\_sym\n"; - print CODE "\tpush\tdword $dllnum\n"; + print CODE "\tpush\tdword ".$func->{"dllnum"}."\n"; print CODE "\tcall\t_log_call\n"; } diff --git a/src/addrcache.h b/src/addrcache.h index d5fd1b2..c293d1a 100644 --- a/src/addrcache.h +++ b/src/addrcache.h @@ -22,8 +22,7 @@ #include #include -typedef unsigned char netnum_t[4]; -typedef unsigned char nodenum_t[6]; +#include "common.h" extern unsigned int addr_cache_ttl; diff --git a/src/common.c b/src/common.c index 5786bf2..5f7d56f 100644 --- a/src/common.c +++ b/src/common.c @@ -45,6 +45,36 @@ const char *w32_error(DWORD errnum) { return buf; } +/* Format an IPX address as a string. + * + * The socket number should be in network byte order and the supplied buffer + * must be at least IPX_SADDR_SIZE bytes long. +*/ +void ipx_to_string(char *buf, const netnum_t net, const nodenum_t node, uint16_t sock) +{ + /* World's ugliest use of sprintf? */ + + sprintf( + buf, + + "%02X:%02X:%02X:%02X/%02X:%02X:%02X:%02X:%02X:%02X/%hu", + + (unsigned int)(unsigned char)(net[0]), + (unsigned int)(unsigned char)(net[1]), + (unsigned int)(unsigned char)(net[2]), + (unsigned int)(unsigned char)(net[3]), + + (unsigned int)(unsigned char)(node[0]), + (unsigned int)(unsigned char)(node[1]), + (unsigned int)(unsigned char)(node[2]), + (unsigned int)(unsigned char)(node[3]), + (unsigned int)(unsigned char)(node[4]), + (unsigned int)(unsigned char)(node[5]), + + ntohs(sock) + ); +} + BOOL reg_open(REGSAM access) { int err = RegOpenKeyEx(HKEY_CURRENT_USER, "Software\\IPXWrapper", 0, access, ®key); diff --git a/src/common.h b/src/common.h index 181ec5a..5d04fa2 100644 --- a/src/common.h +++ b/src/common.h @@ -22,25 +22,10 @@ #include #include -#define NET_TO_STRING(s, net) \ - sprintf( \ - s, "%02X:%02X:%02X:%02X", \ - (unsigned int)(unsigned char)(net[0]), \ - (unsigned int)(unsigned char)(net[1]), \ - (unsigned int)(unsigned char)(net[2]), \ - (unsigned int)(unsigned char)(net[3]) \ - ) +#define IPX_SADDR_SIZE 36 -#define NODE_TO_STRING(s, node) \ - sprintf( \ - s, "%02X:%02X:%02X:%02X:%02X:%02X", \ - (unsigned int)(unsigned char)(node[0]), \ - (unsigned int)(unsigned char)(node[1]), \ - (unsigned int)(unsigned char)(node[2]), \ - (unsigned int)(unsigned char)(node[3]), \ - (unsigned int)(unsigned char)(node[4]), \ - (unsigned int)(unsigned char)(node[5]) \ - ) +typedef unsigned char netnum_t[4]; +typedef unsigned char nodenum_t[6]; enum ipx_log_level { LOG_CALL = 1, @@ -56,6 +41,12 @@ extern enum ipx_log_level min_log_level; const char *w32_error(DWORD errnum); +#define IPX_STRING_ADDR(var, net, node, sock) \ + char var[IPX_SADDR_SIZE]; \ + ipx_to_string(var, net, node, sock); + +void ipx_to_string(char *buf, const netnum_t net, const nodenum_t node, uint16_t sock); + BOOL reg_open(REGSAM access); void reg_close(void); diff --git a/src/interface.c b/src/interface.c index fc954f9..23bb6c1 100644 --- a/src/interface.c +++ b/src/interface.c @@ -59,8 +59,24 @@ struct ipx_interface *get_interfaces(int ifnum) { struct reg_value rv; int got_rv = 0; + /* Format the hardware address as a hex string for fetching + * settings from the registry. + */ + char vname[18]; - NODE_TO_STRING(vname, ifptr->Address); + + sprintf( + vname, + + "%02X:%02X:%02X:%02X:%02X:%02X", + + (unsigned int)(unsigned char)(ifptr->Address[0]), + (unsigned int)(unsigned char)(ifptr->Address[1]), + (unsigned int)(unsigned char)(ifptr->Address[2]), + (unsigned int)(unsigned char)(ifptr->Address[3]), + (unsigned int)(unsigned char)(ifptr->Address[4]), + (unsigned int)(unsigned char)(ifptr->Address[5]) + ); if(reg_get_bin(vname, &rv, sizeof(rv)) == sizeof(rv)) { got_rv = 1; diff --git a/src/mswsock_stubs.txt b/src/mswsock_stubs.txt index 3bc0062..a0e474b 100644 --- a/src/mswsock_stubs.txt +++ b/src/mswsock_stubs.txt @@ -32,3 +32,4 @@ s_perror sethostname inet_addr WSHEnumProtocols:0 +ntohs:1 diff --git a/src/router.c b/src/router.c index ccce844..90a0e8e 100644 --- a/src/router.c +++ b/src/router.c @@ -278,15 +278,10 @@ DWORD router_main(void *arg) { } if(min_log_level <= LOG_DEBUG) { - char src_net[12], src_node[18]; - NET_TO_STRING(src_net, packet->src_net); - NODE_TO_STRING(src_node, packet->src_node); + IPX_STRING_ADDR(src_addr, packet->src_net, packet->src_node, packet->src_socket); + IPX_STRING_ADDR(dest_addr, packet->dest_net, packet->dest_node, packet->dest_socket); - char dest_net[12], dest_node[18]; - NET_TO_STRING(dest_net, packet->dest_net); - NODE_TO_STRING(dest_node, packet->dest_node); - - log_printf(LOG_DEBUG, "Recieved packet from %s/%s (%s) for %s/%s", src_net, src_node, inet_ntoa(addr.sin_addr), dest_net, dest_node); + log_printf(LOG_DEBUG, "Recieved packet from %s (%s) for %s", src_addr, inet_ntoa(addr.sin_addr), dest_addr); } memset(rp_header, 0, sizeof(*rp_header)); diff --git a/src/winsock.c b/src/winsock.c index 24e1976..e183abe 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -233,7 +233,6 @@ int WSAAPI bind(SOCKET fd, const struct sockaddr *addr, int addrlen) { if(ptr) { struct sockaddr_ipx ipxaddr; - char net_s[12], node_s[18]; if(addrlen < sizeof(ipxaddr)) { RETURN_WSA(WSAEFAULT, -1); @@ -241,10 +240,9 @@ int WSAAPI bind(SOCKET fd, const struct sockaddr *addr, int addrlen) { memcpy(&ipxaddr, addr, sizeof(ipxaddr)); - NET_TO_STRING(net_s, ipxaddr.sa_netnum); - NODE_TO_STRING(node_s, ipxaddr.sa_nodenum); + IPX_STRING_ADDR(req_addr_s, ipxaddr.sa_netnum, ipxaddr.sa_nodenum, ipxaddr.sa_socket); - log_printf(LOG_INFO, "bind(%d, net=%s node=%s socket=%hu)", fd, net_s, node_s, ntohs(ipxaddr.sa_socket)); + log_printf(LOG_INFO, "bind(%d, %s)", fd, req_addr_s); if(ptr->flags & IPX_BOUND) { log_printf(LOG_ERROR, "bind failed: socket already bound"); @@ -255,10 +253,9 @@ int WSAAPI bind(SOCKET fd, const struct sockaddr *addr, int addrlen) { RETURN(-1); } - NET_TO_STRING(net_s, ipxaddr.sa_netnum); - NODE_TO_STRING(node_s, ipxaddr.sa_nodenum); + IPX_STRING_ADDR(got_addr_s, ipxaddr.sa_netnum, ipxaddr.sa_nodenum, ipxaddr.sa_socket); - log_printf(LOG_INFO, "bind address: net=%s node=%s socket=%hu", net_s, node_s, ntohs(ipxaddr.sa_socket)); + log_printf(LOG_INFO, "bind address: %s", got_addr_s); struct sockaddr_in bind_addr; bind_addr.sin_family = AF_INET; @@ -363,12 +360,11 @@ static int recv_packet(ipx_socket *sockptr, char *buf, int bufsize, int flags, s return -1; } - if(min_log_level <= LOG_DEBUG) { - char net_s[12], node_s[18]; - NET_TO_STRING(net_s, packet->src_net); - NODE_TO_STRING(node_s, packet->src_node); + if(min_log_level <= LOG_DEBUG) + { + IPX_STRING_ADDR(addr_s, packet->src_net, packet->src_node, packet->src_socket); - log_printf(LOG_DEBUG, "Received packet from %s/%s", net_s, node_s); + log_printf(LOG_DEBUG, "Received packet from %s", addr_s); } /* TODO: Move full sockaddr into rp_header? */ @@ -799,11 +795,9 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s struct sockaddr_in *v4 = (struct sockaddr_in*)&send_addr; - char net_s[12], node_s[18]; - NET_TO_STRING(net_s, packet->dest_net); - NODE_TO_STRING(node_s, packet->dest_node); + IPX_STRING_ADDR(addr_s, packet->dest_net, packet->dest_node, packet->dest_socket); - log_printf(LOG_DEBUG, "Sending packet to %s/%s (%s)", net_s, node_s, inet_ntoa(v4->sin_addr)); + log_printf(LOG_DEBUG, "Sending packet to %s (%s)", addr_s, inet_ntoa(v4->sin_addr)); } int sval = r_sendto(send_fd, (char*)packet, psize, 0, (struct sockaddr*)&send_addr, addrlen);