/*++ 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