]> git.sur5r.net Git - openldap/commitdiff
ITS#4337 insert EntryInfo in proper slot
authorHoward Chu <hyc@openldap.org>
Sun, 24 Dec 2006 03:44:08 +0000 (03:44 +0000)
committerHoward Chu <hyc@openldap.org>
Sun, 24 Dec 2006 03:44:08 +0000 (03:44 +0000)
servers/slapd/bconfig.c

index 366228d1bc39d668356869078f2b77c22d745c9b..4ff1d3b954d451814708852ae5a3704c44e0d7c7 100644 (file)
@@ -4195,11 +4195,37 @@ ok:
        if ( !last ) {
                cfb->cb_root = ce;
        } else if ( last->ce_kids ) {
-               CfEntryInfo *c2;
+               CfEntryInfo *c2, **cprev;
 
-               for (c2=last->ce_kids; c2 && c2->ce_sibs; c2 = c2->ce_sibs);
-
-               c2->ce_sibs = ce;
+               /* Advance to first of this type */
+               cprev = &last->ce_kids;
+               for ( c2 = *cprev; c2 && c2->ce_type != ce->ce_type; ) {
+                       cprev = &c2->ce_sibs;
+                       c2 = c2->ce_sibs;
+               }
+               /* Account for the (-1) frontendDB entry */
+               if ( ce->ce_type == Cft_Database ) {
+                       if ( ca->be == frontendDB )
+                               ibase = 0;
+                       else if ( ibase != -1 )
+                               ibase++;
+               }
+               /* Append */
+               if ( ibase < 0 ) {
+                       for (c2 = *cprev; c2 && c2->ce_type == ce->ce_type;) {
+                               cprev = &c2->ce_sibs;
+                               c2 = c2->ce_sibs;
+                       }
+               } else {
+               /* Insert */
+                       int i;
+                       for ( i=0; i<ibase; i++ ) {
+                               c2 = *cprev;
+                               cprev = &c2->ce_sibs;
+                       }
+               }
+               ce->ce_sibs = *cprev;
+               *cprev = ce;
        } else {
                last->ce_kids = ce;
        }