Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

271 lines
4.9 KiB

/*++
Copyright (c) 1995 Microsoft Corporation
Module Name:
svcstat.cpp
Abstract:
This module contains code for doing statistics rpcs
Author:
Johnson Apacible (JohnsonA) 12-Nov-1995
Revision History:
--*/
#define INCL_INETSRV_INCS
#include "smtpinc.h"
#include "smtpsvc.h"
#include "findiis.hxx"
extern PSMTP_STATISTICS_BLOCK_ARRAY GetServerPerfCounters(PSMTP_IIS_SERVICE pService);
VOID
ClearStatistics(
VOID
);
NET_API_STATUS
NET_API_FUNCTION
SmtprQueryStatistics(
IN SMTP_HANDLE pszServer,
IN DWORD Level,
OUT LPSTAT_INFO pBuffer
)
{
APIERR err = 0;
PSMTP_IIS_SERVICE pService = NULL;
PLIST_ENTRY pInfoList = NULL;
PLIST_ENTRY pEntry = NULL;
DWORD dwEntries = 0;
DWORD dwAlloc = 0;
PSMTP_INSTANCE_LIST_ENTRY pSmtpInfo = NULL;
PSMTP_STATISTICS_BLOCK_ARRAY pSmtpStatsBlockArray = NULL;
PSMTP_STATISTICS_BLOCK pStatsBlock = NULL;
_ASSERT( pBuffer != NULL );
UNREFERENCED_PARAMETER(pszServer);
pService = (PSMTP_IIS_SERVICE) g_pInetSvc;
//
// Check for proper access.
//
err = TsApiAccessCheck( TCP_QUERY_STATISTICS );
if( err != NO_ERROR ) {
return (NET_API_STATUS)err;
}
pService->AcquireServiceShareLock();
if(g_IsShuttingDown)
{
pService->ReleaseServiceShareLock();
return (NET_API_STATUS)ERROR_REQUEST_ABORTED;
}
//
// get the information list. Determine the # instances
//
if(pService->QueryCurrentServiceState() != SERVICE_RUNNING)
{
err = ERROR_REQUEST_ABORTED;
goto error_exit;
}
pInfoList = pService->GetInfoList();
if (IsListEmpty(pInfoList))
{
err = ERROR_INVALID_PARAMETER;
goto error_exit;
}
//
// Return the proper statistics based on the infolevel.
//
switch( Level ) {
case 0 :
dwEntries = 0;
for (pEntry = pInfoList->Flink; pEntry != pInfoList; pEntry = pEntry->Flink)
{
dwEntries++;
}
if (dwEntries == 0)
{
err = ERROR_INVALID_PARAMETER;
goto error_exit;
}
dwAlloc = sizeof(SMTP_STATISTICS_BLOCK_ARRAY) + dwEntries * sizeof(SMTP_STATISTICS_BLOCK);
pSmtpStatsBlockArray = (PSMTP_STATISTICS_BLOCK_ARRAY)MIDL_user_allocate(dwAlloc);
if (!pSmtpStatsBlockArray)
{
err = ERROR_NOT_ENOUGH_MEMORY;
goto error_exit;
}
pSmtpStatsBlockArray->cEntries = dwEntries;
pStatsBlock = pSmtpStatsBlockArray->aStatsBlock;
for (pEntry = pInfoList->Flink; pEntry != pInfoList; pEntry = pEntry->Flink)
{
pSmtpInfo = (PSMTP_INSTANCE_LIST_ENTRY)
CONTAINING_RECORD(pEntry,SMTP_INSTANCE_LIST_ENTRY,ListEntry);
pStatsBlock->dwInstance = pSmtpInfo->dwInstanceId;
pSmtpInfo->pSmtpServerStatsObj->CopyToStatsBuffer(&(pStatsBlock->Stats_0));
pStatsBlock++;
}
pBuffer->StatInfo0 = pSmtpStatsBlockArray;
break;
default :
err = ERROR_INVALID_LEVEL;
break;
}
error_exit:
pBuffer->StatInfo0 = pSmtpStatsBlockArray;
pService->ReleaseServiceShareLock();
return (NET_API_STATUS)err;
} // SmtprQueryStatistics
/*
NET_API_STATUS
NET_API_FUNCTION
SmtprQueryStatistics(
IN SMTP_HANDLE pszServer,
IN DWORD Level,
IN LPSTAT_INFO pBuffer,
IN DWORD dwInstance
)
{
APIERR err;
PSMTP_IIS_SERVICE pService;
PSMTP_SERVER_INSTANCE pInstance;
_ASSERT( pBuffer != NULL );
UNREFERENCED_PARAMETER(pszServer);
//
// Check for proper access.
//
err = TsApiAccessCheck( TCP_QUERY_STATISTICS );
if( err != NO_ERROR ) {
return (NET_API_STATUS)err;
}
//
// get a pointer to the global service
//
pService = (
pInstance = FindIISInstance((PSMTP_IIS_SERVICE) g_pInetSvc, dwInstance);
if(pInstance == NULL)
{
return((NET_API_STATUS) ERROR_INVALID_PARAMETER);
}
//
// Return the proper statistics based on the infolevel.
//
switch( Level ) {
case 0 :
LPSMTP_STATISTICS_0 pstats0;
if (!pInstance->GetStatistics(Level, (PCHAR*) &pstats0))
{
err = GetLastError();
}
else
{
pBuffer->StatInfo0 = pstats0;
}
break;
default :
err = ERROR_INVALID_LEVEL;
break;
}
pInstance->Dereference();
return (NET_API_STATUS)err;
} // SmtprQueryStatistics */
NET_API_STATUS
NET_API_FUNCTION
SmtprClearStatistics(
SMTP_HANDLE pszServer,
IN DWORD dwInstance
)
{
APIERR err;
PSMTP_SERVER_INSTANCE pInstance;
UNREFERENCED_PARAMETER(pszServer);
//
// Check for proper access.
//
err = TsApiAccessCheck( TCP_CLEAR_STATISTICS );
if( err != NO_ERROR ) {
return (NET_API_STATUS)err;
}
pInstance = FindIISInstance((PSMTP_IIS_SERVICE) g_pInetSvc, dwInstance);
if(pInstance == NULL)
{
return((NET_API_STATUS) ERROR_INVALID_PARAMETER);
}
//
// Clear the statistics.
//
pInstance->ClearStatistics();
pInstance->Dereference();
return (NET_API_STATUS)err;
} // SmtprClearStatistics
VOID
ClearStatistics(
VOID
)
{
return;
} // ClearStatistics