diff --git a/os/log.c b/os/log.c index b7dc1aa80..392f33198 100644 --- a/os/log.c +++ b/os/log.c @@ -110,7 +110,6 @@ OR PERFORMANCE OF THIS SOFTWARE. #define DEFAULT_LOG_VERBOSITY 0 #define DEFAULT_LOG_FILE_VERBOSITY 3 -static FILE *logFile = NULL; static int logFileFd = -1; static Bool logFlush = FALSE; static Bool logSync = FALSE; @@ -236,18 +235,15 @@ LogInit(const char *fname, const char *backup) saved_log_backup = strdup(backup); } else logFileName = LogFilePrep(fname, backup, display); - if ((logFile = fopen(logFileName, "w")) == NULL) - FatalError("Cannot open log file \"%s\"\n", logFileName); - setvbuf(logFile, NULL, _IONBF, 0); - logFileFd = fileno(logFile); + if ((logFileFd = open(logFileName, O_WRONLY | O_CREAT, S_IRUSR|S_IWUSR|S_IRGRP)) == -1) + FatalError("Cannot open log file \"%s\": %s\n", logFileName, strerror(errno)); /* Flush saved log information. */ if (saveBuffer && bufferSize > 0) { - fwrite(saveBuffer, bufferPos, 1, logFile); - fflush(logFile); + write(logFileFd, saveBuffer, bufferPos); #ifndef WIN32 - fsync(fileno(logFile)); + fsync(logFileFd); #endif } } @@ -299,14 +295,13 @@ LogSetDisplay(void) void LogClose(enum ExitCode error) { - if (logFile) { + if (logFileFd != -1) { int msgtype = (error == EXIT_NO_ERROR) ? X_INFO : X_ERROR; LogMessageVerb(msgtype, -1, "Server terminated %s (%d). Closing log file.\n", (error == EXIT_NO_ERROR) ? "successfully" : "with error", error); - fclose(logFile); - logFile = NULL; + close(logFileFd); logFileFd = -1; } } @@ -570,24 +565,22 @@ LogSWrite(int verb, const char *buf, size_t len, Bool end_line) fsync(logFileFd); #endif } - else if (!inSignalContext && logFile) { + else if (!inSignalContext && logFileFd != -1) { if (newline) { time_t t = time(NULL); struct tm tm; char fmt_tm[32]; localtime_r(&t, &tm); - strftime(fmt_tm, sizeof(fmt_tm) - 1, "%Y-%m-%d %H:%M:%S", &tm); - - fprintf(logFile, "[%s] ", fmt_tm); + strftime(fmt_tm, sizeof(fmt_tm) - 1, "[%Y-%m-%d %H:%M:%S] ", &tm); + write(logFileFd, fmt_tm, strlen(fmt_tm)); } newline = end_line; - fwrite(buf, len, 1, logFile); + write(logFileFd, buf, len); if (logFlush) { - fflush(logFile); #ifndef WIN32 if (logSync) - fsync(fileno(logFile)); + fsync(logFileFd); #endif } }