+ rs->sr_err = slapi_pblock_set( pb, SLAPI_EXT_OP_REQ_VALUE,
+ (void *)&reqdata);
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ rs->sr_err = LDAP_OTHER;
+ goto done;
+ }
+
+ rs->sr_err = slapi_x_pblock_set_operation( pb, op );
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ rs->sr_err = LDAP_OTHER;
+ goto done;
+ }
+
+ extop_rc = (*funcAddr)( pb );
+ if ( extop_rc == SLAPI_PLUGIN_EXTENDED_SENT_RESULT ) {
+ msg_sent = TRUE;
+
+ } else if ( extop_rc == SLAPI_PLUGIN_EXTENDED_NOT_HANDLED ) {
+ rs->sr_err = LDAP_PROTOCOL_ERROR;
+ rs->sr_text = UNSUPPORTED_EXTENDEDOP;
+
+ } else {
+ rs->sr_err = slapi_pblock_get( pb, SLAPI_EXT_OP_RET_OID,
+ &rs->sr_rspoid);
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ goto done2;
+ }
+
+ rs->sr_err = slapi_pblock_get( pb, SLAPI_EXT_OP_RET_VALUE,
+ &rs->sr_rspdata);
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ goto done2;
+ }
+
+ rs->sr_err = extop_rc;
+ send_ldap_extended( op, rs );
+ msg_sent = TRUE;
+ }
+
+done2:;
+ if ( rs->sr_err != LDAP_SUCCESS && msg_sent == FALSE ) {
+ send_ldap_result( op, rs );
+ }
+
+ if ( rs->sr_rspoid != NULL ) {
+ ch_free( (char *)rs->sr_rspoid );
+ }
+
+ if ( rs->sr_rspdata != NULL ) {
+ ber_bvfree( rs->sr_rspdata );
+ }
+ } else { /* start of OpenLDAP extended operation */
+#endif /* defined( LDAP_SLAPI ) */
+ if (reqdata.bv_val) op->ore_reqdata = &reqdata;
+ rs->sr_err = (ext->ext_main)( op, rs );
+
+ if( rs->sr_err != SLAPD_ABANDON ) {
+ if ( rs->sr_err == LDAP_REFERRAL && rs->sr_ref == NULL ) {
+ rs->sr_ref = referral_rewrite( default_referral,
+ NULL, NULL, LDAP_SCOPE_DEFAULT );
+ }
+
+ send_ldap_extended( op, rs );
+
+ ber_bvarray_free( rs->sr_ref );
+ }
+
+ if ( rs->sr_rspoid != NULL ) {
+ free( (char *)rs->sr_rspoid );
+ }
+
+ if ( rs->sr_rspdata != NULL ) {
+ ber_bvfree( rs->sr_rspdata );
+ }
+#ifdef LDAP_SLAPI
+ } /* end of OpenLDAP extended operation */
+#endif /* LDAP_SLAPI */