]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/attr.c
Add ldap_*2name() in <include,libldap>/schema, use them in slapd/schema
[openldap] / servers / slapd / attr.c
index 3fcca89c7ed2534f5ee8ca44ea759da73253339c..74e5c241c5d5efb2e8e66b300375bac690eb5556 100644 (file)
@@ -1,3 +1,7 @@
+/*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
 /* attr.c - routines for dealing with attributes */
 
 #include "portable.h"
@@ -33,6 +37,69 @@ attr_free( Attribute *a )
        free( a );
 }
 
+void
+attrs_free( Attribute *a )
+{
+       Attribute *next;
+
+       for( ; a != NULL ; a = next ) {
+               next = a->a_next;
+               attr_free( a );
+       }
+}
+
+Attribute *attr_dup( Attribute *a )
+{
+       Attribute *tmp;
+
+       if( a == NULL) return NULL;
+
+       tmp = ch_malloc( sizeof(Attribute) );
+
+       if( a->a_vals != NULL ) {
+               int i;
+
+               for( i=0; a->a_vals[i] != NULL; i++ ) {
+                       /* EMPTY */ ;
+               }
+
+               tmp->a_vals = ch_malloc((i+1) * sizeof(struct berval*));
+
+               for( i=0; a->a_vals[i] != NULL; i++ ) {
+                       tmp->a_vals[i] = ber_bvdup( a->a_vals[i] );
+               }
+
+               tmp->a_vals[i] = NULL;
+
+       } else {
+               tmp->a_vals = NULL;
+       }
+
+       tmp->a_type = ch_strdup( a->a_type );
+       tmp->a_syntax = a->a_syntax;
+       tmp->a_next = NULL;
+
+       return tmp;
+}
+
+Attribute *attrs_dup( Attribute *a )
+{
+       Attribute *tmp, **next;
+
+       if( a == NULL ) return NULL;
+
+       tmp = NULL;
+       next = &tmp;
+
+       for( ; a != NULL ; a = a->a_next ) {
+               *next = attr_dup( a );
+               next = &((*next)->a_next);
+       }
+       *next = NULL;
+
+       return tmp;
+}
+
 /*
  * attr_normalize - normalize an attribute name (make it all lowercase)
  */
@@ -40,15 +107,9 @@ attr_free( Attribute *a )
 char *
 attr_normalize( char *s )
 {
-       char    *save;
-
        assert( s != NULL );
 
-       for ( save = s; *s; s++ ) {
-               *s = TOLOWER( (unsigned char) *s );
-       }
-
-       return( save );
+       return( str2lower( s ) );
 }
 
 /*
@@ -227,18 +288,22 @@ attr_syntax_config(
            strcasecmp( argv[lasti], "cis" ) == 0 ) {
                at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.15";
                at->at_equality_oid = "2.5.13.2";
+               at->at_ordering_oid = "2.5.13.3";
+               at->at_substr_oid = "2.5.13.4";
        } else if ( strcasecmp( argv[lasti], "telephone" ) == 0 ||
            strcasecmp( argv[lasti], "tel" ) == 0 ) {
                at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.50";
                at->at_equality_oid = "2.5.13.20";
+               at->at_substr_oid = "2.5.13.21";
        } else if ( strcasecmp( argv[lasti], "dn" ) == 0 ) {
                at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.12";
                at->at_equality_oid = "2.5.13.1";
        } else if ( strcasecmp( argv[lasti], "caseexactstring" ) == 0 ||
            strcasecmp( argv[lasti], "ces" ) == 0 ) {
                at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.15";
-               /* notice: this is caseExactIA5Match */
-               at->at_equality_oid = "1.3.6.1.4.1.1466.109.114.1";
+               at->at_equality_oid = "2.5.13.5";
+               at->at_ordering_oid = "2.5.13.6";
+               at->at_substr_oid = "2.5.13.7";
        } else if ( strcasecmp( argv[lasti], "binary" ) == 0 ||
            strcasecmp( argv[lasti], "bin" ) == 0 ) {
                at->at_syntax_oid = "1.3.6.1.4.1.1466.115.121.1.5";
@@ -263,7 +328,7 @@ attr_syntax_config(
        if ( code ) {
                fprintf( stderr, "%s: line %d: %s %s\n",
                         fname, lineno, scherr2str(code), err);
-               exit( 1 );
+               exit( EXIT_FAILURE );
        }
        ldap_memfree(at);
 }
@@ -514,8 +579,7 @@ at_add(
                if ( !strcmp(at->at_syntax_oid,
                             "1.3.6.1.4.1.1466.115.121.1.15") ) {
                        if ( at->at_equality_oid &&
-                            !strcmp(at->at_equality_oid,
-                                    "1.3.6.1.4.1.1466.109.114.1") ) {
+                            !strcmp(at->at_equality_oid, "2.5.13.5") ) {
                                sat->sat_syntax_compat = SYNTAX_CES;
                        } else {
                                sat->sat_syntax_compat = SYNTAX_CIS;
@@ -568,6 +632,7 @@ at_add(
        if ( sat->sat_sup ) {
                if ( !sat->sat_syntax ) {
                        sat->sat_syntax = sat->sat_sup->sat_syntax;
+                       sat->sat_syntax_len = sat->sat_sup->sat_syntax_len;
                }
                if ( !sat->sat_equality ) {
                        sat->sat_equality = sat->sat_sup->sat_equality;