]> git.sur5r.net Git - openldap/blobdiff - libraries/libldap/cache.c
s/<stdlib.h>/<ac/stdlib.h>/
[openldap] / libraries / libldap / cache.c
index de09a7ae7884fa105e094c3e2ef89c62f3adf7bf..4a0984b18fcce6a792c17463eebbe55a87201ebd 100644 (file)
@@ -1,4 +1,8 @@
 /*
+ * Copyright 1998-1999 The OpenLDAP Foundation, All Rights Reserved.
+ * COPYING RESTRICTIONS APPLY, see COPYRIGHT file
+ */
+/*  Portions
  *  Copyright (c) 1993 The Regents of the University of Michigan.
  *  All rights reserved.
  *
@@ -7,13 +11,9 @@
 
 #include "portable.h"
 
-
-#ifndef lint 
-static char copyright[] = "@(#) Copyright (c) 1993 The Regents of the University of Michigan.\nAll rights reserved.\n";
-#endif
-
 #include <stdio.h>
-#include <stdlib.h>
+
+#include <ac/stdlib.h>
 
 #include <ac/socket.h>
 #include <ac/string.h>
@@ -26,10 +26,10 @@ static char copyright[] = "@(#) Copyright (c) 1993 The Regents of the University
 static int             cache_hash LDAP_P(( BerElement *ber ));
 static LDAPMessage     *msg_dup LDAP_P(( LDAPMessage *msg ));
 static int             request_cmp LDAP_P(( BerElement *req1, BerElement *req2 ));
-static int             chain_contains_dn LDAP_P(( LDAPMessage *msg, char *dn ));
+static int             chain_contains_dn LDAP_P(( LDAPMessage *msg, LDAP_CONST char *dn ));
 static long            msg_size LDAP_P(( LDAPMessage *msg ));
 static void            check_cache_memused LDAP_P(( LDAPCache *lc ));
-static void            uncache_entry_or_req LDAP_P(( LDAP *ld, char *dn, int msgid ));
+static void            uncache_entry_or_req LDAP_P(( LDAP *ld, LDAP_CONST char *dn, int msgid ));
 
 #endif
 
@@ -38,7 +38,7 @@ ldap_enable_cache( LDAP *ld, long timeout, long maxmem )
 {
 #ifndef LDAP_NOCACHE
        if ( ld->ld_cache == NULLLDCACHE ) {
-               if (( ld->ld_cache = (LDAPCache *)malloc( sizeof( LDAPCache )))
+               if (( ld->ld_cache = (LDAPCache *)LDAP_MALLOC( sizeof( LDAPCache )))
                    == NULLLDCACHE ) {
                        ld->ld_errno = LDAP_NO_MEMORY;
                        return( -1 );
@@ -87,7 +87,7 @@ ldap_destroy_cache( LDAP *ld )
 #ifndef LDAP_NOCACHE
        if ( ld->ld_cache != NULLLDCACHE ) {
                ldap_flush_cache( ld );
-               free( (char *)ld->ld_cache );
+               LDAP_FREE( (char *)ld->ld_cache );
                ld->ld_cache = NULLLDCACHE;
        }
 #endif
@@ -139,7 +139,7 @@ ldap_uncache_request( LDAP *ld, int msgid )
 
 
 void
-ldap_uncache_entry( LDAP *ld, char *dn )
+ldap_uncache_entry( LDAP *ld, LDAP_CONST char *dn )
 {
 #ifndef LDAP_NOCACHE
        Debug( LDAP_DEBUG_TRACE, "ldap_uncache_entry %s ld_cache %lx\n",
@@ -154,7 +154,7 @@ ldap_uncache_entry( LDAP *ld, char *dn )
 
 static void
 uncache_entry_or_req( LDAP *ld,
-       char *dn,               /* if non-NULL, uncache entry */
+       const char *dn,         /* if non-NULL, uncache entry */
        int msgid )             /* request to uncache (if dn == NULL) */
 {
        int             i;
@@ -225,17 +225,17 @@ ldap_add_request_to_cache( LDAP *ld, unsigned long msgtype, BerElement *request
                return;
        }
 
-       if (( new = (LDAPMessage *) calloc( 1, sizeof(LDAPMessage) ))
+       if (( new = (LDAPMessage *) LDAP_CALLOC( 1, sizeof(LDAPMessage) ))
            != NULL ) {
                if (( new->lm_ber = ldap_alloc_ber_with_options( ld )) == NULLBER ) {
-                       free( (char *)new );
+                       LDAP_FREE( (char *)new );
                        return;
                }
                len = request->ber_ptr - request->ber_buf;
-               if (( new->lm_ber->ber_buf = (char *) malloc( (size_t)len ))
+               if (( new->lm_ber->ber_buf = (char *) ber_memalloc( (size_t)len ))
                    == NULL ) {
                        ber_free( new->lm_ber, 0 );
-                       free( (char *)new );
+                       LDAP_FREE( (char *)new );
                        ld->ld_errno = LDAP_NO_MEMORY;
                        return;
                }
@@ -271,6 +271,7 @@ ldap_add_result_to_cache( LDAP *ld, LDAPMessage *result )
        }
 
        if ( result->lm_msgtype != LDAP_RES_SEARCH_ENTRY &&
+           result->lm_msgtype != LDAP_RES_SEARCH_REFERENCE &&
            result->lm_msgtype != LDAP_RES_SEARCH_RESULT &&
            result->lm_msgtype != LDAP_RES_COMPARE ) {
                /*
@@ -376,7 +377,7 @@ ldap_check_cache( LDAP *ld, unsigned long msgtype, BerElement *request )
        LDAPMessage     *m, *new, *prev, *next;
        BerElement      reqber;
        int             first, hash;
-       unsigned long   validtime;
+       time_t  c_time;
 
        Debug( LDAP_DEBUG_TRACE, "ldap_check_cache\n", 0, 0, 0 );
 
@@ -388,14 +389,14 @@ ldap_check_cache( LDAP *ld, unsigned long msgtype, BerElement *request )
        reqber.ber_buf = reqber.ber_ptr = request->ber_buf;
        reqber.ber_end = request->ber_ptr;
 
-       validtime = (long)time( NULL ) - ld->ld_cache->lc_timeout;
+       c_time = time( NULL );
 
        prev = NULLMSG;
        hash = cache_hash( &reqber );
        for ( m = ld->ld_cache->lc_buckets[ hash ]; m != NULLMSG; m = next ) {
                Debug( LDAP_DEBUG_TRACE,"cc: examining id %d,type %d\n",
                    m->lm_msgid, m->lm_msgtype, 0 );
-               if ( m->lm_time < validtime ) {
+               if ( difftime(c_time, m->lm_time) > ld->ld_cache->lc_timeout ) {
                        /* delete expired message */
                        next = m->lm_next;
                        if ( prev == NULL ) {
@@ -482,17 +483,17 @@ msg_dup( LDAPMessage *msg )
        LDAPMessage     *new;
        long            len;
 
-       if (( new = (LDAPMessage *)malloc( sizeof(LDAPMessage))) != NULL ) {
+       if (( new = (LDAPMessage *)LDAP_MALLOC( sizeof(LDAPMessage))) != NULL ) {
                *new = *msg;    /* struct copy */
                if (( new->lm_ber = ber_dup( msg->lm_ber )) == NULLBER ) {
-                       free( (char *)new );
+                       LDAP_FREE( (char *)new );
                        return( NULLMSG );
                }
                len = msg->lm_ber->ber_end - msg->lm_ber->ber_buf;
-               if (( new->lm_ber->ber_buf = (char *) malloc(
+               if (( new->lm_ber->ber_buf = (char *) ber_memalloc(
                    (size_t)len )) == NULL ) {
                        ber_free( new->lm_ber, 0 );
-                       free( (char *)new );
+                       LDAP_FREE( (char *)new );
                        return( NULLMSG );
                }
                SAFEMEMCPY( new->lm_ber->ber_buf, msg->lm_ber->ber_buf,
@@ -540,7 +541,7 @@ request_cmp( BerElement *req1, BerElement *req2 )
 
 
 static int
-chain_contains_dn( LDAPMessage *msg, char *dn )
+chain_contains_dn( LDAPMessage *msg, const char *dn )
 {
        LDAPMessage     *m;
        BerElement      ber;
@@ -555,7 +556,7 @@ chain_contains_dn( LDAPMessage *msg, char *dn )
        ber = *msg->lm_ber;     /* struct copy */
        if ( ber_scanf( &ber, "{i{a", &msgid, &s ) != LBER_ERROR ) {
            rc = ( strcasecmp( dn, s ) == 0 ) ? 1 : 0;
-           free( s );
+           LDAP_FREE( s );
            if ( rc != 0 ) {
                return( rc );
            }
@@ -576,7 +577,7 @@ chain_contains_dn( LDAPMessage *msg, char *dn )
                ber = *m->lm_ber;       /* struct copy */
                if ( ber_scanf( &ber, "{a", &s ) != LBER_ERROR ) {
                        rc = ( strcasecmp( dn, s ) == 0 ) ? 1 : 0;
-                       free( s );
+                       LDAP_FREE( s );
                }
        }
 
@@ -617,26 +618,27 @@ check_cache_memused( LDAPCache *lc )
  *    } while ( cache size is > SIZE_FACTOR * lc_maxmem )
  */
        int             i;
-       unsigned long   remove_threshold, validtime;
+       unsigned long   remove_threshold;
+       time_t c_time;
        LDAPMessage     *m, *prev, *next;
 
        Debug( LDAP_DEBUG_TRACE, "check_cache_memused: %ld bytes in use (%ld max)\n",
            lc->lc_memused, lc->lc_maxmem, 0 );
 
-       if ( lc->lc_maxmem <= sizeof( LDAPCache )
+       if ( (unsigned) lc->lc_maxmem <= sizeof( LDAPCache )
            || lc->lc_memused <= lc->lc_maxmem * SIZE_FACTOR ) {
                return;
        }
 
        remove_threshold = lc->lc_timeout;
        while ( lc->lc_memused > lc->lc_maxmem * SIZE_FACTOR ) {
-               validtime = (long)time( NULL ) - remove_threshold;
+               c_time = time( NULL );
                for ( i = 0; i < LDAP_CACHE_BUCKETS; ++i ) {
                        prev = NULLMSG;
                        for ( m = lc->lc_buckets[ i ]; m != NULLMSG;
                            m = next ) {
                                next = m->lm_next;
-                               if ( m->lm_time < validtime ) {
+                               if ( difftime(c_time, m->lm_time) > remove_threshold) {
                                        if ( prev == NULLMSG ) {
                                                lc->lc_buckets[ i ] = next;
                                        } else {