windows-nt/Source/XPSP1/NT/inetsrv/iis/setup/osrc/log.cpp
2020-09-26 16:20:57 +08:00

308 lines
9.4 KiB
C++

#include "stdafx.h"
#include "resource.h"
#include "log.h"
// critical section needed to safely write to the logfile
CRITICAL_SECTION critical_section;
//***************************************************************************
//*
//* purpose: constructor
//*
//***************************************************************************
MyLogFile::MyLogFile(void)
{
_tcscpy(m_szLogFileName, _T(""));
_tcscpy(m_szLogFileName_Full, _T(""));
_tcscpy(m_szLogPreLineInfo, _T(""));
_tcscpy(m_szLogPreLineInfo2, _T(""));
m_bDisplayTimeStamp = TRUE;
m_bDisplayPreLineInfo = TRUE;
m_bFlushLogToDisk = FALSE;
m_hFile = NULL;
// initialize the critical section
INITIALIZE_CRITICAL_SECTION( &critical_section );
}
//***************************************************************************
//*
//* purpose: destructor
//*
//***************************************************************************
MyLogFile::~MyLogFile(void)
{
DeleteCriticalSection( &critical_section );
}
//***************************************************************************
//*
//* purpose:
//*
//***************************************************************************
int MyLogFile::LogFileCreate(TCHAR *lpLogFileName )
{
int iReturn = FALSE;
TCHAR szDrive_only[_MAX_DRIVE];
TCHAR szPath_only[_MAX_PATH];
TCHAR szFilename_only[_MAX_PATH];
TCHAR szFilename_bak[_MAX_PATH];
LPWSTR pwsz = NULL;
// because of the global flags and such, we'll make this critical
EnterCriticalSection( &critical_section );
if (lpLogFileName == NULL)
{
TCHAR szModuleFileName[_MAX_PATH];
// if a logfilename was not specified then use the module name.
if (0 == GetModuleFileName(NULL, szModuleFileName, _MAX_PATH))
{
_tcscpy(szFilename_only, _T("iis.log"));
}
else
{
// get only the filename
_tsplitpath( szModuleFileName, NULL, NULL, szFilename_only, NULL);
_tcscat(szFilename_only, _T(".LOG"));
}
_tcscpy(m_szLogFileName, szFilename_only);
}
else
{
_tcscpy(m_szLogFileName, lpLogFileName);
}
if (GetWindowsDirectory(m_szLogFileName_Full, sizeof(m_szLogFileName_Full)/sizeof(TCHAR)))
{
AddPath(m_szLogFileName_Full, m_szLogFileName);
if (GetFileAttributes(m_szLogFileName_Full) != 0xFFFFFFFF)
{
// there is a current .log file already there.
// if it is larger than 2megs then rename it.
DWORD dwSize1 = ReturnFileSize(m_szLogFileName_Full);
if (dwSize1 == 0xFFFFFFFF || dwSize1 > 2000000)
{
// unable to retrieve the size of one of those files
// or the size is bigger than 2megs.
// backup the old one.
// Make a backup of the current log file
_tsplitpath( m_szLogFileName_Full, szDrive_only, szPath_only, szFilename_only, NULL);
_tcscpy(szFilename_bak, szDrive_only);
_tcscat(szFilename_bak, szPath_only);
_tcscat(szFilename_bak, szFilename_only);
_tcscat(szFilename_bak, _T(".BAK"));
SetFileAttributes(szFilename_bak, FILE_ATTRIBUTE_NORMAL);
DeleteFile(szFilename_bak);
if (MoveFile(m_szLogFileName_Full, szFilename_bak) == 0)
{
// This failed
//MyMessageBox(NULL,_T("LogFile MoveFile Failed"),_T("LogFile Error"), MB_OK | MB_SETFOREGROUND);
}
}
}
#if defined(UNICODE) || defined(_UNICODE)
pwsz = m_szLogFileName_Full;
#else
pwsz = MakeWideStrFromAnsi( m_szLogFileName_Full);
#endif
// Open existing file or create a new one.
m_hFile = CreateFile(m_szLogFileName_Full,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
if (m_hFile == INVALID_HANDLE_VALUE)
{
m_hFile = NULL;
//MyMessageBox(NULL, _T("Unable to create iis setup log file"), _T("LogFile Error"), MB_OK | MB_SETFOREGROUND);
}
else
{
SetFilePointer( m_hFile, NULL, NULL, FILE_END );
iReturn = TRUE;
}
//LogFileTimeStamp();
LogFileWrite(_T("LogFile Open. [***** Search on FAIL/MessageBox keywords for failures *****].\r\n"));
}
// safe to leave the critical section
LeaveCriticalSection( &critical_section );
return iReturn;
}
//***************************************************************************
//*
//* purpose:
//*
//***************************************************************************
int MyLogFile::LogFileClose(void)
{
if (m_hFile)
{
LogFileWrite(_T("LogFile Close.\r\n"));
CloseHandle(m_hFile);
return TRUE;
}
return FALSE;
}
//***************************************************************************
//*
//* purpose: add stuff to logfile
//*
//***************************************************************************
void MyLogFile::LogFileTimeStamp()
{
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
m_bDisplayTimeStamp = FALSE;
m_bDisplayPreLineInfo = FALSE;
LogFileWrite(_T("[%d/%d/%d %d:%d:%d]\r\n"),SystemTime.wMonth, SystemTime.wDay, SystemTime.wYear,SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
m_bDisplayTimeStamp = TRUE;
m_bDisplayPreLineInfo = TRUE;
}
//***************************************************************************
//*
//* purpose:
//*
//***************************************************************************
#define LOG_STRING_LEN 1000
void MyLogFile::LogFileWrite(TCHAR *pszFormatString, ...)
{
if (m_hFile)
{
// because of the global flags and such, we'll make this critical
EnterCriticalSection( &critical_section );
va_list args;
TCHAR pszFullErrMsg[LOG_STRING_LEN];
char pszFullErrMsgA[LOG_STRING_LEN];
strcpy(pszFullErrMsgA, "");
DWORD dwBytesWritten = 0;
if (_tcslen(pszFormatString) > LOG_STRING_LEN)
{
// this will overrun our buffer, just get out
goto MyLogFile_LogFileWrite_Exit;
}
__try
{
va_start(args, pszFormatString);
if (!_vsntprintf(pszFullErrMsg, LOG_STRING_LEN, pszFormatString, args))
{
goto MyLogFile_LogFileWrite_Exit;
}
va_end(args);
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
goto MyLogFile_LogFileWrite_Exit;
}
if (pszFullErrMsg)
{
#if defined(UNICODE) || defined(_UNICODE)
// convert to ascii then write to stream
WideCharToMultiByte( CP_ACP, 0, (TCHAR *)pszFullErrMsg, -1, pszFullErrMsgA, LOG_STRING_LEN, NULL, NULL );
#else
// the is already ascii so just copy the pointer
strcpy(pszFullErrMsgA,pszFullErrMsg);
#endif
// If the Display timestap is set then display the timestamp
if (m_bDisplayTimeStamp == TRUE)
{
// Get timestamp
SYSTEMTIME SystemTime;
GetLocalTime(&SystemTime);
char szDateandtime[50];
sprintf(szDateandtime,"[%d/%d/%d %d:%d:%d] ",SystemTime.wMonth, SystemTime.wDay, SystemTime.wYear,SystemTime.wHour, SystemTime.wMinute, SystemTime.wSecond);
// Write time to stream
if (m_hFile) {WriteFile(m_hFile,szDateandtime,strlen(szDateandtime),&dwBytesWritten,NULL);}
}
char szPrelineWriteString[100];
char szPrelineWriteString2[100];
// If the Display timestap is set then display the timestamp
if (m_bDisplayPreLineInfo == TRUE)
{
if (_tcscmp(m_szLogPreLineInfo,_T("")) != 0)
{
#if defined(UNICODE) || defined(_UNICODE)
// convert to ascii
WideCharToMultiByte( CP_ACP, 0, (TCHAR *)m_szLogPreLineInfo, -1, szPrelineWriteString, 100, NULL, NULL );
#else
// the is already ascii so just copy
strcpy(szPrelineWriteString, m_szLogPreLineInfo);
#endif
if (m_hFile) {WriteFile(m_hFile,szPrelineWriteString,strlen(szPrelineWriteString),&dwBytesWritten,NULL);}
}
if (_tcscmp(m_szLogPreLineInfo2,_T("")) != 0)
{
#if defined(UNICODE) || defined(_UNICODE)
// convert to ascii
WideCharToMultiByte( CP_ACP, 0, (TCHAR *)m_szLogPreLineInfo2, -1, szPrelineWriteString2, 100, NULL, NULL );
#else
// the is already ascii so just copy
strcpy(szPrelineWriteString2, m_szLogPreLineInfo2);
#endif
if (m_hFile) {WriteFile(m_hFile,szPrelineWriteString2,strlen(szPrelineWriteString2),&dwBytesWritten,NULL);}
}
}
// if it does not end if '\r\n' then make one.
int nLen = strlen(pszFullErrMsgA);
if (pszFullErrMsgA[nLen-1] != '\n')
{strcat(pszFullErrMsgA, "\r\n");}
else
{
if (pszFullErrMsgA[nLen-2] != '\r')
{
char * pPointer = NULL;
pPointer = pszFullErrMsgA + (nLen-1);
strcpy(pPointer, "\r\n");
}
}
// Write Regular data to stream
if (m_hFile)
{
WriteFile(m_hFile,pszFullErrMsgA,strlen(pszFullErrMsgA),&dwBytesWritten,NULL);
// since setup can get the rug pulled out from under it from anything
// make sure the file is flushed to disk
if (m_bFlushLogToDisk)
{
FlushFileBuffers(m_hFile);
}
}
}
MyLogFile_LogFileWrite_Exit:
// safe to leave the critical section
LeaveCriticalSection( &critical_section );
}
}