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