]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/ad.c
Install *.schema only
[openldap] / servers / slapd / ad.c
index fee72fd68a5f6d02993c0419a27a0535d5020d75..0a6e04a3e73ea7e527fa05418133f7c346785b61 100644 (file)
@@ -1,6 +1,6 @@
 /* $OpenLDAP$ */
 /*
- * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved.
  * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
  */
 /* ad.c - routines for dealing with attribute descriptions */
@@ -32,8 +32,13 @@ AttributeDescription *ad_dup(
 
        *ad = *desc;
 
-       ad->ad_cname = ber_bvdup( ad->ad_cname );
-       ad->ad_lang = ch_strdup( ad->ad_lang );
+       if( ad->ad_cname != NULL ) {
+               ad->ad_cname = ber_bvdup( ad->ad_cname );
+       }
+
+       if( ad->ad_lang != NULL ) {
+               ad->ad_lang = ch_strdup( ad->ad_lang );
+       }
 
        return ad;
 }
@@ -43,7 +48,10 @@ ad_free( AttributeDescription *ad, int freeit )
 {
        if( ad == NULL ) return;
 
-       ber_bvfree( ad->ad_cname );
+       if( ad->ad_cname != NULL ) {
+               ber_bvfree( ad->ad_cname );
+       }
+
        free( ad->ad_lang );
 
        if( freeit ) free( ad );
@@ -69,7 +77,7 @@ static int ad_keystring(
 int slap_str2ad(
        const char *str,
        AttributeDescription **ad,
-       char **text )
+       const char **text )
 {
        struct berval bv;
        bv.bv_val = (char *) str;
@@ -81,25 +89,25 @@ int slap_str2ad(
 int slap_bv2ad(
        struct berval *bv,
        AttributeDescription **ad,
-       char **text )
+       const char **text )
 {
        int rtn = LDAP_UNDEFINED_TYPE;
        int i;
        AttributeDescription desc;
        char **tokens;
 
-       assert( *ad != NULL );
-       assert( *text != NULL );
+       assert( ad != NULL );
+       assert( *ad == NULL ); /* temporary */
 
        if( bv == NULL || bv->bv_len == 0 ) {
                *text = "empty attribute description";
-               return LDAP_UNDEFINED_TYPE;
+               return rtn;
        }
 
        /* make sure description is IA5 */
        if( ad_keystring( bv ) ) {
                *text = "attribute description contains inappropriate characters";
-               return LDAP_UNDEFINED_TYPE;
+               return rtn;
        }
 
        tokens = str2charray( bv->bv_val, ";");
@@ -121,14 +129,12 @@ int slap_bv2ad(
 
        for( i=1; tokens[i] != NULL; i++ ) {
                if( strcasecmp( tokens[i], "binary" ) == 0 ) {
-                       if( desc.ad_flags & SLAP_DESC_BINARY ) {
+                       if( slap_ad_is_binary( &desc ) ) {
                                *text = "option \"binary\" specified multiple times";
                                goto done;
                        }
 
-                       if(!( desc.ad_type->sat_syntax->ssyn_flags
-                               & SLAP_SYNTAX_BINARY ))
-                       {
+                       if( !slap_syntax_is_binary( desc.ad_type->sat_syntax )) {
                                /* not stored in binary, disallow option */
                                *text = "option \"binary\" with type not supported";
                                goto done;
@@ -157,18 +163,17 @@ int slap_bv2ad(
        desc.ad_cname = ch_malloc( sizeof( struct berval ) );
 
        desc.ad_cname->bv_len = strlen( desc.ad_type->sat_cname );
-       if( desc.ad_flags & SLAP_DESC_BINARY ) {
+       if( slap_ad_is_binary( &desc ) ) {
                desc.ad_cname->bv_len += sizeof("binary");
        }
        if( desc.ad_lang != NULL ) {
-               desc.ad_cname->bv_len += strlen( desc.ad_lang );
+               desc.ad_cname->bv_len += 1 + strlen( desc.ad_lang );
        }
 
-       desc.ad_cname = ch_malloc( desc.ad_cname->bv_len + 1 );
+       desc.ad_cname->bv_val = ch_malloc( desc.ad_cname->bv_len + 1 );
 
        strcpy( desc.ad_cname->bv_val, desc.ad_type->sat_cname );
-       strcat( desc.ad_cname->bv_val, ";binary" );
-       if( desc.ad_flags & SLAP_DESC_BINARY ) {
+       if( slap_ad_is_binary( &desc ) ) {
                strcat( desc.ad_cname->bv_val, ";binary" );
        }
 
@@ -220,7 +225,7 @@ int ad_inlist(
        int i;
        for( i=0; attrs[i] != NULL; i++ ) {
                AttributeDescription *ad = NULL;
-               char *text;
+               const char *text;
                int rc;
                
                rc = slap_str2ad( attrs[i], &ad, &text );