diff --git a/include/ldap.h b/include/ldap.h index 42c7355c5c..f7a10c5c29 100644 --- a/include/ldap.h +++ b/include/ldap.h @@ -187,12 +187,13 @@ typedef struct ldapcontrol { #define LDAP_CHASE_EXTERNAL_REFERRALS 0x0040U #endif +#define LDAP_CONTROL_SUBENTRIES "1.3.6.1.4.1.4203.666.5.1" #define LDAP_CONTROL_MANAGEDSAIT "2.16.840.1.113730.3.4.2" -#define LDAP_CONTROL_DUPENT LDAP_CONTROL_DUPENT_REQUEST #define LDAP_CONTROL_DUPENT_REQUEST "2.16.840.1.113719.1.27.101.1" #define LDAP_CONTROL_DUPENT_RESPONSE "2.16.840.1.113719.1.27.101.2" #define LDAP_CONTROL_DUPENT_ENTRY "2.16.840.1.113719.1.27.101.3" +#define LDAP_CONTROL_DUPENT LDAP_CONTROL_DUPENT_REQUEST /* Experimental Controls */ diff --git a/servers/slapd/controls.c b/servers/slapd/controls.c index b5e5b9db5d..9782433128 100644 --- a/servers/slapd/controls.c +++ b/servers/slapd/controls.c @@ -21,6 +21,7 @@ char *supportedControls[] = { LDAP_CONTROL_MANAGEDSAIT, + LDAP_CONTROL_SUBENTRIES, NULL }; @@ -244,3 +245,26 @@ int get_manageDSAit( Operation *op ) return SLAP_NO_CONTROL; } + +int get_subentries( Operation *op, int *visibility ) +{ + int i; + if( op == NULL || op->o_ctrls == NULL ) { + return SLAP_NO_CONTROL; + } + + for( i=0; op->o_ctrls[i] != NULL; i++ ) { + if( strcmp( LDAP_CONTROL_SUBENTRIES, + op->o_ctrls[i]->ldctl_oid ) == 0 ) + { + /* need to parse the value */ + *visibility = 0; + + return op->o_ctrls[i]->ldctl_iscritical + ? SLAP_CRITICAL_CONTROL + : SLAP_NONCRITICAL_CONTROL; + } + } + + return SLAP_NO_CONTROL; +} diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index bd53592575..998d5f1383 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -297,6 +297,7 @@ LDAP_SLAPD_F (int) get_ctrls LDAP_P(( int senderrors )); LDAP_SLAPD_F (int) get_manageDSAit LDAP_P(( Operation *op )); +LDAP_SLAPD_F (int) get_subentries LDAP_P(( Operation *op, int *visibility )); /* * config.c