[Date Prev][Date Next] [Chronological] [Thread] [Top]

(ITS#5328) backends sending/setting results



Full_Name: Hallvard B Furuseth
Version: HEAD
OS: Linux
URL: 
Submission from: (NULL) (129.240.6.233)
Submitted by: hallvard


back-relay's be_extended could send a result, but be_extended should
only set/return it and leave it to the frontend to send it.
Just fixed by Pierangelo.

Looking at the code, some overlays also send results when used as
be_extended: pcache:pcache_op_privdb(), retcode, rwm, slapi_overlay.


More about back-relay:

- it fails to send anything if the Delete operation is not supported.

- be_abandon, be_chk_referrals and be_operational can return either an
  LDAP result code, or 0 or 1 (which become success and operationError
  if they get used as result codes).  I don't know if that matters.

Back-relay operations can be factored out to something like this:

int
relay_back_op(
	Operation	*op,
	SlapReply	*rs,
	BackendDB	*bd,
	BI_op_func	*func,
	Fail_Type	fail_mode )
{
	int rc = fail_mode;

	if ( func ) {
		BackendDB	*be = op->o_bd;
		slap_callback	cb;

		relay_back_add_cb( &cb, op );

		op->o_bd = bd;
		rc = func( op, rs );
		op->o_bd = be;

		if ( op->o_callback == &cb ) {
			op->o_callback = op->o_callback->sc_next;
		}

	} else if ( fail_mode > Fail_1 ) {
		rc = rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
		rs->sr_text = "operation not supported within naming context";
		if ( fail_mode == Fail_send ) {
			send_ldap_result( op, rs );
			rc = 1;
		}
	}

	return rc;
}

...
  return relay_back_op( op, rs, bd, bd->be_bind,          Fail_send );
  (void) relay_back_op( op, rs, bd, bd->be_unbind, Fail_0 ); return 0;
  return relay_back_op( op, rs, bd, bd->be_search,        Fail_send );
  return relay_back_op( op, rs, bd, bd->be_compare,       Fail_send );
  return relay_back_op( op, rs, bd, bd->be_modify,        Fail_send );
  return relay_back_op( op, rs, bd, bd->be_modrdn,        Fail_send );
  return relay_back_op( op, rs, bd, bd->be_add,           Fail_send );
  return relay_back_op( op, rs, bd, bd->be_delete,        Fail_send );
  return relay_back_op( op, rs, bd, bd->be_abandon,       Fail_1 );
  return relay_back_op( op, rs, bd, bd->be_cancel,        Fail_send );
  return relay_back_op( op, rs, bd, bd->be_extended,      Fail_unwilling );
  return relay_back_op( op, rs, bd, bd->be_chk_referrals, Fail_0 );
  return relay_back_op( op, rs, bd, bd->be_operational,   Fail_1 );