Leaked source code of windows server 2003
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.
|
|
/*++
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
|