Don't treat the DN+binary syntax as a DN.
[kai/samba.git] / source4 / dsdb / schema / schema_syntax.c
index f480c83f70a87db4c94e36268aefa149bf9c177e..7aed08605bef9aa5c299a20b88d7410199e0bc8f 100644 (file)
@@ -2,11 +2,13 @@
    Unix SMB/CIFS mplementation.
    DSDB schema syntaxes
    
    Unix SMB/CIFS mplementation.
    DSDB schema syntaxes
    
-   Copyright (C) Stefan Metzmacher 2006
-    
+   Copyright (C) Stefan Metzmacher <metze@samba.org> 2006
+   Copyright (C) Simo Sorce 2005
+   Copyright (C) Andrew Bartlett <abartlet@samba.org> 2008
+
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
    (at your option) any later version.
    
    This program is distributed in the hope that it will be useful,
@@ -15,8 +17,7 @@
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
    GNU General Public License for more details.
    
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
    
 */
 #include "includes.h"
    
 */
 #include "includes.h"
@@ -24,7 +25,7 @@
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "lib/ldb/include/ldb.h"
 #include "system/time.h"
 #include "librpc/gen_ndr/ndr_drsuapi.h"
 #include "lib/ldb/include/ldb.h"
 #include "system/time.h"
-#include "lib/charset/charset.h"
+#include "../lib/util/charset/charset.h"
 #include "librpc/ndr/libndr.h"
 
 static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema,
 #include "librpc/ndr/libndr.h"
 
 static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema,
@@ -39,14 +40,14 @@ static WERROR dsdb_syntax_FOOBAR_drsuapi_to_ldb(const struct dsdb_schema *schema
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
                char *str;
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
@@ -77,18 +78,11 @@ static WERROR dsdb_syntax_BOOL_drsuapi_to_ldb(const struct dsdb_schema *schema,
 {
        uint32_t i;
 
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_isSingleValued:
-case DRSUAPI_ATTRIBUTE_showInAdvancedViewOnly:
-case DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet:
-       return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -96,15 +90,15 @@ case DRSUAPI_ATTRIBUTE_isMemberOfPartialAttributeSet:
                uint32_t v;
                char *str;
 
                uint32_t v;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 4) {
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                if (v != 0) {
                        str = talloc_strdup(out->values, "TRUE");
 
                if (v != 0) {
                        str = talloc_strdup(out->values, "TRUE");
@@ -133,18 +127,18 @@ static WERROR dsdb_syntax_BOOL_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -169,23 +163,11 @@ static WERROR dsdb_syntax_INT32_drsuapi_to_ldb(const struct dsdb_schema *schema,
 {
        uint32_t i;
 
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_instanceType:
-case DRSUAPI_ATTRIBUTE_rangeLower:
-case DRSUAPI_ATTRIBUTE_rangeUpper:
-case DRSUAPI_ATTRIBUTE_objectVersion:
-case DRSUAPI_ATTRIBUTE_oMSyntax:
-case DRSUAPI_ATTRIBUTE_searchFlags:
-case DRSUAPI_ATTRIBUTE_systemFlags:
-case DRSUAPI_ATTRIBUTE_msDS_Behavior_Version:
-       return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -193,15 +175,15 @@ case DRSUAPI_ATTRIBUTE_msDS_Behavior_Version:
                int32_t v;
                char *str;
 
                int32_t v;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 4) {
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = IVALS(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = IVALS(in->value_ctr.values[i].blob->data, 0);
 
                str = talloc_asprintf(out->values, "%d", v);
                W_ERROR_HAVE_NO_MEMORY(str);
 
                str = talloc_asprintf(out->values, "%d", v);
                W_ERROR_HAVE_NO_MEMORY(str);
@@ -225,12 +207,12 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -238,7 +220,7 @@ static WERROR dsdb_syntax_INT32_ldb_to_drsuapi(const struct dsdb_schema *schema,
        for (i=0; i < in->num_values; i++) {
                int32_t v;
 
        for (i=0; i < in->num_values; i++) {
                int32_t v;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -263,7 +245,7 @@ static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -271,17 +253,17 @@ static WERROR dsdb_syntax_INT64_drsuapi_to_ldb(const struct dsdb_schema *schema,
                int64_t v;
                char *str;
 
                int64_t v;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 8) {
+               if (in->value_ctr.values[i].blob->length != 8) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = BVALS(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = BVALS(in->value_ctr.values[i].blob->data, 0);
 
 
-               str = talloc_asprintf(out->values, "%lld", v);
+               str = talloc_asprintf(out->values, "%lld", (long long int)v);
                W_ERROR_HAVE_NO_MEMORY(str);
 
                out->values[i] = data_blob_string_const(str);
                W_ERROR_HAVE_NO_MEMORY(str);
 
                out->values[i] = data_blob_string_const(str);
@@ -303,12 +285,12 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -316,7 +298,7 @@ static WERROR dsdb_syntax_INT64_ldb_to_drsuapi(const struct dsdb_schema *schema,
        for (i=0; i < in->num_values; i++) {
                int64_t v;
 
        for (i=0; i < in->num_values; i++) {
                int64_t v;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -341,7 +323,7 @@ static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(const struct dsdb_schema *sc
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -350,15 +332,15 @@ static WERROR dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb(const struct dsdb_schema *sc
                time_t t;
                char *str;
 
                time_t t;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 8) {
+               if (in->value_ctr.values[i].blob->length != 8) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = BVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = BVAL(in->value_ctr.values[i].blob->data, 0);
                v *= 10000000;
                t = nt_time_to_unix(v);
 
                v *= 10000000;
                t = nt_time_to_unix(v);
 
@@ -392,12 +374,12 @@ static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_schema *sc
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -406,7 +388,7 @@ static WERROR dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi(const struct dsdb_schema *sc
                NTTIME v;
                time_t t;
 
                NTTIME v;
                time_t t;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -433,7 +415,7 @@ static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -442,15 +424,15 @@ static WERROR dsdb_syntax_NTTIME_drsuapi_to_ldb(const struct dsdb_schema *schema
                time_t t;
                char *str;
 
                time_t t;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 8) {
+               if (in->value_ctr.values[i].blob->length != 8) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = BVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = BVAL(in->value_ctr.values[i].blob->data, 0);
                v *= 10000000;
                t = nt_time_to_unix(v);
 
                v *= 10000000;
                t = nt_time_to_unix(v);
 
@@ -476,12 +458,12 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -490,7 +472,7 @@ static WERROR dsdb_syntax_NTTIME_ldb_to_drsuapi(const struct dsdb_schema *schema
                NTTIME v;
                time_t t;
 
                NTTIME v;
                time_t t;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_talloc(blobs, NULL, 8);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -513,31 +495,25 @@ static WERROR dsdb_syntax_DATA_BLOB_drsuapi_to_ldb(const struct dsdb_schema *sch
 {
        uint32_t i;
 
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_invocationId:
-case DRSUAPI_ATTRIBUTE_schemaIDGUID:
-       return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
                out->values[i] = data_blob_dup_talloc(out->values,
                        return WERR_FOOBAR;
                }
 
                out->values[i] = data_blob_dup_talloc(out->values,
-                                                     in->value_ctr.data_blob.values[i].data);
+                                                     in->value_ctr.values[i].blob);
                W_ERROR_HAVE_NO_MEMORY(out->values[i].data);
        }
 
                W_ERROR_HAVE_NO_MEMORY(out->values[i].data);
        }
 
@@ -557,18 +533,18 @@ static WERROR dsdb_syntax_DATA_BLOB_ldb_to_drsuapi(const struct dsdb_schema *sch
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_dup_talloc(blobs, &in->values[i]);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_dup_talloc(blobs, &in->values[i]);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -589,7 +565,7 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *sche
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -598,11 +574,15 @@ static WERROR _dsdb_syntax_OID_obj_drsuapi_to_ldb(const struct dsdb_schema *sche
                const struct dsdb_class *c;
                const char *str;
 
                const struct dsdb_class *c;
                const char *str;
 
-               if (in->value_ctr.object_class_id.values[i].objectClassId == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
+                       return WERR_FOOBAR;
+               }
+
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = *in->value_ctr.object_class_id.values[i].objectClassId;
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                c = dsdb_class_by_governsID_id(schema, v);
                if (!c) {
 
                c = dsdb_class_by_governsID_id(schema, v);
                if (!c) {
@@ -631,7 +611,7 @@ static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *sche
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -640,11 +620,15 @@ static WERROR _dsdb_syntax_OID_oid_drsuapi_to_ldb(const struct dsdb_schema *sche
                WERROR status;
                const char *str;
 
                WERROR status;
                const char *str;
 
-               if (in->value_ctr.oid.values[i].value == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = *in->value_ctr.oid.values[i].value;
+               if (in->value_ctr.values[i].blob->length != 4) {
+                       return WERR_FOOBAR;
+               }
+
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                status = dsdb_map_int2oid(schema, v, out->values, &str);
                W_ERROR_NOT_OK_RETURN(status);
 
                status = dsdb_map_int2oid(schema, v, out->values, &str);
                W_ERROR_NOT_OK_RETURN(status);
@@ -676,7 +660,7 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -685,15 +669,15 @@ static WERROR dsdb_syntax_OID_drsuapi_to_ldb(const struct dsdb_schema *schema,
                const char *name;
                char *str;
 
                const char *name;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length != 4) {
+               if (in->value_ctr.values[i].blob->length != 4) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               v = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               v = IVAL(in->value_ctr.values[i].blob->data, 0);
 
                name = dsdb_lDAPDisplayName_by_id(schema, v);
                if (!name) {
 
                name = dsdb_lDAPDisplayName_by_id(schema, v);
                if (!name) {
@@ -730,12 +714,12 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return dsdb_syntax_FOOBAR_ldb_to_drsuapi(schema, attr, in, mem_ctx, out);
        }
 
                return dsdb_syntax_FOOBAR_ldb_to_drsuapi(schema, attr, in, mem_ctx, out);
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -743,7 +727,7 @@ static WERROR dsdb_syntax_OID_ldb_to_drsuapi(const struct dsdb_schema *schema,
        for (i=0; i < in->num_values; i++) {
                uint32_t v;
 
        for (i=0; i < in->num_values; i++) {
                uint32_t v;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
 
                blobs[i] = data_blob_talloc(blobs, NULL, 4);
                W_ERROR_HAVE_NO_MEMORY(blobs[i].data);
@@ -764,22 +748,11 @@ static WERROR dsdb_syntax_UNICODE_drsuapi_to_ldb(const struct dsdb_schema *schem
 {
        uint32_t i;
 
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_description:
-case DRSUAPI_ATTRIBUTE_adminDisplayName:
-case DRSUAPI_ATTRIBUTE_adminDescription:
-case DRSUAPI_ATTRIBUTE_lDAPDisplayName:
-case DRSUAPI_ATTRIBUTE_name:
-case DRSUAPI_ATTRIBUTE_sAMAccountName:
-case DRSUAPI_ATTRIBUTE_gPLink:
-       return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -787,17 +760,19 @@ case DRSUAPI_ATTRIBUTE_gPLink:
                ssize_t ret;
                char *str;
 
                ssize_t ret;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               ret = convert_string_talloc(out->values, CH_UTF16, CH_UNIX,
-                                           in->value_ctr.data_blob.values[i].data->data,
-                                           in->value_ctr.data_blob.values[i].data->length,
+               ret = convert_string_talloc_convenience(out->values, 
+                                               schema->iconv_convenience, 
+                                                                       CH_UTF16, CH_UNIX,
+                                           in->value_ctr.values[i].blob->data,
+                                           in->value_ctr.values[i].blob->length,
                                            (void **)&str);
                if (ret == -1) {
                        return WERR_FOOBAR;
                                            (void **)&str);
                if (ret == -1) {
                        return WERR_FOOBAR;
@@ -822,12 +797,12 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schem
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -835,9 +810,9 @@ static WERROR dsdb_syntax_UNICODE_ldb_to_drsuapi(const struct dsdb_schema *schem
        for (i=0; i < in->num_values; i++) {
                ssize_t ret;
 
        for (i=0; i < in->num_values; i++) {
                ssize_t ret;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
 
-               ret = convert_string_talloc(blobs, CH_UNIX, CH_UTF16,
+               ret = convert_string_talloc_convenience(blobs, schema->iconv_convenience, CH_UNIX, CH_UTF16,
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&blobs[i].data);
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&blobs[i].data);
@@ -858,44 +833,31 @@ static WERROR dsdb_syntax_DN_drsuapi_to_ldb(const struct dsdb_schema *schema,
 {
        uint32_t i;
 
 {
        uint32_t i;
 
-switch (attr->attributeID_id) {
-case DRSUAPI_ATTRIBUTE_member:
-case DRSUAPI_ATTRIBUTE_objectCategory:
-case DRSUAPI_ATTRIBUTE_hasMasterNCs:
-case DRSUAPI_ATTRIBUTE_dMDLocation:
-case DRSUAPI_ATTRIBUTE_fSMORoleOwner:
-case DRSUAPI_ATTRIBUTE_wellKnownObjects:
-case DRSUAPI_ATTRIBUTE_serverReference:
-case DRSUAPI_ATTRIBUTE_serverReferenceBL:
-case DRSUAPI_ATTRIBUTE_msDS_HasDomainNCs:
-case DRSUAPI_ATTRIBUTE_msDS_hasMasterNCs:
-       return dsdb_syntax_FOOBAR_drsuapi_to_ldb(schema,attr, in, mem_ctx, out);
-}
-
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->flags      = 0;
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
                struct drsuapi_DsReplicaObjectIdentifier3 id3;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        for (i=0; i < out->num_values; i++) {
                struct drsuapi_DsReplicaObjectIdentifier3 id3;
-               NTSTATUS status;
+               enum ndr_err_code ndr_err;
 
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               status = ndr_pull_struct_blob_all(in->value_ctr.data_blob.values[i].data,
-                                                 out->values, &id3,
-                                                 (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
+                                                  out->values, schema->iconv_convenience, &id3,
+                                                  (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
                }
 
                        return ntstatus_to_werror(status);
                }
 
@@ -919,29 +881,29 @@ static WERROR dsdb_syntax_DN_ldb_to_drsuapi(const struct dsdb_schema *schema,
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               NTSTATUS status;
                struct drsuapi_DsReplicaObjectIdentifier3 id3;
                struct drsuapi_DsReplicaObjectIdentifier3 id3;
+               enum ndr_err_code ndr_err;
 
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                /* TODO: handle id3.guid and id3.sid */
                ZERO_STRUCT(id3);
                id3.dn = (const char *)in->values[i].data;
 
 
                /* TODO: handle id3.guid and id3.sid */
                ZERO_STRUCT(id3);
                id3.dn = (const char *)in->values[i].data;
 
-               status = ndr_push_struct_blob(&blobs[i], blobs, &id3,
-                                             (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, schema->iconv_convenience, &id3, (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
                }
        }
                        return ntstatus_to_werror(status);
                }
        }
@@ -961,7 +923,7 @@ static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(const struct dsdb_schema *sch
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -969,20 +931,21 @@ static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(const struct dsdb_schema *sch
                struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
                char *binary;
                char *str;
                struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
                char *binary;
                char *str;
-               NTSTATUS status;
+               enum ndr_err_code ndr_err;
 
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length == 0) {
+               if (in->value_ctr.values[i].blob->length == 0) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               status = ndr_pull_struct_blob_all(in->value_ctr.data_blob.values[i].data,
-                                                 out->values, &id3b,
-                                                 (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3Binary);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_pull_struct_blob_all(in->value_ctr.values[i].blob,
+                                                  out->values, schema->iconv_convenience, &id3b,
+                                                  (ndr_pull_flags_fn_t)ndr_pull_drsuapi_DsReplicaObjectIdentifier3Binary);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
                }
 
                        return ntstatus_to_werror(status);
                }
 
@@ -991,7 +954,7 @@ static WERROR dsdb_syntax_DN_BINARY_drsuapi_to_ldb(const struct dsdb_schema *sch
                W_ERROR_HAVE_NO_MEMORY(binary);
 
                str = talloc_asprintf(out->values, "B:%u:%s:%s",
                W_ERROR_HAVE_NO_MEMORY(binary);
 
                str = talloc_asprintf(out->values, "B:%u:%s:%s",
-                                     id3b.binary.length * 2, /* because of 2 hex chars per byte */
+                                     (unsigned int)(id3b.binary.length * 2), /* because of 2 hex chars per byte */
                                      binary,
                                      id3b.dn);
                W_ERROR_HAVE_NO_MEMORY(str);
                                      binary,
                                      id3b.dn);
                W_ERROR_HAVE_NO_MEMORY(str);
@@ -1016,30 +979,31 @@ static WERROR dsdb_syntax_DN_BINARY_ldb_to_drsuapi(const struct dsdb_schema *sch
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        for (i=0; i < in->num_values; i++) {
-               NTSTATUS status;
                struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
                struct drsuapi_DsReplicaObjectIdentifier3Binary id3b;
+               enum ndr_err_code ndr_err;
 
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
                /* TODO: handle id3b.guid and id3b.sid, id3.binary */
                ZERO_STRUCT(id3b);
                id3b.dn         = (const char *)in->values[i].data;
                id3b.binary     = data_blob(NULL, 0);
 
 
                /* TODO: handle id3b.guid and id3b.sid, id3.binary */
                ZERO_STRUCT(id3b);
                id3b.dn         = (const char *)in->values[i].data;
                id3b.binary     = data_blob(NULL, 0);
 
-               status = ndr_push_struct_blob(&blobs[i], blobs, &id3b,
-                                             (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary);
-               if (!NT_STATUS_IS_OK(status)) {
+               ndr_err = ndr_push_struct_blob(&blobs[i], blobs, schema->iconv_convenience, &id3b,
+                                              (ndr_push_flags_fn_t)ndr_push_drsuapi_DsReplicaObjectIdentifier3Binary);
+               if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+                       NTSTATUS status = ndr_map_error2ntstatus(ndr_err);
                        return ntstatus_to_werror(status);
                }
        }
                        return ntstatus_to_werror(status);
                }
        }
@@ -1059,7 +1023,7 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb(const struct dsdb_
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
        out->name       = talloc_strdup(mem_ctx, attr->lDAPDisplayName);
        W_ERROR_HAVE_NO_MEMORY(out->name);
 
-       out->num_values = in->value_ctr.data_blob.num_values;
+       out->num_values = in->value_ctr.num_values;
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
        out->values     = talloc_array(mem_ctx, struct ldb_val, out->num_values);
        W_ERROR_HAVE_NO_MEMORY(out->values);
 
@@ -1068,23 +1032,23 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb(const struct dsdb_
                ssize_t ret;
                char *str;
 
                ssize_t ret;
                char *str;
 
-               if (in->value_ctr.data_blob.values[i].data == NULL) {
+               if (in->value_ctr.values[i].blob == NULL) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               if (in->value_ctr.data_blob.values[i].data->length < 4) {
+               if (in->value_ctr.values[i].blob->length < 4) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               len = IVAL(in->value_ctr.data_blob.values[i].data->data, 0);
+               len = IVAL(in->value_ctr.values[i].blob->data, 0);
 
 
-               if (len != in->value_ctr.data_blob.values[i].data->length) {
+               if (len != in->value_ctr.values[i].blob->length) {
                        return WERR_FOOBAR;
                }
 
                        return WERR_FOOBAR;
                }
 
-               ret = convert_string_talloc(out->values, CH_UTF16, CH_UNIX,
-                                           in->value_ctr.data_blob.values[i].data->data+4,
-                                           in->value_ctr.data_blob.values[i].data->length-4,
+               ret = convert_string_talloc_convenience(out->values, schema->iconv_convenience, CH_UTF16, CH_UNIX,
+                                           in->value_ctr.values[i].blob->data+4,
+                                           in->value_ctr.values[i].blob->length-4,
                                            (void **)&str);
                if (ret == -1) {
                        return WERR_FOOBAR;
                                            (void **)&str);
                if (ret == -1) {
                        return WERR_FOOBAR;
@@ -1109,12 +1073,12 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(const struct dsdb_
                return WERR_FOOBAR;
        }
 
                return WERR_FOOBAR;
        }
 
-       out->attid                              = attr->attributeID_id;
-       out->value_ctr.data_blob.num_values     = in->num_values;
-       out->value_ctr.data_blob.values         = talloc_array(mem_ctx,
-                                                              struct drsuapi_DsAttributeValueDataBlob,
-                                                              in->num_values);
-       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.data_blob.values);
+       out->attid                      = attr->attributeID_id;
+       out->value_ctr.num_values       = in->num_values;
+       out->value_ctr.values           = talloc_array(mem_ctx,
+                                                      struct drsuapi_DsAttributeValue,
+                                                      in->num_values);
+       W_ERROR_HAVE_NO_MEMORY(out->value_ctr.values);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
 
        blobs = talloc_array(mem_ctx, DATA_BLOB, in->num_values);
        W_ERROR_HAVE_NO_MEMORY(blobs);
@@ -1123,9 +1087,9 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(const struct dsdb_
                uint8_t *data;
                ssize_t ret;
 
                uint8_t *data;
                ssize_t ret;
 
-               out->value_ctr.data_blob.values[i].data = &blobs[i];
+               out->value_ctr.values[i].blob   = &blobs[i];
 
 
-               ret = convert_string_talloc(blobs, CH_UNIX, CH_UTF16,
+               ret = convert_string_talloc_convenience(blobs, schema->iconv_convenience, CH_UNIX, CH_UTF16,
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&data);
                                            in->values[i].data,
                                            in->values[i].length,
                                            (void **)&data);
@@ -1147,7 +1111,6 @@ static WERROR dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi(const struct dsdb_
        return WERR_OK;
 }
 
        return WERR_OK;
 }
 
-
 #define OMOBJECTCLASS(val) { .length = sizeof(val) - 1, .data = discard_const_p(uint8_t, val) }
 
 static const struct dsdb_syntax dsdb_syntaxes[] = {
 #define OMOBJECTCLASS(val) { .length = sizeof(val) - 1, .data = discard_const_p(uint8_t, val) }
 
 static const struct dsdb_syntax dsdb_syntaxes[] = {
@@ -1158,27 +1121,36 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.8",
                .drsuapi_to_ldb         = dsdb_syntax_BOOL_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_BOOL_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.8",
                .drsuapi_to_ldb         = dsdb_syntax_BOOL_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_BOOL_ldb_to_drsuapi,
+               .equality               = "booleanMatch",
+               .comment                = "Boolean" 
        },{
                .name                   = "Integer",
        },{
                .name                   = "Integer",
-               .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.27",
+               .ldap_oid               = LDB_SYNTAX_INTEGER,
                .oMSyntax               = 2,
                .attributeSyntax_oid    = "2.5.5.9",
                .drsuapi_to_ldb         = dsdb_syntax_INT32_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_INT32_ldb_to_drsuapi,
                .oMSyntax               = 2,
                .attributeSyntax_oid    = "2.5.5.9",
                .drsuapi_to_ldb         = dsdb_syntax_INT32_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_INT32_ldb_to_drsuapi,
+               .equality               = "integerMatch",
+               .comment                = "Integer",
        },{
                .name                   = "String(Octet)",
        },{
                .name                   = "String(Octet)",
-               .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.40",
+               .ldap_oid               = LDB_SYNTAX_OCTET_STRING,
                .oMSyntax               = 4,
                .attributeSyntax_oid    = "2.5.5.10",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
                .oMSyntax               = 4,
                .attributeSyntax_oid    = "2.5.5.10",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
+               .equality               = "octetStringMatch",
+               .comment                = "Octet String",
        },{
                .name                   = "String(Sid)",
        },{
                .name                   = "String(Sid)",
-               .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.40",
+               .ldap_oid               = LDB_SYNTAX_OCTET_STRING,
                .oMSyntax               = 4,
                .attributeSyntax_oid    = "2.5.5.17",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
                .oMSyntax               = 4,
                .attributeSyntax_oid    = "2.5.5.17",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
+               .equality               = "octetStringMatch",
+               .comment                = "Octet String - Security Identifier (SID)",
+               .ldb_syntax             = LDB_SYNTAX_SAMBA_SID
        },{
                .name                   = "String(Object-Identifier)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.38",
        },{
                .name                   = "String(Object-Identifier)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.38",
@@ -1186,9 +1158,12 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.2",
                .drsuapi_to_ldb         = dsdb_syntax_OID_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_OID_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.2",
                .drsuapi_to_ldb         = dsdb_syntax_OID_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_OID_ldb_to_drsuapi,
+               .equality               = "caseIgnoreMatch", /* Would use "objectIdentifierMatch" but most are ldap attribute/class names */
+               .comment                = "OID String",
+               .ldb_syntax             = LDB_SYNTAX_DIRECTORY_STRING
        },{
                .name                   = "Enumeration",
        },{
                .name                   = "Enumeration",
-               .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.27",
+               .ldap_oid               = LDB_SYNTAX_INTEGER,
                .oMSyntax               = 10,
                .attributeSyntax_oid    = "2.5.5.9",
                .drsuapi_to_ldb         = dsdb_syntax_INT32_drsuapi_to_ldb,
                .oMSyntax               = 10,
                .attributeSyntax_oid    = "2.5.5.9",
                .drsuapi_to_ldb         = dsdb_syntax_INT32_drsuapi_to_ldb,
@@ -1201,6 +1176,9 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.6",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.6",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
+               .equality               = "numericStringMatch",
+               .substring              = "numericStringSubstringsMatch",
+               .comment                = "Numeric String" 
        },{
                .name                   = "String(Printable)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.44",
        },{
                .name                   = "String(Printable)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.44",
@@ -1215,6 +1193,10 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.4",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.4",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
+               .equality               = "caseIgnoreMatch",
+               .substring              = "caseIgnoreSubstringsMatch",
+               .comment                = "Case Insensitive String",
+               .ldb_syntax             = LDB_SYNTAX_DIRECTORY_STRING,
        },{
                .name                   = "String(IA5)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.26",
        },{
                .name                   = "String(IA5)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.26",
@@ -1222,6 +1204,8 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.5",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.5",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
+               .equality               = "caseExactIA5Match",
+               .comment                = "Printable String"
        },{
                .name                   = "String(UTC-Time)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.53",
        },{
                .name                   = "String(UTC-Time)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.53",
@@ -1229,6 +1213,8 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.11",
                .drsuapi_to_ldb         = dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.11",
                .drsuapi_to_ldb         = dsdb_syntax_NTTIME_UTC_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_NTTIME_UTC_ldb_to_drsuapi,
+               .equality               = "generalizedTimeMatch",
+               .comment                = "UTC Time",
        },{
                .name                   = "String(Generalized-Time)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.24",
        },{
                .name                   = "String(Generalized-Time)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.24",
@@ -1236,6 +1222,9 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.11",
                .drsuapi_to_ldb         = dsdb_syntax_NTTIME_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_NTTIME_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.11",
                .drsuapi_to_ldb         = dsdb_syntax_NTTIME_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_NTTIME_ldb_to_drsuapi,
+               .equality               = "generalizedTimeMatch",
+               .comment                = "Generalized Time",
+               .ldb_syntax             = LDB_SYNTAX_UTC_TIME,
        },{
        /* not used in w2k3 schema */
                .name                   = "String(Case Sensitive)",
        },{
        /* not used in w2k3 schema */
                .name                   = "String(Case Sensitive)",
@@ -1246,11 +1235,14 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
        },{
                .name                   = "String(Unicode)",
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
        },{
                .name                   = "String(Unicode)",
-               .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.15",
+               .ldap_oid               = LDB_SYNTAX_DIRECTORY_STRING,
                .oMSyntax               = 64,
                .attributeSyntax_oid    = "2.5.5.12",
                .drsuapi_to_ldb         = dsdb_syntax_UNICODE_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_UNICODE_ldb_to_drsuapi,
                .oMSyntax               = 64,
                .attributeSyntax_oid    = "2.5.5.12",
                .drsuapi_to_ldb         = dsdb_syntax_UNICODE_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_UNICODE_ldb_to_drsuapi,
+               .equality               = "caseIgnoreMatch",
+               .substring              = "caseIgnoreSubstringsMatch",
+               .comment                = "Directory String",
        },{
                .name                   = "Interval/LargeInteger",
                .ldap_oid               = "1.2.840.113556.1.4.906",
        },{
                .name                   = "Interval/LargeInteger",
                .ldap_oid               = "1.2.840.113556.1.4.906",
@@ -1258,21 +1250,26 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.16",
                .drsuapi_to_ldb         = dsdb_syntax_INT64_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_INT64_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.16",
                .drsuapi_to_ldb         = dsdb_syntax_INT64_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_INT64_ldb_to_drsuapi,
+               .equality               = "integerMatch",
+               .comment                = "Large Integer",
+               .ldb_syntax             = LDB_SYNTAX_INTEGER,
        },{
                .name                   = "String(NT-Sec-Desc)",
        },{
                .name                   = "String(NT-Sec-Desc)",
-               .ldap_oid               = "1.2.840.113556.1.4.907",
+               .ldap_oid               = LDB_SYNTAX_SAMBA_SECURITY_DESCRIPTOR,
                .oMSyntax               = 66,
                .attributeSyntax_oid    = "2.5.5.15",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
                .name                   = "Object(DS-DN)",
                .oMSyntax               = 66,
                .attributeSyntax_oid    = "2.5.5.15",
                .drsuapi_to_ldb         = dsdb_syntax_DATA_BLOB_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DATA_BLOB_ldb_to_drsuapi,
        },{
                .name                   = "Object(DS-DN)",
-               .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.12",
+               .ldap_oid               = LDB_SYNTAX_DN,
                .oMSyntax               = 127,
                .oMObjectClass          = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x4a"),
                .attributeSyntax_oid    = "2.5.5.1",
                .drsuapi_to_ldb         = dsdb_syntax_DN_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DN_ldb_to_drsuapi,
                .oMSyntax               = 127,
                .oMObjectClass          = OMOBJECTCLASS("\x2b\x0c\x02\x87\x73\x1c\x00\x85\x4a"),
                .attributeSyntax_oid    = "2.5.5.1",
                .drsuapi_to_ldb         = dsdb_syntax_DN_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DN_ldb_to_drsuapi,
+               .equality               = "distinguishedNameMatch",
+               .comment                = "Object(DS-DN) == a DN",
        },{
                .name                   = "Object(DN-Binary)",
                .ldap_oid               = "1.2.840.113556.1.4.903",
        },{
                .name                   = "Object(DN-Binary)",
                .ldap_oid               = "1.2.840.113556.1.4.903",
@@ -1281,6 +1278,9 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.7",
                .drsuapi_to_ldb         = dsdb_syntax_DN_BINARY_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DN_BINARY_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.7",
                .drsuapi_to_ldb         = dsdb_syntax_DN_BINARY_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_DN_BINARY_ldb_to_drsuapi,
+               .equality               = "octetStringMatch",
+               .comment                = "OctetString: Binary+DN",
+               .ldb_syntax             = LDB_SYNTAX_OCTET_STRING,
        },{
        /* not used in w2k3 schema */
                .name                   = "Object(OR-Name)",
        },{
        /* not used in w2k3 schema */
                .name                   = "Object(OR-Name)",
@@ -1291,6 +1291,12 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
        },{
                .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
        },{
+       /* 
+        * TODO: verify if DATA_BLOB is correct here...!
+        *
+        *       repsFrom and repsTo are the only attributes using
+        *       this attribute syntax, but they're not replicated... 
+        */
                .name                   = "Object(Replica-Link)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.40",
                .oMSyntax               = 127,
                .name                   = "Object(Replica-Link)",
                .ldap_oid               = "1.3.6.1.4.1.1466.115.121.1.40",
                .oMSyntax               = 127,
@@ -1306,6 +1312,7 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.13",
                .drsuapi_to_ldb         = dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.13",
                .drsuapi_to_ldb         = dsdb_syntax_PRESENTATION_ADDRESS_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_PRESENTATION_ADDRESS_ldb_to_drsuapi,
+               .comment                = "Presentation Address" 
        },{
        /* not used in w2k3 schema */
                .name                   = "Object(Access-Point)",
        },{
        /* not used in w2k3 schema */
                .name                   = "Object(Access-Point)",
@@ -1324,9 +1331,44 @@ static const struct dsdb_syntax dsdb_syntaxes[] = {
                .attributeSyntax_oid    = "2.5.5.14",
                .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
                .attributeSyntax_oid    = "2.5.5.14",
                .drsuapi_to_ldb         = dsdb_syntax_FOOBAR_drsuapi_to_ldb,
                .ldb_to_drsuapi         = dsdb_syntax_FOOBAR_ldb_to_drsuapi,
+               .equality               = "distinguishedNameMatch",
+               .comment                = "OctetString: String+DN",
+               .ldb_syntax             = LDB_SYNTAX_DN,
        }
 };
 
        }
 };
 
+const struct dsdb_syntax *find_syntax_map_by_ad_oid(const char *ad_oid) 
+{
+       int i;
+       for (i=0; dsdb_syntaxes[i].ldap_oid; i++) {
+               if (strcasecmp(ad_oid, dsdb_syntaxes[i].attributeSyntax_oid) == 0) {
+                       return &dsdb_syntaxes[i];
+               }
+       }
+       return NULL;
+}
+
+const struct dsdb_syntax *find_syntax_map_by_ad_syntax(int oMSyntax) 
+{
+       int i;
+       for (i=0; dsdb_syntaxes[i].ldap_oid; i++) {
+               if (oMSyntax == dsdb_syntaxes[i].oMSyntax) {
+                       return &dsdb_syntaxes[i];
+               }
+       }
+       return NULL;
+}
+
+const struct dsdb_syntax *find_syntax_map_by_standard_oid(const char *standard_oid) 
+{
+       int i;
+       for (i=0; dsdb_syntaxes[i].ldap_oid; i++) {
+               if (strcasecmp(standard_oid, dsdb_syntaxes[i].ldap_oid) == 0) {
+                       return &dsdb_syntaxes[i];
+               }
+       }
+       return NULL;
+}
 const struct dsdb_syntax *dsdb_syntax_for_attribute(const struct dsdb_attribute *attr)
 {
        uint32_t i;
 const struct dsdb_syntax *dsdb_syntax_for_attribute(const struct dsdb_attribute *attr)
 {
        uint32_t i;