#include "param/param.h"
#include "../lib/util/asn1.h"
+struct ldif_write_HEXDUMP_state {
+ bool error;
+ char *value;
+};
+
+static void ldif_write_HEXDUMP_cb(const char *buf, void *private_data)
+{
+ struct ldif_write_HEXDUMP_state *state =
+ (struct ldif_write_HEXDUMP_state *)private_data;
+ char *v = NULL;
+
+ if (state->error) {
+ return;
+ }
+
+ v = talloc_strdup_append_buffer(state->value, buf);
+ if (v == NULL) {
+ state->error = true;
+ TALLOC_FREE(state->value);
+ return;
+ }
+ state->value = v;
+}
+
+static int ldif_write_HEXDUMP(struct ldb_context *ldb, void *mem_ctx,
+ const struct ldb_val *in, struct ldb_val *out)
+{
+ struct ldif_write_HEXDUMP_state state = {
+ .error = false,
+ };
+
+ if (!(ldb_get_flags(ldb) & LDB_FLG_SHOW_BINARY)) {
+ return ldb_handler_copy(ldb, mem_ctx, in, out);
+ }
+ if (in->length == 0) {
+ return ldb_handler_copy(ldb, mem_ctx, in, out);
+ }
+
+ state.value = talloc_asprintf(mem_ctx, "HEXDUMP length[%zu]\n", in->length);
+ if (state.value == NULL) {
+ ldb_oom(ldb);
+ return -1;
+ }
+
+ dump_data_cb(in->data, in->length,
+ true, /* omit_zero_bytes */
+ ldif_write_HEXDUMP_cb,
+ &state);
+
+ if (state.error) {
+ ldb_oom(ldb);
+ return -1;
+ }
+
+ *out = data_blob_string_const(state.value);
+ return 0;
+}
+
/*
use ndr_print_* to convert a NDR formatted blob to a ldif formatted blob
},{
.name = LDB_SYNTAX_SAMBA_OCTET_STRING,
.ldif_read_fn = ldb_handler_copy,
- .ldif_write_fn = ldb_handler_copy,
+ .ldif_write_fn = ldif_write_HEXDUMP,
.canonicalise_fn = ldb_handler_copy,
.comparison_fn = samba_ldb_comparison_binary,
.operator_fn = samba_syntax_binary_operator_fn