]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/back-meta/back-meta.h
Drop unnecessary memset()s
[openldap] / servers / slapd / back-meta / back-meta.h
index f337ea551afe8c394accfec1d7687f366c183023..6a6870fe07ecd9d5898631e6838f21a5b8069013 100644 (file)
 #include "rewrite.h"
 LDAP_BEGIN_DECL
 
+/*
+ * Set META_BACK_PRINT_CONNTREE larger than 0 to dump the connection tree (debug only)
+ */
+#ifndef META_BACK_PRINT_CONNTREE
+#define META_BACK_PRINT_CONNTREE 0
+#endif /* !META_BACK_PRINT_CONNTREE */
+
 struct slap_conn;
 struct slap_op;
 
@@ -153,14 +160,42 @@ ldap_dnattr_result_rewrite(
 
 /* (end of) from back-ldap.h before rwm removal */
 
+/*
+ * A metasingleconn_t can be in the following, mutually exclusive states:
+ *
+ *     - none                  (0x0U)
+ *     - creating              META_BACK_FCONN_CREATING
+ *     - initialized           META_BACK_FCONN_INITED
+ *     - binding               LDAP_BACK_FCONN_BINDING
+ *     - bound/anonymous       LDAP_BACK_FCONN_ISBOUND/LDAP_BACK_FCONN_ISANON
+ *
+ * possible modifiers are:
+ *
+ *     - privileged            LDAP_BACK_FCONN_ISPRIV
+ *     - privileged, TLS       LDAP_BACK_FCONN_ISTLS
+ *     - subjected to idassert LDAP_BACK_FCONN_ISIDASR
+ *     - tainted               LDAP_BACK_FCONN_TAINTED
+ */
+
+#define META_BACK_FCONN_INITED         (0x00100000U)
+#define META_BACK_FCONN_CREATING       (0x00200000U)
+
+#define        META_BACK_CONN_INITED(lc)               LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_INITED)
+#define        META_BACK_CONN_INITED_SET(lc)           LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_INITED)
+#define        META_BACK_CONN_INITED_CLEAR(lc)         LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_INITED)
+#define        META_BACK_CONN_INITED_CPY(lc, mlc)      LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_INITED, (mlc))
+#define        META_BACK_CONN_CREATING(lc)             LDAP_BACK_CONN_ISSET((lc), META_BACK_FCONN_CREATING)
+#define        META_BACK_CONN_CREATING_SET(lc)         LDAP_BACK_CONN_SET((lc), META_BACK_FCONN_CREATING)
+#define        META_BACK_CONN_CREATING_CLEAR(lc)       LDAP_BACK_CONN_CLEAR((lc), META_BACK_FCONN_CREATING)
+#define        META_BACK_CONN_CREATING_CPY(lc, mlc)    LDAP_BACK_CONN_CPY((lc), META_BACK_FCONN_CREATING, (mlc))
+
 struct metainfo_t;
 
-typedef struct metasingleconn_t {
-       int                     msc_candidate;
-#define        META_NOT_CANDIDATE      ((ber_tag_t)0x0)
-#define        META_CANDIDATE          ((ber_tag_t)0x1)
-#define        META_BINDING            ((ber_tag_t)0x2)
+#define        META_NOT_CANDIDATE              ((ber_tag_t)0x0)
+#define        META_CANDIDATE                  ((ber_tag_t)0x1)
+#define        META_BINDING                    ((ber_tag_t)0x2)
 
+typedef struct metasingleconn_t {
 #define META_CND_ISSET(rs,f)           ( ( (rs)->sr_tag & (f) ) == (f) )
 #define META_CND_SET(rs,f)             ( (rs)->sr_tag |= (f) )
 #define META_CND_CLEAR(rs,f)           ( (rs)->sr_tag &= ~(f) )
@@ -181,12 +216,11 @@ typedef struct metasingleconn_t {
        /* NOTE: lc_lcflags is redefined to msc_mscflags to reuse the macros
         * defined for back-ldap */
 #define        lc_lcflags              msc_mscflags
-
-       struct metainfo_t       *msc_info;
 } metasingleconn_t;
 
 typedef struct metaconn_t {
        struct slap_conn        *mc_conn;
+#define        lc_conn                 mc_conn
        unsigned                mc_refcnt;
 
        time_t                  mc_create_time;
@@ -204,6 +238,11 @@ typedef struct metaconn_t {
        int                     mc_authz_target;
 #define META_BOUND_NONE                (-1)
 #define META_BOUND_ALL         (-2)
+
+       struct metainfo_t       *mc_info;
+
+       LDAP_TAILQ_ENTRY(metaconn_t)    mc_q;
+
        /* supersedes the connection stuff */
        metasingleconn_t        mc_conns[ 1 ];
        /* NOTE: mc_conns must be last, because
@@ -309,7 +348,14 @@ typedef struct metainfo_t {
 
        metadncache_t           mi_cache;
        
+       /* cached connections; 
+        * special conns are in tailq rather than in tree */
        ldap_avl_info_t         mi_conninfo;
+       struct {
+               int                                             mic_num;
+               LDAP_TAILQ_HEAD(mc_conn_priv_q, metaconn_t)     mic_priv;
+       }                       mi_conn_priv[ LDAP_BACK_PCONN_LAST ];
+       int                     mi_conn_priv_max;
 
        /* NOTE: quarantine uses the connection mutex */
        slap_retry_info_t       mi_quarantine;
@@ -321,13 +367,18 @@ typedef struct metainfo_t {
        unsigned                mi_flags;
 #define        li_flags                mi_flags
 /* uses flags as defined in <back-ldap/back-ldap.h> */
-#define        META_BACK_F_ONERR_STOP          (0x00010000U)
-#define        META_BACK_F_DEFER_ROOTDN_BIND   (0x00020000U)
+#define        META_BACK_F_ONERR_STOP          (0x00100000U)
+#define        META_BACK_F_ONERR_REPORT        (0x00200000U)
+#define        META_BACK_F_ONERR_MASK          (META_BACK_F_ONERR_STOP|META_BACK_F_ONERR_REPORT)
+#define        META_BACK_F_DEFER_ROOTDN_BIND   (0x00400000U)
+#define        META_BACK_F_PROXYAUTHZ_ALWAYS   (0x00800000U)
 
 #define        META_BACK_ONERR_STOP(mi)        ( (mi)->mi_flags & META_BACK_F_ONERR_STOP )
-#define        META_BACK_ONERR_CONTINUE(mi)    ( !META_BACK_ONERR_CONTINUE( (mi) ) )
+#define        META_BACK_ONERR_REPORT(mi)      ( (mi)->mi_flags & META_BACK_F_ONERR_REPORT )
+#define        META_BACK_ONERR_CONTINUE(mi)    ( !( (mi)->mi_flags & META_BACK_F_ONERR_MASK ) )
 
 #define META_BACK_DEFER_ROOTDN_BIND(mi)        ( (mi)->mi_flags & META_BACK_F_DEFER_ROOTDN_BIND )
+#define META_BACK_PROXYAUTHZ_ALWAYS(mi)        ( (mi)->mi_flags & META_BACK_F_PROXYAUTHZ_ALWAYS )
 
        int                     mi_version;
        time_t                  mi_network_timeout;
@@ -372,6 +423,13 @@ extern void
 meta_back_conn_free(
        void                    *v_mc );
 
+#if META_BACK_PRINT_CONNTREE > 0
+extern void
+meta_back_print_conntree(
+       metainfo_t              *mi,
+       char                    *msg );
+#endif
+
 extern int
 meta_back_init_one_conn(
        Operation               *op,
@@ -379,7 +437,8 @@ meta_back_init_one_conn(
        metaconn_t              *mc,
        int                     candidate,
        int                     ispriv,
-       ldap_back_send_t        sendok );
+       ldap_back_send_t        sendok,
+       int                     dolock );
 
 extern void
 meta_back_quarantine(
@@ -475,12 +534,9 @@ meta_clear_unused_candidates(
 
 extern int
 meta_clear_one_candidate(
-       metasingleconn_t        *mc );
-
-extern int
-meta_clear_candidates(
        Operation               *op,
-       metaconn_t              *mc );
+       metaconn_t              *mc,
+       int                     candidate );
 
 /*
  * Dn cache stuff (experimental)