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