summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorterkhen <terkhen@openttd.org>2011-05-15 14:51:06 +0000
committerterkhen <terkhen@openttd.org>2011-05-15 14:51:06 +0000
commit003dee6e382369eb506adae74c61a9109d400563 (patch)
tree655eaa68b79cfa81d971994ea480017eaa1513ca
parent4c63d8e82f385dfad5aa407717234df30bc85a0b (diff)
downloadopenttd-003dee6e382369eb506adae74c61a9109d400563.tar.xz
(svn r22464) -Fix [FS#4587]: [Windows] Prevent a crash when launching OpenTTD with -d from a MSYS console. Added a note to known-bugs about this issue.
-rw-r--r--known-bugs.txt6
-rw-r--r--src/os/windows/win32.cpp16
2 files changed, 21 insertions, 1 deletions
diff --git a/known-bugs.txt b/known-bugs.txt
index 499801c25..4fd48c77a 100644
--- a/known-bugs.txt
+++ b/known-bugs.txt
@@ -293,3 +293,9 @@ Can't change volume inside OpenTTD [FS#4416]
in OpenTTD. As a result you can't change the volume inside OpenTTD
for backends such as SDL; just use the volume control provided by
your operating system.
+
+Can't run OpenTTD with the -d option from a MSYS console [FS#4587]
+ The MSYS console does not allow OpenTTD to open an extra console for
+ debugging output. Compiling OpenTTD with the --enable-console
+ configure option prevents this issue and allows the -d option to use
+ the MSYS console for its output.
diff --git a/src/os/windows/win32.cpp b/src/os/windows/win32.cpp
index a66d3d65c..54c5c9cd3 100644
--- a/src/os/windows/win32.cpp
+++ b/src/os/windows/win32.cpp
@@ -297,7 +297,21 @@ void CreateConsole()
/* redirect unbuffered STDIN, STDOUT, STDERR to the console */
#if !defined(__CYGWIN__)
- *stdout = *_fdopen( _open_osfhandle((intptr_t)hand, _O_TEXT), "w" );
+
+ /* Check if we can open a handle to STDOUT. */
+ int fd = _open_osfhandle((intptr_t)hand, _O_TEXT);
+ if (fd == -1) {
+ /* Free everything related to the console. */
+ FreeConsole();
+ _has_console = false;
+ _close(fd);
+ CloseHandle(hand);
+
+ ShowInfo("Unable to open an output handle to the console. Check known-bugs.txt for details.");
+ return;
+ }
+
+ *stdout = *_fdopen(fd, "w");
*stdin = *_fdopen(_open_osfhandle((intptr_t)GetStdHandle(STD_INPUT_HANDLE), _O_TEXT), "r" );
*stderr = *_fdopen(_open_osfhandle((intptr_t)GetStdHandle(STD_ERROR_HANDLE), _O_TEXT), "w" );
#else