dnscrypto-proxy: Update to release 1.3.0
[tomato.git] / release / src / router / snmp / apps / snmpget.c
blob16188667e033a8ff3db49c058e9e10ca352e6657
1 /*
2 * snmpget.c - send snmp GET requests to a network entity.
4 */
5 /***********************************************************************
6 Copyright 1988, 1989, 1991, 1992 by Carnegie Mellon University
8 All Rights Reserved
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
24 SOFTWARE.
25 ******************************************************************/
26 #include <net-snmp/net-snmp-config.h>
28 #if HAVE_STDLIB_H
29 #include <stdlib.h>
30 #endif
31 #if HAVE_UNISTD_H
32 #include <unistd.h>
33 #endif
34 #if HAVE_STRING_H
35 #include <string.h>
36 #else
37 #include <strings.h>
38 #endif
39 #include <sys/types.h>
40 #if HAVE_NETINET_IN_H
41 #include <netinet/in.h>
42 #endif
43 #include <stdio.h>
44 #include <ctype.h>
45 #if TIME_WITH_SYS_TIME
46 # ifdef WIN32
47 # include <sys/timeb.h>
48 # else
49 # include <sys/time.h>
50 # endif
51 # include <time.h>
52 #else
53 # if HAVE_SYS_TIME_H
54 # include <sys/time.h>
55 # else
56 # include <time.h>
57 # endif
58 #endif
59 #if HAVE_SYS_SELECT_H
60 #include <sys/select.h>
61 #endif
62 #if HAVE_WINSOCK_H
63 #include <winsock.h>
64 #endif
65 #if HAVE_NETDB_H
66 #include <netdb.h>
67 #endif
68 #if HAVE_ARPA_INET_H
69 #include <arpa/inet.h>
70 #endif
72 #include <net-snmp/utilities.h>
74 #include <net-snmp/net-snmp-includes.h>
76 int failures = 0;
78 #define NETSNMP_DS_APP_DONT_FIX_PDUS 0
80 static void
81 optProc(int argc, char *const *argv, int opt)
83 switch (opt) {
84 case 'C':
85 while (*optarg) {
86 switch (*optarg++) {
87 case 'f':
88 netsnmp_ds_toggle_boolean(NETSNMP_DS_APPLICATION_ID,
89 NETSNMP_DS_APP_DONT_FIX_PDUS);
90 break;
91 default:
92 fprintf(stderr, "Unknown flag passed to -C: %c\n",
93 optarg[-1]);
94 exit(1);
97 break;
101 void
102 usage(void)
104 fprintf(stderr, "USAGE: snmpget ");
105 snmp_parse_args_usage(stderr);
106 fprintf(stderr, " OID [OID]...\n\n");
107 snmp_parse_args_descriptions(stderr);
108 fprintf(stderr,
109 " -C APPOPTS\t\tSet various application specific behaviours:\n");
110 fprintf(stderr,
111 "\t\t\t f: do not fix errors and retry the request\n");
115 main(int argc, char *argv[])
117 netsnmp_session session, *ss;
118 netsnmp_pdu *pdu;
119 netsnmp_pdu *response;
120 netsnmp_variable_list *vars;
121 int arg;
122 int count;
123 int current_name = 0;
124 char *names[128];
125 oid name[MAX_OID_LEN];
126 size_t name_length;
127 int status;
128 int exitval = 0;
131 * get the common command line arguments
133 switch (arg = snmp_parse_args(argc, argv, &session, "C:", optProc)) {
134 case -2:
135 exit(0);
136 case -1:
137 usage();
138 exit(1);
139 default:
140 break;
143 if (arg >= argc) {
144 fprintf(stderr, "Missing object name\n");
145 usage();
146 exit(1);
150 * get the object names
152 for (; arg < argc; arg++)
153 names[current_name++] = argv[arg];
155 SOCK_STARTUP;
159 * Open an SNMP session.
161 ss = snmp_open(&session);
162 if (ss == NULL) {
164 * diagnose snmp_open errors with the input netsnmp_session pointer
166 snmp_sess_perror("snmpget", &session);
167 SOCK_CLEANUP;
168 exit(1);
173 * Create PDU for GET request and add object names to request.
175 pdu = snmp_pdu_create(SNMP_MSG_GET);
176 for (count = 0; count < current_name; count++) {
177 name_length = MAX_OID_LEN;
178 if (!snmp_parse_oid(names[count], name, &name_length)) {
179 snmp_perror(names[count]);
180 failures++;
181 } else
182 snmp_add_null_var(pdu, name, name_length);
184 if (failures) {
185 SOCK_CLEANUP;
186 exit(1);
191 * Perform the request.
193 * If the Get Request fails, note the OID that caused the error,
194 * "fix" the PDU (removing the error-prone OID) and retry.
196 retry:
197 status = snmp_synch_response(ss, pdu, &response);
198 if (status == STAT_SUCCESS) {
199 if (response->errstat == SNMP_ERR_NOERROR) {
200 for (vars = response->variables; vars;
201 vars = vars->next_variable)
202 print_variable(vars->name, vars->name_length, vars);
204 } else {
205 fprintf(stderr, "Error in packet\nReason: %s\n",
206 snmp_errstring(response->errstat));
208 if (response->errindex != 0) {
209 fprintf(stderr, "Failed object: ");
210 for (count = 1, vars = response->variables;
211 vars && count != response->errindex;
212 vars = vars->next_variable, count++)
213 /*EMPTY*/;
214 if (vars) {
215 fprint_objid(stderr, vars->name, vars->name_length);
217 fprintf(stderr, "\n");
219 exitval = 2;
222 * retry if the errored variable was successfully removed
224 if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
225 NETSNMP_DS_APP_DONT_FIX_PDUS)) {
226 pdu = snmp_fix_pdu(response, SNMP_MSG_GET);
227 snmp_free_pdu(response);
228 response = NULL;
229 if (pdu != NULL) {
230 goto retry;
233 } /* endif -- SNMP_ERR_NOERROR */
235 } else if (status == STAT_TIMEOUT) {
236 fprintf(stderr, "Timeout: No Response from %s.\n",
237 session.peername);
238 exitval = 1;
240 } else { /* status == STAT_ERROR */
241 snmp_sess_perror("snmpget", ss);
242 exitval = 1;
244 } /* endif -- STAT_SUCCESS */
247 if (response)
248 snmp_free_pdu(response);
249 snmp_close(ss);
250 SOCK_CLEANUP;
251 return exitval;
253 } /* end main() */