Annotation of mstools/samples/snmp/snmputil/snmputil.c, revision 1.1.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:     snmputil.c
                      8: 
                      9: Abstract:
                     10: 
                     11:     Sample SNMP Management API usage for Windows NT.
                     12: 
                     13:     This file is an example of how to code management applications using
                     14:     the SNMP Management API for Windows NT.  It is similar in operation to
                     15:     the other commonly available SNMP command line utilities.
                     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:     28-Jun-1991
                     23: 
                     24: Revision History:
                     25: 
                     26: --*/
                     27: 
                     28: 
                     29: static char *vcsid = "@(#) $Logfile:   N:/agent/mgmtapi/vcs/snmputil.c_v  $ $Revision:   1.5  $";
                     30: 
                     31: 
                     32: // General notes:
                     33: //   Microsoft's SNMP Management API for Windows NT is implemented as a DLL
                     34: // that is linked with the developer's code.  These APIs (examples follow in
                     35: // this file) allow the developer's code to generate SNMP queries and receive
                     36: // SNMP traps.  A simple MIB compiler and related APIs are also available to
                     37: // allow conversions between OBJECT IDENTIFIERS and OBJECT DESCRIPTORS.
                     38: 
                     39: 
                     40: // Necessary includes.
                     41: 
                     42: #include <windows.h>
                     43: 
                     44: #include <stdio.h>
                     45: #include <string.h>
                     46: #include <malloc.h>
                     47: 
                     48: #include <snmp.h>
                     49: #include <mgmtapi.h>
                     50: 
                     51: 
                     52: // Constants used in this example.
                     53: 
                     54: #define GET     1
                     55: #define GETNEXT 2
                     56: #define WALK    3
                     57: #define TRAP    4
                     58: 
                     59: #define TIMEOUT 6000 /* milliseconds */
                     60: #define RETRIES 3
                     61: 
                     62: 
                     63: // Main program.
                     64: 
                     65: INT _CRTAPI1 main(
                     66:     IN int  argumentCount,
                     67:     IN char *argumentVector[])
                     68:     {
                     69:     INT                operation;
                     70:     LPSTR              agent;
                     71:     LPSTR              community;
                     72:     RFC1157VarBindList variableBindings;
                     73:     LPSNMP_MGR_SESSION session;
                     74: 
                     75:     INT        timeout = TIMEOUT;
                     76:     INT        retries = RETRIES;
                     77: 
                     78:     BYTE       requestType;
                     79:     AsnInteger requestId;
                     80:     AsnInteger errorStatus;
                     81:     AsnInteger errorIndex;
                     82: 
                     83: 
                     84:     // Parse command line arguments to determine requested operation.
                     85: 
                     86:     // Verify number of arguments...
                     87:     if      (argumentCount < 5 && argumentCount != 2)
                     88:         {
                     89:         printf("Error:  Incorrect number of arguments specified.\n");
                     90:         printf(
                     91: "\nusage:  snmputil [get|getnext|walk] agent community oid [oid ...]\n");
                     92:         printf(
                     93:   "        snmputil trap\n");
                     94: 
                     95:         return 1;
                     96:         }
                     97: 
                     98:     // Get/verify operation...
                     99:     argumentVector++;
                    100:     argumentCount--;
                    101:     if      (!strcmp(*argumentVector, "get"))
                    102:         operation = GET;
                    103:     else if (!strcmp(*argumentVector, "getnext"))
                    104:         operation = GETNEXT;
                    105:     else if (!strcmp(*argumentVector, "walk"))
                    106:         operation = WALK;
                    107:     else if (!strcmp(*argumentVector, "trap"))
                    108:         operation = TRAP;
                    109:     else
                    110:         {
                    111:         printf("Error:  Invalid operation, '%s', specified.\n",
                    112:                *argumentVector);
                    113: 
                    114:         return 1;
                    115:         }
                    116: 
                    117:     if (operation != TRAP)
                    118:         {
                    119:         if (argumentCount < 4)
                    120:             {
                    121:             printf("Error:  Incorrect number of arguments specified.\n");
                    122:             printf(
                    123: "\nusage:  snmputil [get|getnext|walk] agent community oid [oid ...]\n");
                    124:             printf(
                    125:   "        snmputil trap\n");
                    126: 
                    127:             return 1;
                    128:             }
                    129: 
                    130:         // Get agent address...
                    131:         argumentVector++;
                    132:         argumentCount--;
                    133:         agent = (LPSTR)malloc(strlen(*argumentVector) + 1);
                    134:         strcpy(agent, *argumentVector);
                    135: 
                    136:         // Get agent community...
                    137:         argumentVector++;
                    138:         argumentCount--;
                    139:         community = (LPSTR)malloc(strlen(*argumentVector) + 1);
                    140:         strcpy(community, *argumentVector);
                    141: 
                    142:         // Get oid's...
                    143:         variableBindings.list = NULL;
                    144:         variableBindings.len = 0;
                    145: 
                    146:         while(--argumentCount)
                    147:             {
                    148:             AsnObjectIdentifier reqObject;
                    149: 
                    150:             argumentVector++;
                    151: 
                    152:             // Convert the string representation to an internal representation.
                    153:             if (!SnmpMgrStrToOid(*argumentVector, &reqObject))
                    154:                 {
                    155:                 printf("Error: Invalid oid, %s, specified.\n", *argumentVector);
                    156: 
                    157:                 return 1;
                    158:                 }
                    159:             else
                    160:                 {
                    161:                 // Since sucessfull, add to the variable bindings list.
                    162:                 variableBindings.len++;
                    163:                 if ((variableBindings.list = (RFC1157VarBind *)realloc(
                    164:                     variableBindings.list, sizeof(RFC1157VarBind) *
                    165:                     variableBindings.len)) == NULL)
                    166:                     {
                    167:                     printf("Error: Error allocating oid, %s.\n",
                    168:                            *argumentVector);
                    169: 
                    170:                     return 1;
                    171:                     }
                    172: 
                    173:                 variableBindings.list[variableBindings.len - 1].name =
                    174:                     reqObject; // NOTE!  structure copy
                    175:                 variableBindings.list[variableBindings.len - 1].value.asnType =
                    176:                     ASN_NULL;
                    177:                 }
                    178:             } // end while()
                    179: 
                    180:         // Make sure only one variable binding was specified if operation
                    181:         // is WALK.
                    182:         if (operation == WALK && variableBindings.len != 1)
                    183:             {
                    184:             printf("Error: Multiple oids specified for WALK.\n");
                    185: 
                    186:             return 1;
                    187:             }
                    188: 
                    189: 
                    190:         // Establish a SNMP session to communicate with the remote agent.  The
                    191:         // community, communications timeout, and communications retry count
                    192:         // for the session are also required.
                    193: 
                    194:         if ((session = SnmpMgrOpen(agent, community, timeout, retries)) == NULL)
                    195:             {
                    196:             printf("error on SnmpMgrOpen %d\n", GetLastError());
                    197: 
                    198:             return 1;
                    199:             }
                    200: 
                    201:         } // end if(TRAP)
                    202: 
                    203: 
                    204:     // Determine and perform the requested operation.
                    205: 
                    206:     if      (operation == GET || operation == GETNEXT)
                    207:         {
                    208:         // Get and GetNext are relatively simple operations to perform.
                    209:         // Simply initiate the request and process the result and/or
                    210:         // possible error conditions.
                    211: 
                    212: 
                    213:         if (operation == GET)
                    214:             requestType = ASN_RFC1157_GETREQUEST;
                    215:         else
                    216:             requestType = ASN_RFC1157_GETNEXTREQUEST;
                    217: 
                    218: 
                    219:         // Request that the API carry out the desired operation.
                    220: 
                    221:         if (!SnmpMgrRequest(session, requestType, &variableBindings,
                    222:                             &errorStatus, &errorIndex))
                    223:             {
                    224:             // The API is indicating an error.
                    225: 
                    226:             printf("error on SnmpMgrRequest %d\n", GetLastError());
                    227:             }
                    228:         else
                    229:             {
                    230:             // The API succeeded, errors may be indicated from the remote
                    231:             // agent.
                    232: 
                    233:             if (errorStatus > 0)
                    234:                 {
                    235:                 printf("Error: errorStatus=%d, errorIndex=%d\n",
                    236:                        errorStatus, errorIndex);
                    237:                 }
                    238:             else
                    239:                 {
                    240:                 // Display the resulting variable bindings.
                    241: 
                    242:                 UINT i;
                    243:                 char *string = NULL;
                    244: 
                    245:                 for(i=0; i < variableBindings.len; i++)
                    246:                     {
                    247:                     SnmpMgrOidToStr(&variableBindings.list[i].name, &string);
                    248:                     printf("Variable = %s\n", string);
                    249:                     if (string) free(string);
                    250: 
                    251:                     printf("Value    = ");
                    252:                     SnmpUtilPrintAsnAny(&variableBindings.list[i].value);
                    253: 
                    254:                     printf("\n");
                    255:                     } // end for()
                    256:                 }
                    257:             }
                    258: 
                    259: 
                    260:         // Free the variable bindings that have been allocated.
                    261: 
                    262:         SnmpUtilVarBindListFree(&variableBindings);
                    263: 
                    264: 
                    265:         }
                    266:     else if (operation == WALK)
                    267:         {
                    268:         // Walk is a common term used to indicate that all MIB variables
                    269:         // under a given OID are to be traversed and displayed.  This is
                    270:         // a more complex operation requiring tests and looping in addition
                    271:         // to the steps for get/getnext above.
                    272: 
                    273: 
                    274:         AsnObjectIdentifier root;
                    275:         AsnObjectIdentifier tempOid;
                    276: 
                    277: 
                    278:         SnmpUtilOidCpy(&root, &variableBindings.list[0].name);
                    279: 
                    280:         requestType = ASN_RFC1157_GETNEXTREQUEST;
                    281: 
                    282: 
                    283:         while(1)
                    284:             {
                    285:             if (!SnmpMgrRequest(session, requestType, &variableBindings,
                    286:                                 &errorStatus, &errorIndex))
                    287:                 {
                    288:                 // The API is indicating an error.
                    289: 
                    290:                 printf("error on SnmpMgrRequest %d\n", GetLastError());
                    291: 
                    292:                 break;
                    293:                 }
                    294:             else
                    295:                 {
                    296:                 // The API succeeded, errors may be indicated from the remote
                    297:                 // agent.
                    298: 
                    299: 
                    300:                 // Test for end of subtree or end of MIB.
                    301: 
                    302:                 if (errorStatus == SNMP_ERRORSTATUS_NOSUCHNAME ||
                    303:                     SnmpUtilOidNCmp(&variableBindings.list[0].name,
                    304:                                     &root, root.idLength))
                    305:                     {
                    306:                     printf("End of MIB subtree.\n\n");
                    307: 
                    308:                     break;
                    309:                     }
                    310: 
                    311: 
                    312:                 // Test for general error conditions or sucesss.
                    313: 
                    314:                 if (errorStatus > 0)
                    315:                     {
                    316:                     printf("Error: errorStatus=%d, errorIndex=%d \n",
                    317:                            errorStatus, errorIndex);
                    318: 
                    319:                     break;
                    320:                     }
                    321:                 else
                    322:                     {
                    323:                     // Display resulting variable binding for this iteration.
                    324: 
                    325:                     char *string = NULL;
                    326: 
                    327:                     SnmpMgrOidToStr(&variableBindings.list[0].name, &string);
                    328:                     printf("Variable = %s\n", string);
                    329:                     if (string) free(string);
                    330: 
                    331:                     printf("Value    = ");
                    332:                     SnmpUtilPrintAsnAny(&variableBindings.list[0].value);
                    333: 
                    334:                     printf("\n");
                    335:                     }
                    336:                 } // end if()
                    337: 
                    338: 
                    339:             // Prepare for the next iteration.  Make sure returned oid is
                    340:             // preserved and the returned value is freed.
                    341: 
                    342:             SnmpUtilOidCpy(&tempOid, &variableBindings.list[0].name);
                    343: 
                    344:             SnmpUtilVarBindFree(&variableBindings.list[0]);
                    345: 
                    346:             SnmpUtilOidCpy(&variableBindings.list[0].name, &tempOid);
                    347:             variableBindings.list[0].value.asnType = ASN_NULL;
                    348: 
                    349:             SnmpUtilOidFree(&tempOid);
                    350: 
                    351:             } // end while()
                    352: 
                    353: 
                    354:         // Free the variable bindings that have been allocated.
                    355: 
                    356:         SnmpUtilVarBindListFree(&variableBindings);
                    357: 
                    358:         SnmpUtilOidFree(&root);
                    359: 
                    360: 
                    361:         }
                    362:     else if (operation == TRAP)
                    363:         {
                    364:         // Trap handling can be done two different ways: event driven or
                    365:         // polled.  The following code illustrates the steps to use event
                    366:         // driven trap reception in a management application.
                    367: 
                    368: 
                    369:         HANDLE hNewTraps = NULL;
                    370: 
                    371: 
                    372:         if (!SnmpMgrTrapListen(&hNewTraps))
                    373:             {
                    374:             printf("error on SnmpMgrTrapListen %d\n", GetLastError());
                    375:             }
                    376:         else
                    377:             {
                    378:             printf("snmputil: listening for traps...\n");
                    379:             }
                    380: 
                    381: 
                    382:         while(1)
                    383:             {
                    384:             DWORD dwResult;
                    385: 
                    386:             if ((dwResult = WaitForSingleObject(hNewTraps, 0xffffffff))
                    387:                 == 0xffffffff)
                    388:                 {
                    389:                 printf("error on WaitForSingleObject %d\n",
                    390:                        GetLastError());
                    391:                 }
                    392:             else if (!ResetEvent(hNewTraps))
                    393:                 {
                    394:                 printf("error on ResetEvent %d\n", GetLastError());
                    395:                 }
                    396:             else
                    397:                 {
                    398:                 AsnObjectIdentifier enterprise;
                    399:                 AsnNetworkAddress   IPAddress;
                    400:                 AsnInteger          genericTrap;
                    401:                 AsnInteger          specificTrap;
                    402:                 AsnTimeticks        timeStamp;
                    403:                 RFC1157VarBindList  variableBindings;
                    404: 
                    405:                 UINT i;
                    406:                 char *string = NULL;
                    407: 
                    408:                 while(SnmpMgrGetTrap(&enterprise, &IPAddress, &genericTrap,
                    409:                                      &specificTrap, &timeStamp, &variableBindings))
                    410:                     {
                    411:                     printf("snmputil: trap generic=%d specific=%d\n",
                    412:                            genericTrap, specificTrap);
                    413:                     if (IPAddress.length == 4) {
                    414:                         printf("  from -> %d.%d.%d.%d\n",
                    415:                              (int)IPAddress.stream[0], (int)IPAddress.stream[1],
                    416:                              (int)IPAddress.stream[2], (int)IPAddress.stream[3]);
                    417: 
                    418:                     }
                    419:                     if (IPAddress.dynamic) {
                    420:                         SNMP_free(IPAddress.stream);
                    421:                     }
                    422: 
                    423:                     for(i=0; i < variableBindings.len; i++)
                    424:                         {
                    425:                         SnmpMgrOidToStr(&variableBindings.list[i].name, &string);
                    426:                         printf("Variable = %s\n", string);
                    427:                         if (string) free(string);
                    428: 
                    429:                         printf("Value    = ");
                    430:                         SnmpUtilPrintAsnAny(&variableBindings.list[i].value);
                    431:                         } // end for()
                    432:                     printf("\n");
                    433: 
                    434: 
                    435:                     SnmpUtilOidFree(&enterprise);
                    436: 
                    437:                     SnmpUtilVarBindListFree(&variableBindings);
                    438:                     }
                    439:                 }
                    440:             } // end while()
                    441: 
                    442: 
                    443:         } // end if(operation)
                    444: 
                    445: 
                    446:     if (operation != TRAP)
                    447:         {
                    448:         // Close SNMP session with the remote agent.
                    449: 
                    450:         if (!SnmpMgrClose(session))
                    451:             {
                    452:             printf("error on SnmpMgrClose %d\n", GetLastError());
                    453: 
                    454:             return 1;
                    455:             }
                    456:         }
                    457: 
                    458: 
                    459:     // Let the command interpreter know things went ok.
                    460: 
                    461:     return 0;
                    462: 
                    463:     } // end main()
                    464: 

unix.superglobalmegacorp.com

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