From 5b77e2381513d174936da159be11b61fc987a796 Mon Sep 17 00:00:00 2001 From: Daniel Collins Date: Fri, 9 Sep 2011 22:10:32 +0000 Subject: [PATCH] Bugfixes and cleanup in router code. --- Makefile | 2 +- src/router-exe.c | 9 ++++++--- src/router.c | 49 ++++++++++++++++++++++++------------------------ 3 files changed, 31 insertions(+), 29 deletions(-) diff --git a/Makefile b/Makefile index 6ca12f7..5cc75e4 100644 --- a/Makefile +++ b/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 diff --git a/src/router-exe.c b/src/router-exe.c index 1842f01..89103dc 100644 --- a/src/router-exe.c +++ b/src/router-exe.c @@ -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); diff --git a/src/router.c b/src/router.c index c152864..06aa8e7 100644 --- a/src/router.c +++ b/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) {