]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/slap.h
Plug mutex/rwlock leaks (destroy them)
[openldap] / servers / slapd / slap.h
index 95bc81b8a714c745b0640c59fbe9e59dbb575363..a85a939c9b9335324710e816f579c39bbf112ca3 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2009 The OpenLDAP Foundation.
+ * Copyright 1998-2010 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -65,6 +65,9 @@ LDAP_BEGIN_DECL
 #define SLAP_CONTROL_X_SESSION_TRACKING
 #define SLAP_CONTROL_X_WHATFAILED
 #define SLAP_CONFIG_DELETE
+#ifndef SLAP_SCHEMA_EXPOSE
+#define SLAP_SCHEMA_EXPOSE
+#endif
 #endif
 
 #define LDAP_DYNAMIC_OBJECTS
@@ -412,12 +415,13 @@ struct Syntax {
 #define SLAP_SYNTAX_BLOB       0x0001U /* syntax treated as blob (audio) */
 #define SLAP_SYNTAX_BINARY     0x0002U /* binary transfer required (certificate) */
 #define SLAP_SYNTAX_BER                0x0004U /* stored in BER encoding (certificate) */
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SCHEMA_EXPOSE
 #define SLAP_SYNTAX_HIDE       0x0000U /* publish everything */
 #else
 #define SLAP_SYNTAX_HIDE       0x8000U /* hide (do not publish) */
 #endif
 #define        SLAP_SYNTAX_HARDCODE    0x10000U        /* This is hardcoded schema */
+#define        SLAP_SYNTAX_DN          0x20000U        /* Treat like a DN */
 
        Syntax                          **ssyn_sups;
 
@@ -519,7 +523,7 @@ struct MatchingRule {
 
        slap_mask_t                     smr_usage;
 
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SCHEMA_EXPOSE
 #define SLAP_MR_HIDE                   0x0000U
 #else
 #define SLAP_MR_HIDE                   0x8000U
@@ -690,7 +694,7 @@ struct AttributeType {
 #define SLAP_AT_NONE                   0x0000U
 #define SLAP_AT_ABSTRACT               0x0100U /* cannot be instantiated */
 #define SLAP_AT_FINAL                  0x0200U /* cannot be subtyped */
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SCHEMA_EXPOSE
 #define SLAP_AT_HIDE                   0x0000U /* publish everything */
 #else
 #define SLAP_AT_HIDE                   0x8000U /* hide attribute */
@@ -788,7 +792,7 @@ struct ObjectClass {
 #define        SLAP_OC__MASK           0x00FF
 #define        SLAP_OC__END            0x0100
 #define SLAP_OC_OPERATIONAL    0x4000
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SCHEMA_EXPOSE
 #define SLAP_OC_HIDE           0x0000
 #else
 #define SLAP_OC_HIDE           0x8000
@@ -1282,7 +1286,9 @@ typedef enum slap_style_e {
        ACL_STYLE_SELF,
        ACL_STYLE_IP,
        ACL_STYLE_IPV6,
-       ACL_STYLE_PATH
+       ACL_STYLE_PATH,
+
+       ACL_STYLE_NONE
 } slap_style_t;
 
 typedef struct AuthorizationInformation {
@@ -1527,27 +1533,28 @@ typedef struct AccessControl {
        struct AccessControl    *acl_next;
 } AccessControl;
 
-typedef enum {
-       ACL_STATE_NOT_RECORDED                  = 0x0,
-       ACL_STATE_RECORDED_VD                   = 0x1,
-       ACL_STATE_RECORDED_NV                   = 0x2,
-       ACL_STATE_RECORDED                      = ( ACL_STATE_RECORDED_VD | ACL_STATE_RECORDED_NV )
-} slap_acl_state_t;
-
 typedef struct AccessControlState {
        /* Access state */
-       AccessControl *as_vi_acl;
-       AccessControl *as_vd_acl;
-       AttributeDescription *as_vd_ad;
 
+       /* The stored state is valid when requesting as_access access
+        * to the as_desc attributes.    */
+       AttributeDescription *as_desc;
+       slap_access_t   as_access;
 
-       slap_acl_state_t as_recorded;
+       /* Value dependent acl where processing can restart */
+       AccessControl  *as_vd_acl;
+       int as_vd_acl_present;
        int as_vd_acl_count;
+       slap_mask_t             as_vd_mask;
+
+       /* The cached result after evaluating a value independent attr.
+        * Only valid when != -1 and as_vd_acl == NULL */
        int as_result;
+
+       /* True if started to process frontend ACLs */
        int as_fe_done;
 } AccessControlState;
-#define ACL_STATE_INIT { NULL, NULL, NULL, \
-       ACL_STATE_NOT_RECORDED, 0, 0, 0 }
+#define ACL_STATE_INIT { NULL, ACL_NONE, NULL, 0, 0, ACL_PRIV_NONE, -1, 0 }
 
 typedef struct AclRegexMatches {        
        int dn_count;
@@ -1581,12 +1588,19 @@ LDAP_SLAPD_V (int) slapMode;
 #define        SLAP_TOOL_READONLY      0x0400
 #define        SLAP_TOOL_QUICK         0x0800
 #define SLAP_TOOL_NO_SCHEMA_CHECK      0x1000
+#define SLAP_TOOL_VALUE_CHECK  0x2000
 
 #define SB_TLS_DEFAULT         (-1)
 #define SB_TLS_OFF             0
 #define SB_TLS_ON              1
 #define SB_TLS_CRITICAL                2
 
+typedef struct slap_keepalive {
+       int sk_idle;
+       int sk_probes;
+       int sk_interval;
+} slap_keepalive;
+
 typedef struct slap_bindconf {
        struct berval sb_uri;
        int sb_version;
@@ -1601,6 +1615,7 @@ typedef struct slap_bindconf {
        struct berval sb_realm;
        struct berval sb_authcId;
        struct berval sb_authzId;
+       slap_keepalive sb_keepalive;
 #ifdef HAVE_TLS
        void *sb_tls_ctx;
        char *sb_tls_cert;
@@ -1630,6 +1645,14 @@ typedef struct slap_cf_aux_table {
        void *aux;
 } slap_cf_aux_table;
 
+typedef int 
+slap_cf_aux_table_parse_x LDAP_P((
+       struct berval *val,
+       void *bc,
+       slap_cf_aux_table *tab0,
+       const char *tabmsg,
+       int unparse ));
+
 #define SLAP_LIMIT_TIME        1
 #define SLAP_LIMIT_SIZE        2
 
@@ -1703,6 +1726,13 @@ struct syncinfo_s;
 
 #define SLAP_SYNC_RID_MAX      999
 #define SLAP_SYNC_SID_MAX      4095    /* based on liblutil/csn.c field width */
+
+/* fake conn connid constructed as rid; real connids start
+ * at SLAPD_SYNC_CONN_OFFSET */
+#define SLAPD_SYNC_SYNCCONN_OFFSET (SLAP_SYNC_RID_MAX + 1)
+#define SLAPD_SYNC_IS_SYNCCONN(connid) ((connid) < SLAPD_SYNC_SYNCCONN_OFFSET)
+#define SLAPD_SYNC_RID2SYNCCONN(rid) (rid)
+
 #define SLAP_SYNCUUID_SET_SIZE 256
 
 struct sync_cookie {
@@ -1770,6 +1800,7 @@ struct BackendDB {
 #define                be_entry_open bd_info->bi_tool_entry_open
 #define                be_entry_close bd_info->bi_tool_entry_close
 #define                be_entry_first bd_info->bi_tool_entry_first
+#define                be_entry_first_x bd_info->bi_tool_entry_first_x
 #define                be_entry_next bd_info->bi_tool_entry_next
 #define                be_entry_reindex bd_info->bi_tool_entry_reindex
 #define                be_entry_get bd_info->bi_tool_entry_get
@@ -1804,6 +1835,7 @@ struct BackendDB {
 #define SLAP_DBFLAG_SHADOW_MASK                (SLAP_DBFLAG_SHADOW|SLAP_DBFLAG_SINGLE_SHADOW|SLAP_DBFLAG_SYNC_SHADOW|SLAP_DBFLAG_SLURP_SHADOW)
 #define SLAP_DBFLAG_CLEAN              0x10000U /* was cleanly shutdown */
 #define SLAP_DBFLAG_ACL_ADD            0x20000U /* check attr ACLs on adds */
+#define SLAP_DBFLAG_SYNC_SUBENTRY      0x40000U /* use subentry for context */
        slap_mask_t     be_flags;
 #define SLAP_DBFLAGS(be)                       ((be)->be_flags)
 #define SLAP_NOLASTMOD(be)                     (SLAP_DBFLAGS(be) & SLAP_DBFLAG_NOLASTMOD)
@@ -1830,6 +1862,7 @@ struct BackendDB {
 #define SLAP_MULTIMASTER(be)                   (!SLAP_SINGLE_SHADOW(be))
 #define SLAP_DBCLEAN(be)                       (SLAP_DBFLAGS(be) & SLAP_DBFLAG_CLEAN)
 #define SLAP_DBACL_ADD(be)                     (SLAP_DBFLAGS(be) & SLAP_DBFLAG_ACL_ADD)
+#define SLAP_SYNC_SUBENTRY(be)                 (SLAP_DBFLAGS(be) & SLAP_DBFLAG_SYNC_SUBENTRY)
 
        slap_mask_t     be_restrictops;         /* restriction operations */
 #define SLAP_RESTRICT_OP_ADD           0x0001U
@@ -1994,7 +2027,7 @@ typedef struct req_abandon_s {
        ber_int_t rs_msgid;
 } req_abandon_s;
 
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SCHEMA_EXPOSE
 #define SLAP_EXOP_HIDE 0x0000
 #else
 #define SLAP_EXOP_HIDE 0x8000
@@ -2073,6 +2106,7 @@ struct SlapReply {
 #define REP_ENTRY_MUSTBEFREED  0x0002U
 #define REP_ENTRY_MUSTRELEASE  0x0004U
 #define        REP_ENTRY_MASK          (REP_ENTRY_MODIFIABLE|REP_ENTRY_MUSTBEFREED|REP_ENTRY_MUSTRELEASE)
+#define        REP_ENTRY_MUSTFLUSH     (REP_ENTRY_MUSTBEFREED|REP_ENTRY_MUSTRELEASE)
 
 #define REP_MATCHED_MUSTBEFREED        0x0010U
 #define        REP_MATCHED_MASK        (REP_MATCHED_MUSTBEFREED)
@@ -2137,6 +2171,7 @@ typedef BI_conn_func BI_connection_destroy;
 typedef int (BI_tool_entry_open) LDAP_P(( BackendDB *be, int mode ));
 typedef int (BI_tool_entry_close) LDAP_P(( BackendDB *be ));
 typedef ID (BI_tool_entry_first) LDAP_P(( BackendDB *be ));
+typedef ID (BI_tool_entry_first_x) LDAP_P(( BackendDB *be, struct berval *base, int scope, Filter *f ));
 typedef ID (BI_tool_entry_next) LDAP_P(( BackendDB *be ));
 typedef Entry* (BI_tool_entry_get) LDAP_P(( BackendDB *be, ID id ));
 typedef ID (BI_tool_entry_put) LDAP_P(( BackendDB *be, Entry *e, 
@@ -2236,7 +2271,8 @@ struct BackendInfo {
        /* hooks for slap tools */
        BI_tool_entry_open      *bi_tool_entry_open;
        BI_tool_entry_close     *bi_tool_entry_close;
-       BI_tool_entry_first     *bi_tool_entry_first;
+       BI_tool_entry_first     *bi_tool_entry_first;   /* deprecated */
+       BI_tool_entry_first_x   *bi_tool_entry_first_x;
        BI_tool_entry_next      *bi_tool_entry_next;
        BI_tool_entry_get       *bi_tool_entry_get;
        BI_tool_entry_put       *bi_tool_entry_put;
@@ -2760,9 +2796,26 @@ typedef struct Listener Listener;
 /*
  * represents a connection from an ldap client
  */
+/* structure state (protected by connections_mutex) */
+enum sc_struct_state {
+       SLAP_C_UNINITIALIZED = 0,       /* MUST BE ZERO (0) */
+       SLAP_C_UNUSED,
+       SLAP_C_USED,
+       SLAP_C_PENDING
+};
+
+/* connection state (protected by c_mutex ) */
+enum sc_conn_state {
+       SLAP_C_INVALID = 0,             /* MUST BE ZERO (0) */
+       SLAP_C_INACTIVE,                /* zero threads */
+       SLAP_C_CLOSING,                 /* closing */
+       SLAP_C_ACTIVE,                  /* one or more threads */
+       SLAP_C_BINDING,                 /* binding */
+       SLAP_C_CLIENT                   /* outbound client conn */
+};
 struct Connection {
-       int                     c_struct_state; /* structure management state */
-       int                     c_conn_state;   /* connection state */
+       enum sc_struct_state    c_struct_state; /* structure management state */
+       enum sc_conn_state      c_conn_state;   /* connection state */
        int                     c_conn_idx;             /* slot in connections array */
        ber_socket_t    c_sd;
        const char      *c_close_reason; /* why connection is closing */
@@ -2935,7 +2988,7 @@ struct Listener {
 /* number of response controls supported */
 #define SLAP_MAX_RESPONSE_CONTROLS   6
 
-#ifdef LDAP_DEVEL
+#ifdef SLAP_SCHEMA_EXPOSE
 #define SLAP_CTRL_HIDE                         0x00000000U
 #else
 #define SLAP_CTRL_HIDE                         0x80000000U