diff options
author | Kamen Mazdrashki <kamenim@samba.org> | 2010-09-10 02:02:56 +0300 |
---|---|---|
committer | Kamen Mazdrashki <kamenim@samba.org> | 2010-09-10 13:08:24 +0300 |
commit | 611cd51096a8de8fdf43d0c9b639314bd7ebd2c2 (patch) | |
tree | 8108bcd4249abff2e0771dba098271a63c9e588a /source4/rpc_server/drsuapi | |
parent | d08439d42b4a04279e74bc3625cb672eb22007fe (diff) | |
download | samba-611cd51096a8de8fdf43d0c9b639314bd7ebd2c2.tar.gz samba-611cd51096a8de8fdf43d0c9b639314bd7ebd2c2.tar.bz2 samba-611cd51096a8de8fdf43d0c9b639314bd7ebd2c2.zip |
s4-drs: Hanlde extended operations only once
Most of extended operations I know of work like:
1. do extended operation
2. collect a set of objects to return and start replication cycle
3. continue returning object as we have no more to give
This way we ensure we are doing 1. only once
Diffstat (limited to 'source4/rpc_server/drsuapi')
-rw-r--r-- | source4/rpc_server/drsuapi/getncchanges.c | 85 |
1 files changed, 45 insertions, 40 deletions
diff --git a/source4/rpc_server/drsuapi/getncchanges.c b/source4/rpc_server/drsuapi/getncchanges.c index d94b152edf..78c280a85a 100644 --- a/source4/rpc_server/drsuapi/getncchanges.c +++ b/source4/rpc_server/drsuapi/getncchanges.c @@ -1143,46 +1143,6 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ req8->uptodateness_vector = NULL; } - /* we don't yet support extended operations */ - switch (req8->extended_op) { - case DRSUAPI_EXOP_NONE: - break; - - case DRSUAPI_EXOP_FSMO_RID_ALLOC: - werr = getncchanges_rid_alloc(b_state, mem_ctx, req8, &r->out.ctr->ctr6); - W_ERROR_NOT_OK_RETURN(werr); - search_dn = ldb_get_default_basedn(sam_ctx); - break; - - case DRSUAPI_EXOP_REPL_SECRET: - werr = getncchanges_repl_secret(b_state, mem_ctx, req8, user_sid, &r->out.ctr->ctr6); - r->out.result = werr; - NDR_PRINT_FUNCTION_DEBUG(drsuapi_DsGetNCChanges, NDR_BOTH, r); - W_ERROR_NOT_OK_RETURN(werr); - break; - - case DRSUAPI_EXOP_FSMO_REQ_ROLE: - werr = getncchanges_change_master(b_state, mem_ctx, req8, &r->out.ctr->ctr6); - W_ERROR_NOT_OK_RETURN(werr); - break; - - case DRSUAPI_EXOP_FSMO_RID_REQ_ROLE: - werr = getncchanges_change_master(b_state, mem_ctx, req8, &r->out.ctr->ctr6); - W_ERROR_NOT_OK_RETURN(werr); - break; - - case DRSUAPI_EXOP_FSMO_REQ_PDC: - werr = getncchanges_change_master(b_state, mem_ctx, req8, &r->out.ctr->ctr6); - W_ERROR_NOT_OK_RETURN(werr); - break; - - case DRSUAPI_EXOP_FSMO_ABANDON_ROLE: - case DRSUAPI_EXOP_REPL_OBJ: - DEBUG(0,(__location__ ": Request for DsGetNCChanges unsupported extended op 0x%x\n", - (unsigned)req8->extended_op)); - return WERR_DS_DRA_NOT_SUPPORTED; - } - getnc_state = b_state->getncchanges_state; /* see if a previous replication has been abandoned */ @@ -1210,6 +1170,51 @@ WERROR dcesrv_drsuapi_DsGetNCChanges(struct dcesrv_call_state *dce_call, TALLOC_ ret = ldb_dn_compare(getnc_state->ncRoot_dn, ldb_get_schema_basedn(b_state->sam_ctx)); getnc_state->is_schema_nc = (0 == ret); + + /* + * This is the first replication cycle and it is + * a good place to handle extended operations + * + * FIXME: we don't fully support extended operations yet + */ + switch (req8->extended_op) { + case DRSUAPI_EXOP_NONE: + break; + + case DRSUAPI_EXOP_FSMO_RID_ALLOC: + werr = getncchanges_rid_alloc(b_state, mem_ctx, req8, &r->out.ctr->ctr6); + W_ERROR_NOT_OK_RETURN(werr); + search_dn = ldb_get_default_basedn(sam_ctx); + break; + + case DRSUAPI_EXOP_REPL_SECRET: + werr = getncchanges_repl_secret(b_state, mem_ctx, req8, user_sid, &r->out.ctr->ctr6); + r->out.result = werr; + NDR_PRINT_FUNCTION_DEBUG(drsuapi_DsGetNCChanges, NDR_BOTH, r); + W_ERROR_NOT_OK_RETURN(werr); + break; + + case DRSUAPI_EXOP_FSMO_REQ_ROLE: + werr = getncchanges_change_master(b_state, mem_ctx, req8, &r->out.ctr->ctr6); + W_ERROR_NOT_OK_RETURN(werr); + break; + + case DRSUAPI_EXOP_FSMO_RID_REQ_ROLE: + werr = getncchanges_change_master(b_state, mem_ctx, req8, &r->out.ctr->ctr6); + W_ERROR_NOT_OK_RETURN(werr); + break; + + case DRSUAPI_EXOP_FSMO_REQ_PDC: + werr = getncchanges_change_master(b_state, mem_ctx, req8, &r->out.ctr->ctr6); + W_ERROR_NOT_OK_RETURN(werr); + break; + + case DRSUAPI_EXOP_FSMO_ABANDON_ROLE: + case DRSUAPI_EXOP_REPL_OBJ: + DEBUG(0,(__location__ ": Request for DsGetNCChanges unsupported extended op 0x%x\n", + (unsigned)req8->extended_op)); + return WERR_DS_DRA_NOT_SUPPORTED; + } } if (!ldb_dn_validate(getnc_state->ncRoot_dn) || |