mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 20:12:31 +01:00
Merge of mysql-5.1 into mysql-5.5.
This commit is contained in:
commit
ff3f14db61
3 changed files with 145 additions and 66 deletions
|
@ -631,6 +631,7 @@ extern const char** get_global_errmsgs();
|
|||
extern void wait_for_free_space(const char *filename, int errors);
|
||||
extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
|
||||
extern FILE *my_fdopen(File Filedes,const char *name, int Flags,myf MyFlags);
|
||||
extern FILE *my_freopen(const char *path, const char *mode, FILE *stream);
|
||||
extern int my_fclose(FILE *fd,myf MyFlags);
|
||||
extern File my_fileno(FILE *fd);
|
||||
extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
|
||||
|
|
134
mysys/my_fopen.c
134
mysys/my_fopen.c
|
@ -18,6 +18,10 @@
|
|||
#include <errno.h>
|
||||
#include "mysys_err.h"
|
||||
|
||||
#if defined(__FreeBSD__)
|
||||
extern int getosreldate(void);
|
||||
#endif
|
||||
|
||||
static void make_ftype(char * to,int flag);
|
||||
|
||||
/*
|
||||
|
@ -89,7 +93,135 @@ FILE *my_fopen(const char *filename, int flags, myf MyFlags)
|
|||
} /* my_fopen */
|
||||
|
||||
|
||||
/* Close a stream */
|
||||
#if defined(_WIN32)
|
||||
|
||||
static FILE *my_win_freopen(const char *path, const char *mode, FILE *stream)
|
||||
{
|
||||
int handle_fd, fd= _fileno(stream);
|
||||
HANDLE osfh;
|
||||
|
||||
DBUG_ASSERT(path && stream);
|
||||
|
||||
/* Services don't have stdout/stderr on Windows, so _fileno returns -1. */
|
||||
if (fd < 0)
|
||||
{
|
||||
if (!freopen(path, mode, stream))
|
||||
return NULL;
|
||||
|
||||
fd= _fileno(stream);
|
||||
}
|
||||
|
||||
if ((osfh= CreateFile(path, GENERIC_READ | GENERIC_WRITE,
|
||||
FILE_SHARE_READ | FILE_SHARE_WRITE |
|
||||
FILE_SHARE_DELETE, NULL,
|
||||
OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL,
|
||||
NULL)) == INVALID_HANDLE_VALUE)
|
||||
return NULL;
|
||||
|
||||
if ((handle_fd= _open_osfhandle((intptr_t)osfh,
|
||||
_O_APPEND | _O_TEXT)) == -1)
|
||||
{
|
||||
CloseHandle(osfh);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (_dup2(handle_fd, fd) < 0)
|
||||
{
|
||||
CloseHandle(osfh);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
_close(handle_fd);
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
#elif defined(__FreeBSD__)
|
||||
|
||||
/* No close operation hook. */
|
||||
|
||||
static int no_close(void *cookie __attribute__((unused)))
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
A hack around a race condition in the implementation of freopen.
|
||||
|
||||
The race condition steams from the fact that the current fd of
|
||||
the stream is closed before its number is used to duplicate the
|
||||
new file descriptor. This defeats the desired atomicity of the
|
||||
close and duplicate of dup2().
|
||||
|
||||
See PR number 79887 for reference:
|
||||
http://www.freebsd.org/cgi/query-pr.cgi?pr=79887
|
||||
*/
|
||||
|
||||
static FILE *my_freebsd_freopen(const char *path, const char *mode, FILE *stream)
|
||||
{
|
||||
int old_fd;
|
||||
FILE *result;
|
||||
|
||||
flockfile(stream);
|
||||
|
||||
old_fd= fileno(stream);
|
||||
|
||||
/* Use a no operation close hook to avoid having the fd closed. */
|
||||
stream->_close= no_close;
|
||||
|
||||
/* Relies on the implicit dup2 to close old_fd. */
|
||||
result= freopen(path, mode, stream);
|
||||
|
||||
/* If successful, the _close hook was replaced. */
|
||||
|
||||
if (result == NULL)
|
||||
close(old_fd);
|
||||
else
|
||||
funlockfile(result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
/**
|
||||
Change the file associated with a file stream.
|
||||
|
||||
@param path Path to file.
|
||||
@param mode Mode of the stream.
|
||||
@param stream File stream.
|
||||
|
||||
@note
|
||||
This function is used to redirect stdout and stderr to a file and
|
||||
subsequently to close and reopen that file for log rotation.
|
||||
|
||||
@retval A FILE pointer on success. Otherwise, NULL.
|
||||
*/
|
||||
|
||||
FILE *my_freopen(const char *path, const char *mode, FILE *stream)
|
||||
{
|
||||
FILE *result;
|
||||
|
||||
#if defined(_WIN32)
|
||||
result= my_win_freopen(path, mode, stream);
|
||||
#elif defined(__FreeBSD__)
|
||||
/*
|
||||
XXX: Once the fix is ported to the stable releases, this should
|
||||
be dependent upon the specific FreeBSD versions. Check at:
|
||||
http://www.freebsd.org/cgi/query-pr.cgi?pr=79887
|
||||
*/
|
||||
if (getosreldate() > 900027)
|
||||
result= freopen(path, mode, stream);
|
||||
else
|
||||
result= my_freebsd_freopen(path, mode, stream);
|
||||
#else
|
||||
result= freopen(path, mode, stream);
|
||||
#endif
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
/* Close a stream */
|
||||
int my_fclose(FILE *fd, myf MyFlags)
|
||||
|
|
76
sql/log.cc
76
sql/log.cc
|
@ -5686,80 +5686,26 @@ void sql_perror(const char *message)
|
|||
}
|
||||
|
||||
|
||||
#ifdef __WIN__
|
||||
/*
|
||||
Change the file associated with two output streams. Used to
|
||||
redirect stdout and stderr to a file. The streams are reopened
|
||||
only for appending (writing at end of file).
|
||||
*/
|
||||
extern "C" my_bool reopen_fstreams(const char *filename,
|
||||
FILE *outstream, FILE *errstream)
|
||||
{
|
||||
int handle_fd;
|
||||
int err_fd, out_fd;
|
||||
HANDLE osfh;
|
||||
if (outstream && !my_freopen(filename, "a", outstream))
|
||||
return TRUE;
|
||||
|
||||
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;
|
||||
if (errstream && !my_freopen(filename, "a", errstream))
|
||||
return TRUE;
|
||||
|
||||
/* The error stream must be unbuffered. */
|
||||
if (errstream)
|
||||
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 |
|
||||
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 (_dup2(handle_fd, err_fd) < 0)
|
||||
{
|
||||
CloseHandle(osfh);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (outstream && _dup2(handle_fd, out_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
|
||||
|
||||
|
||||
/*
|
||||
|
|
Loading…
Reference in a new issue