summaryrefslogtreecommitdiffstats
path: root/net-mgmt/net-snmp
diff options
context:
space:
mode:
authorbms <bms@FreeBSD.org>2004-01-03 03:18:29 +0000
committerbms <bms@FreeBSD.org>2004-01-03 03:18:29 +0000
commitdff51856e3d8af2aa2ea52f3908631b2a2e1a9eb (patch)
tree99b774b8ee847a531ee13343f2927353db6c13bc /net-mgmt/net-snmp
parent293ea1c9555d571b5d6d5dddccccd6fb2c1103f0 (diff)
downloadFreeBSD-ports-dff51856e3d8af2aa2ea52f3908631b2a2e1a9eb.zip
FreeBSD-ports-dff51856e3d8af2aa2ea52f3908631b2a2e1a9eb.tar.gz
Add an extra flag, WITH_INETADDRESS_HACK. Enabling this flag for build will
cause InetAddress and InetAddressType OIDs to be handled specially during presentation. Normally they are simply displayed as hex due to being octet-strings, but this is not how they are intended to be presented. This allows IPv6 addresses to be presented correctly, as well as IPv4 in emerging and existing MIBs which use the new InetAddress type. Reviewed by: kuriyama, fenner Tested with: snmpwalk, mbrowse
Diffstat (limited to 'net-mgmt/net-snmp')
-rw-r--r--net-mgmt/net-snmp/Makefile4
-rw-r--r--net-mgmt/net-snmp/files/extra-patch-snmplib::mib.c136
2 files changed, 140 insertions, 0 deletions
diff --git a/net-mgmt/net-snmp/Makefile b/net-mgmt/net-snmp/Makefile
index 0afbfb8..c124f38 100644
--- a/net-mgmt/net-snmp/Makefile
+++ b/net-mgmt/net-snmp/Makefile
@@ -113,6 +113,10 @@ SHLIB_VERSION= 6
PLIST_SUB+= shlib=${SHLIB_VERSION}
RC_SCRIPTS_SUB= PREFIX=${PREFIX} RC_SUBR=${RC_SUBR}
+.if defined(WITH_INETADDRESS_HACK)
+EXTRA_PATCHES+= ${PATCHDIR}/extra-patch-snmplib::mib.c
+.endif
+
post-patch:
@${REINPLACE_CMD} \
-e 's|%%LTCONFIG%%|${LIBTOOL_SHAREDIR}/ltconfig${LIBTOOL_VERSION}|g' \
diff --git a/net-mgmt/net-snmp/files/extra-patch-snmplib::mib.c b/net-mgmt/net-snmp/files/extra-patch-snmplib::mib.c
new file mode 100644
index 0000000..9ee51d8
--- /dev/null
+++ b/net-mgmt/net-snmp/files/extra-patch-snmplib::mib.c
@@ -0,0 +1,136 @@
+--- snmplib/mib.c.orig Sun Nov 2 12:50:39 2003
++++ snmplib/mib.c Sat Jan 3 03:08:38 2004
+@@ -167,6 +167,14 @@
+ {NULL, 0} /* end of list */
+ };
+
++enum inet_address_type {
++ IPV4 = 1,
++ IPV6 = 2,
++ IPV4Z = 3,
++ IPV6Z = 4,
++ DNS = 16
++};
++
+
+ /**
+ * @internal
+@@ -3734,6 +3742,80 @@
+ return SNMPERR_SUCCESS;
+ }
+
++/*
++ * dump_realloc_oid_to_inetaddress:
++ * return 1 for success,
++ * return 0 for failure,
++ * return 2 for not handled
++ */
++
++int
++dump_realloc_oid_to_inetaddress(const int addr_type, const oid * objid, size_t objidlen,
++ u_char ** buf, size_t * buf_len,
++ size_t * out_len, int allow_realloc,
++ char quotechar)
++{
++ if (buf) {
++ int i, len;
++ char intbuf[64], * p;
++ u_int32_t zone;
++
++ memset(intbuf, 0, 64);
++
++ p = intbuf;
++ *p = quotechar;
++ p++;
++ switch (addr_type) {
++ case IPV4:
++ case IPV4Z:
++ if ((addr_type == IPV4 && objidlen != 4) ||
++ (addr_type == IPV4Z && objidlen != 8))
++ return 2;
++
++ len = sprintf(p, "%lu.%lu.%lu.%lu", objid[0], objid[1], objid[2], objid[3]);
++ p += len;
++ if (addr_type == IPV4Z) {
++ zone = ntohl(*((u_int32_t *) objid[4]));
++ len = sprintf(p, "\%%lu", zone);
++ p += len;
++ }
++
++ break;
++
++ case IPV6:
++ case IPV6Z:
++ if ((addr_type == IPV6 && objidlen != 16) ||
++ (addr_type == IPV6Z && objidlen != 20))
++ return 2;
++
++ len = 0;
++ for (i = 0; i < 16; i ++) {
++ len += snprintf(p, 4, "%02x:", objid[i]);
++ p += 3;
++ }
++ p-- ; /* do not include the last ':' */
++
++ if (addr_type == IPV6Z) {
++ zone = ntohl(*((u_int32_t *) objid[4]));
++ len = sprintf(p, "\%%lu", zone);
++ p += len;
++ }
++
++ break;
++
++ case DNS:
++ default:
++ /* DNS can just be handled by dump_realloc_oid_to_string() */
++ return 2;
++ }
++
++ *p = quotechar;
++ return snmp_strcat(buf, buf_len, out_len, allow_realloc,
++ (const u_char *) intbuf);
++ }
++ return 1;
++}
++
+ int
+ dump_realloc_oid_to_string(const oid * objid, size_t objidlen,
+ u_char ** buf, size_t * buf_len,
+@@ -4043,7 +4125,36 @@
+ }
+ } else {
+ if (!*buf_overflow) {
+- if (!dump_realloc_oid_to_string
++ struct tree * next_peer;
++ int normal_handling = 1;
++
++ if (tp->next_peer) {
++ next_peer = tp->next_peer;
++ }
++
++ /* Try handling the InetAddress in the OID, in case of failure,
++ * use the normal_handling.
++ */
++ if (tp->next_peer &&
++ strcmp(get_tc_descriptor(tp->tc_index), "InetAddress") == 0 &&
++ strcmp(get_tc_descriptor(next_peer->tc_index),
++ "InetAddressType") == 0 ) {
++
++ int ret;
++ int addr_type = *(objid - 1);
++
++ ret = dump_realloc_oid_to_inetaddress(addr_type,
++ objid + 1, numids - 1, buf, buf_len, out_len,
++ allow_realloc, '"');
++ if (ret != 2) {
++ normal_handling = 0;
++ if (ret == 0) {
++ *buf_overflow = 1;
++ }
++
++ }
++ }
++ if (normal_handling && !dump_realloc_oid_to_string
+ (objid + 1, numids - 1, buf, buf_len, out_len,
+ allow_realloc, '"')) {
+ *buf_overflow = 1;
OpenPOWER on IntegriCloud