diff -ur net-snmp-5.4.1.org/agent/helpers/table_tdata.c net-snmp-5.4.1.container/agent/helpers/table_tdata.c
--- net-snmp-5.4.1.org/agent/helpers/table_tdata.c 2012-04-02 01:31:08.387259100 -0700
+++ net-snmp-5.4.1.container/agent/helpers/table_tdata.c 2012-04-02 01:58:23.019636200 -0700
@@ -57,9 +57,18 @@
if ( !table )
return NULL;
+ table->flags = flags;
if (name)
table->name = strdup(name);
- table->container = netsnmp_container_find( "table_container" );
+
+ if (!(table->flags & TDATA_FLAG_NO_CONTAINER)) {
+ table->container = netsnmp_container_find( name );
+ if (!table->container)
+ table->container = netsnmp_container_find( "table_container" );
+ if (table->container)
+ table->container->container_name = strdup(name);
+ }
+
return table;
}
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-forward-mib/data_access/route_common.c net-snmp-5.4.1.container/agent/mibgroup/ip-forward-mib/data_access/route_common.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-forward-mib/data_access/route_common.c 2012-04-02 01:31:08.334343300 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-forward-mib/data_access/route_common.c 2012-04-02 02:00:46.671129800 -0700
@@ -47,8 +47,11 @@
DEBUGMSGTL(("access:route:container", "load\n"));
- if (NULL == container)
+ if (NULL == container) {
container = netsnmp_container_find("access:_route:table_container");
+ if (container)
+ container->container_name = strdup("_route");
+ }
if (NULL == container) {
snmp_log(LOG_ERR, "no container specified/found for access_route\n");
return NULL;
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_interface.c 2012-04-02 01:31:08.341048100 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-forward-mib/inetCidrRouteTable/inetCidrRouteTable_interface.c 2012-04-02 02:05:22.940847300 -0700
@@ -2307,9 +2307,12 @@
if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
inetCidrRouteTable_container_init(&if_ctx->container, if_ctx->cache);
- if (NULL == if_ctx->container)
+ if (NULL == if_ctx->container) {
if_ctx->container =
netsnmp_container_find("inetCidrRouteTable:table_container");
+ if (NULL != if_ctx->container)
+ if_ctx->container->container_name = strdup("inetCidrRouteTable");
+ }
if (NULL == if_ctx->container) {
snmp_log(LOG_ERR, "error creating container in "
"inetCidrRouteTable_container_init\n");
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable_interface.c 2012-04-02 01:31:08.337647600 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-forward-mib/ipCidrRouteTable/ipCidrRouteTable_interface.c 2012-04-02 02:08:16.825508200 -0700
@@ -2259,9 +2259,12 @@
if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
ipCidrRouteTable_container_init(&if_ctx->container, if_ctx->cache);
- if (NULL == if_ctx->container)
+ if (NULL == if_ctx->container) {
if_ctx->container =
netsnmp_container_find("ipCidrRouteTable:table_container");
+ if (NULL != if_ctx->container)
+ if_ctx->container->container_name = strdup("ipCidrRouteTable");
+ }
if (NULL == if_ctx->container) {
snmp_log(LOG_ERR, "error creating container in "
"ipCidrRouteTable_container_init\n");
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-mib/data_access/arp_common.c net-snmp-5.4.1.container/agent/mibgroup/ip-mib/data_access/arp_common.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-mib/data_access/arp_common.c 2012-04-02 01:31:08.353034100 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-mib/data_access/arp_common.c 2012-04-02 02:10:39.120984300 -0700
@@ -62,8 +62,11 @@
DEBUGMSGTL(("access:arp:container", "load\n"));
- if (NULL == container)
+ if (NULL == container) {
container = netsnmp_container_find("access:arp:table_container");
+ if (container)
+ container->container_name = strdup("arp");
+ }
if (NULL == container) {
snmp_log(LOG_ERR, "no container specified/found for access_arp\n");
return NULL;
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-mib/data_access/systemstats_common.c net-snmp-5.4.1.container/agent/mibgroup/ip-mib/data_access/systemstats_common.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-mib/data_access/systemstats_common.c 2012-04-02 01:31:08.353793700 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-mib/data_access/systemstats_common.c 2012-04-02 02:12:30.680237000 -0700
@@ -96,8 +96,11 @@
DEBUGMSGTL(("access:systemstats:container", "load\n"));
- if (NULL == container)
+ if (NULL == container) {
container = netsnmp_access_systemstats_container_init(load_flags);
+ if (NULL != container)
+ container->container_name = strdup("systemstats_autocreate");
+ }
if (NULL == container) {
snmp_log(LOG_ERR, "no container specified/found for access_systemstats\n");
return NULL;
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-mib/inetNetToMediaTable/inetNetToMediaTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/ip-mib/inetNetToMediaTable/inetNetToMediaTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-mib/inetNetToMediaTable/inetNetToMediaTable_interface.c 2012-04-02 01:31:08.349583400 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-mib/inetNetToMediaTable/inetNetToMediaTable_interface.c 2012-04-02 02:13:41.237688000 -0700
@@ -1935,9 +1935,12 @@
if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
inetNetToMediaTable_container_init(&if_ctx->container, if_ctx->cache);
- if (NULL == if_ctx->container)
+ if (NULL == if_ctx->container) {
if_ctx->container =
netsnmp_container_find("inetNetToMediaTable:table_container");
+ if (if_ctx->container)
+ if_ctx->container->container_name = strdup("inetNetToMediaTable");
+ }
if (NULL == if_ctx->container) {
snmp_log(LOG_ERR, "error creating container in "
"inetNetToMediaTable_container_init\n");
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_interface.c 2012-04-02 01:31:08.365565600 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-mib/ipv4InterfaceTable/ipv4InterfaceTable_interface.c 2012-04-02 03:44:15.669526200 -0700
@@ -1251,15 +1251,18 @@
* container init
*/
ipv4InterfaceTable_container_init(&if_ctx->container);
- if (NULL == if_ctx->container)
+ if (NULL == if_ctx->container)
if_ctx->container =
netsnmp_container_find("ipv4InterfaceTable:table_container");
+
if (NULL == if_ctx->container) {
snmp_log(LOG_ERR, "error creating container in "
"ipv4InterfaceTable_container_init\n");
return;
}
+ if_ctx->container->container_name = strdup("ipv4InterfaceTable");
+
} /* _ipv4InterfaceTable_container_init */
/**
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_interface.c 2012-04-02 01:31:08.363180800 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-mib/ipv6InterfaceTable/ipv6InterfaceTable_interface.c 2012-04-02 03:45:04.295800900 -0700
@@ -1341,6 +1341,7 @@
"ipv6InterfaceTable_container_init\n");
return;
}
+ if_ctx->container->container_name = strdup("ipv6InterfaceTable");
} /* _ipv6InterfaceTable_container_init */
diff -ur net-snmp-5.4.1.org/agent/mibgroup/tcp-mib/tcpConnectionTable/tcpConnectionTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/tcp-mib/tcpConnectionTable/tcpConnectionTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/tcp-mib/tcpConnectionTable/tcpConnectionTable_interface.c 2012-04-02 01:31:08.199286300 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/tcp-mib/tcpConnectionTable/tcpConnectionTable_interface.c 2012-04-02 03:47:50.113861500 -0700
@@ -1731,9 +1731,12 @@
if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
tcpConnectionTable_container_init(&if_ctx->container, if_ctx->cache);
- if (NULL == if_ctx->container)
+ if (NULL == if_ctx->container) {
if_ctx->container =
netsnmp_container_find("tcpConnectionTable:table_container");
+ if (if_ctx->container)
+ if_ctx->container->container_name = strdup("tcpConnectionTable");
+ }
if (NULL == if_ctx->container) {
snmp_log(LOG_ERR, "error creating container in "
"tcpConnectionTable_container_init\n");
diff -ur net-snmp-5.4.1.org/agent/mibgroup/tcp-mib/tcpListenerTable/tcpListenerTable_interface.c net-snmp-5.4.1.container/agent/mibgroup/tcp-mib/tcpListenerTable/tcpListenerTable_interface.c
--- net-snmp-5.4.1.org/agent/mibgroup/tcp-mib/tcpListenerTable/tcpListenerTable_interface.c 2012-04-02 01:31:08.201001900 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/tcp-mib/tcpListenerTable/tcpListenerTable_interface.c 2012-04-02 03:48:52.542497400 -0700
@@ -922,9 +922,12 @@
if_ctx->cache->flags = NETSNMP_CACHE_DONT_INVALIDATE_ON_SET;
tcpListenerTable_container_init(&if_ctx->container, if_ctx->cache);
- if (NULL == if_ctx->container)
+ if (NULL == if_ctx->container) {
if_ctx->container =
netsnmp_container_find("tcpListenerTable:table_container");
+ if (if_ctx->container)
+ if_ctx->container->container_name = strdup("tcpListenerTable");
+ }
if (NULL == if_ctx->container) {
snmp_log(LOG_ERR, "error creating container in "
"tcpListenerTable_container_init\n");
diff -ur net-snmp-5.4.1.org/include/net-snmp/agent/table_tdata.h net-snmp-5.4.1.container/include/net-snmp/agent/table_tdata.h
--- net-snmp-5.4.1.org/include/net-snmp/agent/table_tdata.h 2012-04-02 01:31:08.444022500 -0700
+++ net-snmp-5.4.1.container/include/net-snmp/agent/table_tdata.h 2012-04-02 23:50:13.830827600 -0700
@@ -21,6 +21,7 @@
#define TABLE_TDATA_TABLE "table_tdata_table"
#define TDATA_FLAG_NO_STORE_INDEXES 0x01
+#define TDATA_FLAG_NO_CONTAINER 0x02 /* user will provide container */
/*
* The (table-independent) per-row data structure
diff -ur net-snmp-5.4.1.org/include/net-snmp/library/container.h net-snmp-5.4.1.container/include/net-snmp/library/container.h
--- net-snmp-5.4.1.orig/include/net-snmp/library/container.h 2012-09-13 03:44:03.378177029 -0700
+++ net-snmp-5.4.1.container/include/net-snmp/library/container.h 2012-09-05 12:05:44.822831595 -0700
@@ -373,31 +373,42 @@
*/
int CONTAINER_FREE(netsnmp_container *x);
#else
- /*------------------------------------------------------------------
- * These functions should EXACTLY match the function version in
- * container.c. If you change one, change them both.
- */
- NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */
- int CONTAINER_INSERT(netsnmp_container *x, const void *k)
- {
- int rc2, rc = 0;
-
- /** start at first container */
- while(x->prev)
- x = x->prev;
- for(; x; x = x->next) {
- if ((NULL != x->insert_filter) &&
- (x->insert_filter(x,k) == 1))
- continue;
- rc2 = x->insert(x,k);
- if (rc2) {
- snmp_log(LOG_DEBUG,"error on subcontainer '%s' insert (%d)\n",
- x->container_name ? x->container_name : "", rc2);
- rc = rc2;
- }
- }
- return rc;
- }
+ /*------------------------------------------------------------------
+ * These functions should EXACTLY match the function version in
+ * container.c. If you change one, change them both.
+ */
+ NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */
+ int CONTAINER_INSERT_HELPER(netsnmp_container* x, const void* k)
+ {
+ while(x && x->insert_filter && x->insert_filter(x,k) == 1)
+ x = x->next;
+ if(x) {
+ int rc = x->insert(x,k);
+ if(rc)
+ snmp_log(LOG_ERR,"error on subcontainer '%s' insert (%d)\n",
+ x->container_name ? x->container_name : "", rc);
+ else {
+ rc = CONTAINER_INSERT_HELPER(x->next, k);
+ if(rc)
+ x->remove(x,k);
+ }
+ return rc;
+ }
+ return 0;
+ }
+
+ /*------------------------------------------------------------------
+ * These functions should EXACTLY match the function version in
+ * container.c. If you change one, change them both.
+ */
+ NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */
+ int CONTAINER_INSERT(netsnmp_container* x, const void* k)
+ {
+ /** start at first container */
+ while(x->prev)
+ x = x->prev;
+ return CONTAINER_INSERT_HELPER(x, k);
+ }
/*------------------------------------------------------------------
* These functions should EXACTLY match the function version in
diff -ur net-snmp-5.4.1.org/snmplib/container.c net-snmp-5.4.1.container/snmplib/container.c
--- net-snmp-5.4.1/snmplib/container.c 2012-09-13 03:44:03.380247622 -0700
+++ net-snmp-5.4.1.container/snmplib/container.c 2012-09-13 03:33:19.759881202 -0700
@@ -49,7 +49,8 @@
*/
containers = netsnmp_container_get_binary_array();
containers->compare = netsnmp_compare_cstring;
-
+ containers->container_name = strdup("container list");
+
/*
* register containers
*/
@@ -265,25 +266,34 @@
* These functions should EXACTLY match the inline version in
* container.h. If you change one, change them both.
*/
-int CONTAINER_INSERT(netsnmp_container *x, const void *k)
-{
- int rc2, rc = 0;
-
- /** start at first container */
+int CONTAINER_INSERT_HELPER(netsnmp_container* x, const void* k)
+{
+ while(x && x->insert_filter && x->insert_filter(x,k) == 1)
+ x = x->next;
+ if(x) {
+ int rc = x->insert(x,k);
+ if(rc)
+ snmp_log(LOG_DEBUG,"error on subcontainer '%s' insert (%d)\n",
+ x->container_name ? x->container_name : "", rc);
+ else {
+ rc = CONTAINER_INSERT_HELPER(x->next, k);
+ if(rc)
+ x->remove(x,k);
+ }
+ return rc;
+ }
+ return 0;
+ }
+
+/*------------------------------------------------------------------
+ * These functions should EXACTLY match the inline version in
+ * container.h. If you change one, change them both.
+ */
+int CONTAINER_INSERT(netsnmp_container* x, const void* k)
+{
while(x->prev)
- x = x->prev;
- for(; x; x = x->next) {
- if ((NULL != x->insert_filter) &&
- (x->insert_filter(x,k) == 1))
- continue;
- rc2 = x->insert(x,k);
- if (rc2) {
- snmp_log(LOG_DEBUG,"error on subcontainer '%s' insert (%d)\n",
- x->container_name ? x->container_name : "", rc2);
- rc = rc2;
- }
- }
- return rc;
+ x = x->prev;
+ return CONTAINER_INSERT_HELPER(x, k);
}
/*------------------------------------------------------------------
diff -ur net-snmp-5.4.1.org/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c net-snmp-5.4.1.container/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c
--- net-snmp-5.4.1.orig/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c 2007-05-17 14:53:28.000000000 -0700
+++ net-snmp-5.4.1.container/agent/mibgroup/ip-mib/ipAddressTable/ipAddressTable_data_access.c 2012-09-13 03:45:25.253102053 -0700
@@ -134,6 +134,7 @@
*container_ptr_ptr =
netsnmp_container_find("ipAddressTable:table_container");
if (NULL != *container_ptr_ptr) {
+ (*container_ptr_ptr)->container_name = strdup("ipAddressTable");
ipAddressTable_container_load(*container_ptr_ptr);
CONTAINER_FOR_EACH(*container_ptr_ptr,
(netsnmp_container_obj_func *) _clear_times,
@@ -344,56 +345,58 @@
* what we've already got, and make any adjustments, saving
* missing addresses to be deleted.
*/
- tmp_ptr[0] = ipaddress_container->next;
- tmp_ptr[1] = NULL;
- CONTAINER_FOR_EACH(container, (netsnmp_container_obj_func *)
- _check_entry_for_updates, tmp_ptr);
-
- /*
- * now add any new interfaces
- */
- CONTAINER_FOR_EACH(ipaddress_container,
- (netsnmp_container_obj_func *) _add_new_entry,
- container);
-
- /*
- * free the container. we've either claimed each entry, or released it,
- * so the access function doesn't need to clear the container.
- */
- netsnmp_access_ipaddress_container_free(ipaddress_container,
- NETSNMP_ACCESS_IPADDRESS_FREE_DONT_CLEAR);
-
- /*
- * remove deleted addresses from table container
- */
- if (NULL != tmp_ptr[1]) {
- netsnmp_container *tmp_container =
- (netsnmp_container *) tmp_ptr[1];
- ipAddressTable_rowreq_ctx *tmp_ctx;
-
- /*
- * this works because the tmp_container is a linked list,
- * which can be used like a stack...
- */
- while (CONTAINER_SIZE(tmp_container)) {
- /*
- * get from delete list
- */
- tmp_ctx = CONTAINER_FIRST(tmp_container);
-
- /*
- * release context, delete from table container
- */
- CONTAINER_REMOVE(container, tmp_ctx);
- ipAddressTable_release_rowreq_ctx(tmp_ctx);
-
- /*
- * pop off delete list
- */
- CONTAINER_REMOVE(tmp_container, NULL);
- }
+ if(ipaddress_container != NULL)
+ {
+ tmp_ptr[0] = ipaddress_container->next;
+ tmp_ptr[1] = NULL;
+ CONTAINER_FOR_EACH(container, (netsnmp_container_obj_func *)
+ _check_entry_for_updates, tmp_ptr);
+
+ /*
+ * now add any new interfaces
+ */
+ CONTAINER_FOR_EACH(ipaddress_container,
+ (netsnmp_container_obj_func *) _add_new_entry,
+ container);
+
+ /*
+ * free the container. we've either claimed each entry, or released it,
+ * so the access function doesn't need to clear the container.
+ */
+ netsnmp_access_ipaddress_container_free(ipaddress_container,
+ NETSNMP_ACCESS_IPADDRESS_FREE_DONT_CLEAR);
+
+ /*
+ * remove deleted addresses from table container
+ */
+ if (NULL != tmp_ptr[1]) {
+ netsnmp_container *tmp_container =
+ (netsnmp_container *) tmp_ptr[1];
+ ipAddressTable_rowreq_ctx *tmp_ctx;
+
+ /*
+ * this works because the tmp_container is a linked list,
+ * which can be used like a stack...
+ */
+ while (CONTAINER_SIZE(tmp_container)) {
+ /*
+ * get from delete list
+ */
+ tmp_ctx = CONTAINER_FIRST(tmp_container);
+
+ /*
+ * release context, delete from table container
+ */
+ CONTAINER_REMOVE(container, tmp_ctx);
+ ipAddressTable_release_rowreq_ctx(tmp_ctx);
+
+ /*
+ * pop off delete list
+ */
+ CONTAINER_REMOVE(tmp_container, NULL);
+ }
+ }
}
-
DEBUGMSGT(("verbose:ipAddressTable:ipAddressTable_cache_load",
"%d records\n", CONTAINER_SIZE(container)));