=== modified file 'sql/log.cc' --- sql/log.cc revid:vasil.dimov@oracle.com-20101205191613-1i27liitkr9tpa7s +++ sql/log.cc 2010-12-08 12:08:25 +0000 @@ -5063,42 +5063,87 @@ void sql_perror(const char *message) sql_print_error("%s: %s",message, strerror(errno)); #else perror(message); #endif } +/** + Opens filename and reassociates f with it. + + @param filename Path to file + @param f Stream to reassociate + + @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 + true Success + @retval + false Error +*/ +static bool my_freopen(const char *filename, FILE** f) +{ +#ifdef __FreeBSD__ + int fd_new; + int fd_orig; + FILE* f_new; + + fd_new = open(filename, O_WRONLY | O_APPEND); + if (fd_new == -1) { + fclose(*f); + return false; + } + fflush(*f); + fd_orig = fileno(*f); + if (dup2(fd_new, fd_orig) == -1) { + close(fd_new); + return false; + } + close(fd_new); + f_new = fdopen(fd_orig, "a"); + if (f_new == NULL) { + close(fd_orig); + return false; + } + *f = f_new; + return true; +#else + return freopen(filename, "a", *f) != NULL; +#endif +} #ifdef __WIN__ extern "C" my_bool reopen_fstreams(const char *filename, - FILE *outstream, FILE *errstream) + FILE **outstream, FILE **errstream) { int handle_fd; int err_fd, out_fd; HANDLE osfh; - DBUG_ASSERT(filename && errstream); + DBUG_ASSERT(filename && *errstream); // Services don't have stdout/stderr on Windows, so _fileno returns -1. - err_fd= _fileno(errstream); + err_fd= _fileno(*errstream); if (err_fd < 0) { - if (!freopen(filename, "a+", errstream)) + if (!my_freopen(filename, errstream)) return TRUE; - setbuf(errstream, NULL); - err_fd= _fileno(errstream); + setbuf(*errstream, NULL); + err_fd= _fileno(*errstream); } - if (outstream) + if (outstream != NULL) { - out_fd= _fileno(outstream); + out_fd= _fileno(*outstream); if (out_fd < 0) { - if (!freopen(filename, "a+", outstream)) + if (!my_freopen(filename, outstream)) return TRUE; - out_fd= _fileno(outstream); + out_fd= _fileno(*outstream); } } if ((osfh= CreateFile(filename, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, @@ -5116,29 +5161,29 @@ extern "C" my_bool reopen_fstreams(const if (_dup2(handle_fd, err_fd) < 0) { CloseHandle(osfh); return TRUE; } - if (outstream && _dup2(handle_fd, out_fd) < 0) + 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) + FILE **outstream, FILE **errstream) { - if (outstream && !freopen(filename, "a+", outstream)) + if (outstream != NULL && !my_freopen(filename, outstream)) return TRUE; - if (errstream && !freopen(filename, "a+", errstream)) + if (errstream != NULL && !my_freopen(filename, errstream)) return TRUE; return FALSE; } #endif @@ -5146,13 +5191,13 @@ extern "C" my_bool reopen_fstreams(const /* Unfortunately, there seems to be no good way to restore the original streams upon failure. */ static bool redirect_std_streams(const char *file) { - if (reopen_fstreams(file, stdout, stderr)) + if (reopen_fstreams(file, &stdout, &stderr)) return TRUE; setbuf(stderr, NULL); return FALSE; } === modified file 'sql/mysqld.cc' --- sql/mysqld.cc revid:vasil.dimov@oracle.com-20101205191613-1i27liitkr9tpa7s +++ sql/mysqld.cc 2010-12-08 12:06:34 +0000 @@ -195,13 +195,13 @@ typedef fp_except fp_except_t; # define _FPU_GETCW(cw) (cw= 0) # define _FPU_SETCW(cw) # endif #endif extern "C" my_bool reopen_fstreams(const char *filename, - FILE *outstream, FILE *errstream); + FILE **outstream, FILE **errstream); inline void setup_fpu() { #if defined(__FreeBSD__) && defined(HAVE_IEEEFP_H) /* We can't handle floating point exceptions with threads, so disable this on freebsd @@ -3815,15 +3815,15 @@ static int init_server_components() if (!log_error_file[0]) opt_error_log= 1; // Too long file name else { my_bool res; #ifndef EMBEDDED_LIBRARY - res= reopen_fstreams(log_error_file, stdout, stderr); + res= reopen_fstreams(log_error_file, &stdout, &stderr); #else - res= reopen_fstreams(log_error_file, NULL, stderr); + res= reopen_fstreams(log_error_file, NULL, &stderr); #endif if (!res) setbuf(stderr, NULL); } } @@ -4469,13 +4469,13 @@ we force server id to 2, but this MySQL init_ssl(); network_init(); #ifdef __WIN__ if (!opt_console) { - if (reopen_fstreams(log_error_file, stdout, stderr)) + if (reopen_fstreams(log_error_file, &stdout, &stderr)) unireg_abort(1); setbuf(stderr, NULL); FreeConsole(); // Remove window } #endif