Commit 2c379a1e authored by Dmitry Shulga's avatar Dmitry Shulga

Auto-merge from mysql-5.1-bugteam

parents 0827d824 8520a9fd
...@@ -5447,70 +5447,93 @@ void sql_perror(const char *message) ...@@ -5447,70 +5447,93 @@ void sql_perror(const char *message)
} }
#ifdef __WIN__
extern "C" my_bool reopen_fstreams(const char *filename,
FILE *outstream, FILE *errstream)
{
int handle_fd;
int stream_fd;
HANDLE osfh;
DBUG_ASSERT(filename && (outstream || errstream));
if ((osfh= CreateFile(filename, GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE |
FILE_SHARE_DELETE, NULL,
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
NULL)) == INVALID_HANDLE_VALUE)
return TRUE;
if ((handle_fd= _open_osfhandle((intptr_t)osfh,
_O_APPEND | _O_TEXT)) == -1)
{
CloseHandle(osfh);
return TRUE;
}
if (outstream)
{
stream_fd= _fileno(outstream);
if (_dup2(handle_fd, stream_fd) < 0)
{
CloseHandle(osfh);
return TRUE;
}
}
if (errstream)
{
stream_fd= _fileno(errstream);
if (_dup2(handle_fd, stream_fd) < 0)
{
CloseHandle(osfh);
return TRUE;
}
}
_close(handle_fd);
return FALSE;
}
#else
extern "C" my_bool reopen_fstreams(const char *filename,
FILE *outstream, FILE *errstream)
{
if (outstream && !freopen(filename, "a+", outstream))
return TRUE;
if (errstream && !freopen(filename, "a+", errstream))
return TRUE;
return FALSE;
}
#endif
/* /*
Unfortunately, there seems to be no good way Unfortunately, there seems to be no good way
to restore the original streams upon failure. to restore the original streams upon failure.
*/ */
static bool redirect_std_streams(const char *file) static bool redirect_std_streams(const char *file)
{ {
if (freopen(file, "a+", stdout) && freopen(file, "a+", stderr)) if (reopen_fstreams(file, stdout, stderr))
{ return TRUE;
setbuf(stderr, NULL);
return FALSE;
}
return TRUE; setbuf(stderr, NULL);
return FALSE;
} }
bool flush_error_log() bool flush_error_log()
{ {
bool result=0; bool result= 0;
if (opt_error_log) if (opt_error_log)
{ {
char err_renamed[FN_REFLEN], *end;
end= strmake(err_renamed,log_error_file,FN_REFLEN-5);
strmov(end, "-old");
mysql_mutex_lock(&LOCK_error_log); mysql_mutex_lock(&LOCK_error_log);
#ifdef __WIN__ if (redirect_std_streams(log_error_file))
char err_temp[FN_REFLEN+5]; result= 1;
/*
On Windows is necessary a temporary file for to rename
the current error file.
*/
strxmov(err_temp, err_renamed,"-tmp",NullS);
my_delete(err_temp, MYF(0));
if (freopen(err_temp,"a+",stdout))
{
int fd;
size_t bytes;
uchar buf[IO_SIZE];
freopen(err_temp,"a+",stderr);
setbuf(stderr, NULL);
my_delete(err_renamed, MYF(0));
my_rename(log_error_file, err_renamed, MYF(0));
redirect_std_streams(log_error_file);
if ((fd= my_open(err_temp, O_RDONLY, MYF(0))) >= 0)
{
while ((bytes= mysql_file_read(fd, buf, IO_SIZE, MYF(0))) &&
bytes != MY_FILE_ERROR)
my_fwrite(stderr, buf, bytes, MYF(0));
mysql_file_close(fd, MYF(0));
}
my_delete(err_temp, MYF(0));
}
else
result= 1;
#else
my_rename(log_error_file, err_renamed, MYF(0));
if (redirect_std_streams(log_error_file))
result= 1;
#endif
mysql_mutex_unlock(&LOCK_error_log); mysql_mutex_unlock(&LOCK_error_log);
} }
return result; return result;
} }
void MYSQL_BIN_LOG::signal_update() void MYSQL_BIN_LOG::signal_update()
......
...@@ -192,6 +192,9 @@ typedef fp_except fp_except_t; ...@@ -192,6 +192,9 @@ typedef fp_except fp_except_t;
# endif # endif
#endif #endif
extern "C" my_bool reopen_fstreams(const char *filename,
FILE *outstream, FILE *errstream);
inline void setup_fpu() inline void setup_fpu()
{ {
#if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H)
...@@ -3741,13 +3744,15 @@ static int init_server_components() ...@@ -3741,13 +3744,15 @@ static int init_server_components()
opt_error_log= 0; // Too long file name opt_error_log= 0; // Too long file name
else else
{ {
my_bool res;
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
if (freopen(log_error_file, "a+", stdout)) res= reopen_fstreams(log_error_file, stdout, stderr);
#else
res= reopen_fstreams(log_error_file, NULL, stderr);
#endif #endif
{
if (freopen(log_error_file, "a+", stderr)) if (!res)
setbuf(stderr, NULL); setbuf(stderr, NULL);
}
} }
} }
...@@ -4460,8 +4465,8 @@ int mysqld_main(int argc, char **argv) ...@@ -4460,8 +4465,8 @@ int mysqld_main(int argc, char **argv)
#ifdef __WIN__ #ifdef __WIN__
if (!opt_console) if (!opt_console)
{ {
freopen(log_error_file,"a+",stdout); if (reopen_fstreams(log_error_file, stdout, stderr))
freopen(log_error_file,"a+",stderr); unireg_abort(1);
setbuf(stderr, NULL); setbuf(stderr, NULL);
FreeConsole(); // Remove window FreeConsole(); // Remove window
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment