1 #pragma ident	"%Z%%M%	%I%	%E% SMI"
2 
3 /*
4  * The contents of this file are subject to the Netscape Public
5  * License Version 1.1 (the "License"); you may not use this file
6  * except in compliance with the License. You may obtain a copy of
7  * the License at http://www.mozilla.org/NPL/
8  *
9  * Software distributed under the License is distributed on an "AS
10  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11  * implied. See the License for the specific language governing
12  * rights and limitations under the License.
13  *
14  * The Original Code is Mozilla Communicator client code, released
15  * March 31, 1998.
16  *
17  * The Initial Developer of the Original Code is Netscape
18  * Communications Corporation. Portions created by Netscape are
19  * Copyright (C) 1998-1999 Netscape Communications Corporation. All
20  * Rights Reserved.
21  *
22  * Contributor(s):
23  */
24 /*
25  *  Copyright (c) 1994 The Regents of the University of Michigan.
26  *  All rights reserved.
27  */
28 /*
29  *  free.c - some free routines are included here to avoid having to
30  *           link in lots of extra code when not using certain features
31  */
32 
33 #if 0
34 #ifndef lint
35 static char copyright[] = "@(#) Copyright (c) 1994 The Regents of the University of Michigan.\nAll rights reserved.\n";
36 #endif
37 #endif
38 
39 #include "ldap-int.h"
40 
41 void
42 LDAP_CALL
43 ldap_getfilter_free( LDAPFiltDesc *lfdp )
44 {
45     LDAPFiltList	*flp, *nextflp;
46     LDAPFiltInfo	*fip, *nextfip;
47 
48     if ( lfdp == NULL ) {
49 	return;
50     }
51 
52     for ( flp = lfdp->lfd_filtlist; flp != NULL; flp = nextflp ) {
53 	for ( fip = flp->lfl_ilist; fip != NULL; fip = nextfip ) {
54 	    nextfip = fip->lfi_next;
55 	    NSLDAPI_FREE( fip->lfi_filter );
56 	    NSLDAPI_FREE( fip->lfi_desc );
57 	    NSLDAPI_FREE( fip );
58 	}
59 	nextflp = flp->lfl_next;
60 	NSLDAPI_FREE( flp->lfl_pattern );
61 	NSLDAPI_FREE( flp->lfl_delims );
62 	NSLDAPI_FREE( flp->lfl_tag );
63 	NSLDAPI_FREE( flp );
64     }
65 
66     if ( lfdp->lfd_curvalcopy != NULL ) {
67 	NSLDAPI_FREE( lfdp->lfd_curvalcopy );
68     }
69     if ( lfdp->lfd_curvalwords != NULL ) {
70 	NSLDAPI_FREE( lfdp->lfd_curvalwords );
71     }
72     if ( lfdp->lfd_filtprefix != NULL ) {
73 	NSLDAPI_FREE( lfdp->lfd_filtprefix );
74     }
75     if ( lfdp->lfd_filtsuffix != NULL ) {
76 	NSLDAPI_FREE( lfdp->lfd_filtsuffix );
77     }
78 
79     NSLDAPI_FREE( lfdp );
80 }
81 
82 
83 /*
84  * free a null-terminated array of pointers to mod structures. the
85  * structures are freed, not the array itself, unless the freemods
86  * flag is set.
87  */
88 void
89 LDAP_CALL
90 ldap_mods_free( LDAPMod **mods, int freemods )
91 {
92 	int	i;
93 
94 	if ( !NSLDAPI_VALID_LDAPMOD_ARRAY( mods )) {
95 		return;
96 	}
97 
98 	for ( i = 0; mods[i] != NULL; i++ ) {
99 		if ( mods[i]->mod_op & LDAP_MOD_BVALUES ) {
100 			if ( mods[i]->mod_bvalues != NULL ) {
101 				ber_bvecfree( mods[i]->mod_bvalues );
102 			}
103 		} else if ( mods[i]->mod_values != NULL ) {
104 			ldap_value_free( mods[i]->mod_values );
105 		}
106 		if ( mods[i]->mod_type != NULL ) {
107 			NSLDAPI_FREE( mods[i]->mod_type );
108 		}
109 		NSLDAPI_FREE( (char *) mods[i] );
110 	}
111 
112 	if ( freemods )
113 		NSLDAPI_FREE( (char *) mods );
114 }
115 
116 
117 /*
118  * ldap_memfree() is needed to ensure that memory allocated by the C runtime
119  * assocated with libldap is freed by the same runtime code.
120  */
121 void
122 LDAP_CALL
123 ldap_memfree( void *s )
124 {
125 	if ( s != NULL ) {
126 		NSLDAPI_FREE( s );
127 	}
128 }
129 
130 
131 /*
132  * ldap_ber_free() is just a cover for ber_free()
133  * ber_free() checks for ber == NULL, so we don't bother.
134  */
135 void
136 LDAP_CALL
137 ldap_ber_free( BerElement *ber, int freebuf )
138 {
139 	ber_free( ber, freebuf );
140 }
141