diff --git a/data/banner.bin b/data/banner.bin deleted file mode 100755 index d8baca0..0000000 Binary files a/data/banner.bin and /dev/null differ diff --git a/gfx/banner.png b/gfx/banner.png deleted file mode 100755 index 68878b1..0000000 Binary files a/gfx/banner.png and /dev/null differ diff --git a/source/console.c b/source/console.c index 834c37a..077d2e1 100644 --- a/source/console.c +++ b/source/console.c @@ -1,4 +1,6 @@ #include "console.h" +#include +#include #include #include #include @@ -9,10 +11,10 @@ #include "gfx.h" #ifdef _3DS -#include "banner_bin.h" static PrintConsole status_console; static PrintConsole main_console; +static PrintConsole tcp_console; /*! initialize console subsystem */ void @@ -24,6 +26,8 @@ console_init(void) consoleInit(GFX_TOP, &main_console); consoleSetWindow(&main_console, 0, 1, 50, 29); + consoleInit(GFX_BOTTOM, &tcp_console); + consoleSelect(&main_console); consoleDebugInit(debugDevice_NULL); @@ -63,12 +67,71 @@ console_print(const char *fmt, ...) va_end(ap); } +/*! print tcp tables */ +static void +print_tcp_table(void) +{ + static SOCU_TCPTableEntry tcp_entries[32]; + socklen_t optlen; + size_t i; + int rc; + + consoleSelect(&tcp_console); + console_print("\x1b[0;0H\x1b[K\n"); + optlen = sizeof(tcp_entries); + rc = SOCU_GetNetworkOpt(0xFFFE, NETOPT_TCP_TABLE, tcp_entries, &optlen); + if(rc != 0 && errno != ENODEV) + console_print(RED "tcp table: %d %s\x1b[K\n" RESET, errno, strerror(errno)); + else if(rc == 0) + { + for(i = 0; i < optlen / sizeof(SOCU_TCPTableEntry); ++i) + { + SOCU_TCPTableEntry *entry = &tcp_entries[i]; + struct sockaddr_in *local = (struct sockaddr_in*)&entry->local; + struct sockaddr_in *remote = (struct sockaddr_in*)&entry->remote; + + console_print(GREEN "tcp[%zu]: ", i); + switch(entry->state) + { + case TCP_STATE_CLOSED: + console_print("CLOSED\x1b[K\n"); break; + case TCP_STATE_LISTEN: + console_print("LISTEN\x1b[K\n"); break; + case TCP_STATE_ESTABLISHED: + console_print("ESTABLISHED\x1b[K\n"); break; + case TCP_STATE_FINWAIT1: + console_print("FINWAIT1\x1b[K\n"); break; + case TCP_STATE_FINWAIT2: + console_print("FINWAIT2\x1b[K\n"); break; + case TCP_STATE_CLOSE_WAIT: + console_print("CLOSE_WAIT\x1b[K\n"); break; + case TCP_STATE_LAST_ACK: + console_print("LAST_ACK\x1b[K\n"); break; + case TCP_STATE_TIME_WAIT: + console_print("TIME_WAIT\x1b[K\n"); break; + default: + console_print("State %lu\x1b[K\n", entry->state); break; + } + + console_print(" Local %s:%u\x1b[K\n", inet_ntoa(local->sin_addr), + ntohs(local->sin_port)); + console_print(" Peer %s:%u\x1b[K\n", inet_ntoa(remote->sin_addr), + ntohs(remote->sin_port)); + console_print(RESET "\x1b[J"); + } + } + else + console_print("\x1b[2J"); + + consoleSelect(&main_console); +} + /*! draw console to screen */ void console_render(void) { - /* clear all screens */ - gfxDrawSprite(GFX_BOTTOM, GFX_LEFT, (u8*)banner_bin, 240, 320, 0, 0); + /* print tcp table */ + print_tcp_table(); /* flush framebuffer */ gfxFlushBuffers(); diff --git a/source/ftp.c b/source/ftp.c index 8aaa32c..97db496 100644 --- a/source/ftp.c +++ b/source/ftp.c @@ -1587,6 +1587,7 @@ ftp_exit(void) #ifdef _3DS /* deinitialize SOC service */ + console_render(); console_print(CYAN "Waiting for socExit()...\n" RESET); ret = socExit(); if(ret != 0)