/*++ Copyright (c) 1992-1997 Microsoft Corporation Module Name: octets.c Abstract: Contains routines to manipulate octet strings. SnmpUtilOctetsCpy SnmpUtilOctetsFree Environment: User Mode - Win32 Revision History: --*/ /////////////////////////////////////////////////////////////////////////////// // // // Include files // // // /////////////////////////////////////////////////////////////////////////////// #include #include /////////////////////////////////////////////////////////////////////////////// // // // Public Procedures // // // /////////////////////////////////////////////////////////////////////////////// SNMPAPI SNMP_FUNC_TYPE SnmpUtilOctetsCpy( AsnOctetString * pOctetsDst, AsnOctetString * pOctetsSrc ) /*++ Routine Description: Copy an octet string. Arguments: pOctetsDst - pointer to structure to receive octets. pOctetsSrc - pointer to octets to copy. Return Values: Returns SNMPAPI_NOERROR if successful. --*/ { SNMPAPI nResult = SNMPAPI_ERROR; // validate pointers if (pOctetsDst != NULL) { // initialize pOctetsDst->stream = NULL; pOctetsDst->length = 0; pOctetsDst->dynamic = FALSE; // make sure there are bytes if ((pOctetsSrc != NULL) && (pOctetsSrc->stream != NULL) && (pOctetsSrc->length != 0)) { // attempt to allocate octet string pOctetsDst->stream = SnmpUtilMemAlloc(pOctetsSrc->length); // validate pointer if (pOctetsDst->stream != NULL) { // denote allocated type pOctetsDst->dynamic = TRUE; // transfer octet string length pOctetsDst->length = pOctetsSrc->length; // copy memcpy(pOctetsDst->stream, pOctetsSrc->stream, pOctetsSrc->length ); nResult = SNMPAPI_NOERROR; // success... } else { SNMPDBG(( SNMP_LOG_ERROR, "SNMP: API: could not allocate octet string.\n" )); SetLastError(SNMP_MEM_ALLOC_ERROR); } } else { // copying null string nResult = SNMPAPI_NOERROR; } } else { SNMPDBG(( SNMP_LOG_ERROR, "SNMP: API: null octet string pointer.\n" )); SetLastError(ERROR_INVALID_PARAMETER); } return nResult; } VOID SNMP_FUNC_TYPE SnmpUtilOctetsFree( AsnOctetString * pOctets ) /*++ Routine Description: Releases memory for an octet string. Arguments: pOctets - pointer to octets to release. Return Values: None. --*/ { // validate pointers if ((pOctets != NULL) && (pOctets->stream != NULL) && (pOctets->dynamic == TRUE)) { // release memory for octets SnmpUtilMemFree(pOctets->stream); // re-initialize pOctets->dynamic = FALSE; pOctets->stream = NULL; pOctets->length = 0; } } SNMPAPI SNMP_FUNC_TYPE SnmpUtilOctetsNCmp( AsnOctetString * pOctets1, AsnOctetString * pOctets2, UINT nChars ) /*++ Routine Description: Compares two octet strings up to a certain number of characters. Arguments: pOctets1 - pointer to first octet string. pOctets2 - pointer to second octet string. nChars - maximum characters to compare. Return Values: < 0 first parameter is 'less than' second. 0 first parameter is 'equal to' second. > 0 first parameter is 'greater than' second. --*/ { UINT i = 0; INT nResult = 0; // validate pointers if ((pOctets1 != NULL) && (pOctets2 != NULL)) { // calculate maximum number of subidentifiers to compare UINT nMaxChars = min(nChars, min(pOctets1->length, pOctets2->length)); // loop through the subidentifiers while((nResult == 0) && (i < nMaxChars)) { // compare each subidentifier nResult = pOctets1->stream[i] - pOctets2->stream[i++]; } // check for second being subset if ((nResult == 0) && (i < nChars)) { // determine order by length of oid nResult = pOctets1->length - pOctets2->length; } } return nResult; } SNMPAPI SNMP_FUNC_TYPE SnmpUtilOctetsCmp( AsnOctetString * pOctets1, AsnOctetString * pOctets2 ) /*++ Routine Description: Compares two octet strings. Arguments: pOctets1 - pointer to first octet string. pOctets2 - pointer to second octet string. Return Values: < 0 first parameter is 'less than' second. 0 first parameter is 'equal to' second. > 0 first parameter is 'greater than' second. --*/ { // forward request above return SnmpUtilOctetsNCmp( pOctets1, pOctets2, max(pOctets1->length,pOctets2->length) ); }