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