]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/getvalues.c
Use struct berval * instead of ** for newpasswd
[openldap] / libraries / libldap / getvalues.c
index c3131ade09a3fd3364e472805c6cfd7d7ce5df77..82e36299baa20f6932f86e1bb42eb6033264f0bd 100644 (file)
@@ -1,4 +1,9 @@
+/* $OpenLDAP$ */
 /*
+ * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+/*  Portions
  *  Copyright (c) 1990 Regents of the University of Michigan.
  *  All rights reserved.
  *
 
 #include "portable.h"
 
-#ifndef lint 
-static char copyright[] = "@(#) Copyright (c) 1990 Regents of the University of Michigan.\nAll rights reserved.\n";
-#endif
-
 #include <stdio.h>
-#include <stdlib.h>
+
+#include <ac/stdlib.h>
 
 #include <ac/ctype.h>
 #include <ac/socket.h>
 #include <ac/string.h>
 #include <ac/time.h>
 
-#include "lber.h"
-#include "ldap.h"
+#include "ldap-int.h"
 
 char **
-ldap_get_values( LDAP *ld, LDAPMessage *entry, char *target )
+ldap_get_values( LDAP *ld, LDAPMessage *entry, LDAP_CONST char *target )
 {
        BerElement      ber;
-       char            attr[LDAP_MAX_ATTR_LEN];
+       char            *attr;
        int             found = 0;
-       long            len;
        char            **vals;
 
+       assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
+       assert( entry != NULL );
+       assert( target != NULL );
+
+#ifdef NEW_LOGGING
+       LDAP_LOG ( OPERATION, ENTRY, "ldap_get_values\n", 0, 0, 0 );
+#else
        Debug( LDAP_DEBUG_TRACE, "ldap_get_values\n", 0, 0, 0 );
+#endif
 
        ber = *entry->lm_ber;
 
        /* skip sequence, dn, sequence of, and snag the first attr */
-       len = sizeof(attr);
-       if ( ber_scanf( &ber, "{x{{s", attr, &len ) == LBER_ERROR ) {
+       if ( ber_scanf( &ber, "{x{{a" /*}}}*/, &attr ) == LBER_ERROR ) {
                ld->ld_errno = LDAP_DECODING_ERROR;
                return( NULL );
        }
@@ -47,16 +55,22 @@ ldap_get_values( LDAP *ld, LDAPMessage *entry, char *target )
 
        /* break out on success, return out on error */
        while ( ! found ) {
-               len = sizeof(attr);
-               if ( ber_scanf( &ber, "x}{s", attr, &len ) == LBER_ERROR ) {
+               LDAP_FREE(attr);
+               attr = NULL;
+
+               if ( ber_scanf( &ber, /*{*/ "x}{a" /*}*/, &attr ) == LBER_ERROR ) {
                        ld->ld_errno = LDAP_DECODING_ERROR;
                        return( NULL );
                }
 
                if ( strcasecmp( target, attr ) == 0 )
                        break;
+
        }
 
+       LDAP_FREE(attr);
+       attr = NULL;
+
        /* 
         * if we get this far, we've found the attribute and are sitting
         * just before the set of values.
@@ -71,21 +85,28 @@ ldap_get_values( LDAP *ld, LDAPMessage *entry, char *target )
 }
 
 struct berval **
-ldap_get_values_len( LDAP *ld, LDAPMessage *entry, char *target )
+ldap_get_values_len( LDAP *ld, LDAPMessage *entry, LDAP_CONST char *target )
 {
        BerElement      ber;
-       char            attr[LDAP_MAX_ATTR_LEN];
+       char            *attr;
        int             found = 0;
-       long            len;
        struct berval   **vals;
 
+       assert( ld != NULL );
+       assert( LDAP_VALID( ld ) );
+       assert( entry != NULL );
+       assert( target != NULL );
+
+#ifdef NEW_LOGGING
+       LDAP_LOG ( OPERATION, ENTRY, "ldap_get_values_len\n", 0, 0, 0 );
+#else
        Debug( LDAP_DEBUG_TRACE, "ldap_get_values_len\n", 0, 0, 0 );
+#endif
 
        ber = *entry->lm_ber;
 
        /* skip sequence, dn, sequence of, and snag the first attr */
-       len = sizeof(attr);
-       if ( ber_scanf( &ber, "{x{{s", attr, &len ) == LBER_ERROR ) {
+       if ( ber_scanf( &ber, "{x{{a" /* }}} */, &attr ) == LBER_ERROR ) {
                ld->ld_errno = LDAP_DECODING_ERROR;
                return( NULL );
        }
@@ -95,8 +116,10 @@ ldap_get_values_len( LDAP *ld, LDAPMessage *entry, char *target )
 
        /* break out on success, return out on error */
        while ( ! found ) {
-               len = sizeof(attr);
-               if ( ber_scanf( &ber, "x}{s", attr, &len ) == LBER_ERROR ) {
+               LDAP_FREE( attr );
+               attr = NULL;
+
+               if ( ber_scanf( &ber, /*{*/ "x}{a" /*}*/, &attr ) == LBER_ERROR ) {
                        ld->ld_errno = LDAP_DECODING_ERROR;
                        return( NULL );
                }
@@ -105,6 +128,9 @@ ldap_get_values_len( LDAP *ld, LDAPMessage *entry, char *target )
                        break;
        }
 
+       LDAP_FREE( attr );
+       attr = NULL;
+
        /* 
         * if we get this far, we've found the attribute and are sitting
         * just before the set of values.
@@ -141,25 +167,47 @@ ldap_count_values_len( struct berval **vals )
 void
 ldap_value_free( char **vals )
 {
-       int     i;
-
-       if ( vals == NULL )
-               return;
-       for ( i = 0; vals[i] != NULL; i++ )
-               free( vals[i] );
-       free( (char *) vals );
+       LDAP_VFREE( vals );
 }
 
 void
 ldap_value_free_len( struct berval **vals )
 {
-       int     i;
+       ber_bvecfree( vals );
+}
 
-       if ( vals == NULL )
-               return;
-       for ( i = 0; vals[i] != NULL; i++ ) {
-               free( vals[i]->bv_val );
-               free( vals[i] );
+char **
+ldap_value_dup( char *const *vals )
+{
+       char **new;
+       int i;
+
+       if( vals == NULL ) {
+               return NULL;
+       }
+
+       for( i=0; vals[i]; i++ ) {
+               ;   /* Count the number of values */
        }
-       free( (char *) vals );
+
+       if( i == 0 ) {
+               return NULL;
+       }
+
+       new = LDAP_MALLOC( (i+1)*sizeof(char *) );  /* Alloc array of pointers */
+       if( new == NULL ) {
+               return NULL;
+       }
+
+       for( i=0; vals[i]; i++ ) {
+               new[i] = LDAP_STRDUP( vals[i] );   /* Dup each value */
+               if( new[i] == NULL ) {
+                       LDAP_VFREE( new );
+                       return NULL;
+               }
+       }
+       new[i] = NULL;
+
+       return new;
 }
+