.hy 0
.B retcode\-item <RDN> <errCode> [op=<oplist>] [text=<message>]
.B [ref=<referral>] [sleeptime=<sec>] [matched=<DN>]
-.B [unsolicited=<OID>[:<data>]] [flags=disconnect[,...]]
+.B [unsolicited=<OID>[:<data>]] [flags=[{pre|post}-]disconnect[,...]]
.RS
A dynamically generated entry, located below \fBretcode\-parent\fP.
The \fBerrCode\fP is the number of the response code;
of an RFC 4511 unsolicited response message; if \fBOID\fP
is not "0", an extended response is generated, with the optional
\fBdata\fP appended.
-If \fBflags\fP contains \fBdisconnect\fP,
+If \fBflags\fP contains \fBdisconnect\fP, or \fBpre-disconnect\fP,
.BR slapd (8)
-disconnects abruptly, without notice.
+disconnects abruptly, without notice; \fBpost-disconnect\fP
+causes disconnection right after sending response as appropriate.
.RE
.TP
.B retcode\-indir
.LP
If TRUE,
.BR slapd (8)
-disconnects abruptly without notice:
+disconnects abruptly without notice; if FALSE, it disconnects
+after sending response as appropriate:
.RS 4
( 1.3.6.1.4.1.4203.666.11.4.1.8
NAME ( 'errDisconnect' )
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;
}
retcode-parent "ou=RetCodes,dc=example,dc=com"
include @DATADIR@/retcode.conf
+retcode-item "cn=Unsolicited" 0x00 unsolicited="0"
+retcode-item "cn=Notice of Disconnect" 0x00 unsolicited="1.3.6.1.4.1.1466.20036"
+retcode-item "cn=Pre-disconnect" 0x34 flags="pre-disconnect"
+retcode-item "cn=Post-disconnect" 0x34 flags="post-disconnect"
+
#monitor#database monitor