Annotation of mstools/samples/snmp/testdll/testmib.c, revision 1.1

1.1     ! root        1: /*++ BUILD Version: 0001    // Increment this if a change has global effects
        !             2: 
        !             3: Copyright (c) 1991  Microsoft Corporation
        !             4: 
        !             5: Module Name:
        !             6: 
        !             7:     testmib.c
        !             8: 
        !             9: Abstract:
        !            10: 
        !            11:     Sample SNMP Extension Agent for Windows NT.
        !            12: 
        !            13:     These files (testdll.c, testmib.c, and testmib.h) provide an example of 
        !            14:     how to structure an Extension Agent DLL which works in conjunction with 
        !            15:     the SNMP Extendible Agent for Windows NT.
        !            16: 
        !            17:     Extensive comments have been included to describe its structure and
        !            18:     operation.  See also "Microsoft Windows/NT SNMP Programmer's Reference".
        !            19: 
        !            20: Created:
        !            21: 
        !            22:     13-Jun-1991
        !            23: 
        !            24: Revision History:
        !            25: 
        !            26: --*/
        !            27: 
        !            28: 
        !            29: static char *vcsid = "@(#) $Logfile:   N:/xtest/vcs/testmib.c_v  $ $Revision:   1.2  $";
        !            30: 
        !            31: 
        !            32: // This Extension Agent implements the Internet toaster MIB.  It's 
        !            33: // definition follows here:
        !            34: //
        !            35: //
        !            36: //         TOASTER-MIB DEFINITIONS ::= BEGIN
        !            37: //
        !            38: //         IMPORTS
        !            39: //                 enterprises
        !            40: //                         FROM RFC1155-SMI
        !            41: //                 OBJECT-TYPE
        !            42: //                         FROM RFC-1212
        !            43: //                 DisplayString
        !            44: //                         FROM RFC-1213;
        !            45: //
        !            46: //         epilogue        OBJECT IDENTIFIER ::= { enterprises 12 }
        !            47: //         toaster         OBJECT IDENTIFIER ::= { epilogue 2 }
        !            48: //
        !            49: //         -- toaster MIB
        !            50: //
        !            51: //         toasterManufacturer OBJECT-TYPE
        !            52: //             SYNTAX  DisplayString
        !            53: //             ACCESS  read-only
        !            54: //             STATUS  mandatory
        !            55: //             DESCRIPTION
        !            56: //                     "The name of the toaster's manufacturer. For instance,
        !            57: //                      Sunbeam."
        !            58: //             ::= { toaster 1 }
        !            59: //
        !            60: //         toasterModelNumber OBJECT-TYPE
        !            61: //             SYNTAX  DisplayString
        !            62: //             ACCESS  read-only
        !            63: //             STATUS  mandatory
        !            64: //             DESCRIPTION
        !            65: //                     "The name of the toaster's model. For instance,
        !            66: //                      Radiant Automatic."
        !            67: //             ::= { toaster 2 }
        !            68: //
        !            69: //         toasterControl OBJECT-TYPE
        !            70: //             SYNTAX  INTEGER  {
        !            71: //                         up(1),
        !            72: //                         down(2)
        !            73: //                     }
        !            74: //             ACCESS  read-write
        !            75: //             STATUS  mandatory
        !            76: //             DESCRIPTION
        !            77: //                     "This variable controls the current state of the 
        !            78: //                      toaster. To begin toasting, set it to down(2). To 
        !            79: //                      abort toasting (perhaps in the event of an 
        !            80: //                      emergency), set it to up(2)."
        !            81: //             ::= { toaster 3 }
        !            82: //
        !            83: //         toasterDoneness OBJECT-TYPE
        !            84: //             SYNTAX  INTEGER (1..10)
        !            85: //             ACCESS  read-write
        !            86: //             STATUS  mandatory
        !            87: //             DESCRIPTION
        !            88: //                     "This variable controls how well done ensuing toast 
        !            89: //                      should be on a scale of 1 to 10. Toast made at 10 
        !            90: //                      is generally considered unfit for human consumption; 
        !            91: //                      toast made at 1 is lightly warmed."
        !            92: //             ::= { toaster 4 }
        !            93: //
        !            94: //         toasterToastType OBJECT-TYPE
        !            95: //             SYNTAX  INTEGER  {
        !            96: //                         white-bread(1),
        !            97: //                         wheat-bread(2),
        !            98: //                         wonder-bread(3),
        !            99: //                         frozen-waffle(4),
        !           100: //                         frozen-bagel(5),
        !           101: //                         hash-brown(6),
        !           102: //                         other(7)
        !           103: //                     }
        !           104: //             ACCESS  read-write
        !           105: //             STATUS  mandatory
        !           106: //             DESCRIPTION
        !           107: //                     "This variable informs the toaster of the type of 
        !           108: //                      material being toasted. The toaster uses this 
        !           109: //                      information combined with toasterToastDoneness to 
        !           110: //                      compute how long the material must be toasted for 
        !           111: //                      to achieve the desired doneness."
        !           112: //             ::= { toaster 5 }
        !           113: //
        !           114: //         END
        !           115: 
        !           116: 
        !           117: // Necessary includes.
        !           118: 
        !           119: #include <windows.h>
        !           120: #include <malloc.h>
        !           121: 
        !           122: #include <snmp.h>
        !           123: 
        !           124: 
        !           125: // Contains definitions for the table structure describing the MIB.  This
        !           126: // is used in conjunction with testmib.c where the MIB requests are resolved.
        !           127: 
        !           128: #include "testmib.h"
        !           129: 
        !           130: 
        !           131: // If an addition or deletion to the MIB is necessary, there are several
        !           132: // places in the code that must be checked and possibly changed.
        !           133: //
        !           134: // The last field in each MIB entry is used to point to the NEXT
        !           135: // leaf variable.  If an addition or deletetion is made, these pointers
        !           136: // may need to be updated to reflect the modification.
        !           137: 
        !           138: 
        !           139: // The prefix to all of these MIB variables is 1.3.6.1.4.1.12
        !           140: 
        !           141: UINT OID_Prefix[] = { 1, 3, 6, 1, 4, 1, 12 };
        !           142: AsnObjectIdentifier MIB_OidPrefix = { OID_SIZEOF(OID_Prefix), OID_Prefix };
        !           143: 
        !           144: 
        !           145: 
        !           146: //                         //
        !           147: // OID definitions for MIB //
        !           148: //                         //
        !           149: 
        !           150: 
        !           151: // Definition of the toaster group
        !           152: 
        !           153: UINT MIB_toaster[]  = { 2 };
        !           154: 
        !           155: 
        !           156: // Definition of leaf variables under the toaster group
        !           157: // All leaf variables have a zero appended to their OID to indicate
        !           158: // that it is the only instance of this variable and it exists.
        !           159: 
        !           160: UINT MIB_toasterManufacturer[]     = { 2, 1, 0 };
        !           161: UINT MIB_toasterModelNumber[]      = { 2, 2, 0 };
        !           162: UINT MIB_toasterControl[]          = { 2, 3, 0 };
        !           163: UINT MIB_toasterDoneness[]         = { 2, 4, 0 };
        !           164: UINT MIB_toasterToastType[]        = { 2, 5, 0 };
        !           165: 
        !           166: 
        !           167: 
        !           168: //                             //
        !           169: // Storage definitions for MIB //
        !           170: //                             //
        !           171: 
        !           172: char       MIB_toasterManStor[]     = "Microsoft Corporation";
        !           173: char       MIB_toasterModelStor[]   = 
        !           174:                "Example SNMP Extension Agent for Windows/NT (TOASTER-MIB).";
        !           175: AsnInteger MIB_toasterControlStor   = 1;
        !           176: AsnInteger MIB_toasterDonenessStor  = 2;
        !           177: AsnInteger MIB_toasterToastTypeStor = 3;
        !           178: 
        !           179: 
        !           180: 
        !           181: // MIB definiton
        !           182: 
        !           183: MIB_ENTRY Mib[] = {
        !           184:       { { OID_SIZEOF(MIB_toasterManufacturer), MIB_toasterManufacturer },
        !           185:         &MIB_toasterManStor, ASN_RFC1213_DISPSTRING,
        !           186:         MIB_ACCESS_READ, MIB_leaf_func, &Mib[1] },
        !           187: 
        !           188:       { { OID_SIZEOF(MIB_toasterModelNumber), MIB_toasterModelNumber },
        !           189:         &MIB_toasterModelStor, ASN_RFC1213_DISPSTRING,
        !           190:         MIB_ACCESS_READ, MIB_leaf_func, &Mib[2] },
        !           191: 
        !           192:       { { OID_SIZEOF(MIB_toasterControl), MIB_toasterControl },
        !           193:         &MIB_toasterControlStor, ASN_INTEGER,
        !           194:         MIB_ACCESS_READWRITE, MIB_control_func, &Mib[3] },
        !           195: 
        !           196:       { { OID_SIZEOF(MIB_toasterDoneness), MIB_toasterDoneness },
        !           197:         &MIB_toasterDonenessStor, ASN_INTEGER,
        !           198:         MIB_ACCESS_READWRITE, MIB_doneness_func, &Mib[4] },
        !           199: 
        !           200:       { { OID_SIZEOF(MIB_toasterToastType), MIB_toasterToastType },
        !           201:         &MIB_toasterToastTypeStor, ASN_INTEGER,
        !           202:         MIB_ACCESS_READWRITE, MIB_toasttype_func, NULL }
        !           203:       };
        !           204: 
        !           205: UINT MIB_num_variables = sizeof Mib / sizeof( MIB_ENTRY );
        !           206: 
        !           207: 
        !           208: 
        !           209: //
        !           210: // ResolveVarBind
        !           211: //    Resolves a single variable binding.  Modifies the variable on a GET
        !           212: //    or a GET-NEXT.
        !           213: //
        !           214: // Notes:
        !           215: //
        !           216: // Return Codes:
        !           217: //    Standard PDU error codes.
        !           218: //
        !           219: // Error Codes:
        !           220: //    None.
        !           221: //
        !           222: UINT ResolveVarBind(
        !           223:         IN OUT RFC1157VarBind *VarBind, // Variable Binding to resolve
        !           224:        IN UINT PduAction               // Action specified in PDU
        !           225:        )
        !           226: 
        !           227: {
        !           228: MIB_ENTRY            *MibPtr;
        !           229: AsnObjectIdentifier  TempOid;
        !           230: int                  CompResult;
        !           231: UINT                 I;
        !           232: UINT                 nResult;
        !           233: 
        !           234: 
        !           235:    // Search for var bind name in the MIB
        !           236:    I      = 0;
        !           237:    MibPtr = NULL;
        !           238:    while ( MibPtr == NULL && I < MIB_num_variables )
        !           239:       {
        !           240:       // Construct OID with complete prefix for comparison purposes
        !           241:       SNMP_oidcpy( &TempOid, &MIB_OidPrefix );
        !           242:       SNMP_oidappend( &TempOid, &Mib[I].Oid );
        !           243: 
        !           244:       // Check for OID in MIB - On a GET-NEXT the OID does not have to exactly
        !           245:       // match a variable in the MIB, it must only fall under the MIB root.
        !           246:       CompResult = SNMP_oidcmp( &VarBind->name, &TempOid );
        !           247:       if ( 0 > CompResult )
        !           248:         {
        !           249:         // Since there is not an exact match, the only valid action is GET-NEXT
        !           250:         if ( MIB_ACTION_GETNEXT != PduAction )
        !           251:            {
        !           252:            nResult = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           253:            goto Exit;
        !           254:            }
        !           255: 
        !           256:         // Since the match was not exact, but var bind name is within MIB,
        !           257:         // we are at the NEXT MIB variable down from the one specified.
        !           258:         PduAction = MIB_ACTION_GET;
        !           259:         MibPtr = &Mib[I];
        !           260: 
        !           261:          // Replace var bind name with new name
        !           262:          SNMP_oidfree( &VarBind->name );
        !           263:          SNMP_oidcpy( &VarBind->name, &MIB_OidPrefix );
        !           264:          SNMP_oidappend( &VarBind->name, &MibPtr->Oid );
        !           265:         }
        !           266:       else
        !           267:          {
        !           268:         // An exact match was found.
        !           269:          if ( 0 == CompResult )
        !           270:             {
        !           271:            MibPtr = &Mib[I];
        !           272:            }
        !           273:         }
        !           274: 
        !           275:       // Free OID memory before checking another variable
        !           276:       SNMP_oidfree( &TempOid );
        !           277: 
        !           278:       I++;
        !           279:       } // while
        !           280: 
        !           281:    // If OID not within scope of MIB, then no such name
        !           282:    if ( MibPtr == NULL )
        !           283:       {
        !           284:       nResult = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           285:       goto Exit;
        !           286:       }
        !           287: 
        !           288:    // Call function to process request.  Each MIB entry has a function pointer
        !           289:    // that knows how to process its MIB variable.
        !           290:    nResult = (*MibPtr->MibFunc)( PduAction, MibPtr, VarBind );
        !           291: 
        !           292:    // Free temp memory
        !           293:    SNMP_oidfree( &TempOid );
        !           294: 
        !           295: Exit:
        !           296:    return nResult;
        !           297: } // ResolveVarBind
        !           298: 
        !           299: 
        !           300: 
        !           301: //
        !           302: // MIB_leaf_func
        !           303: //    Performs generic actions on LEAF variables in the MIB.
        !           304: //
        !           305: // Notes:
        !           306: //
        !           307: // Return Codes:
        !           308: //    Standard PDU error codes.
        !           309: //
        !           310: // Error Codes:
        !           311: //    None.
        !           312: //
        !           313: UINT MIB_leaf_func(
        !           314:         IN UINT Action,
        !           315:        IN MIB_ENTRY *MibPtr,
        !           316:        IN RFC1157VarBind *VarBind
        !           317:        )
        !           318: 
        !           319: {
        !           320: UINT   ErrStat;
        !           321: 
        !           322:    switch ( Action )
        !           323:       {
        !           324:       case MIB_ACTION_GETNEXT:
        !           325:         // If there is no GET-NEXT pointer, this is the end of this MIB
        !           326:         if ( MibPtr->MibNext == NULL )
        !           327:            {
        !           328:            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           329:            goto Exit;
        !           330:            }
        !           331: 
        !           332:          // Setup var bind name of NEXT MIB variable
        !           333:          SNMP_oidfree( &VarBind->name );
        !           334:          SNMP_oidcpy( &VarBind->name, &MIB_OidPrefix );
        !           335:          SNMP_oidappend( &VarBind->name, &MibPtr->MibNext->Oid );
        !           336: 
        !           337:          // Call function to process request.  Each MIB entry has a function
        !           338:         // pointer that knows how to process its MIB variable.
        !           339:          ErrStat = (*MibPtr->MibNext->MibFunc)( MIB_ACTION_GET,
        !           340:                                                MibPtr->MibNext, VarBind );
        !           341:          break;
        !           342: 
        !           343:       case MIB_ACTION_GET:
        !           344:          // Make sure that this variable's ACCESS is GET'able
        !           345:         if ( MibPtr->Access != MIB_ACCESS_READ &&
        !           346:              MibPtr->Access != MIB_ACCESS_READWRITE )
        !           347:            {
        !           348:            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           349:            goto Exit;
        !           350:            }
        !           351: 
        !           352:         // Setup varbind's return value
        !           353:         VarBind->value.asnType = MibPtr->Type;
        !           354:         switch ( VarBind->value.asnType )
        !           355:            {
        !           356:             case ASN_RFC1155_COUNTER:
        !           357:             case ASN_RFC1155_GAUGE:
        !           358:             case ASN_INTEGER:
        !           359:                VarBind->value.asnValue.number = *(AsnInteger *)(MibPtr->Storage);
        !           360:               break;
        !           361: 
        !           362:             case ASN_OCTETSTRING: // This entails ASN_RFC1213_DISPSTRING also
        !           363:               VarBind->value.asnValue.string.length =
        !           364:                                  strlen( (LPSTR)MibPtr->Storage );
        !           365: 
        !           366:               if ( NULL == 
        !           367:                     (VarBind->value.asnValue.string.stream =
        !           368:                     malloc(VarBind->value.asnValue.string.length *
        !           369:                            sizeof(char))) )
        !           370:                  {
        !           371:                  ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           372:                  goto Exit;
        !           373:                  }
        !           374: 
        !           375:               memcpy( VarBind->value.asnValue.string.stream,
        !           376:                       (LPSTR)MibPtr->Storage,
        !           377:                       VarBind->value.asnValue.string.length );
        !           378:               VarBind->value.asnValue.string.dynamic = TRUE;
        !           379: 
        !           380:               break;
        !           381: 
        !           382:            default:
        !           383:               ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           384:               goto Exit;
        !           385:            }
        !           386: 
        !           387:         break;
        !           388: 
        !           389:       case MIB_ACTION_SET:
        !           390:          // Make sure that this variable's ACCESS is SET'able
        !           391:         if ( MibPtr->Access != MIB_ACCESS_READWRITE &&
        !           392:              MibPtr->Access != MIB_ACCESS_WRITE )
        !           393:            {
        !           394:            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           395:             goto Exit;
        !           396:            }
        !           397: 
        !           398:          // Check for proper type before setting
        !           399:          if ( MibPtr->Type != VarBind->value.asnType )
        !           400:            {
        !           401:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           402:            goto Exit;
        !           403:            }
        !           404: 
        !           405:         // Save value in MIB
        !           406:         switch ( VarBind->value.asnType )
        !           407:            {
        !           408:             case ASN_RFC1155_COUNTER:
        !           409:             case ASN_RFC1155_GAUGE:
        !           410:             case ASN_INTEGER:
        !           411:                *(AsnInteger *)(MibPtr->Storage) = VarBind->value.asnValue.number;
        !           412:               break;
        !           413: 
        !           414:             case ASN_OCTETSTRING: // This entails ASN_RFC1213_DISPSTRING also
        !           415:                // The storage must be adequate to contain the new string
        !           416:                // including a NULL terminator.
        !           417:                memcpy( (LPSTR)MibPtr->Storage,
        !           418:                        VarBind->value.asnValue.string.stream,
        !           419:                        VarBind->value.asnValue.string.length );
        !           420: 
        !           421:               ((LPSTR)MibPtr->Storage)[VarBind->value.asnValue.string.length] =
        !           422:                                                                           '\0';
        !           423:               break;
        !           424: 
        !           425:            default:
        !           426:               ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           427:               goto Exit;
        !           428:            }
        !           429: 
        !           430:          break;
        !           431: 
        !           432:       default:
        !           433:         ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           434:         goto Exit;
        !           435:       } // switch
        !           436: 
        !           437:    // Signal no error occurred
        !           438:    ErrStat = SNMP_ERRORSTATUS_NOERROR;
        !           439: 
        !           440: Exit:
        !           441:    return ErrStat;
        !           442: } // MIB_leaf_func
        !           443: 
        !           444: 
        !           445: 
        !           446: //
        !           447: // MIB_control_func
        !           448: //    Performs specific actions on the toasterControl MIB variable
        !           449: //
        !           450: // Notes:
        !           451: //
        !           452: // Return Codes:
        !           453: //    Standard PDU error codes.
        !           454: //
        !           455: // Error Codes:
        !           456: //    None.
        !           457: //
        !           458: UINT MIB_control_func(
        !           459:         IN UINT Action,
        !           460:        IN MIB_ENTRY *MibPtr,
        !           461:        IN RFC1157VarBind *VarBind
        !           462:        )
        !           463: 
        !           464: {
        !           465: UINT   ErrStat;
        !           466: 
        !           467:    switch ( Action )
        !           468:       {
        !           469:       case MIB_ACTION_SET:
        !           470:          // Make sure that this variable's ACCESS is SET'able
        !           471:         if ( MibPtr->Access != MIB_ACCESS_READWRITE &&
        !           472:              MibPtr->Access != MIB_ACCESS_WRITE )
        !           473:            {
        !           474:            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           475:             goto Exit;
        !           476:            }
        !           477: 
        !           478:          // Check for proper type before setting
        !           479:          if ( MibPtr->Type != VarBind->value.asnType )
        !           480:            {
        !           481:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           482:            goto Exit;
        !           483:            }
        !           484: 
        !           485:          // Make sure the value is valid
        !           486:          if ( MIB_TOASTER_UP > VarBind->value.asnValue.number ||
        !           487:               MIB_TOASTER_DOWN < VarBind->value.asnValue.number )
        !           488:             {
        !           489:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           490:            goto Exit;
        !           491:             }
        !           492: 
        !           493:          // Let fall through purposefully for further processing by
        !           494:          // generic leaf function.
        !           495: 
        !           496:       case MIB_ACTION_GETNEXT:
        !           497:       case MIB_ACTION_GET:
        !           498:         // Call the more generic function to perform the action
        !           499:          ErrStat = MIB_leaf_func( Action, MibPtr, VarBind );
        !           500:          break;
        !           501: 
        !           502:       default:
        !           503:         ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           504:         goto Exit;
        !           505:       } // switch
        !           506: 
        !           507: Exit:
        !           508:    return ErrStat;
        !           509: } // MIB_control_func
        !           510: 
        !           511: 
        !           512: 
        !           513: //
        !           514: // MIB_doneness_func
        !           515: //    Performs specific actions on the toasterDoneness MIB variable
        !           516: //
        !           517: // Notes:
        !           518: //
        !           519: // Return Codes:
        !           520: //    Standard PDU error codes.
        !           521: //
        !           522: // Error Codes:
        !           523: //    None.
        !           524: //
        !           525: UINT MIB_doneness_func(
        !           526:         IN UINT Action,
        !           527:        IN MIB_ENTRY *MibPtr,
        !           528:        IN RFC1157VarBind *VarBind
        !           529:        )
        !           530: 
        !           531: {
        !           532: UINT   ErrStat;
        !           533: 
        !           534:    switch ( Action )
        !           535:       {
        !           536:       case MIB_ACTION_SET:
        !           537:          // Make sure that this variable's ACCESS is SET'able
        !           538:         if ( MibPtr->Access != MIB_ACCESS_READWRITE &&
        !           539:              MibPtr->Access != MIB_ACCESS_WRITE )
        !           540:            {
        !           541:            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           542:             goto Exit;
        !           543:            }
        !           544: 
        !           545:          // Check for proper type before setting
        !           546:          if ( MibPtr->Type != VarBind->value.asnType )
        !           547:            {
        !           548:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           549:            goto Exit;
        !           550:            }
        !           551: 
        !           552:          // Make sure the value is valid
        !           553:          if ( MIB_TOASTER_LIGHTLYWARM > VarBind->value.asnValue.number ||
        !           554:               MIB_TOASTER_BURNT < VarBind->value.asnValue.number )
        !           555:             {
        !           556:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           557:            goto Exit;
        !           558:             }
        !           559: 
        !           560:          // Let fall through purposefully for further processing by
        !           561:          // generic leaf function.
        !           562: 
        !           563:       case MIB_ACTION_GETNEXT:
        !           564:       case MIB_ACTION_GET:
        !           565:         // Call the more generic function to perform the action
        !           566:          ErrStat = MIB_leaf_func( Action, MibPtr, VarBind );
        !           567:          break;
        !           568: 
        !           569:       default:
        !           570:         ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           571:         goto Exit;
        !           572:       } // switch
        !           573: 
        !           574: Exit:
        !           575:    return ErrStat;
        !           576: } // MIB_doneness_func
        !           577: 
        !           578: 
        !           579: 
        !           580: //
        !           581: // MIB_toasttype_func
        !           582: //    Performs specific actions on the toasterToastType MIB variable
        !           583: //
        !           584: // Notes:
        !           585: //
        !           586: // Return Codes:
        !           587: //    Standard PDU error codes.
        !           588: //
        !           589: // Error Codes:
        !           590: //    None.
        !           591: //
        !           592: UINT MIB_toasttype_func(
        !           593:         IN UINT Action,
        !           594:        IN MIB_ENTRY *MibPtr,
        !           595:        IN RFC1157VarBind *VarBind
        !           596:        )
        !           597: 
        !           598: {
        !           599: UINT   ErrStat;
        !           600: 
        !           601:    switch ( Action )
        !           602:       {
        !           603:       case MIB_ACTION_SET:
        !           604:          // Make sure that this variable's ACCESS is SET'able
        !           605:         if ( MibPtr->Access != MIB_ACCESS_READWRITE &&
        !           606:              MibPtr->Access != MIB_ACCESS_WRITE )
        !           607:            {
        !           608:            ErrStat = SNMP_ERRORSTATUS_NOSUCHNAME;
        !           609:             goto Exit;
        !           610:            }
        !           611: 
        !           612:          // Check for proper type before setting
        !           613:          if ( MibPtr->Type != VarBind->value.asnType )
        !           614:            {
        !           615:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           616:            goto Exit;
        !           617:            }
        !           618: 
        !           619:          // Make sure the value is valid
        !           620:          if ( MIB_TOASTER_WHITEBREAD > VarBind->value.asnValue.number ||
        !           621:               MIB_TOASTER_OTHERBREAD < VarBind->value.asnValue.number )
        !           622:             {
        !           623:            ErrStat = SNMP_ERRORSTATUS_BADVALUE;
        !           624:            goto Exit;
        !           625:             }
        !           626: 
        !           627:          // Let fall through purposefully for further processing by
        !           628:          // generic leaf function.
        !           629: 
        !           630:       case MIB_ACTION_GETNEXT:
        !           631:       case MIB_ACTION_GET:
        !           632:         // Call the more generic function to perform the action
        !           633:          ErrStat = MIB_leaf_func( Action, MibPtr, VarBind );
        !           634:          break;
        !           635: 
        !           636:       default:
        !           637:         ErrStat = SNMP_ERRORSTATUS_GENERR;
        !           638:         goto Exit;
        !           639:       } // switch
        !           640: 
        !           641: Exit:
        !           642:    return ErrStat;
        !           643: } // MIB_toasttype_func
        !           644: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.