mirror of
https://github.com/solemnwarning/ipxwrapper
synced 2024-12-30 16:45:37 +01:00
Bugfixes and cleanup in router code.
This commit is contained in:
parent
f1a6cf40a2
commit
5b77e23815
2
Makefile
2
Makefile
@ -37,7 +37,7 @@ SRC_FILES := changes.txt license.txt Makefile mkstubs.pl readme.txt src/config.h
|
||||
all: ipxwrapper.dll wsock32.dll mswsock.dll ipxconfig.exe dpwsockx.dll ipxrouter.exe
|
||||
|
||||
clean:
|
||||
rm -f ipxwrapper.dll wsock32.dll mswsock.dll ipxconfig.exe dpwsockx.dll
|
||||
rm -f ipxwrapper.dll wsock32.dll mswsock.dll ipxconfig.exe dpwsockx.dll ipxrouter.exe
|
||||
rm -f src/*.o src/*_stubs.s
|
||||
|
||||
dist: all
|
||||
|
@ -25,6 +25,9 @@
|
||||
struct reg_global global_conf;
|
||||
|
||||
int main(int argc, char **argv) {
|
||||
setvbuf(stdout, NULL, _IONBF, 0);
|
||||
setvbuf(stderr, NULL, _IONBF, 0);
|
||||
|
||||
reg_open(KEY_QUERY_VALUE);
|
||||
|
||||
if(reg_get_bin("global", &global_conf, sizeof(global_conf)) != sizeof(global_conf)) {
|
||||
@ -37,7 +40,7 @@ int main(int argc, char **argv) {
|
||||
reg_close();
|
||||
|
||||
WSADATA wsdata;
|
||||
int err = WSAStartup(MAKEWORD(1,1), &wsdata);
|
||||
int err = WSAStartup(MAKEWORD(2,0), &wsdata);
|
||||
|
||||
if(err) {
|
||||
log_printf("Failed to initialize winsock: %s", w32_error(err));
|
||||
@ -45,7 +48,7 @@ int main(int argc, char **argv) {
|
||||
struct router_vars *router = router_init(TRUE);
|
||||
|
||||
if(router) {
|
||||
FreeConsole();
|
||||
//FreeConsole();
|
||||
router_main(router);
|
||||
router_destroy(router);
|
||||
}
|
||||
@ -63,7 +66,7 @@ void log_printf(const char *fmt, ...) {
|
||||
|
||||
va_start(argv, fmt);
|
||||
|
||||
AllocConsole();
|
||||
//AllocConsole();
|
||||
|
||||
vfprintf(stderr, fmt, argv);
|
||||
fputc('\n', stderr);
|
||||
|
49
src/router.c
49
src/router.c
@ -24,7 +24,7 @@
|
||||
#include "interface.h"
|
||||
|
||||
static struct router_addr *router_get(struct router_vars *router, SOCKET control, SOCKET sock);
|
||||
static void router_handle_call(struct router_vars *router, int coff);
|
||||
static BOOL router_handle_call(struct router_vars *router, int sock, struct router_call *call);
|
||||
static void router_drop_client(struct router_vars *router, int coff);
|
||||
|
||||
static BOOL rclient_do(struct rclient *rclient, struct router_call *call, struct router_ret *ret);
|
||||
@ -233,21 +233,25 @@ DWORD router_main(void *arg) {
|
||||
char *bstart = ((char*)&(router->clients[i].recvbuf)) + router->clients[i].recvbuf_len;
|
||||
int len = sizeof(struct router_call) - router->clients[i].recvbuf_len;
|
||||
|
||||
if((len = recv(router->clients[i].sock, bstart, len, 0) == -1) || len == 0) {
|
||||
if(WSAGetLastError() == WSAEWOULDBLOCK) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if((len = recv(router->clients[i].sock, bstart, len, 0)) == -1 || len == 0) {
|
||||
if(len == -1) {
|
||||
if(WSAGetLastError() == WSAEWOULDBLOCK) {
|
||||
continue;
|
||||
}
|
||||
|
||||
log_printf("Error reading from client socket: %s", w32_error(WSAGetLastError()));
|
||||
}
|
||||
|
||||
router_drop_client(router, i);
|
||||
router_drop_client(router, i--);
|
||||
continue;
|
||||
}
|
||||
|
||||
if((router->clients[i].recvbuf_len += len) == sizeof(struct router_call)) {
|
||||
router_handle_call(router, i);
|
||||
if(router_handle_call(router, router->clients[i].sock, &(router->clients[i].recvbuf))) {
|
||||
router->clients[i].recvbuf_len = 0;
|
||||
}else{
|
||||
router_drop_client(router, i--);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -549,17 +553,16 @@ static int router_set_reuse(struct router_vars *router, SOCKET control, SOCKET s
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void router_handle_call(struct router_vars *router, int coff) {
|
||||
struct router_call call = router->clients[coff].recvbuf;
|
||||
static BOOL router_handle_call(struct router_vars *router, int sock, struct router_call *call) {
|
||||
struct router_ret ret;
|
||||
|
||||
ret.err_code = ERROR_SUCCESS;
|
||||
|
||||
switch(call.call) {
|
||||
switch(call->call) {
|
||||
case rc_bind: {
|
||||
ret.ret_addr = call.arg_addr;
|
||||
ret.ret_addr = call->arg_addr;
|
||||
|
||||
if(router_bind(router, router->clients[coff].sock, call.sock, &(ret.ret_addr), &(ret.ret_u32), call.arg_int) == -1) {
|
||||
if(router_bind(router, sock, call->sock, &(ret.ret_addr), &(ret.ret_u32), call->arg_int) == -1) {
|
||||
ret.err_code = WSAGetLastError();
|
||||
}
|
||||
|
||||
@ -567,22 +570,22 @@ static void router_handle_call(struct router_vars *router, int coff) {
|
||||
}
|
||||
|
||||
case rc_unbind: {
|
||||
router_unbind(router, router->clients[coff].sock, call.sock);
|
||||
router_unbind(router, sock, call->sock);
|
||||
break;
|
||||
}
|
||||
|
||||
case rc_port: {
|
||||
router_set_port(router, router->clients[coff].sock, call.sock, call.arg_int);
|
||||
router_set_port(router, sock, call->sock, call->arg_int);
|
||||
break;
|
||||
}
|
||||
|
||||
case rc_filter: {
|
||||
router_set_filter(router, router->clients[coff].sock, call.sock, call.arg_int);
|
||||
router_set_filter(router, sock, call->sock, call->arg_int);
|
||||
break;
|
||||
}
|
||||
|
||||
case rc_reuse: {
|
||||
if(!router_set_reuse(router, router->clients[coff].sock, call.sock, call.arg_int)) {
|
||||
if(!router_set_reuse(router, sock, call->sock, call->arg_int)) {
|
||||
ret.err_code = WSAEINVAL;
|
||||
}
|
||||
|
||||
@ -591,9 +594,7 @@ static void router_handle_call(struct router_vars *router, int coff) {
|
||||
|
||||
default: {
|
||||
log_printf("Recieved unknown call, dropping client");
|
||||
|
||||
router_drop_client(router, coff);
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -602,17 +603,15 @@ static void router_handle_call(struct router_vars *router, int coff) {
|
||||
while(sent < sizeof(ret)) {
|
||||
char *sbuf = ((char*)&ret) + sent;
|
||||
|
||||
if((sr = send(router->clients[coff].sock, sbuf, sizeof(ret) - sent, 0)) == -1) {
|
||||
if((sr = send(sock, sbuf, sizeof(ret) - sent, 0)) == -1) {
|
||||
log_printf("Send error: %s, dropping client", w32_error(WSAGetLastError()));
|
||||
|
||||
router_drop_client(router, coff);
|
||||
return;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
sent += sr;
|
||||
}
|
||||
|
||||
router->clients[coff].recvbuf_len = 0;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void router_drop_client(struct router_vars *router, int coff) {
|
||||
|
Loading…
x
Reference in New Issue
Block a user