2 * snmpgetnext.c - send snmp GETNEXT requests to a network entity.
5 /***********************************************************************
6 Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
10 Permission to use, copy, modify, and distribute this software and its
11 documentation for any purpose and without fee is hereby granted,
12 provided that the above copyright notice appear in all copies and that
13 both that copyright notice and this permission notice appear in
14 supporting documentation, and that the name of CMU not be
15 used in advertising or publicity pertaining to distribution of the
16 software without specific, written prior permission.
18 CMU DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
19 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
20 CMU BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
21 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
22 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
23 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
25 ******************************************************************/
26 #include <net-snmp/net-snmp-config.h>
39 #include <sys/types.h>
41 #include <netinet/in.h>
45 #if TIME_WITH_SYS_TIME
47 # include <sys/timeb.h>
49 # include <sys/time.h>
54 # include <sys/time.h>
60 #include <sys/select.h>
69 #include <arpa/inet.h>
72 #include <net-snmp/net-snmp-includes.h>
74 #define NETSNMP_DS_APP_DONT_FIX_PDUS 0
77 optProc(int argc, char *const *argv, int opt)
84 netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID,
85 NETSNMP_DS_APP_DONT_FIX_PDUS);
88 fprintf(stderr, "Unknown flag passed to -C: %c\n",
100 fprintf(stderr, "USAGE: snmpgetnext ");
101 snmp_parse_args_usage(stderr);
102 fprintf(stderr, " OID [OID]...\n\n");
103 snmp_parse_args_descriptions(stderr);
105 " -C APPOPTS\t\tSet various application specific behaviours:\n");
107 "\t\t\t f: do not fix errors and retry the request\n");
111 main(int argc, char *argv[])
113 netsnmp_session session, *ss;
114 netsnmp_pdu *pdu, *response;
115 netsnmp_variable_list *vars;
118 int current_name = 0;
120 oid name[MAX_OID_LEN];
127 * get the common command line arguments
129 switch (arg = snmp_parse_args(argc, argv, &session, "C:", &optProc)) {
140 fprintf(stderr, "Missing object name\n");
146 * get the object names
148 for (; arg < argc; arg++)
149 names[current_name++] = argv[arg];
154 * open an SNMP session
156 ss = snmp_open(&session);
159 * diagnose snmp_open errors with the input netsnmp_session pointer
161 snmp_sess_perror("snmpgetnext", &session);
167 * create PDU for GET request and add object names to request
169 pdu = snmp_pdu_create(SNMP_MSG_GETNEXT);
171 for (count = 0; count < current_name; count++) {
172 name_length = MAX_OID_LEN;
173 if (snmp_parse_oid(names[count], name, &name_length) == NULL) {
174 snmp_perror(names[count]);
177 snmp_add_null_var(pdu, name, name_length);
188 status = snmp_synch_response(ss, pdu, &response);
189 if (status == STAT_SUCCESS) {
190 if (response->errstat == SNMP_ERR_NOERROR) {
191 for (vars = response->variables; vars;
192 vars = vars->next_variable)
193 print_variable(vars->name, vars->name_length, vars);
195 fprintf(stderr, "Error in packet.\nReason: %s\n",
196 snmp_errstring(response->errstat));
197 if (response->errindex != 0) {
198 fprintf(stderr, "Failed object: ");
199 for (count = 1, vars = response->variables;
200 vars && count != response->errindex;
201 vars = vars->next_variable, count++);
203 fprint_objid(stderr, vars->name, vars->name_length);
204 fprintf(stderr, "\n");
209 * retry if the errored variable was successfully removed
211 if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
212 NETSNMP_DS_APP_DONT_FIX_PDUS)) {
213 pdu = snmp_fix_pdu(response, SNMP_MSG_GETNEXT);
214 snmp_free_pdu(response);
220 } else if (status == STAT_TIMEOUT) {
221 fprintf(stderr, "Timeout: No Response from %s.\n",
224 } else { /* status == STAT_ERROR */
225 snmp_sess_perror("snmpgetnext", ss);
230 snmp_free_pdu(response);