1 /* 2 * Copyright (c) 2001-2003 3 * Fraunhofer Institute for Open Communication Systems (FhG Fokus). 4 * All rights reserved. 5 * 6 * Author: Harti Brandt <harti@freebsd.org> 7 * 8 * Redistribution of this software and documentation and use in source and 9 * binary forms, with or without modification, are permitted provided that 10 * the following conditions are met: 11 * 12 * 1. Redistributions of source code or documentation must retain the above 13 * copyright notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the Institute nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY FRAUNHOFER FOKUS 22 * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, 23 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 24 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 25 * FRAUNHOFER FOKUS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 26 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 27 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, 28 * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, 31 * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 32 * 33 * $Begemot: bsnmp/snmp_mibII/mibII_ifstack.c,v 1.6 2003/12/03 10:01:19 hbb Exp $ 34 * 35 * ifStackTable. Read-only. 36 */ 37 #include "mibII.h" 38 39 int 40 mib_ifstack_create(const struct mibif *lower, const struct mibif *upper) 41 { 42 struct mibifstack *stack; 43 44 if ((stack = malloc(sizeof(*stack))) == NULL) 45 return (-1); 46 47 stack->index.len = 2; 48 stack->index.subs[0] = upper ? upper->index : 0; 49 stack->index.subs[1] = lower ? lower->index : 0; 50 51 INSERT_OBJECT_OID(stack, &mibifstack_list); 52 53 mib_ifstack_last_change = get_ticks(); 54 55 return (0); 56 } 57 58 void 59 mib_ifstack_delete(const struct mibif *lower, const struct mibif *upper) 60 { 61 struct mibifstack *stack; 62 63 TAILQ_FOREACH(stack, &mibifstack_list, link) 64 if (stack->index.subs[0] == (upper ? upper->index : 0) && 65 stack->index.subs[1] == (lower ? lower->index : 0)) { 66 TAILQ_REMOVE(&mibifstack_list, stack, link); 67 free(stack); 68 mib_ifstack_last_change = get_ticks(); 69 return; 70 } 71 } 72 73 int 74 op_ifstack(struct snmp_context *ctx __unused, struct snmp_value *value, 75 u_int sub, u_int iidx __unused, enum snmp_op op) 76 { 77 struct mibifstack *stack; 78 79 switch (op) { 80 81 case SNMP_OP_GETNEXT: 82 if ((stack = NEXT_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL) 83 return (SNMP_ERR_NOSUCHNAME); 84 index_append(&value->var, sub, &stack->index); 85 break; 86 87 case SNMP_OP_GET: 88 if ((stack = FIND_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL) 89 return (SNMP_ERR_NOSUCHNAME); 90 break; 91 92 case SNMP_OP_SET: 93 if ((stack = FIND_OBJECT_OID(&mibifstack_list, &value->var, sub)) == NULL) 94 return (SNMP_ERR_NO_CREATION); 95 return (SNMP_ERR_NOT_WRITEABLE); 96 97 case SNMP_OP_ROLLBACK: 98 case SNMP_OP_COMMIT: 99 abort(); 100 } 101 102 switch (value->var.subs[sub - 1]) { 103 104 case LEAF_ifStackStatus: 105 value->v.integer = 1; 106 break; 107 } 108 return (SNMP_ERR_NOERROR); 109 } 110