summaryrefslogtreecommitdiffstats
path: root/tests/tcp_proxy/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/tcp_proxy/main.c')
-rw-r--r--tests/tcp_proxy/main.c73
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;
}