]> git.sur5r.net Git - openldap/commitdiff
Use extended async APIs to allow direct parsing of results. Otherwise
authorHoward Chu <hyc@openldap.org>
Fri, 14 Feb 2003 05:23:45 +0000 (05:23 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 14 Feb 2003 05:23:45 +0000 (05:23 +0000)
they will be interleaved in LDAP*. Avoid setting any options on the handle.

servers/slapd/back-ldap/add.c
servers/slapd/back-ldap/back-ldap.h
servers/slapd/back-ldap/bind.c
servers/slapd/back-ldap/compare.c
servers/slapd/back-ldap/delete.c
servers/slapd/back-ldap/modify.c
servers/slapd/back-ldap/modrdn.c
servers/slapd/back-ldap/search.c

index f9032f05311bf35d3a3e56ac1fee8b2c0a5ae630..cacc1b1dd4401aa802adbabefe30cbf42296b7cd 100644 (file)
@@ -60,6 +60,7 @@ ldap_back_add(
        LDAPMod **attrs;
        struct berval mapped;
        struct berval mdn = { 0, NULL };
+       ber_int_t msgid;
 
 #ifdef NEW_LOGGING
        LDAP_LOG( BACK_LDAP, ENTRY, "ldap_back_add: %s\n", e->e_dn, 0, 0 );
@@ -176,7 +177,7 @@ ldap_back_add(
        }
        attrs[i] = NULL;
 
-       ldap_add_s(lc->ld, mdn.bv_val, attrs);
+       j = ldap_add_ext(lc->ld, mdn.bv_val, attrs, op->o_ctrls, NULL, &msgid);
        for (--i; i>= 0; --i) {
                ch_free(attrs[i]->mod_vals.modv_bvals);
                ch_free(attrs[i]);
@@ -186,7 +187,7 @@ ldap_back_add(
                free( mdn.bv_val );
        }
        
-       return( ldap_back_op_result( lc, conn, op ) );
+       return( ldap_back_op_result( lc, conn, op, msgid, j ) );
 }
 
 #ifdef ENABLE_REWRITE
index 585f44720c8b20c3f1276dbea191ae8a97cfddf9..77f09561c5eb65fadb33b4babaa6ae78ed5d786b 100644 (file)
@@ -95,7 +95,8 @@ struct ldapconn *ldap_back_getconn(struct ldapinfo *li, struct slap_conn *conn,
        struct slap_op *op);
 int ldap_back_dobind(struct ldapconn *lc, Connection *conn, Operation *op);
 int ldap_back_map_result(int err);
-int ldap_back_op_result(struct ldapconn *lc, Connection *conn, Operation *op);
+int ldap_back_op_result(struct ldapconn *lc, Connection *conn, Operation *op,
+       ber_int_t msgid, int rc);
 int    back_ldap_LTX_init_module(int argc, char *argv[]);
 
 void ldap_back_dn_massage(struct ldapinfo *li, struct berval *dn,
index 99585edbf97ec444ab56527a04f97a4cd6d13f6f..b24c9402695afa4feee8719bfe1aec8c2bc327e8 100644 (file)
@@ -68,20 +68,13 @@ ldap_back_bind(
 
        struct berval mdn = { 0, NULL };
        int rc = 0;
+       ber_int_t msgid;
 
        lc = ldap_back_getconn(li, conn, op);
        if ( !lc ) {
                return( -1 );
        }
 
-       if ( op->o_ctrls ) {
-               if ( ldap_set_option( lc->ld, LDAP_OPT_SERVER_CONTROLS,
-                                       op->o_ctrls ) != LDAP_SUCCESS ) {
-                       ldap_back_op_result( lc, conn, op );
-                       return( -1 );
-               }
-       }
-       
        /*
         * Rewrite the bind dn if needed
         */
@@ -120,23 +113,23 @@ ldap_back_bind(
                lc->bound_dn.bv_val = NULL;
        }
        lc->bound = 0;
-       rc = ldap_bind_s(lc->ld, mdn.bv_val, cred->bv_val, method);
-       if (rc != LDAP_SUCCESS) {
-               rc = ldap_back_op_result( lc, conn, op );
-       } else {
+       /* method is always LDAP_AUTH_SIMPLE if we got here */
+       rc = ldap_sasl_bind(lc->ld, mdn.bv_val, LDAP_SASL_SIMPLE,
+               cred, op->o_ctrls, NULL, &msgid);
+       rc = ldap_back_op_result( lc, conn, op, msgid, rc );
+       if (rc == LDAP_SUCCESS) {
                lc->bound = 1;
                if ( mdn.bv_val != dn->bv_val ) {
                        lc->bound_dn = mdn;
                } else {
                        ber_dupbv( &lc->bound_dn, dn );
                }
-       }
-
-       if ( li->savecred ) {
-               if ( lc->cred.bv_val )
-                       ch_free( lc->cred.bv_val );
-               ber_dupbv( &lc->cred, cred );
-               ldap_set_rebind_proc( lc->ld, ldap_back_rebind, lc );
+               if ( li->savecred ) {
+                       if ( lc->cred.bv_val )
+                               ch_free( lc->cred.bv_val );
+                       ber_dupbv( &lc->cred, cred );
+                       ldap_set_rebind_proc( lc->ld, ldap_back_rebind, lc );
+               }
        }
 
        /* must re-insert if local DN changed as result of bind */
@@ -419,30 +412,19 @@ ldap_back_getconn(struct ldapinfo *li, Connection *conn, Operation *op)
 int
 ldap_back_dobind( struct ldapconn *lc, Connection *conn, Operation *op )
 {      
-       int rc = 0;
+       int rc;
+       ber_int_t msgid;
 
        ldap_pvt_thread_mutex_lock( &lc->lc_mutex );
-       if ( op->o_ctrls ) {
-               if ( ldap_set_option( lc->ld, LDAP_OPT_SERVER_CONTROLS,
-                               op->o_ctrls ) != LDAP_SUCCESS ) {
-                       ldap_back_op_result( lc, conn, op );
-                       goto leave;
+       if ( !lc->bound ) {
+               rc = ldap_sasl_bind(lc->ld, lc->bound_dn.bv_val,
+                       LDAP_SASL_SIMPLE, &lc->cred, NULL, NULL, &msgid);
+               rc = ldap_back_op_result( lc, conn, op, msgid, rc );
+               if (rc == LDAP_SUCCESS) {
+                       lc->bound = 1;
                }
        }
-       
-       if ( lc->bound ) {
-               rc = lc->bound;
-               goto leave;
-       }
-
-       if ( ldap_bind_s( lc->ld, lc->bound_dn.bv_val, lc->cred.bv_val, 
-                               LDAP_AUTH_SIMPLE ) != LDAP_SUCCESS ) {
-               ldap_back_op_result( lc, conn, op );
-               goto leave;
-       } /* else */
-
-       rc = lc->bound = 1;
-leave:
+       rc = lc->bound;
        ldap_pvt_thread_mutex_unlock( &lc->lc_mutex );
        return rc;
 }
@@ -510,21 +492,28 @@ ldap_back_map_result(int err)
 }
 
 int
-ldap_back_op_result(struct ldapconn *lc, Connection *conn, Operation *op)
+ldap_back_op_result(struct ldapconn *lc, Connection *conn, Operation *op,
+       ber_int_t msgid, int err)
 {
-       int err = LDAP_SUCCESS;
        char *msg = NULL;
        char *match = NULL;
+       LDAPMessage *res;
+       int rc;
 
-       ldap_get_option(lc->ld, LDAP_OPT_ERROR_NUMBER, &err);
+       if (err == LDAP_SUCCESS) {
+               if (ldap_result(lc->ld, msgid, 0, NULL, &res) == -1) {
+                       ldap_get_option(lc->ld, LDAP_OPT_ERROR_NUMBER, &err);
+               } else {
+                       rc = ldap_parse_result(lc->ld, res, &err, &match,
+                               &msg, NULL, NULL, 1);
+                       if (rc != LDAP_SUCCESS) err = rc;
+               }
+       }
+       err = ldap_back_map_result(err);
 
        /* internal ops must not reply to client */
        if ( !conn || op->o_do_not_cache ) goto quiet;
 
-       ldap_get_option(lc->ld, LDAP_OPT_ERROR_STRING, &msg);
-       ldap_get_option(lc->ld, LDAP_OPT_MATCHED_DN, &match);
-       err = ldap_back_map_result(err);
-
 #ifdef ENABLE_REWRITE
        
        /*
index 43e8f93fbfaf8649f876dbb9a14a40ef96b9485c..3b9c101b9234260227e6adf726f171329aab1a46 100644 (file)
@@ -59,6 +59,8 @@ ldap_back_compare(
        struct ldapconn *lc;
        struct berval mapped_oc, mapped_at;
        struct berval mdn = { 0, NULL };
+       int rc;
+       ber_int_t msgid;
 
        lc = ldap_back_getconn(li, conn, op);
        if (!lc || !ldap_back_dobind( lc, conn, op ) ) {
@@ -115,11 +117,12 @@ ldap_back_compare(
                }
        }
 
-       ldap_compare_s( lc->ld, mdn.bv_val, mapped_oc.bv_val, mapped_at.bv_val );
+       rc = ldap_compare_ext( lc->ld, mdn.bv_val, mapped_oc.bv_val,
+               &mapped_at, op->o_ctrls, NULL, &msgid );
 
        if ( mdn.bv_val != dn->bv_val ) {
                free( mdn.bv_val );
        }
        
-       return( ldap_back_op_result( lc, conn, op ) );
+       return( ldap_back_op_result( lc, conn, op, msgid, rc ) );
 }
index b2a8139b49946f192d607b51249a73674def0c55..48ab3c3533a5a8dea8fa144d3cad72cb9ff92e40 100644 (file)
@@ -56,6 +56,8 @@ ldap_back_delete(
 {
        struct ldapinfo *li = (struct ldapinfo *) be->be_private;
        struct ldapconn *lc;
+       int rc;
+       ber_int_t msgid;
 
        struct berval mdn = { 0, NULL };
 
@@ -97,11 +99,11 @@ ldap_back_delete(
        ldap_back_dn_massage( li, dn, &mdn, 0, 1 );
 #endif /* !ENABLE_REWRITE */
        
-       ldap_delete_s( lc->ld, mdn.bv_val );
+       rc = ldap_delete_ext( lc->ld, mdn.bv_val, op->o_ctrls, NULL, &msgid );
 
        if ( mdn.bv_val != dn->bv_val ) {
                free( mdn.bv_val );
        }
        
-       return( ldap_back_op_result( lc, conn, op ) );
+       return( ldap_back_op_result( lc, conn, op, msgid, rc ) );
 }
index 807801b77a3f81e336121786f6835e572c79c479..a44915618dc31536c76c57927849a6d2d2486dcb 100644 (file)
@@ -60,9 +60,10 @@ ldap_back_modify(
        LDAPMod **modv = NULL;
        LDAPMod *mods;
        Modifications *ml;
-       int i, j;
+       int i, j, rc;
        struct berval mapped;
        struct berval mdn = { 0, NULL };
+       ber_int_t msgid;
 
        lc = ldap_back_getconn(li, conn, op);
        if ( !lc || !ldap_back_dobind( lc, conn, op ) ) {
@@ -156,7 +157,7 @@ ldap_back_modify(
        }
        modv[i] = 0;
 
-       ldap_modify_s( lc->ld, mdn.bv_val, modv );
+       rc = ldap_modify_ext( lc->ld, mdn.bv_val, modv, op->o_ctrls, NULL, &msgid );
 
 cleanup:;
 #ifdef ENABLE_REWRITE
@@ -170,6 +171,6 @@ cleanup:;
                ch_free(modv[i]->mod_bvalues);
        ch_free(mods);
        ch_free(modv);
-       return( ldap_back_op_result( lc, conn, op ));
+       return( ldap_back_op_result( lc, conn, op, msgid, rc ));
 }
 
index 729822d155c0865fbe53e90ae718aa297a5f2167..1dd14ea1fc781fdd6e440a3dcda099e66547c85f 100644 (file)
@@ -61,6 +61,8 @@ ldap_back_modrdn(
 {
        struct ldapinfo *li = (struct ldapinfo *) be->be_private;
        struct ldapconn *lc;
+       int rc;
+       ber_int_t msgid;
 
        struct berval mdn = { 0, NULL }, mnewSuperior = { 0, NULL };
 
@@ -146,7 +148,8 @@ ldap_back_modrdn(
        ldap_back_dn_massage( li, dn, &mdn, 0, 1 );
 #endif /* !ENABLE_REWRITE */
 
-       ldap_rename2_s( lc->ld, mdn.bv_val, newrdn->bv_val, mnewSuperior.bv_val, deleteoldrdn );
+       rc = ldap_rename( lc->ld, mdn.bv_val, newrdn->bv_val, mnewSuperior.bv_val,
+               deleteoldrdn, op->o_ctrls, NULL, &msgid );
 
        if ( mdn.bv_val != dn->bv_val ) {
                free( mdn.bv_val );
@@ -156,5 +159,5 @@ ldap_back_modrdn(
                free( mnewSuperior.bv_val );
        }
        
-       return( ldap_back_op_result( lc, conn, op ) );
+       return( ldap_back_op_result( lc, conn, op, msgid, rc ) );
 }
index 0b8ef161ac189240ef959832a66d0563fa4000ea..d4d8051a5d0af7593deac070a59545dad5c52be6 100644 (file)
@@ -90,8 +90,6 @@ ldap_back_search(
        }
 
        /*
-        * controls are set in ldap_back_dobind()
-        * 
         * FIXME: in case of values return filter, we might want
         * to map attrs and maybe rewrite value
         */
@@ -149,10 +147,12 @@ ldap_back_search(
        /* should we check return values? */
        if (deref != -1)
                ldap_set_option( lc->ld, LDAP_OPT_DEREF, (void *)&deref);
-       if (tlimit != -1)
-               ldap_set_option( lc->ld, LDAP_OPT_TIMELIMIT, (void *)&tlimit);
-       if (slimit != -1)
-               ldap_set_option( lc->ld, LDAP_OPT_SIZELIMIT, (void *)&slimit);
+       if (tlimit != -1) {
+               tv.tv_sec = tlimit;
+               tv.tv_usec = 0;
+       } else {
+               tv.tv_sec = 0;
+       }
 
        /*
         * Rewrite the search base, if required
@@ -260,11 +260,12 @@ ldap_back_search(
                mapped_attrs[count] = NULL;
        }
 
-       msgid = ldap_search(lc->ld, mbase.bv_val, scope, mapped_filter,
-                       mapped_attrs, attrsonly);
-       if ( msgid == -1 ) {
+       rc = ldap_search_ext(lc->ld, mbase.bv_val, scope, mapped_filter,
+                       mapped_attrs, attrsonly, op->o_ctrls, NULL, tv.tv_sec ? &tv
+                       : NULL, slimit, &msgid);
+       if ( rc != LDAP_SUCCESS ) {
 fail:;
-               rc = ldap_back_op_result(lc, conn, op);
+               rc = ldap_back_op_result(lc, conn, op, msgid, rc);
                goto finish;
        }
 
@@ -339,10 +340,10 @@ fail:;
                        }
 
                } else {
-                       sres = ldap_result2error(lc->ld, res, 1);
+                       rc = ldap_parse_result(lc->ld, res, &sres, &match,
+                               &err, NULL, NULL, 1);
+                       if (rc != LDAP_SUCCESS ) sres = rc;
                        sres = ldap_back_map_result(sres);
-                       ldap_get_option(lc->ld, LDAP_OPT_ERROR_STRING, &err);
-                       ldap_get_option(lc->ld, LDAP_OPT_MATCHED_DN, &match);
                        rc = 0;
                        break;
                }