Diff for /servers/slapd/root_dse.c between versions 1.107 and 1.113.2.1

version 1.107, 2005/07/04 03:24:00 version 1.113.2.1, 2006/04/11 16:07:17
Line 1 Line 1
 /* root_dse.c - Provides the Root DSA-Specific Entry */  /* root_dse.c - Provides the Root DSA-Specific Entry */
 /* $OpenLDAP: pkg/ldap/servers/slapd/root_dse.c,v 1.106 2005/05/11 22:46:39 hyc Exp $ */  /* $OpenLDAP: pkg/ldap/servers/slapd/root_dse.c,v 1.114 2006/04/06 19:29:38 kurt Exp $ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.  /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *   *
  * Copyright 1999-2005 The OpenLDAP Foundation.   * Copyright 1999-2006 The OpenLDAP Foundation.
  * All rights reserved.   * All rights reserved.
  *   *
  * Redistribution and use in source and binary forms, with or without   * Redistribution and use in source and binary forms, with or without
Line 28 Line 28
 #include "slapi/slapi.h"  #include "slapi/slapi.h"
 #endif  #endif
   
 static struct berval supportedFeatures[] = {  static struct berval    builtin_supportedFeatures[] = {
         BER_BVC(LDAP_FEATURE_ALL_OP_ATTRS),                     /* All Op Attrs (+) */          BER_BVC(LDAP_FEATURE_MODIFY_INCREMENT),         /* Modify/increment */
           BER_BVC(LDAP_FEATURE_ALL_OP_ATTRS),             /* All Op Attrs (+) */
         BER_BVC(LDAP_FEATURE_OBJECTCLASS_ATTRS),        /* OCs in Attrs List (@class) */          BER_BVC(LDAP_FEATURE_OBJECTCLASS_ATTRS),        /* OCs in Attrs List (@class) */
         BER_BVC(LDAP_FEATURE_ABSOLUTE_FILTERS),         /* (&) and (|) search filters */          BER_BVC(LDAP_FEATURE_ABSOLUTE_FILTERS),         /* (&) and (|) search filters */
         BER_BVC(LDAP_FEATURE_LANGUAGE_TAG_OPTIONS), /* Language Tag Options */          BER_BVC(LDAP_FEATURE_LANGUAGE_TAG_OPTIONS),     /* Language Tag Options */
         BER_BVC(LDAP_FEATURE_LANGUAGE_RANGE_OPTIONS),/* Language Range Options */          BER_BVC(LDAP_FEATURE_LANGUAGE_RANGE_OPTIONS),   /* Language Range Options */
 #ifdef LDAP_FEATURE_SUBORDINATE_SCOPE  #ifdef LDAP_FEATURE_SUBORDINATE_SCOPE
         BER_BVC(LDAP_FEATURE_SUBORDINATE_SCOPE),        /* "children" search scope */          BER_BVC(LDAP_FEATURE_SUBORDINATE_SCOPE),        /* "children" search scope */
 #endif  #endif
 #ifdef LDAP_FEATURE_MODIFY_INCREMENT          BER_BVNULL
         BER_BVC(LDAP_FEATURE_MODIFY_INCREMENT),         /* Modify/increment */  
 #endif  
         {0,NULL}  
 };  };
   static struct berval    *supportedFeatures;
   
 static Entry    *usr_attr = NULL;  static Entry    *usr_attr = NULL;
   
   /*
    * allow modules to register functions that muck with the root DSE entry
    */
   
   typedef struct entry_info_t {
           SLAP_ENTRY_INFO_FN      func;
           void                    *arg;
           struct entry_info_t     *next;
   } entry_info_t;
   
   static entry_info_t *extra_info;
   
   int
   entry_info_register( SLAP_ENTRY_INFO_FN func, void *arg )
   {
           entry_info_t    *ei = ch_calloc( 1, sizeof( entry_info_t ) );
   
           ei->func = func;
           ei->arg = arg;
   
           ei->next = extra_info;
           extra_info = ei;
   
           return 0;
   }
   
   int
   entry_info_unregister( SLAP_ENTRY_INFO_FN func, void *arg )
   {
           entry_info_t    **eip;
   
           for ( eip = &extra_info; *eip != NULL; eip = &(*eip)->next ) {
                   if ( (*eip)->func == func && (*eip)->arg == arg ) {
                           entry_info_t    *ei = *eip;
   
                           *eip = ei->next;
   
                           ch_free( ei );
   
                           return 0;
                   }
           }
   
           return -1;
   }
   
   void
   entry_info_destroy( void )
   {
           entry_info_t    **eip;
   
           for ( eip = &extra_info; *eip != NULL;  ) {
                   entry_info_t    *ei = *eip;
   
                   eip = &(*eip)->next;
   
                   ch_free( ei );
           }
   }
   
   /*
    * Allow modules to register supported features
    */
   
   static int
   supported_feature_init( void )
   {
           int             i;
   
           if ( supportedFeatures != NULL ) {
                   return 0;
           }
   
           for ( i = 0; !BER_BVISNULL( &builtin_supportedFeatures[ i ] ); i++ )
                   ;
   
           supportedFeatures = ch_calloc( sizeof( struct berval ), i + 1 );
           if ( supportedFeatures == NULL ) {
                   return -1;
           }
   
           for ( i = 0; !BER_BVISNULL( &builtin_supportedFeatures[ i ] ); i++ ) {
                   ber_dupbv( &supportedFeatures[ i ], &builtin_supportedFeatures[ i ] );
           }
           BER_BVZERO( &supportedFeatures[ i ] );
   
           return 0;
   }
   
   int
   supported_feature_destroy( void )
   {
           int             i;
   
           if ( supportedFeatures == NULL ) {
                   return 0;
           }
           
           for ( i = 0; !BER_BVISNULL( &supportedFeatures[ i ] ); i++ ) {
                   ch_free( supportedFeatures[ i ].bv_val );
           }
   
           ch_free( supportedFeatures );
           supportedFeatures = NULL;
   
           return 0;
   }
   
   int
   supported_feature_load( struct berval *f )
   {
           struct berval   *tmp;
           int             i;
   
           supported_feature_init();
   
           for ( i = 0; !BER_BVISNULL( &supportedFeatures[ i ] ); i++ )
                   ;
   
           tmp = ch_realloc( supportedFeatures, sizeof( struct berval ) * ( i + 2 ) );
           if ( tmp == NULL ) {
                   return -1;
           }
           supportedFeatures = tmp;
   
           ber_dupbv( &supportedFeatures[ i ], f );
           BER_BVZERO( &supportedFeatures[ i + 1 ] );
   
           return 0;
   }
   
 int  int
 root_dse_info(  root_dse_info(
         Connection *conn,          Connection *conn,
Line 52  root_dse_info( Line 182  root_dse_info(
         const char **text )          const char **text )
 {  {
         Entry           *e;          Entry           *e;
         struct berval val, *bv;          struct berval val;
         struct berval nval;  #ifdef LDAP_SLAPI
           struct berval *bv;
   #endif
         int             i, j;          int             i, j;
         char ** supportedSASLMechanisms;          char ** supportedSASLMechanisms;
         BackendDB *be;          BackendDB *be;
Line 64  root_dse_info( Line 196  root_dse_info(
                 = slap_schema.si_ad_objectClass;                  = slap_schema.si_ad_objectClass;
         AttributeDescription *ad_namingContexts          AttributeDescription *ad_namingContexts
                 = slap_schema.si_ad_namingContexts;                  = slap_schema.si_ad_namingContexts;
   #ifdef LDAP_SLAPI
         AttributeDescription *ad_supportedExtension          AttributeDescription *ad_supportedExtension
                 = slap_schema.si_ad_supportedExtension;                  = slap_schema.si_ad_supportedExtension;
   #endif
         AttributeDescription *ad_supportedLDAPVersion          AttributeDescription *ad_supportedLDAPVersion
                 = slap_schema.si_ad_supportedLDAPVersion;                  = slap_schema.si_ad_supportedLDAPVersion;
         AttributeDescription *ad_supportedSASLMechanisms          AttributeDescription *ad_supportedSASLMechanisms
Line 80  root_dse_info( Line 214  root_dse_info(
                 = slap_schema.si_ad_ref;                  = slap_schema.si_ad_ref;
   
         e = (Entry *) SLAP_CALLOC( 1, sizeof(Entry) );          e = (Entry *) SLAP_CALLOC( 1, sizeof(Entry) );
   
         if( e == NULL ) {          if( e == NULL ) {
                 Debug( LDAP_DEBUG_ANY,                  Debug( LDAP_DEBUG_ANY,
                         "root_dse_info: SLAP_CALLOC failed", 0, 0, 0 );                          "root_dse_info: SLAP_CALLOC failed", 0, 0, 0 );
Line 99  root_dse_info( Line 232  root_dse_info(
   
         e->e_private = NULL;          e->e_private = NULL;
   
           /* FIXME: is this really needed? */
         BER_BVSTR( &val, "top" );          BER_BVSTR( &val, "top" );
         if( attr_merge_one( e, ad_objectClass, &val, NULL ) ) {          if( attr_merge_one( e, ad_objectClass, &val, NULL ) ) {
                 return LDAP_OTHER;                  return LDAP_OTHER;
Line 171  root_dse_info( Line 305  root_dse_info(
 #endif /* LDAP_SLAPI */  #endif /* LDAP_SLAPI */
   
         /* supportedFeatures */          /* supportedFeatures */
           if ( supportedFeatures == NULL ) {
                   supported_feature_init();
           }
   
         if( attr_merge( e, ad_supportedFeatures, supportedFeatures, NULL ) ) {          if( attr_merge( e, ad_supportedFeatures, supportedFeatures, NULL ) ) {
                 return LDAP_OTHER;                  return LDAP_OTHER;
         }          }
Line 222  root_dse_info( Line 360  root_dse_info(
                 }                  }
         }          }
   
           if ( extra_info ) {
                   entry_info_t    *ei = extra_info;
   
                   for ( ; ei; ei = ei->next ) {
                           ei->func( ei->arg, e );
                   }
           }
   
         *entry = e;          *entry = e;
         return LDAP_SUCCESS;          return LDAP_SUCCESS;
 }  }

Removed from v.1.107  
changed lines
  Added in v.1.113.2.1


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