diff options
Diffstat (limited to 'tests/tcp_proxy/main.c')
-rw-r--r-- | tests/tcp_proxy/main.c | 73 |
1 files changed, 60 insertions, 13 deletions
diff --git a/tests/tcp_proxy/main.c b/tests/tcp_proxy/main.c index 7bfc747e..301f79a5 100644 --- a/tests/tcp_proxy/main.c +++ b/tests/tcp_proxy/main.c @@ -1,15 +1,32 @@ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2012 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ -#include "os_calls.h" +#include <os_calls.h> -int g_loc_io_count = 0; // bytes read from local port -int g_rem_io_count = 0; // bytes read from remote port +int g_loc_io_count = 0; // bytes read from local port +int g_rem_io_count = 0; // bytes read from remote port static int g_terminated = 0; static char g_buf[1024 * 32]; /*****************************************************************************/ static int -main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) +main_loop(char *local_port, char *remote_ip, char *remote_port, int hexdump) { int lis_sck; int acc_sck; @@ -30,6 +47,7 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) lis_sck = g_tcp_socket(); g_tcp_set_non_blocking(lis_sck); error = g_tcp_bind(lis_sck, local_port); + if (error != 0) { g_writeln("bind failed"); @@ -39,6 +57,7 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) if (error == 0) { error = g_tcp_listen(lis_sck); + if (error == 0) { g_writeln("listening for connection"); @@ -51,6 +70,7 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) while ((!g_terminated) && (error == 0)) { acc_sck = g_tcp_accept(lis_sck); + if ((acc_sck == -1) && g_tcp_last_error_would_block(lis_sck)) { g_sleep(100); @@ -64,6 +84,7 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) break; } } + if (error == 0) { error = g_terminated; @@ -72,6 +93,7 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) /* stop listening */ g_tcp_close(lis_sck); lis_sck = 0; + if (error == 0) { g_writeln("got connection"); @@ -80,65 +102,79 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) /* connect outgoing socket */ con_sck = 0; + if (error == 0) { con_sck = g_tcp_socket(); g_tcp_set_non_blocking(con_sck); error = g_tcp_connect(con_sck, remote_ip, remote_port); + if ((error == -1) && g_tcp_last_error_would_block(con_sck)) { error = 0; i = 0; + while ((!g_tcp_can_send(con_sck, 100)) && (!g_terminated) && (i < 100)) { g_sleep(100); i++; } + if (i > 99) { g_writeln("timout connecting"); error = 1; } + if (g_terminated) { error = 1; } } + if ((error != 0) && (!g_terminated)) { g_writeln("error connecting to remote\r\n"); } } + while ((!g_terminated) && (error == 0)) { sel = g_tcp_select(con_sck, acc_sck); + if (sel == 0) { g_sleep(10); continue; } + if (sel & 1) { // can read from con_sck w/o blocking count = g_tcp_recv(con_sck, g_buf, 1024 * 16, 0); error = count < 1; + if (error == 0) { g_loc_io_count += count; con_to_acc += count; + if (hexdump) { g_writeln("from remove, the socket from connect"); g_hexdump(g_buf, count); } + #if 0 g_writeln("local_io_count: %d\tremote_io_count: %d", - g_loc_io_count, g_rem_io_count); + g_loc_io_count, g_rem_io_count); #endif sent = 0; + while ((sent < count) && (error == 0) && (!g_terminated)) { i = g_tcp_send(acc_sck, g_buf + sent, count - sent, 0); + if ((i == -1) && g_tcp_last_error_would_block(acc_sck)) { g_tcp_can_send(acc_sck, 1000); @@ -154,28 +190,34 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) } } } + if (sel & 2) { // can read from acc_sck w/o blocking count = g_tcp_recv(acc_sck, g_buf, 1024 * 16, 0); error = count < 1; + if (error == 0) { g_rem_io_count += count; acc_to_con += count; + if (hexdump) { g_writeln("from accepted, the socket from accept"); g_hexdump(g_buf, count); } + #if 0 g_writeln("local_io_count: %d\tremote_io_count: %d", - g_loc_io_count, g_rem_io_count); + g_loc_io_count, g_rem_io_count); #endif sent = 0; + while ((sent < count) && (error == 0) && (!g_terminated)) { i = g_tcp_send(con_sck, g_buf + sent, count - sent, 0); + if ((i == -1) && g_tcp_last_error_would_block(con_sck)) { g_tcp_can_send(con_sck, 1000); @@ -192,6 +234,7 @@ main_loop(char* local_port, char* remote_ip, char* remote_port, int hexdump) } } } + g_tcp_close(lis_sck); g_tcp_close(con_sck); g_tcp_close(acc_sck); @@ -221,7 +264,7 @@ proxy_shutdown(int sig) void clear_counters(int sig) { - g_writeln("cleared counters at: local_io_count: %d remote_io_count: %d", + g_writeln("cleared counters at: local_io_count: %d remote_io_count: %d", g_loc_io_count, g_rem_io_count); g_loc_io_count = 0; g_rem_io_count = 0; @@ -229,7 +272,7 @@ clear_counters(int sig) /*****************************************************************************/ int -main(int argc, char** argv) +main(int argc, char **argv) { int dump; @@ -238,11 +281,13 @@ main(int argc, char** argv) usage(); return 0; } - g_init(); - g_signal(2, proxy_shutdown); /* SIGINT */ - g_signal(9, proxy_shutdown); /* SIGKILL */ - g_signal(10, clear_counters);/* SIGUSR1*/ - g_signal(15, proxy_shutdown);/* SIGTERM */ + + g_init("tcp_proxy"); + g_signal_user_interrupt(proxy_shutdown); /* SIGINT */ + g_signal_kill(proxy_shutdown); /* SIGKILL */ + g_signal_usr1(clear_counters); /* SIGUSR1 */ + g_signal_terminate(proxy_shutdown); /* SIGTERM */ + if (argc < 5) { while (!g_terminated) @@ -255,11 +300,13 @@ main(int argc, char** argv) else { dump = g_strcasecmp(argv[4], "dump") == 0; + while (!g_terminated) { main_loop(argv[1], argv[2], argv[3], dump); } } + g_deinit(); return 0; } |