Diff for /servers/slapd/back-ldap/chain.c between versions 1.35 and 1.36

version 1.35, 2005/11/19 14:00:50 version 1.36, 2005/11/19 16:48:33
Line 1 Line 1
 /* chain.c - chain LDAP operations */  /* chain.c - chain LDAP operations */
 /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.34 2005/11/16 13:17:19 ando Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/back-ldap/chain.c,v 1.35 2005/11/19 14:00:50 ando Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 2003-2005 The OpenLDAP Foundation.   * Copyright 2003-2005 The OpenLDAP Foundation.
Line 66  static BackendInfo *lback; Line 66  static BackendInfo *lback;
   
 typedef struct ldap_chain_t {  typedef struct ldap_chain_t {
         /*          /*
          * TODO: create a template ldapinfo_t that gets all common            * A "template" ldapinfo_t gets all common configuration items;
          * configuration items; then for each configured URI create           * then, for each configured URI, an entry is created in the tree;
          * an entry in this tree; all the specific configuration           * all the specific configuration items get in the current URI 
          * items get in the current URI structure.           * structure.
          *           *
          * Then, for each referral, extract the URI and lookup the           * Then, for each referral, extract the URI and lookup the
          * related structure.  If configured to do so, allow URIs           * related structure.  If configured to do so, allow URIs
Line 77  typedef struct ldap_chain_t { Line 77  typedef struct ldap_chain_t {
          * that chains anonymously; maybe it can also be added to            * that chains anonymously; maybe it can also be added to 
          * the tree?  Should be all configurable.           * the tree?  Should be all configurable.
          */           */
         /* tree of configured[/generated] "uri" info */  
         int                     lc_lai_count;  
         ldap_avl_info_t         lc_lai;  
   
         /* current configuration info */  
         ldapinfo_t              *lc_cfg_li;  
         /* "common" configuration info (all occurring before an "uri") */          /* "common" configuration info (all occurring before an "uri") */
         ldapinfo_t              *lc_common_li;          ldapinfo_t              *lc_common_li;
   
           /* current configuration info */
           ldapinfo_t              *lc_cfg_li;
   
           /* tree of configured[/generated?] "uri" info */
           ldap_avl_info_t         lc_lai;
   
         unsigned                lc_flags;          unsigned                lc_flags;
 #define LDAP_CHAIN_F_NONE               (0x00U)  #define LDAP_CHAIN_F_NONE               (0x00U)
 #define LDAP_CHAIN_F_CHAINING           (0x01U)  #define LDAP_CHAIN_F_CHAINING           (0x01U)
 #define LDAP_CHAIN_F_CACHE_INFO         (0x10U)  #define LDAP_CHAIN_F_CACHE_URI          (0x10U)
   
   #define LDAP_CHAIN_CHAINING( lc )       ( ( (lc)->lc_flags & LDAP_CHAIN_F_CHAINING ) == LDAP_CHAIN_F_CHAINING )
   #define LDAP_CHAIN_CACHE_URI( lc )      ( ( (lc)->lc_flags & LDAP_CHAIN_F_CACHE_URI ) == LDAP_CHAIN_F_CACHE_URI )
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
         LDAPControl             lc_chaining_ctrl;          LDAPControl             lc_chaining_ctrl;
Line 98  typedef struct ldap_chain_t { Line 102  typedef struct ldap_chain_t {
 } ldap_chain_t;  } ldap_chain_t;
   
 static int ldap_chain_db_init_one( BackendDB *be );  static int ldap_chain_db_init_one( BackendDB *be );
   #define ldap_chain_db_open_one(be)      (lback)->bi_db_open( (be) )
   #define ldap_chain_db_close_one(be)     (0)
   #define ldap_chain_db_destroy_one(be)   (lback)->bi_db_destroy( (be) )
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
 static int  static int
Line 112  chaining_control_add( Line 119  chaining_control_add(
         *oldctrlsp = op->o_ctrls;          *oldctrlsp = op->o_ctrls;
   
         /* default chaining control not defined */          /* default chaining control not defined */
         if ( !( lc->lc_flags & LDAP_CHAIN_F_CHAINING ) ) {          if ( !LDAP_CHAIN_CHAINING( lc ) ) {
                 return 0;                  return 0;
         }          }
   
Line 430  Document: draft-ietf-ldapbis-protocol-27 Line 437  Document: draft-ietf-ldapbis-protocol-27
                         lip = (ldapinfo_t *)op->o_bd->be_private;                          lip = (ldapinfo_t *)op->o_bd->be_private;
                         lip->li_uri = li.li_uri;                          lip->li_uri = li.li_uri;
                         lip->li_bvuri = bvuri;                          lip->li_bvuri = bvuri;
                         rc = lback->bi_db_open( op->o_bd );                          rc = ldap_chain_db_open_one( op->o_bd );
                         if ( rc != 0 ) {                          if ( rc != 0 ) {
                                 (void)lback->bi_db_destroy( op->o_bd );                                  (void)ldap_chain_db_destroy_one( op->o_bd );
                                 goto cleanup;                                  goto cleanup;
                         }                          }
                         temporary = 1;  
                           if ( LDAP_CHAIN_CACHE_URI( lc ) ) {
                                   ldap_pvt_thread_mutex_lock( &lc->lc_lai.lai_mutex );
                                   if ( avl_insert( &lc->lc_lai.lai_tree,
                                           (caddr_t)lip, ldap_chain_uri_cmp, ldap_chain_uri_dup ) )
                                   {
                                           /* someone just inserted another;
                                            * don't bother, use this and then
                                            * just free it */
                                           temporary = 1;
                                   }
                                   ldap_pvt_thread_mutex_unlock( &lc->lc_lai.lai_mutex );
   
                           } else {
                                   temporary = 1;
                           }
                 }                  }
   
                 rc = ( *op_f )( op, rs );                  rc = ( *op_f )( op, rs );
Line 447  cleanup:; Line 469  cleanup:;
                 if ( temporary ) {                  if ( temporary ) {
                         lip->li_uri = NULL;                          lip->li_uri = NULL;
                         lip->li_bvuri = NULL;                          lip->li_bvuri = NULL;
 #if 0   /* does not exist yet */                          (void)ldap_chain_db_close_one( op->o_bd );
                         (void)lback->bi_db_close( op->o_bd );                          (void)ldap_chain_db_destroy_one( op->o_bd );
 #endif  
                         (void)lback->bi_db_destroy( op->o_bd );  
                 }                  }
                                   
                 if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) {                  if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) {
Line 662  ldap_chain_response( Operation *op, Slap Line 682  ldap_chain_response( Operation *op, Slap
                                         lip = (ldapinfo_t *)op->o_bd->be_private;                                          lip = (ldapinfo_t *)op->o_bd->be_private;
                                         lip->li_uri = li.li_uri;                                          lip->li_uri = li.li_uri;
                                         lip->li_bvuri = bvuri;                                          lip->li_bvuri = bvuri;
                                         rc = lback->bi_db_open( op->o_bd );                                          rc = ldap_chain_db_open_one( op->o_bd );
                                         if ( rc != 0 ) {                                          if ( rc != 0 ) {
                                                 (void)lback->bi_db_destroy( op->o_bd );                                                  (void)ldap_chain_db_destroy_one( op->o_bd );
                                                 goto cleanup;                                                  goto cleanup;
                                         }                                          }
                                         temporary = 1;  
                                           if ( LDAP_CHAIN_CACHE_URI( lc ) ) {
                                                   ldap_pvt_thread_mutex_lock( &lc->lc_lai.lai_mutex );
                                                   if ( avl_insert( &lc->lc_lai.lai_tree,
                                                           (caddr_t)lip, ldap_chain_uri_cmp, ldap_chain_uri_dup ) )
                                                   {
                                                           /* someone just inserted another;
                                                            * don't bother, use this and then
                                                            * just free it */
                                                           temporary = 1;
                                                   }
                                                   ldap_pvt_thread_mutex_unlock( &lc->lc_lai.lai_mutex );
                   
                                           } else {
                                                   temporary = 1;
                                           }
                                 }                                  }
   
                                 /* FIXME: should we also copy filter and scope?                                  /* FIXME: should we also copy filter and scope?
Line 686  cleanup:; Line 721  cleanup:;
                                 if ( temporary ) {                                  if ( temporary ) {
                                         lip->li_uri = NULL;                                          lip->li_uri = NULL;
                                         lip->li_bvuri = NULL;                                          lip->li_bvuri = NULL;
 #if 0   /* does not exist yet */                                          (void)ldap_chain_db_close_one( op->o_bd );
                                         (void)lback->bi_db_close( op->o_bd );                                          (void)ldap_chain_db_destroy_one( op->o_bd );
 #endif  
                                         (void)lback->bi_db_destroy( op->o_bd );  
                                 }                                  }
                                   
                                 if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) {                                  if ( rc == LDAP_SUCCESS && rs->sr_err == LDAP_SUCCESS ) {
Line 825  str2chain( const char *s ) Line 858  str2chain( const char *s )
  */   */
   
 enum {  enum {
         PC_CHAINING = 1          PC_CHAINING = 1,
           PC_CACHE_URI = 2,
   
           PC_LAST
 };  };
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
Line 842  static ConfigTable chaincfg[] = { Line 878  static ConfigTable chaincfg[] = {
                         "DESC 'Chaining behavior control parameters (draft-sermersheim-ldap-chaining)' "                          "DESC 'Chaining behavior control parameters (draft-sermersheim-ldap-chaining)' "
                         "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },                          "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
           { "chain-cache-uris", "TRUE/FALSE",
                   2, 2, 0, ARG_MAGIC|ARG_ON_OFF|PC_CACHE_URI, chain_cf_gen,
                   "( OLcfgOvAt:3.2 NAME 'olcCacheURIs' "
                           "DESC 'Enables caching of URIs not present in configuration' "
                           "SYNTAX OMsBoolean SINGLE-VALUE )", NULL, NULL },
         { NULL, NULL, 0, 0, 0, ARG_IGNORED }          { NULL, NULL, 0, 0, 0, ARG_IGNORED }
 };  };
   
Line 851  static ConfigOCs chainocs[] = { Line 892  static ConfigOCs chainocs[] = {
                 "NAME 'olcChainConfig' "                  "NAME 'olcChainConfig' "
                 "DESC 'Chain configuration' "                  "DESC 'Chain configuration' "
                 "SUP olcOverlayConfig "                  "SUP olcOverlayConfig "
                 "MAY olcChainingBehavior )", Cft_Overlay, chaincfg, NULL, chain_cfadd },                  "MAY ( olcChainingBehavior "
                           "$ olcCacheURIs "
                           ") )",
                   Cft_Overlay, chaincfg, NULL, chain_cfadd },
 #endif  #endif
         { "( OLcfgOvOc:3.2 "          { "( OLcfgOvOc:3.2 "
                 "NAME 'olcChainDatabase' "                  "NAME 'olcChainDatabase' "
                 "DESC 'Chain remote server configuration' "                  "DESC 'Chain remote server configuration' "
                 "AUXILIARY )", Cft_Misc, chaincfg, chain_ldadd },                  "AUXILIARY )",
                   Cft_Misc, chaincfg, chain_ldadd },
         { NULL, 0, NULL }          { NULL, 0, NULL }
 };  };
   
Line 958  chain_cf_gen( ConfigArgs *c ) Line 1003  chain_cf_gen( ConfigArgs *c )
                         struct berval   resolve = BER_BVNULL,                          struct berval   resolve = BER_BVNULL,
                                         continuation = BER_BVNULL;                                          continuation = BER_BVNULL;
   
                         if ( !( lc->lc_flags & LDAP_CHAIN_F_CHAINING ) ) {                          if ( !LDAP_CHAIN_CHAINING( lc ) ) {
                                 return 1;                                  return 1;
                         }                          }
   
Line 985  chain_cf_gen( ConfigArgs *c ) Line 1030  chain_cf_gen( ConfigArgs *c )
                 }                  }
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
   
                   case PC_CACHE_URI:
                           c->value_int = LDAP_CHAIN_CACHE_URI( lc );
                           break;
   
                 default:                  default:
                         assert( 0 );                          assert( 0 );
                         rc = 1;                          rc = 1;
Line 992  chain_cf_gen( ConfigArgs *c ) Line 1041  chain_cf_gen( ConfigArgs *c )
                 return rc;                  return rc;
   
         } else if ( c->op == LDAP_MOD_DELETE ) {          } else if ( c->op == LDAP_MOD_DELETE ) {
                 return 1;       /* FIXME */  
 #if 0  
                 switch( c->type ) {                  switch( c->type ) {
                 case PC_ATTR:                  case PC_CHAINING:
                 case PC_TEMP:                          return 1;
   
                   case PC_CACHE_URI:
                           lc->lc_flags &= ~LDAP_CHAIN_F_CACHE_URI;
                           break;
   
                   default:
                           return 1;
                 }                  }
                 return rc;                  return rc;
 #endif  
         }          }
   
         switch( c->type ) {          switch( c->type ) {
Line 1119  chain_cf_gen( ConfigArgs *c ) Line 1172  chain_cf_gen( ConfigArgs *c )
         }          }
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */
   
           case PC_CACHE_URI:
                   if ( c->value_int ) {
                           lc->lc_flags |= LDAP_CHAIN_F_CACHE_URI;
                   } else {
                           lc->lc_flags &= ~LDAP_CHAIN_F_CACHE_URI;
                   }
                   break;
   
         default:          default:
                 assert( 0 );                  assert( 0 );
                 return 1;                  return 1;
Line 1211  private_destroy:; Line 1272  private_destroy:;
   
                                 db.bd_info = lback;                                  db.bd_info = lback;
                                 db.be_private = (void *)lc->lc_cfg_li;                                  db.be_private = (void *)lc->lc_cfg_li;
                                 lback->bi_db_destroy( &db );                                  ldap_chain_db_destroy_one( &db );
                                 lc->lc_cfg_li = NULL;                                  lc->lc_cfg_li = NULL;
   
                         } else {                          } else {
Line 1560  chain_init( void ) Line 1621  chain_init( void )
 {  {
         int     rc;          int     rc;
   
           assert( PC_LAST <= ARGS_USERLAND );
   
 #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR  #ifdef LDAP_CONTROL_X_CHAINING_BEHAVIOR
         rc = register_supported_control( LDAP_CONTROL_X_CHAINING_BEHAVIOR,          rc = register_supported_control( LDAP_CONTROL_X_CHAINING_BEHAVIOR,
                         /* SLAP_CTRL_GLOBAL| */ SLAP_CTRL_ACCESS|SLAP_CTRL_HIDE, NULL,                          /* SLAP_CTRL_GLOBAL| */ SLAP_CTRL_ACCESS|SLAP_CTRL_HIDE, NULL,
                         ldap_chain_parse_ctrl, &sc_chainingBehavior );                          ldap_chain_parse_ctrl, &sc_chainingBehavior );
         if ( rc != LDAP_SUCCESS ) {          if ( rc != LDAP_SUCCESS ) {
                 fprintf( stderr, "Failed to register chaining behavior control: %d\n", rc );                  Debug( LDAP_DEBUG_ANY, "slapd-chain: "
                           "unable to register chaining behavior control: %d\n",
                           rc, 0, 0 );
                 return rc;                  return rc;
         }          }
 #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */  #endif /* LDAP_CONTROL_X_CHAINING_BEHAVIOR */

Removed from v.1.35  
changed lines
  Added in v.1.36


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