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