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