516 lines
12 KiB
C++
516 lines
12 KiB
C++
/*++
|
||
|
||
Copyright (c) 1995-1996 Microsoft Corporation
|
||
|
||
Module Name :
|
||
Logging.cxx
|
||
|
||
Abstract:
|
||
Server Side logging object
|
||
It is just a thin layer to call COMLOG
|
||
|
||
Author:
|
||
|
||
Terence Kwan ( terryk ) 18-Sep-1996
|
||
|
||
Project:
|
||
|
||
IIS Logging 3.0
|
||
|
||
--*/
|
||
|
||
#include "server.hxx"
|
||
|
||
#define SZ_COMLOG_DLL "iscomlog.dll"
|
||
|
||
//
|
||
// Global dll entry points
|
||
//
|
||
|
||
P_ComLogInitializeLog LOGGING::m_ComLogInitializeLog = NULL;
|
||
P_ComLogTerminateLog LOGGING::m_ComLogTerminateLog = NULL;
|
||
P_ComLogLogInformation LOGGING::m_ComLogLogInformation = NULL;
|
||
P_ComLogGetConfig LOGGING::m_ComLogGetConfig = NULL;
|
||
P_ComLogSetConfig LOGGING::m_ComLogSetConfig = NULL;
|
||
P_ComLogQueryExtraLogFields LOGGING::m_ComLogQueryExtraLogFields = NULL;
|
||
P_ComLogNotifyChange LOGGING::m_ComLogNotifyChange = NULL;
|
||
P_ComLogCustomInformation LOGGING::m_ComLogCustomInformation = NULL;
|
||
|
||
//
|
||
// initialize comlog modules
|
||
//
|
||
|
||
HINSTANCE LOGGING::m_hComLogDLL = NULL;
|
||
P_ComLogDllStartup LOGGING::m_ComLogDllStartup = NULL;
|
||
P_ComLogDllCleanUp LOGGING::m_ComLogDllCleanUp = NULL;
|
||
|
||
HANDLE Dummy_ComLogInitializeLog( LPCSTR pszInstanceName, LPCSTR, LPVOID )
|
||
{
|
||
return(NULL);
|
||
}
|
||
|
||
DWORD
|
||
Dummy_ComLogTerminateLog(
|
||
IN HANDLE hHandle
|
||
)
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD
|
||
Dummy_ComLogLogInformation(
|
||
HANDLE hHandle,
|
||
const INETLOG_INFORMATION *pInetLogInfo
|
||
)
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD Dummy_ComLogGetConfig( HANDLE hHandle, INETLOG_CONFIGURATIONA *pConfig )
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD Dummy_ComLogSetConfig( HANDLE hHandle, const INETLOG_CONFIGURATIONA *pConfig )
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD
|
||
Dummy_ComLogQueryExtraLogFields(
|
||
HANDLE hHandle,
|
||
PCHAR pszFields,
|
||
PDWORD pcbBuf
|
||
)
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD Dummy_ComLogDllCleanUp()
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD Dummy_ComLogNotifyChange( HANDLE hHandle )
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
DWORD
|
||
Dummy_ComLogCustomInformation(
|
||
IN HANDLE hHandle,
|
||
IN DWORD cCount,
|
||
IN PCUSTOM_LOG_DATA pCustomLogData,
|
||
IN LPSTR szHeaderSuffix
|
||
)
|
||
{
|
||
return(ERROR_PROC_NOT_FOUND);
|
||
}
|
||
|
||
/* ------------------------------------------------------------------------------ */
|
||
|
||
LOGGING::LOGGING(
|
||
VOID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Contructor for the logging object.
|
||
|
||
Arguments:
|
||
lpszInstanceName - name of the instance. ie, w3svc
|
||
dwInstanceId - id of the instance
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
{
|
||
m_Handle = NULL;
|
||
m_fRequiredExtraLoggingFields = FALSE;
|
||
m_szExtraLoggingFields[0] = '\0';
|
||
m_fMetabaseModified = FALSE;
|
||
}
|
||
|
||
LOGGING::~LOGGING()
|
||
/*++
|
||
|
||
Routine Description:
|
||
Destructor for the logging object.
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
|
||
--*/
|
||
{
|
||
//
|
||
// end of logging object
|
||
//
|
||
|
||
ShutdownLogging();
|
||
}
|
||
|
||
BOOL
|
||
LOGGING::ActivateLogging(
|
||
IN LPCSTR pszServiceName,
|
||
IN DWORD dwInstanceId,
|
||
IN LPCSTR pszMetabasePath,
|
||
IN LPVOID pvIMDCOM
|
||
)
|
||
{
|
||
CHAR tmpBuf[MAX_PATH];
|
||
|
||
LockExclusive();
|
||
|
||
wsprintf(tmpBuf,"%s%u", pszServiceName, dwInstanceId);
|
||
|
||
m_strInstanceName.Copy(tmpBuf);
|
||
m_strMetabasePath.Copy(pszMetabasePath);
|
||
m_pvIMDCOM = pvIMDCOM;
|
||
|
||
ShutdownLogging(); // Shut down all previous handles.
|
||
|
||
if ( m_ComLogInitializeLog != NULL ) {
|
||
|
||
m_Handle = (*m_ComLogInitializeLog)(
|
||
m_strInstanceName.QueryStr(),
|
||
m_strMetabasePath.QueryStr(),
|
||
pvIMDCOM
|
||
);
|
||
}
|
||
|
||
if (m_Handle != NULL ) {
|
||
|
||
DWORD cbSize = sizeof(m_szExtraLoggingFields);
|
||
|
||
(*m_ComLogQueryExtraLogFields)(
|
||
m_Handle,
|
||
m_szExtraLoggingFields,
|
||
&cbSize
|
||
);
|
||
|
||
m_fRequiredExtraLoggingFields =
|
||
(m_szExtraLoggingFields[0] != '\0');
|
||
}
|
||
|
||
Unlock();
|
||
|
||
return TRUE;
|
||
} // LOGGING::ActivateLogging
|
||
|
||
|
||
BOOL
|
||
LOGGING::ShutdownLogging()
|
||
/*++
|
||
|
||
Routine Description:
|
||
Terminate the log configuration information.
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
err - error code.
|
||
It will return NERR_Success if no error
|
||
|
||
--*/
|
||
{
|
||
// if we have not terminated yet, terminate it
|
||
|
||
|
||
LockExclusive();
|
||
|
||
if (m_Handle != NULL)
|
||
{
|
||
(*m_ComLogTerminateLog)( m_Handle );
|
||
m_Handle = NULL;
|
||
}
|
||
|
||
Unlock();
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
BOOL
|
||
LOGGING::NotifyChange(
|
||
DWORD PropertyID
|
||
)
|
||
/*++
|
||
|
||
Routine Description:
|
||
Notify change in the log configuration information.
|
||
|
||
Arguments:
|
||
PropertyID - property ID, or zero to signal end of changes
|
||
|
||
Return Value:
|
||
err - error code.
|
||
It will return NERR_Success if no error
|
||
|
||
--*/
|
||
{
|
||
LockExclusive();
|
||
|
||
if ( ((PropertyID >= IIS_MD_LOG_BASE) && (PropertyID <= IIS_MD_LOG_LAST)) ||
|
||
((PropertyID >= IIS_MD_LOGCUSTOM_BASE) && (PropertyID <= IIS_MD_LOGCUSTOM_LAST))
|
||
)
|
||
{
|
||
m_fMetabaseModified = TRUE;
|
||
|
||
}
|
||
|
||
Unlock();
|
||
|
||
return(TRUE);
|
||
}
|
||
|
||
|
||
DWORD
|
||
LOGGING::LogInformation(
|
||
IN const INETLOG_INFORMATION * pInetLogInfo
|
||
)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
if ( m_fMetabaseModified )
|
||
{
|
||
ActOnChange();
|
||
}
|
||
|
||
LockShared();
|
||
|
||
dwErr = ((*m_ComLogLogInformation)( m_Handle, pInetLogInfo ));
|
||
|
||
Unlock();
|
||
|
||
return dwErr;
|
||
|
||
} // LOGGING::LogInformation
|
||
|
||
|
||
DWORD
|
||
LOGGING::LogCustomInformation(
|
||
IN DWORD cCount,
|
||
IN PCUSTOM_LOG_DATA pCustomLogData,
|
||
IN LPSTR szHeaderSuffix
|
||
)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
if ( m_fMetabaseModified )
|
||
{
|
||
ActOnChange();
|
||
}
|
||
|
||
LockShared();
|
||
|
||
dwErr = ((*m_ComLogCustomInformation)( m_Handle, cCount, pCustomLogData, szHeaderSuffix));
|
||
|
||
Unlock();
|
||
|
||
return dwErr;
|
||
}
|
||
|
||
|
||
|
||
DWORD
|
||
LOGGING::GetConfig(
|
||
INETLOG_CONFIGURATIONA *pLogConfig
|
||
)
|
||
{
|
||
DWORD dwErr;
|
||
|
||
if ( m_fMetabaseModified )
|
||
{
|
||
ActOnChange();
|
||
}
|
||
|
||
LockShared();
|
||
|
||
dwErr = ((*m_ComLogGetConfig)( m_Handle, pLogConfig ));
|
||
|
||
Unlock();
|
||
|
||
return dwErr;
|
||
}
|
||
|
||
BOOL LOGGING::IsRequiredExtraLoggingFields()
|
||
{
|
||
if ( m_fMetabaseModified )
|
||
{
|
||
ActOnChange();
|
||
}
|
||
|
||
return m_fRequiredExtraLoggingFields;
|
||
}
|
||
|
||
CHAR *LOGGING::QueryExtraLoggingFields()
|
||
{
|
||
if ( m_fMetabaseModified )
|
||
{
|
||
ActOnChange();
|
||
}
|
||
|
||
return m_szExtraLoggingFields;
|
||
}
|
||
|
||
VOID
|
||
LOGGING::ActOnChange()
|
||
{
|
||
LockExclusive();
|
||
|
||
if ( m_fMetabaseModified )
|
||
{
|
||
if (m_ComLogNotifyChange != NULL) {
|
||
|
||
DWORD cbSize = sizeof(m_szExtraLoggingFields);
|
||
|
||
(*m_ComLogNotifyChange)( m_Handle );
|
||
|
||
//
|
||
// See if we need extra log fields
|
||
//
|
||
|
||
(*m_ComLogQueryExtraLogFields)(
|
||
m_Handle,
|
||
m_szExtraLoggingFields,
|
||
&cbSize
|
||
);
|
||
|
||
m_fRequiredExtraLoggingFields =
|
||
(m_szExtraLoggingFields[0] != '\0');
|
||
}
|
||
|
||
m_fMetabaseModified = FALSE;
|
||
}
|
||
|
||
Unlock();
|
||
}
|
||
|
||
DWORD
|
||
LOGGING::SetConfig(
|
||
INETLOG_CONFIGURATIONA *pRpcLogConfig
|
||
)
|
||
{
|
||
DWORD cbSize = sizeof(m_szExtraLoggingFields);
|
||
|
||
LockExclusive();
|
||
|
||
DWORD dwReturn = (*m_ComLogSetConfig)( m_Handle, pRpcLogConfig );
|
||
|
||
(*m_ComLogQueryExtraLogFields)(
|
||
m_Handle,
|
||
m_szExtraLoggingFields,
|
||
&cbSize
|
||
);
|
||
|
||
m_fRequiredExtraLoggingFields =
|
||
(m_szExtraLoggingFields[0] != '\0');
|
||
|
||
Unlock();
|
||
|
||
return(dwReturn);
|
||
}
|
||
|
||
|
||
//
|
||
// Statics
|
||
//
|
||
|
||
DWORD
|
||
LOGGING::Terminate()
|
||
/*++
|
||
|
||
Routine Description:
|
||
Terminate the logging object and kill the waiting queue.
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
always return NO_ERROR
|
||
|
||
--*/
|
||
{
|
||
if ( m_hComLogDLL != NULL ) {
|
||
|
||
DBGPRINTF((DBG_CONTEXT,"Terminate: Freed iscomlog.dll\n"));
|
||
|
||
//
|
||
// call ComLog to terminate itself
|
||
//
|
||
|
||
(*m_ComLogDllCleanUp)();
|
||
FreeLibrary( m_hComLogDLL );
|
||
m_hComLogDLL = NULL;
|
||
}
|
||
|
||
return(NO_ERROR);
|
||
}
|
||
|
||
|
||
DWORD
|
||
LOGGING::Initialize()
|
||
/*++
|
||
|
||
Routine Description:
|
||
Initialize the logging object by loading the ComLog dll and
|
||
set up all the dll entry point
|
||
|
||
Arguments:
|
||
|
||
Return Value:
|
||
return NO_ERROR if no error
|
||
otherwise return ERROR_DLL_NOT_FOUND or ERROR_PROC_NOT_FOUND
|
||
|
||
--*/
|
||
{
|
||
DWORD err = NO_ERROR;
|
||
|
||
DBG_ASSERT(m_hComLogDLL == NULL);
|
||
|
||
m_hComLogDLL = LoadLibrary( SZ_COMLOG_DLL );
|
||
|
||
if (m_hComLogDLL!=NULL)
|
||
{
|
||
if ((( m_ComLogInitializeLog = (P_ComLogInitializeLog)GetProcAddress( m_hComLogDLL, (const char *)"ComLogInitializeLog")) == NULL ) ||
|
||
(( m_ComLogTerminateLog = (P_ComLogTerminateLog)GetProcAddress( m_hComLogDLL, (const char *)"ComLogTerminateLog")) == NULL ) ||
|
||
(( m_ComLogLogInformation = (P_ComLogLogInformation)GetProcAddress( m_hComLogDLL, (const char *)"ComLogLogInformation"))== NULL ) ||
|
||
(( m_ComLogGetConfig = (P_ComLogGetConfig)GetProcAddress( m_hComLogDLL, (const char *)"ComLogGetConfig"))== NULL ) ||
|
||
(( m_ComLogSetConfig = (P_ComLogSetConfig)GetProcAddress( m_hComLogDLL, (const char *)"ComLogSetConfig"))== NULL ) ||
|
||
(( m_ComLogQueryExtraLogFields = (P_ComLogQueryExtraLogFields)GetProcAddress( m_hComLogDLL, (const char *)"ComLogQueryExtraLogFields"))== NULL ) ||
|
||
(( m_ComLogDllStartup = (P_ComLogDllStartup)GetProcAddress(m_hComLogDLL, (const char *)"ComLogDllStartup"))== NULL ) ||
|
||
(( m_ComLogNotifyChange = (P_ComLogNotifyChange)GetProcAddress(m_hComLogDLL, (const char *)"ComLogNotifyChange"))== NULL ) ||
|
||
(( m_ComLogDllCleanUp = (P_ComLogDllCleanUp)GetProcAddress(m_hComLogDLL, (const char *)"ComLogDllCleanUp"))== NULL ) ||
|
||
(( m_ComLogCustomInformation = (P_ComLogCustomInformation)GetProcAddress(m_hComLogDLL, (const char *)"ComLogCustomInformation"))== NULL )
|
||
)
|
||
{
|
||
DBGPRINTF((DBG_CONTEXT,"missing entry point in ComLog dll\n"));
|
||
|
||
m_ComLogInitializeLog = &(Dummy_ComLogInitializeLog );
|
||
m_ComLogTerminateLog = &(Dummy_ComLogTerminateLog );
|
||
m_ComLogLogInformation = &(Dummy_ComLogLogInformation );
|
||
m_ComLogGetConfig = &(Dummy_ComLogGetConfig );
|
||
m_ComLogSetConfig = &(Dummy_ComLogSetConfig );
|
||
m_ComLogDllCleanUp = &(Dummy_ComLogDllCleanUp );
|
||
m_ComLogNotifyChange = &(Dummy_ComLogNotifyChange );
|
||
m_ComLogQueryExtraLogFields = &(Dummy_ComLogQueryExtraLogFields );
|
||
m_ComLogCustomInformation = &(Dummy_ComLogCustomInformation );
|
||
|
||
err = ERROR_PROC_NOT_FOUND;
|
||
} else {
|
||
|
||
//
|
||
// Initialize ComLog
|
||
//
|
||
|
||
err = (*m_ComLogDllStartup)();
|
||
}
|
||
|
||
} else {
|
||
DBGPRINTF((DBG_CONTEXT,"Failed to load iscomlog.dll\n"));
|
||
err = ERROR_DLL_NOT_FOUND;
|
||
}
|
||
|
||
return(err);
|
||
}
|