diff options
author | bms <bms@FreeBSD.org> | 2004-01-03 03:18:29 +0000 |
---|---|---|
committer | bms <bms@FreeBSD.org> | 2004-01-03 03:18:29 +0000 |
commit | dff51856e3d8af2aa2ea52f3908631b2a2e1a9eb (patch) | |
tree | 99b774b8ee847a531ee13343f2927353db6c13bc /net-mgmt/net-snmp | |
parent | 293ea1c9555d571b5d6d5dddccccd6fb2c1103f0 (diff) | |
download | FreeBSD-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/Makefile | 4 | ||||
-rw-r--r-- | net-mgmt/net-snmp/files/extra-patch-snmplib::mib.c | 136 |
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; |