1 #include <sys/socket.h>
2 
3 #include <err.h>
4 #include <inttypes.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9 
10 #include "regress.h"
11 
12 __dead void usage(void);
13 
14 const struct {
15 	char *target;
16 	void (*function)(void);
17 } targets[] = {
18 	{ "agentx_open_nnbo", agentx_open_nnbo },
19 	{ "agentx_open_nbo", agentx_open_nbo },
20 	{ "agentx_open_invalidversion", agentx_open_invalidversion },
21 	{ "agentx_open_ignore_sessionid", agentx_open_ignore_sessionid },
22 	{ "agentx_open_invalid_oid", agentx_open_invalid_oid },
23 	{ "agentx_open_descr_too_long", agentx_open_descr_too_long },
24 	{ "agentx_open_descr_invalid", agentx_open_descr_invalid },
25 	{ "agentx_open_context", agentx_open_context },
26 	{ "agentx_open_instance_registration", agentx_open_instance_registration },
27 	{ "agentx_open_new_index", agentx_open_new_index },
28 	{ "agentx_open_any_index", agentx_open_any_index },
29 	{ "agentx_ping_notopen", agentx_ping_notopen },
30 	{ "agentx_ping_invalid_sessionid", agentx_ping_invalid_sessionid },
31 	{ "agentx_ping_default", agentx_ping_default },
32 	{ "agentx_ping_context", agentx_ping_context },
33 	{ "agentx_ping_invalid_version", agentx_ping_invalid_version },
34 	{ "agentx_ping_instance_registration", agentx_ping_instance_registration },
35 	{ "agentx_ping_new_index", agentx_ping_new_index },
36 	{ "agentx_ping_any_index", agentx_ping_any_index },
37 	{ "agentx_ping_nbo_nnbo", agentx_ping_nbo_nnbo },
38 	{ "agentx_ping_nnbo_nbo", agentx_ping_nnbo_nbo },
39 	{ "agentx_ping_invalid_version_close", agentx_ping_invalid_version_close },
40 	{ "agentx_close_notopen", agentx_close_notopen },
41 	{ "agentx_close_reasonother", agentx_close_reasonother },
42 	{ "agentx_close_reasonparseerror", agentx_close_reasonparseerror },
43 	{ "agentx_close_reasonprotocolerror", agentx_close_reasonprotocolerror },
44 	{ "agentx_close_reasontimouts", agentx_close_reasontimouts },
45 	{ "agentx_close_reasonshutdown", agentx_close_reasonshutdown },
46 	{ "agentx_close_reasonbymanager", agentx_close_reasonbymanager },
47 	{ "agentx_close_reasoninvalid", agentx_close_reasoninvalid },
48 	{ "agentx_close_single", agentx_close_single },
49 	{ "agentx_close_notowned", agentx_close_notowned },
50 	{ "agentx_close_invalid_sessionid", agentx_close_invalid_sessionid },
51 	{ "agentx_close_context", agentx_close_context },
52 	{ "agentx_close_invalid_version", agentx_close_invalid_version },
53 	{ "agentx_close_instance_registration", agentx_close_instance_registration },
54 	{ "agentx_close_new_index", agentx_close_new_index },
55 	{ "agentx_close_any_index", agentx_close_any_index },
56 	{ "agentx_close_nnbo_nbo", agentx_close_nnbo_nbo },
57 	{ "agentx_register_notopen", agentx_register_notopen },
58 	{ "agentx_register_invalid_sessionid", agentx_register_invalid_sessionid },
59 	{ "agentx_register_default", agentx_register_default },
60 	{ "agentx_register_context", agentx_register_context },
61 	{ "agentx_register_invalid_version", agentx_register_invalid_version },
62 	{ "agentx_register_instance_registration", agentx_register_instance_registration },
63 	{ "agentx_register_new_index", agentx_register_new_index },
64 	{ "agentx_register_any_index", agentx_register_any_index },
65 	{ "agentx_register_duplicate_self", agentx_register_duplicate_self },
66 	{ "agentx_register_duplicate_twocon", agentx_register_duplicate_twocon },
67 	{ "agentx_register_duplicate_priority", agentx_register_duplicate_priority },
68 	{ "agentx_register_range", agentx_register_range },
69 	{ "agentx_register_range_invalidupperbound", agentx_register_range_invalidupperbound },
70 	{ "agentx_register_range_single", agentx_register_range_single },
71 	{ "agentx_register_range_overlap_single", agentx_register_range_overlap_single },
72 	{ "agentx_register_single_overlap_range", agentx_register_single_overlap_range },
73 	{ "agentx_register_range_overlap_range", agentx_register_range_overlap_range },
74 	{ "agentx_register_below", agentx_register_below },
75 	{ "agentx_register_above", agentx_register_above },
76 	{ "agentx_register_restricted", agentx_register_restricted },
77 	{ "agentx_unregister_notopen", agentx_unregister_notopen },
78 	{ "agentx_unregister_invalid_sessionid", agentx_unregister_invalid_sessionid },
79 	{ "agentx_unregister_notregistered", agentx_unregister_notregistered },
80 	{ "agentx_unregister_single", agentx_unregister_single },
81 	{ "agentx_unregister_single_notowned", agentx_unregister_single_notowned },
82 	{ "agentx_unregister_range", agentx_unregister_range },
83 	{ "agentx_unregister_range_single", agentx_unregister_range_single },
84 	{ "agentx_unregister_range_subset", agentx_unregister_range_subset },
85 	{ "agentx_unregister_range_extra", agentx_unregister_range_extra },
86 	{ "agentx_unregister_range_priority", agentx_unregister_range_priority },
87 	{ "agentx_unregister_range_notowned", agentx_unregister_range_notowned },
88 	{ "backend_get_integer", backend_get_integer },
89 	{ "backend_get_octetstring", backend_get_octetstring },
90 	{ "backend_get_objectidentifier", backend_get_objectidentifier },
91 	{ "backend_get_ipaddress", backend_get_ipaddress },
92 	{ "backend_get_counter32", backend_get_counter32 },
93 	{ "backend_get_gauge32", backend_get_gauge32 },
94 	{ "backend_get_timeticks", backend_get_timeticks },
95 	{ "backend_get_opaque", backend_get_opaque },
96 	{ "backend_get_counter64", backend_get_counter64 },
97 	{ "backend_get_nosuchobject", backend_get_nosuchobject },
98 	{ "backend_get_nosuchinstance", backend_get_nosuchinstance },
99 	{ "backend_get_endofmibview", backend_get_endofmibview },
100 	{ "backend_get_two_single_backend", backend_get_two_single_backend },
101 	{ "backend_get_two_double_backend", backend_get_two_double_backend },
102 	{ "backend_get_wrongorder", backend_get_wrongorder },
103 	{ "backend_get_toofew", backend_get_toofew },
104 	{ "backend_get_toomany", backend_get_toomany },
105 	{ "backend_get_instance", backend_get_instance },
106 	{ "backend_get_instance_below", backend_get_instance_below },
107 	{ "backend_get_timeout_default", backend_get_timeout_default },
108 	{ "backend_get_timeout_session_lower", backend_get_timeout_session_lower },
109 	{ "backend_get_timeout_session_higher", backend_get_timeout_session_higher },
110 	{ "backend_get_timeout_region_lower", backend_get_timeout_region_lower },
111 	{ "backend_get_timeout_region_higher", backend_get_timeout_region_higher },
112 	{ "backend_get_priority_lower", backend_get_priority_lower },
113 	{ "backend_get_priority_higher", backend_get_priority_higher },
114 	{ "backend_get_priority_below_lower", backend_get_priority_below_lower },
115 	{ "backend_get_priority_below_higher", backend_get_priority_below_higher },
116 	{ "backend_get_close", backend_get_close },
117 	{ "backend_get_close_overlap", backend_get_close_overlap },
118 	{ "backend_get_disappear", backend_get_disappear },
119 	{ "backend_get_disappear_overlap", backend_get_disappear_overlap },
120 	{ "backend_get_disappear_doublesession", backend_get_disappear_doublesession },
121 	{ "backend_get_octetstring_max", backend_get_octetstring_max },
122 	{ "backend_get_octetstring_too_long", backend_get_octetstring_too_long },
123 	{ "backend_get_ipaddress_too_short", backend_get_ipaddress_too_short },
124 	{ "backend_get_ipaddress_too_long", backend_get_ipaddress_too_long },
125 	{ "backend_get_opaque_non_ber", backend_get_opaque_non_ber },
126 	{ "backend_get_opaque_double_value", backend_get_opaque_double_value },
127 	{ "backend_getnext_selfbound", backend_getnext_selfbound },
128 	{ "backend_getnext_lowerbound", backend_getnext_lowerbound },
129 	{ "backend_getnext_lowerbound_self", backend_getnext_lowerbound_self },
130 	{ "backend_getnext_lowerbound_highprio", backend_getnext_lowerbound_highprio },
131 	{ "backend_getnext_lowerbound_lowprio", backend_getnext_lowerbound_lowprio },
132 	{ "backend_getnext_sibling", backend_getnext_sibling },
133 	{ "backend_getnext_child_gap", backend_getnext_child_gap },
134 	{ "backend_getnext_nosuchobject", backend_getnext_nosuchobject },
135 	{ "backend_getnext_nosuchinstance", backend_getnext_nosuchinstance },
136 	{ "backend_getnext_endofmibview", backend_getnext_endofmibview },
137 	{ "backend_getnext_inclusive", backend_getnext_inclusive },
138 	{ "backend_getnext_jumpnext", backend_getnext_jumpnext },
139 	{ "backend_getnext_jumpnext_endofmibview", backend_getnext_jumpnext_endofmibview },
140 	{ "backend_getnext_jump_up", backend_getnext_jump_up },
141 	{ "backend_getnext_two_single_backend", backend_getnext_two_single_backend },
142 	{ "backend_getnext_two_double_backend", backend_getnext_two_double_backend },
143 	{ "backend_getnext_instance_below", backend_getnext_instance_below },
144 	{ "backend_getnext_instance", backend_getnext_instance },
145 	{ "backend_getnext_instance_exact", backend_getnext_instance_exact },
146 	{ "backend_getnext_instance_ignore", backend_getnext_instance_ignore },
147 	{ "backend_getnext_backwards", backend_getnext_backwards },
148 	{ "backend_getnext_stale", backend_getnext_stale },
149 	{ "backend_getnext_inclusive_backwards", backend_getnext_inclusive_backwards },
150 	{ "backend_getnext_toofew", backend_getnext_toofew },
151 	{ "backend_getnext_toomany", backend_getnext_toomany },
152 	{ "backend_getnext_response_equal_end", backend_getnext_response_equal_end },
153 	{ "backend_getnext_instance_below_region_before_instance", backend_getnext_instance_below_region_before_instance },
154 	{ "backend_getnext_instance_below_region_on_instance", backend_getnext_instance_below_region_on_instance },
155 	{ "backend_getnext_instance_below_region_below_instance", backend_getnext_instance_below_region_below_instance },
156 	{ "backend_getbulk_nonrep_zero_maxrep_one", backend_getbulk_nonrep_zero_maxrep_one },
157 	{ "backend_getbulk_nonrep_zero_maxrep_two", backend_getbulk_nonrep_zero_maxrep_two },
158 	{ "backend_getbulk_nonrep_one_maxrep_one", backend_getbulk_nonrep_one_maxrep_one },
159 	{ "backend_getbulk_nonrep_one_maxrep_two", backend_getbulk_nonrep_one_maxrep_two },
160 	{ "backend_getbulk_nonrep_two_maxrep_two", backend_getbulk_nonrep_two_maxrep_two },
161 	{ "backend_getbulk_nonrep_negative", backend_getbulk_nonrep_negative },
162 	{ "backend_getbulk_endofmibview", backend_getbulk_endofmibview },
163 	{ "backend_getbulk_endofmibview_second_rep", backend_getbulk_endofmibview_second_rep },
164 	{ "backend_getbulk_endofmibview_two_varbinds", backend_getbulk_endofmibview_two_varbinds },
165 	{ "backend_error_get_toobig", backend_error_get_toobig },
166 	{ "backend_error_get_nosuchname", backend_error_get_nosuchname },
167 	{ "backend_error_get_badvalue", backend_error_get_badvalue },
168 	{ "backend_error_get_readonly", backend_error_get_readonly },
169 	{ "backend_error_get_generr", backend_error_get_generr },
170 	{ "backend_error_get_wrongtype", backend_error_get_wrongtype },
171 	{ "backend_error_get_wronglength", backend_error_get_wronglength },
172 	{ "backend_error_get_wrongvalue", backend_error_get_wrongvalue },
173 	{ "backend_error_get_nocreation", backend_error_get_nocreation },
174 	{ "backend_error_get_inconsistentvalue", backend_error_get_inconsistentvalue },
175 	{ "backend_error_get_commitfailed", backend_error_get_commitfailed },
176 	{ "backend_error_get_undofailed", backend_error_get_undofailed },
177 	{ "backend_error_get_authorizationerror", backend_error_get_authorizationerror },
178 	{ "backend_error_get_notwritable", backend_error_get_notwritable },
179 	{ "backend_error_get_inconsistentname", backend_error_get_inconsistentname },
180 	{ "backend_error_get_openfailed", backend_error_get_openfailed },
181 	{ "backend_error_get_notopen", backend_error_get_notopen },
182 	{ "backend_error_get_indexwrongtype", backend_error_get_indexwrongtype },
183 	{ "backend_error_get_indexalreadyallocated", backend_error_get_indexalreadyallocated },
184 	{ "backend_error_get_indexnonavailable", backend_error_get_indexnonavailable },
185 	{ "backend_error_get_indexnotallocated", backend_error_get_indexnotallocated },
186 	{ "backend_error_get_duplicateregistration", backend_error_get_duplicateregistration },
187 	{ "backend_error_get_requestdenied", backend_error_get_requestdenied },
188 	{ "backend_error_get_processingerror", backend_error_get_processingerror },
189 	{ "backend_error_get_nonstandard", backend_error_get_nonstandard },
190 	{ "backend_error_getnext_toobig", backend_error_getnext_toobig },
191 	{ "backend_error_getnext_nosuchname", backend_error_getnext_nosuchname },
192 	{ "backend_error_getnext_badvalue", backend_error_getnext_badvalue },
193 	{ "backend_error_getnext_readonly", backend_error_getnext_readonly },
194 	{ "backend_error_getnext_generr", backend_error_getnext_generr },
195 	{ "backend_error_getnext_noaccess", backend_error_getnext_noaccess },
196 	{ "backend_error_getnext_wrongtype", backend_error_getnext_wrongtype },
197 	{ "backend_error_getnext_wronglength", backend_error_getnext_wronglength },
198 	{ "backend_error_getnext_wrongencoding", backend_error_getnext_wrongencoding },
199 	{ "backend_error_getnext_wrongvalue", backend_error_getnext_wrongvalue },
200 	{ "backend_error_getnext_nocreation", backend_error_getnext_nocreation },
201 	{ "backend_error_getnext_inconsistentvalue", backend_error_getnext_inconsistentvalue },
202 	{ "backend_error_getnext_resourceunavailable", backend_error_getnext_resourceunavailable },
203 	{ "backend_error_getnext_commitfailed", backend_error_getnext_commitfailed },
204 	{ "backend_error_getnext_undofailed", backend_error_getnext_undofailed },
205 	{ "backend_error_getnext_notwritable", backend_error_getnext_notwritable },
206 	{ "backend_error_getnext_inconsistentname", backend_error_getnext_inconsistentname },
207 	{ "backend_error_getnext_openfailed", backend_error_getnext_openfailed },
208 	{ "backend_error_getnext_notopen", backend_error_getnext_notopen },
209 	{ "backend_error_getnext_indexwrongtype", backend_error_getnext_indexwrongtype },
210 	{ "backend_error_getnext_indexalreadyallocated", backend_error_getnext_indexalreadyallocated },
211 	{ "backend_error_getnext_indexnonavailable", backend_error_getnext_indexnonavailable },
212 	{ "backend_error_getnext_indexnotallocated", backend_error_getnext_indexnotallocated },
213 	{ "backend_error_getnext_unsupportedcontext", backend_error_getnext_unsupportedcontext },
214 	{ "backend_error_getnext_duplicateregistration", backend_error_getnext_duplicateregistration },
215 	{ "backend_error_getnext_unknownregistration", backend_error_getnext_unknownregistration },
216 	{ "backend_error_getnext_parseerror", backend_error_getnext_parseerror },
217 	{ "backend_error_getnext_requestdenied", backend_error_getnext_requestdenied },
218 	{ "backend_error_getnext_processingerror", backend_error_getnext_processingerror },
219 	{ "backend_error_getnext_nonstandard", backend_error_getnext_nonstandard },
220 	{ "backend_error_getbulk_firstrepetition", backend_error_getbulk_firstrepetition },
221 	{ "backend_error_getbulk_secondrepetition", backend_error_getbulk_secondrepetition },
222 	{ "snmp_v3_usm_noauthpriv", snmp_v3_usm_noauthpriv },
223 	{ "transport_tcp_get", transport_tcp_get },
224 	{ "transport_tcp_disconnect", transport_tcp_disconnect },
225 	{ "transport_tcp_double_get_disconnect", transport_tcp_double_get_disconnect },
226 	{ NULL, NULL }
227 };
228 
229 int verbose = 0;
230 char *axsocket = NULL;
231 
232 char *hostname = NULL;
233 char *servname = NULL;
234 
235 char *community = NULL;
236 
237 int
main(int argc,char * argv[])238 main(int argc, char *argv[])
239 {
240 	size_t i, j;
241 	int c;
242 
243 	while ((c = getopt(argc, argv, "a:h:p:v")) != -1) {
244 		switch (c) {
245 		case 'a':
246 			axsocket = optarg;
247 			break;
248 		case 'c':
249 			community = optarg;
250 			break;
251 		case 'h':
252 			hostname = optarg;
253 			break;
254 		case 'p':
255 			servname = optarg;
256 			break;
257 		case 'v':
258 			verbose = 1;
259 			break;
260 		default:
261 			usage();
262 		}
263 	}
264 	argc -= optind;
265 	argv += optind;
266 
267 	if (argc != 1)
268 		usage();
269 
270 	for (i = 0; i < argc; i++) {
271 		for (j = 0; targets[j].target != NULL; j++) {
272 			if (strcmp(argv[i], targets[j].target) == 0) {
273 				targets[j].function();
274 				return 0;
275 			}
276 		}
277 	}
278 
279 	errx(1, "Unknown target: %s", argv[1]);
280 }
281 
282 __dead void
usage(void)283 usage(void)
284 {
285 	fprintf(stderr, "%s: [-v] [-a axsocket] test\n", getprogname());
286 	exit(1);
287 }
288 
289 int
oid_cmp(struct oid * a,struct oid * b)290 oid_cmp(struct oid *a, struct oid *b)
291 {
292 	size_t   i, min;
293 
294 	min = a->n_subid < b->n_subid ? a->n_subid : b->n_subid;
295 	for (i = 0; i < min; i++) {
296 		if (a->subid[i] < b->subid[i])
297 			return (-1);
298 		if (a->subid[i] > b->subid[i])
299 			return (1);
300 	}
301 	/* a is parent of b */
302 	if (a->n_subid < b->n_subid)
303 		return (-2);
304 	/* a is child of b */
305 	if (a->n_subid > b->n_subid)
306 		return 2;
307 	return (0);
308 }
309 
310 char *
oid_print(struct oid * oid,char * buf,size_t len)311 oid_print(struct oid *oid, char *buf, size_t len)
312 {
313 	char digit[11];
314 	size_t i;
315 
316 	buf[0] = '\0';
317 	for (i = 0; i < oid->n_subid; i++) {
318 		snprintf(digit, sizeof(digit), "%"PRIu32, oid->subid[i]);
319 		if (i > 0)
320 			strlcat(buf, ".", len);
321 		strlcat(buf, digit, len);
322 	}
323 	if (oid->include) {
324 		strlcat(buf, "incl", len);
325 		snprintf(digit, sizeof(digit), "(%d)", oid->include);
326 		strlcat(buf, digit, len);
327 	}
328 	return buf;
329 }
330