mirror of https://github.com/tongzx/nt5src
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
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
|
|
|