Annotation of embedaddon/quagga/lib/snmp.c, revision 1.1
1.1 ! misho 1: /* SNMP support
! 2: * Copyright (C) 1999 Kunihiro Ishiguro <kunihiro@zebra.org>
! 3: *
! 4: * This file is part of GNU Zebra.
! 5: *
! 6: * GNU Zebra is free software; you can redistribute it and/or modify it
! 7: * under the terms of the GNU General Public License as published by the
! 8: * Free Software Foundation; either version 2, or (at your option) any
! 9: * later version.
! 10: *
! 11: * GNU Zebra is distributed in the hope that it will be useful, but
! 12: * WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: * General Public License for more details.
! 15: *
! 16: * You should have received a copy of the GNU General Public License
! 17: * along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: * 02111-1307, USA.
! 20: */
! 21:
! 22: #include <zebra.h>
! 23:
! 24: #ifdef HAVE_SNMP
! 25: #include <net-snmp/net-snmp-config.h>
! 26: #include <net-snmp/net-snmp-includes.h>
! 27:
! 28: #include "smux.h"
! 29:
! 30: #define min(A,B) ((A) < (B) ? (A) : (B))
! 31:
! 32: int
! 33: oid_compare (oid *o1, int o1_len, oid *o2, int o2_len)
! 34: {
! 35: int i;
! 36:
! 37: for (i = 0; i < min (o1_len, o2_len); i++)
! 38: {
! 39: if (o1[i] < o2[i])
! 40: return -1;
! 41: else if (o1[i] > o2[i])
! 42: return 1;
! 43: }
! 44: if (o1_len < o2_len)
! 45: return -1;
! 46: if (o1_len > o2_len)
! 47: return 1;
! 48:
! 49: return 0;
! 50: }
! 51:
! 52: void *
! 53: oid_copy (void *dest, const void *src, size_t size)
! 54: {
! 55: return memcpy (dest, src, size * sizeof (oid));
! 56: }
! 57:
! 58: void
! 59: oid2in_addr (oid oid[], int len, struct in_addr *addr)
! 60: {
! 61: int i;
! 62: u_char *pnt;
! 63:
! 64: if (len == 0)
! 65: return;
! 66:
! 67: pnt = (u_char *) addr;
! 68:
! 69: for (i = 0; i < len; i++)
! 70: *pnt++ = oid[i];
! 71: }
! 72:
! 73: void
! 74: oid_copy_addr (oid oid[], struct in_addr *addr, int len)
! 75: {
! 76: int i;
! 77: u_char *pnt;
! 78:
! 79: if (len == 0)
! 80: return;
! 81:
! 82: pnt = (u_char *) addr;
! 83:
! 84: for (i = 0; i < len; i++)
! 85: oid[i] = *pnt++;
! 86: }
! 87:
! 88: int
! 89: smux_header_generic (struct variable *v, oid *name, size_t *length, int exact,
! 90: size_t *var_len, WriteMethod **write_method)
! 91: {
! 92: oid fulloid[MAX_OID_LEN];
! 93: int ret;
! 94:
! 95: oid_copy (fulloid, v->name, v->namelen);
! 96: fulloid[v->namelen] = 0;
! 97: /* Check against full instance. */
! 98: ret = oid_compare (name, *length, fulloid, v->namelen + 1);
! 99:
! 100: /* Check single instance. */
! 101: if ((exact && (ret != 0)) || (!exact && (ret >= 0)))
! 102: return MATCH_FAILED;
! 103:
! 104: /* In case of getnext, fill in full instance. */
! 105: memcpy (name, fulloid, (v->namelen + 1) * sizeof (oid));
! 106: *length = v->namelen + 1;
! 107:
! 108: *write_method = 0;
! 109: *var_len = sizeof(long); /* default to 'long' results */
! 110:
! 111: return MATCH_SUCCEEDED;
! 112: }
! 113:
! 114: int
! 115: smux_header_table (struct variable *v, oid *name, size_t *length, int exact,
! 116: size_t *var_len, WriteMethod **write_method)
! 117: {
! 118: /* If the requested OID name is less than OID prefix we
! 119: handle, adjust it to our prefix. */
! 120: if ((oid_compare (name, *length, v->name, v->namelen)) < 0)
! 121: {
! 122: if (exact)
! 123: return MATCH_FAILED;
! 124: oid_copy(name, v->name, v->namelen);
! 125: *length = v->namelen;
! 126: }
! 127:
! 128: *write_method = 0;
! 129: *var_len = sizeof(long);
! 130:
! 131: return MATCH_SUCCEEDED;
! 132: }
! 133: #endif /* HAVE_SNMP */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>