/*++ BUILD Version: 0001 // Increment this if a change has global effects Copyright (c) 1991 Microsoft Corporation Module Name: main.c Abstract: SNMP Extension Agent for Windows NT. Created: 18-Feb-1995 Revision History: Murali R. Krishnan (MuraliK) 16-Nov-1995 Removed undoc apis --*/ #include "mib.h" #include "apiutil.h" // // Extension Agent DLLs need access to elapsed time agent has been active. // This is implemented by initializing the Extension Agent with a time zero // reference, and allowing the agent to compute elapsed time by subtracting // the time zero reference from the current system time. This example // Extension Agent implements this reference with dwTimeZero. // DWORD dwTimeZero = 0; // // Extension Agent DLLs provide the following entry point to coordinate the // initializations of the Extension Agent and the Extendible Agent. The // Extendible Agent provides the Extension Agent with a time zero reference; // and the Extension Agent provides the Extendible Agent with an Event handle // for communicating occurence of traps, and an object identifier representing // the root of the MIB subtree that the Extension Agent supports. // BOOL SnmpExtensionInit( DWORD dwTimeZeroReference, HANDLE * hPollForTrapEvent, AsnObjectIdentifier * supportedView ) { // // Record the time reference provided by the Extendible Agent. // dwTimeZero = dwTimeZeroReference; // // Indicate the MIB view supported by this Extension Agent, an object // identifier representing the sub root of the MIB that is supported. // *supportedView = MIB_OidPrefix; // NOTE! structure copy // // Indicate that Extension Agent initialization was sucessfull. // return TRUE; } // SnmpExtensionInit // // Extension Agent DLLs provide the following entry point to communcate traps // to the Extendible Agent. The Extendible Agent will query this entry point // when the trap Event (supplied at initialization time) is asserted, which // indicates that zero or more traps may have occured. The Extendible Agent // will repetedly call this entry point until FALSE is returned, indicating // that all outstanding traps have been processed. // BOOL SnmpExtensionTrap( AsnObjectIdentifier * enterprise, AsnInteger * genericTrap, AsnInteger * specificTrap, AsnTimeticks * timeStamp, RFC1157VarBindList * variableBindings ) { // // We don't support traps (yet). // return FALSE; } // SnmpExtensionTrap // // Extension Agent DLLs provide the following entry point to resolve queries // for MIB variables in their supported MIB view (supplied at initialization // time). The requestType is Get/GetNext/Set. // BOOL SnmpExtensionQuery( BYTE requestType, RFC1157VarBindList * variableBindings, AsnInteger * errorStatus, AsnInteger * errorIndex ) { LPFTP_STATISTICS_0 Statistics = NULL; NET_API_STATUS Status; UINT i; // // Try to query the statistics now so we'll have a consitent // view across all variable bindings. // Status = FtpQueryStatistics2( NULL, // pszServer 0, // Level, INET_INSTANCE_GLOBAL, 0, (LPBYTE *)&Statistics ); try { // // Iterate through the variable bindings list to resolve individual // variable bindings. // for( i = 0 ; i < variableBindings->len ; i++ ) { *errorStatus = ResolveVarBind( &variableBindings->list[i], requestType, Statistics ); // // Test and handle case where Get Next past end of MIB view // supported by this Extension Agent occurs. Special // processing is required to communicate this situation to // the Extendible Agent so it can take appropriate action, // possibly querying other Extension Agents. // if( ( *errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME ) && ( requestType == MIB_GETNEXT ) ) { *errorStatus = SNMP_ERRORSTATUS_NOERROR; // // Modify variable binding of such variables so the OID // points just outside the MIB view supported by this // Extension Agent. The Extendible Agent tests for this, // and takes appropriate action. // SNMP_oidfree( &variableBindings->list[i].name ); SNMP_oidcpy( &variableBindings->list[i].name, &MIB_OidPrefix ); variableBindings->list[i].name.ids[MIB_PREFIX_LEN-1]++; } // // If an error was indicated, communicate error status and error // index to the Extendible Agent. The Extendible Agent will // ensure that the origional variable bindings are returned in // the response packet. if( *errorStatus != SNMP_ERRORSTATUS_NOERROR ) { *errorIndex = i+1; } else { *errorIndex = 0; } } } except( EXCEPTION_EXECUTE_HANDLER ) { // // For now do nothing. // } // // Free the statistics structure if we managed to actually get one. // if( Statistics != NULL ) { MIDL_user_free( (LPVOID)Statistics ); } return SNMPAPI_NOERROR; } // SnmpExtensionQuery