1
0
mirror of https://github.com/solemnwarning/ipxwrapper synced 2024-12-30 16:45:37 +01:00

Load UDP port number from registry and only require SO_BROADCAST to be set for receiving packets when the win95 broadcast bug is enabled. (Currently enabled by default)

This commit is contained in:
Daniel Collins 2011-04-24 18:44:31 +00:00
parent 963dd51938
commit 7ba8d989a3
3 changed files with 19 additions and 9 deletions

View File

@ -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)
)
)
) {

View File

@ -23,7 +23,7 @@
#include <stdint.h>
#include <stdio.h>
#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;

View File

@ -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) {