]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/sort.c
getbyname/getbyaddr should share mutex per ITS#563.
[openldap] / libraries / libldap / sort.c
index 300cccdf75f0e108394f7d6ccbec65e6043805ad..288ff854549fb4586e187b06eecd9947f3e4c378 100644 (file)
@@ -1,5 +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
  */
 /* Portions
@@ -19,7 +20,7 @@
 #include "portable.h"
 
 #include <stdio.h>
-#include <stdlib.h>
+#include <ac/stdlib.h>
 
 #include <ac/ctype.h>
 #include <ac/string.h>
@@ -39,8 +40,8 @@ static int    et_cmp LDAP_P(( const void *aa, const void *bb));
 
 int
 ldap_sort_strcasecmp(
-       const void      *a,
-       const void      *b
+       LDAP_CONST void *a,
+       LDAP_CONST void *b
 )
 {
        return( strcasecmp( *(char *const *)a, *(char *const *)b ) );
@@ -80,8 +81,8 @@ int
 ldap_sort_entries(
     LDAP       *ld,
     LDAPMessage        **chain,
-    char       *attr,          /* NULL => sort by DN */
-    int                (*cmp) (const char *, const char *)
+    LDAP_CONST char    *attr,          /* NULL => sort by DN */
+    int                (*cmp) (LDAP_CONST  char *, LDAP_CONST char *)
 )
 {
        int                     i, count;
@@ -91,7 +92,19 @@ ldap_sort_entries(
 
        count = ldap_count_entries( ld, *chain );
 
-       if ( (et = (struct entrything *) malloc( count *
+
+       if ( count < 0 ) {
+               if( ld != NULL ) {
+                       ld->ld_errno = LDAP_PARAM_ERROR;
+               }
+               return -1;
+
+       } else if ( count < 2 ) {
+               /* zero or one entries -- already sorted! */
+               return 0;
+       }
+
+       if ( (et = (struct entrything *) LDAP_MALLOC( count *
            sizeof(struct entrything) )) == NULL ) {
                ld->ld_errno = LDAP_NO_MEMORY;
                return( -1 );
@@ -106,7 +119,7 @@ ldap_sort_entries(
 
                        dn = ldap_get_dn( ld, e );
                        et[i].et_vals = ldap_explode_dn( dn, 1 );
-                       free( dn );
+                       LDAP_FREE( dn );
                } else {
                        et[i].et_vals = ldap_get_values( ld, e, attr );
                }
@@ -125,7 +138,7 @@ ldap_sort_entries(
                ldap_value_free( et[i].et_vals );
        }
        *ep = last;
-       free( (char *) et );
+       LDAP_FREE( (char *) et );
 
        return( 0 );
 }
@@ -134,7 +147,7 @@ int
 ldap_sort_values(
     LDAP       *ld,
     char       **vals,
-    int                (*cmp) (const void *, const void *)
+    int                (*cmp) (LDAP_CONST void *, LDAP_CONST void *)
 )
 {
        int     nel;