Fix the mess with ldb includes.
[abartlet/samba.git/.git] / source4 / lib / ldb / common / ldb_ldif.c
index 6cbd30f377a65a0afdda15ac7b5a944f30a0c51c..400fb352ff4aba05ef06d976f4034b81cf8e9a10 100644 (file)
@@ -35,7 +35,7 @@
   see RFC2849 for the LDIF format definition
 */
 
-#include "ldb_includes.h"
+#include "ldb_private.h"
 #include "system/locale.h"
 
 /*
@@ -191,19 +191,19 @@ int ldb_should_b64_encode(const struct ldb_val *val)
        uint8_t *p = val->data;
 
        if (val->length == 0) {
-               return LDB_SUCCESS;
+               return 0;
        }
 
        if (p[0] == ' ' || p[0] == ':') {
-               return LDB_ERR_OPERATIONS_ERROR;
+               return 1;
        }
 
        for (i=0; i<val->length; i++) {
                if (!isprint(p[i]) || p[i] == '\n') {
-                       return LDB_ERR_OPERATIONS_ERROR;
+                       return 1;
                }
        }
-       return LDB_SUCCESS;
+       return 0;
 }
 
 /* this macro is used to handle the return checking on fprintf_fn() */
@@ -278,13 +278,15 @@ int ldb_ldif_write(struct ldb_context *ldb,
        TALLOC_CTX *mem_ctx;
        unsigned int i, j;
        int total=0, ret;
+       char *p;
        const struct ldb_message *msg;
 
        mem_ctx = talloc_named_const(NULL, 0, "ldb_ldif_write");
 
        msg = ldif->msg;
-
-       ret = fprintf_fn(private_data, "dn: %s\n", ldb_dn_get_linearized(msg->dn));
+       p = ldb_dn_get_extended_linearized(mem_ctx, msg->dn, 1);
+       ret = fprintf_fn(private_data, "dn: %s\n", p);
+       talloc_free(p);
        CHECK_RET;
 
        if (ldif->changetype != LDB_CHANGETYPE_NONE) {
@@ -328,8 +330,10 @@ int ldb_ldif_write(struct ldb_context *ldb,
                for (j=0;j<msg->elements[i].num_values;j++) {
                        struct ldb_val v;
                        ret = a->syntax->ldif_write_fn(ldb, mem_ctx, &msg->elements[i].values[j], &v);
-                       CHECK_RET;
-                       if (ldb_should_b64_encode(&v)) {
+                       if (ret != LDB_SUCCESS) {
+                               v = msg->elements[i].values[j];
+                       }
+                       if (ret != LDB_SUCCESS || ldb_should_b64_encode(&v)) {
                                ret = fprintf_fn(private_data, "%s:: ", 
                                                 msg->elements[i].name);
                                CHECK_RET;
@@ -444,12 +448,12 @@ static int next_attr(void *mem_ctx, char **s, const char **attr, struct ldb_val
                value->length = 0;
                *attr = "-";
                *s += 2;
-               return LDB_SUCCESS;
+               return 0;
        }
 
        p = strchr(*s, ':');
        if (!p) {
-               return LDB_ERR_OPERATIONS_ERROR;
+               return -1;
        }
 
        *p++ = 0;
@@ -487,7 +491,7 @@ static int next_attr(void *mem_ctx, char **s, const char **attr, struct ldb_val
                int len = ldb_base64_decode((char *)value->data);
                if (len == -1) {
                        /* it wasn't valid base64 data */
-                       return LDB_ERR_OPERATIONS_ERROR;
+                       return -1;
                }
                value->length = len;
        }
@@ -496,11 +500,11 @@ static int next_attr(void *mem_ctx, char **s, const char **attr, struct ldb_val
                int len = ldb_read_data_file(mem_ctx, value);
                if (len == -1) {
                        /* an error occured hile trying to retrieve the file */
-                       return LDB_ERR_OPERATIONS_ERROR;
+                       return -1;
                }
        }
 
-       return LDB_SUCCESS;
+       return 0;
 }
 
 
@@ -562,11 +566,11 @@ struct ldb_ldif *ldb_ldif_read(struct ldb_context *ldb,
                goto failed;
        }
 
-       msg->dn = ldb_dn_new(msg, ldb, (char *)value.data);
+       msg->dn = ldb_dn_from_ldb_val(msg, ldb, &value);
 
        if ( ! ldb_dn_validate(msg->dn)) {
                ldb_debug(ldb, LDB_DEBUG_ERROR, "Error: Unable to parse dn '%s'\n", 
-                                 value.data);
+                         (char *)value.data);
                goto failed;
        }