xref: /freebsd/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c (revision 229bb4daa1c52a640b6fcd8580bbf605465de4fe)
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 
2714e312050SEnji Cooper 	if ((e_new = calloc(1, sizeof(struct enum_pair))) == NULL) {
272*229bb4daSEnji Cooper 		syslog(LOG_ERR, "calloc() failed: %s", strerror(errno));
273a7398723SShteryana Shopova 		return (-1);
274a7398723SShteryana Shopova 	}
275a7398723SShteryana Shopova 
27692f7f8fbSEnji Cooper 	if ((e_new->enum_str = strdup(enum_str)) == NULL) {
277*229bb4daSEnji Cooper 		syslog(LOG_ERR, "strdup() 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;
283a7398723SShteryana Shopova 	STAILQ_INSERT_TAIL(headp, e_new, link);
284a7398723SShteryana Shopova 
285a7398723SShteryana Shopova 	return (1);
286a7398723SShteryana Shopova 
287a7398723SShteryana Shopova }
288a7398723SShteryana Shopova 
289a7398723SShteryana Shopova /*
290a7398723SShteryana Shopova  * Insert an entry in a list - entries are lexicographicaly order by asn_oid.
291a7398723SShteryana Shopova  * Returns 1 on success, -1 if list is not initialized, 0 if a matching oid already
292a7398723SShteryana Shopova  * exists. Error cheking is left to calling function.
293a7398723SShteryana Shopova  */
294a7398723SShteryana Shopova static int
295a7398723SShteryana Shopova snmp_mapping_insert(struct snmp_mapping *headp, struct snmp_oid2str *entry)
296a7398723SShteryana Shopova {
297a7398723SShteryana Shopova 	int32_t rc;
298a7398723SShteryana Shopova 	struct snmp_oid2str *temp, *prev;
299a7398723SShteryana Shopova 
300a7398723SShteryana Shopova 	if (entry == NULL)
301a7398723SShteryana Shopova 		return(-1);
302a7398723SShteryana Shopova 
303a7398723SShteryana Shopova 	if ((prev = SLIST_FIRST(headp)) == NULL ||
304a7398723SShteryana Shopova 	    asn_compare_oid(&(entry->var), &(prev->var)) < 0) {
305a7398723SShteryana Shopova 		SLIST_INSERT_HEAD(headp, entry, link);
306a7398723SShteryana Shopova 		return (1);
307a7398723SShteryana Shopova 	} else
308a7398723SShteryana Shopova 		rc = -1;	/* Make the compiler happy. */
309a7398723SShteryana Shopova 
310a7398723SShteryana Shopova 	SLIST_FOREACH(temp, headp, link) {
311a7398723SShteryana Shopova 		if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0)
312a7398723SShteryana Shopova 			break;
313a7398723SShteryana Shopova 		prev = temp;
314a7398723SShteryana Shopova 		rc = -1;
315a7398723SShteryana Shopova 	}
316a7398723SShteryana Shopova 
317a7398723SShteryana Shopova 	switch (rc) {
318a7398723SShteryana Shopova 	    case 0:
319a7398723SShteryana Shopova 		/* Ops, matching OIDs - hope the rest info also matches. */
320a7398723SShteryana Shopova 		if (strncmp(temp->string, entry->string, entry->strlen)) {
321a7398723SShteryana Shopova 			syslog(LOG_INFO, "Matching OIDs with different string "
322a7398723SShteryana Shopova 			    "mappings: old - %s, new - %s", temp->string,
323a7398723SShteryana Shopova 			    entry->string);
324a7398723SShteryana Shopova 			return (-1);
325a7398723SShteryana Shopova 		}
326a7398723SShteryana Shopova 		/*
327a7398723SShteryana Shopova 		 * Ok, we have that already.
328a7398723SShteryana Shopova 		 * As long as the strings match - don't complain.
329a7398723SShteryana Shopova 		 */
330a7398723SShteryana Shopova 		return (0);
331a7398723SShteryana Shopova 
332a7398723SShteryana Shopova 	    case 1:
333a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(temp, entry, link);
334a7398723SShteryana Shopova 		break;
335a7398723SShteryana Shopova 
336a7398723SShteryana Shopova 	    case -1:
337a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(prev, entry, link);
338a7398723SShteryana Shopova 		break;
339a7398723SShteryana Shopova 
340a7398723SShteryana Shopova 	    default:
341a7398723SShteryana Shopova 		/* NOTREACHED */
342a7398723SShteryana Shopova 		return (-1);
343a7398723SShteryana Shopova 	}
344a7398723SShteryana Shopova 
345a7398723SShteryana Shopova 	return (1);
346a7398723SShteryana Shopova }
347a7398723SShteryana Shopova 
348a7398723SShteryana Shopova int32_t
349a7398723SShteryana Shopova snmp_node_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
350a7398723SShteryana Shopova {
351a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
352a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_nodelist,entry));
353a7398723SShteryana Shopova 
354a7398723SShteryana Shopova 	return (-1);
355a7398723SShteryana Shopova }
356a7398723SShteryana Shopova 
357a7398723SShteryana Shopova static int32_t
358a7398723SShteryana Shopova snmp_int_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
359a7398723SShteryana Shopova {
360a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
361a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_intlist,entry));
362a7398723SShteryana Shopova 
363a7398723SShteryana Shopova 	return (-1);
364a7398723SShteryana Shopova }
365a7398723SShteryana Shopova 
366a7398723SShteryana Shopova static int32_t
367a7398723SShteryana Shopova snmp_oct_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
368a7398723SShteryana Shopova {
369a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
370a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_octlist,entry));
371a7398723SShteryana Shopova 
372a7398723SShteryana Shopova 	return (-1);
373a7398723SShteryana Shopova }
374a7398723SShteryana Shopova 
375a7398723SShteryana Shopova static int32_t
376a7398723SShteryana Shopova snmp_oid_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
377a7398723SShteryana Shopova {
378a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
379a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_oidlist,entry));
380a7398723SShteryana Shopova 
381a7398723SShteryana Shopova 	return (-1);
382a7398723SShteryana Shopova }
383a7398723SShteryana Shopova 
384a7398723SShteryana Shopova static int32_t
385a7398723SShteryana Shopova snmp_ip_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
386a7398723SShteryana Shopova {
387a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
388a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_iplist,entry));
389a7398723SShteryana Shopova 
390a7398723SShteryana Shopova 	return (-1);
391a7398723SShteryana Shopova }
392a7398723SShteryana Shopova 
393a7398723SShteryana Shopova static int32_t
394a7398723SShteryana Shopova snmp_tick_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
395a7398723SShteryana Shopova {
396a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
397a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_ticklist,entry));
398a7398723SShteryana Shopova 
399a7398723SShteryana Shopova 	return (-1);
400a7398723SShteryana Shopova }
401a7398723SShteryana Shopova 
402a7398723SShteryana Shopova static int32_t
403a7398723SShteryana Shopova snmp_cnt_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
404a7398723SShteryana Shopova {
405a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
406a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_cntlist,entry));
407a7398723SShteryana Shopova 
408a7398723SShteryana Shopova 	return (-1);
409a7398723SShteryana Shopova }
410a7398723SShteryana Shopova 
411a7398723SShteryana Shopova static int32_t
412a7398723SShteryana Shopova snmp_gauge_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
413a7398723SShteryana Shopova {
414a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
415a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_gaugelist,entry));
416a7398723SShteryana Shopova 
417a7398723SShteryana Shopova 	return (-1);
418a7398723SShteryana Shopova }
419a7398723SShteryana Shopova 
420a7398723SShteryana Shopova static int32_t
421a7398723SShteryana Shopova snmp_cnt64_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
422a7398723SShteryana Shopova {
423a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
424a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_cnt64list,entry));
425a7398723SShteryana Shopova 
426a7398723SShteryana Shopova 	return (-1);
427a7398723SShteryana Shopova }
428a7398723SShteryana Shopova 
429a7398723SShteryana Shopova int32_t
430a7398723SShteryana Shopova snmp_enum_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
431a7398723SShteryana Shopova {
432a7398723SShteryana Shopova 	if (snmptoolctx != NULL && snmptoolctx->mappings)
433a7398723SShteryana Shopova 		return (snmp_mapping_insert(&snmptoolctx->snmp_enumlist,entry));
434a7398723SShteryana Shopova 
435a7398723SShteryana Shopova 	return (-1);
436a7398723SShteryana Shopova }
437a7398723SShteryana Shopova 
438a7398723SShteryana Shopova int32_t
439a7398723SShteryana Shopova snmp_leaf_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
440a7398723SShteryana Shopova {
441a7398723SShteryana Shopova 	switch (entry->syntax) {
442a7398723SShteryana Shopova 		case SNMP_SYNTAX_INTEGER:
443a7398723SShteryana Shopova 			return (snmp_int_insert(snmptoolctx, entry));
444a7398723SShteryana Shopova 		case SNMP_SYNTAX_OCTETSTRING:
445a7398723SShteryana Shopova 			return (snmp_oct_insert(snmptoolctx, entry));
446a7398723SShteryana Shopova 		case SNMP_SYNTAX_OID:
447a7398723SShteryana Shopova 			return (snmp_oid_insert(snmptoolctx, entry));
448a7398723SShteryana Shopova 		case SNMP_SYNTAX_IPADDRESS:
449a7398723SShteryana Shopova 			return (snmp_ip_insert(snmptoolctx, entry));
450a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER:
451a7398723SShteryana Shopova 			return (snmp_cnt_insert(snmptoolctx, entry));
452a7398723SShteryana Shopova 		case SNMP_SYNTAX_GAUGE:
453a7398723SShteryana Shopova 			return (snmp_gauge_insert(snmptoolctx, entry));
454a7398723SShteryana Shopova 		case SNMP_SYNTAX_TIMETICKS:
455a7398723SShteryana Shopova 			return (snmp_tick_insert(snmptoolctx, entry));
456a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER64:
457a7398723SShteryana Shopova 			return (snmp_cnt64_insert(snmptoolctx, entry));
458a7398723SShteryana Shopova 		default:
459a7398723SShteryana Shopova 			break;
460a7398723SShteryana Shopova 	}
461a7398723SShteryana Shopova 
462a7398723SShteryana Shopova 	return (-1);
463a7398723SShteryana Shopova }
464a7398723SShteryana Shopova 
465a7398723SShteryana Shopova static int32_t
466a7398723SShteryana Shopova snmp_index_insert(struct snmp_idxlist *headp, struct index *idx)
467a7398723SShteryana Shopova {
468b589816cSEd Schouten 	if (headp == NULL || idx == NULL)
469a7398723SShteryana Shopova 		return (-1);
470a7398723SShteryana Shopova 
471a7398723SShteryana Shopova 	STAILQ_INSERT_TAIL(headp, idx, link);
472a7398723SShteryana Shopova 	return (1);
473a7398723SShteryana Shopova }
474a7398723SShteryana Shopova 
475a7398723SShteryana Shopova int32_t
476a7398723SShteryana Shopova snmp_syntax_insert(struct snmp_idxlist *headp, struct enum_pairs *enums,
477a7398723SShteryana Shopova     enum snmp_syntax syntax, enum snmp_tc tc)
478a7398723SShteryana Shopova {
479a7398723SShteryana Shopova 	struct index *idx;
480a7398723SShteryana Shopova 
481a7398723SShteryana Shopova 	if ((idx = malloc(sizeof(struct index))) == NULL) {
482a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
483a7398723SShteryana Shopova 		return (-1);
484a7398723SShteryana Shopova 	}
485a7398723SShteryana Shopova 
486a7398723SShteryana Shopova 	memset(idx, 0, sizeof(struct index));
487a7398723SShteryana Shopova 
488a7398723SShteryana Shopova 	if (snmp_index_insert(headp, idx) < 0) {
489a7398723SShteryana Shopova 		free(idx);
490a7398723SShteryana Shopova 		return (-1);
491a7398723SShteryana Shopova 	}
492a7398723SShteryana Shopova 
493a7398723SShteryana Shopova 	idx->syntax = syntax;
494a7398723SShteryana Shopova 	idx->snmp_enum = enums;
495a7398723SShteryana Shopova 	idx->tc = tc;
496a7398723SShteryana Shopova 
497a7398723SShteryana Shopova 	return (1);
498a7398723SShteryana Shopova }
499a7398723SShteryana Shopova 
500a7398723SShteryana Shopova int32_t
501a7398723SShteryana Shopova snmp_table_insert(struct snmp_toolinfo *snmptoolctx,
502a7398723SShteryana Shopova     struct snmp_index_entry *entry)
503a7398723SShteryana Shopova {
504a7398723SShteryana Shopova 	int32_t rc;
505a7398723SShteryana Shopova 	struct snmp_index_entry *temp, *prev;
506a7398723SShteryana Shopova 
507a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL ||
508a7398723SShteryana Shopova 	    entry == NULL)
509a7398723SShteryana Shopova 		return(-1);
510a7398723SShteryana Shopova 
511a7398723SShteryana Shopova 	if ((prev = SLIST_FIRST(&snmptoolctx->snmp_tablelist)) == NULL ||
512a7398723SShteryana Shopova 	    asn_compare_oid(&(entry->var), &(prev->var)) < 0) {
513a7398723SShteryana Shopova 		SLIST_INSERT_HEAD(&snmptoolctx->snmp_tablelist, entry, link);
514a7398723SShteryana Shopova 		return (1);
515a7398723SShteryana Shopova 	} else
516a7398723SShteryana Shopova 		rc = -1;	/* Make the compiler happy. */
517a7398723SShteryana Shopova 
518a7398723SShteryana Shopova 	SLIST_FOREACH(temp, &snmptoolctx->snmp_tablelist, link) {
519a7398723SShteryana Shopova 		if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0)
520a7398723SShteryana Shopova 			break;
521a7398723SShteryana Shopova 		prev = temp;
522a7398723SShteryana Shopova 		rc = -1;
523a7398723SShteryana Shopova 	}
524a7398723SShteryana Shopova 
525a7398723SShteryana Shopova 	switch (rc) {
526a7398723SShteryana Shopova 	    case 0:
527a7398723SShteryana Shopova 		/* Ops, matching OIDs - hope the rest info also matches. */
528a7398723SShteryana Shopova 		if (strncmp(temp->string, entry->string, entry->strlen)) {
529a7398723SShteryana Shopova 			syslog(LOG_INFO, "Matching OIDs with different string "
530a7398723SShteryana Shopova 			    "mapping - old - %s, new - %s", temp->string,
531a7398723SShteryana Shopova 			    entry->string);
532a7398723SShteryana Shopova 			return (-1);
533a7398723SShteryana Shopova 		}
534a7398723SShteryana Shopova 		return(0);
535a7398723SShteryana Shopova 
536a7398723SShteryana Shopova 	    case 1:
537a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(temp, entry, link);
538a7398723SShteryana Shopova 		break;
539a7398723SShteryana Shopova 
540a7398723SShteryana Shopova 	    case -1:
541a7398723SShteryana Shopova 		SLIST_INSERT_AFTER(prev, entry, link);
542a7398723SShteryana Shopova 		break;
543a7398723SShteryana Shopova 
544a7398723SShteryana Shopova 	    default:
545a7398723SShteryana Shopova 		/* NOTREACHED */
546a7398723SShteryana Shopova 		return (-1);
547a7398723SShteryana Shopova 	}
548a7398723SShteryana Shopova 
549a7398723SShteryana Shopova 	return (1);
550a7398723SShteryana Shopova }
551a7398723SShteryana Shopova 
552a7398723SShteryana Shopova struct enum_type *
553a7398723SShteryana Shopova snmp_enumtc_init(char *name)
554a7398723SShteryana Shopova {
555a7398723SShteryana Shopova 	struct enum_type *enum_tc;
556a7398723SShteryana Shopova 
5574e312050SEnji Cooper 	if ((enum_tc = calloc(1, sizeof(struct enum_type))) == NULL) {
558a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
559a7398723SShteryana Shopova 		return (NULL);
560a7398723SShteryana Shopova 	}
561a7398723SShteryana Shopova 
56292f7f8fbSEnji Cooper 	if ((enum_tc->name = strdup(name)) == NULL) {
563a7398723SShteryana Shopova 		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
564a7398723SShteryana Shopova 		free(enum_tc);
565a7398723SShteryana Shopova 		return (NULL);
566a7398723SShteryana Shopova 	}
567a7398723SShteryana Shopova 
568a7398723SShteryana Shopova 	return (enum_tc);
569a7398723SShteryana Shopova }
570a7398723SShteryana Shopova 
571a7398723SShteryana Shopova void
572a7398723SShteryana Shopova snmp_enumtc_free(struct enum_type *tc)
573a7398723SShteryana Shopova {
574a7398723SShteryana Shopova 	if (tc->name)
575a7398723SShteryana Shopova 		free(tc->name);
576a7398723SShteryana Shopova 	if (tc->snmp_enum)
577a7398723SShteryana Shopova 		enum_pairs_free(tc->snmp_enum);
578a7398723SShteryana Shopova 	free(tc);
579a7398723SShteryana Shopova }
580a7398723SShteryana Shopova 
581a7398723SShteryana Shopova void
582a7398723SShteryana Shopova snmp_enumtc_insert(struct snmp_toolinfo *snmptoolctx, struct enum_type *entry)
583a7398723SShteryana Shopova {
584a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
585a7398723SShteryana Shopova 		return;	/* XXX no error handling? */
586a7398723SShteryana Shopova 
587a7398723SShteryana Shopova 	SLIST_INSERT_HEAD(&snmptoolctx->snmp_tclist, entry, link);
588a7398723SShteryana Shopova }
589a7398723SShteryana Shopova 
590a7398723SShteryana Shopova struct enum_type *
591a7398723SShteryana Shopova snmp_enumtc_lookup(struct snmp_toolinfo *snmptoolctx, char *name)
592a7398723SShteryana Shopova {
593a7398723SShteryana Shopova 	struct enum_type *temp;
594a7398723SShteryana Shopova 
595a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
596a7398723SShteryana Shopova 		return (NULL);
597a7398723SShteryana Shopova 
598a7398723SShteryana Shopova 	SLIST_FOREACH(temp, &snmptoolctx->snmp_tclist, link) {
599a7398723SShteryana Shopova 		if (strcmp(temp->name, name) == 0)
600a7398723SShteryana Shopova 			return (temp);
601a7398723SShteryana Shopova 	}
602a7398723SShteryana Shopova 	return (NULL);
603a7398723SShteryana Shopova }
604a7398723SShteryana Shopova 
605a7398723SShteryana Shopova static void
606a7398723SShteryana Shopova snmp_mapping_dumplist(struct snmp_mapping *headp)
607a7398723SShteryana Shopova {
608a7398723SShteryana Shopova 	char buf[ASN_OIDSTRLEN];
609a7398723SShteryana Shopova 	struct snmp_oid2str *entry;
610a7398723SShteryana Shopova 
611a7398723SShteryana Shopova 	if (headp == NULL)
612a7398723SShteryana Shopova 		return;
613a7398723SShteryana Shopova 
614a7398723SShteryana Shopova 	SLIST_FOREACH(entry,headp,link) {
615a7398723SShteryana Shopova 		memset(buf, 0, sizeof(buf));
616a7398723SShteryana Shopova 		asn_oid2str_r(&(entry->var), buf);
617a7398723SShteryana Shopova 		fprintf(stderr, "%s - %s - %d - %d - %d", buf, entry->string,
618a7398723SShteryana Shopova 		    entry->syntax, entry->access ,entry->strlen);
619a7398723SShteryana Shopova 		fprintf(stderr," - %s \n", (entry->table_idx == NULL)?
620a7398723SShteryana Shopova 		    "No table":entry->table_idx->string);
621a7398723SShteryana Shopova 	}
622a7398723SShteryana Shopova }
623a7398723SShteryana Shopova 
624a7398723SShteryana Shopova static void
625a7398723SShteryana Shopova snmp_mapping_dumptable(struct snmp_table_index *headp)
626a7398723SShteryana Shopova {
627a7398723SShteryana Shopova 	char buf[ASN_OIDSTRLEN];
628a7398723SShteryana Shopova 	struct snmp_index_entry *entry;
629a7398723SShteryana Shopova 
630a7398723SShteryana Shopova 	if (headp == NULL)
631a7398723SShteryana Shopova 		return;
632a7398723SShteryana Shopova 
633a7398723SShteryana Shopova 	SLIST_FOREACH(entry, headp, link) {
634a7398723SShteryana Shopova 		memset(buf, 0, sizeof(buf));
635a7398723SShteryana Shopova 		asn_oid2str_r(&(entry->var), buf);
636a7398723SShteryana Shopova 		fprintf(stderr,"%s - %s - %d - ", buf, entry->string,
637a7398723SShteryana Shopova 		    entry->strlen);
638a7398723SShteryana Shopova 		snmp_dump_indexlist(&(entry->index_list));
639a7398723SShteryana Shopova 	}
640a7398723SShteryana Shopova }
641a7398723SShteryana Shopova 
642a7398723SShteryana Shopova void
643a7398723SShteryana Shopova snmp_mapping_dump(struct snmp_toolinfo *snmptoolctx /* int bits */)
644a7398723SShteryana Shopova {
645a7398723SShteryana Shopova 	if (!_bsnmptools_debug)
646a7398723SShteryana Shopova 		return;
647a7398723SShteryana Shopova 
648a7398723SShteryana Shopova 	if (snmptoolctx == NULL) {
649a7398723SShteryana Shopova 		fprintf(stderr,"No snmptool context!\n");
650a7398723SShteryana Shopova 		return;
651a7398723SShteryana Shopova 	}
652a7398723SShteryana Shopova 
653a7398723SShteryana Shopova 	if (snmptoolctx->mappings == NULL) {
654a7398723SShteryana Shopova 		fprintf(stderr,"No mappings!\n");
655a7398723SShteryana Shopova 		return;
656a7398723SShteryana Shopova 	}
657a7398723SShteryana Shopova 
658a7398723SShteryana Shopova 	fprintf(stderr,"snmp_nodelist:\n");
659a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_nodelist);
660a7398723SShteryana Shopova 
661a7398723SShteryana Shopova 	fprintf(stderr,"snmp_intlist:\n");
662a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_intlist);
663a7398723SShteryana Shopova 
664a7398723SShteryana Shopova 	fprintf(stderr,"snmp_octlist:\n");
665a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_octlist);
666a7398723SShteryana Shopova 
667a7398723SShteryana Shopova 	fprintf(stderr,"snmp_oidlist:\n");
668a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_oidlist);
669a7398723SShteryana Shopova 
670a7398723SShteryana Shopova 	fprintf(stderr,"snmp_iplist:\n");
671a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_iplist);
672a7398723SShteryana Shopova 
673a7398723SShteryana Shopova 	fprintf(stderr,"snmp_ticklist:\n");
674a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_ticklist);
675a7398723SShteryana Shopova 
676a7398723SShteryana Shopova 	fprintf(stderr,"snmp_cntlist:\n");
677a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_cntlist);
678a7398723SShteryana Shopova 
679a7398723SShteryana Shopova 	fprintf(stderr,"snmp_gaugelist:\n");
680a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_gaugelist);
681a7398723SShteryana Shopova 
682a7398723SShteryana Shopova 	fprintf(stderr,"snmp_cnt64list:\n");
683a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_cnt64list);
684a7398723SShteryana Shopova 
685a7398723SShteryana Shopova 	fprintf(stderr,"snmp_enumlist:\n");
686a7398723SShteryana Shopova 	snmp_mapping_dumplist(&snmptoolctx->snmp_enumlist);
687a7398723SShteryana Shopova 
688a7398723SShteryana Shopova 	fprintf(stderr,"snmp_tablelist:\n");
689a7398723SShteryana Shopova 	snmp_mapping_dumptable(&snmptoolctx->snmp_tablelist);
690a7398723SShteryana Shopova }
691a7398723SShteryana Shopova 
692a7398723SShteryana Shopova char *
693a7398723SShteryana Shopova enum_string_lookup(struct enum_pairs *headp, int32_t enum_val)
694a7398723SShteryana Shopova {
695a7398723SShteryana Shopova 	struct enum_pair *temp;
696a7398723SShteryana Shopova 
697a7398723SShteryana Shopova 	if (headp == NULL)
698a7398723SShteryana Shopova 		return (NULL);
699a7398723SShteryana Shopova 
700a7398723SShteryana Shopova 	STAILQ_FOREACH(temp, headp, link) {
701a7398723SShteryana Shopova 		if (temp->enum_val == enum_val)
702a7398723SShteryana Shopova 			return (temp->enum_str);
703a7398723SShteryana Shopova 	}
704a7398723SShteryana Shopova 
705a7398723SShteryana Shopova 	return (NULL);
706a7398723SShteryana Shopova }
707a7398723SShteryana Shopova 
708a7398723SShteryana Shopova int32_t
709a7398723SShteryana Shopova enum_number_lookup(struct enum_pairs *headp, char *e_str)
710a7398723SShteryana Shopova {
711a7398723SShteryana Shopova 	struct enum_pair *tmp;
712a7398723SShteryana Shopova 
713a7398723SShteryana Shopova 	if (headp == NULL)
714a7398723SShteryana Shopova 		return (-1);
715a7398723SShteryana Shopova 
716a7398723SShteryana Shopova 	STAILQ_FOREACH(tmp, headp, link)
717a7398723SShteryana Shopova 		if (strncmp(tmp->enum_str, e_str, strlen(tmp->enum_str)) == 0)
718a7398723SShteryana Shopova 			return (tmp->enum_val);
719a7398723SShteryana Shopova 
720a7398723SShteryana Shopova 	return (-1);
721a7398723SShteryana Shopova }
722a7398723SShteryana Shopova 
723a7398723SShteryana Shopova static int32_t
724a7398723SShteryana Shopova snmp_lookuplist_string(struct snmp_mapping *headp, struct snmp_object *s)
725a7398723SShteryana Shopova {
726a7398723SShteryana Shopova 	struct snmp_oid2str *temp;
727a7398723SShteryana Shopova 
728a7398723SShteryana Shopova 	if (headp == NULL)
729a7398723SShteryana Shopova 		return (-1);
730a7398723SShteryana Shopova 
731a7398723SShteryana Shopova 	SLIST_FOREACH(temp, headp, link)
732a7398723SShteryana Shopova 		if (asn_compare_oid(&(temp->var), &(s->val.var)) == 0)
733a7398723SShteryana Shopova 			break;
734a7398723SShteryana Shopova 
735a7398723SShteryana Shopova 	if ((s->info = temp) == NULL)
736a7398723SShteryana Shopova 		return (-1);
737a7398723SShteryana Shopova 
738a7398723SShteryana Shopova 	return (1);
739a7398723SShteryana Shopova }
740a7398723SShteryana Shopova 
741a7398723SShteryana Shopova /* provided an asn_oid find the corresponding string for it */
742a7398723SShteryana Shopova static int32_t
743a7398723SShteryana Shopova snmp_lookup_leaf(struct snmp_mapping *headp, struct snmp_object *s)
744a7398723SShteryana Shopova {
745a7398723SShteryana Shopova 	struct snmp_oid2str *temp;
746a7398723SShteryana Shopova 
747a7398723SShteryana Shopova 	if (headp == NULL)
748a7398723SShteryana Shopova 		return (-1);
749a7398723SShteryana Shopova 
750a7398723SShteryana Shopova 	SLIST_FOREACH(temp,headp,link) {
751a7398723SShteryana Shopova 		if ((asn_compare_oid(&(temp->var), &(s->val.var)) == 0) ||
752a7398723SShteryana Shopova 		    (asn_is_suboid(&(temp->var), &(s->val.var)))) {
753a7398723SShteryana Shopova 			s->info = temp;
754a7398723SShteryana Shopova 			return (1);
755a7398723SShteryana Shopova 		}
756a7398723SShteryana Shopova 	}
757a7398723SShteryana Shopova 
758a7398723SShteryana Shopova 	return (-1);
759a7398723SShteryana Shopova }
760a7398723SShteryana Shopova 
761a7398723SShteryana Shopova int32_t
762a7398723SShteryana Shopova snmp_lookup_leafstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
763a7398723SShteryana Shopova {
764a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
765a7398723SShteryana Shopova 		return (-1);
766a7398723SShteryana Shopova 
767a7398723SShteryana Shopova 	switch (s->val.syntax) {
768a7398723SShteryana Shopova 		case SNMP_SYNTAX_INTEGER:
769a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s));
770a7398723SShteryana Shopova 		case SNMP_SYNTAX_OCTETSTRING:
771a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s));
772a7398723SShteryana Shopova 		case SNMP_SYNTAX_OID:
773a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s));
774a7398723SShteryana Shopova 		case SNMP_SYNTAX_IPADDRESS:
775a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s));
776a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER:
777a7398723SShteryana Shopova 			return (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s));
778a7398723SShteryana Shopova 		case SNMP_SYNTAX_GAUGE:
779a7398723SShteryana Shopova 			return (snmp_lookup_leaf(
780a7398723SShteryana Shopova 			    &snmptoolctx->snmp_gaugelist, s));
781a7398723SShteryana Shopova 		case SNMP_SYNTAX_TIMETICKS:
782a7398723SShteryana Shopova 			return (snmp_lookup_leaf(
783a7398723SShteryana Shopova 			    &snmptoolctx->snmp_ticklist, s));
784a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER64:
785a7398723SShteryana Shopova 			return (snmp_lookup_leaf(
786a7398723SShteryana Shopova 			    &snmptoolctx->snmp_cnt64list, s));
787a7398723SShteryana Shopova 		case SNMP_SYNTAX_NOSUCHOBJECT:
788a7398723SShteryana Shopova 			/* FALLTHROUGH */
789a7398723SShteryana Shopova 		case SNMP_SYNTAX_NOSUCHINSTANCE:
790a7398723SShteryana Shopova 			/* FALLTHROUGH */
791a7398723SShteryana Shopova 		case SNMP_SYNTAX_ENDOFMIBVIEW:
792a7398723SShteryana Shopova 			return (snmp_lookup_allstring(snmptoolctx, s));
793a7398723SShteryana Shopova 		default:
794a7398723SShteryana Shopova 			warnx("Unknown syntax - %d", s->val.syntax);
795a7398723SShteryana Shopova 			break;
796a7398723SShteryana Shopova 	}
797a7398723SShteryana Shopova 
798a7398723SShteryana Shopova 	return (-1);
799a7398723SShteryana Shopova }
800a7398723SShteryana Shopova 
801a7398723SShteryana Shopova int32_t
802a7398723SShteryana Shopova snmp_lookup_enumstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
803a7398723SShteryana Shopova {
804a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
805a7398723SShteryana Shopova 		return (-1);
806a7398723SShteryana Shopova 
807a7398723SShteryana Shopova 	return (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s));
808a7398723SShteryana Shopova }
809a7398723SShteryana Shopova 
810a7398723SShteryana Shopova int32_t
811a7398723SShteryana Shopova snmp_lookup_oidstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
812a7398723SShteryana Shopova {
813a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
814a7398723SShteryana Shopova 		return (-1);
815a7398723SShteryana Shopova 
816a7398723SShteryana Shopova 	return (snmp_lookuplist_string(&snmptoolctx->snmp_oidlist, s));
817a7398723SShteryana Shopova }
818a7398723SShteryana Shopova 
819a7398723SShteryana Shopova int32_t
820a7398723SShteryana Shopova snmp_lookup_nodestring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
821a7398723SShteryana Shopova {
822a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
823a7398723SShteryana Shopova 		return (-1);
824a7398723SShteryana Shopova 
825a7398723SShteryana Shopova 	return (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s));
826a7398723SShteryana Shopova }
827a7398723SShteryana Shopova 
828a7398723SShteryana Shopova int32_t
829a7398723SShteryana Shopova snmp_lookup_allstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
830a7398723SShteryana Shopova {
831a7398723SShteryana Shopova 	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
832a7398723SShteryana Shopova 		return (-1);
833a7398723SShteryana Shopova 
834a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s) > 0)
835a7398723SShteryana Shopova 		return (1);
836a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s) > 0)
837a7398723SShteryana Shopova 		return (1);
838a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s) > 0)
839a7398723SShteryana Shopova 		return (1);
840a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s) > 0)
841a7398723SShteryana Shopova 		return (1);
842a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s) > 0)
843a7398723SShteryana Shopova 		return (1);
844a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_gaugelist, s) > 0)
845a7398723SShteryana Shopova 		return (1);
846a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_ticklist, s) > 0)
847a7398723SShteryana Shopova 		return (1);
848a7398723SShteryana Shopova 	if (snmp_lookup_leaf(&snmptoolctx->snmp_cnt64list, s) > 0)
849a7398723SShteryana Shopova 		return (1);
850a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0)
851a7398723SShteryana Shopova 		return (1);
852a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0)
853a7398723SShteryana Shopova 		return (1);
854a7398723SShteryana Shopova 
855a7398723SShteryana Shopova 	return (-1);
856a7398723SShteryana Shopova }
857a7398723SShteryana Shopova 
858a7398723SShteryana Shopova int32_t
859a7398723SShteryana Shopova snmp_lookup_nonleaf_string(struct snmp_toolinfo *snmptoolctx,
860a7398723SShteryana Shopova     struct snmp_object *s)
861a7398723SShteryana Shopova {
862a7398723SShteryana Shopova 	if (snmptoolctx == NULL)
863a7398723SShteryana Shopova 		return (-1);
864a7398723SShteryana Shopova 
865a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0)
866a7398723SShteryana Shopova 		return (1);
867a7398723SShteryana Shopova 	if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0)
868a7398723SShteryana Shopova 		return (1);
869a7398723SShteryana Shopova 
870a7398723SShteryana Shopova 	return (-1);
871a7398723SShteryana Shopova }
872a7398723SShteryana Shopova 
873a7398723SShteryana Shopova static int32_t
874a7398723SShteryana Shopova snmp_lookup_oidlist(struct snmp_mapping *hp, struct snmp_object *s, char *oid)
875a7398723SShteryana Shopova {
876a7398723SShteryana Shopova 	struct snmp_oid2str *temp;
877a7398723SShteryana Shopova 
878a7398723SShteryana Shopova 	if (hp == NULL)
879a7398723SShteryana Shopova 		return (-1);
880a7398723SShteryana Shopova 
881a7398723SShteryana Shopova 	SLIST_FOREACH(temp, hp, link) {
882a7398723SShteryana Shopova 		if (temp->strlen != strlen(oid))
883a7398723SShteryana Shopova 			continue;
884a7398723SShteryana Shopova 
885a7398723SShteryana Shopova 		if (strncmp(temp->string, oid, temp->strlen))
886a7398723SShteryana Shopova 			continue;
887a7398723SShteryana Shopova 
888a7398723SShteryana Shopova 		s->val.syntax = temp->syntax;
889a7398723SShteryana Shopova 		s->info = temp;
890a7398723SShteryana Shopova 		asn_append_oid(&(s->val.var), &(temp->var));
891a7398723SShteryana Shopova 		return (1);
892a7398723SShteryana Shopova 	}
893a7398723SShteryana Shopova 
894a7398723SShteryana Shopova 	return (-1);
895a7398723SShteryana Shopova }
896a7398723SShteryana Shopova 
897a7398723SShteryana Shopova static int32_t
898a7398723SShteryana Shopova snmp_lookup_tablelist(struct snmp_toolinfo *snmptoolctx,
899a7398723SShteryana Shopova     struct snmp_table_index *headp, struct snmp_object *s, char *oid)
900a7398723SShteryana Shopova {
901a7398723SShteryana Shopova 	struct snmp_index_entry *temp;
902a7398723SShteryana Shopova 
903a7398723SShteryana Shopova 	if (snmptoolctx == NULL || headp == NULL)
904a7398723SShteryana Shopova 		return (-1);
905a7398723SShteryana Shopova 
906a7398723SShteryana Shopova 	SLIST_FOREACH(temp, headp, link) {
907a7398723SShteryana Shopova 		if (temp->strlen != strlen(oid))
908a7398723SShteryana Shopova 			continue;
909a7398723SShteryana Shopova 
910a7398723SShteryana Shopova 		if (strncmp(temp->string, oid, temp->strlen))
911a7398723SShteryana Shopova 			continue;
912a7398723SShteryana Shopova 
913a7398723SShteryana Shopova 		/*
914a7398723SShteryana Shopova 		 * Another hack here - if we were given a table name
915a7398723SShteryana Shopova 		 * return the corresponding pointer to it's entry.
916a7398723SShteryana Shopova 		 * That should not change the reponce we'll get.
917a7398723SShteryana Shopova 		 */
918a7398723SShteryana Shopova 		s->val.syntax = SNMP_SYNTAX_NULL;
919a7398723SShteryana Shopova 		asn_append_oid(&(s->val.var), &(temp->var));
920a7398723SShteryana Shopova 		if (snmp_lookup_leaf(&snmptoolctx->snmp_nodelist, s) > 0)
921a7398723SShteryana Shopova 			return (1);
922a7398723SShteryana Shopova 		else
923a7398723SShteryana Shopova 			return (-1);
924a7398723SShteryana Shopova 	}
925a7398723SShteryana Shopova 
926a7398723SShteryana Shopova 	return (-1);
927a7398723SShteryana Shopova }
928a7398723SShteryana Shopova 
929a7398723SShteryana Shopova int32_t
930a7398723SShteryana Shopova snmp_lookup_oidall(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
931a7398723SShteryana Shopova     char *oid)
932a7398723SShteryana Shopova {
933a7398723SShteryana Shopova 	if (snmptoolctx == NULL || s == NULL || oid == NULL)
934a7398723SShteryana Shopova 		return (-1);
935a7398723SShteryana Shopova 
936a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist, s, oid) > 0)
937a7398723SShteryana Shopova 		return (1);
938a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist, s, oid) > 0)
939a7398723SShteryana Shopova 		return (1);
940a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist, s, oid) > 0)
941a7398723SShteryana Shopova 		return (1);
942a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist, s, oid) > 0)
943a7398723SShteryana Shopova 		return (1);
944a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist, s, oid) > 0)
945a7398723SShteryana Shopova 		return (1);
946a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist, s, oid) > 0)
947a7398723SShteryana Shopova 		return (1);
948a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist, s, oid) > 0)
949a7398723SShteryana Shopova 		return (1);
950a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list, s, oid) > 0)
951a7398723SShteryana Shopova 		return (1);
952a7398723SShteryana Shopova 	if (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist, s, oid) > 0)
953a7398723SShteryana Shopova 		return (1);
954a7398723SShteryana Shopova 	if (snmp_lookup_tablelist(snmptoolctx, &snmptoolctx->snmp_tablelist,
955a7398723SShteryana Shopova 	    s, oid) > 0)
956a7398723SShteryana Shopova 		return (1);
957a7398723SShteryana Shopova 
958a7398723SShteryana Shopova 	return (-1);
959a7398723SShteryana Shopova }
960a7398723SShteryana Shopova 
961a7398723SShteryana Shopova int32_t
962a7398723SShteryana Shopova snmp_lookup_enumoid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
963a7398723SShteryana Shopova     char *oid)
964a7398723SShteryana Shopova {
965a7398723SShteryana Shopova 	if (snmptoolctx == NULL || s == NULL)
966a7398723SShteryana Shopova 		return (-1);
967a7398723SShteryana Shopova 
968a7398723SShteryana Shopova 	return (snmp_lookup_oidlist(&snmptoolctx->snmp_enumlist, s, oid));
969a7398723SShteryana Shopova }
970a7398723SShteryana Shopova 
971a7398723SShteryana Shopova int32_t
972a7398723SShteryana Shopova snmp_lookup_oid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
973a7398723SShteryana Shopova     char *oid)
974a7398723SShteryana Shopova {
975a7398723SShteryana Shopova 	if (snmptoolctx == NULL || s == NULL)
976a7398723SShteryana Shopova 		return (-1);
977a7398723SShteryana Shopova 
978a7398723SShteryana Shopova 	switch (s->val.syntax) {
979a7398723SShteryana Shopova 		case SNMP_SYNTAX_INTEGER:
980a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist,
981a7398723SShteryana Shopova 			    s, oid));
982a7398723SShteryana Shopova 		case SNMP_SYNTAX_OCTETSTRING:
983a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist,
984a7398723SShteryana Shopova 			    s, oid));
985a7398723SShteryana Shopova 		case SNMP_SYNTAX_OID:
986a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist,
987a7398723SShteryana Shopova 			    s, oid));
988a7398723SShteryana Shopova 		case SNMP_SYNTAX_IPADDRESS:
989a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist,
990a7398723SShteryana Shopova 			    s, oid));
991a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER:
992a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist,
993a7398723SShteryana Shopova 			    s, oid));
994a7398723SShteryana Shopova 		case SNMP_SYNTAX_GAUGE:
995a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist,
996a7398723SShteryana Shopova 			    s, oid));
997a7398723SShteryana Shopova 		case SNMP_SYNTAX_TIMETICKS:
998a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist,
999a7398723SShteryana Shopova 			    s, oid));
1000a7398723SShteryana Shopova 		case SNMP_SYNTAX_COUNTER64:
1001a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list,
1002a7398723SShteryana Shopova 			    s, oid));
1003a7398723SShteryana Shopova 		case SNMP_SYNTAX_NULL:
1004a7398723SShteryana Shopova 			return (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist,
1005a7398723SShteryana Shopova 			    s, oid));
1006a7398723SShteryana Shopova 		default:
1007a7398723SShteryana Shopova 			warnx("Unknown syntax - %d", s->val.syntax);
1008a7398723SShteryana Shopova 			break;
1009a7398723SShteryana Shopova 	}
1010a7398723SShteryana Shopova 
1011a7398723SShteryana Shopova 	return (-1);
1012a7398723SShteryana Shopova }
1013