struct berval rdi_unsolicited_data;
unsigned rdi_flags;
-#define RDI_DISCONNECT (0x1U)
+#define RDI_PRE_DISCONNECT (0x1U)
+#define RDI_POST_DISCONNECT (0x2U)
struct retcode_item_t *rdi_next;
} retcode_item_t;
rs->sr_text = "retcode not found";
} else {
- if ( rdi->rdi_flags & RDI_DISCONNECT ) {
+ if ( rdi->rdi_flags & RDI_PRE_DISCONNECT ) {
return rs->sr_err = SLAPD_DISCONNECT;
}
}
rs->sr_matched = NULL;
rs->sr_text = NULL;
+
+ if ( rdi && rdi->rdi_flags & RDI_POST_DISCONNECT ) {
+ return rs->sr_err = SLAPD_DISCONNECT;
+ }
break;
}
Attribute *a;
int err;
char *next;
+ int disconnect = 0;
if ( get_manageDSAit( op ) ) {
return SLAP_CB_CONTINUE;
/* disconnect */
a = attr_find( e->e_attrs, ad_errDisconnect );
- if ( a != NULL && bvmatch( &a->a_nvals[ 0 ], &slap_true_bv ) ) {
- return rs->sr_err = SLAPD_DISCONNECT;
+ if ( a != NULL ) {
+ if ( bvmatch( &a->a_nvals[ 0 ], &slap_true_bv ) ) {
+ return rs->sr_err = SLAPD_DISCONNECT;
+ }
+ disconnect = 1;
}
/* error code */
op->o_bd = o_bd;
op->o_callback = o_callback;
}
-
+
if ( rs->sr_err != LDAP_SUCCESS ) {
+ if ( disconnect ) {
+ return rs->sr_err = SLAPD_DISCONNECT;
+ }
+
op->o_abandon = 1;
return rs->sr_err;
}
} else if ( strncasecmp( argv[ i ], "flags=", STRLENOF( "flags=" ) ) == 0 )
{
- if ( strcasecmp( &argv[ i ][ STRLENOF( "flags=" ) ], "disconnect" ) == 0 ) {
- rdi.rdi_flags |= RDI_DISCONNECT;
+ char *arg = &argv[ i ][ STRLENOF( "flags=" ) ];
+ if ( strcasecmp( arg, "disconnect" ) == 0 ) {
+ rdi.rdi_flags |= RDI_PRE_DISCONNECT;
+
+ } else if ( strcasecmp( arg, "pre-disconnect" ) == 0 ) {
+ rdi.rdi_flags |= RDI_PRE_DISCONNECT;
+
+ } else if ( strcasecmp( arg, "post-disconnect" ) == 0 ) {
+ rdi.rdi_flags |= RDI_POST_DISCONNECT;
} else {
fprintf( stderr, "%s: line %d: retcode: "
"unknown flag \"%s\".\n",
- fname, lineno, &argv[ i ][ STRLENOF( "flags=" ) ] );
+ fname, lineno, arg );
return 1;
}