]> git.sur5r.net Git - openldap/commitdiff
Add dn_rdn() function to return rdn part of dn.
authorKurt Zeilenga <kurt@openldap.org>
Thu, 28 Jan 1999 21:40:04 +0000 (21:40 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 28 Jan 1999 21:40:04 +0000 (21:40 +0000)
servers/slapd/dn.c
servers/slapd/proto-slap.h

index 54e53bfc35e12bd865b07791d5b0594221c27486..cac66133e160a7b75b48ab5af487796690d9c19f 100644 (file)
@@ -220,6 +220,77 @@ dn_parent(
        return( ch_strdup( "" ) );
 }
 
+char * dn_rdn( 
+    Backend    *be,
+    char       *dn )
+{
+       char    *s;
+       int     inquote, gotesc;
+
+       if( dn == NULL ) {
+               return NULL;
+       }
+
+       while(*dn && SPACE(*dn)) {
+               dn++;
+       }
+
+       if( *dn == '\0' ) {
+               return( NULL );
+       }
+
+       if ( be_issuffix( be, dn ) ) {
+               return( NULL );
+       }
+
+       dn = ch_strdup( dn );
+
+       /*
+        * no =, assume it is a dns name, like blah@some.domain.name
+        * if the blah@ part is there, return some.domain.name.  if
+        * it's just some.domain.name, return domain.name.
+        */
+       if ( strchr( dn, '=' ) == NULL ) {
+               if ( (s = strchr( dn, '@' )) == NULL ) {
+                       if ( (s = strchr( dn, '.' )) == NULL ) {
+                               return( dn );
+                       }
+               }
+               *s = '\0';
+               return( dn );
+       }
+
+       /*
+        * else assume it is an X.500-style name, which looks like
+        * foo=bar,sha=baz,...
+        */
+
+       inquote = 0;
+
+       for ( s = dn; *s; s++ ) {
+               if ( *s == '\\' ) {
+                       if ( *(s + 1) ) {
+                               s++;
+                       }
+                       continue;
+               }
+               if ( inquote ) {
+                       if ( *s == '"' ) {
+                               inquote = 0;
+                       }
+               } else {
+                       if ( *s == '"' ) {
+                               inquote = 1;
+                       } else if ( DNSEPARATOR( *s ) ) {
+                               *s = '\0';
+                               return( dn );
+                       }
+               }
+       }
+
+       return( dn );
+}
+
 /*
  * dn_issuffix - tells whether suffix is a suffix of dn.  both dn
  * and suffix must be normalized.
index 9484978778740f27dd05d9ece7277974e797e948..d72259fc9e1d8d82cf4cc8e3a4ecdeb8a393c328 100644 (file)
@@ -105,6 +105,7 @@ void connection_activity LDAP_P(( Connection *conn ));
 char * dn_normalize LDAP_P(( char *dn ));
 char * dn_normalize_case LDAP_P(( char *dn ));
 char * dn_parent LDAP_P(( Backend *be, char *dn ));
+char * dn_rdn LDAP_P(( Backend *be, char *dn ));
 int dn_issuffix LDAP_P(( char *dn, char *suffix ));
 int dn_type LDAP_P(( char *dn ));
 char * dn_upcase LDAP_P(( char *dn ));