]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/controls.c
Partially revert prev commit, leave rs->sr_err == SLAPD_ABANDON
[openldap] / servers / slapd / controls.c
index b812bf6b153c5b4637492811d5402b78cd64306c..93476070d1a8b3a86e03933ef59d78cedca8d0ca 100644 (file)
@@ -1,7 +1,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2008 The OpenLDAP Foundation.
+ * Copyright 1998-2009 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -123,8 +123,7 @@ static char *session_tracking_extops[] = {
 static struct slap_control control_defs[] = {
        {  LDAP_CONTROL_ASSERT,
                (int)offsetof(struct slap_control_ids, sc_assert),
-               SLAP_CTRL_DELETE|SLAP_CTRL_MODIFY|SLAP_CTRL_RENAME|
-                       SLAP_CTRL_COMPARE|SLAP_CTRL_SEARCH,
+               SLAP_CTRL_UPDATE|SLAP_CTRL_COMPARE|SLAP_CTRL_SEARCH,
                NULL, NULL,
                parseAssert, LDAP_SLIST_ENTRY_INITIALIZER(next) },
        { LDAP_CONTROL_PRE_READ,
@@ -540,6 +539,37 @@ void slap_free_ctrls(
        op->o_tmpfree( ctrls, op->o_tmpmemctx );
 }
 
+int slap_add_ctrls(
+       Operation *op,
+       SlapReply *rs,
+       LDAPControl **ctrls )
+{
+       int i = 0, j;
+       LDAPControl **ctrlsp;
+
+       if ( rs->sr_ctrls ) {
+               for ( ; rs->sr_ctrls[ i ]; i++ ) ;
+       }
+
+       for ( j=0; ctrls[j]; j++ ) ;
+
+       ctrlsp = op->o_tmpalloc(( i+j+1 )*sizeof(LDAPControl *), op->o_tmpmemctx );
+       i = 0;
+       if ( rs->sr_ctrls ) {
+               for ( ; rs->sr_ctrls[i]; i++ )
+                       ctrlsp[i] = rs->sr_ctrls[i];
+       }
+       for ( j=0; ctrls[j]; j++)
+               ctrlsp[i++] = ctrls[j];
+       ctrlsp[i] = NULL;
+
+       if ( rs->sr_flags & REP_CTRLS_MUSTBEFREED )
+               op->o_tmpfree( rs->sr_ctrls, op->o_tmpmemctx );
+       rs->sr_ctrls = ctrlsp;
+       rs->sr_flags |= REP_CTRLS_MUSTBEFREED;
+       return i;
+}
+
 int slap_parse_ctrl(
        Operation *op,
        SlapReply *rs,
@@ -863,7 +893,9 @@ return_results:
                                }
 
                                if ( get_whatFailed( op ) ) {
-                                       char *oids[ 2 ] = { failed_oid, NULL };
+                                       char *oids[ 2 ];
+                                       oids[ 0 ] = failed_oid;
+                                       oids[ 1 ] = NULL;
                                        slap_ctrl_whatFailed_add( op, rs, oids );
                                }
                        }