[389-commits] Branch 'Directory_Server_8_2_Branch' - ldap/servers

Noriko Hosoi nhosoi at fedoraproject.org
Wed Feb 17 16:48:15 UTC 2010


 ldap/servers/slapd/tools/ldclt/ldapfct.c |   96 ++++++++++++++++++++++++++++++-
 ldap/servers/slapd/tools/ldclt/ldclt.c   |   19 +++---
 ldap/servers/slapd/tools/ldclt/ldcltU.c  |   24 ++++++-
 3 files changed, 123 insertions(+), 16 deletions(-)

New commits:
commit 9476d1c01ad444e1eabfe55960719d959a5e9bdd
Author: Noriko Hosoi <nhosoi at redhat.com>
Date:   Tue Feb 16 17:13:14 2010 -0800

    565987 - redhat-ds-base fails to build due to undefined struct
    st_size and nsldapi_build_control et al. in ldclt.c
    
    https://bugzilla.redhat.com/show_bug.cgi?id=565987
    
    Fix Description:
    1. stat: sys/types.h and sys/stat.h need to be included.
    2. nsldapi_build_control: duplicated nsldapi_build_control from
       the mozldap c library.
    3. added the sub value [=deref:attr] of deref to the usage.
    4. allow -e deref without the sub value.  It used to be allowed,
       but it was forbidden by the previous change.

diff --git a/ldap/servers/slapd/tools/ldclt/ldapfct.c b/ldap/servers/slapd/tools/ldclt/ldapfct.c
index 359b5fe..b19c689 100644
--- a/ldap/servers/slapd/tools/ldclt/ldapfct.c
+++ b/ldap/servers/slapd/tools/ldclt/ldapfct.c
@@ -265,6 +265,11 @@ dd/mm/yy | Author	| Comments
 #define LDCLT_DEREF_ATTR "secretary"
 int ldclt_create_deref_control( LDAP *ld, char *derefAttr, char **attrs, LDAPControl **ctrlp );
 
+#if !defined(USE_OPENLDAP)
+int ldclt_build_control( char *oid, BerElement *ber, int freeber, char iscritical, LDAPControl **ctrlp );
+int ldclt_alloc_ber( LDAP *ld, BerElement **berp );
+#endif
+
 /* ****************************************************************************
 	FUNCTION :	my_ldap_err2string
 	PURPOSE :	This function is targetted to encapsulate the standard
@@ -3688,7 +3693,6 @@ doExactSearch (
   LDAPControl **ctrlsp = NULL, *ctrls[2], *dctrl = NULL; /* derefence control */
 
   /* the following variables are used for response parsing */
-  int             i;        /* for counting purpose */
   int             msgtype, parse_rc , rc ; /* for search result parsing */
   char            *matcheddn, *errmsg, *dn ;
   LDAPControl     **resctrls; 
@@ -4220,7 +4224,11 @@ ldclt_create_deref_control(
     }
 
     /* create a ber package to hold the controlValue */
-    if ( LDAP_SUCCESS != nsldapi_alloc_ber_with_options( ld, &ber )  ) 
+#if defined(USE_OPENLDAP)
+    if ( NULL == ( ber = ldap_alloc_ber_with_options( ld ) ) )
+#else
+    if ( LDAP_SUCCESS != ldclt_alloc_ber( ld, &ber )  ) 
+#endif
     {
         return( LDAP_NO_MEMORY );
     }
@@ -4231,9 +4239,91 @@ ldclt_create_deref_control(
         return( LDAP_ENCODING_ERROR );
     }
 
-    rc = nsldapi_build_control( LDAP_CONTROL_X_DEREF, ber, 1, 1, ctrlp );
+#if defined(USE_OPENLDAP)
+    rc = ldap_create_control( LDAP_CONTROL_X_DEREF, ber, 1, ctrlp );
+#else
+    rc = ldclt_build_control( LDAP_CONTROL_X_DEREF, ber, 1, 1, ctrlp );
+#endif
 
     return( rc );
 }
 
+#if !defined(USE_OPENLDAP)
+/*
+ * Duplicated nsldapi_build_control from 
+ * mozilla/directory/c-sdk/ldap/libraries/libldap/control.c
+ *
+ * build an allocated LDAPv3 control.  Returns an LDAP error code.
+ */
+int
+ldclt_build_control( char *oid, BerElement *ber, int freeber, char iscritical,
+    LDAPControl **ctrlp )
+{
+    int        rc;
+    struct berval    *bvp;
+
+    if ( ber == NULL ) {
+        bvp = NULL;
+    } else {
+        /* allocate struct berval with contents of the BER encoding */
+        rc = ber_flatten( ber, &bvp );
+        if ( freeber ) {
+            ber_free( ber, 1 );
+        }
+        if ( rc == -1 ) {
+            return( LDAP_NO_MEMORY );
+        }
+    }
+
+    /* allocate the new control structure */
+    if (( *ctrlp = (LDAPControl *)malloc( sizeof(LDAPControl))) == NULL ) {
+        if ( bvp != NULL ) {
+            ber_bvfree( bvp );
+        }
+        return( LDAP_NO_MEMORY );
+    }
+
+    /* fill in the fields of this new control */
+    (*ctrlp)->ldctl_iscritical = iscritical;  
+    if (( (*ctrlp)->ldctl_oid = strdup( oid )) == NULL ) {
+        free( *ctrlp ); 
+        if ( bvp != NULL ) {
+            ber_bvfree( bvp );
+        }
+        return( LDAP_NO_MEMORY );
+    }                
+
+    if ( bvp == NULL ) {
+        (*ctrlp)->ldctl_value.bv_len = 0;
+        (*ctrlp)->ldctl_value.bv_val = NULL;
+    } else {
+        (*ctrlp)->ldctl_value = *bvp;    /* struct copy */
+        free( bvp );    /* free container, not contents! */
+    }
+
+    return( LDAP_SUCCESS );
+}
+
+/*
+ * Duplicated nsldapi_build_control from 
+ * mozilla/directory/c-sdk/ldap/libraries/libldap/request.c
+ *
+ * returns an LDAP error code and also sets error inside LDAP 
+ */ 
+int
+ldclt_alloc_ber( LDAP *ld, BerElement **berp )
+{
+    int    err;
+
+    /* We use default lberoptions since the value is not public in mozldap. */
+     if (( *berp = ber_alloc_t( LBER_OPT_USE_DER )) == (BerElement *)NULL ) {
+        err = LDAP_NO_MEMORY;
+    } else {
+        err = LDAP_SUCCESS;
+    }
+
+    return( err );
+}
+#endif
+
 /* End of file */
diff --git a/ldap/servers/slapd/tools/ldclt/ldclt.c b/ldap/servers/slapd/tools/ldclt/ldclt.c
index 7b2a7dd..53115ad 100644
--- a/ldap/servers/slapd/tools/ldclt/ldclt.c
+++ b/ldap/servers/slapd/tools/ldclt/ldclt.c
@@ -300,7 +300,8 @@ dd/mm/yy | Author	| Comments
 #include "utils.h"		/* Utilities functions */	/*JLS 16-11-00*/
 #include "scalab01.h"		/* Scalab01 specific */		/*JLS 12-01-01*/
 
-
+#include <sys/types.h>
+#include <sys/stat.h>
 
 /*
  * Global variables
@@ -1480,7 +1481,7 @@ basicInit (void)
   /*
    * Parse deref subvalue
    */
-  if (mctx.mod2 & M2_DEREF)
+  if ((mctx.mod2 & M2_DEREF) && mctx.attrpl)
   {
      /*
      * Find the reference attribute name
@@ -1508,7 +1509,7 @@ basicInit (void)
   /*
    * Parse attreplacefile subvalue
    */
-  if (mctx.mod2 & M2_ATTR_REPLACE_FILE)
+  if ((mctx.mod2 & M2_ATTR_REPLACE_FILE) && mctx.attrpl)
   {
     /*
      * Find the attribute name
@@ -2534,12 +2535,12 @@ decodeExecParams (
 	break;
       case EP_DEREF:
 	mctx.mod2 |= M2_DEREF;
-        if (subvalue == NULL)
-        {
-          fprintf (stderr, "Error: missing arg deref argument pair (deref:attr)\n");
-          return (-1);
-        }
-        mctx.attrpl = strdup (subvalue);
+	if (subvalue) {
+		/* if -e deref=deref:attr is given, "deref:attr" is set to attrpl */
+		mctx.attrpl = strdup (subvalue);
+	} else {
+		mctx.attrpl = NULL;
+	}
 	break;
       default:
 	fprintf (stderr, "Error: illegal option -e %s\n", subvalue);
diff --git a/ldap/servers/slapd/tools/ldclt/ldcltU.c b/ldap/servers/slapd/tools/ldclt/ldcltU.c
index 1233a55..e436e18 100644
--- a/ldap/servers/slapd/tools/ldclt/ldcltU.c
+++ b/ldap/servers/slapd/tools/ldclt/ldcltU.c
@@ -79,8 +79,16 @@
  * 		commoncounter    : all threads share the same counter.
  * 		counteach   : count each operation not only successful ones.
  * 		delete                : ldap_delete() entries.
- * 		deref                 : adds dereference control to "esearch"
- * 		                      : adds "secretary" attr to the entries for "add"
+ * 		deref[=deref:attr]    : This option works with -e add and -e esearch.
+ * 		                      : With -e esearch:
+ * 		                      : adds dereference control.
+ * 		                      : if =deref:attr is given, the deref and attr
+ * 		                      : pair is set to the control request.
+ * 		                      : if not given, "secretary:cn" is set.
+ * 		                      : With -e add:
+ * 		                      : adds "secretary" attr to the netOrgPerson 
+ * 		                      : entries to prepare for the search with the
+ * 		                      : default "secretary:cn" dereference control.
  * 		dontsleeponserverdown : will loop very fast if server down.
  * 		emailPerson           : objectclass=emailPerson (-e add only).
  * 		esearch	              : exact search.
@@ -174,8 +182,16 @@ void usage ()
   (void) printf ("		commoncounter     : all threads share the same counter.\n");
   (void) printf ("		counteach         : count each operation not only successful ones.\n");
   (void) printf ("		delete            : ldap_delete() entries.\n");
-  (void) printf ("		deref             : adds dereference control to \"esearch\"\n");
-  (void) printf ("		                  : adds \"secretary\" attr to the entries for \"add\"\n");
+  (void) printf ("		deref[=deref:attr]: This option works with -e add and esearch.\n");
+  (void) printf ("		                  : With -e esearch:\n");
+  (void) printf ("		                  : adds dereference control.\n");
+  (void) printf ("		                  : if =deref:attr is given, the deref and attr\n");
+  (void) printf ("		                  : pair is set to the control request.\n");
+  (void) printf ("		                  : if not given, \"secretary:cn\" is set.\n");
+  (void) printf ("		                  : With -e add:\n");
+  (void) printf ("		                  : adds \"secretary\" attr to the inetOrgPerson\n");
+  (void) printf ("		                  : entries to prepare for -e esearch using\n");
+  (void) printf ("		                  : the default deref attr pair.\n");
   (void) printf ("		dontsleeponserverdown : will loop very fast if server down.\n");
   (void) printf ("		emailPerson       : objectclass=emailPerson (-e add only).\n");
   (void) printf ("		esearch           : exact search.\n");




More information about the 389-commits mailing list