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 void wait_for_free_space(const char *filename, int errors);
|
||||||
extern FILE *my_fopen(const char *FileName,int Flags,myf MyFlags);
|
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_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 int my_fclose(FILE *fd,myf MyFlags);
|
||||||
extern File my_fileno(FILE *fd);
|
extern File my_fileno(FILE *fd);
|
||||||
extern int my_chsize(File fd,my_off_t newlength, int filler, myf MyFlags);
|
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 <errno.h>
|
||||||
#include "mysys_err.h"
|
#include "mysys_err.h"
|
||||||
|
|
||||||
|
#if defined(__FreeBSD__)
|
||||||
|
extern int getosreldate(void);
|
||||||
|
#endif
|
||||||
|
|
||||||
static void make_ftype(char * to,int flag);
|
static void make_ftype(char * to,int flag);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -89,7 +93,135 @@ FILE *my_fopen(const char *filename, int flags, myf MyFlags)
|
||||||
} /* my_fopen */
|
} /* 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 */
|
/* Close a stream */
|
||||||
int my_fclose(FILE *fd, myf MyFlags)
|
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,
|
extern "C" my_bool reopen_fstreams(const char *filename,
|
||||||
FILE *outstream, FILE *errstream)
|
FILE *outstream, FILE *errstream)
|
||||||
{
|
{
|
||||||
int handle_fd;
|
if (outstream && !my_freopen(filename, "a", outstream))
|
||||||
int err_fd, out_fd;
|
return TRUE;
|
||||||
HANDLE osfh;
|
|
||||||
|
|
||||||
DBUG_ASSERT(filename && errstream);
|
if (errstream && !my_freopen(filename, "a", errstream))
|
||||||
|
return TRUE;
|
||||||
// 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;
|
|
||||||
|
|
||||||
|
/* The error stream must be unbuffered. */
|
||||||
|
if (errstream)
|
||||||
setbuf(errstream, NULL);
|
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;
|
return FALSE;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in a new issue