1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

Auto-merge from mysql-5.1-bugteam

This commit is contained in:
Dmitry Shulga
2010-08-25 18:39:38 +07:00
2 changed files with 82 additions and 54 deletions

View File

@ -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
to restore the original streams upon failure.
*/
static bool redirect_std_streams(const char *file)
{
if (freopen(file, "a+", stdout) && freopen(file, "a+", stderr))
{
setbuf(stderr, NULL);
return FALSE;
}
if (reopen_fstreams(file, stdout, stderr))
return TRUE;
return TRUE;
setbuf(stderr, NULL);
return FALSE;
}
bool flush_error_log()
{
bool result=0;
bool result= 0;
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);
#ifdef __WIN__
char err_temp[FN_REFLEN+5];
/*
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
if (redirect_std_streams(log_error_file))
result= 1;
mysql_mutex_unlock(&LOCK_error_log);
}
return result;
return result;
}
void MYSQL_BIN_LOG::signal_update()