int apxLogWrite( HANDLE hFile, DWORD dwLevel, BOOL bTimeStamp, LPCSTR szFile, DWORD dwLine, LPCSTR szFormat, ...) { va_list args; CHAR buffer[1024+32]; LPSTR szBp; int len = 0; LPCSTR f = szFile; CHAR sb[MAX_PATH+1]; DWORD wr; DWORD err; BOOL dolock = TRUE; apx_logfile_st *lf = (apx_logfile_st *)hFile; err = GetLastError(); /* save the last Error code */ if (IS_INVALID_HANDLE(lf)) lf = _st_sys_loghandle; if (IS_INVALID_HANDLE(lf)) { lf = &_st_sys_errhandle; lf->hFile = GetStdHandle(STD_ERROR_HANDLE); dolock = FALSE; } if (dwLevel < lf->dwLogLevel) return 0; if (f) { f = (szFile + lstrlenA(szFile) - 1); while(f != szFile && '\\' != *f && '/' != *f) f--; if(f != szFile) f++; } lstrcpyA(buffer, _log_level[dwLevel]); if (!dolock) lstrcatA(buffer, "\n"); szBp = &buffer[lstrlenA(buffer)]; if (!szFormat) { FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szBp, 1000, NULL); } else { va_start(args, szFormat); wvsprintfA(szBp, szFormat, args); va_end(args); } len = lstrlenA(buffer); if (len > 0) { /* Remove trailing line separator */ if (buffer[len - 1] == '\n') { buffer[len - 1] = '\0'; --len; } if (!IS_INVALID_HANDLE(lf->hFile)) { SYSTEMTIME t; GetLocalTime(&t); if (lf->bRotate) { if (!apx_log_rotate(lf, &t)) return 0; } if (dolock) { APX_LOGLOCK(lf->hFile); } if (bTimeStamp) { wsprintfA(sb, "[%d-%02d-%02d %02d:%02d:%02d] ", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL); } if (f) { wsprintfA(sb, "[%-4d %s] ", dwLine, f); WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL); } WriteFile(lf->hFile, buffer, len, &wr, NULL); /* Terminate the line */ WriteFile(lf->hFile, LINE_SEP, sizeof(LINE_SEP) - 1, &wr, NULL); #ifdef _DEBUG_FULL FlushFileBuffers(lf->hFile); #endif if (dolock) { APX_LOGUNLOCK(lf->hFile); } } #ifdef _DEBUG_FULL { char tid[1024 + 16]; wsprintfA(tid, "[%04X] %s", GetCurrentThreadId(), buffer); OutputDebugStringA(tid); } #endif } /* Restore the last Error code */ SetLastError(err); return len; }
int apxLogWrite( HANDLE hFile, DWORD dwLevel, BOOL bTimeStamp, LPCSTR szFile, DWORD dwLine, LPCSTR szFormat, ...) { va_list args; CHAR buffer[1024+32] = ""; LPSTR szBp; int len = 0; LPCSTR f = szFile; CHAR sb[SIZ_PATHLEN]; DWORD wr; DWORD err; BOOL dolock = TRUE; apx_logfile_st *lf = (apx_logfile_st *)hFile; err = GetLastError(); /* save the last Error code */ if (IS_INVALID_HANDLE(lf)) lf = _st_sys_loghandle; if (IS_INVALID_HANDLE(lf)) { lf = &_st_sys_errhandle; lf->hFile = GetStdHandle(STD_ERROR_HANDLE); dolock = FALSE; } if (dwLevel < lf->dwLogLevel) return 0; if (f && (lf->dwLogLevel == APXLOG_LEVEL_DEBUG || dwLevel == APXLOG_LEVEL_ERROR)) { f = (szFile + lstrlenA(szFile) - 1); while(f != szFile && '\\' != *f && '/' != *f) f--; if(f != szFile) f++; } else f = NULL; szBp = buffer; if (!szFormat) { if (err == 0) { lstrcpyA(szBp, "Unknown error code"); if (dwLevel == APXLOG_LEVEL_ERROR) { szBp += 18; wsprintfA(szBp, " occured in (%s:%d) ", f, dwLine); } } else FormatMessageA(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, err, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), szBp, 1000, NULL); } else { va_start(args, szFormat); wvsprintfA(szBp, szFormat, args); va_end(args); } len = lstrlenA(buffer); if (len > 0) { /* Remove trailing line separator */ if (buffer[len - 1] == '\n') buffer[--len] = '\0'; if (len > 0 && buffer[len - 1] == '\r') buffer[--len] = '\0'; if (!IS_INVALID_HANDLE(lf->hFile)) { SYSTEMTIME t; GetLocalTime(&t); if (dolock) { APX_LOGLOCK(lf->hFile); logRotate(lf, &t); } if (bTimeStamp) { wsprintfA(sb, "[%d-%02d-%02d %02d:%02d:%02d] ", t.wYear, t.wMonth, t.wDay, t.wHour, t.wMinute, t.wSecond); WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL); } WriteFile(lf->hFile, _log_level[dwLevel], lstrlenA(_log_level[dwLevel]), &wr, NULL); if (f && lf->dwLogLevel == APXLOG_LEVEL_DEBUG) { wsprintfA(sb, "(%10s:%-4d) ", f, dwLine); WriteFile(lf->hFile, sb, lstrlenA(sb), &wr, NULL); } if (len) WriteFile(lf->hFile, buffer, len, &wr, NULL); /* Terminate the line */ WriteFile(lf->hFile, LINE_SEP, sizeof(LINE_SEP) - 1, &wr, NULL); #ifdef _DEBUG_FULL FlushFileBuffers(lf->hFile); #endif if (dolock) { APX_LOGUNLOCK(lf->hFile); } } #ifdef _DEBUG_FULL { char tid[1024 + 16]; wsprintfA(tid, "[%04d] %s", GetCurrentThreadId(), buffer); OutputDebugStringA(tid); } #endif } /* Restore the last Error code */ SetLastError(err); if (szFormat && err != 0 && dwLevel == APXLOG_LEVEL_ERROR) { /* Print the System error description */ apxLogWrite(hFile, dwLevel, bTimeStamp, szFile, dwLine, NULL); } return len; }