+void
+overlay_insert( BackendDB *be, slap_overinst *on2, slap_overinst ***prev,
+ int idx )
+{
+ slap_overinfo *oi = (slap_overinfo *)be->bd_info;
+
+ if ( idx == -1 ) {
+ on2->on_next = oi->oi_list;
+ oi->oi_list = on2;
+ } else {
+ int i;
+ slap_overinst *on, *otmp1 = NULL, *otmp2;
+
+ /* Since the list is in reverse order and is singly linked,
+ * we reverse it to find the idx insertion point. Adding
+ * on overlay at a specific point should be a pretty
+ * infrequent occurrence.
+ */
+ for ( on = oi->oi_list; on; on=otmp2 ) {
+ otmp2 = on->on_next;
+ on->on_next = otmp1;
+ otmp1 = on;
+ }
+ oi->oi_list = NULL;
+ /* advance to insertion point */
+ for ( i=0, on = otmp1; i<idx; i++ ) {
+ otmp1 = on->on_next;
+ on->on_next = oi->oi_list;
+ oi->oi_list = on;
+ }
+ /* insert */
+ on2->on_next = oi->oi_list;
+ oi->oi_list = on2;
+ if ( otmp1 ) {
+ *prev = &otmp1->on_next;
+ /* replace remainder of list */
+ for ( on=otmp1; on; on=otmp1 ) {
+ otmp1 = on->on_next;
+ on->on_next = oi->oi_list;
+ oi->oi_list = on;
+ }
+ }
+ }
+}
+
+void
+overlay_move( BackendDB *be, slap_overinst *on, int idx )
+{
+ slap_overinfo *oi = (slap_overinfo *)be->bd_info;
+ slap_overinst **onp;
+
+ for (onp = &oi->oi_list; *onp; onp= &(*onp)->on_next) {
+ if ( *onp == on ) {
+ *onp = on->on_next;
+ break;
+ }
+ }
+ overlay_insert( be, on, &onp, idx );
+}
+