diff options
Diffstat (limited to 'contrib/isc-dhcp/common/alloc.c')
-rw-r--r-- | contrib/isc-dhcp/common/alloc.c | 1317 |
1 files changed, 0 insertions, 1317 deletions
diff --git a/contrib/isc-dhcp/common/alloc.c b/contrib/isc-dhcp/common/alloc.c deleted file mode 100644 index 39edd81..0000000 --- a/contrib/isc-dhcp/common/alloc.c +++ /dev/null @@ -1,1317 +0,0 @@ -/* alloc.c - - Memory allocation... */ - -/* - * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC") - * Copyright (c) 1996-2003 by Internet Software Consortium - * - * Permission to use, copy, modify, and distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT - * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - * Internet Systems Consortium, Inc. - * 950 Charter Street - * Redwood City, CA 94063 - * <info@isc.org> - * http://www.isc.org/ - * - * This software has been written for Internet Systems Consortium - * by Ted Lemon in cooperation with Vixie Enterprises and Nominum, Inc. - * To learn more about Internet Systems Consortium, see - * ``http://www.isc.org/''. To learn more about Vixie Enterprises, - * see ``http://www.vix.com''. To learn more about Nominum, Inc., see - * ``http://www.nominum.com''. - */ - -#ifndef lint -static char copyright[] = -"$Id: alloc.c,v 1.53.2.10 2004/06/10 17:59:14 dhankins Exp $ Copyright (c) 2004 Internet Systems Consortium. All rights reserved.\n"; -#endif /* not lint */ - -#include "dhcpd.h" -#include <omapip/omapip_p.h> - -struct dhcp_packet *dhcp_free_list; -struct packet *packet_free_list; - -int option_chain_head_allocate (ptr, file, line) - struct option_chain_head **ptr; - const char *file; - int line; -{ - int size; - struct option_chain_head *h; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct option_chain_head *)0; -#endif - } - - h = dmalloc (sizeof *h, file, line); - if (h) { - memset (h, 0, sizeof *h); - return option_chain_head_reference (ptr, h, file, line); - } - return 0; -} - -int option_chain_head_reference (ptr, bp, file, line) - struct option_chain_head **ptr; - struct option_chain_head *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct option_chain_head *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int option_chain_head_dereference (ptr, file, line) - struct option_chain_head **ptr; - const char *file; - int line; -{ - int i; - struct option_chain_head *option_chain_head; - pair car, cdr; - - if (!ptr || !*ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - option_chain_head = *ptr; - *ptr = (struct option_chain_head *)0; - --option_chain_head -> refcnt; - rc_register (file, line, ptr, option_chain_head, - option_chain_head -> refcnt, 1, RC_MISC); - if (option_chain_head -> refcnt > 0) - return 1; - - if (option_chain_head -> refcnt < 0) { - log_error ("%s(%d): negative refcnt!", file, line); -#if defined (DEBUG_RC_HISTORY) - dump_rc_history (option_chain_head); -#endif -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - /* If there are any options on this head, free them. */ - for (car = option_chain_head -> first; car; car = cdr) { - cdr = car -> cdr; - if (car -> car) - option_cache_dereference ((struct option_cache **) - (&car -> car), MDL); - dfree (car, MDL); - car = cdr; - } - - dfree (option_chain_head, file, line); - return 1; -} - -int group_allocate (ptr, file, line) - struct group **ptr; - const char *file; - int line; -{ - int size; - struct group *g; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct group *)0; -#endif - } - - g = dmalloc (sizeof *g, file, line); - if (g) { - memset (g, 0, sizeof *g); - return group_reference (ptr, g, file, line); - } - return 0; -} - -int group_reference (ptr, bp, file, line) - struct group **ptr; - struct group *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct group *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int group_dereference (ptr, file, line) - struct group **ptr; - const char *file; - int line; -{ - int i; - struct group *group; - - if (!ptr || !*ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - group = *ptr; - *ptr = (struct group *)0; - --group -> refcnt; - rc_register (file, line, ptr, group, group -> refcnt, 1, RC_MISC); - if (group -> refcnt > 0) - return 1; - - if (group -> refcnt < 0) { - log_error ("%s(%d): negative refcnt!", file, line); -#if defined (DEBUG_RC_HISTORY) - dump_rc_history (group); -#endif -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - if (group -> object) - group_object_dereference (&group -> object, file, line); - if (group -> subnet) - subnet_dereference (&group -> subnet, file, line); - if (group -> shared_network) - shared_network_dereference (&group -> shared_network, - file, line); - if (group -> statements) - executable_statement_dereference (&group -> statements, - file, line); - if (group -> next) - group_dereference (&group -> next, file, line); - dfree (group, file, line); - return 1; -} - -struct dhcp_packet *new_dhcp_packet (file, line) - const char *file; - int line; -{ - struct dhcp_packet *rval; - rval = (struct dhcp_packet *)dmalloc (sizeof (struct dhcp_packet), - file, line); - return rval; -} - -struct protocol *new_protocol (file, line) - const char *file; - int line; -{ - struct protocol *rval = dmalloc (sizeof (struct protocol), file, line); - return rval; -} - -struct domain_search_list *new_domain_search_list (file, line) - const char *file; - int line; -{ - struct domain_search_list *rval = - dmalloc (sizeof (struct domain_search_list), file, line); - return rval; -} - -struct name_server *new_name_server (file, line) - const char *file; - int line; -{ - struct name_server *rval = - dmalloc (sizeof (struct name_server), file, line); - return rval; -} - -void free_name_server (ptr, file, line) - struct name_server *ptr; - const char *file; - int line; -{ - dfree ((VOIDPTR)ptr, file, line); -} - -struct option *new_option (file, line) - const char *file; - int line; -{ - struct option *rval = - dmalloc (sizeof (struct option), file, line); - if (rval) - memset (rval, 0, sizeof *rval); - return rval; -} - -void free_option (ptr, file, line) - struct option *ptr; - const char *file; - int line; -{ -/* XXX have to put all options on heap before this is possible. */ -#if 0 - if (ptr -> name) - dfree ((VOIDPTR)option -> name, file, line); - dfree ((VOIDPTR)ptr, file, line); -#endif -} - -struct universe *new_universe (file, line) - const char *file; - int line; -{ - struct universe *rval = - dmalloc (sizeof (struct universe), file, line); - return rval; -} - -void free_universe (ptr, file, line) - struct universe *ptr; - const char *file; - int line; -{ - dfree ((VOIDPTR)ptr, file, line); -} - -void free_domain_search_list (ptr, file, line) - struct domain_search_list *ptr; - const char *file; - int line; -{ - dfree ((VOIDPTR)ptr, file, line); -} - -void free_protocol (ptr, file, line) - struct protocol *ptr; - const char *file; - int line; -{ - dfree ((VOIDPTR)ptr, file, line); -} - -void free_dhcp_packet (ptr, file, line) - struct dhcp_packet *ptr; - const char *file; - int line; -{ - dfree ((VOIDPTR)ptr, file, line); -} - -struct client_lease *new_client_lease (file, line) - const char *file; - int line; -{ - return (struct client_lease *)dmalloc (sizeof (struct client_lease), - file, line); -} - -void free_client_lease (lease, file, line) - struct client_lease *lease; - const char *file; - int line; -{ - dfree (lease, file, line); -} - -pair free_pairs; - -pair new_pair (file, line) - const char *file; - int line; -{ - pair foo; - - if (free_pairs) { - foo = free_pairs; - free_pairs = foo -> cdr; - memset (foo, 0, sizeof *foo); - dmalloc_reuse (foo, file, line, 0); - return foo; - } - - foo = dmalloc (sizeof *foo, file, line); - if (!foo) - return foo; - memset (foo, 0, sizeof *foo); - return foo; -} - -void free_pair (foo, file, line) - pair foo; - const char *file; - int line; -{ - foo -> cdr = free_pairs; - free_pairs = foo; - dmalloc_reuse (free_pairs, (char *)0, 0, 0); -} - -#if defined (DEBUG_MEMORY_LEAKAGE) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) -void relinquish_free_pairs () -{ - pair pf, pc; - - for (pf = free_pairs; pf; pf = pc) { - pc = pf -> cdr; - dfree (pf, MDL); - } - free_pairs = (pair)0; -} -#endif - -struct expression *free_expressions; - -int expression_allocate (cptr, file, line) - struct expression **cptr; - const char *file; - int line; -{ - struct expression *rval; - - if (free_expressions) { - rval = free_expressions; - free_expressions = rval -> data.not; - dmalloc_reuse (rval, file, line, 1); - } else { - rval = dmalloc (sizeof (struct expression), file, line); - if (!rval) - return 0; - } - memset (rval, 0, sizeof *rval); - return expression_reference (cptr, rval, file, line); -} - -int expression_reference (ptr, src, file, line) - struct expression **ptr; - struct expression *src; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct expression *)0; -#endif - } - *ptr = src; - src -> refcnt++; - rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); - return 1; -} - -void free_expression (expr, file, line) - struct expression *expr; - const char *file; - int line; -{ - expr -> data.not = free_expressions; - free_expressions = expr; - dmalloc_reuse (free_expressions, (char *)0, 0, 0); -} - -#if defined (DEBUG_MEMORY_LEAKAGE) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) -void relinquish_free_expressions () -{ - struct expression *e, *n; - - for (e = free_expressions; e; e = n) { - n = e -> data.not; - dfree (e, MDL); - } - free_expressions = (struct expression *)0; -} -#endif - -struct binding_value *free_binding_values; - -int binding_value_allocate (cptr, file, line) - struct binding_value **cptr; - const char *file; - int line; -{ - struct binding_value *rval; - - if (free_binding_values) { - rval = free_binding_values; - free_binding_values = rval -> value.bv; - dmalloc_reuse (rval, file, line, 1); - } else { - rval = dmalloc (sizeof (struct binding_value), file, line); - if (!rval) - return 0; - } - memset (rval, 0, sizeof *rval); - return binding_value_reference (cptr, rval, file, line); -} - -int binding_value_reference (ptr, src, file, line) - struct binding_value **ptr; - struct binding_value *src; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct binding_value *)0; -#endif - } - *ptr = src; - src -> refcnt++; - rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); - return 1; -} - -void free_binding_value (bv, file, line) - struct binding_value *bv; - const char *file; - int line; -{ - bv -> value.bv = free_binding_values; - free_binding_values = bv; - dmalloc_reuse (free_binding_values, (char *)0, 0, 0); -} - -#if defined (DEBUG_MEMORY_LEAKAGE) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) -void relinquish_free_binding_values () -{ - struct binding_value *b, *n; - - for (b = free_binding_values; b; b = n) { - n = b -> value.bv; - dfree (b, MDL); - } - free_binding_values = (struct binding_value *)0; -} -#endif - -int fundef_allocate (cptr, file, line) - struct fundef **cptr; - const char *file; - int line; -{ - struct fundef *rval; - - rval = dmalloc (sizeof (struct fundef), file, line); - if (!rval) - return 0; - memset (rval, 0, sizeof *rval); - return fundef_reference (cptr, rval, file, line); -} - -int fundef_reference (ptr, src, file, line) - struct fundef **ptr; - struct fundef *src; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct fundef *)0; -#endif - } - *ptr = src; - src -> refcnt++; - rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); - return 1; -} - -struct option_cache *free_option_caches; - -#if defined (DEBUG_MEMORY_LEAKAGE) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) -void relinquish_free_option_caches () -{ - struct option_cache *o, *n; - - for (o = free_option_caches; o; o = n) { - n = (struct option_cache *)(o -> expression); - dfree (o, MDL); - } - free_option_caches = (struct option_cache *)0; -} -#endif - -int option_cache_allocate (cptr, file, line) - struct option_cache **cptr; - const char *file; - int line; -{ - struct option_cache *rval; - - if (free_option_caches) { - rval = free_option_caches; - free_option_caches = - (struct option_cache *)(rval -> expression); - dmalloc_reuse (rval, file, line, 0); - } else { - rval = dmalloc (sizeof (struct option_cache), file, line); - if (!rval) - return 0; - } - memset (rval, 0, sizeof *rval); - return option_cache_reference (cptr, rval, file, line); -} - -int option_cache_reference (ptr, src, file, line) - struct option_cache **ptr; - struct option_cache *src; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct option_cache *)0; -#endif - } - *ptr = src; - src -> refcnt++; - rc_register (file, line, ptr, src, src -> refcnt, 0, RC_MISC); - return 1; -} - -int buffer_allocate (ptr, len, file, line) - struct buffer **ptr; - unsigned len; - const char *file; - int line; -{ - struct buffer *bp; - - bp = dmalloc (len + sizeof *bp, file, line); - if (!bp) - return 0; - memset (bp, 0, sizeof *bp); - bp -> refcnt = 0; - return buffer_reference (ptr, bp, file, line); -} - -int buffer_reference (ptr, bp, file, line) - struct buffer **ptr; - struct buffer *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct buffer *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int buffer_dereference (ptr, file, line) - struct buffer **ptr; - const char *file; - int line; -{ - struct buffer *bp; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - if (!*ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - (*ptr) -> refcnt--; - rc_register (file, line, ptr, *ptr, (*ptr) -> refcnt, 1, RC_MISC); - if (!(*ptr) -> refcnt) { - dfree ((*ptr), file, line); - } else if ((*ptr) -> refcnt < 0) { - log_error ("%s(%d): negative refcnt!", file, line); -#if defined (DEBUG_RC_HISTORY) - dump_rc_history (*ptr); -#endif -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - *ptr = (struct buffer *)0; - return 1; -} - -int dns_host_entry_allocate (ptr, hostname, file, line) - struct dns_host_entry **ptr; - const char *hostname; - const char *file; - int line; -{ - struct dns_host_entry *bp; - - bp = dmalloc (strlen (hostname) + sizeof *bp, file, line); - if (!bp) - return 0; - memset (bp, 0, sizeof *bp); - bp -> refcnt = 0; - strcpy (bp -> hostname, hostname); - return dns_host_entry_reference (ptr, bp, file, line); -} - -int dns_host_entry_reference (ptr, bp, file, line) - struct dns_host_entry **ptr; - struct dns_host_entry *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct dns_host_entry *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int dns_host_entry_dereference (ptr, file, line) - struct dns_host_entry **ptr; - const char *file; - int line; -{ - struct dns_host_entry *bp; - - if (!ptr || !*ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - (*ptr) -> refcnt--; - rc_register (file, line, ptr, *ptr, (*ptr) -> refcnt, 1, RC_MISC); - if (!(*ptr) -> refcnt) - dfree ((*ptr), file, line); - if ((*ptr) -> refcnt < 0) { - log_error ("%s(%d): negative refcnt!", file, line); -#if defined (DEBUG_RC_HISTORY) - dump_rc_history (*ptr); -#endif -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - *ptr = (struct dns_host_entry *)0; - return 1; -} - -int option_state_allocate (ptr, file, line) - struct option_state **ptr; - const char *file; - int line; -{ - unsigned size; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct option_state *)0; -#endif - } - - size = sizeof **ptr + (universe_count - 1) * sizeof (VOIDPTR); - *ptr = dmalloc (size, file, line); - if (*ptr) { - memset (*ptr, 0, size); - (*ptr) -> universe_count = universe_count; - (*ptr) -> refcnt = 1; - rc_register (file, line, - ptr, *ptr, (*ptr) -> refcnt, 0, RC_MISC); - return 1; - } - return 0; -} - -int option_state_reference (ptr, bp, file, line) - struct option_state **ptr; - struct option_state *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct option_state *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int option_state_dereference (ptr, file, line) - struct option_state **ptr; - const char *file; - int line; -{ - int i; - struct option_state *options; - - if (!ptr || !*ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - options = *ptr; - *ptr = (struct option_state *)0; - --options -> refcnt; - rc_register (file, line, ptr, options, options -> refcnt, 1, RC_MISC); - if (options -> refcnt > 0) - return 1; - - if (options -> refcnt < 0) { - log_error ("%s(%d): negative refcnt!", file, line); -#if defined (DEBUG_RC_HISTORY) - dump_rc_history (options); -#endif -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - /* Loop through the per-universe state. */ - for (i = 0; i < options -> universe_count; i++) - if (options -> universes [i] && - universes [i] -> option_state_dereference) - ((*(universes [i] -> option_state_dereference)) - (universes [i], options, file, line)); - dfree (options, file, line); - return 1; -} - -int executable_statement_allocate (ptr, file, line) - struct executable_statement **ptr; - const char *file; - int line; -{ - struct executable_statement *bp; - - bp = dmalloc (sizeof *bp, file, line); - if (!bp) - return 0; - memset (bp, 0, sizeof *bp); - return executable_statement_reference (ptr, bp, file, line); -} - -int executable_statement_reference (ptr, bp, file, line) - struct executable_statement **ptr; - struct executable_statement *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct executable_statement *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -static struct packet *free_packets; - -#if defined (DEBUG_MEMORY_LEAKAGE) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) -void relinquish_free_packets () -{ - struct packet *p, *n; - for (p = free_packets; p; p = n) { - n = (struct packet *)(p -> raw); - dfree (p, MDL); - } - free_packets = (struct packet *)0; -} -#endif - -int packet_allocate (ptr, file, line) - struct packet **ptr; - const char *file; - int line; -{ - int size; - struct packet *p; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct packet *)0; -#endif - } - - if (free_packets) { - p = free_packets; - free_packets = (struct packet *)(p -> raw); - dmalloc_reuse (p, file, line, 1); - } else { - p = dmalloc (sizeof *p, file, line); - } - if (p) { - memset (p, 0, sizeof *p); - return packet_reference (ptr, p, file, line); - } - return 0; -} - -int packet_reference (ptr, bp, file, line) - struct packet **ptr; - struct packet *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct packet *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int packet_dereference (ptr, file, line) - struct packet **ptr; - const char *file; - int line; -{ - int i; - struct packet *packet; - - if (!ptr || !*ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - packet = *ptr; - *ptr = (struct packet *)0; - --packet -> refcnt; - rc_register (file, line, ptr, packet, packet -> refcnt, 1, RC_MISC); - if (packet -> refcnt > 0) - return 1; - - if (packet -> refcnt < 0) { - log_error ("%s(%d): negative refcnt!", file, line); -#if defined (DEBUG_RC_HISTORY) - dump_rc_history (packet); -#endif -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - if (packet -> options) - option_state_dereference (&packet -> options, file, line); - if (packet -> interface) - interface_dereference (&packet -> interface, MDL); - if (packet -> shared_network) - shared_network_dereference (&packet -> shared_network, MDL); - for (i = 0; i < packet -> class_count && i < PACKET_MAX_CLASSES; i++) { - if (packet -> classes [i]) - omapi_object_dereference ((omapi_object_t **) - &packet -> classes [i], MDL); - } - packet -> raw = (struct dhcp_packet *)free_packets; - free_packets = packet; - dmalloc_reuse (free_packets, (char *)0, 0, 0); - return 1; -} - -int dns_zone_allocate (ptr, file, line) - struct dns_zone **ptr; - const char *file; - int line; -{ - int size; - struct dns_zone *d; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct dns_zone *)0; -#endif - } - - d = dmalloc (sizeof *d, file, line); - if (d) { - memset (d, 0, sizeof *d); - return dns_zone_reference (ptr, d, file, line); - } - return 0; -} - -int dns_zone_reference (ptr, bp, file, line) - struct dns_zone **ptr; - struct dns_zone *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct dns_zone *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -int binding_scope_allocate (ptr, file, line) - struct binding_scope **ptr; - const char *file; - int line; -{ - struct binding_scope *bp; - - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - - bp = dmalloc (sizeof *bp, file, line); - if (!bp) - return 0; - memset (bp, 0, sizeof *bp); - binding_scope_reference (ptr, bp, file, line); - return 1; -} - -int binding_scope_reference (ptr, bp, file, line) - struct binding_scope **ptr; - struct binding_scope *bp; - const char *file; - int line; -{ - if (!ptr) { - log_error ("%s(%d): null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - return 0; -#endif - } - if (*ptr) { - log_error ("%s(%d): non-null pointer", file, line); -#if defined (POINTER_DEBUG) - abort (); -#else - *ptr = (struct binding_scope *)0; -#endif - } - *ptr = bp; - bp -> refcnt++; - rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); - return 1; -} - -/* Make a copy of the data in data_string, upping the buffer reference - count if there's a buffer. */ - -void data_string_copy (dest, src, file, line) - struct data_string *dest; - struct data_string *src; - const char *file; - int line; -{ - if (src -> buffer) - buffer_reference (&dest -> buffer, src -> buffer, file, line); - dest -> data = src -> data; - dest -> terminated = src -> terminated; - dest -> len = src -> len; -} - -/* Release the reference count to a data string's buffer (if any) and - zero out the other information, yielding the null data string. */ - -void data_string_forget (data, file, line) - struct data_string *data; - const char *file; - int line; -{ - if (data -> buffer) - buffer_dereference (&data -> buffer, file, line); - memset (data, 0, sizeof *data); -} - -/* Make a copy of the data in data_string, upping the buffer reference - count if there's a buffer. */ - -void data_string_truncate (dp, len) - struct data_string *dp; - int len; -{ - if (len < dp -> len) { - dp -> terminated = 0; - dp -> len = len; - } -} |