X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslap.h;h=29755901fea50c993e6d9202bf872225615442a9;hb=af866c3b44ba37577671f2bffd482499f4b8bc00;hp=3b917b1e63fe46a504a82d7bfeab150ba9c845da;hpb=decfd7217f384ce3030eb4ece043732b89b7c32e;p=openldap diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 3b917b1e63..29755901fe 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2005 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -58,6 +58,25 @@ LDAP_BEGIN_DECL + +#ifdef LDAP_DEVEL +#define SLAP_ACL_HONOR_DISCLOSE /* partially implemented */ +#define SLAP_ACL_HONOR_MANAGE /* not yet implemented */ +#define SLAP_DYNACL +#define LDAP_COMP_MATCH +#define LDAP_DYNAMIC_OBJECTS +#define LDAP_SYNC_TIMESTAMP +#define LDAP_COLLECTIVE_ATTRIBUTES +#define SLAP_CONTROL_X_TREE_DELETE LDAP_CONTROL_X_TREE_DELETE + +#define SLAP_USE_CONFDIR /* partially implemented */ + +#ifdef ENABLE_REWRITE +#define SLAP_AUTH_REWRITE 1 /* use librewrite for sasl-regexp */ +#endif +#endif + + /* * SLAPD Memory allocation macros * @@ -94,8 +113,6 @@ LDAP_BEGIN_DECL #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_AUTH ((1<<24) - 1) @@ -306,8 +323,11 @@ extern int slap_inet4or6; typedef struct slap_oid_macro { struct berval som_oid; - char **som_names; - LDAP_SLIST_ENTRY(slap_oid_macro) som_next; + BerVarray som_names; + BerVarray som_subs; +#define SLAP_OM_HARDCODE 0x10000U /* This is hardcoded schema */ + int som_flags; + LDAP_STAILQ_ENTRY(slap_oid_macro) som_next; } OidMacro; /* forward declarations */ @@ -324,10 +344,6 @@ typedef int slap_syntax_transform_func LDAP_P(( struct berval * out, void *memctx)); -#ifdef LDAP_DEVEL -#define LDAP_COMP_MATCH -#endif - #ifdef LDAP_COMP_MATCH typedef void* slap_component_transform_func LDAP_P(( struct berval * in )); @@ -476,7 +492,7 @@ typedef struct slap_matching_rule { #define SLAP_MR_ORDERING 0x0200U #define SLAP_MR_SUBSTR 0x0400U #define SLAP_MR_EXT 0x0800U /* implicitly extensible */ -#define SLAP_MR_ORDERED_INDEX 0x1000U +#define SLAP_MR_ORDERED_INDEX 0x1000U #ifdef LDAP_COMP_MATCH #define SLAP_MR_COMPONENT 0x2000U #endif @@ -636,9 +652,12 @@ typedef struct slap_attribute_type { #endif #define SLAP_AT_DYNAMIC 0x0400U /* dynamically generated */ +#define SLAP_AT_ORDERED 0x0001U /* values are ordered */ +#define SLAP_AT_HARDCODE 0x10000U /* This is hardcoded schema */ + 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_names sat_atype.at_names @@ -692,7 +711,7 @@ typedef struct slap_object_class { #define soc_at_oids_may soc_oclass.oc_at_oids_may #define soc_extensions soc_oclass.oc_extensions - LDAP_SLIST_ENTRY(slap_object_class) soc_next; + LDAP_STAILQ_ENTRY(slap_object_class) soc_next; } ObjectClass; #define SLAP_OC_ALIAS 0x0001 @@ -711,6 +730,7 @@ typedef struct slap_object_class { #else #define SLAP_OC_HIDE 0x8000 #endif +#define SLAP_OC_HARDCODE 0x10000U /* This is hardcoded schema */ /* * DIT content rule @@ -731,7 +751,10 @@ typedef struct slap_content_rule { #define scr_at_oids_may scr_crule.cr_at_oids_may #define scr_at_oids_not scr_crule.cr_at_oids_not - LDAP_SLIST_ENTRY( slap_content_rule ) scr_next; +#define SLAP_CR_HARDCODE 0x10000U + int scr_flags; + + LDAP_STAILQ_ENTRY( slap_content_rule ) scr_next; } ContentRule; /* Represents a recognized attribute description ( type + options ). */ @@ -812,6 +835,7 @@ struct slap_internal_schema { AttributeDescription *si_ad_monitorContext; AttributeDescription *si_ad_vendorName; AttributeDescription *si_ad_vendorVersion; + AttributeDescription *si_ad_configContext; /* subentry attribute descriptions */ AttributeDescription *si_ad_administrativeRole; @@ -848,6 +872,7 @@ struct slap_internal_schema { AttributeDescription *si_ad_distinguishedName; AttributeDescription *si_ad_name; AttributeDescription *si_ad_cn; + AttributeDescription *si_ad_uid; AttributeDescription *si_ad_userPassword; AttributeDescription *si_ad_labeledURI; #ifdef SLAPD_AUTHPASSWD @@ -893,6 +918,9 @@ struct slap_internal_schema { typedef struct slap_attr_assertion { AttributeDescription *aa_desc; struct berval aa_value; +#ifdef LDAP_COMP_MATCH + struct slap_component_filter *aa_cf;/* for attribute aliasing */ +#endif } AttributeAssertion; typedef struct slap_ss_assertion { @@ -1029,9 +1057,10 @@ typedef struct slap_valuesreturnfilter { } ValuesReturnFilter; #ifdef LDAP_COMP_MATCH +struct slap_component_syntax_info; typedef struct slap_component_data { void* cd_mem_op;/* nibble memory handler */ - void* cd_tree; /* component tree */ + struct slap_component_syntax_info** cd_tree;/* component tree */ } ComponentData; #endif @@ -1121,11 +1150,13 @@ typedef struct slap_ldap_modlist { typedef enum slap_access_e { ACL_INVALID_ACCESS = -1, ACL_NONE = 0, + ACL_DISCLOSE, ACL_AUTH, ACL_COMPARE, ACL_SEARCH, ACL_READ, - ACL_WRITE + ACL_WRITE, + ACL_MANAGE } slap_access_t; typedef enum slap_control_e { @@ -1142,6 +1173,7 @@ typedef enum slap_style_e { ACL_STYLE_ONE, ACL_STYLE_SUBTREE, ACL_STYLE_CHILDREN, + ACL_STYLE_LEVEL, ACL_STYLE_ATTROF, ACL_STYLE_ANONYMOUS, ACL_STYLE_USERS, @@ -1164,19 +1196,15 @@ typedef struct slap_authz_info { } AuthorizationInformation; -#ifdef LDAP_DEVEL -#define SLAP_DYNACL -#endif /* LDAP_DEVEL */ - #ifdef SLAP_DYNACL struct slap_op; /* * "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_print)( void *priv ); -typedef int (*slap_dynacl_mask)( +typedef int (slap_dynacl_parse)( const char *fname, int lineno, slap_style_t, const char *, void **privp ); +typedef int (slap_dynacl_unparse)( void *priv, struct berval *bv ); +typedef int (slap_dynacl_mask)( void *priv, struct slap_op *op, Entry *e, @@ -1186,14 +1214,14 @@ typedef int (*slap_dynacl_mask)( regmatch_t *matches, slap_access_t *grant, slap_access_t *deny ); -typedef int (*slap_dynacl_destroy)( void *priv ); +typedef int (slap_dynacl_destroy)( void *priv ); typedef struct slap_dynacl_t { char *da_name; - slap_dynacl_parse da_parse; - slap_dynacl_print da_print; - slap_dynacl_mask da_mask; - slap_dynacl_destroy da_destroy; + slap_dynacl_parse *da_parse; + slap_dynacl_unparse *da_unparse; + slap_dynacl_mask *da_mask; + slap_dynacl_destroy *da_destroy; void *da_private; struct slap_dynacl_t *da_next; @@ -1207,11 +1235,13 @@ typedef struct slap_access { #define ACL_ACCESS2PRIV(access) (0x01U << (access)) #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_COMPARE ACL_ACCESS2PRIV( ACL_COMPARE ) #define ACL_PRIV_SEARCH ACL_ACCESS2PRIV( ACL_SEARCH ) #define ACL_PRIV_READ ACL_ACCESS2PRIV( ACL_READ ) #define ACL_PRIV_WRITE ACL_ACCESS2PRIV( ACL_WRITE ) +#define ACL_PRIV_MANAGE ACL_ACCESS2PRIV( ACL_MANAGE ) #define ACL_PRIV_MASK 0x00ffUL @@ -1240,26 +1270,32 @@ typedef struct slap_access { #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_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_SEARCH (ACL_PRIV_SEARCH|ACL_LVL_COMPARE) #define ACL_LVL_READ (ACL_PRIV_READ|ACL_LVL_SEARCH) #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_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_COMPARE(m) ACL_LVL((m),ACL_LVL_COMPARE) #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_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_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_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_READ(m) ACL_PRIV_ASSIGN((m),ACL_LVL_READ) #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; @@ -1267,6 +1303,8 @@ typedef struct slap_access { #define a_dn_pat a_authz.sai_dn slap_style_t a_dn_style; + int a_dn_level; + int a_dn_self_level; AttributeDescription *a_dn_at; int a_dn_self; int a_dn_expand; @@ -1354,11 +1392,13 @@ typedef struct slap_acl_state { typedef struct slap_backend_info BackendInfo; /* per backend type */ 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) nBackendDB; -LDAP_SLAPD_V (BackendInfo *) backendInfo; -LDAP_SLAPD_V (BackendDB *) backendDB; +LDAP_SLAPD_V (slap_bi_head) backendInfo; +LDAP_SLAPD_V (slap_be_head) backendDB; LDAP_SLAPD_V (BackendDB *) frontendDB; LDAP_SLAPD_V (int) slapMode; @@ -1370,14 +1410,41 @@ LDAP_SLAPD_V (int) slapMode; #define SLAP_TRUNCATE_MODE 0x0100 #define SLAP_TOOL_READMAIN 0x0200 #define SLAP_TOOL_READONLY 0x0400 +#define SLAP_TOOL_QUICK 0x0800 + +#define SB_TLS_OFF 0 +#define SB_TLS_ON 1 +#define SB_TLS_CRITICAL 2 + +typedef struct slap_bindconf { + int sb_tls; + int sb_method; + char *sb_binddn; + char *sb_cred; + char *sb_saslmech; + char *sb_secprops; + char *sb_realm; + char *sb_authcId; + char *sb_authzId; +} slap_bindconf; struct slap_replica_info { - char *ri_host; /* supersedes be_replica */ - BerVarray ri_nsuffix; /* array of suffixes this replica accepts */ + const char *ri_uri; /* supersedes be_replica */ + const char *ri_host; /* points to host part of uri */ + BerVarray ri_nsuffix; /* array of suffixes this replica accepts */ 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 int mask; +} slap_verbmasks; + +#define SLAP_LIMIT_TIME 1 +#define SLAP_LIMIT_SIZE 2 + struct slap_limits_set { /* time limits */ int lms_t_soft; @@ -1441,10 +1508,11 @@ typedef BackendDB Backend; * syncinfo structure for syncrepl */ -#define SLAP_SYNC_SID_SIZE 3 #define SLAP_SYNC_RID_SIZE 3 #define SLAP_SYNCUUID_SET_SIZE 256 +#define SLAP_SYNC_UPDATE_MSGID 2 + struct nonpresent_entry { struct berval *npe_name; struct berval *npe_nname; @@ -1452,9 +1520,8 @@ struct nonpresent_entry { }; struct sync_cookie { - struct berval *ctxcsn; - long sid; - struct berval *octet_str; + struct berval ctxcsn; + struct berval octet_str; long rid; LDAP_STAILQ_ENTRY(sync_cookie) sc_next; }; @@ -1464,32 +1531,20 @@ 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_provideruri; + slap_bindconf si_bindconf; struct berval si_filterstr; struct berval si_base; int si_scope; int si_attrsonly; + char *si_anfile; AttributeName *si_anlist; AttributeName *si_exanlist; char **si_attrs; + char **si_exattrs; int si_allattrs; int si_allopattrs; - char **si_exattrs; + int si_schemachecking; int si_type; time_t si_interval; time_t *si_retryinterval; @@ -1504,11 +1559,15 @@ typedef struct syncinfo_s { Avlnode *si_presentlist; LDAP *si_ld; LDAP_LIST_HEAD(np, nonpresent_entry) si_nonpresentlist; - LDAP_STAILQ_ENTRY( syncinfo_s ) si_next; + ldap_pvt_thread_mutex_t si_mutex; } syncinfo_t; LDAP_TAILQ_HEAD( be_pcl, slap_csn_entry ); +#ifndef SLAP_MAX_CIDS +#define SLAP_MAX_CIDS 32 /* Maximum number of supported controls */ +#endif + struct slap_backend_db { BackendInfo *bd_info; /* pointer to shared backend info */ @@ -1533,6 +1592,7 @@ struct slap_backend_db { #define be_extended bd_info->bi_extended #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_release bd_info->bi_entry_release_rw #define be_group bd_info->bi_acl_group @@ -1546,8 +1606,6 @@ struct slap_backend_db { */ #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_destroy bd_info->bi_connection_destroy @@ -1565,13 +1623,20 @@ struct slap_backend_db { #define be_entry_modify bd_info->bi_tool_entry_modify #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 */ #define SLAP_DBFLAG_NOLASTMOD 0x0001U #define SLAP_DBFLAG_NO_SCHEMA_CHECK 0x0002U #define SLAP_DBFLAG_GLUE_INSTANCE 0x0010U /* a glue backend */ #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_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_SYNC_SHADOW 0x1000U /* a sync shadow */ #define SLAP_DBFLAG_SLURP_SHADOW 0x2000U /* a slurp shadow */ @@ -1588,6 +1653,8 @@ struct slap_backend_db { (SLAP_DBFLAGS(be) & SLAP_DBFLAG_GLUE_SUBORDINATE) #define SLAP_GLUE_LINKED(be) \ (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_SYNC_SHADOW(be) (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SYNC_SHADOW) #define SLAP_SLURP_SHADOW(be) (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SLURP_SHADOW) @@ -1668,13 +1735,13 @@ struct slap_backend_db { struct be_pcl *be_pending_csn_list; ldap_pvt_thread_mutex_t be_pcl_mutex; ldap_pvt_thread_mutex_t *be_pcl_mutexp; - struct berval be_context_csn; - LDAP_STAILQ_HEAD( be_si, syncinfo_s ) be_syncinfo; /* For syncrepl */ + syncinfo_t *be_syncinfo; /* For syncrepl */ - char *be_realm; void *be_pb; /* Netscape plugin */ + struct ConfigTable *be_cf_table; void *be_private; /* anything the backend database needs */ + LDAP_STAILQ_ENTRY(slap_backend_db) be_next; }; struct slap_conn; @@ -1716,7 +1783,6 @@ typedef struct req_search_s { AttributeName *rs_attrs; Filter *rs_filter; struct berval rs_filterstr; - int rs_post_search_id; } req_search_s; typedef struct req_compare_s { @@ -1851,6 +1917,8 @@ typedef int (BI_op_extended) LDAP_P(( struct slap_op *op, struct slap_rep *rs )); typedef int (BI_chk_referrals) LDAP_P(( struct slap_op *op, struct slap_rep *rs )); +typedef int (BI_chk_controls) LDAP_P(( + struct slap_op *op, struct slap_rep *rs )); typedef int (BI_entry_release_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, @@ -1878,6 +1946,8 @@ typedef int (BI_tool_id2entry_get) LDAP_P(( BackendDB *be, ID id, Entry **e )); typedef ID (BI_tool_entry_modify) LDAP_P(( BackendDB *be, Entry *e, struct berval *text )); +struct ConfigTable; /* config.h */ + struct slap_backend_info { char *bi_type; /* type of backend */ @@ -1952,6 +2022,7 @@ struct slap_backend_info { /* Auxilary Functions */ BI_operational *bi_operational; BI_chk_referrals *bi_chk_referrals; + BI_chk_controls *bi_chk_controls; BI_entry_get_rw *bi_entry_get_rw; BI_entry_release_rw *bi_entry_release_rw; @@ -1978,6 +2049,7 @@ struct slap_backend_info { slap_mask_t bi_flags; /* backend flags */ #define SLAP_BFLAG_MONITOR 0x0001U /* a monitor backend */ +#define SLAP_BFLAG_CONFIG 0x0002U /* a config backend */ #define SLAP_BFLAG_NOLASTMODCMD 0x0010U #define SLAP_BFLAG_INCREMENT 0x0100U #define SLAP_BFLAG_ALIASES 0x1000U @@ -1987,6 +2059,7 @@ struct slap_backend_info { #define SLAP_BFLAGS(be) ((be)->bd_info->bi_flags) #define SLAP_MONITOR(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_MONITOR) +#define SLAP_CONFIG(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_CONFIG) #define SLAP_INCREMENT(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_INCREMENT) #define SLAP_ALIASES(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_ALIASES) #define SLAP_REFERRALS(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_REFERRALS) @@ -1995,10 +2068,13 @@ struct slap_backend_info { #define SLAP_NOLASTMODCMD(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_NOLASTMODCMD) #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 */ + struct ConfigTable *bi_cf_table; void *bi_private; /* anything the backend type needs */ + LDAP_STAILQ_ENTRY(slap_backend_info) bi_next ; }; #define c_authtype c_authz.sai_method @@ -2058,35 +2134,8 @@ typedef struct slap_paged_state { int ps_count; } 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 { - struct slap_op *ps_op; - LDAP_LIST_ENTRY(psid_entry) ps_link; -}; - -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; -}; - struct slap_csn_entry { - struct berval *ce_csn; + struct berval ce_csn; unsigned long ce_opid; unsigned long ce_connid; #define SLAP_CSN_PENDING 1 @@ -2095,16 +2144,6 @@ struct slap_csn_entry { 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 */ @@ -2118,10 +2157,6 @@ typedef struct slap_gacl { char ga_ndn[1]; } GroupAssertion; -#ifndef SLAP_MAX_CIDS -#define SLAP_MAX_CIDS 32 /* Maximum number of supported controls */ -#endif - struct slap_control_ids { int sc_assert; int sc_preRead; @@ -2131,6 +2166,9 @@ struct slap_control_ids { int sc_modifyIncrement; int sc_noOp; int sc_pagedResults; +#ifdef LDAP_DEVEL + int sc_sortedResults; +#endif int sc_valuesReturnFilter; int sc_permissiveModify; int sc_domainScope; @@ -2238,7 +2276,6 @@ typedef struct slap_op { #define ors_attrs oq_search.rs_attrs #define ors_filter oq_search.rs_filter #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_nnewrdn oq_modrdn.rs_nnewrdn @@ -2336,34 +2373,14 @@ typedef struct slap_op { #define o_pagedresults o_ctrlflag[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) -#ifdef BDB_PSEARCH - struct sync_cookie o_sync_state; - 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; +#ifdef LDAP_DEVEL +#define o_sortedresults o_ctrlflag[slap_cids.sc_sortedResults] #endif +#define o_sync o_ctrlflag[slap_cids.sc_LDAPsync] + AuthorizationInformation o_authz; BerElement *o_ber; /* ber of the request */ @@ -2601,8 +2618,8 @@ typedef struct slap_counters_t { #define SLAP_CTRL_HIDE 0x80000000U #endif -#define SLAP_CTRL_FRONTEND 0x00800000U -#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_ABANDON 0x00000001U @@ -2629,10 +2646,8 @@ typedef int (SLAP_CTRL_PARSE_FN) LDAP_P(( #define SLAP_SLAB_STACK 1 #define SLAP_SLAB_SOBLOCK 64 -#if defined(LDAP_DEVEL) && defined(ENABLE_REWRITE) -/* use librewrite for sasl-regexp */ -#define SLAP_AUTH_REWRITE 1 -#endif /* LDAP_DEVEL && ENABLE_REWRITE */ +#define SLAP_ZONE_ALLOC 1 +#undef SLAP_ZONE_ALLOC #ifdef LDAP_COMP_MATCH /* @@ -2675,7 +2690,7 @@ typedef int (SLAP_CTRL_PARSE_FN) LDAP_P(( #define LDAP_COMP_FILTER_ITEM ((ber_tag_t) 0xa3U) #define LDAP_COMP_FILTER_UNDEFINED ((ber_tag_t) 0xa4U) -typedef struct slap_component_id{ +typedef struct slap_component_id { int ci_type; struct slap_component_id *ci_next; @@ -2695,6 +2710,12 @@ typedef struct slap_component_reference { ComponentId *cr_curr; struct berval cr_string; 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; typedef struct slap_component_assertion { @@ -2730,10 +2751,10 @@ typedef struct slap_component_assertion_value { char* cav_ptr; char* cav_end; } ComponentAssertionValue; -/* + typedef int encoder_func LDAP_P(( void* b, - void* comp));*/ + void* comp)); struct slap_component_syntax_info; @@ -2781,7 +2802,8 @@ typedef void free_nibble_func LDAP_P (( void* nm )); 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 berval* bv, struct slap_component_syntax_info** csi, @@ -2796,26 +2818,45 @@ typedef void free_component_func LDAP_P (( void* mem_op)); 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_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(( char* oid, struct slap_component_syntax_info* comp1, 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; + 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_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; ber_decoder_func *cd_ber_decoder; comp_free_func *cd_free; 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; } ComponentDesc; @@ -2845,12 +2886,58 @@ struct slab_heap { 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) \ + static BackendInfo bi; \ int \ init_module( int argc, char *argv[] ) \ { \ - BackendInfo bi; \ - memset( &bi, '\0', sizeof( bi ) ); \ bi.bi_type = #b ; \ bi.bi_init = b ## _back_initialize; \ backend_add( &bi ); \