From 4a894e0713910e68a8744a3b34b95a91b31cabde Mon Sep 17 00:00:00 2001 From: "Lubomir I. Ivanov" Date: Thu, 2 Feb 2017 21:50:47 +0200 Subject: Win32: add the --win32log option to log stdout and stderr to files Adding --win32log as the first command line option on Windows will now log all stdout and stderr output to the files subsurface_err.log and subsurface_out.log in the working directory. This change required a new argument 'bool logfile' to be added to: subsurface_console_init() which is defined in all platform files (linux.c, macos.c, etc.) Example usage: subsurface.exe --win32log -v -v -v Signed-off-by: Lubomir I. Ivanov --- core/android.cpp | 4 +++- core/dive.h | 2 +- core/linux.c | 3 ++- core/macos.c | 5 +++-- core/subsurfacestartup.c | 5 ++++- core/windows.c | 10 +++++++--- subsurface-desktop-main.cpp | 12 +++++++++--- 7 files changed, 29 insertions(+), 12 deletions(-) diff --git a/core/android.cpp b/core/android.cpp index ef55f083b..5eb8c59de 100644 --- a/core/android.cpp +++ b/core/android.cpp @@ -187,8 +187,10 @@ int subsurface_zip_close(struct zip *zip) } /* win32 console */ -void subsurface_console_init(bool dedicated) +void subsurface_console_init(bool dedicated, bool logfile) { + (void)dedicated; + (void)logifle; /* NOP */ } diff --git a/core/dive.h b/core/dive.h index c9d176920..4886bffad 100644 --- a/core/dive.h +++ b/core/dive.h @@ -730,7 +730,7 @@ extern void *subsurface_opendir(const char *path); extern int subsurface_access(const char *path, int mode); extern struct zip *subsurface_zip_open_readonly(const char *path, int flags, int *errorp); extern int subsurface_zip_close(struct zip *zip); -extern void subsurface_console_init(bool dedicated); +extern void subsurface_console_init(bool dedicated, bool logfile); extern void subsurface_console_exit(void); extern bool subsurface_user_is_root(void); diff --git a/core/linux.c b/core/linux.c index b81f6bf53..b050472a6 100644 --- a/core/linux.c +++ b/core/linux.c @@ -215,9 +215,10 @@ int subsurface_zip_close(struct zip *zip) } /* win32 console */ -void subsurface_console_init(bool dedicated) +void subsurface_console_init(bool dedicated, bool logfile) { (void)dedicated; + (void)logifle; /* NOP */ } diff --git a/core/macos.c b/core/macos.c index 500412cd8..20a575b67 100644 --- a/core/macos.c +++ b/core/macos.c @@ -201,9 +201,10 @@ int subsurface_zip_close(struct zip *zip) } /* win32 console */ -void subsurface_console_init(bool dedicated) +void subsurface_console_init(bool dedicated, bool logfile) { - (void) dedicated; + (void)dedicated; + (void)logifle; /* NOP */ } diff --git a/core/subsurfacestartup.c b/core/subsurfacestartup.c index 7bff43750..f240d139c 100644 --- a/core/subsurfacestartup.c +++ b/core/subsurfacestartup.c @@ -187,7 +187,8 @@ static void print_help() printf("\n --survey Offer to submit a user survey"); printf("\n --user= Choose configuration space for user "); printf("\n --cloud-timeout= Set timeout for cloud connection (0 < timeout < 60)"); - printf("\n --win32console Create a dedicated console if needed (Windows only). Add option before everything else\n\n"); + printf("\n --win32console Create a dedicated console if needed (Windows only). Add option before everything else"); + printf("\n --win32log Write the program output to subsurface.log (Windows only). Add option before everything else\n\n"); } void parse_argument(const char *arg) @@ -245,6 +246,8 @@ void parse_argument(const char *arg) } if (strcmp(arg, "--win32console") == 0) return; + if (strcmp(arg, "--win32log") == 0) + return; /* fallthrough */ case 'p': /* ignore process serial number argument when run as native macosx app */ diff --git a/core/windows.c b/core/windows.c index 58d3beaad..a94d7dda5 100644 --- a/core/windows.c +++ b/core/windows.c @@ -377,11 +377,12 @@ static struct { FILE *out, *err; } console_desc; -void subsurface_console_init(bool dedicated) +void subsurface_console_init(bool dedicated, bool logfile) { (void)console_desc; /* if this is a console app already, do nothing */ #ifndef WIN32_CONSOLE_APP + /* just in case of multiple calls */ memset((void *)&console_desc, 0, sizeof(console_desc)); /* the AttachConsole(..) call can be used to determine if the parent process @@ -421,9 +422,12 @@ void subsurface_console_init(bool dedicated) SetConsoleCtrlHandler(NULL, TRUE); /* disable the CTRL handler */ } + const char *location_out = logfile ? "subsurface_out.log" : "CON"; + const char *location_err = logfile ? "subsurface_err.log" : "CON"; + /* redirect; on win32, CON is a reserved pipe target, like NUL */ - console_desc.out = freopen("CON", "w", stdout); - console_desc.err = freopen("CON", "w", stderr); + console_desc.out = freopen(location_out, "w", stdout); + console_desc.err = freopen(location_err, "w", stderr); if (!dedicated) puts(""); /* add an empty line */ #endif diff --git a/subsurface-desktop-main.cpp b/subsurface-desktop-main.cpp index 165d1f7d9..e30df687c 100644 --- a/subsurface-desktop-main.cpp +++ b/subsurface-desktop-main.cpp @@ -34,9 +34,15 @@ int main(int argc, char **argv) QStringList importedFiles; QStringList arguments = QCoreApplication::arguments(); - bool dedicated_console = arguments.length() > 1 && - (arguments.at(1) == QString("--win32console")); - subsurface_console_init(dedicated_console); + bool win32_log = arguments.length() > 1 && + (arguments.at(1) == QString("--win32log")); + if (win32_log) { + subsurface_console_init(true, true); + } else { + bool dedicated_console = arguments.length() > 1 && + (arguments.at(1) == QString("--win32console")); + subsurface_console_init(dedicated_console, false); + } const char *default_directory = system_default_directory(); const char *default_filename = system_default_filename(); -- cgit v1.2.3-70-g09d2