X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fslap.h;h=65319e1a6ef0955e7115a77c4950eef92c9469b9;hb=24db207196a453a4f9acdce08593c7e0ed53ce4c;hp=75d74994d2580649ffe486a22562edf2a0f7db8f;hpb=c6df30118faef4b7b0461d161a2cc10b494b9eed;p=openldap diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 75d74994d2..65319e1a6e 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -59,15 +59,13 @@ LDAP_BEGIN_DECL #define SLAP_LIGHTWEIGHT_DISPATCHER /* experimental slapd architecture */ -#ifdef LDAP_PVT_THREAD_POOL_SEM_LOAD_CONTROL -#define SLAP_SEM_LOAD_CONTROL -#endif #ifdef LDAP_DEVEL #define LDAP_COLLECTIVE_ATTRIBUTES #define LDAP_COMP_MATCH #define LDAP_SYNC_TIMESTAMP -#define SLAP_SORTEDRESULTS +#define SLAP_CONTROL_X_SORTEDRESULTS +#define SLAP_CONTROL_X_SESSION_TRACKING #endif #define LDAP_DYNAMIC_OBJECTS @@ -103,6 +101,13 @@ LDAP_BEGIN_DECL #define SERVICE_NAME OPENLDAP_PACKAGE "-slapd" #define SLAPD_ANONYMOUS "" +#ifdef HAVE_TCPD +# include +# define SLAP_STRING_UNKNOWN STRING_UNKNOWN +#else /* ! TCP Wrappers */ +# define SLAP_STRING_UNKNOWN "unknown" +#endif /* ! TCP Wrappers */ + /* 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 * adding values that already exist without getting an error as required by @@ -268,7 +273,7 @@ typedef struct slap_ssf_set { #define SLAP_SYNTAX_ATTRIBUTETYPES_OID "1.3.6.1.4.1.1466.115.121.1.3" #define SLAP_SYNTAX_OBJECTCLASSES_OID "1.3.6.1.4.1.1466.115.121.1.37" #define SLAP_SYNTAX_MATCHINGRULEUSES_OID "1.3.6.1.4.1.1466.115.121.1.31" -#define SLAP_SYNTAX_CONTENTRULE_OID "1.3.6.1.4.1.1466.115.121.1.16" +#define SLAP_SYNTAX_CONTENTRULE_OID "1.3.6.1.4.1.1466.115.121.1.16" /* * represents schema information for a database @@ -292,6 +297,7 @@ enum { SLAP_SCHERR_MR_DUP, SLAP_SCHERR_SYN_NOT_FOUND, SLAP_SCHERR_SYN_DUP, + SLAP_SCHERR_SYN_SUP_NOT_FOUND, SLAP_SCHERR_NO_NAME, SLAP_SCHERR_NOT_SUPPORTED, SLAP_SCHERR_BAD_DESCR, @@ -408,6 +414,8 @@ struct Syntax { #define SLAP_SYNTAX_HIDE 0x8000U /* hide (do not publish) */ #endif + Syntax **ssyn_sups; + slap_syntax_validate_func *ssyn_validate; slap_syntax_transform_func *ssyn_pretty; @@ -433,6 +441,7 @@ struct Syntax { typedef struct slap_syntax_defs_rec { char *sd_desc; int sd_flags; + char **sd_sups; slap_syntax_validate_func *sd_validate; slap_syntax_transform_func *sd_pretty; #ifdef SLAPD_BINARY_CONVERSION @@ -681,10 +690,19 @@ struct AttributeType { #define SLAP_AT_MANAGEABLE 0x0800U /* no-user-mod can be by-passed */ +/* Note: ORDERED values have an ordering specifically set by the + * user, denoted by the {x} ordering prefix on the values. + * + * SORTED values are simply sorted by memcmp. SORTED values can + * be efficiently located by binary search. ORDERED values have no + * such advantage. An attribute cannot have both properties. + */ #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_SORTED_VAL 0x0010U /* values should be sorted */ + #define SLAP_AT_HARDCODE 0x10000U /* hardcoded schema */ #define SLAP_AT_DELETED 0x20000U @@ -970,6 +988,11 @@ struct AttributeAssertion { ComponentFilter *aa_cf; /* for attribute aliasing */ #endif }; +#ifdef LDAP_COMP_MATCH +#define ATTRIBUTEASSERTION_INIT { NULL, BER_BVNULL, NULL } +#else +#define ATTRIBUTEASSERTION_INIT { NULL, BER_BVNULL } +#endif struct SubstringsAssertion { AttributeDescription *sa_desc; @@ -1095,20 +1118,28 @@ struct ValuesReturnFilter { /* * represents an attribute (description + values) + * desc, vals, nvals, numvals fields must align with Modification */ struct Attribute { AttributeDescription *a_desc; BerVarray a_vals; /* preserved values */ BerVarray a_nvals; /* normalized values */ -#ifdef LDAP_COMP_MATCH - ComponentData *a_comp_data; /* component values */ -#endif - Attribute *a_next; + unsigned a_numvals; /* number of vals */ unsigned a_flags; #define SLAP_ATTR_IXADD 0x1U #define SLAP_ATTR_IXDEL 0x2U #define SLAP_ATTR_DONT_FREE_DATA 0x4U #define SLAP_ATTR_DONT_FREE_VALS 0x8U +#define SLAP_ATTR_SORTED_VALS 0x10U /* values are sorted */ + +/* These flags persist across an attr_dup() */ +#define SLAP_ATTR_PERSISTENT_FLAGS \ + SLAP_ATTR_SORTED_VALS + + Attribute *a_next; +#ifdef LDAP_COMP_MATCH + ComponentData *a_comp_data; /* component values */ +#endif }; @@ -1155,8 +1186,13 @@ struct Entry { /* * A list of LDAPMods + * desc, values, nvalues, numvals must align with Attribute */ struct Modification { + AttributeDescription *sm_desc; + BerVarray sm_values; + BerVarray sm_nvalues; + unsigned sm_numvals; short sm_op; short sm_flags; /* Set for internal mods, will bypass ACL checks. Only needed when @@ -1164,11 +1200,7 @@ struct Modification { */ #define SLAP_MOD_INTERNAL 0x01 #define SLAP_MOD_MANAGING 0x02 - - AttributeDescription *sm_desc; struct berval sm_type; - BerVarray sm_values; - BerVarray sm_nvalues; }; struct Modifications { @@ -1179,17 +1211,10 @@ struct Modifications { #define sml_type sml_mod.sm_type #define sml_values sml_mod.sm_values #define sml_nvalues sml_mod.sm_nvalues +#define sml_numvals sml_mod.sm_numvals Modifications *sml_next; }; -struct LDAPModList { - LDAPMod ml_mod; - LDAPModList *ml_next; -#define ml_op ml_mod.mod_op -#define ml_type ml_mod.mod_type -#define ml_values ml_mod.mod_values -}; - /* * represents an access control list */ @@ -1569,14 +1594,6 @@ typedef struct slap_bindconf { #endif } slap_bindconf; -struct slap_replica_info { - 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 */ - slap_bindconf ri_bindconf; /* for back-config */ -}; - typedef struct slap_verbmasks { struct berval word; const slap_mask_t mask; @@ -1703,9 +1720,9 @@ struct BackendDB { #define be_modrdn bd_info->bi_op_modrdn #define be_search bd_info->bi_op_search #define be_abandon bd_info->bi_op_abandon -#define be_cancel bd_info->bi_op_cancel #define be_extended bd_info->bi_extended +#define be_cancel bd_info->bi_op_cancel #define be_chk_referrals bd_info->bi_chk_referrals #define be_chk_controls bd_info->bi_chk_controls @@ -1734,7 +1751,6 @@ struct BackendDB { #define be_entry_put bd_info->bi_tool_entry_put #define be_sync bd_info->bi_tool_sync #define be_dn2id_get bd_info->bi_tool_dn2id_get -#define be_id2entry_get bd_info->bi_tool_id2entry_get #define be_entry_modify bd_info->bi_tool_entry_modify #endif @@ -1857,11 +1873,6 @@ struct BackendDB { slap_access_t be_dfltaccess; /* access given if no acl matches */ /* Replica Information */ - struct slap_replica_info **be_replica; /* replicas of this backend (in master) */ - char *be_replogfile; /* replication log file (in master) */ - char *be_replica_argsfile; /* per-replog replica args file */ - char *be_replica_pidfile; /* per-replog replica pid file */ - int be_replicationinterval; /* per-replog replicationinterval */ struct berval be_update_ndn; /* allowed to make changes (in replicas) */ BerVarray be_update_refs; /* where to refer modifying clients to */ struct be_pcl *be_pending_csn_list; @@ -1886,7 +1897,8 @@ typedef int (BI_config) LDAP_P((BackendInfo *bi, const char *fname, int lineno, int argc, char **argv)); -typedef int (BI_db_func) LDAP_P((Backend *bd)); +struct config_reply_s ; /* config.h */ +typedef int (BI_db_func) LDAP_P((Backend *bd, struct config_reply_s *c)); typedef BI_db_func BI_db_init; typedef BI_db_func BI_db_open; typedef BI_db_func BI_db_close; @@ -1900,7 +1912,7 @@ typedef struct req_bind_s { struct berval rb_cred; struct berval rb_edn; slap_ssf_t rb_ssf; - struct berval rb_tmp_mech; /* FIXME: temporary */ + struct berval rb_mech; } req_bind_s; typedef struct req_search_s { @@ -1920,23 +1932,27 @@ typedef struct req_compare_s { AttributeAssertion *rs_ava; } req_compare_s; -typedef struct req_modify_s { +typedef struct req_modifications_s { Modifications *rs_modlist; - int rs_increment; /* FIXME: temporary */ char rs_no_opattrs; /* don't att modify operational attrs */ +} req_modifications_s; + +typedef struct req_modify_s { + req_modifications_s rs_mods; /* NOTE: must be first in req_modify_s & req_modrdn_s */ + int rs_increment; } req_modify_s; typedef struct req_modrdn_s { - Modifications *rs_modlist; + req_modifications_s rs_mods; /* NOTE: must be first in req_modify_s & req_modrdn_s */ + int rs_deleteoldrdn; struct berval rs_newrdn; struct berval rs_nnewrdn; struct berval *rs_newSup; struct berval *rs_nnewSup; - int rs_deleteoldrdn; } req_modrdn_s; typedef struct req_add_s { - Modifications *rs_modlist; /* FIXME: temporary */ + Modifications *rs_modlist; Entry *rs_e; } req_add_s; @@ -2056,8 +2072,8 @@ typedef BI_op_func BI_op_modrdn; typedef BI_op_func BI_op_add; typedef BI_op_func BI_op_delete; typedef BI_op_func BI_op_abandon; -typedef BI_op_func BI_op_cancel; typedef BI_op_func BI_op_extended; +typedef BI_op_func BI_op_cancel; typedef BI_op_func BI_chk_referrals; typedef BI_op_func BI_chk_controls; typedef int (BI_entry_release_rw) @@ -2091,7 +2107,6 @@ typedef ID (BI_tool_entry_put) LDAP_P(( BackendDB *be, Entry *e, typedef int (BI_tool_entry_reindex) LDAP_P(( BackendDB *be, ID id, AttributeDescription **adv )); typedef int (BI_tool_sync) LDAP_P(( BackendDB *be )); typedef ID (BI_tool_dn2id_get) LDAP_P(( BackendDB *be, struct berval *dn )); -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 )); @@ -2161,10 +2176,10 @@ struct BackendInfo { BI_op_add *bi_op_add; BI_op_delete *bi_op_delete; BI_op_abandon *bi_op_abandon; - BI_op_cancel *bi_op_cancel; /* Extended Operations Helper */ BI_op_extended *bi_extended; + BI_op_cancel *bi_op_cancel; /* Auxilary Functions */ BI_operational *bi_operational; @@ -2191,7 +2206,6 @@ struct BackendInfo { BI_tool_entry_reindex *bi_tool_entry_reindex; BI_tool_sync *bi_tool_sync; BI_tool_dn2id_get *bi_tool_dn2id_get; - BI_tool_id2entry_get *bi_tool_id2entry_get; BI_tool_entry_modify *bi_tool_entry_modify; #define SLAP_INDEX_ADD_OP 0x0001 @@ -2281,8 +2295,8 @@ typedef enum slap_operation_e { op_add, op_delete, op_abandon, - op_cancel, op_extended, + op_cancel, op_aux_operational, op_aux_chk_referrals, op_aux_chk_controls, @@ -2357,13 +2371,18 @@ struct slap_control_ids { int sc_proxyAuthz; int sc_relax; int sc_searchOptions; -#ifdef SLAP_SORTEDRESULTS +#ifdef SLAP_CONTROL_X_SORTEDRESULTS int sc_sortedResults; #endif int sc_subentries; +#ifdef SLAP_CONTROL_X_TREE_DELETE int sc_treeDelete; +#endif #ifdef LDAP_X_TXN int sc_txnSpec; +#endif +#ifdef SLAP_CONTROL_X_SESSION_TRACKING + int sc_sessionTracking; #endif int sc_valuesReturnFilter; }; @@ -2385,7 +2404,7 @@ typedef struct Opheader { void *oh_tmpmemctx; /* slab malloc context */ BerMemoryFunctions *oh_tmpmfuncs; - char oh_log_prefix[sizeof("conn=18446744073709551615 op=18446744073709551615")]; + char oh_log_prefix[ /* sizeof("conn=18446744073709551615 op=18446744073709551615") */ SLAP_TEXT_BUFLEN ]; #ifdef LDAP_SLAPI void *oh_extensions; /* NS-SLAPI plugin */ @@ -2452,7 +2471,7 @@ struct Operation { #define orb_cred oq_bind.rb_cred #define orb_edn oq_bind.rb_edn #define orb_ssf oq_bind.rb_ssf -#define orb_tmp_mech oq_bind.rb_tmp_mech +#define orb_mech oq_bind.rb_mech #define ors_scope oq_search.rs_scope #define ors_deref oq_search.rs_deref @@ -2464,20 +2483,24 @@ struct Operation { #define ors_filter oq_search.rs_filter #define ors_filterstr oq_search.rs_filterstr +#define orr_modlist oq_modrdn.rs_mods.rs_modlist +#define orr_no_opattrs oq_modrdn.rs_mods.rs_no_opattrs +#define orr_deleteoldrdn oq_modrdn.rs_deleteoldrdn #define orr_newrdn oq_modrdn.rs_newrdn #define orr_nnewrdn oq_modrdn.rs_nnewrdn #define orr_newSup oq_modrdn.rs_newSup #define orr_nnewSup oq_modrdn.rs_nnewSup -#define orr_deleteoldrdn oq_modrdn.rs_deleteoldrdn -#define orr_modlist oq_modrdn.rs_modlist #define orc_ava oq_compare.rs_ava + #define ora_e oq_add.rs_e #define ora_modlist oq_add.rs_modlist + #define orn_msgid oq_abandon.rs_msgid -#define orm_modlist oq_modify.rs_modlist + +#define orm_modlist oq_modify.rs_mods.rs_modlist +#define orm_no_opattrs oq_modify.rs_mods.rs_no_opattrs #define orm_increment oq_modify.rs_increment -#define orm_no_opattrs oq_modify.rs_no_opattrs #define ore_reqoid oq_extended.rs_reqoid #define ore_flags oq_extended.rs_flags @@ -2552,8 +2575,10 @@ struct Operation { #define o_domain_scope o_ctrlflag[slap_cids.sc_domainScope] #define get_domainScope(op) ((int)(op)->o_domain_scope) +#ifdef SLAP_CONTROL_X_TREE_DELETE #define o_tree_delete o_ctrlflag[slap_cids.sc_treeDelete] #define get_treeDelete(op) ((int)(op)->o_tree_delete) +#endif #define o_preread o_ctrlflag[slap_cids.sc_preRead] #define o_postread o_ctrlflag[slap_cids.sc_postRead] @@ -2565,7 +2590,7 @@ struct Operation { #define o_pagedresults_state o_controls[slap_cids.sc_pagedResults] #define get_pagedresults(op) ((int)(op)->o_pagedresults) -#ifdef SLAP_SORTEDRESULTS +#ifdef SLAP_CONTROL_X_SORTEDRESULTS #define o_sortedresults o_ctrlflag[slap_cids.sc_sortedResults] #endif @@ -2573,6 +2598,12 @@ struct Operation { #define o_txnSpec o_ctrlflag[slap_cids.sc_txnSpec] #endif +#ifdef SLAP_CONTROL_X_SESSION_TRACKING +#define o_session_tracking o_ctrlflag[slap_cids.sc_sessionTracking] +#define o_tracked_sessions o_controls[slap_cids.sc_sessionTracking] +#define get_sessionTracking(op) ((int)(op)->o_session_tracking) +#endif + #define o_sync o_ctrlflag[slap_cids.sc_LDAPsync] AuthorizationInformation o_authz; @@ -2588,11 +2619,11 @@ struct Operation { LDAP_STAILQ_ENTRY(Operation) o_next; /* next operation in list */ }; -#define OPERATION_BUFFER_SIZE ( sizeof(Operation) + sizeof(Opheader) + \ - SLAP_MAX_CIDS*sizeof(void *) ) - -typedef LBER_ALIGNED_BUFFER(operation_buffer_u,OPERATION_BUFFER_SIZE) - OperationBuffer; +typedef struct OperationBuffer { + Operation ob_op; + Opheader ob_hdr; + void *ob_controls[SLAP_MAX_CIDS]; +} OperationBuffer; #define send_ldap_error( op, rs, err, text ) do { \ (rs)->sr_err = err; (rs)->sr_text = text; \ @@ -2790,12 +2821,12 @@ struct slap_listener { typedef enum { SLAP_OP_BIND = 0, SLAP_OP_UNBIND, + SLAP_OP_SEARCH, + SLAP_OP_COMPARE, + SLAP_OP_MODIFY, + SLAP_OP_MODRDN, SLAP_OP_ADD, SLAP_OP_DELETE, - SLAP_OP_MODRDN, - SLAP_OP_MODIFY, - SLAP_OP_COMPARE, - SLAP_OP_SEARCH, SLAP_OP_ABANDON, SLAP_OP_EXTENDED, SLAP_OP_LAST