Diff for /servers/slapd/slap.h between versions 1.612 and 1.612.2.37

version 1.612, 2004/12/07 23:47:24 version 1.612.2.37, 2006/01/03 22:16:15
Line 1 Line 1
 /* slap.h - stand alone ldap server include file */  /* slap.h - stand alone ldap server include file */
 /* $OpenLDAP: pkg/ldap/servers/slapd/slap.h,v 1.611 2004/12/07 17:40:47 kurt Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/slap.h,v 1.612.2.36 2006/01/02 16:57:27 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 1998-2004 The OpenLDAP Foundation.   * Copyright 1998-2006 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 58 Line 58
   
 LDAP_BEGIN_DECL  LDAP_BEGIN_DECL
   
   
   #ifdef LDAP_DEVEL
   #define SLAP_LIGHTWEIGHT_DISPATCHER /* experimental slapd architecture */
   #define SLAP_MULTI_CONN_ARRAY
   #ifdef LDAP_PVT_THREAD_POOL_SEM_LOAD_CONTROL
   #define SLAP_SEM_LOAD_CONTROL
   #endif /* LDAP_PVT_THREAD_POOL_SEM_LOAD_CONTROL */
   
   #define SLAP_ACL_HONOR_DISCLOSE /* partially implemented */
   #define SLAP_ACL_HONOR_MANAGE   /* not yet implemented */
   #define SLAP_DYNACL
   #define SLAP_OVERLAY_ACCESS
   #define LDAP_COMP_MATCH
   #define LDAP_DYNAMIC_OBJECTS
   #define LDAP_SYNC_TIMESTAMP
   #define LDAP_COLLECTIVE_ATTRIBUTES
   #define SLAPD_CONF_UNKNOWN_BAILOUT
   #define SLAP_CONTROL_X_TREE_DELETE LDAP_CONTROL_X_TREE_DELETE
   
   #define SLAP_ORDERED_PRETTYNORM
   #define SLAP_AUTHZ_SYNTAX
   
   #ifdef ENABLE_REWRITE
   #define SLAP_AUTH_REWRITE       1 /* use librewrite for sasl-regexp */
   #endif
   #endif
   
   #if defined(LDAP_SLAPI) && !defined(SLAP_OVERLAY_ACCESS)
   #define SLAP_OVERLAY_ACCESS
   #endif
   
   /*
    * ITS#3705: bail out if unknown config directives appear in slapd.conf
    */
   #ifdef SLAPD_CONF_UNKNOWN_BAILOUT
   #define SLAPD_CONF_UNKNOWN_IGNORED      ""
   #define SLAPD_DEBUG_CONFIG_ERROR        LDAP_DEBUG_ANY
   #else /* ! SLAPD_CONF_UNKNOWN_BAILOUT */
   #define SLAPD_CONF_UNKNOWN_IGNORED      " (ignored)"
   #define SLAPD_DEBUG_CONFIG_ERROR        LDAP_DEBUG_CONFIG
   #endif /* ! SLAPD_CONF_UNKNOWN_BAILOUT */
   
 /*  /*
  * SLAPD Memory allocation macros   * SLAPD Memory allocation macros
  *   *
Line 81  LDAP_BEGIN_DECL Line 123  LDAP_BEGIN_DECL
 #endif  #endif
   
 #define SERVICE_NAME  OPENLDAP_PACKAGE "-slapd"  #define SERVICE_NAME  OPENLDAP_PACKAGE "-slapd"
 #define SLAPD_ANONYMOUS "cn=anonymous"  #define SLAPD_ANONYMOUS ""
   
 /* LDAPMod.mod_op value ===> Must be kept in sync with ldap.h!  /* LDAPMod.mod_op value ===> Must be kept in sync with ldap.h!
  * This is a value used internally by the backends. It is needed to allow   * This is a value used internally by the backends. It is needed to allow
Line 94  LDAP_BEGIN_DECL Line 136  LDAP_BEGIN_DECL
   
 #define SLAP_MAX_WORKER_THREADS         (16)  #define SLAP_MAX_WORKER_THREADS         (16)
   
 #define SLAP_MAX_SYNCREPL_THREADS       (8)  
   
 #define SLAP_SB_MAX_INCOMING_DEFAULT ((1<<18) - 1)  #define SLAP_SB_MAX_INCOMING_DEFAULT ((1<<18) - 1)
 #define SLAP_SB_MAX_INCOMING_AUTH ((1<<24) - 1)  #define SLAP_SB_MAX_INCOMING_AUTH ((1<<24) - 1)
   
Line 174  LDAP_BEGIN_DECL Line 214  LDAP_BEGIN_DECL
   
 #ifdef SLAPD_ACI_ENABLED  #ifdef SLAPD_ACI_ENABLED
 #define SLAPD_ACI_SYNTAX                "1.3.6.1.4.1.4203.666.2.1"  #define SLAPD_ACI_SYNTAX                "1.3.6.1.4.1.4203.666.2.1"
 #endif  #endif /* SLAPD_ACI_ENABLED */
   
 /* change this to "OpenLDAPset" */  /* change this to "OpenLDAPset" */
 #define SLAPD_ACI_SET_ATTR              "template"  #define SLAPD_ACI_SET_ATTR              "template"
Line 262  typedef struct slap_ssf_set { Line 302  typedef struct slap_ssf_set {
 /*  /*
  * represents schema information for a database   * represents schema information for a database
  */   */
 #define SLAP_SCHERR_OUTOFMEM                    1  enum {
 #define SLAP_SCHERR_CLASS_NOT_FOUND             2          SLAP_SCHERR_OUTOFMEM = 1,
 #define SLAP_SCHERR_CLASS_BAD_USAGE             3          SLAP_SCHERR_CLASS_NOT_FOUND,
 #define SLAP_SCHERR_CLASS_BAD_SUP               4          SLAP_SCHERR_CLASS_BAD_USAGE,
 #define SLAP_SCHERR_CLASS_DUP                   5          SLAP_SCHERR_CLASS_BAD_SUP,
 #define SLAP_SCHERR_ATTR_NOT_FOUND              6          SLAP_SCHERR_CLASS_DUP,
 #define SLAP_SCHERR_ATTR_BAD_MR                 7          SLAP_SCHERR_CLASS_INCONSISTENT,
 #define SLAP_SCHERR_ATTR_BAD_USAGE              8          SLAP_SCHERR_ATTR_NOT_FOUND,
 #define SLAP_SCHERR_ATTR_BAD_SUP                9          SLAP_SCHERR_ATTR_BAD_MR,
 #define SLAP_SCHERR_ATTR_INCOMPLETE             10          SLAP_SCHERR_ATTR_BAD_USAGE,
 #define SLAP_SCHERR_ATTR_DUP                    11          SLAP_SCHERR_ATTR_BAD_SUP,
 #define SLAP_SCHERR_MR_NOT_FOUND                12          SLAP_SCHERR_ATTR_INCOMPLETE,
 #define SLAP_SCHERR_MR_INCOMPLETE               13          SLAP_SCHERR_ATTR_DUP,
 #define SLAP_SCHERR_MR_DUP                              14          SLAP_SCHERR_ATTR_INCONSISTENT,
 #define SLAP_SCHERR_SYN_NOT_FOUND               15          SLAP_SCHERR_MR_NOT_FOUND,
 #define SLAP_SCHERR_SYN_DUP                             16          SLAP_SCHERR_MR_INCOMPLETE,
 #define SLAP_SCHERR_NO_NAME                             17          SLAP_SCHERR_MR_DUP,
 #define SLAP_SCHERR_NOT_SUPPORTED               18          SLAP_SCHERR_SYN_NOT_FOUND,
 #define SLAP_SCHERR_BAD_DESCR                   19          SLAP_SCHERR_SYN_DUP,
 #define SLAP_SCHERR_OIDM                                20          SLAP_SCHERR_NO_NAME,
 #define SLAP_SCHERR_CR_DUP                              21          SLAP_SCHERR_NOT_SUPPORTED,
 #define SLAP_SCHERR_CR_BAD_STRUCT               22          SLAP_SCHERR_BAD_DESCR,
 #define SLAP_SCHERR_CR_BAD_AUX                  23          SLAP_SCHERR_OIDM,
 #define SLAP_SCHERR_CR_BAD_AT                   24          SLAP_SCHERR_CR_DUP,
 #define SLAP_SCHERR_LAST                                SLAP_SCHERR_CR_BAD_AT          SLAP_SCHERR_CR_BAD_STRUCT,
           SLAP_SCHERR_CR_BAD_AUX,
           SLAP_SCHERR_CR_BAD_AT,
   
           SLAP_SCHERR_LAST
   };
   
 typedef union slap_sockaddr {  typedef union slap_sockaddr {
         struct sockaddr sa_addr;          struct sockaddr sa_addr;
Line 306  extern int slap_inet4or6; Line 351  extern int slap_inet4or6;
   
 typedef struct slap_oid_macro {  typedef struct slap_oid_macro {
         struct berval som_oid;          struct berval som_oid;
         char **som_names;          BerVarray som_names;
         LDAP_SLIST_ENTRY(slap_oid_macro) som_next;          BerVarray som_subs;
   #define SLAP_OM_HARDCODE        0x10000U        /* This is hardcoded schema */
           int som_flags;
           LDAP_STAILQ_ENTRY(slap_oid_macro) som_next;
 } OidMacro;  } OidMacro;
   
 /* forward declarations */  /* forward declarations */
Line 324  typedef int slap_syntax_transform_func L Line 372  typedef int slap_syntax_transform_func L
         struct berval * out,          struct berval * out,
         void *memctx));          void *memctx));
   
 #ifdef LDAP_DEVEL  
 #define LDAP_COMP_MATCH  
 #endif  
   
 #ifdef LDAP_COMP_MATCH  #ifdef LDAP_COMP_MATCH
 typedef void* slap_component_transform_func LDAP_P((  typedef void* slap_component_transform_func LDAP_P((
         struct berval * in ));          struct berval * in ));
Line 467  typedef struct slap_matching_rule { Line 511  typedef struct slap_matching_rule {
 #define SLAP_MR_HIDE                    0x8000U  #define SLAP_MR_HIDE                    0x8000U
 #endif  #endif
   
   #define SLAP_MR_MUTATION_NORMALIZER 0x4000U
   
 #define SLAP_MR_TYPE_MASK               0x0F00U  #define SLAP_MR_TYPE_MASK               0x0F00U
 #define SLAP_MR_SUBTYPE_MASK    0x00F0U  #define SLAP_MR_SUBTYPE_MASK    0x00F0U
 #define SLAP_MR_USAGE                   0x000FU  #define SLAP_MR_USAGE                   0x000FU
Line 625  typedef struct slap_attribute_type { Line 671  typedef struct slap_attribute_type {
         Syntax                                  *sat_syntax;          Syntax                                  *sat_syntax;
   
         AttributeTypeSchemaCheckFN      *sat_check;          AttributeTypeSchemaCheckFN      *sat_check;
           char                                    *sat_oidmacro;
   
 #define SLAP_AT_NONE            0x0000U  #define SLAP_AT_NONE                    0x0000U
 #define SLAP_AT_ABSTRACT        0x0100U /* cannot be instantiated */  #define SLAP_AT_ABSTRACT                0x0100U /* cannot be instantiated */
 #define SLAP_AT_FINAL           0x0200U /* cannot be subtyped */  #define SLAP_AT_FINAL                   0x0200U /* cannot be subtyped */
 #ifdef LDAP_DEVEL  #ifdef LDAP_DEVEL
 #define SLAP_AT_HIDE            0x0000U /* publish everything */  #define SLAP_AT_HIDE                    0x0000U /* publish everything */
 #else  #else
 #define SLAP_AT_HIDE            0x8000U /* hide attribute */  #define SLAP_AT_HIDE                    0x8000U /* hide attribute */
 #endif  #endif
 #define SLAP_AT_DYNAMIC         0x0400U /* dynamically generated */  #define SLAP_AT_DYNAMIC                 0x0400U /* dynamically generated */
   
   #define SLAP_AT_MANAGEABLE              0x0800U /* no-user-mod can be by-passed */
   
   #define SLAP_AT_ORDERED_VAL             0x0001U /* values are ordered */
   #define SLAP_AT_ORDERED_SIB             0x0002U /* siblings are ordered */
   #define SLAP_AT_ORDERED                 0x0003U /* value has order index */
   
   #define SLAP_AT_HARDCODE        0x10000U        /* hardcoded schema */
   
         slap_mask_t                                     sat_flags;          slap_mask_t                                     sat_flags;
   
         LDAP_SLIST_ENTRY(slap_attribute_type) sat_next;          LDAP_STAILQ_ENTRY(slap_attribute_type) sat_next;
   
 #define sat_oid                         sat_atype.at_oid  #define sat_oid                         sat_atype.at_oid
 #define sat_names                       sat_atype.at_names  #define sat_names                       sat_atype.at_names
Line 681  typedef struct slap_object_class { Line 736  typedef struct slap_object_class {
         AttributeType                           **soc_required;          AttributeType                           **soc_required;
         AttributeType                           **soc_allowed;          AttributeType                           **soc_allowed;
         ObjectClassSchemaCheckFN        *soc_check;          ObjectClassSchemaCheckFN        *soc_check;
           char                                    *soc_oidmacro;
         slap_mask_t                                     soc_flags;          slap_mask_t                                     soc_flags;
 #define soc_oid                         soc_oclass.oc_oid  #define soc_oid                         soc_oclass.oc_oid
 #define soc_names                       soc_oclass.oc_names  #define soc_names                       soc_oclass.oc_names
Line 692  typedef struct slap_object_class { Line 748  typedef struct slap_object_class {
 #define soc_at_oids_may         soc_oclass.oc_at_oids_may  #define soc_at_oids_may         soc_oclass.oc_at_oids_may
 #define soc_extensions          soc_oclass.oc_extensions  #define soc_extensions          soc_oclass.oc_extensions
   
         LDAP_SLIST_ENTRY(slap_object_class) soc_next;          LDAP_STAILQ_ENTRY(slap_object_class) soc_next;
 } ObjectClass;  } ObjectClass;
   
   #define SLAP_OCF_SET_FLAGS      0x1
   #define SLAP_OCF_CHECK_SUP      0x2
   #define SLAP_OCF_MASK           (SLAP_OCF_SET_FLAGS|SLAP_OCF_CHECK_SUP)
   
 #define SLAP_OC_ALIAS           0x0001  #define SLAP_OC_ALIAS           0x0001
 #define SLAP_OC_REFERRAL        0x0002  #define SLAP_OC_REFERRAL        0x0002
 #define SLAP_OC_SUBENTRY        0x0004  #define SLAP_OC_SUBENTRY        0x0004
Line 711  typedef struct slap_object_class { Line 771  typedef struct slap_object_class {
 #else  #else
 #define SLAP_OC_HIDE            0x8000  #define SLAP_OC_HIDE            0x8000
 #endif  #endif
   #define SLAP_OC_HARDCODE        0x10000U        /* This is hardcoded schema */
   
 /*  /*
  * DIT content rule   * DIT content rule
Line 731  typedef struct slap_content_rule { Line 792  typedef struct slap_content_rule {
 #define scr_at_oids_may         scr_crule.cr_at_oids_may  #define scr_at_oids_may         scr_crule.cr_at_oids_may
 #define scr_at_oids_not         scr_crule.cr_at_oids_not  #define scr_at_oids_not         scr_crule.cr_at_oids_not
   
         LDAP_SLIST_ENTRY( slap_content_rule ) scr_next;          char                            *scr_oidmacro;
   #define         SLAP_CR_HARDCODE        0x10000U
           int     scr_flags;
   
           LDAP_STAILQ_ENTRY( slap_content_rule ) scr_next;
 } ContentRule;  } ContentRule;
   
 /* Represents a recognized attribute description ( type + options ). */  /* Represents a recognized attribute description ( type + options ). */
Line 746  typedef struct slap_attr_desc { Line 811  typedef struct slap_attr_desc {
 #define SLAP_DESC_TAG_RANGE             0x80U  #define SLAP_DESC_TAG_RANGE             0x80U
 } AttributeDescription;  } AttributeDescription;
   
   /* flags to slap_*2undef_ad to register undefined (0, the default)
    * or proxied (SLAP_AD_PROXIED) AttributeDescriptions; the additional
    * SLAP_AD_NOINSERT is to lookup without insert */
   #define SLAP_AD_UNDEF                   0x00U
   #define SLAP_AD_PROXIED                 0x01U
   #define SLAP_AD_NOINSERT                0x02U
   
 typedef struct slap_attr_name {  typedef struct slap_attr_name {
         struct berval an_name;          struct berval an_name;
         AttributeDescription *an_desc;          AttributeDescription *an_desc;
Line 812  struct slap_internal_schema { Line 884  struct slap_internal_schema {
         AttributeDescription *si_ad_monitorContext;          AttributeDescription *si_ad_monitorContext;
         AttributeDescription *si_ad_vendorName;          AttributeDescription *si_ad_vendorName;
         AttributeDescription *si_ad_vendorVersion;          AttributeDescription *si_ad_vendorVersion;
           AttributeDescription *si_ad_configContext;
   
         /* subentry attribute descriptions */          /* subentry attribute descriptions */
         AttributeDescription *si_ad_administrativeRole;          AttributeDescription *si_ad_administrativeRole;
Line 836  struct slap_internal_schema { Line 909  struct slap_internal_schema {
         AttributeDescription *si_ad_children;          AttributeDescription *si_ad_children;
         AttributeDescription *si_ad_saslAuthzTo;          AttributeDescription *si_ad_saslAuthzTo;
         AttributeDescription *si_ad_saslAuthzFrom;          AttributeDescription *si_ad_saslAuthzFrom;
 #ifdef SLAPD_ACI_ENABLED  
         AttributeDescription *si_ad_aci;  
 #endif  
   
         /* dynamic entries */          /* dynamic entries */
         AttributeDescription *si_ad_entryTtl;          AttributeDescription *si_ad_entryTtl;
Line 849  struct slap_internal_schema { Line 919  struct slap_internal_schema {
         AttributeDescription *si_ad_name;          AttributeDescription *si_ad_name;
         AttributeDescription *si_ad_cn;          AttributeDescription *si_ad_cn;
         AttributeDescription *si_ad_uid;          AttributeDescription *si_ad_uid;
           AttributeDescription *si_ad_uidNumber;
           AttributeDescription *si_ad_gidNumber;
         AttributeDescription *si_ad_userPassword;          AttributeDescription *si_ad_userPassword;
         AttributeDescription *si_ad_labeledURI;          AttributeDescription *si_ad_labeledURI;
 #ifdef SLAPD_AUTHPASSWD  #ifdef SLAPD_AUTHPASSWD
         AttributeDescription *si_ad_authPassword;          AttributeDescription *si_ad_authPassword;
           AttributeDescription *si_ad_authPasswordSchemes;
 #endif  #endif
 #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND  #ifdef LDAP_API_FEATURE_X_OPENLDAP_V2_KBIND
         AttributeDescription *si_ad_krbName;          AttributeDescription *si_ad_krbName;
 #endif  #endif
                   AttributeDescription *si_ad_description;
           AttributeDescription *si_ad_seeAlso;
   
         /* Undefined Attribute Type */          /* Undefined Attribute Type */
         AttributeType   *si_at_undefined;          AttributeType   *si_at_undefined;
   
           /* "Proxied" Attribute Type */
           AttributeType   *si_at_proxied;
   
         /* Matching Rules */          /* Matching Rules */
         MatchingRule    *si_mr_distinguishedNameMatch;          MatchingRule    *si_mr_distinguishedNameMatch;
         MatchingRule    *si_mr_dnSubtreeMatch;          MatchingRule    *si_mr_dnSubtreeMatch;
Line 894  struct slap_internal_schema { Line 972  struct slap_internal_schema {
 typedef struct slap_attr_assertion {  typedef struct slap_attr_assertion {
         AttributeDescription    *aa_desc;          AttributeDescription    *aa_desc;
         struct berval aa_value;          struct berval aa_value;
   #ifdef LDAP_COMP_MATCH
           struct slap_component_filter *aa_cf;/* for attribute aliasing */
   #endif
 } AttributeAssertion;  } AttributeAssertion;
   
 typedef struct slap_ss_assertion {  typedef struct slap_ss_assertion {
Line 926  typedef struct slap_filter { Line 1007  typedef struct slap_filter {
 #define SLAPD_FILTER_COMPUTED           ((ber_tag_t) -1)  #define SLAPD_FILTER_COMPUTED           ((ber_tag_t) -1)
 #define SLAPD_FILTER_DN_ONE                     ((ber_tag_t) -2)  #define SLAPD_FILTER_DN_ONE                     ((ber_tag_t) -2)
 #define SLAPD_FILTER_DN_SUBTREE         ((ber_tag_t) -3)  #define SLAPD_FILTER_DN_SUBTREE         ((ber_tag_t) -3)
 #ifdef LDAP_SCOPE_SUBORDINATE  
 #define SLAPD_FILTER_DN_CHILDREN        ((ber_tag_t) -4)  #define SLAPD_FILTER_DN_CHILDREN        ((ber_tag_t) -4)
 #endif  
   
         union f_un_u {          union f_un_u {
                 /* precomputed result */                  /* precomputed result */
Line 1030  typedef struct slap_valuesreturnfilter { Line 1109  typedef struct slap_valuesreturnfilter {
 } ValuesReturnFilter;  } ValuesReturnFilter;
   
 #ifdef LDAP_COMP_MATCH  #ifdef LDAP_COMP_MATCH
   struct slap_component_syntax_info;
 typedef struct  slap_component_data {  typedef struct  slap_component_data {
         void* cd_mem_op;/* nibble memory handler */          void* cd_mem_op;/* nibble memory handler */
         void* cd_tree;  /* component tree */          struct slap_component_syntax_info** cd_tree;/* component tree */
 } ComponentData;  } ComponentData;
 #endif  #endif
   
Line 1091  typedef struct slap_entry { Line 1171  typedef struct slap_entry {
  * A list of LDAPMods   * A list of LDAPMods
  */   */
 typedef struct slap_mod {  typedef struct slap_mod {
         int sm_op;          short sm_op;
           short sm_flags;
   /* Set for internal mods, will bypass ACL checks. Only needed when
    * running as non-root user, for user modifiable attributes.
    */
   #define SLAP_MOD_INTERNAL       0x01
   #define SLAP_MOD_MANAGING       0x02
   
         AttributeDescription *sm_desc;          AttributeDescription *sm_desc;
         struct berval sm_type;          struct berval sm_type;
         BerVarray sm_values;          BerVarray sm_values;
Line 1101  typedef struct slap_mod { Line 1188  typedef struct slap_mod {
 typedef struct slap_mod_list {  typedef struct slap_mod_list {
         Modification sml_mod;          Modification sml_mod;
 #define sml_op          sml_mod.sm_op  #define sml_op          sml_mod.sm_op
   #define sml_flags       sml_mod.sm_flags
 #define sml_desc        sml_mod.sm_desc  #define sml_desc        sml_mod.sm_desc
 #define sml_type        sml_mod.sm_type  #define sml_type        sml_mod.sm_type
 #define sml_values      sml_mod.sm_values  #define sml_values      sml_mod.sm_values
Line 1122  typedef struct slap_ldap_modlist { Line 1210  typedef struct slap_ldap_modlist {
 typedef enum slap_access_e {  typedef enum slap_access_e {
         ACL_INVALID_ACCESS = -1,          ACL_INVALID_ACCESS = -1,
         ACL_NONE = 0,          ACL_NONE = 0,
           ACL_DISCLOSE,
         ACL_AUTH,          ACL_AUTH,
         ACL_COMPARE,          ACL_COMPARE,
         ACL_SEARCH,          ACL_SEARCH,
         ACL_READ,          ACL_READ,
         ACL_WRITE          ACL_WRITE_,
           ACL_MANAGE,
   
           /* always leave at end of levels but not greater than ACL_LEVEL_MASK */
           ACL_LAST,
   
           /* ACL level mask and modifiers */
           ACL_LEVEL_MASK = 0x000f,
           ACL_QUALIFIER1 = 0x0100,
           ACL_QUALIFIER2 = 0x0200,
           ACL_QUALIFIER3 = 0x0400,
           ACL_QUALIFIER4 = 0x0800,
           ACL_QUALIFIER_MASK = 0x0f00,
   
           /* write granularity */
           ACL_WADD = ACL_WRITE_|ACL_QUALIFIER1,
           ACL_WDEL = ACL_WRITE_|ACL_QUALIFIER2,
   
           ACL_WRITE = ACL_WADD|ACL_WDEL
 } slap_access_t;  } slap_access_t;
   
 typedef enum slap_control_e {  typedef enum slap_control_e {
Line 1143  typedef enum slap_style_e { Line 1250  typedef enum slap_style_e {
         ACL_STYLE_ONE,          ACL_STYLE_ONE,
         ACL_STYLE_SUBTREE,          ACL_STYLE_SUBTREE,
         ACL_STYLE_CHILDREN,          ACL_STYLE_CHILDREN,
           ACL_STYLE_LEVEL,
         ACL_STYLE_ATTROF,          ACL_STYLE_ATTROF,
         ACL_STYLE_ANONYMOUS,          ACL_STYLE_ANONYMOUS,
         ACL_STYLE_USERS,          ACL_STYLE_USERS,
Line 1165  typedef struct slap_authz_info { Line 1273  typedef struct slap_authz_info {
 } AuthorizationInformation;  } AuthorizationInformation;
   
   
 #ifdef LDAP_DEVEL  
 #define SLAP_DYNACL  
 #endif /* LDAP_DEVEL */  
   
 #ifdef SLAP_DYNACL  #ifdef SLAP_DYNACL
 struct slap_op;  struct slap_op;
   
 /*  /*
  * "dynamic" ACL infrastructure (for ACIs and more)   * "dynamic" ACL infrastructure (for ACIs and more)
  */   */
 typedef int (*slap_dynacl_parse)( const char *fname, int lineno, slap_style_t, const char *, void **privp );  typedef int (slap_dynacl_parse) LDAP_P(( const char *fname, int lineno,
 typedef int (*slap_dynacl_print)( void *priv );          const char *opts, slap_style_t, const char *, void **privp ));
 typedef int (*slap_dynacl_mask)(  typedef int (slap_dynacl_unparse) LDAP_P(( void *priv, struct berval *bv ));
   typedef int (slap_dynacl_mask) LDAP_P((
                 void                    *priv,                  void                    *priv,
                 struct slap_op          *op,                  struct slap_op          *op,
                 Entry                   *e,                  Entry                   *e,
Line 1186  typedef int (*slap_dynacl_mask)( Line 1291  typedef int (*slap_dynacl_mask)(
                 int                     nmatch,                  int                     nmatch,
                 regmatch_t              *matches,                  regmatch_t              *matches,
                 slap_access_t           *grant,                  slap_access_t           *grant,
                 slap_access_t           *deny );                  slap_access_t           *deny ));
 typedef int (*slap_dynacl_destroy)( void *priv );  typedef int (slap_dynacl_destroy) LDAP_P(( void *priv ));
   
 typedef struct slap_dynacl_t {  typedef struct slap_dynacl_t {
         char                    *da_name;          char                    *da_name;
         slap_dynacl_parse       da_parse;          slap_dynacl_parse       *da_parse;
         slap_dynacl_print       da_print;          slap_dynacl_unparse     *da_unparse;
         slap_dynacl_mask        da_mask;          slap_dynacl_mask        *da_mask;
         slap_dynacl_destroy     da_destroy;          slap_dynacl_destroy     *da_destroy;
                   
         void                    *da_private;          void                    *da_private;
         struct slap_dynacl_t    *da_next;          struct slap_dynacl_t    *da_next;
 } slap_dynacl_t;  } slap_dynacl_t;
 #endif /* SLAP_DYNACL */  #endif /* SLAP_DYNACL */
   
   /* the DN portion of the "by" part */
   typedef struct slap_dn_access {
           /* DN pattern */
           AuthorizationInformation        a_dnauthz;
   #define a_pat                   a_dnauthz.sai_dn
   
           slap_style_t            a_style;
           int                     a_level;
           int                     a_self_level;
           AttributeDescription    *a_at;
           int                     a_self;
           int                     a_expand;
   } slap_dn_access;
   
 /* the "by" part */  /* the "by" part */
 typedef struct slap_access {  typedef struct slap_access {
         slap_control_t a_type;          slap_control_t a_type;
   
 #define ACL_ACCESS2PRIV(access) (0x01U << (access))  /* strip qualifiers */
   #define ACL_LEVEL(p)                    ((p) & ACL_LEVEL_MASK)
   #define ACL_QUALIFIERS(p)               ((p) & ~ACL_LEVEL_MASK)
   
   #define ACL_ACCESS2PRIV(access)         ((0x01U << ACL_LEVEL((access))) | ACL_QUALIFIERS((access)))
   
 #define ACL_PRIV_NONE                   ACL_ACCESS2PRIV( ACL_NONE )  #define ACL_PRIV_NONE                   ACL_ACCESS2PRIV( ACL_NONE )
   #define ACL_PRIV_DISCLOSE               ACL_ACCESS2PRIV( ACL_DISCLOSE )
 #define ACL_PRIV_AUTH                   ACL_ACCESS2PRIV( ACL_AUTH )  #define ACL_PRIV_AUTH                   ACL_ACCESS2PRIV( ACL_AUTH )
 #define ACL_PRIV_COMPARE                ACL_ACCESS2PRIV( ACL_COMPARE )  #define ACL_PRIV_COMPARE                ACL_ACCESS2PRIV( ACL_COMPARE )
 #define ACL_PRIV_SEARCH                 ACL_ACCESS2PRIV( ACL_SEARCH )  #define ACL_PRIV_SEARCH                 ACL_ACCESS2PRIV( ACL_SEARCH )
 #define ACL_PRIV_READ                   ACL_ACCESS2PRIV( ACL_READ )  #define ACL_PRIV_READ                   ACL_ACCESS2PRIV( ACL_READ )
 #define ACL_PRIV_WRITE                  ACL_ACCESS2PRIV( ACL_WRITE )  #define ACL_PRIV_WADD                   ACL_ACCESS2PRIV( ACL_WADD )
   #define ACL_PRIV_WDEL                   ACL_ACCESS2PRIV( ACL_WDEL )
   #define ACL_PRIV_WRITE                  ( ACL_PRIV_WADD | ACL_PRIV_WDEL )
   #define ACL_PRIV_MANAGE                 ACL_ACCESS2PRIV( ACL_MANAGE )
   
 #define ACL_PRIV_MASK                   0x00ffUL  /* NOTE: always use the highest level; current: 0x00ffUL */
   #define ACL_PRIV_MASK                   ((ACL_ACCESS2PRIV(ACL_LAST) - 1) | ACL_QUALIFIER_MASK)
   
 /* priv flags */  /* priv flags */
 #define ACL_PRIV_LEVEL                  0x1000UL  #define ACL_PRIV_LEVEL                  0x1000UL
 #define ACL_PRIV_ADDITIVE               0x2000UL  #define ACL_PRIV_ADDITIVE               0x2000UL
 #define ACL_PRIV_SUBSTRACTIVE   0x4000UL  #define ACL_PRIV_SUBSTRACTIVE           0x4000UL
   
 /* invalid privs */  /* invalid privs */
 #define ACL_PRIV_INVALID                0x0UL  #define ACL_PRIV_INVALID                0x0UL
   
 #define ACL_PRIV_ISSET(m,p)             (((m) & (p)) == (p))  #define ACL_PRIV_ISSET(m,p)             (((m) & (p)) == (p))
 #define ACL_PRIV_ASSIGN(m,p)    do { (m)  =  (p); } while(0)  #define ACL_PRIV_ASSIGN(m,p)            do { (m)  =  (p); } while(0)
 #define ACL_PRIV_SET(m,p)               do { (m) |=  (p); } while(0)  #define ACL_PRIV_SET(m,p)               do { (m) |=  (p); } while(0)
 #define ACL_PRIV_CLR(m,p)               do { (m) &= ~(p); } while(0)  #define ACL_PRIV_CLR(m,p)               do { (m) &= ~(p); } while(0)
   
 #define ACL_INIT(m)                             ACL_PRIV_ASSIGN(m, ACL_PRIV_NONE)  #define ACL_INIT(m)                     ACL_PRIV_ASSIGN(m, ACL_PRIV_NONE)
 #define ACL_INVALIDATE(m)               ACL_PRIV_ASSIGN(m, ACL_PRIV_INVALID)  #define ACL_INVALIDATE(m)               ACL_PRIV_ASSIGN(m, ACL_PRIV_INVALID)
   
 #define ACL_GRANT(m,a)                  ACL_PRIV_ISSET((m),ACL_ACCESS2PRIV(a))  #define ACL_GRANT(m,a)                  ACL_PRIV_ISSET((m),ACL_ACCESS2PRIV(a))
Line 1238  typedef struct slap_access { Line 1366  typedef struct slap_access {
   
 #define ACL_IS_LEVEL(m)                 ACL_PRIV_ISSET((m),ACL_PRIV_LEVEL)  #define ACL_IS_LEVEL(m)                 ACL_PRIV_ISSET((m),ACL_PRIV_LEVEL)
 #define ACL_IS_ADDITIVE(m)              ACL_PRIV_ISSET((m),ACL_PRIV_ADDITIVE)  #define ACL_IS_ADDITIVE(m)              ACL_PRIV_ISSET((m),ACL_PRIV_ADDITIVE)
 #define ACL_IS_SUBTRACTIVE(m)   ACL_PRIV_ISSET((m),ACL_PRIV_SUBSTRACTIVE)  #define ACL_IS_SUBTRACTIVE(m)           ACL_PRIV_ISSET((m),ACL_PRIV_SUBSTRACTIVE)
   
 #define ACL_LVL_NONE                    (ACL_PRIV_NONE|ACL_PRIV_LEVEL)  #define ACL_LVL_NONE                    (ACL_PRIV_NONE|ACL_PRIV_LEVEL)
 #define ACL_LVL_AUTH                    (ACL_PRIV_AUTH|ACL_LVL_NONE)  #define ACL_LVL_DISCLOSE                (ACL_PRIV_DISCLOSE|ACL_LVL_NONE)
   #define ACL_LVL_AUTH                    (ACL_PRIV_AUTH|ACL_LVL_DISCLOSE)
 #define ACL_LVL_COMPARE                 (ACL_PRIV_COMPARE|ACL_LVL_AUTH)  #define ACL_LVL_COMPARE                 (ACL_PRIV_COMPARE|ACL_LVL_AUTH)
 #define ACL_LVL_SEARCH                  (ACL_PRIV_SEARCH|ACL_LVL_COMPARE)  #define ACL_LVL_SEARCH                  (ACL_PRIV_SEARCH|ACL_LVL_COMPARE)
 #define ACL_LVL_READ                    (ACL_PRIV_READ|ACL_LVL_SEARCH)  #define ACL_LVL_READ                    (ACL_PRIV_READ|ACL_LVL_SEARCH)
   #define ACL_LVL_WADD                    (ACL_PRIV_WADD|ACL_LVL_READ)
   #define ACL_LVL_WDEL                    (ACL_PRIV_WDEL|ACL_LVL_READ)
 #define ACL_LVL_WRITE                   (ACL_PRIV_WRITE|ACL_LVL_READ)  #define ACL_LVL_WRITE                   (ACL_PRIV_WRITE|ACL_LVL_READ)
   #define ACL_LVL_MANAGE                  (ACL_PRIV_MANAGE|ACL_LVL_WRITE)
   
 #define ACL_LVL(m,l)                    (((m)&ACL_PRIV_MASK) == ((l)&ACL_PRIV_MASK))  #define ACL_LVL(m,l)                    (((m)&ACL_PRIV_MASK) == ((l)&ACL_PRIV_MASK))
 #define ACL_LVL_IS_NONE(m)              ACL_LVL((m),ACL_LVL_NONE)  #define ACL_LVL_IS_NONE(m)              ACL_LVL((m),ACL_LVL_NONE)
   #define ACL_LVL_IS_DISCLOSE(m)          ACL_LVL((m),ACL_LVL_DISCLOSE)
 #define ACL_LVL_IS_AUTH(m)              ACL_LVL((m),ACL_LVL_AUTH)  #define ACL_LVL_IS_AUTH(m)              ACL_LVL((m),ACL_LVL_AUTH)
 #define ACL_LVL_IS_COMPARE(m)   ACL_LVL((m),ACL_LVL_COMPARE)  #define ACL_LVL_IS_COMPARE(m)           ACL_LVL((m),ACL_LVL_COMPARE)
 #define ACL_LVL_IS_SEARCH(m)    ACL_LVL((m),ACL_LVL_SEARCH)  #define ACL_LVL_IS_SEARCH(m)            ACL_LVL((m),ACL_LVL_SEARCH)
 #define ACL_LVL_IS_READ(m)              ACL_LVL((m),ACL_LVL_READ)  #define ACL_LVL_IS_READ(m)              ACL_LVL((m),ACL_LVL_READ)
   #define ACL_LVL_IS_WADD(m)              ACL_LVL((m),ACL_LVL_WADD)
   #define ACL_LVL_IS_WDEL(m)              ACL_LVL((m),ACL_LVL_WDEL)
 #define ACL_LVL_IS_WRITE(m)             ACL_LVL((m),ACL_LVL_WRITE)  #define ACL_LVL_IS_WRITE(m)             ACL_LVL((m),ACL_LVL_WRITE)
   #define ACL_LVL_IS_MANAGE(m)            ACL_LVL((m),ACL_LVL_MANAGE)
   
 #define ACL_LVL_ASSIGN_NONE(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_NONE)  #define ACL_LVL_ASSIGN_NONE(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_NONE)
   #define ACL_LVL_ASSIGN_DISCLOSE(m)      ACL_PRIV_ASSIGN((m),ACL_LVL_DISCLOSE)
 #define ACL_LVL_ASSIGN_AUTH(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_AUTH)  #define ACL_LVL_ASSIGN_AUTH(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_AUTH)
 #define ACL_LVL_ASSIGN_COMPARE(m)       ACL_PRIV_ASSIGN((m),ACL_LVL_COMPARE)  #define ACL_LVL_ASSIGN_COMPARE(m)       ACL_PRIV_ASSIGN((m),ACL_LVL_COMPARE)
 #define ACL_LVL_ASSIGN_SEARCH(m)        ACL_PRIV_ASSIGN((m),ACL_LVL_SEARCH)  #define ACL_LVL_ASSIGN_SEARCH(m)        ACL_PRIV_ASSIGN((m),ACL_LVL_SEARCH)
 #define ACL_LVL_ASSIGN_READ(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_READ)  #define ACL_LVL_ASSIGN_READ(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_READ)
   #define ACL_LVL_ASSIGN_WADD(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_WADD)
   #define ACL_LVL_ASSIGN_WDEL(m)          ACL_PRIV_ASSIGN((m),ACL_LVL_WDEL)
 #define ACL_LVL_ASSIGN_WRITE(m)         ACL_PRIV_ASSIGN((m),ACL_LVL_WRITE)  #define ACL_LVL_ASSIGN_WRITE(m)         ACL_PRIV_ASSIGN((m),ACL_LVL_WRITE)
   #define ACL_LVL_ASSIGN_MANAGE(m)        ACL_PRIV_ASSIGN((m),ACL_LVL_MANAGE)
   
         slap_mask_t     a_access_mask;          slap_mask_t     a_access_mask;
   
         AuthorizationInformation        a_authz;          /* DN pattern */
 #define a_dn_pat        a_authz.sai_dn          slap_dn_access          a_dn;
   #define a_dn_pat                a_dn.a_dnauthz.sai_dn
         slap_style_t a_dn_style;  #define a_dn_at                 a_dn.a_at
         AttributeDescription    *a_dn_at;  #define a_dn_self               a_dn.a_self
         int                     a_dn_self;  
         int                     a_dn_expand;          /* real DN pattern */
           slap_dn_access          a_realdn;
   #define a_realdn_pat            a_realdn.a_dnauthz.sai_dn
   #define a_realdn_at             a_realdn.a_at
   #define a_realdn_self           a_realdn.a_self
   
           /* used for ssf stuff
            * NOTE: the ssf stuff in a_realdn is ignored */
   #define a_authz                 a_dn.a_dnauthz
   
           /* connection related stuff */
         slap_style_t a_peername_style;          slap_style_t a_peername_style;
         struct berval   a_peername_pat;          struct berval   a_peername_pat;
         unsigned long   a_peername_addr,          unsigned long   a_peername_addr,
Line 1294  typedef struct slap_access { Line 1443  typedef struct slap_access {
         slap_dynacl_t           *a_dynacl;          slap_dynacl_t           *a_dynacl;
 #else /* ! SLAP_DYNACL */  #else /* ! SLAP_DYNACL */
 #ifdef SLAPD_ACI_ENABLED  #ifdef SLAPD_ACI_ENABLED
           /* NOTE: ACIs have been moved under the "dynacl" interface,
            * which is currently built only when LDAP_DEVEL is defined.
            *
            * In any case, SLAPD_ACI_ENABLED, set by --enable-aci,
            * is required to enable ACI support.
            */
         AttributeDescription    *a_aci_at;          AttributeDescription    *a_aci_at;
 #endif  #endif /* SLAPD_ACI_ENABLED */
 #endif /* SLAP_DYNACL */  #endif /* SLAP_DYNACL */
   
         /* ACL Groups */          /* ACL Groups */
Line 1315  typedef struct slap_acl { Line 1470  typedef struct slap_acl {
         regex_t         acl_dn_re;          regex_t         acl_dn_re;
         struct berval   acl_dn_pat;          struct berval   acl_dn_pat;
         AttributeName   *acl_attrs;          AttributeName   *acl_attrs;
           MatchingRule    *acl_attrval_mr;
         slap_style_t    acl_attrval_style;          slap_style_t    acl_attrval_style;
         regex_t         acl_attrval_re;          regex_t         acl_attrval_re;
         struct berval   acl_attrval;          struct berval   acl_attrval;
Line 1348  typedef struct slap_acl_state { Line 1504  typedef struct slap_acl_state {
 #define ACL_STATE_INIT { ACL_STATE_NOT_RECORDED, NULL, NULL, 0UL, \  #define ACL_STATE_INIT { ACL_STATE_NOT_RECORDED, NULL, NULL, 0UL, \
         { { 0, 0 } }, 0, NULL, 0, 0, NULL }          { { 0, 0 } }, 0, NULL, 0, 0, NULL }
   
   #ifdef SLAPD_ACI_ENABLED
   typedef enum slap_aci_scope_t {
           SLAP_ACI_SCOPE_ENTRY            = 0x1,
           SLAP_ACI_SCOPE_CHILDREN         = 0x2,
           SLAP_ACI_SCOPE_SUBTREE          = ( SLAP_ACI_SCOPE_ENTRY | SLAP_ACI_SCOPE_CHILDREN )
   } slap_aci_scope_t;
   #endif /* SLAPD_ACI_ENABLED */
   
 /*  /*
  * Backend-info   * Backend-info
  * represents a backend    * represents a backend 
Line 1355  typedef struct slap_acl_state { Line 1519  typedef struct slap_acl_state {
   
 typedef struct slap_backend_info BackendInfo;   /* per backend type */  typedef struct slap_backend_info BackendInfo;   /* per backend type */
 typedef struct slap_backend_db BackendDB;               /* per backend database */  typedef struct slap_backend_db BackendDB;               /* per backend database */
   typedef LDAP_STAILQ_HEAD(BeI, slap_backend_info) slap_bi_head;
   typedef LDAP_STAILQ_HEAD(BeDB, slap_backend_db) slap_be_head;
   
 LDAP_SLAPD_V (int) nBackendInfo;  LDAP_SLAPD_V (int) nBackendInfo;
 LDAP_SLAPD_V (int) nBackendDB;  LDAP_SLAPD_V (int) nBackendDB;
 LDAP_SLAPD_V (BackendInfo *) backendInfo;  LDAP_SLAPD_V (slap_bi_head) backendInfo;
 LDAP_SLAPD_V (BackendDB *) backendDB;  LDAP_SLAPD_V (slap_be_head) backendDB;
 LDAP_SLAPD_V (BackendDB *) frontendDB;  LDAP_SLAPD_V (BackendDB *) frontendDB;
   
 LDAP_SLAPD_V (int) slapMode;      LDAP_SLAPD_V (int) slapMode;    
Line 1371  LDAP_SLAPD_V (int) slapMode; Line 1537  LDAP_SLAPD_V (int) slapMode;
 #define SLAP_TRUNCATE_MODE      0x0100  #define SLAP_TRUNCATE_MODE      0x0100
 #define SLAP_TOOL_READMAIN      0x0200  #define SLAP_TOOL_READMAIN      0x0200
 #define SLAP_TOOL_READONLY      0x0400  #define SLAP_TOOL_READONLY      0x0400
   #define SLAP_TOOL_QUICK         0x0800
   
   #define SB_TLS_DEFAULT          (-1)
   #define SB_TLS_OFF              0
   #define SB_TLS_ON               1
   #define SB_TLS_CRITICAL         2
   
   typedef struct slap_bindconf {
           struct berval sb_uri;
           int sb_tls;
           int sb_method;
           struct berval sb_binddn;
           struct berval sb_cred;
           struct berval sb_saslmech;
           char *sb_secprops;
           struct berval sb_realm;
           struct berval sb_authcId;
           struct berval sb_authzId;
   } slap_bindconf;
   
 struct slap_replica_info {  struct slap_replica_info {
         char *ri_host;                          /* supersedes be_replica */          const char *ri_host;            /* points to host part of uri */
         BerVarray ri_nsuffix;   /* array of suffixes this replica accepts */          BerVarray ri_nsuffix;           /* array of suffixes this replica accepts */
         AttributeName *ri_attrs;        /* attrs to replicate, NULL=all */          AttributeName *ri_attrs;        /* attrs to replicate, NULL=all */
         int ri_exclude;                 /* 1 => exclude ri_attrs */          int ri_exclude;                         /* 1 => exclude ri_attrs */
           slap_bindconf ri_bindconf;      /* for back-config */
 };  };
   
   typedef struct slap_verbmasks {
           struct berval word;
           const slap_mask_t mask;
   } slap_verbmasks;
   
   typedef struct slap_cf_aux_table {
           struct berval key;
           int off;
           char type;
           char quote;
           slap_verbmasks *aux;
   } slap_cf_aux_table;
   
   #define SLAP_LIMIT_TIME 1
   #define SLAP_LIMIT_SIZE 2
   
 struct slap_limits_set {  struct slap_limits_set {
         /* time limits */          /* time limits */
         int     lms_t_soft;          int     lms_t_soft;
Line 1442  typedef BackendDB Backend; Line 1644  typedef BackendDB Backend;
  * syncinfo structure for syncrepl   * syncinfo structure for syncrepl
  */   */
   
 #define SLAP_SYNC_SID_SIZE      3  struct syncinfo_s;
   
 #define SLAP_SYNC_RID_SIZE      3  #define SLAP_SYNC_RID_SIZE      3
 #define SLAP_SYNCUUID_SET_SIZE 256  #define SLAP_SYNCUUID_SET_SIZE 256
   
 struct nonpresent_entry {  #define SLAP_SYNC_UPDATE_MSGID  1
         struct berval *npe_name;  
         struct berval *npe_nname;  
         LDAP_LIST_ENTRY(nonpresent_entry) npe_link;  
 };  
   
 struct sync_cookie {  struct sync_cookie {
         struct berval *ctxcsn;          struct berval ctxcsn;
         long sid;          struct berval octet_str;
         struct berval *octet_str;  
         long rid;          long rid;
         LDAP_STAILQ_ENTRY(sync_cookie) sc_next;          LDAP_STAILQ_ENTRY(sync_cookie) sc_next;
 };  };
   
 LDAP_STAILQ_HEAD( slap_sync_cookie_s, sync_cookie );  LDAP_STAILQ_HEAD( slap_sync_cookie_s, sync_cookie );
   
 typedef struct syncinfo_s {  
         struct slap_backend_db *si_be;  
         long                            si_rid;  
         char                            *si_provideruri;  
         BerVarray                       si_provideruri_bv;  
 #define SYNCINFO_TLS_OFF                0  
 #define SYNCINFO_TLS_ON                 1  
 #define SYNCINFO_TLS_CRITICAL   2  
         int                                     si_tls;  
                 struct berval           si_updatedn;      
         int                                     si_bindmethod;  
         char                            *si_binddn;  
         char                            *si_passwd;  
         char                            *si_saslmech;  
         char                            *si_secprops;  
         char                            *si_realm;  
         char                            *si_authcId;  
         char                            *si_authzId;  
                 int                                     si_schemachecking;  
         struct berval           si_filterstr;  
         struct berval           si_base;  
         int                                     si_scope;  
         int                                     si_attrsonly;  
                 AttributeName           *si_anlist;  
                 AttributeName           *si_exanlist;  
                 char                            **si_attrs;  
                 int                                     si_allattrs;  
                 int                                     si_allopattrs;  
                 char                            **si_exattrs;  
         int                                     si_type;  
         time_t                          si_interval;  
                 time_t                          *si_retryinterval;  
                 int                                     *si_retrynum_init;  
                 int                                     *si_retrynum;  
                 struct sync_cookie      si_syncCookie;  
         int                                     si_manageDSAit;  
         int                                     si_slimit;  
                 int                                     si_tlimit;  
                 int                                     si_refreshDelete;  
                 int                                     si_refreshPresent;  
         Avlnode                         *si_presentlist;  
                 LDAP                            *si_ld;  
                 LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist;  
                 LDAP_STAILQ_ENTRY( syncinfo_s ) si_next;  
 } syncinfo_t;  
   
 LDAP_TAILQ_HEAD( be_pcl, slap_csn_entry );  LDAP_TAILQ_HEAD( be_pcl, slap_csn_entry );
   
   #ifndef SLAP_MAX_CIDS
   #define SLAP_MAX_CIDS   32      /* Maximum number of supported controls */
   #endif
   
   struct ConfigOCs;       /* config.h */
   
 struct slap_backend_db {  struct slap_backend_db {
         BackendInfo     *bd_info;       /* pointer to shared backend info */          BackendInfo     *bd_info;       /* pointer to shared backend info */
   
Line 1534  struct slap_backend_db { Line 1692  struct slap_backend_db {
 #define         be_extended     bd_info->bi_extended  #define         be_extended     bd_info->bi_extended
   
 #define         be_chk_referrals        bd_info->bi_chk_referrals  #define         be_chk_referrals        bd_info->bi_chk_referrals
   #define         be_chk_controls         bd_info->bi_chk_controls
 #define         be_fetch        bd_info->bi_entry_get_rw  #define         be_fetch        bd_info->bi_entry_get_rw
 #define         be_release      bd_info->bi_entry_release_rw  #define         be_release      bd_info->bi_entry_release_rw
 #define         be_group        bd_info->bi_acl_group  #define         be_group        bd_info->bi_acl_group
Line 1547  struct slap_backend_db { Line 1706  struct slap_backend_db {
  */   */
 #define         be_has_subordinates bd_info->bi_has_subordinates  #define         be_has_subordinates bd_info->bi_has_subordinates
   
 #define         be_controls     bd_info->bi_controls  
   
 #define         be_connection_init      bd_info->bi_connection_init  #define         be_connection_init      bd_info->bi_connection_init
 #define         be_connection_destroy   bd_info->bi_connection_destroy  #define         be_connection_destroy   bd_info->bi_connection_destroy
   
Line 1566  struct slap_backend_db { Line 1723  struct slap_backend_db {
 #define         be_entry_modify bd_info->bi_tool_entry_modify  #define         be_entry_modify bd_info->bi_tool_entry_modify
 #endif  #endif
   
           /* supported controls */
           /* note: set to 0 if the database does not support the control;
            * be_ctrls[SLAP_MAX_CIDS] is set to 1 if initialized */
           char            be_ctrls[SLAP_MAX_CIDS + 1];
   
 /* Database flags */  /* Database flags */
 #define SLAP_DBFLAG_NOLASTMOD           0x0001U  #define SLAP_DBFLAG_NOLASTMOD           0x0001U
 #define SLAP_DBFLAG_NO_SCHEMA_CHECK     0x0002U  #define SLAP_DBFLAG_NO_SCHEMA_CHECK     0x0002U
 #define SLAP_DBFLAG_GLUE_INSTANCE       0x0010U /* a glue backend */  #define SLAP_DBFLAG_GLUE_INSTANCE       0x0010U /* a glue backend */
 #define SLAP_DBFLAG_GLUE_SUBORDINATE    0x0020U /* child of a glue hierarchy */  #define SLAP_DBFLAG_GLUE_SUBORDINATE    0x0020U /* child of a glue hierarchy */
 #define SLAP_DBFLAG_GLUE_LINKED         0x0040U /* child is connected to parent */  #define SLAP_DBFLAG_GLUE_LINKED         0x0040U /* child is connected to parent */
 #define SLAP_DBFLAG_OVERLAY                     0x0080U /* this db struct is an overlay */  #define SLAP_DBFLAG_GLUE_ADVERTISE      0x0080U /* advertise in rootDSE */
   #define SLAP_DBFLAG_OVERLAY             0x0100U /* this db struct is an overlay */
   #define SLAP_DBFLAG_GLOBAL_OVERLAY      0x0200U /* this db struct is a global overlay */
 #define SLAP_DBFLAG_SHADOW              0x8000U /* a shadow */  #define SLAP_DBFLAG_SHADOW              0x8000U /* a shadow */
 #define SLAP_DBFLAG_SYNC_SHADOW         0x1000U /* a sync shadow */  #define SLAP_DBFLAG_SYNC_SHADOW         0x1000U /* a sync shadow */
 #define SLAP_DBFLAG_SLURP_SHADOW        0x2000U /* a slurp shadow */  #define SLAP_DBFLAG_SLURP_SHADOW        0x2000U /* a slurp shadow */
Line 1589  struct slap_backend_db { Line 1753  struct slap_backend_db {
         (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLUE_SUBORDINATE)          (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLUE_SUBORDINATE)
 #define SLAP_GLUE_LINKED(be)            \  #define SLAP_GLUE_LINKED(be)            \
         (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLUE_LINKED)          (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLUE_LINKED)
   #define SLAP_GLUE_ADVERTISE(be) \
           (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLUE_ADVERTISE)
 #define SLAP_SHADOW(be)                         (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SHADOW)  #define SLAP_SHADOW(be)                         (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SHADOW)
 #define SLAP_SYNC_SHADOW(be)                    (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SYNC_SHADOW)  #define SLAP_SYNC_SHADOW(be)                    (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SYNC_SHADOW)
 #define SLAP_SLURP_SHADOW(be)                   (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SLURP_SHADOW)  #define SLAP_SLURP_SHADOW(be)                   (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SLURP_SHADOW)
Line 1669  struct slap_backend_db { Line 1835  struct slap_backend_db {
         struct          be_pcl  *be_pending_csn_list;          struct          be_pcl  *be_pending_csn_list;
         ldap_pvt_thread_mutex_t                                 be_pcl_mutex;          ldap_pvt_thread_mutex_t                                 be_pcl_mutex;
         ldap_pvt_thread_mutex_t                                 *be_pcl_mutexp;          ldap_pvt_thread_mutex_t                                 *be_pcl_mutexp;
         LDAP_STAILQ_HEAD( be_si, syncinfo_s )   be_syncinfo; /* For syncrepl */          struct syncinfo_s                                               *be_syncinfo; /* For syncrepl */
   
         char    *be_realm;  
         void    *be_pb;         /* Netscape plugin */          void    *be_pb;         /* Netscape plugin */
           struct ConfigOCs *be_cf_ocs;
   
         void    *be_private;    /* anything the backend database needs     */          void    *be_private;    /* anything the backend database needs     */
           LDAP_STAILQ_ENTRY(slap_backend_db) be_next;
 };  };
   
 struct slap_conn;  struct slap_conn;
 struct slap_op;  struct slap_op;
   
 /* Backend function typedefs */  /* Backend function typedefs */
 typedef int (BI_init) LDAP_P((BackendInfo *bi));  typedef int (BI_bi_func) LDAP_P((BackendInfo *bi));
   typedef BI_bi_func BI_init;
   typedef BI_bi_func BI_open;
   typedef BI_bi_func BI_close;
   typedef BI_bi_func BI_destroy;
 typedef int (BI_config) LDAP_P((BackendInfo *bi,  typedef int (BI_config) LDAP_P((BackendInfo *bi,
         const char *fname, int lineno,          const char *fname, int lineno,
         int argc, char **argv));          int argc, char **argv));
 typedef int (BI_open) LDAP_P((BackendInfo *bi));  
 typedef int (BI_close) LDAP_P((BackendInfo *bi));  
 typedef int (BI_destroy) LDAP_P((BackendInfo *bi));  
   
 typedef int (BI_db_init) LDAP_P((Backend *bd));  typedef int (BI_db_func) LDAP_P((Backend *bd));
   typedef BI_db_func BI_db_init;
   typedef BI_db_func BI_db_open;
   typedef BI_db_func BI_db_close;
   typedef BI_db_func BI_db_destroy;
 typedef int (BI_db_config) LDAP_P((Backend *bd,  typedef int (BI_db_config) LDAP_P((Backend *bd,
         const char *fname, int lineno,          const char *fname, int lineno,
         int argc, char **argv));          int argc, char **argv));
 typedef int (BI_db_open) LDAP_P((Backend *bd));  
 typedef int (BI_db_close) LDAP_P((Backend *bd));  
 typedef int (BI_db_destroy) LDAP_P((Backend *bd));  
   
 typedef struct req_bind_s {  typedef struct req_bind_s {
         int rb_method;          int rb_method;
Line 1716  typedef struct req_search_s { Line 1885  typedef struct req_search_s {
         AttributeName *rs_attrs;          AttributeName *rs_attrs;
         Filter *rs_filter;          Filter *rs_filter;
         struct berval rs_filterstr;          struct berval rs_filterstr;
         int rs_post_search_id;  
 } req_search_s;  } req_search_s;
   
 typedef struct req_compare_s {  typedef struct req_compare_s {
Line 1759  typedef struct req_extended_s { Line 1927  typedef struct req_extended_s {
 } req_extended_s;  } req_extended_s;
   
 typedef struct req_pwdexop_s {  typedef struct req_pwdexop_s {
         struct berval rs_reqoid;          struct req_extended_s rs_extended;
         int rs_flags;  
         struct berval rs_old;          struct berval rs_old;
         struct berval rs_new;          struct berval rs_new;
         Modifications *rs_mods;          Modifications *rs_mods;
Line 1822  typedef struct slap_rep { Line 1989  typedef struct slap_rep {
         slap_mask_t sr_flags;          slap_mask_t sr_flags;
 #define REP_ENTRY_MODIFIABLE    0x0001U  #define REP_ENTRY_MODIFIABLE    0x0001U
 #define REP_ENTRY_MUSTBEFREED   0x0002U  #define REP_ENTRY_MUSTBEFREED   0x0002U
   #define REP_ENTRY_MUSTRELEASE   0x0004U
 #define REP_MATCHED_MUSTBEFREED 0x0010U  #define REP_MATCHED_MUSTBEFREED 0x0010U
 #define REP_REF_MUSTBEFREED             0x0020U  #define REP_REF_MUSTBEFREED             0x0020U
 } SlapReply;  } SlapReply;
Line 1837  typedef struct slap_rep { Line 2005  typedef struct slap_rep {
 #define sr_rspdata sr_un.sru_extended.r_rspdata  #define sr_rspdata sr_un.sru_extended.r_rspdata
 #define sr_sasldata sr_un.sru_sasl.r_sasldata  #define sr_sasldata sr_un.sru_sasl.r_sasldata
   
 typedef int (BI_op_bind) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef int (BI_op_func) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));
 typedef int (BI_op_unbind) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_bind;
 typedef int (BI_op_search) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_unbind;
 typedef int (BI_op_compare) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_search;
 typedef int (BI_op_modify) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_compare;
 typedef int (BI_op_modrdn) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_modify;
 typedef int (BI_op_add) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_modrdn;
 typedef int (BI_op_delete) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_add;
 typedef int (BI_op_abandon) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_delete;
 typedef int (BI_op_cancel) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_abandon;
 typedef int (BI_op_extended) LDAP_P((  typedef BI_op_func BI_op_cancel;
         struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_op_extended;
 typedef int (BI_chk_referrals) LDAP_P((  typedef BI_op_func BI_chk_referrals;
         struct slap_op *op, struct slap_rep *rs ));  typedef BI_op_func BI_chk_controls;
 typedef int (BI_entry_release_rw)  typedef int (BI_entry_release_rw)
         LDAP_P(( struct slap_op *op, Entry *e, int rw ));          LDAP_P(( struct slap_op *op, Entry *e, int rw ));
 typedef int (BI_entry_get_rw) LDAP_P(( struct slap_op *op, struct berval *ndn,  typedef int (BI_entry_get_rw) LDAP_P(( struct slap_op *op, struct berval *ndn,
Line 1858  typedef int (BI_entry_get_rw) LDAP_P(( s Line 2026  typedef int (BI_entry_get_rw) LDAP_P(( s
 typedef int (BI_operational) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));  typedef int (BI_operational) LDAP_P(( struct slap_op *op, struct slap_rep *rs ));
 typedef int (BI_has_subordinates) LDAP_P(( struct slap_op *op,  typedef int (BI_has_subordinates) LDAP_P(( struct slap_op *op,
         Entry *e, int *hasSubs ));          Entry *e, int *hasSubs ));
   #ifdef SLAP_OVERLAY_ACCESS
 typedef int (BI_connection_init) LDAP_P(( BackendDB *bd,  typedef int (BI_access_allowed) LDAP_P(( struct slap_op *op, Entry *e,
         struct slap_conn *c ));          AttributeDescription *desc, struct berval *val, slap_access_t access,
 typedef int (BI_connection_destroy) LDAP_P(( BackendDB *bd,          AccessControlState *state, slap_mask_t *maskp ));
         struct slap_conn *c ));  typedef int (BI_acl_group) LDAP_P(( struct slap_op *op, Entry *target,
           struct berval *gr_ndn, struct berval *op_ndn,
           ObjectClass *group_oc, AttributeDescription *group_at ));
   typedef int (BI_acl_attribute) LDAP_P(( struct slap_op *op, Entry *target,
           struct berval *entry_ndn, AttributeDescription *entry_at,
           BerVarray *vals, slap_access_t access ));
   #endif /* SLAP_OVERLAY_ACCESS */
   
   typedef int (BI_conn_func) LDAP_P(( BackendDB *bd, struct slap_conn *c ));
   typedef BI_conn_func BI_connection_init;
   typedef BI_conn_func BI_connection_destroy;
   
 typedef int (BI_tool_entry_open) LDAP_P(( BackendDB *be, int mode ));  typedef int (BI_tool_entry_open) LDAP_P(( BackendDB *be, int mode ));
 typedef int (BI_tool_entry_close) LDAP_P(( BackendDB *be ));  typedef int (BI_tool_entry_close) LDAP_P(( BackendDB *be ));
Line 1952  struct slap_backend_info { Line 2130  struct slap_backend_info {
         /* Auxilary Functions */          /* Auxilary Functions */
         BI_operational          *bi_operational;          BI_operational          *bi_operational;
         BI_chk_referrals        *bi_chk_referrals;          BI_chk_referrals        *bi_chk_referrals;
           BI_chk_controls         *bi_chk_controls;
         BI_entry_get_rw         *bi_entry_get_rw;          BI_entry_get_rw         *bi_entry_get_rw;
         BI_entry_release_rw     *bi_entry_release_rw;          BI_entry_release_rw     *bi_entry_release_rw;
   
         BI_has_subordinates     *bi_has_subordinates;          BI_has_subordinates     *bi_has_subordinates;
   #ifdef SLAP_OVERLAY_ACCESS
           BI_access_allowed       *bi_access_allowed;
           BI_acl_group            *bi_acl_group;
           BI_acl_attribute        *bi_acl_attribute;
   #endif /* SLAP_OVERLAY_ACCESS */
   
         BI_connection_init      *bi_connection_init;          BI_connection_init      *bi_connection_init;
         BI_connection_destroy   *bi_connection_destroy;          BI_connection_destroy   *bi_connection_destroy;
Line 1978  struct slap_backend_info { Line 2162  struct slap_backend_info {
   
         slap_mask_t     bi_flags; /* backend flags */          slap_mask_t     bi_flags; /* backend flags */
 #define SLAP_BFLAG_MONITOR                      0x0001U /* a monitor backend */  #define SLAP_BFLAG_MONITOR                      0x0001U /* a monitor backend */
   #define SLAP_BFLAG_CONFIG                       0x0002U /* a config backend */
   #define SLAP_BFLAG_FRONTEND                     0x0004U /* the frontendDB */
 #define SLAP_BFLAG_NOLASTMODCMD         0x0010U  #define SLAP_BFLAG_NOLASTMODCMD         0x0010U
 #define SLAP_BFLAG_INCREMENT            0x0100U  #define SLAP_BFLAG_INCREMENT            0x0100U
 #define SLAP_BFLAG_ALIASES                      0x1000U  #define SLAP_BFLAG_ALIASES                      0x1000U
Line 1987  struct slap_backend_info { Line 2173  struct slap_backend_info {
   
 #define SLAP_BFLAGS(be)         ((be)->bd_info->bi_flags)  #define SLAP_BFLAGS(be)         ((be)->bd_info->bi_flags)
 #define SLAP_MONITOR(be)        (SLAP_BFLAGS(be) & SLAP_BFLAG_MONITOR)  #define SLAP_MONITOR(be)        (SLAP_BFLAGS(be) & SLAP_BFLAG_MONITOR)
   #define SLAP_CONFIG(be)         (SLAP_BFLAGS(be) & SLAP_BFLAG_CONFIG)
   #define SLAP_FRONTEND(be)       (SLAP_BFLAGS(be) & SLAP_BFLAG_FRONTEND)
 #define SLAP_INCREMENT(be)      (SLAP_BFLAGS(be) & SLAP_BFLAG_INCREMENT)  #define SLAP_INCREMENT(be)      (SLAP_BFLAGS(be) & SLAP_BFLAG_INCREMENT)
 #define SLAP_ALIASES(be)        (SLAP_BFLAGS(be) & SLAP_BFLAG_ALIASES)  #define SLAP_ALIASES(be)        (SLAP_BFLAGS(be) & SLAP_BFLAG_ALIASES)
 #define SLAP_REFERRALS(be)      (SLAP_BFLAGS(be) & SLAP_BFLAG_REFERRALS)  #define SLAP_REFERRALS(be)      (SLAP_BFLAGS(be) & SLAP_BFLAG_REFERRALS)
Line 1995  struct slap_backend_info { Line 2183  struct slap_backend_info {
 #define SLAP_NOLASTMODCMD(be)   (SLAP_BFLAGS(be) & SLAP_BFLAG_NOLASTMODCMD)  #define SLAP_NOLASTMODCMD(be)   (SLAP_BFLAGS(be) & SLAP_BFLAG_NOLASTMODCMD)
 #define SLAP_LASTMODCMD(be)     (!SLAP_NOLASTMODCMD(be))  #define SLAP_LASTMODCMD(be)     (!SLAP_NOLASTMODCMD(be))
   
         char **bi_controls;             /* supported controls */          char    **bi_controls;          /* supported controls */
           char    bi_ctrls[SLAP_MAX_CIDS + 1];
   
         unsigned int bi_nDB;    /* number of databases of this type */          unsigned int bi_nDB;    /* number of databases of this type */
           struct ConfigOCs *bi_cf_ocs;
         void    *bi_private;    /* anything the backend type needs */          void    *bi_private;    /* anything the backend type needs */
           LDAP_STAILQ_ENTRY(slap_backend_info) bi_next ;
 };  };
   
 #define c_authtype      c_authz.sai_method  #define c_authtype      c_authz.sai_method
Line 2030  typedef struct slap_callback { Line 2221  typedef struct slap_callback {
   
 struct slap_overinfo;  struct slap_overinfo;
   
   typedef enum slap_operation_e {
           op_bind = 0,
           op_unbind,
           op_search,
           op_compare,
           op_modify,
           op_modrdn,
           op_add,
           op_delete,
           op_abandon,
           op_cancel,
           op_extended,
           op_aux_operational,
           op_aux_chk_referrals,
           op_aux_chk_controls,
           op_last
   } slap_operation_t;
   
 typedef struct slap_overinst {  typedef struct slap_overinst {
         BackendInfo on_bi;          BackendInfo on_bi;
         slap_response *on_response;          slap_response *on_response;
Line 2040  typedef struct slap_overinst { Line 2249  typedef struct slap_overinst {
 typedef struct slap_overinfo {  typedef struct slap_overinfo {
         BackendInfo oi_bi;          BackendInfo oi_bi;
         BackendInfo *oi_orig;          BackendInfo *oi_orig;
           BackendDB       *oi_origdb;
         struct slap_overinst *oi_list;          struct slap_overinst *oi_list;
 } slap_overinfo;  } slap_overinfo;
   
 /* Should successive callbacks in a chain be processed? */  /* Should successive callbacks in a chain be processed? */
 #define SLAP_CB_FREEME          0x4000  #define SLAP_CB_FREEME          0x04000
 #define SLAP_CB_CONTINUE        0x8000  #define SLAP_CB_CONTINUE        0x08000
   
 /*  /*
  * Paged Results state   * Paged Results state
Line 2058  typedef struct slap_paged_state { Line 2268  typedef struct slap_paged_state {
         int ps_count;          int ps_count;
 } PagedResultsState;  } PagedResultsState;
   
 #define LDAP_PSEARCH_BY_ADD                     0x01  
 #define LDAP_PSEARCH_BY_DELETE          0x02  
 #define LDAP_PSEARCH_BY_PREMODIFY       0x03  
 #define LDAP_PSEARCH_BY_MODIFY          0x04  
 #define LDAP_PSEARCH_BY_SCOPEOUT        0x05  
 #define LDAP_PSEARCH_BY_PREDELETE       0x06  
   
 struct psid_entry {             /* DELETE ME */  
         struct slap_op *ps_op;  
         LDAP_LIST_ENTRY(psid_entry) ps_link;  
 };  
   
 #if 0   /* DELETE ME */  
 struct slog_entry {  
         struct berval sl_uuid;  
         struct berval sl_name;  
         struct berval sl_csn;  
         LDAP_STAILQ_ENTRY(slog_entry) sl_link;  
 };  
   
 /* session lists */  
 struct slap_session_entry {  
         int se_id;  
         int se_size;  
         struct berval se_spec;  
         LDAP_LIST_ENTRY( slap_session_entry ) se_link;  
 };  
 #endif  
   
 struct slap_csn_entry {  struct slap_csn_entry {
         struct berval ce_csn;          struct berval ce_csn;
         unsigned long ce_opid;          unsigned long ce_opid;
Line 2097  struct slap_csn_entry { Line 2278  struct slap_csn_entry {
         LDAP_TAILQ_ENTRY (slap_csn_entry) ce_csn_link;          LDAP_TAILQ_ENTRY (slap_csn_entry) ce_csn_link;
 };  };
   
 struct pc_entry {  
         ID pc_id;  
         int pc_sent;  
         struct berval pc_csn;  
         struct berval pc_entryUUID;  
         struct berval pc_ename;  
         struct berval pc_enname;  
         LDAP_TAILQ_ENTRY( pc_entry ) pc_link;  
 };  
   
 /*  /*
  * Caches the result of a backend_group check for ACL evaluation   * Caches the result of a backend_group check for ACL evaluation
  */   */
Line 2120  typedef struct slap_gacl { Line 2291  typedef struct slap_gacl {
         char ga_ndn[1];          char ga_ndn[1];
 } GroupAssertion;  } GroupAssertion;
   
 #ifndef SLAP_MAX_CIDS  
 #define SLAP_MAX_CIDS   32      /* Maximum number of supported controls */  
 #endif  
   
 struct slap_control_ids {  struct slap_control_ids {
           int sc_LDAPsync;
         int sc_assert;          int sc_assert;
         int sc_preRead;          int sc_domainScope;
         int sc_postRead;          int sc_dontUseCopy;
         int sc_proxyAuthz;          int sc_manageDIT;
         int sc_manageDSAit;          int sc_manageDSAit;
         int sc_modifyIncrement;          int sc_modifyIncrement;
         int sc_noOp;          int sc_noOp;
         int sc_pagedResults;          int sc_pagedResults;
         int sc_valuesReturnFilter;  
         int sc_permissiveModify;          int sc_permissiveModify;
         int sc_domainScope;          int sc_postRead;
         int sc_treeDelete;          int sc_preRead;
           int sc_proxyAuthz;
         int sc_searchOptions;          int sc_searchOptions;
   #ifdef LDAP_DEVEL
           int sc_sortedResults;
   #endif
         int sc_subentries;          int sc_subentries;
         int sc_LDAPsync;          int sc_treeDelete;
           int sc_valuesReturnFilter;
 };  };
   
 /*  /*
Line 2162  typedef struct slap_op_header { Line 2334  typedef struct slap_op_header {
         char            oh_log_prefix[sizeof("conn=18446744073709551615 op=18446744073709551615")];          char            oh_log_prefix[sizeof("conn=18446744073709551615 op=18446744073709551615")];
   
 #ifdef LDAP_SLAPI  #ifdef LDAP_SLAPI
         void    *oh_pb;                  /* NS-SLAPI plugin */  
         void    *oh_extensions;         /* NS-SLAPI plugin */          void    *oh_extensions;         /* NS-SLAPI plugin */
 #endif  #endif
 } Opheader;  } Opheader;
Line 2187  typedef struct slap_op { Line 2358  typedef struct slap_op {
   
 #define o_log_prefix o_hdr->oh_log_prefix  #define o_log_prefix o_hdr->oh_log_prefix
   
 #ifdef LDAP_SLAPI  
 #define o_pb o_hdr->oh_pb  
 #define o_extensions o_hdr->oh_extensions  
 #endif  
   
         ber_tag_t       o_tag;          /* tag of the request */          ber_tag_t       o_tag;          /* tag of the request */
         time_t          o_time;         /* time op was initiated */          time_t          o_time;         /* time op was initiated */
           int                     o_tincr;        /* counter for multiple ops with same o_time */
   
         BackendDB       *o_bd;  /* backend DB processing this op */          BackendDB       *o_bd;  /* backend DB processing this op */
         struct berval   o_req_dn;       /* DN of target of request */          struct berval   o_req_dn;       /* DN of target of request */
Line 2240  typedef struct slap_op { Line 2407  typedef struct slap_op {
 #define ors_attrs oq_search.rs_attrs  #define ors_attrs oq_search.rs_attrs
 #define ors_filter oq_search.rs_filter  #define ors_filter oq_search.rs_filter
 #define ors_filterstr oq_search.rs_filterstr  #define ors_filterstr oq_search.rs_filterstr
 #define ors_post_search_id oq_search.rs_post_search_id  
   
 #define orr_newrdn oq_modrdn.rs_newrdn  #define orr_newrdn oq_modrdn.rs_newrdn
 #define orr_nnewrdn oq_modrdn.rs_nnewrdn  #define orr_nnewrdn oq_modrdn.rs_nnewrdn
Line 2269  typedef struct slap_op { Line 2435  typedef struct slap_op {
         char o_do_not_cache;    /* don't cache groups from this op */          char o_do_not_cache;    /* don't cache groups from this op */
         char o_is_auth_check;   /* authorization in progress */          char o_is_auth_check;   /* authorization in progress */
   
           char o_nocaching;
           char o_delete_glue_parent;
           char o_no_schema_check;
   #define get_no_schema_check(op)                 ((op)->o_no_schema_check)
   
 #define SLAP_CONTROL_NONE       0  #define SLAP_CONTROL_NONE       0
 #define SLAP_CONTROL_IGNORED    1  #define SLAP_CONTROL_IGNORED    1
 #define SLAP_CONTROL_NONCRITICAL 2  #define SLAP_CONTROL_NONCRITICAL 2
Line 2288  typedef struct slap_op { Line 2459  typedef struct slap_op {
         char o_ctrlflag[SLAP_MAX_CIDS]; /* per-control flags */          char o_ctrlflag[SLAP_MAX_CIDS]; /* per-control flags */
         void **o_controls;              /* per-control state */          void **o_controls;              /* per-control state */
   
   #define o_dontUseCopy                   o_ctrlflag[slap_cids.sc_dontUseCopy]
   #define get_dontUseCopy(op)             _SCM((op)->o_dontUseCopy)
   
   #define o_managedit                             o_ctrlflag[slap_cids.sc_manageDIT]
   #define get_manageDIT(op)               _SCM((op)->o_managedit)
   
 #define o_managedsait   o_ctrlflag[slap_cids.sc_manageDSAit]  #define o_managedsait   o_ctrlflag[slap_cids.sc_manageDSAit]
 #define get_manageDSAit(op)                             _SCM((op)->o_managedsait)  #define get_manageDSAit(op)                             _SCM((op)->o_managedsait)
   
Line 2309  typedef struct slap_op { Line 2486  typedef struct slap_op {
 #define o_valuesreturnfilter    o_ctrlflag[slap_cids.sc_valuesReturnFilter]  #define o_valuesreturnfilter    o_ctrlflag[slap_cids.sc_valuesReturnFilter]
 #define o_vrFilter      o_controls[slap_cids.sc_valuesReturnFilter]  #define o_vrFilter      o_controls[slap_cids.sc_valuesReturnFilter]
   
 #ifdef LDAP_CONTROL_X_PERMISSIVE_MODIFY  
 #define o_permissive_modify     o_ctrlflag[slap_cids.sc_permissiveModify]  #define o_permissive_modify     o_ctrlflag[slap_cids.sc_permissiveModify]
 #define get_permissiveModify(op)                ((int)(op)->o_permissive_modify)  #define get_permissiveModify(op)                ((int)(op)->o_permissive_modify)
 #else  
 #define get_permissiveModify(op)                (0)  
 #endif  
   
 #ifdef LDAP_CONTROL_X_DOMAIN_SCOPE  
 #define o_domain_scope  o_ctrlflag[slap_cids.sc_domainScope]  #define o_domain_scope  o_ctrlflag[slap_cids.sc_domainScope]
 #define get_domainScope(op)                             ((int)(op)->o_domain_scope)  #define get_domainScope(op)                             ((int)(op)->o_domain_scope)
 #else  
 #define get_domainScope(op)                             (0)  
 #endif  
   
 #ifdef LDAP_CONTROL_X_TREE_DELETE  
 #define o_tree_delete   o_ctrlflag[slap_cids.sc_treeDelete]  #define o_tree_delete   o_ctrlflag[slap_cids.sc_treeDelete]
 #define get_treeDelete(op)                              ((int)(op)->o_tree_delete)  #define get_treeDelete(op)                              ((int)(op)->o_tree_delete)
 #else  
 #define get_treeDelete(op)                              (0)  
 #endif  
   
 #define o_preread       o_ctrlflag[slap_cids.sc_preRead]  #define o_preread       o_ctrlflag[slap_cids.sc_preRead]
 #define o_postread      o_ctrlflag[slap_cids.sc_postRead]  #define o_postread      o_ctrlflag[slap_cids.sc_postRead]
Line 2338  typedef struct slap_op { Line 2503  typedef struct slap_op {
   
 #define o_pagedresults  o_ctrlflag[slap_cids.sc_pagedResults]  #define o_pagedresults  o_ctrlflag[slap_cids.sc_pagedResults]
 #define o_pagedresults_state    o_controls[slap_cids.sc_pagedResults]  #define o_pagedresults_state    o_controls[slap_cids.sc_pagedResults]
   
 #define o_sync                  o_ctrlflag[slap_cids.sc_LDAPsync]  
   
 #define get_pagedresults(op)                    ((int)(op)->o_pagedresults)  #define get_pagedresults(op)                    ((int)(op)->o_pagedresults)
   
 #ifdef BDB_PSEARCH  #ifdef LDAP_DEVEL
         struct sync_cookie      o_sync_state;  #define o_sortedresults         o_ctrlflag[slap_cids.sc_sortedResults]
         int                                     o_sync_rhint;  
         struct berval           o_sync_cid;  
         int                                     o_sync_slog_size;  
         struct berval           o_sync_csn;  
         struct berval           o_sync_slog_omitcsn;  
         int                                     o_sync_slog_len;  
         LDAP_STAILQ_HEAD(sl, slog_entry) o_sync_slog_list;  
   
         int o_ps_entries;  
         int     o_no_psearch;  
         LDAP_LIST_ENTRY(slap_op) o_ps_link;  
         LDAP_LIST_HEAD(pe, psid_entry) o_pm_list;  
   
         int o_refresh_in_progress;  
         LDAP_TAILQ_HEAD(pc_pre, pc_entry) o_ps_pre_candidates;  
         LDAP_TAILQ_HEAD(pc_post, pc_entry) o_ps_post_candidates;  
         Avlnode *o_psearch_finished;  
         struct pc_entry *o_ps_send_wait;  
         ldap_pvt_thread_mutex_t o_pcmutex;  
 #endif  #endif
   
   #define o_sync                  o_ctrlflag[slap_cids.sc_LDAPsync]
   
         AuthorizationInformation o_authz;          AuthorizationInformation o_authz;
   
         BerElement      *o_ber;         /* ber of the request */          BerElement      *o_ber;         /* ber of the request */
         BerElement      *o_res_ber;     /* ber of the CLDAP reply or readback control */          BerElement      *o_res_ber;     /* ber of the CLDAP reply or readback control */
         slap_callback *o_callback;      /* callback pointers */          slap_callback *o_callback;      /* callback pointers */
         LDAPControl     **o_ctrls;       /* controls */          LDAPControl     **o_ctrls;       /* controls */
           struct berval o_csn;
   
         void    *o_private;     /* anything the backend needs */          void    *o_private;     /* anything the backend needs */
   
         LDAP_STAILQ_ENTRY(slap_op)      o_next; /* next operation in list         */          LDAP_STAILQ_ENTRY(slap_op)      o_next; /* next operation in list         */
   
         int o_nocaching;  
         int     o_delete_glue_parent;  
   
 } Operation;  } Operation;
 #define OPERATION_BUFFER_SIZE   (sizeof(Operation)+sizeof(Opheader)+SLAP_MAX_CIDS*sizeof(void *))  #define OPERATION_BUFFER_SIZE   ( sizeof(Operation) + sizeof(Opheader) + \
           SLAP_MAX_CIDS*sizeof(void *) )
   
   typedef LBER_ALIGNED_BUFFER(operation_buffer_u,OPERATION_BUFFER_SIZE)
           OperationBuffer;
   
 #define send_ldap_error( op, rs, err, text ) do { \  #define send_ldap_error( op, rs, err, text ) do { \
                 (rs)->sr_err = err; (rs)->sr_text = text; \                  (rs)->sr_err = err; (rs)->sr_text = text; \
Line 2423  typedef struct slap_conn { Line 2570  typedef struct slap_conn {
         int                     c_struct_state; /* structure management state */          int                     c_struct_state; /* structure management state */
         int                     c_conn_state;   /* connection state */          int                     c_conn_state;   /* connection state */
         int                     c_conn_idx;             /* slot in connections array */          int                     c_conn_idx;             /* slot in connections array */
           const char      *c_close_reason; /* why connection is closing */
   
         ldap_pvt_thread_mutex_t c_mutex; /* protect the connection */          ldap_pvt_thread_mutex_t c_mutex; /* protect the connection */
         Sockbuf         *c_sb;                  /* ber connection stuff           */          Sockbuf         *c_sb;                  /* ber connection stuff           */
Line 2442  typedef struct slap_conn { Line 2590  typedef struct slap_conn {
         int             c_sasl_bind_in_progress;        /* multi-op bind in progress */          int             c_sasl_bind_in_progress;        /* multi-op bind in progress */
         struct berval   c_sasl_bind_mech;                       /* mech in progress */          struct berval   c_sasl_bind_mech;                       /* mech in progress */
         struct berval   c_sasl_dn;      /* temporary storage */          struct berval   c_sasl_dn;      /* temporary storage */
           struct berval   c_sasl_authz_dn;        /* SASL proxy authz */
   
         /* authorization backend */          /* authorization backend */
         Backend *c_authz_backend;          Backend *c_authz_backend;
           void    *c_authz_cookie;
   #define SLAP_IS_AUTHZ_BACKEND( op )     \
           ( (op)->o_bd != NULL \
                   && (op)->o_bd->be_private != NULL \
                   && (op)->o_conn != NULL \
                   && (op)->o_conn->c_authz_backend != NULL \
                   && ( (op)->o_bd->be_private == (op)->o_conn->c_authz_backend->be_private \
                           || (op)->o_bd->be_private == (op)->o_conn->c_authz_cookie ) )
   
         AuthorizationInformation c_authz;          AuthorizationInformation c_authz;
   
Line 2506  typedef struct slap_conn { Line 2663  typedef struct slap_conn {
         SEND_SEARCH_ENTRY *c_send_search_entry;          SEND_SEARCH_ENTRY *c_send_search_entry;
         SEND_SEARCH_REFERENCE *c_send_search_reference;          SEND_SEARCH_REFERENCE *c_send_search_reference;
         SEND_LDAP_EXTENDED *c_send_ldap_extended;          SEND_LDAP_EXTENDED *c_send_ldap_extended;
 #ifdef LDAP_RES_INTERMEDIATE  
         SEND_LDAP_INTERMEDIATE *c_send_ldap_intermediate;          SEND_LDAP_INTERMEDIATE *c_send_ldap_intermediate;
 #endif  
   
 } Connection;  } Connection;
   
 #if defined(LDAP_SYSLOG) && defined(LDAP_DEBUG)  #if defined(LDAP_SYSLOG) && defined(LDAP_DEBUG)
Line 2547  struct slap_listener { Line 2701  struct slap_listener {
 #ifdef LDAP_CONNECTIONLESS  #ifdef LDAP_CONNECTIONLESS
         int     sl_is_udp;              /* UDP listener is also data port */          int     sl_is_udp;              /* UDP listener is also data port */
 #endif  #endif
         int     sl_is_mute;     /* Listening is temporarily disabled */          int     sl_mute;        /* Listener is temporarily disabled due to emfile */
   #ifdef SLAP_LIGHTWEIGHT_DISPATCHER
           int     sl_busy;        /* Listener is busy (accept thread activated) */
   #endif
         ber_socket_t sl_sd;          ber_socket_t sl_sd;
         Sockaddr sl_sa;          Sockaddr sl_sa;
 #define sl_addr sl_sa.sa_in_addr  #define sl_addr sl_sa.sa_in_addr
 };  };
   
 #ifdef SLAPD_MONITOR  
 /*  /*
  * Operation indices   * Operation indices
  */   */
Line 2570  enum { Line 2726  enum {
         SLAP_OP_EXTENDED,          SLAP_OP_EXTENDED,
         SLAP_OP_LAST          SLAP_OP_LAST
 };  };
 #endif /* SLAPD_MONITOR */  
   
 typedef struct slap_counters_t {  typedef struct slap_counters_t {
         ldap_pvt_thread_mutex_t sc_sent_mutex;          ldap_pvt_thread_mutex_t sc_sent_mutex;
Line 2603  typedef struct slap_counters_t { Line 2758  typedef struct slap_counters_t {
 #define SLAP_CTRL_HIDE                          0x80000000U  #define SLAP_CTRL_HIDE                          0x80000000U
 #endif  #endif
   
 #define SLAP_CTRL_FRONTEND                      0x00800000U  #define SLAP_CTRL_REQUIRES_ROOT         0x40000000U /* for ManageDIT */
 #define SLAP_CTRL_FRONTEND_SEARCH       0x00010000U     /* for NOOP */  
   #define SLAP_CTRL_GLOBAL                        0x00800000U
   #define SLAP_CTRL_GLOBAL_SEARCH         0x00010000U     /* for NOOP */
   
 #define SLAP_CTRL_OPFLAGS                       0x0000FFFFU  #define SLAP_CTRL_OPFLAGS                       0x0000FFFFU
 #define SLAP_CTRL_ABANDON                       0x00000001U  #define SLAP_CTRL_ABANDON                       0x00000001U
Line 2631  typedef int (SLAP_CTRL_PARSE_FN) LDAP_P( Line 2788  typedef int (SLAP_CTRL_PARSE_FN) LDAP_P(
 #define SLAP_SLAB_STACK 1  #define SLAP_SLAB_STACK 1
 #define SLAP_SLAB_SOBLOCK 64  #define SLAP_SLAB_SOBLOCK 64
   
 #if defined(LDAP_DEVEL) && defined(ENABLE_REWRITE)  #define SLAP_ZONE_ALLOC 1
 /* use librewrite for sasl-regexp */  #undef SLAP_ZONE_ALLOC
 #define SLAP_AUTH_REWRITE       1  
 #endif /* LDAP_DEVEL && ENABLE_REWRITE */  
   
 #ifdef LDAP_COMP_MATCH  #ifdef LDAP_COMP_MATCH
 /*  /*
Line 2697  typedef struct slap_component_reference Line 2852  typedef struct slap_component_reference
         ComponentId     *cr_curr;          ComponentId     *cr_curr;
         struct berval   cr_string;          struct berval   cr_string;
         int cr_len;          int cr_len;
           /* Component Indexing */
           int             cr_asn_type_id;
           slap_mask_t     cr_indexmask;
           AttributeDescription* cr_ad;
           BerVarray       cr_nvals;
           struct slap_component_reference* cr_next;
 } ComponentReference;  } ComponentReference;
   
 typedef struct slap_component_assertion {  typedef struct slap_component_assertion {
Line 2733  typedef struct slap_component_assertion_ Line 2894  typedef struct slap_component_assertion_
         char* cav_end;          char* cav_end;
 } ComponentAssertionValue;  } ComponentAssertionValue;
   
 #if 0  
 typedef int encoder_func LDAP_P((  typedef int encoder_func LDAP_P((
         void* b,          void* b,
         void* comp));          void* comp));
 #endif  
   
 struct slap_component_syntax_info;  struct slap_component_syntax_info;
   
Line 2785  typedef void free_nibble_func LDAP_P (( Line 2944  typedef void free_nibble_func LDAP_P ((
         void* nm ));          void* nm ));
   
 struct slap_component_syntax_info;                                                                            struct slap_component_syntax_info;                                                                          
 typedef void* convert_assert_to_comp_func LDAP_P ((  typedef void convert_assert_to_comp_func LDAP_P ((
           void *mem_op,
         struct slap_component_syntax_info* csi_attr,          struct slap_component_syntax_info* csi_attr,
         struct berval* bv,          struct berval* bv,
         struct slap_component_syntax_info** csi,          struct slap_component_syntax_info** csi,
Line 2800  typedef void free_component_func LDAP_P Line 2960  typedef void free_component_func LDAP_P
         void* mem_op));          void* mem_op));
   
 typedef int test_component_func LDAP_P ((  typedef int test_component_func LDAP_P ((
         void* mem_op,          void* attr_mem_op,
           void* assert_mem_op,
         struct slap_component_syntax_info* csi,          struct slap_component_syntax_info* csi,
         struct slap_component_assertion* ca));          struct slap_component_assertion* ca));
   
   typedef void* test_membership_func LDAP_P ((
           void* in ));
   
   typedef void* get_component_info_func LDAP_P ((
           int in ));
   
   struct slap_component_syntax_info;
   
   typedef int component_encoder_func LDAP_P ((
           void* mem_op,
           struct slap_component_syntax_info* csi,
           struct berval* nvals ));
           
 typedef int allcomponent_matching_func LDAP_P((  typedef int allcomponent_matching_func LDAP_P((
         char* oid,          char* oid,
         struct slap_component_syntax_info* comp1,          struct slap_component_syntax_info* comp1,
         struct slap_component_syntax_info* comp));          struct slap_component_syntax_info* comp));
   
 typedef struct slap_component_desc{  typedef struct slap_component_desc {
           /* Don't change the order of following four fields */
         int             cd_tag;          int             cd_tag;
           AttributeType   *cd_comp_type;
           struct berval   cd_ad_type;/* ad_type, ad_cname */
           struct berval   cd_ad_cname;/* ad_type, ad_cname */
           unsigned        cd_flags; /*ad_flags*/
         int             cd_type;          int             cd_type;
         int             cd_type_id;          int             cd_type_id;
         int             cd_compref_type;          encoder_func            *cd_ldap_encoder;
           encoder_func            *cd_gser_encoder;
           encoder_func            *cd_ber_encoder;
         gser_decoder_func       *cd_gser_decoder;          gser_decoder_func       *cd_gser_decoder;
         ber_decoder_func        *cd_ber_decoder;          ber_decoder_func        *cd_ber_decoder;
         comp_free_func          *cd_free;          comp_free_func          *cd_free;
         extract_component_from_id_func*  cd_extract_i;          extract_component_from_id_func*  cd_extract_i;
         slap_syntax_validate_func       *cd_validate;  
         slap_syntax_transform_func      *cd_pretty;  
         allcomponent_matching_func      *cd_all_match;          allcomponent_matching_func      *cd_all_match;
 } ComponentDesc;  } ComponentDesc;
   
Line 2849  struct slab_heap { Line 3028  struct slab_heap {
         LDAP_LIST_HEAD( sh_so, slab_object ) sh_sopool;          LDAP_LIST_HEAD( sh_so, slab_object ) sh_sopool;
 };  };
   
   #ifdef SLAP_ZONE_ALLOC
   #define SLAP_ZONE_SIZE 0x80000          /* 512KB */
   #define SLAP_ZONE_SHIFT 19
   #define SLAP_ZONE_INITSIZE 0x800000 /* 8MB */
   #define SLAP_ZONE_MAXSIZE 0x80000000/* 2GB */
   #define SLAP_ZONE_DELTA 0x800000        /* 8MB */
   #define SLAP_ZONE_ZOBLOCK 256
   
   struct zone_object {
           void *zo_ptr;
           int zo_siz;
           int zo_idx;
           int zo_blockhead;
           LDAP_LIST_ENTRY(zone_object) zo_link;
   };
   
   struct zone_latency_history {
           double zlh_latency;
           LDAP_STAILQ_ENTRY(zone_latency_history) zlh_next;
   };
   
   struct zone_heap {
           int zh_fd;
           int zh_zonesize;
           int zh_zoneorder;
           int zh_numzones;
           int zh_maxzones;
           int zh_deltazones;
           void **zh_zones;
           ldap_pvt_thread_rdwr_t *zh_znlock;
           Avlnode *zh_zonetree;
           unsigned char ***zh_maps;
           int *zh_seqno;
           LDAP_LIST_HEAD( zh_freelist, zone_object ) *zh_free;
           LDAP_LIST_HEAD( zh_so, zone_object ) zh_zopool;
           ldap_pvt_thread_mutex_t zh_mutex;
           ldap_pvt_thread_rdwr_t zh_lock;
           double zh_ema_latency;
           unsigned long zh_ema_samples;
           LDAP_STAILQ_HEAD( zh_latency_history, zone_latency_history )
                                   zh_latency_history_queue;
           int zh_latency_history_qlen;
           int zh_latency_jump;
           int zh_swapping;
   };
   #endif
   
 #define SLAP_BACKEND_INIT_MODULE(b) \  #define SLAP_BACKEND_INIT_MODULE(b) \
           static BackendInfo bi;  \
         int \          int \
         init_module( int argc, char *argv[] ) \          init_module( int argc, char *argv[] ) \
         { \          { \
                 BackendInfo bi; \  
                 memset( &bi, '\0', sizeof( bi ) ); \  
                 bi.bi_type = #b ; \                  bi.bi_type = #b ; \
                 bi.bi_init = b ## _back_initialize; \                  bi.bi_init = b ## _back_initialize; \
                 backend_add( &bi ); \                  backend_add( &bi ); \
                 return 0; \                  return 0; \
         }          }
   
   typedef int (OV_init)(void);
   typedef struct slap_oinit_t {
           const char      *ov_type;
           OV_init         *ov_init;
   } OverlayInit;
   
 LDAP_END_DECL  LDAP_END_DECL
   
 #include "proto-slap.h"  #include "proto-slap.h"

Removed from v.1.612  
changed lines
  Added in v.1.612.2.37


______________
© Copyright 1998-2020, OpenLDAP Foundation, info@OpenLDAP.org