void logfile_put_flush(LogFile *log, char *file, int line) { char *buf = pthread_getspecific(log->put_buf); if (buf == NULL) { return; } logfile_write(log, log->loglevel, file, line, "%s", buf); buf[0] = 0; }
int fsaprintf(int level, bool showerrno, bool showloc, const char *file, const char *fct, int line, char *format, ...) { char buffer[8192]; char temp[1024]; bool msgscreen; bool msglogfile; va_list ap; // init memset(buffer, 0, sizeof(buffer)); msgscreen=(level <= g_options.verboselevel); msglogfile=(level <= g_options.debuglevel); if (msgscreen || msglogfile) { // 1. format errno and its meaning if (showerrno) strlcatf(buffer, sizeof(buffer), "[errno=%d, %s]: ", errno, strerror(errno)); // 2. format location of the message if (showloc) strlcatf(buffer, sizeof(buffer), "%s#%d,%s(): ", file, line, fct); // 3. format text message va_start(ap, format); vsnprintf(temp, sizeof(temp), format, ap); va_end(ap); strlcatf(buffer, sizeof(buffer), "%s", temp); // 4. show message on screen if (msgscreen) { fprintf(stderr, "%s", buffer); fflush(stderr); } // 5. write message in logfile if requested if (msglogfile) logfile_write(buffer, strlen(buffer)); } return 0; }
/* ============= Com_Printf Both client and server can use this, and it will output to the apropriate place. ============= */ void Com_LPrintf(print_type_t type, const char *fmt, ...) { va_list argptr; char msg[MAXPRINTMSG]; size_t len; // may be entered recursively only once if (com_printEntered >= 2) { return; } com_printEntered++; va_start(argptr, fmt); len = Q_vscnprintf(msg, sizeof(msg), fmt, argptr); va_end(argptr); if (type == PRINT_ERROR && !com_errorEntered && len) { size_t errlen = len; if (errlen >= sizeof(com_errorMsg)) { errlen = sizeof(com_errorMsg) - 1; } // save error msg memcpy(com_errorMsg, msg, errlen); com_errorMsg[errlen] = 0; // strip trailing '\n' if (com_errorMsg[errlen - 1] == '\n') { com_errorMsg[errlen - 1] = 0; } } if (rd_target) { Com_Redirect(msg, len); } else { switch (type) { case PRINT_TALK: Com_SetColor(COLOR_ALT); break; case PRINT_DEVELOPER: Com_SetColor(COLOR_BLUE); break; case PRINT_WARNING: Com_SetColor(COLOR_YELLOW); break; case PRINT_ERROR: Com_SetColor(COLOR_RED); break; case PRINT_NOTICE: Com_SetColor(COLOR_CYAN); break; default: break; } // graphical console Con_Print(msg); // debugging console Sys_ConsoleOutput(msg); // remote console //SV_ConsoleOutput(msg); // logfile if (com_logFile) { logfile_write(type, msg); } if (type) { Com_SetColor(COLOR_NONE); } } com_printEntered--; }