Patchwork [meta-oe,2/2] net-snmp: Update to 5.7.2

login
register
mail settings
Submitter ml@communistcode.co.uk
Date April 17, 2013, 10:07 a.m.
Message ID <1366193237-12197-2-git-send-email-ml@communistcode.co.uk>
Download mbox | patch
Permalink /patch/48411/
State Superseded
Headers show

Comments

ml@communistcode.co.uk - April 17, 2013, 10:07 a.m.
From: Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>

- Removed some un-needed patches

Signed-off-by: Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>
---
 .../net-snmp/files/libnl-3-support.patch           |    69 -
 .../net-snmp/files/sync-with-5.7-branch.patch      | 19998 -------------------
 .../recipes-extended/net-snmp/net-snmp_5.7.2.bb    |    31 +
 3 files changed, 31 insertions(+), 20067 deletions(-)
 delete mode 100644 meta-oe/recipes-extended/net-snmp/files/libnl-3-support.patch
 delete mode 100644 meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
 create mode 100644 meta-oe/recipes-extended/net-snmp/net-snmp_5.7.2.bb
Martin Jansa - April 17, 2013, 10:21 a.m.
On Wed, Apr 17, 2013 at 11:07:17AM +0100, Jack Mitchell wrote:
> From: Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>
> 
> - Removed some un-needed patches
> 
> Signed-off-by: Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>
> ---
>  .../net-snmp/files/libnl-3-support.patch           |    69 -
>  .../net-snmp/files/sync-with-5.7-branch.patch      | 19998 -------------------
>  .../recipes-extended/net-snmp/net-snmp_5.7.2.bb    |    31 +
>  3 files changed, 31 insertions(+), 20067 deletions(-)
>  delete mode 100644 meta-oe/recipes-extended/net-snmp/files/libnl-3-support.patch
>  delete mode 100644 meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
>  create mode 100644 meta-oe/recipes-extended/net-snmp/net-snmp_5.7.2.bb

Is there reason to keep net-snmp_5.7.1.bb?

If no, then please remove it in the same commit and send with -M.

Cheers,
Paul Eggleton - April 17, 2013, 10:28 a.m.
On Wednesday 17 April 2013 12:21:44 Martin Jansa wrote:
> On Wed, Apr 17, 2013 at 11:07:17AM +0100, Jack Mitchell wrote:
> > From: Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>
> > 
> > - Removed some un-needed patches
> > 
> > Signed-off-by: Jack Mitchell <jack.mitchell@dbbroadcast.co.uk>
> > ---
> > 
> >  .../net-snmp/files/libnl-3-support.patch           |    69 -
> >  .../net-snmp/files/sync-with-5.7-branch.patch      | 19998
> >  ------------------- .../recipes-extended/net-snmp/net-snmp_5.7.2.bb    |
> >     31 +
> >  3 files changed, 31 insertions(+), 20067 deletions(-)
> >  delete mode 100644
> >  meta-oe/recipes-extended/net-snmp/files/libnl-3-support.patch delete
> >  mode 100644
> >  meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
> >  create mode 100644 meta-oe/recipes-extended/net-snmp/net-snmp_5.7.2.bb
> Is there reason to keep net-snmp_5.7.1.bb?
> 
> If no, then please remove it in the same commit and send with -M.

Also I just tried to "git am" 2/2 on top of master + 1/2 and it failed, not 
sure exactly why. (I wanted to see if this would fix the build failure I noted 
earlier.)

Cheers,
Paul

Patch

diff --git a/meta-oe/recipes-extended/net-snmp/files/libnl-3-support.patch b/meta-oe/recipes-extended/net-snmp/files/libnl-3-support.patch
deleted file mode 100644
index 72699b8..0000000
--- a/meta-oe/recipes-extended/net-snmp/files/libnl-3-support.patch
+++ /dev/null
@@ -1,69 +0,0 @@ 
-Add support to libnl-3
-
-Upstream-Status: Pending
-
---- net-snmp-5.6.1/agent/mibgroup/mibII/tcpTable.c.org	2011-03-27 22:39:13.428728506 +0200
-+++ net-snmp-5.6.1/agent/mibgroup/mibII/tcpTable.c	2011-03-27 22:39:47.606956561 +0200
-@@ -555,8 +555,9 @@
- static int
- tcpTable_load_netlink(void)
- {
-+	int err;
- 	/*  TODO: perhaps use permanent nl handle? */
--	struct nl_handle *nl = nl_handle_alloc();
-+	struct nl_sock *nl = nl_socket_alloc();
- 
- 	if (nl == NULL) {
- 		DEBUGMSGTL(("mibII/tcpTable", "Failed to allocate netlink handle\n"));
-@@ -564,10 +565,10 @@
- 		return -1;
- 	}
- 
--	if (nl_connect(nl, NETLINK_INET_DIAG) < 0) {
--		DEBUGMSGTL(("mibII/tcpTable", "Failed to connect to netlink: %s\n", nl_geterror()));
--		snmp_log(LOG_ERR, "snmpd: Couldn't connect to netlink: %s\n", nl_geterror());
--		nl_handle_destroy(nl);
-+	if ((err = nl_connect(nl, NETLINK_INET_DIAG)) < 0) {
-+		DEBUGMSGTL(("mibII/tcpTable", "Failed to connect to netlink: %s\n", nl_geterror(err)));
-+		snmp_log(LOG_ERR, "snmpd: Couldn't connect to netlink: %s\n", nl_geterror(err));
-+		nl_socket_free(nl);
- 		return -1;
- 	}
- 
-@@ -579,10 +580,10 @@
- 	struct nl_msg *nm = nlmsg_alloc_simple(TCPDIAG_GETSOCK, NLM_F_ROOT|NLM_F_MATCH|NLM_F_REQUEST);
- 	nlmsg_append(nm, &req, sizeof(struct inet_diag_req), 0);
- 
--	if (nl_send_auto_complete(nl, nm) < 0) {
--		DEBUGMSGTL(("mibII/tcpTable", "nl_send_autocomplete(): %s\n", nl_geterror()));
--		snmp_log(LOG_ERR, "snmpd: nl_send_autocomplete(): %s\n", nl_geterror());
--		nl_handle_destroy(nl);
-+	if ((err = nl_send_auto_complete(nl, nm)) < 0) {
-+		DEBUGMSGTL(("mibII/tcpTable", "nl_send_autocomplete(): %s\n", nl_geterror(err)));
-+		snmp_log(LOG_ERR, "snmpd: nl_send_autocomplete(): %s\n", nl_geterror(err));
-+		nl_socket_free(nl);
- 		return -1;
- 	}
- 	nlmsg_free(nm);
-@@ -593,9 +594,9 @@
- 
- 	while (running) {
- 		if ((len = nl_recv(nl, &peer, &buf, NULL)) <= 0) {
--			DEBUGMSGTL(("mibII/tcpTable", "nl_recv(): %s\n", nl_geterror()));
--			snmp_log(LOG_ERR, "snmpd: nl_recv(): %s\n", nl_geterror());
--			nl_handle_destroy(nl);
-+			DEBUGMSGTL(("mibII/tcpTable", "nl_recv(): %s\n", nl_geterror(len)));
-+			snmp_log(LOG_ERR, "snmpd: nl_recv(): %s\n", nl_geterror(len));
-+			nl_socket_free(nl);
- 			return -1;
- 		}
- 
-@@ -644,7 +645,7 @@
- 		free(buf);
- 	}
- 
--	nl_handle_destroy(nl);
-+	nl_socket_free(nl);
- 
- 	if (tcp_head) {
- 		DEBUGMSGTL(("mibII/tcpTable", "Loaded TCP Table using netlink\n"));
diff --git a/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch b/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
deleted file mode 100644
index 442e8d0..0000000
--- a/meta-oe/recipes-extended/net-snmp/files/sync-with-5.7-branch.patch
+++ /dev/null
@@ -1,19998 +0,0 @@ 
-Sync with 5.7 branch
-
-This syncs v5.7.1 to 2012-02-08 5.7 GIT branch status
-
-Upstream-Status: Backport
-
-diff --git a/.gitignore b/.gitignore
-index 9d6a15f..9cfb7a3 100644
---- a/.gitignore
-+++ b/.gitignore
-@@ -1,9 +1,9 @@
- *.bak
- *.bs
--*.la
--*.lo
- *.ft
- *.ft.1
-+*.la
-+*.lo
- *.made
- *.o
- *.obj
-@@ -78,7 +78,10 @@ net-snmp-config
- net-snmp-config-x
- net-snmp-create-v3-user
- NEWS.new*
-+perl/*.yml
- perl/*/*.def
-+perl/*/*.yml
-+perl/*/*/*.yml
- perl/agent/agent.c
- perl/agent/default_store/default_store.c
- perl/agent/default_store/default_store.def
-@@ -96,6 +99,7 @@ perl/TrapReceiver/const-c.inc
- perl/TrapReceiver/const-xs.inc
- perl/TrapReceiver/TrapReceiver.c
- pm_to_blib
-+python/build
- sedscript
- snmplib/snmpsm_init.h
- snmplib/snmpsm_shutdown.h
-diff --git a/COPYING b/COPYING
-index afe6e6d..d368331 100644
---- a/COPYING
-+++ b/COPYING
-@@ -135,7 +135,7 @@ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- 
- ---- Part 5: Sparta, Inc copyright notice (BSD) -----
- 
--Copyright (c) 2003-2011, Sparta, Inc
-+Copyright (c) 2003-2012, Sparta, Inc
- All rights reserved.
-  
- Redistribution and use in source and binary forms, with or without
-diff --git a/Makefile.in b/Makefile.in
-index f3dd7b7..9664676 100644
---- a/Makefile.in
-+++ b/Makefile.in
-@@ -85,22 +85,23 @@ libtool:	$(LIBTOOL_DEPS)
- 	$(SHELL) ./config.status --recheck
- 
- 
--snmplib:
-+snmplib: @FEATURETARGS@
- 	@(cd snmplib; $(MAKE) )
- 
--agent:
-+agent: @FEATURETARGS@
- 	@(cd snmplib; $(MAKE) )
- 	@(cd agent; $(MAKE) )
- 
--apps:
-+apps: @FEATURETARGS@
- 	@(cd snmplib; $(MAKE) )
-+	@(cd agent; $(MAKE) libs)
- 	@(cd apps; $(MAKE) )
- 
--snmpget snmpbulkget snmpwalk snmpbulkwalk snmptranslate snmpstatus snmpdelta snmptable snmptest snmpset snmpusm snmpvacm snmpgetnext encode_keychange snmpdf snmptrap snmptls:
-+snmpget snmpbulkget snmpwalk snmpbulkwalk snmptranslate snmpstatus snmpdelta snmptable snmptest snmpset snmpusm snmpvacm snmpgetnext encode_keychange snmpdf snmptrap snmptls: @FEATURETARGS@
- 	@(cd snmplib; $(MAKE) )
- 	@(cd apps; $(MAKE) $@ )
- 
--snmptrapd:
-+agentxtrap snmptrapd: @FEATURETARGS@
- 	@(cd snmplib; $(MAKE) )
- 	@(cd agent; $(MAKE) libs)
- 	@(cd apps; $(MAKE) $@ )
-diff --git a/agent/Makefile.in b/agent/Makefile.in
-index 84a5e4c..59cf4ef 100644
---- a/agent/Makefile.in
-+++ b/agent/Makefile.in
-@@ -114,7 +114,6 @@ USELIBS		= ../snmplib/libnetsnmp.$(LIB_EXTENSION)$(LIB_VERSION)
- AGENTLIB	= libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION)
- MIBLIB		= libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION)
- 
--LOCAL_LIBS	= -L../snmplib/.libs -L../snmplib -L./.libs
- LAGENTLIBS	= @LAGENTLIBS@
- LMIBLIBS	= @LMIBLIBS@
- VAL_LIBS	= @VAL_LIBS@
-@@ -282,34 +281,33 @@ all: agentlib subdirs miblib $(INSTALLBINPROGS) $(INSTALLSBINPROGS)
- # build stuff targets
- #
- getkstat: getkstat.o
--	$(CC) $(CFLAGS) -o $@ $? $(LOCAL_LIBS) $(LIBS)
-+	$(CC) $(CFLAGS) -o $@ $? $(LIBS)
- 
- getkstat.o: mibgroup/kernel_sunos5.c
- 	$(CC) $(CFLAGS) -o $@ -D_GETKSTAT_TEST -DDODEBUG -c $? 
- 
- getmibstat: getmibstat.o
--	$(CC) $(CFLAGS) -o $@ $? $(LOCAL_LIBS) $(LIBS)
-+	$(CC) $(CFLAGS) -o $@ $? $(LIBS)
- 
- getmibstat.o: mibgroup/kernel_sunos5.c
- 	$(CC) $(CFLAGS) -o $@ -D_GETMIBSTAT_TEST -DDODEBUG -c $? 
- 
--snmpd$(EXEEXT):	${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(MIBLIB) $(LIBTARG) 
--	$(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} $(LOCAL_LIBS) ${LDFLAGS} ${OUR_AGENT_LIBS}
--
-+snmpd$(EXEEXT):	${LAGENTOBJS} $(USELIBS) $(AGENTLIB) $(HELPERLIB) $(MIBLIB) $(LIBTARG) 
-+	$(LINK) $(CFLAGS) -o $@ ${LAGENTOBJS} ${LDFLAGS} ${OUR_AGENT_LIBS}
- 
- libnetsnmpagent.$(LIB_EXTENSION)$(LIB_VERSION):    ${LLIBAGENTOBJS} $(USELIBS)
- 	$(LIB_LD_CMD) $(AGENTLIB) ${LLIBAGENTOBJS} $(USELIBS) ${LAGENTLIBS} @LD_NO_UNDEFINED@ $(LDFLAGS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) @AGENTLIBS@
- 	$(RANLIB) $(AGENTLIB)
- 
- libnetsnmpmibs.$(LIB_EXTENSION)$(LIB_VERSION): ${LMIBOBJS} $(AGENTLIB) $(USELIBS)
--	$(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(AGENTLIB) $(USELIBS) @LD_NO_UNDEFINED@ $(LDFLAGS) ${LMIBLIBS} $(LIB_LD_LIBS) @AGENTLIBS@
-+	$(LIB_LD_CMD) $(MIBLIB) ${LMIBOBJS} $(AGENTLIB) $(USELIBS) @LD_NO_UNDEFINED@ $(LDFLAGS) ${LMIBLIBS} $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS) @AGENTLIBS@
- 	$(RANLIB) $(MIBLIB)
- 
- agentlib: $(AGENTLIB)
- 
- miblib: $(MIBLIB)
- 
--libs: $(INSTALLLIBS)
-+libs: $(AGENTLIB) $(MIBLIB)
- 
- embedperlinstall:
- 	  @$(SHELL) $(srcdir)/../mkinstalldirs $(INSTALL_PREFIX)$(snmplibdir)
-diff --git a/agent/agent_handler.c b/agent/agent_handler.c
-index da64761..59e9613 100644
---- a/agent/agent_handler.c
-+++ b/agent/agent_handler.c
-@@ -774,7 +774,7 @@ netsnmp_handler_registration_free(netsnmp_handler_registration *reginfo)
- /** Duplicates handler registration object and all subsequent handlers.
-  *  Creates a copy of the handler registration object and all its data.
-  *
-- *  @param handler is the handler registration object to be duplicated
-+ *  @param reginfo is the handler registration object to be duplicated
-  *
-  *  @return Returns a pointer to the complete copy,
-  *         or NULL if any problem occured.
-@@ -922,7 +922,8 @@ netsnmp_free_delegated_cache(netsnmp_delegated_cache *dcache)
-  *  Sweeps through given chain of requests and sets 'delegated'
-  *  flag accordingly to the isdelegaded parameter.
-  *
-- *  @param isdelegaded New value of the 'delegated' flag.
-+ *  @param requests Request list.
-+ *  @param isdelegated New value of the 'delegated' flag.
-  */
- void
- netsnmp_handler_mark_requests_as_delegated(netsnmp_request_info *requests,
-diff --git a/agent/agent_read_config.c b/agent/agent_read_config.c
-index 3514f0f..f9ef1af 100644
---- a/agent/agent_read_config.c
-+++ b/agent/agent_read_config.c
-@@ -115,13 +115,10 @@ netsnmp_feature_child_of(snmpd_unregister_config_handler, agent_read_config_all)
- void
- snmpd_set_agent_user(const char *token, char *cptr)
- {
--#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
--    struct passwd  *info;
--#endif
--
-     if (cptr[0] == '#') {
-         char           *ecp;
-         int             uid;
-+
-         uid = strtoul(cptr + 1, &ecp, 10);
-         if (*ecp != 0) {
-             config_perror("Bad number");
-@@ -129,44 +126,47 @@ snmpd_set_agent_user(const char *token, char *cptr)
- 	    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 			       NETSNMP_DS_AGENT_USERID, uid);
- 	}
--    }
- #if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
--    else if ((info = getpwnam(cptr)) != NULL) {
--        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
--			   NETSNMP_DS_AGENT_USERID, info->pw_uid);
-     } else {
--        config_perror("User not found in passwd database");
--    }
--    endpwent();
-+        struct passwd  *info;
-+
-+        info = getpwnam(cptr);
-+        if (info)
-+            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
-+                               NETSNMP_DS_AGENT_USERID, info->pw_uid);
-+        else
-+            config_perror("User not found in passwd database");
-+        endpwent();
- #endif
-+    }
- }
- 
- void
- snmpd_set_agent_group(const char *token, char *cptr)
- {
--#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
--    struct group   *info;
--#endif
--
-     if (cptr[0] == '#') {
-         char           *ecp;
-         int             gid = strtoul(cptr + 1, &ecp, 10);
-+
-         if (*ecp != 0) {
-             config_perror("Bad number");
- 	} else {
-             netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 			       NETSNMP_DS_AGENT_GROUPID, gid);
- 	}
--    }
- #if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
--    else if ((info = getgrnam(cptr)) != NULL) {
--        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
--			   NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
-     } else {
--        config_perror("Group not found in group database");
--    }
--    endpwent();
-+        struct group   *info;
-+
-+        info = getgrnam(cptr);
-+        if (info)
-+            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
-+                               NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
-+        else
-+            config_perror("Group not found in group database");
-+        endgrent();
- #endif
-+    }
- }
- #endif
- 
-@@ -187,9 +187,10 @@ snmpd_set_agent_address(const char *token, char *cptr)
-         /*
-          * append to the older specification string 
-          */
--        snprintf(buf, SPRINT_MAX_LEN, "%s,%s", ptr, cptr);
-+        snprintf(buf, sizeof(buf), "%s,%s", ptr, cptr);
-+	buf[sizeof(buf) - 1] = '\0';
-     } else {
--        strncpy(buf, cptr, SPRINT_MAX_LEN);
-+        strlcpy(buf, cptr, sizeof(buf));
-     }
- 
-     DEBUGMSGTL(("snmpd_ports", "port spec: %s\n", buf));
-diff --git a/agent/agent_registry.c b/agent/agent_registry.c
-index 5efaeb5..1e2482a 100644
---- a/agent/agent_registry.c
-+++ b/agent/agent_registry.c
-@@ -555,6 +555,8 @@ netsnmp_subtree_change_prev(netsnmp_subtree *ptr, netsnmp_subtree *theprev)
-                                &ptr->oid_off);
- }
- 
-+netsnmp_feature_child_of(netsnmp_subtree_compare,netsnmp_unused)
-+#ifndef NETSNMP_FEATURE_REMOVE_NETSNMP_SUBTREE_COMPARE
- /** Compares OIDs of given subtrees.
-  *
-  *  @param ap,bp Pointers to the subtrees to be compared.
-@@ -563,8 +565,6 @@ netsnmp_subtree_change_prev(netsnmp_subtree *ptr, netsnmp_subtree *theprev)
-  *
-  *  @see snmp_oid_compare()
-  */
--netsnmp_feature_child_of(netsnmp_subtree_compare,netsnmp_unused)
--#ifndef NETSNMP_FEATURE_REMOVE_NETSNMP_SUBTREE_COMPARE
- int
- netsnmp_subtree_compare(const netsnmp_subtree *ap, const netsnmp_subtree *bp)
- {
-@@ -742,7 +742,7 @@ netsnmp_subtree_split(netsnmp_subtree *current, oid name[], int name_len)
- 
- /** Loads the subtree under given context name.
-  *
-- *  @param root The subtree to be loaded into current subtree.
-+ *  @param new_sub The subtree to be loaded into current subtree.
-  *
-  *  @param context_name Text name of the context we're searching for.
-  *
-@@ -1085,8 +1085,22 @@ netsnmp_subtree_find(const oid *name, size_t len, netsnmp_subtree *subtree,
- 
- /** Registers a MIB handler.
-  *
-+ *  @param moduleName
-+ *  @param var
-+ *  @param varsize
-+ *  @param numvars
-+ *  @param  mibloc
-+ *  @param mibloclen
-+ *  @param priority
-+ *  @param range_subid
-+ *  @param range_ubound
-+ *  @param  ss
-+ *  @param context
-+ *  @param timeout
-+ *  @param flags
-  *  @param reginfo Registration handler structure.
-  *                 In a case of failure, it will be freed.
-+ *  @param perform_callback
-  *
-  *  @return gives MIB_REGISTERED_OK or MIB_* error code.
-  *
-@@ -1389,6 +1403,7 @@ register_mib_detach(void)
-  *                     If range_subid is zero, then this parameter is ignored.
-  *
-  *  @param ss 
-+ *  @param context
-  *  @param timeout 
-  *  @param flags 
-  *
-@@ -1584,6 +1599,7 @@ netsnmp_subtree_unload(netsnmp_subtree *sub, netsnmp_subtree *prev, const char *
-         DEBUGMSGOID(("register_mib", sub->start_a, sub->start_len));
-     } else {
-         DEBUGMSG(("register_mib", "[NIL]"));
-+        return;
-     }
-     DEBUGMSG(("register_mib", ", "));
-     if (prev != NULL) {
-@@ -1664,7 +1680,7 @@ unregister_mib_context(oid * name, size_t len, int priority,
-                        int range_subid, oid range_ubound,
-                        const char *context)
- {
--    netsnmp_subtree *list, *myptr;
-+    netsnmp_subtree *list, *myptr = NULL;
-     netsnmp_subtree *prev, *child, *next; /* loop through children */
-     struct register_parameters reg_parms;
-     int old_lookup_cache_val = netsnmp_get_lookup_cache_size();
-diff --git a/agent/agent_trap.c b/agent/agent_trap.c
-index cc90620..dfa9dcf 100644
---- a/agent/agent_trap.c
-+++ b/agent/agent_trap.c
-@@ -801,6 +801,7 @@ netsnmp_send_traps(int trap, int specific,
- 
-     }
- 
-+    if (template_v2pdu) {
- 	/* A context name was provided, so copy it and its length to the v2 pdu
- 	 * template. */
- 	if (context != NULL)
-@@ -808,6 +809,7 @@ netsnmp_send_traps(int trap, int specific,
- 		template_v2pdu->contextName    = strdup(context);
- 		template_v2pdu->contextNameLen = strlen(context);
- 	}
-+    }
- 
-     /*
-      *  Now loop through the list of trap sinks
-diff --git a/agent/auto_nlist.c b/agent/auto_nlist.c
-index cb92a5b..bcbdb05 100644
---- a/agent/auto_nlist.c
-+++ b/agent/auto_nlist.c
-@@ -52,6 +52,9 @@ auto_nlist_value(const char *string)
-         }
-     }
-     if (*ptr == 0) {
-+#if !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7))
-+        static char *n_name = NULL;
-+#endif
-         *ptr = (struct autonlist *) malloc(sizeof(struct autonlist));
-         it = *ptr;
-         it->left = 0;
-@@ -66,15 +69,35 @@ auto_nlist_value(const char *string)
-         strcpy(it->nl[0].n_name, string);
-         it->nl[0].n_name[strlen(string)+1] = '\0';
- #else
--        sprintf(it->nl[0].n_name, "_%s", string);
-+
-+        if (n_name != NULL)
-+            free(n_name);
-+
-+        n_name = malloc(strlen(string) + 2);
-+        if (n_name == NULL) {
-+            snmp_log(LOG_ERR, "nlist err: failed to allocate memory");
-+            return (-1);
-+        }
-+        snprintf(n_name, strlen(string) + 2, "_%s", string);
-+        it->nl[0].n_name = (const char*)n_name;
- #endif
-         it->nl[1].n_name = 0;
-         init_nlist(it->nl);
- #if !(defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7) || \
--                    defined(netbsd1) || defined(dragonfly)) 
-+                    defined(netbsd1) || defined(dragonfly))
-         if (it->nl[0].n_type == 0) {
--            strcpy(it->nl[0].n_name, string);
--            it->nl[0].n_name[strlen(string)+1] = '\0';
-+            static char *n_name2 = NULL;
-+
-+            if (n_name2 != NULL)
-+                free(n_name2);
-+
-+            n_name2 = malloc(strlen(string) + 1);
-+            if (n_name2 == NULL) {
-+                snmp_log(LOG_ERR, "nlist err: failed to allocate memory");
-+                return (-1);
-+            }
-+            strcpy(n_name2, string);
-+            it->nl[0].n_name = (const char*)n_name2;
-             init_nlist(it->nl);
-         }
- #endif
-@@ -86,7 +109,8 @@ auto_nlist_value(const char *string)
- 	    }
-             return (-1);
-         } else {
--            DEBUGMSGTL(("auto_nlist:auto_nlist_value", "found symbol %s at %x.\n",
-+            DEBUGMSGTL(("auto_nlist:auto_nlist_value",
-+			"found symbol %s at %lx.\n",
-                         it->symbol, it->nl[0].n_value));
-             return (it->nl[0].n_value);
-         }
-@@ -95,7 +119,7 @@ auto_nlist_value(const char *string)
- }
- 
- int
--auto_nlist(const char *string, char *var, int size)
-+auto_nlist(const char *string, char *var, size_t size)
- {
-     long            result;
-     int             ret;
-@@ -192,7 +216,7 @@ init_nlist(struct nlist nl[])
- }
- 
- int
--KNLookup(struct nlist nl[], int nl_which, char *buf, int s)
-+KNLookup(struct nlist nl[], int nl_which, char *buf, size_t s)
- {
-     struct nlist   *nlp = &nl[nl_which];
- 
-diff --git a/agent/helpers/all_helpers.c b/agent/helpers/all_helpers.c
-index 0f2b6a1..e1e1b78 100644
---- a/agent/helpers/all_helpers.c
-+++ b/agent/helpers/all_helpers.c
-@@ -26,7 +26,7 @@ netsnmp_init_helpers(void)
-     netsnmp_init_bulk_to_next_helper();
- #ifndef NETSNMP_FEATURE_REMOVE_TABLE_DATASET
-     netsnmp_init_table_dataset();
--#endif
-+#endif /* NETSNMP_FEATURE_REMOVE_TABLE_DATASET */
- 
- #ifndef NETSNMP_FEATURE_REMOVE_ROW_MERGE
-     netsnmp_init_row_merge();
-diff --git a/agent/helpers/instance.c b/agent/helpers/instance.c
-index 2142909..a187d58 100644
---- a/agent/helpers/instance.c
-+++ b/agent/helpers/instance.c
-@@ -536,6 +536,8 @@ netsnmp_register_num_file_instance(const char *name,
- }
- #endif /* NETSNMP_FEATURE_REMOVE_REGISTER_NUM_FILE_INSTANCE */
- 
-+netsnmp_feature_child_of(register_int_instance,instance)
-+#ifndef NETSNMP_FEATURE_REMOVE_REGISTER_INT_INSTANCE
- /**
-  * This function registers an int helper handler to a specified OID.
-  *
-@@ -554,8 +556,6 @@ netsnmp_register_num_file_instance(const char *name,
-  *      MIB_REGISTERED_OK is returned if the registration was a success.
-  *	Failures are MIB_REGISTRATION_FAILED and MIB_DUPLICATE_REGISTRATION.
-  */
--netsnmp_feature_child_of(register_int_instance,instance)
--#ifndef NETSNMP_FEATURE_REMOVE_REGISTER_INT_INSTANCE
- int
- netsnmp_register_int_instance(const char *name,
-                               const oid * reg_oid, size_t reg_oid_len,
-diff --git a/agent/helpers/old_api.c b/agent/helpers/old_api.c
-index b1630e6..4888cbc 100644
---- a/agent/helpers/old_api.c
-+++ b/agent/helpers/old_api.c
-@@ -103,8 +103,12 @@ netsnmp_register_old_api(const char *moduleName,
-         reginfo->rootoid_len = (mibloclen + vp->namelen);
-         reginfo->rootoid =
-             (oid *) malloc(reginfo->rootoid_len * sizeof(oid));
--        if (reginfo->rootoid == NULL)
-+        if (reginfo->rootoid == NULL) {
-+            SNMP_FREE(vp);
-+            SNMP_FREE(reginfo->handlerName);
-+            SNMP_FREE(reginfo);
-             return SNMP_ERR_GENERR;
-+        }
- 
-         memcpy(reginfo->rootoid, mibloc, mibloclen * sizeof(oid));
-         memcpy(reginfo->rootoid + mibloclen, vp->name, vp->namelen
-@@ -127,7 +131,7 @@ netsnmp_register_old_api(const char *moduleName,
-          */
-         if (netsnmp_register_handler(reginfo) != MIB_REGISTERED_OK) {
-             /** netsnmp_handler_registration_free(reginfo); already freed */
--            SNMP_FREE(vp);
-+            /* SNMP_FREE(vp); already freed */
-         }
-     }
-     return SNMPERR_SUCCESS;
-diff --git a/agent/helpers/snmp_get_statistic.c b/agent/helpers/snmp_get_statistic.c
-index 2e4fed8..efac2ac 100644
---- a/agent/helpers/snmp_get_statistic.c
-+++ b/agent/helpers/snmp_get_statistic.c
-@@ -58,4 +58,4 @@ netsnmp_register_statistic_handler(netsnmp_handler_registration *reginfo,
- }
- #else /* !NETSNMP_FEATURE_REMOVE_HELPER_GET_STATISTICS */
- netsnmp_feature_unused(helper_statistics);
--#endif
-+#endif /* !NETSNMP_FEATURE_REMOVE_HELPER_GET_STATISTICS */
-diff --git a/agent/helpers/table_array.c b/agent/helpers/table_array.c
-index 49e0b24..7c98aae 100644
---- a/agent/helpers/table_array.c
-+++ b/agent/helpers/table_array.c
-@@ -576,8 +576,11 @@ group_requests(netsnmp_agent_request_info *agtreq_info,
-         DEBUGMSG(("table_array:group", "\n"));
-         g = SNMP_MALLOC_TYPEDEF(netsnmp_request_group);
-         i = SNMP_MALLOC_TYPEDEF(netsnmp_request_group_item);
--        if (i == NULL || g == NULL)
-+        if (i == NULL || g == NULL) {
-+            SNMP_FREE(i);
-+            SNMP_FREE(g);
-             return;
-+        }
-         g->list = i;
-         g->table = tad->table;
-         i->ri = current;
-diff --git a/agent/helpers/table_dataset.c b/agent/helpers/table_dataset.c
-index 5160748..0949a8a 100644
---- a/agent/helpers/table_dataset.c
-+++ b/agent/helpers/table_dataset.c
-@@ -467,7 +467,7 @@ netsnmp_register_table_data_set(netsnmp_handler_registration *reginfo,
-                            netsnmp_get_table_data_set_handler(data_set));
-     ret = netsnmp_register_table_data(reginfo, data_set->table,
-                                        table_info);
--    if (reginfo->handler)
-+    if (ret == SNMPERR_SUCCESS && reginfo->handler)
-         netsnmp_handler_owns_table_info(reginfo->handler->next);
-     return ret;
- }
-@@ -1105,9 +1105,11 @@ netsnmp_config_parse_table_set(const char *token, char *line)
-         switch (tp->access) {
-         case MIB_ACCESS_CREATE:
-             table_set->allow_creation = 1;
-+            /* fallthrough */
-         case MIB_ACCESS_READWRITE:
-         case MIB_ACCESS_WRITEONLY:
-             canwrite = 1;
-+            /* fallthrough */
-         case MIB_ACCESS_READONLY:
-             DEBUGMSGTL(("table_set_add_table",
-                         "adding column %ld of type %d\n", tp->subid, type));
-diff --git a/agent/helpers/table_iterator.c b/agent/helpers/table_iterator.c
-index 64ef2cb..8ed5cd0 100644
---- a/agent/helpers/table_iterator.c
-+++ b/agent/helpers/table_iterator.c
-@@ -648,6 +648,8 @@ netsnmp_table_iterator_helper_handler(netsnmp_mib_handler *handler,
-                          */
-                         if (free_this_index_search)
-                             snmp_free_varbind(free_this_index_search);
-+                        netsnmp_free_request_data_sets(reqtmp);
-+                        SNMP_FREE(reqtmp);
-                         return SNMP_ERR_GENERR;
-                     }
-                     coloid[reginfo->rootoid_len + 1] = table_info->colnum;
-@@ -681,6 +683,8 @@ netsnmp_table_iterator_helper_handler(netsnmp_mib_handler *handler,
-                                 if (free_this_index_search)
-                                     snmp_free_varbind
-                                         (free_this_index_search);
-+                                netsnmp_free_request_data_sets(reqtmp);
-+                                SNMP_FREE(reqtmp);
-                                 return SNMP_ERR_GENERR;
-                             }
-                             request_count--;   /* One less to look for */
-diff --git a/agent/helpers/watcher.c b/agent/helpers/watcher.c
-index ee80736..9b3933b 100644
---- a/agent/helpers/watcher.c
-+++ b/agent/helpers/watcher.c
-@@ -245,14 +245,11 @@ netsnmp_watcher_helper_handler(netsnmp_mib_handler *handler,
-     netsnmp_watcher_cache *old_data;
- 
-     DEBUGMSGTL(("helper:watcher", "Got request:  %d\n", reqinfo->mode));
--
-     DEBUGMSGTL(( "helper:watcher", "  oid:"));
-     DEBUGMSGOID(("helper:watcher", requests->requestvb->name,
-                                    requests->requestvb->name_length));
-     DEBUGMSG((   "helper:watcher", "\n"));
- 
--
--
-     switch (reqinfo->mode) {
-         /*
-          * data requests 
-@@ -392,14 +389,11 @@ netsnmp_watched_timestamp_handler(netsnmp_mib_handler *handler,
- 
-     DEBUGMSGTL(("helper:watcher:timestamp",
-                                "Got request:  %d\n", reqinfo->mode));
--
-     DEBUGMSGTL(( "helper:watcher:timestamp", "  oid:"));
-     DEBUGMSGOID(("helper:watcher:timestamp", requests->requestvb->name,
-                                    requests->requestvb->name_length));
-     DEBUGMSG((   "helper:watcher:timestamp", "\n"));
- 
--
--
-     switch (reqinfo->mode) {
-         /*
-          * data requests 
-@@ -481,14 +475,11 @@ netsnmp_watched_spinlock_handler(netsnmp_mib_handler *handler,
- 
-     DEBUGMSGTL(("helper:watcher:spinlock",
-                                "Got request:  %d\n", reqinfo->mode));
--
-     DEBUGMSGTL(( "helper:watcher:spinlock", "  oid:"));
-     DEBUGMSGOID(("helper:watcher:spinlock", requests->requestvb->name,
-                                    requests->requestvb->name_length));
-     DEBUGMSG((   "helper:watcher:spinlock", "\n"));
- 
--
--
-     switch (reqinfo->mode) {
-         /*
-          * Ensure the assigned value matches the current one
-diff --git a/agent/mibgroup/Rmon/agutil.c b/agent/mibgroup/Rmon/agutil.c
-index d28bb67..12c6342 100644
---- a/agent/mibgroup/Rmon/agutil.c
-+++ b/agent/mibgroup/Rmon/agutil.c
-@@ -200,12 +200,7 @@ AGUTIL_get_oid_value(u_char * var_val, u_char var_val_type,
- u_long
- AGUTIL_sys_up_time(void)
- {
--    struct timeval  current, delta;
--    const struct timeval* const starttime_ptr = netsnmp_get_agent_starttime();
--
--    gettimeofday(&current, NULL);
--    NETSNMP_TIMERSUB(&current, starttime_ptr, &delta);
--    return delta.tv_sec * 100 + delta.tv_usec / 10000;
-+    return netsnmp_get_agent_runtime();
- }
- 
- /*
-diff --git a/agent/mibgroup/Rmon/event.c b/agent/mibgroup/Rmon/event.c
-index 008ebaa..04a8555 100644
---- a/agent/mibgroup/Rmon/event.c
-+++ b/agent/mibgroup/Rmon/event.c
-@@ -128,6 +128,7 @@ typedef struct {
- 
- static TABLE_DEFINTION_T EventCtrlTable;
- static TABLE_DEFINTION_T *table_ptr = &EventCtrlTable;
-+static unsigned char zero_octet_string[1];
- 
- /*
-  * Control Table RowApi Callbacks 
-@@ -262,7 +263,6 @@ write_eventControl(int action, u_char * var_val, u_char var_val_type,
-     static int      prev_action = COMMIT;
-     RMON_ENTRY_T   *hdr;
-     CRTL_ENTRY_T   *cloned_body;
--    CRTL_ENTRY_T   *body;
- 
-     switch (action) {
-     case RESERVE1:
-@@ -283,7 +283,6 @@ write_eventControl(int action, u_char * var_val, u_char var_val_type,
-         leaf_id = (int) name[eventEntryFirstIndexBegin - 1];
-         hdr = ROWAPI_find(table_ptr, long_temp);        /* it MUST be OK */
-         cloned_body = (CRTL_ENTRY_T *) hdr->tmp;
--        body = (CRTL_ENTRY_T *) hdr->body;
-         switch (leaf_id) {
-         case Leaf_event_description:
-             char_temp = AGMALLOC(1 + MAX_event_description);
-@@ -406,7 +405,7 @@ var_eventTable(struct variable *vp,
-             return (unsigned char *) theEntry.event_description;
-         } else {
-             *var_len = 0;
--            return NETSNMP_REMOVE_CONST(unsigned char *, "");
-+            return zero_octet_string;
-         }
-     case EVENTTYPE:
-         long_ret = theEntry.event_type;
-@@ -417,7 +416,7 @@ var_eventTable(struct variable *vp,
-             return (unsigned char *) theEntry.event_community;
-         } else {
-             *var_len = 0;
--            return NETSNMP_REMOVE_CONST(unsigned char *, "");
-+            return zero_octet_string;
-         }
-     case EVENTLASTTIMESENT:
-         long_ret = theEntry.event_last_time_sent;
-@@ -428,7 +427,7 @@ var_eventTable(struct variable *vp,
-             return (unsigned char *) hdr->owner;
-         } else {
-             *var_len = 0;
--            return NETSNMP_REMOVE_CONST(unsigned char *, "");
-+            return zero_octet_string;
-         }
-     case EVENTSTATUS:
-         long_ret = hdr->status;
-@@ -457,7 +456,6 @@ var_logTable(struct variable *vp,
-     static long     long_ret;
-     static DATA_ENTRY_T theEntry;
-     RMON_ENTRY_T   *hdr;
--    CRTL_ENTRY_T   *ctrl;
- 
-     *write_method = NULL;
-     hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len,
-@@ -467,8 +465,6 @@ var_logTable(struct variable *vp,
-     if (!hdr)
-         return NULL;
- 
--    ctrl = (CRTL_ENTRY_T *) hdr->body;
--
-     *var_len = sizeof(long);    /* default */
- 
-     switch (vp->magic) {
-@@ -487,7 +483,7 @@ var_logTable(struct variable *vp,
-             return (unsigned char *) theEntry.log_description;
-         } else {
-             *var_len = 0;
--            return NETSNMP_REMOVE_CONST(unsigned char *, "");
-+            return zero_octet_string;
-         }
-     default:
-         ERROR_MSG("");
-diff --git a/agent/mibgroup/Rmon/history.c b/agent/mibgroup/Rmon/history.c
-index b962567..c8e9c25 100644
---- a/agent/mibgroup/Rmon/history.c
-+++ b/agent/mibgroup/Rmon/history.c
-@@ -181,7 +181,7 @@ write_historyControl(int action, u_char * var_val, u_char var_val_type,
-                                                var_val_len,
-                                                MIN_historyControlBucketsRequested,
-                                                MAX_historyControlBucketsRequested,
--                                               &cloned_body->scrlr.
-+                                               (long *) &cloned_body->scrlr.
-                                                data_requested);
-             if (SNMP_ERR_NOERROR != snmp_status) {
-                 return snmp_status;
-@@ -198,7 +198,7 @@ write_historyControl(int action, u_char * var_val, u_char var_val_type,
-                                                var_val_len,
-                                                MIN_historyControlInterval,
-                                                MAX_historyControlInterval,
--                                               &cloned_body->interval);
-+                                               (long *) &cloned_body->interval);
-             if (SNMP_ERR_NOERROR != snmp_status) {
-                 return snmp_status;
-             }
-@@ -257,6 +257,7 @@ var_historyControlTable(struct variable *vp,
-                         int exact,
-                         size_t * var_len, WriteMethod ** write_method)
- {
-+    static unsigned char zero_octet_string[1];
-     static long     long_ret;
-     static CRTL_ENTRY_T theEntry;
-     RMON_ENTRY_T   *hdr;
-@@ -298,7 +299,7 @@ var_historyControlTable(struct variable *vp,
-             return (unsigned char *) hdr->owner;
-         } else {
-             *var_len = 0;
--            return NETSNMP_REMOVE_CONST(unsigned char *, "");
-+            return zero_octet_string;
-         }
- 
-     case CTRL_STATUS:
-@@ -530,7 +531,6 @@ var_etherHistoryTable(struct variable *vp,
-     static long     long_ret;
-     static DATA_ENTRY_T theBucket;
-     RMON_ENTRY_T   *hdr;
--    CRTL_ENTRY_T   *ctrl;
- 
-     *write_method = NULL;
-     hdr = ROWDATAAPI_header_DataEntry(vp, name, length, exact, var_len,
-@@ -542,8 +542,6 @@ var_etherHistoryTable(struct variable *vp,
- 
-     *var_len = sizeof(long);    /* default */
- 
--    ctrl = (CRTL_ENTRY_T *) hdr->body;
--
-     switch (vp->magic) {
-     case DATA_INDEX:
-         long_ret = hdr->ctrl_index;
-diff --git a/agent/mibgroup/Rmon/row_api.h b/agent/mibgroup/Rmon/row_api.h
-index 2fb5a88..9f576be 100644
---- a/agent/mibgroup/Rmon/row_api.h
-+++ b/agent/mibgroup/Rmon/row_api.h
-@@ -62,7 +62,7 @@ typedef struct tagEntry {
- typedef int     (ENTRY_CALLBACK_T) (RMON_ENTRY_T *);
- 
- typedef struct {
--    char           *name;
-+    const char     *name;
-     RMON_ENTRY_T   *first;
-     u_long          max_number_of_entries;      /* '<0' means without limit */
-     u_long          current_number_of_entries;
-diff --git a/agent/mibgroup/Rmon/statistics.c b/agent/mibgroup/Rmon/statistics.c
-index 51f25ee..3ed4acb 100644
---- a/agent/mibgroup/Rmon/statistics.c
-+++ b/agent/mibgroup/Rmon/statistics.c
-@@ -317,6 +317,7 @@ var_etherStatsEntry(struct variable * vp, oid * name, size_t * length,
-                     int exact, size_t * var_len,
-                     WriteMethod ** write_method)
- {
-+    static unsigned char zero_octet_string[1];
-     static long     long_return;
-     static CRTL_ENTRY_T theEntry;
-     RMON_ENTRY_T   *hdr;
-@@ -397,7 +398,7 @@ var_etherStatsEntry(struct variable * vp, oid * name, size_t * length,
-             return (unsigned char *) hdr->owner;
-         } else {
-             *var_len = 0;
--            return NETSNMP_REMOVE_CONST(unsigned char *, "");
-+            return zero_octet_string;
-         }
-     case IDetherStatsStatus:
-         long_return = hdr->status;
-diff --git a/agent/mibgroup/agent/extend.c b/agent/mibgroup/agent/extend.c
-index ddef4fb..8268559 100644
---- a/agent/mibgroup/agent/extend.c
-+++ b/agent/mibgroup/agent/extend.c
-@@ -120,7 +120,8 @@ _register_extend( oid *base, size_t len )
-     netsnmp_table_data                *dinfo;
-     netsnmp_table_registration_info   *tinfo;
-     netsnmp_watcher_info              *winfo;
--    netsnmp_handler_registration      *reg;
-+    netsnmp_handler_registration      *reg = NULL;
-+    int                                rc;
- 
-     for ( eptr=ereg_head; eptr; eptr=eptr->next ) {
-         if (!snmp_oid_compare( base, len, eptr->root_oid, eptr->oid_len))
-@@ -128,6 +129,8 @@ _register_extend( oid *base, size_t len )
-     }
-     if (!eptr) {
-         eptr = SNMP_MALLOC_TYPEDEF( extend_registration_block );
-+        if (!eptr)
-+            return NULL;
-         eptr->root_oid = snmp_duplicate_objid( base, len );
-         eptr->oid_len  = len;
-         eptr->num_entries = 0;
-@@ -157,7 +160,10 @@ _register_extend( oid *base, size_t len )
-                 "nsExtendConfigTable", handle_nsExtendConfigTable, 
-                 oid_buf, len+1, HANDLER_CAN_RONLY);
- #endif /* !NETSNMP_NO_WRITE_SUPPORT */
--    netsnmp_register_table_data( reg, dinfo, tinfo );
-+    rc = netsnmp_register_table_data( reg, dinfo, tinfo );
-+    if (rc != SNMPERR_SUCCESS) {
-+        goto bail;
-+    }
-     netsnmp_handler_owns_table_info(reg->handler->next);
-     eptr->reg[0] = reg;
- 
-@@ -175,7 +181,9 @@ _register_extend( oid *base, size_t len )
-     reg   = netsnmp_create_handler_registration(
-                 "nsExtendOut1Table", handle_nsExtendOutput1Table, 
-                 oid_buf, len+1, HANDLER_CAN_RONLY);
--    netsnmp_register_table_data( reg, dinfo, tinfo );
-+    rc = netsnmp_register_table_data( reg, dinfo, tinfo );
-+    if (rc != SNMPERR_SUCCESS)
-+        goto bail;
-     netsnmp_handler_owns_table_info(reg->handler->next);
-     eptr->reg[1] = reg;
- 
-@@ -195,7 +203,9 @@ _register_extend( oid *base, size_t len )
-     reg   = netsnmp_create_handler_registration(
-                 "nsExtendOut2Table", handle_nsExtendOutput2Table, 
-                 oid_buf, len+1, HANDLER_CAN_RONLY);
--    netsnmp_register_table( reg, tinfo );
-+    rc = netsnmp_register_table( reg, tinfo );
-+    if (rc != SNMPERR_SUCCESS)
-+        goto bail;
-     netsnmp_handler_owns_table_info(reg->handler->next);
-     eptr->reg[2] = reg;
- 
-@@ -209,9 +219,20 @@ _register_extend( oid *base, size_t len )
-     winfo = netsnmp_create_watcher_info(
-                 &(eptr->num_entries), sizeof(eptr->num_entries),
-                 ASN_INTEGER, WATCHER_FIXED_SIZE);
--    netsnmp_register_watched_scalar2( reg, winfo );
-+    rc = netsnmp_register_watched_scalar2( reg, winfo );
-+    if (rc != SNMPERR_SUCCESS)
-+        goto bail;
- 
-     return eptr;
-+
-+bail:
-+    if (eptr->reg[2])
-+        netsnmp_unregister_handler(eptr->reg[2]);
-+    if (eptr->reg[1])
-+        netsnmp_unregister_handler(eptr->reg[1]);
-+    if (eptr->reg[0])
-+        netsnmp_unregister_handler(eptr->reg[0]);
-+    return NULL;
- }
- 
- static void
-@@ -406,9 +427,9 @@ _free_extension( netsnmp_extend *extension, extend_registration_block *ereg )
-             eprev->next = eptr->next;
-         else
-             ereg->ehead = eptr->next;
-+        netsnmp_table_data_remove_and_delete_row( ereg->dinfo, extension->row);
-     }
- 
--    netsnmp_table_data_remove_and_delete_row( ereg->dinfo, extension->row);
-     SNMP_FREE( extension->token );
-     SNMP_FREE( extension->cache );
-     SNMP_FREE( extension->command );
-diff --git a/agent/mibgroup/agent/nsDebug.c b/agent/mibgroup/agent/nsDebug.c
-index 0a629cc..89a90b0 100644
---- a/agent/mibgroup/agent/nsDebug.c
-+++ b/agent/mibgroup/agent/nsDebug.c
-@@ -423,8 +423,9 @@ handle_nsDebugTable(netsnmp_mib_handler *handler,
- 		 */
-                 debug_entry = (netsnmp_token_descr*)
-                                netsnmp_extract_iterator_context(request);
--                debug_entry->enabled =
--                    (*request->requestvb->val.integer == RS_ACTIVE);
-+                if (debug_entry)
-+                    debug_entry->enabled =
-+                        (*request->requestvb->val.integer == RS_ACTIVE);
- 		break;
- 
-             case RS_CREATEANDWAIT:
-diff --git a/agent/mibgroup/agent/nsLogging.c b/agent/mibgroup/agent/nsLogging.c
-index c06a18a..7f20bdb 100644
---- a/agent/mibgroup/agent/nsLogging.c
-+++ b/agent/mibgroup/agent/nsLogging.c
-@@ -363,7 +363,7 @@ handle_nsLoggingTable(netsnmp_mib_handler *handler,
- 		switch ( *request->requestvb->val.integer ) {
-                 case RS_ACTIVE:
-                 case RS_CREATEANDGO:
--                    if ( !logh->type ) {
-+                    if ( !logh || !logh->type ) {
-                         netsnmp_set_request_error(reqinfo, request,
-                                                   SNMP_ERR_INCONSISTENTVALUE);
-                         return SNMP_ERR_INCONSISTENTVALUE;
-diff --git a/agent/mibgroup/agent/nsVacmAccessTable.c b/agent/mibgroup/agent/nsVacmAccessTable.c
-index 22d2154..79fa97d 100644
---- a/agent/mibgroup/agent/nsVacmAccessTable.c
-+++ b/agent/mibgroup/agent/nsVacmAccessTable.c
-@@ -174,11 +174,11 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler,
-             /* Extract the authType token from the list of indexes */
-             idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;
-             memset(atype, 0, sizeof(atype));
--            strncpy(atype, (char *)idx->val.string, idx->val_len);
-+            memcpy(atype, (char *)idx->val.string, idx->val_len);
-             viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);
-             DEBUGMSGTL(("nsVacm", "GET %s (%d)\n", idx->val.string, viewIdx));
- 
--            if (!entry)
-+            if (!entry || viewIdx < 0)
-                 continue;
- 
-             switch (table_info->colnum) {
-@@ -248,7 +248,7 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler,
-                  */
-                 idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;
-                 memset(atype, 0, sizeof(atype));
--                strncpy(atype, (char *)idx->val.string, idx->val_len);
-+                memcpy(atype, (char *)idx->val.string, idx->val_len);
-                 viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);
-                 if ( viewIdx < 0 ) {
-                     ret = SNMP_ERR_NOCREATION;
-@@ -322,8 +322,10 @@ nsVacmAccessTable_handler(netsnmp_mib_handler *handler,
-             /* Extract the authType token from the list of indexes */
-             idx = table_info->indexes->next_variable->next_variable->next_variable->next_variable;
-             memset(atype, 0, sizeof(atype));
--            strncpy(atype, (char *)idx->val.string, idx->val_len);
-+            memcpy(atype, (char *)idx->val.string, idx->val_len);
-             viewIdx = se_find_value_in_slist(VACM_VIEW_ENUM_NAME, atype);
-+            if (viewIdx < 0)
-+                    continue;
- 
-             switch (table_info->colnum) {
-             case COLUMN_NSVACMCONTEXTMATCH:
-diff --git a/agent/mibgroup/agentx/agentx_config.c b/agent/mibgroup/agentx/agentx_config.c
-index b590c7a..ea453c2 100644
---- a/agent/mibgroup/agentx/agentx_config.c
-+++ b/agent/mibgroup/agentx/agentx_config.c
-@@ -180,10 +180,8 @@ agentx_config_init(void)
-      */
-     netsnmp_register_default_domain("agentx", "unix tcp");
-     netsnmp_register_default_target("agentx", "unix", NETSNMP_AGENTX_SOCKET);
--#define val(x) __STRING(x)
-     netsnmp_register_default_target("agentx", "tcp",
--                                    "localhost:" val(AGENTX_PORT));
--#undef val
-+                                    "localhost:" __STRING(AGENTX_PORT));
-     agentx_register_config_handler("agentxsocket",
-                                   agentx_parse_agentx_socket, NULL,
-                                   "AgentX bind address");
-diff --git a/agent/mibgroup/agentx/master_admin.c b/agent/mibgroup/agentx/master_admin.c
-index 3f4b33d..f16f392 100644
---- a/agent/mibgroup/agentx/master_admin.c
-+++ b/agent/mibgroup/agentx/master_admin.c
-@@ -64,7 +64,6 @@ int
- open_agentx_session(netsnmp_session * session, netsnmp_pdu *pdu)
- {
-     netsnmp_session *sp;
--    struct timeval  now;
- 
-     DEBUGMSGTL(("agentx/master", "open %8p\n", session));
-     sp = (netsnmp_session *) malloc(sizeof(netsnmp_session));
-@@ -104,8 +103,7 @@ open_agentx_session(netsnmp_session * session, netsnmp_pdu *pdu)
-                                                  name_length);
-     sp->securityAuthProtoLen = pdu->variables->name_length;
-     sp->securityName = strdup((char *) pdu->variables->val.string);
--    gettimeofday(&now, NULL);
--    sp->engineTime = calculate_sectime_diff(&now, netsnmp_get_agent_starttime());
-+    sp->engineTime = (netsnmp_get_agent_runtime() + 50) / 100;
- 
-     sp->subsession = session;   /* link back to head */
-     sp->flags |= SNMP_FLAGS_SUBSESSION;
-diff --git a/agent/mibgroup/agentx/protocol.c b/agent/mibgroup/agentx/protocol.c
-index 09c149f..6e3daf3 100644
---- a/agent/mibgroup/agentx/protocol.c
-+++ b/agent/mibgroup/agentx/protocol.c
-@@ -453,6 +453,7 @@ agentx_realloc_build_varbind(u_char ** buf, size_t * buf_len,
-     case ASN_COUNTER:
-     case ASN_GAUGE:
-     case ASN_TIMETICKS:
-+    case ASN_UINTEGER:
-         if (!agentx_realloc_build_int(buf, buf_len, out_len, allow_realloc,
-                                       *(vp->val.integer), network_order)) {
-             DEBUGINDENTLESS();
-@@ -1372,6 +1373,7 @@ agentx_parse_varbind(u_char * data, size_t * length, int *type,
-     case ASN_COUNTER:
-     case ASN_GAUGE:
-     case ASN_TIMETICKS:
-+    case ASN_UINTEGER:
-         int_val = agentx_parse_int(bufp, network_byte_order);
-         memmove(data_buf, &int_val, 4);
-         *data_len = 4;
-@@ -1429,6 +1431,7 @@ agentx_parse_varbind(u_char * data, size_t * length, int *type,
-         break;
- 
-     default:
-+        DEBUGMSG(("recv", "Can not parse type %x", *type));
-         DEBUGINDENTLESS();
-         return NULL;
-     }
-diff --git a/agent/mibgroup/agentx/subagent.c b/agent/mibgroup/agentx/subagent.c
-index 5d51834..76b1acf 100644
---- a/agent/mibgroup/agentx/subagent.c
-+++ b/agent/mibgroup/agentx/subagent.c
-@@ -243,6 +243,24 @@ free_set_vars(netsnmp_session * ss, netsnmp_pdu *pdu)
- }
- #endif /* !NETSNMP_NO_WRITE_SUPPORT */
- 
-+static void
-+send_agentx_error(netsnmp_session *session, netsnmp_pdu *pdu, int errstat, int errindex)
-+{
-+    pdu = snmp_clone_pdu(pdu);
-+    pdu->command   = AGENTX_MSG_RESPONSE;
-+    pdu->version   = session->version;
-+    pdu->errstat   = errstat;
-+    pdu->errindex  = errindex;
-+    snmp_free_varbind(pdu->variables);
-+    pdu->variables = NULL;
-+
-+    DEBUGMSGTL(("agentx/subagent", "Sending AgentX response error stat %d idx %d\n",
-+             errstat, errindex));
-+    if (!snmp_send(session, pdu)) {
-+        snmp_free_pdu(pdu);
-+    }
-+}
-+
- int
- handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-                      netsnmp_pdu *pdu, void *magic)
-@@ -298,8 +316,10 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-              * agentx_reopen_session unregisters itself if it succeeds in talking 
-              * to the master agent.  
-              */
--            snmp_alarm_register(period, SA_REPEAT, agentx_reopen_session,
--                                NULL);
-+            snmp_alarm_register(period, SA_REPEAT, agentx_reopen_session, NULL);
-+            snmp_log(LOG_INFO, "AgentX master disconnected us, reconnecting in %d\n", period);
-+        } else {
-+            snmp_log(LOG_INFO, "AgentX master disconnected us, not reconnecting\n");
-         }
-         return 0;
-     } else if (operation != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE) {
-@@ -325,6 +345,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-             (ns_subagent_magic *) calloc(1, sizeof(ns_subagent_magic));
-         if (smagic == NULL) {
-             DEBUGMSGTL(("agentx/subagent", "couldn't malloc() smagic\n"));
-+            /* would like to send_agentx_error(), but it needs memory too */
-             return 1;
-         }
-         smagic->original_command = pdu->command;
-@@ -389,6 +410,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-         if (asi == NULL) {
-             SNMP_FREE(smagic);
-             snmp_log(LOG_WARNING, "save_set_vars() failed\n");
-+            send_agentx_error(session, pdu, AGENTX_ERR_PARSE_FAILED, 0);
-             return 1;
-         }
-         asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_RESERVE1;
-@@ -402,6 +424,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-         if (asi == NULL) {
-             SNMP_FREE(smagic);
-             snmp_log(LOG_WARNING, "restore_set_vars() failed\n");
-+            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
-             return 1;
-         }
-         if (asi->mode != SNMP_MSG_INTERNAL_SET_RESERVE2) {
-@@ -409,6 +432,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-             snmp_log(LOG_WARNING,
-                      "dropping bad AgentX request (wrong mode %d)\n",
-                      asi->mode);
-+            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
-             return 1;
-         }
-         asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_ACTION;
-@@ -422,6 +446,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-         if (asi == NULL) {
-             SNMP_FREE(smagic);
-             snmp_log(LOG_WARNING, "restore_set_vars() failed\n");
-+            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
-             return 1;
-         }
-         if (asi->mode == SNMP_MSG_INTERNAL_SET_RESERVE1 ||
-@@ -446,6 +471,7 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-         if (asi == NULL) {
-             SNMP_FREE(smagic);
-             snmp_log(LOG_WARNING, "restore_set_vars() failed\n");
-+            send_agentx_error(session, pdu, AGENTX_ERR_PROCESSING_ERROR, 0);
-             return 1;
-         }
-         asi->mode = pdu->command = SNMP_MSG_INTERNAL_SET_UNDO;
-@@ -484,6 +510,26 @@ handle_agentx_packet(int operation, netsnmp_session * session, int reqid,
-     return 1;
- }
- 
-+static int
-+_invalid_op_and_magic(int op, ns_subagent_magic *smagic)
-+{
-+    int invalid = 0;
-+
-+    if (smagic && (snmp_sess_pointer(smagic->session) == NULL ||
-+        op == NETSNMP_CALLBACK_OP_TIMED_OUT)) {
-+        if (smagic->ovars != NULL) {
-+            snmp_free_varbind(smagic->ovars);
-+        }
-+        free(smagic);
-+        invalid = 1;
-+    }
-+
-+    if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE || smagic == NULL)
-+        invalid = 1;
-+
-+    return invalid;
-+}
-+
- int
- handle_subagent_response(int op, netsnmp_session * session, int reqid,
-                          netsnmp_pdu *pdu, void *magic)
-@@ -492,13 +538,7 @@ handle_subagent_response(int op, netsnmp_session * session, int reqid,
-     netsnmp_variable_list *u = NULL, *v = NULL;
-     int             rc = 0;
- 
--    if (op != NETSNMP_CALLBACK_OP_RECEIVED_MESSAGE || magic == NULL) {
--        if (op == NETSNMP_CALLBACK_OP_TIMED_OUT && magic != NULL) {
--            if (smagic->ovars != NULL) {
--                snmp_free_varbind(smagic->ovars);
--            }
--            free(smagic);
--        }
-+    if (_invalid_op_and_magic(op, magic)) {
-         return 1;
-     }
- 
-@@ -778,6 +818,7 @@ subagent_open_master_session(void)
- {
-     netsnmp_transport *t;
-     netsnmp_session sess;
-+    const char *agentx_socket;
- 
-     DEBUGMSGTL(("agentx/subagent", "opening session...\n"));
- 
-@@ -795,9 +836,9 @@ subagent_open_master_session(void)
-     sess.callback = handle_agentx_packet;
-     sess.authenticator = NULL;
- 
--    t = netsnmp_transport_open_client(
--            "agentx", netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
--                                            NETSNMP_DS_AGENT_X_SOCKET));
-+    agentx_socket = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
-+                                          NETSNMP_DS_AGENT_X_SOCKET);
-+    t = netsnmp_transport_open_client("agentx", agentx_socket);
-     if (t == NULL) {
-         /*
-          * Diagnose snmp_open errors with the input
-@@ -806,12 +847,9 @@ subagent_open_master_session(void)
-         if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
-                                     NETSNMP_DS_AGENT_NO_CONNECTION_WARNINGS)) {
-             char buf[1024];
--            const char *socket =
--                netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
--                                      NETSNMP_DS_AGENT_X_SOCKET);
-             snprintf(buf, sizeof(buf), "Warning: "
-                      "Failed to connect to the agentx master agent (%s)",
--                     socket ? socket : "[NIL]");
-+                     agentx_socket ? agentx_socket : "[NIL]");
-             if (!netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
-                                         NETSNMP_DS_AGENT_NO_ROOT_ACCESS)) {
-                 netsnmp_sess_log_error(LOG_WARNING, buf, &sess);
-@@ -832,8 +870,7 @@ subagent_open_master_session(void)
-             char buf[1024];
-             snprintf(buf, sizeof(buf), "Error: "
-                      "Failed to create the agentx master agent session (%s)",
--                     netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
--                                           NETSNMP_DS_AGENT_X_SOCKET));
-+                     agentx_socket);
-             snmp_sess_perror(buf, &sess);
-         }
-         netsnmp_transport_free(t);
-diff --git a/agent/mibgroup/disman/event/mteEventConf.c b/agent/mibgroup/disman/event/mteEventConf.c
-index 949d6e5..24192a6 100644
---- a/agent/mibgroup/disman/event/mteEventConf.c
-+++ b/agent/mibgroup/disman/event/mteEventConf.c
-@@ -296,6 +296,11 @@ parse_setEvent( const char *token, char *line )
-     if (cp && *cp == '=') {
-         cp = skip_token( cp );   /* skip the '=' assignment character */
-     }
-+    if (!cp) {
-+        config_perror("syntax error: missing set value");
-+        return;
-+    }
-+
-     value = strtol( cp, NULL, 0);
- 
-     /*
-diff --git a/agent/mibgroup/disman/event/mteEventNotificationTable.c b/agent/mibgroup/disman/event/mteEventNotificationTable.c
-index 9095f0e..7d2c94a 100644
---- a/agent/mibgroup/disman/event/mteEventNotificationTable.c
-+++ b/agent/mibgroup/disman/event/mteEventNotificationTable.c
-@@ -98,6 +98,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -136,6 +139,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             /*
-@@ -204,6 +210,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -225,6 +234,9 @@ mteEventNotificationTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteEventSetTable.c b/agent/mibgroup/disman/event/mteEventSetTable.c
-index 67a8170..ee696f1 100644
---- a/agent/mibgroup/disman/event/mteEventSetTable.c
-+++ b/agent/mibgroup/disman/event/mteEventSetTable.c
-@@ -100,6 +100,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -151,6 +154,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             /*
-@@ -233,6 +239,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -254,6 +263,9 @@ mteEventSetTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteEventTable.c b/agent/mibgroup/disman/event/mteEventTable.c
-index 5603715..c5b534e 100644
---- a/agent/mibgroup/disman/event/mteEventTable.c
-+++ b/agent/mibgroup/disman/event/mteEventTable.c
-@@ -106,6 +106,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-             if (!entry || !(entry->flags & MTE_EVENT_FLAG_VALID))
-@@ -142,6 +145,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -223,6 +229,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_RESERVE2:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -255,6 +264,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_FREE:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -280,6 +292,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-@@ -304,6 +319,9 @@ mteEventTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteEvent *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteObjectsTable.c b/agent/mibgroup/disman/event/mteObjectsTable.c
-index 443c5cc..f7f6e02 100644
---- a/agent/mibgroup/disman/event/mteObjectsTable.c
-+++ b/agent/mibgroup/disman/event/mteObjectsTable.c
-@@ -101,6 +101,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -135,6 +138,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
-     case MODE_SET_RESERVE1:
- 
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -198,8 +204,10 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
-         break;
- 
-     case MODE_SET_RESERVE2:
--
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -232,8 +240,10 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
-         break;
- 
-     case MODE_SET_FREE:
--
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -259,6 +269,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -282,6 +295,9 @@ mteObjectsTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteObject *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteTrigger.c b/agent/mibgroup/disman/event/mteTrigger.c
-index 002b543..7fca1b0 100644
---- a/agent/mibgroup/disman/event/mteTrigger.c
-+++ b/agent/mibgroup/disman/event/mteTrigger.c
-@@ -255,6 +255,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
-         DEBUGMSGTL(( "disman:event:trigger:monitor", "Trigger query (%s) failed: %d\n",
-                            (( entry->flags & MTE_TRIGGER_FLAG_VWILD ) ? "walk" : "get"), n));
-         _mteTrigger_failure( "failed to run mteTrigger query" );
-+        snmp_free_varbind(var);
-         return;
-     }
- 
-@@ -299,6 +300,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
-                 if (!vtmp) {
-                     _mteTrigger_failure(
-                           "failed to create mteTrigger temp varbind");
-+                    snmp_free_varbind(var);
-                     return;
-                 }
-                 vtmp->type = ASN_NULL;
-@@ -336,6 +338,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
-                     if (!vtmp) {
-                         _mteTrigger_failure(
-                                  "failed to create mteTrigger temp varbind");
-+                        snmp_free_varbind(var);
-                         return;
-                     }
-                     vtmp->type = ASN_NULL;
-@@ -377,6 +380,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
-                 if (!vtmp) {
-                     _mteTrigger_failure(
-                              "failed to create mteTrigger temp varbind");
-+                    snmp_free_varbind(var);
-                     return;
-                 }
-                 vtmp->type = ASN_NULL;
-@@ -712,6 +716,7 @@ mteTrigger_run( unsigned int reg, void *clientarg)
-                         if (!vtmp) {
-                             _mteTrigger_failure(
-                                   "failed to create mteTrigger discontinuity varbind");
-+                            snmp_free_varbind(dvar);
-                             return;
-                         }
-                         snmp_set_var_objid(vtmp, entry->mteDeltaDiscontID,
-diff --git a/agent/mibgroup/disman/event/mteTriggerBooleanTable.c b/agent/mibgroup/disman/event/mteTriggerBooleanTable.c
-index a34ad30..ed1ec30 100644
---- a/agent/mibgroup/disman/event/mteTriggerBooleanTable.c
-+++ b/agent/mibgroup/disman/event/mteTriggerBooleanTable.c
-@@ -97,6 +97,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -105,8 +108,10 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
-              *   rows where the mteTriggerTest 'boolean(1)' bit is set.
-              * So skip entries where this isn't the case.
-              */
--            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN ))
-+            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_BOOLEAN )) {
-+                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
-                 continue;
-+            }
- 
-             switch (tinfo->colnum) {
-             case COLUMN_MTETRIGGERBOOLEANCOMPARISON:
-@@ -152,6 +157,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -236,6 +244,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -256,6 +267,9 @@ mteTriggerBooleanTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteTriggerDeltaTable.c b/agent/mibgroup/disman/event/mteTriggerDeltaTable.c
-index 47f112c..c2c2e8e 100644
---- a/agent/mibgroup/disman/event/mteTriggerDeltaTable.c
-+++ b/agent/mibgroup/disman/event/mteTriggerDeltaTable.c
-@@ -27,6 +27,7 @@ init_mteTriggerDeltaTable(void)
-     size_t      mteTDeltaTable_oid_len = OID_LENGTH(mteTDeltaTable_oid);
-     netsnmp_handler_registration    *reg;
-     netsnmp_table_registration_info *table_info;
-+    int         rc;
- 
-     /*
-      * Ensure the (combined) table container is available...
-@@ -61,7 +62,9 @@ init_mteTriggerDeltaTable(void)
-     table_info->max_column = COLUMN_MTETRIGGERDELTADISCONTINUITYIDTYPE;
- 
-     /* Register this using the (common) trigger_table_data container */
--    netsnmp_tdata_register(reg, trigger_table_data, table_info);
-+    rc = netsnmp_tdata_register(reg, trigger_table_data, table_info);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
-     netsnmp_handler_owns_table_info(reg->handler->next);
-     DEBUGMSGTL(("disman:event:init", "Trigger Delta Table\n"));
- }
-@@ -89,6 +92,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -97,8 +103,10 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
-              *   rows where the mteTriggerSampleType is 'deltaValue(2)'
-              * So skip entries where this isn't the case.
-              */
--            if (!entry || !(entry->flags & MTE_TRIGGER_FLAG_DELTA ))
-+            if (!entry || !(entry->flags & MTE_TRIGGER_FLAG_DELTA )) {
-+                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
-                 continue;
-+            }
- 
-             switch (tinfo->colnum) {
-             case COLUMN_MTETRIGGERDELTADISCONTINUITYID:
-@@ -125,6 +133,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -199,6 +210,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -219,6 +233,9 @@ mteTriggerDeltaTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteTriggerExistenceTable.c b/agent/mibgroup/disman/event/mteTriggerExistenceTable.c
-index ce1299f..22b683e 100644
---- a/agent/mibgroup/disman/event/mteTriggerExistenceTable.c
-+++ b/agent/mibgroup/disman/event/mteTriggerExistenceTable.c
-@@ -27,6 +27,7 @@ init_mteTriggerExistenceTable(void)
-     static oid mteTExistTable_oid[]   = { 1, 3, 6, 1, 2, 1, 88, 1, 2, 4 };
-     size_t     mteTExistTable_oid_len = OID_LENGTH(mteTExistTable_oid);
-     netsnmp_handler_registration    *reg;
-+    int        rc;
- 
-     /*
-      * Ensure the (combined) table container is available...
-@@ -61,7 +62,10 @@ init_mteTriggerExistenceTable(void)
-     table_info->max_column = COLUMN_MTETRIGGEREXISTENCEEVENT;
- 
-     /* Register this using the (common) trigger_table_data container */
--    netsnmp_tdata_register(reg, trigger_table_data, table_info);
-+    rc = netsnmp_tdata_register(reg, trigger_table_data, table_info);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
-+
-     netsnmp_handler_owns_table_info(reg->handler->next);
-     DEBUGMSGTL(("disman:event:init", "Trigger Exist Table\n"));
- }
-@@ -89,6 +93,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -97,8 +104,10 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
-              *   rows where the mteTriggerTest 'existence(0)' bit is set.
-              * So skip entries where this isn't the case.
-              */
--            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE ))
-+            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_EXISTENCE )) {
-+                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
-                 continue;
-+            }
- 
-             switch (tinfo->colnum) {
-             case COLUMN_MTETRIGGEREXISTENCETEST:
-@@ -139,6 +148,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -212,6 +224,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -233,6 +248,9 @@ mteTriggerExistenceTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteTriggerTable.c b/agent/mibgroup/disman/event/mteTriggerTable.c
-index d738ab5..88c2f8b 100644
---- a/agent/mibgroup/disman/event/mteTriggerTable.c
-+++ b/agent/mibgroup/disman/event/mteTriggerTable.c
-@@ -109,6 +109,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -186,6 +189,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -292,6 +298,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_RESERVE2:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -324,6 +333,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_FREE:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -349,6 +361,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-@@ -373,6 +388,9 @@ mteTriggerTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/event/mteTriggerThresholdTable.c b/agent/mibgroup/disman/event/mteTriggerThresholdTable.c
-index 37d35e0..5aed0c8 100644
---- a/agent/mibgroup/disman/event/mteTriggerThresholdTable.c
-+++ b/agent/mibgroup/disman/event/mteTriggerThresholdTable.c
-@@ -97,6 +97,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -105,8 +108,10 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
-              *   rows where the mteTriggerTest 'threshold(2)' bit is set.
-              * So skip entries where this isn't the case.
-              */
--            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD ))
-+            if (!entry || !(entry->mteTriggerTest & MTE_TRIGGER_THRESHOLD )) {
-+                netsnmp_request_set_error(request, SNMP_NOSUCHINSTANCE);
-                 continue;
-+            }
- 
-             switch (tinfo->colnum) {
-             case COLUMN_MTETRIGGERTHRESHOLDSTARTUP:
-@@ -189,6 +194,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-@@ -276,6 +284,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             if (!entry) {
-                 /*
-@@ -296,6 +307,9 @@ mteTriggerThresholdTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct mteTrigger *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/expr/expErrorTable.c b/agent/mibgroup/disman/expr/expErrorTable.c
-index 6640a41..a759e2d 100644
---- a/agent/mibgroup/disman/expr/expErrorTable.c
-+++ b/agent/mibgroup/disman/expr/expErrorTable.c
-@@ -77,6 +77,9 @@ expErrorTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expExpression *)
-                     netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-diff --git a/agent/mibgroup/disman/expr/expExpressionTable.c b/agent/mibgroup/disman/expr/expExpressionTable.c
-index ced9e0c..79aa715 100644
---- a/agent/mibgroup/disman/expr/expExpressionTable.c
-+++ b/agent/mibgroup/disman/expr/expExpressionTable.c
-@@ -88,6 +88,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expExpression *)
-                     netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-@@ -150,6 +153,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expExpression *)
-                 netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-@@ -204,6 +210,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_RESERVE2:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -236,6 +245,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_FREE:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -261,6 +273,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
-             entry = (struct expExpression *)
-                     netsnmp_tdata_extract_entry(request);
-@@ -286,6 +301,9 @@ expExpressionTable_handler(netsnmp_mib_handler *handler,
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expExpression *)
-                 netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-diff --git a/agent/mibgroup/disman/expr/expObject.c b/agent/mibgroup/disman/expr/expObject.c
-index 28fbac6..c27437b 100644
---- a/agent/mibgroup/disman/expr/expObject.c
-+++ b/agent/mibgroup/disman/expr/expObject.c
-@@ -240,7 +240,6 @@ void
- expObject_getData( struct expExpression  *expr, struct expObject  *obj )
- {
-     netsnmp_variable_list *var;
--    int res;
- 
-     /*
-      * Retrieve and store the basic object value(s)
-@@ -279,7 +278,7 @@ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
-                                        expr->expPrefix_len,
-                                        expr->pvars );
-         }
--        res = netsnmp_query_get( var, expr->session );
-+        netsnmp_query_get( var, expr->session );
-     }
-     
-     if ( obj->expObjectSampleType != EXPSAMPLETYPE_ABSOLUTE ) {
-@@ -312,7 +311,7 @@ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
-         else
-             var = _expObject_buildList( obj->expObjDeltaD,
-                                         obj->expObjDeltaD_len, 0, NULL );
--        res = netsnmp_query_get( var, expr->session );
-+        netsnmp_query_get( var, expr->session );
-         if ( obj->old_dvars )
-             snmp_free_varbind( obj->old_dvars );
-         obj->old_dvars = obj->dvars;
-@@ -338,7 +337,7 @@ expObject_getData( struct expExpression  *expr, struct expObject  *obj )
-          *
-          *    (The MIB description seems bogus?)
-          */
--        res = netsnmp_query_get( var, expr->session );
-+        netsnmp_query_get( var, expr->session );
-         if ( obj->cvars )
-             snmp_free_varbind( obj->cvars );
-         obj->cvars = var;
-diff --git a/agent/mibgroup/disman/expr/expObjectTable.c b/agent/mibgroup/disman/expr/expObjectTable.c
-index 4182b3e..adda438 100644
---- a/agent/mibgroup/disman/expr/expObjectTable.c
-+++ b/agent/mibgroup/disman/expr/expObjectTable.c
-@@ -90,6 +90,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expObject *)netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-             if (!entry || !(entry->flags & EXP_OBJ_FLAG_VALID))
-@@ -159,6 +162,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expObject *)
-                 netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
-@@ -211,6 +217,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_RESERVE2:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -245,6 +254,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_FREE:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -270,6 +282,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_ACTION:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
-             entry = (struct expObject *)
-                     netsnmp_tdata_extract_entry(request);
-@@ -296,6 +311,9 @@ expObjectTable_handler(netsnmp_mib_handler *handler,
-          */
-         ret = 0;  /* Flag to re-check expExpressionPrefix settings */
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct expObject *) netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info(request);
- 
-diff --git a/agent/mibgroup/disman/expr/expValueTable.c b/agent/mibgroup/disman/expr/expValueTable.c
-index eac5faa..d74dbd1 100644
---- a/agent/mibgroup/disman/expr/expValueTable.c
-+++ b/agent/mibgroup/disman/expr/expValueTable.c
-@@ -124,7 +124,7 @@ NEXT_EXP:
-         }
-         if ( vp->val.objid[0] != 0 ) {
-             DEBUGMSGTL(( "disman:expr:val",
--                         "non-zero instance (%d)\n", vp->val.objid[0]));
-+                         "non-zero instance (%" NETSNMP_PRIo "d)\n", vp->val.objid[0]));
-             return NULL;  /* Invalid instance */
-         }
- 
-@@ -158,7 +158,7 @@ NEXT_EXP:
-          */
-         if ( vp->val_len > 0 && vp->val.objid[0] != 0 ) {
-             DEBUGMSGTL(( "disman:expr:val",
--                         "non-zero next instance (%d)\n", vp->val.objid[0]));
-+                         "non-zero next instance (%" NETSNMP_PRIo "d)\n", vp->val.objid[0]));
-             return NULL;        /* All valid instances start with .0 */
-         }
-         plen = exp->expPrefix_len;
-@@ -231,6 +231,8 @@ NEXT_EXP:
-                 len = vp2->name_length - exp->expPrefix_len;
-                 snmp_set_var_typed_value( vp, ASN_PRIV_IMPLIED_OBJECT_ID,
-                       (u_char*)(vp2->name+exp->expPrefix_len), len);
-+            } else {
-+                len = 1;
-             }
-             res = expValue_evaluateExpression( exp, vp->val.objid+1, len-1);
-             DEBUGMSGTL(( "disman:expr:val", "w/card next returned (%p)\n", res));
-diff --git a/agent/mibgroup/disman/expression/expValueTable.c b/agent/mibgroup/disman/expression/expValueTable.c
-index feace8c..6b315c6 100644
---- a/agent/mibgroup/disman/expression/expValueTable.c
-+++ b/agent/mibgroup/disman/expression/expValueTable.c
-@@ -133,7 +133,7 @@ init_expValueTable(void)
-      * Initialize a "session" that defines who we're going to talk to
-      */
-     snmp_sess_init(&session);   /* set up defaults */
--    session.peername = "localhost";
-+    session.peername = strdup("localhost");
- 
-     DEBUGMSGTL(("expValueTable", "done.\n"));
- }
-@@ -272,8 +272,7 @@ Evaluate_Expression(struct expValueTable_data *vtable_data)
-                     break;
-                 }
-             }
--            strncpy(temp, expression + 1, j - 1);
--            *(temp + j - 1) = '\0';
-+            sprintf(temp, "%.*s", j - 1, expression + 1);
-             l = atoi(temp);
-             expression = expression + j;
-             /*
-@@ -434,24 +433,12 @@ expValueTable_clean(void *data)
- void
- build_valuetable(void)
- {
--    struct expExpressionTable_data *expstorage, *expfound;
-+    struct expExpressionTable_data *expstorage;
-     struct expObjectTable_data *objstorage, *objfound = NULL;
-     struct header_complex_index *hcindex, *object_hcindex;
-     char           *expression;
--    size_t          expression_len;
-     oid            *index;
--
--
--    char           *result, *resultbak;
--    char           *temp, *tempbak;
-     int             i = 0, j, l;
--    temp = malloc(100);
--    result = malloc(100);
--    tempbak = temp;
--    memset(result, 0, 100);
--    *result = '\0';
--    resultbak = result;
--
- 
-     DEBUGMSGTL(("expValueTable", "building valuetable...  \n"));
- 
-@@ -460,7 +447,6 @@ build_valuetable(void)
-         expstorage = (struct expExpressionTable_data *) hcindex->data;
-         if (expstorage->expExpressionEntryStatus == RS_ACTIVE) {
-             expression = expstorage->expExpression;
--            expression_len = expstorage->expExpressionLen;
-             while (*expression != '\0') {
-                 if (*expression == '$') {
-                     i++;
-@@ -475,9 +461,12 @@ build_valuetable(void)
-                             break;
-                         }
-                     }
--                    strncpy(temp, expression + 1, j - 1);
--                    *(temp + j - 1) = '\0';
--                    l = atoi(temp);
-+                    {
-+                        char temp[100];
-+
-+                        sprintf(temp, "%.*s", j - 1, expression + 1);
-+                        l = atoi(temp);
-+                    }
-                     for (object_hcindex = expObjectTableStorage;
-                          object_hcindex != NULL;
-                          object_hcindex = object_hcindex->next) {
-@@ -495,7 +484,6 @@ build_valuetable(void)
-                                 expstorage->expExpressionNameLen)
-                             && (l == objstorage->expObjectIndex)) {
-                             if (objfound == NULL) {
--                                expfound = expstorage;
-                                 objfound = objstorage;
-                             }
-                             if (objstorage->expObjectIDWildcard ==
-diff --git a/agent/mibgroup/disman/ping/pingCtlTable.c b/agent/mibgroup/disman/ping/pingCtlTable.c
-index a4fd3a8..a5036e2 100644
---- a/agent/mibgroup/disman/ping/pingCtlTable.c
-+++ b/agent/mibgroup/disman/ping/pingCtlTable.c
-@@ -340,12 +340,11 @@ pingProbeHistoryTable_addall(struct pingCtlTable_data *thedata)
- void
- pingCtlTable_cleaner(struct header_complex_index *thestuff)
- {
--    struct header_complex_index *hciptr = NULL;
--    struct pingCtlTable_data *StorageDel = NULL;
-+    struct header_complex_index *hciptr;
-+
-     DEBUGMSGTL(("pingProbeHistoryTable", "cleanerout  "));
-     for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) {
--        StorageDel =
--            header_complex_extract_entry(&pingCtlTableStorage, hciptr);
-+        header_complex_extract_entry(&pingCtlTableStorage, hciptr);
-         DEBUGMSGTL(("pingProbeHistoryTable", "cleaner  "));
-     }
- }
-@@ -864,7 +863,6 @@ pingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata)
- {
-     struct header_complex_index *hciptr2 = NULL;
-     struct header_complex_index *hcilast = NULL;
--    struct pingProbeHistoryTable_data *StorageDel = NULL;
-     struct pingProbeHistoryTable_data *StorageTmp = NULL;
-     netsnmp_variable_list *vars = NULL;
-     oid             newoid[MAX_OID_LEN];
-@@ -895,9 +893,7 @@ pingProbeHistoryTable_delLast(struct pingCtlTable_data *thedata)
- 
-         }
-     }
--    StorageDel =
--        header_complex_extract_entry(&pingProbeHistoryTableStorage,
--                                     hcilast);
-+    header_complex_extract_entry(&pingProbeHistoryTableStorage, hcilast);
-     DEBUGMSGTL(("pingProbeHistoryTable",
-                 "delete the last one success!\n"));
- }
-@@ -1231,7 +1227,6 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
-          unsigned long *minrtt, unsigned long *maxrtt,
-          unsigned long *averagertt, pid_t pid)
- {
--    int             size;
-     char            recvbuf[BUFSIZE];
-     char            sendbuf[BUFSIZE];
-     int             nsent = 1;
-@@ -1257,8 +1252,6 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
-     }
-     setuid(getuid());           /* don't need special permissions any more */
- 
--    size = 60 * 1024;           /* OK if setsockopt fails */
--
-     tv.tv_sec = 5;
-     tv.tv_usec = 0;
-     setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv));
-@@ -1266,11 +1259,13 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
-     for (current_probe_temp = 1;
-          current_probe_temp <= item->pingCtlProbeCount;
-          current_probe_temp++) {
-+        time_t          timep;
-         (*pr->fsend) (datalen, pid, nsent, sockfd, sendbuf);
-         nsent++;
-         len = pr->salen;
-         if (readable_timeo(sockfd, item->pingCtlTimeOut) == 0) {
-             /* printf("socket timeout!\n"); */
-+            n = -1;
-             fail_probe = fail_probe + 1;
-             flag = 1;
-         } else {
-@@ -1282,18 +1277,17 @@ readloop(struct pingCtlTable_data *item, struct addrinfo *ai, int datalen,
- 
-         gettimeofday(&tval, NULL);
- 
--        time_t          timep;
-         time(&timep);
- 
-         (*pr->fproc) (recvbuf, n, &tval, timep, item, ai, datalen, minrtt,
-                       maxrtt, sumrtt, averagertt, current_probe_temp,
-                       success_probe, fail_probe, flag, &current_var, pid);
--        printf("receiver success!\n");
-         if (current_probe_temp >= item->pingCtlProbeCount) {
-             SNMP_FREE(sumrtt);
-             return;
-         }
-     }
-+    close(sockfd);
- }
- 
- unsigned long
-@@ -1599,7 +1593,6 @@ send_v4(int datalen, pid_t pid, int nsent, int sockfd, char *sendbuf)
- {
-     int             len;
-     struct icmp    *icmp = NULL;
--    struct timeval *temp = NULL;
- 
-     icmp = (struct icmp *) sendbuf;
-     icmp->icmp_type = ICMP_ECHO;
-@@ -1607,7 +1600,6 @@ send_v4(int datalen, pid_t pid, int nsent, int sockfd, char *sendbuf)
-     icmp->icmp_id = pid;
-     icmp->icmp_seq = nsent;
-     gettimeofday((struct timeval *) icmp->icmp_data, NULL);
--    temp = (struct timeval *) icmp->icmp_data;
- 
-     len = 8 + datalen;          /* checksum ICMP header and data */
-     icmp->icmp_cksum = 0;
-@@ -1773,7 +1765,7 @@ run_ping(unsigned int clientreg, void *clientarg)
-             if (device) {
-                 struct ifreq    ifr;
-                 memset(&ifr, 0, sizeof(ifr));
--                strncpy(ifr.ifr_name, device, IFNAMSIZ - 1);
-+                strlcpy(ifr.ifr_name, device, IFNAMSIZ);
-                 if (setsockopt
-                     (probe_fd, SOL_SOCKET, SO_BINDTODEVICE, device,
-                      strlen(device) + 1) == -1) {
-@@ -1936,6 +1928,7 @@ run_ping(unsigned int clientreg, void *clientarg)
-                   (char *) outpack, &ident, &start_time, &screen_width,
-                   &deadline);
- 
-+        close(icmp_sock);
-     }
-     return;
- }
-@@ -2705,8 +2698,7 @@ write_pingCtlAdminStatus(int action,
-                     snmp_alarm_register(StorageTmp->pingCtlFrequency,
-                                         SA_REPEAT, run_ping, StorageTmp);
-             else
--                StorageTmp->timer_id = snmp_alarm_register(1, (int) NULL,
--                                                           run_ping,
-+                StorageTmp->timer_id = snmp_alarm_register(1, 0, run_ping,
-                                                            StorageTmp);
- 
-         } else if (StorageTmp->pingCtlAdminStatus == 2
-@@ -4367,8 +4359,7 @@ write_pingCtlRowStatus(int action,
-                                             StorageTmp);
-                 else
-                     StorageTmp->timer_id =
--                        snmp_alarm_register(1, (int) NULL, run_ping,
--                                            StorageTmp);
-+                        snmp_alarm_register(1, 0, run_ping, StorageTmp);
- 
-             }
- 
-@@ -4451,7 +4442,9 @@ int
- __schedule_exit(int next, long *nreceived, long *tmax)
- {
-     unsigned long   waittime;
-+#if 0
-     struct itimerval it;
-+#endif
- 
-     if (*nreceived) {
-         waittime = 2 * (*tmax);
-@@ -4463,11 +4456,13 @@ __schedule_exit(int next, long *nreceived, long *tmax)
-     if (next < 0 || next < waittime / 1000)
-         next = waittime / 1000;
- 
-+#if 0
-     it.it_interval.tv_sec = 0;
-     it.it_interval.tv_usec = 0;
-     it.it_value.tv_sec = waittime / 1000000;
-     it.it_value.tv_usec = waittime % 1000000;
--    /* setitimer(ITIMER_REAL, &it, NULL); */
-+    setitimer(ITIMER_REAL, &it, NULL);
-+#endif
-     return next;
- }
- 
-@@ -4741,6 +4736,7 @@ setup(int icmp_sock, int options, int uid, int timeout, int preload,
- 
-     gettimeofday(start_time, NULL);
- 
-+#if 0
-     if (*deadline) {
-         struct itimerval it;
- 
-@@ -4749,6 +4745,7 @@ setup(int icmp_sock, int options, int uid, int timeout, int preload,
-         it.it_value.tv_sec = (*deadline);
-         it.it_value.tv_usec = 0;
-     }
-+#endif
- 
-     if (isatty(STDOUT_FILENO)) {
-         struct winsize  w;
-diff --git a/agent/mibgroup/disman/ping/pingProbeHistoryTable.c b/agent/mibgroup/disman/ping/pingProbeHistoryTable.c
-index de398a8..78c75be 100644
---- a/agent/mibgroup/disman/ping/pingProbeHistoryTable.c
-+++ b/agent/mibgroup/disman/ping/pingProbeHistoryTable.c
-@@ -74,12 +74,10 @@ void
- pingProbeHistoryTable_cleaner(struct header_complex_index *thestuff)
- {
-     struct header_complex_index *hciptr = NULL;
--    struct pingProbeHistoryTable_data *StorageDel = NULL;
-+
-     DEBUGMSGTL(("pingProbeHistoryTable", "cleanerout  "));
-     for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) {
--        StorageDel =
--            header_complex_extract_entry(&pingProbeHistoryTableStorage,
--                                         hciptr);
-+        header_complex_extract_entry(&pingProbeHistoryTableStorage, hciptr);
-         DEBUGMSGTL(("pingProbeHistoryTable", "cleaner  "));
-     }
- 
-diff --git a/agent/mibgroup/disman/ping/pingResultsTable.c b/agent/mibgroup/disman/ping/pingResultsTable.c
-index bc4a9f4..1445d86 100644
---- a/agent/mibgroup/disman/ping/pingResultsTable.c
-+++ b/agent/mibgroup/disman/ping/pingResultsTable.c
-@@ -86,12 +86,11 @@ pingResultsTable_inadd(struct pingResultsTable_data *thedata);
- void
- pingResultsTable_cleaner(struct header_complex_index *thestuff)
- {
--    struct header_complex_index *hciptr = NULL;
--    struct pingResultsTable_data *StorageDel = NULL;
-+    struct header_complex_index *hciptr;
-+
-     DEBUGMSGTL(("pingResultsTable", "cleanerout  "));
-     for (hciptr = thestuff; hciptr != NULL; hciptr = hciptr->next) {
--        StorageDel =
--            header_complex_extract_entry(&pingResultsTableStorage, hciptr);
-+        header_complex_extract_entry(&pingResultsTableStorage, hciptr);
-         DEBUGMSGTL(("pingResultsTable", "cleaner  "));
-     }
- 
-diff --git a/agent/mibgroup/disman/schedule/schedCore.h b/agent/mibgroup/disman/schedule/schedCore.h
-index 4436711..35866d7 100644
---- a/agent/mibgroup/disman/schedule/schedCore.h
-+++ b/agent/mibgroup/disman/schedule/schedCore.h
-@@ -44,7 +44,7 @@ struct schedTable_entry {
-     char            schedDay[4+4];
-     char            schedHour[3];
-     char            schedMinute[8];
--    char            schedContextName[SCHED_STR1_LEN];
-+    char            schedContextName[SCHED_STR1_LEN+1];
-     oid             schedVariable[   MAX_OID_LEN   ];
-     size_t          schedVariable_len;
-     long            schedValue;
-diff --git a/agent/mibgroup/disman/schedule/schedTable.c b/agent/mibgroup/disman/schedule/schedTable.c
-index 943e545..bba48fd 100644
---- a/agent/mibgroup/disman/schedule/schedTable.c
-+++ b/agent/mibgroup/disman/schedule/schedTable.c
-@@ -98,6 +98,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_GET:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct schedTable_entry *)
-                     netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info( request);
-@@ -210,6 +213,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
-          */
-     case MODE_SET_RESERVE1:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct schedTable_entry *)
-                     netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info( request);
-@@ -340,6 +346,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_RESERVE2:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -370,6 +379,9 @@ schedTable_handler(netsnmp_mib_handler *handler,
- 
-     case MODE_SET_FREE:
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             tinfo = netsnmp_extract_table_info(request);
- 
-             switch (tinfo->colnum) {
-@@ -417,7 +429,11 @@ schedTable_handler(netsnmp_mib_handler *handler,
-          * All these assignments are "unfailable", so it's
-          *  (reasonably) safe to apply them in the Commit phase
-          */
-+        entry = NULL;
-         for (request = requests; request; request = request->next) {
-+            if (request->processed)
-+                continue;
-+
-             entry = (struct schedTable_entry *)
-                     netsnmp_tdata_extract_entry(request);
-             tinfo = netsnmp_extract_table_info( request);
-@@ -460,7 +476,7 @@ schedTable_handler(netsnmp_mib_handler *handler,
-                 recalculate = 1;
-                 break;
-             case COLUMN_SCHEDCONTEXTNAME:
--                memset(entry->schedContextName, 0, SCHED_STR1_LEN+1);
-+                memset(entry->schedContextName, 0, sizeof(entry->schedContextName));
-                 memcpy(entry->schedContextName,
-                                            request->requestvb->val.string,
-                                            request->requestvb->val_len);
-@@ -514,8 +530,10 @@ schedTable_handler(netsnmp_mib_handler *handler,
-                 break;
-             }
-         }
--        if (recalculate)
-+        if (recalculate) {
-+            netsnmp_assert(entry);
-             sched_nextTime(entry);
-+        }
-         break;
-     }
-     return SNMP_ERR_NOERROR;
-diff --git a/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c b/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c
-index 23ac029..04143eb 100644
---- a/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c
-+++ b/agent/mibgroup/disman/traceroute/traceRouteCtlTable.c
-@@ -713,7 +713,6 @@ traceRouteProbeHistoryTable_delLast(struct traceRouteCtlTable_data
- {
-     struct header_complex_index *hciptr2 = NULL;
-     struct header_complex_index *hcilast = NULL;
--    struct traceRouteProbeHistoryTable_data *StorageDel = NULL;
-     struct traceRouteProbeHistoryTable_data *StorageTmp = NULL;
-     netsnmp_variable_list *vars = NULL;
-     oid             newoid[MAX_OID_LEN];
-@@ -745,9 +744,7 @@ traceRouteProbeHistoryTable_delLast(struct traceRouteCtlTable_data
- 
-         }
-     }
--    StorageDel =
--        header_complex_extract_entry(&traceRouteProbeHistoryTableStorage,
--                                     hcilast);
-+    header_complex_extract_entry(&traceRouteProbeHistoryTableStorage, hcilast);
-     DEBUGMSGTL(("traceRouteProbeHistoryTable",
-                 "delete the last one success!\n"));
-     vars = NULL;
-@@ -1353,7 +1350,6 @@ int
- traceRouteResultsTable_del(struct traceRouteCtlTable_data *thedata)
- {
-     struct header_complex_index *hciptr2 = NULL;
--    struct traceRouteResultsTable_data *StorageDel = NULL;
-     netsnmp_variable_list *vars = NULL;
-     oid             newoid[MAX_OID_LEN];
-     size_t          newoid_len = 0;
-@@ -1368,9 +1364,8 @@ traceRouteResultsTable_del(struct traceRouteCtlTable_data *thedata)
-          hciptr2 = hciptr2->next) {
-         if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len)
-             == 0) {
--            StorageDel =
--                header_complex_extract_entry
--                (&traceRouteResultsTableStorage, hciptr2);
-+            header_complex_extract_entry(&traceRouteResultsTableStorage,
-+                                         hciptr2);
-             DEBUGMSGTL(("traceRouteResultsTable", "delete  success!\n"));
- 
-         }
-@@ -1386,7 +1381,6 @@ int
- traceRouteProbeHistoryTable_del(struct traceRouteCtlTable_data *thedata)
- {
-     struct header_complex_index *hciptr2 = NULL;
--    struct traceRouteProbeHistoryTable_data *StorageDel = NULL;
-     netsnmp_variable_list *vars = NULL;
-     oid             newoid[MAX_OID_LEN];
-     size_t          newoid_len = 0;
-@@ -1402,9 +1396,8 @@ traceRouteProbeHistoryTable_del(struct traceRouteCtlTable_data *thedata)
-          hciptr2 = hciptr2->next) {
-         if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len)
-             == 0) {
--            StorageDel =
--                header_complex_extract_entry
--                (&traceRouteProbeHistoryTableStorage, hciptr2);
-+            header_complex_extract_entry(&traceRouteProbeHistoryTableStorage,
-+                                         hciptr2);
-             DEBUGMSGTL(("traceRouteProbeHistoryTable",
-                         "delete  success!\n"));
- 
-@@ -1419,7 +1412,6 @@ int
- traceRouteHopsTable_del(struct traceRouteCtlTable_data *thedata)
- {
-     struct header_complex_index *hciptr2 = NULL;
--    struct traceRouteHopsTable_data *StorageDel = NULL;
-     netsnmp_variable_list *vars = NULL;
-     oid             newoid[MAX_OID_LEN];
-     size_t          newoid_len = 0;
-@@ -1435,9 +1427,7 @@ traceRouteHopsTable_del(struct traceRouteCtlTable_data *thedata)
-          hciptr2 = hciptr2->next) {
-         if (snmp_oid_compare(newoid, newoid_len, hciptr2->name, newoid_len)
-             == 0) {
--            StorageDel =
--                header_complex_extract_entry(&traceRouteHopsTableStorage,
--                                             hciptr2);
-+            header_complex_extract_entry(&traceRouteHopsTableStorage, hciptr2);
-             DEBUGMSGTL(("traceRouteHopsTable", "delete  success!\n"));
- 
-         }
-@@ -3210,8 +3200,7 @@ write_traceRouteCtlAdminStatus(int action,
-                                         SA_REPEAT, run_traceRoute,
-                                         StorageTmp);
-             else
--                StorageTmp->timer_id = snmp_alarm_register(1, (int) NULL,
--                                                           run_traceRoute,
-+                StorageTmp->timer_id = snmp_alarm_register(1, 0, run_traceRoute,
-                                                            StorageTmp);
- 
-         } else if (StorageTmp->traceRouteCtlAdminStatus == 2
-@@ -4041,8 +4030,7 @@ write_traceRouteCtlRowStatus(int action,
-                                             StorageTmp);
-                 else
-                     StorageTmp->timer_id =
--                        snmp_alarm_register(1, (int) NULL, run_traceRoute,
--                                            StorageTmp);
-+                        snmp_alarm_register(1, 0, run_traceRoute, StorageTmp);
- 
-             }
- 
-@@ -4924,6 +4912,8 @@ run_traceRoute(unsigned int clientreg, void *clientarg)
- 
-         }
- 
-+        close(sndsock);
-+
-         if (flag == 1) {
-             DEBUGMSGTL(("traceRouteProbeHistoryTable", "path changed!\n"));
-             send_traceRoute_trap(item, traceRoutePathChange,
-@@ -5556,6 +5546,8 @@ run_traceRoute(unsigned int clientreg, void *clientarg)
- 
-         }
- 
-+        close(sndsock);
-+
-         if (flag == 1) {
-             printf("path changed!\n");
-             send_traceRoute_trap(item, traceRoutePathChange,
-@@ -6105,7 +6097,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
- #ifdef HAVE_SOCKADDR_SA_LEN
-     register int    n;
- #endif
--    register struct ifreq *ifrp, *ifend, *ifnext, *mp;
-+    register struct ifreq *ifrp, *ifend, *ifnext;
-     register struct sockaddr_in *sin;
-     register struct ifaddrlist *al;
-     struct ifconf   ifc;
-@@ -6137,7 +6129,6 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
-     ifend = (struct ifreq *) ((char *) ibuf + ifc.ifc_len);
- 
-     al = ifaddrlist;
--    mp = NULL;
-     nipaddr = 0;
-     for (; ifrp < ifend; ifrp = ifnext) {
- #ifdef HAVE_SOCKADDR_SA_LEN
-@@ -6157,7 +6148,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
-          * SIOCGIFFLAGS stomps over it because the requests
-          * are returned in a union.)
-          */
--        strncpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name));
-+        strlcpy(ifr.ifr_name, ifrp->ifr_name, sizeof(ifr.ifr_name));
-         if (ioctl(fd, SIOCGIFFLAGS, (char *) &ifr) < 0) {
-             if (errno == ENXIO)
-                 continue;
-@@ -6174,9 +6165,7 @@ ifaddrlist(register struct ifaddrlist **ipaddrp, register char *errbuf)
-         if ((ifr.ifr_flags & IFF_UP) == 0)
-             continue;
- 
--
--        (void) strncpy(device, ifr.ifr_name, sizeof(ifr.ifr_name));
--        device[sizeof(device) - 1] = '\0';
-+        sprintf(device, "%.*s", (int) sizeof(ifr.ifr_name), ifr.ifr_name);
- #ifdef sun
-         /*
-          * Ignore sun virtual interfaces 
-diff --git a/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c b/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c
-index efb1b54..00f4bc3 100644
---- a/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c
-+++ b/agent/mibgroup/etherlike-mib/data_access/dot3stats_linux.c
-@@ -47,8 +47,8 @@ dot3stats_interface_name_list_get (struct ifname *list_head, int *retval)
-                 *retval = -2;
-                 return NULL;
-             }
--            memset (list_head, 0, sizeof (struct ifname));
--            strncpy (list_head->name, p->ifa_name, IF_NAMESIZE);
-+            memset(list_head, 0, sizeof (struct ifname));
-+            strlcpy(list_head->name, p->ifa_name, IF_NAMESIZE);
-             continue;
-         }
- 
-@@ -69,8 +69,8 @@ dot3stats_interface_name_list_get (struct ifname *list_head, int *retval)
-             return NULL;
-         }
-         nameptr2 = nameptr2->ifn_next;
--        memset (nameptr2, 0, sizeof (struct ifname));
--        strncpy (nameptr2->name, p->ifa_name, IF_NAMESIZE);
-+        memset(nameptr2, 0, sizeof (struct ifname));
-+        strlcpy(nameptr2->name, p->ifa_name, IF_NAMESIZE);
-         continue;
- 
-     }
-@@ -655,7 +655,7 @@ interface_ioctl_dot3stats_get (dot3StatsTable_rowreq_ctx *rowreq_ctx, int fd, co
-                 "called\n"));
- 
-     memset(&ifr, 0, sizeof(ifr));
--    strcpy(ifr.ifr_name, name);
-+    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- 
-     memset(&driver_info, 0, sizeof (driver_info));
-     driver_info.cmd = ETHTOOL_GDRVINFO;
-@@ -730,8 +730,8 @@ interface_ioctl_dot3stats_get (dot3StatsTable_rowreq_ctx *rowreq_ctx, int fd, co
-     for (i = 0; i < nstats; i++) {
-         char s[ETH_GSTRING_LEN];
- 
--        strncpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
--            ETH_GSTRING_LEN);
-+        strlcpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
-+                sizeof(s));
-     
-         if (DOT3STATSALIGNMENTERRORS(s)) {
-             data->dot3StatsAlignmentErrors = (u_long)eth_stats->data[i];
-@@ -911,8 +911,7 @@ _dot3Stats_ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name)
-         }
-     }
- 
--    strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
--    ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0;
-+    strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
-     rc = ioctl(fd, which, ifrq);
-     if (rc < 0) {
-         DEBUGMSGTL(("access:dot3StatsTable:ioctl",
-diff --git a/agent/mibgroup/examples/example.c b/agent/mibgroup/examples/example.c
-index 8f27ead..50b7e7d 100644
---- a/agent/mibgroup/examples/example.c
-+++ b/agent/mibgroup/examples/example.c
-@@ -163,7 +163,7 @@ init_example(void)
-      *  Also set a default value for the string object.  Note that the
-      *   example integer variable was initialised above.
-      */
--    strncpy(example_str, EXAMPLE_STR_DEFAULT, EXAMPLE_STR_LEN);
-+    strlcpy(example_str, EXAMPLE_STR_DEFAULT, sizeof(example_str));
- 
-     snmpd_register_config_handler("exampleint",
-                                   example_parse_config_exampleint,
-@@ -209,7 +209,7 @@ example_parse_config_examplestr(const char *token, char *cptr)
-     /*
-      * Make sure the string fits in the space allocated for it.
-      */
--    if (strlen(cptr) < EXAMPLE_STR_LEN)
-+    if (strlen(cptr) < sizeof(example_str))
-         strcpy(example_str, cptr);
-     else {
-         /*
-@@ -217,10 +217,8 @@ example_parse_config_examplestr(const char *token, char *cptr)
-          * An alternative approach would be to log an error,
-          *  and discard this value altogether.
-          */
--        strncpy(example_str, cptr, EXAMPLE_STR_LEN - 4);
--        example_str[EXAMPLE_STR_LEN - 4] = 0;
--        strcat(example_str, "...");
--        example_str[EXAMPLE_STR_LEN - 1] = 0;
-+        sprintf(example_str, "%.*s...", (int) (sizeof(example_str) - 4), cptr);
-+        netsnmp_assert(strlen(example_str) < sizeof(example_str));
-     }
- }
- 
-diff --git a/agent/mibgroup/examples/netSnmpHostsTable_access.c b/agent/mibgroup/examples/netSnmpHostsTable_access.c
-index f6f933a..3d2e5fb 100644
---- a/agent/mibgroup/examples/netSnmpHostsTable_access.c
-+++ b/agent/mibgroup/examples/netSnmpHostsTable_access.c
-@@ -177,10 +177,11 @@ void           *
- netSnmpHostsTable_create_data_context(netsnmp_variable_list * index_data)
- {
-     my_data_info *datactx = SNMP_MALLOC_TYPEDEF(my_data_info);
-+
-     if (!datactx)
-         return NULL;
--    strncpy(datactx->hostname, index_data->val.string,
--            strlen(index_data->val.string));
-+    strlcpy(datactx->hostname, (const char *) index_data->val.string,
-+            sizeof(datactx->hostname));
-     return datactx;
- }
- 
-diff --git a/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c b/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c
-index df47ca4..25a7330 100644
---- a/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c
-+++ b/agent/mibgroup/examples/netSnmpHostsTable_checkfns.c
-@@ -34,9 +34,6 @@ int
- check_netSnmpHostAddressType(int type, long *val, size_t val_len,
-                              long *old_val, size_t old_val_len)
- {
--
--    int             ret;
--
-     /** Check to see that we were called legally */
-     if (!val)
-         return SNMP_ERR_GENERR;
-@@ -59,8 +56,6 @@ check_netSnmpHostAddressType(int type, long *val, size_t val_len,
-     default:
-         return SNMP_ERR_INCONSISTENTVALUE;
-     }
--    ret = SNMP_ERR_NOERROR;
--
- 
-     /** looks ok, call the local version of the same function. */
-     return check_netSnmpHostAddressType_local(type, val, val_len, old_val,
-@@ -79,9 +74,6 @@ int
- check_netSnmpHostAddress(int type, char *val, size_t val_len,
-                          char *old_val, size_t old_val_len)
- {
--
--    int             ret;
--
-     /** Check to see that we were called legally */
-     if (!val)
-         return SNMP_ERR_GENERR;
-@@ -91,11 +83,8 @@ check_netSnmpHostAddress(int type, char *val, size_t val_len,
-         return SNMP_ERR_WRONGTYPE;
- 
-     /** Check the ranges of the passed value for legality */
--    if (!(val_len >= 0 && val_len <= 255)
--        ) {
-+    if (!(val_len >= 0 && val_len <= 255))
-         return SNMP_ERR_WRONGVALUE;
--    }
--
- 
-     /** looks ok, call the local version of the same function. */
-     return check_netSnmpHostAddress_local(type, val, val_len, old_val,
-@@ -138,11 +127,10 @@ check_netSnmpHostStorage(int type, long *val, size_t val_len,
-     default:
-         return SNMP_ERR_INCONSISTENTVALUE;
-     }
--    ret = SNMP_ERR_NOERROR;
- 
--    if (ret =
--        check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE,
--                                 *val))
-+    ret = check_storage_transition((old_val) ? *old_val : SNMP_STORAGE_NONE,
-+                                   *val);
-+    if (ret)
-         return ret;
- 
-     /** looks ok, call the local version of the same function. */
-@@ -187,11 +175,10 @@ check_netSnmpHostRowStatus(int type, long *val, size_t val_len,
-     default:
-         return SNMP_ERR_INCONSISTENTVALUE;
-     }
--    ret = SNMP_ERR_NOERROR;
- 
--    if (ret =
--        check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT,
--                                   *val))
-+    ret = check_rowstatus_transition((old_val) ? *old_val : RS_NONEXISTENT,
-+                                     *val);
-+    if (ret)
-         return ret;
- 
-     /** looks ok, call the local version of the same function. */
-diff --git a/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h b/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h
-index 335a0ae..6cd44c9 100644
---- a/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h
-+++ b/agent/mibgroup/examples/netSnmpHostsTable_checkfns_local.h
-@@ -3,8 +3,8 @@
-  *        : : mib2c.check_values_local.conf,v 5.1 2003/05/30 23:53:15 hardaker Exp $
-  * 
-  */
--#ifndef NETSNMPHOSTSTABLE_CHECKFNS_H
--#define NETSNMPHOSTSTABLE_CHECKFNS_H
-+#ifndef NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H
-+#define NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H
- 
- /*
-  * these functions are designed to check incoming values for 
-@@ -18,19 +18,32 @@
- #ifdef __cplusplus
- extern "C" {
- #endif
-+#if 0
-+}
-+#endif
- 
--int             check_(int type, long *val, size_t val_len, long *old_val,
--                       size_t old_val_len);
--int             check_(int type, char *val, size_t val_len, char *old_val,
--                       size_t old_val_len);
--int             check_(int type, long *val, size_t val_len, long *old_val,
--                       size_t old_val_len);
--int             check_(int type, long *val, size_t val_len, long *old_val,
--                       size_t old_val_len);
--
-+int             check_netSnmpHostAddressType_local(int type, long *val,
-+                                                   size_t val_len,
-+                                                   long *old_val,
-+                                                   size_t old_val_len);
-+int             check_netSnmpHostAddress_local(int type, char *val,
-+                                               size_t val_len,
-+                                               char *old_val,
-+                                               size_t old_val_len);
-+int             check_netSnmpHostStorage_local(int type, long *val,
-+                                               size_t val_len,
-+                                               long *old_val,
-+                                               size_t old_val_len);
-+int             check_netSnmpHostRowStatus_local(int type, long *val,
-+                                                 size_t val_len,
-+                                                 long *old_val,
-+                                                 size_t old_val_len);
- 
-+#if 0
-+{
-+#endif
- #ifdef __cplusplus
- }
- #endif
- 
--#endif                          /* NETSNMPHOSTSTABLE_CHECKFNS_H */
-+#endif                          /* NETSNMPHOSTSTABLE_CHECKFNS_LOCAL_H */
-diff --git a/agent/mibgroup/examples/ucdDemoPublic.c b/agent/mibgroup/examples/ucdDemoPublic.c
-index e935216..8e9e66a 100644
---- a/agent/mibgroup/examples/ucdDemoPublic.c
-+++ b/agent/mibgroup/examples/ucdDemoPublic.c
-@@ -25,6 +25,7 @@
- 
- #include <net-snmp/net-snmp-includes.h>
- #include <net-snmp/agent/net-snmp-agent-includes.h>
-+#include <net-snmp/library/tools.h>
- 
- #include "util_funcs/header_generic.h"
- #include "ucdDemoPublic.h"
-@@ -213,16 +214,9 @@ write_ucdDemoPublicString(int action,
-         return SNMP_ERR_WRONGLENGTH;
-     }
-     if (action == COMMIT) {
--        if (var_val_len != 0) {
--            strncpy((char*)publicString, (const char*)var_val, sizeof(publicString)-1);
--            /* some sanity checks */
--            if (strlen((const char*)var_val) > sizeof(publicString)-1 ||
--                strlen((const char*)var_val) != var_val_len)
--                publicString[sizeof(publicString)-1] = '\0';
--            else
--                publicString[var_val_len] = '\0';
--        } else
--            publicString[0] = '\0';
-+        sprintf((char*) publicString, "%.*s",
-+                (int) SNMP_MIN(sizeof(publicString) - 1, var_val_len),
-+                (const char*) var_val);
-     }
-     return SNMP_ERR_NOERROR;
- }
-diff --git a/agent/mibgroup/hardware/cpu/cpu.c b/agent/mibgroup/hardware/cpu/cpu.c
-index 3a0a5d4..2772001 100644
---- a/agent/mibgroup/hardware/cpu/cpu.c
-+++ b/agent/mibgroup/hardware/cpu/cpu.c
-@@ -142,6 +142,12 @@ netsnmp_cpu_info *netsnmp_cpu_get_byName( char *name, int create ) {
-     cpu = SNMP_MALLOC_TYPEDEF( netsnmp_cpu_info );
-     if (!cpu)
-         return NULL;
-+    if (strlen(name) >= sizeof(cpu->name)) {
-+        free(cpu);
-+        snmp_log(LOG_ERR, "Name of CPU is too large: %s\n", name);
-+        return NULL;
-+    }
-+
-     strcpy(cpu->name, name);
-     if ( _cpu_tail ) {
-         cpu->idx = _cpu_tail->idx+1;
-diff --git a/agent/mibgroup/hardware/cpu/cpu_kerndata.c b/agent/mibgroup/hardware/cpu/cpu_kerndata.c
-index 9a9c4a4..8a7f2b2 100644
---- a/agent/mibgroup/hardware/cpu/cpu_kerndata.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_kerndata.c
-@@ -64,32 +64,32 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-     for ( i=0; i < cpu_num; i++ ) {
-         cpu2 = netsnmp_cpu_get_byIdx( i, 0 );
- 
--        cpu2->user_ticks = (unsigned long)vminfo[i].v_time[V_CPU_USER];
--        cpu2->idle_ticks = (unsigned long)vminfo[i].v_time[V_CPU_IDLE];
--        cpu2->kern_ticks = (unsigned long)vminfo[i].v_time[V_CPU_KERNEL];
--        cpu2->wait_ticks = (unsigned long)vminfo[i].v_time[V_CPU_STREAM];
--        cpu2->sys2_ticks = (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]+
-+        cpu2->user_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_USER];
-+        cpu2->idle_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_IDLE];
-+        cpu2->kern_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL];
-+        cpu2->wait_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_STREAM];
-+        cpu2->sys2_ticks = (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+
-                                           vminfo[i].v_time[V_CPU_STREAM];
-             /* nice_ticks, intrpt_ticks, sirq_ticks unused */
- 
-             /* sum these for the overall stats */
--        cpu->user_ticks += (unsigned long)vminfo[i].v_time[V_CPU_USER];
--        cpu->idle_ticks += (unsigned long)vminfo[i].v_time[V_CPU_IDLE];
--        cpu->kern_ticks += (unsigned long)vminfo[i].v_time[V_CPU_KERNEL];
--        cpu->wait_ticks += (unsigned long)vminfo[i].v_time[V_CPU_STREAM];
--        cpu->sys2_ticks += (unsigned long)vminfo[i].v_time[V_CPU_KERNEL]+
-+        cpu->user_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_USER];
-+        cpu->idle_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_IDLE];
-+        cpu->kern_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL];
-+        cpu->wait_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_STREAM];
-+        cpu->sys2_ticks += (unsigned long long)vminfo[i].v_time[V_CPU_KERNEL]+
-                                           vminfo[i].v_time[V_CPU_STREAM];
- 
-             /*
-              * Interrupt/Context Switch statistics
-              *   XXX - Do these really belong here ?
-              */
--        cpu->swapIn       += (unsigned long)vminfo[i].v_swpin;
--        cpu->swapOut      += (unsigned long)vminfo[i].v_swpout;
--        cpu->pageIn       += (unsigned long)vminfo[i].v_phread;
--        cpu->pageOut      += (unsigned long)vminfo[i].v_phwrite;
--        cpu->nInterrupts  += (unsigned long)vminfo[i].v_intr;
--        cpu->nCtxSwitches += (unsigned long)vminfo[i].v_swtch;
-+        cpu->swapIn       += (unsigned long long)vminfo[i].v_swpin;
-+        cpu->swapOut      += (unsigned long long)vminfo[i].v_swpout;
-+        cpu->pageIn       += (unsigned long long)vminfo[i].v_phread;
-+        cpu->pageOut      += (unsigned long long)vminfo[i].v_phwrite;
-+        cpu->nInterrupts  += (unsigned long long)vminfo[i].v_intr;
-+        cpu->nCtxSwitches += (unsigned long long)vminfo[i].v_swtch;
-     }
-     return 0;
- }
-diff --git a/agent/mibgroup/hardware/cpu/cpu_kstat.c b/agent/mibgroup/hardware/cpu/cpu_kstat.c
-index 32ccb00..049864c 100644
---- a/agent/mibgroup/hardware/cpu/cpu_kstat.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_kstat.c
-@@ -48,16 +48,13 @@ void init_cpu_kstat( void ) {
-             memset(state, 0, sizeof(state));
-             for (i=0, ks_data = ksp->ks_data; i < ksp->ks_ndata; i++, ks_data++) {
-                 if ( strcmp( ks_data->name, "state" ) == 0 ) {
--                    strncpy( state, ks_data->value.c, sizeof(state));
--                    state[sizeof(state)-1] = '\0';
-+                    strlcpy(state, ks_data->value.c, sizeof(state));
-                 } else if ( strcmp( ks_data->name, "state_begin" ) == 0 ) {
-                     state_begin = ks_data->value.i32;
-                 } else if ( strcmp( ks_data->name, "cpu_type" ) == 0 ) {
--                    strncpy( ctype, ks_data->value.c, sizeof(ctype));
--                    ctype[sizeof(ctype)-1] = '\0';
-+                    strlcpy(ctype, ks_data->value.c, sizeof(ctype));
-                 } else if ( strcmp( ks_data->name, "fpu_type" ) == 0 ) {
--                    strncpy( ftype, ks_data->value.c, sizeof(ftype));
--                    ftype[sizeof(ftype)-1] = '\0';
-+                    strlcpy(ftype, ks_data->value.c, sizeof(ftype));
-                 } else if ( strcmp( ks_data->name, "clock_MHz" ) == 0 ) {
-                     clock = ks_data->value.i32;
-                 }
-@@ -112,30 +109,30 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-                 break;   /* or continue ? */
-             }
- 
--            cpu2->user_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_USER];
--            cpu2->idle_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_IDLE];
--            cpu2->kern_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
--            cpu2->wait_ticks = (unsigned long)cs.cpu_sysinfo.cpu[CPU_WAIT];
-+            cpu2->user_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_USER];
-+            cpu2->idle_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_IDLE];
-+            cpu2->kern_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
-+            cpu2->wait_ticks = (unsigned long long)cs.cpu_sysinfo.cpu[CPU_WAIT];
-               /* or cs.cpu_sysinfo.wait[W_IO]+cs.cpu_sysinfo.wait[W_PIO] */
--            cpu2->sys2_ticks = (unsigned long)cpu2->kern_ticks+cpu2->wait_ticks;
-+            cpu2->sys2_ticks = (unsigned long long)cpu2->kern_ticks+cpu2->wait_ticks;
-                 /* nice_ticks, intrpt_ticks, sirq_ticks unused */
- 
-                 /* sum these for the overall stats */
--            cpu->user_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_USER];
--            cpu->idle_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_IDLE];
--            cpu->kern_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
--            cpu->wait_ticks += (unsigned long)cs.cpu_sysinfo.cpu[CPU_WAIT];
-+            cpu->user_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_USER];
-+            cpu->idle_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_IDLE];
-+            cpu->kern_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_KERNEL];
-+            cpu->wait_ticks += (unsigned long long)cs.cpu_sysinfo.cpu[CPU_WAIT];
-               /* or cs.cpu_sysinfo.wait[W_IO]+cs.cpu_sysinfo.wait[W_PIO] */
--            cpu->sys2_ticks += (unsigned long)cpu2->kern_ticks+cpu2->wait_ticks;
-+            cpu->sys2_ticks += (unsigned long long)cpu2->kern_ticks+cpu2->wait_ticks;
- 
-                 /*
-                  * Interrupt/Context Switch statistics
-                  *   XXX - Do these really belong here ?
-                  */
--            cpu->swapIn       += (unsigned long)cs.cpu_vminfo.swapin;
--            cpu->swapOut      += (unsigned long)cs.cpu_vminfo.swapout;
--            cpu->nInterrupts  += (unsigned long)cs.cpu_sysinfo.intr;
--            cpu->nCtxSwitches += (unsigned long)cs.cpu_sysinfo.pswitch;
-+            cpu->swapIn       += (unsigned long long)cs.cpu_vminfo.swapin;
-+            cpu->swapOut      += (unsigned long long)cs.cpu_vminfo.swapout;
-+            cpu->nInterrupts  += (unsigned long long)cs.cpu_sysinfo.intr;
-+            cpu->nCtxSwitches += (unsigned long long)cs.cpu_sysinfo.pswitch;
-         }
-     }
-     return 0;
-diff --git a/agent/mibgroup/hardware/cpu/cpu_linux.c b/agent/mibgroup/hardware/cpu/cpu_linux.c
-index 2edeccd..640407b 100644
---- a/agent/mibgroup/hardware/cpu/cpu_linux.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_linux.c
-@@ -121,6 +121,10 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-         DEBUGMSGTL(("cpu", "/proc/stat buffer increased to %d\n", bsize));
-         close(statfd);
-         statfd = open(STAT_FILE, O_RDONLY, 0);
-+        if (statfd == -1) {
-+            snmp_log_perror(STAT_FILE);
-+            return -1;
-+	}
-     }
-     close(statfd);
- 
-@@ -159,27 +163,27 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
- 
-         /* kernel 2.6.33 and above */
-         if (num_cpuline_elem == 10) {
--            cpu->guestnice_ticks = (unsigned long)cguest_nicell;
-+            cpu->guestnice_ticks = (unsigned long long)cguest_nicell;
-         }
-         /* kernel 2.6.24 and above */
-         if (num_cpuline_elem >= 9) {
--            cpu->guest_ticks = (unsigned long)cguestll;
-+            cpu->guest_ticks = (unsigned long long)cguestll;
-         }
-         /* kernel 2.6.11 and above */
-         if (num_cpuline_elem >= 8) {
--            cpu->steal_ticks = (unsigned long)cstealll;
-+            cpu->steal_ticks = (unsigned long long)cstealll;
-         }
-         /* kernel 2.6 */
-         if (num_cpuline_elem >= 5) {
--            cpu->wait_ticks   = (unsigned long)ciowll;
--            cpu->intrpt_ticks = (unsigned long)cirqll;
--            cpu->sirq_ticks   = (unsigned long)csoftll;
-+            cpu->wait_ticks   = (unsigned long long)ciowll;
-+            cpu->intrpt_ticks = (unsigned long long)cirqll;
-+            cpu->sirq_ticks   = (unsigned long long)csoftll;
-         }
-         /* rest */
--        cpu->user_ticks = (unsigned long)cusell;
--        cpu->nice_ticks = (unsigned long)cicell;
--        cpu->sys_ticks  = (unsigned long)csysll;
--        cpu->idle_ticks = (unsigned long)cidell;
-+        cpu->user_ticks = (unsigned long long)cusell;
-+        cpu->nice_ticks = (unsigned long long)cicell;
-+        cpu->sys_ticks  = (unsigned long long)csysll;
-+        cpu->idle_ticks = (unsigned long long)cidell;
-     }
-     if ( b1 == buff ) {
- 	if (first)
-@@ -232,6 +236,10 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	    vmbuff = (char*)realloc(vmbuff, vmbsize+1);
- 	    close(vmstatfd);
- 	    vmstatfd = open(VMSTAT_FILE, O_RDONLY, 0);
-+	    if (vmstatfd == -1) {
-+                snmp_log_perror("cannot open " VMSTAT_FILE);
-+                return;
-+	    }
-         }
-         close(vmstatfd);
-         if ( bytes_read < 0 ) {
-@@ -246,7 +254,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	b = strstr(vmbuff, "pgpgin ");
- 	if (b) {
- 	    sscanf(b, "pgpgin %llu", &pin);
--            cpu->pageIn  = (unsigned long)pin*2;  /* ??? */
-+            cpu->pageIn  = (unsigned long long)pin*2;  /* ??? */
- 	} else {
- 	    if (first)
- 		snmp_log(LOG_ERR, "No pgpgin line in %s\n", VMSTAT_FILE);
-@@ -255,7 +263,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	b = strstr(vmbuff, "pgpgout ");
- 	if (b) {
- 	    sscanf(b, "pgpgout %llu", &pout);
--            cpu->pageOut = (unsigned long)pout*2;  /* ??? */
-+            cpu->pageOut = (unsigned long long)pout*2;  /* ??? */
- 	} else {
- 	    if (first)
- 		snmp_log(LOG_ERR, "No pgpgout line in %s\n", VMSTAT_FILE);
-@@ -264,7 +272,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	b = strstr(vmbuff, "pswpin ");
- 	if (b) {
- 	    sscanf(b, "pswpin %llu", &swpin);
--            cpu->swapIn  = (unsigned long)swpin;
-+            cpu->swapIn  = (unsigned long long)swpin;
- 	} else {
- 	    if (first)
- 		snmp_log(LOG_ERR, "No pswpin line in %s\n", VMSTAT_FILE);
-@@ -273,7 +281,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	b = strstr(vmbuff, "pswpout ");
- 	if (b) {
- 	    sscanf(b, "pswpout %llu", &swpout);
--            cpu->swapOut = (unsigned long)swpout;
-+            cpu->swapOut = (unsigned long long)swpout;
- 	} else {
- 	    if (first)
- 		snmp_log(LOG_ERR, "No pswpout line in %s\n", VMSTAT_FILE);
-@@ -284,8 +292,8 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	b = strstr(buff, "page ");
- 	if (b) {
- 	    sscanf(b, "page %llu %llu", &pin, &pout);
--            cpu->pageIn  = (unsigned long)pin;
--            cpu->pageOut = (unsigned long)pout;
-+            cpu->pageIn  = (unsigned long long)pin;
-+            cpu->pageOut = (unsigned long long)pout;
- 	} else {
- 	    if (first)
- 		snmp_log(LOG_ERR, "No page line in %s\n", STAT_FILE);
-@@ -294,8 +302,8 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
- 	b = strstr(buff, "swap ");
- 	if (b) {
- 	    sscanf(b, "swap %llu %llu", &swpin, &swpout);
--            cpu->swapIn  = (unsigned long)swpin;
--            cpu->swapOut = (unsigned long)swpout;
-+            cpu->swapIn  = (unsigned long long)swpin;
-+            cpu->swapOut = (unsigned long long)swpout;
- 	} else {
- 	    if (first)
- 		snmp_log(LOG_ERR, "No swap line in %s\n", STAT_FILE);
-@@ -306,7 +314,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
-     b = strstr(buff, "intr ");
-     if (b) {
- 	sscanf(b, "intr %llu %llu", &itot, &iticks);
--        cpu->nInterrupts = (unsigned long)itot;
-+        cpu->nInterrupts = (unsigned long long)itot;
-         /* iticks not used? */
-     } else {
- 	if (first)
-@@ -315,7 +323,7 @@ void _cpu_load_swap_etc( char *buff, netsnmp_cpu_info *cpu ) {
-     b = strstr(buff, "ctxt ");
-     if (b) {
- 	sscanf(b, "ctxt %llu", &ctx);
--        cpu->nCtxSwitches = (unsigned long)ctx;
-+        cpu->nCtxSwitches = (unsigned long long)ctx;
-     } else {
- 	if (first)
- 	    snmp_log(LOG_ERR, "No ctxt line in %s\n", STAT_FILE);
-diff --git a/agent/mibgroup/hardware/cpu/cpu_nlist.c b/agent/mibgroup/hardware/cpu/cpu_nlist.c
-index b9554d7..974028a 100644
---- a/agent/mibgroup/hardware/cpu/cpu_nlist.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_nlist.c
-@@ -76,12 +76,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-     auto_nlist( CPU_SYMBOL, (char *) cpu_stats, sizeof(cpu_stats));
-     auto_nlist( MEM_SYMBOL, (char *)&mem_stats, sizeof(mem_stats));
- 
--    cpu->user_ticks = (unsigned long)cpu_stats[CP_USER];
--    cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE];
--    cpu->sys2_ticks = (unsigned long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
--    cpu->idle_ticks = (unsigned long)cpu_stats[CP_IDLE];
--    cpu->kern_ticks = (unsigned long)cpu_stats[CP_SYS];
--    cpu->intrpt_ticks = (unsigned long)cpu_stats[CP_INTR];
-+    cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER];
-+    cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE];
-+    cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
-+    cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE];
-+    cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS];
-+    cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR];
-         /* wait_ticks, sirq_ticks unused */
- 
-         /*
-@@ -89,14 +89,14 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-          *   XXX - Do these really belong here ?
-          */
- #if defined(openbsd2) || defined(darwin)
--    cpu->swapIn  = (unsigned long)mem_stats.v_swpin;
--    cpu->swapOut = (unsigned long)mem_stats.v_swpout;
-+    cpu->swapIn  = (unsigned long long)mem_stats.v_swpin;
-+    cpu->swapOut = (unsigned long long)mem_stats.v_swpout;
- #else
--    cpu->swapIn  = (unsigned long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin;
--    cpu->swapOut = (unsigned long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout;
-+    cpu->swapIn  = (unsigned long long)mem_stats.v_swappgsin+mem_stats.v_vnodepgsin;
-+    cpu->swapOut = (unsigned long long)mem_stats.v_swappgsout+mem_stats.v_vnodepgsout;
- #endif
--    cpu->nInterrupts  = (unsigned long)mem_stats.v_intr;
--    cpu->nCtxSwitches = (unsigned long)mem_stats.v_swtch;
-+    cpu->nInterrupts  = (unsigned long long)mem_stats.v_intr;
-+    cpu->nCtxSwitches = (unsigned long long)mem_stats.v_swtch;
- 
- #ifdef PER_CPU_INFO
-     for ( i = 0; i < n; i++ ) {
-diff --git a/agent/mibgroup/hardware/cpu/cpu_pcp.c b/agent/mibgroup/hardware/cpu/cpu_pcp.c
-index dcc2724..94c7b5c 100644
---- a/agent/mibgroup/hardware/cpu/cpu_pcp.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_pcp.c
-@@ -153,13 +153,13 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-        exit(1);
-     }
- 
--    cpu->wait_ticks   = (unsigned long)resp->vset[CPUWAIT]->vlist[0].value.lval / 10;
--    cpu->intrpt_ticks = (unsigned long)resp->vset[CPUINTR]->vlist[0].value.lval / 10;
-+    cpu->wait_ticks   = (unsigned long long)resp->vset[CPUWAIT]->vlist[0].value.lval / 10;
-+    cpu->intrpt_ticks = (unsigned long long)resp->vset[CPUINTR]->vlist[0].value.lval / 10;
-     /*cpu->sirq_ticks   = (unsigned long)csoftll / 10;*/
--    cpu->user_ticks = (unsigned long)resp->vset[CPUUSER]->vlist[0].value.lval / 10;
-+    cpu->user_ticks = (unsigned long long)resp->vset[CPUUSER]->vlist[0].value.lval / 10;
-     /*cpu->nice_ticks = (unsigned long)cicell / 10;*/
--    cpu->sys_ticks  = (unsigned long)resp->vset[CPUSYS]->vlist[0].value.lval / 10;
--    cpu->idle_ticks = (unsigned long)resp->vset[CPUIDLE]->vlist[0].value.lval / 10;
-+    cpu->sys_ticks  = (unsigned long long)resp->vset[CPUSYS]->vlist[0].value.lval / 10;
-+    cpu->idle_ticks = (unsigned long long)resp->vset[CPUIDLE]->vlist[0].value.lval / 10;
- 
- 
-         /*
-@@ -168,12 +168,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-          */
-     /*cpu = netsnmp_cpu_get_byIdx( -1, 0 );*/
-     /*_cpu_load_swap_etc( buff, cpu );*/
--    cpu->pageIn  = (unsigned long)resp->vset[PAGESIN]->vlist[0].value.lval;
--    cpu->pageOut = (unsigned long)resp->vset[PAGESOUT]->vlist[0].value.lval;
--    cpu->swapIn  = (unsigned long)resp->vset[SWAPIN]->vlist[0].value.lval;
--    cpu->swapOut = (unsigned long)resp->vset[SWAPOUT]->vlist[0].value.lval;
--    cpu->nInterrupts = (unsigned long)resp->vset[INTR]->vlist[0].value.lval;
--    cpu->nCtxSwitches = (unsigned long)resp->vset[CTXT]->vlist[0].value.lval;
-+    cpu->pageIn  = (unsigned long long)resp->vset[PAGESIN]->vlist[0].value.lval;
-+    cpu->pageOut = (unsigned long long)resp->vset[PAGESOUT]->vlist[0].value.lval;
-+    cpu->swapIn  = (unsigned long long)resp->vset[SWAPIN]->vlist[0].value.lval;
-+    cpu->swapOut = (unsigned long long)resp->vset[SWAPOUT]->vlist[0].value.lval;
-+    cpu->nInterrupts = (unsigned long long)resp->vset[INTR]->vlist[0].value.lval;
-+    cpu->nCtxSwitches = (unsigned long long)resp->vset[CTXT]->vlist[0].value.lval;
- 
-     /*
-      * XXX - TODO: extract per-CPU statistics
-diff --git a/agent/mibgroup/hardware/cpu/cpu_perfstat.c b/agent/mibgroup/hardware/cpu/cpu_perfstat.c
-index 981656d..5f58190 100644
---- a/agent/mibgroup/hardware/cpu/cpu_perfstat.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_perfstat.c
-@@ -58,27 +58,27 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-                      sizeof(perfstat_cpu_total_t), 1) > 0) {
- 
-         /* Returns 'u_longlong_t' statistics */
--        cpu->user_ticks = (unsigned long)cs.user / cs.ncpus;
--        cpu->sys_ticks  = ((unsigned long)cs.sys + (unsigned long)cs.wait) / cs.ncpus;
--        cpu->kern_ticks = (unsigned long)cs.sys / cs.ncpus;
--        cpu->wait_ticks = (unsigned long)cs.wait / cs.ncpus;
--        cpu->idle_ticks = (unsigned long)cs.idle / cs.ncpus;
-+        cpu->user_ticks = (unsigned long long)cs.user / cs.ncpus;
-+        cpu->sys_ticks  = ((unsigned long long)cs.sys + (unsigned long long)cs.wait) / cs.ncpus;
-+        cpu->kern_ticks = (unsigned long long)cs.sys / cs.ncpus;
-+        cpu->wait_ticks = (unsigned long long)cs.wait / cs.ncpus;
-+        cpu->idle_ticks = (unsigned long long)cs.idle / cs.ncpus;
-         /* intrpt_ticks, sirq_ticks, nice_ticks unused */
-     
-         /*
-          * Interrupt/Context Switch statistics
-          *   XXX - Do these really belong here ?
-          */
--        cpu->pageIn       = (unsigned long)cs.sysread;
--        cpu->pageOut      = (unsigned long)cs.syswrite;
--        cpu->nInterrupts  = (unsigned long)cs.devintrs + cs.softintrs;
--        cpu->nCtxSwitches = (unsigned long)cs.pswitch;
-+        cpu->pageIn       = (unsigned long long)cs.sysread;
-+        cpu->pageOut      = (unsigned long long)cs.syswrite;
-+        cpu->nInterrupts  = (unsigned long long)cs.devintrs + cs.softintrs;
-+        cpu->nCtxSwitches = (unsigned long long)cs.pswitch;
-     }
- 
-     if (perfstat_memory_total((perfstat_id_t *)NULL, &ms,
-                      sizeof(perfstat_memory_total_t), 1) > 0) {
--        cpu->swapIn  = (unsigned long)ms.pgspins;
--        cpu->swapOut = (unsigned long)ms.pgspouts;
-+        cpu->swapIn  = (unsigned long long)ms.pgspins;
-+        cpu->swapOut = (unsigned long long)ms.pgspouts;
-     }
- 
- 
-@@ -91,14 +91,14 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-     if (perfstat_cpu(&name, cs2, sizeof(perfstat_cpu_t), n) > 0) {
-         for ( i = 0; i < n; i++ ) {
-             cpu = netsnmp_cpu_get_byIdx( i, 0 );
--            cpu->user_ticks = (unsigned long)cs2[i].user;
--            cpu->sys_ticks  = (unsigned long)cs2[i].sys + (unsigned long)cs2[i].wait;
--            cpu->kern_ticks = (unsigned long)cs2[i].sys;
--            cpu->wait_ticks = (unsigned long)cs2[i].wait;
--            cpu->idle_ticks = (unsigned long)cs2[i].idle;
--            cpu->pageIn     = (unsigned long)cs2[i].sysread;
--            cpu->pageOut    = (unsigned long)cs2[i].syswrite;
--            cpu->nCtxSwitches = (unsigned long)cs2[i].pswitch;
-+            cpu->user_ticks = (unsigned long long)cs2[i].user;
-+            cpu->sys_ticks  = (unsigned long long)cs2[i].sys + (unsigned long long)cs2[i].wait;
-+            cpu->kern_ticks = (unsigned long long)cs2[i].sys;
-+            cpu->wait_ticks = (unsigned long long)cs2[i].wait;
-+            cpu->idle_ticks = (unsigned long long)cs2[i].idle;
-+            cpu->pageIn     = (unsigned long long)cs2[i].sysread;
-+            cpu->pageOut    = (unsigned long long)cs2[i].syswrite;
-+            cpu->nCtxSwitches = (unsigned long long)cs2[i].pswitch;
-             /* Interrupt stats only apply overall, not per-CPU */
-         }
-     } else {
-diff --git a/agent/mibgroup/hardware/cpu/cpu_pstat.c b/agent/mibgroup/hardware/cpu/cpu_pstat.c
-index c68739b..35c1d63 100644
---- a/agent/mibgroup/hardware/cpu/cpu_pstat.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_pstat.c
-@@ -72,13 +72,13 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
- 
-     pstat_getdynamic(&psd, sizeof(psd), 1, 0);
-     /* XXX - Compare cpu_num against psd.psd_proc_cnt */
--    cpu->user_ticks = (unsigned long)psd.psd_cpu_time[CP_USER];
--    cpu->nice_ticks = (unsigned long)psd.psd_cpu_time[CP_NICE];
--    cpu->sys2_ticks = (unsigned long)psd.psd_cpu_time[CP_SYS]+
-+    cpu->user_ticks = (unsigned long long)psd.psd_cpu_time[CP_USER];
-+    cpu->nice_ticks = (unsigned long long)psd.psd_cpu_time[CP_NICE];
-+    cpu->sys2_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS]+
-                                      psd.psd_cpu_time[CP_WAIT];
--    cpu->idle_ticks = (unsigned long)psd.psd_cpu_time[CP_IDLE];
--    cpu->wait_ticks = (unsigned long)psd.psd_cpu_time[CP_WAIT];
--    cpu->kern_ticks = (unsigned long)psd.psd_cpu_time[CP_SYS];
-+    cpu->idle_ticks = (unsigned long long)psd.psd_cpu_time[CP_IDLE];
-+    cpu->wait_ticks = (unsigned long long)psd.psd_cpu_time[CP_WAIT];
-+    cpu->kern_ticks = (unsigned long long)psd.psd_cpu_time[CP_SYS];
-         /* XXX - record (sum of) "all other ticks" */
-         /* intrpt_ticks, sirq_ticks unused */
- 
-@@ -87,21 +87,21 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-          *   XXX - Do these really belong here ?
-          */
-     pstat_getvminfo(&psv, sizeof(psv), 1, 0);
--    cpu->swapIn  = (unsigned long)psv.psv_sswpin;
--    cpu->swapOut = (unsigned long)psv.psv_sswpout;
--    cpu->nInterrupts  = (unsigned long)psv.psv_sintr;
--    cpu->nCtxSwitches = (unsigned long)psv.psv_sswtch;
-+    cpu->swapIn  = (unsigned long long)psv.psv_sswpin;
-+    cpu->swapOut = (unsigned long long)psv.psv_sswpout;
-+    cpu->nInterrupts  = (unsigned long long)psv.psv_sintr;
-+    cpu->nCtxSwitches = (unsigned long long)psv.psv_sswtch;
- 
- 
-     for ( i = 0; i < psd.psd_proc_cnt; i++ ) {
-         cpu = netsnmp_cpu_get_byIdx( i, 0 );
--        cpu->user_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_USER];
--        cpu->nice_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_NICE];
--        cpu->sys2_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_SYS]+
-+        cpu->user_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_USER];
-+        cpu->nice_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_NICE];
-+        cpu->sys2_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS]+
-                                          psd.psd_mp_cpu_time[i][CP_WAIT];
--        cpu->idle_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_IDLE];
--        cpu->wait_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_WAIT];
--        cpu->kern_ticks = (unsigned long)psd.psd_mp_cpu_time[i][CP_SYS];
-+        cpu->idle_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_IDLE];
-+        cpu->wait_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_WAIT];
-+        cpu->kern_ticks = (unsigned long long)psd.psd_mp_cpu_time[i][CP_SYS];
-         /* XXX - record (sum of) "all other ticks" */
-     }
- 
-diff --git a/agent/mibgroup/hardware/cpu/cpu_sysctl.c b/agent/mibgroup/hardware/cpu/cpu_sysctl.c
-index e549671..5599a58 100644
---- a/agent/mibgroup/hardware/cpu/cpu_sysctl.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_sysctl.c
-@@ -40,23 +40,25 @@ void _cpu_copy_stats( netsnmp_cpu_info *cpu );
-      *   (including descriptions)
-      */
- void init_cpu_sysctl( void ) {
--    int               n;
--    size_t            i;
-+    int               i, n;
-+    size_t            siz;
-     int               ncpu_mib[]  = { CTL_HW, HW_NCPU };
-+#if !(defined(__NetBSD__) && ( defined(__i386__) || defined(__x86_64__) ) )
-     int               model_mib[] = { CTL_HW, HW_MODEL };
-+#endif
-     char              descr[ SNMP_MAXBUF ];
-     netsnmp_cpu_info  *cpu = netsnmp_cpu_get_byIdx( -1, 1 );
-     strcpy(cpu->name, "Overall CPU statistics");
- 
--    i = sizeof(n);
--    sysctl(ncpu_mib, 2, &n, &i, NULL, 0);
-+    siz = sizeof(n);
-+    sysctl(ncpu_mib, 2, &n, &siz, NULL, 0);
-     if ( n <= 0 )
-         n = 1;   /* Single CPU system */
--    i = sizeof(descr);
-+    siz = sizeof(descr);
- #if defined(__NetBSD__) && ( defined(__i386__) || defined(__x86_64__) )
--    sysctlbyname("machdep.cpu_brand", descr, (void *)&i, NULL, 0);
-+    sysctlbyname("machdep.cpu_brand", descr, &siz, NULL, 0);
- #else
--    sysctl(model_mib, 2, descr, &i, NULL, 0);
-+    sysctl(model_mib, 2, descr, &siz, NULL, 0);
- #endif
-     for ( i = 0; i < n; i++ ) {
-         cpu = netsnmp_cpu_get_byIdx( i, 1 );
-@@ -176,12 +178,12 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
- #else
-     sysctl(cpu_mib, 2,  cpu_stats, &cpu_size, NULL, 0);
- #endif
--    cpu->user_ticks = (unsigned long)cpu_stats[CP_USER];
--    cpu->nice_ticks = (unsigned long)cpu_stats[CP_NICE];
--    cpu->sys2_ticks = (unsigned long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
--    cpu->kern_ticks = (unsigned long)cpu_stats[CP_SYS];
--    cpu->idle_ticks = (unsigned long)cpu_stats[CP_IDLE];
--    cpu->intrpt_ticks = (unsigned long)cpu_stats[CP_INTR];
-+    cpu->user_ticks = (unsigned long long)cpu_stats[CP_USER];
-+    cpu->nice_ticks = (unsigned long long)cpu_stats[CP_NICE];
-+    cpu->sys2_ticks = (unsigned long long)cpu_stats[CP_SYS]+cpu_stats[CP_INTR];
-+    cpu->kern_ticks = (unsigned long long)cpu_stats[CP_SYS];
-+    cpu->idle_ticks = (unsigned long long)cpu_stats[CP_IDLE];
-+    cpu->intrpt_ticks = (unsigned long long)cpu_stats[CP_INTR];
-         /* wait_ticks, sirq_ticks unused */
-     
-         /*
-@@ -189,15 +191,15 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic ) {
-          *   XXX - Do these really belong here ?
-          */
-     sysctl(mem_mib, 2, &mem_stats, &mem_size, NULL, 0);
--    cpu->nInterrupts  = (unsigned long)mem_stats.NS_VM_INTR;
--    cpu->nCtxSwitches = (unsigned long)mem_stats.NS_VM_SWTCH;
--    cpu->swapIn       = (unsigned long)mem_stats.NS_VM_SWAPIN;
--    cpu->swapOut      = (unsigned long)mem_stats.NS_VM_SWAPOUT;
-+    cpu->nInterrupts  = (unsigned long long)mem_stats.NS_VM_INTR;
-+    cpu->nCtxSwitches = (unsigned long long)mem_stats.NS_VM_SWTCH;
-+    cpu->swapIn       = (unsigned long long)mem_stats.NS_VM_SWAPIN;
-+    cpu->swapOut      = (unsigned long long)mem_stats.NS_VM_SWAPOUT;
- #ifdef NS_VM_PAGEIN
--    cpu->pageIn       = (unsigned long)mem_stats.NS_VM_PAGEIN;
-+    cpu->pageIn       = (unsigned long long)mem_stats.NS_VM_PAGEIN;
- #endif
- #ifdef NS_VM_PAGEOUT
--    cpu->pageOut      = (unsigned long)mem_stats.NS_VM_PAGEOUT;
-+    cpu->pageOut      = (unsigned long long)mem_stats.NS_VM_PAGEOUT;
- #endif
- 
- #ifdef NETSNMP_KERN_MCPU
-diff --git a/agent/mibgroup/hardware/cpu/cpu_sysinfo.c b/agent/mibgroup/hardware/cpu/cpu_sysinfo.c
-index d510308..ed1f357 100644
---- a/agent/mibgroup/hardware/cpu/cpu_sysinfo.c
-+++ b/agent/mibgroup/hardware/cpu/cpu_sysinfo.c
-@@ -91,20 +91,20 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic )
-     }
- 
-     DEBUGMSGTL(("cpu_sysinfo", "total cpu kernel: %lu\n", sinfo_gen->cpu[CPU_KERNEL]));
--    cpu->sys2_ticks  = (unsigned long) sinfo_gen->cpu[CPU_KERNEL] + (unsigned long) sinfo_gen->cpu[CPU_SXBRK] + (unsigned long) sinfo_gen->cpu[CPU_INTR];
--    cpu->kern_ticks  = (unsigned long) sinfo_gen->cpu[CPU_KERNEL];
--    cpu->intrpt_ticks = (unsigned long) sinfo_gen->cpu[CPU_INTR];
--    cpu->user_ticks = (unsigned long) sinfo_gen->cpu[CPU_USER];
--    cpu->wait_ticks   = (unsigned long) sinfo_gen->cpu[CPU_WAIT];
--    cpu->idle_ticks = (unsigned long) sinfo_gen->cpu[CPU_IDLE];
-+    cpu->sys2_ticks  = (unsigned long long) sinfo_gen->cpu[CPU_KERNEL] + (unsigned long long) sinfo_gen->cpu[CPU_SXBRK] + (unsigned long long) sinfo_gen->cpu[CPU_INTR];
-+    cpu->kern_ticks  = (unsigned long long) sinfo_gen->cpu[CPU_KERNEL];
-+    cpu->intrpt_ticks = (unsigned long long) sinfo_gen->cpu[CPU_INTR];
-+    cpu->user_ticks = (unsigned long long) sinfo_gen->cpu[CPU_USER];
-+    cpu->wait_ticks   = (unsigned long long) sinfo_gen->cpu[CPU_WAIT];
-+    cpu->idle_ticks = (unsigned long long) sinfo_gen->cpu[CPU_IDLE];
- 
-     /* XXX - Do these really belong here ? */
--    cpu->pageIn  = (unsigned long)0;
--    cpu->pageOut = (unsigned long)0;
--    cpu->swapIn  = (unsigned long)sinfo_gen->swapin;
--    cpu->swapOut = (unsigned long)sinfo_gen->swapout;
--    cpu->nInterrupts = (unsigned long)sinfo_gen->intr_svcd;
--    cpu->nCtxSwitches = (unsigned long)sinfo_gen->pswitch;
-+    cpu->pageIn  = (unsigned long long)0;
-+    cpu->pageOut = (unsigned long long)0;
-+    cpu->swapIn  = (unsigned long long)sinfo_gen->swapin;
-+    cpu->swapOut = (unsigned long long)sinfo_gen->swapout;
-+    cpu->nInterrupts = (unsigned long long)sinfo_gen->intr_svcd;
-+    cpu->nCtxSwitches = (unsigned long long)sinfo_gen->pswitch;
- 
-     /* fetch individual cpu stats */
- 
-@@ -120,11 +120,11 @@ int netsnmp_cpu_arch_load( netsnmp_cache *cache, void *magic )
-         cpu = netsnmp_cpu_get_byIdx(i, 0);
- 
-         DEBUGMSGTL(("cpu_sysinfo", "cpu %u kernel: %lu\n", i, sinfo_cpus[i].cpu[CPU_KERNEL]));
--        cpu->sys2_ticks  = (unsigned long)sinfo_cpus[i].cpu[CPU_KERNEL] + (unsigned long) sinfo_cpus[i].cpu[CPU_SXBRK] + (unsigned long)sinfo_cpus[i].cpu[CPU_INTR];
--        cpu->intrpt_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_INTR];
--        cpu->user_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_USER];
--        cpu->wait_ticks   = (unsigned long)sinfo_cpus[i].cpu[CPU_WAIT];
--        cpu->idle_ticks = (unsigned long)sinfo_cpus[i].cpu[CPU_IDLE];
-+        cpu->sys2_ticks  = (unsigned long long)sinfo_cpus[i].cpu[CPU_KERNEL] + (unsigned long long) sinfo_cpus[i].cpu[CPU_SXBRK] + (unsigned long long)sinfo_cpus[i].cpu[CPU_INTR];
-+        cpu->intrpt_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_INTR];
-+        cpu->user_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_USER];
-+        cpu->wait_ticks   = (unsigned long long)sinfo_cpus[i].cpu[CPU_WAIT];
-+        cpu->idle_ticks = (unsigned long long)sinfo_cpus[i].cpu[CPU_IDLE];
-     }
- 
-     return 0;
-diff --git a/agent/mibgroup/hardware/fsys/fsys_getfsstats.c b/agent/mibgroup/hardware/fsys/fsys_getfsstats.c
-index 55327b7..93f38ce 100644
---- a/agent/mibgroup/hardware/fsys/fsys_getfsstats.c
-+++ b/agent/mibgroup/hardware/fsys/fsys_getfsstats.c
-@@ -164,7 +164,7 @@ netsnmp_fsys_arch_load( void )
-         entry->type = _fs_type( stats[i].f_fstypename );
-         entry->flags |= NETSNMP_FS_FLAG_ACTIVE;
- 
--        if (! stats[i].NSFS_FLAGS & MNT_LOCAL ) {
-+        if (! (stats[i].NSFS_FLAGS & MNT_LOCAL )) {
-             entry->flags |= NETSNMP_FS_FLAG_REMOTE;
-         }
-         if (  stats[i].NSFS_FLAGS & MNT_RDONLY ) {
-@@ -175,4 +175,6 @@ netsnmp_fsys_arch_load( void )
-         }
-         netsnmp_fsys_calculate32(entry);
-     }
-+
-+    free(stats);
- }
-diff --git a/agent/mibgroup/hardware/fsys/fsys_mntctl.c b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
-index e65d6d5..3ad68d4 100644
---- a/agent/mibgroup/hardware/fsys/fsys_mntctl.c
-+++ b/agent/mibgroup/hardware/fsys/fsys_mntctl.c
-@@ -128,9 +128,9 @@ netsnmp_fsys_arch_load( void )
-             continue;
-         }
- 
--        strncpy( entry->path,   path,    sizeof( entry->path   ));
--        strncpy( entry->device, vmt2dataptr( aixcurr, VMT_STUB),
--                                         sizeof( entry->device ));
-+        strlcpy(entry->path, path, sizeof(entry->path));
-+        strlcpy(entry->device, vmt2dataptr(aixcurr, VMT_STUB),
-+                sizeof(entry->device));
-         entry->type   = _fsys_type( aixcurr->vmt_gfstype );
- 
-         if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT))
-diff --git a/agent/mibgroup/hardware/fsys/fsys_mntent.c b/agent/mibgroup/hardware/fsys/fsys_mntent.c
-index 1a156f4..c380365 100644
---- a/agent/mibgroup/hardware/fsys/fsys_mntent.c
-+++ b/agent/mibgroup/hardware/fsys/fsys_mntent.c
-@@ -135,6 +135,9 @@ _fsys_type( char *typename )
-               !strcmp(typename, MNTTYPE_GFS2) ||
-               !strcmp(typename, MNTTYPE_XFS) ||
-               !strcmp(typename, MNTTYPE_JFS) ||
-+              !strcmp(typename, MNTTYPE_VXFS) ||
-+              !strcmp(typename, MNTTYPE_REISERFS) ||
-+              !strcmp(typename, MNTTYPE_OCFS2) ||
-               !strcmp(typename, MNTTYPE_LOFS))
-        return NETSNMP_FS_TYPE_OTHER;
- 
-@@ -190,11 +193,9 @@ netsnmp_fsys_arch_load( void )
-             continue;
-         }
- 
--        strncpy( entry->path,   m->NSFS_PATH,    sizeof( entry->path   ));
--        entry->path[sizeof(entry->path)-1] = '\0';
--        strncpy( entry->device, m->NSFS_DEV,     sizeof( entry->device ));
--        entry->device[sizeof(entry->device)-1] = '\0';
--        entry->type   = _fsys_type(  m->NSFS_TYPE );
-+        strlcpy(entry->path, m->NSFS_PATH, sizeof(entry->path));
-+        strlcpy(entry->device, m->NSFS_DEV, sizeof(entry->device));
-+        entry->type = _fsys_type(m->NSFS_TYPE);
-         if (!(entry->type & _NETSNMP_FS_TYPE_SKIP_BIT))
-             entry->flags |= NETSNMP_FS_FLAG_ACTIVE;
- 
-diff --git a/agent/mibgroup/hardware/fsys/hw_fsys.c b/agent/mibgroup/hardware/fsys/hw_fsys.c
-index c96284e..a6cd94d 100644
---- a/agent/mibgroup/hardware/fsys/hw_fsys.c
-+++ b/agent/mibgroup/hardware/fsys/hw_fsys.c
-@@ -3,6 +3,9 @@
- #include <net-snmp/net-snmp-includes.h>
- #include <net-snmp/agent/net-snmp-agent-includes.h>
- #include <net-snmp/agent/hardware/fsys.h>
-+#ifdef HAVE_INTTYPES_H
-+#include <inttypes.h>
-+#endif
- 
- netsnmp_feature_child_of(hw_fsys_get_container, netsnmp_unused)
- 
-@@ -174,9 +177,8 @@ netsnmp_fsys_by_path( char *path, int create_type )
-      * ... so let's create a new one
-      */
-     sp = _fsys_create_entry();
--    if ( sp ) {
--        strncpy( sp->path, path, sizeof(sp->path) );
--    }
-+    if (sp)
-+        strlcpy(sp->path, path, sizeof(sp->path));
-     return sp;
- }
- 
-@@ -217,9 +219,8 @@ netsnmp_fsys_by_device( char *device, int create_type )
-      * ... so let's create a new one
-      */
-     sp = _fsys_create_entry();
--    if ( sp ) {
--        strncpy( sp->device, device, sizeof(sp->device) );
--    }
-+    if (sp)
-+        strlcpy(sp->device, device, sizeof(sp->device));
-     return sp;
- }
- 
-@@ -242,7 +243,7 @@ _fsys_create_entry( void )
-         sp->idx.oids[0] = ++_fsys_idx;
-     }
- 
--    DEBUGMSGTL(("fsys:new", "Create filesystem entry (index = %d\n", _fsys_idx));
-+    DEBUGMSGTL(("fsys:new", "Create filesystem entry (index = %d)\n", _fsys_idx));
-     CONTAINER_INSERT( _fsys_container, sp );
-     return sp;
- }
-@@ -319,21 +320,30 @@ netsnmp_fsys_avail( netsnmp_fsys_info *f) {
- #define INT32_MAX 0x7fffffff
- #endif
- 
-+#ifndef PRIu64
-+#define PRIu64 "llu"
-+#endif
-+
- /* recalculate f->size_32, used_32, avail_32 and units_32 from f->size & comp.*/
- void
--netsnmp_fsys_calculate32( netsnmp_fsys_info *f)
-+netsnmp_fsys_calculate32(netsnmp_fsys_info *f)
- {
-     unsigned long long s = f->size;
--    unsigned long long u = f->units;
--    int factor = 0;
-+    unsigned shift = 0;
-+
-     while (s > INT32_MAX) {
-         s = s >> 1;
--        u = u << 1;
--        factor++;
-+        shift++;
-     }
- 
-     f->size_32 = s;
--    f->units_32 = u;
--    f->avail_32 = f->avail << factor;
--    f->used_32 = f->used << factor;
-+    f->units_32 = f->units << shift;
-+    f->avail_32 = f->avail >> shift;
-+    f->used_32 = f->used >> shift;
-+
-+    DEBUGMSGTL(("fsys", "Results of 32-bit conversion: size %" PRIu64 " -> %lu;"
-+		" units %" PRIu64 " -> %lu; avail %" PRIu64 " -> %lu;"
-+                " used %" PRIu64 " -> %lu\n",
-+		(uint64_t)f->size, f->size_32, (uint64_t)f->units, f->units_32,
-+		(uint64_t)f->avail, f->avail_32, (uint64_t)f->used, f->used_32));
- }
-diff --git a/agent/mibgroup/hardware/fsys/mnttypes.h b/agent/mibgroup/hardware/fsys/mnttypes.h
-index f6d96fe..9183451 100644
---- a/agent/mibgroup/hardware/fsys/mnttypes.h
-+++ b/agent/mibgroup/hardware/fsys/mnttypes.h
-@@ -90,9 +90,6 @@
- #ifndef MNTTYPE_PC
- #define MNTTYPE_PC       "pc"
- #endif
--#ifndef MNTTYPE_REISERFS
--#define MNTTYPE_REISERFS "reiserfs"
--#endif
- #ifndef MNTTYPE_SMBFS
- #define MNTTYPE_SMBFS    "smbfs"
- #endif
-@@ -108,30 +105,48 @@
- #ifndef MNTTYPE_VFAT
- #define MNTTYPE_VFAT     "vfat"
- #endif
-+
-+/*
-+ *  File systems to monitor, but not covered by HR-TYPES enumerations
-+ */
-+#ifndef MNTTYPE_MVFS
-+#define MNTTYPE_MVFS     "mvfs"
-+#endif
-+#ifndef MNTTYPE_TMPFS
-+#define MNTTYPE_TMPFS    "tmpfs"
-+#endif
- #ifndef MNTTYPE_GFS
- #define MNTTYPE_GFS      "gfs"
- #endif
- #ifndef MNTTYPE_GFS2
- #define MNTTYPE_GFS2     "gfs2"
- #endif
--
--/*
-- *  File systems to monitor, but not covered by HR-TYPES enumerations
-- */
-+#ifndef MNTTYPE_XFS
-+#define MNTTYPE_XFS      "xfs"
-+#endif
-+#ifndef MNTTYPE_JFS
-+#define MNTTYPE_JFS      "jfs"
-+#endif
-+#ifndef MNTTYPE_VXFS
-+#define MNTTYPE_VXFS      "vxfs"
-+#endif
-+#ifndef MNTTYPE_REISERFS
-+#define MNTTYPE_REISERFS "reiserfs"
-+#endif
- #ifndef MNTTYPE_LOFS
- #define MNTTYPE_LOFS     "lofs"
- #endif
--#ifndef MNTTYPE_APP
--#define MNTTYPE_APP      "app"
--#endif
--#ifndef MNTTYPE_MVFS
--#define MNTTYPE_MVFS     "mvfs"
-+#ifndef MNTTYPE_OCFS2
-+#define MNTTYPE_OCFS2    "ocfs2"
- #endif
- 
- /*
-  *  File systems to skip
-  *    (Probably not strictly needed)
-  */
-+#ifndef MNTTYPE_APP
-+#define MNTTYPE_APP      "app"
-+#endif
- #ifndef MNTTYPE_DEVPTS
- #define MNTTYPE_DEVPTS   "devpts"
- #endif
-@@ -144,9 +159,6 @@
- #ifndef MNTTYPE_SYSFS
- #define MNTTYPE_SYSFS    "sysfs"
- #endif
--#ifndef MNTTYPE_TMPFS
--#define MNTTYPE_TMPFS    "tmpfs"
--#endif
- #ifndef MNTTYPE_USBFS
- #define MNTTYPE_USBFS    "usbfs"
- #endif
-@@ -156,12 +168,5 @@
- #ifndef MNTTYPE_RPCPIPE
- #define MNTTYPE_RPCPIPE  "rpc_pipefs"
- #endif
--#ifndef MNTTYPE_XFS
--#define MNTTYPE_XFS      "xfs"
--#endif
--#ifndef MNTTYPE_JFS
--#define MNTTYPE_JFS      "jfs"
--#endif
--
- 
- #endif /* _NETSNMP_FSYS_MNTTYPES_H */
-diff --git a/agent/mibgroup/hardware/memory/memory_linux.c b/agent/mibgroup/hardware/memory/memory_linux.c
-index 89abf57..8c189c5 100644
---- a/agent/mibgroup/hardware/memory/memory_linux.c
-+++ b/agent/mibgroup/hardware/memory/memory_linux.c
-@@ -46,6 +46,7 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
-         buff = (char*)malloc(bsize+1);
-         if (NULL == buff) {
-             snmp_log(LOG_ERR, "malloc failed\n");
-+            close(statfd);
-             return -1;
-         }
-     }
-@@ -53,6 +54,7 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
-         b = (char*)realloc(buff, bsize + MEMINFO_STEP_SIZE + 1);
-         if (NULL == b) {
-             snmp_log(LOG_ERR, "malloc failed\n");
-+            close(statfd);
-             return -1;
-         }
-         buff = b;
-@@ -89,13 +91,19 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
-         if (first)
-             snmp_log(LOG_ERR, "No MemFree line in /proc/meminfo\n");
-     }
--    b = strstr(buff, "MemShared: ");
--    if (b)
--        sscanf(b, "MemShared: %lu", &memshared);
-+    if (0 == netsnmp_os_prematch("Linux","2.4")) {
-+        b = strstr(buff, "MemShared: ");
-+        if (b)
-+            sscanf(b, "MemShared: %lu", &memshared);
-+        else if (first)
-+            snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n");
-+    }
-     else {
--        if (first)
--            if (0 == netsnmp_os_prematch("Linux","2.4"))
--                snmp_log(LOG_ERR, "No MemShared line in /proc/meminfo\n");
-+        b = strstr(buff, "Shmem: ");
-+        if (b)
-+            sscanf(b, "Shmem: %lu", &memshared);
-+        else if (first)
-+            snmp_log(LOG_ERR, "No Shmem line in /proc/meminfo\n");
-     }
-     b = strstr(buff, "Buffers: ");
-     if (b)
-@@ -155,8 +163,6 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
-         mem->other = -1;
-     }
- 
--   /* Shared memory is not reported by Linux 2.6 kernel */
--   if (0 != netsnmp_os_prematch("Linux","2.6")) {
-     mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_SHARED, 1 );
-     if (!mem) {
-         snmp_log_perror("No Shared Memory info entry");
-@@ -165,10 +171,9 @@ int netsnmp_mem_arch_load( netsnmp_cache *cache, void *magic ) {
-              mem->descr = strdup("Shared memory");
-         mem->units = 1024;
-         mem->size  = memshared;
--        mem->free  = -1;
-+        mem->free  = 0;    /* All in use */
-         mem->other = -1;
-     }
--   }
- 
-     mem = netsnmp_memory_get_byIdx( NETSNMP_MEM_TYPE_CACHED, 1 );
-     if (!mem) {
-diff --git a/agent/mibgroup/hardware/sensors/hw_sensors.c b/agent/mibgroup/hardware/sensors/hw_sensors.c
-index 508ad47..1a01645 100644
---- a/agent/mibgroup/hardware/sensors/hw_sensors.c
-+++ b/agent/mibgroup/hardware/sensors/hw_sensors.c
-@@ -163,6 +163,11 @@ sensor_by_name( const char *name, int create_type )
-      */
-     sp = SNMP_MALLOC_TYPEDEF( netsnmp_sensor_info );
-     if ( sp ) {
-+        if (strlen(name) >= sizeof(sp->name)) {
-+            snmp_log(LOG_ERR, "Sensor name is too large: %s\n", name);
-+            free(sp);
-+            return NULL;
-+        }
-         strcpy( sp->name, name );
-         sp->type = create_type;
-         /*
-diff --git a/agent/mibgroup/hardware/sensors/lmsensors_v3.c b/agent/mibgroup/hardware/sensors/lmsensors_v3.c
-index d33a1c4..e34da19 100644
---- a/agent/mibgroup/hardware/sensors/lmsensors_v3.c
-+++ b/agent/mibgroup/hardware/sensors/lmsensors_v3.c
-@@ -32,7 +32,7 @@ netsnmp_sensor_arch_load(netsnmp_cache *cache, void *vp) {
- 
-             while ((data2 = sensors_get_all_subfeatures( chip, data, &b))) {
-                 char           *label = NULL;
--                double          val;
-+                double          val = 0;
-                 int             type = NETSNMP_SENSOR_TYPE_OTHER;
- 
-                 DEBUGMSGTL(("sensors:arch:detail", "  get_subfeatures (%s, %d)\n", data2->name, data2->number));
-diff --git a/agent/mibgroup/host/data_access/swinst_apt.c b/agent/mibgroup/host/data_access/swinst_apt.c
-index d204857..26cdba5 100644
---- a/agent/mibgroup/host/data_access/swinst_apt.c
-+++ b/agent/mibgroup/host/data_access/swinst_apt.c
-@@ -37,11 +37,10 @@ static char apt_fmt[SNMP_MAXBUF];
- void
- netsnmp_swinst_arch_init(void)
- {
--    strncpy( pkg_directory, "/var/lib/dpkg/info", SNMP_MAXBUF );
-+    strlcpy(pkg_directory, "/var/lib/dpkg/info", sizeof(pkg_directory));
-     snprintf(apt_fmt, SNMP_MAXBUF, "%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%d[^#]#%%%ds",
- 	SNMP_MAXBUF, SNMP_MAXBUF, SNMP_MAXBUF,
- 	SNMP_MAXBUF, SNMP_MAXBUF, SNMP_MAXBUF);
--    return;
- }
- 
- void
-@@ -95,7 +94,7 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
-         entry->swDate_len = 8;
- 	memcpy(entry->swDate, "\0\0\1\1\0\0\0\0", 8);
-     }
--    fclose(p);
-+    pclose(p);
-     DEBUGMSGTL(("swinst:load:arch"," loaded %d entries\n",
-                 CONTAINER_SIZE(container)));
- 
-diff --git a/agent/mibgroup/host/data_access/swinst_pkginfo.c b/agent/mibgroup/host/data_access/swinst_pkginfo.c
-index 1ca40a2..327ca70 100644
---- a/agent/mibgroup/host/data_access/swinst_pkginfo.c
-+++ b/agent/mibgroup/host/data_access/swinst_pkginfo.c
-@@ -103,7 +103,9 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
-                          if there isn't a list of them! */
-     }
-     d = opendir( pkg_directory );
--    while (d != NULL && (dp = readdir(d)) != NULL) {
-+    if (!d)
-+	return 1;
-+    while ((dp = readdir(d)) != NULL) {
-         if ( '.' == dp->d_name[0] )
-             continue;
-         entry = netsnmp_swinst_entry_create( i++ );
-diff --git a/agent/mibgroup/host/data_access/swinst_rpm.c b/agent/mibgroup/host/data_access/swinst_rpm.c
-index a2862e0..71595be 100644
---- a/agent/mibgroup/host/data_access/swinst_rpm.c
-+++ b/agent/mibgroup/host/data_access/swinst_rpm.c
-@@ -100,7 +100,7 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
-     int32_t              *t;
-     time_t                install_time;
-     size_t                date_len;
--    int                   rc, i = 1;
-+    int                   i = 1;
-     netsnmp_swinst_entry *entry;
- 
-     ts = rpmtsCreate();
-@@ -112,11 +112,11 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
- 
-     while (NULL != (h = rpmdbNextIterator( mi )))
-     {
--
-+        const u_char *dt;
-         entry = netsnmp_swinst_entry_create( i++ );
-         if (NULL == entry)
-             continue;   /* error already logged by function */
--        rc = CONTAINER_INSERT(container, entry);
-+        CONTAINER_INSERT(container, entry);
- 
-         h = headerLink( h );
-         headerGetEntry( h, RPMTAG_NAME,        NULL, (void**)&n, NULL);
-@@ -134,8 +134,15 @@ netsnmp_swinst_arch_load( netsnmp_container *container, u_int flags)
-                         : 4;     /*  application    */
- 
-         install_time = *t;
--        entry->swDate_len = snprintf( entry->swDate, sizeof(entry->swDate),
--                                      "%s", date_n_time( &install_time, &date_len ));
-+        dt = date_n_time( &install_time, &date_len );
-+        if (date_len != 8 && date_len != 11) {
-+            snmp_log(LOG_ERR, "Bogus length from date_n_time for %s", entry->swName);
-+            entry->swDate_len = 0;
-+        }
-+        else {
-+            entry->swDate_len = date_len;
-+            memcpy(entry->swDate, dt, entry->swDate_len);
-+        }
- 
-         headerFree( h );
-     }
-diff --git a/agent/mibgroup/host/data_access/swrun_darwin.c b/agent/mibgroup/host/data_access/swrun_darwin.c
-index 7d07cd5..6c6b82a 100644
---- a/agent/mibgroup/host/data_access/swrun_darwin.c
-+++ b/agent/mibgroup/host/data_access/swrun_darwin.c
-@@ -289,8 +289,7 @@ _set_command_name_jaguar(netsnmp_swrun_entry *entry)
-     exec_path = (char *)ip;
-     DEBUGMSGTL(("swrun:load:arch:_cn"," exec_path %s\n", exec_path));
-     len = strlen(exec_path);
--    strncpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)-1);
--    entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-1] = 0;
-+    strlcpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath));
-     if (len > sizeof(entry->hrSWRunPath)-1) {
-         DEBUGMSGTL(("swrun:load:arch:_cn"," truncating long run path\n"));
-         entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-2] = '$';
-@@ -326,8 +325,7 @@ _set_command_name_jaguar(netsnmp_swrun_entry *entry)
-     DEBUGMSGTL(("swrun:load:arch:_cn",
-                 SWRUNINDENT "kernel name %s\n", command));
-     if (strncmp(command, entry->hrSWRunName, sizeof(entry->hrSWRunName)-1)) {
--        strncpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)-1);
--        entry->hrSWRunName[sizeof(entry->hrSWRunName)-1] = 0;
-+        strlcpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName));
-         entry->hrSWRunName_len = strlen(entry->hrSWRunName);
-         DEBUGMSGTL(("swrun:load:arch:_cn", "**"
-                     SWRUNINDENT "updated name to %s\n", entry->hrSWRunName));
-@@ -369,8 +367,7 @@ _set_command_name(netsnmp_swrun_entry *entry)
- 
-     exec_path = arg_buf + sizeof(nargs);
-     len = strlen(exec_path);
--    strncpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath)-1);
--    entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-1] = 0;
-+    strlcpy(entry->hrSWRunPath, exec_path, sizeof(entry->hrSWRunPath));
-     if (len > sizeof(entry->hrSWRunPath)-1) {
-         DEBUGMSGTL(("swrun:load:arch:_cn"," truncating long run path\n"));
-         entry->hrSWRunPath[sizeof(entry->hrSWRunPath)-2] = '$';
-@@ -459,8 +456,8 @@ _set_command_name(netsnmp_swrun_entry *entry)
-          * save arg
-          */
-         if(entry->hrSWRunParameters_len < sizeof(entry->hrSWRunParameters)-1) {
--            strncat(&entry->hrSWRunParameters[entry->hrSWRunParameters_len], argN,
--                    sizeof(entry->hrSWRunParameters) - entry->hrSWRunParameters_len - 2);
-+            strlcat(&entry->hrSWRunParameters[entry->hrSWRunParameters_len],
-+                    argN, sizeof(entry->hrSWRunParameters));
-             entry->hrSWRunParameters_len = strlen(entry->hrSWRunParameters);
-             if ((entry->hrSWRunParameters_len+2 < sizeof(entry->hrSWRunParameters)-1) && (0 != nargs)) {
-                 /* add space between params */
-@@ -486,8 +483,7 @@ _set_command_name(netsnmp_swrun_entry *entry)
-     
-     /* Allocate space for the command and copy. */
-     if (strncmp(command, entry->hrSWRunName, sizeof(entry->hrSWRunName)-1)) {
--        strncpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName)-1);
--        entry->hrSWRunName[sizeof(entry->hrSWRunName)-1] = 0;
-+        strlcpy(entry->hrSWRunName, command, sizeof(entry->hrSWRunName));
-         entry->hrSWRunName_len = strlen(entry->hrSWRunName);
-         DEBUGMSGTL(("swrun:load:arch:_cn",
-                     " **updated name to %s\n", entry->hrSWRunName));
-diff --git a/agent/mibgroup/host/data_access/swrun_kinfo.c b/agent/mibgroup/host/data_access/swrun_kinfo.c
-index aae5f62..64583bf 100644
---- a/agent/mibgroup/host/data_access/swrun_kinfo.c
-+++ b/agent/mibgroup/host/data_access/swrun_kinfo.c
-@@ -236,7 +236,7 @@ netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags)
-                              : 4  /*  application     */
-                              ;
- 
--#ifdef netbsdelf5
-+#ifdef netbsd5
-         switch (proc_table[i].SWRUN_K_STAT) {
- 	case LSONPROC:
-         case LSRUN:   entry->hrSWRunStatus = HRSWRUNSTATUS_RUNNING;
-diff --git a/agent/mibgroup/host/data_access/swrun_procfs_status.c b/agent/mibgroup/host/data_access/swrun_procfs_status.c
-index 367f422..a9aa2d8 100644
---- a/agent/mibgroup/host/data_access/swrun_procfs_status.c
-+++ b/agent/mibgroup/host/data_access/swrun_procfs_status.c
-@@ -123,32 +123,26 @@ netsnmp_arch_swrun_container_load( netsnmp_container *container, u_int flags)
-         }
-         fclose(fp);
- 
--        if ( cp ) {
--            /*
--             *     argv[0]   is hrSWRunPath
--             */ 
--            entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
--                                       sizeof(entry->hrSWRunPath)-1, "%s", buf);
--            /*
--             * Stitch together argv[1..] to construct hrSWRunParameters
--             */
--            cp = buf + entry->hrSWRunPath_len+1;
--            while ( 1 ) {
--                while (*cp)
--                    cp++;
--                if ( '\0' == *(cp+1))
--                    break;      /* '\0''\0' => End of command line */
--                *cp = ' ';
--            }
--            entry->hrSWRunParameters_len
--                = sprintf(entry->hrSWRunParameters, "%.*s",
--                          (int)sizeof(entry->hrSWRunParameters) - 1,
--                          buf + entry->hrSWRunPath_len + 1);
--        } else {
--            memcpy(entry->hrSWRunPath, entry->hrSWRunName, entry->hrSWRunName_len);
--            entry->hrSWRunPath_len       = entry->hrSWRunName_len;
--            entry->hrSWRunParameters_len = 0;
-+        /*
-+         *     argv[0]   is hrSWRunPath
-+         */ 
-+        entry->hrSWRunPath_len = snprintf(entry->hrSWRunPath,
-+                                   sizeof(entry->hrSWRunPath)-1, "%s", buf);
-+        /*
-+         * Stitch together argv[1..] to construct hrSWRunParameters
-+         */
-+        cp = buf + entry->hrSWRunPath_len+1;
-+        while ( 1 ) {
-+            while (*cp)
-+                cp++;
-+            if ( '\0' == *(cp+1))
-+                break;      /* '\0''\0' => End of command line */
-+            *cp = ' ';
-         }
-+        entry->hrSWRunParameters_len
-+            = sprintf(entry->hrSWRunParameters, "%.*s",
-+                      (int)sizeof(entry->hrSWRunParameters) - 1,
-+                      buf + entry->hrSWRunPath_len + 1);
-  
-         /*
-          * XXX - No information regarding system processes vs applications
-diff --git a/agent/mibgroup/host/hrSWInstalledTable.c b/agent/mibgroup/host/hrSWInstalledTable.c
-index 71d2a38..ad8aee3 100644
---- a/agent/mibgroup/host/hrSWInstalledTable.c
-+++ b/agent/mibgroup/host/hrSWInstalledTable.c
-@@ -143,6 +143,7 @@ initialize_table_hrSWInstalledTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,"error registering table handler for "
-                  MYTABLE "\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/host/hrSWRunPerfTable.c b/agent/mibgroup/host/hrSWRunPerfTable.c
-index 7a9adfa..43b44d1 100644
---- a/agent/mibgroup/host/hrSWRunPerfTable.c
-+++ b/agent/mibgroup/host/hrSWRunPerfTable.c
-@@ -115,6 +115,7 @@ initialize_table_hrSWRunPerfTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,"error registering table handler for "
-                  MYTABLE "\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/host/hrSWRunTable.c b/agent/mibgroup/host/hrSWRunTable.c
-index 946813e..03ad256 100644
---- a/agent/mibgroup/host/hrSWRunTable.c
-+++ b/agent/mibgroup/host/hrSWRunTable.c
-@@ -128,6 +128,7 @@ initialize_table_hrSWRunTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,"error registering table handler for "
-                  MYTABLE "\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/host/hr_device.c b/agent/mibgroup/host/hr_device.c
-index c2e112c..24031bf 100644
---- a/agent/mibgroup/host/hr_device.c
-+++ b/agent/mibgroup/host/hr_device.c
-@@ -250,8 +250,7 @@ really_try_next:
-     case HRDEV_DESCR:
-         if ((device_descr[type] != NULL) &&
-             (NULL!=(tmp_str=((*device_descr[type])(dev_idx))))) {
--            strncpy(string, tmp_str, sizeof(string)-1);
--            string[ sizeof(string)-1] = 0;
-+            strlcpy(string, tmp_str, sizeof(string));
-         } else
- #if NETSNMP_NO_DUMMY_VALUES
-             goto try_next;
-diff --git a/agent/mibgroup/host/hr_disk.c b/agent/mibgroup/host/hr_disk.c
-index d8f874f..679264b 100644
---- a/agent/mibgroup/host/hr_disk.c
-+++ b/agent/mibgroup/host/hr_disk.c
-@@ -355,7 +355,7 @@ parse_disk_config(const char *token, char *cptr)
-             di_curr->item_details = (void *) 0;
-             name++;
-         } else if (*name == '[') {
--            d_set = (details_set *) malloc(sizeof(details_set));
-+            d_set = (details_set *) calloc(sizeof(details_set), 1);
-             if (!d_set) {
-                 config_perror("Out of memory");
-                 SNMP_FREE(d_new);
-@@ -364,8 +364,6 @@ parse_disk_config(const char *token, char *cptr)
-                 SNMP_FREE(d_str);
-                 return;
-             }
--            for (i = 0; i < sizeof(details_set); i++)
--                (*d_set)[i] = (unsigned char) 0;
-             name++;
-             if (*name == '^' || *name == '!') {
-                 neg = 1;
-@@ -904,16 +902,14 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull)
- 
-     sess_ref = DASessionCreate( NULL );
-     if (NULL == sess_ref) {
--        strncpy(string, devfull, str_len);
--        string[str_len-1] = 0;
-+        strlcpy(string, devfull, str_len);
-         return -1;
-     }
- 
-     disk = DADiskCreateFromBSDName( NULL, sess_ref, devfull );
-     if (NULL == disk) {
-         CFRelease(sess_ref);
--        strncpy(string, devfull, str_len);
--        string[str_len-1] = 0;
-+        strlcpy(string, devfull, str_len);
-         return -1;
-     }
- 
-@@ -924,7 +920,7 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull)
-                  devfull);
-         CFRelease(disk);
-         CFRelease(sess_ref);
--        strncpy(string, devfull, str_len);
-+        strlcpy(string, devfull, str_len);
-         return -1;
-     }
- 
-@@ -932,14 +928,12 @@ Get_HR_Disk_Label(char *string, size_t str_len, const char *devfull)
-     str_ref = (CFStringRef)
-         CFDictionaryGetValue(desc, kDADiskDescriptionMediaNameKey);
-     if (str_ref) {
--        strncpy(string, CFStringGetCStringPtr(str_ref, sys_encoding),
-+        strlcpy(string, CFStringGetCStringPtr(str_ref, sys_encoding),
-                 str_len);
--        string[str_len-1] = 0;
-         DEBUGMSGTL(("verbose:diskmgr:darwin", " name %s\n", string));
-     }
-     else {
--        strncpy(string, devfull, str_len);
--        string[str_len-1] = 0;
-+        strlcpy(string, devfull, str_len);
-     }
-     
-     CFRelease(disk);
-@@ -984,27 +978,21 @@ static void
- Save_HR_Disk_General(void)
- {
- #ifdef DIOC_DESCRIBE
--    strncpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel)-1);
--    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
-+    strlcpy(HRD_savedModel, HRD_info.model_num, sizeof(HRD_savedModel));
- #endif
- #ifdef DKIOCINFO
--    strncpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel)-1);
--    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
-+    strlcpy(HRD_savedModel, HRD_info.dki_dname, sizeof(HRD_savedModel));
- #endif
- #ifdef HAVE_LINUX_HDREG_H
--    strncpy(HRD_savedModel, (const char *) HRD_info.model,
--                    sizeof(HRD_savedModel)-1);
--    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
-+    strlcpy(HRD_savedModel, (const char *) HRD_info.model,
-+            sizeof(HRD_savedModel));
- #endif
- #ifdef DIOCGDINFO
--    strncpy(HRD_savedModel, dktypenames[HRD_info.d_type],
--                    sizeof(HRD_savedModel)-1);
--    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
-+    strlcpy(HRD_savedModel, dktypenames[HRD_info.d_type],
-+            sizeof(HRD_savedModel));
- #endif
- #ifdef darwin
--    strncpy(HRD_savedModel, HRD_model,
--                    sizeof(HRD_savedModel)-1);
--    HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
-+    strlcpy(HRD_savedModel, HRD_model, sizeof(HRD_savedModel));
- #endif
- }
- 
-@@ -1149,9 +1137,8 @@ Query_Disk(int fd, const char *devfull)
-     str_ref = (CFStringRef)
-         CFDictionaryGetValue(desc, kDADiskDescriptionDeviceModelKey);
-     if (str_ref) {
--        strncpy(HRD_model, CFStringGetCStringPtr(str_ref, sys_encoding),
-+        strlcpy(HRD_model, CFStringGetCStringPtr(str_ref, sys_encoding),
-                 sizeof(HRD_model));
--        HRD_savedModel[ sizeof(HRD_savedModel)-1 ] = 0;
-         DEBUGMSGTL(("verbose:diskmgr:darwin", " model %s\n", HRD_model));
-     }
-     else
-diff --git a/agent/mibgroup/host/hr_filesys.c b/agent/mibgroup/host/hr_filesys.c
-index 660e706..b23d322 100644
---- a/agent/mibgroup/host/hr_filesys.c
-+++ b/agent/mibgroup/host/hr_filesys.c
-@@ -361,15 +361,13 @@ var_hrfilesys(struct variable *vp,
-         long_return = fsys_idx;
-         return (u_char *) & long_return;
-     case HRFSYS_MOUNT:
--        snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_mount);
--        string[ sizeof(string)-1 ] = 0;
-+        strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string));
-         *var_len = strlen(string);
-         return (u_char *) string;
-     case HRFSYS_RMOUNT:
--        if (Check_HR_FileSys_NFS()) {
--            snprintf(string, sizeof(string), "%s", HRFS_entry->HRFS_name);
--            string[ sizeof(string)-1 ] = 0;
--        } else
-+        if (Check_HR_FileSys_NFS())
-+            strlcpy(string, HRFS_entry->HRFS_name, sizeof(string));
-+        else
-             string[0] = '\0';
-         *var_len = strlen(string);
-         return (u_char *) string;
-@@ -945,17 +943,14 @@ cook_device(char *dev)
-     static char     cooked_dev[SNMP_MAXPATH+1];
- 
-     if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {
--        strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1);
--        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
--        strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
--                sizeof(cooked_dev)-strlen(cooked_dev)-1);
--        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
-+        strlcpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev));
-+        strlcat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
-+                sizeof(cooked_dev));
-     } else {
--        strncpy(cooked_dev, dev, sizeof(cooked_dev)-1);
--        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
-+        strlcpy(cooked_dev, dev, sizeof(cooked_dev));
-     }
- 
--    return (cooked_dev);
-+    return cooked_dev;
- }
- 
- 
-diff --git a/agent/mibgroup/host/hr_proc.c b/agent/mibgroup/host/hr_proc.c
-index 9d44c7b..6f93079 100644
---- a/agent/mibgroup/host/hr_proc.c
-+++ b/agent/mibgroup/host/hr_proc.c
-@@ -164,6 +164,7 @@ var_hrproc(struct variable * vp,
-            int exact, size_t * var_len, WriteMethod ** write_method)
- {
-     int             proc_idx;
-+    unsigned long long value;
-     netsnmp_cpu_info *cpu;
- 
-     proc_idx =
-@@ -181,9 +182,9 @@ var_hrproc(struct variable * vp,
-            ( cpu->history[0].total_hist == cpu->total_ticks ))
-             return NULL;
- 
--        long_return  = (cpu->idle_ticks  - cpu->history[0].idle_hist)*100;
--        long_return /= (cpu->total_ticks - cpu->history[0].total_hist);
--        long_return  = 100 - long_return;
-+        value = (cpu->idle_ticks  - cpu->history[0].idle_hist)*100;
-+        value /= (cpu->total_ticks - cpu->history[0].total_hist);
-+        long_return = 100 - value;
-         if (long_return < 0)
-             long_return = 0;
-         return (u_char *) & long_return;
-diff --git a/agent/mibgroup/host/hr_storage.c b/agent/mibgroup/host/hr_storage.c
-index 4b8ba8a..264fecc 100644
---- a/agent/mibgroup/host/hr_storage.c
-+++ b/agent/mibgroup/host/hr_storage.c
-@@ -595,8 +595,7 @@ really_try_next:
-         return (u_char *) storage_type_id;
-     case HRSTORE_DESCR:
-         if (store_idx > NETSNMP_MEM_TYPE_MAX) {
--            strncpy(string, HRFS_entry->HRFS_mount, sizeof(string)-1);
--            string[ sizeof(string)-1 ] = 0;
-+            strlcpy(string, HRFS_entry->HRFS_mount, sizeof(string));
-             *var_len = strlen(string);
-             return (u_char *) string;
-         } else {
-diff --git a/agent/mibgroup/host/hr_swinst.c b/agent/mibgroup/host/hr_swinst.c
-index 91c660c..4aa4593 100644
---- a/agent/mibgroup/host/hr_swinst.c
-+++ b/agent/mibgroup/host/hr_swinst.c
-@@ -405,10 +405,8 @@ var_hrswinst(struct variable * vp,
-     case HRSWINST_UPDATE:
-         string[0] = '\0';
- 
--        if (swi->swi_directory != NULL) {
--            strncpy(string, swi->swi_directory, sizeof(string));
--            string[ sizeof(string)-1 ] = 0;
--        }
-+        if (swi->swi_directory != NULL)
-+            strlcpy(string, swi->swi_directory, sizeof(string));
- 
-         if (*string && (stat(string, &stat_buf) != -1)) {
-             if (stat_buf.st_mtime > starttime.tv_sec)
-@@ -436,7 +434,7 @@ var_hrswinst(struct variable * vp,
- #ifdef HAVE_PKGINFO
-             char *pver;
- # endif
--            strncpy(string, swi->swi_name, sizeof(string) - 1);
-+            strlcpy(string, swi->swi_name, sizeof(string));
- 
- /* If we are on a solaris machine, the package names do not include versioning info,
-  * so we must add it manually
-diff --git a/agent/mibgroup/host/hr_swrun.c b/agent/mibgroup/host/hr_swrun.c
-index 9e11f2e..644e7bd 100644
---- a/agent/mibgroup/host/hr_swrun.c
-+++ b/agent/mibgroup/host/hr_swrun.c
-@@ -657,14 +657,12 @@ var_hrswrun(struct variable * vp,
-         return (u_char *) & long_return;
-     case HRSWRUN_NAME:
- #ifdef HAVE_SYS_PSTAT_H
--        snprintf(string, sizeof(string), "%s", proc_buf.pst_cmd);
--        string[ sizeof(string)-1 ] = 0;
-+        strlcpy(string, proc_buf.pst_cmd, sizeof(string));
-         cp = strchr(string, ' ');
-         if (cp != NULL)
-             *cp = '\0';
- #elif defined(dynix)
--        snprintf(string, sizeof(string), "%s", lowpsinfo.pr_fname);
--        string[ sizeof(string)-1 ] = 0;
-+        strlcpy(string, lowpsinfo.pr_fname, sizeof(string));
-         cp = strchr(string, ' ');
-         if (cp != NULL)
-             *cp = '\0';
-@@ -673,19 +671,16 @@ var_hrswrun(struct variable * vp,
-         if (proc_buf) { 
-             char *pos=strchr(proc_buf->pr_psargs,' ');
-             if (pos != NULL) *pos = '\0';
--            strlcpy(string, basename(proc_buf->pr_psargs),sizeof(string));
-+            strlcpy(string, basename(proc_buf->pr_psargs), sizeof(string));
-             if (pos != NULL) *pos=' ';
-         } else {
--            strcpy(string, "<exited>");
-+            strlcpy(string, "<exited>", sizeof(string));
-         }
--        string[ sizeof(string)-1 ] = 0;
- #else
--        strncpy(string, proc_buf->p_user.u_comm, sizeof(string));
--        string[ sizeof(string)-1 ] = 0;
-+        strlcpy(string, proc_buf->p_user.u_comm, sizeof(string));
- #endif
- #elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
--        strncpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
--        string[ sizeof(string)-1 ] = 0;
-+        strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
-         cp = strchr(string, ' ');
-         if (cp != NULL)
-             *cp = '\0';
-@@ -806,8 +801,7 @@ var_hrswrun(struct variable * vp,
-         *cp1 = 0;
- #endif
- #elif defined(aix4) || defined(aix5) || defined(aix6) || defined(aix7)
--        strncpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
--        string[ sizeof(string)-1 ] = 0;
-+        strlcpy(string, proc_table[LowProcIndex].pi_comm, sizeof(string));
-         cp = strchr(string, ' ');
-         if (cp != NULL)
-             *cp = '\0';
-diff --git a/agent/mibgroup/host/hr_system.c b/agent/mibgroup/host/hr_system.c
-index da38c74..9fea4f4 100644
---- a/agent/mibgroup/host/hr_system.c
-+++ b/agent/mibgroup/host/hr_system.c
-@@ -469,9 +469,7 @@ static int set_solaris_eeprom_parameter(const char *key, const char *value,
-     } 
- 
-     
--    sprintf(pbuffer,"eeprom %s=\"",key);
--    strncat(pbuffer,value,var_val_len);
--    strcat(pbuffer,"\"\n");
-+    sprintf(pbuffer, "eeprom %s=\"%.*s\"\n", key, var_val_len, value);
- 
-     status=system(pbuffer);
- 
-diff --git a/agent/mibgroup/host/hrh_filesys.c b/agent/mibgroup/host/hrh_filesys.c
-index fd84bde..4aab6a0 100644
---- a/agent/mibgroup/host/hrh_filesys.c
-+++ b/agent/mibgroup/host/hrh_filesys.c
-@@ -350,13 +350,13 @@ when_dumped(char *filesys, int level, size_t * length)
-                 continue;
- 
-             ++cp2;
--            while (isspace(*cp2))
-+            while (isspace(0xFF & *cp2))
-                 ++cp2;          /* Now find the dump level */
- 
-             if (level == FULL_DUMP) {
-                 if (*(cp2++) != '0')
-                     continue;   /* Not interested in partial dumps */
--                while (isspace(*cp2))
-+                while (isspace(0xFF & *cp2))
-                     ++cp2;
- 
-                 dumpdate = ctime_to_timet(cp2);
-@@ -365,7 +365,7 @@ when_dumped(char *filesys, int level, size_t * length)
-             } else {            /* Partial Dump */
-                 if (*(cp2++) == '0')
-                     continue;   /* Not interested in full dumps */
--                while (isspace(*cp2))
-+                while (isspace(0xFF & *cp2))
-                     ++cp2;
- 
-                 tmp = ctime_to_timet(cp2);
-@@ -390,17 +390,14 @@ cook_device(char *dev)
-     static char     cooked_dev[SNMP_MAXPATH+1];
- 
-     if (!strncmp(dev, RAW_DEVICE_PREFIX, strlen(RAW_DEVICE_PREFIX))) {
--        strncpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev)-1);
--        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
--        strncat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
--                sizeof(cooked_dev)-strlen(cooked_dev)-1);
--        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
-+        strlcpy(cooked_dev, COOKED_DEVICE_PREFIX, sizeof(cooked_dev));
-+        strlcat(cooked_dev, dev + strlen(RAW_DEVICE_PREFIX),
-+                sizeof(cooked_dev));
-     } else {
--        strncpy(cooked_dev, dev, sizeof(cooked_dev)-1);
--        cooked_dev[ sizeof(cooked_dev)-1 ] = 0;
-+        strlcpy(cooked_dev, dev, sizeof(cooked_dev));
-     }
- 
--    return (cooked_dev);
-+    return cooked_dev;
- }
- 
- 
-diff --git a/agent/mibgroup/host/hrh_storage.c b/agent/mibgroup/host/hrh_storage.c
-index 27841a4..ca2f854 100644
---- a/agent/mibgroup/host/hrh_storage.c
-+++ b/agent/mibgroup/host/hrh_storage.c
-@@ -408,8 +408,7 @@ really_try_next:
-         return (u_char *) storage_type_id;
-     case HRSTORE_DESCR:
-         if (store_idx > NETSNMP_MEM_TYPE_MAX) {
--            strncpy(string, HRFS_entry->path, sizeof(string)-1);
--            string[ sizeof(string)-1 ] = 0;
-+            strlcpy(string, HRFS_entry->path, sizeof(string));
-             *var_len = strlen(string);
-             return (u_char *) string;
-         } else {
-diff --git a/agent/mibgroup/if-mib/data_access/interface_ioctl.c b/agent/mibgroup/if-mib/data_access/interface_ioctl.c
-index 66aec99..db2c245 100644
---- a/agent/mibgroup/if-mib/data_access/interface_ioctl.c
-+++ b/agent/mibgroup/if-mib/data_access/interface_ioctl.c
-@@ -70,8 +70,7 @@ _ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name)
-         }
-     }
- 
--    strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
--    ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0;
-+    strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
-     rc = ioctl(fd, which, ifrq);
-     if (rc < 0) {
-         snmp_log(LOG_ERR,"ioctl %d returned %d\n", which, rc);
-@@ -157,6 +156,11 @@ netsnmp_access_interface_ioctl_physaddr_get(int fd,
-                 ifentry->type = IANAIFTYPE_TUNNEL;
-                 break;          /* tunnel */
- #endif
-+#ifdef ARPHRD_INFINIBAND
-+            case ARPHRD_INFINIBAND:
-+                ifentry->type = IANAIFTYPE_INFINIBAND;
-+                break;
-+#endif
- #ifdef ARPHRD_SLIP
-             case ARPHRD_SLIP:
-             case ARPHRD_CSLIP:
-@@ -323,8 +327,7 @@ netsnmp_access_interface_ioctl_flags_set(int fd,
-         }
-     }
- 
--    strncpy(ifrq.ifr_name, ifentry->name, sizeof(ifrq.ifr_name));
--    ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+    strlcpy(ifrq.ifr_name, ifentry->name, sizeof(ifrq.ifr_name));
-     rc = ioctl(fd, SIOCGIFFLAGS, &ifrq);
-     if(rc < 0) {
-         snmp_log(LOG_ERR,"error getting flags\n");
-diff --git a/agent/mibgroup/if-mib/data_access/interface_linux.c b/agent/mibgroup/if-mib/data_access/interface_linux.c
-index 9810b15..e291b9f 100644
---- a/agent/mibgroup/if-mib/data_access/interface_linux.c
-+++ b/agent/mibgroup/if-mib/data_access/interface_linux.c
-@@ -589,6 +589,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
-     fd = socket(AF_INET, SOCK_DGRAM, 0);
-     if(fd < 0) {
-         snmp_log(LOG_ERR, "could not create socket\n");
-+        fclose(devin);
-         return -2;
-     }
- 
-@@ -727,6 +728,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
-                 {IANAIFTYPE_ISO88025TOKENRING, "tr"},
-                 {IANAIFTYPE_FASTETHER, "feth"},
-                 {IANAIFTYPE_GIGABITETHERNET,"gig"},
-+                {IANAIFTYPE_INFINIBAND,"ib"},
-                 {IANAIFTYPE_PPP, "ppp"},
-                 {IANAIFTYPE_SLIP, "sl"},
-                 {IANAIFTYPE_TUNNEL, "sit"},
-@@ -891,40 +893,38 @@ unsigned long long
- netsnmp_linux_interface_get_if_speed(int fd, const char *name,
-             unsigned long long defaultspeed)
- {
-+    int ret;
-     struct ifreq ifr;
-     struct ethtool_cmd edata;
-+    uint16_t speed_hi;
-+    uint32_t speed;
- 
-     memset(&ifr, 0, sizeof(ifr));
-+    memset(&edata, 0, sizeof(edata));
-     edata.cmd = ETHTOOL_GSET;
--    edata.speed = 0;
-     
--    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name)-1);
-+    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-     ifr.ifr_data = (char *) &edata;
-     
--    if (ioctl(fd, SIOCETHTOOL, &ifr) == -1) {
--        DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s failed\n",
--                    ifr.ifr_name));
--        return netsnmp_linux_interface_get_if_speed_mii(fd,name,defaultspeed);
--    }
--    
--    if (edata.speed != SPEED_10 && edata.speed != SPEED_100
--#ifdef SPEED_10000
--        && edata.speed != SPEED_10000
--#endif
--#ifdef SPEED_2500
--        && edata.speed != SPEED_2500
--#endif
--        && edata.speed != SPEED_1000 ) {
--        DEBUGMSGTL(("mibII/interfaces", "fallback to mii for %s\n",
--                    ifr.ifr_name));
--        /* try MII */
-+    ret = ioctl(fd, SIOCETHTOOL, &ifr);
-+    if (ret == -1 || edata.speed == 0) {
-+        DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s failed (%d / %d)\n",
-+                    ifr.ifr_name, ret, edata.speed));
-         return netsnmp_linux_interface_get_if_speed_mii(fd,name,defaultspeed);
-     }
- 
-+#ifdef HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI
-+    speed_hi = edata.speed_hi;
-+#else
-+    speed_hi = 0;
-+#endif
-+    speed = speed_hi << 16 | edata.speed;
-+    if (speed == 0xffff || speed == 0xffffffffUL /*SPEED_UNKNOWN*/)
-+        speed = defaultspeed;
-     /* return in bps */
--    DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s speed = %d\n",
--                ifr.ifr_name, edata.speed));
--    return edata.speed*1000LL*1000LL;
-+    DEBUGMSGTL(("mibII/interfaces", "ETHTOOL_GSET on %s speed = %#x -> %d\n",
-+                ifr.ifr_name, speed_hi << 16 | edata.speed, speed));
-+    return speed * 1000LL * 1000LL;
- }
- #endif
-  
-@@ -954,8 +954,7 @@ netsnmp_linux_interface_get_if_speed(int fd, const char *name,
-     const unsigned long long media_speeds[] = {10000000, 10000000, 100000000, 100000000, 10000000, 0};
-     /* It corresponds to "10baseT", "10baseT-FD", "100baseTx", "100baseTx-FD", "100baseT4", "Flow-control", 0, */
- 
--    strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
--    ifr.ifr_name[ sizeof(ifr.ifr_name)-1 ] = 0;
-+    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
-     data[0] = 0;
-     
-     /*
-@@ -1042,6 +1041,10 @@ int netsnmp_prefix_listen()
-     unsigned           groups = 0;
- 
-     int fd = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_ROUTE);
-+    if (fd < 0) {
-+        snmp_log(LOG_ERR, "netsnmp_prefix_listen: Cannot create socket.\n");
-+        return -1;
-+    }
- 
-     memset(&localaddrinfo, 0, sizeof(struct sockaddr_nl));
- 
-@@ -1052,6 +1055,7 @@ int netsnmp_prefix_listen()
- 
-     if (bind(fd, (struct sockaddr*)&localaddrinfo, sizeof(localaddrinfo)) < 0) {
-         snmp_log(LOG_ERR,"netsnmp_prefix_listen: Bind failed.\n");
-+        close(fd);
-         return -1;
-     }
- 
-@@ -1066,11 +1070,13 @@ int netsnmp_prefix_listen()
-     status = send(fd, &req, req.n.nlmsg_len, 0);
-     if (status < 0) {
-         snmp_log(LOG_ERR,"netsnmp_prefix_listen: send failed\n");
-+        close(fd);
-         return -1;
-     }
- 
-     if (register_readfd(fd, netsnmp_prefix_process, NULL) != 0) {
-         snmp_log(LOG_ERR,"netsnmp_prefix_listen: error registering netlink socket\n");
-+        close(fd);
-         return -1;
-     }
-     return 0;
-diff --git a/agent/mibgroup/if-mib/data_access/interface_openbsd.c b/agent/mibgroup/if-mib/data_access/interface_openbsd.c
-index 552043a..8340dc6 100644
---- a/agent/mibgroup/if-mib/data_access/interface_openbsd.c
-+++ b/agent/mibgroup/if-mib/data_access/interface_openbsd.c
-@@ -343,12 +343,10 @@ netsnmp_openbsd_interface_get_if_speed(char *name, u_int *speed, u_int *speed_hi
-         return 0;
-     }
- 
--    (void) memset(&ifmr, 0, sizeof(ifmr));
--    (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
--
--    if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 ||
--        ifmr.ifm_count == 0) {
-+    memset(&ifmr, 0, sizeof(ifmr));
-+    strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
- 
-+    if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 || ifmr.ifm_count == 0) {
-         close(s);
-         return 0;
-     }
-diff --git a/agent/mibgroup/if-mib/data_access/interface_sysctl.c b/agent/mibgroup/if-mib/data_access/interface_sysctl.c
-index 0669ffc..81efbef 100644
---- a/agent/mibgroup/if-mib/data_access/interface_sysctl.c
-+++ b/agent/mibgroup/if-mib/data_access/interface_sysctl.c
-@@ -252,8 +252,8 @@ netsnmp_sysctl_get_if_speed(char *name, u_int *speed,
-         return 0;
-     }
- 
--    (void) memset(&ifmr, 0, sizeof(ifmr));
--    (void) strncpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
-+    memset(&ifmr, 0, sizeof(ifmr));
-+    strlcpy(ifmr.ifm_name, name, sizeof(ifmr.ifm_name));
- 
-     DEBUGMSGTL(("access:interface:container:sysctl"," speed in\n"));
-     if (ioctl(s, SIOCGIFMEDIA, (caddr_t)&ifmr) < 0 ||
-@@ -326,6 +326,11 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
-     int amask;
-     char *if_name;
-     int flags;
-+#ifdef HAVE_STRUCT_IFNET_IF_LASTCHANGE_TV_NSEC
-+    struct timespec startspec;
-+
-+    TIMEVAL_TO_TIMESPEC(&starttime, &startspec);
-+#endif
- 
-     DEBUGMSGTL(("access:interface:container:sysctl",
-                 "load (flags %u)\n", load_flags));
-@@ -477,7 +482,11 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
-                             NETSNMP_INTERFACE_FLAGS_HAS_DROPS |
-                             NETSNMP_INTERFACE_FLAGS_HAS_MCAST_PKTS;
- 
-+#ifdef HAVE_STRUCT_IFNET_IF_LASTCHANGE_TV_NSEC
-+        if (timespeccmp(&ifp->ifm_data.ifi_lastchange, &startspec, >)) {
-+#else
-         if (timercmp(&ifp->ifm_data.ifi_lastchange, &starttime, >)) {
-+#endif
-             entry->lastchange = (ifp->ifm_data.ifi_lastchange.tv_sec -
-                                  starttime.tv_sec) * 100;
-             entry->ns_flags |= NETSNMP_INTERFACE_FLAGS_HAS_LASTCHANGE;
-@@ -502,7 +511,7 @@ netsnmp_arch_interface_container_load(netsnmp_container* container,
- 
-         CONTAINER_INSERT(container, entry);
-         DEBUGMSGTL(("access:interface:container:sysctl",
--                    "created entry %d for %s\n", entry->index, entry->name));
-+                    "created entry %d for %s\n", (int)entry->index, entry->name));
-     } /* for (each interface entry) */
- 
-     /* pass 2: walk addresses */
-diff --git a/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c b/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c
-index e82c2fd..6434b46 100644
---- a/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c
-+++ b/agent/mibgroup/if-mib/ifXTable/ifXTable_interface.c
-@@ -2021,7 +2021,7 @@ _ifXTable_container_row_restore(const char *token, char *buf)
-     }
-     rowreq_ctx = (ifXTable_rowreq_ctx*)CONTAINER_FIND(container, &index);
-     if (NULL == rowreq_ctx) {
--        snmp_log(LOG_ERR, "error finding row index in "
-+        snmp_log(LOG_DEBUG, "error finding row index in "
-                  "_ifXTable_container_row_restore\n");
-         return;
-     }
-diff --git a/agent/mibgroup/ip-forward-mib/data_access/route_linux.c b/agent/mibgroup/ip-forward-mib/data_access/route_linux.c
-index d620834..926ccb7 100644
---- a/agent/mibgroup/ip-forward-mib/data_access/route_linux.c
-+++ b/agent/mibgroup/ip-forward-mib/data_access/route_linux.c
-@@ -103,8 +103,7 @@ _load_ipv4(netsnmp_container* container, u_long *index )
-         /*
-          * temporary null terminated name
-          */
--        strncpy(name, rtent_name, sizeof(name));
--        name[ sizeof(name)-1 ] = 0;
-+        strlcpy(name, rtent_name, sizeof(name));
- 
-         /*
-          * don't bother to try and get the ifindex for routes with
-diff --git a/agent/mibgroup/ip-mib/data_access/arp_netlink.c b/agent/mibgroup/ip-mib/data_access/arp_netlink.c
-index 01a535a..2059c23 100644
---- a/agent/mibgroup/ip-mib/data_access/arp_netlink.c
-+++ b/agent/mibgroup/ip-mib/data_access/arp_netlink.c
-@@ -43,7 +43,7 @@ netsnmp_access_arp_create(u_int init_flags,
-     if (cache_timeout != NULL)
-         *cache_timeout = 5;
-     if (cache_flags != NULL)
--        *cache_flags |= NETSNMP_CACHE_RESET_TIMER_ON_USE;
-+        *cache_flags |= NETSNMP_CACHE_RESET_TIMER_ON_USE | NETSNMP_CACHE_DONT_FREE_BEFORE_LOAD;
-     access->cache_expired = cache_expired;
- 
-     DEBUGMSGTL(("access:netlink:arp", "create arp cache\n"));
-@@ -131,6 +131,7 @@ int netsnmp_access_arp_unload(netsnmp_arp_access *access)
-          unregister_readfd(fd);
-          close(fd);
-          access->arch_magic = NULL;
-+	 access->synchronized = 0;
-     }
-     return 0;
- }
-diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c b/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c
-index b4f7e3a..ba145cb 100644
---- a/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c
-+++ b/agent/mibgroup/ip-mib/data_access/ipaddress_ioctl.c
-@@ -230,7 +230,7 @@ _netsnmp_ioctl_ipaddress_container_load_v4(netsnmp_container *container,
-         /* restore the interface name if we modifed it due to unaliasing
-          * above
-          */
--        if (entry->flags | NETSNMP_ACCESS_IPADDRESS_ISALIAS) {
-+        if (entry->flags & NETSNMP_ACCESS_IPADDRESS_ISALIAS) {
-             memcpy(ifrp->ifr_name, extras->name, sizeof(extras->name));
-         }
- 
-@@ -242,7 +242,7 @@ _netsnmp_ioctl_ipaddress_container_load_v4(netsnmp_container *container,
-         addr_info = netsnmp_access_other_info_get(entry->if_index, AF_INET);
-         if(addr_info.bcastflg) {
-            bcastentry = netsnmp_access_ipaddress_entry_create();
--           if(NULL == entry) {
-+           if(NULL == bcastentry) {
-               rc = -3;
-               break;
-            }
-@@ -491,11 +491,10 @@ _netsnmp_ioctl_ipaddress_set_v4(netsnmp_ipaddress_entry * entry)
-         alias_idx = _next_alias(name);
-         snprintf(ifrq.ifr_name,sizeof(ifrq.ifr_name), "%s:%d",
-                  name, alias_idx);
-+        ifrq.ifr_name[sizeof(ifrq.ifr_name) - 1] = 0;
-     }
-     else
--        strncpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
--
--    ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
- 
-     sin = (struct sockaddr_in*)&ifrq.ifr_addr;
-     sin->sin_family = AF_INET;
-@@ -543,8 +542,7 @@ _netsnmp_ioctl_ipaddress_delete_v4(netsnmp_ipaddress_entry * entry)
- 
-     memset(&ifrq, 0, sizeof(ifrq));
- 
--    strncpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
--    ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+    strlcpy(ifrq.ifr_name, (char *) extras->name, sizeof(ifrq.ifr_name));
- 
-     ifrq.ifr_flags = 0;
- 
-diff --git a/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c b/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c
-index 1a7d169..e2485e3 100644
---- a/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c
-+++ b/agent/mibgroup/ip-mib/data_access/ipaddress_solaris2.c
-@@ -191,7 +191,7 @@ _load_v4(netsnmp_container *container, int idx_offset)
- 
-         entry->ns_ia_index = ++idx_offset;
- 
--        DEBUGMSGTL(("access:ipaddress:container", "insert if %d, addrlen %d\n", 
-+        DEBUGMSGTL(("access:ipaddress:container", "insert if %" NETSNMP_PRIo "u, addrlen %d\n", 
-                     entry->if_index, entry->ia_address_len));
- 
-         if (CONTAINER_INSERT(container, entry) < 0) {
-@@ -276,7 +276,7 @@ _load_v6(netsnmp_container *container, int idx_offset)
- 
-         entry->ns_ia_index = ++idx_offset;
-         
--        DEBUGMSGTL(("access:ipaddress:container", "insert if %d, addrlen %d\n", 
-+        DEBUGMSGTL(("access:ipaddress:container", "insert if %" NETSNMP_PRIo "u, addrlen %d\n", 
-                     entry->if_index, entry->ia_address_len));
- 
-         if (CONTAINER_INSERT(container, entry) < 0) {
-diff --git a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
-index 61a4855..717fc17 100644
---- a/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
-+++ b/agent/mibgroup/ip-mib/data_access/systemstats_linux.c
-@@ -356,7 +356,6 @@ _systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin)
-     char            line[1024];
-     char           *stats, *start = line;
-     int             len, rc;
--    int             scan_count;
-     uintmax_t       scan_val;
- 
-     /*
-@@ -516,8 +515,6 @@ _systemstats_v6_load_file(netsnmp_systemstats_entry *entry, FILE *devin)
-         
-         if (rc)
-             DEBUGMSGTL(("access:systemstats", "unknown stat %s\n", line));
--        else
--            ++scan_count;
-     }
-     /*
-      * Let DiscontinuityTime and RefreshRate active
-diff --git a/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c b/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c
-index dd39b07..4437829 100644
---- a/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c
-+++ b/agent/mibgroup/ip-mib/ipAddressPrefixTable/ipAddressPrefixTable_data_access.c
-@@ -287,6 +287,7 @@ ipAddressPrefixTable_container_load(netsnmp_container *container)
-                      "error setting index while loading "
-                      "ipAddressPrefixTable data.\n");
-             ipAddressPrefixTable_release_rowreq_ctx(rowreq_ctx);
-+            rowreq_ctx = NULL;
-             continue;
-         }
- 
-diff --git a/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c b/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c
-index 84a98ff..c9e14ff 100644
---- a/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c
-+++ b/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_data_access.c
-@@ -138,7 +138,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
-              * yes.
-              */
-             DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates",
--                        "inserted row for %d\n", entry->index));
-+                        "inserted row for %" NETSNMP_PRIo "d\n", entry->index));
-             CONTAINER_INSERT(c, ift_rrc);
-             changed = 1;
-         }
-@@ -152,7 +152,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
-              * no
-              */
-             DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates",
--                        "removed  row for %d\n",
-+                        "removed  row for %" NETSNMP_PRIo "d\n",
-                         ift_rrc->data.ifentry->index));
-             CONTAINER_REMOVE(c, ift_rrc);
-             changed = 1;
-@@ -164,7 +164,7 @@ ipv4InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
-                  ift_rrc->data.ifentry->retransmit_v4) ||
-                 (entry->reasm_max_v4 != ift_rrc->data.ifentry->reasm_max_v4)) {
-                 DEBUGMSGTL(("ipv4InterfaceTable:check_entry_for_updates",
--                            "row changed for %d\n",
-+                            "row changed for %" NETSNMP_PRIo "d\n",
-                             ift_rrc->data.ifentry->index));
-                 changed = 1;
-             }
-diff --git a/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c b/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c
-index ef7d533..33c65a9 100644
---- a/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c
-+++ b/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_data_access.c
-@@ -138,7 +138,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
-              * yes.
-              */
-             DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates",
--                        "inserted row for index %d\n", entry->index));
-+                        "inserted row for index %" NETSNMP_PRIo "d\n", entry->index));
-             CONTAINER_INSERT(c, ift_rrc);
-             changed = 1;
-         }
-@@ -152,7 +152,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
-              * no
-              */
-             DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates",
--                        "removed  row for index %d\n",
-+                        "removed  row for index %" NETSNMP_PRIo "d\n",
-                         ift_rrc->data.ifentry->index));
-             CONTAINER_REMOVE(c, ift_rrc);
-             changed = 1;
-@@ -190,7 +190,7 @@ ipv6InterfaceTable_check_entry_for_updates(const ifTable_rowreq_ctx *
-                     && (entry->forwarding_v6 !=
-                         ift_rrc->data.ifentry->forwarding_v6))) {
-                 DEBUGMSGTL(("ipv6InterfaceTable:check_entry_for_updates",
--                            "row changed for index %d\n",
-+                            "row changed for index %" NETSNMP_PRIo "d\n",
-                             ift_rrc->data.ifentry->index));
-                 changed = 1;
-             }
-diff --git a/agent/mibgroup/kernel_sunos5.c b/agent/mibgroup/kernel_sunos5.c
-index 984fc77..9ee0284 100644
---- a/agent/mibgroup/kernel_sunos5.c
-+++ b/agent/mibgroup/kernel_sunos5.c
-@@ -469,8 +469,7 @@ getKstat(const char *statname, const char *varname, void *value)
- 	    case KSTAT_DATA_CHAR:
- 		DEBUGMSGTL(("kernel_sunos5", "value: %s\n", d->value.c));
- 		*(char **)v = buf;
--		buf[sizeof(buf)-1] = 0;
--		strncpy(buf, d->value.c, sizeof(buf)-1);
-+		strlcpy(buf, d->value.c, sizeof(buf));
- 		break;
- #ifdef KSTAT_DATA_INT32         /* Solaris 2.6 and up */
- 	    case KSTAT_DATA_INT32:
-@@ -623,8 +622,7 @@ getKstatString(const char *statname, const char *varname,
-         if (strcmp(d->name, varname) == 0) {
-             switch (d->data_type) {
-             case KSTAT_DATA_CHAR:
--                value[value_len-1] = '\0';
--                strncpy(value, d->value.c, value_len-1); 
-+                strlcpy(value, d->value.c, value_len);
-                 DEBUGMSGTL(("kernel_sunos5", "value: %s\n", d->value.c));
-                 break;
-             default:
-diff --git a/agent/mibgroup/mibII/icmp.c b/agent/mibgroup/mibII/icmp.c
-index 977effa..429fa0b 100644
---- a/agent/mibgroup/mibII/icmp.c
-+++ b/agent/mibgroup/mibII/icmp.c
-@@ -456,9 +456,11 @@ icmp_msg_stats_first_entry(void **loop_context,
- void
- init_icmp(void)
- {
--    netsnmp_handler_registration *reginfo;
-+    netsnmp_handler_registration *scalar_reginfo = NULL;
-+    int rc;
- #ifdef linux
--    netsnmp_handler_registration *msg_stats_reginfo;
-+    netsnmp_handler_registration *msg_stats_reginfo = NULL;
-+    netsnmp_handler_registration *table_reginfo = NULL;
-     netsnmp_iterator_info *iinfo;
-     netsnmp_iterator_info *msg_stats_iinfo;
-     netsnmp_table_registration_info *table_info;
-@@ -469,15 +471,17 @@ init_icmp(void)
-      * register ourselves with the agent as a group of scalars...
-      */
-     DEBUGMSGTL(("mibII/icmp", "Initialising ICMP group\n"));
--    reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
-+    scalar_reginfo = netsnmp_create_handler_registration("icmp", icmp_handler,
- 		    icmp_oid, OID_LENGTH(icmp_oid), HANDLER_CAN_RONLY);
--    netsnmp_register_scalar_group(reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
-+    rc = netsnmp_register_scalar_group(scalar_reginfo, ICMPINMSGS, ICMPOUTADDRMASKREPS);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
-     /*
-      * .... with a local cache
-      *    (except for HP-UX 11, which extracts objects individually)
-      */
- #ifndef hpux11
--    netsnmp_inject_handler( reginfo,
-+    netsnmp_inject_handler( scalar_reginfo,
- 		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
- 			   		icmp_load, icmp_free,
- 					icmp_oid, OID_LENGTH(icmp_oid)));
-@@ -485,63 +489,64 @@ init_icmp(void)
- #ifdef linux
- 
-     /* register icmpStatsTable */
--    reginfo = netsnmp_create_handler_registration("icmpStatsTable",
--		icmp_stats_table_handler, icmp_stats_tbl_oid,
--		OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY);
--
-     table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
--    if (!table_info) {
--        return;
--    }
--
-+    if (!table_info)
-+        goto bail;
-     netsnmp_table_helper_add_indexes(table_info, ASN_INTEGER, 0);
-     table_info->min_column = ICMP_STAT_INMSG;
-     table_info->max_column = ICMP_STAT_OUTERR;
- 
- 
-     iinfo      = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
--    if (!iinfo) {
--        return;
--    }
-+    if (!iinfo)
-+        goto bail;
-     iinfo->get_first_data_point = icmp_stats_first_entry;
-     iinfo->get_next_data_point  = icmp_stats_next_entry;
-     iinfo->table_reginfo        = table_info;
- 
--    netsnmp_register_table_iterator2(reginfo, iinfo);
--
--    /* register icmpMsgStatsTable */
--    msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
--            icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
--            OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY);
-+    table_reginfo = netsnmp_create_handler_registration("icmpStatsTable",
-+		icmp_stats_table_handler, icmp_stats_tbl_oid,
-+		OID_LENGTH(icmp_stats_tbl_oid), HANDLER_CAN_RONLY);
- 
--    msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
--    if (!msg_stats_table_info) {
--        return;
-+    rc = netsnmp_register_table_iterator2(table_reginfo, iinfo);
-+    if (rc != SNMPERR_SUCCESS) {
-+        table_reginfo = NULL;
-+        goto bail;
-     }
-+    netsnmp_inject_handler( table_reginfo,
-+		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
-+			   		icmp_load, icmp_free,
-+					icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
- 
-+    /* register icmpMsgStatsTable */
-+    msg_stats_table_info = SNMP_MALLOC_TYPEDEF(netsnmp_table_registration_info);
-+    if (!msg_stats_table_info)
-+        goto bail;
-     netsnmp_table_helper_add_indexes(msg_stats_table_info, ASN_INTEGER, ASN_INTEGER, 0);
-     msg_stats_table_info->min_column = ICMP_MSG_STAT_IN_PKTS;
-     msg_stats_table_info->max_column = ICMP_MSG_STAT_OUT_PKTS;
- 
-     msg_stats_iinfo = SNMP_MALLOC_TYPEDEF(netsnmp_iterator_info);
--    if (!msg_stats_iinfo) {
--        return;
--    }
-+    if (!msg_stats_iinfo)
-+        goto bail;
-     msg_stats_iinfo->get_first_data_point = icmp_msg_stats_first_entry;
-     msg_stats_iinfo->get_next_data_point  = icmp_msg_stats_next_entry;
-     msg_stats_iinfo->table_reginfo        = msg_stats_table_info;
- 
--    netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
-+    msg_stats_reginfo = netsnmp_create_handler_registration("icmpMsgStatsTable",
-+            icmp_msg_stats_table_handler, icmp_msg_stats_tbl_oid,
-+            OID_LENGTH(icmp_msg_stats_tbl_oid), HANDLER_CAN_RONLY);
-+
-+    rc = netsnmp_register_table_iterator2(msg_stats_reginfo, msg_stats_iinfo);
-+    if (rc != SNMPERR_SUCCESS) {
-+        msg_stats_reginfo = NULL;
-+        goto bail;
-+    }
-+
-     netsnmp_inject_handler( msg_stats_reginfo,
-             netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
-                 icmp_load, icmp_free,
-                 icmp_msg_stats_tbl_oid, OID_LENGTH(icmp_msg_stats_tbl_oid)));
--#ifndef hpux11
--    netsnmp_inject_handler( reginfo,
--		    netsnmp_get_cache_handler(ICMP_STATS_CACHE_TIMEOUT,
--			   		icmp_load, icmp_free,
--					icmp_stats_tbl_oid, OID_LENGTH(icmp_stats_tbl_oid)));
--#endif /* ! hpux11 */
- #endif /* linux */
- 
- #ifdef USING_MIBII_IP_MODULE
-@@ -558,6 +563,17 @@ init_icmp(void)
-     init_kernel_sunos5();
- #endif
- #endif
-+    return;
-+
-+#ifdef linux
-+bail:
-+    if (scalar_reginfo)
-+        netsnmp_unregister_handler(scalar_reginfo);
-+    if (table_reginfo)
-+        netsnmp_unregister_handler(table_reginfo);
-+    if (msg_stats_reginfo)
-+        netsnmp_unregister_handler(msg_stats_reginfo);
-+#endif
- }
- 
- 
-diff --git a/agent/mibgroup/mibII/interfaces.c b/agent/mibgroup/mibII/interfaces.c
-index 08c2a85..41d7287 100644
---- a/agent/mibgroup/mibII/interfaces.c
-+++ b/agent/mibgroup/mibII/interfaces.c
-@@ -463,10 +463,8 @@ Interface_Scan_By_Index(int iindex,
-                     a = get_address(ifp + 1, ifp->ifm_addrs, RTA_IFP);
-                     if (a == NULL)
-                         return 0;
--                    strncpy(if_name,
--                            ((const struct sockaddr_in *) a)->sin_zero,
--                            ((const u_char *) a)[5]);
--                    if_name[((const u_char *) a)[5]] = 0;
-+                    sprintf(if_name, "%.*s", ((const u_char *) a)[5],
-+                            ((const struct sockaddr_in *) a)->sin_zero);
-                     *if_msg = *ifp;
-                     ++have_ifinfo;
-                 }
-@@ -1603,8 +1601,7 @@ Interface_Scan_Init(void)
-         }
- 
-         *stats   = 0;
--        strncpy(ifname_buf, ifstart, sizeof(ifname_buf));
--        ifname_buf[ sizeof(ifname_buf)-1 ] = 0;
-+        strlcpy(ifname_buf, ifstart, sizeof(ifname_buf));
-         *stats++ = ':';
-         while (*stats == ' ')
-             stats++;
-@@ -1671,31 +1668,27 @@ Interface_Scan_Init(void)
-         nnew->if_unit = strdup(*ptr ? ptr : "");
-         *ptr = 0;
- 
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         if (ioctl(fd, SIOCGIFADDR, &ifrq) < 0)
-             memset((char *) &nnew->if_addr, 0, sizeof(nnew->if_addr));
-         else
-             nnew->if_addr = ifrq.ifr_addr;
- 
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         if (ioctl(fd, SIOCGIFBRDADDR, &ifrq) < 0)
-             memset((char *) &nnew->ifu_broadaddr, 0,
-                    sizeof(nnew->ifu_broadaddr));
-         else
-             nnew->ifu_broadaddr = ifrq.ifr_broadaddr;
- 
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         if (ioctl(fd, SIOCGIFNETMASK, &ifrq) < 0)
-             memset((char *) &nnew->ia_subnetmask, 0,
-                    sizeof(nnew->ia_subnetmask));
-         else
-             nnew->ia_subnetmask = ifrq.ifr_netmask;
- 
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         nnew->if_flags = ioctl(fd, SIOCGIFFLAGS, &ifrq) < 0
-             ? 0 : ifrq.ifr_flags;
- 
-@@ -1707,8 +1700,7 @@ Interface_Scan_Init(void)
-          * 4 bytes of sa_data.
-          */
-         memset(ifrq.ifr_hwaddr.sa_data, (0), IFHWADDRLEN);
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         if (ioctl(fd, SIOCGIFHWADDR, &ifrq) < 0)
-             memset(nnew->if_hwaddr, (0), IFHWADDRLEN);
-         else {
-@@ -1765,14 +1757,12 @@ Interface_Scan_Init(void)
- #endif
-         }
- 
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         nnew->if_metric = ioctl(fd, SIOCGIFMETRIC, &ifrq) < 0
-             ? 0 : ifrq.ifr_metric;
- 
- #ifdef SIOCGIFMTU
--        strncpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
--        ifrq.ifr_name[ sizeof(ifrq.ifr_name)-1 ] = 0;
-+        strlcpy(ifrq.ifr_name, ifname, sizeof(ifrq.ifr_name));
-         nnew->if_mtu = (ioctl(fd, SIOCGIFMTU, &ifrq) < 0)
-             ? 0 : ifrq.ifr_mtu;
- #else
-@@ -1882,14 +1872,13 @@ Interface_Scan_Next(short *Index,
-         }
- #else
-         ifnet = *ifnetaddr;
--        strncpy(saveName, ifnet.if_name, sizeof(saveName));
-+        strlcpy(saveName, ifnet.if_name, sizeof(saveName));
- #endif
- 
-         saveName[sizeof(saveName) - 1] = '\0';
-         cp = (char *) strchr(saveName, '\0');
- #ifdef linux
--        strncat(cp, ifnet.if_unit, sizeof(saveName)-strlen(saveName)-1);
--        saveName[sizeof(saveName) - 1] = '\0';
-+        strlcat(saveName, ifnet.if_unit, sizeof(saveName));
- #else
- #ifdef NETSNMP_FEATURE_CHECKIN
-         /* this exists here just so we don't copy ifdef logic elsewhere */
-@@ -2000,7 +1989,7 @@ Interface_Scan_Next(short *Index,
-         }
- #if HAVE_STRUCT_IFNET_IF_XNAME
- #if defined(netbsd1) || defined(openbsd2)
--        strncpy(saveName, ifnet.if_xname, sizeof saveName);
-+        strlcpy(saveName, ifnet.if_xname, sizeof(saveName));
- #else
-         if (!NETSNMP_KLOOKUP(ifnet.if_xname, (char *) saveName, sizeof saveName)) {
-             DEBUGMSGTL(("mibII/interfaces:Interface_Scan_Next", "klookup failed\n"));
-diff --git a/agent/mibgroup/mibII/ip.c b/agent/mibgroup/mibII/ip.c
-index 56de408..40b5d2f 100644
---- a/agent/mibgroup/mibII/ip.c
-+++ b/agent/mibgroup/mibII/ip.c
-@@ -151,6 +151,7 @@ void
- init_ip(void)
- {
-     netsnmp_handler_registration *reginfo;
-+    int rc;
- 
-     /*
-      * register ourselves with the agent as a group of scalars...
-@@ -158,7 +159,9 @@ init_ip(void)
-     DEBUGMSGTL(("mibII/ip", "Initialising IP group\n"));
-     reginfo = netsnmp_create_handler_registration("ip", ip_handler,
-                             ip_oid, OID_LENGTH(ip_oid), HANDLER_CAN_RONLY);
--    netsnmp_register_scalar_group(reginfo, IPFORWARDING, IPROUTEDISCARDS);
-+    rc = netsnmp_register_scalar_group(reginfo, IPFORWARDING, IPROUTEDISCARDS);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
- 
-     /*
-      * .... with a local cache
-diff --git a/agent/mibgroup/mibII/ipv6.c b/agent/mibgroup/mibII/ipv6.c
-index a372ca4..5714647 100644
---- a/agent/mibgroup/mibII/ipv6.c
-+++ b/agent/mibgroup/mibII/ipv6.c
-@@ -817,8 +817,7 @@ var_ifv6Entry(register struct variable * vp,
- 
-             memset(&ifr, 0, sizeof(ifr));
-             ifr.ifr_addr.sa_family = AF_INET6;
--            strncpy(ifr.ifr_name, if_getname(interface),
--                    sizeof(ifr.ifr_name) - 1);
-+            strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));
-             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-                 break;
-             if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) {
-@@ -1019,8 +1018,7 @@ var_ifv6Entry(register struct variable * vp,
-             int             s;
- 
-             memset(&ifr, 0, sizeof(ifr));
--            strncpy(ifr.ifr_name, if_getname(interface),
--                    sizeof(ifr.ifr_name) - 1);
-+            strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));
-             if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
-                 break;
-             if (ioctl(s, SIOCGIFSTAT_IN6, (caddr_t) & ifr) < 0) {
-@@ -1176,8 +1174,7 @@ var_icmpv6Entry(register struct variable * vp,
-             int             s;
- 
-             memset(&ifr, 0, sizeof(ifr));
--            strncpy(ifr.ifr_name, if_getname(interface),
--                    sizeof(ifr.ifr_name) - 1);
-+            strlcpy(ifr.ifr_name, if_getname(interface), sizeof(ifr.ifr_name));
-             if ((s = socket(AF_INET6, SOCK_DGRAM, 0)) < 0)
-                 break;
-             if (ioctl(s, SIOCGIFSTAT_ICMP6, (caddr_t) & ifr) < 0) {
-@@ -2101,7 +2098,7 @@ var_ifv6Entry(register struct variable * vp,
-                 break;
-             memset(&ifr, 0, sizeof(ifr));
-             ifr.ifr_addr.sa_family = AF_INET6;
--            strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1);
-+            strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name));
-             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-                 break;
-             if (ioctl(s, SIOCGIFMTU, (caddr_t) & ifr) < 0) {
-@@ -2121,7 +2118,7 @@ var_ifv6Entry(register struct variable * vp,
-                 break;
-             memset(&ifr, 0, sizeof(ifr));
-             ifr.ifr_addr.sa_family = AF_INET6;
--            strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1);
-+            strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name));
-             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-                 break;
-             if (ioctl(s, SIOCGIFHWADDR, &ifr) < 0) {
-@@ -2150,7 +2147,7 @@ var_ifv6Entry(register struct variable * vp,
-                 break;
-             memset(&ifr, 0, sizeof(ifr));
-             ifr.ifr_addr.sa_family = AF_INET6;
--            strncpy(ifr.ifr_name, p, sizeof(ifr.ifr_name) - 1);
-+            strlcpy(ifr.ifr_name, p, sizeof(ifr.ifr_name));
-             if ((s = socket(ifr.ifr_addr.sa_family, SOCK_DGRAM, 0)) < 0)
-                 break;
-             if (ioctl(s, SIOCGIFFLAGS, &ifr) < 0) {
-diff --git a/agent/mibgroup/mibII/kernel_linux.c b/agent/mibgroup/mibII/kernel_linux.c
-index dfa0b2b..b21a166 100644
---- a/agent/mibgroup/mibII/kernel_linux.c
-+++ b/agent/mibgroup/mibII/kernel_linux.c
-@@ -66,8 +66,8 @@ decode_icmp_msg(char *line, char *data, struct icmp4_msg_mib *msg)
-      * getting modified. So we take a local copy for this purpose even though
-      * its expensive.
-      */
--    strncpy(line_cpy, line, sizeof(line_cpy));
--    strncpy(data_cpy, data, sizeof(data_cpy));
-+    strlcpy(line_cpy, line, sizeof(line_cpy));
-+    strlcpy(data_cpy, data, sizeof(data_cpy));
- 
-     lineptr = line_cpy;
-     dataptr = data_cpy;
-diff --git a/agent/mibgroup/mibII/kernel_netbsd.c b/agent/mibgroup/mibII/kernel_netbsd.c
-index 7f0a690..93f38b7 100644
---- a/agent/mibgroup/mibII/kernel_netbsd.c
-+++ b/agent/mibgroup/mibII/kernel_netbsd.c
-@@ -32,8 +32,8 @@
- int
- netbsd_read_icmp_stat(struct icmp_mib *mib)
- {
--    size_t   size;
-     uint64_t icmpstat[ICMP_NSTATS];
-+    size_t   size = sizeof(icmpstat);
-     int      i;
- 
-     (void)memset(mib, 0, sizeof(*mib));
-@@ -89,8 +89,8 @@ netbsd_read_icmp_stat(struct icmp_mib *mib)
- int
- netbsd_read_ip_stat(struct ip_mib *mib)
- {
--    size_t   size;
-     uint64_t ipstat[IP_NSTATS];
-+    size_t   size = sizeof(ipstat);
-     int      i;
-     static   int sname[4] = { 4, 2, 0, 0 }; /* CTL_NET, PF_INET, IPPROTO_IP, 0 */
-     size_t   len;
-@@ -141,8 +141,8 @@ netbsd_read_ip_stat(struct ip_mib *mib)
- int
- netbsd_read_tcp_stat(struct tcp_mib *mib)
- {
--    size_t   size;
-     uint64_t tcpstat[TCP_NSTATS];
-+    size_t   size = sizeof(tcpstat);
- 
-     (void)memset(mib, 0, sizeof(*mib));
- 
-@@ -177,8 +177,8 @@ netbsd_read_tcp_stat(struct tcp_mib *mib)
- int
- netbsd_read_udp_stat(struct udp_mib *mib)
- {
--    size_t   size;
-     uint64_t udpstat[UDP_NSTATS];
-+    size_t   size = sizeof(udpstat);
- 
-     (void)memset(mib, 0, sizeof(*mib));
- 
-diff --git a/agent/mibgroup/mibII/mta_sendmail.c b/agent/mibgroup/mibII/mta_sendmail.c
-index 79a5182..00397d3 100644
---- a/agent/mibgroup/mibII/mta_sendmail.c
-+++ b/agent/mibgroup/mibII/mta_sendmail.c
-@@ -853,8 +853,7 @@ read_sendmailcf(BOOL config)
-                 }
- 
-                 if (strncasecmp(line + 2, "StatusFile", 10) == 0) {
--                    strncpy(sendmailst_fn, filename, sizeof(sendmailst_fn));
--                    sendmailst_fn[ sizeof(sendmailst_fn)-1 ] = 0;
-+                    strlcpy(sendmailst_fn, filename, sizeof(sendmailst_fn));
-                     found_sendmailst = TRUE;
-                     DEBUGMSGTL(("mibII/mta_sendmail.c:read_sendmailcf",
-                                 "found statatistics file \"%s\"\n",
-@@ -975,11 +974,7 @@ read_sendmailcf(BOOL config)
-         linenr++;
-     }
- 
--    for (i = 0; i < 10 && fclose(sendmailcf_fp) != 0; i++) {
--        /*
--         * nothing to do 
--         */
--    }
-+    fclose(sendmailcf_fp);
- 
-     for (i = mailers; i < MAXMAILERS; i++) {
-         mailernames[i][0] = '\0';
-diff --git a/agent/mibgroup/mibII/route_write.c b/agent/mibgroup/mibII/route_write.c
-index b2e941b..5820ee1 100644
---- a/agent/mibgroup/mibII/route_write.c
-+++ b/agent/mibgroup/mibII/route_write.c
-@@ -434,11 +434,6 @@ write_rte(int action,
- 
-             memcpy(buf, var_val, (var_val_len > 8) ? 8 : var_val_len);
- 
--            if (var_val_type != ASN_IPADDRESS) {
--                snmp_log(LOG_ERR, "not IP address 2");
--                return SNMP_ERR_WRONGTYPE;
--            }
--
-             rp->xx_dst = *((u_long *) buf);
- 
- 
-@@ -509,16 +504,12 @@ write_rte(int action,
- 
-             memcpy(buf, var_val, (var_val_len > 8) ? 8 : var_val_len);
- 
--            if (var_val_type != ASN_IPADDRESS) {
--                snmp_log(LOG_ERR, "not right5");
--                return SNMP_ERR_WRONGTYPE;
--            }
--
-             rp->xx_nextIR = *((u_long *) buf);
- 
-         } else if (action == COMMIT) {
-             rp->rt_nextIR = rp->xx_nextIR;
-         }
-+	break;
- 
- 
-     case IPROUTETYPE:
-diff --git a/agent/mibgroup/mibII/system_mib.c b/agent/mibgroup/mibII/system_mib.c
-index 7ca1227..65b0b7c 100644
---- a/agent/mibgroup/mibII/system_mib.c
-+++ b/agent/mibgroup/mibII/system_mib.c
-@@ -262,9 +262,9 @@ init_system_mib(void)
-     extmp.type = EXECPROC;
-     extmp.next = NULL;
-     exec_command(&extmp);
--    strncpy(version_descr, extmp.output, sizeof(version_descr));
--    version_descr[sizeof(version_descr) - 1] = 0;
--    version_descr[strlen(version_descr) - 1] = 0;       /* chomp new line */
-+    strlcpy(version_descr, extmp.output, sizeof(version_descr));
-+    if (strlen(version_descr) >= 1)
-+        version_descr[strlen(version_descr) - 1] = 0; /* chomp new line */
- #else
- #if (defined (WIN32) && defined (HAVE_WIN32_PLATFORM_SDK)) || defined (mingw32)
-     windowsOSVersionString(version_descr, sizeof(version_descr));
-@@ -278,7 +278,7 @@ init_system_mib(void)
-     gethostname(sysName, sizeof(sysName));
- #else
- #ifdef HAVE_UNAME
--    strncpy(sysName, utsName.nodename, sizeof(sysName));
-+    strlcpy(sysName, utsName.nodename, sizeof(sysName));
- #else
- #if defined (HAVE_EXECV) && !defined (mingw32)
-     sprintf(extmp.command, "%s -n", UNAMEPROG);
-@@ -288,8 +288,9 @@ init_system_mib(void)
-     extmp.type = EXECPROC;
-     extmp.next = NULL;
-     exec_command(&extmp);
--    strncpy(sysName, extmp.output, sizeof(sysName));
--    sysName[strlen(sysName) - 1] = 0;   /* chomp new line */
-+    strlcpy(sysName, extmp.output, sizeof(sysName));
-+    if (strlen(sysName) >= 1)
-+        sysName[strlen(sysName) - 1] = 0; /* chomp new line */
- #else
-     strcpy(sysName, "unknown");
- #endif                          /* HAVE_EXECV */
-diff --git a/agent/mibgroup/mibII/tcp.c b/agent/mibgroup/mibII/tcp.c
-index d68e699..3c79fad 100644
---- a/agent/mibgroup/mibII/tcp.c
-+++ b/agent/mibgroup/mibII/tcp.c
-@@ -113,6 +113,7 @@ void
- init_tcp(void)
- {
-     netsnmp_handler_registration *reginfo;
-+    int rc;
- 
-     /*
-      * register ourselves with the agent as a group of scalars...
-@@ -120,7 +121,9 @@ init_tcp(void)
-     DEBUGMSGTL(("mibII/tcpScalar", "Initialising TCP scalar group\n"));
-     reginfo = netsnmp_create_handler_registration("tcp", tcp_handler,
- 		    tcp_oid, OID_LENGTH(tcp_oid), HANDLER_CAN_RONLY);
--    netsnmp_register_scalar_group(reginfo, TCPRTOALGORITHM, TCPOUTRSTS);
-+    rc = netsnmp_register_scalar_group(reginfo, TCPRTOALGORITHM, TCPOUTRSTS);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
- 
-     /*
-      * .... with a local cache
-diff --git a/agent/mibgroup/mibII/tcpTable.c b/agent/mibgroup/mibII/tcpTable.c
-index 01d00e5..088dd06 100644
---- a/agent/mibgroup/mibII/tcpTable.c
-+++ b/agent/mibgroup/mibII/tcpTable.c
-@@ -147,6 +147,7 @@ init_tcpTable(void)
-     netsnmp_table_registration_info *table_info;
-     netsnmp_iterator_info           *iinfo;
-     netsnmp_handler_registration    *reginfo;
-+    int                              rc;
- 
-     DEBUGMSGTL(("mibII/tcpTable", "Initialising TCP Table\n"));
-     /*
-@@ -186,7 +187,9 @@ init_tcpTable(void)
-             tcpTable_handler,
-             tcpTable_oid, OID_LENGTH(tcpTable_oid),
-             HANDLER_CAN_RONLY),
--    netsnmp_register_table_iterator2(reginfo, iinfo);
-+    rc = netsnmp_register_table_iterator2(reginfo, iinfo);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
- 
-     /*
-      * .... with a local cache
-diff --git a/agent/mibgroup/mibII/udp.c b/agent/mibgroup/mibII/udp.c
-index 8d2654d..1ddcbc5 100644
---- a/agent/mibgroup/mibII/udp.c
-+++ b/agent/mibgroup/mibII/udp.c
-@@ -74,6 +74,7 @@ void
- init_udp(void)
- {
-     netsnmp_handler_registration *reginfo;
-+    int rc;
- 
-     /*
-      * register ourselves with the agent as a group of scalars...
-@@ -81,7 +82,9 @@ init_udp(void)
-     DEBUGMSGTL(("mibII/udpScalar", "Initialising UDP scalar group\n"));
-     reginfo = netsnmp_create_handler_registration("udp", udp_handler,
- 		    udp_oid, OID_LENGTH(udp_oid), HANDLER_CAN_RONLY);
--    netsnmp_register_scalar_group(reginfo, UDPINDATAGRAMS, UDPOUTDATAGRAMS);
-+    rc = netsnmp_register_scalar_group(reginfo, UDPINDATAGRAMS, UDPOUTDATAGRAMS);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
- 
-     /*
-      * .... with a local cache
-diff --git a/agent/mibgroup/mibII/udpTable.c b/agent/mibgroup/mibII/udpTable.c
-index 162de1b..64f6dfb 100644
---- a/agent/mibgroup/mibII/udpTable.c
-+++ b/agent/mibgroup/mibII/udpTable.c
-@@ -129,6 +129,7 @@ init_udpTable(void)
-     netsnmp_table_registration_info *table_info;
-     netsnmp_iterator_info           *iinfo;
-     netsnmp_handler_registration    *reginfo;
-+    int                              rc;
- 
-     DEBUGMSGTL(("mibII/udpTable", "Initialising UDP Table\n"));
-     /*
-@@ -166,7 +167,9 @@ init_udpTable(void)
-             udpTable_handler,
-             udpTable_oid, OID_LENGTH(udpTable_oid),
-             HANDLER_CAN_RONLY),
--    netsnmp_register_table_iterator2(reginfo, iinfo);
-+    rc = netsnmp_register_table_iterator2(reginfo, iinfo);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
- 
-     /*
-      * .... with a local cache
-@@ -496,6 +499,7 @@ udpTable_load(netsnmp_cache *cache, void *vmagic)
-         if (state != 7)         /* fix me:  UDP_LISTEN ??? */
-             continue;
- 
-+        memset(&pcb, 0, sizeof(pcb));
-         /* store in network byte order */
-         pcb.inp_laddr.s_addr = htonl(pcb.inp_laddr.s_addr);
-         pcb.inp_lport = htons((unsigned short) (lport));
-diff --git a/agent/mibgroup/mibII/vacm_conf.c b/agent/mibgroup/mibII/vacm_conf.c
-index f62c6cc..f2faf86 100644
---- a/agent/mibgroup/mibII/vacm_conf.c
-+++ b/agent/mibgroup/mibII/vacm_conf.c
-@@ -201,8 +201,7 @@ vacm_parse_group(const char *token, char *param)
-         config_perror("failed to create group entry");
-         return;
-     }
--    strncpy(gp->groupName, group, sizeof(gp->groupName));
--    gp->groupName[ sizeof(gp->groupName)-1 ] = 0;
-+    strlcpy(gp->groupName, group, sizeof(gp->groupName));
-     gp->storageType = SNMP_STORAGE_PERMANENT;
-     gp->status = SNMP_ROW_ACTIVE;
-     free(gp->reserved);
-@@ -542,10 +541,6 @@ vacm_parse_setaccess(const char *token, char *param)
-         config_perror("failed to create access entry");
-         return;
-     }
--    if (!ap) {
--        config_perror("failed to create access entry");
--        return;
--    }
- 
-     strcpy(ap->views[viewnum], viewval);
-     ap->contextMatch = iprefix;
-@@ -990,11 +985,9 @@ vacm_create_simple(const char *token, char *confline,
-             sprintf(viewname,"viewUSM%d",commcount);
-         }
-         if ( strcmp( token, "authgroup" ) == 0 ) {
--            strncpy(grpname, community, sizeof(grpname));
--            grpname[ sizeof(grpname)-1 ] = 0;
-+            strlcpy(grpname, community, sizeof(grpname));
-         } else {
--            strncpy(secname, community, sizeof(secname));
--            secname[ sizeof(secname)-1 ] = 0;
-+            strlcpy(secname, community, sizeof(secname));
- 
-             /*
-              * sec->group mapping 
-@@ -1419,7 +1412,7 @@ vacm_check_view_contents(netsnmp_pdu *pdu, oid * name, size_t namelen,
-      * NULL termination of the pdu field is ugly here.  Do in PDU parsing? 
-      */
-     if (pdu->contextName)
--        strncpy(contextNameIndex, pdu->contextName, pdu->contextNameLen);
-+        memcpy(contextNameIndex, pdu->contextName, pdu->contextNameLen);
-     else
-         contextNameIndex[0] = '\0';
- 
-diff --git a/agent/mibgroup/mibII/vacm_vars.c b/agent/mibgroup/mibII/vacm_vars.c
-index 7860573..85cef94 100644
---- a/agent/mibgroup/mibII/vacm_vars.c
-+++ b/agent/mibgroup/mibII/vacm_vars.c
-@@ -1084,7 +1084,7 @@ write_vacmAccessStatus(int action,
- {
-     static long     long_ret;
-     int             model, level;
--    char           *newGroupName, *newContextPrefix;
-+    char           *newGroupName = NULL, *newContextPrefix = NULL;
-     size_t          groupNameLen, contextPrefixLen;
-     struct vacm_accessEntry *aptr = NULL;
- 
-diff --git a/agent/mibgroup/mibII/var_route.c b/agent/mibgroup/mibII/var_route.c
-index b5daed0..8488019 100644
---- a/agent/mibgroup/mibII/var_route.c
-+++ b/agent/mibgroup/mibII/var_route.c
-@@ -919,7 +919,7 @@ load_rtentries(struct radix_node *pt)
-             }
- #if HAVE_STRUCT_IFNET_IF_XNAME
- #if defined(netbsd1) || defined(openbsd2)
--            strncpy(name, ifnet.if_xname, sizeof name);
-+            strlcpy(name, ifnet.if_xname, sizeof(name));
- #else
-             if (!NETSNMP_KLOOKUP(ifnet.if_xname, name, sizeof name)) {
-                 DEBUGMSGTL(("mibII/var_route", "klookup failed\n"));
-@@ -1366,8 +1366,7 @@ Route_Scan_Reload(void)
-                         &(((struct sockaddr_in *) &(rtent.rt_genmask))->sin_addr.s_addr)))
-             continue;
- 
--        strncpy(name, rt->rt_dev, sizeof(name));
--        name[ sizeof(name)-1 ] = 0;
-+        strlcpy(name, rt->rt_dev, sizeof(name));
- 
-         rt->rt_flags = flags, rt->rt_refcnt = refcnt;
-         rt->rt_use = use, rt->rt_metric = metric;
-diff --git a/agent/mibgroup/notification-log-mib/notification_log.c b/agent/mibgroup/notification-log-mib/notification_log.c
-index 86efb34..a12a338 100644
---- a/agent/mibgroup/notification-log-mib/notification_log.c
-+++ b/agent/mibgroup/notification-log-mib/notification_log.c
-@@ -136,11 +136,9 @@ check_log_size(unsigned int clientreg, void *clientarg)
-     netsnmp_table_row *row;
-     netsnmp_table_data_set_storage *data;
-     u_long          count = 0;
--    struct timeval  now;
-     u_long          uptime;
- 
--    gettimeofday(&now, NULL);
--    uptime = netsnmp_timeval_uptime(&now);
-+    uptime = netsnmp_get_agent_uptime();
- 
-     if (!nlmLogTable || !nlmLogTable->table )  {
-         DEBUGMSGTL(("notification_log", "missing log table\n"));
-@@ -580,7 +578,6 @@ void
- log_notification(netsnmp_pdu *pdu, netsnmp_transport *transport)
- {
-     long            tmpl;
--    struct timeval  now;
-     netsnmp_table_row *row;
- 
-     static u_long   default_num = 0;
-@@ -620,8 +617,7 @@ log_notification(netsnmp_pdu *pdu, netsnmp_transport *transport)
-     /*
-      * add the data 
-      */
--    gettimeofday(&now, NULL);
--    tmpl = netsnmp_timeval_uptime(&now);
-+    tmpl = netsnmp_get_agent_uptime();
-     netsnmp_set_row_column(row, COLUMN_NLMLOGTIME, ASN_TIMETICKS,
-                            &tmpl, sizeof(tmpl));
-     time(&timetnow);
-diff --git a/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c b/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c
-index ac7f2ab..b12cdc8 100644
---- a/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c
-+++ b/agent/mibgroup/notification/snmpNotifyFilterProfileTable.c
-@@ -194,6 +194,7 @@ parse_snmpNotifyFilterProfileTable(const char *token, char *line)
-                               &StorageTmp->snmpNotifyFilterProfileNameLen);
-     if (StorageTmp->snmpNotifyFilterProfileName == NULL) {
-         config_perror("invalid specification for snmpNotifyFilterProfileName");
-+        SNMP_FREE(StorageTmp);
-         return;
-     }
- 
-diff --git a/agent/mibgroup/notification/snmpNotifyTable.c b/agent/mibgroup/notification/snmpNotifyTable.c
-index 649b19e..8d09c59 100644
---- a/agent/mibgroup/notification/snmpNotifyTable.c
-+++ b/agent/mibgroup/notification/snmpNotifyTable.c
-@@ -317,9 +317,15 @@ notifyTable_register_notifications(int major, int minor,
-     /*
-      * address 
-      */
-+    t = snmp_sess_transport(snmp_sess_pointer(ss));
-+    if (!t) {
-+        snmp_log(LOG_ERR,
-+                "Cannot add new trap destination, transport is closed.");
-+        snmp_sess_close(ss);
-+        return 0;
-+    }
-     ptr = snmpTargetAddrTable_create();
-     ptr->name = strdup(buf);
--    t = snmp_sess_transport(snmp_sess_pointer(ss));
-     memcpy(ptr->tDomain, t->domain, t->domain_length * sizeof(oid));
-     ptr->tDomainLen = t->domain_length;
-     ptr->tAddressLen = t->remote_length;
-@@ -346,8 +352,10 @@ notifyTable_register_notifications(int major, int minor,
-         pptr->secModel = ss->securityModel;
-         pptr->secLevel = ss->securityLevel;
-         pptr->secName = (char *) malloc(ss->securityNameLen + 1);
--        if (pptr->secName == NULL)
-+        if (pptr->secName == NULL) {
-+            snmpTargetParamTable_dispose(pptr);
-             return 0;
-+        }
-         memcpy((void *) pptr->secName, (void *) ss->securityName,
-                ss->securityNameLen);
-         pptr->secName[ss->securityNameLen] = 0;
-@@ -363,8 +371,10 @@ notifyTable_register_notifications(int major, int minor,
-         pptr->secName = NULL;
-         if (ss->community && (ss->community_len > 0)) {
-             pptr->secName = (char *) malloc(ss->community_len + 1);
--            if (pptr->secName == NULL)
-+            if (pptr->secName == NULL) {
-+                snmpTargetParamTable_dispose(pptr);
-                 return 0;
-+            }
-             memcpy((void *) pptr->secName, (void *) ss->community,
-                    ss->community_len);
-             pptr->secName[ss->community_len] = 0;
-@@ -573,6 +583,7 @@ parse_snmpNotifyTable(const char *token, char *line)
-                               &StorageTmp->snmpNotifyNameLen);
-     if (StorageTmp->snmpNotifyName == NULL) {
-         config_perror("invalid specification for snmpNotifyName");
-+        SNMP_FREE(StorageTmp);
-         return;
-     }
- 
-@@ -582,6 +593,7 @@ parse_snmpNotifyTable(const char *token, char *line)
-                               &StorageTmp->snmpNotifyTagLen);
-     if (StorageTmp->snmpNotifyTag == NULL) {
-         config_perror("invalid specification for snmpNotifyTag");
-+        SNMP_FREE(StorageTmp);
-         return;
-     }
- 
-diff --git a/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c b/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c
-index cd35d09..d4b6e69 100644
---- a/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c
-+++ b/agent/mibgroup/rmon-mib/data_access/etherstats_linux.c
-@@ -46,8 +46,8 @@ etherstats_interface_name_list_get (struct ifname *list_head, int *retval)
-                 *retval = -2;
-                 return NULL;
-             }
--            memset (list_head, 0, sizeof (struct ifname));
--            strncpy (list_head->name, p->ifa_name, IF_NAMESIZE);
-+            memset(list_head, 0, sizeof(struct ifname));
-+            strlcpy(list_head->name, p->ifa_name, IF_NAMESIZE);
-             continue;
-         }
-          for (nameptr1 = list_head; nameptr1; nameptr2 = nameptr1, nameptr1 = nameptr1->ifn_next)
-@@ -67,10 +67,9 @@ etherstats_interface_name_list_get (struct ifname *list_head, int *retval)
-             return NULL;
-         }
-         nameptr2 = nameptr2->ifn_next;
--        memset (nameptr2, 0, sizeof (struct ifname));
--        strncpy (nameptr2->name, p->ifa_name, IF_NAMESIZE);
-+        memset(nameptr2, 0, sizeof(struct ifname));
-+        strlcpy(nameptr2->name, p->ifa_name, IF_NAMESIZE);
-         continue;
--
-     }
- 
-     freeifaddrs(addrs);
-@@ -162,7 +161,7 @@ interface_ioctl_etherstats_get (etherStatsTable_rowreq_ctx *rowreq_ctx , int fd,
-                 "called\n"));
- 
-     memset(&ifr, 0, sizeof(ifr));
--    strcpy(ifr.ifr_name, name);
-+    strlcpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
- 
-     memset(&driver_info, 0, sizeof(driver_info));
-     driver_info.cmd = ETHTOOL_GDRVINFO;
-@@ -238,8 +237,8 @@ interface_ioctl_etherstats_get (etherStatsTable_rowreq_ctx *rowreq_ctx , int fd,
-     for (i = 0; i < nstats; i++) {
-         char s[ETH_GSTRING_LEN];
- 
--        strncpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
--            ETH_GSTRING_LEN);
-+        strlcpy(s, (const char *) &eth_strings->data[i * ETH_GSTRING_LEN],
-+                sizeof(s));
-         
-         if (ETHERSTATSJABBERS(s)) {
-             data->etherStatsJabbers = (u_long)eth_stats->data[i];
-@@ -300,8 +299,7 @@ _etherStats_ioctl_get(int fd, int which, struct ifreq *ifrq, const char* name)
-         }
-     }
- 
--    strncpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
--    ifrq->ifr_name[ sizeof(ifrq->ifr_name)-1 ] = 0;
-+    strlcpy(ifrq->ifr_name, name, sizeof(ifrq->ifr_name));
-     rc = ioctl(fd, which, ifrq);
-     if (rc < 0) {
-         DEBUGMSGTL(("access:etherStatsTable:ioctl",
-diff --git a/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c b/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c
-index bc22430..d6023e5 100644
---- a/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpAssocLocalAddrTable.c
-@@ -102,6 +102,7 @@ initialize_table_sctpAssocLocalAddrTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpAssocLocalAddrTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c b/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c
-index bea3978..38ca8a3 100644
---- a/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpAssocRemAddrTable.c
-@@ -101,6 +101,7 @@ initialize_table_sctpAssocRemAddrTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpAssocRemAddrTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpAssocTable.c b/agent/mibgroup/sctp-mib/sctpAssocTable.c
-index 951f778..9919075 100644
---- a/agent/mibgroup/sctp-mib/sctpAssocTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpAssocTable.c
-@@ -135,6 +135,7 @@ initialize_table_sctpAssocTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpAssocTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c b/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c
-index f40db3a..1a6fd35 100644
---- a/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpLookupLocalPortTable.c
-@@ -97,6 +97,7 @@ initialize_table_sctpLookupLocalPortTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpLookupLocalPortTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c
-index cfbceab..ae2ec91 100644
---- a/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpLookupRemHostNameTable.c
-@@ -99,6 +99,7 @@ initialize_table_sctpLookupRemHostNameTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpLookupRemHostNameTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c
-index c95bdf1..368dd51 100644
---- a/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpLookupRemIPAddrTable.c
-@@ -98,6 +98,7 @@ initialize_table_sctpLookupRemIPAddrTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpLookupRemIPAddrTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c
-index eb1828b..c8a8874 100644
---- a/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpLookupRemPortTable.c
-@@ -97,6 +97,7 @@ initialize_table_sctpLookupRemPortTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpLookupRemPortTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c b/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c
-index 44d384f..d9966fc 100644
---- a/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c
-+++ b/agent/mibgroup/sctp-mib/sctpLookupRemPrimIPAddrTable.c
-@@ -99,6 +99,7 @@ initialize_table_sctpLookupRemPrimIPAddrTable(void)
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,
-                  "error registering table handler for sctpLookupRemPrimIPAddrTable\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpScalars.c b/agent/mibgroup/sctp-mib/sctpScalars.c
-index 6bcefd2..821079a 100644
---- a/agent/mibgroup/sctp-mib/sctpScalars.c
-+++ b/agent/mibgroup/sctp-mib/sctpScalars.c
-@@ -18,6 +18,7 @@ init_sctpScalars(void)
- {
-     netsnmp_handler_registration *reginfo_stats;
-     netsnmp_handler_registration *reginfo_params;
-+    int rc;
- 
-     DEBUGMSGTL(("sctp:scalars:init", "Initializing\n"));
- 
-@@ -27,8 +28,14 @@ init_sctpScalars(void)
-                                             sctp_stats_oid,
-                                             OID_LENGTH(sctp_stats_oid),
-                                             HANDLER_CAN_RONLY);
--    netsnmp_register_scalar_group(reginfo_stats, SCTP_CURRESTAB,
-+    if (!reginfo_stats)
-+        return;
-+
-+    rc = netsnmp_register_scalar_group(reginfo_stats, SCTP_CURRESTAB,
-                                   SCTP_DISCONTINUITYTIME);
-+    if (rc != SNMPERR_SUCCESS)
-+        return;
-+
-     netsnmp_inject_handler(reginfo_stats,
-                            netsnmp_get_cache_handler
-                            (SCTP_STATS_CACHE_TIMEOUT,
-@@ -43,8 +50,13 @@ init_sctpScalars(void)
-                                             sctp_params_oid,
-                                             OID_LENGTH(sctp_params_oid),
-                                             HANDLER_CAN_RONLY);
--    netsnmp_register_scalar_group(reginfo_params, SCTP_RTOALGORITHM,
-+    if (!reginfo_params)
-+        return;
-+
-+    rc = netsnmp_register_scalar_group(reginfo_params, SCTP_RTOALGORITHM,
-                                   SCTP_MAXINITRETR);
-+    if (!rc)
-+        return;
-     netsnmp_inject_handler(reginfo_params,
-                            netsnmp_get_cache_handler
-                            (SCTP_PARAMS_CACHE_TIMEOUT,
-diff --git a/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c b/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c
-index a62b788..b8c723f 100644
---- a/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c
-+++ b/agent/mibgroup/sctp-mib/sctpScalars_freebsd.c
-@@ -60,9 +60,7 @@ netsnmp_access_sctp_params_arch_init()
- int
- netsnmp_access_sctp_params_arch_load(netsnmp_sctp_params * sctp_params)
- {
--    int             ret;
- 	size_t len = sizeof(uint32_t);
--	unsigned int cnt = 0;
- 
-     sctp_params->rto_algorithm = NETSNMP_SCTP_ALGORITHM_VANJ;
-     sctp_params->max_assocs =  SCTP_MAX_NUM_OF_ASOC; 
-diff --git a/agent/mibgroup/sctp-mib/sctpScalars_linux.c b/agent/mibgroup/sctp-mib/sctpScalars_linux.c
-index 8cbe90f..2e5b5af 100644
---- a/agent/mibgroup/sctp-mib/sctpScalars_linux.c
-+++ b/agent/mibgroup/sctp-mib/sctpScalars_linux.c
-@@ -35,6 +35,7 @@ load_uint_file(const char *filename, u_int * value)
-     if (ret != 1) {
-         DEBUGMSGTL(("sctp:scalars:arch:load", "Malformed file %s\n",
-                     filename));
-+        fclose(f);
-         return -2;
-     }
- 
-@@ -71,6 +72,7 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats)
-         if (delimiter == NULL) {
-             DEBUGMSGTL(("sctp:scalars:stats:arch_load",
-                         "Malformed line, cannot find '\\t'!\n"));
-+            fclose(f);
-             return -1;
-         }
-         errno = 0;
-@@ -78,6 +80,7 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats)
-         if (errno != 0) {
-             DEBUGMSGTL(("sctp:scalars:stats:arch_load",
-                         "Malformed value!'\n"));
-+            fclose(f);
-             return -1;
-         }
- 
-@@ -136,11 +139,13 @@ netsnmp_access_sctp_stats_arch_load(netsnmp_sctp_stats * sctp_stats)
-         if (ret < 0) {
-             DEBUGMSGTL(("sctp:scalars:stats:arch_load",
-                         "Unknown entry!'\n"));
-+            fclose(f);
-             return ret;
-         }
-     }
- 
-     sctp_stats->discontinuity_time = 0;
-+    fclose(f);
-     return 0;
- }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpTables_common.c b/agent/mibgroup/sctp-mib/sctpTables_common.c
-index 899d8d5..b28ea03 100644
---- a/agent/mibgroup/sctp-mib/sctpTables_common.c
-+++ b/agent/mibgroup/sctp-mib/sctpTables_common.c
-@@ -435,7 +435,7 @@ sctpTables_load(void)
- 
-     ret = sctpTables_arch_load(&containers, &flags);
- 
--    if (flags | SCTP_TABLES_LOAD_FLAG_DELETE_INVALID) {
-+    if (flags & SCTP_TABLES_LOAD_FLAG_DELETE_INVALID) {
-         sctpAssocTable_delete_invalid(containers.sctpAssocTable);
-         sctpAssocRemAddrTable_delete_invalid(containers.
-                                              sctpAssocRemAddrTable);
-@@ -443,7 +443,7 @@ sctpTables_load(void)
-                                                sctpAssocLocalAddrTable);
-     }
- 
--    if (flags | SCTP_TABLES_LOAD_FLAG_AUTO_LOOKUP) {
-+    if (flags & SCTP_TABLES_LOAD_FLAG_AUTO_LOOKUP) {
-         ret = sctpTables_fill_lookup(&containers);
-     }
- 
-diff --git a/agent/mibgroup/sctp-mib/sctpTables_freebsd.c b/agent/mibgroup/sctp-mib/sctpTables_freebsd.c
-index db73e00..516e9f5 100644
---- a/agent/mibgroup/sctp-mib/sctpTables_freebsd.c
-+++ b/agent/mibgroup/sctp-mib/sctpTables_freebsd.c
-@@ -58,8 +58,6 @@ parse_assoc_local_addresses(sctpTables_containers * containers,
- static int
- parse_assoc_xstcb(sctpTables_containers * containers, struct xsctp_tcb *xstcb)
- {
--  long            inode;
--  char           *token;
-   int             ret;
-   sctpAssocTable_entry *entry;
- 
-@@ -124,7 +122,6 @@ static int
- parse_remaddr_xraddr(sctpTables_containers * containers,
- 					 struct xsctp_raddr *xraddr)
- {
--  char           *token;
-   int             ret;
-   sctpAssocRemAddrTable_entry *entry;
- 
-@@ -184,8 +181,6 @@ sctpTables_arch_load(sctpTables_containers * containers, u_long * flags)
-   struct xsctp_tcb *xstcb;
-   struct xsctp_laddr *xladdr;
-   struct xsctp_raddr *xraddr;
--  sa_family_t family;
--  void *addr;
- 
- 
-   *flags |= SCTP_TABLES_LOAD_FLAG_DELETE_INVALID;
-diff --git a/agent/mibgroup/smux/smux.c b/agent/mibgroup/smux/smux.c
-index fdb5e11..2055974 100644
---- a/agent/mibgroup/smux/smux.c
-+++ b/agent/mibgroup/smux/smux.c
-@@ -91,7 +91,7 @@ static u_char  *smux_parse(u_char *, oid *, size_t *, size_t *, u_char *);
- static u_char  *smux_parse_var(u_char *, size_t *, oid *, size_t *,
-                                size_t *, u_char *);
- static void     smux_send_close(int, int);
--static void     smux_list_detach(smux_reg **, smux_reg **);
-+static void     smux_list_detach(smux_reg **, smux_reg *);
- static void     smux_replace_active(smux_reg *, smux_reg *);
- static void     smux_peer_cleanup(int);
- static int      smux_auth_peer(oid *, size_t, char *, int);
-@@ -145,6 +145,7 @@ smux_parse_peer_auth(const char *token, char *cptr)
-     }
-     if (nauths == SMUX_MAX_PEERS) {
- 	config_perror("Too many smuxpeers");
-+	free(aptr);
- 	return;
-     }
- 
-@@ -169,10 +170,8 @@ smux_parse_peer_auth(const char *token, char *cptr)
-         /*
-          * password 
-          */
--        if (*password_cptr) {
--            strncpy(aptr->sa_passwd, password_cptr, SMUXMAXSTRLEN-1);
--            aptr->sa_passwd[SMUXMAXSTRLEN-1] = '\0';
--        }
-+        if (*password_cptr)
-+            strlcpy(aptr->sa_passwd, password_cptr, sizeof(aptr->sa_passwd));
-     } else {
-         /*
-          * null passwords OK 
-@@ -369,6 +368,11 @@ var_smux_write(int action,
-             break;
-     }
- 
-+    if (!rptr) {
-+        DEBUGMSGTL(("smux", "[var_smux_write] unknown registration\n"));
-+        return SNMP_ERR_GENERR;
-+    }
-+
-     switch (action) {
-     case RESERVE1:
-         DEBUGMSGTL(("smux", "[var_smux_write] entering RESERVE1\n"));
-@@ -1049,7 +1053,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
-                 /*
-                  * no replacement found 
-                  */
--                smux_list_detach(&ActiveRegs, &rptr);
-+                smux_list_detach(&ActiveRegs, rptr);
-                 free(rptr);
-             }
-             smux_send_rrsp(sd, rpriority);
-@@ -1063,7 +1067,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
-                             priority);
-         if (rptr) {
-             rpriority = rptr->sr_priority;
--            smux_list_detach(&PassiveRegs, &rptr);
-+            smux_list_detach(&PassiveRegs, rptr);
-             free(rptr);
-             smux_send_rrsp(sd, rpriority);
-             return ptr;
-@@ -1104,7 +1108,7 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
-                 snmp_oid_compare(oid_name, oid_name_len, rptr->sr_name,
-                                  rptr->sr_name_len);
-             if (result == 0) {
--                if ((oid_name_len == rptr->sr_name_len)) {
-+                if (oid_name_len == rptr->sr_name_len) {
-                     if ((nrptr->sr_priority == -1)) {
-                         nrptr->sr_priority = rptr->sr_priority;
-                         do {
-@@ -1154,9 +1158,17 @@ smux_rreq_process(int sd, u_char * ptr, size_t * len)
-         if (nrptr->sr_priority == -1)
-             nrptr->sr_priority = 0;
-         smux_list_add(&ActiveRegs, nrptr);
--        register_mib("smux", (struct variable *)
--                     smux_variables, sizeof(struct variable2),
--                     1, nrptr->sr_name, nrptr->sr_name_len);
-+        if (register_mib("smux", (struct variable *)
-+                             smux_variables, sizeof(struct variable2),
-+                             1, nrptr->sr_name, nrptr->sr_name_len)
-+                     != SNMPERR_SUCCESS) {
-+		DEBUGMSGTL(("smux", "[smux_rreq_process] Failed to register subtree\n"));
-+		smux_list_detach(&ActiveRegs, nrptr);
-+		free(nrptr);
-+		smux_send_rrsp(sd, -1);
-+		return NULL;
-+	}
-+
-       done:
-         smux_send_rrsp(sd, nrptr->sr_priority);
-         return ptr;
-@@ -1202,10 +1214,10 @@ smux_find_match(smux_reg * regs, int sd, oid * oid_name,
- static void
- smux_replace_active(smux_reg * actptr, smux_reg * pasptr)
- {
--    smux_list_detach(&ActiveRegs, &actptr);
-+    smux_list_detach(&ActiveRegs, actptr);
-     unregister_mib(actptr->sr_name, actptr->sr_name_len);
- 
--    smux_list_detach(&PassiveRegs, &pasptr);
-+    smux_list_detach(&PassiveRegs, pasptr);
-     (void) smux_list_add(&ActiveRegs, pasptr);
- 
-     register_mib("smux", (struct variable *) smux_variables,
-@@ -1215,7 +1227,7 @@ smux_replace_active(smux_reg * actptr, smux_reg * pasptr)
- }
- 
- static void
--smux_list_detach(smux_reg ** head, smux_reg ** m_remove)
-+smux_list_detach(smux_reg ** head, smux_reg * m_remove)
- {
-     smux_reg       *rptr, *rptr2;
- 
-@@ -1223,15 +1235,13 @@ smux_list_detach(smux_reg ** head, smux_reg ** m_remove)
-         DEBUGMSGTL(("smux", "[smux_list_detach] Ouch!"));
-         return;
-     }
--    if (*head == *m_remove) {
--        *m_remove = *head;
-+    if (*head == m_remove) {
-         *head = (*head)->sr_next;
-         return;
-     }
-     for (rptr = *head, rptr2 = rptr->sr_next; rptr2;
-          rptr2 = rptr2->sr_next, rptr = rptr->sr_next) {
--        if (rptr2 == *m_remove) {
--            *m_remove = rptr2;
-+        if (rptr2 == m_remove) {
-             rptr->sr_next = rptr2->sr_next;
-             return;
-         }
-@@ -1337,7 +1347,7 @@ smux_find_replacement(oid * name, size_t name_len)
-         if (!snmp_oidtree_compare(rptr->sr_name, rptr->sr_name_len,
-                                   name, name_len)) {
-             if ((difflen = rptr->sr_name_len - name_len)
--                < bestlen) {
-+                < bestlen || !bestptr) {
-                 bestlen = difflen;
-                 bestptr = rptr;
-             } else if ((difflen == bestlen) &&
-@@ -1759,7 +1769,7 @@ smux_peer_cleanup(int sd)
-     for (rptr = PassiveRegs; rptr; rptr = nrptr) {
-         nrptr = rptr->sr_next;
-         if (rptr->sr_fd == sd) {
--            smux_list_detach(&PassiveRegs, &rptr);
-+            smux_list_detach(&PassiveRegs, rptr);
-             free(rptr);
-         }
-         rptr = nrptr;
-@@ -1770,12 +1780,12 @@ smux_peer_cleanup(int sd)
-     for (rptr = ActiveRegs; rptr; rptr = rptr2) {
-         rptr2 = rptr->sr_next;
-         if (rptr->sr_fd == sd) {
--            smux_list_detach(&ActiveRegs, &rptr);
-+            smux_list_detach(&ActiveRegs, rptr);
-             unregister_mib(rptr->sr_name, rptr->sr_name_len);
-             if ((nrptr = smux_find_replacement(rptr->sr_name,
-                                                rptr->sr_name_len)) !=
-                 NULL) {
--                smux_list_detach(&PassiveRegs, &nrptr);
-+                smux_list_detach(&PassiveRegs, nrptr);
-                 smux_list_add(&ActiveRegs, nrptr);
-                 register_mib("smux", (struct variable *)
-                              smux_variables, sizeof(struct variable2),
-diff --git a/agent/mibgroup/smux/snmp_bgp.c b/agent/mibgroup/smux/snmp_bgp.c
-index 70596a1..16b0185 100644
---- a/agent/mibgroup/smux/snmp_bgp.c
-+++ b/agent/mibgroup/smux/snmp_bgp.c
-@@ -109,8 +109,6 @@ init_snmp_bdp(void)
-                  bgp_variables_oid);
- }
- 
--
--#endif
- static oid      max_bgp_mib[] =
-     { 1, 3, 6, 1, 2, 1, 15, 5, 1, 6, 255, 255, 255, 255 };
- static oid      min_bgp_mib[] = { 1, 3, 6, 1, 2, 1, 15, 1, 0 };
-diff --git a/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c b/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c
-index fd7ab8e..942a865 100644
---- a/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c
-+++ b/agent/mibgroup/snmp-notification-mib/snmpNotifyFilterTable/snmpNotifyFilterTable_data_access.c
-@@ -247,7 +247,7 @@ snmpNotifyFilterTable_container_load(netsnmp_container *container)
-     }
- 
-     DEBUGMSGT(("verbose:snmpNotifyFilterTable:snmpNotifyFilterTable_container_load",
--               "inserted %lu records\n", (long)count));
-+               "inserted %" NETSNMP_PRIz "u records\n", count));
- 
-     return MFD_SUCCESS;
- }                               /* snmpNotifyFilterTable_container_load */
-diff --git a/agent/mibgroup/target/snmpTargetAddrEntry.c b/agent/mibgroup/target/snmpTargetAddrEntry.c
-index ac77d52..50cfed6 100644
---- a/agent/mibgroup/target/snmpTargetAddrEntry.c
-+++ b/agent/mibgroup/target/snmpTargetAddrEntry.c
-@@ -372,9 +372,7 @@ snmpTargetAddr_addName(struct targetAddrTable_struct *entry, char *cptr)
-                         "ERROR snmpTargetAddrEntry: name out of range in config string\n"));
-             return (0);
-         }
--        entry->name = (char *) malloc(len + 1);
--        strncpy(entry->name, cptr, len);
--        entry->name[len] = '\0';
-+        entry->name = strdup(cptr);
-     }
-     return (1);
- }                               /* addName */
-@@ -508,9 +506,7 @@ snmpTargetAddr_addTagList(struct targetAddrTable_struct *entry, char *cptr)
-             return (0);
-         }
-         SNMP_FREE(entry->tagList);
--        entry->tagList = (char *) malloc(len + 1);
--        strncpy(entry->tagList, cptr, len);
--        entry->tagList[len] = '\0';
-+        entry->tagList = strdup(cptr);
-     }
-     return (1);
- }                               /* snmpTargetAddr_addTagList */
-@@ -534,9 +530,7 @@ snmpTargetAddr_addParams(struct targetAddrTable_struct *entry, char *cptr)
-                         "ERROR snmpTargetAddrEntry: params out of range in config string\n"));
-             return (0);
-         }
--        entry->params = (char *) malloc(len + 1);
--        strncpy(entry->params, cptr, len);
--        entry->params[len] = '\0';
-+        entry->params = strdup(cptr);
-     }
-     return (1);
- }                               /* snmpTargetAddr_addParams */
-@@ -725,10 +719,7 @@ store_snmpTargetAddrEntry(int majorID, int minorID, void *serverarg,
-                             (int) curr_struct->tDomain[i]);
-                     line[ sizeof(line)-1 ] = 0;
-                 }
--                if ( strlen(line)+2 < sizeof(line) ) {
--                    line[ strlen(line)+1 ] = 0;
--                    line[ strlen(line)   ] = ' ';
--                }
-+                strlcat(line, " ", sizeof(line));
-                 read_config_save_octet_string(&line[strlen(line)],
-                                               curr_struct->tAddress,
-                                               curr_struct->tAddressLen);
-@@ -860,7 +851,7 @@ var_snmpTargetAddrEntry(struct variable * vp,
- 
-     case SNMPTARGETADDRTAGLIST:
-         if (temp_struct->tagList != NULL) {
--            strcpy(string, temp_struct->tagList);
-+            strlcpy(string, temp_struct->tagList, sizeof(string));
-             *var_len = strlen(string);
-             return (unsigned char *) string;
-         } else {
-@@ -870,7 +861,7 @@ var_snmpTargetAddrEntry(struct variable * vp,
-     case SNMPTARGETADDRPARAMS:
-         if (temp_struct->params == NULL)
-             return NULL;
--        strcpy(string, temp_struct->params);
-+        strlcpy(string, temp_struct->params, sizeof(string));
-         *var_len = strlen(string);
-         return (unsigned char *) string;
- 
-@@ -1342,7 +1333,7 @@ write_snmpTargetAddrParams(int action,
-             }
- 
-             old_params = target->params;
--            target->params = (char*)malloc(var_val_len + 1);
-+            target->params = malloc(var_val_len + 1);
-             if (target->params == NULL) {
-                 return SNMP_ERR_RESOURCEUNAVAILABLE;
-             }
-diff --git a/agent/mibgroup/target/snmpTargetParamsEntry.c b/agent/mibgroup/target/snmpTargetParamsEntry.c
-index 3a796c8..eed43f0 100644
---- a/agent/mibgroup/target/snmpTargetParamsEntry.c
-+++ b/agent/mibgroup/target/snmpTargetParamsEntry.c
-@@ -319,9 +319,7 @@ snmpTargetParams_addParamName(struct targetParamTable_struct *entry,
-                         "ERROR snmpTargetParamsEntry: param name out of range in config string\n"));
-             return (0);
-         }
--        entry->paramName = (char *) malloc(len + 1);
--        strncpy(entry->paramName, cptr, len);
--        entry->paramName[len] = '\0';
-+        entry->paramName = strdup(cptr);
-     }
-     return (1);
- }
-@@ -382,16 +380,12 @@ int
- snmpTargetParams_addSecName(struct targetParamTable_struct *entry,
-                             char *cptr)
- {
--    size_t          len;
-     if (cptr == NULL) {
-         DEBUGMSGTL(("snmpTargetParamsEntry",
-                     "ERROR snmpTargetParamsEntry: no security name in config string\n"));
-         return (0);
-     } else {
--        len = strlen(cptr);
--        entry->secName = (char *) malloc(len + 1);
--        strncpy(entry->secName, cptr, len);
--        entry->secName[len] = '\0';
-+        entry->secName = strdup(cptr);
-     }
-     return (1);
- }                               /* snmpTargetParams_addSecName  */
-diff --git a/agent/mibgroup/target/snmpTargetParamsEntry.h b/agent/mibgroup/target/snmpTargetParamsEntry.h
-index 2bd6e25..bd30582 100644
---- a/agent/mibgroup/target/snmpTargetParamsEntry.h
-+++ b/agent/mibgroup/target/snmpTargetParamsEntry.h
-@@ -47,6 +47,7 @@
-                                                 targetParamTable_struct
-                                                 *newEntry);
-        struct targetParamTable_struct *snmpTargetParamTable_create(void);
-+       void snmpTargetParamTable_dispose(struct targetParamTable_struct *);
-  
-   /*
-    * function definitions 
-diff --git a/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c b/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
-index ec0cbf0..9a5b466 100644
---- a/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
-+++ b/agent/mibgroup/tcp-mib/data_access/tcpConn_linux.c
-@@ -291,7 +291,7 @@ _load6(netsnmp_container *container, u_int load_flags)
-      */
-     while (fgets(line, sizeof(line), in)) {
-         netsnmp_tcpconn_entry *entry;
--        int             state, rc, local_port, remote_port, tmp_state;
-+        int             state, local_port, remote_port, tmp_state;
-         unsigned long long  inode;
-         size_t          buf_len, offset;
-         char            local_addr[48], remote_addr[48];
-diff --git a/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c b/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c
-index f8df440..5493ff9 100644
---- a/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c
-+++ b/agent/mibgroup/tlstm-mib/snmpTlstmAddrTable/snmpTlstmAddrTable.c
-@@ -1415,8 +1415,7 @@ _tlstmAddrTable_row_restore_mib(const char *token, char *buf)
-         addr->hashType = hashType;
-         addr->flags = TLSTM_ADDR_FROM_MIB | TLSTM_ADDR_NONVOLATILE;
- 
--        if (netsnmp_tlstmAddr_add(addr) != 0)
--            netsnmp_tlstmAddr_free(addr);
-+        netsnmp_tlstmAddr_add(addr);
-     }
-     else {
-         netsnmp_tdata_row     *row;
-diff --git a/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c b/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c
-index 7027114..cd54452 100644
---- a/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c
-+++ b/agent/mibgroup/tlstm-mib/snmpTlstmParamsTable/snmpTlstmParamsTable.c
-@@ -1275,7 +1275,7 @@ _tlstmParamsTable_row_restore_mib(const char *token, char *buf)
-         entry = row->data;
-         
-         entry->hashType = params->hashType;
--        strncpy(entry->snmpTlstmParamsClientFingerprint,params->fingerprint,
-+        strlcpy(entry->snmpTlstmParamsClientFingerprint, params->fingerprint,
-                 sizeof(entry->snmpTlstmParamsClientFingerprint));
-         entry->snmpTlstmParamsClientFingerprint_len =
-             strlen(entry->snmpTlstmParamsClientFingerprint);
-diff --git a/agent/mibgroup/ucd-snmp/disk.c b/agent/mibgroup/ucd-snmp/disk.c
-index 70f67f5..324fbc4 100644
---- a/agent/mibgroup/ucd-snmp/disk.c
-+++ b/agent/mibgroup/ucd-snmp/disk.c
-@@ -409,9 +409,8 @@ add_device(char *path, char *device, int minspace, int minpercent, int override)
-     /* add if and only if the device was found */
-     if(device[0] != 0) {
-       /* The following buffers are cleared above, no need to add '\0' */
--      strncpy(disks[numdisks].path, path, sizeof(disks[numdisks].path) - 1);
--      strncpy(disks[numdisks].device, device,
--              sizeof(disks[numdisks].device) - 1);
-+      strlcpy(disks[numdisks].path, path, sizeof(disks[numdisks].path));
-+      strlcpy(disks[numdisks].device, device, sizeof(disks[numdisks].device));
-       disks[numdisks].minimumspace = minspace;
-       disks[numdisks].minpercent   = minpercent;
-       numdisks++;  
-@@ -595,8 +594,7 @@ find_device(char *path)
-   }
-   while (mntfp && NULL != (mntent = getmntent(mntfp)))
-     if (strcmp(path, mntent->mnt_dir) == 0) {
--      strncpy(device, mntent->mnt_fsname, sizeof(device));
--      device[sizeof(device) - 1] = '\0';
-+      strlcpy(device, mntent->mnt_fsname, sizeof(device));
-       DEBUGMSGTL(("ucd-snmp/disk", "Disk:  %s\n",
- 		  mntent->mnt_fsname));
-       break;
-@@ -620,18 +618,14 @@ find_device(char *path)
- 		  path, mnttab.mnt_mountp));
-     }
-   fclose(mntfp);
--  if (i == 0) {
--    strncpy(device, mnttab.mnt_special, sizeof(device));
--    device[sizeof(device) - 1] = '\0';
--  }
-+  if (i == 0)
-+    strlcpy(device, mnttab.mnt_special, sizeof(device));
- #endif /* HAVE_SETMNTENT */
- #elif HAVE_FSTAB_H
-   stat(path, &stat1);
-   setfsent();
--  if ((fstab = getfsfile(path))) {
--    strncpy(device, fstab->fs_spec, sizeof(device));
--    device[sizeof(device) - 1] = '\0';
--  }
-+  if ((fstab = getfsfile(path)))
-+    strlcpy(device, fstab->fs_spec, sizeof(device));
-   endfsent();
-   if (device[0] != '\0') {
-      /*
-@@ -641,8 +635,7 @@ find_device(char *path)
- 
- #elif HAVE_STATFS
-   if (statfs(path, &statf) == 0) {
--    strncpy(device, statf.f_mntfromname, sizeof(device) - 1);
--    device[sizeof(device) - 1] = '\0';
-+    strlcpy(device, statf.f_mntfromname, sizeof(device));
-     DEBUGMSGTL(("ucd-snmp/disk", "Disk:  %s\n",
- 		statf.f_mntfromname));
-   }
-diff --git a/agent/mibgroup/ucd-snmp/disk_hw.c b/agent/mibgroup/ucd-snmp/disk_hw.c
-index 6fb9418..ba26479 100644
---- a/agent/mibgroup/ucd-snmp/disk_hw.c
-+++ b/agent/mibgroup/ucd-snmp/disk_hw.c
-@@ -1,5 +1,5 @@
- /*
-- * disk.c
-+ * disk_hw.c
-  */
- 
- #include <net-snmp/net-snmp-config.h>
-@@ -137,6 +137,7 @@ disk_free_config(void)
-   if (disks) {
-      free( disks );
-      disks = NULL;
-+     maxdisks = numdisks = 0;
-   }
-   allDisksIncluded = 0;
- }
-@@ -321,7 +322,7 @@ tryAgain:
- 
-     switch (vp->magic) {
-     case MIBINDEX:
--        long_ret = disknum;
-+        long_ret = disknum + 1;
-         return ((u_char *) (&long_ret));
-     case ERRORNAME:            /* DISKPATH */
-         *var_len = strlen(entry->path);
-diff --git a/agent/mibgroup/ucd-snmp/diskio.c b/agent/mibgroup/ucd-snmp/diskio.c
-index 769a365..4d6d05c 100644
---- a/agent/mibgroup/ucd-snmp/diskio.c
-+++ b/agent/mibgroup/ucd-snmp/diskio.c
-@@ -502,7 +502,8 @@ getstats(void)
- {
-     time_t          now;
-     char           *t, *tp;
--    int             size, dkn_size, i;
-+    size_t          size, dkn_size;
-+    int             i;
- 
-     now = time(NULL);
-     if (cache_time + CACHE_TIMEOUT > now) {
-@@ -526,6 +527,7 @@ getstats(void)
-         if (ndisk == 0)
-             return 0;
-         dkname = malloc(ndisk * sizeof(char *));
-+        dkn_size = 0;
-         if (sysctl(nmib, 2, NULL, &dkn_size, NULL, 0) < 0) {
-             perror("Can't get size of HW_DISKNAMES mib");
-             return 0;
-diff --git a/agent/mibgroup/ucd-snmp/dlmod.c b/agent/mibgroup/ucd-snmp/dlmod.c
-index eecd38f..e9742f2 100644
---- a/agent/mibgroup/ucd-snmp/dlmod.c
-+++ b/agent/mibgroup/ucd-snmp/dlmod.c
-@@ -18,8 +18,6 @@
- #include <net-snmp/net-snmp-includes.h>
- #include <net-snmp/agent/net-snmp-agent-includes.h>
- 
--#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
--
- #include <dlfcn.h>
- #include "dlmod.h"
- 
-@@ -124,7 +122,7 @@ dlmod_load_module(struct dlmod *dlm)
-                 dlm->status = DLMOD_ERROR;
-             }
-         }
--        strncpy(dlm->path, tmp_path, sizeof(dlm->path));
-+        strlcpy(dlm->path, tmp_path, sizeof(dlm->path));
-         if (dlm->status == DLMOD_ERROR)
-             return;
-     }
-@@ -219,16 +217,16 @@ dlmod_parse_config(const char *token, char *cptr)
-         dlmod_delete_module(dlm);
-         return;
-     }
--    strncpy(dlm->name, dlm_name, sizeof(dlm->name));
-+    strlcpy(dlm->name, dlm_name, sizeof(dlm->name));
- 
-     /*
-      * dynamic module path
-      */
-     dlm_path = strtok_r(NULL, "\t ", &st);
-     if (dlm_path)
--        strncpy(dlm->path, dlm_path, sizeof(dlm->path));
-+        strlcpy(dlm->path, dlm_path, sizeof(dlm->path));
-     else
--        strncpy(dlm->path, dlm_name, sizeof(dlm->path));
-+        strlcpy(dlm->path, dlm_name, sizeof(dlm->path));
- 
-     dlmod_load_module(dlm);
- 
-@@ -573,9 +571,6 @@ static oid dlmod_variables_oid[] = { 1, 3, 6, 1, 4, 1, 2021, 13, 14 };
- void
- init_dlmod(void)
- {
--    char           *p;
--    int             len;
--
-     REGISTER_MIB("dlmod", dlmod_variables, variable4, dlmod_variables_oid);
- 
-     /*
-@@ -588,20 +583,23 @@ init_dlmod(void)
-                                   dlmod_free_config,
-                                   "module-name module-path");
- 
--    p = getenv("SNMPDLMODPATH");
--    strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path));
--    dlmod_path[ sizeof(dlmod_path)-1 ] = 0;
--    if (p) {
--        if (p[0] == ':') {
--            len = strlen(dlmod_path);
--            if (dlmod_path[len - 1] != ':') {
--                strncat(dlmod_path, ":", sizeof(dlmod_path) - len -1);
--                len++;
--            }
--            strncat(dlmod_path, p + 1,   sizeof(dlmod_path) - len);
--        } else
--            strncpy(dlmod_path, p, sizeof(dlmod_path));
-+    {
-+        const char * const p = getenv("SNMPDLMODPATH");
-+        strncpy(dlmod_path, SNMPDLMODPATH, sizeof(dlmod_path));
-+        dlmod_path[ sizeof(dlmod_path) - 1 ] = 0;
-+        if (p) {
-+            if (p[0] == ':') {
-+                int len = strlen(dlmod_path);
-+                if (dlmod_path[len - 1] != ':') {
-+                    strncat(dlmod_path, ":", sizeof(dlmod_path) - len - 1);
-+                    len++;
-+                }
-+                strncat(dlmod_path, p + 1,   sizeof(dlmod_path) - len);
-+            } else
-+                strncpy(dlmod_path, p, sizeof(dlmod_path));
-+        }
-     }
-+
-     dlmod_path[ sizeof(dlmod_path)-1 ] = 0;
-     DEBUGMSGTL(("dlmod", "dlmod_path: %s\n", dlmod_path));
- }
-@@ -614,19 +612,3 @@ shutdown_dlmod(void)
-     snmpd_unregister_config_handler("dlmod");
-     unregister_mib(dlmod_variables_oid, OID_LENGTH(dlmod_variables_oid));
- }
--
--#else                           /* no dlopen support */
--
--void
--init_dlmod(void)
--{
--    DEBUGMSGTL(("dlmod",
--                "Dynamic modules not support on this platform\n"));
--}
--
--void
--shutdown_dlmod(void)
--{
--}
--
--#endif
-diff --git a/agent/mibgroup/ucd-snmp/dlmod.h b/agent/mibgroup/ucd-snmp/dlmod.h
-index 79d960b..df8bef7 100644
---- a/agent/mibgroup/ucd-snmp/dlmod.h
-+++ b/agent/mibgroup/ucd-snmp/dlmod.h
-@@ -6,6 +6,10 @@
- #ifndef MIBGROUP_DLMOD_H
- #define MIBGROUP_DLMOD_H
- 
-+#if !defined(HAVE_DLFCN_H) || !defined(HAVE_DLOPEN)
-+config_error(Dynamic modules not supported on this platform)
-+#endif
-+
- config_add_mib(UCD-DLMOD-MIB)
- 
- void init_dlmod(void);
-diff --git a/agent/mibgroup/ucd-snmp/errormib.c b/agent/mibgroup/ucd-snmp/errormib.c
-index cbdd25b..7f3bcb1 100644
---- a/agent/mibgroup/ucd-snmp/errormib.c
-+++ b/agent/mibgroup/ucd-snmp/errormib.c
-@@ -137,8 +137,7 @@ seterrorstatus(const char *to, int prior)
- {
-     if (errorstatusprior <= prior ||
-         (NETSNMP_ERRORTIMELENGTH < (time(NULL) - errorstatustime))) {
--        strncpy(errorstring, to, sizeof(errorstring));
--        errorstring[ sizeof(errorstring)-1 ] = 0;
-+        strlcpy(errorstring, to, sizeof(errorstring));
-         errorstatusprior = prior;
-         errorstatustime = time(NULL);
-     }
-@@ -219,8 +218,7 @@ var_extensible_errors(struct variable *vp,
-         return ((u_char *) (&long_ret));
-     case ERRORMSG:
-         if ((NETSNMP_ERRORTIMELENGTH >= time(NULL) - errorstatustime) ? 1 : 0) {
--            strncpy(errmsg, errorstring, sizeof(errmsg));
--            errmsg[ sizeof(errmsg)-1 ] = 0;
-+            strlcpy(errmsg, errorstring, sizeof(errmsg));
-         } else
-             errmsg[0] = 0;
-         *var_len = strlen(errmsg);
-diff --git a/agent/mibgroup/ucd-snmp/extensible.c b/agent/mibgroup/ucd-snmp/extensible.c
-index edea93a..d1752ef 100644
---- a/agent/mibgroup/ucd-snmp/extensible.c
-+++ b/agent/mibgroup/ucd-snmp/extensible.c
-@@ -262,8 +262,7 @@ extensible_parse_config(const char *token, char *cptr)
-         for (tcptr = cptr; *tcptr != 0 && *tcptr != '#'; tcptr++)
-             if (*tcptr == ';' && ptmp->type == EXECPROC)
-                 break;
--        strncpy(ptmp->command, cptr, tcptr - cptr);
--        ptmp->command[tcptr - cptr] = 0;
-+        sprintf(ptmp->command, "%.*s", (int) (tcptr - cptr), cptr);
-     }
- #ifdef NETSNMP_EXECFIXCMD
-     sprintf(ptmp->fixcmd, NETSNMP_EXECFIXCMD, ptmp->name);
-@@ -419,8 +418,7 @@ execfix_parse_config(const char *token, char *cptr)
-         return;
-     }
- 
--    strncpy(execp->fixcmd, cptr, sizeof(execp->fixcmd));
--    execp->fixcmd[ sizeof(execp->fixcmd)-1 ] = 0;
-+    strlcpy(execp->fixcmd, cptr, sizeof(execp->fixcmd));
- }
- 
- u_char         *
-@@ -623,8 +621,7 @@ var_extensible_relocatable(struct variable *vp,
-         cp = strchr(cp1, '\n');
-         if (cp)
-             *cp = 0;
--        strncpy(errmsg, cp1, sizeof(errmsg));
--        errmsg[ sizeof(errmsg)-1 ] = 0;
-+        strlcpy(errmsg, cp1, sizeof(errmsg));
-         *var_len = strlen(errmsg);
-         if (errmsg[*var_len - 1] == '\n')
-             errmsg[--(*var_len)] = '\0';
-diff --git a/agent/mibgroup/ucd-snmp/lmSensors.c b/agent/mibgroup/ucd-snmp/lmSensors.c
-index d6436bf..05c60b7 100644
---- a/agent/mibgroup/ucd-snmp/lmSensors.c
-+++ b/agent/mibgroup/ucd-snmp/lmSensors.c
-@@ -331,7 +331,7 @@ var_lmSensorsTable(struct variable *vp,
-     case LMFANSENSORSDEVICE:
-     case LMVOLTSENSORSDEVICE:
-     case LMMISCSENSORSDEVICE:
--        strncpy(string, s.name, SPRINT_MAX_LEN - 1);
-+        strlcpy(string, s.name, sizeof(string));
-         *var_len = strlen(string);
-         ret = (unsigned char *) string;
-         goto leaving;
-@@ -891,32 +891,32 @@ else{
-                    DEBUGMSG(("ucd-snmp/lmSensors", "front panel value %d\n",enc_info->value));
-                    typ = 3; /* misc */
-                    sensor_array[typ].sensor[other].value = enc_info->value;
--                   strncpy(sensor_array[typ].sensor[other].name,"FSP",MAX_NAME-1);
--                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */
-+                   strlcpy(sensor_array[typ].sensor[other].name, "FSP",
-+                           MAX_NAME);
-                    other++;
-                    break;
-                case ENVCTRL_ENCL_AMBTEMPR:
-                    DEBUGMSG(("ucd-snmp/lmSensors", "ambient temp mC %d\n",enc_info->value*1000));
-                    typ = 0; /* temperature sensor */
-                    sensor_array[typ].sensor[temp].value = enc_info->value*1000;
--                   strncpy(sensor_array[typ].sensor[temp].name,"Ambient",MAX_NAME-1);
--                   sensor_array[typ].sensor[temp].name[MAX_NAME-1]='\0'; /* null terminate */
-+                   strlcpy(sensor_array[typ].sensor[temp].name, "Ambient",
-+                           MAX_NAME);
-                    temp++;
-                    break;
-                case ENVCTRL_ENCL_BACKPLANE4:
-                    DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane4\n"));
-                    typ = 3; /* misc */
-                    sensor_array[typ].sensor[other].value = enc_info->value;
--                   strncpy(sensor_array[typ].sensor[other].name,"Backplane4",MAX_NAME-1);
--                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */
-+                   strlcpy(sensor_array[typ].sensor[other].name, "Backplane4",
-+                           MAX_NAME);
-                    other++;
-                    break;
-                case ENVCTRL_ENCL_BACKPLANE8:
-                    DEBUGMSG(("ucd-snmp/lmSensors", "There is a backplane8\n"));
-                    typ = 3; /* misc */
-                    sensor_array[typ].sensor[other].value = enc_info->value;
--                   strncpy(sensor_array[typ].sensor[other].name,"Backplane8",MAX_NAME-1);
--                   sensor_array[typ].sensor[other].name[MAX_NAME-1]='\0'; /* null terminate */
-+                   strlcpy(sensor_array[typ].sensor[other].name, "Backplane8",
-+                           MAX_NAME);
-                    other++;
-                    break;
-                case ENVCTRL_ENCL_CPUTEMPR:
-@@ -1029,7 +1029,7 @@ else{
-                     array->current_len = new_size / sizeof(_sensor);
-                     DEBUGMSG(("ucd-snmp/lmSensors", "type #%d increased to %d elements\n", type, (int)array->current_len));
-                 } /* end if array->current */
--                strncpy(array->sensor[array->n].name, label, MAX_NAME);
-+                strlcpy(array->sensor[array->n].name, label, MAX_NAME);
-                 array->sensor[array->n].value = (int) (val * mul);
-                 DEBUGMSGTL(("sensors","sensor %s, value %d\n",
-                             array->sensor[array->n].name,
-diff --git a/agent/mibgroup/ucd-snmp/loadave.c b/agent/mibgroup/ucd-snmp/loadave.c
-index 2321d29..6efc5e9 100644
---- a/agent/mibgroup/ucd-snmp/loadave.c
-+++ b/agent/mibgroup/ucd-snmp/loadave.c
-@@ -393,8 +393,7 @@ write_laConfig(int action,
-             double val;
-             char *endp;
- 
--            strncpy(buf, (char *)var_val, var_val_len);
--            buf[var_val_len] = '\0';
-+            sprintf(buf, "%.*s", (int) var_val_len, (char *)var_val);
-             val = strtod(buf, &endp);
- 
-             if (errno == ERANGE || *endp != '\0' || val < 0 || val > 65536.00) {
-@@ -481,10 +480,12 @@ var_extensible_loadave(struct variable * vp,
-         if (maxload[name[*length - 1] - 1] != 0 &&
-             avenrun[name[*length - 1] - 1] >=
-             maxload[name[*length - 1] - 1]) {
--            sprintf(errmsg, "%d min Load Average too high (= %.2f)",
-+            snprintf(errmsg, sizeof(errmsg),
-+                     "%d min Load Average too high (= %.2f)",
-                     (name[*length - 1] ==
-                      1) ? 1 : ((name[*length - 1] == 2) ? 5 : 15),
-                     avenrun[name[*length - 1] - 1]);
-+            errmsg[sizeof(errmsg) - 1] = '\0';
-         } else {
-             errmsg[0] = 0;
-         }
-diff --git a/agent/mibgroup/ucd-snmp/logmatch.c b/agent/mibgroup/ucd-snmp/logmatch.c
-index eb21a68..abca5ce 100644
---- a/agent/mibgroup/ucd-snmp/logmatch.c
-+++ b/agent/mibgroup/ucd-snmp/logmatch.c
-@@ -110,7 +110,6 @@ static void
- updateLogmatch(int iindex)
- {
- 
--    regmatch_t      myMatch;
-     int             matchResultCode;
-     char            inbuf[1024];
-     char            perfilename[1024];
-@@ -288,7 +287,7 @@ updateLogmatch(int iindex)
- 
-                 matchResultCode =
-                     regexec(&(logmatchTable[iindex].regexBuffer),
--                            inbuf, 0, &myMatch, REG_NOTEOL);
-+                            inbuf, 0, NULL, REG_NOTEOL);
- 
-                 if (matchResultCode == 0) {
-                     logmatchTable[iindex].globalMatchCounter++;
-diff --git a/agent/mibgroup/ucd-snmp/pass.c b/agent/mibgroup/ucd-snmp/pass.c
-index 4440baa..ac14b41 100644
---- a/agent/mibgroup/ucd-snmp/pass.c
-+++ b/agent/mibgroup/ucd-snmp/pass.c
-@@ -33,6 +33,7 @@
- 
- #include "struct.h"
- #include "pass.h"
-+#include "pass_common.h"
- #include "extensible.h"
- #include "util_funcs.h"
- 
-@@ -55,152 +56,6 @@ struct variable2 extensible_passthru_variables[] = {
- 
- 
- 
--/*
-- * lexicographical compare two object identifiers.
-- * * Returns -1 if name1 < name2,
-- * *          0 if name1 = name2,
-- * *          1 if name1 > name2
-- * *
-- * * This method differs from snmp_oid_compare
-- * * in that the comparison stops at the length
-- * * of the smallest object identifier.
-- */
--int
--snmp_oid_min_compare(const oid * in_name1,
--                     size_t len1, const oid * in_name2, size_t len2)
--{
--    register int    len;
--    register const oid *name1 = in_name1;
--    register const oid *name2 = in_name2;
--
--    /*
--     * len = minimum of len1 and len2 
--     */
--    if (len1 < len2)
--        len = len1;
--    else
--        len = len2;
--    /*
--     * find first non-matching OID 
--     */
--    while (len-- > 0) {
--        /*
--         * these must be done in seperate comparisons, since
--         * subtracting them and using that result has problems with
--         * subids > 2^31. 
--         */
--        if (*(name1) < *(name2))
--            return -1;
--        if (*(name1++) > *(name2++))
--            return 1;
--    }
--    /*
--     * both OIDs equal up to length of shorter OID 
--     */
--
--    return 0;
--}
--
--
--/*
-- * This is also called from pass_persist.c 
-- */
--int
--asc2bin(char *p)
--{
--    char           *r, *q = p;
--    char            c;
--    int             n = 0;
--
--    for (;;) {
--        c = (char) strtol(q, &r, 16);
--        if (r == q)
--            break;
--        *p++ = c;
--        q = r;
--        n++;
--    }
--    return n;
--}
--
--/*
-- * This is also called from pass_persist.c 
-- */
--int
--bin2asc(char *p, size_t n)
--{
--    size_t          i, flag = 0;
--    char            buffer[SNMP_MAXBUF];
--
--    /* prevent buffer overflow */
--    if (n > (sizeof(buffer) - 1))
--        n = sizeof(buffer) - 1;
--
--    for (i = 0; i < n; i++) {
--        buffer[i] = p[i];
--        if (!isprint((unsigned char)(p[i])))
--            flag = 1;
--    }
--    if (flag == 0) {
--        p[n] = 0;
--        return n;
--    }
--    for (i = 0; i < n; i++) {
--        sprintf(p, "%02x ", (unsigned char) (buffer[i] & 0xff));
--        p += 3;
--    }
--    *--p = 0;
--    return 3 * n - 1;
--}
--
--/*
-- * This is also called from pass_persist.c 
-- */
--int
--netsnmp_pass_str_to_errno(const char *buf)
--{
--    if (!strncasecmp(buf, "too-big", 7)) {
--        /* Shouldn't happen */
--        return SNMP_ERR_TOOBIG;
--    } else if (!strncasecmp(buf, "no-such-name", 12)) {
--        return SNMP_ERR_NOSUCHNAME;
--    } else if (!strncasecmp(buf, "bad-value", 9)) {
--        return SNMP_ERR_BADVALUE;
--    } else if (!strncasecmp(buf, "read-only", 9)) {
--        return SNMP_ERR_READONLY;
--    } else if (!strncasecmp(buf, "gen-error", 9)) {
--        return SNMP_ERR_GENERR;
--    } else if (!strncasecmp(buf, "no-access", 9)) {
--        return SNMP_ERR_NOACCESS;
--    } else if (!strncasecmp(buf, "wrong-type", 10)) {
--        return SNMP_ERR_WRONGTYPE;
--    } else if (!strncasecmp(buf, "wrong-length", 12)) {
--        return SNMP_ERR_WRONGLENGTH;
--    } else if (!strncasecmp(buf, "wrong-encoding", 14)) {
--        return SNMP_ERR_WRONGENCODING;
--    } else if (!strncasecmp(buf, "wrong-value", 11)) {
--        return SNMP_ERR_WRONGVALUE;
--    } else if (!strncasecmp(buf, "no-creation", 11)) {
--        return SNMP_ERR_NOCREATION;
--    } else if (!strncasecmp(buf, "inconsistent-value", 18)) {
--        return SNMP_ERR_INCONSISTENTVALUE;
--    } else if (!strncasecmp(buf, "resource-unavailable", 20)) {
--        return SNMP_ERR_RESOURCEUNAVAILABLE;
--    } else if (!strncasecmp(buf, "commit-failed", 13)) {
--        return SNMP_ERR_COMMITFAILED;
--    } else if (!strncasecmp(buf, "undo-failed", 11)) {
--        return SNMP_ERR_UNDOFAILED;
--    } else if (!strncasecmp(buf, "authorization-error", 19)) {
--        return SNMP_ERR_AUTHORIZATIONERROR;
--    } else if (!strncasecmp(buf, "not-writable", 12)) {
--        return SNMP_ERR_NOTWRITABLE;
--    } else if (!strncasecmp(buf, "inconsistent-name", 17)) {
--        return SNMP_ERR_INCONSISTENTNAME;
--    }
--
--    return SNMP_ERR_NOERROR;
--}
--
- void
- init_pass(void)
- {
-@@ -276,11 +131,9 @@ pass_parse_config(const char *token, char *cptr)
-     } else {
-         for (tcptr = cptr; *tcptr != 0 && *tcptr != '#' && *tcptr != ';';
-              tcptr++);
--        strncpy((*ppass)->command, cptr, tcptr - cptr);
--        (*ppass)->command[tcptr - cptr] = 0;
-+        sprintf((*ppass)->command, "%.*s", (int) (tcptr - cptr), cptr);
-     }
--    strncpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
--    (*ppass)->name[ sizeof((*ppass)->name)-1 ] = 0;
-+    strlcpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
-     (*ppass)->next = NULL;
- 
-     register_mib_priority("pass", (struct variable *) extensible_passthru_variables,
-@@ -337,18 +190,14 @@ var_extensible_pass(struct variable *vp,
- {
-     oid             newname[MAX_OID_LEN];
-     int             i, rtest, fd, newlen;
--    static long     long_ret;
--    static in_addr_t addr_ret;
-     char            buf[SNMP_MAXBUF];
-     static char     buf2[SNMP_MAXBUF];
--    static oid      objid[MAX_OID_LEN];
-     struct extensible *passthru;
-     FILE           *file;
- 
--    long_ret = *length;
-     for (i = 1; i <= numpassthrus; i++) {
-         passthru = get_exten_instance(passthrus, i);
--        rtest = snmp_oid_min_compare(name, *length,
-+        rtest = snmp_oidtree_compare(name, *length,
-                                      passthru->miboid, passthru->miblen);
-         if ((exact && rtest == 0) || (!exact && rtest <= 0)) {
-             /*
-@@ -409,89 +258,7 @@ var_extensible_pass(struct variable *vp,
-                 fclose(file);
-                 wait_on_exec(passthru);
- 
--                /*
--                 * buf contains the return type, and buf2 contains the data 
--                 */
--                if (!strncasecmp(buf, "string", 6)) {
--                    buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */
--                    *var_len = strlen(buf2);
--                    vp->type = ASN_OCTET_STR;
--                    return ((unsigned char *) buf2);
--                } 
--                else if (!strncasecmp(buf, "integer64", 9)) {
--                    static struct counter64 c64;
--                    uint64_t v64 = strtoull(buf2, NULL, 10);
--                    c64.high = (unsigned long)(v64 >> 32);
--                    c64.low  = (unsigned long)(v64 & 0xffffffff);
--                    *var_len = sizeof(c64);
--                    vp->type = ASN_INTEGER64;
--                    return ((unsigned char *) &c64);
--                } 
--                else if (!strncasecmp(buf, "integer", 7)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtol(buf2, NULL, 10);
--                    vp->type = ASN_INTEGER;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "unsigned", 8)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_UNSIGNED;
--                    return ((unsigned char *) &long_ret);
--                } 
--                else if (!strncasecmp(buf, "counter64", 9)) {
--                    static struct counter64 c64;
--                    uint64_t v64 = strtoull(buf2, NULL, 10);
--                    c64.high = (unsigned long)(v64 >> 32);
--                    c64.low  = (unsigned long)(v64 & 0xffffffff);
--                    *var_len = sizeof(c64);
--                    vp->type = ASN_COUNTER64;
--                    return ((unsigned char *) &c64);
--                } 
--                else if (!strncasecmp(buf, "counter", 7)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_COUNTER;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "octet", 5)) {
--                    *var_len = asc2bin(buf2);
--                    vp->type = ASN_OCTET_STR;
--                    return ((unsigned char *) buf2);
--                } else if (!strncasecmp(buf, "opaque", 6)) {
--                    *var_len = asc2bin(buf2);
--                    vp->type = ASN_OPAQUE;
--                    return ((unsigned char *) buf2);
--                } else if (!strncasecmp(buf, "gauge", 5)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_GAUGE;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "objectid", 8)) {
--                    newlen = parse_miboid(buf2, objid);
--                    *var_len = newlen * sizeof(oid);
--                    vp->type = ASN_OBJECT_ID;
--                    return ((unsigned char *) objid);
--                } else if (!strncasecmp(buf, "timetick", 8)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_TIMETICKS;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "ipaddress", 9)) {
--                    newlen = parse_miboid(buf2, objid);
--                    if (newlen != 4) {
--                        snmp_log(LOG_ERR,
--                                 "invalid ipaddress returned:  %s\n",
--                                 buf2);
--                        *var_len = 0;
--                        return (NULL);
--                    }
--                    addr_ret =
--                        (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) +
--                        (objid[2] << 8) + objid[3];
--                    addr_ret = htonl(addr_ret);
--                    *var_len = sizeof(addr_ret);
--                    vp->type = ASN_IPADDRESS;
--                    return ((unsigned char *) &addr_ret);
--                }
-+                return netsnmp_internal_pass_parse(buf, buf2, var_len, vp);
-             }
-             *var_len = 0;
-             return (NULL);
-@@ -504,21 +271,16 @@ var_extensible_pass(struct variable *vp,
- }
- 
- int
--setPass(int action,
--        u_char * var_val,
--        u_char var_val_type,
-+setPass(int action, u_char * var_val, u_char var_val_type,
-         size_t var_val_len, u_char * statP, oid * name, size_t name_len)
- {
-     int             i, rtest;
-     struct extensible *passthru;
--
-     char            buf[SNMP_MAXBUF], buf2[SNMP_MAXBUF];
--    long            tmp;
--    unsigned long   utmp;
- 
-     for (i = 1; i <= numpassthrus; i++) {
-         passthru = get_exten_instance(passthrus, i);
--        rtest = snmp_oid_min_compare(name, name_len,
-+        rtest = snmp_oidtree_compare(name, name_len,
-                                      passthru->miboid, passthru->miblen);
-         if (rtest <= 0) {
-             if (action != ACTION)
-@@ -533,60 +295,14 @@ setPass(int action,
-             snprintf(passthru->command, sizeof(passthru->command),
-                      "%s -s %s ", passthru->name, buf);
-             passthru->command[ sizeof(passthru->command)-1 ] = 0;
--            switch (var_val_type) {
--            case ASN_INTEGER:
--            case ASN_COUNTER:
--            case ASN_GAUGE:
--            case ASN_TIMETICKS:
--                tmp = *((long *) var_val);
--                switch (var_val_type) {
--                case ASN_INTEGER:
--                    sprintf(buf, "integer %d\n", (int) tmp);
--                    break;
--                case ASN_COUNTER:
--                    sprintf(buf, "counter %d\n", (int) tmp);
--                    break;
--                case ASN_GAUGE:
--                    sprintf(buf, "gauge %d\n", (int) tmp);
--                    break;
--                case ASN_TIMETICKS:
--                    sprintf(buf, "timeticks %d\n", (int) tmp);
--                    break;
--                }
--                break;
--            case ASN_IPADDRESS:
--                utmp = *((u_long *) var_val);
--                utmp = ntohl(utmp);
--                sprintf(buf, "ipaddress %d.%d.%d.%d\n",
--                        (int) ((utmp & 0xff000000) >> (8 * 3)),
--                        (int) ((utmp & 0xff0000) >> (8 * 2)),
--                        (int) ((utmp & 0xff00) >> (8)),
--                        (int) ((utmp & 0xff)));
--                break;
--            case ASN_OCTET_STR:
--                memcpy(buf2, var_val, var_val_len);
--                if (var_val_len == 0)
--                    sprintf(buf, "string \"\"\n");
--                else if (bin2asc(buf2, var_val_len) == (int) var_val_len)
--                    snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2);
--                else
--                    snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2);
--                buf[ sizeof(buf)-1 ] = 0;
--                break;
--            case ASN_OBJECT_ID:
--                sprint_mib_oid(buf2, (oid *) var_val, var_val_len/sizeof(oid));
--                snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2);
--                buf[ sizeof(buf)-1 ] = 0;
--                break;
--            }
--            strncat(passthru->command, buf, sizeof(passthru->command)-strlen(passthru->command)-1);
--            passthru->command[ sizeof(passthru->command)-1 ] = 0;
-+            netsnmp_internal_pass_set_format(buf, var_val, var_val_type, var_val_len);
-+            strlcat(passthru->command, buf, sizeof(passthru->command));
-             DEBUGMSGTL(("ucd-snmp/pass", "pass-running:  %s",
-                         passthru->command));
-             exec_command(passthru);
-             DEBUGMSGTL(("ucd-snmp/pass", "pass-running returned: %s",
-                         passthru->output));
--            return netsnmp_pass_str_to_errno(passthru->output);
-+            return netsnmp_internal_pass_str_to_errno(passthru->output);
-         }
-     }
-     if (snmp_get_do_debugging()) {
-diff --git a/agent/mibgroup/ucd-snmp/pass.h b/agent/mibgroup/ucd-snmp/pass.h
-index 089c9ca..51c0689 100644
---- a/agent/mibgroup/ucd-snmp/pass.h
-+++ b/agent/mibgroup/ucd-snmp/pass.h
-@@ -6,7 +6,9 @@
- 
- void            init_pass(void);
- 
-+config_require(ucd-snmp/pass_common)
- config_require(util_funcs)
-+config_require(utilities/execute)
- config_add_mib(NET-SNMP-PASS-MIB)
- 
- extern FindVarMethod var_extensible_pass;
-diff --git a/agent/mibgroup/ucd-snmp/pass_common.c b/agent/mibgroup/ucd-snmp/pass_common.c
-new file mode 100644
-index 0000000..38a0443
---- /dev/null
-+++ b/agent/mibgroup/ucd-snmp/pass_common.c
-@@ -0,0 +1,264 @@
-+#include <net-snmp/net-snmp-config.h>
-+
-+#include <ctype.h>
-+#if HAVE_STDDEF_H
-+#include <stddef.h>
-+#endif
-+#include <stdio.h>
-+#if HAVE_STRING_H
-+#include <string.h>
-+#else
-+#include <strings.h>
-+#endif
-+
-+#include <net-snmp/net-snmp-includes.h>
-+#include <net-snmp/agent/net-snmp-agent-includes.h>
-+#include "mibgroup/util_funcs.h"
-+#include "pass_common.h"
-+
-+static int
-+netsnmp_internal_asc2bin(char *p)
-+{
-+    char           *r, *q = p;
-+    char            c;
-+    int             n = 0;
-+
-+    for (;;) {
-+        c = (char) strtol(q, &r, 16);
-+        if (r == q)
-+            break;
-+        *p++ = c;
-+        q = r;
-+        n++;
-+    }
-+    return n;
-+}
-+
-+static int
-+netsnmp_internal_bin2asc(char *p, size_t n)
-+{
-+    int             i, flag = 0;
-+    char            buffer[SNMP_MAXBUF];
-+
-+    /* prevent buffer overflow */
-+    if ((int)n > (sizeof(buffer) - 1))
-+        n = sizeof(buffer) - 1;
-+
-+    for (i = 0; i < (int) n; i++) {
-+        buffer[i] = p[i];
-+        if (!isprint((unsigned char) (p[i])))
-+            flag = 1;
-+    }
-+    if (flag == 0) {
-+        p[n] = 0;
-+        return n;
-+    }
-+    for (i = 0; i < (int) n; i++) {
-+        sprintf(p, "%02x ", (unsigned char) (buffer[i] & 0xff));
-+        p += 3;
-+    }
-+    *--p = 0;
-+    return 3 * n - 1;
-+}
-+
-+int
-+netsnmp_internal_pass_str_to_errno(const char *buf)
-+{
-+    if (!strncasecmp(buf, "too-big", 7)) {
-+        /* Shouldn't happen */
-+        return SNMP_ERR_TOOBIG;
-+    } else if (!strncasecmp(buf, "no-such-name", 12)) {
-+        return SNMP_ERR_NOSUCHNAME;
-+    } else if (!strncasecmp(buf, "bad-value", 9)) {
-+        return SNMP_ERR_BADVALUE;
-+    } else if (!strncasecmp(buf, "read-only", 9)) {
-+        return SNMP_ERR_READONLY;
-+    } else if (!strncasecmp(buf, "gen-error", 9)) {
-+        return SNMP_ERR_GENERR;
-+    } else if (!strncasecmp(buf, "no-access", 9)) {
-+        return SNMP_ERR_NOACCESS;
-+    } else if (!strncasecmp(buf, "wrong-type", 10)) {
-+        return SNMP_ERR_WRONGTYPE;
-+    } else if (!strncasecmp(buf, "wrong-length", 12)) {
-+        return SNMP_ERR_WRONGLENGTH;
-+    } else if (!strncasecmp(buf, "wrong-encoding", 14)) {
-+        return SNMP_ERR_WRONGENCODING;
-+    } else if (!strncasecmp(buf, "wrong-value", 11)) {
-+        return SNMP_ERR_WRONGVALUE;
-+    } else if (!strncasecmp(buf, "no-creation", 11)) {
-+        return SNMP_ERR_NOCREATION;
-+    } else if (!strncasecmp(buf, "inconsistent-value", 18)) {
-+        return SNMP_ERR_INCONSISTENTVALUE;
-+    } else if (!strncasecmp(buf, "resource-unavailable", 20)) {
-+        return SNMP_ERR_RESOURCEUNAVAILABLE;
-+    } else if (!strncasecmp(buf, "commit-failed", 13)) {
-+        return SNMP_ERR_COMMITFAILED;
-+    } else if (!strncasecmp(buf, "undo-failed", 11)) {
-+        return SNMP_ERR_UNDOFAILED;
-+    } else if (!strncasecmp(buf, "authorization-error", 19)) {
-+        return SNMP_ERR_AUTHORIZATIONERROR;
-+    } else if (!strncasecmp(buf, "not-writable", 12)) {
-+        return SNMP_ERR_NOTWRITABLE;
-+    } else if (!strncasecmp(buf, "inconsistent-name", 17)) {
-+        return SNMP_ERR_INCONSISTENTNAME;
-+    }
-+
-+    return SNMP_ERR_NOERROR;
-+}
-+
-+unsigned char *
-+netsnmp_internal_pass_parse(char * buf,
-+                            char * buf2,
-+                            size_t * var_len,
-+                            struct variable *vp)
-+{
-+    static long     long_ret;
-+    static in_addr_t addr_ret;
-+    int             newlen;
-+    static oid      objid[MAX_OID_LEN];
-+
-+    /*
-+     * buf contains the return type, and buf2 contains the data
-+     */
-+    if (!strncasecmp(buf, "string", 6)) {
-+        buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */
-+        *var_len = strlen(buf2);
-+        vp->type = ASN_OCTET_STR;
-+        return ((unsigned char *) buf2);
-+    }
-+#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
-+    else if (!strncasecmp(buf, "integer64", 9)) {
-+        static struct counter64 c64;
-+        uint64_t v64 = strtoull(buf2, NULL, 10);
-+        c64.high = (unsigned long)(v64 >> 32);
-+        c64.low  = (unsigned long)(v64 & 0xffffffff);
-+        *var_len = sizeof(c64);
-+        vp->type = ASN_INTEGER64;
-+        return ((unsigned char *) &c64);
-+    }
-+#endif
-+    else if (!strncasecmp(buf, "integer", 7)) {
-+        *var_len = sizeof(long_ret);
-+        long_ret = strtol(buf2, NULL, 10);
-+        vp->type = ASN_INTEGER;
-+        return ((unsigned char *) &long_ret);
-+    } else if (!strncasecmp(buf, "unsigned", 8)) {
-+        *var_len = sizeof(long_ret);
-+        long_ret = strtoul(buf2, NULL, 10);
-+        vp->type = ASN_UNSIGNED;
-+        return ((unsigned char *) &long_ret);
-+    }
-+    else if (!strncasecmp(buf, "counter64", 9)) {
-+        static struct counter64 c64;
-+        uint64_t v64 = strtoull(buf2, NULL, 10);
-+        c64.high = (unsigned long)(v64 >> 32);
-+        c64.low  = (unsigned long)(v64 & 0xffffffff);
-+        *var_len = sizeof(c64);
-+        vp->type = ASN_COUNTER64;
-+        return ((unsigned char *) &c64);
-+    }
-+    else if (!strncasecmp(buf, "counter", 7)) {
-+        *var_len = sizeof(long_ret);
-+        long_ret = strtoul(buf2, NULL, 10);
-+        vp->type = ASN_COUNTER;
-+        return ((unsigned char *) &long_ret);
-+    } else if (!strncasecmp(buf, "octet", 5)) {
-+        *var_len = netsnmp_internal_asc2bin(buf2);
-+        vp->type = ASN_OCTET_STR;
-+        return ((unsigned char *) buf2);
-+    } else if (!strncasecmp(buf, "opaque", 6)) {
-+        *var_len = netsnmp_internal_asc2bin(buf2);
-+        vp->type = ASN_OPAQUE;
-+        return ((unsigned char *) buf2);
-+    } else if (!strncasecmp(buf, "gauge", 5)) {
-+        *var_len = sizeof(long_ret);
-+        long_ret = strtoul(buf2, NULL, 10);
-+        vp->type = ASN_GAUGE;
-+        return ((unsigned char *) &long_ret);
-+    } else if (!strncasecmp(buf, "objectid", 8)) {
-+        newlen = parse_miboid(buf2, objid);
-+        *var_len = newlen * sizeof(oid);
-+        vp->type = ASN_OBJECT_ID;
-+        return ((unsigned char *) objid);
-+    } else if (!strncasecmp(buf, "timetick", 8)) {
-+        *var_len = sizeof(long_ret);
-+        long_ret = strtoul(buf2, NULL, 10);
-+        vp->type = ASN_TIMETICKS;
-+        return ((unsigned char *) &long_ret);
-+    } else if (!strncasecmp(buf, "ipaddress", 9)) {
-+        newlen = parse_miboid(buf2, objid);
-+        if (newlen != 4) {
-+            snmp_log(LOG_ERR, "invalid ipaddress returned:  %s\n", buf2);
-+            *var_len = 0;
-+            return (NULL);
-+        }
-+        addr_ret =
-+            (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) +
-+            (objid[2] << 8) + objid[3];
-+        addr_ret = htonl(addr_ret);
-+        *var_len = sizeof(addr_ret);
-+        vp->type = ASN_IPADDRESS;
-+        return ((unsigned char *) &addr_ret);
-+    }
-+    *var_len = 0;
-+    return (NULL);
-+}
-+
-+void
-+netsnmp_internal_pass_set_format(char *buf,
-+                                 const u_char *var_val,
-+                                 u_char var_val_type,
-+                                 size_t var_val_len)
-+{
-+    char            buf2[SNMP_MAXBUF];
-+    long            tmp;
-+    unsigned long   utmp;
-+
-+    switch (var_val_type) {
-+    case ASN_INTEGER:
-+    case ASN_COUNTER:
-+    case ASN_GAUGE:
-+    case ASN_TIMETICKS:
-+        tmp = *((const long *) var_val);
-+        switch (var_val_type) {
-+        case ASN_INTEGER:
-+            sprintf(buf, "integer %d\n", (int) tmp);
-+            break;
-+        case ASN_COUNTER:
-+            sprintf(buf, "counter %d\n", (int) tmp);
-+            break;
-+        case ASN_GAUGE:
-+            sprintf(buf, "gauge %d\n", (int) tmp);
-+            break;
-+        case ASN_TIMETICKS:
-+            sprintf(buf, "timeticks %d\n", (int) tmp);
-+            break;
-+        }
-+        break;
-+    case ASN_IPADDRESS:
-+        utmp = *((const u_long *) var_val);
-+        utmp = ntohl(utmp);
-+        sprintf(buf, "ipaddress %d.%d.%d.%d\n",
-+                (int) ((utmp & 0xff000000) >> (8 * 3)),
-+                (int) ((utmp & 0xff0000) >> (8 * 2)),
-+                (int) ((utmp & 0xff00) >> (8)),
-+                (int) ((utmp & 0xff)));
-+        break;
-+    case ASN_OCTET_STR:
-+        memcpy(buf2, var_val, var_val_len);
-+        if (var_val_len == 0)
-+            sprintf(buf, "string \"\"\n");
-+        else if (netsnmp_internal_bin2asc(buf2, var_val_len) ==
-+                 (int) var_val_len)
-+            snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2);
-+        else
-+            snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2);
-+        buf[ sizeof(buf)-1 ] = 0;
-+        break;
-+    case ASN_OBJECT_ID:
-+        sprint_mib_oid(buf2, (const oid *) var_val, var_val_len/sizeof(oid));
-+        snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2);
-+        buf[ sizeof(buf)-1 ] = 0;
-+        break;
-+    }
-+}
-diff --git a/agent/mibgroup/ucd-snmp/pass_common.h b/agent/mibgroup/ucd-snmp/pass_common.h
-new file mode 100644
-index 0000000..b1d7e4b
---- /dev/null
-+++ b/agent/mibgroup/ucd-snmp/pass_common.h
-@@ -0,0 +1,20 @@
-+#ifndef NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H
-+#define NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H
-+
-+/*
-+ * This is an internal header file. The functions declared here might change
-+ * or disappear at any time
-+ */
-+
-+int
-+netsnmp_internal_pass_str_to_errno(const char *buf);
-+
-+unsigned char *
-+netsnmp_internal_pass_parse(char *buf, char *buf2, size_t *var_len,
-+                            struct variable *vp);
-+
-+void
-+netsnmp_internal_pass_set_format(char *buf, const u_char *var_val,
-+                                 u_char var_val_type, size_t var_val_len);
-+
-+#endif /* !NETSNMP_AGENT_MIBGROUP_PASS_COMMON_H */
-diff --git a/agent/mibgroup/ucd-snmp/pass_persist.c b/agent/mibgroup/ucd-snmp/pass_persist.c
-index c18a84c..6cce6f4 100644
---- a/agent/mibgroup/ucd-snmp/pass_persist.c
-+++ b/agent/mibgroup/ucd-snmp/pass_persist.c
-@@ -38,6 +38,7 @@
- 
- #include "struct.h"
- #include "pass_persist.h"
-+#include "pass_common.h"
- #include "extensible.h"
- #include "util_funcs.h"
- 
-@@ -60,15 +61,6 @@ static void     destruct_persist_pipes(void);
- static int      write_persist_pipe(int iindex, const char *data);
- 
- /*
-- * These are defined in pass.c 
-- */
--extern int      asc2bin(char *p);
--extern int      bin2asc(char *p, size_t n);
--extern int      netsnmp_pass_str_to_errno(const char *buf);
--extern int      snmp_oid_min_compare(const oid *, size_t, const oid *,
--                                     size_t);
--
--/*
-  * the relocatable extensible commands variables 
-  */
- struct variable2 extensible_persist_passthru_variables[] = {
-@@ -169,11 +161,9 @@ pass_persist_parse_config(const char *token, char *cptr)
-     } else {
-         for (tcptr = cptr; *tcptr != 0 && *tcptr != '#' && *tcptr != ';';
-              tcptr++);
--        strncpy((*ppass)->command, cptr, tcptr - cptr);
--        (*ppass)->command[tcptr - cptr] = 0;
-+        sprintf((*ppass)->command, "%.*s", (int) (tcptr - cptr), cptr);
-     }
--    strncpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
--    (*ppass)->name[ sizeof((*ppass)->name)-1 ] = 0;
-+    strlcpy((*ppass)->name, (*ppass)->command, sizeof((*ppass)->name));
-     (*ppass)->next = NULL;
- 
-     register_mib_priority("pass_persist",
-@@ -230,11 +220,8 @@ var_extensible_pass_persist(struct variable *vp,
- {
-     oid             newname[MAX_OID_LEN];
-     int             i, rtest, newlen;
--    static long     long_ret;
--    static in_addr_t addr_ret;
-     char            buf[SNMP_MAXBUF];
-     static char     buf2[SNMP_MAXBUF];
--    static oid      objid[MAX_OID_LEN];
-     struct extensible *persistpassthru;
-     FILE           *file;
- 
-@@ -243,10 +230,9 @@ var_extensible_pass_persist(struct variable *vp,
-      */
-     init_persist_pipes();
- 
--    long_ret = *length;
-     for (i = 1; i <= numpersistpassthrus; i++) {
-         persistpassthru = get_exten_instance(persistpassthrus, i);
--        rtest = snmp_oid_min_compare(name, *length,
-+        rtest = snmp_oidtree_compare(name, *length,
-                                      persistpassthru->miboid,
-                                      persistpassthru->miblen);
-         if ((exact && rtest == 0) || (!exact && rtest <= 0)) {
-@@ -325,89 +311,7 @@ var_extensible_pass_persist(struct variable *vp,
-                     close_persist_pipe(i);
-                     return (NULL);
-                 }
--                /*
--                 * buf contains the return type, and buf2 contains the data 
--                 */
--                if (!strncasecmp(buf, "string", 6)) {
--                    buf2[strlen(buf2) - 1] = 0; /* zap the linefeed */
--                    *var_len = strlen(buf2);
--                    vp->type = ASN_OCTET_STR;
--                    return ((unsigned char *) buf2);
--                } 
--                else if (!strncasecmp(buf, "integer64", 9)) {
--                    static struct counter64 c64;
--                    uint64_t v64 = strtoull(buf2, NULL, 10);
--                    c64.high = (unsigned long)(v64 >> 32);
--                    c64.low  = (unsigned long)(v64 & 0xffffffff);
--                    *var_len = sizeof(c64);
--                    vp->type = ASN_INTEGER64;
--                    return ((unsigned char *) &c64);
--                } 
--                else if (!strncasecmp(buf, "integer", 7)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtol(buf2, NULL, 10);
--                    vp->type = ASN_INTEGER;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "unsigned", 8)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_UNSIGNED;
--                    return ((unsigned char *) &long_ret);
--                } 
--                else if (!strncasecmp(buf, "counter64", 9)) {
--                    static struct counter64 c64;
--                    uint64_t v64 = strtoull(buf2, NULL, 10);
--                    c64.high = (unsigned long)(v64 >> 32);
--                    c64.low  = (unsigned long)(v64 & 0xffffffff);
--                    *var_len = sizeof(c64);
--                    vp->type = ASN_COUNTER64;
--                    return ((unsigned char *) &c64);
--                } 
--                else if (!strncasecmp(buf, "counter", 7)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_COUNTER;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "octet", 5)) {
--                    *var_len = asc2bin(buf2);
--                    vp->type = ASN_OCTET_STR;
--                    return ((unsigned char *) buf2);
--                } else if (!strncasecmp(buf, "opaque", 6)) {
--                    *var_len = asc2bin(buf2);
--                    vp->type = ASN_OPAQUE;
--                    return ((unsigned char *) buf2);
--                } else if (!strncasecmp(buf, "gauge", 5)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_GAUGE;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "objectid", 8)) {
--                    newlen = parse_miboid(buf2, objid);
--                    *var_len = newlen * sizeof(oid);
--                    vp->type = ASN_OBJECT_ID;
--                    return ((unsigned char *) objid);
--                } else if (!strncasecmp(buf, "timetick", 8)) {
--                    *var_len = sizeof(long_ret);
--                    long_ret = strtoul(buf2, NULL, 10);
--                    vp->type = ASN_TIMETICKS;
--                    return ((unsigned char *) &long_ret);
--                } else if (!strncasecmp(buf, "ipaddress", 9)) {
--                    newlen = parse_miboid(buf2, objid);
--                    if (newlen != 4) {
--                        snmp_log(LOG_ERR,
--                                 "invalid ipaddress returned:  %s\n",
--                                 buf2);
--                        *var_len = 0;
--                        return (NULL);
--                    }
--                    addr_ret =
--                        (objid[0] << (8 * 3)) + (objid[1] << (8 * 2)) +
--                        (objid[2] << 8) + objid[3];
--                    addr_ret = htonl(addr_ret);
--                    *var_len = sizeof(addr_ret);
--                    vp->type = ASN_IPADDRESS;
--                    return ((unsigned char *) &addr_ret);
--                }
-+                return netsnmp_internal_pass_parse(buf, buf2, var_len, vp);
-             }
-             *var_len = 0;
-             return (NULL);
-@@ -430,8 +334,6 @@ setPassPersist(int action,
-     struct extensible *persistpassthru;
- 
-     char            buf[SNMP_MAXBUF], buf2[SNMP_MAXBUF];
--    long            tmp;
--    unsigned long   utmp;
- 
-     /*
-      * Make sure that our basic pipe structure is malloced 
-@@ -440,7 +342,7 @@ setPassPersist(int action,
- 
-     for (i = 1; i <= numpersistpassthrus; i++) {
-         persistpassthru = get_exten_instance(persistpassthrus, i);
--        rtest = snmp_oid_min_compare(name, name_len,
-+        rtest = snmp_oidtree_compare(name, name_len,
-                                      persistpassthru->miboid,
-                                      persistpassthru->miblen);
-         if (rtest <= 0) {
-@@ -457,55 +359,9 @@ setPassPersist(int action,
-             snprintf(persistpassthru->command,
-                      sizeof(persistpassthru->command), "set\n%s\n", buf);
-             persistpassthru->command[ sizeof(persistpassthru->command)-1 ] = 0;
--            switch (var_val_type) {
--            case ASN_INTEGER:
--            case ASN_COUNTER:
--            case ASN_GAUGE:
--            case ASN_TIMETICKS:
--                tmp = *((long *) var_val);
--                switch (var_val_type) {
--                case ASN_INTEGER:
--                    sprintf(buf, "integer %d\n", (int) tmp);
--                    break;
--                case ASN_COUNTER:
--                    sprintf(buf, "counter %d\n", (int) tmp);
--                    break;
--                case ASN_GAUGE:
--                    sprintf(buf, "gauge %d\n", (int) tmp);
--                    break;
--                case ASN_TIMETICKS:
--                    sprintf(buf, "timeticks %d\n", (int) tmp);
--                    break;
--                }
--                break;
--            case ASN_IPADDRESS:
--                utmp = *((u_long *) var_val);
--                utmp = ntohl(utmp);
--                sprintf(buf, "ipaddress %d.%d.%d.%d\n",
--                        (int) ((utmp & 0xff000000) >> (8 * 3)),
--                        (int) ((utmp & 0xff0000) >> (8 * 2)),
--                        (int) ((utmp & 0xff00) >> (8)),
--                        (int) ((utmp & 0xff)));
--                break;
--            case ASN_OCTET_STR:
--                memcpy(buf2, var_val, var_val_len);
--                if (var_val_len == 0)
--                    sprintf(buf, "string \"\"\n");
--                else if (bin2asc(buf2, var_val_len) == (int) var_val_len)
--                    snprintf(buf, sizeof(buf), "string \"%s\"\n", buf2);
--                else
--                    snprintf(buf, sizeof(buf), "octet \"%s\"\n", buf2);
--                buf[ sizeof(buf)-1 ] = 0;
--                break;
--            case ASN_OBJECT_ID:
--                sprint_mib_oid(buf2, (oid *) var_val, var_val_len/sizeof(oid));
--                snprintf(buf, sizeof(buf), "objectid \"%s\"\n", buf2);
--                buf[ sizeof(buf)-1 ] = 0;
--                break;
--            }
--            strncat(persistpassthru->command, buf,
--                    sizeof(persistpassthru->command) -
--                    strlen(persistpassthru->command) - 2);
-+            netsnmp_internal_pass_set_format(buf, var_val, var_val_type, var_val_len);
-+            strlcat(persistpassthru->command, buf,
-+                    sizeof(persistpassthru->command));
-             persistpassthru->command[ sizeof(persistpassthru->command)-2 ] = '\n';
-             persistpassthru->command[ sizeof(persistpassthru->command)-1 ] = 0;
- 
-@@ -526,7 +382,7 @@ setPassPersist(int action,
-                 return SNMP_ERR_NOTWRITABLE;
-             }
- 
--            return netsnmp_pass_str_to_errno(buf);
-+            return netsnmp_internal_pass_str_to_errno(buf);
-         }
-     }
-     if (snmp_get_do_debugging()) {
-@@ -650,8 +506,8 @@ open_persist_pipe(int iindex, char *command)
- {
-     static int      recurse = 0;        /* used to allow one level of recursion */
- 
--    DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe(%d,'%s')\n",
--                iindex, command));
-+    DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe(%d,'%s') recurse=%d\n",
-+                iindex, command, recurse));
-     /*
-      * Open if it's not already open 
-      */
-@@ -683,6 +539,7 @@ open_persist_pipe(int iindex, char *command)
-          * Setup our -non-buffered-io- 
-          */
-         setbuf(persist_pipes[iindex].fOut, (char *) 0);
-+        DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe: opened the pipes\n"));
-     }
- 
-     /*
-@@ -702,6 +559,7 @@ open_persist_pipe(int iindex, char *command)
-              * Recurse one time if we get a SIGPIPE 
-              */
-             if (!recurse) {
-+                DEBUGMSGTL(("ucd-snmp/pass_persist", "open_persist_pipe: recursing to reopen\n"));
-                 recurse = 1;
-                 return open_persist_pipe(iindex, command);
-             }
-@@ -717,7 +575,7 @@ open_persist_pipe(int iindex, char *command)
-         }
-         if (strncmp(buf, "PONG", 4)) {
-             DEBUGMSGTL(("ucd-snmp/pass_persist",
--                        "open_persist_pipe: PONG not received!\n"));
-+                        "open_persist_pipe: Got %s instead of PONG!\n", buf));
-             close_persist_pipe(iindex);
-             recurse = 0;
-             return 0;
-@@ -728,17 +586,6 @@ open_persist_pipe(int iindex, char *command)
-     return 1;
- }
- 
--#if HAVE_STRUCT_SIGACTION_SA_SIGACTION
--/*
-- * Generic handler 
-- */
--void
--sigpipe_handler(int sig, siginfo_t * sip, void *uap)
--{
--    return;
--}
--#endif
--
- static int
- write_persist_pipe(int iindex, const char *data)
- {
-@@ -750,16 +597,16 @@ write_persist_pipe(int iindex, const char *data)
-      * Don't write to a non-existant process 
-      */
-     if (persist_pipes[iindex].pid == NETSNMP_NO_SUCH_PROCESS) {
-+        DEBUGMSGTL(("ucd-snmp/pass_persist",
-+                    "write_persist_pipe: not writing %s, process is non-existent",
-+                    data));
-         return 0;
-     }
- 
-     /*
--     * Setup our signal action to catch SIGPIPEs 
-+     * Setup our signal action to ignore SIGPIPEs 
-      */
--    sa.sa_handler = NULL;
--#if HAVE_STRUCT_SIGACTION_SA_SIGACTION
--    sa.sa_sigaction = &sigpipe_handler;
--#endif
-+    sa.sa_handler = SIG_IGN;
-     sigemptyset(&sa.sa_mask);
-     sa.sa_flags = 0;
-     if (sigaction(SIGPIPE, &sa, &osa)) {
-@@ -779,10 +626,10 @@ write_persist_pipe(int iindex, const char *data)
-     sigaction(SIGPIPE, &osa, (struct sigaction *) 0);
- 
-     if (wret < 0) {
--        if (werrno != EINTR) {
-+        if (werrno != EPIPE) {
-             DEBUGMSGTL(("ucd-snmp/pass_persist",
--                        "write_persist_pipe: write returned unknown error %d\n",
--                        errno));
-+                        "write_persist_pipe: write returned unknown error %d (%s)\n",
-+                        werrno, strerror(werrno)));
-         }
-         close_persist_pipe(iindex);
-         return 0;
-diff --git a/agent/mibgroup/ucd-snmp/pass_persist.h b/agent/mibgroup/ucd-snmp/pass_persist.h
-index c7a2aa8..0537abc 100644
---- a/agent/mibgroup/ucd-snmp/pass_persist.h
-+++ b/agent/mibgroup/ucd-snmp/pass_persist.h
-@@ -4,7 +4,9 @@
- #ifndef _MIBGROUP_PASS_PERSIST_H
- #define _MIBGROUP_PASS_PERSIST_H
- 
-+config_require(ucd-snmp/pass_common)
- config_require(util_funcs)
-+config_require(utilities/execute)
- 
- void            init_pass_persist(void);
- void            shutdown_pass_persist(void);
-diff --git a/agent/mibgroup/ucd-snmp/proc.c b/agent/mibgroup/ucd-snmp/proc.c
-index 32ac0df..e90c2e8 100644
---- a/agent/mibgroup/ucd-snmp/proc.c
-+++ b/agent/mibgroup/ucd-snmp/proc.c
-@@ -437,8 +437,7 @@ sh_count_procs(char *procname)
-     count = 0;
- 
-     while(getprocs(&pinfo, sizeof(pinfo), NULL, 0, &index, 1) == 1) {
--        strncpy(pinfo_name, pinfo.pi_comm, 256);
--        pinfo_name[255] = 0;
-+        strlcpy(pinfo_name, pinfo.pi_comm, sizeof(pinfo_name));
-         sep = strchr(pinfo_name, ' ');
-         if(sep != NULL) *sep = 0;
-         if(strcmp(procname, pinfo_name) == 0) count++;
-diff --git a/agent/mibgroup/ucd-snmp/proxy.c b/agent/mibgroup/ucd-snmp/proxy.c
-index ec1aac7..017fd5c 100644
---- a/agent/mibgroup/ucd-snmp/proxy.c
-+++ b/agent/mibgroup/ucd-snmp/proxy.c
-@@ -285,14 +285,13 @@ proxy_fill_in_session(netsnmp_mib_handler *handler,
-                 return 0;
-             }
- 
--            *configured = malloc(strlen("-c") + 1);
--            strcpy((char*)*configured, "-c");
-+            *configured = strdup("-c");
-             DEBUGMSGTL(("proxy", "pdu has community string\n"));
-             session->community_len = reqinfo->asp->pdu->community_len;
--            session->community = (u_char*)malloc(session->community_len + 1);
--            strncpy((char *)session->community,
--                    (const char *)reqinfo->asp->pdu->community,
--                    session->community_len);
-+            session->community = malloc(session->community_len + 1);
-+            sprintf((char *)session->community, "%.*s",
-+                    (int) session->community_len,
-+                    (const char *)reqinfo->asp->pdu->community);
-         }
-     }
- #endif
-@@ -401,6 +400,8 @@ proxy_handler(netsnmp_mib_handler *handler,
- 
-     if (!pdu || !sp) {
-         netsnmp_set_request_error(reqinfo, requests, SNMP_ERR_GENERR);
-+        if (pdu)
-+            snmp_free_pdu(pdu);
-         return SNMP_ERR_NOERROR;
-     }
- 
-@@ -561,7 +562,7 @@ proxy_got_response(int operation, netsnmp_session * sess, int reqid,
-                                                            REQUEST_IS_NOT_DELEGATED);
-             }
- #ifndef NETSNMP_NO_WRITE_SUPPORT
--	    else if ((cache->reqinfo->mode == MODE_SET_ACTION)) {
-+	    else if (cache->reqinfo->mode == MODE_SET_ACTION) {
- 		/*
- 		 * In order for netsnmp_wrap_up_request to consider the
- 		 * SET request complete,
-diff --git a/agent/mibgroup/ucd-snmp/versioninfo.c b/agent/mibgroup/ucd-snmp/versioninfo.c
-index 60a3c71..f7a8c63 100644
---- a/agent/mibgroup/ucd-snmp/versioninfo.c
-+++ b/agent/mibgroup/ucd-snmp/versioninfo.c
-@@ -108,22 +108,21 @@ var_extensible_version(struct variable *vp,
-         long_ret = name[8];
-         return ((u_char *) (&long_ret));
-     case VERTAG:
--        strcpy(errmsg, netsnmp_get_version());
-+        strlcpy(errmsg, netsnmp_get_version(), sizeof(errmsg));
-         *var_len = strlen(errmsg);
-         return ((u_char *) errmsg);
-     case VERDATE:
--        sprintf(errmsg, "$Date$");
-+        strlcpy(errmsg, "$Date$", sizeof(errmsg));
-         *var_len = strlen(errmsg);
-         return ((u_char *) errmsg);
-     case VERCDATE:
-         curtime = time(NULL);
-         cptr = ctime(&curtime);
--        strcpy(errmsg, cptr);
--        *var_len = strlen(errmsg) - 1;
-+        strlcpy(errmsg, cptr, sizeof(errmsg));
-+        *var_len = strlen(errmsg) - 1; /* - 1 to strip trailing newline */
-         return ((u_char *) errmsg);
-     case VERIDENT:
--        sprintf(errmsg,
--                "$Id$");
-+        strlcpy(errmsg, "$Id$", sizeof(errmsg));
-         *var_len = strlen(errmsg);
-         return ((u_char *) errmsg);
-     case VERCONFIG:
-@@ -133,7 +132,7 @@ var_extensible_version(struct variable *vp,
-             *var_len = 1024;    /* mib imposed restriction */
-         return (u_char *) config_opts;
- #else
--        sprintf(errmsg, "");
-+        strlcpy(errmsg, "", sizeof(errmsg)));
-         *var_len = strlen(errmsg);
-         return ((u_char *) errmsg);
- #endif
-diff --git a/agent/mibgroup/ucd-snmp/vmstat.c b/agent/mibgroup/ucd-snmp/vmstat.c
-index b613ee1..d52a5b6 100644
---- a/agent/mibgroup/ucd-snmp/vmstat.c
-+++ b/agent/mibgroup/ucd-snmp/vmstat.c
-@@ -31,7 +31,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-                netsnmp_request_info         *requests)
- {
-     oid  obj;
--    long value = 0;
-+    unsigned long long value = 0;
-     char cp[300];
-     netsnmp_cpu_info *info = netsnmp_cpu_get_byIdx( -1, 0 );
- 
-@@ -147,7 +147,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-                  else
-                      value = 0;    /* or skip this entry */
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
-         case CPUSYSTEM:
-@@ -159,7 +159,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-                  else
-                      value = 0;    /* or skip this entry */
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
-         case CPUIDLE:
-@@ -170,7 +170,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-                  else
-                      value = 0;    /* or skip this entry */
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
- 		
-@@ -190,14 +190,14 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-              if ( info->history && info->history[0].total_hist ) {
-                  value  = (info->nInterrupts - info->history[0].intr_hist)/60;
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
-         case SYSCONTEXT:
-              if ( info->history && info->history[0].total_hist ) {
-                  value  = (info->nCtxSwitches - info->history[0].ctx_hist)/60;
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
- 
-@@ -217,7 +217,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-                  value  = (info->swapIn - info->history[0].swpi_hist)/60;
-                  /* ??? value *= PAGE_SIZE;  */
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
-         case SWAPOUT:
-@@ -225,7 +225,7 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-                  value  = (info->swapOut - info->history[0].swpo_hist)/60;
-                  /* ??? value *= PAGE_SIZE;  */
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
- 
-@@ -244,14 +244,14 @@ vmstat_handler(netsnmp_mib_handler          *handler,
-              if ( info->history && info->history[0].total_hist ) {
-                  value  = (info->pageOut - info->history[0].pageo_hist)/60;
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
-         case IORECEIVE:
-              if ( info->history && info->history[0].total_hist ) {
-                  value  = (info->pageIn - info->history[0].pagei_hist)/60;
-                  snmp_set_var_typed_integer(requests->requestvb,
--                                            ASN_INTEGER, value);
-+                                            ASN_INTEGER, value & 0x7fffffff);
-              }
-              break;
- 
-diff --git a/agent/mibgroup/ucd_snmp.h b/agent/mibgroup/ucd_snmp.h
-index c371dd4..0d87ec1 100644
---- a/agent/mibgroup/ucd_snmp.h
-+++ b/agent/mibgroup/ucd_snmp.h
-@@ -8,7 +8,9 @@ config_require(ucd-snmp/loadave)
- config_require(agent/extend)
- config_require(ucd-snmp/errormib)
- config_require(ucd-snmp/file)
-+#if defined(HAVE_DLFCN_H) && defined(HAVE_DLOPEN)
- config_require(ucd-snmp/dlmod)
-+#endif
- config_require(ucd-snmp/proxy)
- config_require(ucd-snmp/logmatch)
- config_require(ucd-snmp/memory)
-diff --git a/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c b/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
-index 9ea23a9..0e25c21 100644
---- a/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
-+++ b/agent/mibgroup/udp-mib/udpEndpointTable/udpEndpointTable_data_access.c
-@@ -239,7 +239,7 @@ udpEndpointTable_container_load(netsnmp_container *container)
-     if (NULL == ep_c)
-         return MFD_RESOURCE_UNAVAILABLE;
-     ep_it = CONTAINER_ITERATOR(ep_c);
--    if (NULL == ep_c) {
-+    if (NULL == ep_it) {
-         netsnmp_access_udp_endpoint_container_free(ep_c, 0);
-         return MFD_RESOURCE_UNAVAILABLE;
-     }
-diff --git a/agent/mibgroup/util_funcs.c b/agent/mibgroup/util_funcs.c
-index 55d80c5..69d7190 100644
---- a/agent/mibgroup/util_funcs.c
-+++ b/agent/mibgroup/util_funcs.c
-@@ -126,31 +126,7 @@ extern int      numprocs, numextens;
- const char *
- make_tempfile(void)
- {
--    static char     name[32];
--    int             fd = -1;
--
--    strcpy(name, get_temp_file_pattern());
--#ifdef HAVE_MKSTEMP
--    fd = mkstemp(name);
--#else
--    if (mktemp(name)) {
--# ifndef WIN32        
--        fd = open(name, O_CREAT | O_EXCL | O_WRONLY, S_IRUSR | S_IWUSR);
--# else
--        /*
--          Win32 needs _S_IREAD | _S_IWRITE to set permissions on file after closing
--        */
--        fd = _open(name, _O_CREAT | _O_EXCL | _O_WRONLY, _S_IREAD | _S_IWRITE);
--# endif
--    }
--#endif
--    if (fd >= 0) {
--        close(fd);
--        DEBUGMSGTL(("make_tempfile", "temp file created: %s\n", name));
--        return name;
--    }
--    snmp_log(LOG_ERR,"make_tempfile: error creating file %s\n", name);
--    return NULL;
-+    return netsnmp_mktemp();
- }
- 
- #ifndef NETSNMP_FEATURE_REMOVE_SHELL_COMMAND
-@@ -718,14 +694,12 @@ print_mib_oid(oid name[], size_t len)
- }
- 
- void
--sprint_mib_oid(char *buf, oid name[], size_t len)
-+sprint_mib_oid(char *buf, const oid *name, size_t len)
- {
-     int             i;
--    for (i = 0; i < (int) len; i++) {
--        sprintf(buf, ".%d", (int) name[i]);
--        while (*buf != 0)
--            buf++;
--    }
-+
-+    for (i = 0; i < (int) len; i++)
-+        buf += sprintf(buf, ".%" NETSNMP_PRIo "u", name[i]);
- }
- 
- /*
-@@ -798,7 +772,10 @@ parse_miboid(const char *buf, oid * oidout)
-     if (*buf == '.')
-         buf++;
-     for (i = 0; isdigit((unsigned char)(*buf)); i++) {
--        oidout[i] = atoi(buf);
-+        /* Subidentifiers are unsigned values, up to 2^32-1
-+         * so we need to use 'strtoul' rather than 'atoi'
-+         */
-+        oidout[i] = strtoul(buf, NULL, 10) & 0xffffffff;
-         while (isdigit((unsigned char)(*buf++)));
-         if (*buf == '.')
-             buf++;
-@@ -1146,7 +1123,7 @@ int net_snmp_delete_prefix_info(prefix_cbx **head,
-     }
-     return 0;
- }
--#endif
-+#endif /* NETSNMP_FEATURE_REMOVE_DELETE_PREFIX_INFO */
- 
- #endif /* HAVE_LINUX_RTNETLINK_H */
-          
-diff --git a/agent/mibgroup/util_funcs.h b/agent/mibgroup/util_funcs.h
-index 5bef2a8..7f59780 100644
---- a/agent/mibgroup/util_funcs.h
-+++ b/agent/mibgroup/util_funcs.h
-@@ -43,7 +43,7 @@ int             get_exec_pipes(char *cmd, int *fdIn, int *fdOut, pid_t *pid);
- #endif
- WriteMethod     clear_cache;
- void            print_mib_oid(oid *, size_t);
--void            sprint_mib_oid(char *, oid *, size_t);
-+void            sprint_mib_oid(char *, const oid *, size_t);
- int             checkmib(struct variable *, oid *, size_t *, int, size_t *,
-                          WriteMethod ** write_method, int);
- char           *find_field(char *, int);
-diff --git a/agent/mibgroup/utilities/override.c b/agent/mibgroup/utilities/override.c
-index 298883e..2b083a9 100644
---- a/agent/mibgroup/utilities/override.c
-+++ b/agent/mibgroup/utilities/override.c
-@@ -216,6 +216,8 @@ netsnmp_parse_override(const char *token, char *line)
-     case ASN_OBJECT_ID:
-         read_config_read_objid(buf, (oid **) & thedata->value,
-                                &thedata->value_len);
-+        /* We need the size of the value in bytes, not in oids */
-+        thedata->value_len *= sizeof(oid);
-         break;
- 
-     case ASN_NULL:
-diff --git a/agent/mibgroup/winExtDLL.c b/agent/mibgroup/winExtDLL.c
-index ddf613b..c693913 100644
---- a/agent/mibgroup/winExtDLL.c
-+++ b/agent/mibgroup/winExtDLL.c
-@@ -692,7 +692,6 @@ var_winExtDLL(netsnmp_mib_handler *handler,
-     winextdll      *ext_dll_info;
-     netsnmp_request_info *request;
-     UINT            nRequestType;
--    const char     *mode_name;
-     int             rc;
- 
-     netsnmp_assert(ext_dll_view_info);
-@@ -711,35 +710,27 @@ var_winExtDLL(netsnmp_mib_handler *handler,
- 
-     switch (reqinfo->mode) {
-     case MODE_GET:
--        mode_name = "GET";
-         nRequestType = SNMP_EXTENSION_GET;
-         netsnmp_assert(!context_info_head);
-         break;
-     case MODE_GETNEXT:
--        mode_name = "GETNEXT";
-         nRequestType = SNMP_EXTENSION_GET_NEXT;
-         netsnmp_assert(!context_info_head);
-         break;
-     case MODE_SET_RESERVE1:
--        mode_name = "SET_RESERVE1";
-         nRequestType = SNMP_EXTENSION_SET_TEST;
-         break;
-     case MODE_SET_RESERVE2:
--        mode_name = "SET_RESERVE2";
-         return SNMP_ERR_NOERROR;
-     case MODE_SET_ACTION:
--        mode_name = "SET_ACTION";
-         return SNMP_ERR_NOERROR;
-     case MODE_SET_UNDO:
--        mode_name = "SET_UNDO";
-         nRequestType = SNMP_EXTENSION_SET_UNDO;
-         break;
-     case MODE_SET_COMMIT:
--        mode_name = "SET_COMMIT";
-         nRequestType = SNMP_EXTENSION_SET_COMMIT;
-         break;
-     case MODE_SET_FREE:
--        mode_name = "SET_FREE";
-         nRequestType = SNMP_EXTENSION_SET_CLEANUP;
-         break;
-     default:
-diff --git a/agent/snmp_agent.c b/agent/snmp_agent.c
-index b38ef4a..2532da1 100644
---- a/agent/snmp_agent.c
-+++ b/agent/snmp_agent.c
-@@ -662,8 +662,7 @@ agent_check_and_process(int block)
-          * The caller does not want us to block at all.  
-          */
- 
--        tvp->tv_sec = 0;
--        tvp->tv_usec = 0;
-+        timerclear(tvp);
-     }
- 
-     count = select(numfds, &fdset, NULL, NULL, tvp);
-@@ -778,7 +777,7 @@ netsnmp_addrcache_add(const char *addr)
-                 /*
-                  * found a match
-                  */
--                memcpy(&addrCache[i].lastHit, &now, sizeof(struct timeval));
-+                addrCache[i].lastHit = now;
-                 if (timercmp(&addrCache[i].lastHit, &aged, <))
- 		    rc = 1; /* should have expired, so is new */
- 		else
-@@ -825,7 +824,7 @@ netsnmp_addrcache_add(const char *addr)
-              */
-             addrCache[unused].addr = strdup(addr);
-             addrCache[unused].status = SNMP_ADDRCACHE_USED;
--            memcpy(&addrCache[unused].lastHit, &now, sizeof(struct timeval));
-+            addrCache[unused].lastHit = now;
-         }
-         else { /* Otherwise, replace oldest entry */
-             if (netsnmp_ds_get_boolean(NETSNMP_DS_APPLICATION_ID,
-@@ -835,7 +834,7 @@ netsnmp_addrcache_add(const char *addr)
-             
-             free(addrCache[oldest].addr);
-             addrCache[oldest].addr = strdup(addr);
--            memcpy(&addrCache[oldest].lastHit, &now, sizeof(struct timeval));
-+            addrCache[oldest].lastHit = now;
-         }
-         rc = 1;
-     }
-@@ -884,7 +883,7 @@ netsnmp_agent_check_packet(netsnmp_session * session,
- {
-     char           *addr_string = NULL;
- #ifdef  NETSNMP_USE_LIBWRAP
--    char *tcpudpaddr, *name;
-+    char *tcpudpaddr = NULL, *name;
-     short not_log_connection;
- 
-     name = netsnmp_ds_get_string(NETSNMP_DS_LIBRARY_ID,
-@@ -918,12 +917,13 @@ netsnmp_agent_check_packet(netsnmp_session * session,
-     }
- #ifdef  NETSNMP_USE_LIBWRAP
-     /* Catch udp,udp6,tcp,tcp6 transports using "[" */
--    tcpudpaddr = strstr(addr_string, "[");
-+    if (addr_string)
-+        tcpudpaddr = strstr(addr_string, "[");
-     if ( tcpudpaddr != 0 ) {
-         char sbuf[64];
-         char *xp;
--        strncpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
--        sbuf[sizeof(sbuf)-1] = '\0';
-+
-+        strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
-         xp = strstr(sbuf, "]");
-         if (xp)
-             *xp = '\0';
-@@ -3310,57 +3310,6 @@ netsnmp_handle_request(netsnmp_agent_session *asp, int status)
-     return 1;
- }
- 
--/**
-- * This function calls into netsnmp_set_mode_request_error,  sets 
-- * error_value given a reqinfo->mode value.  It's used to send specific
-- * errors back to the agent to process accordingly.
-- * 
-- * If error_value is set to SNMP_NOSUCHOBJECT, SNMP_NOSUCHINSTANCE,
-- * or SNMP_ENDOFMIBVIEW the following is applicable:
-- * Sets the error_value to request->requestvb->type if 
-- * reqinfo->mode value is set to MODE_GET.  If the reqinfo->mode 
-- * value is set to MODE_GETNEXT or MODE_GETBULK the code calls 
-- * snmp_log logging an error message.
-- *
-- * Otherwise, the request->status value is checked, if it's < 0
-- * snmp_log is called with an error message and SNMP_ERR_GENERR is 
-- * assigned to request->status. If the request->status value is >= 0 the
-- * error_value is set to request->status.
-- *
-- * @param reqinfo  is a pointer to the netsnmp_agent_request_info struct.  It
-- *	contains the reqinfo->mode which is required to set error_value or
-- *	log error messages.
-- *
-- * @param request is a pointer to the netsnmp_request_info struct.  The 
-- *	error_value is set to request->requestvb->type
-- *
-- * @param error_value is the exception value you want to set, below are
-- *        possible values.
-- *      - SNMP_NOSUCHOBJECT
-- *      - SNMP_NOSUCHINSTANCE
-- *      - SNMP_ENDOFMIBVIEW
-- *      - SNMP_ERR_NOERROR
-- *      - SNMP_ERR_TOOBIG
-- *      - SNMP_ERR_NOSUCHNAME
-- *      - SNMP_ERR_BADVALUE
-- *      - SNMP_ERR_READONLY
-- *      - SNMP_ERR_GENERR
-- *      - SNMP_ERR_NOACCESS
-- *      - SNMP_ERR_WRONGTYPE
-- *      - SNMP_ERR_WRONGLENGTH
-- *      - SNMP_ERR_WRONGENCODING
-- *      - SNMP_ERR_WRONGVALUE
-- *      - SNMP_ERR_NOCREATION
-- *      - SNMP_ERR_INCONSISTENTVALUE
-- *      - SNMP_ERR_RESOURCEUNAVAILABLE
-- *      - SNMP_ERR_COMMITFAILED
-- *      - SNMP_ERR_UNDOFAILED
-- *      - SNMP_ERR_AUTHORIZATIONERROR
-- *      - SNMP_ERR_NOTWRITABLE
-- *      - SNMP_ERR_INCONSISTENTNAME
-- *
-- * @return Returns error_value under all conditions.
-- */
- int
- handle_pdu(netsnmp_agent_session *asp)
- {
-@@ -3702,9 +3651,13 @@ netsnmp_request_set_error_all( netsnmp_request_info *requests, int error)
-     return result;
- }
- 
--                /*
--                 * Return the value of 'sysUpTime' at the given marker 
--                 */
-+/**
-+ * Return the value of 'sysUpTime' at the given marker
-+ *
-+ * @note Use netsnmp_get_agent_runtime() instead of this function if you need
-+ *   to know how much time elapsed since netsnmp_set_agent_starttime() has been
-+ *   called.
-+ */
- u_long
- netsnmp_marker_uptime(marker_t pm)
- {
-@@ -3738,6 +3691,22 @@ netsnmp_get_agent_starttime(void)
- }
- 
- /**
-+ * Report the time that elapsed since the agent start time in hundredths of a
-+ * second.
-+ *
-+ * @see See also netsnmp_set_agent_starttime().
-+ */
-+uint64_t
-+netsnmp_get_agent_runtime(void)
-+{
-+    struct timeval now, delta;
-+
-+    gettimeofday(&now, NULL);
-+    NETSNMP_TIMERSUB(&now, &starttime, &delta);
-+    return delta.tv_sec * (uint64_t)100 + delta.tv_usec / 10000;
-+}
-+
-+/**
-  * Set the time at which Net-SNMP started either to the current time
-  * (if s == NULL) or to *s (if s is not NULL).
-  */
-diff --git a/agent/snmp_perl.c b/agent/snmp_perl.c
-index f974023..48d9695 100644
---- a/agent/snmp_perl.c
-+++ b/agent/snmp_perl.c
-@@ -36,6 +36,7 @@ maybe_source_perl_startup(void)
-     const char     *perl_init_file = netsnmp_ds_get_string(NETSNMP_DS_APPLICATION_ID,
- 							   NETSNMP_DS_AGENT_PERL_INIT_FILE);
-     char            init_file[SNMP_MAXBUF];
-+    int             res;
- 
-     static int      have_done_init = 0;
- 
-@@ -57,8 +58,11 @@ maybe_source_perl_startup(void)
-     env = NULL;
-     PERL_SYS_INIT3(&argc, &argv, &env);
-     my_perl = perl_alloc();
--    if (!my_perl)
-+    if (!my_perl) {
-+        snmp_log(LOG_ERR,
-+                 "embedded perl support failed to initialize (perl_alloc())\n");
-         goto bail_out;
-+    }
- 
-     perl_construct(my_perl);
- 
-@@ -66,11 +70,21 @@ maybe_source_perl_startup(void)
-     PL_exit_flags |= PERL_EXIT_DESTRUCT_END;
- #endif
- 
--    if (perl_parse(my_perl, xs_init, 2, embedargs, NULL))
-+    res = perl_parse(my_perl, xs_init, 2, embedargs, NULL);
-+    if (res) {
-+        snmp_log(LOG_ERR,
-+                 "embedded perl support failed to initialize (perl_parse(%s)"
-+                 " returned %d)\n", embedargs[1], res);
-         goto bail_out;
-+    }
- 
--    if (perl_run(my_perl))
-+    res = perl_run(my_perl);
-+    if (res) {
-+        snmp_log(LOG_ERR,
-+                 "embedded perl support failed to initialize (perl_run()"
-+                 " returned %d)\n", res);
-         goto bail_out;
-+    }
- 
-     free(embedargs[0]);
-     free(embedargs[1]);
-@@ -82,7 +96,6 @@ maybe_source_perl_startup(void)
-   bail_out:
-     free(embedargs[0]);
-     free(embedargs[1]);
--    snmp_log(LOG_ERR, "embedded perl support failed to initialize\n");
-     netsnmp_ds_set_boolean(NETSNMP_DS_APPLICATION_ID, 
- 			   NETSNMP_DS_AGENT_DISABLE_PERL, 1);
-     return;
-@@ -168,5 +181,6 @@ shutdown_perl(void)
-     }
-     DEBUGMSGTL(("perl", "shutting down perl\n"));
-     perl_destruct(my_perl);
-+    my_perl = NULL;
-     DEBUGMSGTL(("perl", "finished shutting down perl\n"));
- }
-diff --git a/agent/snmpd.c b/agent/snmpd.c
-index 0deff09..ee458c3 100644
---- a/agent/snmpd.c
-+++ b/agent/snmpd.c
-@@ -438,7 +438,6 @@ main(int argc, char *argv[])
-     int             arg, i, ret;
-     int             dont_fork = 0, do_help = 0;
-     int             log_set = 0;
--    int             uid = 0, gid = 0;
-     int             agent_mode = -1;
-     char           *pid_file = NULL;
-     char            option_compatability[] = "-Le";
-@@ -446,12 +445,6 @@ main(int argc, char *argv[])
-     int fd;
-     FILE           *PID;
- #endif
--#if HAVE_GETPWNAM && HAVE_PWD_H
--    struct passwd  *info;
--#endif
--#if HAVE_UNISTD_H
--    const char     *persistent_dir;
--#endif
- 
- #ifndef WIN32
-     /*
-@@ -602,19 +595,18 @@ main(int argc, char *argv[])
-                 int             gid;
- 
-                 gid = strtoul(optarg, &ecp, 10);
-+#if HAVE_GETGRNAM && HAVE_PWD_H
-                 if (*ecp) {
--#if HAVE_GETPWNAM && HAVE_PWD_H
-                     struct group  *info;
-+
-                     info = getgrnam(optarg);
--                    if (info) {
--                        gid = info->gr_gid;
--                    } else {
--#endif
--                        fprintf(stderr, "Bad group id: %s\n", optarg);
--                        exit(1);
--#if HAVE_GETPWNAM && HAVE_PWD_H
--                    }
-+                    gid = info ? info->gr_gid : -1;
-+                    endgrent();
-+                }
- #endif
-+                if (gid < 0) {
-+                    fprintf(stderr, "Bad group id: %s\n", optarg);
-+                    exit(1);
-                 }
-                 netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 				   NETSNMP_DS_AGENT_GROUPID, gid);
-@@ -781,18 +773,18 @@ main(int argc, char *argv[])
-                 int             uid;
- 
-                 uid = strtoul(optarg, &ecp, 10);
--                if (*ecp) {
- #if HAVE_GETPWNAM && HAVE_PWD_H
-+                if (*ecp) {
-+                    struct passwd  *info;
-+
-                     info = getpwnam(optarg);
--                    if (info) {
--                        uid = info->pw_uid;
--                    } else {
--#endif
--                        fprintf(stderr, "Bad user id: %s\n", optarg);
--                        exit(1);
--#if HAVE_GETPWNAM && HAVE_PWD_H
--                    }
-+                    uid = info ? info->pw_uid : -1;
-+                    endpwent();
-+                }
- #endif
-+                if (uid < 0) {
-+                    fprintf(stderr, "Bad user id: %s\n", optarg);
-+                    exit(1);
-                 }
-                 netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 				   NETSNMP_DS_AGENT_USERID, uid);
-@@ -1009,7 +1001,11 @@ main(int argc, char *argv[])
-     }
- #endif
- 
--#if HAVE_UNISTD_H
-+#if defined(HAVE_UNISTD_H) && (defined(HAVE_CHOWN) || defined(HAVE_SETGID) || defined(HAVE_SETUID))
-+    {
-+    const char     *persistent_dir;
-+    int             uid, gid;
-+
-     persistent_dir = get_persistent_directory();
-     mkdirhier( persistent_dir, NETSNMP_AGENT_DIRECTORY_MODE, 0 );
-    
-@@ -1025,7 +1021,7 @@ main(int argc, char *argv[])
- 
- #ifdef HAVE_SETGID
-     if ((gid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, 
--				  NETSNMP_DS_AGENT_GROUPID)) != 0) {
-+				  NETSNMP_DS_AGENT_GROUPID)) > 0) {
-         DEBUGMSGTL(("snmpd/main", "Changing gid to %d.\n", gid));
-         if (setgid(gid) == -1
- #ifdef HAVE_SETGROUPS
-@@ -1042,8 +1038,10 @@ main(int argc, char *argv[])
- #endif
- #ifdef HAVE_SETUID
-     if ((uid = netsnmp_ds_get_int(NETSNMP_DS_APPLICATION_ID, 
--				  NETSNMP_DS_AGENT_USERID)) != 0) {
-+				  NETSNMP_DS_AGENT_USERID)) > 0) {
- #if HAVE_GETPWNAM && HAVE_PWD_H && HAVE_INITGROUPS
-+        struct passwd *info;
-+
-         /*
-          * Set supplementary groups before changing UID
-          *   (which probably involves giving up privileges)
-@@ -1059,6 +1057,7 @@ main(int argc, char *argv[])
-                 }
-             }
-         }
-+        endpwent();
- #endif
-         DEBUGMSGTL(("snmpd/main", "Changing uid to %d.\n", uid));
-         if (setuid(uid) == -1) {
-@@ -1070,6 +1069,7 @@ main(int argc, char *argv[])
-         }
-     }
- #endif
-+    }
- #endif
- 
-     /*
-@@ -1273,7 +1273,7 @@ receive(void)
-         DEBUGMSGTL(("snmpd/select", "select( numfds=%d, ..., tvp=%p)\n",
-                     numfds, tvp));
-         if(tvp)
--            DEBUGMSGTL(("timer", "tvp %ld.%ld\n", tvp->tv_sec, tvp->tv_usec));
-+            DEBUGMSGTL(("timer", "tvp %ld.%ld\n", tvp->tv_sec, (long)tvp->tv_usec));
-         count = netsnmp_large_fd_set_select(numfds, &readfds, &writefds, &exceptfds,
- 				     tvp);
-         DEBUGMSGTL(("snmpd/select", "returned, count = %d\n", count));
-diff --git a/apps/Makefile.in b/apps/Makefile.in
-index 43cb007..77404dd 100644
---- a/apps/Makefile.in
-+++ b/apps/Makefile.in
-@@ -84,9 +84,6 @@ USEAGENTLIBS	= $(MIBLIB) $(AGENTLIB) $(USELIBS)
- MYSQL_LIBS	= @MYSQL_LIBS@
- MYSQL_INCLUDES	= @MYSQL_INCLUDES@
- 
--#
--# link path in src dir
--LOCAL_LIBS	= -L../snmplib/.libs -L../snmplib -L../agent/.libs -L../agent
- VAL_LIBS	= @VAL_LIBS@
- LIBS		= $(USELIBS) $(VAL_LIBS) @LIBS@
- PERLLDOPTS_FOR_APPS = @PERLLDOPTS_FOR_APPS@
-@@ -146,65 +143,65 @@ OTHERUNINSTALL=snmpinformuninstall snmptrapdperluninstall
- # build rules
- #
- snmpwalk$(EXEEXT):    snmpwalk.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpwalk.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpwalk.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpbulkwalk$(EXEEXT):    snmpbulkwalk.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpbulkwalk.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpbulkwalk.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpbulkget$(EXEEXT):    snmpbulkget.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpbulkget.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpbulkget.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmptranslate$(EXEEXT):    snmptranslate.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmptranslate.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmptranslate.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpstatus$(EXEEXT):    snmpstatus.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpstatus.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpstatus.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpget$(EXEEXT):    snmpget.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpget.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpget.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpdelta$(EXEEXT):    snmpdelta.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpdelta.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpdelta.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmptable$(EXEEXT):    snmptable.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmptable.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmptable.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmptest$(EXEEXT):    snmptest.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmptest.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmptest.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmptrapd$(EXEEXT):    $(TRAPD_OBJECTS) $(USETRAPLIBS) $(INSTALLLIBS)
--	$(LINK) ${CFLAGS} -o $@ $(TRAPD_OBJECTS) $(INSTALLLIBS) $(LOCAL_LIBS) ${LDFLAGS} ${TRAPLIBS}
-+	$(LINK) ${CFLAGS} -o $@ $(TRAPD_OBJECTS) $(INSTALLLIBS) ${LDFLAGS} ${TRAPLIBS}
- 
- snmptrap$(EXEEXT):    snmptrap.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmptrap.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmptrap.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpinform$(EXEEXT): snmptrap$(EXEEXT)
- 	rm -f snmpinform
- 	$(LN_S) snmptrap$(EXEEXT) snmpinform$(EXEEXT)
- 
- snmpset$(EXEEXT):    snmpset.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpset.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpset.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpusm$(EXEEXT):    snmpusm.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpusm.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpusm.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpvacm$(EXEEXT):    snmpvacm.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpvacm.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpvacm.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmptls$(EXEEXT):    snmptls.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmptls.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmptls.$(OSUFFIX) ${LDFLAGS} ${LIBS} 
- 
- agentxtrap$(EXEEXT):    agentxtrap.$(OSUFFIX) $(USEAGENTLIBS)
--	$(LINK) ${CFLAGS} -o $@ agentxtrap.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} $(USEAGENTLIBS) $(PERLLDOPTS_FOR_APPS) ${LIBS}
-+	$(LINK) ${CFLAGS} -o $@ agentxtrap.$(OSUFFIX) ${LDFLAGS} $(USEAGENTLIBS) $(PERLLDOPTS_FOR_APPS) ${LIBS}
- 
- snmpgetnext$(EXEEXT):    snmpgetnext.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpgetnext.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpgetnext.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- encode_keychange$(EXEEXT):    encode_keychange.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ encode_keychange.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ encode_keychange.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- snmpdf$(EXEEXT):    snmpdf.$(OSUFFIX) $(USELIBS)
--	$(LINK) ${CFLAGS} -o $@ snmpdf.$(OSUFFIX) $(LOCAL_LIBS) ${LDFLAGS} ${LIBS} 
-+	$(LINK) ${CFLAGS} -o $@ snmpdf.$(OSUFFIX) ${LDFLAGS} ${LIBS}
- 
- libnetsnmptrapd.$(LIB_EXTENSION)$(LIB_VERSION): $(LLIBTRAPD_OBJS)
- 	$(LIB_LD_CMD) $@ ${LLIBTRAPD_OBJS} $(MIBLIB) $(USELIBS) $(PERLLDOPTS_FOR_LIBS) $(LIB_LD_LIBS)
-diff --git a/apps/encode_keychange.c b/apps/encode_keychange.c
-index bae2139..5bf8e4c 100644
---- a/apps/encode_keychange.c
-+++ b/apps/encode_keychange.c
-@@ -108,7 +108,7 @@ int             _getch(void);
- int
- main(int argc, char **argv)
- {
--    int             rval = SNMPERR_SUCCESS;
-+    int             rval = 1;
-     size_t          oldKu_len = SNMP_MAXBUF_SMALL,
-         newKu_len = SNMP_MAXBUF_SMALL,
-         oldkul_len = SNMP_MAXBUF_SMALL,
-@@ -170,6 +170,7 @@ main(int argc, char **argv)
-             break;
-         case 'h':
-             rval = 0;
-+	    /* fallthrough */
-         default:
-             usage_to_file(stdout);
-             exit(rval);
-@@ -201,7 +202,7 @@ main(int argc, char **argv)
-                 "Unrecognized hash transform: \"%s\".\n",
-                 transform_type_input);
-         usage_synopsis(stderr);
--        QUITFUN(rval = SNMPERR_GENERR, main_quit);
-+        QUITFUN(SNMPERR_GENERR, main_quit);
-     }
- 
-     if (verbose) {
-@@ -254,12 +255,12 @@ main(int argc, char **argv)
-     if (strlen(oldpass) < USM_LENGTH_P_MIN) {
-         fprintf(stderr, "Old passphrase must be greater than %d "
-                 "characters in length.\n", USM_LENGTH_P_MIN);
--        QUITFUN(rval = SNMPERR_GENERR, main_quit);
-+        QUITFUN(SNMPERR_GENERR, main_quit);
- 
-     } else if (strlen(newpass) < USM_LENGTH_P_MIN) {
-         fprintf(stderr, "New passphrase must be greater than %d "
-                 "characters in length.\n", USM_LENGTH_P_MIN);
--        QUITFUN(rval = SNMPERR_GENERR, main_quit);
-+        QUITFUN(SNMPERR_GENERR, main_quit);
-     }
- 
-     if (verbose) {
-@@ -503,13 +504,13 @@ get_user_passphrases(void)
-      */
-     if (stat(path, &statbuf) < 0) {
-         fprintf(stderr, "Cannot access directory \"%s\".\n", path);
--        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
-+        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
- #ifndef WIN32
-     } else if (statbuf.st_mode & (S_IRWXG | S_IRWXO)) {
-         fprintf(stderr,
-                 "Directory \"%s\" is accessible by group or world.\n",
-                 path);
--        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
-+        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
- #endif                          /* !WIN32 */
-     }
- 
-@@ -520,12 +521,12 @@ get_user_passphrases(void)
-     path[ sizeof(path)-1 ] = 0;
-     if (stat(path, &statbuf) < 0) {
-         fprintf(stderr, "Cannot access file \"%s\".\n", path);
--        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
-+        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
- #ifndef WIN32
-     } else if (statbuf.st_mode & (S_IRWXG | S_IRWXO)) {
-         fprintf(stderr,
-                 "File \"%s\" is accessible by group or world.\n", path);
--        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
-+        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
- #endif                          /* !WIN32 */
-     }
- 
-@@ -534,7 +535,7 @@ get_user_passphrases(void)
-      */
-     if ((fp = fopen(path, "r")) == NULL) {
-         fprintf(stderr, "Cannot open \"%s\".", path);
--        QUITFUN(rval = SNMPERR_GENERR, get_user_passphrases_quit);
-+        QUITFUN(SNMPERR_GENERR, get_user_passphrases_quit);
-     }
- 
-     /*
-diff --git a/apps/snmpbulkwalk.c b/apps/snmpbulkwalk.c
-index 62874fa..379d2ae 100644
---- a/apps/snmpbulkwalk.c
-+++ b/apps/snmpbulkwalk.c
-@@ -184,7 +184,7 @@ main(int argc, char *argv[])
-     size_t          rootlen;
-     int             count;
-     int             running;
--    int             status;
-+    int             status = STAT_ERROR;
-     int             check;
-     int             exitval = 0;
- 
-diff --git a/apps/snmpdelta.c b/apps/snmpdelta.c
-index e334698..08e2ebc 100644
---- a/apps/snmpdelta.c
-+++ b/apps/snmpdelta.c
-@@ -471,7 +471,7 @@ main(int argc, char *argv[])
-                 printf("\t%s", vip->descriptor);
-         } else {
-             vip->oidlen = 0;
--            strcpy(vip->descriptor, SumFile);
-+            strlcpy(vip->descriptor, SumFile, sizeof(vip->descriptor));
-         }
-         vip->value = 0;
-         zeroU64(&vip->c64value);
-diff --git a/apps/snmpnetstat/inet.c b/apps/snmpnetstat/inet.c
-index 00b14e0..0ae810d 100644
---- a/apps/snmpnetstat/inet.c
-+++ b/apps/snmpnetstat/inet.c
-@@ -249,7 +249,7 @@ tcpprotopr_bulkget(const char *name, oid *root, size_t root_len)
- 	/*
-      * setup initial object name
-      */
--	memmove(tcpConnState_oid, root, sizeof(root) * root_len);
-+	memmove(tcpConnState_oid, root, sizeof(oid) * root_len);
- 	tcpConnState_len = root_len;
- 
-     /*
-diff --git a/apps/snmpnetstat/inet6.c b/apps/snmpnetstat/inet6.c
-index bad4db9..d4ad391 100644
---- a/apps/snmpnetstat/inet6.c
-+++ b/apps/snmpnetstat/inet6.c
-@@ -128,7 +128,7 @@ tcp6protopr(const char *name)
-         return;
- 
-     for (vp = var; vp ; vp=vp->next_variable) {
--        state = *var->val.integer;
-+        state = *vp->val.integer;
-         if (!aflag && state == MIB_TCPCONNSTATE_LISTEN)
-             continue;
- 
-@@ -144,12 +144,12 @@ tcp6protopr(const char *name)
-         
-         /* Extract the local/remote information from the index values */
-         for (i=0; i<16; i++)
--            localAddr[i]  = var->name[ 10+i ];
--        localPort    = var->name[ 26 ];
-+            localAddr[i]  = vp->name[ 10+i ];
-+        localPort    = vp->name[ 26 ];
-         for (i=0; i<16; i++)
--            remoteAddr[i] = var->name[ 27+i ];
--        remotePort   = var->name[ 43 ];
--        ifIndex      = var->name[ 44 ];
-+            remoteAddr[i] = vp->name[ 27+i ];
-+        remotePort   = vp->name[ 43 ];
-+        ifIndex      = vp->name[ 44 ];
- 
-         printf("%-5.5s", name);
-         inet6print(localAddr,  localPort,  name, 1);
-@@ -196,9 +196,9 @@ udp6protopr(const char *name)
-          *   the IP address from the varbind value, (which is why
-          *   we walked udpLocalAddress rather than udpLocalPort)
-          */
--        localPort = var->name[ var->name_length-2 ];
--        ifIndex   = var->name[ var->name_length-1 ];
--        inet6print(var->val.string, localPort, name, 1);
-+        localPort = vp->name[ vp->name_length-2 ];
-+        ifIndex   = vp->name[ vp->name_length-1 ];
-+        inet6print(vp->val.string, localPort, name, 1);
-         printf(" %4d\n", ifIndex );
-     }
-     snmp_free_varbind( var );
-@@ -223,20 +223,21 @@ _dump_v6stats( const char *name, oid *oid_buf, size_t buf_len,
- {
-     netsnmp_variable_list *var, *vp;
-     struct stat_table     *sp;
--    oid   *stats, stat;
-+    long   *stats;
-+    oid stat;
-     unsigned int max_stat = 0;
-     int    active   = 0;
- 
-     var = NULL;
-     for (sp=stable; sp->entry; sp++) {
-         oid_buf[buf_len-1] = sp->entry;
--        if (sp->entry>max_stat)
-+        if (sp->entry > max_stat)
-             max_stat = sp->entry;
-         snmp_varlist_add_variable( &var, oid_buf, buf_len,
-                                    ASN_NULL, NULL,  0);
-     }
-     oid_buf[buf_len-1] = stable[0].entry;
--    stats = (oid *)calloc(max_stat+1, sizeof(oid));
-+    stats = (long *)calloc(max_stat+1, sizeof(long));
-     
-     /*
-      * Walk the specified column(s), and total the individual statistics
-@@ -244,12 +245,12 @@ _dump_v6stats( const char *name, oid *oid_buf, size_t buf_len,
-     while (1) {
-         if (netsnmp_query_getnext( var, ss ) != SNMP_ERR_NOERROR)
-             break;
--        if ( snmp_oid_compare( oid_buf,   buf_len-1,
--                               var->name, buf_len-1) != 0 )
-+        if ( snmp_oid_compare( oid_buf,   buf_len,
-+                               var->name, buf_len) != 0 )
-             break;    /* End of Table */
-             
-         for ( vp=var; vp; vp=vp->next_variable ) {
--            stat = var->name[ buf_len-1 ];
-+            stat = vp->name[ buf_len-1 ];
-             stats[stat] += *vp->val.integer;
-         }
-         active=1;
-diff --git a/apps/snmpset.c b/apps/snmpset.c
-index aaacf8c..1b29a6c 100644
---- a/apps/snmpset.c
-+++ b/apps/snmpset.c
-@@ -171,6 +171,7 @@ main(int argc, char *argv[])
-             case '=':
-             case 'i':
-             case 'u':
-+            case '3':
-             case 't':
-             case 'a':
-             case 'o':
-diff --git a/apps/snmptls.c b/apps/snmptls.c
-index 7dffcd9..93b648b 100644
---- a/apps/snmptls.c
-+++ b/apps/snmptls.c
-@@ -332,7 +332,7 @@ optProc(int argc, char *const *argv, int opt)
- 
- 	    case 's':
-                 if (optind < argc) {
--                    if (isdigit(argv[optind][0]))
-+                    if (isdigit(0xFF & argv[optind][0]))
-                         _storage_type = atoi(argv[optind++]);
-                     else
-                         _storage_type_str = argv[optind++];
-@@ -345,7 +345,7 @@ optProc(int argc, char *const *argv, int opt)
-                 
- 	    case 'h':
-                 if (optind < argc) {
--                    if (isdigit(argv[optind][0]))
-+                    if (isdigit(0xFF & argv[optind][0]))
-                         _hash_type = atoi(argv[optind++]);
-                 }
-                 else {
-diff --git a/apps/snmptrapd.c b/apps/snmptrapd.c
-index 7742eff..1a52080 100644
---- a/apps/snmptrapd.c
-+++ b/apps/snmptrapd.c
-@@ -217,8 +217,6 @@ LPCTSTR         app_name_long = _T("Net-SNMP Trap Handler");     /* Application
- 
- const char     *app_name = "snmptrapd";
- 
--struct timeval  Now;
--
- void            trapd_update_config(void);
- 
- #ifdef WIN32SERVICE
-@@ -360,8 +358,8 @@ pre_parse(netsnmp_session * session, netsnmp_transport *transport,
-       if ( tcpudpaddr != 0 ) {
- 	char sbuf[64];
- 	char *xp;
--	strncpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
--        sbuf[sizeof(sbuf)-1] = '\0';
-+
-+	strlcpy(sbuf, tcpudpaddr + 1, sizeof(sbuf));
-         xp = strstr(sbuf, "]");
-         if (xp)
-             *xp = '\0';
-@@ -423,15 +421,20 @@ void
- parse_trapd_address(const char *token, char *cptr)
- {
-     char buf[BUFSIZ];
-+    char *p;
-     cptr = copy_nword(cptr, buf, sizeof(buf));
- 
-     if (default_port == ddefault_port) {
-         default_port = strdup(buf);
-     } else {
--        strcat( buf, "," );
--        strcat( buf, default_port );
-+        p = malloc(strlen(buf) + 1 + strlen(default_port) + 1);
-+        if (p) {
-+            strcat(p, buf);
-+            strcat(p, ",");
-+            strcat(p, default_port );
-+        }
-         free(default_port);
--        default_port = strdup(buf);
-+        default_port = p;
-     }
- }
- 
-@@ -469,13 +472,10 @@ parse_config_pidFile(const char *token, char *cptr)
- void
- parse_config_agentuser(const char *token, char *cptr)
- {
--#if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
--    struct passwd  *info;
--#endif
--
-     if (cptr[0] == '#') {
-         char           *ecp;
-         int             uid;
-+
-         uid = strtoul(cptr + 1, &ecp, 10);
-         if (*ecp != 0) {
-             config_perror("Bad number");
-@@ -483,44 +483,47 @@ parse_config_agentuser(const char *token, char *cptr)
- 	    netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 			       NETSNMP_DS_AGENT_USERID, uid);
- 	}
--    }
- #if defined(HAVE_GETPWNAM) && defined(HAVE_PWD_H)
--    else if ((info = getpwnam(cptr)) != NULL) {
--        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
--			   NETSNMP_DS_AGENT_USERID, info->pw_uid);
-     } else {
--        config_perror("User not found in passwd database");
--    }
--    endpwent();
-+        struct passwd *info;
-+
-+        info = getpwnam(cptr);
-+        if (info)
-+            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
-+                               NETSNMP_DS_AGENT_USERID, info->pw_uid);
-+        else
-+            config_perror("User not found in passwd database");
-+        endpwent();
- #endif
-+    }
- }
- 
- void
- parse_config_agentgroup(const char *token, char *cptr)
- {
--#if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
--    struct group   *info;
--#endif
--
-     if (cptr[0] == '#') {
-         char           *ecp;
-         int             gid = strtoul(cptr + 1, &ecp, 10);
-+
-         if (*ecp != 0) {
-             config_perror("Bad number");
- 	} else {
-             netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 			       NETSNMP_DS_AGENT_GROUPID, gid);
- 	}
--    }
- #if defined(HAVE_GETGRNAM) && defined(HAVE_GRP_H)
--    else if ((info = getgrnam(cptr)) != NULL) {
--        netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
--			   NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
-     } else {
--        config_perror("Group not found in group database");
--    }
--    endpwent();
-+        struct group   *info;
-+
-+        info = getgrnam(cptr);
-+        if (info)
-+            netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
-+                               NETSNMP_DS_AGENT_GROUPID, info->gr_gid);
-+        else
-+            config_perror("Group not found in group database");
-+        endgrent();
- #endif
-+    }
- }
- #endif
- 
-@@ -550,6 +553,74 @@ parse_config_outputOption(const char *token, char *cptr)
-   }
- }
- 
-+static void
-+snmptrapd_main_loop(void)
-+{
-+    int             count, numfds, block;
-+    fd_set          readfds,writefds,exceptfds;
-+    struct timeval  timeout, *tvp;
-+
-+    while (netsnmp_running) {
-+        if (reconfig) {
-+                /*
-+                 * If we are logging to a file, receipt of SIGHUP also
-+                 * indicates that the log file should be closed and
-+                 * re-opened.  This is useful for users that want to
-+                 * rotate logs in a more predictable manner.
-+                 */
-+                netsnmp_logging_restart();
-+                snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
-+                         netsnmp_get_version());
-+            trapd_update_config();
-+            if (trap1_fmt_str_remember) {
-+                parse_format( NULL, trap1_fmt_str_remember );
-+            }
-+            reconfig = 0;
-+        }
-+        numfds = 0;
-+        FD_ZERO(&readfds);
-+        FD_ZERO(&writefds);
-+        FD_ZERO(&exceptfds);
-+        block = 0;
-+        tvp = &timeout;
-+        timerclear(tvp);
-+        tvp->tv_sec = 5;
-+        snmp_select_info(&numfds, &readfds, tvp, &block);
-+        if (block == 1)
-+            tvp = NULL;         /* block without timeout */
-+#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
-+        netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds);
-+#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
-+        count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
-+        if (count > 0) {
-+#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
-+            netsnmp_dispatch_external_events(&count, &readfds, &writefds,
-+                                             &exceptfds);
-+#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
-+            /* If there are any more events after external events, then
-+             * try SNMP events. */
-+            if (count > 0) {
-+                snmp_read(&readfds);
-+            }
-+        } else {
-+            switch (count) {
-+            case 0:
-+                snmp_timeout();
-+                break;
-+            case -1:
-+                if (errno == EINTR)
-+                    continue;
-+                snmp_log_perror("select");
-+                netsnmp_running = 0;
-+                break;
-+            default:
-+                fprintf(stderr, "select returned %d\n", count);
-+                netsnmp_running = 0;
-+            }
-+	}
-+	run_alarms();
-+    }
-+}
- 
- /*******************************************************************-o-******
-  * main - Non Windows
-@@ -579,9 +650,6 @@ main(int argc, char *argv[])
-     netsnmp_transport *transport = NULL;
-     int             arg, i = 0;
-     int             uid = 0, gid = 0;
--    int             count, numfds, block;
--    fd_set          readfds,writefds,exceptfds;
--    struct timeval  timeout, *tvp;
-     char           *cp, *listen_ports = NULL;
- #if defined(USING_AGENTX_SUBAGENT_MODULE) && !defined(NETSNMP_SNMPTRAPD_DISABLE_AGENTX)
-     int             agentx_subagent = 1;
-@@ -732,7 +800,7 @@ main(int argc, char *argv[])
-                         *cp = ' ';
-                 } else {
-                     /* Old style: implicitly "print=format" */
--                    trap1_fmt_str_remember = (char *)malloc(strlen(optarg) + 7);
-+                    trap1_fmt_str_remember = malloc(strlen(optarg) + 7);
-                     sprintf( trap1_fmt_str_remember, "print %s", optarg );
-                 }
-             } else {
-@@ -863,19 +931,18 @@ main(int argc, char *argv[])
-                 char           *ecp;
- 
-                 uid = strtoul(optarg, &ecp, 10);
--                if (*ecp) {
- #if HAVE_GETPWNAM && HAVE_PWD_H
-+                if (*ecp) {
-                     struct passwd  *info;
-+
-                     info = getpwnam(optarg);
--                    if (info) {
--                        uid = info->pw_uid;
--                    } else {
--#endif
--                        fprintf(stderr, "Bad user id: %s\n", optarg);
--                        exit(1);
--#if HAVE_GETPWNAM && HAVE_PWD_H
--                    }
-+                    uid = info ? info->pw_uid : -1;
-+                    endpwent();
-+                }
- #endif
-+                if (uid < 0) {
-+                    fprintf(stderr, "Bad user id: %s\n", optarg);
-+                    exit(1);
-                 }
-                 netsnmp_ds_set_int(NETSNMP_DS_APPLICATION_ID, 
- 				   NETSNMP_DS_AGENT_USERID, uid);
-@@ -916,7 +983,7 @@ main(int argc, char *argv[])
-         for (i = optind; i < argc; i++) {
-             char *astring;
-             if (listen_ports != NULL) {
--                astring = (char *)malloc(strlen(listen_ports) + 2 + strlen(argv[i]));
-+                astring = malloc(strlen(listen_ports) + 2 + strlen(argv[i]));
-                 if (astring == NULL) {
-                     fprintf(stderr, "malloc failure processing argv[%d]\n", i);
-                     exit(1);
-@@ -1247,66 +1314,8 @@ main(int argc, char *argv[])
- #ifdef WIN32SERVICE
-     trapd_status = SNMPTRAPD_RUNNING;
- #endif
--    while (netsnmp_running) {
--        if (reconfig) {
--                /*
--                 * If we are logging to a file, receipt of SIGHUP also
--                 * indicates the the log file should be closed and
--                 * re-opened.  This is useful for users that want to
--                 * rotate logs in a more predictable manner.
--                 */
--                netsnmp_logging_restart();
--                snmp_log(LOG_INFO, "NET-SNMP version %s restarted\n",
--                         netsnmp_get_version());
--            trapd_update_config();
--            if (trap1_fmt_str_remember) {
--                parse_format( NULL, trap1_fmt_str_remember );
--            }
--            reconfig = 0;
--        }
--        numfds = 0;
--        FD_ZERO(&readfds);
--        FD_ZERO(&writefds);
--        FD_ZERO(&exceptfds);
--        block = 0;
--        tvp = &timeout;
--        timerclear(tvp);
--        tvp->tv_sec = 5;
--        snmp_select_info(&numfds, &readfds, tvp, &block);
--        if (block == 1)
--            tvp = NULL;         /* block without timeout */
--#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
--        netsnmp_external_event_info(&numfds, &readfds, &writefds, &exceptfds);
--#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
--        count = select(numfds, &readfds, &writefds, &exceptfds, tvp);
--        gettimeofday(&Now, NULL);
--        if (count > 0) {
--#ifndef NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER
--            netsnmp_dispatch_external_events(&count, &readfds, &writefds,
--                                             &exceptfds);
--#endif /* NETSNMP_FEATURE_REMOVE_FD_EVENT_MANAGER */
--            /* If there are any more events after external events, then
--             * try SNMP events. */
--            if (count > 0) {
--                snmp_read(&readfds);
--            }
--        } else
--            switch (count) {
--            case 0:
--                snmp_timeout();
--                break;
--            case -1:
--                if (errno == EINTR)
--                    continue;
--                snmp_log_perror("select");
--                netsnmp_running = 0;
--                break;
--            default:
--                fprintf(stderr, "select returned %d\n", count);
--                netsnmp_running = 0;
--            }
--	run_alarms();
--    }
-+
-+    snmptrapd_main_loop();
- 
-     if (snmp_get_do_logging()) {
-         struct tm      *tm;
-diff --git a/apps/snmptrapd_log.c b/apps/snmptrapd_log.c
-index c1742f4..774f797 100644
---- a/apps/snmptrapd_log.c
-+++ b/apps/snmptrapd_log.c
-@@ -1020,6 +1020,8 @@ realloc_handle_auth_fmt(u_char ** buf, size_t * buf_len, size_t * out_len,
- #if !defined(NETSNMP_DISABLE_SNMPV1) || !defined(NETSNMP_DISABLE_SNMPV2C)
-             while ((*out_len + pdu->community_len + 1) >= *buf_len) {
-                 if (!(allow_realloc && snmp_realloc(buf, buf_len))) {
-+                    if (temp_buf)
-+                        free(temp_buf);
-                     return 0;
-                 }
-             }
-diff --git a/apps/snmptrapd_sql.c b/apps/snmptrapd_sql.c
-index c7433dc..ccba258 100644
---- a/apps/snmptrapd_sql.c
-+++ b/apps/snmptrapd_sql.c
-@@ -437,7 +437,11 @@ netsnmp_mysql_init(void)
-         return -1;
-     }
- 
-+#ifdef HAVE_BROKEN_LIBMYSQLCLIENT
-+    my_init();
-+#else
-     MY_INIT("snmptrapd");
-+#endif
- 
-     /** load .my.cnf values */
-     load_defaults ("my", _sql.groups, &not_argc, &not_argv);
-@@ -704,7 +708,7 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu  *pdu,
-     struct tm   *cur_time;
-     size_t       tmp_size;
-     size_t       buf_host_len_t, buf_oid_len_t, buf_user_len_t;
--    int          oid_overflow, rc, trap_oid_len;
-+    int          oid_overflow, trap_oid_len;
-     netsnmp_variable_list *vars;
- 
-     if ((NULL == sqlb) || (NULL == pdu) || (NULL == transport))
-@@ -727,8 +731,8 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu  *pdu,
-     /** host name */
-     buf_host_len_t = 0;
-     tmp_size = sizeof(sqlb->host);
--    rc = realloc_format_trap((u_char**)&sqlb->host, &tmp_size,
--                             &buf_host_len_t, 1, "%B", pdu, transport);
-+    realloc_format_trap((u_char**)&sqlb->host, &tmp_size,
-+                        &buf_host_len_t, 1, "%B", pdu, transport);
-     sqlb->host_len = buf_host_len_t;
- 
-     /* snmpTrapOID */
-@@ -782,8 +786,8 @@ _sql_save_trap_info(sql_buf *sqlb, netsnmp_pdu  *pdu,
-     /** community string/user name */
-     tmp_size = 0;
-     buf_user_len_t = 0;
--    rc = realloc_format_trap((u_char**)&sqlb->user, &tmp_size,
--                             &buf_user_len_t, 1, "%u", pdu, transport);
-+    realloc_format_trap((u_char**)&sqlb->user, &tmp_size,
-+                        &buf_user_len_t, 1, "%u", pdu, transport);
-     sqlb->user_len = buf_user_len_t;
- 
-     /** transport */
-diff --git a/apps/snmpwalk.c b/apps/snmpwalk.c
-index 7473b91..2bed0e8 100644
---- a/apps/snmpwalk.c
-+++ b/apps/snmpwalk.c
-@@ -185,7 +185,7 @@ main(int argc, char *argv[])
-     size_t          end_len = 0;
-     int             count;
-     int             running;
--    int             status;
-+    int             status = STAT_ERROR;
-     int             check;
-     int             exitval = 0;
-     struct timeval  tv1, tv2, tv_a, tv_b;
-diff --git a/configure b/configure
-index 8b2a66f..77c0475 100755
---- a/configure
-+++ b/configure
-@@ -3434,6 +3434,10 @@ if test "${with_openssl+set}" = set; then :
-     elif test "x$withval" = "xno"; then
-       tryopenssl=no
-     elif test -d "$withval"; then
-+      if test -d "$withval/lib/MinGW"; then
-+        LDFLAGS="-L$withval/lib/MinGW $LDFLAGS"
-+        CPPFLAGS="-I$withval/include $CPPFLAGS"
-+      else
- 
-   if test "x$withval" != x -a -d $withval; then
-      if test -d $withval/lib; then
-@@ -3444,6 +3448,7 @@ if test "${with_openssl+set}" = set; then :
-      fi
-   fi
- 
-+      fi
-       tryopenssl=yes
-       askedopenssl=yes
-     fi
-@@ -16180,8 +16185,29 @@ fi
- done
- 
- 
-+#  Library and Agent:
-+for ac_header in nlist.h
-+do :
-+  ac_fn_c_check_header_compile "$LINENO" "nlist.h" "ac_cv_header_nlist_h" "
-+$ac_includes_default
-+
-+#ifndef LIBBSD_DISABLE_DEPRECATED
-+#define LIBBSD_DISABLE_DEPRECATED 1
-+#endif
-+
-+"
-+if test "x$ac_cv_header_nlist_h" = xyes; then :
-+  cat >>confdefs.h <<_ACEOF
-+#define HAVE_NLIST_H 1
-+_ACEOF
-+
-+fi
-+
-+done
-+
-+
- #  Library:
--for ac_header in fcntl.h    io.h       kstat.h                                   limits.h   locale.h   nlist.h                                   sys/file.h       sys/ioctl.h                           sys/sockio.h     sys/stat.h                            sys/systemcfg.h  sys/systeminfo.h                      sys/times.h      sys/uio.h                             sys/utsname.h                        netipx/ipx.h
-+for ac_header in fcntl.h    io.h       kstat.h                                   limits.h   locale.h                                    sys/file.h       sys/ioctl.h                           sys/sockio.h     sys/stat.h                            sys/systemcfg.h  sys/systeminfo.h                      sys/times.h      sys/uio.h                             sys/utsname.h                        netipx/ipx.h
- do :
-   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-@@ -16196,7 +16222,7 @@ done
- 
- 
- #  Agent:
--for ac_header in dlfcn.h    err.h      fcntl.h    fstab.h                                   grp.h      io.h                                      ioctls.h   kstat.h    kvm.h      limits.h                                  mntent.h   mtab.h                                    nlist.h    pkglocs.h             pwd.h                                     utmpx.h    utsname.h
-+for ac_header in dlfcn.h    err.h      fcntl.h    fstab.h                                   grp.h      io.h                                      ioctls.h   kstat.h    kvm.h      limits.h                                  mntent.h   mtab.h                                               pkglocs.h             pwd.h                                     utmpx.h    utsname.h
- do :
-   as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh`
- ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default"
-@@ -18318,7 +18344,7 @@ while test "x$new_transport_list" != "x"; do
- /* end confdefs.h.  */
- 
- #include NETSNMP_SYSTEM_INCLUDE_FILE
--#define NETSNMP_FEATURE_CHECKING
-+#undef NETSNMP_MINIMAL_CODE
- #define NET_SNMP_CONFIG_H
- #undef config_require
- #define config_require(foo) config_checkit_require(foo)
-@@ -19861,6 +19887,99 @@ done
- 
- LIBS="$netsnmp_save_LIBS"
- 
-+#
-+#   dynamic module support
-+#
-+
-+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
-+$as_echo_n "checking for library containing dlopen... " >&6; }
-+if ${netsnmp_cv_func_dlopen_LMIBLIBS+:} false; then :
-+  $as_echo_n "(cached) " >&6
-+else
-+  netsnmp_func_search_save_LIBS="$LIBS"
-+     netsnmp_target_val="$LMIBLIBS"
-+          netsnmp_temp_LIBS="${netsnmp_target_val} $LAGENTLIBS $LSNMPLIBS ${LIBS}"
-+     netsnmp_result=no
-+     LIBS="${netsnmp_temp_LIBS}"
-+     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h.  */
-+
-+/* Override any GCC internal prototype to avoid an error.
-+   Use char because int might match the return type of a GCC
-+   builtin and then its argument prototype would still apply.  */
-+#ifdef __cplusplus
-+extern "C"
-+#endif
-+char dlopen ();
-+int
-+main ()
-+{
-+return dlopen ();
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_link "$LINENO"; then :
-+  netsnmp_result="none required"
-+else
-+  for netsnmp_cur_lib in dl ; do
-+              LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}"
-+              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h.  */
-+
-+/* Override any GCC internal prototype to avoid an error.
-+   Use char because int might match the return type of a GCC
-+   builtin and then its argument prototype would still apply.  */
-+#ifdef __cplusplus
-+extern "C"
-+#endif
-+char dlopen ();
-+int
-+main ()
-+{
-+return dlopen ();
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_link "$LINENO"; then :
-+  netsnmp_result=-l${netsnmp_cur_lib}
-+                   break
-+fi
-+rm -f core conftest.err conftest.$ac_objext \
-+    conftest$ac_exeext conftest.$ac_ext
-+          done
-+fi
-+rm -f core conftest.err conftest.$ac_objext \
-+    conftest$ac_exeext conftest.$ac_ext
-+     LIBS="${netsnmp_func_search_save_LIBS}"
-+     netsnmp_cv_func_dlopen_LMIBLIBS="${netsnmp_result}"
-+fi
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_dlopen_LMIBLIBS" >&5
-+$as_echo "$netsnmp_cv_func_dlopen_LMIBLIBS" >&6; }
-+ if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "no" ; then
-+    if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "none required" ; then
-+       LMIBLIBS="${netsnmp_result} ${netsnmp_target_val}"
-+    fi
-+
-+
-+ fi
-+
-+netsnmp_save_LIBS="$LIBS"
-+LIBS="$LMIBLIBS $LAGENTLIBS $LSNMPLIBS $LIBS"
-+for ac_func in dlopen
-+do :
-+  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
-+if test "x$ac_cv_func_dlopen" = xyes; then :
-+  cat >>confdefs.h <<_ACEOF
-+#define HAVE_DLOPEN 1
-+_ACEOF
-+
-+fi
-+done
-+
-+LIBS="$netsnmp_save_LIBS"
-+
- # -*- autoconf -*-
- #
- # generate empty files
-@@ -20087,7 +20206,8 @@ _ACEOF
-     module_type=mib_module
-     if test -f $srcdir/$mibdir/$i.h; then
- 
--      module_type=`$MODULECPP module_tmp_header.h | $GREP config_belongs_in | $SED 's@.*config_belongs_in(\([^)]*\)).*@\1@'`
-+      module_type=`$MODULECPP module_tmp_header.h | \
-+                   $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'`
- 
-     fi
-     if test "x$module_type" = "x" ; then
-@@ -20188,7 +20308,8 @@ _ACEOF
-         # check if $i has any conflicts
-         #
- 
--	new_list_excl=`$MODULECPP module_tmp_header.h | $GREP config_exclude | $SED 's/.*config_exclude(\(.*\)).*/\1/'`
-+        new_list_excl=`$MODULECPP module_tmp_header.h | \
-+                       $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'`
- 	if test "x$new_list_excl" != "x"; then
- 
-   if test $module_debug = 1; then
-@@ -20233,7 +20354,8 @@ EOF
-         #
- 
- 
--        new_list_arch=`$MODULECPP module_tmp_header.h | $GREP config_arch_require | $SED 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/'`
-+        new_list_arch=`$MODULECPP module_tmp_header.h | \
-+                       $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'`
- 
- 	if test "x$new_list_arch" != "x"; then
-           for j in $new_list_arch
-@@ -20264,11 +20386,7 @@ EOF
-         #
- 
-         new_list_alt3=`$MODULECPP module_tmp_header.h | \
--            $GREP config_version_require | \
--            $SED -e 's/  */ /g' \
--                 -e 's/.*config_version_require(( *\([^)]*\) *)).*/\1/' \
--                 -e 's/ *, */,/g' | \
--            awk '
-+            $AWK '
-                 BEGIN {
-                     if("'"$enable_new_features"'" == "yes")
-                         method="max";
-@@ -20280,7 +20398,10 @@ EOF
-                     split("'"$with_features_of"'", a);
-                     version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]);
-                 }
--                {
-+                /config_version_require/ {
-+                    gsub("^.*config_version_require *\\\\(\\\\(", "");
-+                    gsub("\\\\)\\\\).*$", "");
-+                    gsub(", *", ",");
-                     FS = ",";
-                     n = split($0, a);
-                     FS = ".";
-@@ -20311,7 +20432,8 @@ EOF
-         # check if $i has any other required modules
-         #
- 
--	new_list="$new_list `$MODULECPP module_tmp_header.h | $GREP config_require | $SED 's/.*config_require(\(.*\)).*/\1/'`"
-+        new_list="$new_list `$MODULECPP module_tmp_header.h | \
-+                  $SED -n 's/.*config_require(\(.*\)).*/\1/p'`"
- 
-   if test $module_debug = 1; then
-     echo " $i will test: $new_list"
-@@ -20369,7 +20491,8 @@ EOF
-         # check if $i has any mibs to add
-         #
- 
--	new_mibs=`$MODULECPP module_tmp_header.h | $GREP config_add_mib | $SED 's/.*config_add_mib(\(.*\)).*/\1/'`
-+        new_mibs=`$MODULECPP module_tmp_header.h | \
-+                  $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'`
- 	if test "x$new_mibs" != "x"; then
- 	    for j in $new_mibs
- 		do
-@@ -20410,7 +20533,7 @@ EOF
-         #-------------------
-         # check for unsupported config_load_mib
-         #
--        if $MODULECPP module_tmp_header.h | $GREP config_load_mib > /dev/null 2>&1; then
-+        if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then
-           { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mib module error" >&5
- $as_echo "$as_me: WARNING: mib module error" >&2;}
-       	  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: mib module \"$i\" uses the \"config_load_mib\" directive, which is no longer supported.  It probably won't work." >&5
-@@ -20423,7 +20546,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct
-         #
- 
- 
--        $MODULECPP module_tmp_header.h | $GREP config_parse_dot_conf | $SED 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@' >> $mibdir/mib_module_dot_conf.h
-+        $MODULECPP module_tmp_header.h | \
-+        $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h
- 
- 
-         #---------------------
-@@ -20433,7 +20557,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct
-         # check if $i has any errors, or warnings
-         #
- 
--	error=`$MODULECPP module_tmp_header.h | $GREP config_error | $SED 's/.*config_error(\(.*\)).*/\1/'`
-+        error=`$MODULECPP module_tmp_header.h | \
-+               $SED -n 's/.*config_error(\(.*\)).*/\1/p'`
- 	if test "x$error" != "x"; then
-           echo
-           echo
-@@ -20445,7 +20570,8 @@ $as_echo "$as_me: WARNING: mib module \"$i\" uses the \"config_load_mib\" direct
-       	#  - used to signal a configuration "warning" to be printed to the user
-         #
- 
--	warning=`$MODULECPP module_tmp_header.h | $GREP config_warning | $SED 's/.*config_warning(\(.*\)).*/\1/'`
-+        warning=`$MODULECPP module_tmp_header.h | \
-+                 $SED -n 's/.*config_warning(\(.*\)).*/\1/p'`
- 	if test "x$warning" != "x"; then
-           all_warnings="$all_warnings $warning
- "
-@@ -21653,99 +21779,6 @@ $as_echo "#define HAVE_LIBKSTAT 1" >>confdefs.h
- 
- 
- 
--#   dynamic module support
--#
--
-- { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing dlopen" >&5
--$as_echo_n "checking for library containing dlopen... " >&6; }
--if ${netsnmp_cv_func_dlopen_LMIBLIBS+:} false; then :
--  $as_echo_n "(cached) " >&6
--else
--  netsnmp_func_search_save_LIBS="$LIBS"
--     netsnmp_target_val="$LMIBLIBS"
--          netsnmp_temp_LIBS="${netsnmp_target_val}  ${LIBS}"
--     netsnmp_result=no
--     LIBS="${netsnmp_temp_LIBS}"
--     cat confdefs.h - <<_ACEOF >conftest.$ac_ext
--/* end confdefs.h.  */
--
--/* Override any GCC internal prototype to avoid an error.
--   Use char because int might match the return type of a GCC
--   builtin and then its argument prototype would still apply.  */
--#ifdef __cplusplus
--extern "C"
--#endif
--char dlopen ();
--int
--main ()
--{
--return dlopen ();
--  ;
--  return 0;
--}
--_ACEOF
--if ac_fn_c_try_link "$LINENO"; then :
--  netsnmp_result="none required"
--else
--  for netsnmp_cur_lib in dl ; do
--              LIBS="-l${netsnmp_cur_lib} ${netsnmp_temp_LIBS}"
--              cat confdefs.h - <<_ACEOF >conftest.$ac_ext
--/* end confdefs.h.  */
--
--/* Override any GCC internal prototype to avoid an error.
--   Use char because int might match the return type of a GCC
--   builtin and then its argument prototype would still apply.  */
--#ifdef __cplusplus
--extern "C"
--#endif
--char dlopen ();
--int
--main ()
--{
--return dlopen ();
--  ;
--  return 0;
--}
--_ACEOF
--if ac_fn_c_try_link "$LINENO"; then :
--  netsnmp_result=-l${netsnmp_cur_lib}
--                   break
--fi
--rm -f core conftest.err conftest.$ac_objext \
--    conftest$ac_exeext conftest.$ac_ext
--          done
--fi
--rm -f core conftest.err conftest.$ac_objext \
--    conftest$ac_exeext conftest.$ac_ext
--     LIBS="${netsnmp_func_search_save_LIBS}"
--     netsnmp_cv_func_dlopen_LMIBLIBS="${netsnmp_result}"
--fi
--{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $netsnmp_cv_func_dlopen_LMIBLIBS" >&5
--$as_echo "$netsnmp_cv_func_dlopen_LMIBLIBS" >&6; }
-- if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "no" ; then
--    if test "${netsnmp_cv_func_dlopen_LMIBLIBS}" != "none required" ; then
--       LMIBLIBS="${netsnmp_result} ${netsnmp_target_val}"
--    fi
--
--
-- fi
--
--netsnmp_save_LIBS="$LIBS"
--LIBS="$LMIBLIBS $LIBS"
--for ac_func in dlopen
--do :
--  ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen"
--if test "x$ac_cv_func_dlopen" = xyes; then :
--  cat >>confdefs.h <<_ACEOF
--#define HAVE_DLOPEN 1
--_ACEOF
--
--fi
--done
--
--LIBS="$netsnmp_save_LIBS"
--
--
- ##
- #   MIB-module-specific checks
- ##
-@@ -22482,6 +22515,54 @@ $as_echo "#define HAVE_AES_CFB128_ENCRYPT 1" >>confdefs.h
- 
- fi
- 
-+
-+            as_ac_Lib=`$as_echo "ac_cv_lib_${CRYPTO}''_EVP_MD_CTX_create" | $as_tr_sh`
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EVP_MD_CTX_create in -l${CRYPTO}" >&5
-+$as_echo_n "checking for EVP_MD_CTX_create in -l${CRYPTO}... " >&6; }
-+if eval \${$as_ac_Lib+:} false; then :
-+  $as_echo_n "(cached) " >&6
-+else
-+  ac_check_lib_save_LIBS=$LIBS
-+LIBS="-l${CRYPTO}  $LIBS"
-+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h.  */
-+
-+/* Override any GCC internal prototype to avoid an error.
-+   Use char because int might match the return type of a GCC
-+   builtin and then its argument prototype would still apply.  */
-+#ifdef __cplusplus
-+extern "C"
-+#endif
-+char EVP_MD_CTX_create ();
-+int
-+main ()
-+{
-+return EVP_MD_CTX_create ();
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_link "$LINENO"; then :
-+  eval "$as_ac_Lib=yes"
-+else
-+  eval "$as_ac_Lib=no"
-+fi
-+rm -f core conftest.err conftest.$ac_objext \
-+    conftest$ac_exeext conftest.$ac_ext
-+LIBS=$ac_check_lib_save_LIBS
-+fi
-+eval ac_res=\$$as_ac_Lib
-+	       { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-+$as_echo "$ac_res" >&6; }
-+if eval test \"x\$"$as_ac_Lib"\" = x"yes"; then :
-+
-+$as_echo "#define HAVE_EVP_MD_CTX_CREATE /**/" >>confdefs.h
-+
-+
-+$as_echo "#define HAVE_EVP_MD_CTX_DESTROY /**/" >>confdefs.h
-+
-+fi
-+
-         fi
-         if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
- 	    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for DTLSv1_method in -lssl" >&5
-@@ -22984,6 +23065,38 @@ fi
-   fi
-   MYSQL_LIBS=`$MYSQLCONFIG --libs`
-   MYSQL_INCLUDES=`$MYSQLCONFIG --cflags`
-+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether MY_INIT() works" >&5
-+$as_echo_n "checking whether MY_INIT() works... " >&6; }
-+  _libs="${LIBS}"
-+  _cppflags="${CPPFLAGS}"
-+  LIBS="${LIBS} ${MYSQL_LIBS}"
-+  CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}"
-+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h.  */
-+#include <mysql/my_global.h>
-+               #include <mysql/my_sys.h>
-+int
-+main ()
-+{
-+MY_INIT("my_init_test")
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_link "$LINENO"; then :
-+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+else
-+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+
-+$as_echo "#define HAVE_BROKEN_LIBMYSQLCLIENT 1" >>confdefs.h
-+
-+fi
-+rm -f core conftest.err conftest.$ac_objext \
-+    conftest$ac_exeext conftest.$ac_ext
-+  CPPFLAGS="${_cppflags}"
-+  LIBS="${_libs}"
- 
-   cat >> configure-summary << EOF
-   MYSQL Trap Logging:         enabled
-@@ -24771,7 +24884,7 @@ done
- 
- 
- #  Library:
--for ac_func in closedir        fork            getipnodebyname                  gettimeofday    if_nametoindex  mkstemp                          opendir         readdir         regcomp                          setenv          setitimer       setlocale                        setsid          snprintf        strcasestr                       strdup          strerror        strncasecmp                      sysconf         times           vsnprintf
-+for ac_func in closedir        fgetc_unlocked  flockfile                        fork            funlockfile     getipnodebyname                  gettimeofday    if_nametoindex  mkstemp                          opendir         readdir         regcomp                          setenv          setitimer       setlocale                        setsid          snprintf        strcasestr                       strdup          strerror        strncasecmp                      sysconf         times           vsnprintf
- do :
-   as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh`
- ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var"
-@@ -24941,6 +25054,19 @@ esac
- 
- fi
- 
-+ac_fn_c_check_func "$LINENO" "strlcat" "ac_cv_func_strlcat"
-+if test "x$ac_cv_func_strlcat" = xyes; then :
-+  $as_echo "#define HAVE_STRLCAT 1" >>confdefs.h
-+
-+else
-+  case " $LIBOBJS " in
-+  *" strlcat.$ac_objext "* ) ;;
-+  *) LIBOBJS="$LIBOBJS strlcat.$ac_objext"
-+ ;;
-+esac
-+
-+fi
-+
- ac_fn_c_check_func "$LINENO" "strlcpy" "ac_cv_func_strlcpy"
- if test "x$ac_cv_func_strlcpy" = xyes; then :
-   $as_echo "#define HAVE_STRLCPY 1" >>confdefs.h
-@@ -25651,6 +25777,28 @@ _ACEOF
- fi
- 
- 
-+#       struct ethtool_cmd
-+#
-+if test "x$ac_cv_header_linux_ethtool_h" = "xyes" ; then
-+ac_fn_c_check_member "$LINENO" "struct ethtool_cmd" "speed_hi" "ac_cv_member_struct_ethtool_cmd_speed_hi" "
-+    $ac_includes_default
-+
-+#ifdef HAVE_LINUX_ETHTOOL_H
-+#include <linux/ethtool.h>
-+#endif
-+
-+"
-+if test "x$ac_cv_member_struct_ethtool_cmd_speed_hi" = xyes; then :
-+
-+cat >>confdefs.h <<_ACEOF
-+#define HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI 1
-+_ACEOF
-+
-+
-+fi
-+
-+fi
-+
- #       struct ipstat
- #   Agent:
- #
-@@ -26526,6 +26674,50 @@ _ACEOF
- fi
- 
- 
-+#       extern timezone
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking extern timezone" >&5
-+$as_echo_n "checking extern timezone... " >&6; }
-+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-+/* end confdefs.h.  */
-+
-+#if TIME_WITH_SYS_TIME
-+# include <sys/time.h>
-+# include <time.h>
-+#else
-+# if HAVE_SYS_TIME_H
-+#  include <sys/time.h>
-+# else
-+#  include <time.h>
-+# endif
-+#endif
-+
-+int
-+main ()
-+{
-+
-+  return timezone;
-+
-+  ;
-+  return 0;
-+}
-+_ACEOF
-+if ac_fn_c_try_link "$LINENO"; then :
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-+$as_echo "yes" >&6; }
-+
-+$as_echo "#define HAVE_TIMEZONE_VARIABLE 1" >>confdefs.h
-+
-+
-+else
-+
-+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-+$as_echo "no" >&6; }
-+
-+fi
-+rm -f core conftest.err conftest.$ac_objext \
-+    conftest$ac_exeext conftest.$ac_ext
-+
- #       struct timezone
- #   Library:
- #
-diff --git a/configure.d/config_modules_agent b/configure.d/config_modules_agent
-index 87ec3a5..3272679 100644
---- a/configure.d/config_modules_agent
-+++ b/configure.d/config_modules_agent
-@@ -189,7 +189,8 @@ while test "x$new_module_list" != "x"; do
-     module_type=mib_module
-     if test -f $srcdir/$mibdir/$i.h; then
-       changequote(, )
--      module_type=`$MODULECPP module_tmp_header.h | $GREP config_belongs_in | $SED 's@.*config_belongs_in(\([^)]*\)).*@\1@'`
-+      module_type=`$MODULECPP module_tmp_header.h | \
-+                   $SED -n 's@.*config_belongs_in(\([^)]*\)).*@\1@p'`
-       changequote([, ])
-     fi
-     if test "x$module_type" = "x" ; then
-@@ -270,7 +271,8 @@ while test "x$new_module_list" != "x"; do
-         # check if $i has any conflicts
-         #
-         AH_TOP([#define config_exclude(x)])
--	new_list_excl=`$MODULECPP module_tmp_header.h | $GREP config_exclude | $SED 's/.*config_exclude(\(.*\)).*/\1/'`
-+        new_list_excl=`$MODULECPP module_tmp_header.h | \
-+                       $SED -n 's/.*config_exclude(\(.*\)).*/\1/p'`
- 	if test "x$new_list_excl" != "x"; then
-           AC_MSG_MODULE_DBG("$i excludes $new_list_excl")
- 	  for j in $new_list_excl
-@@ -299,7 +301,8 @@ while test "x$new_module_list" != "x"; do
-         #
-         AH_TOP([#define config_arch_require(x,y)])
-         changequote(, )
--        new_list_arch=`$MODULECPP module_tmp_header.h | $GREP config_arch_require | $SED 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/'`
-+        new_list_arch=`$MODULECPP module_tmp_header.h | \
-+                       $SED -n 's/.*config_arch_require( *\([^ ]*\) *, *\([^ ]*\) *).*/\1-xarchx-\2/p'`
-         changequote([, ])
- 	if test "x$new_list_arch" != "x"; then
-           for j in $new_list_arch
-@@ -320,11 +323,7 @@ while test "x$new_module_list" != "x"; do
-         #
-         AH_TOP([#define config_version_require(x)])
-         [new_list_alt3=`$MODULECPP module_tmp_header.h | \
--            $GREP config_version_require | \
--            $SED -e 's/  */ /g' \
--                 -e 's/.*config_version_require(( *\([^)]*\) *)).*/\1/' \
--                 -e 's/ *, */,/g' | \
--            awk '
-+            $AWK '
-                 BEGIN {
-                     if("'"$enable_new_features"'" == "yes")
-                         method="max";
-@@ -336,7 +335,10 @@ while test "x$new_module_list" != "x"; do
-                     split("'"$with_features_of"'", a);
-                     version=sprintf("%03d%03d%03d%03d", a[1], a[2], a[3], a[4]);
-                 }
--                {
-+                /config_version_require/ {
-+                    gsub("^.*config_version_require *\\\\(\\\\(", "");
-+                    gsub("\\\\)\\\\).*$", "");
-+                    gsub(", *", ",");
-                     FS = ",";
-                     n = split($0, a);
-                     FS = ".";
-@@ -362,7 +364,8 @@ while test "x$new_module_list" != "x"; do
-         # check if $i has any other required modules
-         #
-         AH_TOP([#define config_require(x)])
--	new_list="$new_list `$MODULECPP module_tmp_header.h | $GREP config_require | $SED 's/.*config_require(\(.*\)).*/\1/'`"
-+        new_list="$new_list `$MODULECPP module_tmp_header.h | \
-+                  $SED -n 's/.*config_require(\(.*\)).*/\1/p'`"
-         AC_MSG_MODULE_DBG(" $i will test: $new_list")
- 	if test "x$new_list" != "x"; then
- 	  for j in $new_list
-@@ -398,7 +401,8 @@ while test "x$new_module_list" != "x"; do
-         # check if $i has any mibs to add
-         #
-         AH_TOP([#define config_add_mib(x)])
--	new_mibs=`$MODULECPP module_tmp_header.h | $GREP config_add_mib | $SED 's/.*config_add_mib(\(.*\)).*/\1/'`
-+        new_mibs=`$MODULECPP module_tmp_header.h | \
-+                  $SED -n 's/.*config_add_mib(\(.*\)).*/\1/p'`
- 	if test "x$new_mibs" != "x"; then
- 	    for j in $new_mibs
- 		do
-@@ -434,7 +438,7 @@ while test "x$new_module_list" != "x"; do
-         #-------------------
-         # check for unsupported config_load_mib
-         #
--        if $MODULECPP module_tmp_header.h | $GREP config_load_mib > /dev/null 2>&1; then
-+        if $MODULECPP module_tmp_header.h | $GREP -q config_load_mib; then
-           AC_MSG_WARN([mib module error])
-       	  AC_MSG_WARN([mib module "$i" uses the "config_load_mib" directive, which is no longer supported.  It probably won't work.])
-         fi # grep config_load_mib
-@@ -445,7 +449,8 @@ while test "x$new_module_list" != "x"; do
-         #
-         AH_TOP([#define config_parse_dot_conf(w,x,y,z)])
-         changequote(, )
--        $MODULECPP module_tmp_header.h | $GREP config_parse_dot_conf | $SED 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@' >> $mibdir/mib_module_dot_conf.h
-+        $MODULECPP module_tmp_header.h | \
-+        $SED -n 's@.*config_parse_dot_conf(\([^)]*\), *\([^),]*\), *\([^),]*\), *\([^),]*\)).*@register_config_handler("snmpd",\1, \2, \3, \4);@p' >> $mibdir/mib_module_dot_conf.h
- 	changequote([, ])
- 
-         #---------------------
-@@ -455,7 +460,8 @@ while test "x$new_module_list" != "x"; do
-         # check if $i has any errors, or warnings
-         #
-         AH_TOP([#define config_error(x)])
--	error=`$MODULECPP module_tmp_header.h | $GREP config_error | $SED 's/.*config_error(\(.*\)).*/\1/'`
-+        error=`$MODULECPP module_tmp_header.h | \
-+               $SED -n 's/.*config_error(\(.*\)).*/\1/p'`
- 	if test "x$error" != "x"; then
-           echo
-           echo
-@@ -467,7 +473,8 @@ while test "x$new_module_list" != "x"; do
-       	#  - used to signal a configuration "warning" to be printed to the user
-         #
-         AH_TOP([#define config_warning(x)])
--	warning=`$MODULECPP module_tmp_header.h | $GREP config_warning | $SED 's/.*config_warning(\(.*\)).*/\1/'`
-+        warning=`$MODULECPP module_tmp_header.h | \
-+                 $SED -n 's/.*config_warning(\(.*\)).*/\1/p'`
- 	if test "x$warning" != "x"; then
-           all_warnings="$all_warnings $warning
- "
-diff --git a/configure.d/config_modules_transports b/configure.d/config_modules_transports
-index 2a49da8..b10b960 100644
---- a/configure.d/config_modules_transports
-+++ b/configure.d/config_modules_transports
-@@ -71,7 +71,7 @@ while test "x$new_transport_list" != "x"; do
-       rm -f conftest.$ac_ext module_tmp_header.h
-       AC_LANG_CONFTEST([AC_LANG_SOURCE([[
- #include NETSNMP_SYSTEM_INCLUDE_FILE
--#define NETSNMP_FEATURE_CHECKING
-+#undef NETSNMP_MINIMAL_CODE
- #define NET_SNMP_CONFIG_H
- #undef config_require
- #define config_require(foo) config_checkit_require(foo)
-diff --git a/configure.d/config_os_functions b/configure.d/config_os_functions
-index 7736994..3c5385b 100644
---- a/configure.d/config_os_functions
-+++ b/configure.d/config_os_functions
-@@ -31,7 +31,8 @@ AC_CHECK_FUNCS([lrand48         rand          random    ] dnl
-                [signal          sigset                  ] )
- 
- #  Library:
--AC_CHECK_FUNCS([closedir        fork            getipnodebyname  ] dnl
-+AC_CHECK_FUNCS([closedir        fgetc_unlocked  flockfile        ] dnl
-+               [fork            funlockfile     getipnodebyname  ] dnl
-                [gettimeofday    if_nametoindex  mkstemp          ] dnl
-                [opendir         readdir         regcomp          ] dnl
-                [setenv          setitimer       setlocale        ] dnl
-@@ -82,8 +83,8 @@ esac
- AC_CONFIG_LIBOBJ_DIR([snmplib])
- 
- AC_REPLACE_FUNCS([getopt        inet_ntop     inet_pton        ] dnl
--                 [strlcpy       strtok_r      strtol           ] dnl
--                 [strtoul       strtoull                       ] )
-+                 [strlcat       strlcpy       strtok_r         ] dnl
-+                 [strtol        strtoul       strtoull         ] )
- 
- #  Agent:
- AC_CHECK_FUNCS([cgetnext        chown          execv           ] dnl
-@@ -133,7 +134,7 @@ fi
- AC_MSG_CHECKING([[for two-argument statfs with struct fs_data (Ultrix)]])
- AC_CACHE_VAL(
-     fu_cv_sys_stat_fs_data,
--    [AC_TRY_RUN([
-+    [AC_RUN_IFELSE([AC_LANG_SOURCE([[
- #ifdef HAVE_SYS_PARAM_H
- #include <sys/param.h>
- #endif
-@@ -150,10 +151,10 @@ struct fs_data fsd;
- /* Ultrix's statfs returns 1 for success,
-    0 for not mounted, -1 for failure.  */
- exit (statfs (".", &fsd) != 1);
--}],
--    fu_cv_sys_stat_fs_data=yes,
--    fu_cv_sys_stat_fs_data=no,
--    fu_cv_sys_stat_fs_data=no)])
-+}]])],
-+    [fu_cv_sys_stat_fs_data=yes],
-+    [fu_cv_sys_stat_fs_data=no],
-+    [fu_cv_sys_stat_fs_data=no])])
- AC_MSG_RESULT($fu_cv_sys_stat_fs_data)
- if test $fu_cv_sys_stat_fs_data = yes; then
-     AC_DEFINE(STAT_STATFS_FS_DATA, 1,
-@@ -309,10 +310,11 @@ if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
-        [
-         oldLIBS="$LIBS"
-         LIBS="$LIBS -lcrypto"
--        AC_TRY_LINK(
--         [#include <openssl/bio.h>],
--         [BIO_dgram_get_peer(NULL, NULL);],,
--         AC_MSG_ERROR([DTLS support requires a newer version of OpenSSL]))
-+        AC_LINK_IFELSE(
-+          [AC_LANG_PROGRAM(
-+            [[#include <openssl/bio.h>]],
-+            [[BIO_dgram_get_peer(NULL, NULL);]])], [],
-+          [AC_MSG_ERROR(DTLS support requires a newer version of OpenSSL)])
- 
-         LIBS="$oldLIBS"
-        ]
-diff --git a/configure.d/config_os_headers b/configure.d/config_os_headers
-index 23cc38d..d903f58 100644
---- a/configure.d/config_os_headers
-+++ b/configure.d/config_os_headers
-@@ -30,9 +30,18 @@ AC_CHECK_HEADERS([getopt.h   pthread.h  regex.h      ] dnl
-                  [sys/timeb.h        ] dnl
-                  [sys/un.h           ])
- 
-+#  Library and Agent:
-+AC_CHECK_HEADERS([nlist.h],,,[
-+AC_INCLUDES_DEFAULT
-+[
-+#ifndef LIBBSD_DISABLE_DEPRECATED
-+#define LIBBSD_DISABLE_DEPRECATED 1
-+#endif
-+]])
-+
- #  Library:
- AC_CHECK_HEADERS([fcntl.h    io.h       kstat.h                 ] dnl
--                 [limits.h   locale.h   nlist.h                 ] dnl
-+                 [limits.h   locale.h                  ] dnl
-                  [sys/file.h       sys/ioctl.h         ] dnl
-                  [sys/sockio.h     sys/stat.h          ] dnl
-                  [sys/systemcfg.h  sys/systeminfo.h    ] dnl
-@@ -45,7 +54,7 @@ AC_CHECK_HEADERS([dlfcn.h    err.h      fcntl.h    fstab.h      ] dnl
-                  [           grp.h      io.h                    ] dnl
-                  [ioctls.h   kstat.h    kvm.h      limits.h     ] dnl
-                  [           mntent.h   mtab.h                  ] dnl
--                 [nlist.h    pkglocs.h             pwd.h        ] dnl
-+                 [           pkglocs.h             pwd.h        ] dnl
-                  [           utmpx.h    utsname.h               ])
- 
- AC_CHECK_HEADERS([sys/diskio.h  sys/dkio.h                                 ] dnl
-diff --git a/configure.d/config_os_libs1 b/configure.d/config_os_libs1
-index ce33d34..35f052a 100644
---- a/configure.d/config_os_libs1
-+++ b/configure.d/config_os_libs1
-@@ -84,3 +84,12 @@ netsnmp_save_LIBS="$LIBS"
- LIBS="$LAGENTLIBS $LMIBLIBS $LIBS"
- AC_CHECK_FUNCS([kvm_openfiles kvm_getprocs kvm_getproc2 kvm_getswapinfo])
- LIBS="$netsnmp_save_LIBS"
-+
-+#
-+#   dynamic module support
-+#
-+NETSNMP_SEARCH_LIBS([dlopen], [dl],,, [$LAGENTLIBS $LSNMPLIBS], [LMIBLIBS])
-+netsnmp_save_LIBS="$LIBS"
-+LIBS="$LMIBLIBS $LAGENTLIBS $LSNMPLIBS $LIBS"
-+AC_CHECK_FUNCS([dlopen])
-+LIBS="$netsnmp_save_LIBS"
-diff --git a/configure.d/config_os_libs2 b/configure.d/config_os_libs2
-index 22ab764..fa846c8 100644
---- a/configure.d/config_os_libs2
-+++ b/configure.d/config_os_libs2
-@@ -158,15 +158,6 @@ NETSNMP_SEARCH_LIBS(kstat_lookup, kstat,
-         LNETSNMPLIBS)
- 
- 
--#   dynamic module support
--#
--NETSNMP_SEARCH_LIBS(dlopen, dl,,,,LMIBLIBS)
--netsnmp_save_LIBS="$LIBS"
--LIBS="$LMIBLIBS $LIBS"
--AC_CHECK_FUNCS([dlopen])
--LIBS="$netsnmp_save_LIBS"
--
--
- ##
- #   MIB-module-specific checks
- ##
-@@ -277,6 +268,12 @@ if test "x$tryopenssl" != "xno" -a "x$tryopenssl" != "xinternal"; then
-             AC_CHECK_LIB(${CRYPTO}, AES_cfb128_encrypt, 
-                 AC_DEFINE(HAVE_AES_CFB128_ENCRYPT, 1,
-                     [Define to 1 if you have the `AES_cfb128_encrypt' function.]))
-+
-+            AC_CHECK_LIB(${CRYPTO}, EVP_MD_CTX_create,
-+                AC_DEFINE([HAVE_EVP_MD_CTX_CREATE], [],
-+                    [Define to 1 if you have the `EVP_MD_CTX_create' function.])
-+                AC_DEFINE([HAVE_EVP_MD_CTX_DESTROY], [],
-+                    [Define to 1 if you have the `EVP_MD_CTX_destroy' function.]))
-         fi
-         if echo " $transport_result_list " | $GREP "DTLS" > /dev/null; then
- 	    AC_CHECK_LIB(ssl, DTLSv1_method,
-@@ -408,12 +405,11 @@ if test "$with_libwrap" != "no"; then
-   LIBS="$LIBS -lwrap"
-   AC_MSG_CHECKING([for TCP wrappers library -lwrap])
-   # XXX: should check for hosts_ctl
--  AC_TRY_LINK(
--    [#include <sys/types.h>
-+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
-      #include <tcpd.h>
-      int allow_severity = 0;
--     int deny_severity  = 0;],
--    [hosts_access((void *)0)],
-+     int deny_severity  = 0;]],
-+    [[hosts_access((void *)0)]])],
-     [AC_MSG_RESULT([yes])
-      AC_DEFINE(NETSNMP_USE_LIBWRAP)
-      test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib"
-@@ -423,12 +419,11 @@ if test "$with_libwrap" != "no"; then
-      AC_CHECK_FUNC(yp_get_default_domain, ,
-        AC_CHECK_LIB(nsl, yp_get_default_domain))
-      AC_MSG_CHECKING([for TCP wrappers library -lwrap linked with -lnsl])
--     AC_TRY_LINK(
--       [#include <sys/types.h>
-+     AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <sys/types.h>
- 	#include <tcpd.h>
- 	int allow_severity = 0;
--	int deny_severity  = 0;],
--       [hosts_access((void *)0)],
-+	int deny_severity  = 0;]],
-+       [[hosts_access((void *)0)]])],
-        [AC_MSG_RESULT(yes)
- 	AC_DEFINE(NETSNMP_USE_LIBWRAP)
- 	test "$with_libwrap" != no -a "$with_libwrap" != yes && _wraplibs="-L$with_libwrap/lib"
-@@ -454,6 +449,17 @@ if test "x$with_mysql" = "xyes" ; then
-   fi
-   MYSQL_LIBS=`$MYSQLCONFIG --libs`
-   MYSQL_INCLUDES=`$MYSQLCONFIG --cflags`
-+  AC_MSG_CHECKING([whether MY_INIT() works])
-+  _libs="${LIBS}"
-+  _cppflags="${CPPFLAGS}"
-+  LIBS="${LIBS} ${MYSQL_LIBS}"
-+  CPPFLAGS="${CPPFLAGS} ${MYSQL_INCLUDES}"
-+  AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <mysql/my_global.h>
-+               #include <mysql/my_sys.h>]], [[MY_INIT("my_init_test")]])],[AC_MSG_RESULT(yes)],[AC_MSG_RESULT(no)
-+               AC_DEFINE([HAVE_BROKEN_LIBMYSQLCLIENT], 1,
-+	                 [Define if using MY_INIT() causes a linker error])])
-+  CPPFLAGS="${_cppflags}"
-+  LIBS="${_libs}"
-   AC_MSG_CACHE_ADD(MYSQL Trap Logging:         enabled)
- else
-   AC_MSG_CACHE_ADD(MYSQL Trap Logging:         unavailable)
-diff --git a/configure.d/config_os_struct_members b/configure.d/config_os_struct_members
-index 17bb489..9f015ac 100644
---- a/configure.d/config_os_struct_members
-+++ b/configure.d/config_os_struct_members
-@@ -57,6 +57,18 @@ AC_CHECK_MEMBERS([struct dirent.d_type],,,[
- #endif
-     ]])
- 
-+#       struct ethtool_cmd
-+#
-+if test "x$ac_cv_header_linux_ethtool_h" = "xyes" ; then
-+AC_CHECK_MEMBERS([struct ethtool_cmd.speed_hi],,,[
-+    AC_INCLUDES_DEFAULT()
-+    [
-+#ifdef HAVE_LINUX_ETHTOOL_H
-+#include <linux/ethtool.h>
-+#endif
-+    ]])
-+fi
-+
- #       struct ipstat
- #   Agent:
- #
-@@ -310,6 +322,28 @@ AC_CHECK_MEMBERS([struct tm.tm_gmtoff],,,[
- #endif
-     ]])
- 
-+#       extern timezone
-+AC_MSG_CHECKING([extern timezone])
-+AC_LINK_IFELSE([AC_LANG_PROGRAM([[
-+#if TIME_WITH_SYS_TIME
-+# include <sys/time.h>
-+# include <time.h>
-+#else
-+# if HAVE_SYS_TIME_H
-+#  include <sys/time.h>
-+# else
-+#  include <time.h>
-+# endif
-+#endif
-+]], [[
-+  return timezone;
-+]])], [
-+AC_MSG_RESULT([yes])
-+AC_DEFINE([HAVE_TIMEZONE_VARIABLE], [1], [Define if a timezone variable is declared in <sys/time.h>])
-+], [
-+AC_MSG_RESULT([no])
-+])
-+
- #       struct timezone
- #   Library:
- #
-diff --git a/configure.d/config_project_with_enable b/configure.d/config_project_with_enable
-index 732742b..2cf7aec 100644
---- a/configure.d/config_project_with_enable
-+++ b/configure.d/config_project_with_enable
-@@ -93,7 +93,12 @@ NETSNMP_ARG_WITH(openssl,
-     elif test "x$withval" = "xno"; then
-       tryopenssl=no
-     elif test -d "$withval"; then
--      AC_ADD_SEARCH_PATH($withval)
-+      if test -d "$withval/lib/MinGW"; then
-+        LDFLAGS="-L$withval/lib/MinGW $LDFLAGS"
-+        CPPFLAGS="-I$withval/include $CPPFLAGS"
-+      else
-+        AC_ADD_SEARCH_PATH($withval)
-+      fi
-       tryopenssl=yes
-       askedopenssl=yes
-     fi,
-diff --git a/dist/extractnews b/dist/extractnews
-index 848909a..bce94c9 100755
---- a/dist/extractnews
-+++ b/dist/extractnews
-@@ -19,12 +19,13 @@ LocalGetOptions(\%opts,
- 		"",
- 		['c|changes-file=s','A file to save CHANGES entries to'],
- 		['n|news-file=s','A file to save NEWS entries to'],
-+		['d|debug-line=s', 'Debugging output for lines matching STRING'],
- 		"",
- 		['GUI:otherargs_text','Input files to parse'],
- 	       );
- 
- my $maybecontinue = 0;
--my $lasttext = 0;
-+my $lasttext = "";
- my $lastfile;
- my $lastcomponent;
- 
-@@ -41,32 +42,51 @@ foreach my $argv (@ARGV) {
- 
- 	last if ($opts{'e'} && /$opts{e}/o);
- 
-+	print STDERR "here: $_" if ($opts{'d'} && /$opts{'d'}/o);
-+
- 	# don't use this:
- 	#   FILE: BUGS: 123,456: text
- 	($file, $patbug, $nums, $text) = 
- 	  /(NEWS|CHANGES):\s*-*\s*\[*(BUG|PATCH)(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/;
- 
-+	print STDERR "  1:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
-+
- 	# or this:
- 	#   FILE: component - text
- 	($file, $component, $text) = 
- 	  /(NEWS|CHANGES):\s*(\w+)\s*-+\s*(.*)/ if (!$file);
- 
-+	print STDERR "  2:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
-+
- 	# what you should use:
--	#   FILE: component: text
--	#      or
- 	#   FILE: component: BUGS: 123,456: text
- 	#
- 	#      or
- 	#   FILE: component: PATCH: 123,456: from someone text
- 	#   FILE: component: PATCH: 123,456: from "someone long" text
- 	($file, $component, $patbug, $nums, $text) = 
--	  /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file);
-+	  /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*\[*(BUG|PATCH)(?:ES|S):*\s*([\d,\s*]*)\]*:*\s*-*\s*(?:from ["'][^"]+["']|from \w+|):*\s*(.*)/ if (!$file);
-+
-+	print STDERR "  3:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
-+
-+	#      or at least:
-+	#   FILE: component: text
-+	($file, $component, $text) = 
-+	  /(NEWS|CHANGES):\s*([^:]+):\s*-*\s*(.*)/ if (!$file);
-+
-+	print STDERR "  4:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
- 
- 	# component left out
- 	# FILE: [BUGS: 123,456]: text
- 	($file, $patbug, $nums, $text) = 
- 	  /(NEWS|CHANGES):\s*\[*(BUG|PATCH)*(?:ES|S|):*\s*([\d,\s*]*)\]*:*\s*-*\s*(.*)/ if (!$file);
- 	
-+	print STDERR "  5:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
-+
-+	if ($opts{'d'} && /$opts{'d'}/o) {
-+	    my $bogus = 1; # breakable point
-+	}
-+
- 	if (!$file && $maybecontinue) {
- 	    if (/^\s*(.+)$/) {
- 		$text = $1;
-@@ -94,7 +114,8 @@ foreach my $argv (@ARGV) {
- 	} else {
- 	    $lasttext .= " $text";
- 	}
--	$lasttext =~ s/^ //;
-+	$lasttext =~ s/^ //;                   # get rid of leading spaces
-+	$lasttext =~ s/^([a-z])/uc($1)/e;      # capitalize the first letter 
- 	$text = wrap("      - ","        ","$lasttext") . "\n";
- 	
- 	#
-@@ -108,6 +129,7 @@ foreach my $argv (@ARGV) {
- 	$component =~ s/^snmp/0snmp/;
- 	$component =~ s/^agent/0snmpd/;		# Merge "agent" into "snmpd"
- 	$component =~ s/^([A-Z])/zz\1/;
-+	print STDERR "  t:$file, $component, $patbug, $nums, $text\n" if ($opts{'d'} && /$opts{'d'}/o);
- 	push @{$output{$opts{'c'}}{$component}}, $text;
- 	push @{$output{$opts{'n'}}{$component}}, $text if ($file eq 'NEWS');
- 	$lastfile = $file;
-diff --git a/dist/makerelease.xml b/dist/makerelease.xml
-index 1d65e2c..758e889 100644
---- a/dist/makerelease.xml
-+++ b/dist/makerelease.xml
-@@ -33,6 +33,15 @@
- 	    should be labeled ".rcN" like 5.4.1.rc1.
- 	  </text>
- 	</step>
-+	<step type="prompt" prompt="Enter the last version number:"
-+	  title="Enter the last version number"
-+	  parameter="LASTVERSION">
-+	  <text>
-+	    Please enter the last version number that the changelog should be
-+            generated from.  This should be easy for a new release on a branch,
-+            but may be more tricky for a main release.
-+	  </text>
-+	</step>
- 	<step type="perl" title="Defining a second internal version string"
- 	  mandatory="1">
- 	  <perl>
-@@ -41,6 +50,9 @@
- 	      $self->{'parameters'}{'VERSIONTAGNAME'} =
-     	          "v" . $self->{'parameters'}{'VERSION'};
- 
-+	      $self->{'parameters'}{'LASTVERSIONTAGNAME'} =
-+    	          "v" . $self->{'parameters'}{'LASTVERSION'};
-+
- 	      # target version number (without preN/rcN)
- 	      $self->{'parameters'}{'VERSIONTARGET'} =
-     	          $self->{'parameters'}{'VERSION'};
-@@ -361,22 +373,19 @@
- 	    <command>git commit -m "make depend for {VERSION}" `find . -name Makefile.depend`</command>
- 	  </commands>
- 	</step>
--	<step type="system" stepname="changelog:svn2cl" title="changelog:svn2cl">
-+	<step type="system" stepname="changelog:create" title="Creating a changelog update">
-           <text>We need to extract the portions of the change logs
-           committed to the repository.</text>
--	  <!-- XXX: git2cl needs to be truncated quite a bit rather than searching the whole history -->
--	  <!-- XXX: following branches properly may prove to be interesting -->
- 	  <commands>
--	    <command>git2cl | head -10000 &gt; ChangeLog.add</command>
--	    <command>perl dist/changelogfix  &lt; ChangeLog.add &gt; ChangeLog.reallyadd</command>
-+	    <command>git log --no-merges {LASTVERSIONTAGNAME}..HEAD &gt; ChangeLog.add</command>
- 	  </commands>
- 	</step>
- 	<step type="informational" pause="true" stepname="changelog:manualedit" title="changelog:manualedit">
- 	  <text>
- 	    You need to manually insert the *relevent* portions of
--	    'ChangeLog.reallyadd' into the ChangeLog file.
-+	    'ChangeLog.add' into the ChangeLog file.
- 
--            I also suggest truncating ChangeLog.reallyadd to only contain
-+            I also suggest truncating ChangeLog.add to only contain
-             the *relevent* portions for this release, as this will make
-             CHANGES.new2 and NEWS.new2 more accurate later on.
- 
-@@ -396,7 +405,7 @@
- 	</step>
- 	<step type="system" stepname="docs:newnews" title="docs:newnews">
- 	  <commands>
--	    <command>perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.reallyadd</command>
-+	    <command>perl dist/extractnews -c CHANGES.new2 -n NEWS.new2 ChangeLog.add</command>
- 	  </commands>
- 	</step>
- 	<step type="informational" pause="true" stepname="docs:README-and-NEWS" title="docs:README">
-diff --git a/dist/release b/dist/release
-index 9e02b5c..52b45b1 100644
---- a/dist/release
-+++ b/dist/release
-@@ -4,4 +4,4 @@
- # a branch name followed by 'rc' when the branch is in rc phase of a release.
- #
- #master rc
--V5-7-patches rc
-+#V5-7-patches rc
-diff --git a/doxygen.conf b/doxygen.conf
-index 6b5eb58..20e457d 100644
---- a/doxygen.conf
-+++ b/doxygen.conf
-@@ -280,7 +280,7 @@ WARNINGS               = YES
- # for undocumented members. If EXTRACT_ALL is set to YES then this flag will 
- # automatically be disabled.
- 
--WARN_IF_UNDOCUMENTED   = YES
-+WARN_IF_UNDOCUMENTED   = NO
- 
- # The WARN_FORMAT tag determines the format of the warning messages that 
- # doxygen can produce. The string should contain the $file, $line, and $text 
-diff --git a/include/net-snmp/agent/auto_nlist.h b/include/net-snmp/agent/auto_nlist.h
-index c7cd872..21b6b8c 100644
---- a/include/net-snmp/agent/auto_nlist.h
-+++ b/include/net-snmp/agent/auto_nlist.h
-@@ -12,9 +12,9 @@ extern          "C" {
- #endif
- 
- #ifdef NETSNMP_CAN_USE_NLIST
--int             auto_nlist(const char *, char *, int);
-+int             auto_nlist(const char *, char *, size_t);
- long            auto_nlist_value(const char *);
--int             KNLookup(struct nlist *, int, char *, int);
-+int             KNLookup(struct nlist *, int, char *, size_t);
- #else
- int             auto_nlist_noop(void);
- #	define auto_nlist(x,y,z) auto_nlist_noop()
-diff --git a/include/net-snmp/agent/hardware/cpu.h b/include/net-snmp/agent/hardware/cpu.h
-index bc6f75b..f6e43e5 100644
---- a/include/net-snmp/agent/hardware/cpu.h
-+++ b/include/net-snmp/agent/hardware/cpu.h
-@@ -3,18 +3,18 @@ extern int cpu_num;
- 
-                  /* For rolling averages */
- struct netsnmp_cpu_history {
--     long user_hist;
--     long sys_hist;
--     long idle_hist;
--     long nice_hist;
--     long total_hist;
-+     unsigned long long user_hist;
-+     unsigned long long sys_hist;
-+     unsigned long long idle_hist;
-+     unsigned long long nice_hist;
-+     unsigned long long total_hist;
- 
--     long ctx_hist;
--     long intr_hist;
--     long swpi_hist;
--     long swpo_hist;
--     long pagei_hist;
--     long pageo_hist;
-+     unsigned long long ctx_hist;
-+     unsigned long long intr_hist;
-+     unsigned long long swpi_hist;
-+     unsigned long long swpo_hist;
-+     unsigned long long pagei_hist;
-+     unsigned long long pageo_hist;
- };
- 
- struct netsnmp_cpu_info_s {
-@@ -25,30 +25,30 @@ struct netsnmp_cpu_info_s {
-      int  status;
- 
-                  /* For UCD cpu stats */
--     long user_ticks;
--     long nice_ticks;
--     long sys_ticks;
--     long idle_ticks;
--     long wait_ticks;
--     long kern_ticks;
--     long intrpt_ticks;
--     long sirq_ticks;
--     long steal_ticks;
--     long guest_ticks;
--     long guestnice_ticks;
-+     unsigned long long user_ticks;
-+     unsigned long long nice_ticks;
-+     unsigned long long sys_ticks;
-+     unsigned long long idle_ticks;
-+     unsigned long long wait_ticks;
-+     unsigned long long kern_ticks;
-+     unsigned long long intrpt_ticks;
-+     unsigned long long sirq_ticks;
-+     unsigned long long steal_ticks;
-+     unsigned long long guest_ticks;
-+     unsigned long long guestnice_ticks;
- 
--     long total_ticks;
--     long sys2_ticks;  /* For non-atomic system counts */
-+     unsigned long long total_ticks;
-+     unsigned long long sys2_ticks;  /* For non-atomic system counts */
- 
-                  /* For paging-related UCD stats */
-               /* XXX - Do these belong elsewhere ?? */
-               /* XXX - Do Not Use - Subject to Change */
--     long pageIn;
--     long pageOut;
--     long swapIn;
--     long swapOut;
--     long nInterrupts;
--     long nCtxSwitches;
-+     unsigned long long pageIn;
-+     unsigned long long pageOut;
-+     unsigned long long swapIn;
-+     unsigned long long swapOut;
-+     unsigned long long nInterrupts;
-+     unsigned long long nCtxSwitches;
- 
-      struct netsnmp_cpu_history *history;
- 
-diff --git a/include/net-snmp/agent/snmp_agent.h b/include/net-snmp/agent/snmp_agent.h
-index 240ca94..aad8837 100644
---- a/include/net-snmp/agent/snmp_agent.h
-+++ b/include/net-snmp/agent/snmp_agent.h
-@@ -271,6 +271,7 @@ extern          "C" {
-     u_long          netsnmp_marker_uptime(marker_t pm);
-     u_long          netsnmp_timeval_uptime(struct timeval *tv);
-     const_marker_t  netsnmp_get_agent_starttime(void);
-+    uint64_t        netsnmp_get_agent_runtime(void);
-     void            netsnmp_set_agent_starttime(marker_t s);
-     u_long          netsnmp_get_agent_uptime(void);
-     void            netsnmp_set_agent_uptime(u_long hsec);
-diff --git a/include/net-snmp/library/default_store.h b/include/net-snmp/library/default_store.h
-index e1b2e24..3c3c519 100644
---- a/include/net-snmp/library/default_store.h
-+++ b/include/net-snmp/library/default_store.h
-@@ -37,7 +37,8 @@ extern          "C" {
-      * begin storage definitions 
-      */
- /**
-- * @def NETSNMP_DS_LIBRARY_ID These definitions correspond with the "storid" argument to the API 
-+ * @def NETSNMP_DS_LIBRARY_ID
-+ * These definitions correspond with the "storid" argument to the API.
-  */
- #define NETSNMP_DS_LIBRARY_ID     0
- #define NETSNMP_DS_APPLICATION_ID 1
-diff --git a/include/net-snmp/library/large_fd_set.h b/include/net-snmp/library/large_fd_set.h
-index 67a473c..9b547cd 100644
---- a/include/net-snmp/library/large_fd_set.h
-+++ b/include/net-snmp/library/large_fd_set.h
-@@ -16,7 +16,7 @@
- #include <sys/select.h>
- #endif
- 
--#if defined(HAVE_WINSOCK_H) && ! defined(_WINSOCKAPI_) && ! defined(_WINSOCK_H)
-+#if defined(HAVE_WINSOCK_H) && !defined(_WINSOCKAPI_) && !defined(_WINSOCK_H)
- #error <winsock.h> or <winsock2.h> must have been included before this file.
- #endif
- 
-@@ -44,15 +44,19 @@ extern "C" {
- 
- /**
-  * Test whether set *fdset contains socket fd.
-- * Do nothing if fd >= fdset->lfs_setsize.
-+ * Evaluates to zero (false) if fd >= fdset->lfs_setsize.
-  */
- #define NETSNMP_LARGE_FD_ISSET(fd, fdset) \
-                     netsnmp_large_fd_is_set(fd, fdset)
- 
--#if ! defined(cygwin) && defined(HAVE_WINSOCK_H)
-+#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
- 
--/** Number of bytes needed to store setsize file descriptors. */
--#define NETSNMP_FD_SET_BYTES(setsize) (sizeof(fd_set) + sizeof(SOCKET) * (setsize - FD_SETSIZE))
-+/**
-+ * Number of bytes needed to store a number of file descriptors as a
-+ * struct fd_set.
-+ */
-+#define NETSNMP_FD_SET_BYTES(setsize)                           \
-+    (sizeof(fd_set) + ((setsize) - FD_SETSIZE) * sizeof(SOCKET))
- 
- /** Remove all sockets from the set *fdset. */
- #define NETSNMP_LARGE_FD_ZERO(fdset) \
-@@ -74,28 +78,29 @@ int    netsnmp_large_fd_is_set(SOCKET fd, netsnmp_large_fd_set *fdset);
-  * According to SUSv2, this array must have the name fds_bits. See also
-  * <a href="http://www.opengroup.org/onlinepubs/007908775/xsh/systime.h.html">The Single UNIX Specification, Version 2, &lt;sys/time.h&gt;</a>.
-  */
--#define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits)
-+#define NETSNMP_FD_MASK_SIZE sizeof(((fd_set*)0)->fds_bits[0])
- 
--/** Number of bits in one element of the fd_set::fds_bits array. */
-+/** Number of bits in one element of the fd_set.fds_bits array. */
- #define NETSNMP_BITS_PER_FD_MASK (8 * NETSNMP_FD_MASK_SIZE)
- 
- /** Number of elements needed for the fds_bits array. */
- #define NETSNMP_FD_SET_ELEM_COUNT(setsize) \
-     (setsize + NETSNMP_BITS_PER_FD_MASK - 1) / NETSNMP_BITS_PER_FD_MASK
- 
--/** Number of bytes needed to store setsize file descriptors. */
--#define NETSNMP_FD_SET_BYTES(setsize) \
--    (NETSNMP_FD_SET_ELEM_COUNT(setsize) * NETSNMP_FD_MASK_SIZE)
-+/**
-+ * Number of bytes needed to store a number of file descriptors as a
-+ * struct fd_set.
-+ */
-+#define NETSNMP_FD_SET_BYTES(setsize)                                   \
-+    (sizeof(fd_set) + NETSNMP_FD_SET_ELEM_COUNT((setsize) - FD_SETSIZE) \
-+     * NETSNMP_FD_MASK_SIZE)
- 
- /** Remove all file descriptors from the set *fdset. */
--#define NETSNMP_LARGE_FD_ZERO(fdset)                       \
--  do {                                                     \
--    int __i;                                               \
--    fd_set *__arr = &(fdset)->lfs_set;                     \
--    __i = NETSNMP_FD_SET_ELEM_COUNT((fdset)->lfs_setsize); \
--    for ( ; __i > 0; __i--)                                \
--      __arr->fds_bits[__i - 1] = 0;                        \
--  } while (0)
-+#define NETSNMP_LARGE_FD_ZERO(fdset)                            \
-+    do {                                                        \
-+        memset((fdset)->lfs_setptr, 0,                          \
-+               NETSNMP_FD_SET_BYTES((fdset)->lfs_setsize));     \
-+    } while (0)
- 
- 
- void   netsnmp_large_fd_setfd( int fd, netsnmp_large_fd_set *fdset);
-@@ -118,8 +123,10 @@ void   netsnmp_large_fd_set_init(   netsnmp_large_fd_set *fdset, int setsize);
- /**
-  * Modify the size of a file descriptor set and preserve the first
-  * min(fdset->lfs_setsize, setsize) file descriptors.
-+ *
-+ * Returns 1 upon success or 0 if memory allocation failed.
-  */
--void   netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize);
-+int    netsnmp_large_fd_set_resize( netsnmp_large_fd_set *fdset, int setsize);
- 
- /**
-  * Synchronous I/O multiplexing for large file descriptor sets.
-diff --git a/include/net-snmp/library/oid.h b/include/net-snmp/library/oid.h
-index 5468713..e7adf41 100644
---- a/include/net-snmp/library/oid.h
-+++ b/include/net-snmp/library/oid.h
-@@ -7,7 +7,7 @@
- 
- #ifndef EIGHTBIT_SUBIDS
- typedef u_long oid;
--#define MAX_SUBID   0xFFFFFFFF
-+#define MAX_SUBID   0xFFFFFFFFUL
- #define NETSNMP_PRIo "l"
- #else
- typedef uint8_t oid;
-diff --git a/include/net-snmp/library/snmp_alarm.h b/include/net-snmp/library/snmp_alarm.h
-index 0fe2cf1..8437c1d 100644
---- a/include/net-snmp/library/snmp_alarm.h
-+++ b/include/net-snmp/library/snmp_alarm.h
-@@ -55,6 +55,8 @@ extern          "C" {
-     NETSNMP_IMPORT void run_alarms(void);
-     RETSIGTYPE      alarm_handler(int a);
-     void            set_an_alarm(void);
-+    int             netsnmp_get_next_alarm_time(struct timeval *alarm_tm,
-+                                                const struct timeval *now);
-     int             get_next_alarm_delay_time(struct timeval *delta);
- 
- 
-diff --git a/include/net-snmp/library/snmp_api.h b/include/net-snmp/library/snmp_api.h
-index e32d62b..f57b678 100644
---- a/include/net-snmp/library/snmp_api.h
-+++ b/include/net-snmp/library/snmp_api.h
-@@ -418,7 +418,6 @@ typedef struct request_list {
- #endif
- 
-     int             create_user_from_session(netsnmp_session * session);
--    int snmp_get_fd_for_session(struct snmp_session *sessp);
-     int snmpv3_probe_contextEngineID_rfc5343(void *slp,
-                                              netsnmp_session *session);
- 
-diff --git a/include/net-snmp/library/snmp_enum.h b/include/net-snmp/library/snmp_enum.h
-index 3ab470e..237891d 100644
---- a/include/net-snmp/library/snmp_enum.h
-+++ b/include/net-snmp/library/snmp_enum.h
-@@ -94,10 +94,11 @@ extern          "C" {
-      * Persistent enumeration lists
-      */
-     void            se_store_enum_list(struct snmp_enum_list *new_list,
--                                       const char *token, char *type);
--    void            se_store_list(unsigned int major, unsigned int minor, char *type);
-+                                       const char *token, const char *type);
-+    void            se_store_list(unsigned int major, unsigned int minor,
-+                                  const char *type);
-     void            se_clear_slist(const char *listname);
--    void            se_store_slist(const char *listname, char *type);
-+    void            se_store_slist(const char *listname, const char *type);
-     int             se_store_slist_callback(int majorID, int minorID,
-                                            void *serverargs, void *clientargs);
-     void            se_read_conf(const char *word, char *cptr);
-diff --git a/include/net-snmp/library/snmp_parse_args.h b/include/net-snmp/library/snmp_parse_args.h
-index 384aff0..1ad63e0 100644
---- a/include/net-snmp/library/snmp_parse_args.h
-+++ b/include/net-snmp/library/snmp_parse_args.h
-@@ -1,8 +1,5 @@
- #ifndef SNMP_PARSE_ARGS_H
- #define SNMP_PARSE_ARGS_H
--#ifdef __cplusplus
--extern "C" {
--#endif
- 
- /**
-  * @file snmp_parse_args.h
-@@ -11,6 +8,10 @@ extern "C" {
-  * line arguments
-  */
- 
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
- /** Don't enable any logging even if there is no -L argument */
- #define NETSNMP_PARSE_ARGS_NOLOGGING    0x0001
- /** Don't zero out sensitive arguments as they are not on the command line
-@@ -47,11 +48,12 @@ extern "C" {
-  *  from it.
-  *  @param argc Number of elements in argv
-  *  @param argv string array of at least argc elements
-+ *  @param session
-  *  @param localOpts Additional option characters to accept
-  *  @param proc function pointer used to process any unhandled arguments
-  *  @param flags flags directing how to handle the string
-  *
-- *  @reval 0 (= #NETSNMP_PARSE_ARGS_SUCCESS) on success
-+ *  @retval 0 (= #NETSNMP_PARSE_ARGS_SUCCESS) on success
-  *  @retval #NETSNMP_PARSE_ARGS_SUCCESS_EXIT when the application is expected
-  *  to exit with zero exit code (e.g. '-V' option was found)
-  *  @retval #NETSNMP_PARSE_ARGS_ERROR_USAGE when the function failed to parse
-diff --git a/include/net-snmp/library/system.h b/include/net-snmp/library/system.h
-index 9ae1067..5c58e4a 100644
---- a/include/net-snmp/library/system.h
-+++ b/include/net-snmp/library/system.h
-@@ -194,6 +194,11 @@ SOFTWARE.
-     NETSNMP_IMPORT
-     size_t            strlcpy(char *, const char *, size_t);
- #endif
-+#ifndef HAVE_STRLCAT
-+    NETSNMP_IMPORT
-+    size_t            strlcat(char * __restrict, const char * __restrict,
-+                              size_t);
-+#endif
- 
-     int             netsnmp_os_prematch(const char *ospmname,
-                                         const char *ospmrelprefix);
-diff --git a/include/net-snmp/library/testing.h b/include/net-snmp/library/testing.h
-index aabe52f..ec6135a 100644
---- a/include/net-snmp/library/testing.h
-+++ b/include/net-snmp/library/testing.h
-@@ -7,10 +7,10 @@
- static int __test_counter = 0;
- static int __did_plan = 0;
- 
--#define OK(isok, description) { printf("%s %d - %s\n", ((isok) ? "ok" : "not ok"), ++__test_counter, description); }
-+#define OK(isok, description) do { printf("%s %d - %s\n", ((isok) ? "ok" : "not ok"), ++__test_counter, description); } while (0)
- 
--#define OKF(isok, description) { printf("%s %d - \n", ((isok) ? "ok" : "not ok"), ++__test_counter); printf description; printf("\n"); }
-+#define OKF(isok, description) do { printf("%s %d - ", ((isok) ? "ok" : "not ok"), ++__test_counter); printf description; printf("\n"); } while (0)
- 
--#define PLAN(number) { printf("1..%d\n", number); __did_plan = 1;}
-+#define PLAN(number) do { printf("1..%d\n", number); __did_plan = 1; } while (0)
- 
- #endif /* NETSNMP_LIBRARY_TESTING_H */
-diff --git a/include/net-snmp/library/tools.h b/include/net-snmp/library/tools.h
-index d3514b7..66415da 100644
---- a/include/net-snmp/library/tools.h
-+++ b/include/net-snmp/library/tools.h
-@@ -113,7 +113,7 @@ extern          "C" {
-  *  Expands to string with value of the s. 
-  *  If s is macro, the resulting string is value of the macro.
-  *  Example: 
-- *   #define TEST 1234
-+ *   \#define TEST 1234
-  *   SNMP_MACRO_VAL_TO_STR(TEST) expands to "1234"
-  *   SNMP_MACRO_VAL_TO_STR(TEST+1) expands to "1234+1"
-  */
-@@ -286,8 +286,8 @@ extern          "C" {
-     NETSNMP_IMPORT
-     u_long          uatime_hdiff(const_marker_t first, const_marker_t second);      /* 1/100th sec */
-     NETSNMP_IMPORT
--    int             atime_ready(const_marker_t pm, int deltaT);
--    int             uatime_ready(const_marker_t pm, unsigned int deltaT);
-+    int             atime_ready(const_marker_t pm, int delta_ms);
-+    int             uatime_ready(const_marker_t pm, unsigned int delta_ms);
- 
-     int             marker_tticks(const_marker_t pm);
-     int             timeval_tticks(const struct timeval *tv);
-diff --git a/include/net-snmp/net-snmp-config.h.in b/include/net-snmp/net-snmp-config.h.in
-index d9b9d15..d6ef3ab 100644
---- a/include/net-snmp/net-snmp-config.h.in
-+++ b/include/net-snmp/net-snmp-config.h.in
-@@ -96,6 +96,9 @@
- /* Define to 1 if you have the <asm/types.h> header file. */
- #undef HAVE_ASM_TYPES_H
- 
-+/* Define if using MY_INIT() causes a linker error */
-+#undef HAVE_BROKEN_LIBMYSQLCLIENT
-+
- /* Define to 1 if you have the `cgetnext' function. */
- #undef HAVE_CGETNEXT
- 
-@@ -140,6 +143,12 @@
- /* Define to 1 if you have the `eval_pv' function. */
- #undef HAVE_EVAL_PV
- 
-+/* Define to 1 if you have the `EVP_MD_CTX_create' function. */
-+#undef HAVE_EVP_MD_CTX_CREATE
-+
-+/* Define to 1 if you have the `EVP_MD_CTX_destroy' function. */
-+#undef HAVE_EVP_MD_CTX_DESTROY
-+
- /* Define if you have EVP_sha224/256 in openssl */
- #undef HAVE_EVP_SHA224
- 
-@@ -152,12 +161,21 @@
- /* Define to 1 if you have the <fcntl.h> header file. */
- #undef HAVE_FCNTL_H
- 
-+/* Define to 1 if you have the `fgetc_unlocked' function. */
-+#undef HAVE_FGETC_UNLOCKED
-+
-+/* Define to 1 if you have the `flockfile' function. */
-+#undef HAVE_FLOCKFILE
-+
- /* Define to 1 if you have the `fork' function. */
- #undef HAVE_FORK
- 
- /* Define to 1 if you have the <fstab.h> header file. */
- #undef HAVE_FSTAB_H
- 
-+/* Define to 1 if you have the `funlockfile' function. */
-+#undef HAVE_FUNLOCKFILE
-+
- /* Define to 1 if you have the `gai_strerror' function. */
- #undef HAVE_GAI_STRERROR
- 
-@@ -746,6 +764,9 @@
- /* Define to 1 if you have the <string.h> header file. */
- #undef HAVE_STRING_H
- 
-+/* Define to 1 if you have the `strlcat' function. */
-+#undef HAVE_STRLCAT
-+
- /* Define to 1 if you have the `strlcpy' function. */
- #undef HAVE_STRLCPY
- 
-@@ -773,6 +794,9 @@
- /* Define to 1 if `d_type' is a member of `struct dirent'. */
- #undef HAVE_STRUCT_DIRENT_D_TYPE
- 
-+/* Define to 1 if `speed_hi' is a member of `struct ethtool_cmd'. */
-+#undef HAVE_STRUCT_ETHTOOL_CMD_SPEED_HI
-+
- /* Define to 1 if `ifa_next' is a member of `struct ifaddr'. */
- #undef HAVE_STRUCT_IFADDR_IFA_NEXT
- 
-@@ -1166,6 +1190,9 @@
- /* Define to 1 if you have the `times' function. */
- #undef HAVE_TIMES
- 
-+/* Define if a timezone variable is declared in <sys/time.h> */
-+#undef HAVE_TIMEZONE_VARIABLE
-+
- /* Define to 1 if you have the <ufs/ffs/fs.h> header file. */
- #undef HAVE_UFS_FFS_FS_H
- 
-diff --git a/include/net-snmp/session_api.h b/include/net-snmp/session_api.h
-index 9721fc4..88dbc41 100644
---- a/include/net-snmp/session_api.h
-+++ b/include/net-snmp/session_api.h
-@@ -147,12 +147,6 @@ extern          "C" {
-     int             snmp_select_info2(int *, netsnmp_large_fd_set *,
-                                       struct timeval *, int *);
- 
--    /*
--     * snmp_sess_select_info_flags() and
--     * snmp_sess_select_info2_flags() is similar to
--     * snmp_sess_select_info() and snmp_sess_select_info2(), but
--     * accepts a list of flags to control aspects of its behavior.
--     */
- #define NETSNMP_SELECT_NOFLAGS  0x00
- #define NETSNMP_SELECT_NOALARMS 0x01
-     NETSNMP_IMPORT
-diff --git a/include/net-snmp/system/netbsd.h b/include/net-snmp/system/netbsd.h
-index c67260d..1f22a44 100644
---- a/include/net-snmp/system/netbsd.h
-+++ b/include/net-snmp/system/netbsd.h
-@@ -34,8 +34,36 @@
- 
- #define UDP_ADDRESSES_IN_HOST_ORDER 1
- 
-+#ifdef netbsdelf6
-+#define netbsd6
-+#define netbsdelf5
-+#endif
-+#ifdef netbsdelf5
-+#define netbsd5
-+#define netbsdelf4
-+#endif
-+#ifdef netbsdelf4
-+#define netbsd4
-+#define netbsdelf3
-+#endif
-+#ifdef netbsdelf3
-+#define netbsd3
-+#endif
-+
-+#if defined(netbsd6) && !defined(netbsd5)
-+#define netbsd5 netbsd5
-+#endif
-+#if defined(netbsd5) && !defined(netbsd4)
-+#define netbsd4 netbsd4
-+#endif
-+#if defined(netbsd4) && !defined(netbsd3)
-+#define netbsd3 netbsd3
-+#endif
-+#if defined(netbsd3) && !defined(netbsd2)
-+#define netbsd2 netbsd2
-+#endif
- #ifndef netbsd1
--# define netbsd1 netbsd1
-+#define netbsd1 netbsd1
- #endif
- 
- #if __NetBSD_Version__ >= 499005800
-diff --git a/local/mib2c.container.conf b/local/mib2c.container.conf
-index c051b4c..e76621f 100644
---- a/local/mib2c.container.conf
-+++ b/local/mib2c.container.conf
-@@ -174,6 +174,7 @@ initialize_table_$i(void)
-      */
-     if (SNMPERR_SUCCESS != netsnmp_register_table(reg, table_info)) {
-         snmp_log(LOG_ERR,"error registering table handler for $i\n");
-+        reg = NULL; /* it was freed inside netsnmp_register_table */
-         goto bail;
-     }
- 
-diff --git a/local/mib2c.notify.conf b/local/mib2c.notify.conf
-index a8ee7e3..77f3330 100644
---- a/local/mib2c.notify.conf
-+++ b/local/mib2c.notify.conf
-@@ -30,7 +30,7 @@ int send_${i}_trap(void);
- #include <net-snmp/agent/net-snmp-agent-includes.h>
- #include "${name}.h"
- 
--extern const oid snmptrap_oid;
-+extern const oid snmptrap_oid[];
- extern const size_t snmptrap_oid_len;
- 
- @foreach $i notifications@
-diff --git a/local/mib2c.table_data.conf b/local/mib2c.table_data.conf
-index d263914..2cc665c 100644
---- a/local/mib2c.table_data.conf
-+++ b/local/mib2c.table_data.conf
-@@ -348,6 +348,9 @@ ${i}_handler(
-          */
-     case MODE_GET:
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_entry = (struct ${i}_entry *)
-                               netsnmp_tdata_extract_entry(request);
-             table_info  =     netsnmp_extract_table_info( request);
-@@ -386,6 +389,9 @@ ${i}_handler(
-          */
-     case MODE_SET_RESERVE1:
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_entry = (struct ${i}_entry *)
-                               netsnmp_tdata_extract_entry(request);
-             table_info  =     netsnmp_extract_table_info( request);
-@@ -425,6 +431,9 @@ ${i}_handler(
-     case MODE_SET_RESERVE2:
- @if $i.creatable@
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_row  = netsnmp_tdata_extract_row(  request);
-             table_data = netsnmp_tdata_extract_table(request);
-             table_info = netsnmp_extract_table_info( request);
-@@ -492,6 +501,9 @@ ${i}_handler(
-     case MODE_SET_FREE:
- @if $i.creatable@
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_entry = (struct ${i}_entry *)
-                               netsnmp_tdata_extract_entry(request);
-             table_row   =     netsnmp_tdata_extract_row(  request);
-@@ -530,6 +542,9 @@ ${i}_handler(
- 
-     case MODE_SET_ACTION:
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_entry = (struct ${i}_entry *)
-                               netsnmp_tdata_extract_entry(request);
-             table_info  =     netsnmp_extract_table_info( request);
-@@ -591,6 +606,9 @@ ${i}_handler(
- 
-     case MODE_SET_UNDO:
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_entry = (struct ${i}_entry *)
-                               netsnmp_tdata_extract_entry(request);
-             table_row   =     netsnmp_tdata_extract_row(  request);
-@@ -667,6 +685,9 @@ ${i}_handler(
-     case MODE_SET_COMMIT:
- @if $i.creatable@
-         for (request=requests; request; request=request->next) {
-+            if (request->processed)
-+                continue;
-+
-             table_entry = (struct ${i}_entry *)
-                               netsnmp_tdata_extract_entry(request);
- @if $i.rowstatus@
-diff --git a/local/pass_persisttest b/local/pass_persisttest
-index 4f37c11..f4045cc 100755
---- a/local/pass_persisttest
-+++ b/local/pass_persisttest
-@@ -5,17 +5,23 @@
- # put the following in your snmpd.conf file to call this script:
- #
- # Unix systems and Cygwin:
--# pass_persist .1.3.6.1.4.1.2021.255 /path/to/pass_persisttest
-+# pass_persist .1.3.6.1.4.1.8072.2.255 /path/to/pass_persisttest
- # Windows systems except Cygwin:
--# pass_persist .1.3.6.1.4.1.2021.255 perl /path/to/pass_persisttest
-+# pass_persist .1.3.6.1.4.1.8072.2.255 perl /path/to/pass_persisttest
- 
- # Forces a buffer flush after every print
- $|=1;
- 
-+# Save my PID, to help kill this instance.
-+$PIDFILE=$ENV{'PASS_PERSIST_PIDFILE'} || "/tmp/pass_persist.pid";
-+open(PIDFILE, ">$PIDFILE");
-+print PIDFILE "$$\n";
-+close(PIDFILE);
-+
- use strict;
- 
- my $counter = 0;
--my $place = ".1.3.6.1.4.1.2021.255";
-+my $place = ".1.3.6.1.4.1.8072.2.255";
- 
- while (<>){
-   if (m!^PING!){
-@@ -30,21 +36,33 @@ while (<>){
-   chomp($req);
- 
-   if ( $cmd eq "getnext" ) {
--    if ($req eq $place) {
--      $ret = "$place.1";
--    } elsif ($req eq "$place.1") {
--      $ret = "$place.2.1";
--    } elsif ($req eq "$place.2.1") {
--      $ret = "$place.2.2";
--    } elsif ($req eq "$place.2.2") {
--      $ret = "$place.3";
--    } elsif ($req eq "$place.3") {
--      $ret = "$place.4";
--    } elsif ($req eq "$place.4") {
--      $ret = "$place.5";
--    } elsif ($req eq "$place.5") {
--      $ret = "$place.6";
--    } else {
-+     if (($req eq  "$place")         ||
-+         ($req eq  "$place.0")       ||
-+         ($req =~ m/$place\.0\..*/)  ||
-+         ($req eq  "$place.1"))       { $ret = "$place.1.0";}       # netSnmpPassString.0
-+  elsif (($req =~ m/$place\.1\..*/)  ||
-+         ($req eq  "$place.2")       ||
-+         ($req eq  "$place.2.0")     ||
-+         ($req =~ m/$place\.2\.0\..*/)    ||
-+         ($req eq  "$place.2.1")          ||
-+         ($req eq  "$place.2.1.0")        ||
-+         ($req =~ m/$place\.2\.1\.0\..*/) ||
-+         ($req eq  "$place.2.1.1")        ||
-+         ($req =~ m/$place\.2\.1\.1\..*/) ||
-+         ($req eq  "$place.2.1.2")        ||
-+         ($req eq  "$place.2.1.2.0")) { $ret = "$place.2.1.2.1";}   # netSnmpPassInteger.1
-+  elsif (($req =~ m/$place\.2\.1\.2\..*/) ||
-+         ($req eq  "$place.2.1.3")   ||
-+         ($req eq  "$place.2.1.3.0")) { $ret = "$place.2.1.3.1";}   # netSnmpPassOID.1
-+  elsif (($req =~ m/$place\.2\..*/)  ||
-+         ($req eq  "$place.3"))       { $ret = "$place.3.0";}       # netSnmpPassTimeTicks.0
-+  elsif (($req =~ m/$place\.3\..*/)  ||
-+         ($req eq  "$place.4"))       { $ret = "$place.4.0";}       # netSnmpPassIpAddress.0
-+  elsif (($req =~ m/$place\.4\..*/)  ||
-+         ($req eq  "$place.5"))       { $ret = "$place.5.0";}       # netSnmpPassCounter.0
-+  elsif (($req =~ m/$place\.5\..*/)  ||
-+         ($req eq  "$place.6"))       { $ret = "$place.6.0";}       # netSnmpPassGauge.0
-+  else   {
-       print "NONE\n";
-       next;
-     }
-@@ -59,20 +77,20 @@ while (<>){
- 
-   print "$ret\n";
- 
--  if ($ret eq "$place.1") {
--    print "string\nlife the universe and everything\n";
--  } elsif ($ret eq "$place.2.1") {
--    print "integer\n423\n";
--  } elsif ($ret eq "$place.2.2") {
--    print "objectid\n.1.3.6.1.4.42.42.42\n";
--  } elsif ($ret eq "$place.3") {
-+  if ($ret eq "$place.1.0") {
-+    print "string\nLife, the Universe, and Everything\n";
-+  } elsif ($ret eq "$place.2.1.2.1") {
-+    print "integer\n42\n";
-+  } elsif ($ret eq "$place.2.1.3.1") {
-+    print "objectid\n$place.99\n";
-+  } elsif ($ret eq "$place.3.0") {
-     print "timeticks\n363136200\n";
--  } elsif ($ret eq "$place.4") {
-+  } elsif ($ret eq "$place.4.0") {
-     print "ipaddress\n127.0.0.1\n";
--  } elsif ($ret eq "$place.5") {
-+  } elsif ($ret eq "$place.5.0") {
-     $counter++;
-     print "counter\n$counter\n";
--  } elsif ($ret eq "$place.6") {
-+  } elsif ($ret eq "$place.6.0") {
-     print "gauge\n42\n";
-   } else {
-     print  "string\nack... $ret $req\n";
-diff --git a/local/passtest b/local/passtest
-index dc5735c..40209c9 100755
---- a/local/passtest
-+++ b/local/passtest
-@@ -1,7 +1,5 @@
- #!/bin/sh -f
- 
--PATH=$path:/bin:/usr/bin:/usr/ucb
--
- PLACE=".1.3.6.1.4.1.8072.2.255"  # NET-SNMP-PASS-MIB::netSnmpPassExamples
- REQ="$2"                         # Requested OID
- 
-@@ -20,34 +18,34 @@ fi
- #
- if [ "$1" = "-n" ]; then
-   case "$REQ" in
--    $PLACE|
--    $PLACE.0|
--    $PLACE.0.*|
-+    $PLACE|		\
-+    $PLACE.0|		\
-+    $PLACE.0.*|		\
-     $PLACE.1)       RET=$PLACE.1.0 ;;     # netSnmpPassString.0
- 
--    $PLACE.1.*|
--    $PLACE.2|
--    $PLACE.2.0|
--    $PLACE.2.0.*|
--    $PLACE.2.1|
--    $PLACE.2.1.0|
--    $PLACE.2.1.0.*|
--    $PLACE.2.1.1|
--    $PLACE.2.1.1.*|
--    $PLACE.2.1.2|
-+    $PLACE.1.*|		\
-+    $PLACE.2|		\
-+    $PLACE.2.0|		\
-+    $PLACE.2.0.*|	\
-+    $PLACE.2.1|		\
-+    $PLACE.2.1.0|	\
-+    $PLACE.2.1.0.*|	\
-+    $PLACE.2.1.1|	\
-+    $PLACE.2.1.1.*|	\
-+    $PLACE.2.1.2|	\
-     $PLACE.2.1.2.0) RET=$PLACE.2.1.2.1 ;; # netSnmpPassInteger.1
- 
--    $PLACE.2.1.2.*|
--    $PLACE.2.1.3|
-+    $PLACE.2.1.2.*|	\
-+    $PLACE.2.1.3|	\
-     $PLACE.2.1.3.0) RET=$PLACE.2.1.3.1 ;; # netSnmpPassOID.1
- 
--    $PLACE.2.*|
-+    $PLACE.2.*|		\
-     $PLACE.3)       RET=$PLACE.3.0 ;;     # netSnmpPassTimeTicks.0
--    $PLACE.3.*|
-+    $PLACE.3.*|		\
-     $PLACE.4)       RET=$PLACE.4.0 ;;     # netSnmpPassIpAddress.0
--    $PLACE.4.*|
-+    $PLACE.4.*|		\
-     $PLACE.5)       RET=$PLACE.5.0 ;;     # netSnmpPassCounter.0
--    $PLACE.5.*|
-+    $PLACE.5.*|		\
-     $PLACE.6)       RET=$PLACE.6.0 ;;     # netSnmpPassGauge.0
- 
-     *)         	    exit 0 ;;
-@@ -57,12 +55,12 @@ else
- #  GET requests - check for valid instance
- #
-   case "$REQ" in
--    $PLACE.1.0|
--    $PLACE.2.1.2.1|
--    $PLACE.2.1.3.1|
--    $PLACE.3.0|
--    $PLACE.4.0|
--    $PLACE.5.0|
-+    $PLACE.1.0|		\
-+    $PLACE.2.1.2.1|	\
-+    $PLACE.2.1.3.1|	\
-+    $PLACE.3.0|		\
-+    $PLACE.4.0|		\
-+    $PLACE.5.0|		\
-     $PLACE.6.0)     RET=$REQ ;;
-     *)         	    exit 0 ;;
-   esac
-diff --git a/local/passtest.pl b/local/passtest.pl
-index 049cf45..c87fe18 100755
---- a/local/passtest.pl
-+++ b/local/passtest.pl
-@@ -66,7 +66,7 @@ else {
- print "$ret\n";
-    if ($ret eq "$place.1.0")     { print "string\nLife, the Universe, and Everything\n"; exit 0;}
- elsif ($ret eq "$place.2.1.2.1") { print "integer\n42\n";                                exit 0;}
--elsif ($ret eq "$place.2.1.3.1") { print "objectid\n.1.3.6.1.4.42.42.42\n";              exit 0;}
-+elsif ($ret eq "$place.2.1.3.1") { print "objectid\n$place.99\n";                        exit 0;}
- elsif ($ret eq "$place.3.0")     { print "timeticks\n363136200\n";                       exit 0;}
- elsif ($ret eq "$place.4.0")     { print "ipaddress\n127.0.0.1\n";                       exit 0;}
- elsif ($ret eq "$place.5.0")     { print "counter\n42\n";                                exit 0;}
-diff --git a/local/snmp-bridge-mib b/local/snmp-bridge-mib
-index a4c2c80..4a9415e 100644
---- a/local/snmp-bridge-mib
-+++ b/local/snmp-bridge-mib
-@@ -1004,7 +1004,7 @@ sub readindexes()
- 		next if  $if eq "..";
- 
- 		my $port=hex(readfile($brifdir.$if."/port_no", 0));
--		my $index=readfile($netdir.$if."/ifindex", STP_PROP_HEX);
-+		my $index=readfile($netdir.$if."/ifindex", 0);
- 
- 		$indexes{$bridge}{$port}=$index;
- 		$interfaces{$bridge}{$port}=$if;
-@@ -1063,17 +1063,16 @@ sub tracevlan{
- 			my $pif=$1;
- 			$brifdir=$netdir.$pif."/brport/bridge/brif/";
- 			$port=hex(readfile($brifdir.$pif."/port_no", 0));
--			$index=readfile($netdir.$pif."/ifindex", STP_PROP_HEX);
-+			$index=readfile($netdir.$pif."/ifindex", 0);
- 			#$indexes{$bridge}{$port}=$index;
- 			#$interfaces{$bridge}{$port}=$if;
- 			$tagged{$vlan}{$port}=1;
- 		}else{
--			my $brid=readfile($netdir.$if."/brport/bridge/ifindex",
--						STP_PROP_HEX);
-+			my $brid=readfile($netdir.$if."/brport/bridge/ifindex",	0);
- 			$brifdir=$netdir.$if."/brport/bridge/brif/";
- 			$port=hex(readfile($brifdir.$if."/port_no", 0));
- 			$port=$brid*1000+$port; #create a unique port number
--			$index=readfile($netdir.$if."/ifindex", STP_PROP_HEX);
-+			$index=readfile($netdir.$if."/ifindex", 0);
- 			$indexes{$bridge}{$port}=$index;
- 			$interfaces{$bridge}{$port}=$if;
- 			$tagged{$vlan}{$port}=0;
-@@ -1083,8 +1082,7 @@ sub tracevlan{
- 	}
- 	close(DIR);
- 
--	my $brid=readfile($netdir.$interface."/brport/bridge/ifindex",
--					 STP_PROP_HEX);
-+	my $brid=readfile($netdir.$interface."/brport/bridge/ifindex", 0);
- 	my $fdb=$netdir.$interface."/brport/bridge/brforward";
- 
- 	my $vbridge=$bridge."_vlan".$vlan;
-diff --git a/man/Makefile.in b/man/Makefile.in
-index bfe8279..5627cc0 100644
---- a/man/Makefile.in
-+++ b/man/Makefile.in
-@@ -26,6 +26,8 @@ MAN1G = $(AGENTXTRAP) snmpbulkget.1 snmpcmd.1 snmpget.1 snmpset.1 snmpwalk.1 \
- 	net-snmp-config.1 mib2c-update.1 tkmib.1 traptoemail.1 \
- 	net-snmp-create-v3-user.1
- 
-+# If MAN3 is populated again, then remember to re-enable the corresponding
-+# action line within the 'maninstall' target
- MAN3  = 
- MAN3_API = netsnmp_mib_api.3 netsnmp_config_api.3 snmp_alarm.3 \
- 	netsnmp_session_api.3 netsnmp_sess_api.3 netsnmp_trap_api.3 netsnmp_varbind_api.3 netsnmp_pdu_api.3 
-@@ -241,7 +243,7 @@ maninstall:  maninstalldirs $(MAN1) $(MAN1G) $(MAN3) $(MAN5G) $(MAN8) $(MANALIAS
- 	@for i in $(MAN1) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man1dir) ; echo "install:  installed $$i in $(INSTALL_PREFIX)$(man1dir)" ; done
- 	@$(INSTALL_DATA) $(MAN1G) $(INSTALL_PREFIX)$(man1dir)
- 	@for i in $(MAN1G) ; do echo "install:  installed $$i in $(INSTALL_PREFIX)$(man1dir)" ; done
--	@for i in $(MAN3) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man3dir) ; echo "install:  installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done
-+	#EMPTY LIST#@for i in $(MAN3) ; do $(INSTALL_DATA) $(srcdir)/$$i $(INSTALL_PREFIX)$(man3dir) ; echo "install:  installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done
- 	@$(INSTALL_DATA) $(MAN3G) $(INSTALL_PREFIX)$(man3dir)
- 	@for i in $(MAN3G) ; do echo "install:  installed $$i in $(INSTALL_PREFIX)$(man3dir)" ; done
- 	@$(INSTALL_DATA) $(MANALIASES) $(INSTALL_PREFIX)$(man3dir)
-diff --git a/mibs/IANA-RTPROTO-MIB.txt b/mibs/IANA-RTPROTO-MIB.txt
-index 6f04143..f50992e 100644
---- a/mibs/IANA-RTPROTO-MIB.txt
-+++ b/mibs/IANA-RTPROTO-MIB.txt
-@@ -5,7 +5,7 @@ IMPORTS
-     TEXTUAL-CONVENTION               FROM SNMPv2-TC;
- 
- ianaRtProtoMIB  MODULE-IDENTITY
--    LAST-UPDATED "200009260000Z" -- September 26, 2000
-+    LAST-UPDATED "201107220000Z" -- July 22, 2011
-     ORGANIZATION "IANA"
-     CONTACT-INFO
-             " Internet Assigned Numbers Authority
-@@ -28,6 +28,9 @@ ianaRtProtoMIB  MODULE-IDENTITY
-             will be selected by the IESG Area Director(s) of the Routing
-             Area."
- 
-+    REVISION     "201107220000Z"  -- July 22, 2011 
-+    DESCRIPTION  "Added rpl(18) ."
-+
-     REVISION     "200009260000Z"  -- September 26, 2000 
-     DESCRIPTION  "Original version, published in coordination
-                  with RFC 2932."
-@@ -60,7 +63,8 @@ IANAipRouteProtocol ::= TEXTUAL-CONVENTION
-                 bgp        (14), -- Border Gateway Protocol
-                 idpr       (15), -- InterDomain Policy Routing
-                 ciscoEigrp (16), -- Cisco EIGRP
--                dvmrp      (17)  -- DVMRP
-+                dvmrp      (17), -- DVMRP
-+                rpl        (18)  -- RPL [RFC-ietf-roll-rpl-19]
-                }
- 
- IANAipMRouteProtocol ::= TEXTUAL-CONVENTION
-diff --git a/mibs/IANAifType-MIB.txt b/mibs/IANAifType-MIB.txt
-index 856156a..896adc8 100644
---- a/mibs/IANAifType-MIB.txt
-+++ b/mibs/IANAifType-MIB.txt
-@@ -5,7 +5,7 @@
-        TEXTUAL-CONVENTION          FROM SNMPv2-TC;
- 
-    ianaifType MODULE-IDENTITY
--       LAST-UPDATED "201002110000Z"  -- February 11, 2010
-+       LAST-UPDATED "201110260000Z"  -- October 26, 2011
-        ORGANIZATION "IANA"
-        CONTACT-INFO "        Internet Assigned Numbers Authority
- 
-@@ -19,6 +19,24 @@
-                      Convention, and thus the enumerated values of
-                      the ifType object defined in MIB-II's ifTable."
- 
-+       REVISION     "201110260000Z"  -- October 26, 2011
-+       DESCRIPTION  "Registration of new IANAifType 262."
-+
-+       REVISION     "201109070000Z"  -- September 7, 2011
-+       DESCRIPTION  "Registration of new IANAifTypes 260 and 261."
-+
-+       REVISION     "201107220000Z"  -- July 22, 2011
-+       DESCRIPTION  "Registration of new IANAifType 259."
-+
-+       REVISION     "201106030000Z"  -- June 03, 2011
-+       DESCRIPTION  "Registration of new IANAifType 258."
-+
-+       REVISION     "201009210000Z"  -- September 21, 2010
-+       DESCRIPTION  "Registration of new IANAifTypes 256 and 257."
-+
-+       REVISION     "201007210000Z"  -- July 21, 2010
-+       DESCRIPTION  "Registration of new IANAifType 255."
-+
-        REVISION     "201002110000Z"  -- February 11, 2010
-        DESCRIPTION  "Registration of new IANAifType 254."
- 
-@@ -334,7 +352,7 @@
-                    ieee80212(55),      -- 100BaseVG
-                    fibreChannel(56),   -- Fibre Channel
-                    hippiInterface(57), -- HIPPI interfaces     
--                   frameRelayInterconnect(58), -- Obsolete use either
-+                   frameRelayInterconnect(58), -- Obsolete, use either
-                                        -- frameRelay(32) or 
-                                        -- frameRelayService(44).
-                    aflane8023(59),     -- ATM Emulated LAN for 802.3
-@@ -541,7 +559,15 @@
-                    vdsl2 (251), -- Very high speed digital subscriber line Version 2 (as per ITU-T Recommendation G.993.2)
-                    capwapDot11Profile (252), -- WLAN Profile Interface
-                    capwapDot11Bss (253), -- WLAN BSS Interface
--                   capwapWtpVirtualRadio (254) -- WTP Virtual Radio Interface
-+                   capwapWtpVirtualRadio (254), -- WTP Virtual Radio Interface
-+                   bits (255), -- bitsport
-+                   docsCableUpstreamRfPort (256), -- DOCSIS CATV Upstream RF Port
-+                   cableDownstreamRfPort (257), -- CATV downstream RF port
-+                   vmwareVirtualNic (258), -- VMware Virtual Network Interface
-+                   ieee802154 (259), -- IEEE 802.15.4 WPAN interface
-+                   otnOdu (260), -- OTN Optical Data Unit
-+                   otnOtu (261), -- OTN Optical channel Transport Unit
-+                   ifVfiType (262) -- VPLS Forwarding Instance Interface Type
-                    }
- 
- IANAtunnelType ::= TEXTUAL-CONVENTION
-diff --git a/mibs/rfclist b/mibs/rfclist
-index 7f84150..35f301e 100644
---- a/mibs/rfclist
-+++ b/mibs/rfclist
-@@ -1,4 +1,4 @@
--# updated 2011-03-14
-+# updated 2011-11-16
- 1155	RFC1155-SMI
- 1213	RFC1213-MIB
- 1227	SMUX-MIB
-@@ -254,6 +254,9 @@
- 5833	CAPWAP-BASE-MIB
- 5834	CAPWAP-DOT11-MIB
- 5907	NTPv4-MIB
--5953	SNMP-TLS-TM-MIB
- 6065	SNMP-VACM-AAA-MIB
- 6173	IFCP-MGMT-MIB
-+6240	PW-CEP-STD-MIB
-+6340	FLOAT-TC-MIB
-+6353	SNMP-TLS-TM-MIB
-+6445	MPLS-FRR-GENERAL-STD-MIB:MPLS-FRR-ONE2ONE-STD-MIB:MPLS-FRR-FACILITY-STD-MIB
-diff --git a/net-snmp-config.in b/net-snmp-config.in
-index 303cdda..3ba60e3 100644
---- a/net-snmp-config.in
-+++ b/net-snmp-config.in
-@@ -194,7 +194,7 @@ else
-       echo $NSC_LIBDIR $NSC_BASE_SNMP_LIBS
-       ;;
-     --external-libs)
--      echo $NSC_LDFLAGS $NSC_LNETSNMPLIBS $NSC_LIBS
-+      echo $NSC_LDFLAGS $NSC_LNETSNMPLIBS $NSC_LIBS @PERLLDOPTS_FOR_APPS@
-       ;;
-     #################################################### agent lib
-     --base-agent-libs)
-diff --git a/perl/ASN/ASN.pm b/perl/ASN/ASN.pm
-index 3961bd5..4195573 100644
---- a/perl/ASN/ASN.pm
-+++ b/perl/ASN/ASN.pm
-@@ -77,7 +77,7 @@ sub AUTOLOAD {
-     ($constname = $AUTOLOAD) =~ s/.*:://;
-     croak "& not defined" if $constname eq 'constant';
-     my $val;
--    ($!, $val) = constant($constname, @_ ? $_[0] : 0);
-+    ($!, $val) = constant($constname);
-     if ($! != 0) {
- 	if ($! =~ /Invalid/ || $!{EINVAL}) {
- 	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
-diff --git a/perl/ASN/ASN.xs b/perl/ASN/ASN.xs
-index bbfa69b..e3f6181 100644
---- a/perl/ASN/ASN.xs
-+++ b/perl/ASN/ASN.xs
-@@ -78,9 +78,11 @@ static int constant_ASN_U(double *value, const char *name, const int len)
-     case '\0':
- 	TEST_CONSTANT(value, name, ASN_UNSIGNED);
-         break;
-+#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
-     case '6':
- 	TEST_CONSTANT(value, name, ASN_UNSIGNED64);
-         break;
-+#endif
-     }
-     return EINVAL;
- }
-@@ -91,9 +93,11 @@ static int constant_ASN_IN(double *value, const char *name, const int len)
-     case '\0':
-         TEST_CONSTANT(value, name, ASN_INTEGER);
-         break;
-+#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
-     case '6':
-         TEST_CONSTANT(value, name, ASN_INTEGER64);
-         break;
-+#endif
-     }
-     return EINVAL;
- }
-@@ -123,12 +127,14 @@ static int constant(double *value, const char *const name, const int len)
- 	return constant_ASN_B(value, name, len);
-     case 'C':
- 	return constant_ASN_C(value, name, len);
-+#ifdef NETSNMP_WITH_OPAQUE_SPECIAL_TYPES
-     case 'D':
-         TEST_CONSTANT(value, name, ASN_DOUBLE);
-         break;
-     case 'F':
-         TEST_CONSTANT(value, name, ASN_FLOAT);
-         break;
-+#endif
-     case 'G':
-         TEST_CONSTANT(value, name, ASN_GAUGE);
-         break;
-@@ -155,13 +161,12 @@ MODULE = NetSNMP::ASN		PACKAGE = NetSNMP::ASN
- 
- 
- void
--constant(sv,arg)
-+constant(sv)
-     PREINIT:
- 	STRLEN		len;
-     INPUT:
- 	SV *		sv
- 	char *		s = SvPV(sv, len);
--	int		arg
-     INIT:
-         int status;
-         double value;
-diff --git a/perl/OID/OID.pm b/perl/OID/OID.pm
-index 3ab12aa..a9d9369 100644
---- a/perl/OID/OID.pm
-+++ b/perl/OID/OID.pm
-@@ -153,7 +153,7 @@ sub AUTOLOAD {
-     ($constname = $AUTOLOAD) =~ s/.*:://;
-     croak "& not defined" if $constname eq 'constant';
-     my $val;
--    ($!, $val) = constant($constname, @_ ? $_[0] : 0);
-+    ($!, $val) = constant($constname);
-     if ($! != 0) {
- 	if ($! =~ /Invalid/ || $!{EINVAL}) {
- 	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
-diff --git a/perl/OID/OID.xs b/perl/OID/OID.xs
-index ff3693e..10485f9 100644
---- a/perl/OID/OID.xs
-+++ b/perl/OID/OID.xs
-@@ -125,7 +125,7 @@ int flag;
-           break;
- 
-         case ASN_BIT_STR:
--            snprint_bitstring(buf, sizeof(buf), var, NULL, NULL, NULL);
-+            snprint_bitstring(buf, buf_len, var, NULL, NULL, NULL);
-             len = strlen(buf);
-             break;
- 
-@@ -173,13 +173,12 @@ nso_newptr(initstring)
-         RETVAL
- 
- void
--constant(sv,arg)
-+constant(sv)
-     PREINIT:
- 	STRLEN		len;
-     INPUT:
- 	SV *		sv
- 	char *		s = SvPV(sv, len);
--	int		arg
-     INIT:
-         int status;
-         double value;
-diff --git a/perl/SNMP/SNMP.pm b/perl/SNMP/SNMP.pm
-index d1b39c3..a7f6faa 100644
---- a/perl/SNMP/SNMP.pm
-+++ b/perl/SNMP/SNMP.pm
-@@ -135,6 +135,12 @@ $replace_newer = 0; # determine whether or not to tell the parser to replace
-                     # older MIB modules with newer ones when loading MIBs.
-                     # WARNING: This can cause an incorrect hierarchy.
- 
-+sub register_debug_tokens {
-+    my $tokens = shift;
-+
-+    SNMP::_register_debug_tokens($tokens);
-+}
-+
- sub getenv {
-     my $name = shift;
- 
-@@ -161,10 +167,10 @@ sub setMib {
- }
- 
- sub initMib {
--# eqivalent to calling the snmp library init_mib if Mib is NULL
-+# equivalent to calling the snmp library init_mib if Mib is NULL
- # if Mib is already loaded this function does nothing
--# Pass a zero valued argument to get minimal mib tree initialzation
--# If non zero agrgument or no argument then full mib initialization
-+# Pass a zero valued argument to get minimal mib tree initialization
-+# If non zero argument or no argument then full mib initialization
- 
-   SNMP::init_snmp("perl");
-   return;
-@@ -1529,7 +1535,7 @@ init_snmp properly, which means it will read configuration files and
- use those defaults where appropriate automatically parse MIB files,
- etc.  This will likely affect your perl applications if you have, for
- instance, default values set up in your snmp.conf file (as the perl
--module will now make use of those defaults).  The docmuentation,
-+module will now make use of those defaults).  The documentation,
- however, has sadly not been updated yet (aside from this note), nor is
- the read_config default usage implementation fully complete.
- 
-@@ -1540,7 +1546,7 @@ aspects of a connection between the management application and the
- managed agent. Internally the class is implemented as a blessed hash
- reference. This class supplies 'get', 'getnext', 'set', 'fget', and
- 'fgetnext' method calls. The methods take a variety of input argument
--formats and support both syncronous and asyncronous operation through
-+formats and support both synchronous and asynchronous operation through
- a polymorphic API (i.e., method behaviour varies dependent on args
- passed - see below).
- 
-@@ -1835,7 +1841,7 @@ do SNMP GET, multiple <vars> formats accepted.
- for syncronous operation <vars> will be updated
- with value(s) and type(s) and will also return
- retrieved value(s). If <callback> supplied method
--will operate asyncronously
-+will operate asynchronously
- 
- =item $sess->fget(E<lt>varsE<gt> [,E<lt>callbackE<gt>])
- 
-@@ -1852,7 +1858,7 @@ and <type>
- 
- Note: simple string <vars>,(e.g., 'sysDescr.0')
- form is not updated. If <callback> supplied method
--will operate asyncronously
-+will operate asynchronously
- 
- =item $sess->fgetnext(E<lt>varsE<gt> [,E<lt>callbackE<gt>])
- 
-@@ -1868,7 +1874,7 @@ format (i.e., well known format) to ensure unambiguous
- translation to SNMP MIB data value (see discussion of
- canonical value format <vars> description section),
- returns snmp_errno. If <callback> supplied method
--will operate asyncronously
-+will operate asynchronously
- 
- =item $sess->getbulk(E<lt>non-repeatersE<gt>, E<lt>max-repeatersE<gt>, E<lt>varsE<gt>)
- 
-@@ -1985,7 +1991,7 @@ collect all the columns defined in the MIB table.
- Specifies a GETBULK repeat I<COUNT>.  IE, it will request this many
- varbinds back per column when using the GETBULK operation.  Shortening
- this will mean smaller packets which may help going through some
--systems.  By default, this value is calculated and attepmts to guess
-+systems.  By default, this value is calculated and attempts to guess
- at what will fit all the results into 1000 bytes.  This calculation is
- fairly safe, hopefully, but you can either raise or lower the number
- using this option if desired.  In lossy networks, you want to make
-@@ -1997,7 +2003,7 @@ one way to help that.
- Force the use of GETNEXT rather than GETBULK.  (always true for
- SNMPv1, as it doesn't have GETBULK anyway).  Some agents are great
- implementers of GETBULK and this allows you to force the use of
--GETNEXT oprations instead.
-+GETNEXT operations instead.
- 
- =item callback => \&subroutine
- 
-@@ -2023,7 +2029,7 @@ versions prior to 5.04 and 5.04 and up, the following should work:
-       $no_mainloop = 1;
-   }
- 
--Deciding on whether to use SNMP::MainLoop is left as an excersize to
-+Deciding on whether to use SNMP::MainLoop is left as an exercise to
- the reader since it depends on whether your code uses other callbacks
- as well.
- 
-@@ -2238,9 +2244,9 @@ will be undef.
- to be used with async SNMP::Session
- calls. MainLoop must be called after initial async calls
- so return packets from the agent will not be processed.
--If no args suplied this function enters an infinite loop
-+If no args supplied this function enters an infinite loop
- so program must be exited in a callback or externally
--interupted. If <timeout(sic)
-+interrupted. If <timeout(sic)
- 
- =item &SNMP::finish()
- 
-@@ -2322,7 +2328,7 @@ initialization
- 
- =item $SNMP::debugging
- 
--default '0', controlls debugging output level
-+default '0', controls debugging output level
- within SNMP module and libsnmp
- 
- =over
-@@ -2346,6 +2352,12 @@ level 2 plus snmp_set_dump_packet(1)
- default '0', set [non-]zero to independently set
- snmp_set_dump_packet()
- 
-+=item SNMP::register_debug_tokens()
-+
-+Allows to register one or more debug tokens, just like the -D option of snmpd.
-+Each debug token enables a group of debug statements. An example:
-+SNMP::register_debug_tokens("tdomain,netsnmp_unix");
-+
- =back
- 
- =head1 %SNMP::MIB
-@@ -2459,7 +2471,7 @@ returns true if the last object in the INDEX is IMPLIED
- =item &SNMP::setMib(<file>)
- 
- allows dynamic parsing of the mib and explicit
--specification of mib file independent of enviroment
-+specification of mib file independent of environment
- variables. called with no args acts like initMib,
- loading MIBs indicated by environment variables (see
- Net-SNMP mib_api docs). passing non-zero second arg
-diff --git a/perl/SNMP/SNMP.xs b/perl/SNMP/SNMP.xs
-index a0cfe69..ff84919 100644
---- a/perl/SNMP/SNMP.xs
-+++ b/perl/SNMP/SNMP.xs
-@@ -1,4 +1,4 @@
--/* -*- C -*-
-+/* -*- mode: C; c-basic-offset: 4; indent-tabs-mode: nil -*-
-      SNMP.xs -- Perl 5 interface to the Net-SNMP toolkit
- 
-      written by G. S. Marzot (marz@users.sourceforge.net)
-@@ -221,7 +221,15 @@ __snprint_oid(const oid *objid, size_t objidlen) {
- #else	/* DEBUGGING */
- #define DBDCL(x) 
- #define DBOUT
--#define	DBPRT(severity, otherargs)	/* Ignore */
-+/* Do nothing but in such a way that the compiler sees "otherargs". */
-+#define	DBPRT(severity, otherargs) \
-+    do { if (0) printf otherargs; } while(0)
-+
-+static char *
-+__snprint_oid(const oid *objid, size_t objidlen)
-+{
-+    return "(debugging is disabled)";
-+}
- 
- #endif	/* DEBUGGING */
- 
-@@ -451,8 +459,7 @@ int flag;
-            if (flag == USE_ENUMS) {
-               for(ep = tp->enums; ep; ep = ep->next) {
-                  if (ep->value == *var->val.integer) {
--                    strncpy(buf, ep->label, buf_len);
--                    buf[buf_len-1] = '\0';
-+                    strlcpy(buf, ep->label, buf_len);
-                     len = strlen(buf);
-                     break;
-                  }
-@@ -929,19 +936,22 @@ oid *doid_arr;
- size_t *doid_arr_len;
- char * soid_str;
- {
--   char soid_buf[STR_BUF_SIZE];
-+   char *soid_buf;
-    char *cp;
-    char *st;
- 
-    if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */
-    if (*soid_str == '.') soid_str++;
--   strcpy(soid_buf, soid_str);
-+   soid_buf = strdup(soid_str);
-+   if (!soid_buf)
-+       return FAILURE;
-    cp = strtok_r(soid_buf,".",&st);
-    while (cp) {
-      sscanf(cp, "%" NETSNMP_PRIo "u", &(doid_arr[(*doid_arr_len)++]));
-      /* doid_arr[(*doid_arr_len)++] =  atoi(cp); */
-      cp = strtok_r(NULL,".",&st);
-    }
-+   free(soid_buf);
-    return(SUCCESS);
- }
- 
-@@ -1040,7 +1050,7 @@ OCT:
-         vars->type = ASN_IPADDRESS;
-         vars->val.integer = netsnmp_malloc(sizeof(in_addr_t));
-         if (val)
--            *(vars->val.integer) = inet_addr(val);
-+            *((in_addr_t *)vars->val.integer) = inet_addr(val);
-         else {
-             ret = FAILURE;
-             *(vars->val.integer) = 0;
-@@ -1584,7 +1594,7 @@ _bulkwalk_done(walk_context *context)
-  	** walks still in progress.
-  	*/
-  	DBPRT(1, (DBOUT "Ignoring %s request oid %s\n",
-- 	      bt_entry->norepeat? "nonrepeater" : "completed",
-+ 	      bt_entry->norepeat ? "nonrepeater" : "completed",
-  	      __snprint_oid(bt_entry->req_oid, bt_entry->req_len)));
- 
-  	/* Ignore this OID in any further packets. */
-@@ -1894,7 +1904,7 @@ _bulkwalk_recv_pdu(walk_context *context, netsnmp_pdu *pdu)
-    int		i;
-    AV		*varbind;
-    SV		*rv;
--   DBDCL(SV**sess_ptr_sv=hv_fetch((HV*)SvRV(context->sess_ref),"SessPtr",7,1);)
-+   SV **sess_ptr_sv = hv_fetch((HV*)SvRV(context->sess_ref), "SessPtr", 7, 1);
-    SV **err_str_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorStr", 8, 1);
-    SV **err_num_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorNum", 8, 1);
-    SV **err_ind_svp = hv_fetch((HV*)SvRV(context->sess_ref), "ErrorInd", 8, 1);
-@@ -2930,6 +2940,8 @@ snmp_add_mib_dir(mib_dir,force=0)
- 	int result = 0;      /* Avoid use of uninitialized variable below. */
-         int verbose = SvIV(perl_get_sv("SNMP::verbose", 0x01 | 0x04));
- 
-+        DBPRT(999, (DBOUT "force=%d\n", force));
-+
-         if (mib_dir && *mib_dir) {
- 	   result = add_mibdir(mib_dir);
-         }
-@@ -2979,6 +2991,8 @@ snmp_read_mib(mib_file, force=0)
-         {
-         int verbose = SvIV(perl_get_sv("SNMP::verbose", 0x01 | 0x04));
- 
-+        DBPRT(999, (DBOUT "force=%d\n", force));
-+
-         if ((mib_file == NULL) || (*mib_file == '\0')) {
-            if (get_tree_head() == NULL) {
-               if (verbose) warn("snmp_read_mib: initializing MIB\n");
-@@ -3541,11 +3555,11 @@ snmp_getnext(sess_ref, varlist_ref, perl_callback)
-                     varbind = (AV*) SvRV(*varbind_ref);
- 
-                     /* If the varbind includes the module prefix, capture it for use later */
--                    strncpy(tmp_buf_prefix, __av_elem_pv(varbind, VARBIND_TAG_F, ".0"), STR_BUF_SIZE);
-+                    strlcpy(tmp_buf_prefix, __av_elem_pv(varbind, VARBIND_TAG_F, ".0"), STR_BUF_SIZE);
-                     tmp_prefix_ptr = strstr(tmp_buf_prefix,"::");
-                     if (tmp_prefix_ptr) {
-                       tmp_prefix_ptr = strtok_r(tmp_buf_prefix, "::", &st);
--                      strncpy(str_buf_prefix, tmp_prefix_ptr, STR_BUF_SIZE);
-+                      strlcpy(str_buf_prefix, tmp_prefix_ptr, STR_BUF_SIZE);
-                     }
-                     else {
-                       *str_buf_prefix = '\0';
-@@ -3657,9 +3671,9 @@ snmp_getnext(sess_ref, varlist_ref, perl_callback)
- 
-                     /* Prepend the module prefix to the next OID if needed */
-                     if (*str_buf_prefix) {
--                      strncat(str_buf_prefix, "::", STR_BUF_SIZE - strlen(str_buf_prefix) - 2);
--                      strncat(str_buf_prefix, str_buf, STR_BUF_SIZE - strlen(str_buf_prefix));
--                      strncpy(str_buf, str_buf_prefix, STR_BUF_SIZE);
-+                      strlcat(str_buf_prefix, "::", STR_BUF_SIZE);
-+                      strlcat(str_buf_prefix, str_buf, STR_BUF_SIZE);
-+                      strlcpy(str_buf, str_buf_prefix, STR_BUF_SIZE);
-                     }
-                     
-                     if (__is_leaf(tp)) {
-@@ -4242,15 +4256,16 @@ snmp_bulkwalk(sess_ref, nonrepeaters, maxrepetitions, varlist_ref,perl_callback)
- 
- 	/* Handle error cases and clean up after ourselves. */
-         err:
--	   if (context->req_oids && context->nreq_oids) {
--	      bt_entry = context->req_oids;
--	      for (i = 0; i < context->nreq_oids; i++, bt_entry++)
--		 av_clear(bt_entry->vars);
--	   }
--	   if (context->req_oids)
--	      Safefree(context->req_oids);
--	   if (context)
-+	   if (context) {
-+	      if (context->req_oids && context->nreq_oids) {
-+	         bt_entry = context->req_oids;
-+	         for (i = 0; i < context->nreq_oids; i++, bt_entry++)
-+		    av_clear(bt_entry->vars);
-+	      }
-+	      if (context->req_oids)
-+	         Safefree(context->req_oids);
- 	      Safefree(context);
-+	   }
- 	   if (pdu)
- 	      snmp_free_pdu(pdu);
- 
-@@ -4437,7 +4452,7 @@ snmp_trapV2(sess_ref,uptime,trap_oid,varlist_ref)
- 	   
-            New (0, oid_arr, MAX_OID_LEN, oid);
- 
--           if (oid_arr && SvROK(sess_ref) && SvROK(varlist_ref)) {
-+           if (oid_arr && SvROK(sess_ref)) {
- 
-               sess_ptr_sv = hv_fetch((HV*)SvRV(sess_ref), "SessPtr", 7, 1);
- 	      ss = (SnmpSession *)SvIV((SV*)SvRV(*sess_ptr_sv));
-@@ -4451,8 +4466,13 @@ snmp_trapV2(sess_ref,uptime,trap_oid,varlist_ref)
- 	      
-               pdu = snmp_pdu_create(SNMP_MSG_TRAP2);
- 
--              varlist = (AV*) SvRV(varlist_ref);
--              varlist_len = av_len(varlist);
-+              if (SvROK(varlist_ref)) {
-+                  varlist = (AV*) SvRV(varlist_ref);
-+                  varlist_len = av_len(varlist);
-+              } else {
-+                  varlist = NULL;
-+                  varlist_len = -1;
-+              }
- 	      /************************************************/
-               res = __add_var_val_str(pdu, sysUpTime, SYS_UPTIME_OID_LEN,
- 				uptime, strlen(uptime), TYPE_TIMETICKS);
-@@ -4838,10 +4858,10 @@ snmp_translate_obj(var,mode,use_long,auto_init,best_guess,include_module_name)
- 		  if (((status=__get_label_iid(str_buf_temp,
- 		       &label, &iid, NO_FLAGS)) == SUCCESS)
- 		      && label) {
--		     strcpy(str_buf_temp, label);
-+		     strlcpy(str_buf_temp, label, sizeof(str_buf_temp));
- 		     if (iid && *iid) {
--		       strcat(str_buf_temp, ".");
--		       strcat(str_buf_temp, iid);
-+		       strlcat(str_buf_temp, ".", sizeof(str_buf_temp));
-+		       strlcat(str_buf_temp, iid, sizeof(str_buf_temp));
- 		     }
-  	          }
- 	        }
-@@ -4902,6 +4922,15 @@ snmp_set_debugging(val)
- 	}
- 
- void
-+snmp_register_debug_tokens(tokens)
-+	char *tokens
-+	CODE:
-+	{
-+            debug_register_tokens(tokens);
-+            snmp_set_do_debugging(1);
-+	}
-+
-+void
- snmp_debug_internals(val)
- 	int     val
- 	CODE:
-diff --git a/perl/SNMP/examples/pingmib.pl b/perl/SNMP/examples/pingmib.pl
-old mode 100644
-new mode 100755
-index 22dbe69..e6aa792
---- a/perl/SNMP/examples/pingmib.pl
-+++ b/perl/SNMP/examples/pingmib.pl
-@@ -1,3 +1,9 @@
-+#!/usr/bin/env perl
-+
-+# Ping a host via the CISCO-PING-MIB. For more information about the
-+# CISCO-PING-MIB, see also
-+# http://tools.cisco.com/Support/SNMP/do/BrowseMIB.do?local=en&mibName=CISCO-PING-MIB.
-+
- use strict;
- use SNMP;
- 
-@@ -13,8 +19,9 @@ my $community = shift || 'private';
-         my $dec = pack("C*",split /\./, $target);
-         my $oid = ".1.3.6.1.4.1.9.9.16.1.1.1";
-         my $row = "300";
-+        my $res;
- 
--        $sess->set([
-+        $res = $sess->set([
-                 ["$oid.16", $row, 6, "INTEGER"],
-                 ["$oid.16", $row, 5, "INTEGER"],
-                 ["$oid.15", $row, "MoNDS", "OCTETSTR"],
-@@ -22,8 +29,11 @@ my $community = shift || 'private';
-                 ["$oid.4", $row, 20, "INTEGER"],
-                 ["$oid.5", $row, 150, "INTEGER"],
-                 ["$oid.3", $row, $dec, "OCTETSTR"]]);
-+        defined($res) || die "row creation failed";
-+                
-+        $res = $sess->set([["$oid.16", $row, 1, "INTEGER"]]);
-+        defined($res) || die "row activation failed";
- 
--        $sess->set([["$oid.16", $row, 1, "INTEGER"]]);
-         sleep 30;
-         my ($sent, $received, $low, $avg, $high, $completed) = $sess->get([
-                 ["$oid.9", $row], ["$oid.10", $row], ["$oid.11", $row],
-diff --git a/perl/SNMP/t/async.t b/perl/SNMP/t/async.t
-index b1c86c6..f3fb38d 100644
---- a/perl/SNMP/t/async.t
-+++ b/perl/SNMP/t/async.t
-@@ -17,7 +17,7 @@ use SNMP;
- use vars qw($agent_port $comm $agent_host);
- 
- if ($^O =~ /win32/i) {
--  warn "Win32 detected - skipping async calls\n";
-+  warn "Win32/Win64 detected - skipping async calls\n";
-   exit;
- }
- 
-diff --git a/perl/SNMP/t/bulkwalk.t b/perl/SNMP/t/bulkwalk.t
-index 60f10b5..2d13e7b 100644
---- a/perl/SNMP/t/bulkwalk.t
-+++ b/perl/SNMP/t/bulkwalk.t
-@@ -326,7 +326,7 @@ $vars = new SNMP::VarList ( ['sysUpTime'], ['ifNumber'], # NON-repeaters
- 			    ['ifSpeed'], ['ifDescr']);	 # Repeated variables.
- 
- if ($^O =~ /win32/i) {
--  warn "Win32 detected - skipping async calls\n";
-+  warn "Win32/Win64 detected - skipping async calls\n";
- }
- else {
-   @list = $s1->bulkwalk(2, 16, $vars, [ \&async_cb1, $vars ] );
-diff --git a/perl/SNMP/t/notify.t b/perl/SNMP/t/notify.t
-index 434237f..72600fa 100644
---- a/perl/SNMP/t/notify.t
-+++ b/perl/SNMP/t/notify.t
-@@ -10,7 +10,7 @@ BEGIN {
-     $ENV{'MIBDIRS'} = '+' . abs_path("../../mibs");
- }
- use Test;
--BEGIN { $n = 10; plan tests => $n }
-+BEGIN { $n = 11; plan tests => $n }
- use SNMP;
- use vars qw($agent_port $comm $comm2 $trap_port $agent_host $sec_name $priv_pass $auth_pass $bad_name);
- require 't/startagent.pl';
-@@ -21,20 +21,20 @@ my $enterprise = '.1.3.6.1.2.1.1.1.0';
- my $generic = 'specific';
- 
- #                         V1 trap testing
--######################  1  #############################
-+########################  1  ############################
- # Fire up a trap session.
- my $s1 =
-     new SNMP::Session (DestHost=>$agent_host,Version=>1,Community=>$comm,RemotePort=>$trap_port);
- ok(defined($s1));
- 
--##########################  2  ####################################
-+########################  2  ############################
- # test v1 trap
- if (defined($s1)) {
-   $res = $s1->trap(enterprise => $enterprise, agent=>$agent_host, generic=>$generic,[[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] );
- }
- ok($res =~ /^0 but true/);
- 
--########################### 3 #############################
-+########################  3  ############################
- # test with wrong varbind
- undef $res;
- if (defined($s1)) {
-@@ -45,12 +45,12 @@ ok(!defined($res));
- #########################################################
- 
- #                      V2 testing
--########################## 4 ############################
-+########################  4  ############################
- # Fire up a v2 trap session.
- my $s2 =
-     new SNMP::Session (Version=>2, DestHost=>$agent_host,Community=>$comm2,RemotePort=>$trap_port);
- ok(defined($s2));
--#########################  5  ###########################
-+########################  5  ############################
- # test v2 trap
- undef $res;
- if (defined($s2)) {
-@@ -58,7 +58,7 @@ if (defined($s2)) {
-   #print("res is $res\n");
- }
- ok($res =~ /^0 but true/);
--##########################  6  ##########################
-+########################  6  ############################
- # no trapoid and uptime given. Should take defaults...
- my $ret;
- if (defined($s2)) {
-@@ -66,27 +66,35 @@ if (defined($s2)) {
-   #print("res is $ret\n");
- }
- ok(defined($ret));
-+########################  7  ############################
-+# no varbind list given.
-+undef $res;
-+if (defined($s2)) {
-+  $res = $s2->trap(trapoid=>'coldStart');
-+  #print("res is $res\n");
-+}
-+ok(defined($res) && $res =~ /^0 but true/);
- 
- #########################################################
- 
- #                     v3 testing
--########################  7  ############################
-+########################  8  ############################
- # Fire up a v3 trap session.
- my $s3 = new SNMP::Session(Version=>3, DestHost=> $agent_host, RemotePort=>$trap_port, SecName => $sec_name);
- ok(defined($s3));
- 
--########################  8  ###########################
-+########################  9  ############################
- if (defined($s3)) {
-   $res = $s3->inform(uptime=>111, trapoid=>'coldStart', [[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] );
- }
- ok($res =~ /^0 but true/);
- 
--#################### 9 #####################
-+######################## 10  ############################
- # Fire up a v3 trap session.
- $s3 = new SNMP::Session(Version=>3, DestHost=> $agent_host, RemotePort=>$trap_port, SecName => $sec_name, SecLevel => authPriv, AuthPass => $auth_pass, PrivPass => $priv_pass);
- ok(defined($s3));
- 
--########################  10  ###########################
-+######################## 11  ############################
- undef $res;
- if (defined($s3)) {
-     $res = $s3->inform(uptime=>111, trapoid=>'coldStart', [[sysContact, 0, 'root@localhost'], [sysLocation, 0, 'here']] );
-diff --git a/perl/agent/agent.pm b/perl/agent/agent.pm
-index 7a71a17..78421cb 100644
---- a/perl/agent/agent.pm
-+++ b/perl/agent/agent.pm
-@@ -98,7 +98,7 @@ sub AUTOLOAD {
-     ($constname = $AUTOLOAD) =~ s/.*:://;
-     croak "& not defined" if $constname eq 'constant';
-     my $val;
--    ($!, $val) = constant($constname, @_ ? $_[0] : 0);
-+    ($!, $val) = constant($constname);
-     if ($! != 0) {
- 	if ($! =~ /Invalid/ || $!{EINVAL}) {
- 	    $AutoLoader::AUTOLOAD = $AUTOLOAD;
-@@ -199,6 +199,12 @@ sub agent_check_and_process {
-     __agent_check_and_process($blocking || 0);
- }
- 
-+sub uptime {
-+    my $self = shift;
-+    $self->maybe_init_lib();
-+    return _uptime();
-+}
-+
- bootstrap NetSNMP::agent $VERSION;
- 
- # Preloaded methods go here.
-diff --git a/perl/agent/agent.xs b/perl/agent/agent.xs
-index ee77d50..c7b5d9a 100644
---- a/perl/agent/agent.xs
-+++ b/perl/agent/agent.xs
-@@ -215,13 +215,12 @@ handler_wrapper(netsnmp_mib_handler          *handler,
- MODULE = NetSNMP::agent		PACKAGE = NetSNMP::agent		
- 
- void
--constant(sv,arg)
-+constant(sv)
-     PREINIT:
- 	STRLEN		len;
-     INPUT:
- 	SV *		sv
- 	char *		s = SvPV(sv, len);
--	int		arg
-     INIT:
-         int status;
-         double value;
-@@ -239,6 +238,13 @@ __agent_check_and_process(block = 1)
-     OUTPUT:
- 	RETVAL
- 
-+int
-+_uptime()
-+    CODE:
-+        RETVAL = netsnmp_get_agent_uptime();
-+    OUTPUT:
-+	RETVAL
-+
- void
- init_mib()
-     CODE:
-@@ -272,6 +278,8 @@ na_shutdown(me)
-     SV *me;
-     CODE:
-     {
-+        if (0)
-+            printf("me = %p\n", me);
-         snmp_shutdown("perl");
-     }
- 
-@@ -284,6 +292,8 @@ na_errlog(me,value)
-         char * stringptr;
-     CODE:
-     {
-+        if (0)
-+            printf("me = %p\n", me);
-         stringptr = SvPV(value, stringlen);
-         snmp_log(LOG_ERR, "%s", stringptr );
-     }
-@@ -340,13 +350,27 @@ nsahr_register(me)
-         SV *me;
-         PREINIT:
-         netsnmp_handler_registration *reginfo;
-+        handler_cb_data *cb_data = NULL;
-         CODE:
-             {
-                 reginfo = (netsnmp_handler_registration *) SvIV(SvRV(me));
-+                if (reginfo && reginfo->handler && reginfo->handler->myvoid)
-+                    cb_data = (handler_cb_data *) (reginfo->handler->myvoid);
-                 RETVAL = netsnmp_register_handler(reginfo);
-                 if (!RETVAL) {
-                     /* the agent now has a "reference" to this reg pointer */
-                     SvREFCNT_inc(me);
-+                } else {
-+                    /*
-+                     * The reginfo was freed by netsnmp_register_handler,
-+                     * don't touch it in nsahr_DESTROY!
-+                     */
-+                    sv_setiv(SvRV(me), 0);
-+                    if (cb_data) {
-+                        /* And just free the callback. */
-+                        SvREFCNT_dec(cb_data->perl_cb);
-+                        free(cb_data);
-+                    }
-                 }
-             }
-     OUTPUT:
-diff --git a/perl/agent/default_store/default_store.xs b/perl/agent/default_store/default_store.xs
-index 815f9fd..bff1485 100644
---- a/perl/agent/default_store/default_store.xs
-+++ b/perl/agent/default_store/default_store.xs
-@@ -622,7 +622,7 @@ constant(sv)
- #endif
- 	STRLEN		len;
-         int		type;
--	IV		iv;
-+	IV		iv = 0;
- 	/* NV		nv;	Uncomment this if you need to return NVs */
- 	/* const char	*pv;	Uncomment this if you need to return PVs */
-     INPUT:
-diff --git a/perl/agent/test.pl b/perl/agent/test.pl
-index a7ac8f9..88cba56 100644
---- a/perl/agent/test.pl
-+++ b/perl/agent/test.pl
-@@ -9,7 +9,7 @@
- BEGIN { $| = 1; 
-         $ENV{'SNMPCONFPATH'} = 'nopath';
-         $ENV{'MIBS'} = '';
--        print "1..5\n";
-+        print "1..6\n";
-       }
- END {print "not ok 1\n" unless $loaded;}
- use NetSNMP::agent (':all');
-@@ -76,6 +76,12 @@ $regitem = $agent->register("test_reg", ".1.3.6.1.8888", \&testsub);
- print it($regitem, 4);
- #print STDERR $regitem,":",ref($regitem),"\n";
- print it(ref($regitem) eq "NetSNMP::agent::netsnmp_handler_registration", 5);
-+
-+my $uptime1 = $agent->uptime();
-+my $uptime2 = $agent->uptime(666);
-+my $uptime3 = $agent->uptime(555, 444);
-+print it($uptime1 <= $uptime2 && $uptime2 <= $uptime3, 6);
-+
- exit;
- 
- while(1) {
-diff --git a/perl/default_store/default_store.xs b/perl/default_store/default_store.xs
-index e2b8a34..ca252fb 100644
---- a/perl/default_store/default_store.xs
-+++ b/perl/default_store/default_store.xs
-@@ -1261,7 +1261,7 @@ constant(sv)
- #endif
- 	STRLEN		len;
-         int		type;
--	IV		iv;
-+	IV		iv = 0;
- 	/* NV		nv;	Uncomment this if you need to return NVs */
- 	/* const char	*pv;	Uncomment this if you need to return PVs */
-     INPUT:
-diff --git a/python/netsnmp/client_intf.c b/python/netsnmp/client_intf.c
-index f2abf0b..559a9c0 100644
---- a/python/netsnmp/client_intf.c
-+++ b/python/netsnmp/client_intf.c
-@@ -1,5 +1,11 @@
- #include <Python.h>
- 
-+#if PY_VERSION_HEX < 0x02050000
-+typedef int Py_ssize_t;
-+#define PY_SSIZE_T_MAX INT_MAX
-+#define PY_SSIZE_T_MIN INT_MIN
-+#endif
-+
- #include <net-snmp/net-snmp-config.h>
- #include <net-snmp/net-snmp-includes.h>
- #include <sys/types.h>
-@@ -67,8 +73,6 @@
- 
- typedef netsnmp_session SnmpSession;
- typedef struct tree SnmpMibNode;
--static void __recalc_timeout (struct timeval*,struct timeval*,
--                                struct timeval*,struct timeval*, int* );
- static int __is_numeric_oid (char*);
- static int __is_leaf (struct tree*);
- static int __translate_appl_type (char*);
-@@ -80,10 +84,6 @@ static int __sprint_num_objid (char *, oid *, int);
- static int __scan_num_objid (char *, oid *, size_t *);
- static int __get_type_str (int, char *);
- static int __get_label_iid (char *, char **, char **, int);
--static int __oid_cmp (oid *, int, oid *, int);
--static int __tp_sprint_num_objid (char*,SnmpMibNode *);
--static SnmpMibNode * __get_next_mib_node (SnmpMibNode *);
--static struct tree * __oid2tp (oid*, int, struct tree *, int*);
- static struct tree * __tag2oid (char *, char *, oid  *, int  *, int *, int);
- static int __concat_oid_str (oid *, int *, char *);
- static int __add_var_val_str (netsnmp_pdu *, oid *, int, char *,
-@@ -129,46 +129,6 @@ __libraries_init(char *appname)
- 		     NETSNMP_OID_OUTPUT_SUFFIX);
- }
- 
--static void
--__recalc_timeout (tvp, ctvp, ltvp, itvp, block)
--struct timeval* tvp;
--struct timeval* ctvp;
--struct timeval* ltvp;
--struct timeval* itvp;
--int *block;
--{
--   struct timeval now;
--
--   if (!timerisset(itvp)) return;  /* interval zero means loop forever */
--   *block = 0;
--   gettimeofday(&now,(struct timezone *)0);
--
--   if (ctvp->tv_sec < 0) { /* first time or callback just fired */
--      timersub(&now,ltvp,ctvp);
--      timersub(ctvp,itvp,ctvp);
--      timersub(itvp,ctvp,ctvp);
--      timeradd(ltvp,itvp,ltvp);
--   } else {
--      timersub(&now,ltvp,ctvp);
--      timersub(itvp,ctvp,ctvp);
--   }
--
--   /* flag is set for callback but still hasnt fired so set to something
--    * small and we will service packets first if there are any ready
--    * (also guard against negative timeout - should never happen?)
--    */
--   if (!timerisset(ctvp) || ctvp->tv_sec < 0 || ctvp->tv_usec < 0) {
--      ctvp->tv_sec = 0;
--      ctvp->tv_usec = 10;
--   }
--
--   /* if snmp timeout > callback timeout or no more requests to process */
--   if (timercmp(tvp, ctvp, >) || !timerisset(tvp)) {
--      *tvp = *ctvp; /* use the smaller non-zero timeout */
--      timerclear(ctvp); /* used as a flag to let callback fire on timeout */
--   }
--}
--
- static int
- __is_numeric_oid (oidstr)
- char* oidstr;
-@@ -189,21 +149,6 @@ struct tree* tp;
- 		  (tp->parent && __get_type_str(tp->parent->type,buf) )));
- }
- 
--static SnmpMibNode*
--__get_next_mib_node (tp)
--SnmpMibNode* tp;
--{
--   /* printf("tp = %lX, parent = %lX, peer = %lX, child = %lX\n",
--              tp, tp->parent, tp->next_peer, tp->child_list); */
--   if (tp->child_list) return(tp->child_list);
--   if (tp->next_peer) return(tp->next_peer);
--   if (!tp->parent) return(NULL);
--   for (tp = tp->parent; !tp->next_peer; tp = tp->parent) {
--      if (!tp->parent) return(NULL);
--   }
--   return(tp->next_peer);
--}
--
- static int
- __translate_appl_type(typestr)
- char* typestr;
-@@ -261,50 +206,36 @@ int type;
-    switch (type) {
-         case ASN_INTEGER:
-             return(TYPE_INTEGER);
--	    break;
- 	case ASN_OCTET_STR:
-             return(TYPE_OCTETSTR);
--	    break;
- 	case ASN_OPAQUE:
-             return(TYPE_OPAQUE);
--	    break;
- 	case ASN_OBJECT_ID:
-             return(TYPE_OBJID);
--	    break;
- 	case ASN_TIMETICKS:
-             return(TYPE_TIMETICKS);
--	    break;
- 	case ASN_GAUGE:
-             return(TYPE_GAUGE);
--	    break;
- 	case ASN_COUNTER:
-             return(TYPE_COUNTER);
--	    break;
- 	case ASN_IPADDRESS:
-             return(TYPE_IPADDR);
--	    break;
- 	case ASN_BIT_STR:
-             return(TYPE_BITSTRING);
--	    break;
- 	case ASN_NULL:
-             return(TYPE_NULL);
--	    break;
- 	/* no translation for these exception type values */
- 	case SNMP_ENDOFMIBVIEW:
- 	case SNMP_NOSUCHOBJECT:
- 	case SNMP_NOSUCHINSTANCE:
- 	    return(type);
--	    break;
- 	case ASN_UINTEGER:
-             return(TYPE_UINTEGER);
--	    break;
- 	case ASN_COUNTER64:
-             return(TYPE_COUNTER64);
--	    break;
- 	default:
--            return(TYPE_OTHER);
-             fprintf(stderr, "translate_asn_type: unhandled asn type (%d)\n",type);
--            break;
-+            return(TYPE_OTHER);
-         }
- }
- 
-@@ -335,8 +266,7 @@ int flag;
-            if (flag == USE_ENUMS) {
-               for(ep = tp->enums; ep; ep = ep->next) {
-                  if (ep->value == *var->val.integer) {
--                    strncpy(buf, ep->label, buf_len);
--                    buf[buf_len -1] = 0;
-+                    strlcpy(buf, ep->label, buf_len);
-                     len = STRLEN(buf);
-                     break;
-                  }
-@@ -445,21 +375,6 @@ int len;
- }
- 
- static int
--__tp_sprint_num_objid (buf, tp)
--char *buf;
--SnmpMibNode *tp;
--{
--   oid newname[MAX_OID_LEN], *op;
--   /* code taken from get_node in snmp_client.c */
--   for (op = newname + MAX_OID_LEN - 1; op >= newname; op--) {
--      *op = tp->subid;
--      tp = tp->parent;
--      if (tp == NULL) break;
--   }
--   return __sprint_num_objid(buf, op, newname + MAX_OID_LEN - op);
--}
--
--static int
- __scan_num_objid (buf, objid, len)
- char *buf;
- oid *objid;
-@@ -674,24 +589,6 @@ int flag;
-    return(SUCCESS);
- }
- 
--
--static int
--__oid_cmp(oida_arr, oida_arr_len, oidb_arr, oidb_arr_len)
--oid *oida_arr;
--int oida_arr_len;
--oid *oidb_arr;
--int oidb_arr_len;
--{
--   for (;oida_arr_len && oidb_arr_len;
--	oida_arr++, oida_arr_len--, oidb_arr++, oidb_arr_len--) {
--	if (*oida_arr == *oidb_arr) continue;
--	return(*oida_arr > *oidb_arr ? 1 : -1);
--   }
--   if (oida_arr_len == oidb_arr_len) return(0);
--   return(oida_arr_len > oidb_arr_len ? 1 : -1);
--}
--
--
- /* Convert a tag (string) to an OID array              */
- /* Tag can be either a symbolic name, or an OID string */
- static struct tree *
-@@ -708,9 +605,6 @@ int    best_guess;
-    oid newname[MAX_OID_LEN], *op;
-    size_t newname_len = 0;
- 
--   char str_buf[STR_BUF_SIZE];
--   str_buf[0] = '\0';
--
-    if (type) *type = TYPE_UNKNOWN;
-    if (oid_arr_len) *oid_arr_len = 0;
-    if (!tag) goto done;
-@@ -796,43 +690,10 @@ int    best_guess;
-       }
-    }
-  done:
--   if (iid && *iid) __concat_oid_str(oid_arr, oid_arr_len, iid);
-+   if (iid && *iid && oid_arr_len)
-+       __concat_oid_str(oid_arr, oid_arr_len, iid);
-    return(rtp);
- }
--/* searches down the mib tree for the given oid
--   returns the last found tp and its index in lastind
-- */
--static struct tree *
--__oid2tp (oidp, len, subtree, lastind)
--oid* oidp;
--int len;
--struct tree * subtree;
--int* lastind;
--{
--    struct tree    *return_tree = NULL;
--
--
--    for (; subtree; subtree = subtree->next_peer) {
--	if (*oidp == subtree->subid){
--	    goto found;
--	}
--    }
--    *lastind=0;
--    return NULL;
--
--found:
--    if (len > 1){
--       return_tree =
--          __oid2tp(oidp + 1, len - 1, subtree->child_list, lastind);
--       (*lastind)++;
--    } else {
--       *lastind=1;
--    }
--    if (return_tree)
--	return return_tree;
--    else
--	return subtree;
--}
- 
- /* function: __concat_oid_str
-  *
-@@ -848,19 +709,22 @@ oid *doid_arr;
- int *doid_arr_len;
- char * soid_str;
- {
--   char soid_buf[STR_BUF_SIZE];
-+   char *soid_buf;
-    char *cp;
-    char *st;
- 
-    if (!soid_str || !*soid_str) return SUCCESS;/* successfully added nothing */
-    if (*soid_str == '.') soid_str++;
--   strcpy(soid_buf, soid_str);
-+   soid_buf = strdup(soid_str);
-+   if (!soid_buf)
-+       return FAILURE;
-    cp = strtok_r(soid_buf,".",&st);
-    while (cp) {
-      sscanf(cp, "%lu", &(doid_arr[(*doid_arr_len)++]));
-      /* doid_arr[(*doid_arr_len)++] =  atoi(cp); */
-      cp = strtok_r(NULL,".",&st);
-    }
-+   free(soid_buf);
-    return(SUCCESS);
- }
- 
-@@ -1004,7 +868,7 @@ char *err_str;
- int *err_num;
- int *err_ind;
- {
--   int status;
-+   int status = 0;
-    long command = pdu->command;
-    char *tmp_err_str;
- 
-@@ -1017,7 +881,7 @@ int *err_ind;
-    if (ss == NULL) {
-        *err_num = 0;
-        *err_ind = SNMPERR_BAD_SESSION;
--       strncpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE - 1);
-+       strlcpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE);
-        goto done;
-    }
- 
-@@ -1025,7 +889,7 @@ int *err_ind;
-    if (tmp_err_str == NULL) {
-        *err_num = errno;
-        *err_ind = SNMPERR_MALLOC;
--       strncpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE - 1);
-+       strlcpy(err_str, snmp_api_errstring(*err_ind), STR_BUF_SIZE);
-        goto done;
-    }
- 
-@@ -1070,8 +934,8 @@ retry:
-             /* in SNMPv2c, SNMPv2u, SNMPv2*, and SNMPv3 PDUs */
-             case SNMP_ERR_INCONSISTENTNAME:
-             default:
--               strncpy(err_str, (char*)snmp_errstring((*response)->errstat),
--		       STR_BUF_SIZE - 1);
-+               strlcpy(err_str, (char*)snmp_errstring((*response)->errstat),
-+		       STR_BUF_SIZE);
-                *err_num = (int)(*response)->errstat;
- 	       *err_ind = (*response)->errindex;
-                status = (*response)->errstat;
-@@ -1082,8 +946,7 @@ retry:
-       case STAT_TIMEOUT:
-       case STAT_ERROR:
- 	  snmp_sess_error(ss, err_num, err_ind, &tmp_err_str);
--	  strncpy(err_str, tmp_err_str, STR_BUF_SIZE - 1);
--	  err_str[STR_BUF_SIZE - 1] = '\0';
-+	  strlcpy(err_str, tmp_err_str, STR_BUF_SIZE);
-          break;
- 
-       default:
-@@ -1368,8 +1231,9 @@ netsnmp_create_session_v3(PyObject *self, PyObject *args)
- 			     USM_AUTH_PROTO_SHA_LEN);
-       session.securityAuthProtoLen = USM_AUTH_PROTO_SHA_LEN;
-     } else if (!strcmp(auth_proto, "DEFAULT")) {
--      session.securityAuthProto = 
--	get_default_authtype(&session.securityAuthProtoLen);
-+      const oid* a = get_default_authtype(&session.securityAuthProtoLen);
-+      session.securityAuthProto
-+        = snmp_duplicate_objid(a, session.securityAuthProtoLen);
-     } else {
-       if (verbose)
- 	printf("error:snmp_new_v3_session:Unsupported authentication protocol(%s)\n", auth_proto);
-@@ -1403,8 +1267,9 @@ netsnmp_create_session_v3(PyObject *self, PyObject *args)
- 			     USM_PRIV_PROTO_AES_LEN);
-       session.securityPrivProtoLen = USM_PRIV_PROTO_AES_LEN;
-     } else if (!strcmp(priv_proto, "DEFAULT")) {
--      session.securityPrivProto = 
--	get_default_privtype(&session.securityPrivProtoLen);
-+      const oid *p = get_default_privtype(&session.securityPrivProtoLen);
-+      session.securityPrivProto
-+        = snmp_duplicate_objid(p, session.securityPrivProtoLen);
-     } else {
-       if (verbose)
- 	printf("error:snmp_new_v3_session:Unsupported privacy protocol(%s)\n", priv_proto);
-@@ -1448,7 +1313,6 @@ netsnmp_create_session_tunneled(PyObject *self, PyObject *args)
-   int  timeout;
-   char *  sec_name;
-   int     sec_level;
--  char *  sec_eng_id;
-   char *  context_eng_id;
-   char *  context;
-   char *  our_identity;
-@@ -1525,7 +1389,11 @@ netsnmp_create_session_tunneled(PyObject *self, PyObject *args)
- 
-   if (!ss)
-       return NULL;
--  return Py_BuildValue("i", (int)ss);
-+  /*
-+   * Note: on a 64-bit system the statement below discards the upper 32 bits of
-+   * "ss", which is most likely a bug.
-+   */
-+  return Py_BuildValue("i", (int)(uintptr_t)ss);
- }
- 
- static PyObject *
-@@ -1563,7 +1431,6 @@ netsnmp_get(PyObject *self, PyObject *args)
-   int oid_arr_len = MAX_OID_LEN;
-   int type;
-   char type_str[MAX_TYPE_NAME_LEN];
--  int status;
-   u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf;
-   size_t str_buf_len = sizeof(str_buf);
-   size_t out_len = 0;
-@@ -1646,8 +1513,8 @@ netsnmp_get(PyObject *self, PyObject *args)
-       }
-     }
- 
--    status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, 
--			     err_str, &err_num, &err_ind);
-+    __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num,
-+                    &err_ind);
-     __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
- 
-     /*
-@@ -1698,8 +1565,8 @@ netsnmp_get(PyObject *self, PyObject *args)
- 					       &out_len, 0, &buf_over,
- 					       vars->name,vars->name_length);
- 	if (_debug_level) 
--	  printf("netsnmp_get:str_bufp:%s:%d:%d\n",
--		 str_bufp,str_buf_len,out_len);
-+            printf("netsnmp_get:str_bufp:%s:%d:%d\n", str_bufp,
-+                   (int)str_buf_len, (int)out_len);
- 
- 	str_buf[sizeof(str_buf)-1] = '\0';
- 
-@@ -1715,20 +1582,19 @@ netsnmp_get(PyObject *self, PyObject *args)
- 	
- 	if (_debug_level) printf("netsnmp_get:str_buf:%s\n",str_buf);
- 
--	__get_label_iid(str_buf, &tag, &iid, getlabel_flag);
-+	__get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
- 
- 	py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag));
- 	py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid));
- 
- 	__get_type_str(type, type_str);
- 
--	py_netsnmp_attr_set_string(varbind, "type", type_str, 
--				   STRLEN(type_str));
-+	py_netsnmp_attr_set_string(varbind, "type", type_str, strlen(type_str));
- 
--	len = __snprint_value(str_buf,sizeof(str_buf),
--			    vars,tp,type,sprintval_flag);
-+	len = __snprint_value((char *) str_buf, sizeof(str_buf),
-+                              vars, tp, type, sprintval_flag);
- 	str_buf[len] = '\0';
--	py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
-+	py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len);
- 
- 	/* save in return tuple as well */
- 	PyTuple_SetItem(val_tuple, varlist_ind, 
-@@ -1772,13 +1638,12 @@ netsnmp_getnext(PyObject *self, PyObject *args)
-   int oid_arr_len = MAX_OID_LEN;
-   int type;
-   char type_str[MAX_TYPE_NAME_LEN];
--  int status;
-   u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf;
-   size_t str_buf_len = sizeof(str_buf);
-   size_t out_len = 0;
-   int buf_over = 0;
-   char *tag;
--  char *iid;
-+  char *iid = NULL;
-   int getlabel_flag = NO_FLAGS;
-   int sprintval_flag = USE_BASIC;
-   int verbose = py_netsnmp_verbose();
-@@ -1862,8 +1727,8 @@ netsnmp_getnext(PyObject *self, PyObject *args)
-       }
-     }
- 
--    status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, 
--			     err_str, &err_num, &err_ind);
-+    __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num,
-+                    &err_ind);
-     __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
- 
-     /*
-@@ -1924,7 +1789,7 @@ netsnmp_getnext(PyObject *self, PyObject *args)
- 	  type = __translate_asn_type(vars->type);
- 	}
- 
--	__get_label_iid(str_buf, &tag, &iid, getlabel_flag);
-+	__get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
- 
- 	if (_debug_level) 
- 	  printf("netsnmp_getnext: filling response: %s:%s\n", tag, iid);
-@@ -1935,13 +1800,13 @@ netsnmp_getnext(PyObject *self, PyObject *args)
- 	__get_type_str(type, type_str);
- 
- 	py_netsnmp_attr_set_string(varbind, "type", type_str, 
--				   STRLEN(type_str));
-+				   strlen(type_str));
- 
--	len = __snprint_value(str_buf,sizeof(str_buf),
--			    vars,tp,type,sprintval_flag);
-+	len = __snprint_value((char *) str_buf, sizeof(str_buf),
-+                              vars, tp, type, sprintval_flag);
- 	str_buf[len] = '\0';
- 
--	py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
-+	py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len);
- 
- 	/* save in return tuple as well */
- 	PyTuple_SetItem(val_tuple, varlist_ind, 
-@@ -1984,10 +1849,10 @@ netsnmp_walk(PyObject *self, PyObject *args)
-   netsnmp_variable_list *vars, *oldvars;
-   struct tree *tp;
-   int len;
--  oid **oid_arr;
--  int *oid_arr_len;
--  oid **oid_arr_broken_check;
--  int *oid_arr_broken_check_len;
-+  oid **oid_arr = NULL;
-+  int *oid_arr_len = NULL;
-+  oid **oid_arr_broken_check = NULL;
-+  int *oid_arr_broken_check_len = NULL;
-   int type;
-   char type_str[MAX_TYPE_NAME_LEN];
-   int status;
-@@ -1996,7 +1861,7 @@ netsnmp_walk(PyObject *self, PyObject *args)
-   size_t out_len = 0;
-   int buf_over = 0;
-   char *tag;
--  char *iid;
-+  char *iid = NULL;
-   int getlabel_flag = NO_FLAGS;
-   int sprintval_flag = USE_BASIC;
-   int verbose = py_netsnmp_verbose();
-@@ -2102,7 +1967,8 @@ netsnmp_walk(PyObject *self, PyObject *args)
-       varlist_ind++;
-     }
- 
--    Py_DECREF(varlist_iter);
-+    if (varlist_iter)
-+        Py_DECREF(varlist_iter);
- 
-     if (PyErr_Occurred()) {
-       /* propagate error */
-@@ -2246,7 +2112,7 @@ netsnmp_walk(PyObject *self, PyObject *args)
-                       type = __translate_asn_type(vars->type);
-                   }
- 
--                  __get_label_iid(str_buf, &tag, &iid, getlabel_flag);
-+                  __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
- 
-                   if (_debug_level) printf("netsnmp_walk: filling response: %s:%s\n", tag, iid);
- 
-@@ -2256,13 +2122,14 @@ netsnmp_walk(PyObject *self, PyObject *args)
-                   __get_type_str(type, type_str);
- 
-                   py_netsnmp_attr_set_string(varbind, "type", type_str,
--                                             STRLEN(type_str));
-+                                             strlen(type_str));
- 
--                  len = __snprint_value(str_buf,sizeof(str_buf),
-+                  len = __snprint_value((char *) str_buf,sizeof(str_buf),
-                                         vars,tp,type,sprintval_flag);
-                   str_buf[len] = '\0';
- 
--                  py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
-+                  py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf,
-+                                             len);
-             
-                   /* push the varbind onto the return varbinds */
-                   PyList_Append(varbinds, varbind);
-@@ -2345,7 +2212,6 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
-   int oid_arr_len = MAX_OID_LEN;
-   int type;
-   char type_str[MAX_TYPE_NAME_LEN];
--  int status;
-   u_char str_buf[STR_BUF_SIZE], *str_bufp = str_buf;
-   size_t str_buf_len = sizeof(str_buf);
-   size_t out_len = 0;
-@@ -2434,8 +2300,8 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
- 	goto done;
-       }
- 
--      status = __send_sync_pdu(ss, pdu, &response, retry_nosuch, 
--			       err_str, &err_num, &err_ind);
-+      __send_sync_pdu(ss, pdu, &response, retry_nosuch, err_str, &err_num,
-+                      &err_ind);
-       __py_netsnmp_update_session_errors(session, err_str, err_num, err_ind);
- 
-       /*
-@@ -2505,7 +2371,7 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
- 	      type = __translate_asn_type(vars->type);
- 	    }
- 
--	    __get_label_iid(str_buf, &tag, &iid, getlabel_flag);
-+	    __get_label_iid((char *) str_buf, &tag, &iid, getlabel_flag);
- 
- 	    py_netsnmp_attr_set_string(varbind, "tag", tag, STRLEN(tag));
- 	    py_netsnmp_attr_set_string(varbind, "iid", iid, STRLEN(iid));
-@@ -2513,13 +2379,13 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
- 	    __get_type_str(type, type_str);
- 
- 	    py_netsnmp_attr_set_string(varbind, "type", type_str, 
--				       STRLEN(type_str));
-+				       strlen(type_str));
- 
--	    len = __snprint_value(str_buf,sizeof(str_buf),
--				  vars,tp,type,sprintval_flag);
-+	    len = __snprint_value((char *) str_buf, sizeof(str_buf),
-+				  vars, tp, type, sprintval_flag);
- 	    str_buf[len] = '\0';
- 
--	    py_netsnmp_attr_set_string(varbind, "val", str_buf, len);
-+	    py_netsnmp_attr_set_string(varbind, "val", (char *) str_buf, len);
- 
- 	    /* push varbind onto varbinds */
- 	    PyList_Append(varbinds, varbind);
-@@ -2556,7 +2422,8 @@ netsnmp_getbulk(PyObject *self, PyObject *args)
-       /* propagate error */
-       if (verbose)
- 	printf("error: getbulk response processing: unknown python error");
--      Py_DECREF(val_tuple);
-+      if (val_tuple)
-+          Py_DECREF(val_tuple);
-       val_tuple = NULL;
-     }
-   }
-@@ -2663,14 +2530,15 @@ netsnmp_set(PyObject *self, PyObject *args)
- 	if (type==TYPE_INTEGER && use_enums && tp && tp->enums) {
- 	  for(ep = tp->enums; ep; ep = ep->next) {
- 	    if (val && !strcmp(ep->label, val)) {
--	      strcpy(tmp_val_str, ep->value);
-+              snprintf((char *) tmp_val_str, sizeof(tmp_val_str), "%d",
-+                      ep->value);
- 	      break;
- 	    }
- 	  }
- 	}
- 	len = (int)tmplen;
- 	status = __add_var_val_str(pdu, oid_arr, oid_arr_len,
--				tmp_val_str, len, type);
-+                                   (char *) tmp_val_str, len, type);
- 
- 	if (verbose && status == FAILURE)
- 	  printf("error: set: adding variable/value to PDU");
-diff --git a/snmplib/Makefile.in b/snmplib/Makefile.in
-index 48beb38..506b8d4 100644
---- a/snmplib/Makefile.in
-+++ b/snmplib/Makefile.in
-@@ -243,7 +243,3 @@ libsnmp.$(LIB_EXTENSION)$(LIB_VERSION):    $(TOBJS)
- parse:  mib.o parse.c
- 	$(CC) $(CFLAGS) -DTEST parse.c -o $@ \
- 		`$(top_srcdir)/net-snmp-config --libs`
--
--test_binary_array: test_binary_array.c
--	$(CC) $(CFLAGS) test_binary_array.c -o $@ \
--		`$(top_srcdir)/net-snmp-config --libs`
-diff --git a/snmplib/asn1.c b/snmplib/asn1.c
-index 030fa63..e4da6be 100644
---- a/snmplib/asn1.c
-+++ b/snmplib/asn1.c
-@@ -1371,7 +1371,7 @@ asn_parse_objid(u_char * data,
-             }
-         }
- #if defined(EIGHTBIT_SUBIDS) || (SIZEOF_LONG != 4)
--        if (subidentifier > (u_long) MAX_SUBID) {
-+        if (subidentifier > MAX_SUBID) {
-             ERROR_MSG("subidentifier too large");
-             return NULL;
-         }
-@@ -1540,13 +1540,8 @@ asn_build_objid(u_char * data,
-      */
-     for (i = 1, objid_val = first_objid_val, op = objid + 2;
-          i < (int) objidlength; i++) {
--        if (i != 1) {
--            objid_val = *op++;
--#if SIZEOF_LONG != 4
--            if (objid_val > 0xffffffff) /* already logged warning above */
--                objid_val &= 0xffffffff;
--#endif
--        }
-+        if (i != 1)
-+            objid_val = (uint32_t)(*op++); /* already logged warning above */
-         switch (objid_size[i]) {
-         case 1:
-             *data++ = (u_char) objid_val;
-diff --git a/snmplib/callback.c b/snmplib/callback.c
-index 16026e9..dfe537a 100644
---- a/snmplib/callback.c
-+++ b/snmplib/callback.c
-@@ -249,7 +249,7 @@ snmp_register_callback(int major, int minor, SNMPCallback * new_callback,
-  * @param minor        Minor callback event type.
-  * @param new_callback Callback function being registered.
-  * @param arg          Argument that will be passed to the callback function.
-- * @priority           Handler invocation priority. When multiple handlers have
-+ * @param priority     Handler invocation priority. When multiple handlers have
-  *   been registered for the same (major, minor) callback event type, handlers
-  *   with the numerically lowest priority will be invoked first. Handlers with
-  *   identical priority are invoked in the order they have been registered.
-diff --git a/snmplib/cert_util.c b/snmplib/cert_util.c
-index 6d9efe5..246a6c9 100644
---- a/snmplib/cert_util.c
-+++ b/snmplib/cert_util.c
-@@ -751,7 +751,6 @@ _certindex_add( const char *dirname, int i )
-     if (SE_OK != rc) {
-         snmp_log(LOG_ERR, "adding certindex dirname failed; "
-                  "%d (%s) not added\n", i, dirname);
--        free(dirname_copy);
-         return -1;
-     }
- 
-@@ -791,7 +790,7 @@ _certindexes_load( void )
-      * Create a list of which directory each file refers to
-      */
-     while ((file = readdir( dir ))) {
--        if ( !isdigit(file->d_name[0]))
-+        if ( !isdigit(0xFF & file->d_name[0]))
-             continue;
-         i = atoi( file->d_name );
- 
-@@ -801,7 +800,6 @@ _certindexes_load( void )
-         fp = fopen( filename, "r" );
-         if ( !fp ) {
-             DEBUGMSGT(("cert:index:load", "error opening index (%d)\n", i));
--            fclose(fp);
-             continue;
-         }
-         cp = fgets( line, sizeof(line), fp );
-@@ -1179,12 +1177,6 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key)
-         return;
-     }
- 
--    snprintf(filename, sizeof(filename), "%s", key->info.filename);
--    pos = strrchr(filename, '.');
--    if (NULL == pos)
--        return;
--    *pos = 0;
--
-     if(key) {
-         if (key->cert) {
-             DEBUGMSGT(("cert:partner", "key already has partner\n"));
-@@ -1192,6 +1184,11 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key)
-         }
-         DEBUGMSGT(("9:cert:partner", "%s looking for partner near %s\n",
-                    key->info.filename, key->info.dir));
-+        snprintf(filename, sizeof(filename), "%s", key->info.filename);
-+        pos = strrchr(filename, '.');
-+        if (NULL == pos)
-+            return;
-+        *pos = 0;
- 
-         matching = _cert_find_subset_fn( filename, key->info.dir );
-         if (!matching)
-@@ -1220,6 +1217,11 @@ _find_partner(netsnmp_cert *cert, netsnmp_key *key)
-         }
-         DEBUGMSGT(("9:cert:partner", "%s looking for partner\n",
-                    cert->info.filename));
-+        snprintf(filename, sizeof(filename), "%s", cert->info.filename);
-+        pos = strrchr(filename, '.');
-+        if (NULL == pos)
-+            return;
-+        *pos = 0;
- 
-         matching = _key_find_subset(filename);
-         if (!matching)
-@@ -1714,7 +1716,7 @@ netsnmp_fp_lowercase_and_strip_colon(char *fp)
-             break;
-         }
-         else
--            *pos = isalpha(*pos) ? tolower(*pos) : *pos;
-+            *pos = isalpha(0xFF & *pos) ? tolower(0xFF & *pos) : *pos;
-     }
-     if (!*pos)
-         return;
-@@ -1723,7 +1725,7 @@ netsnmp_fp_lowercase_and_strip_colon(char *fp)
-     for (++pos; *pos; ++pos) {
-         if (':' == *pos)
-             continue;
--        *dest++ = isalpha(*pos) ? tolower(*pos) : *pos;
-+        *dest++ = isalpha(0xFF & *pos) ? tolower(0xFF & *pos) : *pos;
-     }
-     *dest = *pos; /* nul termination */
- }
-@@ -2011,7 +2013,8 @@ netsnmp_cert_trust(SSL_CTX *ctx, netsnmp_cert *thiscert)
- {
-     X509_STORE     *certstore;
-     X509           *cert;
--    
-+    char           *fingerprint;
-+
-     /* ensure all needed pieces are present */
-     netsnmp_assert_or_msgreturn(NULL != thiscert, "NULL certificate passed in",
-                                 SNMPERR_GENERR);
-@@ -2033,10 +2036,11 @@ netsnmp_cert_trust(SSL_CTX *ctx, netsnmp_cert *thiscert)
-                                 SNMPERR_GENERR);
- 
-     /* Put the certificate into the store */
-+    fingerprint = netsnmp_openssl_cert_get_fingerprint(cert, -1);
-     DEBUGMSGTL(("cert:trust",
-                 "putting trusted cert %p = %s in certstore %p\n", cert,
--                netsnmp_openssl_cert_get_fingerprint(cert, -1),
--                certstore));
-+                fingerprint, certstore));
-+    SNMP_FREE(fingerprint);
-     X509_STORE_add_cert(certstore, cert);
- 
-     return SNMPERR_SUCCESS;
-@@ -2132,7 +2136,7 @@ _cert_find_fp(const char *fingerprint)
-     if (NULL == fingerprint)
-         return NULL;
- 
--    strncpy(fp, fingerprint, sizeof(fp));
-+    strlcpy(fp, fingerprint, sizeof(fp));
-     netsnmp_fp_lowercase_and_strip_colon(fp);
- 
-     /** clear search key */
-@@ -2222,7 +2226,7 @@ _reduce_subset_dir(netsnmp_void_array *matching, const char *directory)
-      *
-      * so we want to backup up on directory for compares..
-      */
--    strncpy(dir,directory,sizeof(dir));
-+    strlcpy(dir, directory, sizeof(dir));
-     pos = strrchr(dir, '/');
-     if (NULL == pos) {
-         DEBUGMSGTL(("cert:subset:dir", "no '/' in directory %s\n", directory));
-@@ -2690,7 +2694,7 @@ netsnmp_certToTSN_parse_common(char **line)
-     tmp = buf;
-     *line = read_config_read_octet_string(*line, (u_char **)&tmp, &len);
-     tmp[len] = 0;
--    if (!isdigit(tmp[0])) {
-+    if (!isdigit(0xFF & tmp[0])) {
-         netsnmp_config_error("could not parse priority");
-         return NULL;
-     }
-@@ -3050,8 +3054,8 @@ netsnmp_tlstmParams_add(snmpTlstmParams *stp)
-                 stp->name));
- 
-     if (CONTAINER_INSERT(_tlstmParams, stp) != 0) {
--        netsnmp_tlstmParams_free(stp);
-         snmp_log(LOG_ERR, "error inserting tlstmParams %s", stp->name);
-+        netsnmp_tlstmParams_free(stp);
-         return -1;
-     }
- 
-@@ -3260,8 +3264,8 @@ netsnmp_tlstmAddr_add(snmpTlstmAddr *entry)
-     DEBUGMSGTL(("tlstmAddr:add", "adding entry 0x%lx %s %s\n",
-                 (u_long)entry, entry->name, entry->fingerprint));
-     if (CONTAINER_INSERT(_tlstmAddr, entry) != 0) {
--        netsnmp_tlstmAddr_free(entry);
-         snmp_log(LOG_ERR, "could not insert addr %s", entry->name);
-+        netsnmp_tlstmAddr_free(entry);
-         return -1;
-     }
- 
-@@ -3314,10 +3318,7 @@ _parse_addr(const char *token, char *line)
-     if (id_len)
-         entry->identity = strdup(id);
- 
--    if (netsnmp_tlstmAddr_add(entry) != 0)
--        netsnmp_tlstmAddr_free(entry);
--
--    return;
-+    netsnmp_tlstmAddr_add(entry);
- }
- 
- static char *
-diff --git a/snmplib/container_binary_array.c b/snmplib/container_binary_array.c
-index 41f1d24..249a3a9 100644
---- a/snmplib/container_binary_array.c
-+++ b/snmplib/container_binary_array.c
-@@ -487,7 +487,7 @@ binary_search_for_start(netsnmp_index *val, netsnmp_container *c)
- void          **
- netsnmp_binary_array_get_subset(netsnmp_container *c, void *key, int *len)
- {
--    binary_array_table *t = (binary_array_table*)c->container_data;
-+    binary_array_table *t;
-     void          **subset;
-     int             start, end;
-     size_t          i;
-diff --git a/snmplib/data_list.c b/snmplib/data_list.c
-index 15f2de2..505d4fc 100644
---- a/snmplib/data_list.c
-+++ b/snmplib/data_list.c
-@@ -240,9 +240,14 @@ netsnmp_register_save_list(netsnmp_data_list **datalist,
-                            const char *type, const char *token,
-                            Netsnmp_Save_List_Data *data_list_save_ptr,
-                            Netsnmp_Read_List_Data *data_list_read_ptr,
--                           Netsnmp_Free_List_Data *data_list_free_ptr) {
--    netsnmp_data_list_saveinfo *info =
--        SNMP_MALLOC_TYPEDEF(netsnmp_data_list_saveinfo);
-+                           Netsnmp_Free_List_Data *data_list_free_ptr)
-+{
-+    netsnmp_data_list_saveinfo *info;
-+
-+    if (!data_list_save_ptr && !data_list_read_ptr)
-+        return;
-+
-+    info = SNMP_MALLOC_TYPEDEF(netsnmp_data_list_saveinfo);
- 
-     if (!info) {
-         snmp_log(LOG_ERR, "couldn't malloc a netsnmp_data_list_saveinfo typedef");
-diff --git a/snmplib/dir_utils.c b/snmplib/dir_utils.c
-index 89bba6b..cbb6d00 100644
---- a/snmplib/dir_utils.c
-+++ b/snmplib/dir_utils.c
-@@ -122,7 +122,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container,
-         dirname_len = 0;
-     else {
-         dirname_len = strlen(dirname);
--        strncpy(path, dirname, sizeof(path));
-+        strlcpy(path, dirname, sizeof(path));
-         if ((dirname_len + 2) > sizeof(path)) {
-             /** not enough room for files */
-             closedir(dir);
-@@ -131,7 +131,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container,
-             return NULL;
-         }
-         path[dirname_len] = '/';
--        path[++dirname_len] = 0;
-+        path[++dirname_len] = '\0';
-     }
- 
-     /** iterate over dir */
-@@ -146,7 +146,7 @@ netsnmp_directory_container_read_some(netsnmp_container *user_container,
-              ((file->d_name[1] == '.') && ((file->d_name[2] == 0)))))
-             continue;
- 
--        strncpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len);
-+        strlcpy(&path[dirname_len], file->d_name, sizeof(path) - dirname_len);
-         if (NULL != filter) {
-             if (flags & NETSNMP_DIR_NSFILE_STATS) {
-                 /** use local vars for now */
-diff --git a/snmplib/int64.c b/snmplib/int64.c
-index 5db2375..2c71b17 100644
---- a/snmplib/int64.c
-+++ b/snmplib/int64.c
-@@ -1,9 +1,10 @@
--/** file: test.c - test of 64-bit integer stuff
--*
--*
--* 21-jan-1998: David Perkins <dperkins@dsperkins.com>
--*
--*/
-+/**
-+ * @file int64.c
-+ *
-+ * @brief Functions for 64-bit integer computations.
-+ *
-+ * 21-jan-1998: David Perkins <dperkins@dsperkins.com>
-+ */
- 
- #include <net-snmp/net-snmp-config.h>
- #include <sys/types.h>
-@@ -24,17 +25,13 @@
- 
- #include <net-snmp/net-snmp-features.h>
- 
--#define TRUE 1
--#define FALSE 0
--
--/** divBy10 - divide an unsigned 64-bit integer by 10
--*
--* call with:
--*   u64 - number to be divided
--*   pu64Q - location to store quotient
--*   puR - location to store remainder
--*
--*/
-+/**
-+ * Divide an unsigned 64-bit integer by 10.
-+ *
-+ * @param[in]  u64   Number to be divided.
-+ * @param[out] pu64Q Quotient.
-+ * @param[out] puR   Remainder.
-+ */
- void
- divBy10(U64 u64, U64 * pu64Q, unsigned int *puR)
- {
-@@ -42,7 +39,6 @@ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR)
-     unsigned long   ulQ;
-     unsigned long   ulR;
- 
--
-     /*
-      * top 16 bits 
-      */
-@@ -78,18 +74,14 @@ divBy10(U64 u64, U64 * pu64Q, unsigned int *puR)
-     pu64Q->low = pu64Q->low | ulQ;
- 
-     *puR = (unsigned int) (ulR);
-+}
- 
--
--}                               /* divBy10 */
--
--
--/** multBy10 - multiply an unsigned 64-bit integer by 10
--*
--* call with:
--*   u64 - number to be multiplied
--*   pu64P - location to store product
--*
--*/
-+/**
-+ * Multiply an unsigned 64-bit integer by 10.
-+ *
-+ * @param[in]  u64   Number to be multiplied.
-+ * @param[out] pu64P Product.
-+ */
- void
- multBy10(U64 u64, U64 * pu64P)
- {
-@@ -97,7 +89,6 @@ multBy10(U64 u64, U64 * pu64P)
-     unsigned long   ulP;
-     unsigned long   ulK;
- 
--
-     /*
-      * lower 16 bits 
-      */
-@@ -129,159 +120,122 @@ multBy10(U64 u64, U64 * pu64P)
-     ulP = (ulT * 10) + ulK;
-     ulK = ulP >> 16;
-     pu64P->high = (ulP & 0x0ffff) << 16 | pu64P->high;
-+}
- 
--
--}                               /* multBy10 */
--
--
--/** incrByU16 - add an unsigned 16-bit int to an unsigned 64-bit integer
--*
--* call with:
--*   pu64 - number to be incremented
--*   u16 - amount to add
--*
--*/
-+/**
-+ * Add an unsigned 16-bit int to an unsigned 64-bit integer.
-+ *
-+ * @param[in,out] pu64 Number to be incremented.
-+ * @param[in]     u16  Amount to add.
-+ *
-+ */
- void
- incrByU16(U64 * pu64, unsigned int u16)
- {
--    unsigned long   ulT1;
--    unsigned long   ulT2;
--    unsigned long   ulR;
--    unsigned long   ulK;
--
--
--    /*
--     * lower 16 bits 
--     */
--    ulT1 = pu64->low;
--    ulT2 = ulT1 & 0x0ffff;
--    ulR = ulT2 + u16;
--    ulK = ulR >> 16;
--    if (ulK == 0) {
--        pu64->low = ulT1 + u16;
--        return;
--    }
--
--    /*
--     * next 16 bits 
--     */
--    ulT2 = (ulT1 >> 16) & 0x0ffff;
--    ulR = ulT2 + 1;
--    ulK = ulR >> 16;
--    if (ulK == 0) {
--        pu64->low = ulT1 + u16;
--        return;
--    }
--
--    /*
--     * next 32 - ignore any overflow 
--     */
--    pu64->low = (ulT1 + u16) & 0x0FFFFFFFFL;
--    pu64->high++;
--#if SIZEOF_LONG != 4
--    pu64->high &= 0xffffffff;
--#endif
--}                               /* incrByV16 */
-+    incrByU32(pu64, u16);
-+}
- 
-+/**
-+ * Add an unsigned 32-bit int to an unsigned 64-bit integer.
-+ *
-+ * @param[in,out] pu64 Number to be incremented.
-+ * @param[in]     u32  Amount to add.
-+ *
-+ */
- void
- incrByU32(U64 * pu64, unsigned int u32)
- {
--    unsigned int    tmp;
-+    uint32_t tmp;
-+
-     tmp = pu64->low;
--    pu64->low += u32;
--#if SIZEOF_LONG != 4
--    pu64->low &= 0xffffffff;
--#endif
--    if (pu64->low < tmp) {
--        pu64->high++;
--#if SIZEOF_LONG != 4
--        pu64->high &= 0xffffffff;
--#endif
--    }
-+    pu64->low = (uint32_t)(tmp + u32);
-+    if (pu64->low < tmp)
-+        pu64->high = (uint32_t)(pu64->high + 1);
- }
- 
- /**
-- * pu64out = pu64one - pu64two 
-+ * Subtract two 64-bit numbers.
-+ *
-+ * @param[in] pu64one Number to start from.
-+ * @param[in] pu64two Amount to subtract.
-+ * @param[out] pu64out pu64one - pu64two.
-  */
- void
- u64Subtract(const U64 * pu64one, const U64 * pu64two, U64 * pu64out)
- {
--    if (pu64one->low < pu64two->low) {
--        pu64out->low = 0xffffffff - pu64two->low + pu64one->low + 1;
--        pu64out->high = pu64one->high - pu64two->high - 1;
--    } else {
--        pu64out->low = pu64one->low - pu64two->low;
--        pu64out->high = pu64one->high - pu64two->high;
--    }
-+    int carry;
-+
-+    carry = pu64one->low < pu64two->low;
-+    pu64out->low = (uint32_t)(pu64one->low - pu64two->low);
-+    pu64out->high = (uint32_t)(pu64one->high - pu64two->high - carry);
- }
- 
- /**
-- * pu64out += pu64one
-+ * Add two 64-bit numbers.
-+ *
-+ * @param[in] pu64one Amount to add.
-+ * @param[in,out] pu64out pu64out += pu64one.
-  */
- void
- u64Incr(U64 * pu64out, const U64 * pu64one)
- {
--    pu64out->high += pu64one->high;
--#if SIZEOF_LONG != 4
--    pu64out->high &= 0xffffffff;
--#endif
-+    pu64out->high = (uint32_t)(pu64out->high + pu64one->high);
-     incrByU32(pu64out, pu64one->low);
- }
- 
- /**
-- * pu64out += (pu64one - pu64two)
-+ * Add the difference of two 64-bit numbers to a 64-bit counter.
-+ *
-+ * @param[in] pu64one
-+ * @param[in] pu64two
-+ * @param[out] pu64out pu64out += (pu64one - pu64two)
-  */
- void
- u64UpdateCounter(U64 * pu64out, const U64 * pu64one, const U64 * pu64two)
- {
-     U64 tmp;
-+
-     u64Subtract(pu64one, pu64two, &tmp);
-     u64Incr(pu64out, &tmp);
- }
- 
--/**
-- * pu64one = pu64two 
-- */
- netsnmp_feature_child_of(u64copy, netsnmp_unused)
- #ifndef NETSNMP_FEATURE_REMOVE_U64COPY
-+/**
-+ * Copy a 64-bit number.
-+ *
-+ * @param[in] pu64two Number to be copied.
-+ * @param[out] pu64one Where to store the copy - *pu64one = *pu64two.
-+ */
- void
- u64Copy(U64 * pu64one, const U64 * pu64two)
- {
--    pu64one->high = pu64two->high;
--    pu64one->low =  pu64two->low;
-+    *pu64one = *pu64two;
- }
- #endif /* NETSNMP_FEATURE_REMOVE_U64COPY */
- 
--/** zeroU64 - set an unsigned 64-bit number to zero
--*
--* call with:
--*   pu64 - number to be zero'ed
--*
--*/
-+/**
-+ * Set an unsigned 64-bit number to zero.
-+ *
-+ * @param[in] pu64 Number to be zeroed.
-+ */
- void
- zeroU64(U64 * pu64)
- {
-     pu64->low = 0;
-     pu64->high = 0;
--}                               /* zeroU64 */
--
-+}
- 
--/** isZeroU64 - check if an unsigned 64-bit number is
--*
--* call with:
--*   pu64 - number to be zero'ed
--*
--*/
-+/**
-+ * Check if an unsigned 64-bit number is zero.
-+ *
-+ * @param[in] pu64 Number to be checked.
-+ */
- int
- isZeroU64(const U64 * pu64)
- {
--
--    if ((pu64->low == 0) && (pu64->high == 0))
--        return (TRUE);
--    else
--        return (FALSE);
--
--}                               /* isZeroU64 */
-+    return pu64->low == 0 && pu64->high == 0;
-+}
- 
- /**
-  * check the old and new values of a counter64 for 32bit wrapping
-@@ -292,7 +246,7 @@ isZeroU64(const U64 * pu64)
-  * @param old_val
-  * @param new_val
-  *
-- *@Note:
-+ * @note
-  * The old and new values must be be from within a time period
-  * which would only allow the 32bit portion of the counter to
-  * wrap once. i.e. if the 32bit portion of the counter could
-@@ -331,16 +285,11 @@ netsnmp_c64_check_for_32bit_wrap(struct counter64 *old_val,
-      */
-     if (new_val->high == old_val->high) {
-         DEBUGMSGTL(("c64:check_wrap", "32 bit wrap\n"));
--        if (adjust) {
--            ++new_val->high;
--#if SIZEOF_LONG != 4
--            new_val->high &= 0xffffffff;
--#endif
--        }
-+        if (adjust)
-+            new_val->high = (uint32_t)(new_val->high + 1);
-         return 32;
-     }
--    else if ((new_val->high == (old_val->high + 1)) ||
--             ((0 == new_val->high) && (0xffffffff == old_val->high))) {
-+    else if (new_val->high == (uint32_t)(old_val->high + 1)) {
-         DEBUGMSGTL(("c64:check_wrap", "64 bit wrap\n"));
-         return 64;
-     }
-@@ -357,7 +306,7 @@ netsnmp_c64_check_for_32bit_wrap(struct counter64 *old_val,
-  * @param need_wrap_check: pointer to integer indicating if wrap check is needed
-  *                         flag may be cleared if 64 bit counter is detected
-  *
-- *@Note:
-+ * @note
-  * The old_prev_val and new_val values must be be from within a time
-  * period which would only allow the 32bit portion of the counter to
-  * wrap once. i.e. if the 32bit portion of the counter could
-@@ -438,9 +387,11 @@ netsnmp_c64_check32_and_update(struct counter64 *prev_val, struct counter64 *new
-     return 0;
- }
- 
-+/** Convert an unsigned 64-bit number to ASCII. */
- void
--printU64(char *buf,     /* char [I64CHARSZ+1]; */
--                         const U64 * pu64) {
-+printU64(char *buf, /* char [I64CHARSZ+1]; */
-+         const U64 * pu64)
-+{
-     U64             u64a;
-     U64             u64b;
- 
-@@ -448,57 +399,37 @@ printU64(char *buf,     /* char [I64CHARSZ+1]; */
-     unsigned int    u;
-     int             j;
- 
--    u64a.high = pu64->high;
--    u64a.low = pu64->low;
-+    u64a = *pu64;
-     aRes[I64CHARSZ] = 0;
-     for (j = 0; j < I64CHARSZ; j++) {
-         divBy10(u64a, &u64b, &u);
-         aRes[(I64CHARSZ - 1) - j] = (char) ('0' + u);
--        u64a.high = u64b.high;
--        u64a.low = u64b.low;
-+        u64a = u64b;
-         if (isZeroU64(&u64a))
-             break;
-     }
-     strcpy(buf, &aRes[(I64CHARSZ - 1) - j]);
- }
- 
-+/** Convert a signed 64-bit number to ASCII. */
- void
--printI64(char *buf,     /* char [I64CHARSZ+1]; */
--                         const U64 * pu64) {
-+printI64(char *buf, /* char [I64CHARSZ+1]; */
-+         const U64 * pu64)
-+{
-     U64             u64a;
--    U64             u64b;
--
--    char            aRes[I64CHARSZ + 1];
--    unsigned int    u;
--    int             j, sign = 0;
- 
-     if (pu64->high & 0x80000000) {
--        u64a.high = ~pu64->high;
--        u64a.low = ~pu64->low;
--        sign = 1;
-+        u64a.high = (uint32_t) ~pu64->high;
-+        u64a.low = (uint32_t) ~pu64->low;
-         incrByU32(&u64a, 1);    /* bit invert and incr by 1 to print 2s complement */
-+        buf[0] = '-';
-+        printU64(buf + 1, &u64a);
-     } else {
--        u64a.high = pu64->high;
--        u64a.low = pu64->low;
--    }
--
--    aRes[I64CHARSZ] = 0;
--    for (j = 0; j < I64CHARSZ; j++) {
--        divBy10(u64a, &u64b, &u);
--        aRes[(I64CHARSZ - 1) - j] = (char) ('0' + u);
--        u64a.high = u64b.high;
--        u64a.low = u64b.low;
--        if (isZeroU64(&u64a))
--            break;
--    }
--    if (sign == 1) {
--        aRes[(I64CHARSZ - 1) - j - 1] = '-';
--        strcpy(buf, &aRes[(I64CHARSZ - 1) - j - 1]);
--        return;
-+        printU64(buf, pu64);
-     }
--    strcpy(buf, &aRes[(I64CHARSZ - 1) - j]);
- }
- 
-+/** Convert a signed 64-bit integer from ASCII to U64. */
- int
- read64(U64 * i64, const char *str)
- {
-@@ -517,75 +448,14 @@ read64(U64 * i64, const char *str)
-         ok = 1;
-         u = *str - '0';
-         multBy10(*i64, &i64p);
--        memcpy(i64, &i64p, sizeof(i64p));
-+        *i64 = i64p;
-         incrByU16(i64, u);
-         str++;
-     }
-     if (sign) {
--        i64->high = ~i64->high;
--        i64->low = ~i64->low;
-+        i64->high = (uint32_t) ~i64->high;
-+        i64->low = (uint32_t) ~i64->low;
-         incrByU16(i64, 1);
-     }
-     return ok;
- }
--
--
--
--
--#ifdef TESTING
--void
--main(int argc, char *argv[])
--{
--    int             i;
--    int             j;
--    int             l;
--    unsigned int    u;
--    U64             u64a;
--    U64             u64b;
--#define MXSZ 20
--    char            aRes[MXSZ + 1];
--
--
--    if (argc < 2) {
--        printf("This program takes numbers from the command line\n"
--               "and prints them out.\n" "Usage: test <unsignedInt>...\n");
--        exit(1);
--    }
--
--    aRes[MXSZ] = 0;
--
--    for (i = 1; i < argc; i++) {
--        l = strlen(argv[i]);
--        zeroU64(&u64a);
--        for (j = 0; j < l; j++) {
--            if (!isdigit(argv[i][j])) {
--                printf("Argument is not a number \"%s\"\n", argv[i]);
--                exit(1);
--            }
--            u = argv[i][j] - '0';
--            multBy10(u64a, &u64b);
--            u64a = u64b;
--            incrByU16(&u64a, u);
--        }
--
--        printf("number \"%s\" in hex is '%08x%08x'h\n",
--               argv[i], u64a.high, u64a.low);
--
--        printf("number is \"%s\"\n", printU64(&u64a));
--        for (j = 0; j < MXSZ; j++) {
--            divBy10(u64a, &u64b, &u);
--            aRes[(MXSZ - 1) - j] = (char) ('0' + u);
--            u64a = u64b;
--            if (isZeroU64(&u64a))
--                break;
--        }
--
--        printf("number is \"%s\"\n", &aRes[(MXSZ - 1) - j]);
--    }
--    exit(0);
--}                               /* main */
--#endif                          /* TESTING */
--
--/*
-- * file: test.c 
-- */
-diff --git a/snmplib/keytools.c b/snmplib/keytools.c
-index 810a063..0faa0de 100644
---- a/snmplib/keytools.c
-+++ b/snmplib/keytools.c
-@@ -118,13 +118,11 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
-     u_char          buf[USM_LENGTH_KU_HASHBLOCK], *bufp;
- 
- #ifdef NETSNMP_USE_OPENSSL
--    EVP_MD_CTX     *ctx = (EVP_MD_CTX *)malloc(sizeof(EVP_MD_CTX));
--    unsigned int    tmp_len;
-+    EVP_MD_CTX     *ctx = NULL;
- #elif NETSNMP_USE_INTERNAL_CRYPTO
-     SHA_CTX csha1;
-     MD5_CTX cmd5;
-     char    cryptotype = 0;
--    unsigned int    tmp_len;
- #define TYPE_MD5  1
- #define TYPE_SHA1 2
- #else
-@@ -151,6 +149,12 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
-      */
- #ifdef NETSNMP_USE_OPENSSL
- 
-+#ifdef HAVE_EVP_MD_CTX_CREATE
-+    ctx = EVP_MD_CTX_create();
-+#else
-+    ctx = malloc(sizeof(*ctx));
-+    EVP_MD_CTX_init(ctx);
-+#endif
- #ifndef NETSNMP_DISABLE_MD5
-     if (ISTRANSFORM(hashtype, HMACMD5Auth))
-         EVP_DigestInit(ctx, EVP_md5());
-@@ -158,10 +162,8 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
- #endif
-         if (ISTRANSFORM(hashtype, HMACSHA1Auth))
-         EVP_DigestInit(ctx, EVP_sha1());
--    else {
--        free(ctx);
--        return (SNMPERR_GENERR);
--    }
-+    else
-+        QUITFUN(SNMPERR_GENERR, generate_Ku_quit);
- #elif NETSNMP_USE_INTERNAL_CRYPTO
- #ifndef NETSNMP_DISABLE_MD5
-     if (ISTRANSFORM(hashtype, HMACMD5Auth)) {
-@@ -205,14 +207,17 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
-     }
- 
- #ifdef NETSNMP_USE_OPENSSL
-+    {
-+    unsigned int    tmp_len;
-+
-     tmp_len = *kulen;
-     EVP_DigestFinal(ctx, (unsigned char *) Ku, &tmp_len);
-     *kulen = tmp_len;
-     /*
-      * what about free() 
-      */
-+    }
- #elif NETSNMP_USE_INTERNAL_CRYPTO
--    tmp_len = *kulen;
-     if (TYPE_SHA1 == cryptotype) {
-         SHA1_Final(Ku, &csha1);
-     } else {
-@@ -248,7 +253,14 @@ generate_Ku(const oid * hashtype, u_int hashtype_len,
-   generate_Ku_quit:
-     memset(buf, 0, sizeof(buf));
- #ifdef NETSNMP_USE_OPENSSL
--    free(ctx);
-+    if (ctx) {
-+#ifdef HAVE_EVP_MD_CTX_DESTROY
-+        EVP_MD_CTX_destroy(ctx);
-+#else
-+        EVP_MD_CTX_cleanup(ctx);
-+        free(ctx);
-+#endif
-+    }
- #endif
-     return rval;
- 
-@@ -638,7 +650,8 @@ decode_keychange(const oid * hashtype, u_int hashtype_len,
- 
-   decode_keychange_quit:
-     if (rval != SNMPERR_SUCCESS) {
--        memset(newkey, 0, properlength);
-+        if (newkey)
-+            memset(newkey, 0, properlength);
-     }
-     memset(tmp_buf, 0, SNMP_MAXBUF);
-     SNMP_FREE(tmpbuf);
-diff --git a/snmplib/large_fd_set.c b/snmplib/large_fd_set.c
-index 1176a5b..32f57b3 100644
---- a/snmplib/large_fd_set.c
-+++ b/snmplib/large_fd_set.c
-@@ -19,7 +19,7 @@
- #include <net-snmp/library/large_fd_set.h>
- 
- 
--#if ! defined(cygwin) && defined(HAVE_WINSOCK_H)
-+#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
- 
- void
- netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset)
-@@ -39,7 +39,7 @@ netsnmp_large_fd_setfd(SOCKET fd, netsnmp_large_fd_set * fdset)
-     if (i == fdset->lfs_set.fd_count
-         && fdset->lfs_set.fd_count < fdset->lfs_setsize) {
-         fdset->lfs_set.fd_count++;
--        fdset->lfs_set.fd_array[i] = (fd);
-+        fdset->lfs_set.fd_array[i] = fd;
-     }
- }
- 
-@@ -51,7 +51,7 @@ netsnmp_large_fd_clr(SOCKET fd, netsnmp_large_fd_set * fdset)
-     netsnmp_assert(fd != INVALID_SOCKET);
- 
-     for (i = 0; i < fdset->lfs_set.fd_count; i++) {
--        if (fdset->lfs_set.fd_array[i] == (fd)) {
-+        if (fdset->lfs_set.fd_array[i] == fd) {
-             while (i < fdset->lfs_set.fd_count - 1) {
-                 fdset->lfs_set.fd_array[i] =
-                     fdset->lfs_set.fd_array[i + 1];
-@@ -95,7 +95,7 @@ netsnmp_large_fd_clr(int fd, netsnmp_large_fd_set * fdset)
- {
-     netsnmp_assert(fd >= 0);
- 
--    if (fd < (int)fdset->lfs_setsize)
-+    if ((unsigned)fd < fdset->lfs_setsize)
-         FD_CLR(fd, fdset->lfs_setptr);
- }
- 
-@@ -104,7 +104,7 @@ netsnmp_large_fd_is_set(int fd, netsnmp_large_fd_set * fdset)
- {
-     netsnmp_assert(fd >= 0);
- 
--    return fd < (int)fdset->lfs_setsize && FD_ISSET(fd, fdset->lfs_setptr);
-+    return (unsigned)fd < fdset->lfs_setsize && FD_ISSET(fd, fdset->lfs_setptr);
- }
- 
- #endif
-@@ -114,6 +114,9 @@ netsnmp_large_fd_set_init(netsnmp_large_fd_set * fdset, int setsize)
- {
-     fdset->lfs_setsize = 0;
-     fdset->lfs_setptr  = NULL;
-+#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
-+    fdset->lfs_set.fd_count = 0;
-+#endif
-     netsnmp_large_fd_set_resize(fdset, setsize);
- }
- 
-@@ -135,25 +138,32 @@ netsnmp_large_fd_set_select(int numfds, netsnmp_large_fd_set *readfds,
-     /* Array representation: no resizing is necessary. */
- #endif
- 
--    return select(numfds, readfds->lfs_setptr, writefds->lfs_setptr,
--                  exceptfds->lfs_setptr, timeout);
-+    return select(numfds,
-+            readfds ? readfds->lfs_setptr : NULL,
-+            writefds ? writefds->lfs_setptr : NULL,
-+            exceptfds ? exceptfds->lfs_setptr : NULL,
-+            timeout);
- }
- 
--void
-+int
- netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize)
- {
-     int             fd_set_bytes;
- 
-     if (fdset->lfs_setsize == setsize)
--        return;
-+        goto success;
- 
-     if (setsize > FD_SETSIZE) {
-         fd_set_bytes = NETSNMP_FD_SET_BYTES(setsize);
--        if (fdset->lfs_setsize > FD_SETSIZE)
--            fdset->lfs_setptr = (fd_set *)realloc(fdset->lfs_setptr, fd_set_bytes);
--        else {
--            fdset->lfs_setptr = (fd_set *)malloc(fd_set_bytes);
--           *fdset->lfs_setptr = fdset->lfs_set;
-+        if (fdset->lfs_setsize > FD_SETSIZE) {
-+            fdset->lfs_setptr = realloc(fdset->lfs_setptr, fd_set_bytes);
-+            if (!fdset->lfs_setptr)
-+                goto out_of_mem;
-+        } else {
-+            fdset->lfs_setptr = malloc(fd_set_bytes);
-+            if (!fdset->lfs_setptr)
-+                goto out_of_mem;
-+            *fdset->lfs_setptr = fdset->lfs_set;
-         }
-     } else {
-         if (fdset->lfs_setsize > FD_SETSIZE) {
-@@ -163,20 +173,33 @@ netsnmp_large_fd_set_resize(netsnmp_large_fd_set * fdset, int setsize)
-         fdset->lfs_setptr = &fdset->lfs_set;
-     }
- 
--#if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H))
-+#if defined(cygwin) || !defined(HAVE_WINSOCK_H)
-     {
-         int             i;
- 
--	/*
--	 * Unix: clear the file descriptors defined in the resized *fdset
--	 * but that were not defined in the original *fdset.
--	 */
--	for (i = fdset->lfs_setsize; i < setsize; i++)
--	    FD_CLR(i, fdset->lfs_setptr);
-+        /*
-+         * Unix: when enlarging, clear the file descriptors defined in the
-+         * resized *fdset but that were not defined in the original *fdset.
-+         */
-+        for (i = fdset->lfs_setsize; i < setsize; i++)
-+            FD_CLR(i, fdset->lfs_setptr);
-     }
- #endif
- 
-     fdset->lfs_setsize = setsize;
-+#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
-+    if (setsize < fdset->lfs_set.fd_count)
-+        fdset->lfs_set.fd_count = setsize;
-+#endif
-+success:
-+    return 1;
-+
-+out_of_mem:
-+    fdset->lfs_setsize = 0;
-+#if !defined(cygwin) && defined(HAVE_WINSOCK_H)
-+    fdset->lfs_set.fd_count = 0;
-+#endif
-+    return 0;
- }
- 
- void
-@@ -207,13 +230,13 @@ netsnmp_copy_large_fd_set_to_fd_set(fd_set * dst,
- 
-     *dst = *src->lfs_setptr;
- 
--#if ! (! defined(cygwin) && defined(HAVE_WINSOCK_H))
-+#if !(!defined(cygwin) && defined(HAVE_WINSOCK_H))
-     {
-         int             i;
- 
--	/* Unix: clear any file descriptors defined in *dst but not in *src. */
--	for (i = src->lfs_setsize; i < FD_SETSIZE; ++i)
--	  FD_CLR(i, dst);
-+        /* Unix: clear any file descriptors defined in *dst but not in *src. */
-+        for (i = src->lfs_setsize; i < FD_SETSIZE; ++i)
-+            FD_CLR(i, dst);
-     }
- #endif
- 
-diff --git a/snmplib/mib.c b/snmplib/mib.c
-index 7c8af9c..549d206 100644
---- a/snmplib/mib.c
-+++ b/snmplib/mib.c
-@@ -462,7 +462,7 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len,
-     const char     *saved_hint = hint;
-     int             hex = 0, x = 0;
-     u_char         *cp;
--    int             output_format, len_needed;
-+    int             output_format, cnt;
- 
-     if ((var->type != ASN_OCTET_STR) && 
-         (!netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_QUICKE_PRINT))) {
-@@ -571,18 +571,11 @@ sprint_realloc_octet_string(u_char ** buf, size_t * buf_len,
-                     break;
-                 case 't': /* new in rfc 3411 */
-                 case 'a':
--                    /* A string hint gives the max size - we may not need this much */
--                    len_needed = SNMP_MIN( width, ecp-cp );
--                    while ((*out_len + len_needed + 1) >= *buf_len) {
--                        if (!(allow_realloc && snmp_realloc(buf, buf_len))) {
--                            return 0;
--                        }
--                    }
--                    for (x = 0; x < width && cp < ecp; x++) {
--                        *(*buf + *out_len) = *cp++;
--                        (*out_len)++;
--                    }
--                    *(*buf + *out_len) = '\0';
-+                    cnt = SNMP_MIN(width, ecp - cp);
-+                    if (!sprint_realloc_asciistring(buf, buf_len, out_len,
-+                                                    allow_realloc, cp, cnt))
-+                        return 0;
-+                    cp += cnt;
-                     break;
-                 default:
-                     *out_len = saved_out_len;
-@@ -2800,6 +2793,8 @@ netsnmp_mibindex_load( void )
-               get_persistent_directory(), i );
-         tmpbuf[sizeof(tmpbuf)-1] = 0;
-         fp = fopen( tmpbuf, "r" );
-+        if (!fp)
-+            continue;
-         cp = fgets( tmpbuf2, sizeof(tmpbuf2), fp );
-         if ( !cp ) {
-             DEBUGMSGTL(("mibindex", "Empty MIB index (%d)\n", i));
-@@ -3057,14 +3052,11 @@ read_objid(const char *input, oid * output, size_t * out_len)
-          * get past leading '.', append '.' to Prefix. 
-          */
-         if (*Prefix == '.')
--            strncpy(buf, Prefix + 1, sizeof(buf)-1);
-+            strlcpy(buf, Prefix + 1, sizeof(buf));
-         else
--            strncpy(buf, Prefix, sizeof(buf)-1);
--        buf[ sizeof(buf)-1 ] = 0;
--        strcat(buf, ".");
--        buf[ sizeof(buf)-1 ] = 0;
--        strncat(buf, input, sizeof(buf)-strlen(buf));
--        buf[ sizeof(buf)-1 ] = 0;
-+            strlcpy(buf, Prefix, sizeof(buf));
-+        strlcat(buf, ".", sizeof(buf));
-+        strlcat(buf, input, sizeof(buf));
-         input = buf;
-     }
- #endif /* NETSNMP_DISABLE_MIB_LOADING */
-@@ -5106,8 +5098,7 @@ print_tree_node(u_char ** buf, size_t * buf_len,
-                 else
-                     if (!snmp_cstrcat(buf, buf_len, out_len, allow_realloc, ", "))
-                         return 0;
--                snprintf(str, sizeof(str), "%s", vp->vblabel);
--                str[ sizeof(str)-1 ] = 0;
-+                strlcpy(str, vp->vblabel, sizeof(str));
-                 len = strlen(str);
-                 if (pos + len + 2 > width) {
-                     if (!snmp_cstrcat(buf, buf_len, out_len, allow_realloc,
-@@ -5720,8 +5711,7 @@ get_node(const char *name, oid * objid, size_t * objidlen)
-         module = (char *) malloc((size_t) (cp - name + 1));
-         if (!module)
-             return SNMPERR_GENERR;
--        memcpy(module, name, (size_t) (cp - name));
--        module[cp - name] = 0;
-+        sprintf(module, "%.*s", (int) (cp - name), name);
-         cp++;                   /* cp now point to the subidentifier */
-         if (*cp == ':')
-             cp++;
-diff --git a/snmplib/oid_stash.c b/snmplib/oid_stash.c
-index 02c53a9..8a79897 100644
---- a/snmplib/oid_stash.c
-+++ b/snmplib/oid_stash.c
-@@ -305,6 +305,8 @@ netsnmp_oid_stash_get_data(netsnmp_oid_stash_node *root,
- }
- #endif /* NETSNMP_FEATURE_REMOVE_OID_STASH_GET_DATA */
- 
-+netsnmp_feature_child_of(oid_stash_store_all, oid_stash_all)
-+#ifndef NETSNMP_FEATURE_REMOVE_OID_STASH_STORE_ALL
- /** a wrapper around netsnmp_oid_stash_store for use with a snmp_alarm.
-  * when calling snmp_alarm, you can list this as a callback.  The
-  * clientarg should be a pointer to a netsnmp_oid_stash_save_info
-@@ -316,8 +318,6 @@ netsnmp_oid_stash_get_data(netsnmp_oid_stash_node *root,
-  * @param serverarg
-  * @param clientarg A pointer to a netsnmp_oid_stash_save_info structure.
-  */
--netsnmp_feature_child_of(oid_stash_store_all, oid_stash_all)
--#ifndef NETSNMP_FEATURE_REMOVE_OID_STASH_STORE_ALL
- int
- netsnmp_oid_stash_store_all(int majorID, int minorID,
-                             void *serverarg, void *clientarg) {
-diff --git a/snmplib/openssl/openssl_cfb128.c b/snmplib/openssl/openssl_cfb128.c
-index 7e78905..5e0bc1e 100644
---- a/snmplib/openssl/openssl_cfb128.c
-+++ b/snmplib/openssl/openssl_cfb128.c
-@@ -98,7 +98,7 @@ void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out,
- 			(*block)(ivec, ivec, key);
- 			for (n=0; n<16; n+=sizeof(size_t)) {
- 				*(size_t*)(out+n) =
--				*(size_t*)(ivec+n) ^= *(size_t*)(in+n);
-+				*(size_t*)(ivec+n) ^= *(const size_t*)(in+n);
- 			}
- 			len -= 16;
- 			out += 16;
-@@ -142,8 +142,8 @@ void CRYPTO_cfb128_encrypt(const unsigned char *in, unsigned char *out,
- 		while (len>=16) {
- 			(*block)(ivec, ivec, key);
- 			for (n=0; n<16; n+=sizeof(size_t)) {
--				size_t t = *(size_t*)(in+n);
--				*(size_t*)(out+n) = *(size_t*)(ivec+n) ^ t;
-+				size_t t = *(const size_t*)(in+n);
-+				*(size_t*)(out+n) = *(const size_t*)(ivec+n) ^ t;
- 				*(size_t*)(ivec+n) = t;
- 			}
- 			len -= 16;
-diff --git a/snmplib/parse.c b/snmplib/parse.c
-index bfe5cad..1114586 100644
---- a/snmplib/parse.c
-+++ b/snmplib/parse.c
-@@ -2021,11 +2021,19 @@ parse_objectid(FILE * fp, char *name)
-                  * The name for this node is the label for this entry 
-                  */
-                 np->label = strdup(name);
-+                if (np->label == NULL) {
-+                    SNMP_FREE(np->parent);
-+                    SNMP_FREE(np);
-+                    return (NULL);
-+                }
-             } else {
-                 if (!nop->label) {
-                     nop->label = (char *) malloc(20 + ANON_LEN);
--                    if (nop->label == NULL)
-+                    if (nop->label == NULL) {
-+                        SNMP_FREE(np->parent);
-+                        SNMP_FREE(np);
-                         return (NULL);
-+                    }
-                     sprintf(nop->label, "%s%d", ANON, anonymous++);
-                 }
-                 np->label = strdup(nop->label);
-@@ -2694,29 +2702,12 @@ parse_objecttype(FILE * fp, char *name)
-                         break;
-                     else if (type == LEFTBRACKET)
-                         level++;
--                    if (type == QUOTESTRING) {
--                        if (strlen(defbuf)+2 < sizeof(defbuf)) {
--                            defbuf[ strlen(defbuf)+2 ] = 0;
--                            defbuf[ strlen(defbuf)+1 ] = '"';
--                            defbuf[ strlen(defbuf)   ] = '\\';
--                        }
--                        defbuf[ sizeof(defbuf)-1 ] = 0;
--                    }
--                    strncat(defbuf, quoted_string_buffer,
--                            sizeof(defbuf)-strlen(defbuf)-1);
--                    defbuf[ sizeof(defbuf)-1 ] = 0;
--                    if (type == QUOTESTRING) {
--                        if (strlen(defbuf)+2 < sizeof(defbuf)) {
--                            defbuf[ strlen(defbuf)+2 ] = 0;
--                            defbuf[ strlen(defbuf)+1 ] = '"';
--                            defbuf[ strlen(defbuf)   ] = '\\';
--                        }
--                        defbuf[ sizeof(defbuf)-1 ] = 0;
--                    }
--                    if (strlen(defbuf)+1 < sizeof(defbuf)) {
--                        defbuf[ strlen(defbuf)+1 ] = 0;
--                        defbuf[ strlen(defbuf)   ] = ' ';
--                    }
-+                    if (type == QUOTESTRING)
-+                        strlcat(defbuf, "\\\"", sizeof(defbuf));
-+                    strlcat(defbuf, quoted_string_buffer, sizeof(defbuf));
-+                    if (type == QUOTESTRING)
-+                        strlcat(defbuf, "\\\"", sizeof(defbuf));
-+                    strlcat(defbuf, " ", sizeof(defbuf));
-                 }
- 
-                 if (type != RIGHTBRACKET) {
-@@ -3910,6 +3901,9 @@ read_module_internal(const char *name)
-                 snmp_log_perror(mp->file);
-                 return rval;
-             }
-+#ifdef HAVE_FLOCKFILE
-+            flockfile(fp);
-+#endif
-             mp->no_imports = 0; /* Note that we've read the file */
-             File = mp->file;
-             mibLine = 1;
-@@ -3918,6 +3912,9 @@ read_module_internal(const char *name)
-              * Parse the file
-              */
-             np = parse(fp, NULL);
-+#ifdef HAVE_FUNLOCKFILE
-+            funlockfile(fp);
-+#endif
-             fclose(fp);
-             File = oldFile;
-             mibLine = oldLine;
-@@ -4400,8 +4397,7 @@ parse(FILE * fp, struct node *root)
-         case ENDOFFILE:
-             continue;
-         default:
--            strncpy(name, token, sizeof(name));
--            name[sizeof(name)-1] = '\0';
-+            strlcpy(name, token, sizeof(name));
-             type = get_token(fp, token, MAXTOKEN);
-             nnp = NULL;
-             if (type == MACRO) {
-@@ -4419,8 +4415,7 @@ parse(FILE * fp, struct node *root)
-                 print_error(name, "is a reserved word", lasttype);
-             continue;           /* see if we can parse the rest of the file */
-         }
--        strncpy(name, token, sizeof(name));
--        name[sizeof(name)-1] = '\0';
-+        strlcpy(name, token, sizeof(name));
-         type = get_token(fp, token, MAXTOKEN);
-         nnp = NULL;
- 
-@@ -4610,6 +4605,21 @@ is_labelchar(int ich)
-     return 0;
- }
- 
-+/**
-+ * Read a single character from a file. Assumes that the caller has invoked
-+ * flockfile(). Uses fgetc_unlocked() instead of getc() since the former is
-+ * implemented as an inline function in glibc. See also bug 3447196
-+ * (http://sourceforge.net/tracker/?func=detail&aid=3447196&group_id=12694&atid=112694).
-+ */
-+static int netsnmp_getc(FILE *stream)
-+{
-+#ifdef HAVE_FGETC_UNLOCKED
-+    return fgetc_unlocked(stream);
-+#else
-+    return getc(stream);
-+#endif
-+}
-+
- /*
-  * Parses a token from the file.  The type of the token parsed is returned,
-  * and the text is placed in the string pointed to by token.
-@@ -4629,7 +4639,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-      * skip all white space 
-      */
-     do {
--        ch = getc(fp);
-+        ch = netsnmp_getc(fp);
-         if (ch == '\n')
-             mibLine++;
-     }
-@@ -4643,7 +4653,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-         return parseQuoteString(fp, token, maxtlen);
-     case '\'':                 /* binary or hex constant */
-         seenSymbols = bdigits;
--        while ((ch = getc(fp)) != EOF && ch != '\'') {
-+        while ((ch = netsnmp_getc(fp)) != EOF && ch != '\'') {
-             switch (seenSymbols) {
-             case bdigits:
-                 if (ch == '0' || ch == '1')
-@@ -4662,7 +4672,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-         if (ch == '\'') {
-             unsigned long   val = 0;
-             char           *run = token + 1;
--            ch = getc(fp);
-+            ch = netsnmp_getc(fp);
-             switch (ch) {
-             case EOF:
-                 return ENDOFFILE;
-@@ -4721,25 +4731,25 @@ get_token(FILE * fp, char *token, int maxtlen)
-     case '|':
-         return BAR;
-     case '.':
--        ch_next = getc(fp);
-+        ch_next = netsnmp_getc(fp);
-         if (ch_next == '.')
-             return RANGE;
-         ungetc(ch_next, fp);
-         return LABEL;
-     case ':':
--        ch_next = getc(fp);
-+        ch_next = netsnmp_getc(fp);
-         if (ch_next != ':') {
-             ungetc(ch_next, fp);
-             return LABEL;
-         }
--        ch_next = getc(fp);
-+        ch_next = netsnmp_getc(fp);
-         if (ch_next != '=') {
-             ungetc(ch_next, fp);
-             return LABEL;
-         }
-         return EQUALS;
-     case '-':
--        ch_next = getc(fp);
-+        ch_next = netsnmp_getc(fp);
-         if (ch_next == '-') {
-             if (netsnmp_ds_get_boolean(NETSNMP_DS_LIBRARY_ID, 
- 				       NETSNMP_DS_LIB_MIB_COMMENT_TERM)) {
-@@ -4747,7 +4757,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-                  * Treat the rest of this line as a comment. 
-                  */
-                 while ((ch_next != EOF) && (ch_next != '\n'))
--                    ch_next = getc(fp);
-+                    ch_next = netsnmp_getc(fp);
-             } else {
-                 /*
-                  * Treat the rest of the line or until another '--' as a comment 
-@@ -4756,11 +4766,11 @@ get_token(FILE * fp, char *token, int maxtlen)
-                  * (this is the "technically" correct way to parse comments) 
-                  */
-                 ch = ' ';
--                ch_next = getc(fp);
-+                ch_next = netsnmp_getc(fp);
-                 while (ch_next != EOF && ch_next != '\n' &&
-                        (ch != '-' || ch_next != '-')) {
-                     ch = ch_next;
--                    ch_next = getc(fp);
-+                    ch_next = netsnmp_getc(fp);
-                 }
-             }
-             if (ch_next == EOF)
-@@ -4770,6 +4780,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-             return get_token(fp, token, maxtlen);
-         }
-         ungetc(ch_next, fp);
-+	/* fallthrough */
-     default:
-         /*
-          * Accumulate characters until end of token is found.  Then attempt to
-@@ -4780,7 +4791,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-             return LABEL;
-         hash += tolower(ch);
-       more:
--        while (is_labelchar(ch_next = getc(fp))) {
-+        while (is_labelchar(ch_next = netsnmp_getc(fp))) {
-             hash += tolower(ch_next);
-             if (cp - token < maxtlen - 1)
-                 *cp++ = ch_next;
-@@ -4799,7 +4810,7 @@ get_token(FILE * fp, char *token, int maxtlen)
-         if (tp) {
-             if (tp->token != CONTINUE)
-                 return (tp->token);
--            while (isspace((ch_next = getc(fp))))
-+            while (isspace((ch_next = netsnmp_getc(fp))))
-                 if (ch_next == '\n')
-                     mibLine++;
-             if (ch_next == EOF)
-@@ -4846,7 +4857,10 @@ add_mibfile(const char* tmpstr, const char* d_name, FILE *ip )
-                 tmpstr));
-     mibLine = 1;
-     File = tmpstr;
--    get_token(fp, token, MAXTOKEN);
-+    if (get_token(fp, token, MAXTOKEN) != LABEL) {
-+	    fclose(fp);
-+	    return 1;
-+    }
-     /*
-      * simple test for this being a MIB 
-      */
-@@ -4984,7 +4998,11 @@ read_mib(const char *filename)
-     mibLine = 1;
-     File = filename;
-     DEBUGMSGTL(("parse-mibs", "Parsing file: %s...\n", filename));
--    get_token(fp, token, MAXTOKEN);
-+    if (get_token(fp, token, MAXTOKEN) != LABEL) {
-+	    snmp_log(LOG_ERR, "Failed to parse MIB file %s\n", filename);
-+	    fclose(fp);
-+	    return NULL;
-+    }
-     fclose(fp);
-     new_module(token, filename);
-     (void) netsnmp_read_module(token);
-@@ -5055,7 +5073,7 @@ parseQuoteString(FILE * fp, char *token, int maxtlen)
-     int             too_long = 0;
-     char           *token_start = token;
- 
--    for (ch = getc(fp); ch != EOF; ch = getc(fp)) {
-+    for (ch = netsnmp_getc(fp); ch != EOF; ch = netsnmp_getc(fp)) {
-         if (ch == '\r')
-             continue;
-         if (ch == '\n') {
-diff --git a/snmplib/read_config.c b/snmplib/read_config.c
-index 5c5268b..2443230 100644
---- a/snmplib/read_config.c
-+++ b/snmplib/read_config.c
-@@ -180,8 +180,8 @@ internal_register_config_handler(const char *type_param,
-         struct config_line *ltmp2 = NULL;
-         char                buf[STRINGMAX];
-         char               *cptr = buf;
--        strncpy(buf, type, STRINGMAX - 1);
--        buf[STRINGMAX - 1] = '\0';
-+
-+        strlcpy(buf, type, STRINGMAX);
-         while (cptr) {
-             char* c = cptr;
-             cptr = strchr(cptr, ':');
-@@ -366,8 +366,8 @@ unregister_config_handler(const char *type_param, const char *token)
-     if (strchr(type, ':')) {
-         char                buf[STRINGMAX];
-         char               *cptr = buf;
--        strncpy(buf, type, STRINGMAX - 1);
--        buf[STRINGMAX - 1] = '\0';
-+
-+        strlcpy(buf, type, STRINGMAX);
-         while (cptr) {
-             char* c = cptr;
-             cptr = strchr(cptr, ':');
-@@ -582,10 +582,13 @@ snmp_config_when(char *line, int when)
-         return SNMPERR_GENERR;
-     }
- 
--    strncpy(buf, line, STRINGMAX);
--    buf[STRINGMAX - 1] = '\0';
-+    strlcpy(buf, line, STRINGMAX);
-     cptr = strtok_r(buf, SNMP_CONFIG_DELIMETERS, &st);
--    if (cptr && cptr[0] == '[') {
-+    if (!cptr) {
-+        netsnmp_config_warn("Wrong format: %s", line);
-+        return SNMPERR_GENERR;
-+    }
-+    if (cptr[0] == '[') {
-         if (cptr[strlen(cptr) - 1] != ']') {
- 	    netsnmp_config_error("no matching ']' for type %s.", cptr + 1);
-             return SNMPERR_GENERR;
-@@ -887,15 +890,15 @@ read_config(const char *filename,
-                         continue;
-                     }
-                     if ( cptr[0] == '/' ) {
--                        strncpy(fname, cptr, SNMP_MAXPATH);
--                        fname[SNMP_MAXPATH-1]='\0';
-+                        strlcpy(fname, cptr, SNMP_MAXPATH);
-                     } else {
--                        strncpy(fname, filename, SNMP_MAXPATH);
--                        fname[SNMP_MAXPATH-1]='\0';
-+                        strlcpy(fname, filename, SNMP_MAXPATH);
-                         cp = strrchr(fname, '/');
--                        *(++cp) = '\0';
--                        strncat(fname, cptr, SNMP_MAXPATH-strlen(fname));
--                        fname[SNMP_MAXPATH-1]='\0';
-+                        if (!cp)
-+                            fname[0] = '\0';
-+                        else
-+                            *(++cp) = '\0';
-+                        strlcat(fname, cptr, SNMP_MAXPATH);
-                     }
-                     prev_filename  = curfilename;
-                     prev_linecount = linecount;
-@@ -2320,210 +2323,3 @@ read_config_store_data_prefix(char prefix, int type, char *storeto,
- }
- 
- /** @} */
--
--#ifdef READ_CONFIG_UNIT_TEST
--
--#define NETSNMP_USE_ASSERT 1
--#include <net-snmp/libary/snmp_assert.h>
--
--int
--read64(U64 * i64, const char *str)
--{
--    netsnmp_assert(0);
--}
--
--int
--snmp_get_do_debugging(void)
--{
--    return 0;
--}
--
--int
--debug_is_token_registered(const char *token)
--{
--    netsnmp_assert(0);
--}
--
--void
--debugmsg(const char *token, const char *format, ...)
--{
--    netsnmp_assert(0);
--}
--
--void
--debugmsgtoken(const char *token, const char *format, ...)
--{
--    netsnmp_assert(0);
--}
--
--int
--snmp_log(int priority, const char *format, ...)
--{
--#if 0
--    va_list         ap;
--
--    va_start(ap, format);
--    vprintf(format, ap);
--    va_end(ap);
--#endif
--    return 0;
--}
--
--void
--snmp_log_perror(const char *s)
--{
--    netsnmp_assert(0);
--}
--
--int
--snmp_vlog(int priority, const char *format, va_list ap)
--{
--    netsnmp_assert(0);
--}
--
--int
--netsnmp_ds_set_boolean(int storeid, int which, int value)
--{
--    netsnmp_assert(0);
--}
--
--int
--netsnmp_ds_get_boolean(int storeid, int which)
--{
--    netsnmp_assert(0);
--}
--
--int
--netsnmp_ds_set_string(int storeid, int which, const char *value)
--{
--    netsnmp_assert(0);
--}
--
--char           *
--netsnmp_ds_get_string(int storeid, int which)
--{
--    netsnmp_assert(0);
--}
--
--char           *
--netsnmp_getenv(const char *name)
--{
--    netsnmp_assert(0);
--}
--
--int
--snmp_call_callbacks(int major, int minor, void *caller_arg)
--{
--    netsnmp_assert(0);
--}
--
--int
--mkdirhier(const char *pathname, mode_t mode, int skiplast)
--{
--    netsnmp_assert(0);
--}
--
--int
--read_objid(const char *input, oid * output, size_t * out_len)
--{
--    netsnmp_assert(0);
--}
--
--struct read_config_testcase {
--    /*
--     * inputs 
--     */
--    const char     *(*pf) (const char * readfrom, u_char ** str,
--                           size_t * len);
--    const char     *readfrom;
--    size_t          obuf_len;
--
--    /*
--     * expected outputs 
--     */
--    size_t          expected_offset;
--    const u_char   *expected_output;
--    size_t          expected_len;
--};
--
--static const u_char obuf1[] = { 1, 0, 2 };
--static const u_char obuf2[] = { 'a', 'b', 'c', 0 };
--static const u_char obuf3[] = { 1, 3, 2 };
--
--static const struct read_config_testcase test_input[] = {
--    { &read_config_read_octet_string_const, "",           1, -1, NULL,  0 },
--    { &read_config_read_octet_string_const, "0x0",        1, -1, NULL,  1 },
--    { &read_config_read_octet_string_const, "0x0 0",      1, -1, NULL,  1 },
--
--    { &read_config_read_octet_string_const, "0x010002",   1, -1, NULL,  0 },
--    { &read_config_read_octet_string_const, "0x010002",   2, -1, NULL,  0 },
--    { &read_config_read_octet_string_const, "0x010002",   3, -1, obuf1, 0 },
--    { &read_config_read_octet_string_const, "0x010002",   4, -1, obuf1, 3 },
--    { &read_config_read_octet_string_const, "0x010002 0", 4,  9, obuf1, 3 },
--    { &read_config_read_octet_string_const, "0x010002",   0, -1, obuf1, 3 },
--
--    { &read_config_read_octet_string_const, "abc",        1, -1, NULL,  0 },
--    { &read_config_read_octet_string_const, "abc z",      1,  4, NULL,  0 },
--    { &read_config_read_octet_string_const, "abc",        2, -1, NULL,  1 },
--    { &read_config_read_octet_string_const, "abc",        3, -1, obuf2, 2 },
--    { &read_config_read_octet_string_const, "abc",        4, -1, obuf2, 3 },
--    { &read_config_read_octet_string_const, "abc z",      4,  4, obuf2, 3 },
--    { &read_config_read_octet_string_const, "abc",        0, -1, obuf2, 3 },
--};
--
--int
--main(int argc, char **argv)
--{
--    int             failure_count = 0;
--    unsigned int    i, j;
--
--    printf("Start of unit test.\n");
--    for (i = 0; i < sizeof(test_input) / sizeof(test_input[0]); i++) {
--        const struct read_config_testcase *const p = &test_input[i];
--        size_t          len = p->obuf_len;
--        u_char         *str = len > 0 ? malloc(len) : NULL;
--        const char     *result;
--        size_t          offset;
--
--        printf("Test %d ...\n", i);
--        fflush(stdout);
--        result = (p->pf) (p->readfrom, &str, &len);
--        offset = result ? result - p->readfrom : -1;
--        if (offset != p->expected_offset) {
--            failure_count++;
--            printf("test %d: expected offset %zd, got offset %" NETSNMP_PRIz "d\n",
--                   i, p->expected_offset, offset);
--        } else if (len != p->expected_len) {
--            failure_count++;
--            printf("test %d: expected length %d, got length %d\n",
--                   i, p->expected_len, len);
--        } else if (len >= 0 && p->expected_output
--                   && memcmp(str, p->expected_output, len) != 0
--                   && p->expected_output[len] == 0) {
--            failure_count++;
--            printf("test %d: output buffer mismatch\n", i);
--            printf("Expected: ");
--            for (j = 0; j < p->expected_len; ++j)
--                printf("%02x ", p->expected_output[j]);
--            printf("\nActual:   ");
--            for (j = 0; j < len; ++j)
--                printf("%02x ", str[j]);
--            printf("\n");
--        }
--
--        if (str)
--            free(str);
--    }
--    if (failure_count == 0)
--        printf("All %d tests passed.\n", i);
--    return 0;
--}
--#endif                          /* READ_CONFIG_UNIT_TEST */
--
--/*
-- * Local variables:
-- * c-basic-offset: 4
-- * indent-tabs-mode: nil
-- * compile-command: "gcc -Wall -Werror -DREAD_CONFIG_UNIT_TEST=1 -O1 -I../include -g -o read_config-unit-test read_config.c && ./read_config-unit-test && valgrind --leak-check=full ./read_config-unit-test"
-- * End:
-- */
-diff --git a/snmplib/scapi.c b/snmplib/scapi.c
-index a397344..fdd33ff 100644
---- a/snmplib/scapi.c
-+++ b/snmplib/scapi.c
-@@ -116,12 +116,12 @@ netsnmp_feature_child_of(usm_scapi, usm_support)
- 
- #ifdef NETSNMP_USE_INTERNAL_CRYPTO
- static
--int SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
--              u_char * secret, size_t secretlen);
-+int SHA1_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
-+              const u_char * secret, size_t secretlen);
- 
- static
--int MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
--             u_char * secret, size_t secretlen);
-+int MD5_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
-+             const u_char * secret, size_t secretlen);
- #endif
- 
- /*
-@@ -454,7 +454,7 @@ sc_hash(const oid * hashtype, size_t hashtypelen, const u_char * buf,
- 
- #ifdef NETSNMP_USE_OPENSSL
-     const EVP_MD   *hashfn;
--    EVP_MD_CTX     ctx, *cptr;
-+    EVP_MD_CTX     *cptr;
- #endif
- #ifdef NETSNMP_USE_INTERNAL_CRYPTO
-     MD5_CTX        cmd5;
-@@ -485,42 +485,32 @@ sc_hash(const oid * hashtype, size_t hashtypelen, const u_char * buf,
-     }
- 
- /** initialize the pointer */
--    memset(&ctx, 0, sizeof(ctx));
--    cptr = &ctx;
-+#ifdef HAVE_EVP_MD_CTX_CREATE
-+    cptr = EVP_MD_CTX_create();
-+#else
-+    cptr = malloc(sizeof(*cptr));
- #if defined(OLD_DES)
--    EVP_DigestInit(cptr, hashfn);
--#else /* !OLD_DES */
--    /* this is needed if the runtime library is different than the compiled
--       library since the openssl versions are very different. */
--    if (SSLeay() < 0x907000) {
--        /* the old version of the struct was bigger and thus more
--           memory is needed. should be 152, but we use 256 for safety. */
--        cptr = (EVP_MD_CTX *)malloc(256);
--        EVP_DigestInit(cptr, hashfn);
--    } else {
--        EVP_MD_CTX_init(cptr);
--        EVP_DigestInit(cptr, hashfn);
--    }
-+    memset(cptr, 0, sizeof(*cptr));
-+#else
-+    EVP_MD_CTX_init(cptr);
-+#endif
- #endif
-+    EVP_DigestInit(cptr, hashfn);
- 
- /** pass the data */
-     EVP_DigestUpdate(cptr, buf, buf_len);
- 
- /** do the final pass */
--#if defined(OLD_DES)
-     EVP_DigestFinal(cptr, MAC, &tmp_len);
-     *MAC_len = tmp_len;
--#else /* !OLD_DES */
--    if (SSLeay() < 0x907000) {
--        EVP_DigestFinal(cptr, MAC, &tmp_len);
--        *MAC_len = tmp_len;
--        free(cptr);
--    } else {
--        EVP_DigestFinal_ex(cptr, MAC, &tmp_len);
--        *MAC_len = tmp_len;
--        EVP_MD_CTX_cleanup(cptr);
--    }
--#endif                          /* OLD_DES */
-+#ifdef HAVE_EVP_MD_CTX_DESTROY
-+    EVP_MD_CTX_destroy(cptr);
-+#else
-+#if !defined(OLD_DES)
-+    EVP_MD_CTX_cleanup(cptr);
-+#endif
-+    free(cptr);
-+#endif
-     return (rval);
- 
- #elif NETSNMP_USE_INTERNAL_CRYPTO
-@@ -1171,8 +1161,8 @@ sc_decrypt(const oid * privtype, size_t privtypelen,
-  * of data, and prepended with a secret in the standard fashion 
-  */
- static int
--MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
--         u_char * secret, size_t secretlen)
-+MD5_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
-+         const u_char * secret, size_t secretlen)
- {
- #define MD5_HASHKEYLEN 64
- #define MD5_SECRETKEYLEN 16
-@@ -1183,7 +1173,8 @@ MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
-     u_char          extendedAuthKey[MD5_HASHKEYLEN];
-     u_char          buf[MD5_HASHKEYLEN];
-     size_t          i;
--    u_char         *cp, *newdata = NULL;
-+    const u_char   *cp;
-+    u_char         *newdata = NULL;
-     int             rc = 0;
- 
-     /*
-@@ -1268,8 +1259,8 @@ MD5_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
- }
- 
- static int
--SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
--         u_char * secret, size_t secretlen)
-+SHA1_hmac(const u_char * data, size_t len, u_char * mac, size_t maclen,
-+          const u_char * secret, size_t secretlen)
- {
- #define SHA1_HASHKEYLEN   64
- #define SHA1_SECRETKEYLEN 20
-@@ -1280,7 +1271,8 @@ SHA1_hmac(u_char * data, size_t len, u_char * mac, size_t maclen,
-     u_char          extendedAuthKey[SHA1_HASHKEYLEN];
-     u_char          buf[SHA1_HASHKEYLEN];
-     size_t          i;
--    u_char         *cp, *newdata = NULL;
-+    const u_char   *cp;
-+    u_char         *newdata = NULL;
-     int             rc = 0;
- 
-     /*
-diff --git a/snmplib/snmp-tc.c b/snmplib/snmp-tc.c
-index 3b73da2..891c3a0 100644
---- a/snmplib/snmp-tc.c
-+++ b/snmplib/snmp-tc.c
-@@ -163,7 +163,7 @@ date_n_time(const time_t * when, size_t * length)
-     string[7] = 0;
-     *length = 8;
- 
--#ifndef cygwin
-+#if defined(HAVE_STRUCT_TM_TM_GMTOFF) || defined(HAVE_TIMEZONE_VARIABLE)
-     /*
-      * Timezone offset
-      */
-diff --git a/snmplib/snmp_alarm.c b/snmplib/snmp_alarm.c
-index adfa93d..dc498cc 100644
---- a/snmplib/snmp_alarm.c
-+++ b/snmplib/snmp_alarm.c
-@@ -82,23 +82,22 @@ init_snmp_alarm(void)
- void
- sa_update_entry(struct snmp_alarm *a)
- {
--    if (a->t_last.tv_sec == 0 && a->t_last.tv_usec == 0) {
-+    if (!timerisset(&a->t_last)) {
-         struct timeval  t_now;
-         /*
-          * Never been called yet, call time `t' from now.  
-          */
-         gettimeofday(&t_now, NULL);
- 
--        a->t_last.tv_sec = t_now.tv_sec;
--        a->t_last.tv_usec = t_now.tv_usec;
-+        a->t_last = t_now;
- 
-         NETSNMP_TIMERADD(&t_now, &a->t, &a->t_next);
--    } else if (a->t_next.tv_sec == 0 && a->t_next.tv_usec == 0) {
-+    } else if (!timerisset(&a->t_next)) {
-         /*
-          * We've been called but not reset for the next call.  
-          */
-         if (a->flags & SA_REPEAT) {
--            if (a->t.tv_sec == 0 && a->t.tv_usec == 0) {
-+            if (!timerisset(&a->t)) {
-                 DEBUGMSGTL(("snmp_alarm",
-                             "update_entry: illegal interval specified\n"));
-                 snmp_alarm_unregister(a->clientreg);
-@@ -144,7 +143,7 @@ snmp_alarm_unregister(unsigned int clientreg)
-         DEBUGMSGTL(("snmp_alarm", "unregistered alarm %d\n", 
- 		    sa_ptr->clientreg));
-         /*
--         * Note:  do not free the clientarg, its the clients responsibility 
-+         * Note: do not free the clientarg, it's the client's responsibility 
-          */
-         free(sa_ptr);
-     } else {
-@@ -185,22 +184,13 @@ sa_find_next(void)
-     for (a = thealarms; a != NULL; a = a->next) {
-         if (!(a->flags & SA_FIRED)) {
-             /* check for time delta skew */
--            if ((a->t_next.tv_sec - t_now.tv_sec) > a->t.tv_sec)
--            {
-+            if ((a->t_next.tv_sec - t_now.tv_sec) > a->t.tv_sec) {
-                 DEBUGMSGTL(("time_skew", "Time delta too big (%ld seconds), should be %ld seconds - fixing\n",
- 		    (long)(a->t_next.tv_sec - t_now.tv_sec), (long)a->t.tv_sec));
--                a->t_next.tv_sec = t_now.tv_sec + a->t.tv_sec;
--                a->t_next.tv_usec = t_now.tv_usec + a->t.tv_usec;
--           }
--            if (lowest == NULL) {
--               lowest = a;
--            } else if (a->t_next.tv_sec == lowest->t_next.tv_sec) {
--                if (a->t_next.tv_usec < lowest->t_next.tv_usec) {
--                    lowest = a;
--                }
--            } else if (a->t_next.tv_sec < lowest->t_next.tv_sec) {
--               lowest = a;
--           }
-+                NETSNMP_TIMERADD(&t_now, &a->t, &a->t_next);
-+            }
-+            if (lowest == NULL || timercmp(&a->t_next, &lowest->t_next, <))
-+                lowest = a;
-        }
-     }
-     return lowest;
-@@ -247,10 +237,8 @@ run_alarms(void)
-             DEBUGMSGTL(("snmp_alarm", "alarm %d completed\n", clientreg));
- 
-             if ((a = sa_find_specific(clientreg)) != NULL) {
--                a->t_last.tv_sec = t_now.tv_sec;
--                a->t_last.tv_usec = t_now.tv_usec;
--                a->t_next.tv_sec = 0;
--                a->t_next.tv_usec = 0;
-+                a->t_last = t_now;
-+                timerclear(&a->t_next);
-                 a->flags &= ~SA_FIRED;
-                 sa_update_entry(a);
-             } else {
-@@ -274,39 +262,56 @@ alarm_handler(int a)
- 
- 
- 
-+/**
-+ * Look up the time at which the next alarm will fire.
-+ *
-+ * @param[out] alarm_tm Time at which the next alarm will fire.
-+ * @param[in] now Earliest time that should be written into *alarm_tm.
-+ *
-+ * @return Zero if no alarms are scheduled; non-zero 'clientreg' value
-+ *   identifying the first alarm that will fire if one or more alarms are
-+ *   scheduled.
-+ */
- int
--get_next_alarm_delay_time(struct timeval *delta)
-+netsnmp_get_next_alarm_time(struct timeval *alarm_tm, const struct timeval *now)
- {
-     struct snmp_alarm *sa_ptr;
--    struct timeval  t_now;
- 
-     sa_ptr = sa_find_next();
- 
-     if (sa_ptr) {
--        gettimeofday(&t_now, NULL);
--
--        if (timercmp(&t_now, &sa_ptr->t_next, >)) {
--            /*
--             * Time has already passed.  Return the smallest possible amount of
--             * time.  
--             */
--            delta->tv_sec = 0;
--            delta->tv_usec = 1;
--            return sa_ptr->clientreg;
--        } else {
--            /*
--             * Time is still in the future.  
--             */
--            NETSNMP_TIMERSUB(&sa_ptr->t_next, &t_now, delta);
--
--            return sa_ptr->clientreg;
--        }
-+        netsnmp_assert(alarm_tm);
-+        netsnmp_assert(timerisset(&sa_ptr->t_next));
-+        if (timercmp(&sa_ptr->t_next, now, >))
-+            *alarm_tm = sa_ptr->t_next;
-+        else
-+            *alarm_tm = *now;
-+        return sa_ptr->clientreg;
-+    } else {
-+        return 0;
-     }
-+}
- 
--    /*
--     * Nothing Left.  
--     */
--    return 0;
-+/**
-+ * Get the time until the next alarm will fire.
-+ *
-+ * @param[out] delta Time until the next alarm.
-+ *
-+ * @return Zero if no alarms are scheduled; non-zero 'clientreg' value
-+ *   identifying the first alarm that will fire if one or more alarms are
-+ *   scheduled.
-+ */
-+int
-+get_next_alarm_delay_time(struct timeval *delta)
-+{
-+    struct timeval t_now, alarm_tm;
-+    int res;
-+
-+    gettimeofday(&t_now, NULL);
-+    res = netsnmp_get_next_alarm_time(&alarm_tm, &t_now);
-+    if (res)
-+        NETSNMP_TIMERSUB(&alarm_tm, &t_now, delta);
-+    return res;
- }
- 
- 
-@@ -328,10 +333,8 @@ set_an_alarm(void)
- # ifdef HAVE_SETITIMER
-         struct itimerval it;
- 
--        it.it_value.tv_sec = delta.tv_sec;
--        it.it_value.tv_usec = delta.tv_usec;
--        it.it_interval.tv_sec = 0;
--        it.it_interval.tv_usec = 0;
-+        it.it_value = delta;
-+        timerclear(&it.it_interval);
- 
-         signal(SIGALRM, alarm_handler);
-         setitimer(ITIMER_REAL, &it, NULL);
-@@ -452,8 +455,7 @@ snmp_alarm_register_hr(struct timeval t, unsigned int flags,
-         return 0;
-     }
- 
--    (*s)->t.tv_sec = t.tv_sec;
--    (*s)->t.tv_usec = t.tv_usec;
-+    (*s)->t = t;
-     (*s)->flags = flags;
-     (*s)->clientarg = cd;
-     (*s)->thecallback = cb;
-diff --git a/snmplib/snmp_api.c b/snmplib/snmp_api.c
-index df0dc1c..4fca5bf 100644
---- a/snmplib/snmp_api.c
-+++ b/snmplib/snmp_api.c
-@@ -506,8 +506,7 @@ void
- snmp_set_detail(const char *detail_string)
- {
-     if (detail_string != NULL) {
--        strncpy((char *) snmp_detail, detail_string, sizeof(snmp_detail));
--        snmp_detail[sizeof(snmp_detail) - 1] = '\0';
-+        strlcpy((char *) snmp_detail, detail_string, sizeof(snmp_detail));
-         snmp_detail_f = 1;
-     }
- }
-@@ -523,20 +522,22 @@ snmp_api_errstring(int snmp_errnumber)
- {
-     const char     *msg = "";
-     static char     msg_buf[SPRINT_MAX_LEN];
-+
-     if (snmp_errnumber >= SNMPERR_MAX && snmp_errnumber <= SNMPERR_GENERR) {
-         msg = api_errors[-snmp_errnumber];
-     } else if (snmp_errnumber != SNMPERR_SUCCESS) {
-         msg = NULL;
-     }
--    if (!msg)
-+    if (!msg) {
- 	snprintf(msg_buf, sizeof(msg_buf), "Unknown error: %d", snmp_errnumber);
--    else if (snmp_detail_f) {
-+        msg_buf[sizeof(msg_buf)-1] = '\0';
-+    } else if (snmp_detail_f) {
-         snprintf(msg_buf, sizeof(msg_buf), "%s (%s)", msg, snmp_detail);
-+        msg_buf[sizeof(msg_buf)-1] = '\0';
-         snmp_detail_f = 0;
-     } else {
--        strncpy(msg_buf, msg, sizeof(msg_buf));
-+        strlcpy(msg_buf, msg, sizeof(msg_buf));
-     }
--    msg_buf[sizeof(msg_buf)-1] = '\0';
- 
-     return (msg_buf);
- }
-@@ -566,15 +567,17 @@ snmp_error(netsnmp_session * psess,
- 	if (snmp_detail_f) {
-             snprintf(buf, sizeof(buf), "%s (%s)", api_errors[-snmp_errnumber],
- 		    snmp_detail);
-+            buf[sizeof(buf)-1] = '\0';
- 	    snmp_detail_f = 0;
- 	}
- 	else
--	    strncpy(buf, api_errors[-snmp_errnumber], sizeof(buf));
-+	    strlcpy(buf, api_errors[-snmp_errnumber], sizeof(buf));
-     } else {
--        if (snmp_errnumber)
-+        if (snmp_errnumber) {
-             snprintf(buf, sizeof(buf), "Unknown Error %d", snmp_errnumber);
-+            buf[sizeof(buf)-1] = '\0';
-+        }
-     }
--    buf[sizeof(buf)-1] = '\0';
- 
-     /*
-      * append a useful system errno interpretation. 
-@@ -704,6 +707,8 @@ _init_snmp(void)
- 
-     netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, 
-                        NETSNMP_DS_LIB_HEX_OUTPUT_LENGTH, 16);
-+    netsnmp_ds_set_int(NETSNMP_DS_LIBRARY_ID, NETSNMP_DS_LIB_RETRIES,
-+                       DEFAULT_RETRIES);
- 
- #ifdef NETSNMP_USE_REVERSE_ASNENCODING
-     netsnmp_ds_set_boolean(NETSNMP_DS_LIBRARY_ID, 
-@@ -1280,6 +1285,7 @@ snmpv3_probe_contextEngineID_rfc5343(void *slp, netsnmp_session *session) {
-     if (memdup(&pdu->contextEngineID, probeEngineID, probeEngineID_len) !=
-         SNMPERR_SUCCESS) {
-         snmp_log(LOG_ERR, "failed to clone memory for rfc5343 probe\n");
-+        snmp_free_pdu(pdu);
-         return SNMP_ERR_GENERR;
-     }
-     pdu->contextEngineIDLen = probeEngineID_len;
-@@ -1390,7 +1396,7 @@ snmpv3_engineID_probe(struct session_list *slp,
-     }
- 
-     /* see if there was any hooks to call after the engineID probing */
--    if (sptr->post_probe_engineid) {
-+    if (sptr && sptr->post_probe_engineid) {
-         status = (*sptr->post_probe_engineid)(slp, in_session);
-         if (status != SNMPERR_SUCCESS)
-             return 0;
-@@ -5341,8 +5347,8 @@ _sess_process_packet(void *sessp, netsnmp_session * sp,
- 	    if (sp->securityEngineID == NULL) {
- 	      /*
- 	       * TODO FIX: recover after message callback *?
--	       * return -1;
--	       */
-+               */
-+	      return -1;
- 	    }
- 	    memcpy(sp->securityEngineID, pdu->securityEngineID,
- 		   pdu->securityEngineIDLen);
-@@ -5354,8 +5360,8 @@ _sess_process_packet(void *sessp, netsnmp_session * sp,
- 	      if (sp->contextEngineID == NULL) {
- 		/*
- 		 * TODO FIX: recover after message callback *?
--		 * return -1;
- 		 */
-+                return -1;
- 	      }
- 	      memcpy(sp->contextEngineID,
- 		     pdu->securityEngineID,
-@@ -5868,7 +5874,7 @@ snmp_sess_read2(void *sessp, netsnmp_large_fd_set * fdset)
- }
- 
- 
--/*
-+/**
-  * Returns info about what snmp requires from a select statement.
-  * numfds is the number of fds in the list that are significant.
-  * All file descriptors opened for SNMP are OR'd into the fdset.
-@@ -5889,54 +5895,43 @@ snmp_sess_read2(void *sessp, netsnmp_large_fd_set * fdset)
-  *
-  * snmp_select_info returns the number of open sockets.  (i.e. The number of
-  * sessions open)
-+ *
-+ * @see See also snmp_sess_select_info2_flags().
-  */
--
- int
--snmp_select_info(int *numfds,
--                 fd_set * fdset, struct timeval *timeout, int *block)
--    /*
--     * input:  set to 1 if input timeout value is undefined  
--     * set to 0 if input timeout value is defined    
--     * output: set to 1 if output timeout value is undefined 
--     * set to 0 if output rimeout vlaue id defined   
--     */
-+snmp_select_info(int *numfds, fd_set *fdset, struct timeval *timeout,
-+                 int *block)
- {
--    return snmp_sess_select_info((void *) 0, numfds, fdset, timeout,
--                                 block);
-+    return snmp_sess_select_info(NULL, numfds, fdset, timeout, block);
- }
- 
-+/**
-+ * @see See also snmp_sess_select_info2_flags().
-+ */
- int
--snmp_select_info2(int *numfds,
--                  netsnmp_large_fd_set * fdset,
-+snmp_select_info2(int *numfds, netsnmp_large_fd_set *fdset,
- 		  struct timeval *timeout, int *block)
--    /*
--     * input:  set to 1 if input timeout value is undefined  
--     * set to 0 if input timeout value is defined    
--     * output: set to 1 if output timeout value is undefined 
--     * set to 0 if output rimeout vlaue id defined   
--     */
- {
--    return snmp_sess_select_info2((void *) 0, numfds, fdset, timeout,
--                                  block);
-+    return snmp_sess_select_info2(NULL, numfds, fdset