diff options
author | Stefan Metzmacher <metze@samba.org> | 2016-08-08 09:10:13 +0200 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2016-08-11 00:49:14 +0200 |
commit | 5ee6f9371570f968122c6eb1bceeb9bb0518bb4c (patch) | |
tree | 373912eeaab612aac5834699f1497934fb84bf47 /source4 | |
parent | 2e6860df7149559df84ed3995ed36332ccb0f649 (diff) | |
download | samba-5ee6f9371570f968122c6eb1bceeb9bb0518bb4c.tar.gz |
s4:dsdb/schema: split out a dsdb_attribute_drsuapi_remote_to_local() function
BUG: https://bugzilla.samba.org/show_bug.cgi?id=12128
Signed-off-by: Stefan Metzmacher <metze@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
Diffstat (limited to 'source4')
-rw-r--r-- | source4/dsdb/schema/schema_syntax.c | 70 |
1 files changed, 53 insertions, 17 deletions
diff --git a/source4/dsdb/schema/schema_syntax.c b/source4/dsdb/schema/schema_syntax.c index e3f1421e544..03251dcd89b 100644 --- a/source4/dsdb/schema/schema_syntax.c +++ b/source4/dsdb/schema/schema_syntax.c @@ -2697,45 +2697,49 @@ const struct dsdb_syntax *dsdb_syntax_for_attribute(const struct dsdb_attribute return NULL; } -WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb, - const struct dsdb_schema *schema, - const struct dsdb_schema_prefixmap *pfm_remote, - const struct drsuapi_DsReplicaAttribute *in, - TALLOC_CTX *mem_ctx, - struct ldb_message_element *out, - enum drsuapi_DsAttributeId *local_attid_as_enum) +WERROR dsdb_attribute_drsuapi_remote_to_local(const struct dsdb_syntax_ctx *ctx, + enum drsuapi_DsAttributeId remote_attid_as_enum, + enum drsuapi_DsAttributeId *local_attid_as_enum, + const struct dsdb_attribute **_sa) { + TALLOC_CTX *frame = talloc_stackframe(); const struct dsdb_attribute *sa; - struct dsdb_syntax_ctx syntax_ctx; uint32_t attid_local; + bool ok; - /* use default syntax conversion context */ - dsdb_syntax_ctx_init(&syntax_ctx, ldb, schema); - syntax_ctx.pfm_remote = pfm_remote; + if (ctx->pfm_remote == NULL) { + smb_panic(__location__); + } - switch (dsdb_pfm_get_attid_type(in->attid)) { + switch (dsdb_pfm_get_attid_type(remote_attid_as_enum)) { case DSDB_ATTID_TYPE_PFM: /* map remote ATTID to local ATTID */ - if (!dsdb_syntax_attid_from_remote_attid(&syntax_ctx, mem_ctx, in->attid, &attid_local)) { + ok = dsdb_syntax_attid_from_remote_attid(ctx, frame, + remote_attid_as_enum, + &attid_local); + if (!ok) { DEBUG(0,(__location__ ": Can't find local ATTID for 0x%08X\n", - in->attid)); + remote_attid_as_enum)); + TALLOC_FREE(frame); return WERR_DS_ATT_NOT_DEF_IN_SCHEMA; } break; case DSDB_ATTID_TYPE_INTID: /* use IntId value directly */ - attid_local = in->attid; + attid_local = remote_attid_as_enum; break; default: /* we should never get here */ DEBUG(0,(__location__ ": Invalid ATTID type passed for conversion - 0x%08X\n", - in->attid)); + remote_attid_as_enum)); + TALLOC_FREE(frame); return WERR_INVALID_PARAMETER; } - sa = dsdb_attribute_by_attributeID_id(schema, attid_local); + sa = dsdb_attribute_by_attributeID_id(ctx->schema, attid_local); if (!sa) { DEBUG(1,(__location__ ": Unknown attributeID_id 0x%08X\n", in->attid)); + TALLOC_FREE(frame); return WERR_DS_ATT_NOT_DEF_IN_SCHEMA; } @@ -2748,6 +2752,38 @@ WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb, *local_attid_as_enum = (enum drsuapi_DsAttributeId)attid_local; } + if (_sa != NULL) { + *_sa = sa; + } + + TALLOC_FREE(frame); + return WERR_OK; +} + +WERROR dsdb_attribute_drsuapi_to_ldb(struct ldb_context *ldb, + const struct dsdb_schema *schema, + const struct dsdb_schema_prefixmap *pfm_remote, + const struct drsuapi_DsReplicaAttribute *in, + TALLOC_CTX *mem_ctx, + struct ldb_message_element *out, + enum drsuapi_DsAttributeId *local_attid_as_enum) +{ + struct dsdb_syntax_ctx syntax_ctx; + const struct dsdb_attribute *sa = NULL; + WERROR werr; + + /* use default syntax conversion context */ + dsdb_syntax_ctx_init(&syntax_ctx, ldb, schema); + syntax_ctx.pfm_remote = pfm_remote; + + werr = dsdb_attribute_drsuapi_remote_to_local(&syntax_ctx, + in->attid, + local_attid_as_enum, + &sa); + if (!W_ERROR_IS_OK(werr)) { + return werr; + } + return sa->syntax->drsuapi_to_ldb(&syntax_ctx, sa, in, mem_ctx, out); } |