1216295Ssyrinx/*-
2216295Ssyrinx * Copyright (c) 2006 The FreeBSD Project
3216295Ssyrinx * All rights reserved.
4216295Ssyrinx *
5216295Ssyrinx * Author: Shteryana Shopova <syrinx@FreeBSD.org>
6216295Ssyrinx *
7216295Ssyrinx * Redistribution of this software and documentation and use in source and
8216295Ssyrinx * binary forms, with or without modification, are permitted provided that
9216295Ssyrinx * the following conditions are met:
10216295Ssyrinx *
11216295Ssyrinx * 1. Redistributions of source code or documentation must retain the above
12216295Ssyrinx *    copyright notice, this list of conditions and the following disclaimer.
13216295Ssyrinx * 2. Redistributions in binary form must reproduce the above copyright
14216295Ssyrinx *    notice, this list of conditions and the following disclaimer in the
15216295Ssyrinx *    documentation and/or other materials provided with the distribution.
16216295Ssyrinx *
17216295Ssyrinx * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18216295Ssyrinx * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19216295Ssyrinx * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20216295Ssyrinx * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21216295Ssyrinx * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22216295Ssyrinx * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23216295Ssyrinx * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24216295Ssyrinx * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25216295Ssyrinx * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26216295Ssyrinx * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27216295Ssyrinx * SUCH DAMAGE.
28216295Ssyrinx *
29216295Ssyrinx * $FreeBSD: releng/10.3/usr.sbin/bsnmpd/tools/libbsnmptools/bsnmpmap.c 229385 2012-01-03 11:10:15Z ed $
30216295Ssyrinx */
31216295Ssyrinx
32216295Ssyrinx#include <sys/param.h>
33216295Ssyrinx#include <sys/queue.h>
34216295Ssyrinx#include <sys/uio.h>
35216295Ssyrinx
36216295Ssyrinx#include <ctype.h>
37216295Ssyrinx#include <err.h>
38216295Ssyrinx#include <errno.h>
39216295Ssyrinx#include <stdio.h>
40216295Ssyrinx#include <stdlib.h>
41216295Ssyrinx#include <string.h>
42216295Ssyrinx#include <syslog.h>
43216295Ssyrinx#include <unistd.h>
44216295Ssyrinx
45216295Ssyrinx#include <bsnmp/asn1.h>
46216295Ssyrinx#include <bsnmp/snmp.h>
47216295Ssyrinx#include "bsnmptc.h"
48216295Ssyrinx#include "bsnmptools.h"
49216295Ssyrinx
50216295Ssyrinxextern int _bsnmptools_debug;
51216295Ssyrinx#define	DEBUG	if (_bsnmptools_debug) fprintf
52216295Ssyrinx
53216295Ssyrinx/* Allocate memory and initialize list. */
54216295Ssyrinxstruct snmp_mappings *
55216295Ssyrinxsnmp_mapping_init(void)
56216295Ssyrinx{
57216295Ssyrinx	struct snmp_mappings *m;
58216295Ssyrinx
59216295Ssyrinx	if ((m = malloc(sizeof(struct snmp_mappings))) == NULL) {
60216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
61216295Ssyrinx		return (NULL);
62216295Ssyrinx	}
63216295Ssyrinx
64216295Ssyrinx	memset(m, 0, sizeof(struct snmp_mappings));
65216295Ssyrinx	return (m);
66216295Ssyrinx}
67216295Ssyrinx
68216295Ssyrinx#define		snmp_nodelist	mappings->nodelist
69216295Ssyrinx#define		snmp_intlist	mappings->intlist
70216295Ssyrinx#define		snmp_octlist	mappings->octlist
71216295Ssyrinx#define		snmp_oidlist	mappings->oidlist
72216295Ssyrinx#define		snmp_iplist	mappings->iplist
73216295Ssyrinx#define		snmp_ticklist	mappings->ticklist
74216295Ssyrinx#define		snmp_cntlist	mappings->cntlist
75216295Ssyrinx#define		snmp_gaugelist	mappings->gaugelist
76216295Ssyrinx#define		snmp_cnt64list	mappings->cnt64list
77216295Ssyrinx#define		snmp_enumlist	mappings->enumlist
78216295Ssyrinx#define		snmp_tablelist	mappings->tablelist
79216295Ssyrinx#define		snmp_tclist	mappings->tclist
80216295Ssyrinx
81216295Ssyrinxvoid
82216295Ssyrinxenum_pairs_free(struct enum_pairs *headp)
83216295Ssyrinx{
84216295Ssyrinx	struct enum_pair *e;
85216295Ssyrinx
86216295Ssyrinx	if (headp == NULL)
87216295Ssyrinx		return;
88216295Ssyrinx
89216295Ssyrinx	while ((e = STAILQ_FIRST(headp)) != NULL) {
90216295Ssyrinx		STAILQ_REMOVE_HEAD(headp, link);
91216295Ssyrinx
92216295Ssyrinx		if (e->enum_str)
93216295Ssyrinx			free(e->enum_str);
94216295Ssyrinx		free(e);
95216295Ssyrinx	}
96216295Ssyrinx
97216295Ssyrinx	free(headp);
98216295Ssyrinx}
99216295Ssyrinx
100216295Ssyrinxvoid
101216295Ssyrinxsnmp_mapping_entryfree(struct snmp_oid2str *entry)
102216295Ssyrinx{
103216295Ssyrinx	if (entry->string)
104216295Ssyrinx		free(entry->string);
105216295Ssyrinx
106216295Ssyrinx	if (entry->tc == SNMP_TC_OWN)
107216295Ssyrinx		enum_pairs_free(entry->snmp_enum);
108216295Ssyrinx
109216295Ssyrinx	free(entry);
110216295Ssyrinx}
111216295Ssyrinx
112216295Ssyrinxstatic void
113216295Ssyrinxsnmp_mapping_listfree(struct snmp_mapping *headp)
114216295Ssyrinx{
115216295Ssyrinx	struct snmp_oid2str *p;
116216295Ssyrinx
117216295Ssyrinx	while ((p = SLIST_FIRST(headp)) != NULL) {
118216295Ssyrinx		SLIST_REMOVE_HEAD(headp, link);
119216295Ssyrinx
120216295Ssyrinx		if (p->string)
121216295Ssyrinx			free(p->string);
122216295Ssyrinx
123216295Ssyrinx		if (p->tc == SNMP_TC_OWN)
124216295Ssyrinx			enum_pairs_free(p->snmp_enum);
125216295Ssyrinx		free(p);
126216295Ssyrinx	}
127216295Ssyrinx
128216295Ssyrinx	SLIST_INIT(headp);
129216295Ssyrinx}
130216295Ssyrinx
131216295Ssyrinxvoid
132216295Ssyrinxsnmp_index_listfree(struct snmp_idxlist *headp)
133216295Ssyrinx{
134216295Ssyrinx	struct index *i;
135216295Ssyrinx
136216295Ssyrinx	while ((i = STAILQ_FIRST(headp)) != NULL) {
137216295Ssyrinx		STAILQ_REMOVE_HEAD(headp, link);
138216295Ssyrinx		if (i->tc == SNMP_TC_OWN)
139216295Ssyrinx			enum_pairs_free(i->snmp_enum);
140216295Ssyrinx		free(i);
141216295Ssyrinx	}
142216295Ssyrinx
143216295Ssyrinx	STAILQ_INIT(headp);
144216295Ssyrinx}
145216295Ssyrinx
146216295Ssyrinxstatic void
147216295Ssyrinxsnmp_mapping_table_listfree(struct snmp_table_index *headp)
148216295Ssyrinx{
149216295Ssyrinx	struct snmp_index_entry *t;
150216295Ssyrinx
151216295Ssyrinx	while ((t = SLIST_FIRST(headp)) != NULL) {
152216295Ssyrinx		SLIST_REMOVE_HEAD(headp, link);
153216295Ssyrinx
154216295Ssyrinx		if (t->string)
155216295Ssyrinx			free(t->string);
156216295Ssyrinx
157216295Ssyrinx		snmp_index_listfree(&(t->index_list));
158216295Ssyrinx		free(t);
159216295Ssyrinx	}
160216295Ssyrinx}
161216295Ssyrinx
162216295Ssyrinxstatic void
163216295Ssyrinxsnmp_enumtc_listfree(struct snmp_enum_tc *headp)
164216295Ssyrinx{
165216295Ssyrinx	struct enum_type *t;
166216295Ssyrinx
167216295Ssyrinx	while ((t = SLIST_FIRST(headp)) != NULL) {
168216295Ssyrinx		SLIST_REMOVE_HEAD(headp, link);
169216295Ssyrinx
170216295Ssyrinx		if (t->name)
171216295Ssyrinx			free(t->name);
172216295Ssyrinx		enum_pairs_free(t->snmp_enum);
173216295Ssyrinx		free(t);
174216295Ssyrinx	}
175216295Ssyrinx}
176216295Ssyrinx
177216295Ssyrinxint
178216295Ssyrinxsnmp_mapping_free(struct snmp_toolinfo *snmptoolctx)
179216295Ssyrinx{
180216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
181216295Ssyrinx		return (-1);
182216295Ssyrinx
183216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_nodelist);
184216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_intlist);
185216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_octlist);
186216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_oidlist);
187216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_iplist);
188216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_ticklist);
189216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_cntlist);
190216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_gaugelist);
191216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_cnt64list);
192216295Ssyrinx	snmp_mapping_listfree(&snmptoolctx->snmp_enumlist);
193216295Ssyrinx	snmp_mapping_table_listfree(&snmptoolctx->snmp_tablelist);
194216295Ssyrinx	snmp_enumtc_listfree(&snmptoolctx->snmp_tclist);
195216295Ssyrinx	free(snmptoolctx->mappings);
196216295Ssyrinx
197216295Ssyrinx	return (0);
198216295Ssyrinx}
199216295Ssyrinx
200216295Ssyrinxstatic void
201216295Ssyrinxsnmp_dump_enumpairs(struct enum_pairs *headp)
202216295Ssyrinx{
203216295Ssyrinx	struct enum_pair *entry;
204216295Ssyrinx
205216295Ssyrinx	if (headp == NULL)
206216295Ssyrinx		return;
207216295Ssyrinx
208216295Ssyrinx	fprintf(stderr,"enums: ");
209216295Ssyrinx	STAILQ_FOREACH(entry, headp, link)
210216295Ssyrinx		fprintf(stderr,"%d - %s, ", entry->enum_val,
211216295Ssyrinx		    (entry->enum_str == NULL)?"NULL":entry->enum_str);
212216295Ssyrinx
213216295Ssyrinx	fprintf(stderr,"; ");
214216295Ssyrinx}
215216295Ssyrinx
216216295Ssyrinxvoid
217216295Ssyrinxsnmp_dump_oid2str(struct snmp_oid2str *entry)
218216295Ssyrinx{
219216295Ssyrinx	char buf[ASN_OIDSTRLEN];
220216295Ssyrinx
221216295Ssyrinx	if (entry != NULL) {
222216295Ssyrinx		memset(buf, 0, sizeof(buf));
223216295Ssyrinx		asn_oid2str_r(&(entry->var), buf);
224216295Ssyrinx		DEBUG(stderr, "%s - %s - %d - %d - %d", buf, entry->string,
225216295Ssyrinx		    entry->syntax, entry->access, entry->strlen);
226216295Ssyrinx		snmp_dump_enumpairs(entry->snmp_enum);
227216295Ssyrinx		DEBUG(stderr,"%s \n", (entry->table_idx == NULL)?"No table":
228216295Ssyrinx		    entry->table_idx->string);
229216295Ssyrinx	}
230216295Ssyrinx}
231216295Ssyrinx
232216295Ssyrinxstatic void
233216295Ssyrinxsnmp_dump_indexlist(struct snmp_idxlist *headp)
234216295Ssyrinx{
235216295Ssyrinx	struct index *entry;
236216295Ssyrinx
237216295Ssyrinx	if (headp == NULL)
238216295Ssyrinx		return;
239216295Ssyrinx
240216295Ssyrinx	STAILQ_FOREACH(entry, headp, link) {
241216295Ssyrinx		fprintf(stderr,"%d, ", entry->syntax);
242216295Ssyrinx		snmp_dump_enumpairs(entry->snmp_enum);
243216295Ssyrinx	}
244216295Ssyrinx
245216295Ssyrinx	fprintf(stderr,"\n");
246216295Ssyrinx}
247216295Ssyrinx
248216295Ssyrinx/* Initialize the enum pairs list of a oid2str entry. */
249216295Ssyrinxstruct enum_pairs *
250216295Ssyrinxenum_pairs_init(void)
251216295Ssyrinx{
252216295Ssyrinx	struct enum_pairs *snmp_enum;
253216295Ssyrinx
254216295Ssyrinx	if ((snmp_enum = malloc(sizeof(struct enum_pairs))) == NULL) {
255216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
256216295Ssyrinx		return (NULL);
257216295Ssyrinx	}
258216295Ssyrinx
259216295Ssyrinx	STAILQ_INIT(snmp_enum);
260216295Ssyrinx	return (snmp_enum);
261216295Ssyrinx}
262216295Ssyrinx
263216295Ssyrinx/*
264216295Ssyrinx * Given a number and string, allocate memory for a (int, string) pair and add
265216295Ssyrinx * it to the given oid2str mapping entry's enum pairs list.
266216295Ssyrinx */
267216295Ssyrinxint32_t
268216295Ssyrinxenum_pair_insert(struct enum_pairs *headp, int32_t enum_val, char *enum_str)
269216295Ssyrinx{
270216295Ssyrinx	struct enum_pair *e_new;
271216295Ssyrinx
272216295Ssyrinx	if ((e_new = malloc(sizeof(struct enum_pair))) == NULL) {
273216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
274216295Ssyrinx		return (-1);
275216295Ssyrinx	}
276216295Ssyrinx
277216295Ssyrinx	memset(e_new, 0, sizeof(struct enum_pair));
278216295Ssyrinx
279216295Ssyrinx	if ((e_new->enum_str = malloc(strlen(enum_str) + 1)) == NULL) {
280216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
281216295Ssyrinx		free(e_new);
282216295Ssyrinx		return (-1);
283216295Ssyrinx	}
284216295Ssyrinx
285216295Ssyrinx	e_new->enum_val = enum_val;
286216295Ssyrinx	strlcpy(e_new->enum_str, enum_str, strlen(enum_str) + 1);
287216295Ssyrinx	STAILQ_INSERT_TAIL(headp, e_new, link);
288216295Ssyrinx
289216295Ssyrinx	return (1);
290216295Ssyrinx
291216295Ssyrinx}
292216295Ssyrinx
293216295Ssyrinx/*
294216295Ssyrinx * Insert an entry in a list - entries are lexicographicaly order by asn_oid.
295216295Ssyrinx * Returns 1 on success, -1 if list is not initialized, 0 if a matching oid already
296216295Ssyrinx * exists. Error cheking is left to calling function.
297216295Ssyrinx */
298216295Ssyrinxstatic int
299216295Ssyrinxsnmp_mapping_insert(struct snmp_mapping *headp, struct snmp_oid2str *entry)
300216295Ssyrinx{
301216295Ssyrinx	int32_t rc;
302216295Ssyrinx	struct snmp_oid2str *temp, *prev;
303216295Ssyrinx
304216295Ssyrinx	if (entry == NULL)
305216295Ssyrinx		return(-1);
306216295Ssyrinx
307216295Ssyrinx	if ((prev = SLIST_FIRST(headp)) == NULL ||
308216295Ssyrinx	    asn_compare_oid(&(entry->var), &(prev->var)) < 0) {
309216295Ssyrinx		SLIST_INSERT_HEAD(headp, entry, link);
310216295Ssyrinx		return (1);
311216295Ssyrinx	} else
312216295Ssyrinx		rc = -1;	/* Make the compiler happy. */
313216295Ssyrinx
314216295Ssyrinx	SLIST_FOREACH(temp, headp, link) {
315216295Ssyrinx		if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0)
316216295Ssyrinx			break;
317216295Ssyrinx		prev = temp;
318216295Ssyrinx		rc = -1;
319216295Ssyrinx	}
320216295Ssyrinx
321216295Ssyrinx	switch (rc) {
322216295Ssyrinx	    case 0:
323216295Ssyrinx		/* Ops, matching OIDs - hope the rest info also matches. */
324216295Ssyrinx		if (strncmp(temp->string, entry->string, entry->strlen)) {
325216295Ssyrinx			syslog(LOG_INFO, "Matching OIDs with different string "
326216295Ssyrinx			    "mappings: old - %s, new - %s", temp->string,
327216295Ssyrinx			    entry->string);
328216295Ssyrinx			return (-1);
329216295Ssyrinx		}
330216295Ssyrinx		/*
331216295Ssyrinx		 * Ok, we have that already.
332216295Ssyrinx		 * As long as the strings match - don't complain.
333216295Ssyrinx		 */
334216295Ssyrinx		return (0);
335216295Ssyrinx
336216295Ssyrinx	    case 1:
337216295Ssyrinx		SLIST_INSERT_AFTER(temp, entry, link);
338216295Ssyrinx		break;
339216295Ssyrinx
340216295Ssyrinx	    case -1:
341216295Ssyrinx		SLIST_INSERT_AFTER(prev, entry, link);
342216295Ssyrinx		break;
343216295Ssyrinx
344216295Ssyrinx	    default:
345216295Ssyrinx		/* NOTREACHED */
346216295Ssyrinx		return (-1);
347216295Ssyrinx	}
348216295Ssyrinx
349216295Ssyrinx	return (1);
350216295Ssyrinx}
351216295Ssyrinx
352216295Ssyrinxint32_t
353216295Ssyrinxsnmp_node_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
354216295Ssyrinx{
355216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
356216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_nodelist,entry));
357216295Ssyrinx
358216295Ssyrinx	return (-1);
359216295Ssyrinx}
360216295Ssyrinx
361216295Ssyrinxstatic int32_t
362216295Ssyrinxsnmp_int_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
363216295Ssyrinx{
364216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
365216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_intlist,entry));
366216295Ssyrinx
367216295Ssyrinx	return (-1);
368216295Ssyrinx}
369216295Ssyrinx
370216295Ssyrinxstatic int32_t
371216295Ssyrinxsnmp_oct_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
372216295Ssyrinx{
373216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
374216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_octlist,entry));
375216295Ssyrinx
376216295Ssyrinx	return (-1);
377216295Ssyrinx}
378216295Ssyrinx
379216295Ssyrinxstatic int32_t
380216295Ssyrinxsnmp_oid_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
381216295Ssyrinx{
382216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
383216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_oidlist,entry));
384216295Ssyrinx
385216295Ssyrinx	return (-1);
386216295Ssyrinx}
387216295Ssyrinx
388216295Ssyrinxstatic int32_t
389216295Ssyrinxsnmp_ip_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
390216295Ssyrinx{
391216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
392216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_iplist,entry));
393216295Ssyrinx
394216295Ssyrinx	return (-1);
395216295Ssyrinx}
396216295Ssyrinx
397216295Ssyrinxstatic int32_t
398216295Ssyrinxsnmp_tick_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
399216295Ssyrinx{
400216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
401216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_ticklist,entry));
402216295Ssyrinx
403216295Ssyrinx	return (-1);
404216295Ssyrinx}
405216295Ssyrinx
406216295Ssyrinxstatic int32_t
407216295Ssyrinxsnmp_cnt_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
408216295Ssyrinx{
409216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
410216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_cntlist,entry));
411216295Ssyrinx
412216295Ssyrinx	return (-1);
413216295Ssyrinx}
414216295Ssyrinx
415216295Ssyrinxstatic int32_t
416216295Ssyrinxsnmp_gauge_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
417216295Ssyrinx{
418216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
419216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_gaugelist,entry));
420216295Ssyrinx
421216295Ssyrinx	return (-1);
422216295Ssyrinx}
423216295Ssyrinx
424216295Ssyrinxstatic int32_t
425216295Ssyrinxsnmp_cnt64_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
426216295Ssyrinx{
427216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
428216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_cnt64list,entry));
429216295Ssyrinx
430216295Ssyrinx	return (-1);
431216295Ssyrinx}
432216295Ssyrinx
433216295Ssyrinxint32_t
434216295Ssyrinxsnmp_enum_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
435216295Ssyrinx{
436216295Ssyrinx	if (snmptoolctx != NULL && snmptoolctx->mappings)
437216295Ssyrinx		return (snmp_mapping_insert(&snmptoolctx->snmp_enumlist,entry));
438216295Ssyrinx
439216295Ssyrinx	return (-1);
440216295Ssyrinx}
441216295Ssyrinx
442216295Ssyrinxint32_t
443216295Ssyrinxsnmp_leaf_insert(struct snmp_toolinfo *snmptoolctx, struct snmp_oid2str *entry)
444216295Ssyrinx{
445216295Ssyrinx	switch (entry->syntax) {
446216295Ssyrinx		case SNMP_SYNTAX_INTEGER:
447216295Ssyrinx			return (snmp_int_insert(snmptoolctx, entry));
448216295Ssyrinx		case SNMP_SYNTAX_OCTETSTRING:
449216295Ssyrinx			return (snmp_oct_insert(snmptoolctx, entry));
450216295Ssyrinx		case SNMP_SYNTAX_OID:
451216295Ssyrinx			return (snmp_oid_insert(snmptoolctx, entry));
452216295Ssyrinx		case SNMP_SYNTAX_IPADDRESS:
453216295Ssyrinx			return (snmp_ip_insert(snmptoolctx, entry));
454216295Ssyrinx		case SNMP_SYNTAX_COUNTER:
455216295Ssyrinx			return (snmp_cnt_insert(snmptoolctx, entry));
456216295Ssyrinx		case SNMP_SYNTAX_GAUGE:
457216295Ssyrinx			return (snmp_gauge_insert(snmptoolctx, entry));
458216295Ssyrinx		case SNMP_SYNTAX_TIMETICKS:
459216295Ssyrinx			return (snmp_tick_insert(snmptoolctx, entry));
460216295Ssyrinx		case SNMP_SYNTAX_COUNTER64:
461216295Ssyrinx			return (snmp_cnt64_insert(snmptoolctx, entry));
462216295Ssyrinx		default:
463216295Ssyrinx			break;
464216295Ssyrinx	}
465216295Ssyrinx
466216295Ssyrinx	return (-1);
467216295Ssyrinx}
468216295Ssyrinx
469216295Ssyrinxstatic int32_t
470216295Ssyrinxsnmp_index_insert(struct snmp_idxlist *headp, struct index *idx)
471216295Ssyrinx{
472229385Sed	if (headp == NULL || idx == NULL)
473216295Ssyrinx		return (-1);
474216295Ssyrinx
475216295Ssyrinx	STAILQ_INSERT_TAIL(headp, idx, link);
476216295Ssyrinx	return (1);
477216295Ssyrinx}
478216295Ssyrinx
479216295Ssyrinxint32_t
480216295Ssyrinxsnmp_syntax_insert(struct snmp_idxlist *headp, struct enum_pairs *enums,
481216295Ssyrinx    enum snmp_syntax syntax, enum snmp_tc tc)
482216295Ssyrinx{
483216295Ssyrinx	struct index *idx;
484216295Ssyrinx
485216295Ssyrinx	if ((idx = malloc(sizeof(struct index))) == NULL) {
486216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
487216295Ssyrinx		return (-1);
488216295Ssyrinx	}
489216295Ssyrinx
490216295Ssyrinx	memset(idx, 0, sizeof(struct index));
491216295Ssyrinx
492216295Ssyrinx	if (snmp_index_insert(headp, idx) < 0) {
493216295Ssyrinx		free(idx);
494216295Ssyrinx		return (-1);
495216295Ssyrinx	}
496216295Ssyrinx
497216295Ssyrinx	idx->syntax = syntax;
498216295Ssyrinx	idx->snmp_enum = enums;
499216295Ssyrinx	idx->tc = tc;
500216295Ssyrinx
501216295Ssyrinx	return (1);
502216295Ssyrinx}
503216295Ssyrinx
504216295Ssyrinxint32_t
505216295Ssyrinxsnmp_table_insert(struct snmp_toolinfo *snmptoolctx,
506216295Ssyrinx    struct snmp_index_entry *entry)
507216295Ssyrinx{
508216295Ssyrinx	int32_t rc;
509216295Ssyrinx	struct snmp_index_entry *temp, *prev;
510216295Ssyrinx
511216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL ||
512216295Ssyrinx	    entry == NULL)
513216295Ssyrinx		return(-1);
514216295Ssyrinx
515216295Ssyrinx	if ((prev = SLIST_FIRST(&snmptoolctx->snmp_tablelist)) == NULL ||
516216295Ssyrinx	    asn_compare_oid(&(entry->var), &(prev->var)) < 0) {
517216295Ssyrinx		SLIST_INSERT_HEAD(&snmptoolctx->snmp_tablelist, entry, link);
518216295Ssyrinx		return (1);
519216295Ssyrinx	} else
520216295Ssyrinx		rc = -1;	/* Make the compiler happy. */
521216295Ssyrinx
522216295Ssyrinx	SLIST_FOREACH(temp, &snmptoolctx->snmp_tablelist, link) {
523216295Ssyrinx		if ((rc = asn_compare_oid(&(entry->var), &(temp->var))) <= 0)
524216295Ssyrinx			break;
525216295Ssyrinx		prev = temp;
526216295Ssyrinx		rc = -1;
527216295Ssyrinx	}
528216295Ssyrinx
529216295Ssyrinx	switch (rc) {
530216295Ssyrinx	    case 0:
531216295Ssyrinx		/* Ops, matching OIDs - hope the rest info also matches. */
532216295Ssyrinx		if (strncmp(temp->string, entry->string, entry->strlen)) {
533216295Ssyrinx			syslog(LOG_INFO, "Matching OIDs with different string "
534216295Ssyrinx			    "mapping - old - %s, new - %s", temp->string,
535216295Ssyrinx			    entry->string);
536216295Ssyrinx			return (-1);
537216295Ssyrinx		}
538216295Ssyrinx		return(0);
539216295Ssyrinx
540216295Ssyrinx	    case 1:
541216295Ssyrinx		SLIST_INSERT_AFTER(temp, entry, link);
542216295Ssyrinx		break;
543216295Ssyrinx
544216295Ssyrinx	    case -1:
545216295Ssyrinx		SLIST_INSERT_AFTER(prev, entry, link);
546216295Ssyrinx		break;
547216295Ssyrinx
548216295Ssyrinx	    default:
549216295Ssyrinx		/* NOTREACHED */
550216295Ssyrinx		return (-1);
551216295Ssyrinx	}
552216295Ssyrinx
553216295Ssyrinx	return (1);
554216295Ssyrinx}
555216295Ssyrinx
556216295Ssyrinxstruct enum_type *
557216295Ssyrinxsnmp_enumtc_init(char *name)
558216295Ssyrinx{
559216295Ssyrinx	struct enum_type *enum_tc;
560216295Ssyrinx
561216295Ssyrinx	if ((enum_tc = malloc(sizeof(struct enum_type))) == NULL) {
562216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
563216295Ssyrinx		return (NULL);
564216295Ssyrinx	}
565216295Ssyrinx
566216295Ssyrinx	memset(enum_tc, 0, sizeof(struct enum_type));
567216295Ssyrinx	if ((enum_tc->name = malloc(strlen(name) + 1)) == NULL) {
568216295Ssyrinx		syslog(LOG_ERR, "malloc() failed: %s", strerror(errno));
569216295Ssyrinx		free(enum_tc);
570216295Ssyrinx		return (NULL);
571216295Ssyrinx	}
572216295Ssyrinx	strlcpy(enum_tc->name, name, strlen(name) + 1);
573216295Ssyrinx
574216295Ssyrinx	return (enum_tc);
575216295Ssyrinx}
576216295Ssyrinx
577216295Ssyrinxvoid
578216295Ssyrinxsnmp_enumtc_free(struct enum_type *tc)
579216295Ssyrinx{
580216295Ssyrinx	if (tc->name)
581216295Ssyrinx		free(tc->name);
582216295Ssyrinx	if (tc->snmp_enum)
583216295Ssyrinx		enum_pairs_free(tc->snmp_enum);
584216295Ssyrinx	free(tc);
585216295Ssyrinx}
586216295Ssyrinx
587216295Ssyrinxvoid
588216295Ssyrinxsnmp_enumtc_insert(struct snmp_toolinfo *snmptoolctx, struct enum_type *entry)
589216295Ssyrinx{
590216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
591216295Ssyrinx		return;	/* XXX no error handling? */
592216295Ssyrinx
593216295Ssyrinx	SLIST_INSERT_HEAD(&snmptoolctx->snmp_tclist, entry, link);
594216295Ssyrinx}
595216295Ssyrinx
596216295Ssyrinxstruct enum_type *
597216295Ssyrinxsnmp_enumtc_lookup(struct snmp_toolinfo *snmptoolctx, char *name)
598216295Ssyrinx{
599216295Ssyrinx	struct enum_type *temp;
600216295Ssyrinx
601216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
602216295Ssyrinx		return (NULL);
603216295Ssyrinx
604216295Ssyrinx	SLIST_FOREACH(temp, &snmptoolctx->snmp_tclist, link) {
605216295Ssyrinx		if (strcmp(temp->name, name) == 0)
606216295Ssyrinx			return (temp);
607216295Ssyrinx	}
608216295Ssyrinx	return (NULL);
609216295Ssyrinx}
610216295Ssyrinx
611216295Ssyrinxstatic void
612216295Ssyrinxsnmp_mapping_dumplist(struct snmp_mapping *headp)
613216295Ssyrinx{
614216295Ssyrinx	char buf[ASN_OIDSTRLEN];
615216295Ssyrinx	struct snmp_oid2str *entry;
616216295Ssyrinx
617216295Ssyrinx	if (headp == NULL)
618216295Ssyrinx		return;
619216295Ssyrinx
620216295Ssyrinx	SLIST_FOREACH(entry,headp,link) {
621216295Ssyrinx		memset(buf, 0, sizeof(buf));
622216295Ssyrinx		asn_oid2str_r(&(entry->var), buf);
623216295Ssyrinx		fprintf(stderr, "%s - %s - %d - %d - %d", buf, entry->string,
624216295Ssyrinx		    entry->syntax, entry->access ,entry->strlen);
625216295Ssyrinx		fprintf(stderr," - %s \n", (entry->table_idx == NULL)?
626216295Ssyrinx		    "No table":entry->table_idx->string);
627216295Ssyrinx	}
628216295Ssyrinx}
629216295Ssyrinx
630216295Ssyrinxstatic void
631216295Ssyrinxsnmp_mapping_dumptable(struct snmp_table_index *headp)
632216295Ssyrinx{
633216295Ssyrinx	char buf[ASN_OIDSTRLEN];
634216295Ssyrinx	struct snmp_index_entry *entry;
635216295Ssyrinx
636216295Ssyrinx	if (headp == NULL)
637216295Ssyrinx		return;
638216295Ssyrinx
639216295Ssyrinx	SLIST_FOREACH(entry, headp, link) {
640216295Ssyrinx		memset(buf, 0, sizeof(buf));
641216295Ssyrinx		asn_oid2str_r(&(entry->var), buf);
642216295Ssyrinx		fprintf(stderr,"%s - %s - %d - ", buf, entry->string,
643216295Ssyrinx		    entry->strlen);
644216295Ssyrinx		snmp_dump_indexlist(&(entry->index_list));
645216295Ssyrinx	}
646216295Ssyrinx}
647216295Ssyrinx
648216295Ssyrinxvoid
649216295Ssyrinxsnmp_mapping_dump(struct snmp_toolinfo *snmptoolctx /* int bits */)
650216295Ssyrinx{
651216295Ssyrinx	if (!_bsnmptools_debug)
652216295Ssyrinx		return;
653216295Ssyrinx
654216295Ssyrinx	if (snmptoolctx == NULL) {
655216295Ssyrinx		fprintf(stderr,"No snmptool context!\n");
656216295Ssyrinx		return;
657216295Ssyrinx	}
658216295Ssyrinx
659216295Ssyrinx	if (snmptoolctx->mappings == NULL) {
660216295Ssyrinx		fprintf(stderr,"No mappings!\n");
661216295Ssyrinx		return;
662216295Ssyrinx	}
663216295Ssyrinx
664216295Ssyrinx	fprintf(stderr,"snmp_nodelist:\n");
665216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_nodelist);
666216295Ssyrinx
667216295Ssyrinx	fprintf(stderr,"snmp_intlist:\n");
668216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_intlist);
669216295Ssyrinx
670216295Ssyrinx	fprintf(stderr,"snmp_octlist:\n");
671216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_octlist);
672216295Ssyrinx
673216295Ssyrinx	fprintf(stderr,"snmp_oidlist:\n");
674216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_oidlist);
675216295Ssyrinx
676216295Ssyrinx	fprintf(stderr,"snmp_iplist:\n");
677216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_iplist);
678216295Ssyrinx
679216295Ssyrinx	fprintf(stderr,"snmp_ticklist:\n");
680216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_ticklist);
681216295Ssyrinx
682216295Ssyrinx	fprintf(stderr,"snmp_cntlist:\n");
683216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_cntlist);
684216295Ssyrinx
685216295Ssyrinx	fprintf(stderr,"snmp_gaugelist:\n");
686216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_gaugelist);
687216295Ssyrinx
688216295Ssyrinx	fprintf(stderr,"snmp_cnt64list:\n");
689216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_cnt64list);
690216295Ssyrinx
691216295Ssyrinx	fprintf(stderr,"snmp_enumlist:\n");
692216295Ssyrinx	snmp_mapping_dumplist(&snmptoolctx->snmp_enumlist);
693216295Ssyrinx
694216295Ssyrinx	fprintf(stderr,"snmp_tablelist:\n");
695216295Ssyrinx	snmp_mapping_dumptable(&snmptoolctx->snmp_tablelist);
696216295Ssyrinx}
697216295Ssyrinx
698216295Ssyrinxchar *
699216295Ssyrinxenum_string_lookup(struct enum_pairs *headp, int32_t enum_val)
700216295Ssyrinx{
701216295Ssyrinx	struct enum_pair *temp;
702216295Ssyrinx
703216295Ssyrinx	if (headp == NULL)
704216295Ssyrinx		return (NULL);
705216295Ssyrinx
706216295Ssyrinx	STAILQ_FOREACH(temp, headp, link) {
707216295Ssyrinx		if (temp->enum_val == enum_val)
708216295Ssyrinx			return (temp->enum_str);
709216295Ssyrinx	}
710216295Ssyrinx
711216295Ssyrinx	return (NULL);
712216295Ssyrinx}
713216295Ssyrinx
714216295Ssyrinxint32_t
715216295Ssyrinxenum_number_lookup(struct enum_pairs *headp, char *e_str)
716216295Ssyrinx{
717216295Ssyrinx	struct enum_pair *tmp;
718216295Ssyrinx
719216295Ssyrinx	if (headp == NULL)
720216295Ssyrinx		return (-1);
721216295Ssyrinx
722216295Ssyrinx	STAILQ_FOREACH(tmp, headp, link)
723216295Ssyrinx		if (strncmp(tmp->enum_str, e_str, strlen(tmp->enum_str)) == 0)
724216295Ssyrinx			return (tmp->enum_val);
725216295Ssyrinx
726216295Ssyrinx	return (-1);
727216295Ssyrinx}
728216295Ssyrinx
729216295Ssyrinxstatic int32_t
730216295Ssyrinxsnmp_lookuplist_string(struct snmp_mapping *headp, struct snmp_object *s)
731216295Ssyrinx{
732216295Ssyrinx	struct snmp_oid2str *temp;
733216295Ssyrinx
734216295Ssyrinx	if (headp == NULL)
735216295Ssyrinx		return (-1);
736216295Ssyrinx
737216295Ssyrinx	SLIST_FOREACH(temp, headp, link)
738216295Ssyrinx		if (asn_compare_oid(&(temp->var), &(s->val.var)) == 0)
739216295Ssyrinx			break;
740216295Ssyrinx
741216295Ssyrinx	if ((s->info = temp) == NULL)
742216295Ssyrinx		return (-1);
743216295Ssyrinx
744216295Ssyrinx	return (1);
745216295Ssyrinx}
746216295Ssyrinx
747216295Ssyrinx/* provided an asn_oid find the corresponding string for it */
748216295Ssyrinxstatic int32_t
749216295Ssyrinxsnmp_lookup_leaf(struct snmp_mapping *headp, struct snmp_object *s)
750216295Ssyrinx{
751216295Ssyrinx	struct snmp_oid2str *temp;
752216295Ssyrinx
753216295Ssyrinx	if (headp == NULL)
754216295Ssyrinx		return (-1);
755216295Ssyrinx
756216295Ssyrinx	SLIST_FOREACH(temp,headp,link) {
757216295Ssyrinx		if ((asn_compare_oid(&(temp->var), &(s->val.var)) == 0) ||
758216295Ssyrinx		    (asn_is_suboid(&(temp->var), &(s->val.var)))) {
759216295Ssyrinx			s->info = temp;
760216295Ssyrinx			return (1);
761216295Ssyrinx		}
762216295Ssyrinx	}
763216295Ssyrinx
764216295Ssyrinx	return (-1);
765216295Ssyrinx}
766216295Ssyrinx
767216295Ssyrinxint32_t
768216295Ssyrinxsnmp_lookup_leafstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
769216295Ssyrinx{
770216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
771216295Ssyrinx		return (-1);
772216295Ssyrinx
773216295Ssyrinx	switch (s->val.syntax) {
774216295Ssyrinx		case SNMP_SYNTAX_INTEGER:
775216295Ssyrinx			return (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s));
776216295Ssyrinx		case SNMP_SYNTAX_OCTETSTRING:
777216295Ssyrinx			return (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s));
778216295Ssyrinx		case SNMP_SYNTAX_OID:
779216295Ssyrinx			return (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s));
780216295Ssyrinx		case SNMP_SYNTAX_IPADDRESS:
781216295Ssyrinx			return (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s));
782216295Ssyrinx		case SNMP_SYNTAX_COUNTER:
783216295Ssyrinx			return (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s));
784216295Ssyrinx		case SNMP_SYNTAX_GAUGE:
785216295Ssyrinx			return (snmp_lookup_leaf(
786216295Ssyrinx			    &snmptoolctx->snmp_gaugelist, s));
787216295Ssyrinx		case SNMP_SYNTAX_TIMETICKS:
788216295Ssyrinx			return (snmp_lookup_leaf(
789216295Ssyrinx			    &snmptoolctx->snmp_ticklist, s));
790216295Ssyrinx		case SNMP_SYNTAX_COUNTER64:
791216295Ssyrinx			return (snmp_lookup_leaf(
792216295Ssyrinx			    &snmptoolctx->snmp_cnt64list, s));
793216295Ssyrinx		case SNMP_SYNTAX_NOSUCHOBJECT:
794216295Ssyrinx			/* FALLTHROUGH */
795216295Ssyrinx		case SNMP_SYNTAX_NOSUCHINSTANCE:
796216295Ssyrinx			/* FALLTHROUGH */
797216295Ssyrinx		case SNMP_SYNTAX_ENDOFMIBVIEW:
798216295Ssyrinx			return (snmp_lookup_allstring(snmptoolctx, s));
799216295Ssyrinx		default:
800216295Ssyrinx			warnx("Unknown syntax - %d", s->val.syntax);
801216295Ssyrinx			break;
802216295Ssyrinx	}
803216295Ssyrinx
804216295Ssyrinx	return (-1);
805216295Ssyrinx}
806216295Ssyrinx
807216295Ssyrinxint32_t
808216295Ssyrinxsnmp_lookup_enumstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
809216295Ssyrinx{
810216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
811216295Ssyrinx		return (-1);
812216295Ssyrinx
813216295Ssyrinx	return (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s));
814216295Ssyrinx}
815216295Ssyrinx
816216295Ssyrinxint32_t
817216295Ssyrinxsnmp_lookup_oidstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
818216295Ssyrinx{
819216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
820216295Ssyrinx		return (-1);
821216295Ssyrinx
822216295Ssyrinx	return (snmp_lookuplist_string(&snmptoolctx->snmp_oidlist, s));
823216295Ssyrinx}
824216295Ssyrinx
825216295Ssyrinxint32_t
826216295Ssyrinxsnmp_lookup_nodestring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
827216295Ssyrinx{
828216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL || s == NULL)
829216295Ssyrinx		return (-1);
830216295Ssyrinx
831216295Ssyrinx	return (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s));
832216295Ssyrinx}
833216295Ssyrinx
834216295Ssyrinxint32_t
835216295Ssyrinxsnmp_lookup_allstring(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s)
836216295Ssyrinx{
837216295Ssyrinx	if (snmptoolctx == NULL || snmptoolctx->mappings == NULL)
838216295Ssyrinx		return (-1);
839216295Ssyrinx
840216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_intlist, s) > 0)
841216295Ssyrinx		return (1);
842216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_octlist, s) > 0)
843216295Ssyrinx		return (1);
844216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_oidlist, s) > 0)
845216295Ssyrinx		return (1);
846216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_iplist, s) > 0)
847216295Ssyrinx		return (1);
848216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_cntlist, s) > 0)
849216295Ssyrinx		return (1);
850216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_gaugelist, s) > 0)
851216295Ssyrinx		return (1);
852216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_ticklist, s) > 0)
853216295Ssyrinx		return (1);
854216295Ssyrinx	if (snmp_lookup_leaf(&snmptoolctx->snmp_cnt64list, s) > 0)
855216295Ssyrinx		return (1);
856216295Ssyrinx	if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0)
857216295Ssyrinx		return (1);
858216295Ssyrinx	if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0)
859216295Ssyrinx		return (1);
860216295Ssyrinx
861216295Ssyrinx	return (-1);
862216295Ssyrinx}
863216295Ssyrinx
864216295Ssyrinxint32_t
865216295Ssyrinxsnmp_lookup_nonleaf_string(struct snmp_toolinfo *snmptoolctx,
866216295Ssyrinx    struct snmp_object *s)
867216295Ssyrinx{
868216295Ssyrinx	if (snmptoolctx == NULL)
869216295Ssyrinx		return (-1);
870216295Ssyrinx
871216295Ssyrinx	if (snmp_lookuplist_string(&snmptoolctx->snmp_nodelist, s) > 0)
872216295Ssyrinx		return (1);
873216295Ssyrinx	if (snmp_lookuplist_string(&snmptoolctx->snmp_enumlist, s) > 0)
874216295Ssyrinx		return (1);
875216295Ssyrinx
876216295Ssyrinx	return (-1);
877216295Ssyrinx}
878216295Ssyrinx
879216295Ssyrinxstatic int32_t
880216295Ssyrinxsnmp_lookup_oidlist(struct snmp_mapping *hp, struct snmp_object *s, char *oid)
881216295Ssyrinx{
882216295Ssyrinx	struct snmp_oid2str *temp;
883216295Ssyrinx
884216295Ssyrinx	if (hp == NULL)
885216295Ssyrinx		return (-1);
886216295Ssyrinx
887216295Ssyrinx	SLIST_FOREACH(temp, hp, link) {
888216295Ssyrinx		if (temp->strlen != strlen(oid))
889216295Ssyrinx			continue;
890216295Ssyrinx
891216295Ssyrinx		if (strncmp(temp->string, oid, temp->strlen))
892216295Ssyrinx			continue;
893216295Ssyrinx
894216295Ssyrinx		s->val.syntax = temp->syntax;
895216295Ssyrinx		s->info = temp;
896216295Ssyrinx		asn_append_oid(&(s->val.var), &(temp->var));
897216295Ssyrinx		return (1);
898216295Ssyrinx	}
899216295Ssyrinx
900216295Ssyrinx	return (-1);
901216295Ssyrinx}
902216295Ssyrinx
903216295Ssyrinxstatic int32_t
904216295Ssyrinxsnmp_lookup_tablelist(struct snmp_toolinfo *snmptoolctx,
905216295Ssyrinx    struct snmp_table_index *headp, struct snmp_object *s, char *oid)
906216295Ssyrinx{
907216295Ssyrinx	struct snmp_index_entry *temp;
908216295Ssyrinx
909216295Ssyrinx	if (snmptoolctx == NULL || headp == NULL)
910216295Ssyrinx		return (-1);
911216295Ssyrinx
912216295Ssyrinx	SLIST_FOREACH(temp, headp, link) {
913216295Ssyrinx		if (temp->strlen != strlen(oid))
914216295Ssyrinx			continue;
915216295Ssyrinx
916216295Ssyrinx		if (strncmp(temp->string, oid, temp->strlen))
917216295Ssyrinx			continue;
918216295Ssyrinx
919216295Ssyrinx		/*
920216295Ssyrinx		 * Another hack here - if we were given a table name
921216295Ssyrinx		 * return the corresponding pointer to it's entry.
922216295Ssyrinx		 * That should not change the reponce we'll get.
923216295Ssyrinx		 */
924216295Ssyrinx		s->val.syntax = SNMP_SYNTAX_NULL;
925216295Ssyrinx		asn_append_oid(&(s->val.var), &(temp->var));
926216295Ssyrinx		if (snmp_lookup_leaf(&snmptoolctx->snmp_nodelist, s) > 0)
927216295Ssyrinx			return (1);
928216295Ssyrinx		else
929216295Ssyrinx			return (-1);
930216295Ssyrinx	}
931216295Ssyrinx
932216295Ssyrinx	return (-1);
933216295Ssyrinx}
934216295Ssyrinx
935216295Ssyrinxint32_t
936216295Ssyrinxsnmp_lookup_oidall(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
937216295Ssyrinx    char *oid)
938216295Ssyrinx{
939216295Ssyrinx	if (snmptoolctx == NULL || s == NULL || oid == NULL)
940216295Ssyrinx		return (-1);
941216295Ssyrinx
942216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist, s, oid) > 0)
943216295Ssyrinx		return (1);
944216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist, s, oid) > 0)
945216295Ssyrinx		return (1);
946216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist, s, oid) > 0)
947216295Ssyrinx		return (1);
948216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist, s, oid) > 0)
949216295Ssyrinx		return (1);
950216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist, s, oid) > 0)
951216295Ssyrinx		return (1);
952216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist, s, oid) > 0)
953216295Ssyrinx		return (1);
954216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist, s, oid) > 0)
955216295Ssyrinx		return (1);
956216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list, s, oid) > 0)
957216295Ssyrinx		return (1);
958216295Ssyrinx	if (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist, s, oid) > 0)
959216295Ssyrinx		return (1);
960216295Ssyrinx	if (snmp_lookup_tablelist(snmptoolctx, &snmptoolctx->snmp_tablelist,
961216295Ssyrinx	    s, oid) > 0)
962216295Ssyrinx		return (1);
963216295Ssyrinx
964216295Ssyrinx	return (-1);
965216295Ssyrinx}
966216295Ssyrinx
967216295Ssyrinxint32_t
968216295Ssyrinxsnmp_lookup_enumoid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
969216295Ssyrinx    char *oid)
970216295Ssyrinx{
971216295Ssyrinx	if (snmptoolctx == NULL || s == NULL)
972216295Ssyrinx		return (-1);
973216295Ssyrinx
974216295Ssyrinx	return (snmp_lookup_oidlist(&snmptoolctx->snmp_enumlist, s, oid));
975216295Ssyrinx}
976216295Ssyrinx
977216295Ssyrinxint32_t
978216295Ssyrinxsnmp_lookup_oid(struct snmp_toolinfo *snmptoolctx, struct snmp_object *s,
979216295Ssyrinx    char *oid)
980216295Ssyrinx{
981216295Ssyrinx	if (snmptoolctx == NULL || s == NULL)
982216295Ssyrinx		return (-1);
983216295Ssyrinx
984216295Ssyrinx	switch (s->val.syntax) {
985216295Ssyrinx		case SNMP_SYNTAX_INTEGER:
986216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_intlist,
987216295Ssyrinx			    s, oid));
988216295Ssyrinx		case SNMP_SYNTAX_OCTETSTRING:
989216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_octlist,
990216295Ssyrinx			    s, oid));
991216295Ssyrinx		case SNMP_SYNTAX_OID:
992216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_oidlist,
993216295Ssyrinx			    s, oid));
994216295Ssyrinx		case SNMP_SYNTAX_IPADDRESS:
995216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_iplist,
996216295Ssyrinx			    s, oid));
997216295Ssyrinx		case SNMP_SYNTAX_COUNTER:
998216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_cntlist,
999216295Ssyrinx			    s, oid));
1000216295Ssyrinx		case SNMP_SYNTAX_GAUGE:
1001216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_gaugelist,
1002216295Ssyrinx			    s, oid));
1003216295Ssyrinx		case SNMP_SYNTAX_TIMETICKS:
1004216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_ticklist,
1005216295Ssyrinx			    s, oid));
1006216295Ssyrinx		case SNMP_SYNTAX_COUNTER64:
1007216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_cnt64list,
1008216295Ssyrinx			    s, oid));
1009216295Ssyrinx		case SNMP_SYNTAX_NULL:
1010216295Ssyrinx			return (snmp_lookup_oidlist(&snmptoolctx->snmp_nodelist,
1011216295Ssyrinx			    s, oid));
1012216295Ssyrinx		default:
1013216295Ssyrinx			warnx("Unknown syntax - %d", s->val.syntax);
1014216295Ssyrinx			break;
1015216295Ssyrinx	}
1016216295Ssyrinx
1017216295Ssyrinx	return (-1);
1018216295Ssyrinx}
1019