xref: /freebsd/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c (revision a73987237450211191f09423ee21d308155bd3d6)
1*a7398723SShteryana Shopova /*-
2*a7398723SShteryana Shopova  * Copyright (c) 2006 The FreeBSD Project
3*a7398723SShteryana Shopova  * All rights reserved.
4*a7398723SShteryana Shopova  *
5*a7398723SShteryana Shopova  * Author: Shteryana Shopova <syrinx@FreeBSD.org>
6*a7398723SShteryana Shopova  *
7*a7398723SShteryana Shopova  * Redistribution of this software and documentation and use in source and
8*a7398723SShteryana Shopova  * binary forms, with or without modification, are permitted provided that
9*a7398723SShteryana Shopova  * the following conditions are met:
10*a7398723SShteryana Shopova  *
11*a7398723SShteryana Shopova  * 1. Redistributions of source code or documentation must retain the above
12*a7398723SShteryana Shopova  *    copyright notice, this list of conditions and the following disclaimer.
13*a7398723SShteryana Shopova  * 2. Redistributions in binary form must reproduce the above copyright
14*a7398723SShteryana Shopova  *    notice, this list of conditions and the following disclaimer in the
15*a7398723SShteryana Shopova  *    documentation and/or other materials provided with the distribution.
16*a7398723SShteryana Shopova  *
17*a7398723SShteryana Shopova  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18*a7398723SShteryana Shopova  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19*a7398723SShteryana Shopova  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20*a7398723SShteryana Shopova  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21*a7398723SShteryana Shopova  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22*a7398723SShteryana Shopova  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23*a7398723SShteryana Shopova  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24*a7398723SShteryana Shopova  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25*a7398723SShteryana Shopova  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26*a7398723SShteryana Shopova  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27*a7398723SShteryana Shopova  * SUCH DAMAGE.
28*a7398723SShteryana Shopova  *
29*a7398723SShteryana Shopova  * $FreeBSD$
30*a7398723SShteryana Shopova  */
31*a7398723SShteryana Shopova 
32*a7398723SShteryana Shopova #include <sys/param.h>
33*a7398723SShteryana Shopova #include <sys/queue.h>
34*a7398723SShteryana Shopova #include <sys/uio.h>
35*a7398723SShteryana Shopova 
36*a7398723SShteryana Shopova #include <ctype.h>
37*a7398723SShteryana Shopova #include <err.h>
38*a7398723SShteryana Shopova #include <errno.h>
39*a7398723SShteryana Shopova #include <stdio.h>
40*a7398723SShteryana Shopova #include <stdlib.h>
41*a7398723SShteryana Shopova #include <string.h>
42*a7398723SShteryana Shopova #include <syslog.h>
43*a7398723SShteryana Shopova #include <unistd.h>
44*a7398723SShteryana Shopova 
45*a7398723SShteryana Shopova #include <bsnmp/asn1.h>
46*a7398723SShteryana Shopova #include <bsnmp/snmp.h>
47*a7398723SShteryana Shopova #include "bsnmptc.h"
48*a7398723SShteryana Shopova #include "bsnmptools.h"
49*a7398723SShteryana Shopova 
50*a7398723SShteryana Shopova extern int _bsnmptools_debug;
51*a7398723SShteryana Shopova #define	DEBUG	if (_bsnmptools_debug) fprintf
52*a7398723SShteryana Shopova 
53*a7398723SShteryana Shopova /* Allocate memory and initialize list. */
54*a7398723SShteryana Shopova struct snmp_mappings *
55*a7398723SShteryana Shopova snmp_mapping_init(void)
56*a7398723SShteryana Shopova {
57*a7398723SShteryana Shopova 	struct snmp_mappings *m;
58*a7398723SShteryana Shopova 
59*a7398723SShteryana Shopova 	if ((m = malloc(sizeof(struct snmp_mappings))) == NULL) {
60*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
61*a7398723SShteryana Shopova 		return (NULL);
62*a7398723SShteryana Shopova 	}
63*a7398723SShteryana Shopova 
64*a7398723SShteryana Shopova 	memset(m, 0, sizeof(struct snmp_mappings));
65*a7398723SShteryana Shopova 	return (m);
66*a7398723SShteryana Shopova }
67*a7398723SShteryana Shopova 
68*a7398723SShteryana Shopova #define		snmp_nodelist	mappings->nodelist
69*a7398723SShteryana Shopova #define		snmp_intlist	mappings->intlist
70*a7398723SShteryana Shopova #define		snmp_octlist	mappings->octlist
71*a7398723SShteryana Shopova #define		snmp_oidlist	mappings->oidlist
72*a7398723SShteryana Shopova #define		snmp_iplist	mappings->iplist
73*a7398723SShteryana Shopova #define		snmp_ticklist	mappings->ticklist
74*a7398723SShteryana Shopova #define		snmp_cntlist	mappings->cntlist
75*a7398723SShteryana Shopova #define		snmp_gaugelist	mappings->gaugelist
76*a7398723SShteryana Shopova #define		snmp_cnt64list	mappings->cnt64list
77*a7398723SShteryana Shopova #define		snmp_enumlist	mappings->enumlist
78*a7398723SShteryana Shopova #define		snmp_tablelist	mappings->tablelist
79*a7398723SShteryana Shopova #define		snmp_tclist	mappings->tclist
80*a7398723SShteryana Shopova 
81*a7398723SShteryana Shopova void
82*a7398723SShteryana Shopova enum_pairs_free(struct enum_pairs *headp)
83*a7398723SShteryana Shopova {
84*a7398723SShteryana Shopova 	struct enum_pair *e;
85*a7398723SShteryana Shopova 
86*a7398723SShteryana Shopova 	if (headp == NULL)
87*a7398723SShteryana Shopova 		return;
88*a7398723SShteryana Shopova 
89*a7398723SShteryana Shopova 	while ((e = STAILQ_FIRST(headp)) != NULL) {
90*a7398723SShteryana Shopova 		STAILQ_REMOVE_HEAD(headp, link);
91*a7398723SShteryana Shopova 
92*a7398723SShteryana Shopova 		if (e->enum_str)
93*a7398723SShteryana Shopova 			free(e->enum_str);
94*a7398723SShteryana Shopova 		free(e);
95*a7398723SShteryana Shopova 	}
96*a7398723SShteryana Shopova 
97*a7398723SShteryana Shopova 	free(headp);
98*a7398723SShteryana Shopova }
99*a7398723SShteryana Shopova 
100*a7398723SShteryana Shopova void
101*a7398723SShteryana Shopova snmp_mapping_entryfree(struct snmp_oid2str *entry)
102*a7398723SShteryana Shopova {
103*a7398723SShteryana Shopova 	if (entry->string)
104*a7398723SShteryana Shopova 		free(entry->string);
105*a7398723SShteryana Shopova 
106*a7398723SShteryana Shopova 	if (entry->tc == SNMP_TC_OWN)
107*a7398723SShteryana Shopova 		enum_pairs_free(entry->snmp_enum);
108*a7398723SShteryana Shopova 
109*a7398723SShteryana Shopova 	free(entry);
110*a7398723SShteryana Shopova }
111*a7398723SShteryana Shopova 
112*a7398723SShteryana Shopova static void
113*a7398723SShteryana Shopova snmp_mapping_listfree(struct snmp_mapping *headp)
114*a7398723SShteryana Shopova {
115*a7398723SShteryana Shopova 	struct snmp_oid2str *p;
116*a7398723SShteryana Shopova 
117*a7398723SShteryana Shopova 	while ((p = SLIST_FIRST(headp)) != NULL) {
118*a7398723SShteryana Shopova 		SLIST_REMOVE_HEAD(headp, link);
119*a7398723SShteryana Shopova 
120*a7398723SShteryana Shopova 		if (p->string)
121*a7398723SShteryana Shopova 			free(p->string);
122*a7398723SShteryana Shopova 
123*a7398723SShteryana Shopova 		if (p->tc == SNMP_TC_OWN)
124*a7398723SShteryana Shopova 			enum_pairs_free(p->snmp_enum);
125*a7398723SShteryana Shopova 		free(p);
126*a7398723SShteryana Shopova 	}
127*a7398723SShteryana Shopova 
128*a7398723SShteryana Shopova 	SLIST_INIT(headp);
129*a7398723SShteryana Shopova }
130*a7398723SShteryana Shopova 
131*a7398723SShteryana Shopova void
132*a7398723SShteryana Shopova snmp_index_listfree(struct snmp_idxlist *headp)
133*a7398723SShteryana Shopova {
134*a7398723SShteryana Shopova 	struct index *i;
135*a7398723SShteryana Shopova 
136*a7398723SShteryana Shopova 	while ((i = STAILQ_FIRST(headp)) != NULL) {
137*a7398723SShteryana Shopova 		STAILQ_REMOVE_HEAD(headp, link);
138*a7398723SShteryana Shopova 		if (i->tc == SNMP_TC_OWN)
139*a7398723SShteryana Shopova 			enum_pairs_free(i->snmp_enum);
140*a7398723SShteryana Shopova 		free(i);
141*a7398723SShteryana Shopova 	}
142*a7398723SShteryana Shopova 
143*a7398723SShteryana Shopova 	STAILQ_INIT(headp);
144*a7398723SShteryana Shopova }
145*a7398723SShteryana Shopova 
146*a7398723SShteryana Shopova static void
147*a7398723SShteryana Shopova snmp_mapping_table_listfree(struct snmp_table_index *headp)
148*a7398723SShteryana Shopova {
149*a7398723SShteryana Shopova 	struct snmp_index_entry *t;
150*a7398723SShteryana Shopova 
151*a7398723SShteryana Shopova 	while ((t = SLIST_FIRST(headp)) != NULL) {
152*a7398723SShteryana Shopova 		SLIST_REMOVE_HEAD(headp, link);
153*a7398723SShteryana Shopova 
154*a7398723SShteryana Shopova 		if (t->string)
155*a7398723SShteryana Shopova 			free(t->string);
156*a7398723SShteryana Shopova 
157*a7398723SShteryana Shopova 		snmp_index_listfree(&(t->index_list));
158*a7398723SShteryana Shopova 		free(t);
159*a7398723SShteryana Shopova 	}
160*a7398723SShteryana Shopova }
161*a7398723SShteryana Shopova 
162*a7398723SShteryana Shopova static void
163*a7398723SShteryana Shopova snmp_enumtc_listfree(struct snmp_enum_tc *headp)
164*a7398723SShteryana Shopova {
165*a7398723SShteryana Shopova 	struct enum_type *t;
166*a7398723SShteryana Shopova 
167*a7398723SShteryana Shopova 	while ((t = SLIST_FIRST(headp)) != NULL) {
168*a7398723SShteryana Shopova 		SLIST_REMOVE_HEAD(headp, link);
169*a7398723SShteryana Shopova 
170*a7398723SShteryana Shopova 		if (t->name)
171*a7398723SShteryana Shopova 			free(t->name);
172*a7398723SShteryana Shopova 		enum_pairs_free(t->snmp_enum);
173*a7398723SShteryana Shopova 		free(t);
174*a7398723SShteryana Shopova 	}
175*a7398723SShteryana Shopova }
176*a7398723SShteryana Shopova 
177*a7398723SShteryana Shopova int
178*a7398723SShteryana Shopova snmp_mapping_free(struct snmp_toolinfo *snmptoolctx)
179*a7398723SShteryana Shopova {
180*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
181*a7398723SShteryana Shopova 		return (-1);
182*a7398723SShteryana Shopova 
183*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_nodelist);
184*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_intlist);
185*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_octlist);
186*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_oidlist);
187*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_iplist);
188*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_ticklist);
189*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_cntlist);
190*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_gaugelist);
191*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_cnt64list);
192*a7398723SShteryana Shopova 	snmp_mapping_listfree(&snmptoolctx->snmp_enumlist);
193*a7398723SShteryana Shopova 	snmp_mapping_table_listfree(&snmptoolctx->snmp_tablelist);
194*a7398723SShteryana Shopova 	snmp_enumtc_listfree(&snmptoolctx->snmp_tclist);
195*a7398723SShteryana Shopova 	free(snmptoolctx->mappings);
196*a7398723SShteryana Shopova 
197*a7398723SShteryana Shopova 	return (0);
198*a7398723SShteryana Shopova }
199*a7398723SShteryana Shopova 
200*a7398723SShteryana Shopova static void
201*a7398723SShteryana Shopova snmp_dump_enumpairs(struct enum_pairs *headp)
202*a7398723SShteryana Shopova {
203*a7398723SShteryana Shopova 	struct enum_pair *entry;
204*a7398723SShteryana Shopova 
205*a7398723SShteryana Shopova 	if (headp == NULL)
206*a7398723SShteryana Shopova 		return;
207*a7398723SShteryana Shopova 
208*a7398723SShteryana Shopova 	fprintf(stderr,"enums: ");
209*a7398723SShteryana Shopova 	STAILQ_FOREACH(entry, headp, link)
210*a7398723SShteryana Shopova 		fprintf(stderr,"%d - %s, ", entry->enum_val,
211*a7398723SShteryana Shopova 		    (entry->enum_str == NULL)?"NULL":entry->enum_str);
212*a7398723SShteryana Shopova 
213*a7398723SShteryana Shopova 	fprintf(stderr,"; ");
214*a7398723SShteryana Shopova }
215*a7398723SShteryana Shopova 
216*a7398723SShteryana Shopova void
217*a7398723SShteryana Shopova snmp_dump_oid2str(struct snmp_oid2str *entry)
218*a7398723SShteryana Shopova {
219*a7398723SShteryana Shopova 	char buf[ASN_OIDSTRLEN];
220*a7398723SShteryana Shopova 
221*a7398723SShteryana Shopova 	if (entry != NULL) {
222*a7398723SShteryana Shopova 		memset(buf, 0, sizeof(buf));
223*a7398723SShteryana Shopova 		asn_oid2str_r(&(entry->var), buf);
224*a7398723SShteryana Shopova 		DEBUG(stderr, "%s - %s - %d - %d - %d", buf, entry->string,
225*a7398723SShteryana Shopova 		    entry->syntax, entry->access, entry->strlen);
226*a7398723SShteryana Shopova 		snmp_dump_enumpairs(entry->snmp_enum);
227*a7398723SShteryana Shopova 		DEBUG(stderr,"%s \n", (entry->table_idx == NULL)?"No table":
228*a7398723SShteryana Shopova 		    entry->table_idx->string);
229*a7398723SShteryana Shopova 	}
230*a7398723SShteryana Shopova }
231*a7398723SShteryana Shopova 
232*a7398723SShteryana Shopova static void
233*a7398723SShteryana Shopova snmp_dump_indexlist(struct snmp_idxlist *headp)
234*a7398723SShteryana Shopova {
235*a7398723SShteryana Shopova 	struct index *entry;
236*a7398723SShteryana Shopova 
237*a7398723SShteryana Shopova 	if (headp == NULL)
238*a7398723SShteryana Shopova 		return;
239*a7398723SShteryana Shopova 
240*a7398723SShteryana Shopova 	STAILQ_FOREACH(entry, headp, link) {
241*a7398723SShteryana Shopova 		fprintf(stderr,"%d, ", entry->syntax);
242*a7398723SShteryana Shopova 		snmp_dump_enumpairs(entry->snmp_enum);
243*a7398723SShteryana Shopova 	}
244*a7398723SShteryana Shopova 
245*a7398723SShteryana Shopova 	fprintf(stderr,"\n");
246*a7398723SShteryana Shopova }
247*a7398723SShteryana Shopova 
248*a7398723SShteryana Shopova /* Initialize the enum pairs list of a oid2str entry. */
249*a7398723SShteryana Shopova struct enum_pairs *
250*a7398723SShteryana Shopova enum_pairs_init(void)
251*a7398723SShteryana Shopova {
252*a7398723SShteryana Shopova 	struct enum_pairs *snmp_enum;
253*a7398723SShteryana Shopova 
254*a7398723SShteryana Shopova 	if ((snmp_enum = malloc(sizeof(struct enum_pairs))) == NULL) {
255*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
256*a7398723SShteryana Shopova 		return (NULL);
257*a7398723SShteryana Shopova 	}
258*a7398723SShteryana Shopova 
259*a7398723SShteryana Shopova 	STAILQ_INIT(snmp_enum);
260*a7398723SShteryana Shopova 	return (snmp_enum);
261*a7398723SShteryana Shopova }
262*a7398723SShteryana Shopova 
263*a7398723SShteryana Shopova /*
264*a7398723SShteryana Shopova  * Given a number and string, allocate memory for a (int, string) pair and add
265*a7398723SShteryana Shopova  * it to the given oid2str mapping entry's enum pairs list.
266*a7398723SShteryana Shopova  */
267*a7398723SShteryana Shopova int32_t
268*a7398723SShteryana Shopova enum_pair_insert(struct enum_pairs *headp, int32_t enum_val, char *enum_str)
269*a7398723SShteryana Shopova {
270*a7398723SShteryana Shopova 	struct enum_pair *e_new;
271*a7398723SShteryana Shopova 
272*a7398723SShteryana Shopova 	if ((e_new = malloc(sizeof(struct enum_pair))) == NULL) {
273*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
274*a7398723SShteryana Shopova 		return (-1);
275*a7398723SShteryana Shopova 	}
276*a7398723SShteryana Shopova 
277*a7398723SShteryana Shopova 	memset(e_new, 0, sizeof(struct enum_pair));
278*a7398723SShteryana Shopova 
279*a7398723SShteryana Shopova 	if ((e_new->enum_str = malloc(strlen(enum_str) + 1)) == NULL) {
280*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
281*a7398723SShteryana Shopova 		free(e_new);
282*a7398723SShteryana Shopova 		return (-1);
283*a7398723SShteryana Shopova 	}
284*a7398723SShteryana Shopova 
285*a7398723SShteryana Shopova 	e_new->enum_val = enum_val;
286*a7398723SShteryana Shopova 	strlcpy(e_new->enum_str, enum_str, strlen(enum_str) + 1);
287*a7398723SShteryana Shopova 	STAILQ_INSERT_TAIL(headp, e_new, link);
288*a7398723SShteryana Shopova 
289*a7398723SShteryana Shopova 	return (1);
290*a7398723SShteryana Shopova 
291*a7398723SShteryana Shopova }
292*a7398723SShteryana Shopova 
293*a7398723SShteryana Shopova /*
294*a7398723SShteryana Shopova  * Insert an entry in a list - entries are lexicographicaly order by asn_oid.
295*a7398723SShteryana Shopova  * Returns 1 on success, -1 if list is not initialized, 0 if a matching oid already
296*a7398723SShteryana Shopova  * exists. Error cheking is left to calling function.
297*a7398723SShteryana Shopova  */
298*a7398723SShteryana Shopova static int
299*a7398723SShteryana Shopova snmp_mapping_insert(struct snmp_mapping *headp, struct snmp_oid2str *entry)
300*a7398723SShteryana Shopova {
301*a7398723SShteryana Shopova 	int32_t rc;
302*a7398723SShteryana Shopova 	struct snmp_oid2str *temp, *prev;
303*a7398723SShteryana Shopova 
304*a7398723SShteryana Shopova 	if (entry == NULL)
305*a7398723SShteryana Shopova 		return(-1);
306*a7398723SShteryana Shopova 
307*a7398723SShteryana Shopova 	if ((prev = SLIST_FIRST(headp)) == NULL ||
308*a7398723SShteryana Shopova 	    asn_compare_oid(&(entry->var), &(prev->var)) < 0) {
309*a7398723SShteryana Shopova 		SLIST_INSERT_HEAD(headp, entry, link);
310*a7398723SShteryana Shopova 		return (1);
311*a7398723SShteryana Shopova 	} else
312*a7398723SShteryana Shopova 		rc = -1;	/* Make the compiler happy. */
313*a7398723SShteryana Shopova 
314*a7398723SShteryana Shopova 	SLIST_FOREACH(temp, headp, link) {
315*a7398723SShteryana Shopova 		if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0)
316*a7398723SShteryana Shopova 			break;
317*a7398723SShteryana Shopova 		prev = temp;
318*a7398723SShteryana Shopova 		rc = -1;
319*a7398723SShteryana Shopova 	}
320*a7398723SShteryana Shopova 
321*a7398723SShteryana Shopova 	switch (rc) {
322*a7398723SShteryana Shopova 	    case 0:
323*a7398723SShteryana Shopova 		/* Ops, matching OIDs - hope the rest info also matches. */
324*a7398723SShteryana Shopova 		if (strncmp(temp->string, entry->string, entry->strlen)) {
325*a7398723SShteryana Shopova 			syslog(LOG_INFO, "Matching OIDs with different string "
326*a7398723SShteryana Shopova 			    "mappings: old - %s, new - %s", temp->string,
327*a7398723SShteryana Shopova 			    entry->string);
328*a7398723SShteryana Shopova 			return (-1);
329*a7398723SShteryana Shopova 		}
330*a7398723SShteryana Shopova 		/*
331*a7398723SShteryana Shopova 		 * Ok, we have that already.
332*a7398723SShteryana Shopova 		 * As long as the strings match - don't complain.
333*a7398723SShteryana Shopova 		 */
334*a7398723SShteryana Shopova 		return (0);
335*a7398723SShteryana Shopova 
336*a7398723SShteryana Shopova 	    case 1:
337*a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(temp, entry, link);
338*a7398723SShteryana Shopova 		break;
339*a7398723SShteryana Shopova 
340*a7398723SShteryana Shopova 	    case -1:
341*a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(prev, entry, link);
342*a7398723SShteryana Shopova 		break;
343*a7398723SShteryana Shopova 
344*a7398723SShteryana Shopova 	    default:
345*a7398723SShteryana Shopova 		/* NOTREACHED */
346*a7398723SShteryana Shopova 		return (-1);
347*a7398723SShteryana Shopova 	}
348*a7398723SShteryana Shopova 
349*a7398723SShteryana Shopova 	return (1);
350*a7398723SShteryana Shopova }
351*a7398723SShteryana Shopova 
352*a7398723SShteryana Shopova int32_t
353*a7398723SShteryana Shopova snmp_node_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
354*a7398723SShteryana Shopova {
355*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
356*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_nodelist,entry));
357*a7398723SShteryana Shopova 
358*a7398723SShteryana Shopova 	return (-1);
359*a7398723SShteryana Shopova }
360*a7398723SShteryana Shopova 
361*a7398723SShteryana Shopova static int32_t
362*a7398723SShteryana Shopova snmp_int_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
363*a7398723SShteryana Shopova {
364*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
365*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_intlist,entry));
366*a7398723SShteryana Shopova 
367*a7398723SShteryana Shopova 	return (-1);
368*a7398723SShteryana Shopova }
369*a7398723SShteryana Shopova 
370*a7398723SShteryana Shopova static int32_t
371*a7398723SShteryana Shopova snmp_oct_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
372*a7398723SShteryana Shopova {
373*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
374*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_octlist,entry));
375*a7398723SShteryana Shopova 
376*a7398723SShteryana Shopova 	return (-1);
377*a7398723SShteryana Shopova }
378*a7398723SShteryana Shopova 
379*a7398723SShteryana Shopova static int32_t
380*a7398723SShteryana Shopova snmp_oid_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
381*a7398723SShteryana Shopova {
382*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
383*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_oidlist,entry));
384*a7398723SShteryana Shopova 
385*a7398723SShteryana Shopova 	return (-1);
386*a7398723SShteryana Shopova }
387*a7398723SShteryana Shopova 
388*a7398723SShteryana Shopova static int32_t
389*a7398723SShteryana Shopova snmp_ip_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
390*a7398723SShteryana Shopova {
391*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
392*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_iplist,entry));
393*a7398723SShteryana Shopova 
394*a7398723SShteryana Shopova 	return (-1);
395*a7398723SShteryana Shopova }
396*a7398723SShteryana Shopova 
397*a7398723SShteryana Shopova static int32_t
398*a7398723SShteryana Shopova snmp_tick_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
399*a7398723SShteryana Shopova {
400*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
401*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_ticklist,entry));
402*a7398723SShteryana Shopova 
403*a7398723SShteryana Shopova 	return (-1);
404*a7398723SShteryana Shopova }
405*a7398723SShteryana Shopova 
406*a7398723SShteryana Shopova static int32_t
407*a7398723SShteryana Shopova snmp_cnt_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
408*a7398723SShteryana Shopova {
409*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
410*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_cntlist,entry));
411*a7398723SShteryana Shopova 
412*a7398723SShteryana Shopova 	return (-1);
413*a7398723SShteryana Shopova }
414*a7398723SShteryana Shopova 
415*a7398723SShteryana Shopova static int32_t
416*a7398723SShteryana Shopova snmp_gauge_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
417*a7398723SShteryana Shopova {
418*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
419*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_gaugelist,entry));
420*a7398723SShteryana Shopova 
421*a7398723SShteryana Shopova 	return (-1);
422*a7398723SShteryana Shopova }
423*a7398723SShteryana Shopova 
424*a7398723SShteryana Shopova static int32_t
425*a7398723SShteryana Shopova snmp_cnt64_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
426*a7398723SShteryana Shopova {
427*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
428*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_cnt64list,entry));
429*a7398723SShteryana Shopova 
430*a7398723SShteryana Shopova 	return (-1);
431*a7398723SShteryana Shopova }
432*a7398723SShteryana Shopova 
433*a7398723SShteryana Shopova int32_t
434*a7398723SShteryana Shopova snmp_enum_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
435*a7398723SShteryana Shopova {
436*a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
437*a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_enumlist,entry));
438*a7398723SShteryana Shopova 
439*a7398723SShteryana Shopova 	return (-1);
440*a7398723SShteryana Shopova }
441*a7398723SShteryana Shopova 
442*a7398723SShteryana Shopova int32_t
443*a7398723SShteryana Shopova snmp_leaf_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
444*a7398723SShteryana Shopova {
445*a7398723SShteryana Shopova 	switch (entry->syntax) {
446*a7398723SShteryana Shopova 		case SNMP_SYNTAX_INTEGER:
447*a7398723SShteryana Shopova 			return (snmp_int_insert(snmptoolctx, entry));
448*a7398723SShteryana Shopova 		case SNMP_SYNTAX_OCTETSTRING:
449*a7398723SShteryana Shopova 			return (snmp_oct_insert(snmptoolctx, entry));
450*a7398723SShteryana Shopova 		case SNMP_SYNTAX_OID:
451*a7398723SShteryana Shopova 			return (snmp_oid_insert(snmptoolctx, entry));
452*a7398723SShteryana Shopova 		case SNMP_SYNTAX_IPADDRESS:
453*a7398723SShteryana Shopova 			return (snmp_ip_insert(snmptoolctx, entry));
454*a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER:
455*a7398723SShteryana Shopova 			return (snmp_cnt_insert(snmptoolctx, entry));
456*a7398723SShteryana Shopova 		case SNMP_SYNTAX_GAUGE:
457*a7398723SShteryana Shopova 			return (snmp_gauge_insert(snmptoolctx, entry));
458*a7398723SShteryana Shopova 		case SNMP_SYNTAX_TIMETICKS:
459*a7398723SShteryana Shopova 			return (snmp_tick_insert(snmptoolctx, entry));
460*a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER64:
461*a7398723SShteryana Shopova 			return (snmp_cnt64_insert(snmptoolctx, entry));
462*a7398723SShteryana Shopova 		default:
463*a7398723SShteryana Shopova 			break;
464*a7398723SShteryana Shopova 	}
465*a7398723SShteryana Shopova 
466*a7398723SShteryana Shopova 	return (-1);
467*a7398723SShteryana Shopova }
468*a7398723SShteryana Shopova 
469*a7398723SShteryana Shopova static int32_t
470*a7398723SShteryana Shopova snmp_index_insert(struct snmp_idxlist *headp, struct index *idx)
471*a7398723SShteryana Shopova {
472*a7398723SShteryana Shopova 	if (headp == NULL || index == NULL)
473*a7398723SShteryana Shopova 		return (-1);
474*a7398723SShteryana Shopova 
475*a7398723SShteryana Shopova 	STAILQ_INSERT_TAIL(headp, idx, link);
476*a7398723SShteryana Shopova 	return (1);
477*a7398723SShteryana Shopova }
478*a7398723SShteryana Shopova 
479*a7398723SShteryana Shopova int32_t
480*a7398723SShteryana Shopova snmp_syntax_insert(struct snmp_idxlist *headp, struct enum_pairs *enums,
481*a7398723SShteryana Shopova     enum snmp_syntax syntax, enum snmp_tc tc)
482*a7398723SShteryana Shopova {
483*a7398723SShteryana Shopova 	struct index *idx;
484*a7398723SShteryana Shopova 
485*a7398723SShteryana Shopova 	if ((idx = malloc(sizeof(struct index))) == NULL) {
486*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
487*a7398723SShteryana Shopova 		return (-1);
488*a7398723SShteryana Shopova 	}
489*a7398723SShteryana Shopova 
490*a7398723SShteryana Shopova 	memset(idx, 0, sizeof(struct index));
491*a7398723SShteryana Shopova 
492*a7398723SShteryana Shopova 	if (snmp_index_insert(headp, idx) < 0) {
493*a7398723SShteryana Shopova 		free(idx);
494*a7398723SShteryana Shopova 		return (-1);
495*a7398723SShteryana Shopova 	}
496*a7398723SShteryana Shopova 
497*a7398723SShteryana Shopova 	idx->syntax = syntax;
498*a7398723SShteryana Shopova 	idx->snmp_enum = enums;
499*a7398723SShteryana Shopova 	idx->tc = tc;
500*a7398723SShteryana Shopova 
501*a7398723SShteryana Shopova 	return (1);
502*a7398723SShteryana Shopova }
503*a7398723SShteryana Shopova 
504*a7398723SShteryana Shopova int32_t
505*a7398723SShteryana Shopova snmp_table_insert(struct snmp_toolinfo *snmptoolctx,
506*a7398723SShteryana Shopova     struct snmp_index_entry *entry)
507*a7398723SShteryana Shopova {
508*a7398723SShteryana Shopova 	int32_t rc;
509*a7398723SShteryana Shopova 	struct snmp_index_entry *temp, *prev;
510*a7398723SShteryana Shopova 
511*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL ||
512*a7398723SShteryana Shopova 	    entry == NULL)
513*a7398723SShteryana Shopova 		return(-1);
514*a7398723SShteryana Shopova 
515*a7398723SShteryana Shopova 	if ((prev = SLIST_FIRST(&snmptoolctx->snmp_tablelist)) == NULL ||
516*a7398723SShteryana Shopova 	    asn_compare_oid(&(entry->var), &(prev->var)) < 0) {
517*a7398723SShteryana Shopova 		SLIST_INSERT_HEAD(&snmptoolctx->snmp_tablelist, entry, link);
518*a7398723SShteryana Shopova 		return (1);
519*a7398723SShteryana Shopova 	} else
520*a7398723SShteryana Shopova 		rc = -1;	/* Make the compiler happy. */
521*a7398723SShteryana Shopova 
522*a7398723SShteryana Shopova 	SLIST_FOREACH(temp, &snmptoolctx->snmp_tablelist, link) {
523*a7398723SShteryana Shopova 		if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0)
524*a7398723SShteryana Shopova 			break;
525*a7398723SShteryana Shopova 		prev = temp;
526*a7398723SShteryana Shopova 		rc = -1;
527*a7398723SShteryana Shopova 	}
528*a7398723SShteryana Shopova 
529*a7398723SShteryana Shopova 	switch (rc) {
530*a7398723SShteryana Shopova 	    case 0:
531*a7398723SShteryana Shopova 		/* Ops, matching OIDs - hope the rest info also matches. */
532*a7398723SShteryana Shopova 		if (strncmp(temp->string, entry->string, entry->strlen)) {
533*a7398723SShteryana Shopova 			syslog(LOG_INFO, "Matching OIDs with different string "
534*a7398723SShteryana Shopova 			    "mapping - old - %s, new - %s", temp->string,
535*a7398723SShteryana Shopova 			    entry->string);
536*a7398723SShteryana Shopova 			return (-1);
537*a7398723SShteryana Shopova 		}
538*a7398723SShteryana Shopova 		return(0);
539*a7398723SShteryana Shopova 
540*a7398723SShteryana Shopova 	    case 1:
541*a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(temp, entry, link);
542*a7398723SShteryana Shopova 		break;
543*a7398723SShteryana Shopova 
544*a7398723SShteryana Shopova 	    case -1:
545*a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(prev, entry, link);
546*a7398723SShteryana Shopova 		break;
547*a7398723SShteryana Shopova 
548*a7398723SShteryana Shopova 	    default:
549*a7398723SShteryana Shopova 		/* NOTREACHED */
550*a7398723SShteryana Shopova 		return (-1);
551*a7398723SShteryana Shopova 	}
552*a7398723SShteryana Shopova 
553*a7398723SShteryana Shopova 	return (1);
554*a7398723SShteryana Shopova }
555*a7398723SShteryana Shopova 
556*a7398723SShteryana Shopova struct enum_type *
557*a7398723SShteryana Shopova snmp_enumtc_init(char *name)
558*a7398723SShteryana Shopova {
559*a7398723SShteryana Shopova 	struct enum_type *enum_tc;
560*a7398723SShteryana Shopova 
561*a7398723SShteryana Shopova 	if ((enum_tc = malloc(sizeof(struct enum_type))) == NULL) {
562*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
563*a7398723SShteryana Shopova 		return (NULL);
564*a7398723SShteryana Shopova 	}
565*a7398723SShteryana Shopova 
566*a7398723SShteryana Shopova 	memset(enum_tc, 0, sizeof(struct enum_type));
567*a7398723SShteryana Shopova 	if ((enum_tc->name = malloc(strlen(name) + 1)) == NULL) {
568*a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
569*a7398723SShteryana Shopova 		free(enum_tc);
570*a7398723SShteryana Shopova 		return (NULL);
571*a7398723SShteryana Shopova 	}
572*a7398723SShteryana Shopova 	strlcpy(enum_tc->name, name, strlen(name) + 1);
573*a7398723SShteryana Shopova 
574*a7398723SShteryana Shopova 	return (enum_tc);
575*a7398723SShteryana Shopova }
576*a7398723SShteryana Shopova 
577*a7398723SShteryana Shopova void
578*a7398723SShteryana Shopova snmp_enumtc_free(struct enum_type *tc)
579*a7398723SShteryana Shopova {
580*a7398723SShteryana Shopova 	if (tc->name)
581*a7398723SShteryana Shopova 		free(tc->name);
582*a7398723SShteryana Shopova 	if (tc->snmp_enum)
583*a7398723SShteryana Shopova 		enum_pairs_free(tc->snmp_enum);
584*a7398723SShteryana Shopova 	free(tc);
585*a7398723SShteryana Shopova }
586*a7398723SShteryana Shopova 
587*a7398723SShteryana Shopova void
588*a7398723SShteryana Shopova snmp_enumtc_insert(struct snmp_toolinfo *snmptoolctx, struct enum_type *entry)
589*a7398723SShteryana Shopova {
590*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
591*a7398723SShteryana Shopova 		return;	/* XXX no error handling? */
592*a7398723SShteryana Shopova 
593*a7398723SShteryana Shopova 	SLIST_INSERT_HEAD(&snmptoolctx->snmp_tclist, entry, link);
594*a7398723SShteryana Shopova }
595*a7398723SShteryana Shopova 
596*a7398723SShteryana Shopova struct enum_type *
597*a7398723SShteryana Shopova snmp_enumtc_lookup(struct snmp_toolinfo *snmptoolctx, char *name)
598*a7398723SShteryana Shopova {
599*a7398723SShteryana Shopova 	struct enum_type *temp;
600*a7398723SShteryana Shopova 
601*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
602*a7398723SShteryana Shopova 		return (NULL);
603*a7398723SShteryana Shopova 
604*a7398723SShteryana Shopova 	SLIST_FOREACH(temp, &snmptoolctx->snmp_tclist, link) {
605*a7398723SShteryana Shopova 		if (strcmp(temp->name, name) == 0)
606*a7398723SShteryana Shopova 			return (temp);
607*a7398723SShteryana Shopova 	}
608*a7398723SShteryana Shopova 	return (NULL);
609*a7398723SShteryana Shopova }
610*a7398723SShteryana Shopova 
611*a7398723SShteryana Shopova static void
612*a7398723SShteryana Shopova snmp_mapping_dumplist(struct snmp_mapping *headp)
613*a7398723SShteryana Shopova {
614*a7398723SShteryana Shopova 	char buf[ASN_OIDSTRLEN];
615*a7398723SShteryana Shopova 	struct snmp_oid2str *entry;
616*a7398723SShteryana Shopova 
617*a7398723SShteryana Shopova 	if (headp == NULL)
618*a7398723SShteryana Shopova 		return;
619*a7398723SShteryana Shopova 
620*a7398723SShteryana Shopova 	SLIST_FOREACH(entry,headp,link) {
621*a7398723SShteryana Shopova 		memset(buf, 0, sizeof(buf));
622*a7398723SShteryana Shopova 		asn_oid2str_r(&(entry->var), buf);
623*a7398723SShteryana Shopova 		fprintf(stderr, "%s - %s - %d - %d - %d", buf, entry->string,
624*a7398723SShteryana Shopova 		    entry->syntax, entry->access ,entry->strlen);
625*a7398723SShteryana Shopova 		fprintf(stderr," - %s \n", (entry->table_idx == NULL)?
626*a7398723SShteryana Shopova 		    "No table":entry->table_idx->string);
627*a7398723SShteryana Shopova 	}
628*a7398723SShteryana Shopova }
629*a7398723SShteryana Shopova 
630*a7398723SShteryana Shopova static void
631*a7398723SShteryana Shopova snmp_mapping_dumptable(struct snmp_table_index *headp)
632*a7398723SShteryana Shopova {
633*a7398723SShteryana Shopova 	char buf[ASN_OIDSTRLEN];
634*a7398723SShteryana Shopova 	struct snmp_index_entry *entry;
635*a7398723SShteryana Shopova 
636*a7398723SShteryana Shopova 	if (headp == NULL)
637*a7398723SShteryana Shopova 		return;
638*a7398723SShteryana Shopova 
639*a7398723SShteryana Shopova 	SLIST_FOREACH(entry, headp, link) {
640*a7398723SShteryana Shopova 		memset(buf, 0, sizeof(buf));
641*a7398723SShteryana Shopova 		asn_oid2str_r(&(entry->var), buf);
642*a7398723SShteryana Shopova 		fprintf(stderr,"%s - %s - %d - ", buf, entry->string,
643*a7398723SShteryana Shopova 		    entry->strlen);
644*a7398723SShteryana Shopova 		snmp_dump_indexlist(&(entry->index_list));
645*a7398723SShteryana Shopova 	}
646*a7398723SShteryana Shopova }
647*a7398723SShteryana Shopova 
648*a7398723SShteryana Shopova void
649*a7398723SShteryana Shopova snmp_mapping_dump(struct snmp_toolinfo *snmptoolctx /* int bits */)
650*a7398723SShteryana Shopova {
651*a7398723SShteryana Shopova 	if (!_bsnmptools_debug)
652*a7398723SShteryana Shopova 		return;
653*a7398723SShteryana Shopova 
654*a7398723SShteryana Shopova 	if (snmptoolctx == NULL) {
655*a7398723SShteryana Shopova 		fprintf(stderr,"No snmptool context!\n");
656*a7398723SShteryana Shopova 		return;
657*a7398723SShteryana Shopova 	}
658*a7398723SShteryana Shopova 
659*a7398723SShteryana Shopova 	if (snmptoolctx->mappings == NULL) {
660*a7398723SShteryana Shopova 		fprintf(stderr,"No mappings!\n");
661*a7398723SShteryana Shopova 		return;
662*a7398723SShteryana Shopova 	}
663*a7398723SShteryana Shopova 
664*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_nodelist:\n");
665*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_nodelist);
666*a7398723SShteryana Shopova 
667*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_intlist:\n");
668*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_intlist);
669*a7398723SShteryana Shopova 
670*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_octlist:\n");
671*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_octlist);
672*a7398723SShteryana Shopova 
673*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_oidlist:\n");
674*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_oidlist);
675*a7398723SShteryana Shopova 
676*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_iplist:\n");
677*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_iplist);
678*a7398723SShteryana Shopova 
679*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_ticklist:\n");
680*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_ticklist);
681*a7398723SShteryana Shopova 
682*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_cntlist:\n");
683*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_cntlist);
684*a7398723SShteryana Shopova 
685*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_gaugelist:\n");
686*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_gaugelist);
687*a7398723SShteryana Shopova 
688*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_cnt64list:\n");
689*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_cnt64list);
690*a7398723SShteryana Shopova 
691*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_enumlist:\n");
692*a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_enumlist);
693*a7398723SShteryana Shopova 
694*a7398723SShteryana Shopova 	fprintf(stderr,"snmp_tablelist:\n");
695*a7398723SShteryana Shopova 	snmp_mapping_dumptable(&snmptoolctx->snmp_tablelist);
696*a7398723SShteryana Shopova }
697*a7398723SShteryana Shopova 
698*a7398723SShteryana Shopova char *
699*a7398723SShteryana Shopova enum_string_lookup(struct enum_pairs *headp, int32_t enum_val)
700*a7398723SShteryana Shopova {
701*a7398723SShteryana Shopova 	struct enum_pair *temp;
702*a7398723SShteryana Shopova 
703*a7398723SShteryana Shopova 	if (headp == NULL)
704*a7398723SShteryana Shopova 		return (NULL);
705*a7398723SShteryana Shopova 
706*a7398723SShteryana Shopova 	STAILQ_FOREACH(temp, headp, link) {
707*a7398723SShteryana Shopova 		if (temp->enum_val == enum_val)
708*a7398723SShteryana Shopova 			return (temp->enum_str);
709*a7398723SShteryana Shopova 	}
710*a7398723SShteryana Shopova 
711*a7398723SShteryana Shopova 	return (NULL);
712*a7398723SShteryana Shopova }
713*a7398723SShteryana Shopova 
714*a7398723SShteryana Shopova int32_t
715*a7398723SShteryana Shopova enum_number_lookup(struct enum_pairs *headp, char *e_str)
716*a7398723SShteryana Shopova {
717*a7398723SShteryana Shopova 	struct enum_pair *tmp;
718*a7398723SShteryana Shopova 
719*a7398723SShteryana Shopova 	if (headp == NULL)
720*a7398723SShteryana Shopova 		return (-1);
721*a7398723SShteryana Shopova 
722*a7398723SShteryana Shopova 	STAILQ_FOREACH(tmp, headp, link)
723*a7398723SShteryana Shopova 		if (strncmp(tmp->enum_str, e_str, strlen(tmp->enum_str)) == 0)
724*a7398723SShteryana Shopova 			return (tmp->enum_val);
725*a7398723SShteryana Shopova 
726*a7398723SShteryana Shopova 	return (-1);
727*a7398723SShteryana Shopova }
728*a7398723SShteryana Shopova 
729*a7398723SShteryana Shopova static int32_t
730*a7398723SShteryana Shopova snmp_lookuplist_string(struct snmp_mapping *headp, struct snmp_object *s)
731*a7398723SShteryana Shopova {
732*a7398723SShteryana Shopova 	struct snmp_oid2str *temp;
733*a7398723SShteryana Shopova 
734*a7398723SShteryana Shopova 	if (headp == NULL)
735*a7398723SShteryana Shopova 		return (-1);
736*a7398723SShteryana Shopova 
737*a7398723SShteryana Shopova 	SLIST_FOREACH(temp, headp, link)
738*a7398723SShteryana Shopova 		if (asn_compare_oid(&(temp->var), &(s->val.var)) == 0)
739*a7398723SShteryana Shopova 			break;
740*a7398723SShteryana Shopova 
741*a7398723SShteryana Shopova 	if ((s->info = temp) == NULL)
742*a7398723SShteryana Shopova 		return (-1);
743*a7398723SShteryana Shopova 
744*a7398723SShteryana Shopova 	return (1);
745*a7398723SShteryana Shopova }
746*a7398723SShteryana Shopova 
747*a7398723SShteryana Shopova /* provided an asn_oid find the corresponding string for it */
748*a7398723SShteryana Shopova static int32_t
749*a7398723SShteryana Shopova snmp_lookup_leaf(struct snmp_mapping *headp, struct snmp_object *s)
750*a7398723SShteryana Shopova {
751*a7398723SShteryana Shopova 	struct snmp_oid2str *temp;
752*a7398723SShteryana Shopova 
753*a7398723SShteryana Shopova 	if (headp == NULL)
754*a7398723SShteryana Shopova 		return (-1);
755*a7398723SShteryana Shopova 
756*a7398723SShteryana Shopova 	SLIST_FOREACH(temp,headp,link) {
757*a7398723SShteryana Shopova 		if ((asn_compare_oid(&(temp->var), &(s->val.var)) == 0) ||
758*a7398723SShteryana Shopova 		    (asn_is_suboid(&(temp->var), &(s->val.var)))) {
759*a7398723SShteryana Shopova 			s->info = temp;
760*a7398723SShteryana Shopova 			return (1);
761*a7398723SShteryana Shopova 		}
762*a7398723SShteryana Shopova 	}
763*a7398723SShteryana Shopova 
764*a7398723SShteryana Shopova 	return (-1);
765*a7398723SShteryana Shopova }
766*a7398723SShteryana Shopova 
767*a7398723SShteryana Shopova int32_t
768*a7398723SShteryana Shopova snmp_lookup_leafstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
769*a7398723SShteryana Shopova {
770*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
771*a7398723SShteryana Shopova 		return (-1);
772*a7398723SShteryana Shopova 
773*a7398723SShteryana Shopova 	switch (s->val.syntax) {
774*a7398723SShteryana Shopova 		case SNMP_SYNTAX_INTEGER:
775*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s));
776*a7398723SShteryana Shopova 		case SNMP_SYNTAX_OCTETSTRING:
777*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s));
778*a7398723SShteryana Shopova 		case SNMP_SYNTAX_OID:
779*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s));
780*a7398723SShteryana Shopova 		case SNMP_SYNTAX_IPADDRESS:
781*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s));
782*a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER:
783*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s));
784*a7398723SShteryana Shopova 		case SNMP_SYNTAX_GAUGE:
785*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(
786*a7398723SShteryana Shopova 			    &snmptoolctx->snmp_gaugelist, s));
787*a7398723SShteryana Shopova 		case SNMP_SYNTAX_TIMETICKS:
788*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(
789*a7398723SShteryana Shopova 			    &snmptoolctx->snmp_ticklist, s));
790*a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER64:
791*a7398723SShteryana Shopova 			return (snmp_lookup_leaf(
792*a7398723SShteryana Shopova 			    &snmptoolctx->snmp_cnt64list, s));
793*a7398723SShteryana Shopova 		case SNMP_SYNTAX_NOSUCHOBJECT:
794*a7398723SShteryana Shopova 			/* FALLTHROUGH */
795*a7398723SShteryana Shopova 		case SNMP_SYNTAX_NOSUCHINSTANCE:
796*a7398723SShteryana Shopova 			/* FALLTHROUGH */
797*a7398723SShteryana Shopova 		case SNMP_SYNTAX_ENDOFMIBVIEW:
798*a7398723SShteryana Shopova 			return (snmp_lookup_allstring(snmptoolctx, s));
799*a7398723SShteryana Shopova 		default:
800*a7398723SShteryana Shopova 			warnx("Unknown syntax - %d", s->val.syntax);
801*a7398723SShteryana Shopova 			break;
802*a7398723SShteryana Shopova 	}
803*a7398723SShteryana Shopova 
804*a7398723SShteryana Shopova 	return (-1);
805*a7398723SShteryana Shopova }
806*a7398723SShteryana Shopova 
807*a7398723SShteryana Shopova int32_t
808*a7398723SShteryana Shopova snmp_lookup_enumstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
809*a7398723SShteryana Shopova {
810*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
811*a7398723SShteryana Shopova 		return (-1);
812*a7398723SShteryana Shopova 
813*a7398723SShteryana Shopova 	return (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s));
814*a7398723SShteryana Shopova }
815*a7398723SShteryana Shopova 
816*a7398723SShteryana Shopova int32_t
817*a7398723SShteryana Shopova snmp_lookup_oidstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
818*a7398723SShteryana Shopova {
819*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
820*a7398723SShteryana Shopova 		return (-1);
821*a7398723SShteryana Shopova 
822*a7398723SShteryana Shopova 	return (snmp_lookuplist_string(&snmptoolctx->snmp_oidlist, s));
823*a7398723SShteryana Shopova }
824*a7398723SShteryana Shopova 
825*a7398723SShteryana Shopova int32_t
826*a7398723SShteryana Shopova snmp_lookup_nodestring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
827*a7398723SShteryana Shopova {
828*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
829*a7398723SShteryana Shopova 		return (-1);
830*a7398723SShteryana Shopova 
831*a7398723SShteryana Shopova 	return (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s));
832*a7398723SShteryana Shopova }
833*a7398723SShteryana Shopova 
834*a7398723SShteryana Shopova int32_t
835*a7398723SShteryana Shopova snmp_lookup_allstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
836*a7398723SShteryana Shopova {
837*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
838*a7398723SShteryana Shopova 		return (-1);
839*a7398723SShteryana Shopova 
840*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s) > 0)
841*a7398723SShteryana Shopova 		return (1);
842*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s) > 0)
843*a7398723SShteryana Shopova 		return (1);
844*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s) > 0)
845*a7398723SShteryana Shopova 		return (1);
846*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s) > 0)
847*a7398723SShteryana Shopova 		return (1);
848*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s) > 0)
849*a7398723SShteryana Shopova 		return (1);
850*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_gaugelist, s) > 0)
851*a7398723SShteryana Shopova 		return (1);
852*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_ticklist, s) > 0)
853*a7398723SShteryana Shopova 		return (1);
854*a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_cnt64list, s) > 0)
855*a7398723SShteryana Shopova 		return (1);
856*a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0)
857*a7398723SShteryana Shopova 		return (1);
858*a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0)
859*a7398723SShteryana Shopova 		return (1);
860*a7398723SShteryana Shopova 
861*a7398723SShteryana Shopova 	return (-1);
862*a7398723SShteryana Shopova }
863*a7398723SShteryana Shopova 
864*a7398723SShteryana Shopova int32_t
865*a7398723SShteryana Shopova snmp_lookup_nonleaf_string(struct snmp_toolinfo *snmptoolctx,
866*a7398723SShteryana Shopova     struct snmp_object *s)
867*a7398723SShteryana Shopova {
868*a7398723SShteryana Shopova 	if (snmptoolctx == NULL)
869*a7398723SShteryana Shopova 		return (-1);
870*a7398723SShteryana Shopova 
871*a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0)
872*a7398723SShteryana Shopova 		return (1);
873*a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0)
874*a7398723SShteryana Shopova 		return (1);
875*a7398723SShteryana Shopova 
876*a7398723SShteryana Shopova 	return (-1);
877*a7398723SShteryana Shopova }
878*a7398723SShteryana Shopova 
879*a7398723SShteryana Shopova static int32_t
880*a7398723SShteryana Shopova snmp_lookup_oidlist(struct snmp_mapping *hp, struct snmp_object *s, char *oid)
881*a7398723SShteryana Shopova {
882*a7398723SShteryana Shopova 	struct snmp_oid2str *temp;
883*a7398723SShteryana Shopova 
884*a7398723SShteryana Shopova 	if (hp == NULL)
885*a7398723SShteryana Shopova 		return (-1);
886*a7398723SShteryana Shopova 
887*a7398723SShteryana Shopova 	SLIST_FOREACH(temp, hp, link) {
888*a7398723SShteryana Shopova 		if (temp->strlen != strlen(oid))
889*a7398723SShteryana Shopova 			continue;
890*a7398723SShteryana Shopova 
891*a7398723SShteryana Shopova 		if (strncmp(temp->string, oid, temp->strlen))
892*a7398723SShteryana Shopova 			continue;
893*a7398723SShteryana Shopova 
894*a7398723SShteryana Shopova 		s->val.syntax = temp->syntax;
895*a7398723SShteryana Shopova 		s->info = temp;
896*a7398723SShteryana Shopova 		asn_append_oid(&(s->val.var), &(temp->var));
897*a7398723SShteryana Shopova 		return (1);
898*a7398723SShteryana Shopova 	}
899*a7398723SShteryana Shopova 
900*a7398723SShteryana Shopova 	return (-1);
901*a7398723SShteryana Shopova }
902*a7398723SShteryana Shopova 
903*a7398723SShteryana Shopova static int32_t
904*a7398723SShteryana Shopova snmp_lookup_tablelist(struct snmp_toolinfo *snmptoolctx,
905*a7398723SShteryana Shopova     struct snmp_table_index *headp, struct snmp_object *s, char *oid)
906*a7398723SShteryana Shopova {
907*a7398723SShteryana Shopova 	struct snmp_index_entry *temp;
908*a7398723SShteryana Shopova 
909*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || headp == NULL)
910*a7398723SShteryana Shopova 		return (-1);
911*a7398723SShteryana Shopova 
912*a7398723SShteryana Shopova 	SLIST_FOREACH(temp, headp, link) {
913*a7398723SShteryana Shopova 		if (temp->strlen != strlen(oid))
914*a7398723SShteryana Shopova 			continue;
915*a7398723SShteryana Shopova 
916*a7398723SShteryana Shopova 		if (strncmp(temp->string, oid, temp->strlen))
917*a7398723SShteryana Shopova 			continue;
918*a7398723SShteryana Shopova 
919*a7398723SShteryana Shopova 		/*
920*a7398723SShteryana Shopova 		 * Another hack here - if we were given a table name
921*a7398723SShteryana Shopova 		 * return the corresponding pointer to it's entry.
922*a7398723SShteryana Shopova 		 * That should not change the reponce we'll get.
923*a7398723SShteryana Shopova 		 */
924*a7398723SShteryana Shopova 		s->val.syntax = SNMP_SYNTAX_NULL;
925*a7398723SShteryana Shopova 		asn_append_oid(&(s->val.var), &(temp->var));
926*a7398723SShteryana Shopova 		if (snmp_lookup_leaf(&snmptoolctx->snmp_nodelist, s) > 0)
927*a7398723SShteryana Shopova 			return (1);
928*a7398723SShteryana Shopova 		else
929*a7398723SShteryana Shopova 			return (-1);
930*a7398723SShteryana Shopova 	}
931*a7398723SShteryana Shopova 
932*a7398723SShteryana Shopova 	return (-1);
933*a7398723SShteryana Shopova }
934*a7398723SShteryana Shopova 
935*a7398723SShteryana Shopova int32_t
936*a7398723SShteryana Shopova snmp_lookup_oidall(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
937*a7398723SShteryana Shopova     char *oid)
938*a7398723SShteryana Shopova {
939*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || s == NULL || oid == NULL)
940*a7398723SShteryana Shopova 		return (-1);
941*a7398723SShteryana Shopova 
942*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist, s, oid) > 0)
943*a7398723SShteryana Shopova 		return (1);
944*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist, s, oid) > 0)
945*a7398723SShteryana Shopova 		return (1);
946*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist, s, oid) > 0)
947*a7398723SShteryana Shopova 		return (1);
948*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist, s, oid) > 0)
949*a7398723SShteryana Shopova 		return (1);
950*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist, s, oid) > 0)
951*a7398723SShteryana Shopova 		return (1);
952*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist, s, oid) > 0)
953*a7398723SShteryana Shopova 		return (1);
954*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist, s, oid) > 0)
955*a7398723SShteryana Shopova 		return (1);
956*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list, s, oid) > 0)
957*a7398723SShteryana Shopova 		return (1);
958*a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist, s, oid) > 0)
959*a7398723SShteryana Shopova 		return (1);
960*a7398723SShteryana Shopova 	if (snmp_lookup_tablelist(snmptoolctx, &snmptoolctx->snmp_tablelist,
961*a7398723SShteryana Shopova 	    s, oid) > 0)
962*a7398723SShteryana Shopova 		return (1);
963*a7398723SShteryana Shopova 
964*a7398723SShteryana Shopova 	return (-1);
965*a7398723SShteryana Shopova }
966*a7398723SShteryana Shopova 
967*a7398723SShteryana Shopova int32_t
968*a7398723SShteryana Shopova snmp_lookup_enumoid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
969*a7398723SShteryana Shopova     char *oid)
970*a7398723SShteryana Shopova {
971*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || s == NULL)
972*a7398723SShteryana Shopova 		return (-1);
973*a7398723SShteryana Shopova 
974*a7398723SShteryana Shopova 	return (snmp_lookup_oidlist(&snmptoolctx->snmp_enumlist, s, oid));
975*a7398723SShteryana Shopova }
976*a7398723SShteryana Shopova 
977*a7398723SShteryana Shopova int32_t
978*a7398723SShteryana Shopova snmp_lookup_oid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
979*a7398723SShteryana Shopova     char *oid)
980*a7398723SShteryana Shopova {
981*a7398723SShteryana Shopova 	if (snmptoolctx == NULL || s == NULL)
982*a7398723SShteryana Shopova 		return (-1);
983*a7398723SShteryana Shopova 
984*a7398723SShteryana Shopova 	switch (s->val.syntax) {
985*a7398723SShteryana Shopova 		case SNMP_SYNTAX_INTEGER:
986*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist,
987*a7398723SShteryana Shopova 			    s, oid));
988*a7398723SShteryana Shopova 		case SNMP_SYNTAX_OCTETSTRING:
989*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist,
990*a7398723SShteryana Shopova 			    s, oid));
991*a7398723SShteryana Shopova 		case SNMP_SYNTAX_OID:
992*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist,
993*a7398723SShteryana Shopova 			    s, oid));
994*a7398723SShteryana Shopova 		case SNMP_SYNTAX_IPADDRESS:
995*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist,
996*a7398723SShteryana Shopova 			    s, oid));
997*a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER:
998*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist,
999*a7398723SShteryana Shopova 			    s, oid));
1000*a7398723SShteryana Shopova 		case SNMP_SYNTAX_GAUGE:
1001*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist,
1002*a7398723SShteryana Shopova 			    s, oid));
1003*a7398723SShteryana Shopova 		case SNMP_SYNTAX_TIMETICKS:
1004*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist,
1005*a7398723SShteryana Shopova 			    s, oid));
1006*a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER64:
1007*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list,
1008*a7398723SShteryana Shopova 			    s, oid));
1009*a7398723SShteryana Shopova 		case SNMP_SYNTAX_NULL:
1010*a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist,
1011*a7398723SShteryana Shopova 			    s, oid));
1012*a7398723SShteryana Shopova 		default:
1013*a7398723SShteryana Shopova 			warnx("Unknown syntax - %d", s->val.syntax);
1014*a7398723SShteryana Shopova 			break;
1015*a7398723SShteryana Shopova 	}
1016*a7398723SShteryana Shopova 
1017*a7398723SShteryana Shopova 	return (-1);
1018*a7398723SShteryana Shopova }
1019