mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
More code cleanup
This commit is contained in:
parent
1a54e5208d
commit
8b1c53e0bd
7
Makefile
7
Makefile
@ -17,7 +17,8 @@
|
|||||||
CFLAGS := -Wall -I./include/
|
CFLAGS := -Wall -I./include/
|
||||||
CXXFLAGS := -Wall -I./include/
|
CXXFLAGS := -Wall -I./include/
|
||||||
|
|
||||||
IPXWRAPPER_DEPS := src/ipxwrapper.o src/winsock.o src/ipxwrapper_stubs.o src/log.o src/common.o src/ipxwrapper.def
|
IPXWRAPPER_DEPS := src/ipxwrapper.o src/winsock.o src/ipxwrapper_stubs.o src/log.o src/common.o \
|
||||||
|
src/interface.o src/ipxwrapper.def
|
||||||
|
|
||||||
BIN_FILES := changes.txt license.txt readme.txt ipxwrapper.dll mswsock.dll wsock32.dll ipxconfig.exe
|
BIN_FILES := changes.txt license.txt readme.txt ipxwrapper.dll mswsock.dll wsock32.dll ipxconfig.exe
|
||||||
SRC_FILES := changes.txt license.txt Makefile mkstubs.pl readme.txt src/config.h src/ipxconfig.cpp \
|
SRC_FILES := changes.txt license.txt Makefile mkstubs.pl readme.txt src/config.h src/ipxconfig.cpp \
|
||||||
@ -53,7 +54,7 @@ ipxconfig.exe: src/ipxconfig.cpp
|
|||||||
$(CXX) $(CXXFLAGS) -static-libgcc -static-libstdc++ -Wl,-s -D_WIN32_IE=0x0400 -mwindows -o ipxconfig.exe src/ipxconfig.cpp -liphlpapi
|
$(CXX) $(CXXFLAGS) -static-libgcc -static-libstdc++ -Wl,-s -D_WIN32_IE=0x0400 -mwindows -o ipxconfig.exe src/ipxconfig.cpp -liphlpapi
|
||||||
|
|
||||||
dpwsockx.dll: src/directplay.o src/log.o src/dpwsockx_stubs.o src/common.o ipxwrapper.dll
|
dpwsockx.dll: src/directplay.o src/log.o src/dpwsockx_stubs.o src/common.o ipxwrapper.dll
|
||||||
$(CC) $(CFLAGS) -Wl,--enable-stdcall-fixup,-s -shared -o dpwsockx.dll src/directplay.o src/log.o src/common.o src/dpwsockx_stubs.o src/dpwsockx.def -L. -lipxwrapper -lwsock32 -liphlpapi
|
$(CC) $(CFLAGS) -Wl,--enable-stdcall-fixup,-s -shared -o dpwsockx.dll src/directplay.o src/log.o src/common.o src/dpwsockx_stubs.o src/dpwsockx.def -L. -lipxwrapper -lwsock32
|
||||||
|
|
||||||
src/ipxwrapper_stubs.s: src/ipxwrapper_stubs.txt
|
src/ipxwrapper_stubs.s: src/ipxwrapper_stubs.txt
|
||||||
perl mkstubs.pl src/ipxwrapper_stubs.txt src/ipxwrapper_stubs.s
|
perl mkstubs.pl src/ipxwrapper_stubs.txt src/ipxwrapper_stubs.s
|
||||||
@ -68,7 +69,7 @@ src/dpwsockx_stubs.s: src/dpwsockx_stubs.txt
|
|||||||
perl mkstubs.pl src/dpwsockx_stubs.txt src/dpwsockx_stubs.s dpwsockx.dll
|
perl mkstubs.pl src/dpwsockx_stubs.txt src/dpwsockx_stubs.s dpwsockx.dll
|
||||||
|
|
||||||
%.dll: src/stubdll.o src/%_stubs.o src/log.o src/common.o src/%.def
|
%.dll: src/stubdll.o src/%_stubs.o src/log.o src/common.o src/%.def
|
||||||
$(CC) $(CFLAGS) -Wl,--enable-stdcall-fixup,-s -shared -o $@ $^ -liphlpapi
|
$(CC) $(CFLAGS) -Wl,--enable-stdcall-fixup,-s -shared -o $@ $^
|
||||||
|
|
||||||
src/%_stubs.o: src/%_stubs.s
|
src/%_stubs.o: src/%_stubs.s
|
||||||
nasm -f win32 -o $@ $<
|
nasm -f win32 -o $@ $<
|
||||||
|
114
src/common.c
114
src/common.c
@ -106,117 +106,3 @@ HMODULE load_sysdll(const char *name) {
|
|||||||
|
|
||||||
return dll;
|
return dll;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Get virtual IPX interfaces
|
|
||||||
* Select a single interface by setting ifnum >= 0
|
|
||||||
*/
|
|
||||||
struct ipx_interface *get_interfaces(int ifnum) {
|
|
||||||
IP_ADAPTER_INFO *ifroot, tbuf;
|
|
||||||
ULONG bufsize = sizeof(IP_ADAPTER_INFO);
|
|
||||||
|
|
||||||
int err = GetAdaptersInfo(&tbuf, &bufsize);
|
|
||||||
if(err == ERROR_NO_DATA) {
|
|
||||||
log_printf("No network interfaces detected!");
|
|
||||||
return NULL;
|
|
||||||
}else if(err != ERROR_SUCCESS && err != ERROR_BUFFER_OVERFLOW) {
|
|
||||||
log_printf("Error fetching network interfaces: %s", w32_error(err));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(!(ifroot = malloc(bufsize))) {
|
|
||||||
log_printf("Out of memory! (Tried to allocate %u bytes)", (unsigned int)bufsize);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
err = GetAdaptersInfo(ifroot, &bufsize);
|
|
||||||
if(err != ERROR_SUCCESS) {
|
|
||||||
log_printf("Error fetching network interfaces: %s", w32_error(err));
|
|
||||||
|
|
||||||
free(ifroot);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ipx_interface *nics = NULL, *enic = NULL;
|
|
||||||
|
|
||||||
IP_ADAPTER_INFO *ifptr = ifroot;
|
|
||||||
int this_ifnum = 0;
|
|
||||||
|
|
||||||
while(ifptr) {
|
|
||||||
if(ifnum >= 0 && this_ifnum++ != ifnum) {
|
|
||||||
ifptr = ifptr->Next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct reg_value rv;
|
|
||||||
int got_rv = 0;
|
|
||||||
|
|
||||||
char vname[18];
|
|
||||||
NODE_TO_STRING(vname, ifptr->Address);
|
|
||||||
|
|
||||||
if(reg_get_bin(vname, &rv, sizeof(rv)) == sizeof(rv)) {
|
|
||||||
got_rv = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(got_rv && !rv.enabled) {
|
|
||||||
/* Interface has been disabled, don't add it */
|
|
||||||
ifptr = ifptr->Next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct ipx_interface *nnic = malloc(sizeof(struct ipx_interface));
|
|
||||||
if(!nnic) {
|
|
||||||
log_printf("Out of memory! (Tried to allocate %u bytes)", (unsigned int)sizeof(struct ipx_interface));
|
|
||||||
|
|
||||||
free_interfaces(nics);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
nnic->ipaddr = inet_addr(ifptr->IpAddressList.IpAddress.String);
|
|
||||||
nnic->netmask = inet_addr(ifptr->IpAddressList.IpMask.String);
|
|
||||||
nnic->bcast = nnic->ipaddr | ~nnic->netmask;
|
|
||||||
|
|
||||||
memcpy(nnic->hwaddr, ifptr->Address, 6);
|
|
||||||
|
|
||||||
if(got_rv) {
|
|
||||||
memcpy(nnic->ipx_net, rv.ipx_net, 4);
|
|
||||||
memcpy(nnic->ipx_node, rv.ipx_node, 6);
|
|
||||||
}else{
|
|
||||||
unsigned char net[] = {0,0,0,1};
|
|
||||||
|
|
||||||
memcpy(nnic->ipx_net, net, 4);
|
|
||||||
memcpy(nnic->ipx_node, nnic->hwaddr, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
nnic->next = NULL;
|
|
||||||
|
|
||||||
if(got_rv && rv.primary) {
|
|
||||||
/* Force primary flag set, insert at start of NIC list */
|
|
||||||
nnic->next = nics;
|
|
||||||
nics = nnic;
|
|
||||||
|
|
||||||
if(!enic) {
|
|
||||||
enic = nnic;
|
|
||||||
}
|
|
||||||
}else if(enic) {
|
|
||||||
enic->next = nnic;
|
|
||||||
enic = nnic;
|
|
||||||
}else{
|
|
||||||
enic = nics = nnic;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifptr = ifptr->Next;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(ifroot);
|
|
||||||
|
|
||||||
return nics;
|
|
||||||
}
|
|
||||||
|
|
||||||
void free_interfaces(struct ipx_interface *iface) {
|
|
||||||
while(iface) {
|
|
||||||
struct ipx_interface *del = iface;
|
|
||||||
iface = iface->next;
|
|
||||||
|
|
||||||
free(del);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@ -69,6 +69,7 @@ DWORD reg_get_bin(const char *val_name, void *buf, DWORD size);
|
|||||||
|
|
||||||
HMODULE load_sysdll(const char *name);
|
HMODULE load_sysdll(const char *name);
|
||||||
|
|
||||||
|
/* interface.c functions */
|
||||||
struct ipx_interface *get_interfaces(int ifnum);
|
struct ipx_interface *get_interfaces(int ifnum);
|
||||||
void free_interfaces(struct ipx_interface *iface);
|
void free_interfaces(struct ipx_interface *iface);
|
||||||
|
|
||||||
|
110
src/ipxwrapper.c
110
src/ipxwrapper.c
@ -36,7 +36,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
ipx_socket *sockets = NULL;
|
ipx_socket *sockets = NULL;
|
||||||
ipx_nic *nics = NULL;
|
struct ipx_interface *nics = NULL;
|
||||||
ipx_host *hosts = NULL;
|
ipx_host *hosts = NULL;
|
||||||
SOCKET net_fd = -1;
|
SOCKET net_fd = -1;
|
||||||
struct reg_global global_conf;
|
struct reg_global global_conf;
|
||||||
@ -53,7 +53,6 @@ static DWORD router_tid = 0;
|
|||||||
static int init_router(void);
|
static int init_router(void);
|
||||||
static DWORD WINAPI router_main(LPVOID argp);
|
static DWORD WINAPI router_main(LPVOID argp);
|
||||||
static void add_host(const unsigned char *net, const unsigned char *node, uint32_t ipaddr);
|
static void add_host(const unsigned char *net, const unsigned char *node, uint32_t ipaddr);
|
||||||
static BOOL load_nics(void);
|
|
||||||
|
|
||||||
BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) {
|
BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) {
|
||||||
if(why == DLL_PROCESS_ATTACH) {
|
if(why == DLL_PROCESS_ATTACH) {
|
||||||
@ -76,9 +75,7 @@ BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) {
|
|||||||
global_conf.filter = 1;
|
global_conf.filter = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!load_nics()) {
|
nics = get_interfaces(-1);
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
mutex = CreateMutex(NULL, FALSE, NULL);
|
mutex = CreateMutex(NULL, FALSE, NULL);
|
||||||
if(!mutex) {
|
if(!mutex) {
|
||||||
@ -115,6 +112,8 @@ BOOL WINAPI DllMain(HINSTANCE me, DWORD why, LPVOID res) {
|
|||||||
mutex = NULL;
|
mutex = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free_interfaces(nics);
|
||||||
|
|
||||||
WSACleanup();
|
WSACleanup();
|
||||||
|
|
||||||
reg_close();
|
reg_close();
|
||||||
@ -182,33 +181,6 @@ void unlock_mutex(void) {
|
|||||||
while(ReleaseMutex(mutex)) {}
|
while(ReleaseMutex(mutex)) {}
|
||||||
}
|
}
|
||||||
|
|
||||||
IP_ADAPTER_INFO *get_nics(void) {
|
|
||||||
IP_ADAPTER_INFO *buf, tbuf;
|
|
||||||
ULONG bufsize = sizeof(IP_ADAPTER_INFO);
|
|
||||||
|
|
||||||
int rval = GetAdaptersInfo(&tbuf, &bufsize);
|
|
||||||
if(rval != ERROR_SUCCESS && rval != ERROR_BUFFER_OVERFLOW) {
|
|
||||||
WSASetLastError(rval);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = malloc(bufsize);
|
|
||||||
if(!buf) {
|
|
||||||
WSASetLastError(ERROR_OUTOFMEMORY);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
rval = GetAdaptersInfo(buf, &bufsize);
|
|
||||||
if(rval != ERROR_SUCCESS) {
|
|
||||||
WSASetLastError(rval);
|
|
||||||
free(buf);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Initialize and start the router thread */
|
/* Initialize and start the router thread */
|
||||||
static int init_router(void) {
|
static int init_router(void) {
|
||||||
net_fd = r_socket(AF_INET, SOCK_DGRAM, 0);
|
net_fd = r_socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
@ -270,7 +242,7 @@ static DWORD WINAPI router_main(LPVOID notused) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(global_conf.filter) {
|
if(global_conf.filter) {
|
||||||
ipx_nic *nic = nics;
|
struct ipx_interface *nic = nics;
|
||||||
|
|
||||||
while(nic) {
|
while(nic) {
|
||||||
if((nic->ipaddr & nic->netmask) == (addr.sin_addr.s_addr & nic->netmask)) {
|
if((nic->ipaddr & nic->netmask) == (addr.sin_addr.s_addr & nic->netmask)) {
|
||||||
@ -409,75 +381,3 @@ ipx_host *find_host(const unsigned char *net, const unsigned char *node) {
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL load_nics(void) {
|
|
||||||
IP_ADAPTER_INFO *ifroot = get_nics();
|
|
||||||
IP_ADAPTER_INFO *ifptr = ifroot;
|
|
||||||
ipx_nic *enic = NULL;
|
|
||||||
|
|
||||||
if(!ifptr) {
|
|
||||||
log_printf("No NICs: %s", w32_error(WSAGetLastError()));
|
|
||||||
}
|
|
||||||
|
|
||||||
while(ifptr) {
|
|
||||||
struct reg_value rv;
|
|
||||||
int got_rv = 0;
|
|
||||||
|
|
||||||
char vname[18];
|
|
||||||
NODE_TO_STRING(vname, ifptr->Address);
|
|
||||||
|
|
||||||
if(reg_get_bin(vname, &rv, sizeof(rv)) == sizeof(rv)) {
|
|
||||||
got_rv = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(got_rv && !rv.enabled) {
|
|
||||||
/* Interface has been disabled, don't add it */
|
|
||||||
ifptr = ifptr->Next;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ipx_nic *nnic = malloc(sizeof(ipx_nic));
|
|
||||||
if(!nnic) {
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
nnic->ipaddr = inet_addr(ifptr->IpAddressList.IpAddress.String);
|
|
||||||
nnic->netmask = inet_addr(ifptr->IpAddressList.IpMask.String);
|
|
||||||
nnic->bcast = nnic->ipaddr | ~nnic->netmask;
|
|
||||||
|
|
||||||
memcpy(nnic->hwaddr, ifptr->Address, 6);
|
|
||||||
|
|
||||||
if(got_rv) {
|
|
||||||
memcpy(nnic->ipx_net, rv.ipx_net, 4);
|
|
||||||
memcpy(nnic->ipx_node, rv.ipx_node, 6);
|
|
||||||
}else{
|
|
||||||
unsigned char net[] = {0,0,0,1};
|
|
||||||
|
|
||||||
memcpy(nnic->ipx_net, net, 4);
|
|
||||||
memcpy(nnic->ipx_node, nnic->hwaddr, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
nnic->next = NULL;
|
|
||||||
|
|
||||||
if(got_rv && rv.primary) {
|
|
||||||
/* Force primary flag set, insert at start of NIC list */
|
|
||||||
nnic->next = nics;
|
|
||||||
nics = nnic;
|
|
||||||
|
|
||||||
if(!enic) {
|
|
||||||
enic = nnic;
|
|
||||||
}
|
|
||||||
}else if(enic) {
|
|
||||||
enic->next = nnic;
|
|
||||||
enic = nnic;
|
|
||||||
}else{
|
|
||||||
enic = nics = nnic;
|
|
||||||
}
|
|
||||||
|
|
||||||
ifptr = ifptr->Next;
|
|
||||||
}
|
|
||||||
|
|
||||||
free(ifroot);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
@ -66,13 +66,13 @@ struct ipx_socket {
|
|||||||
uint8_t f_ptype; /* Undefined when IPX_FILTER isn't set */
|
uint8_t f_ptype; /* Undefined when IPX_FILTER isn't set */
|
||||||
|
|
||||||
/* The following values are undefined when IPX_BOUND is not set */
|
/* The following values are undefined when IPX_BOUND is not set */
|
||||||
ipx_nic *nic;
|
struct ipx_interface *nic;
|
||||||
uint16_t socket; /* Stored in NETWORK BYTE ORDER */
|
uint16_t socket; /* Stored in NETWORK BYTE ORDER */
|
||||||
|
|
||||||
/* Extra bind address, only used for receiving packets.
|
/* Extra bind address, only used for receiving packets.
|
||||||
* Only defined when IPX_EX_BOUND is set.
|
* Only defined when IPX_EX_BOUND is set.
|
||||||
*/
|
*/
|
||||||
ipx_nic *ex_nic;
|
struct ipx_interface *ex_nic;
|
||||||
uint16_t ex_socket;
|
uint16_t ex_socket;
|
||||||
|
|
||||||
ipx_socket *next;
|
ipx_socket *next;
|
||||||
@ -93,19 +93,6 @@ struct ipx_packet {
|
|||||||
char data[1];
|
char data[1];
|
||||||
} __attribute__((__packed__));
|
} __attribute__((__packed__));
|
||||||
|
|
||||||
struct ipx_nic {
|
|
||||||
uint32_t ipaddr;
|
|
||||||
uint32_t netmask;
|
|
||||||
uint32_t bcast;
|
|
||||||
|
|
||||||
unsigned char hwaddr[6];
|
|
||||||
|
|
||||||
unsigned char ipx_net[4];
|
|
||||||
unsigned char ipx_node[6];
|
|
||||||
|
|
||||||
ipx_nic *next;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct ipx_host {
|
struct ipx_host {
|
||||||
unsigned char ipx_net[4];
|
unsigned char ipx_net[4];
|
||||||
unsigned char ipx_node[6];
|
unsigned char ipx_node[6];
|
||||||
@ -117,7 +104,7 @@ struct ipx_host {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern ipx_socket *sockets;
|
extern ipx_socket *sockets;
|
||||||
extern ipx_nic *nics;
|
extern struct ipx_interface *nics;
|
||||||
extern ipx_host *hosts;
|
extern ipx_host *hosts;
|
||||||
extern SOCKET net_fd;
|
extern SOCKET net_fd;
|
||||||
extern struct reg_global global_conf;
|
extern struct reg_global global_conf;
|
||||||
@ -130,7 +117,6 @@ void __stdcall *find_sym(char const *sym);
|
|||||||
ipx_socket *get_socket(SOCKET fd);
|
ipx_socket *get_socket(SOCKET fd);
|
||||||
void lock_mutex(void);
|
void lock_mutex(void);
|
||||||
void unlock_mutex(void);
|
void unlock_mutex(void);
|
||||||
IP_ADAPTER_INFO *get_nics(void);
|
|
||||||
ipx_host *find_host(const unsigned char *net, const unsigned char *node);
|
ipx_host *find_host(const unsigned char *net, const unsigned char *node);
|
||||||
|
|
||||||
void log_open();
|
void log_open();
|
||||||
|
@ -227,7 +227,7 @@ int WSAAPI bind(SOCKET fd, const struct sockaddr *addr, int addrlen) {
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
unsigned char z6[] = {0,0,0,0,0,0};
|
unsigned char z6[] = {0,0,0,0,0,0};
|
||||||
ipx_nic *nic = nics;
|
struct ipx_interface *nic = nics;
|
||||||
|
|
||||||
while(nic) {
|
while(nic) {
|
||||||
if(
|
if(
|
||||||
@ -348,7 +348,7 @@ int ipx_ex_bind(SOCKET fd, const struct sockaddr_ipx *ipxaddr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
unsigned char z6[] = {0,0,0,0,0,0};
|
unsigned char z6[] = {0,0,0,0,0,0};
|
||||||
ipx_nic *nic = nics;
|
struct ipx_interface *nic = nics;
|
||||||
|
|
||||||
while(nic) {
|
while(nic) {
|
||||||
if(
|
if(
|
||||||
@ -560,7 +560,7 @@ int WSAAPI getsockopt(SOCKET fd, int level, int optname, char FAR *optval, int F
|
|||||||
|
|
||||||
IPX_ADDRESS_DATA *ipxdata = (IPX_ADDRESS_DATA*)optval;
|
IPX_ADDRESS_DATA *ipxdata = (IPX_ADDRESS_DATA*)optval;
|
||||||
|
|
||||||
ipx_nic *nic = nics;
|
struct ipx_interface *nic = nics;
|
||||||
int i = 0;
|
int i = 0;
|
||||||
|
|
||||||
while(nic && i < ipxdata->adapternum) {
|
while(nic && i < ipxdata->adapternum) {
|
||||||
@ -595,7 +595,7 @@ int WSAAPI getsockopt(SOCKET fd, int level, int optname, char FAR *optval, int F
|
|||||||
|
|
||||||
*intval = 0;
|
*intval = 0;
|
||||||
|
|
||||||
ipx_nic *nic = nics;
|
struct ipx_interface *nic = nics;
|
||||||
while(nic) {
|
while(nic) {
|
||||||
(*intval)++;
|
(*intval)++;
|
||||||
nic = nic->next;
|
nic = nic->next;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user