]> git.sur5r.net Git - openldap/commitdiff
More migration of syncrepl from frontend to syncprov overlay
authorHoward Chu <hyc@openldap.org>
Sat, 27 Nov 2004 00:57:37 +0000 (00:57 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 27 Nov 2004 00:57:37 +0000 (00:57 +0000)
define OPERATION_BUFFER_SIZE for dummy Operations

16 files changed:
servers/slapd/back-bdb/init.c
servers/slapd/back-monitor/init.c
servers/slapd/backglue.c
servers/slapd/connection.c
servers/slapd/controls.c
servers/slapd/ldapsync.c
servers/slapd/operation.c
servers/slapd/overlays/pcache.c
servers/slapd/overlays/syncprov.c
servers/slapd/proto-slap.h
servers/slapd/search.c
servers/slapd/sessionlog.c
servers/slapd/slap.h
servers/slapd/slapacl.c
servers/slapd/slapauth.c
servers/slapd/syncrepl.c

index 4be2ebcbea4c2c3a0db89202629fdace46f27305..3f7dd504e2a2444e633bde368ae05d3b757f6b7c 100644 (file)
@@ -630,7 +630,7 @@ bdb_back_initialize(
 
        bi->bi_op_unbind = 0;
 
-#if 0
+#if 0  /* DELETE ME */
        bi->bi_op_abandon = bdb_abandon;
        bi->bi_op_cancel = bdb_cancel;
 #endif
index 496d5e9ce88b92b150e36c5ed27ae5c2504fcca6..1966e7e04a14606ec6ed130558578601df08a602 100644 (file)
@@ -373,8 +373,8 @@ monitor_filter2ndn( struct berval *base, int scope, struct berval *filter,
                struct berval *ndn )
 {
        Connection      conn = { 0 };
-       Operation       op = { 0 };
-       Opheader        ohdr = { 0 };
+       char opbuf[OPERATION_BUFFER_SIZE];
+       Operation       *op;
        SlapReply       rs = { 0 };
        slap_callback   cb = { NULL, monitor_filter2ndn_cb, NULL, NULL };
        AttributeName   anlist[ 2 ];
@@ -386,52 +386,53 @@ monitor_filter2ndn( struct berval *base, int scope, struct berval *filter,
                return -1;
        }
 
-       connection_fake_init( &conn, &op, &ohdr, &conn );
+       op = (Operation *)opbuf;
+       connection_fake_init( &conn, op, &conn );
 
-       op.o_tag = LDAP_REQ_SEARCH;
+       op->o_tag = LDAP_REQ_SEARCH;
 
        /* use global malloc for now */
-       op.o_tmpmemctx = NULL;
-       op.o_tmpmfuncs = &ch_mfuncs;
+       op->o_tmpmemctx = NULL;
+       op->o_tmpmfuncs = &ch_mfuncs;
 
-       op.o_bd = be_monitor;
+       op->o_bd = be_monitor;
        if ( base == NULL || BER_BVISNULL( base ) ) {
-               ber_dupbv_x( &op.o_req_dn, &op.o_bd->be_suffix[ 0 ],
-                               op.o_tmpmemctx );
-               ber_dupbv_x( &op.o_req_ndn, &op.o_bd->be_nsuffix[ 0 ],
-                               op.o_tmpmemctx );
+               ber_dupbv_x( &op->o_req_dn, &op->o_bd->be_suffix[ 0 ],
+                               op->o_tmpmemctx );
+               ber_dupbv_x( &op->o_req_ndn, &op->o_bd->be_nsuffix[ 0 ],
+                               op->o_tmpmemctx );
 
        } else {
-               if ( dnPrettyNormal( NULL, base, &op.o_req_dn, &op.o_req_ndn,
-                                       op.o_tmpmemctx ) ) {
+               if ( dnPrettyNormal( NULL, base, &op->o_req_dn, &op->o_req_ndn,
+                                       op->o_tmpmemctx ) ) {
                        /* error */
                }
        }
 
-       op.o_callback = &cb;
+       op->o_callback = &cb;
        cb.sc_private = (void *)ndn;
 
-       op.ors_scope = scope;
-       ber_dupbv_x( &op.ors_filterstr, filter, op.o_tmpmemctx );
-       op.ors_filter = str2filter_x( &op, filter->bv_val );
-       op.ors_attrs = anlist;
+       op->ors_scope = scope;
+       ber_dupbv_x( &op->ors_filterstr, filter, op->o_tmpmemctx );
+       op->ors_filter = str2filter_x( op, filter->bv_val );
+       op->ors_attrs = anlist;
        BER_BVSTR( &anlist[ 0 ].an_name, LDAP_NO_ATTRS );
        BER_BVZERO( &anlist[ 1 ].an_name );
-       op.ors_attrsonly = 0;
-       op.ors_tlimit = SLAP_NO_LIMIT;
-       op.ors_slimit = 1;
-       op.ors_limit = NULL;
-       op.ors_deref = LDAP_DEREF_NEVER;
+       op->ors_attrsonly = 0;
+       op->ors_tlimit = SLAP_NO_LIMIT;
+       op->ors_slimit = 1;
+       op->ors_limit = NULL;
+       op->ors_deref = LDAP_DEREF_NEVER;
 
-       op.o_nocaching = 1;
-       op.o_managedsait = 1;
+       op->o_nocaching = 1;
+       op->o_managedsait = SLAP_CONTROL_NONCRITICAL;
 
-       rc = op.o_bd->be_search( &op, &rs );
+       rc = op->o_bd->be_search( op, &rs );
 
-       filter_free_x( &op, op.ors_filter );
-       op.o_tmpfree( op.ors_filterstr.bv_val, op.o_tmpmemctx );
-       op.o_tmpfree( op.o_req_dn.bv_val, op.o_tmpmemctx );
-       op.o_tmpfree( op.o_req_ndn.bv_val, op.o_tmpmemctx );
+       filter_free_x( op, op->ors_filter );
+       op->o_tmpfree( op->ors_filterstr.bv_val, op->o_tmpmemctx );
+       op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx );
+       op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx );
 
        if ( rc != 0 ) {
                return rc;
index f65ee40f477a2e8eece49722a5d3c4b9bc896ae1..064c237810509eed7578e4c3c561fa2935bed912 100644 (file)
@@ -289,6 +289,7 @@ glue_back_search ( Operation *op, SlapReply *rs )
        case LDAP_SCOPE_SUBORDINATE: /* FIXME */
 #endif
 
+#if 0  /* DELETE ME - verify ITS first */
                if ( op->o_sync_mode & SLAP_SYNC_REFRESH ) {
                        if (op->o_bd && op->o_bd->be_search) {
                                rs->sr_err = op->o_bd->be_search( op, rs );
@@ -298,6 +299,7 @@ glue_back_search ( Operation *op, SlapReply *rs )
                        }
                        return rs->sr_err;
                }
+#endif
 
                op->o_callback = &cb;
                rs->sr_err = gs.err = LDAP_UNWILLING_TO_PERFORM;
index 19143d5daa5fb518836a44ce27736328754b4e46..43987952e86f1e8343271ea18bb6c4f94543b784 100644 (file)
@@ -1068,21 +1068,21 @@ operations_error:
 
        ber_set_option( op->o_ber, LBER_OPT_BER_MEMCTX, &memctx_null );
 
+#if 0  /* DELETE ME */
        if ( op->o_cancel != SLAP_CANCEL_ACK &&
                ( op->o_sync_mode & SLAP_SYNC_PERSIST ) )
        {
                slap_sl_mem_detach( ctx, memctx );
-
-#if 0
        } else if ( op->o_sync_slog_size != -1 ) {
                slap_sl_mem_detach( ctx, memctx );
                LDAP_STAILQ_REMOVE( &conn->c_ops, op, slap_op, o_next);
                LDAP_STAILQ_NEXT(op, o_next) = NULL;
                conn->c_n_ops_executing--;
                conn->c_n_ops_completed++;
-#endif
 
-       } else {
+       } else
+#endif
+       {
                LDAP_STAILQ_REMOVE( &conn->c_ops, op, slap_op, o_next);
                LDAP_STAILQ_NEXT(op, o_next) = NULL;
                slap_op_free( op );
@@ -1695,7 +1695,6 @@ void
 connection_fake_init(
        Connection *conn,
        Operation *op,
-       Opheader *ohdr,
        void *ctx )
 {
        conn->c_connid = -1;
@@ -1706,7 +1705,9 @@ connection_fake_init(
        conn->c_peer_domain = slap_empty_bv;
        conn->c_peer_name = slap_empty_bv;
 
-       op->o_hdr = ohdr;
+       memset(op, 0, OPERATION_BUFFER_SIZE);
+       op->o_hdr = (Opheader *)(op+1);
+       op->o_controls = (void **)(op->o_hdr+1);
        /* set memory context */
        op->o_tmpmemctx = slap_sl_mem_create(SLAP_SLAB_SIZE, SLAP_SLAB_STACK, ctx);
        op->o_tmpmfuncs = &slap_sl_mfuncs;
index c386fcc9e9acd9f6583b0ba2d14cdf9591b46bac..5ccca5b4ad72c71bfb3a242ae50486107cce6178 100644 (file)
@@ -41,7 +41,6 @@ static SLAP_CTRL_PARSE_FN parseSearchOptions;
 #ifdef LDAP_CONTROL_SUBENTRIES
 static SLAP_CTRL_PARSE_FN parseSubentries;
 #endif
-static SLAP_CTRL_PARSE_FN parseLDAPsync;
 
 #undef sc_mask /* avoid conflict with Irix 6.5 <sys/signal.h> */
 
@@ -139,10 +138,6 @@ static struct slap_control control_defs[] = {
                (int)offsetof(struct slap_control_ids, sc_noOp),
                SLAP_CTRL_HIDE|SLAP_CTRL_ACCESS, NULL,
                parseNoOp, LDAP_SLIST_ENTRY_INITIALIZER(next) },
-       { LDAP_CONTROL_SYNC,
-               (int)offsetof(struct slap_control_ids, sc_LDAPsync),
-               SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,
-               parseLDAPsync, LDAP_SLIST_ENTRY_INITIALIZER(next) },
 #ifdef LDAP_CONTROL_MODIFY_INCREMENT
        { LDAP_CONTROL_MODIFY_INCREMENT,
                (int)offsetof(struct slap_control_ids, sc_modifyIncrement),
@@ -800,10 +795,12 @@ static int parsePagedResults (
                return LDAP_PROTOCOL_ERROR;
        }
 
+#if 0  /* DELETE ME */
        if ( op->o_sync != SLAP_CONTROL_NONE ) {
                rs->sr_text = "paged results control specified with sync control";
                return LDAP_PROTOCOL_ERROR;
        }
+#endif
 
        if ( BER_BVISEMPTY( &ctrl->ldctl_value ) ) {
                rs->sr_text = "paged results control value is empty (or absent)";
@@ -1286,105 +1283,3 @@ static int parseSearchOptions (
 }
 #endif
 
-static int parseLDAPsync (
-       Operation *op,
-       SlapReply *rs,
-       LDAPControl *ctrl )
-{
-       ber_tag_t tag;
-       BerElement *ber;
-       ber_int_t mode;
-       ber_len_t len;
-       struct slap_session_entry *se;
-       struct berval cookie = BER_BVNULL;
-       syncrepl_state *sr;
-       int rhint = 0;
-
-       if ( op->o_sync != SLAP_CONTROL_NONE ) {
-               rs->sr_text = "Sync control specified multiple times";
-               return LDAP_PROTOCOL_ERROR;
-       }
-
-       if ( op->o_pagedresults != SLAP_CONTROL_NONE ) {
-               rs->sr_text = "Sync control specified with pagedResults control";
-               return LDAP_PROTOCOL_ERROR;
-       }
-
-
-       if ( ctrl->ldctl_value.bv_len == 0 ) {
-               rs->sr_text = "Sync control value is empty (or absent)";
-               return LDAP_PROTOCOL_ERROR;
-       }
-
-       /* Parse the control value
-        *      syncRequestValue ::= SEQUENCE {
-        *              mode   ENUMERATED {
-        *                      -- 0 unused
-        *                      refreshOnly             (1),
-        *                      -- 2 reserved
-        *                      refreshAndPersist       (3)
-        *              },
-        *              cookie  syncCookie OPTIONAL
-        *      }
-        */
-
-       ber = ber_init( &ctrl->ldctl_value );
-       if( ber == NULL ) {
-               rs->sr_text = "internal error";
-               return LDAP_OTHER;
-       }
-
-       if ( (tag = ber_scanf( ber, "{i" /*}*/, &mode )) == LBER_ERROR ) {
-               rs->sr_text = "Sync control : mode decoding error";
-               return LDAP_PROTOCOL_ERROR;
-       }
-
-       switch( mode ) {
-       case LDAP_SYNC_REFRESH_ONLY:
-               mode = SLAP_SYNC_REFRESH;
-               break;
-       case LDAP_SYNC_REFRESH_AND_PERSIST:
-               mode = SLAP_SYNC_REFRESH_AND_PERSIST;
-               break;
-       default:
-               rs->sr_text = "Sync control : unknown update mode";
-               return LDAP_PROTOCOL_ERROR;
-       }
-
-       tag = ber_peek_tag( ber, &len );
-
-       if ( tag == LDAP_TAG_SYNC_COOKIE ) {
-               if (( ber_scanf( ber, /*{*/ "o", &cookie )) == LBER_ERROR ) {
-                       rs->sr_text = "Sync control : cookie decoding error";
-                       return LDAP_PROTOCOL_ERROR;
-               }
-       }
-       if ( tag == LDAP_TAG_RELOAD_HINT ) {
-               if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) {
-                       rs->sr_text = "Sync control : rhint decoding error";
-                       return LDAP_PROTOCOL_ERROR;
-               }
-       }
-       if (( ber_scanf( ber, /*{*/ "}")) == LBER_ERROR ) {
-                       rs->sr_text = "Sync control : decoding error";
-                       return LDAP_PROTOCOL_ERROR;
-       }
-       sr = op->o_tmpcalloc( 1, sizeof(struct syncrepl_state), op->o_tmpmemctx );
-       sr->sr_rhint = rhint;
-       if (!BER_BVISNULL(&cookie)) {
-               ber_bvarray_add( &sr->sr_state.octet_str, &cookie );
-               slap_parse_sync_cookie( &sr->sr_state );
-       }
-
-       op->o_controls[slap_cids.sc_LDAPsync] = sr;
-
-       (void) ber_free( ber, 1 );
-
-       op->o_sync = ctrl->ldctl_iscritical
-               ? SLAP_CONTROL_CRITICAL
-               : SLAP_CONTROL_NONCRITICAL;
-
-       op->o_sync_mode |= mode;        /* o_sync_mode shares o_sync */
-
-       return LDAP_SUCCESS;
-}
index e456ebc14f2ca182ec1b1339001471f2957338af..4d6afd8e45ddcc24bb49375b94c2e186254f52ef 100644 (file)
@@ -34,236 +34,6 @@ struct slap_sync_cookie_s slap_sync_cookie =
        LDAP_STAILQ_HEAD_INITIALIZER( slap_sync_cookie );
 #endif
 
-int
-slap_build_sync_state_ctrl(
-       Operation       *op,
-       SlapReply       *rs,
-       Entry           *e,
-       int                     entry_sync_state,
-       LDAPControl     **ctrls,
-       int                     num_ctrls,
-       int                     send_cookie,
-       struct berval   *cookie)
-{
-       Attribute* a;
-       int ret;
-       int res;
-       const char *text = NULL;
-
-       BerElementBuffer berbuf;
-       BerElement *ber = (BerElement *)&berbuf;
-
-       struct berval entryuuid_bv      = BER_BVNULL;
-
-       ber_init2( ber, 0, LBER_USE_DER );
-       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
-
-       ctrls[num_ctrls] = slap_sl_malloc ( sizeof ( LDAPControl ), op->o_tmpmemctx );
-
-       for ( a = e->e_attrs; a != NULL; a = a->a_next ) {
-               AttributeDescription *desc = a->a_desc;
-               if ( desc == slap_schema.si_ad_entryUUID ) {
-                       entryuuid_bv = a->a_nvals[0];
-                       break;
-               }
-       }
-
-       if ( send_cookie && cookie ) {
-               ber_printf( ber, "{eOON}",
-                       entry_sync_state, &entryuuid_bv, cookie );
-       } else {
-               ber_printf( ber, "{eON}",
-                       entry_sync_state, &entryuuid_bv );
-       }
-
-       ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_STATE;
-       ctrls[num_ctrls]->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
-       ret = ber_flatten2( ber, &ctrls[num_ctrls]->ldctl_value, 1 );
-
-       ber_free_buf( ber );
-
-       if ( ret < 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "slap_build_sync_ctrl: ber_flatten2 failed\n",
-                       0, 0, 0 );
-               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
-               return ret;
-       }
-
-       return LDAP_SUCCESS;
-}
-
-int
-slap_build_sync_done_ctrl(
-       Operation       *op,
-       SlapReply       *rs,
-       LDAPControl     **ctrls,
-       int                     num_ctrls,
-       int                     send_cookie,
-       struct berval *cookie,
-       int                     refreshDeletes )
-{
-       int ret;
-       BerElementBuffer berbuf;
-       BerElement *ber = (BerElement *)&berbuf;
-
-       ber_init2( ber, NULL, LBER_USE_DER );
-       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
-
-       ctrls[num_ctrls] = ch_malloc ( sizeof ( LDAPControl ) );
-
-       ber_printf( ber, "{" );
-       if ( send_cookie && cookie ) {
-               ber_printf( ber, "O", cookie );
-       }
-       if ( refreshDeletes == LDAP_SYNC_REFRESH_DELETES ) {
-               ber_printf( ber, "b", refreshDeletes );
-       }
-       ber_printf( ber, "N}" );        
-
-       ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_DONE;
-       ctrls[num_ctrls]->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
-       ret = ber_flatten2( ber, &ctrls[num_ctrls]->ldctl_value, 1 );
-
-       ber_free_buf( ber );
-
-       if ( ret < 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "slap_build_sync_done_ctrl: ber_flatten2 failed\n",
-                       0, 0, 0 );
-               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
-               return ret;
-       }
-
-       return LDAP_SUCCESS;
-}
-
-
-int
-slap_build_sync_state_ctrl_from_slog(
-       Operation       *op,
-       SlapReply       *rs,
-       struct slog_entry *slog_e,
-       int                     entry_sync_state,
-       LDAPControl     **ctrls,
-       int                     num_ctrls,
-       int                     send_cookie,
-       struct berval   *cookie)
-{
-       Attribute* a;
-       int ret;
-       int res;
-       const char *text = NULL;
-
-       BerElementBuffer berbuf;
-       BerElement *ber = (BerElement *)&berbuf;
-
-       struct berval entryuuid_bv      = BER_BVNULL;
-
-       ber_init2( ber, NULL, LBER_USE_DER );
-       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
-
-       ctrls[num_ctrls] = ch_malloc ( sizeof ( LDAPControl ) );
-
-       entryuuid_bv = slog_e->sl_uuid;
-
-       if ( send_cookie && cookie ) {
-               ber_printf( ber, "{eOON}",
-                       entry_sync_state, &entryuuid_bv, cookie );
-       } else {
-               ber_printf( ber, "{eON}",
-                       entry_sync_state, &entryuuid_bv );
-       }
-
-       ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_STATE;
-       ctrls[num_ctrls]->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
-       ret = ber_flatten2( ber, &ctrls[num_ctrls]->ldctl_value, 1 );
-
-       ber_free_buf( ber );
-
-       if ( ret < 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "slap_build_sync_ctrl: ber_flatten2 failed\n",
-                       0, 0, 0 );
-               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
-               return ret;
-       }
-
-       return LDAP_SUCCESS;
-}
-
-int
-slap_send_syncinfo(
-       Operation       *op,
-       SlapReply       *rs,
-       int                     type,
-       struct berval *cookie,
-       int                     refreshDone,
-       BerVarray       syncUUIDs,
-       int                     refreshDeletes )
-{
-       BerElementBuffer berbuf;
-       BerElement *ber = (BerElement *)&berbuf;
-       struct berval rspdata;
-
-       int ret;
-
-       ber_init2( ber, NULL, LBER_USE_DER );
-       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
-
-       if ( type ) {
-               switch ( type ) {
-               case LDAP_TAG_SYNC_NEW_COOKIE:
-                       ber_printf( ber, "tO", type, cookie );
-                       break;
-               case LDAP_TAG_SYNC_REFRESH_DELETE:
-               case LDAP_TAG_SYNC_REFRESH_PRESENT:
-                       ber_printf( ber, "t{", type );
-                       if ( cookie ) {
-                               ber_printf( ber, "O", cookie );
-                       }
-                       if ( refreshDone == 0 ) {
-                               ber_printf( ber, "b", refreshDone );
-                       }
-                       ber_printf( ber, "N}" );
-                       break;
-               case LDAP_TAG_SYNC_ID_SET:
-                       ber_printf( ber, "t{", type );
-                       if ( cookie ) {
-                               ber_printf( ber, "O", cookie );
-                       }
-                       if ( refreshDeletes == 1 ) {
-                               ber_printf( ber, "b", refreshDeletes );
-                       }
-                       ber_printf( ber, "[W]", syncUUIDs );
-                       ber_printf( ber, "N}" );
-                       break;
-               default:
-                       Debug( LDAP_DEBUG_TRACE,
-                               "slap_send_syncinfo: invalid syncinfo type (%d)\n",
-                               type, 0, 0 );
-                       return LDAP_OTHER;
-               }
-       }
-
-       ret = ber_flatten2( ber, &rspdata, 0 );
-
-       if ( ret < 0 ) {
-               Debug( LDAP_DEBUG_TRACE,
-                       "slap_send_syncinfo: ber_flatten2 failed\n",
-                       0, 0, 0 );
-               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
-               return ret;
-       }
-
-       rs->sr_rspdata = &rspdata;
-       send_ldap_intermediate( op, rs );
-       rs->sr_rspdata = NULL;
-       ber_free_buf( ber );
-
-       return LDAP_SUCCESS;
-}
-
 void
 slap_compose_sync_cookie(
        Operation *op,
index d50d89b24777a9d5736c024b370fea4212b31cae..b7c180e4eec11399e993d08ccc8d5e2e7b95c0e7 100644 (file)
@@ -108,7 +108,7 @@ slap_op_free( Operation *op )
        op->o_hdr = (Opheader *)(op+1);
        op->o_controls = (void **)(op->o_hdr+1);
 
-#if 0
+#if 0  /* DELETE ME */
        slap_sync_cookie_free( &op->o_sync_state, 0 );
        if ( op->o_sync_csn.bv_val != NULL ) {
                ch_free( op->o_sync_csn.bv_val );
@@ -155,7 +155,7 @@ slap_op_alloc(
        op->o_opid = id;
        op->o_res_ber = NULL;
 
-#if 0
+#if 0  /* DELETE ME */
        op->o_sync_state.sid = -1;
        op->o_sync_slog_size = -1;
        op->o_sync_state.rid = -1;
index e4135b982218da39c744362010fa5a1c0002278f..150dca2ad91a9ff186d78f41a5670e69d51f6299 100644 (file)
@@ -1410,20 +1410,21 @@ consistency_check(
        slap_overinst *on = rtask->arg;
        cache_manager *cm = on->on_bi.bi_private;
        query_manager *qm = cm->qm;
-       Operation op = {0};
-       Opheader ohdr = {0};
        Connection conn = {0};
+       char opbuf[OPERATION_BUFFER_SIZE];
+       Operation *op;
 
        SlapReply rs = {REP_RESULT};
        CachedQuery* query, *query_prev;
        int i, return_val, pause = 1;
        QueryTemplate* templ;
 
-       connection_fake_init( &conn, &op, &ohdr, ctx );
+       op = (Operation *)opbuf;
+       connection_fake_init( &conn, op, ctx );
 
-       op.o_bd = &cm->db;
-       op.o_dn = cm->db.be_rootdn;
-       op.o_ndn = cm->db.be_rootndn;
+       op->o_bd = &cm->db;
+       op->o_dn = cm->db.be_rootdn;
+       op->o_ndn = cm->db.be_rootndn;
 
        cm->cc_arg = arg;
 
@@ -1431,9 +1432,9 @@ consistency_check(
                templ = qm->templates + i;
                query = templ->query_last;
                if ( query ) pause = 0;
-               op.o_time = slap_get_time();
+               op->o_time = slap_get_time();
                ldap_pvt_thread_mutex_lock(&cm->remove_mutex);
-               while (query && (query->expiry_time < op.o_time)) {
+               while (query && (query->expiry_time < op->o_time)) {
                        ldap_pvt_thread_mutex_lock(&qm->lru_mutex);
                        remove_query(qm, query);
                        ldap_pvt_thread_mutex_unlock(&qm->lru_mutex);
@@ -1446,7 +1447,7 @@ consistency_check(
                        Debug( LDAP_DEBUG_ANY, "Unlock CR index = %d\n",
                                        i, 0, 0 );
                        ldap_pvt_thread_rdwr_wunlock(&templ->t_rwlock);
-                       return_val = remove_query_data(&op, &rs, &query->q_uuid);
+                       return_val = remove_query_data(op, &rs, &query->q_uuid);
                        Debug( LDAP_DEBUG_ANY, "STALE QUERY REMOVED, SIZE=%d\n",
                                                return_val, 0, 0 );
                        ldap_pvt_thread_mutex_lock(&cm->cache_mutex);
index 144fda6ad4e9b7783245e54e76c396e612a8594d..ca36a7b560d0892543b533dcf51af8e435941d67 100644 (file)
@@ -53,6 +53,21 @@ typedef struct syncops {
 
 static int     sync_cid;
 
+/* A received sync control */
+typedef struct sync_control {
+       struct sync_cookie sr_state;
+       int sr_rhint;
+} sync_control;
+
+/* o_sync_mode uses data bits of o_sync */
+#define        o_sync  o_ctrlflag[sync_cid]
+#define        o_sync_mode     o_ctrlflag[sync_cid]
+
+#define SLAP_SYNC_NONE                                 (LDAP_SYNC_NONE<<SLAP_CONTROL_SHIFT)
+#define SLAP_SYNC_REFRESH                              (LDAP_SYNC_REFRESH_ONLY<<SLAP_CONTROL_SHIFT)
+#define SLAP_SYNC_PERSIST                              (LDAP_SYNC_RESERVED<<SLAP_CONTROL_SHIFT)
+#define SLAP_SYNC_REFRESH_AND_PERSIST  (LDAP_SYNC_REFRESH_AND_PERSIST<<SLAP_CONTROL_SHIFT)
+
 #define        PS_IS_REFRESHING        0x01
 
 /* Record of which searches matched at premodify step */
@@ -90,6 +105,235 @@ typedef struct fbase_cookie {
 static AttributeName csn_anlist[2];
 static AttributeName uuid_anlist[2];
 
+static int
+syncprov_state_ctrl(
+       Operation       *op,
+       SlapReply       *rs,
+       Entry           *e,
+       int                     entry_sync_state,
+       LDAPControl     **ctrls,
+       int                     num_ctrls,
+       int                     send_cookie,
+       struct berval   *cookie)
+{
+       Attribute* a;
+       int ret;
+       int res;
+       const char *text = NULL;
+
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
+
+       struct berval entryuuid_bv      = BER_BVNULL;
+
+       ber_init2( ber, 0, LBER_USE_DER );
+       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
+
+       ctrls[num_ctrls] = slap_sl_malloc ( sizeof ( LDAPControl ), op->o_tmpmemctx );
+
+       for ( a = e->e_attrs; a != NULL; a = a->a_next ) {
+               AttributeDescription *desc = a->a_desc;
+               if ( desc == slap_schema.si_ad_entryUUID ) {
+                       entryuuid_bv = a->a_nvals[0];
+                       break;
+               }
+       }
+
+       if ( send_cookie && cookie ) {
+               ber_printf( ber, "{eOON}",
+                       entry_sync_state, &entryuuid_bv, cookie );
+       } else {
+               ber_printf( ber, "{eON}",
+                       entry_sync_state, &entryuuid_bv );
+       }
+
+       ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_STATE;
+       ctrls[num_ctrls]->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
+       ret = ber_flatten2( ber, &ctrls[num_ctrls]->ldctl_value, 1 );
+
+       ber_free_buf( ber );
+
+       if ( ret < 0 ) {
+               Debug( LDAP_DEBUG_TRACE,
+                       "slap_build_sync_ctrl: ber_flatten2 failed\n",
+                       0, 0, 0 );
+               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
+               return ret;
+       }
+
+       return LDAP_SUCCESS;
+}
+
+static int
+syncprov_done_ctrl(
+       Operation       *op,
+       SlapReply       *rs,
+       LDAPControl     **ctrls,
+       int                     num_ctrls,
+       int                     send_cookie,
+       struct berval *cookie,
+       int                     refreshDeletes )
+{
+       int ret;
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
+
+       ber_init2( ber, NULL, LBER_USE_DER );
+       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
+
+       ctrls[num_ctrls] = ch_malloc ( sizeof ( LDAPControl ) );
+
+       ber_printf( ber, "{" );
+       if ( send_cookie && cookie ) {
+               ber_printf( ber, "O", cookie );
+       }
+       if ( refreshDeletes == LDAP_SYNC_REFRESH_DELETES ) {
+               ber_printf( ber, "b", refreshDeletes );
+       }
+       ber_printf( ber, "N}" );        
+
+       ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_DONE;
+       ctrls[num_ctrls]->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
+       ret = ber_flatten2( ber, &ctrls[num_ctrls]->ldctl_value, 1 );
+
+       ber_free_buf( ber );
+
+       if ( ret < 0 ) {
+               Debug( LDAP_DEBUG_TRACE,
+                       "syncprov_done_ctrl: ber_flatten2 failed\n",
+                       0, 0, 0 );
+               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
+               return ret;
+       }
+
+       return LDAP_SUCCESS;
+}
+
+
+static int
+syncprov_state_ctrl_from_slog(
+       Operation       *op,
+       SlapReply       *rs,
+       struct slog_entry *slog_e,
+       int                     entry_sync_state,
+       LDAPControl     **ctrls,
+       int                     num_ctrls,
+       int                     send_cookie,
+       struct berval   *cookie)
+{
+       Attribute* a;
+       int ret;
+       int res;
+       const char *text = NULL;
+
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
+
+       struct berval entryuuid_bv      = BER_BVNULL;
+
+       ber_init2( ber, NULL, LBER_USE_DER );
+       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
+
+       ctrls[num_ctrls] = ch_malloc ( sizeof ( LDAPControl ) );
+
+       entryuuid_bv = slog_e->sl_uuid;
+
+       if ( send_cookie && cookie ) {
+               ber_printf( ber, "{eOON}",
+                       entry_sync_state, &entryuuid_bv, cookie );
+       } else {
+               ber_printf( ber, "{eON}",
+                       entry_sync_state, &entryuuid_bv );
+       }
+
+       ctrls[num_ctrls]->ldctl_oid = LDAP_CONTROL_SYNC_STATE;
+       ctrls[num_ctrls]->ldctl_iscritical = (op->o_sync == SLAP_CONTROL_CRITICAL);
+       ret = ber_flatten2( ber, &ctrls[num_ctrls]->ldctl_value, 1 );
+
+       ber_free_buf( ber );
+
+       if ( ret < 0 ) {
+               Debug( LDAP_DEBUG_TRACE,
+                       "slap_build_sync_ctrl: ber_flatten2 failed\n",
+                       0, 0, 0 );
+               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
+               return ret;
+       }
+
+       return LDAP_SUCCESS;
+}
+
+int
+syncprov_sendinfo(
+       Operation       *op,
+       SlapReply       *rs,
+       int                     type,
+       struct berval *cookie,
+       int                     refreshDone,
+       BerVarray       syncUUIDs,
+       int                     refreshDeletes )
+{
+       BerElementBuffer berbuf;
+       BerElement *ber = (BerElement *)&berbuf;
+       struct berval rspdata;
+
+       int ret;
+
+       ber_init2( ber, NULL, LBER_USE_DER );
+       ber_set_option( ber, LBER_OPT_BER_MEMCTX, &op->o_tmpmemctx );
+
+       if ( type ) {
+               switch ( type ) {
+               case LDAP_TAG_SYNC_NEW_COOKIE:
+                       ber_printf( ber, "tO", type, cookie );
+                       break;
+               case LDAP_TAG_SYNC_REFRESH_DELETE:
+               case LDAP_TAG_SYNC_REFRESH_PRESENT:
+                       ber_printf( ber, "t{", type );
+                       if ( cookie ) {
+                               ber_printf( ber, "O", cookie );
+                       }
+                       if ( refreshDone == 0 ) {
+                               ber_printf( ber, "b", refreshDone );
+                       }
+                       ber_printf( ber, "N}" );
+                       break;
+               case LDAP_TAG_SYNC_ID_SET:
+                       ber_printf( ber, "t{", type );
+                       if ( cookie ) {
+                               ber_printf( ber, "O", cookie );
+                       }
+                       if ( refreshDeletes == 1 ) {
+                               ber_printf( ber, "b", refreshDeletes );
+                       }
+                       ber_printf( ber, "[W]", syncUUIDs );
+                       ber_printf( ber, "N}" );
+                       break;
+               default:
+                       Debug( LDAP_DEBUG_TRACE,
+                               "syncprov_sendinfo: invalid syncinfo type (%d)\n",
+                               type, 0, 0 );
+                       return LDAP_OTHER;
+               }
+       }
+
+       ret = ber_flatten2( ber, &rspdata, 0 );
+
+       if ( ret < 0 ) {
+               Debug( LDAP_DEBUG_TRACE,
+                       "syncprov_sendinfo: ber_flatten2 failed\n",
+                       0, 0, 0 );
+               send_ldap_error( op, rs, LDAP_OTHER, "internal error" );
+               return ret;
+       }
+
+       rs->sr_rspdata = &rspdata;
+       send_ldap_intermediate( op, rs );
+       rs->sr_rspdata = NULL;
+       ber_free_buf( ber );
+
+       return LDAP_SUCCESS;
+}
 /* syncprov_findbase:
  *   finds the true DN of the base of a search (with alias dereferencing) and
  * checks to make sure the base entry doesn't get replaced with a different
@@ -229,7 +473,7 @@ findcsn_cb( Operation *op, SlapReply *rs )
                if ( sc->sc_private ) {
                        int i;
                        fcsn_cookie *fc = sc->sc_private;
-                       syncrepl_state *srs = op->o_controls[sync_cid];
+                       sync_control *srs = op->o_controls[sync_cid];
                        Attribute *a = attr_find(rs->sr_entry->e_attrs,
                                slap_schema.si_ad_entryCSN );
                        i = ber_bvcmp( &a->a_vals[0], srs->sr_state.ctxcsn );
@@ -270,7 +514,7 @@ findpres_cb( Operation *op, SlapReply *rs )
                        ret = LDAP_SUCCESS;
                        if ( pc->num == SLAP_SYNCUUID_SET_SIZE ) {
                                rs->sr_rspoid = LDAP_SYNC_INFO;
-                               ret = slap_send_syncinfo( op, rs, LDAP_TAG_SYNC_ID_SET, NULL,
+                               ret = syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, NULL,
                                        0, pc->uuids, 0 );
                                ber_bvarray_free_x( pc->uuids, op->o_tmpmemctx );
                                pc->uuids = NULL;
@@ -283,7 +527,7 @@ findpres_cb( Operation *op, SlapReply *rs )
                ret = rs->sr_err;
                if ( pc->num ) {
                        rs->sr_rspoid = LDAP_SYNC_INFO;
-                       ret = slap_send_syncinfo( op, rs, LDAP_TAG_SYNC_ID_SET, NULL,
+                       ret = syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, NULL,
                                0, pc->uuids, 0 );
                        ber_bvarray_free_x( pc->uuids, op->o_tmpmemctx );
                        pc->uuids = NULL;
@@ -312,7 +556,7 @@ syncprov_findcsn( Operation *op, int mode )
        fcsn_cookie fcookie;
        fpres_cookie pcookie;
        int locked = 0;
-       syncrepl_state *srs = op->o_controls[sync_cid];
+       sync_control *srs = op->o_controls[sync_cid];
 
        if ( srs->sr_state.ctxcsn->bv_len >= LDAP_LUTIL_CSNSTR_BUFSIZE ) {
                return LDAP_OTHER;
@@ -461,7 +705,7 @@ syncprov_sendresp( Operation *op, opcookie *opc, syncops *so, Entry *e, int mode
        e_uuid.e_attrs = &a_uuid;
        a_uuid.a_desc = slap_schema.si_ad_entryUUID;
        a_uuid.a_nvals = &opc->suuid;
-       rs.sr_err = slap_build_sync_state_ctrl( &sop, &rs, &e_uuid,
+       rs.sr_err = syncprov_state_ctrl( &sop, &rs, &e_uuid,
                mode, ctrls, 0, 1, &cookie );
 
        rs.sr_entry = e;
@@ -803,6 +1047,8 @@ syncprov_detach_op( Operation *op, syncops *so )
                        op2->ors_attrs[i].an_name.bv_val = ptr;
                        ptr = lutil_strcopy( ptr, op->ors_attrs[i].an_name.bv_val ) + 1;
                }
+               op2->ors_attrs[i].an_name.bv_val = NULL;
+               op2->ors_attrs[i].an_name.bv_len = 0;
        } else {
                ptr = (char *)(op2->o_hdr + 1);
        }
@@ -833,7 +1079,7 @@ syncprov_search_response( Operation *op, SlapReply *rs )
        searchstate *ss = op->o_callback->sc_private;
        slap_overinst *on = ss->ss_on;
        syncprov_info_t         *si = on->on_bi.bi_private;
-       syncrepl_state *srs = op->o_controls[sync_cid];
+       sync_control *srs = op->o_controls[sync_cid];
 
        if ( rs->sr_type == REP_SEARCH || rs->sr_type == REP_SEARCHREF ) {
                int i;
@@ -847,7 +1093,7 @@ syncprov_search_response( Operation *op, SlapReply *rs )
                rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2,
                        op->o_tmpmemctx );
                rs->sr_ctrls[1] = NULL;
-               rs->sr_err = slap_build_sync_state_ctrl( op, rs, rs->sr_entry,
+               rs->sr_err = syncprov_state_ctrl( op, rs, rs->sr_entry,
                        LDAP_SYNC_ADD, rs->sr_ctrls, 0, 0, NULL );
        } else if ( rs->sr_type == REP_RESULT && rs->sr_err == LDAP_SUCCESS ) {
                struct berval cookie;
@@ -861,13 +1107,13 @@ syncprov_search_response( Operation *op, SlapReply *rs )
                        rs->sr_ctrls = op->o_tmpalloc( sizeof(LDAPControl *)*2,
                                op->o_tmpmemctx );
                        rs->sr_ctrls[1] = NULL;
-                       rs->sr_err = slap_build_sync_done_ctrl( op, rs, rs->sr_ctrls,
+                       rs->sr_err = syncprov_done_ctrl( op, rs, rs->sr_ctrls,
                                0, 1, &cookie, LDAP_SYNC_REFRESH_PRESENTS );
                } else {
                        int locked = 0;
                /* It's RefreshAndPersist, transition to Persist phase */
                        rs->sr_rspoid = LDAP_SYNC_INFO;
-                       slap_send_syncinfo( op, rs, rs->sr_nentries ?
+                       syncprov_sendinfo( op, rs, rs->sr_nentries ?
                                LDAP_TAG_SYNC_REFRESH_PRESENT : LDAP_TAG_SYNC_REFRESH_DELETE,
                                &cookie, 1, NULL, 0 );
                        /* Flush any queued persist messages */
@@ -934,7 +1180,7 @@ syncprov_op_search( Operation *op, SlapReply *rs )
        Filter *fand, *fava;
        syncops *sop = NULL;
        searchstate *ss;
-       syncrepl_state *srs;
+       sync_control *srs;
 
        if ( !(op->o_sync_mode & SLAP_SYNC_REFRESH) ) return SLAP_CB_CONTINUE;
 
@@ -1007,7 +1253,7 @@ syncprov_op_search( Operation *op, SlapReply *rs )
 
                                        ctrls[0] = NULL;
                                        ctrls[1] = NULL;
-                                       slap_build_sync_done_ctrl( op, rs, ctrls, 0, 0,
+                                       syncprov_done_ctrl( op, rs, ctrls, 0, 0,
                                                NULL, LDAP_SYNC_REFRESH_DELETES );
                                        rs->sr_ctrls = ctrls;
                                        rs->sr_err = LDAP_SUCCESS;
@@ -1141,8 +1387,6 @@ syncprov_db_init(
        uuid_anlist[0].an_desc = slap_schema.si_ad_entryUUID;
        uuid_anlist[0].an_name = slap_schema.si_ad_entryUUID->ad_cname;
 
-       sync_cid = slap_cids.sc_LDAPsync;
-
        return 0;
 }
 
@@ -1163,6 +1407,107 @@ syncprov_db_destroy(
        return 0;
 }
 
+static int syncprov_parseCtrl (
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl *ctrl )
+{
+       ber_tag_t tag;
+       BerElement *ber;
+       ber_int_t mode;
+       ber_len_t len;
+       struct berval cookie = BER_BVNULL;
+       sync_control *sr;
+       int rhint = 0;
+
+       if ( op->o_sync != SLAP_CONTROL_NONE ) {
+               rs->sr_text = "Sync control specified multiple times";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       if ( op->o_pagedresults != SLAP_CONTROL_NONE ) {
+               rs->sr_text = "Sync control specified with pagedResults control";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       if ( ctrl->ldctl_value.bv_len == 0 ) {
+               rs->sr_text = "Sync control value is empty (or absent)";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       /* Parse the control value
+        *      syncRequestValue ::= SEQUENCE {
+        *              mode   ENUMERATED {
+        *                      -- 0 unused
+        *                      refreshOnly             (1),
+        *                      -- 2 reserved
+        *                      refreshAndPersist       (3)
+        *              },
+        *              cookie  syncCookie OPTIONAL
+        *      }
+        */
+
+       ber = ber_init( &ctrl->ldctl_value );
+       if( ber == NULL ) {
+               rs->sr_text = "internal error";
+               return LDAP_OTHER;
+       }
+
+       if ( (tag = ber_scanf( ber, "{i" /*}*/, &mode )) == LBER_ERROR ) {
+               rs->sr_text = "Sync control : mode decoding error";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       switch( mode ) {
+       case LDAP_SYNC_REFRESH_ONLY:
+               mode = SLAP_SYNC_REFRESH;
+               break;
+       case LDAP_SYNC_REFRESH_AND_PERSIST:
+               mode = SLAP_SYNC_REFRESH_AND_PERSIST;
+               break;
+       default:
+               rs->sr_text = "Sync control : unknown update mode";
+               return LDAP_PROTOCOL_ERROR;
+       }
+
+       tag = ber_peek_tag( ber, &len );
+
+       if ( tag == LDAP_TAG_SYNC_COOKIE ) {
+               if (( ber_scanf( ber, /*{*/ "o", &cookie )) == LBER_ERROR ) {
+                       rs->sr_text = "Sync control : cookie decoding error";
+                       return LDAP_PROTOCOL_ERROR;
+               }
+       }
+       if ( tag == LDAP_TAG_RELOAD_HINT ) {
+               if (( ber_scanf( ber, /*{*/ "b", &rhint )) == LBER_ERROR ) {
+                       rs->sr_text = "Sync control : rhint decoding error";
+                       return LDAP_PROTOCOL_ERROR;
+               }
+       }
+       if (( ber_scanf( ber, /*{*/ "}")) == LBER_ERROR ) {
+                       rs->sr_text = "Sync control : decoding error";
+                       return LDAP_PROTOCOL_ERROR;
+       }
+       sr = op->o_tmpcalloc( 1, sizeof(struct sync_control), op->o_tmpmemctx );
+       sr->sr_rhint = rhint;
+       if (!BER_BVISNULL(&cookie)) {
+               ber_bvarray_add( &sr->sr_state.octet_str, &cookie );
+               slap_parse_sync_cookie( &sr->sr_state );
+       }
+
+       op->o_controls[sync_cid] = sr;
+
+       (void) ber_free( ber, 1 );
+
+       op->o_sync = ctrl->ldctl_iscritical
+               ? SLAP_CONTROL_CRITICAL
+               : SLAP_CONTROL_NONCRITICAL;
+
+       op->o_sync_mode |= mode;        /* o_sync_mode shares o_sync */
+
+       return LDAP_SUCCESS;
+}
+
 /* This overlay is set up for dynamic loading via moduleload. For static
  * configuration, you'll need to arrange for the slap_overinst to be
  * initialized and registered by some other function inside slapd.
@@ -1173,6 +1518,16 @@ static slap_overinst             syncprov;
 int
 syncprov_init()
 {
+       int rc;
+
+       rc = register_supported_control( LDAP_CONTROL_SYNC,
+               SLAP_CTRL_HIDE|SLAP_CTRL_SEARCH, NULL,
+               syncprov_parseCtrl, &sync_cid );
+       if ( rc != LDAP_SUCCESS ) {
+               fprintf( stderr, "Failed to register control %d\n", rc );
+               return rc;
+       }
+
        syncprov.on_bi.bi_type = "syncprov";
        syncprov.on_bi.bi_db_init = syncprov_db_init;
        syncprov.on_bi.bi_db_config = syncprov_db_config;
index 2f9bf95b22458143c185d9525331fe20c9022065..d3e8f64c1560d26a14a693a3dbd4076096cb5b32 100644 (file)
@@ -455,7 +455,6 @@ LDAP_SLAPD_F (void) connection2anonymous LDAP_P((Connection *));
 LDAP_SLAPD_F (void) connection_fake_init LDAP_P((
        Connection *conn,
        Operation *op,
-       Opheader *ohdr,
        void *threadctx ));
 LDAP_SLAPD_F (void) connection_assign_nextid LDAP_P((Connection *));
 
@@ -728,18 +727,6 @@ LDAP_SLAPD_V (int) krbv4_ldap_auth();
 /*
  * ldapsync.c
  */
-LDAP_SLAPD_F (int) slap_build_sync_state_ctrl LDAP_P((
-                               Operation *, SlapReply *, Entry *, int,
-                               LDAPControl **, int, int, struct berval * ));
-LDAP_SLAPD_F (int) slap_build_sync_done_ctrl LDAP_P((
-                               Operation *, SlapReply *, LDAPControl **,
-                               int, int, struct berval *, int ));
-LDAP_SLAPD_F (int) slap_build_sync_state_ctrl_from_slog LDAP_P((
-                               Operation *, SlapReply *, struct slog_entry *, int,
-                               LDAPControl **, int, int, struct berval * ));
-LDAP_SLAPD_F (int) slap_send_syncinfo LDAP_P((
-                               Operation *, SlapReply *, int,
-                               struct berval *, int, BerVarray, int ));
 LDAP_SLAPD_F (void) slap_compose_sync_cookie LDAP_P((
                                Operation *, struct berval *, struct berval *, int, int ));
 LDAP_SLAPD_F (void) slap_sync_cookie_free LDAP_P((
index c9e2453a88ee74a0000b2e4efb1cf6546a9ac924..dd91c87a1aaf17c8ebb2b0d79d020c82fd4bc6b6 100644 (file)
@@ -222,10 +222,10 @@ do_search(
        rs->sr_err = frontendDB->be_search( op, rs );
 
 return_results:;
+#if 0  /* DELETE ME */
        if ( ( op->o_sync_mode & SLAP_SYNC_PERSIST ) ) {
                return rs->sr_err;
        }
-#if 0
        if ( ( op->o_sync_slog_size != -1 ) ) {
                return rs->sr_err;
        }
@@ -351,6 +351,7 @@ fe_op_search( Operation *op, SlapReply *rs )
         * if we don't hold it.
         */
 
+#if 0  /* DELETE ME */
        /* Sync control overrides manageDSAit */
 
        if ( manageDSAit != SLAP_CONTROL_NONE ) {
@@ -362,6 +363,9 @@ fe_op_search( Operation *op, SlapReply *rs )
        } else {
                be_manageDSAit = manageDSAit;
        }
+#else
+               be_manageDSAit = manageDSAit;
+#endif
 
        op->o_bd = select_backend( &op->o_req_ndn, be_manageDSAit, 1 );
        if ( op->o_bd == NULL ) {
index 8bcbdcdbbe0ab7fb1e0d92e7e8b100acba9b0200..3d21368c1809ae13720c5c138bedb45dc2ca17b6 100644 (file)
@@ -26,7 +26,7 @@
 #include "slap.h"
 #include "lutil_ldap.h"
 
-#if 0
+#if 0  /* DELETE ME -- needs to be reimplemented with syncprov overlay */
 int
 slap_send_session_log(
        Operation *op,
index eb8ad857645bbea7ed4609fab3d40645e05fc132..f0bd6fa6007076d744a15fa61cd1b448dd0ab795 100644 (file)
@@ -2129,13 +2129,8 @@ struct slap_control_ids {
        int sc_treeDelete;
        int sc_searchOptions;
        int sc_subentries;
-       int sc_LDAPsync;
 };
 
-typedef struct syncrepl_state {
-       struct sync_cookie sr_state;
-       int sr_rhint;
-} syncrepl_state;
 /*
  * represents an operation pending from an ldap client
  */
@@ -2335,14 +2330,6 @@ typedef struct slap_op {
 
 #define get_pagedresults(op)                   ((int)(op)->o_pagedresults)
 
-#define        o_sync  o_ctrlflag[slap_cids.sc_LDAPsync]
-       /* o_sync_mode uses data bits of o_sync */
-#define        o_sync_mode     o_ctrlflag[slap_cids.sc_LDAPsync]
-
-#define SLAP_SYNC_NONE                                 (LDAP_SYNC_NONE<<SLAP_CONTROL_SHIFT)
-#define SLAP_SYNC_REFRESH                              (LDAP_SYNC_REFRESH_ONLY<<SLAP_CONTROL_SHIFT)
-#define SLAP_SYNC_PERSIST                              (LDAP_SYNC_RESERVED<<SLAP_CONTROL_SHIFT)
-#define SLAP_SYNC_REFRESH_AND_PERSIST  (LDAP_SYNC_REFRESH_AND_PERSIST<<SLAP_CONTROL_SHIFT)
 #ifdef BDB_PSEARCH
        struct sync_cookie      o_sync_state;
        int                                     o_sync_rhint;
@@ -2381,6 +2368,7 @@ typedef struct slap_op {
        int     o_delete_glue_parent;
 
 } Operation;
+#define        OPERATION_BUFFER_SIZE   (sizeof(Operation)+sizeof(Opheader)+SLAP_MAX_CIDS*sizeof(void *))
 
 #define send_ldap_error( op, rs, err, text ) do { \
                (rs)->sr_err = err; (rs)->sr_text = text; \
index b7d192870617b2cf62cd0200ea4e5e7f05632bc3..6e8e5e3653dfb3f1c8f7682d996cda911aab7067 100644 (file)
@@ -40,8 +40,8 @@ slapacl( int argc, char **argv )
        int                     rc = EXIT_SUCCESS;
        const char              *progname = "slapacl";
        Connection              conn = {0};
-       Operation               op = {0};
-       Opheader                ohdr = {0};
+       char opbuf[OPERATION_BUFFER_SIZE];
+       Operation               *op;
        Entry                   e = { 0 };
        char                    *attr = NULL;
 
@@ -50,10 +50,11 @@ slapacl( int argc, char **argv )
        argv = &argv[ optind ];
        argc -= optind;
 
-       connection_fake_init( &conn, &op, &ohdr, &conn );
+       op = (Operation *)opbuf;
+       connection_fake_init( &conn, op, &conn );
 
        if ( !BER_BVISNULL( &authcID ) ) {
-               rc = slap_sasl_getdn( &conn, &op, &authcID, NULL,
+               rc = slap_sasl_getdn( &conn, op, &authcID, NULL,
                                &authcDN, SLAP_GETDN_AUTHCID );
                if ( rc != LDAP_SUCCESS ) {
                        fprintf( stderr, "ID: <%s> check failed %d (%s)\n",
@@ -93,10 +94,10 @@ slapacl( int argc, char **argv )
                goto destroy;
        }
 
-       op.o_bd = be;
+       op->o_bd = be;
        if ( !BER_BVISNULL( &authcDN ) ) {
-               op.o_dn = authcDN;
-               op.o_ndn = authcDN;
+               op->o_dn = authcDN;
+               op->o_ndn = authcDN;
        }
 
        if ( argc == 0 ) {
@@ -150,7 +151,7 @@ slapacl( int argc, char **argv )
                        break;
                }
 
-               rc = access_allowed_mask( &op, &e, desc, &val, access,
+               rc = access_allowed_mask( op, &e, desc, &val, access,
                                NULL, &mask );
 
                if ( accessstr ) {
index 06dd27709d50529250e30993ec36cf8d866e26b0..73b2ceb93da12d5e7509ce91d998fa06af863251 100644 (file)
@@ -80,20 +80,21 @@ slapauth( int argc, char **argv )
        int                     rc = EXIT_SUCCESS;
        const char              *progname = "slapauth";
        Connection              conn = {0};
-       Operation               op = {0};
-       Opheader                ohdr = {0};
+       char                    opbuf[OPERATION_BUFFER_SIZE];
+       Operation               *op;
 
        slap_tool_init( progname, SLAPAUTH, argc, argv );
 
        argv = &argv[ optind ];
        argc -= optind;
 
-       connection_fake_init( &conn, &op, &ohdr, &conn );
+       op = (Operation *)opbuf;
+       connection_fake_init( &conn, op, &conn );
 
        if ( !BER_BVISNULL( &authzID ) ) {
                struct berval   authzdn;
                
-               rc = slap_sasl_getdn( &conn, &op, &authzID, NULL, &authzdn,
+               rc = slap_sasl_getdn( &conn, op, &authzID, NULL, &authzdn,
                                SLAP_GETDN_AUTHZID );
                if ( rc != LDAP_SUCCESS ) {
                        fprintf( stderr, "authzID: <%s> check failed %d (%s)\n",
@@ -110,7 +111,7 @@ slapauth( int argc, char **argv )
 
        if ( !BER_BVISNULL( &authcID ) ) {
                if ( !BER_BVISNULL( &authzID ) || argc == 0 ) {
-                       rc = do_check( &conn, &op, &authcID );
+                       rc = do_check( &conn, op, &authcID );
                        goto destroy;
                }
 
@@ -119,7 +120,7 @@ slapauth( int argc, char **argv )
                
                        ber_str2bv( argv[ 0 ], 0, 0, &authzID );
 
-                       rc = slap_sasl_getdn( &conn, &op, &authzID, NULL, &authzdn,
+                       rc = slap_sasl_getdn( &conn, op, &authzID, NULL, &authzdn,
                                        SLAP_GETDN_AUTHZID );
                        if ( rc != LDAP_SUCCESS ) {
                                fprintf( stderr, "authzID: <%s> check failed %d (%s)\n",
@@ -134,9 +135,9 @@ slapauth( int argc, char **argv )
 
                        authzID = authzdn;
 
-                       rc = do_check( &conn, &op, &authcID );
+                       rc = do_check( &conn, op, &authcID );
 
-                       op.o_tmpfree( authzID.bv_val, op.o_tmpmemctx );
+                       op->o_tmpfree( authzID.bv_val, op->o_tmpmemctx );
                        BER_BVZERO( &authzID );
 
                        if ( rc && !continuemode ) {
@@ -152,7 +153,7 @@ slapauth( int argc, char **argv )
 
                ber_str2bv( argv[ 0 ], 0, 0, &id );
 
-               rc = do_check( &conn, &op, &id );
+               rc = do_check( &conn, op, &id );
 
                if ( rc && !continuemode ) {
                        goto destroy;
@@ -161,7 +162,7 @@ slapauth( int argc, char **argv )
 
 destroy:;
        if ( !BER_BVISNULL( &authzID ) ) {
-               op.o_tmpfree( authzID.bv_val, op.o_tmpmemctx );
+               op->o_tmpfree( authzID.bv_val, op->o_tmpmemctx );
        }
        slap_tool_destroy();
 
index 31d308ef5b4cc9e8dc2a6d90a498ed9e27240b12..3dc75b79aef813cb2c9d4f2b8af4e8bcc6a9d561 100644 (file)
@@ -889,8 +889,8 @@ do_syncrepl(
        struct re_s* rtask = arg;
        syncinfo_t *si = ( syncinfo_t * ) rtask->arg;
        Connection conn = {0};
-       Operation op = {0};
-       Opheader ohdr = {0};
+       char opbuf[OPERATION_BUFFER_SIZE];
+       Operation *op;
        int rc = LDAP_SUCCESS;
        int first = 0;
        int dostop = 0;
@@ -919,30 +919,31 @@ do_syncrepl(
                return NULL;
        }
 
-       connection_fake_init( &conn, &op, &ohdr, ctx );
+       op = (Operation *)opbuf;
+       connection_fake_init( &conn, op, ctx );
 
        /* use global malloc for now */
-       op.o_tmpmemctx = NULL;
-       op.o_tmpmfuncs = &ch_mfuncs;
+       op->o_tmpmemctx = NULL;
+       op->o_tmpmfuncs = &ch_mfuncs;
 
-       op.o_dn = si->si_updatedn;
-       op.o_ndn = si->si_updatedn;
-       op.o_managedsait = SLAP_CONTROL_NONCRITICAL;
-       op.o_bd = be = si->si_be;
+       op->o_dn = si->si_updatedn;
+       op->o_ndn = si->si_updatedn;
+       op->o_managedsait = SLAP_CONTROL_NONCRITICAL;
+       op->o_bd = be = si->si_be;
 
        /* Establish session, do search */
        if ( !si->si_ld ) {
                first = 1;
                si->si_refreshDelete = 0;
                si->si_refreshPresent = 0;
-               rc = do_syncrep1( &op, si );
+               rc = do_syncrep1( op, si );
        }
 
        /* Process results */
        if ( rc == LDAP_SUCCESS ) {
                ldap_get_option( si->si_ld, LDAP_OPT_DESC, &s );
 
-               rc = do_syncrep2( &op, si );
+               rc = do_syncrep2( op, si );
 
                if ( abs(si->si_type) == LDAP_SYNC_REFRESH_AND_PERSIST ) {
                        /* If we succeeded, enable the connection for further listening.
@@ -1293,7 +1294,7 @@ syncrepl_entry(
        if ( rs_search.sr_err == LDAP_SUCCESS &&
                 !BER_BVISNULL( &si->si_syncUUID_ndn ))
        {
-#if 0
+#if 0  /* DELETE ME -- and fix this to do realy Modifies */
                char *subseq_ptr;
 
                if ( syncstate != LDAP_SYNC_DELETE ) {
@@ -1346,10 +1347,6 @@ syncrepl_entry(
                op->o_req_dn = org_req_dn;
                op->o_req_ndn = org_req_ndn;
                op->o_delete_glue_parent = 0;
-
-#if 0
-               op->o_no_psearch = 0;
-#endif
        }
 
        switch ( syncstate ) {