summaryrefslogtreecommitdiff
path: root/sql/log.cc
diff options
context:
space:
mode:
authorDmitry Shulga <Dmitry.Shulga@Sun.COM>2010-09-22 19:53:06 +0700
committerDmitry Shulga <Dmitry.Shulga@Sun.COM>2010-09-22 19:53:06 +0700
commitc7ccc7265e8ff1a4bca27928a36d434574551fec (patch)
treeb741132877ba45fabaaaf875d261911193d79b22 /sql/log.cc
parent386d50478c20c863ccb78c81bdcb79bfeeb6089a (diff)
downloadmariadb-git-c7ccc7265e8ff1a4bca27928a36d434574551fec.tar.gz
Fixed bug#56821 - failure to start the MySQL Service.
Diffstat (limited to 'sql/log.cc')
-rw-r--r--sql/log.cc46
1 files changed, 30 insertions, 16 deletions
diff --git a/sql/log.cc b/sql/log.cc
index 503b3bb5cff..56f151fe2ab 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -5072,10 +5072,32 @@ extern "C" my_bool reopen_fstreams(const char *filename,
FILE *outstream, FILE *errstream)
{
int handle_fd;
- int stream_fd;
+ int err_fd, out_fd;
HANDLE osfh;
- DBUG_ASSERT(filename && (outstream || errstream));
+ DBUG_ASSERT(filename && errstream);
+
+ // Services don't have stdout/stderr on Windows, so _fileno returns -1.
+ err_fd= _fileno(errstream);
+ if (err_fd < 0)
+ {
+ if (!freopen(filename, "a+", errstream))
+ return TRUE;
+
+ setbuf(errstream, NULL);
+ err_fd= _fileno(errstream);
+ }
+
+ if (outstream)
+ {
+ out_fd= _fileno(outstream);
+ if (out_fd < 0)
+ {
+ if (!freopen(filename, "a+", outstream))
+ return TRUE;
+ out_fd= _fileno(outstream);
+ }
+ }
if ((osfh= CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE |
@@ -5091,24 +5113,16 @@ extern "C" my_bool reopen_fstreams(const char *filename,
return TRUE;
}
- if (outstream)
+ if (_dup2(handle_fd, err_fd) < 0)
{
- stream_fd= _fileno(outstream);
- if (_dup2(handle_fd, stream_fd) < 0)
- {
- CloseHandle(osfh);
- return TRUE;
- }
+ CloseHandle(osfh);
+ return TRUE;
}
- if (errstream)
+ if (outstream && _dup2(handle_fd, out_fd) < 0)
{
- stream_fd= _fileno(errstream);
- if (_dup2(handle_fd, stream_fd) < 0)
- {
- CloseHandle(osfh);
- return TRUE;
- }
+ CloseHandle(osfh);
+ return TRUE;
}
_close(handle_fd);