diff --git a/src/ipxwrapper.c b/src/ipxwrapper.c index 8e17d7b..2a0ad98 100644 --- a/src/ipxwrapper.c +++ b/src/ipxwrapper.c @@ -38,6 +38,7 @@ ipx_socket *sockets = NULL; ipx_nic *nics = NULL; ipx_host *hosts = NULL; SOCKET net_fd = -1; +struct reg_global global_conf; HMODULE winsock2_dll = NULL; HMODULE mswsock_dll = NULL; @@ -82,6 +83,13 @@ BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) { debug("Could not open registry: %s", w32_error(reg_err)); } + DWORD gsize = sizeof(global_conf); + + if(!regkey || RegQueryValueEx(regkey, "global", NULL, NULL, (BYTE*)&global_conf, &gsize) != ERROR_SUCCESS || gsize != sizeof(global_conf)) { + global_conf.udp_port = DEFAULT_PORT; + global_conf.w95_bug = 1; + } + if(!load_nics()) { return FALSE; } @@ -255,7 +263,7 @@ static int init_router(void) { struct sockaddr_in bind_addr; bind_addr.sin_family = AF_INET; bind_addr.sin_addr.s_addr = INADDR_ANY; - bind_addr.sin_port = htons(PORT); + bind_addr.sin_port = htons(global_conf.udp_port); if(bind(net_fd, (struct sockaddr*)&bind_addr, sizeof(bind_addr)) == -1) { debug("Failed to bind network socket: %s", w32_error(WSAGetLastError())); @@ -317,10 +325,6 @@ static DWORD WINAPI router_main(LPVOID buf) { add_host(packet->src_net, packet->src_node, ntohl(addr.sin_addr.s_addr)); for(sockptr = sockets; sockptr; sockptr = sockptr->next) { - /* TODO: Don't require IPX_BROADCAST for recieving broadcast packets - * (Make it optional? It was a bug in win95.) - */ - if( sockptr->flags & IPX_BOUND && sockptr->flags & IPX_RECV && @@ -332,13 +336,13 @@ static DWORD WINAPI router_main(LPVOID buf) { memcmp(packet->dest_net, sockptr->netnum, 4) == 0 || ( memcmp(packet->dest_net, f6, 4) == 0 && - sockptr->flags & IPX_BROADCAST + (!global_conf.w95_bug || sockptr->flags & IPX_BROADCAST) ) ) && ( memcmp(packet->dest_node, sockptr->nodenum, 6) == 0 || ( memcmp(packet->dest_node, f6, 6) == 0 && - sockptr->flags & IPX_BROADCAST + (!global_conf.w95_bug || sockptr->flags & IPX_BROADCAST) ) ) ) { diff --git a/src/ipxwrapper.h b/src/ipxwrapper.h index a7f93df..cb07848 100644 --- a/src/ipxwrapper.h +++ b/src/ipxwrapper.h @@ -23,7 +23,7 @@ #include #include -#define PORT 54792 +#define DEFAULT_PORT 54792 #define TTL 60 #define DEBUG "ipxwrapper.log" @@ -140,10 +140,16 @@ struct reg_value { unsigned char primary; } __attribute__((__packed__)); +struct reg_global { + uint16_t udp_port; + unsigned char w95_bug; +} __attribute__((__packed__)); + extern ipx_socket *sockets; extern ipx_nic *nics; extern ipx_host *hosts; extern SOCKET net_fd; +extern struct reg_global global_conf; extern HMODULE winsock2_dll; extern HMODULE mswsock_dll; diff --git a/src/winsock.c b/src/winsock.c index d0a853d..70a8519 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -664,7 +664,7 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s struct sockaddr_in saddr; saddr.sin_family = AF_INET; saddr.sin_addr.s_addr = INADDR_BROADCAST; - saddr.sin_port = htons(PORT); + saddr.sin_port = htons(global_conf.udp_port); int sval = r_sendto(net_fd, (char*)packet, psize, 0, (struct sockaddr*)&saddr, sizeof(saddr)); if(sval == -1) {