--- dhcp-3.0.5/client/dhclient.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/client/dhclient.c 2007-03-30 20:54:34.000000000 -0400 @@ -85,16 +85,52 @@ #endif int bootp_broadcast_always = 0; +#ifdef LIBDHCP +FILE *leaseFile = NULL; +#endif + extern u_int32_t default_requested_options[]; static void usage PROTO ((void)); void do_release(struct client_state *); +#ifdef LIBDHCP +#include "libdhcp_control.h" +LIBDHCP_Control *libdhcp_control; +static void libdhcp_dispatch(void) +{ + struct timeval tv = { 0, 0 }, *tvp; + isc_result_t status; + + /* Wait for a packet, or a timeout, or libdhcp being finished */ + do { + tvp = process_outstanding_timeouts(&tv); + status = omapi_one_dispatch(0, tvp); + + if (libdhcp_control && ((status == ISC_R_TIMEDOUT) || (libdhcp_control->timeout && (time(NULL) >= (libdhcp_control->timeout + libdhcp_control->now))))) { + if (libdhcp_control->callback) + libdhcp_control->callback(libdhcp_control, DHC_TIMEDOUT, NULL); + + break; + } + } while ((status != ISC_R_TIMEDOUT) && ((!libdhcp_control) || (!(libdhcp_control->finished)))); +} + +extern void omapi_free_all_pointers(void); + +__attribute__ ((visibility ("default"))) +int dhcpv4_client (libdhcp_ctl, argc, argv, envp) + LIBDHCP_Control *libdhcp_ctl; +#else int main (argc, argv, envp) +#endif int argc; char **argv, **envp; { +#ifdef LIBDHCP + libdhcp_control = libdhcp_ctl; +#endif int i; struct servent *ent; struct interface_info *ip; @@ -122,6 +158,7 @@ char *arg_conf = NULL; int arg_conf_len = 0; +#ifndef LIBDHCP /* Make sure we have stdin, stdout and stderr. */ i = open ("/dev/null", O_RDWR); if (i == 0) @@ -142,6 +179,7 @@ #if !(defined (DEBUG) || defined (SYSLOG_4_2) || defined (__CYGWIN32__)) setlogmask (LOG_UPTO (LOG_INFO)); #endif +#endif /* Set up the OMAPI. */ status = omapi_init (); @@ -439,8 +477,12 @@ } } +#ifdef LIBDHCP + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE)) +#endif write_client_pid_file(); +#ifndef LIBDHCP if (!quiet) { log_info ("%s %s", message, DHCP_VERSION); log_info (copyright); @@ -449,6 +491,7 @@ log_info ("%s", ""); } else log_perror = 0; +#endif /* If we're given a relay agent address to insert, for testing purposes, figure out what it is. */ @@ -683,11 +726,17 @@ arg_conf_len = 0; } +#ifdef LIBDHCP + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) { +#endif /* Parse the lease database. */ read_client_leases (); /* Rewrite the lease database... */ rewrite_client_leases (); +#ifdef LIBDHCP + } +#endif /* XXX */ /* config_counter(&snd_counter, &rcv_counter); */ @@ -706,7 +755,7 @@ if (!persist) { /* Nothing more to do. */ log_info ("No broadcast interfaces found - exiting."); - exit (0); + return (0); } } else if (!release_mode) { /* Call the script with the list of interfaces. */ @@ -800,6 +849,7 @@ dmalloc_outstanding = 0; #endif +#ifndef LIBDHCP /* If we're not supposed to wait before getting the address, don't. */ if (nowait) @@ -812,6 +862,128 @@ /* Start dispatching packets and timeouts... */ dispatch (); +#else + if (libdhcp_control) { + if (libdhcp_control->timeout) + libdhcp_control->now = time(NULL); + else + libdhcp_control->now = 0; + } + + libdhcp_dispatch(); + + /* libdhcp is finished with us. */ + + /* close all file descriptors: */ + for (ip = interfaces; ip; ip = ip->next) { + shutdown(ip->wfdesc, SHUT_RDWR); + close(ip->wfdesc); + + if (ip->rfdesc != ip->wfdesc) + close(ip->rfdesc); + } + + if (fallback_interface != 0) { + ip = fallback_interface; + shutdown(ip->wfdesc, SHUT_RDWR); + close(ip->wfdesc); + + if (ip->rfdesc != ip->wfdesc) + close(ip->rfdesc); + } + + if (leaseFile) + fclose (leaseFile); + + closelog(); + + char *current_pid_file = _PATH_DHCLIENT_PID; + + /* Free ALL allocated memory: */ + omapi_free_all_pointers(); + + /* Re-Initialize globals: */ + client_env = 0; + client_env_count = 0; + default_lease_time = 43200; + + dhcp_max_agent_option_packet_length = 0; + extended_option_environment = 0; + iaddr_any.len = 4; + memset(&(iaddr_any.iabuf[0]), '\0', 4); + iaddr_broadcast.len = 4; + memset(&(iaddr_broadcast.iabuf[0]), 0xff, 4); + interfaces_requested = 0; + leaseFile = 0; + + libdhcp_control = 0; + + local_port = 0; + no_daemon = 0; + nowait = 0; + onetry = 0; + quiet = 0; + max_lease_time = 86400; + path_dhclient_conf = _PATH_DHCLIENT_CONF; + path_dhclient_db = _PATH_DHCLIENT_DB; + path_dhclient_pid = _PATH_DHCLIENT_PID; + strcpy(&(path_dhclient_script_array[0]), _PATH_DHCLIENT_SCRIPT); + path_dhclient_script = path_dhclient_script_array; + remote_port = 0; + resolver_inited = 0; + new_option_info_tree = 0; + log_perror = 1; + global_scope = NULL; + root_group = NULL; + group_name_hash = NULL; + interfaces = NULL; + dummy_interfaces = NULL; + fallback_interface = NULL; + extern int have_setup_fallback; + have_setup_fallback = 0; + quiet_interface_discovery = 1; +#ifndef LIBDHCP + timeouts = NULL; +#endif + dhcp_type_interface = NULL; + interface_vector = NULL; + interface_count = 0; + interface_max = 0; + name_servers = 0; + domains = 0; + dhcp_type_interface = NULL; + dhcp_type_group = NULL; + dhcp_type_shared_network = NULL; + dhcp_type_control = NULL; + memset(&dhcp_universe, '\0', sizeof(struct universe)); + memset(&nwip_universe, '\0', sizeof(struct universe)); + memset(&fqdn_universe, '\0', sizeof(struct universe)); + universe_hash = 0; + universes = 0; + universe_count = 0; + universe_max = 0; + config_universe = 0; + extern struct hash_bucket *free_hash_buckets; + free_hash_buckets = NULL; + extern struct dhcp_packet *dhcp_free_list; + dhcp_free_list = NULL; + extern struct packet *packet_free_list; + packet_free_list = NULL; + extern struct binding_value *free_binding_values; + free_binding_values = NULL; + extern struct expression *free_expressions; + free_expressions = NULL; + extern struct option_cache *free_option_caches; + free_option_caches = NULL; + extern struct packet *free_packets; + free_packets = NULL; + extern pair free_pairs; + free_pairs = NULL; + extern omapi_io_object_t omapi_io_states; + memset(&omapi_io_states, '\0', sizeof(omapi_io_states)); + dhcp_control_object = NULL; + unlink(current_pid_file); +#endif /*NOTREACHED*/ return 0; @@ -1204,7 +1376,20 @@ if (client -> new -> rebind < cur_time) client -> new -> rebind = TIME_MAX; +#ifdef LIBDHCP + /* We need the server's siaddr for the 'bootServer' + * pump option + */ + u_int32_t set_siaddr = 0; + set_siaddr = client->packet.siaddr.s_addr; + client->packet.siaddr.s_addr = packet->raw->siaddr.s_addr; +#endif + bind_lease (client); + +#ifdef LIBDHCP + client->packet.siaddr.s_addr = set_siaddr; +#endif } void bind_lease (client) @@ -1240,6 +1425,9 @@ return; } +#ifdef LIBDHCP + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) +#endif /* Write out the new lease. */ write_client_lease (client, client -> new, 0, 0); @@ -1340,11 +1528,13 @@ return 0; } +#ifndef LIBDHCP int write_lease (lease) struct lease *lease; { return 0; } +#endif int write_host (host) struct host_decl *host; @@ -1915,6 +2105,10 @@ tell the shell script that we failed to allocate an address, and try again later. */ if (onetry) { +#ifdef LIBDHCP + script_init (client, "FAIL", (struct string_list *)0); + return; +#endif if (!quiet) log_info ("Unable to obtain a lease on first try.%s", " Exiting."); @@ -2519,7 +2713,9 @@ free_client_lease (lease, MDL); } +#ifndef LIBDHCP FILE *leaseFile; +#endif void rewrite_client_leases () { @@ -2960,6 +3156,54 @@ int script_go (client) struct client_state *client; { +#ifdef LIBDHCP + struct string_list *sp; + + if (libdhcp_control && libdhcp_control->callback) { + int dhcmsg; + char *reason=""; + + for (sp = client->env; sp; sp = sp->next) + if (strncmp(sp->string, "reason=", 7) == 0) { + reason = sp->string + 7; + break; + } + + if (strcmp(reason,"NBI") == 0) + dhcmsg = DHC4_NBI; + else if (strcmp(reason,"PREINIT") == 0) + dhcmsg = DHC4_PREINIT; + else if (strcmp(reason,"BOUND") == 0) + dhcmsg = DHC4_BOUND; + else if (strcmp(reason,"RENEW") == 0) + dhcmsg = DHC4_RENEW; + else if (strcmp(reason,"REBOOT") == 0) + dhcmsg = DHC4_REBOOT; + else if (strcmp(reason,"REBIND") == 0) + dhcmsg = DHC4_REBIND; + else if (strcmp(reason,"STOP") == 0) + dhcmsg = DHC4_STOP; + else if (strcmp(reason,"MEDIUM") == 0) + dhcmsg = DHC4_MEDIUM; + else if (strcmp(reason,"TIMEOUT") == 0) + dhcmsg = DHC4_TIMEOUT; + else if (strcmp(reason,"FAIL") == 0) + dhcmsg = DHC4_FAIL; + else if (strcmp(reason,"EXPIRE") == 0) + dhcmsg = DHC4_EXPIRE; + else if (strcmp(reason,"RELEASE") == 0) + dhcmsg = DHC4_RELEASE; + else + dhcmsg = DHC4_NBI; + + (*libdhcp_control->callback) (libdhcp_control, dhcmsg, client); + + if (libdhcp_control->decline) + return 1; + } + + return 0; +#else char *scriptName; char *argv [2]; char **envp; @@ -3033,6 +3277,7 @@ GET_TIME (&cur_time); return (WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : -WTERMSIG (wstatus)); +#endif } void client_envadd (struct client_state *client, @@ -3123,6 +3368,9 @@ /* Don't become a daemon if the user requested otherwise. */ if (no_daemon) { +#ifdef LIBDHCP + if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE )) +#endif write_client_pid_file (); return; } @@ -3132,6 +3380,10 @@ return; state = 1; +#ifdef LIBDHCP + return; +#endif + /* Stop logging to stderr... */ log_perror = 0; --- dhcp-3.0.5/common/discover.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/common/discover.c 2007-03-30 20:54:06.000000000 -0400 @@ -121,6 +121,10 @@ register that interface with the network I/O software, figure out what subnet it's on, and add it to the list of interfaces. */ +#ifdef LIBDHCP +int have_setup_fallback = 0; +#endif + void discover_interfaces (state) int state; { @@ -139,7 +143,9 @@ char *s; #endif isc_result_t status; +#ifndef LIBDHCP static int setup_fallback = 0; +#endif int wifcount = 0; /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */ @@ -692,10 +698,17 @@ log_fatal ("Not configured to listen on any interfaces!"); } +#ifdef LIBDHCP + if (!have_setup_fallback) { + have_setup_fallback = 1; + maybe_setup_fallback (); + } +#else if (!setup_fallback) { setup_fallback = 1; maybe_setup_fallback (); } +#endif #if defined (HAVE_SETFD) if (fallback_interface) { --- dhcp-3.0.5/common/alloc.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/common/alloc.c 2007-03-30 20:54:06.000000000 -0400 @@ -1009,7 +1009,11 @@ return 1; } +#ifdef LIBDHCP +struct packet *free_packets; +#else static struct packet *free_packets; +#endif #if defined (DEBUG_MEMORY_LEAKAGE) || \ defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) --- dhcp-3.0.5/common/tree.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/common/tree.c 2007-03-30 20:54:06.000000000 -0400 @@ -40,7 +40,7 @@ #include "dhcpd.h" #include -struct binding_scope *global_scope; +struct binding_scope __attribute__ ((visibility ("default"))) *global_scope; static int do_host_lookup PROTO ((struct data_string *, struct dns_host_entry *)); @@ -2615,6 +2615,7 @@ result of that evaluation. There should never be both an expression and a valid data_string. */ +__attribute__ ((visibility ("default"))) int evaluate_option_cache (result, packet, lease, client_state, in_options, cfg_options, scope, oc, file, line) struct data_string *result; --- dhcp-3.0.5/common/options.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/common/options.c 2007-03-30 20:54:06.000000000 -0400 @@ -2153,6 +2153,7 @@ return 1; } +__attribute__ ((visibility ("default"))) void option_space_foreach (struct packet *packet, struct lease *lease, struct client_state *client_state, struct option_state *in_options, --- dhcp-3.0.5/common/dispatch.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/common/dispatch.c 2007-03-30 20:54:06.000000000 -0400 @@ -39,8 +39,24 @@ #include "dhcpd.h" -struct timeout *timeouts; -static struct timeout *free_timeouts; +struct timeout { +#ifndef LIBDHCP + struct timeout *next; +#endif + TIME when; + void (*func) PROTO ((void *)); + void *what; + tvref_t ref; + tvunref_t unref; +}; + +#ifdef LIBDHCP +static struct timeout *timeouts = NULL; +static int ntimeouts = 0; +#else +static struct timeout *timeouts = NULL; +static struct timeout *free_timeouts = NULL; +#endif void set_time(TIME t) { @@ -53,9 +69,41 @@ struct timeval *process_outstanding_timeouts (struct timeval *tvp) { +#ifdef LIBDHCP + int i; + struct timeout t = { 0 }; +#endif /* Call any expired timeouts, and then if there's still a timeout registered, time out the select call then. */ +#ifdef LIBDHCP + if (!ntimeouts) + return NULL; + + for (i = 0; i < ntimeouts && timeouts[i].when <= cur_time;) { + struct timeout *new_timeouts; + size_t n; + + memmove(&t, &timeouts[i], sizeof (t)); + + n = (ntimeouts - i - 1) * sizeof (t); + memmove(&timeouts[i+1], &timeouts[i], n); + + n = --ntimeouts * sizeof (t); + new_timeouts = realloc(timeouts, n); + /* XXX broken API, no way to return error here */ + if (new_timeouts || !n) + timeouts = new_timeouts; + + if (t.func) + t.func(t.what); + if (t.unref) + t.unref(t.what, MDL); + } + if (tvp && ntimeouts) { + tvp->tv_sec = timeouts[0].when; + tvp->tv_usec = 0; +#else another: if (timeouts) { struct timeout *t; @@ -73,9 +121,15 @@ tvp -> tv_sec = timeouts -> when; tvp -> tv_usec = 0; } +#endif return tvp; +#ifdef LIBDHCP + } + return NULL; +#else } else return (struct timeval *)0; +#endif } /* Wait for packets to come in using select(). When one does, call @@ -104,13 +158,28 @@ tvref_t ref; tvunref_t unref; { +#ifdef LIBDHCP + struct timeout t = { + .when = when, + .func = where, + .what = what, + .ref = ref, + .unref = unref + }; + struct timeout *new_timeouts; + int i, pos = 0; +#else struct timeout *t, *q; +#endif /* See if this timeout supersedes an existing timeout. */ +#ifdef LIBDHCP + for (i = 0; i < ntimeouts; i++) { + struct timeout *q = &timeouts[i]; +#else t = (struct timeout *)0; for (q = timeouts; q; q = q -> next) { - if ((where == NULL || q -> func == where) && - q -> what == what) { + if ((where == NULL || q -> func == where) && q -> what == what) { if (t) t -> next = q -> next; else @@ -119,7 +188,29 @@ } t = q; } +#endif +#ifdef LIBDHCP + /* If this one is already in the list with a different time, + * remove it and re-add */ + if ((where == NULL || q->func == where) && + q->what == what) { + size_t n = (--ntimeouts - i) * sizeof (*q); + memmove(&t, q, sizeof (t)); + + if (n) + memmove(&timeouts[i], &timeouts[i+1], n); + + if (ntimeouts) { + new_timeouts = realloc(timeouts, ntimeouts * sizeof (*q)); + /* XXX broken API, no way to return error here */ + if (new_timeouts) + timeouts = new_timeouts; + } else { + timeouts = NULL; + } + add_timeout(when, where, what, ref, unref); +#else /* If we didn't supersede a timeout, allocate a timeout structure now. */ if (!q) { @@ -128,7 +219,7 @@ free_timeouts = q -> next; } else { q = ((struct timeout *) - dmalloc (sizeof (struct timeout), MDL)); + dmalloc (sizeof (struct timeout), MDL)); if (!q) log_fatal ("add_timeout: no memory!"); } @@ -158,22 +249,76 @@ if (t -> next -> when > q -> when) { q -> next = t -> next; t -> next = q; +#endif return; +#ifdef LIBDHCP + } else if (timeouts[i].when > when) { + pos = i; +#endif } } +#ifdef LIBDHCP + /* If we didn't supersede an existing timeout, then pos is set + * to the timeout which will post after this one. Insert this + * one before it. */ + + new_timeouts = realloc(timeouts, sizeof (t) * (ntimeouts+1)); + /* XXX broken API, no way to return error here */ + if (new_timeouts) { + /* ntimeouts = 10 + * pos = 3; + * n = 10-3 * sizeof (t) = 7 * sizeof (t) + */ + size_t n = (ntimeouts - pos) * sizeof (t); + + timeouts = new_timeouts; + memmove(&timeouts[pos+1], &timeouts[pos], n); + memmove(&timeouts[pos], &t, sizeof (t)); + ntimeouts++; + } +#else /* End of list. */ t -> next = q; q -> next = (struct timeout *)0; +#endif } void cancel_timeout (where, what) void (*where) PROTO ((void *)); void *what; { +#ifdef LIBDHCP + struct timeout t; + int i = 0; +#else struct timeout *t, *q; +#endif /* Look for this timeout on the list, and unlink it if we find it. */ +#ifdef LIBDHCP + for (i = 0; i < ntimeouts; i++) { + struct timeout *new_timeouts, *q = &timeouts[i]; + + if (q->func == where && q->what == what) { + size_t n; + + memmove(&t, q, sizeof (t)); + + n = (ntimeouts - i - 1) * sizeof (t); + memmove(&timeouts[i+1], &timeouts[i], n); + + n = --ntimeouts * sizeof (t); + new_timeouts = realloc(timeouts, n); + /* XXX broken API, no way to return error here */ + if (new_timeouts || !n) + timeouts = new_timeouts; + + if (t.unref) + t.unref(t.what, MDL); + } + } +#else t = (struct timeout *)0; for (q = timeouts; q; q = q -> next) { if (q -> func == where && q -> what == what) { @@ -193,10 +338,15 @@ q -> next = free_timeouts; free_timeouts = q; } +#endif } void cancel_all_timeouts () { +#ifdef LIBDHCP + cur_time = TIME_MAX; + process_outstanding_timeouts(NULL); +#else struct timeout *t, *n; for (t = timeouts; t; t = n) { n = t -> next; @@ -205,13 +355,20 @@ t -> next = free_timeouts; free_timeouts = t; } +#endif } +__attribute__ ((visibility ("default"))) void relinquish_timeouts () { +#ifdef LIBDHCP + while (ntimeouts) + cancel_timeout(timeouts[0].func, timeouts[0].what); +#else struct timeout *t, *n; for (t = free_timeouts; t; t = n) { n = t -> next; dfree (t, MDL); } +#endif } --- dhcp-3.0.5/dst/hmac_link.c.libdhcp4client 2001-02-22 02:22:08.000000000 -0500 +++ dhcp-3.0.5/dst/hmac_link.c 2007-03-30 20:54:06.000000000 -0400 @@ -38,6 +38,10 @@ #include "dst_internal.h" +#ifdef LIBDHCP +extern void* dmalloc(size_t,char *,int); +#endif + #ifdef USE_MD5 # include "md5.h" # ifndef _MD5_H_ @@ -86,7 +90,11 @@ MD5_CTX *ctx = NULL; if (mode & SIG_MODE_INIT) +#ifdef LIBDHCP + ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); +#else ctx = (MD5_CTX *) malloc(sizeof(*ctx)); +#endif else if (context) ctx = (MD5_CTX *) *context; if (ctx == NULL) @@ -153,7 +161,11 @@ MD5_CTX *ctx = NULL; if (mode & SIG_MODE_INIT) +#ifdef LIBDHCP + ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); +#else ctx = (MD5_CTX *) malloc(sizeof(*ctx)); +#endif else if (context) ctx = (MD5_CTX *) *context; if (ctx == NULL) @@ -217,8 +229,11 @@ if (dkey == NULL || key == NULL || keylen < 0) return (-1); - +#ifdef LIBDHCP + if ((hkey = (HMAC_Key *) dmalloc(sizeof(HMAC_Key),__FILE__,__LINE__)) == NULL) +#else if ((hkey = (HMAC_Key *) malloc(sizeof(HMAC_Key))) == NULL) +#endif return (-2); memset(hkey->hk_ipad, 0, sizeof(hkey->hk_ipad)); @@ -347,7 +362,11 @@ if (eol == NULL) return (-4); len = eol - p; +#ifdef LIBDHCP + tmp = dmalloc(len + 2,__FILE__,__LINE__); +#else tmp = malloc(len + 2); +#endif memcpy(tmp, p, len); *(tmp + len) = 0x0; key_len = b64_pton((char *)tmp, key, HMAC_LEN+1); /* see above */ @@ -439,8 +458,11 @@ return(0); len = size > 64 ? 64 : size; +#ifdef LIBDHCP + buff = dmalloc(len+8,__FILE__,__LINE__); +#else buff = malloc(len+8); - +#endif n = dst_random(DST_RAND_SEMI, len, buff); n += dst_random(DST_RAND_KEY, len, buff); if (n <= len) { /* failed getting anything */ @@ -463,7 +485,11 @@ { if (dst_t_func[KEY_HMAC_MD5] != NULL) return (1); +#ifdef LIBDHCP + dst_t_func[KEY_HMAC_MD5] = dmalloc(sizeof(struct dst_func),__FILE__,__LINE__); +#else dst_t_func[KEY_HMAC_MD5] = malloc(sizeof(struct dst_func)); +#endif if (dst_t_func[KEY_HMAC_MD5] == NULL) return (0); memset(dst_t_func[KEY_HMAC_MD5], 0, sizeof(struct dst_func)); --- dhcp-3.0.5/includes/dhcpd.h.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/includes/dhcpd.h 2007-03-30 20:54:06.000000000 -0400 @@ -855,14 +855,6 @@ typedef void (*tvref_t)(void *, void *, const char *, int); typedef void (*tvunref_t)(void *, const char *, int); -struct timeout { - struct timeout *next; - TIME when; - void (*func) PROTO ((void *)); - void *what; - tvref_t ref; - tvunref_t unref; -}; struct protocol { struct protocol *next; @@ -1789,7 +1781,6 @@ struct dhcp_packet *, unsigned, unsigned int, struct iaddr, struct hardware *)); -extern struct timeout *timeouts; extern omapi_object_type_t *dhcp_type_interface; #if defined (TRACING) trace_type_t *interface_trace; --- dhcp-3.0.5/omapip/alloc.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/omapip/alloc.c 2007-03-30 20:54:06.000000000 -0400 @@ -40,6 +40,33 @@ #include +#ifdef LIBDHCP +/* OK, we need a quick and dirty way of freeing all memory used by libdhcp. + All pointers will be stored in a glibc tree on alloc, and removed on free. + This is not too expensive for light single-call library use. +*/ +#include +extern void tdestroy (void *root, void (*free_node)(void *nodep)); +static void *all_pointers=0L; +static int ptr_comparator(const void *p1, const void *p2) { + return ((p1 == p2) ? 0 : ((p1 > p2) ? 1 : -1)); +} + +static void record_pointer(void *ptr) { + tsearch(ptr, &(all_pointers), ptr_comparator); +} + +static void forget_pointer(void *ptr) { + tdelete(ptr, &(all_pointers), ptr_comparator); +} + +void omapi_free_all_pointers(void) { + if (all_pointers != NULL) + tdestroy(all_pointers, free); + all_pointers = NULL; +} +#endif + #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) struct dmalloc_preamble *dmalloc_list; @@ -77,7 +104,9 @@ return (VOIDPTR)0; foo = malloc(len); - +#ifdef LIBDHCP + record_pointer(foo); +#endif if (!foo) return (VOIDPTR)0; bar = (VOIDPTR)(foo + DMDOFFSET); @@ -199,6 +228,9 @@ 0, (unsigned char *)ptr + DMDOFFSET, 0, 1, RC_MALLOC); #endif free (ptr); +#ifdef LIBDHCP + forget_pointer(ptr); +#endif } #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ --- dhcp-3.0.5/omapip/dispatch.c.libdhcp4client 2004-11-24 12:39:17.000000000 -0500 +++ dhcp-3.0.5/omapip/dispatch.c 2007-03-30 20:54:06.000000000 -0400 @@ -34,7 +34,7 @@ #include -static omapi_io_object_t omapi_io_states; +omapi_io_object_t omapi_io_states; TIME cur_time; OMAPI_OBJECT_ALLOC (omapi_io, --- dhcp-3.0.5/omapip/errwarn.c.libdhcp4client 2007-03-30 20:54:06.000000000 -0400 +++ dhcp-3.0.5/omapip/errwarn.c 2007-03-30 20:54:06.000000000 -0400 @@ -39,6 +39,11 @@ #include #include +#ifdef LIBDHCP +#include +extern LIBDHCP_Control *libdhcp_control; +#endif + #ifdef DEBUG int log_perror = -1; #else @@ -48,7 +53,9 @@ void (*log_cleanup) (void); #define CVT_BUF_MAX 1023 +#ifndef LIBDHCP static char mbuf [CVT_BUF_MAX + 1]; +#endif static char fbuf [CVT_BUF_MAX + 1]; /* Log an error message, then exit... */ @@ -58,6 +65,16 @@ va_list list; do_percentm (fbuf, fmt); + +#ifdef LIBDHCP + if (libdhcp_control && (libdhcp_control->eh)) { + va_start (list, fmt); + libdhcp_control->eh(libdhcp_control, LOG_FATAL, fbuf, list); + va_end(list); + libdhcp_control->finished = 1; + return; + } +#else /* %Audit% This is log output. %2004.06.17,Safe% * If we truncate we hope the user can get a hint from the log. @@ -93,6 +110,7 @@ if (log_cleanup) (*log_cleanup) (); exit (1); +#endif } /* Log an error message... */ @@ -103,6 +121,13 @@ do_percentm (fbuf, fmt); +#ifdef LIBDHCP + if (libdhcp_control && libdhcp_control->eh) { + va_start (list, fmt); + libdhcp_control->eh(libdhcp_control, LOG_ERR, fbuf, list); + va_end(list); + } +#else /* %Audit% This is log output. %2004.06.17,Safe% * If we truncate we hope the user can get a hint from the log. */ @@ -120,7 +145,7 @@ if (write (STDERR_FILENO, "\n", 1) <= 0) return 0; } - +#endif return 0; } @@ -132,6 +157,13 @@ do_percentm (fbuf, fmt); +#ifdef LIBDHCP + if (libdhcp_control && libdhcp_control->eh) { + va_start (list, fmt); + libdhcp_control->eh(libdhcp_control, LOG_INFO, fbuf, list); + va_end(list); + } +#else /* %Audit% This is log output. %2004.06.17,Safe% * If we truncate we hope the user can get a hint from the log. */ @@ -149,7 +181,7 @@ if (write (STDERR_FILENO, "\n", 1) <= 0) return 0; } - +#endif return 0; } @@ -160,7 +192,13 @@ va_list list; do_percentm (fbuf, fmt); - +#ifdef LIBDHCP + if (libdhcp_control && libdhcp_control->eh) { + va_start (list, fmt); + libdhcp_control->eh(libdhcp_control, LOG_DEBUG, fbuf, list); + va_end(list); + } +#else /* %Audit% This is log output. %2004.06.17,Safe% * If we truncate we hope the user can get a hint from the log. */ @@ -178,7 +216,7 @@ if (write (STDERR_FILENO, "\n", 1) <= 0) return 0; } - +#endif return 0; } --- dhcp-3.0.5/Makefile.dist.libdhcp4client 2004-06-10 13:59:10.000000000 -0400 +++ dhcp-3.0.5/Makefile.dist 2007-03-30 20:54:06.000000000 -0400 @@ -22,7 +22,7 @@ # http://www.isc.org/ -SUBDIRS= common $(MINIRES) dst omapip server client relay dhcpctl +SUBDIRS= common $(MINIRES) dst omapip server client relay dhcpctl libdhcp4client all: @for dir in ${SUBDIRS}; do \ --- dhcp-3.0.5/configure.libdhcp4client 2004-09-10 17:02:30.000000000 -0400 +++ dhcp-3.0.5/configure 2007-03-30 20:54:06.000000000 -0400 @@ -246,7 +246,7 @@ fi if [ x"$dirs" = x ]; then - dirs=". client server relay common omapip dhcpctl minires dst" + dirs=". client server relay common omapip dhcpctl minires dst libdhcp4client" fi for foo in $dirs; do