1 /* $OpenBSD: alloc.c,v 1.4 2004/09/16 18:35:42 deraadt Exp $ */
2
3 /* Memory allocation... */
4
5 /*
6 * Copyright (c) 1995, 1996, 1998 The Internet Software Consortium.
7 * All rights reserved.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 *
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. Neither the name of The Internet Software Consortium nor the names
19 * of its contributors may be used to endorse or promote products derived
20 * from this software without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE INTERNET SOFTWARE CONSORTIUM AND
23 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
24 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26 * DISCLAIMED. IN NO EVENT SHALL THE INTERNET SOFTWARE CONSORTIUM OR
27 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
30 * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
33 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 * SUCH DAMAGE.
35 *
36 * This software has been written for the Internet Software Consortium
37 * by Ted Lemon <mellon@fugue.com> in cooperation with Vixie
38 * Enterprises. To learn more about the Internet Software Consortium,
39 * see ``http://www.vix.com/isc''. To learn more about Vixie
40 * Enterprises, see ``http://www.vix.com''.
41 */
42
43 #include "dhcpd.h"
44
45 struct lease_state *free_lease_states;
46
47 void *
dmalloc(int size,char * name)48 dmalloc(int size, char *name)
49 {
50 void *foo = calloc(size, sizeof(char));
51
52 if (!foo)
53 warning("No memory for %s.", name);
54 return (foo);
55 }
56
57 void
dfree(void * ptr,char * name)58 dfree(void *ptr, char *name)
59 {
60 if (!ptr) {
61 warning("dfree %s: free on null pointer.", name);
62 return;
63 }
64 free(ptr);
65 }
66
67 struct tree *
new_tree(char * name)68 new_tree(char *name)
69 {
70 struct tree *rval = dmalloc(sizeof(struct tree), name);
71
72 return (rval);
73 }
74
75 struct tree_cache *free_tree_caches;
76
77 struct tree_cache *
new_tree_cache(char * name)78 new_tree_cache(char *name)
79 {
80 struct tree_cache *rval;
81
82 if (free_tree_caches) {
83 rval = free_tree_caches;
84 free_tree_caches = (struct tree_cache *)(rval->value);
85 } else {
86 rval = dmalloc(sizeof(struct tree_cache), name);
87 if (!rval)
88 error("unable to allocate tree cache for %s.", name);
89 }
90 return (rval);
91 }
92
93 struct hash_table *
new_hash_table(int count,char * name)94 new_hash_table(int count, char *name)
95 {
96 struct hash_table *rval;
97
98 rval = dmalloc(sizeof(struct hash_table) -
99 (DEFAULT_HASH_SIZE * sizeof(struct hash_bucket *)) +
100 (count * sizeof(struct hash_bucket *)), name);
101 if (rval == NULL)
102 return (NULL);
103 rval->hash_count = count;
104 return (rval);
105 }
106
107 struct hash_bucket *
new_hash_bucket(char * name)108 new_hash_bucket(char *name)
109 {
110 struct hash_bucket *rval = dmalloc(sizeof(struct hash_bucket), name);
111
112 return (rval);
113 }
114
115 void
free_hash_bucket(struct hash_bucket * ptr,char * name)116 free_hash_bucket(struct hash_bucket *ptr, char *name)
117 {
118 dfree(ptr, name);
119 }
120
121 void
free_tree_cache(struct tree_cache * ptr)122 free_tree_cache(struct tree_cache *ptr)
123 {
124 ptr->value = (unsigned char *)free_tree_caches;
125 free_tree_caches = ptr;
126 }
127
128 void
free_tree(struct tree * ptr,char * name)129 free_tree(struct tree *ptr, char *name)
130 {
131 dfree(ptr, name);
132 }
133
134 struct shared_network *
new_shared_network(char * name)135 new_shared_network(char *name)
136 {
137 struct shared_network *rval =
138 dmalloc(sizeof(struct shared_network), name);
139 return (rval);
140 }
141
142 struct subnet *
new_subnet(char * name)143 new_subnet(char *name)
144 {
145 struct subnet *rval = dmalloc(sizeof(struct subnet), name);
146 return (rval);
147 }
148
149 struct class *
new_class(char * name)150 new_class(char *name)
151 {
152 struct class *rval = dmalloc(sizeof(struct class), name);
153 return (rval);
154 }
155
156 struct lease_state *
new_lease_state(char * name)157 new_lease_state(char *name)
158 {
159 struct lease_state *rval;
160
161 if (free_lease_states) {
162 rval = free_lease_states;
163 free_lease_states =
164 (struct lease_state *)(free_lease_states->next);
165 } else
166 rval = dmalloc (sizeof (struct lease_state), name);
167 return (rval);
168 }
169
170 void
free_lease_state(struct lease_state * ptr,char * name)171 free_lease_state(struct lease_state *ptr, char *name)
172 {
173 if (ptr->prl)
174 dfree(ptr->prl, name);
175 ptr->next = free_lease_states;
176 free_lease_states = ptr;
177 }
178
179 struct lease *
new_leases(int n,char * name)180 new_leases(int n, char *name)
181 {
182 struct lease *rval = dmalloc(n * sizeof(struct lease), name);
183 return (rval);
184 }
185
186 struct lease *
new_lease(char * name)187 new_lease(char *name)
188 {
189 struct lease *rval = dmalloc(sizeof(struct lease), name);
190 return (rval);
191 }
192
193 struct group *
new_group(char * name)194 new_group(char *name)
195 {
196 struct group *rval =
197 dmalloc(sizeof(struct group), name);
198 return (rval);
199 }
200
201 void
free_lease(struct lease * ptr,char * name)202 free_lease(struct lease *ptr, char *name)
203 {
204 dfree(ptr, name);
205 }
206