]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/entry.c
Relax entry_header, zero-length entries are valid.
[openldap] / servers / slapd / entry.c
index fcf6cb02a42234cf809aeddf4b7367ad4d7cb99c..9b768a9ce2952ff84c87a7f3656e5fe0d550579c 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2009 The OpenLDAP Foundation.
+ * Copyright 1998-2011 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -426,10 +426,20 @@ fail:
                } \
        }
 
+/* NOTE: only preserved for binary compatibility */
 char *
 entry2str(
        Entry   *e,
        int             *len )
+{
+       return entry2str_wrap( e, len, LDIF_LINE_WIDTH );
+}
+
+char *
+entry2str_wrap(
+       Entry           *e,
+       int                     *len,
+       ber_len_t       wrap )
 {
        Attribute       *a;
        struct berval   *bv;
@@ -451,7 +461,7 @@ entry2str(
                /* put "dn: <dn>" */
                tmplen = e->e_name.bv_len;
                MAKE_SPACE( LDIF_SIZE_NEEDED( 2, tmplen ));
-               ldif_sput( &ecur, LDIF_PUT_VALUE, "dn", e->e_dn, tmplen );
+               ldif_sput_wrap( &ecur, LDIF_PUT_VALUE, "dn", e->e_dn, tmplen, wrap );
        }
 
        /* put the attributes */
@@ -461,9 +471,9 @@ entry2str(
                        bv = &a->a_vals[i];
                        tmplen = a->a_desc->ad_cname.bv_len;
                        MAKE_SPACE( LDIF_SIZE_NEEDED( tmplen, bv->bv_len ));
-                       ldif_sput( &ecur, LDIF_PUT_VALUE,
+                       ldif_sput_wrap( &ecur, LDIF_PUT_VALUE,
                                a->a_desc->ad_cname.bv_val,
-                               bv->bv_val, bv->bv_len );
+                               bv->bv_val, bv->bv_len, wrap );
                }
        }
        MAKE_SPACE( 1 );
@@ -804,22 +814,44 @@ int entry_header(EntryHeader *eh)
 {
        unsigned char *ptr = (unsigned char *)eh->bv.bv_val;
 
+       /* Some overlays can create empty entries
+        * so don't check for zeros here.
+        */
        eh->nattrs = entry_getlen(&ptr);
-       if ( !eh->nattrs ) {
-               Debug( LDAP_DEBUG_ANY,
-                       "entry_header: attribute count was zero\n", 0, 0, 0);
-               return LDAP_OTHER;
-       }
        eh->nvals = entry_getlen(&ptr);
-       if ( !eh->nvals ) {
-               Debug( LDAP_DEBUG_ANY,
-                       "entry_header: value count was zero\n", 0, 0, 0);
-               return LDAP_OTHER;
-       }
        eh->data = (char *)ptr;
        return LDAP_SUCCESS;
 }
 
+int
+entry_decode_dn( EntryHeader *eh, struct berval *dn, struct berval *ndn )
+{
+       int i;
+       unsigned char *ptr = (unsigned char *)eh->bv.bv_val;
+
+       assert( dn != NULL || ndn != NULL );
+
+       ptr = (unsigned char *)eh->data;
+       i = entry_getlen(&ptr);
+       if ( dn != NULL ) {
+               dn->bv_val = (char *) ptr;
+               dn->bv_len = i;
+       }
+
+       if ( ndn != NULL ) {
+               ptr += i + 1;
+               i = entry_getlen(&ptr);
+               ndn->bv_val = (char *) ptr;
+               ndn->bv_len = i;
+       }
+
+       Debug( LDAP_DEBUG_TRACE,
+               "entry_decode_dn: \"%s\"\n",
+               dn ? dn->bv_val : ndn->bv_val, 0, 0 );
+
+       return 0;
+}
+
 #ifdef SLAP_ZONE_ALLOC
 int entry_decode(EntryHeader *eh, Entry **e, void *ctx)
 #else
@@ -936,24 +968,27 @@ int entry_decode(EntryHeader *eh, Entry **e)
        return 0;
 }
 
-int entry_dup_to( Entry *source, Entry *dest )
+Entry *
+entry_dup2( Entry *dest, Entry *source )
 {
+       assert( dest != NULL );
+       assert( source != NULL );
+
+       assert( dest->e_private == NULL );
+
        dest->e_id = source->e_id;
        ber_dupbv( &dest->e_name, &source->e_name );
        ber_dupbv( &dest->e_nname, &source->e_nname );
        dest->e_attrs = attrs_dup( source->e_attrs );
        dest->e_ocflags = source->e_ocflags;
-       return LDAP_SUCCESS;
+
+       return dest;
 }
 
-Entry *entry_dup( Entry *e )
+Entry *
+entry_dup( Entry *e )
 {
-       Entry *ret;
-
-       ret = entry_alloc();
-       entry_dup_to(e, ret);
-
-       return ret;
+       return entry_dup2( entry_alloc(), e );
 }
 
 #if 1