On 2 February 2017 at 21:35, Dirk Hohndel <[email protected]> wrote:
> On Thu, Feb 02, 2017 at 09:33:32PM +0200, Lubomir I. Ivanov wrote:
>> On 2 February 2017 at 21:12, Lubomir I. Ivanov <[email protected]> wrote:
>> >  const char *location = logfile ? "subsurface.log" : "CON";
>> >
>> > console_desc.out = freopen(location, "w", stdout);
>> > console_desc.err = freopen(location, "w", stderr);
>>
>> ^ this *probably* won't work for stderr, though.
>
> That sucks as the debug output all goes to stderr :-(
>

attached is updated patch to write separate output files:
subsurface_err.log
subsurface_out.log

using something like:
dup2(fileno(stdout), fileno(stderr));

to redirect stderr to stdout doesn't seem to work on windows, and even
if it does it will probably have buffer sync issues.

the real, clean solution, of course is to redirect from the CMD line,
but i have no idea why it no longer works.
i'm pretty sure that i've tried that and it worked when i wrote the
custom console code for windows.

lubomir
--
From edcffbc6bafece81c0b08d76f1e71a28819803ff Mon Sep 17 00:00:00 2001
From: "Lubomir I. Ivanov" <[email protected]>
Date: Thu, 2 Feb 2017 21:50:47 +0200
Subject: [PATCH] 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 <[email protected]>
---
 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 ef55f08..5eb8c59 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 2578850..95fb5f8 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 b81f6bf..b050472 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 500412c..20a575b 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 7bff437..f240d13 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=<test>         Choose configuration space for user <test>");
 	printf("\n --cloud-timeout=<nr>  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 58d3bea..a94d7dd 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 165d1f7..e30df68 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();
-- 
1.7.11.msysgit.0

_______________________________________________
subsurface mailing list
[email protected]
http://lists.subsurface-divelog.org/cgi-bin/mailman/listinfo/subsurface

Reply via email to