Add some advanced logging

This commit is contained in:
Michael Theall 2017-07-25 21:55:16 -05:00
parent c763e2d52f
commit 6d042c525a
5 changed files with 107 additions and 34 deletions

9
delog.py Executable file
View File

@ -0,0 +1,9 @@
#!/usr/bin/env python
import sys
import re
if __name__ == '__main__':
regex = re.compile('\x1b\[[0-9]*;[0-9]*H')
for line in sys.stdin:
print(regex.sub('', line).strip())

View File

@ -33,4 +33,7 @@ void console_set_status(const char *fmt, ...);
__attribute__((format(printf,1,2))) __attribute__((format(printf,1,2)))
void console_print(const char *fmt, ...); void console_print(const char *fmt, ...);
__attribute__((format(printf,1,2)))
void debug_print(const char *fmt, ...);
void console_render(void); void console_render(void);

View File

@ -12,6 +12,9 @@
static PrintConsole status_console; static PrintConsole status_console;
static PrintConsole main_console; static PrintConsole main_console;
static PrintConsole tcp_console; static PrintConsole tcp_console;
#if ENABLE_LOGGING
static bool disable_logging = false;
#endif
/*! initialize console subsystem */ /*! initialize console subsystem */
void void
@ -61,11 +64,29 @@ console_print(const char *fmt, ...)
va_start(ap, fmt); va_start(ap, fmt);
vprintf(fmt, ap); vprintf(fmt, ap);
#ifdef ENABLE_LOGGING #ifdef ENABLE_LOGGING
vfprintf(stderr, fmt, ap); if(!disable_logging)
vfprintf(stderr, fmt, ap);
#endif #endif
va_end(ap); va_end(ap);
} }
/*! print debug message
*
* @param[in] fmt format string
* @param[in] ... format arguments
*/
void
debug_print(const char *fmt, ...)
{
#ifdef ENABLE_LOGGING
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
#endif
}
/*! print tcp tables */ /*! print tcp tables */
static void static void
print_tcp_table(void) print_tcp_table(void)
@ -75,6 +96,10 @@ print_tcp_table(void)
size_t i; size_t i;
int rc, lines = 0; int rc, lines = 0;
#ifdef ENABLE_LOGGING
disable_logging = true;
#endif
consoleSelect(&tcp_console); consoleSelect(&tcp_console);
console_print("\x1b[0;0H\x1b[K"); console_print("\x1b[0;0H\x1b[K");
optlen = sizeof(tcp_entries); optlen = sizeof(tcp_entries);
@ -148,6 +173,10 @@ print_tcp_table(void)
console_print("\x1b[2J"); console_print("\x1b[2J");
consoleSelect(&main_console); consoleSelect(&main_console);
#ifdef ENABLE_LOGGING
disable_logging = false;
#endif
} }
/*! draw console to screen */ /*! draw console to screen */
@ -190,6 +219,17 @@ console_print(const char *fmt, ...)
va_end(ap); va_end(ap);
} }
void
debug_print(const char *fmt, ...)
{
#ifdef ENABLE_LOGGING
va_list ap;
va_start(ap, fmt);
vfprintf(stderr, fmt, ap);
va_end(ap);
#endif
}
void console_render(void) void console_render(void)
{ {
} }

View File

@ -968,7 +968,10 @@ ftp_session_new(int listen_fd)
/* send initiator response */ /* send initiator response */
rc = ftp_send_response(session, 220, "Hello!\r\n"); rc = ftp_send_response(session, 220, "Hello!\r\n");
if(rc <= 0) if(rc <= 0)
{
debug_print("failed to send initiator response\n");
ftp_session_destroy(session); ftp_session_destroy(session);
}
} }
/*! accept PASV connection for ftp session /*! accept PASV connection for ftp session
@ -1175,6 +1178,7 @@ ftp_session_read_command(ftp_session_t *session,
if(rc == 0) if(rc == 0)
{ {
/* peer closed connection */ /* peer closed connection */
debug_print("peer closed connection\n");
ftp_session_close_cmd(session); ftp_session_close_cmd(session);
return; return;
} }
@ -1386,7 +1390,10 @@ ftp_session_poll(ftp_session_t *session)
/* we need to read a new command */ /* we need to read a new command */
if(pollinfo[0].revents & (POLLERR|POLLHUP)) if(pollinfo[0].revents & (POLLERR|POLLHUP))
{
debug_print("cmd revents=0x%x\n", pollinfo[0].revents);
ftp_session_close_cmd(session); ftp_session_close_cmd(session);
}
else if(pollinfo[0].revents & (POLLIN | POLLPRI)) else if(pollinfo[0].revents & (POLLIN | POLLPRI))
ftp_session_read_command(session, pollinfo[0].revents); ftp_session_read_command(session, pollinfo[0].revents);
} }
@ -1449,6 +1456,7 @@ ftp_session_poll(ftp_session_t *session)
return session->next; return session->next;
/* disconnected from peer; destroy it and return next session */ /* disconnected from peer; destroy it and return next session */
debug_print("disconnected from peer\n");
return ftp_session_destroy(session); return ftp_session_destroy(session);
} }
@ -1504,6 +1512,9 @@ update_status(void)
{ {
#ifdef _3DS #ifdef _3DS
console_set_status("\n" GREEN STATUS_STRING " " console_set_status("\n" GREEN STATUS_STRING " "
#ifdef ENABLE_LOGGING
"DEBUG "
#endif
CYAN "%s:%u" RESET, CYAN "%s:%u" RESET,
inet_ntoa(serv_addr.sin_addr), inet_ntoa(serv_addr.sin_addr),
ntohs(serv_addr.sin_port)); ntohs(serv_addr.sin_port));
@ -1528,6 +1539,9 @@ update_status(void)
} }
console_set_status(GREEN STATUS_STRING " " console_set_status(GREEN STATUS_STRING " "
#ifdef ENABLE_LOGGING
"DEBUG "
#endif
YELLOW "IP:" CYAN "%s " YELLOW "IP:" CYAN "%s "
YELLOW "Port:" CYAN "%u" YELLOW "Port:" CYAN "%u"
RESET, RESET,
@ -1623,23 +1637,6 @@ ftp_init(void)
console_print(GREEN "Ready!\n" RESET); console_print(GREEN "Ready!\n" RESET);
#ifdef ENABLE_LOGGING
/* open log file */
FILE *fp = freopen("/ftpd.log", "wb", stderr);
if(fp == NULL)
{
console_print(RED "freopen: 0x%08X\n" RESET, errno);
goto log_fail;
}
/* truncate log file */
if(ftruncate(fileno(fp), 0) != 0)
{
console_print(RED "ftruncate: 0x%08X\n" RESET, errno);
goto ftruncate_fail;
}
#endif
/* allocate buffer for SOC service */ /* allocate buffer for SOC service */
SOCU_buffer = (u32*)memalign(SOCU_ALIGN, SOCU_BUFFERSIZE); SOCU_buffer = (u32*)memalign(SOCU_ALIGN, SOCU_BUFFERSIZE);
if(SOCU_buffer == NULL) if(SOCU_buffer == NULL)
@ -1722,13 +1719,6 @@ soc_fail:
SOCU_buffer = NULL; SOCU_buffer = NULL;
memalign_fail: memalign_fail:
#ifdef ENABLE_LOGGING
ftruncate_fail:
if(fclose(stderr) != 0)
console_print(RED "fclose: 0x%08X\n" RESET, errno);
log_fail:
#endif
return -1; return -1;
#endif #endif
} }
@ -1741,6 +1731,8 @@ ftp_exit(void)
Result ret; Result ret;
#endif #endif
debug_print("exiting ftp server\n");
/* clean up all sessions */ /* clean up all sessions */
while(sessions != NULL) while(sessions != NULL)
ftp_session_destroy(sessions); ftp_session_destroy(sessions);
@ -1761,14 +1753,6 @@ ftp_exit(void)
console_print(RED "socExit: 0x%08X\n" RESET, (unsigned int)ret); console_print(RED "socExit: 0x%08X\n" RESET, (unsigned int)ret);
free(SOCU_buffer); free(SOCU_buffer);
} }
#ifdef ENABLE_LOGGING
/* close log file */
if(fclose(stderr) != 0)
console_print(RED "fclose: 0x%08X\n" RESET, errno);
#endif
#endif #endif
} }

View File

@ -1,6 +1,8 @@
#include <errno.h>
#include <malloc.h> #include <malloc.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
#include <unistd.h>
#ifdef _3DS #ifdef _3DS
#include <3ds.h> #include <3ds.h>
#endif #endif
@ -78,7 +80,33 @@ main(int argc,
/* initialize console subsystem */ /* initialize console subsystem */
console_init(); console_init();
console_set_status("\n" GREEN STATUS_STRING RESET);
#ifdef ENABLE_LOGGING
/* open log file */
#ifdef _3DS
FILE *fp = freopen("/ftpd.log", "wb", stderr);
#else
FILE *fp = freopen("ftpd.log", "wb", stderr);
#endif
if(fp == NULL)
{
console_print(RED "freopen: 0x%08X\n" RESET, errno);
goto log_fail;
}
/* truncate log file */
if(ftruncate(fileno(fp), 0) != 0)
{
console_print(RED "ftruncate: 0x%08X\n" RESET, errno);
goto log_fail;
}
#endif
console_set_status("\n" GREEN STATUS_STRING
#ifdef ENABLE_LOGGING
" DEBUG"
#endif
RESET);
while(status == LOOP_RESTART) while(status == LOOP_RESTART)
{ {
@ -97,6 +125,15 @@ main(int argc,
#ifdef _3DS #ifdef _3DS
console_print("Press B to exit\n"); console_print("Press B to exit\n");
#endif
#ifdef ENABLE_LOGGING
log_fail:
if(fclose(stderr) != 0)
console_print(RED "fclose(%d): 0x%08X\n" RESET, fileno(stderr), errno);
#endif
#ifdef _3DS
loop(wait_for_b); loop(wait_for_b);
/* deinitialize 3DS services */ /* deinitialize 3DS services */