/* * smint.c v0.12 Mar 12 1996 * **************************************************************************** * * * (C) Copyright 1995, 1996 DIGITAL EQUIPMENT CORPORATION * * * * This software is an unpublished work protected under the * * the copyright laws of the United States of America, all * * rights reserved. * * * * In the event this software is licensed for use by the United * * States Government, all use, duplication or disclosure by the * * United States Government is subject to restrictions as set * * forth in either subparagraph (c)(1)(ii) of the Rights in * * Technical Data And Computer Software Clause at DFARS * * 252.227-7013, or the Commercial Computer Software Restricted * * Rights Clause at FAR 52.221-19, whichever is applicable. * * * **************************************************************************** * * Facility: * * SNMP Extension Agent * * Abstract: * * This module contains the SMI envelopes around the callout to the user's * get and set routines. * * SMIGetInteger * SMIGetNSMBoolean * SMIGetBIDTEnum * SMIGetOctetString * SMIGetObjectId * SMIGetCounter * SMIGetGauge * SMIGetTimeTicks * SMIGetIpAddress * SMIGetDispString * SMISetInteger * SMISetNSMBoolean * SMISetBIDTEnum * SMISetOctetString * SMISetObjectId * SMISetCounter * SMISetGauge * SMISetTimeTicks * SMISetIpAddress * SMISetDispString * SMIBuildInteger * SMIBuildDIDTEnum * SMIBuildOctetString * SMIBuildObjectId * SMIBuildCounter * SMIBuildGauge * SMIBuildTimeTicks * SMIBuildIpAddress * SMIBuildDispString * SMIFree * * Author: * Wayne Duso, Miriam Amos Nihart, Kathy Faust * * Date: * 2/17/95 * * Revision History: * v0.1 Jul 20 95 AGS Added SMIGet/SetBoolean * v0.11 Feb 14 1996 AGS changed SMIGet/SetBoolean to SMIGet/SetNSMBoolean * v0.12 Mar 12, 1996 KKF set outvalue.length to 256 for SMISetOctetString, * SMISetDispString so that instrumentation code knows * max length of buffer. * v0.13 May 15, 1997 DDB To Microsoft: 6 changes of "malloc" to * "SNMP_malloc" */ // Necessary includes. #include #include #include #include #include #include "mib.h" #include "mib_xtrn.h" #include "smint.h" // Wayne's type def file /* * SMIGetInteger * * Encompasses the callouts to variables of the data type INTEGER. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetInteger( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Integer outvalue ; Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnType = ASN_INTEGER ; VarBind->value.asnValue.number = (AsnInteger)outvalue ; } return result ; } /* end of SMIGetInteger() */ /* * SMIGetNSMBoolean * * Encompasses the callouts to variables of the data type Boolean. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * In SNMPv1 true = 1 AND false = 2 * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetNSMBoolean( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; NSM_Boolean outvalue ; // nsm_true = 1, nsm_false = 2 Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnType = ASN_INTEGER ; VarBind->value.asnValue.number = (AsnInteger)outvalue ; } return result ; } /* end of SMIGetNSMBoolean() */ /* * SMIGetBIDTEnum * * Encompasses the callouts to variables of the data type INTEGER that * are enumerated. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetBIDTEnum( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; BIDT_ENUMERATION outvalue ; Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnType = ASN_INTEGER ; VarBind->value.asnValue.number = (AsnInteger)outvalue ; } return result ; } /* end of SMIGetBIDTEnum() */ /* * SMIGetOctetString * * Encompasses the callouts to variables of the data type OCTET STRING. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetOctetString( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; OctetString outvalue ; char stream[ MAX_OCTET_STRING ] ; Access_Credential access ; // dummy holder for future use outvalue.string = stream ; result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnValue.string.length = outvalue.length ; VarBind->value.asnValue.string.stream = // malloc( outvalue.length * sizeof( char ) ) ; // Changed 5/15/97 DDB SNMP_malloc( outvalue.length * sizeof( char ) ) ; if ( VarBind->value.asnValue.string.stream == NULL ) result = SNMP_ERRORSTATUS_GENERR ; else { memcpy( VarBind->value.asnValue.string.stream , outvalue.string , outvalue.length ) ; VarBind->value.asnType = ASN_OCTETSTRING ; VarBind->value.asnValue.string.dynamic = TRUE ; } } return result ; } /* end of SMIGetOctetString() */ /* * SMIGetObjectId * * Encompasses the callouts to variables of the data type OBJECT IDENTIFIER. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetObjectId( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; UINT status ; ObjectIdentifier outvalue ; Access_Credential access ; // dummy holder for future use memset( &outvalue, '\0', sizeof( ObjectIdentifier ) ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { status = SNMP_oidcpy( &VarBind->value.asnValue.object, &outvalue ) ; if ( !status ) result = SNMP_ERRORSTATUS_GENERR ; else { if ( outvalue.idLength != 0 ) SNMP_free( outvalue.ids ) ; VarBind->value.asnType = ASN_OBJECTIDENTIFIER ; } } return result ; } /* end of SMIGetObjectId() */ /* * SMIGetCounter * * Encompasses the callouts to variables of the data type COUNTER. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetCounter( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Counter outvalue ; Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnType = ASN_RFC1155_COUNTER ; VarBind->value.asnValue.counter = outvalue ; } return result ; } /* end of SMIGetCounter() */ /* * SMIGetGauge * * Encompasses the callouts to variables of the data type GAUGE. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetGauge( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Gauge outvalue ; Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnType = ASN_RFC1155_GAUGE ; VarBind->value.asnValue.gauge = outvalue ; } return result ; } /* end of SMIGetGauge() */ /* * SMIGetTimeTicks * * Encompasses the callouts to variables of the data type TIMETICKS. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetTimeTicks( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; TimeTicks outvalue ; Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnType = ASN_RFC1155_TIMETICKS ; VarBind->value.asnValue.ticks = outvalue ; } return result ; } /* end of SMIGetTimeTicks() */ /* * SMIGetIpAddress * * Encompasses the callouts to variables of the data type IP ADDRESS. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetIpAddress( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; IpAddress outvalue ; Access_Credential access ; // dummy holder for future use result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnValue.address.length = 4 ; // VarBind->value.asnValue.address.stream = malloc( 4 * sizeof( char ) ) ; // Changed 5/15/97 DDB VarBind->value.asnValue.address.stream = SNMP_malloc( 4 * sizeof( char ) ) ; if ( VarBind->value.asnValue.address.stream == NULL ) result = SNMP_ERRORSTATUS_GENERR ; else { memcpy( VarBind->value.asnValue.address.stream , (BYTE *)(&outvalue), 4 ) ; VarBind->value.asnType = ASN_RFC1155_IPADDRESS ; VarBind->value.asnValue.address.dynamic = TRUE ; } } return result ; } /* end of SMIGetIpAddress() */ /* * SMIGetDispString * * Encompasses the callouts to variables of the data type DISPLAY STRING. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMIGetDispString( IN OUT RFC1157VarBind *VarBind , // Variable Binding for get IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Simple_DisplayString outvalue ; char stream[ MAX_OCTET_STRING ] ; Access_Credential access ; // dummy holder for future use outvalue.string = stream ; outvalue.length = 0 ; result = ( *class_info[ cindex ].variable[ vindex ].VarGet )( &outvalue , &access , instance ) ; if ( result == SNMP_ERRORSTATUS_NOERROR ) { VarBind->value.asnValue.string.length = outvalue.length ; VarBind->value.asnValue.string.stream = // malloc( outvalue.length * sizeof( char ) ) ; // Changed 5/15/97 DDB SNMP_malloc( outvalue.length * sizeof( char ) ) ; if ( VarBind->value.asnValue.string.stream == NULL ) result = SNMP_ERRORSTATUS_GENERR ; else { memcpy( VarBind->value.asnValue.string.stream , outvalue.string , VarBind->value.asnValue.string.length ) ; VarBind->value.asnType = ASN_RFC1213_DISPSTRING ; VarBind->value.asnValue.string.dynamic = TRUE ; } } return result ; } /* end of SMIGetDispString() */ /* * SMISetInteger * * Encompasses the callouts to variables of the data type INTEGER. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetInteger( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Integer *invalue ; Integer outvalue ; Access_Credential access ; // dummy holder for future use invalue = (Integer *)( &VarBind->value.asnValue.number ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetInteger() */ /* * SMISetNSMBoolean * * Encompasses the callouts to variables of the data type Boolean * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * In SNMPv1 true = 1 AND false = 2 * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetNSMBoolean( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; NSM_Boolean *invalue ; // nsm_true = 1, nsm_false = 2 NSM_Boolean outvalue ; Access_Credential access ; // dummy holder for future use invalue = (NSM_Boolean *)( &VarBind->value.asnValue.number ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetNSMBoolean() */ /* * SMISetBIDTEmun * * Encompasses the callouts to variables of the data type INTEGER that * is enumerated. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetBIDTEnum( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; BIDT_ENUMERATION *invalue ; BIDT_ENUMERATION outvalue ; Access_Credential access ; // dummy holder for future use invalue = (BIDT_ENUMERATION *)( &VarBind->value.asnValue.number ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetBIDTEnum() */ /* * SMISetOctetString * * Encompasses the callouts to variables of the data type OCTET STRING. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetOctetString( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; OctetString invalue ; OctetString outvalue ; char out_stream[ MAX_OCTET_STRING ] ; AsnOctetString *tmp ; Access_Credential access ; // dummy holder for future use tmp = &VarBind->value.asnValue.string ; invalue.length = tmp->length ; invalue.string = tmp->stream ; outvalue.string = out_stream ; outvalue.length = 256 ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( &invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetOctetString() */ /* * SMISetObjectId * * Encompasses the callouts to variables of the data type OBJECT IDENTIFIER. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetObjectId( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; ObjectIdentifier *invalue ; ObjectIdentifier outvalue ; Access_Credential access ; // dummy holder for future use invalue = &VarBind->value.asnValue.object ; memset( &outvalue, '\0', sizeof ( ObjectIdentifier ) ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue, &outvalue, &access, instance ) ; if ( outvalue.idLength != 0 ) SNMP_free( outvalue.ids ) ; return result ; } /* end of SMISetObjectId() */ /* * SMISetCounter * * Encompasses the callouts to variables of the data type COUNTER. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetCounter( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Counter *invalue ; Counter outvalue ; Access_Credential access ; // dummy holder for future use invalue = (Counter *)( &VarBind->value.asnValue.counter ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetCounter() */ /* * SMISetGauge * * Encompasses the callouts to variables of the data type GAUGE. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetGauge( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Gauge *invalue ; Gauge outvalue ; Access_Credential access ; // dummy holder for future use invalue = (Gauge *)( &VarBind->value.asnValue.gauge ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetGauge() */ /* * SMISetTimeTicks * * Encompasses the callouts to variables of the data type TIMETICKS. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetTimeTicks( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; TimeTicks *invalue ; TimeTicks outvalue ; Access_Credential access ; // dummy holder for future use invalue = (TimeTicks *)( &VarBind->value.asnValue.ticks ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( invalue , &outvalue, &access, instance ) ; return result ; } /* end of SMISetTimeTicks() */ /* * SMISetIpAddress * * Encompasses the callouts to variables of the data type IP ADDRESS. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetIpAddress( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; IpAddress invalue ; IpAddress outvalue ; Access_Credential access ; // dummy holder for future use memcpy( &invalue, VarBind->value.asnValue.address.stream , 4 ) ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( &invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetIpAddress() */ /* * SMISetDispString * * Encompasses the callouts to variables of the data type DISPLAY STRING. * * Arguments: * * VarBind pointer to the variable value pair * cindex index to the class of the request * vindex index to the variable of the request * instance address of the instance specification in the * form of ordered native datatypes * * Return Codes: * * Standard PDU error codes. * */ UINT SMISetDispString( IN OUT RFC1157VarBind *VarBind , // Variable Binding for set IN unsigned long int cindex , IN unsigned long int vindex , IN InstanceName *instance ) { UINT result = SNMP_ERRORSTATUS_NOERROR ; Simple_DisplayString invalue ; Simple_DisplayString outvalue ; char out_stream[ MAX_OCTET_STRING ] ; AsnOctetString *tmp ; Access_Credential access ; // dummy holder for future use tmp = &VarBind->value.asnValue.string ; invalue.length = tmp->length ; invalue.string = tmp->stream ; outvalue.string = out_stream ; outvalue.length = 256 ; result = ( *class_info[ cindex ].variable[ vindex ].VarSet ) ( &invalue, &outvalue, &access, instance ) ; return result ; } /* end of SMISetDispString() */ /* * SMIBuildInteger * * Places the variable of datatype INTEGER into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildInteger( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { Integer *svalue = (Integer *)invalue ; VarBind->value.asnType = ASN_INTEGER ; VarBind->value.asnValue.number = *svalue ; return SNMP_ERRORSTATUS_NOERROR ; } /* end of SMIBuildInteger() */ /* * SMIBuildOctetString * * Places the variable of datatype OCTET STRING into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildOctetString( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { OctetString *svalue = (OctetString *)invalue ; UINT status = SNMP_ERRORSTATUS_NOERROR ; VarBind->value.asnValue.string.length = svalue->length ; VarBind->value.asnValue.string.stream = // malloc( svalue->length * sizeof( char ) ) ; // Changed 5/15/97 DDB SNMP_malloc( svalue->length * sizeof( char ) ) ; if ( VarBind->value.asnValue.string.stream == NULL ) status = SNMP_ERRORSTATUS_GENERR ; else { memcpy( VarBind->value.asnValue.string.stream , svalue->string , svalue->length ) ; VarBind->value.asnType = ASN_OCTETSTRING ; VarBind->value.asnValue.string.dynamic = TRUE ; } return status ; } /* end of SMIBuildOctetString() */ /* * SMIBuildObjectId * * Places the variable of datatype OBJECT IDENTIFIER into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildObjectId( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { ObjectIdentifier *svalue = (ObjectIdentifier *)invalue ; UINT status = SNMP_ERRORSTATUS_NOERROR ; UINT sts = TRUE ; sts = SNMP_oidcpy( &VarBind->value.asnValue.object , (AsnObjectIdentifier *)svalue ) ; if ( !sts ) status = SNMP_ERRORSTATUS_GENERR ; else VarBind->value.asnType = ASN_OBJECTIDENTIFIER ; return status ; } /* end of SMIBuildObjectId() */ /* * SMIBuildCounter * * Places the variable of datatype COUNTER into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildCounter( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { Counter *svalue = (Counter *)invalue ; VarBind->value.asnType = ASN_RFC1155_COUNTER ; VarBind->value.asnValue.counter = *svalue ; return SNMP_ERRORSTATUS_NOERROR ; } /* end of SMIBuildCounter() */ /* * SMIBuildGauge * * Places the variable of datatype GAUGE into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * svalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildGauge( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { Gauge *svalue = (Gauge *)invalue ; VarBind->value.asnType = ASN_RFC1155_GAUGE ; VarBind->value.asnValue.gauge = *svalue ; return SNMP_ERRORSTATUS_NOERROR ; } /* end of SMIBuildGauge() */ /* * SMIBuildTimeTicks * * Places the variable of datatype TIME TICKS into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildTimeTicks( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { TimeTicks *svalue = (TimeTicks *)invalue ; VarBind->value.asnType = ASN_RFC1155_TIMETICKS ; VarBind->value.asnValue.ticks = *svalue ; return SNMP_ERRORSTATUS_NOERROR ; } /* end of SMIBuildTimeTicks() */ /* * SMIBuildIpAddress * * Places the variable of datatype IpAddress into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildIpAddress( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { IpAddress *svalue = (IpAddress *)invalue; UINT status = SNMP_ERRORSTATUS_NOERROR ; VarBind->value.asnValue.address.length = 4 ; // VarBind->value.asnValue.address.stream = malloc( 4 * sizeof( char ) ) ; // Changed 5/15/97 DDB VarBind->value.asnValue.address.stream = SNMP_malloc( 4 * sizeof( char ) ) ; if ( VarBind->value.asnValue.address.stream == NULL ) status = SNMP_ERRORSTATUS_GENERR ; else { memcpy( VarBind->value.asnValue.address.stream, (BYTE *)svalue, 4 ) ; VarBind->value.asnType = ASN_RFC1155_IPADDRESS ; VarBind->value.asnValue.address.dynamic = TRUE ; } return status ; } /* end of SMIBuildIpAddress() */ /* * SMIBuildDispString * * Places the variable of datatype DISPLAY STRING into a Variable Binding. * * Arguments: * * VarBind pointer to the variable value pair * invalue address of the data * * Return Codes: * * Standard PDU error codes. * */ UINT SMIBuildDispString( IN OUT RFC1157VarBind *VarBind , IN char *invalue ) { Simple_DisplayString *svalue = (Simple_DisplayString *)invalue; UINT status = SNMP_ERRORSTATUS_NOERROR ; VarBind->value.asnValue.string.length = svalue->length ; VarBind->value.asnValue.string.stream = // malloc( VarBind->value.asnValue.string.length * sizeof( char ) ) ; // Changed 5/15/97 DDB SNMP_malloc( VarBind->value.asnValue.string.length * sizeof( char ) ) ; if ( VarBind->value.asnValue.string.stream == NULL ) status = SNMP_ERRORSTATUS_GENERR ; else { memcpy( VarBind->value.asnValue.string.stream , svalue->string , VarBind->value.asnValue.string.length ) ; VarBind->value.asnType = ASN_RFC1213_DISPSTRING ; VarBind->value.asnValue.string.dynamic = TRUE ; } return status ; } /* end of SMIBuildDispString() */ /* end of smi.c */ /* SMIFree * * Free the variable * * Arguments: * * invalue address of data * * Return Codes: * * */ void SMIFree( IN AsnAny *invalue ) { switch (invalue->asnType) { case ASN_OCTETSTRING: case ASN_RFC1155_IPADDRESS: if (invalue->asnValue.string.length != 0) { invalue->asnValue.string.length = 0 ; free(invalue->asnValue.string.stream) ; } break; case ASN_OBJECTIDENTIFIER: if (invalue->asnValue.object.idLength != 0) SNMP_free(invalue->asnValue.object.ids) ; break ; default: break ; } } /* end of SMIFree */ /* end of smi.c */