components/net-snmp/patches/019.6998845.container.patch
changeset 1650 ce501c11d5fa
parent 1649 81d624418adc
child 1651 0e3a608a1823
--- a/components/net-snmp/patches/019.6998845.container.patch	Wed Jan 22 01:46:00 2014 -0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,314 +0,0 @@
---- net-snmp/include/net-snmp/library/container.h	Mon Dec  5 00:13:04 2005
-+++ net-snmp/include/net-snmp/library/container.h	Fri Jan 14 17:35:37 2011
-@@ -31,8 +31,16 @@
-     struct netsnmp_container_s; /** forward declare */
- 
-     /*
--     * function returning an int for an operation on a container
-+     * function for performing an operation on a container which
-+     * returns (maybe the same) container.
-      */
-+
-+    typedef struct netsnmp_container_s* (netsnmp_container_mod_op)
-+      (struct netsnmp_container_s *, void *context, u_int flags);
-+
-+    /*
-+     * function for setting an option on a container
-+     */
-     typedef int (netsnmp_container_option)(struct netsnmp_container_s *,
-                                            int set, u_int flags);
- 
-@@ -192,6 +200,14 @@
-        netsnmp_container_op    *insert_filter;
- 
-        /*
-+	* OPTIONAL function to duplicate a container. Defaults to a shallow
-+	* copy. Only the specified container is copied (i.e. sub-containers
-+	* not included).
-+	*/
-+
-+       netsnmp_container_mod_op *duplicate;
-+
-+       /*
-         * function to compare two object stored in the container.
-         *
-         * Returns:
-@@ -219,11 +235,16 @@
- 
-        /*
-         * sort count, for iterators to track (insert/delete
--        * bumps coutner, invalidates iterator
-+        * bumps counter, invalidates iterator)
-         */
-        u_long                          sync;
- 
-        /*
-+	* flags
-+	*/
-+       u_int                           flags;
-+
-+       /*
-         * containers can contain other containers (additional indexes)
-         */
-        struct netsnmp_container_s *next, *prev;
-@@ -288,15 +309,15 @@
- #define CONTAINER_SET_OPTIONS(x,o,rc)  do {                             \
-         if (NULL==(x)->options)                                         \
-             rc = -1;                                                    \
--        else                                                            \
-+        else {                                                          \
-             rc = (x)->options(x, 1, o);                                 \
-+	     if (rc != -1 )						\
-+		(x)->flags |= o;                                        \
-+	}								\
-     } while(0)
- 
- #define CONTAINER_CHECK_OPTION(x,o,rc)    do {                          \
--        if (NULL==(x)->options)                                         \
--            rc = -1;                                                    \
--        else                                                            \
--            rc = (x)->options(x,0, o);                                  \
-+	rc = x->flags & 0;                                              \
-     } while(0)
- 
- 
-@@ -335,6 +356,12 @@
-     int CONTAINER_REMOVE(netsnmp_container *x, const void *k);
- 
-     /*
-+     * duplicate container
-+     */
-+    netsnmp_container *CONTAINER_DUP(netsnmp_container *x, void *ctx,
-+		u_int flags); 
-+
-+    /*
-      * clear all containers. When clearing the *first* container, and
-      * *only* the first container, call the function f for each item.
-      * After calling this function, all containers should be empty.
-@@ -364,7 +391,7 @@
-                 continue;
-             rc2 = x->insert(x,k);
-             if (rc2) {
--                snmp_log(LOG_ERR,"error on subcontainer '%s' insert (%d)\n",
-+                snmp_log(LOG_DEBUG,"error on subcontainer '%s' insert (%d)\n",
-                          x->container_name ? x->container_name : "", rc2);
-                 rc = rc2;
-             }
-@@ -402,6 +429,22 @@
-      * container.c. If you change one, change them both.
-      */
-     NETSNMP_STATIC_INLINE /* gcc docs recommend static w/inline */
-+    netsnmp_container *CONTAINER_DUP(netsnmp_container *x, void *ctx,
-+    		u_int flags)
-+    {
-+      if (NULL == x->duplicate) {
-+    	snmp_log(LOG_ERR, "container '%s' does not support duplicate\n",
-+    		x->container_name ? x->container_name : "");
-+    	return NULL;
-+      }
-+      return x->duplicate(x, ctx, flags);
-+    }
-+
-+    /*------------------------------------------------------------------
-+     * 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_FREE(netsnmp_container *x)
-     {
- 	int  rc2, rc = 0;
-@@ -474,6 +517,10 @@
-     }
- 
- #endif
-+
-+    /** Duplicate container meta-data. */
-+    int netsnmp_container_data_dup(netsnmp_container *dup,
-+    	netsnmp_container *c); 
-     
-     /*************************************************************************
-      *
---- net-snmp/snmplib/container_binary_array.c	Wed Aug 23 21:23:22 2006
-+++ net-snmp/snmplib/container_binary_array.c	Fri Jan 14 17:35:37 2011
-@@ -36,7 +36,6 @@
- typedef struct binary_array_table_s {
-     size_t                     max_size;   /* Size of the current data table */
-     size_t                     count;      /* Index of the next free entry */
--    u_int                      flags;      /* flags */
-     int                        dirty;
-     int                        data_size;  /* Size of an individual entry */
-     void                     **data;       /* The table itself */
-@@ -99,7 +98,7 @@
-     netsnmp_assert(t!=NULL);
-     netsnmp_assert(c->compare!=NULL);
- 
--    if (t->flags & CONTAINER_KEY_UNSORTED)
-+    if (c->flags & CONTAINER_KEY_UNSORTED)
-         return 0;
- 
-     if (t->dirty) {
-@@ -204,11 +203,16 @@
- int
- netsnmp_binary_array_options_set(netsnmp_container *c, int set, u_int flags)
- {
--    binary_array_table *t = (binary_array_table*)c->container_data;
--    if (set)
--        t->flags = flags;
-+#define BA_FLAGS (CONTAINER_KEY_ALLOW_DUPLICATES|CONTAINER_KEY_UNSORTED)
-+
-+    if (set) {
-+    	if ((flags & BA_FLAGS) == flags)
-+    		c->flags = flags;
-+    	else
-+    		flags = (u_int)-1; /* unsupported flag */
-+    }
-     else
--        return ((t->flags & flags) == flags);
-+    	return ((c->flags & flags) == flags); 
-     return flags;
- }
- 
-@@ -371,7 +375,7 @@
-     /*
-      * check for duplicates
-      */
--    if (! (t->flags & CONTAINER_KEY_ALLOW_DUPLICATES)) {
-+    if (! (c->flags & CONTAINER_KEY_ALLOW_DUPLICATES)) {
-         new_data = netsnmp_binary_array_get(c, entry, 1);
-         if (NULL != new_data) {
-             DEBUGMSGTL(("container","not inserting duplicate key\n"));
-@@ -579,6 +583,56 @@
-     return va;
- }
- 
-+static netsnmp_container *
-+_ba_duplicate(netsnmp_container *c, void *ctx, u_int flags)
-+{
-+    netsnmp_container *dup;
-+    binary_array_table *dupt, *t;
-+
-+    if (flags) {
-+        snmp_log(LOG_ERR, "binary arry duplicate does not supprt flags yet\n");
-+        return NULL;
-+    }
-+
-+    dup = netsnmp_container_get_binary_array();
-+    if (NULL == dup) {
-+        snmp_log(LOG_ERR," no memory for binary array duplicate\n");
-+        return NULL;
-+    }
-+    /*
-+     * deal with container stuff
-+     */
-+    if (netsnmp_container_data_dup(dup, c) != 0) {
-+        netsnmp_binary_array_release(dup);
-+        return NULL;
-+    }
-+
-+    /*
-+     * deal with data
-+     */
-+    dupt = (binary_array_table*)dup->container_data;
-+    t = (binary_array_table*)c->container_data;
-+
-+    dupt->max_size = t->max_size;
-+    dupt->count = t->count;
-+    dupt->dirty = t->dirty;
-+    dupt->data_size = t->data_size;
-+
-+    /*
-+     * shallow copy
-+     */
-+    dupt->data = (void**) calloc(dupt->max_size, dupt->data_size);
-+    if (NULL == dupt->data) {
-+        snmp_log(LOG_ERR, "no memory for binary array duplicate\n");
-+        netsnmp_binary_array_release(dup);
-+        return NULL;
-+    }
-+
-+    memcpy(dupt->data, t->data, dupt->max_size * dupt->data_size);
-+    
-+    return dup;
-+}
-+
- netsnmp_container *
- netsnmp_container_get_binary_array(void)
- {
-@@ -592,7 +646,11 @@
-     }
- 
-     c->container_data = netsnmp_binary_array_initialize();
--        
-+
-+    /*
-+     * NOTE: CHANGES HERE MUST BE DUPLICATED IN duplicate AS WELL!!
-+     */
-+
-     c->get_size = _ba_size;
-     c->init = NULL;
-     c->cfree = _ba_free;
-@@ -604,6 +662,7 @@
-     c->get_iterator = _ba_iterator_get;
-     c->for_each = _ba_for_each;
-     c->clear = _ba_clear;
-+    c->duplicate = _ba_duplicate;
-         
-     return c;
- }
---- net-snmp/snmplib/container.c	Fri Aug 25 15:11:06 2006
-+++ net-snmp/snmplib/container.c	Fri Jan 14 17:35:37 2011
-@@ -278,7 +278,7 @@
-             continue;
-         rc2 = x->insert(x,k);
-         if (rc2) {
--            snmp_log(LOG_ERR,"error on subcontainer '%s' insert (%d)\n",
-+            snmp_log(LOG_DEBUG,"error on subcontainer '%s' insert (%d)\n",
-                      x->container_name ? x->container_name : "", rc2);
-             rc = rc2;
-         }
-@@ -311,6 +311,20 @@
- }
- 
- /*------------------------------------------------------------------
-+ * These functions should EXACTLY match the function version in
-+ * container.c. If you change one, change them both.
-+ */
-+netsnmp_container *CONTAINER_DUP(netsnmp_container *x, void *ctx, u_int flags)
-+{
-+    if (NULL == x->duplicate) {
-+        snmp_log(LOG_ERR, "container '%s' does not support duplicate\n",
-+                 x->container_name ? x->container_name : "");
-+        return NULL;
-+    }
-+    return x->duplicate(x, ctx, flags);
-+}
-+
-+/*------------------------------------------------------------------
-  * These functions should EXACTLY match the inline version in
-  * container.h. If you change one, change them both.
-  */
-@@ -408,6 +422,24 @@
-     c->find = fnd;
- }
- 
-+int
-+netsnmp_container_data_dup(netsnmp_container *dup, netsnmp_container *c)
-+{
-+    if (!dup || !c)
-+        return -1;
-+
-+    if (c->container_name)
-+        dup->container_name = strdup(c->container_name);
-+    dup->compare = c->compare;
-+    dup->ncompare = c->ncompare;
-+    dup->release = c->release;
-+    dup->insert_filter = c->insert_filter;
-+    dup->sync = c->sync;
-+    dup->flags = c->flags;
-+
-+    return 0;
-+}
-+
- /*------------------------------------------------------------------
-  *
-  * simple comparison routines