]> git.sur5r.net Git - openldap/commitdiff
Fix unparsers, schema loading works
authorHoward Chu <hyc@openldap.org>
Mon, 21 Mar 2005 10:23:01 +0000 (10:23 +0000)
committerHoward Chu <hyc@openldap.org>
Mon, 21 Mar 2005 10:23:01 +0000 (10:23 +0000)
servers/slapd/at.c
servers/slapd/back-ldif/ldif.c
servers/slapd/bconfig.c
servers/slapd/cr.c
servers/slapd/oc.c
servers/slapd/oidm.c
servers/slapd/schema_init.c

index 4ff083f0759c643530b21bd9b185da9cb2906765..e4030aec05cc6a7f1e85d0b46c32ad75a570847b 100644 (file)
@@ -633,9 +633,10 @@ at_unparse( BerVarray *res, AttributeType *start, AttributeType *end, int sys )
 
        /* count the result size */
        i = 0;
-       for ( at=start; at && at!=end; at=LDAP_STAILQ_NEXT(at, sat_next)) {
+       for ( at=start; at; at=LDAP_STAILQ_NEXT(at, sat_next)) {
                if ( sys && !(at->sat_flags & SLAP_AT_HARDCODE)) continue;
                i++;
+               if ( at == end ) break;
        }
        if (!i) return;
 
@@ -648,7 +649,7 @@ at_unparse( BerVarray *res, AttributeType *start, AttributeType *end, int sys )
                ibuf[0] = '\0';
        }
        i = 0;
-       for ( at=start; at && at!=end; at=LDAP_STAILQ_NEXT(at, sat_next)) {
+       for ( at=start; at; at=LDAP_STAILQ_NEXT(at, sat_next)) {
                if ( sys && !(at->sat_flags & SLAP_AT_HARDCODE)) continue;
                if ( ldap_attributetype2bv( &at->sat_atype, &bv ) == NULL ) {
                        ber_bvarray_free( bva );
@@ -663,6 +664,7 @@ at_unparse( BerVarray *res, AttributeType *start, AttributeType *end, int sys )
                i++;
                bva[i].bv_val = NULL;
                ldap_memfree( bv.bv_val );
+               if ( at == end ) break;
        }
        *res = bva;
 }
index 8fed15d1d27f94a2afdd56d817729c2dab57c0d1..43a5de2a1e9b53a780a1b93b834b87dfef807d74 100644 (file)
@@ -103,36 +103,31 @@ dn2path(struct berval * dn, struct berval * rootdn, struct berval * base_path,
 }
 
 static char * slurp_file(int fd) {
-       int entry_buf_size = 40 * ENTRY_BUFF_INCREMENT;
        int read_chars_total = 0;
        int read_chars = 0;
-       int entry_size = 40 * ENTRY_BUFF_INCREMENT;
-       char * entry = (char *) malloc(sizeof(char) * 40 * ENTRY_BUFF_INCREMENT);
-       char * entry_pos = entry;
+       int entry_size;
+       char * entry;
+       char * entry_pos;
+       struct stat st;
+
+       fstat(fd, &st);
+       entry_size = st.st_size;
+       entry = ch_malloc( entry_size+1 );
+       entry_pos = entry;
        
        while(1) {
-               if(entry_size - read_chars_total == 0) {
-                       entry = (char *) realloc(entry, sizeof(char) * 2 * entry_size);
-                       entry_size = 2 * entry_size;
-               }
                read_chars = read(fd, (void *) entry_pos, entry_size - read_chars_total);
                if(read_chars == -1) {
                        SLAP_FREE(entry);
                        return NULL;
                }
-               entry_pos += read_chars;
                if(read_chars == 0) {
-                       if(entry_size - read_chars_total > 0)
-                               entry[read_chars_total] = '\0';
-                       else {
-                               entry = (char *) realloc(entry, sizeof(char) * entry_size + 1);
-                               entry_size = entry_size + 1;
-                               entry[read_chars_total] = '\0';
-                       }       
+                       entry[read_chars_total] = '\0';
                        break;
                }
                else {
                        read_chars_total += read_chars;
+                       entry_pos += read_chars;
                }
        }
        return entry;
index 58e6dd6b00807efdfae9a59a6e1330bc38790581..0faa3a50838d7eabf9549088ac256f5c0f16d933 100644 (file)
@@ -234,8 +234,8 @@ ConfigTable config_back_cf_table[] = {
        { "attribute",  "attribute", 2, 0, 9, ARG_PAREN|ARG_MAGIC|CFG_ATTR,
                &config_generic, "( OLcfgAt:4 NAME 'olcAttributeTypes' "
                        "DESC 'OpenLDAP attributeTypes' "
-                       "EQUALITY objectIdentifierFirstComponentMatch "
-                       "SYNTAX 1.3.6.1.4.1.1466.115.121.1.3 X-ORDERED 'VALUES' )",
+                       "EQUALITY caseIgnoreMatch "
+                       "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )",
                                NULL, NULL },
        { "attributeoptions", NULL, 0, 0, 0, ARG_MAGIC|CFG_ATOPT,
                &config_generic, "( OLcfgAt:5 NAME 'olcAttributeOptions' "
@@ -286,8 +286,8 @@ ConfigTable config_back_cf_table[] = {
        { "ditcontentrule",     NULL, 0, 0, 0, ARG_MAGIC|CFG_DIT,
                &config_generic, "( OLcfgAt:16 NAME 'olcDitContentRules' "
                        "DESC 'OpenLDAP DIT content rules' "
-                       "EQUALITY objectIdentifierFirstComponentMatch "
-                       "SYNTAX 1.3.6.1.4.1.1466.115.121.1.16 X-ORDERED 'VALUES' )",
+                       "EQUALITY caseIgnoreMatch "
+                       "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )",
                        NULL, NULL },
        { "gentlehup", "on|off", 2, 2, 0,
 #ifdef SIGHUP
@@ -353,8 +353,8 @@ ConfigTable config_back_cf_table[] = {
        { "objectclass", "objectclass", 2, 0, 0, ARG_PAREN|ARG_MAGIC|CFG_OC,
                &config_generic, "( OLcfgAt:32 NAME 'olcObjectClasses' "
                "DESC 'OpenLDAP object classes' "
-               "EQUALITY objectIdentifierFirstComponentMatch "
-               "SYNTAX 1.3.6.1.4.1.1466.115.121.1.37 X-ORDERED 'VALUES' )",
+               "EQUALITY caseIgnoreMatch "
+               "SYNTAX OMsDirectoryString X-ORDERED 'VALUES' )",
                        NULL, NULL },
        { "objectidentifier", NULL,     0, 0, 0, ARG_MAGIC|CFG_OID,
                &config_generic, "( OLcfgAt:33 NAME 'olcObjectIdentifier' "
@@ -580,23 +580,26 @@ static ConfigOCs cf_ocs[] = {
                "NAME 'olcConfig' "
                "DESC 'OpenLDAP configuration object' "
                "ABSTRACT SUP top "
-               "MAY ( cn $ olcConfigFile ) )", Cft_Abstract, NULL },
+               "MAY cn )", Cft_Abstract, NULL },
        { "( OLcfgOc:2 "
                "NAME 'olcGlobal' "
                "DESC 'OpenLDAP Global configuration options' "
                "SUP olcConfig STRUCTURAL "
-               "MAY ( olcConfigDir $ olcAllows $ olcArgsFile $ olcAttributeOptions $ "
-                "olcAuthIDRewrite $ olcAuthzPolicy $ olcAuthzRegexp $ "
-                "olcConcurrency $ olcConnMaxPending $ olcConnMaxPendingAuth $ "
-                "olcDefaultSearchBase $ olcDisallows $ olcGentleHUP $ "
-                "olcIdleTimeout $ olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ "
+               "MAY ( olcConfigFile $ olcConfigDir $ olcAllows $ olcArgsFile $ "
+                "olcAttributeOptions $ olcAttributeTypes $ olcAuthIDRewrite $ "
+                "olcAuthzPolicy $ olcAuthzRegexp $ olcConcurrency $ "
+                "olcConnMaxPending $ olcConnMaxPendingAuth $ olcDefaultSearchBase $ "
+                "olcDisallows $ olcDitContentRules $ olcGentleHUP $ olcIdleTimeout $ "
+                "olcIndexSubstrIfMaxLen $ olcIndexSubstrIfMinLen $ "
                 "olcIndexSubstrAnyLen $ olcIndexSubstrAnyStep $ olcLocalSSF $ "
-                "olcLogLevel $ olcModulePath $ olcObjectIdentifier $ "
+                "olcLogLevel $ olcModulePath $ olcObjectClasses $ "
+                "olcObjectIdentifier $ "
                 "olcPasswordCryptSaltFormat $ olcPasswordHash $ olcPidFile $ "
                 "olcPlugin $ olcPluginLogFile $ olcReadOnly $ olcReferral $ "
                 "olcReplicaPidFile $ olcReplicaArgsFile $ olcReplicationInterval $ "
                 "olcReplogFile $ olcRequires $ olcRestrict $ olcReverseLookup $ "
-                "olcRootDSE $ olcRootPW $ olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ "
+                "olcRootDSE $ olcRootPW $ "
+                "olcSaslHost $ olcSaslRealm $ olcSaslSecProps $ "
                 "olcSchemaCheck $ olcSchemaDN $ olcSecurity $ olcSizeLimit $ "
                 "olcSockbufMaxIncoming $ olcSockbufMaxIncomingAuth $ olcSrvtab $ "
                 "olcThreads $ olcTimeLimit $ olcTLSCACertificateFile $ "
@@ -633,7 +636,7 @@ static ConfigOCs cf_ocs[] = {
                "NAME 'olcIncludeFile' "
                "DESC 'OpenLDAP configuration include file' "
                "SUP olcConfig STRUCTURAL "
-               "MAY ( olcInclude $ olcRootDSE ) )",
+               "MAY ( olcInclude $ olcConfigFile $ olcRootDSE ) )",
                Cft_Include, &cfOc_include },
 #ifdef SLAPD_MODULES
        { "( OLcfgOc:8 "
@@ -2873,6 +2876,7 @@ sort_vals( Attribute *a )
                /* Strip index from normalized values */
                if ( !a->a_nvals || a->a_vals == a->a_nvals ) {
                        a->a_nvals = ch_malloc( (vals+1)*sizeof(struct berval));
+                       BER_BVZERO(a->a_nvals+vals);
                        for ( i=0; i<vals; i++ ) {
                                ptr = strchr(a->a_vals[i].bv_val, '}') + 1;
                                a->a_nvals[i].bv_len = a->a_vals[i].bv_len -
@@ -3369,6 +3373,61 @@ config_build_entry( ConfigArgs *c, Entry *e, ObjectClass *oc,
        return 0;
 }
 
+static void
+config_build_schema_inc( ConfigArgs *c, CfEntryInfo *ceparent,
+       Operation *op, SlapReply *rs )
+{
+       Entry *e;
+       ConfigFile *cf = c->private;
+       CfEntryInfo *ce, *ceprev;
+       char *ptr;
+       struct berval bv;
+
+       if ( ceparent->ce_kids ) {
+               for ( ceprev = ceparent->ce_kids; ceprev->ce_sibs;
+                       ceprev = ceprev->ce_sibs );
+       }
+
+       for (; cf; cf=cf->c_sibs, c->depth++) {
+               c->value_dn.bv_val = c->log;
+               bv.bv_val = strrchr(cf->c_file.bv_val, LDAP_DIRSEP[0]);
+               if ( !bv.bv_val ) {
+                       bv = cf->c_file;
+               } else {
+                       bv.bv_val++;
+                       bv.bv_len = cf->c_file.bv_len - (bv.bv_val - cf->c_file.bv_val);
+               }
+               ptr = strchr( bv.bv_val, '.' );
+               if ( ptr )
+                       bv.bv_len = ptr - bv.bv_val;
+               c->value_dn.bv_len = sprintf(c->value_dn.bv_val, "cn={%02d}", c->depth);
+               strncpy( c->value_dn.bv_val + c->value_dn.bv_len, bv.bv_val,
+                       bv.bv_len );
+               c->value_dn.bv_len += bv.bv_len;
+               c->value_dn.bv_val[c->value_dn.bv_len] ='\0';
+
+               e = config_alloc_entry( ceparent, &c->value_dn );
+               c->private = cf;
+               config_build_entry( c, e, cfOc_schema, &c->value_dn,
+                       c->bi->bi_cf_table, NO_TABLE );
+               ce = e->e_private;
+               ce->ce_type = Cft_Schema;
+               op->ora_e = e;
+               op->o_bd->be_add( op, rs );
+               ce->ce_bi = c->bi;
+               if ( !ceparent->ce_kids ) {
+                       ceparent->ce_kids = ce;
+               } else {
+                       ceprev->ce_sibs = ce;
+               }
+               ceprev = ce;
+               if ( cf->c_kids ) {
+                       c->private = cf->c_kids;
+                       config_build_schema_inc( c, ceparent, op, rs );
+               }
+       }
+}
+
 static CfEntryInfo *
 config_build_includes( ConfigArgs *c, CfEntryInfo *ceparent,
        Operation *op, SlapReply *rs )
@@ -3519,8 +3578,11 @@ config_back_db_open( BackendDB *be )
        }
        ceprev = ce;
 
-       /* Create includeFile nodes... */
+       /* Create includeFile nodes and schema nodes for included schema... */
        if ( cfb->cb_config->c_kids ) {
+               c.depth = 0;
+               c.private = cfb->cb_config->c_kids;
+               config_build_schema_inc( &c, ce, op, &rs );
                c.private = cfb->cb_config->c_kids;
                ceprev = config_build_includes( &c, ceparent, op, &rs );
        }
index eb9178d7e7f90b55c0be1c0c35110385042b3ce0..948f4ec0cda34e88a00aeca5d01188cf5d725f5d 100644 (file)
@@ -417,9 +417,10 @@ cr_unparse( BerVarray *res, ContentRule *start, ContentRule *end, int sys )
 
        /* count the result size */
        i = 0;
-       for ( cr=start; cr && cr!=end; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
+       for ( cr=start; cr; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
                if ( sys && !(cr->scr_flags & SLAP_CR_HARDCODE)) continue;
                i++;
+               if ( cr == end ) break;
        }
        if (!i) return;
 
@@ -432,7 +433,7 @@ cr_unparse( BerVarray *res, ContentRule *start, ContentRule *end, int sys )
                ibuf[0] = '\0';
        }
        i = 0;
-       for ( cr=start; cr && cr!=end; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
+       for ( cr=start; cr; cr=LDAP_STAILQ_NEXT(cr, scr_next)) {
                if ( sys && !(cr->scr_flags & SLAP_CR_HARDCODE)) continue;
                if ( ldap_contentrule2bv( &cr->scr_crule, &bv ) == NULL ) {
                        ber_bvarray_free( bva );
@@ -447,6 +448,7 @@ cr_unparse( BerVarray *res, ContentRule *start, ContentRule *end, int sys )
                i++;
                bva[i].bv_val = NULL;
                ldap_memfree( bv.bv_val );
+               if ( cr == end ) break;
        }
        *res = bva;
 }
index b923725a9d4f2aa27f1f9c40ab892bdb76a5fcc3..2b5b5f06f7f661d5494d9b921236427e55e26ef7 100644 (file)
@@ -543,9 +543,10 @@ oc_unparse( BerVarray *res, ObjectClass *start, ObjectClass *end, int sys )
 
        /* count the result size */
        i = 0;
-       for ( oc=start; oc && oc!=end; oc=LDAP_STAILQ_NEXT(oc, soc_next)) {
+       for ( oc=start; oc; oc=LDAP_STAILQ_NEXT(oc, soc_next)) {
                if ( sys && !(oc->soc_flags & SLAP_OC_HARDCODE)) continue;
                i++;
+               if ( oc == end ) break;
        }
        if (!i) return;
 
@@ -558,7 +559,7 @@ oc_unparse( BerVarray *res, ObjectClass *start, ObjectClass *end, int sys )
                ibuf[0] = '\0';
        }
        i = 0;
-       for ( oc=start; oc && oc!=end; oc=LDAP_STAILQ_NEXT(oc, soc_next)) {
+       for ( oc=start; oc; oc=LDAP_STAILQ_NEXT(oc, soc_next)) {
                if ( sys && !(oc->soc_flags & SLAP_OC_HARDCODE)) continue;
                if ( ldap_objectclass2bv( &oc->soc_oclass, &bv ) == NULL ) {
                        ber_bvarray_free( bva );
@@ -573,6 +574,7 @@ oc_unparse( BerVarray *res, ObjectClass *start, ObjectClass *end, int sys )
                i++;
                bva[i].bv_val = NULL;
                ldap_memfree( bv.bv_val );
+               if ( oc == end ) break;
        }
        *res = bva;
 }
index 99df108cdaaf0585db00cb1999dd48cffa714325..0e0f6210a34363626f69820fa36f2479ec786c9d 100644 (file)
@@ -164,10 +164,11 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys )
 
        /* count the result size */
        i = 0;
-       for ( om=start; om && om!=end; om=LDAP_STAILQ_NEXT(om, som_next)) {
+       for ( om=start; om; om=LDAP_STAILQ_NEXT(om, som_next)) {
                if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) continue;
                for ( j=0; !BER_BVISNULL(&om->som_names[j]); j++ );
                i += j;
+               if ( om == end ) break;
        }
        num = i;
        if (!i) return;
@@ -179,7 +180,7 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys )
                idx.bv_len = 0;
                ibuf[0] = '\0';
        }
-       for ( i=0,om=start; om && om!=end; om=LDAP_STAILQ_NEXT(om, som_next)) {
+       for ( i=0,om=start; om; om=LDAP_STAILQ_NEXT(om, som_next)) {
                if ( sys && !(om->som_flags & SLAP_OM_HARDCODE)) continue;
                for ( j=0; !BER_BVISNULL(&om->som_names[j]); i++,j++ ) {
                        if ( !sys ) {
@@ -194,6 +195,7 @@ void oidm_unparse( BerVarray *res, OidMacro *start, OidMacro *end, int sys )
                        strcpy( ptr, om->som_subs[j].bv_val );
                }
                if ( i>=num ) break;
+               if ( om == end ) break;
        }
        *res = bva;
 }
index 5d373374397479658ec9cd727cac7c939bc66ae4..8396006f5980f2afedc458ea62d1d498f085600f 100644 (file)
@@ -1635,7 +1635,7 @@ numericoidValidate(
                        return LDAP_SUCCESS;
                }
 
-               if ( val.bv_val[0] == '0' ) {
+               if ( val.bv_val[0] == '0' && !OID_SEPARATOR( val.bv_val[1] )) {
                        break;
                }