]> git.sur5r.net Git - openldap/blob - servers/slapd/ch_malloc.c
fix previous commit
[openldap] / servers / slapd / ch_malloc.c
1 /* ch_malloc.c - malloc routines that test returns from malloc and friends */
2 /* $OpenLDAP$ */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
4  *
5  * Copyright 1998-2005 The OpenLDAP Foundation.
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted only as authorized by the OpenLDAP
10  * Public License.
11  *
12  * A copy of this license is available in the file LICENSE in the
13  * top-level directory of the distribution or, alternatively, at
14  * <http://www.OpenLDAP.org/license.html>.
15  */
16 /* Portions Copyright (c) 1995 Regents of the University of Michigan.
17  * All rights reserved.
18  *
19  * Redistribution and use in source and binary forms are permitted
20  * provided that this notice is preserved and that due credit is given
21  * to the University of Michigan at Ann Arbor. The name of the University
22  * may not be used to endorse or promote products derived from this
23  * software without specific prior written permission. This software
24  * is provided ``as is'' without express or implied warranty.
25  */
26
27 #define CH_FREE 1
28
29 #include "portable.h"
30
31 #include <stdio.h>
32
33 #include <ac/stdlib.h>
34
35 #include <ac/string.h>
36 #include <ac/socket.h>
37
38 #include "slap.h"
39
40 BerMemoryFunctions ch_mfuncs = {
41         (BER_MEMALLOC_FN *)ch_malloc,
42         (BER_MEMCALLOC_FN *)ch_calloc,
43         (BER_MEMREALLOC_FN *)ch_realloc,
44         (BER_MEMFREE_FN *)ch_free 
45 };
46
47 void *
48 ch_malloc(
49     ber_len_t   size
50 )
51 {
52         void    *new;
53
54         if ( (new = (void *) ber_memalloc_x( size, NULL )) == NULL ) {
55                 Debug( LDAP_DEBUG_ANY, "ch_malloc of %lu bytes failed\n",
56                         (long) size, 0, 0 );
57                 assert( 0 );
58                 exit( EXIT_FAILURE );
59         }
60
61         return( new );
62 }
63
64 void *
65 ch_realloc(
66     void                *block,
67     ber_len_t   size
68 )
69 {
70         void    *new, *ctx;
71
72         if ( block == NULL ) {
73                 return( ch_malloc( size ) );
74         }
75
76         if( size == 0 ) {
77                 ch_free( block );
78         }
79
80         ctx = slap_sl_context( block );
81         if ( ctx ) {
82                 return slap_sl_realloc( block, size, ctx );
83         }
84
85         if ( (new = (void *) ber_memrealloc_x( block, size, NULL )) == NULL ) {
86                 Debug( LDAP_DEBUG_ANY, "ch_realloc of %lu bytes failed\n",
87                         (long) size, 0, 0 );
88                 assert( 0 );
89                 exit( EXIT_FAILURE );
90         }
91
92         return( new );
93 }
94
95 void *
96 ch_calloc(
97     ber_len_t   nelem,
98     ber_len_t   size
99 )
100 {
101         void    *new;
102
103         if ( (new = (void *) ber_memcalloc_x( nelem, size, NULL )) == NULL ) {
104                 Debug( LDAP_DEBUG_ANY, "ch_calloc of %lu elems of %lu bytes failed\n",
105                   (long) nelem, (long) size, 0 );
106                 assert( 0 );
107                 exit( EXIT_FAILURE );
108         }
109
110         return( new );
111 }
112
113 char *
114 ch_strdup(
115     const char *string
116 )
117 {
118         char    *new;
119
120         if ( (new = ber_strdup_x( string, NULL )) == NULL ) {
121                 Debug( LDAP_DEBUG_ANY, "ch_strdup(%s) failed\n", string, 0, 0 );
122                 assert( 0 );
123                 exit( EXIT_FAILURE );
124         }
125
126         return( new );
127 }
128
129 void
130 ch_free( void *ptr )
131 {
132         void *ctx;
133
134         ctx = slap_sl_context( ptr );
135         if (ctx) {
136                 slap_sl_free( ptr, ctx );
137         } else {
138                 ber_memfree_x( ptr, NULL );
139         }
140 }
141