From f1a6cf40a27e6192ff312b483a41278e2dad6dc3 Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Fri, 9 Sep 2011 19:03:19 +0000 Subject: [PATCH] Bugfix: Setup socket for sending packets with new router code properly. --- src/ipxwrapper.c | 29 ++++++++++++++++++++++++++++- src/ipxwrapper.h | 2 +- src/winsock.c | 2 +- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/ipxwrapper.c b/src/ipxwrapper.c index 4ee5fb3..98c61e3 100644 --- a/src/ipxwrapper.c +++ b/src/ipxwrapper.c @@ -40,7 +40,7 @@ ipx_socket *sockets = NULL; struct ipx_interface *nics = NULL; ipx_host *hosts = NULL; -SOCKET net_fd = -1; +SOCKET send_fd = -1; struct reg_global global_conf; HMODULE winsock2_dll = NULL; @@ -106,7 +106,34 @@ BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) { if(!rclient_start(&g_rclient)) { return FALSE; } + + if(g_rclient.router) { + send_fd = g_rclient.router->udp_sock; + }else{ + /* Create UDP socket for sending packets if not using a private router */ + + if((send_fd = socket(AF_INET, SOCK_DGRAM, 0)) == -1) { + log_printf("Failed to create UDP socket: %s", w32_error(WSAGetLastError())); + return FALSE; + } + + struct sockaddr_in addr; + addr.sin_family = AF_INET; + addr.sin_addr.s_addr = INADDR_ANY; + addr.sin_port = 0; + + if(bind(send_fd, (struct sockaddr*)&addr, sizeof(addr)) == -1) { + log_printf("Failed to bind UDP socket (send_fd): %s", w32_error(WSAGetLastError())); + return FALSE; + } + } }else if(why == DLL_PROCESS_DETACH) { + if(send_fd != -1 && !g_rclient.router) { + closesocket(send_fd); + } + + send_fd = -1; + rclient_stop(&g_rclient); WSACleanup(); diff --git a/src/ipxwrapper.h b/src/ipxwrapper.h index f89e3ce..5165a20 100644 --- a/src/ipxwrapper.h +++ b/src/ipxwrapper.h @@ -101,7 +101,7 @@ struct ipx_host { extern ipx_socket *sockets; extern struct ipx_interface *nics; extern ipx_host *hosts; -extern SOCKET net_fd; +extern SOCKET send_fd; extern struct reg_global global_conf; extern struct rclient g_rclient; diff --git a/src/winsock.c b/src/winsock.c index 545883f..4f2187d 100644 --- a/src/winsock.c +++ b/src/winsock.c @@ -622,7 +622,7 @@ int WSAAPI sendto(SOCKET fd, const char *buf, int len, int flags, const struct s saddr.sin_port = htons(global_conf.udp_port); saddr.sin_addr.s_addr = (host ? host->ipaddr : (global_conf.bcast_all ? INADDR_BROADCAST : sockptr->nic_bcast)); - int sval = r_sendto(net_fd, (char*)packet, psize, 0, (struct sockaddr*)&saddr, sizeof(saddr)); + int sval = r_sendto(send_fd, (char*)packet, psize, 0, (struct sockaddr*)&saddr, sizeof(saddr)); if(sval == -1) { len = -1; }