diff --git a/dhcp-3.0.5-dhclient-decline-backoff.patch b/dhcp-3.0.5-dhclient-decline-backoff.patch deleted file mode 100644 index 67729f5..0000000 --- a/dhcp-3.0.5-dhclient-decline-backoff.patch +++ /dev/null @@ -1,58 +0,0 @@ ---- dhcp-3.0.5/client/dhclient.c.decline 2007-03-30 15:29:58.000000000 -0400 -+++ dhcp-3.0.5/client/dhclient.c 2007-03-30 15:50:25.000000000 -0400 -@@ -934,6 +934,7 @@ - void *cpp; - { - struct client_state *client = cpp; -+ enum dhcp_state init_state = client->state; - - ASSERT_STATE(state, S_INIT); - -@@ -946,9 +947,16 @@ - client -> first_sending = cur_time; - client -> interval = client -> config -> initial_interval; - -- /* Add an immediate timeout to cause the first DHCPDISCOVER packet -- to go out. */ -- send_discover (client); -+ if (init_state != S_DECLINED) { -+ /* Add an immediate timeout to cause the first DHCPDISCOVER packet -+ to go out. */ -+ send_discover(client); -+ } else { -+ /* We've received an OFFER and it has been DECLINEd by dhclient-script. -+ * wait for a random time between 1 and backoff_cutoff seconds before -+ * trying again. */ -+ add_timeout(cur_time + ((1 + (random() >> 2)) % client->config->backoff_cutoff), send_discover, client, 0, 0); -+ } - } - - /* state_selecting is called when one or more DHCPOFFER packets have been -@@ -1215,6 +1223,7 @@ - send_decline (client); - destroy_client_lease (client -> new); - client -> new = (struct client_lease *)0; -+ client -> state = S_DECLINED; - state_init (client); - return; - } -@@ -3183,6 +3192,7 @@ - case S_INIT: - case S_REBINDING: - case S_STOPPED: -+ case S_DECLINED: - break; - } - client -> state = S_INIT; ---- dhcp-3.0.5/includes/dhcpd.h.decline 2007-03-30 15:30:14.000000000 -0400 -+++ dhcp-3.0.5/includes/dhcpd.h 2007-03-30 15:50:53.000000000 -0400 -@@ -704,7 +704,8 @@ - S_BOUND = 5, - S_RENEWING = 6, - S_REBINDING = 7, -- S_STOPPED = 8 -+ S_STOPPED = 8, -+ S_DECLINED = 9 - }; - - /* Authentication and BOOTP policy possibilities (not all values work diff --git a/dhcp-3.0.5-enable-timeout-functions.patch b/dhcp-3.0.5-enable-timeout-functions.patch deleted file mode 100644 index 3d91d14..0000000 --- a/dhcp-3.0.5-enable-timeout-functions.patch +++ /dev/null @@ -1,15 +0,0 @@ ---- dhcp-3.0.5/common/dispatch.c.ecat 2006-02-22 17:43:27.000000000 -0500 -+++ dhcp-3.0.5/common/dispatch.c 2007-03-30 15:54:15.000000000 -0400 -@@ -195,7 +195,6 @@ - } - } - --#if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) - void cancel_all_timeouts () - { - struct timeout *t, *n; -@@ -216,4 +215,3 @@ - dfree (t, MDL); - } - } --#endif diff --git a/dhcp-3.0.5-errwarn-message.patch b/dhcp-3.0.5-errwarn-message.patch deleted file mode 100644 index c31e1a2..0000000 --- a/dhcp-3.0.5-errwarn-message.patch +++ /dev/null @@ -1,29 +0,0 @@ ---- dhcp-3.0.5/omapip/errwarn.c.message 2007-03-29 15:03:12.000000000 -0400 -+++ dhcp-3.0.5/omapip/errwarn.c 2007-03-29 15:08:50.000000000 -0400 -@@ -80,20 +80,13 @@ - - #if !defined (NOMINUM) - log_error ("%s", ""); -- log_error ("If you did not get this software from ftp.isc.org, please"); -- log_error ("get the latest from ftp.isc.org and install that before"); -- log_error ("requesting help."); -+ log_error ("This version of ISC DHCP is based on the release available"); -+ log_error ("on ftp.isc.org. Features have been added and other changes"); -+ log_error ("have been made to the base software release in order to make"); -+ log_error ("it work better with this distribution."); - log_error ("%s", ""); -- log_error ("If you did get this software from ftp.isc.org and have not"); -- log_error ("yet read the README, please read it before requesting help."); -- log_error ("If you intend to request help from the dhcp-server@isc.org"); -- log_error ("mailing list, please read the section on the README about"); -- log_error ("submitting bug reports and requests for help."); -- log_error ("%s", ""); -- log_error ("Please do not under any circumstances send requests for"); -- log_error ("help directly to the authors of this software - please"); -- log_error ("send them to the appropriate mailing list as described in"); -- log_error ("the README file."); -+ log_error ("Please report for this software via the Red Hat Bugzilla site:"); -+ log_error (" http://bugzilla.redhat.com"); - log_error ("%s", ""); - log_error ("exiting."); - #endif diff --git a/dhcp-3.0.5-failover-ports.patch b/dhcp-3.0.5-failover-ports.patch deleted file mode 100644 index aa0d68f..0000000 --- a/dhcp-3.0.5-failover-ports.patch +++ /dev/null @@ -1,22 +0,0 @@ ---- dhcp-3.0.5/server/confpars.c.failover 2007-03-30 16:28:08.000000000 -0400 -+++ dhcp-3.0.5/server/confpars.c 2007-03-30 16:32:39.000000000 -0400 -@@ -998,10 +998,17 @@ - parse_warn (cfile, "peer address may not be omitted"); - - /* XXX - when/if we get a port number assigned, just set as default */ -+ /* See Red Hat Bugzilla 167292: -+ * we do now: dhcp-failover 647/tcp -+ * dhcp-failover 647/udp -+ * dhcp-failover 847/tcp -+ * dhcp-failover 847/udp -+ * IANA registration by Bernard Volz -+ */ - if (!peer -> me.port) -- parse_warn (cfile, "local port may not be omitted"); -+ peer -> me.port = 647; - if (!peer -> partner.port) -- parse_warn (cfile, "peer port may not be omitted"); -+ peer -> partner.port = 847; - - if (peer -> i_am == primary) { - if (!peer -> hba) { diff --git a/dhcp-3.0.5-release-by-ifup.patch b/dhcp-3.0.5-release-by-ifup.patch deleted file mode 100644 index 2091b42..0000000 --- a/dhcp-3.0.5-release-by-ifup.patch +++ /dev/null @@ -1,84 +0,0 @@ ---- dhcp-3.0.5/client/dhclient.c.release 2007-03-30 15:30:14.000000000 -0400 -+++ dhcp-3.0.5/client/dhclient.c 2007-03-30 15:29:58.000000000 -0400 -@@ -366,9 +366,81 @@ - } - } - fclose(pidfd); -+ } else { -+ /* handle release for interfaces requested with Red Hat -+ * /sbin/ifup - pidfile will be /var/run/dhclient-$interface.pid -+ */ -+ -+ if ((path_dhclient_pid == NULL) || (*path_dhclient_pid == '\0')) -+ path_dhclient_pid = "/var/run/dhclient.pid"; -+ -+ char *new_path_dhclient_pid; -+ struct interface_info *ip; -+ int pdp_len = strlen(path_dhclient_pid), pfx, dpfx; -+ -+ /* find append point: beginning of any trailing '.pid' -+ * or '-$IF.pid' */ -+ for (pfx=pdp_len; (pfx >= 0) && (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--); -+ if (pfx == -1) -+ pfx = pdp_len; -+ -+ if (path_dhclient_pid[pfx] == '/') -+ pfx += 1; -+ -+ for (dpfx=pfx; (dpfx >= 0) && (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--); -+ if ((dpfx > -1) && (path_dhclient_pid[dpfx] != '/')) -+ pfx = dpfx; -+ -+ for (ip = interfaces; ip; ip = ip->next) { -+ if (interfaces_requested && (ip->flags & (INTERFACE_REQUESTED)) && (ip->name != NULL)) { -+ int n_len = strlen(ip->name); -+ -+ new_path_dhclient_pid = (char*) malloc(pfx + n_len + 6); -+ strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx); -+ sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name); -+ -+ if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) { -+ e = fscanf(pidfd, "%ld\n", &temp); -+ oldpid = (pid_t)temp; -+ -+ if (e != 0 && e != EOF) { -+ if (oldpid) { -+ if (kill(oldpid, SIGTERM) == 0) -+ unlink(path_dhclient_pid); -+ } -+ } -+ -+ fclose(pidfd); -+ } -+ -+ free(new_path_dhclient_pid); -+ } -+ } -+ } -+ } else { -+ FILE *pidfp = NULL; -+ long temp = 0; -+ pid_t dhcpid = 0; -+ int dhc_running = 0; -+ char procfn[256] = ""; -+ -+ if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) { -+ if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) { -+ snprintf(procfn,256,"/proc/%u",dhcpid); -+ dhc_running = (access(procfn, F_OK) == 0); -+ } -+ -+ fclose(pidfp); -+ } -+ -+ if (dhc_running) { -+ log_fatal("dhclient(%u) is already running - exiting. ", dhcpid); -+ return(1); - } - } - -+ write_client_pid_file(); -+ - if (!quiet) { - log_info ("%s %s", message, DHCP_VERSION); - log_info (copyright); diff --git a/dhcp-3.0.5-unicast-bootp.patch b/dhcp-3.0.5-unicast-bootp.patch deleted file mode 100644 index dada189..0000000 --- a/dhcp-3.0.5-unicast-bootp.patch +++ /dev/null @@ -1,97 +0,0 @@ ---- dhcp-3.0.5/server/bootp.c.unicast 2005-05-18 15:54:17.000000000 -0400 -+++ dhcp-3.0.5/server/bootp.c 2007-03-30 16:16:00.000000000 -0400 -@@ -62,6 +62,7 @@ - char msgbuf [1024]; - int ignorep; - int peer_has_leases = 0; -+ int norelay = 0; - - if (packet -> raw -> op != BOOTREQUEST) - return; -@@ -77,7 +78,7 @@ - ? inet_ntoa (packet -> raw -> giaddr) - : packet -> interface -> name); - -- if (!locate_network (packet)) { -+ if ((norelay = locate_network (packet)) == 0) { - log_info ("%s: network unknown", msgbuf); - return; - } -@@ -357,6 +358,13 @@ - from, &to, &hto); - goto out; - } -+ } else if (norelay == 2) { -+ to.sin_addr = raw.ciaddr; -+ to.sin_port = remote_port; -+ if (fallback_interface) { -+ result = send_packet (fallback_interface, (struct packet *)0, &raw, outgoing.packet_length, from, &to, &hto); -+ goto out; -+ } - - /* If it comes from a client that already knows its address - and is not requesting a broadcast response, and we can ---- dhcp-3.0.5/server/dhcp.c.unicast 2007-03-30 16:13:36.000000000 -0400 -+++ dhcp-3.0.5/server/dhcp.c 2007-03-30 16:19:35.000000000 -0400 -@@ -3817,6 +3817,7 @@ - struct data_string data; - struct subnet *subnet = (struct subnet *)0; - struct option_cache *oc; -+ int norelay = 0; - - /* See if there's a subnet selection option. */ - oc = lookup_option (&dhcp_universe, packet -> options, -@@ -3826,12 +3827,24 @@ - from the interface, if there is one. If not, fail. */ - if (!oc && !packet -> raw -> giaddr.s_addr) { - if (packet -> interface -> shared_network) { -- shared_network_reference -- (&packet -> shared_network, -- packet -> interface -> shared_network, MDL); -- return 1; -+ struct in_addr any_addr; -+ any_addr.s_addr = INADDR_ANY; -+ -+ if (!packet -> packet_type && memcmp(&packet -> raw -> ciaddr, &any_addr, 4)) { -+ struct iaddr cip; -+ memcpy(cip.iabuf, &packet -> raw -> ciaddr, 4); -+ cip.len = 4; -+ if (!find_grouped_subnet(&subnet, packet->interface->shared_network, cip, MDL)) -+ norelay = 2; -+ } -+ -+ if (!norelay) { -+ shared_network_reference(&packet -> shared_network, packet -> interface -> shared_network, MDL); -+ return 1; -+ } -+ } else { -+ return 0; - } -- return 0; - } - - /* If there's an SSO, and it's valid, use it to figure out the -@@ -3853,7 +3866,10 @@ - data_string_forget (&data, MDL); - } else { - ia.len = 4; -- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4); -+ if (norelay) -+ memcpy (ia.iabuf, &packet->raw->ciaddr, 4); -+ else -+ memcpy (ia.iabuf, &packet->raw->giaddr, 4); - } - - /* If we know the subnet on which the IP address lives, use it. */ -@@ -3861,7 +3877,10 @@ - shared_network_reference (&packet -> shared_network, - subnet -> shared_network, MDL); - subnet_dereference (&subnet, MDL); -- return 1; -+ if (norelay) -+ return norelay; -+ else -+ return 1; - } - - /* Otherwise, fail. */ diff --git a/dhcp-3.0.6-memory.patch b/dhcp-3.0.6-memory.patch deleted file mode 100644 index c08a429..0000000 --- a/dhcp-3.0.6-memory.patch +++ /dev/null @@ -1,37 +0,0 @@ -diff -up dhcp-3.0.6/minires/ns_name.c.memory dhcp-3.0.6/minires/ns_name.c ---- dhcp-3.0.6/minires/ns_name.c.memory 2004-06-10 13:59:40.000000000 -0400 -+++ dhcp-3.0.6/minires/ns_name.c 2007-07-10 11:43:29.000000000 -0400 -@@ -71,6 +71,11 @@ ns_name_ntop(const u_char *src, char *ds - dn = dst; - eom = dst + dstsiz; - -+ if (dn >= eom) { -+ errno = EMSGSIZE; -+ return (-1); -+ } -+ - while ((n = *cp++) != 0) { - if ((n & NS_CMPRSFLGS) != 0) { - /* Some kind of compression pointer. */ -diff -up dhcp-3.0.6/common/packet.c.memory dhcp-3.0.6/common/packet.c ---- dhcp-3.0.6/common/packet.c.memory 2007-05-01 16:42:55.000000000 -0400 -+++ dhcp-3.0.6/common/packet.c 2007-07-10 11:43:29.000000000 -0400 -@@ -140,6 +140,7 @@ void assemble_udp_ip_header (interface, - struct ip ip; - struct udphdr udp; - -+ memset( &ip, '\0', sizeof ip); - /* Fill out the IP header */ - IP_V_SET (&ip, 4); - IP_HL_SET (&ip, 20); -diff -up dhcp-3.0.6/common/lpf.c.memory dhcp-3.0.6/common/lpf.c ---- dhcp-3.0.6/common/lpf.c.memory 2007-07-10 11:43:29.000000000 -0400 -+++ dhcp-3.0.6/common/lpf.c 2007-07-10 11:43:29.000000000 -0400 -@@ -246,6 +246,7 @@ static void lpf_tr_filter_setup (info) - struct interface_info *info; - { - struct sock_fprog p; -+ memset(&p,'\0', sizeof(struct sock_fprog)); - - /* Set up the bpf filter program structure. This is defined in - bpf.c */ diff --git a/dhcp-4.0.0-dhclient-decline-backoff.patch b/dhcp-4.0.0-dhclient-decline-backoff.patch new file mode 100644 index 0000000..34b9a1f --- /dev/null +++ b/dhcp-4.0.0-dhclient-decline-backoff.patch @@ -0,0 +1,60 @@ +diff -up dhcp-4.0.0//client/dhclient.c.backoff dhcp-4.0.0//client/dhclient.c +--- dhcp-4.0.0//client/dhclient.c.backoff 2008-08-01 10:09:17.000000000 -1000 ++++ dhcp-4.0.0//client/dhclient.c 2008-08-01 10:10:10.000000000 -1000 +@@ -1003,6 +1003,7 @@ void state_init (cpp) + void *cpp; + { + struct client_state *client = cpp; ++ enum dhcp_state init_state = client->state; + + ASSERT_STATE(state, S_INIT); + +@@ -1015,9 +1016,16 @@ void state_init (cpp) + client -> first_sending = cur_time; + client -> interval = client -> config -> initial_interval; + +- /* Add an immediate timeout to cause the first DHCPDISCOVER packet +- to go out. */ +- send_discover (client); ++ if (init_state != S_DECLINED) { ++ /* Add an immediate timeout to cause the first DHCPDISCOVER packet ++ to go out. */ ++ send_discover(client); ++ } else { ++ /* We've received an OFFER and it has been DECLINEd by dhclient-script. ++ * wait for a random time between 1 and backoff_cutoff seconds before ++ * trying again. */ ++ add_timeout(cur_time + ((1 + (random() >> 2)) % client->config->backoff_cutoff), send_discover, client, 0, 0); ++ } + } + + /* state_selecting is called when one or more DHCPOFFER packets have been +@@ -1284,6 +1292,7 @@ void bind_lease (client) + send_decline (client); + destroy_client_lease (client -> new); + client -> new = (struct client_lease *)0; ++ client -> state = S_DECLINED; + state_init (client); + return; + } +@@ -3439,6 +3448,7 @@ void client_location_changed () + case S_INIT: + case S_REBINDING: + case S_STOPPED: ++ case S_DECLINED: + break; + } + client -> state = S_INIT; +diff -up dhcp-4.0.0//includes/dhcpd.h.backoff dhcp-4.0.0//includes/dhcpd.h +--- dhcp-4.0.0//includes/dhcpd.h.backoff 2008-08-01 10:09:01.000000000 -1000 ++++ dhcp-4.0.0//includes/dhcpd.h 2008-08-01 10:10:10.000000000 -1000 +@@ -992,7 +992,8 @@ enum dhcp_state { + S_BOUND = 5, + S_RENEWING = 6, + S_REBINDING = 7, +- S_STOPPED = 8 ++ S_STOPPED = 8, ++ S_DECLINED = 9 + }; + + /* Authentication and BOOTP policy possibilities (not all values work diff --git a/dhcp-4.0.0-enable-timeout-functions.patch b/dhcp-4.0.0-enable-timeout-functions.patch new file mode 100644 index 0000000..fb618a8 --- /dev/null +++ b/dhcp-4.0.0-enable-timeout-functions.patch @@ -0,0 +1,16 @@ +diff -up dhcp-4.0.0//common/dispatch.c.timeout dhcp-4.0.0//common/dispatch.c +--- dhcp-4.0.0//common/dispatch.c.timeout 2007-09-05 07:32:10.000000000 -1000 ++++ dhcp-4.0.0//common/dispatch.c 2008-08-01 10:11:35.000000000 -1000 +@@ -190,7 +190,6 @@ void cancel_timeout (where, what) + } + } + +-#if defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) + void cancel_all_timeouts () + { + struct timeout *t, *n; +@@ -211,4 +210,3 @@ void relinquish_timeouts () + dfree (t, MDL); + } + } +-#endif diff --git a/dhcp-4.0.0-errwarn-message.patch b/dhcp-4.0.0-errwarn-message.patch new file mode 100644 index 0000000..073eee8 --- /dev/null +++ b/dhcp-4.0.0-errwarn-message.patch @@ -0,0 +1,30 @@ +diff -up dhcp-4.0.0//omapip/errwarn.c.errwarn dhcp-4.0.0//omapip/errwarn.c +--- dhcp-4.0.0//omapip/errwarn.c.errwarn 2007-07-12 20:43:42.000000000 -1000 ++++ dhcp-4.0.0//omapip/errwarn.c 2008-08-01 10:06:05.000000000 -1000 +@@ -76,20 +76,13 @@ void log_fatal (const char * fmt, ... ) + + #if !defined (NOMINUM) + log_error ("%s", ""); +- log_error ("If you did not get this software from ftp.isc.org, please"); +- log_error ("get the latest from ftp.isc.org and install that before"); +- log_error ("requesting help."); ++ log_error ("This version of ISC DHCP is based on the release available"); ++ log_error ("on ftp.isc.org. Features have been added and other changes"); ++ log_error ("have been made to the base software release in order to make"); ++ log_error ("it work better with this distribution."); + log_error ("%s", ""); +- log_error ("If you did get this software from ftp.isc.org and have not"); +- log_error ("yet read the README, please read it before requesting help."); +- log_error ("If you intend to request help from the dhcp-server@isc.org"); +- log_error ("mailing list, please read the section on the README about"); +- log_error ("submitting bug reports and requests for help."); +- log_error ("%s", ""); +- log_error ("Please do not under any circumstances send requests for"); +- log_error ("help directly to the authors of this software - please"); +- log_error ("send them to the appropriate mailing list as described in"); +- log_error ("the README file."); ++ log_error ("Please report for this software via the Red Hat Bugzilla site:"); ++ log_error (" http://bugzilla.redhat.com"); + log_error ("%s", ""); + log_error ("exiting."); + #endif diff --git a/dhcp-4.0.0-failover-ports.patch b/dhcp-4.0.0-failover-ports.patch new file mode 100644 index 0000000..3b6ba00 --- /dev/null +++ b/dhcp-4.0.0-failover-ports.patch @@ -0,0 +1,23 @@ +diff -up dhcp-4.0.0//server/confpars.c.failover dhcp-4.0.0//server/confpars.c +--- dhcp-4.0.0//server/confpars.c.failover 2008-08-01 10:07:46.000000000 -1000 ++++ dhcp-4.0.0//server/confpars.c 2008-08-01 10:14:03.000000000 -1000 +@@ -1065,10 +1065,17 @@ void parse_failover_peer (cfile, group, + parse_warn (cfile, "peer address may not be omitted"); + + /* XXX - when/if we get a port number assigned, just set as default */ ++ /* See Red Hat Bugzilla 167292: ++ * we do now: dhcp-failover 647/tcp ++ * dhcp-failover 647/udp ++ * dhcp-failover 847/tcp ++ * dhcp-failover 847/udp ++ * IANA registration by Bernard Volz ++ */ + if (!peer -> me.port) +- parse_warn (cfile, "local port may not be omitted"); ++ peer -> me.port = 647; + if (!peer -> partner.port) +- parse_warn (cfile, "peer port may not be omitted"); ++ peer -> partner.port = 847; + + if (peer -> i_am == primary) { + if (!peer -> hba) { diff --git a/dhcp-4.0.0-fast-timeout.patch b/dhcp-4.0.0-fast-timeout.patch index 90a0658..3085c55 100644 --- a/dhcp-4.0.0-fast-timeout.patch +++ b/dhcp-4.0.0-fast-timeout.patch @@ -1,7 +1,7 @@ -diff -up dhcp-4.0.0/client/dhclient.c.fast dhcp-4.0.0/client/dhclient.c ---- dhcp-4.0.0/client/dhclient.c.fast 2007-12-29 06:07:14.000000000 -1000 -+++ dhcp-4.0.0/client/dhclient.c 2007-12-29 06:08:07.000000000 -1000 -@@ -3624,10 +3624,7 @@ isc_result_t dhclient_interface_startup_ +diff -up dhcp-4.0.0//client/dhclient.c.fast_timeout dhcp-4.0.0//client/dhclient.c +--- dhcp-4.0.0//client/dhclient.c.fast_timeout 2008-08-01 10:10:10.000000000 -1000 ++++ dhcp-4.0.0//client/dhclient.c 2008-08-01 10:13:37.000000000 -1000 +@@ -3613,10 +3613,7 @@ isc_result_t dhclient_interface_startup_ ip -> flags |= INTERFACE_RUNNING; for (client = ip -> client; client; client = client -> next) { client -> state = S_INIT; diff --git a/dhcp-4.0.0-inherit-leases.patch b/dhcp-4.0.0-inherit-leases.patch new file mode 100644 index 0000000..b2d3593 --- /dev/null +++ b/dhcp-4.0.0-inherit-leases.patch @@ -0,0 +1,19 @@ +diff -up dhcp-4.0.0//client/dhclient.c.inherit dhcp-4.0.0//client/dhclient.c +--- dhcp-4.0.0//client/dhclient.c.inherit 2008-08-01 09:49:36.000000000 -1000 ++++ dhcp-4.0.0//client/dhclient.c 2008-08-01 09:53:28.000000000 -1000 +@@ -2393,6 +2393,15 @@ void send_request (cpp) + /* Now do a preinit on the interface so that we can + discover a new address. */ + script_init (client, "PREINIT", (struct string_list *)0); ++ /* Has an active lease */ ++ if (client -> active && ++ client -> active -> is_bootp && ++ client -> active -> expiry > cur_time && ++ primary_address.s_addr != 0 && ++ client -> active -> address.len == 4 && ++ memcpy (client -> active -> address.iabuf, &primary_address, 4) == 0) ++ client_envadd (client, "", "keep_old_ip", "%s", "yes"); ++ + if (client -> alias) + script_write_params (client, "alias_", + client -> alias); diff --git a/dhcp-4.0.0-libdhcp4client.patch b/dhcp-4.0.0-libdhcp4client.patch index dcbefe1..324a68f 100644 --- a/dhcp-4.0.0-libdhcp4client.patch +++ b/dhcp-4.0.0-libdhcp4client.patch @@ -1,373 +1,438 @@ -diff -up dhcp-4.0.0/configure.ac.libdhcp4client dhcp-4.0.0/configure.ac ---- dhcp-4.0.0/configure.ac.libdhcp4client 2007-12-14 08:24:56.000000000 -1000 -+++ dhcp-4.0.0/configure.ac 2008-01-22 17:04:28.000000000 -1000 -@@ -1,5 +1,32 @@ - AC_INIT([DHCP], [4.0.0], [dhcp-users@isc.org]) +diff -up dhcp-4.0.0//client/Makefile.am.libdhcp4client dhcp-4.0.0//client/Makefile.am +--- dhcp-4.0.0//client/Makefile.am.libdhcp4client 2007-12-12 09:23:42.000000000 -1000 ++++ dhcp-4.0.0//client/Makefile.am 2008-08-01 10:17:46.000000000 -1000 +@@ -1,10 +1,18 @@ + dist_sysconf_DATA = dhclient.conf + sbin_PROGRAMS = dhclient ++lib_LTLIBRARIES = libdhcp4client.la + dhclient_SOURCES = clparse.c dhclient.c dhc6.c \ + scripts/bsdos scripts/freebsd scripts/linux scripts/netbsd \ + scripts/nextstep scripts/openbsd scripts/solaris + dhclient_LDADD = ../common/libdhcp.a ../minires/libres.a \ + ../omapip/libomapi.a ../dst/libdst.a ++libdhcp4client_la_CFLAGS = -DLIBDHCP -DLOCALSTATEDIR='"@localstatedir@"' ++libdhcp4client_la_LDFLAGS = -version-info \ ++ $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ ++ -release $(LT_RELEASE) ++libdhcp4client_la_SOURCES = clparse.c dhclient.c dhc6.c ++libdhcp4client_la_LIBADD = ../common/libdhcpLIBDHCP.a ../minires/libres.a \ ++ ../omapip/libomapiLIBDHCP.a ../dst/libdstLIBDHCP.a + man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5 + EXTRA_DIST = $(man_MANS) -+dnl Versioning -+dnl (from glib's configure.in ...) -+dnl Making releases: -+dnl DHCP_MICRO_VERSION += 1; -+dnl DHCP_INTERFACE_AGE += 1; -+dnl DHCP_BINARY_AGE += 1; -+dnl if any functions have been added, set DHCP_INTERFACE_AGE to 0. -+dnl if backwards compatibility has been broken (e.g., functions removed, -+dnl function signatures changed), -+dnl set DHCP_BINARY_AGE and DHCP_INTERFACE_AGE to 0. -+DHCP_MAJOR_VERSION=4 -+DHCP_MINOR_VERSION=0 -+DHCP_MICRO_VERSION=0 -+DHCP_INTERFACE_AGE=0 -+DHCP_BINARY_AGE=0 -+DHCP_VERSION_SUFFIX= -+DHCP_VERSION=$DHCP_MAJOR_VERSION.$DHCP_MINOR_VERSION.$DHCP_MICRO_VERSION$DHCP_VERSION_SUFFIX -+ -+LT_RELEASE=$DHCP_MAJOR_VERSION.$DHCP_MINOR_VERSION -+LT_CURRENT=`expr $DHCP_MICRO_VERSION - $DHCP_INTERFACE_AGE` -+LT_REVISION=$DHCP_INTERFACE_AGE -+AC_SUBST(DHCP_VERSION) -+AC_SUBST(LT_RELEASE) -+AC_SUBST(LT_CURRENT) -+AC_SUBST(LT_REVISION) -+AC_SUBST(LT_AGE) -+ - # we specify "foreign" to avoid having to have the GNU mandated files, - # like AUTHORS, COPYING, and such - AM_INIT_AUTOMAKE([foreign]) -@@ -20,7 +47,8 @@ if test "$GCC" = "yes"; then - fi - fi +diff -up dhcp-4.0.0//client/dhclient.c.libdhcp4client dhcp-4.0.0//client/dhclient.c +--- dhcp-4.0.0//client/dhclient.c.libdhcp4client 2008-08-01 10:17:46.000000000 -1000 ++++ dhcp-4.0.0//client/dhclient.c 2008-08-01 10:17:46.000000000 -1000 +@@ -83,14 +83,50 @@ int nowait=0; + char *mockup_relay = NULL; + int bootp_broadcast_always = 0; --AC_PROG_RANLIB -+AC_PROG_LIBTOOL ++#ifdef LIBDHCP ++FILE *leaseFile = NULL; ++#endif + - AC_CONFIG_HEADERS([includes/config.h]) + extern u_int32_t default_requested_options[]; - # we sometimes need to know byte order for building packets -diff -up dhcp-4.0.0/omapip/Makefile.am.libdhcp4client dhcp-4.0.0/omapip/Makefile.am ---- dhcp-4.0.0/omapip/Makefile.am.libdhcp4client 2007-05-29 06:32:11.000000000 -1000 -+++ dhcp-4.0.0/omapip/Makefile.am 2008-01-22 17:04:28.000000000 -1000 -@@ -1,10 +1,18 @@ - lib_LIBRARIES = libomapi.a -+noinst_LIBRARIES = libomapiLIBDHCP.a - noinst_PROGRAMS = svtest + static void usage PROTO ((void)); - libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \ - errwarn.c listener.c dispatch.c generic.c support.c \ - handle.c message.c convert.c hash.c auth.c inet_addr.c \ - array.c trace.c mrtrace.c toisc.c iscprint.c + static isc_result_t write_duid(struct data_string *duid); + +-int +-main(int argc, char **argv) { ++#ifdef LIBDHCP ++#include "isc-dhcp/libdhcp_control.h" ++LIBDHCP_Control *libdhcp_control; ++static void libdhcp_dispatch(void) ++{ ++ struct timeval tv = { 0, 0 }, *tvp; ++ isc_result_t status; + -+libomapiLIBDHCP_a_CFLAGS = -DLIBDHCP -+libomapiLIBDHCP_a_SOURCES = alloc.c array.c auth.c buffer.c connection.c \ -+ convert.c dispatch.c errwarn.c handle.c hash.c listener.c \ -+ mrtrace.c result.c support.c toisc.c trace.c generic.c message.c \ -+ protocol.c ++ /* Wait for a packet, or a timeout, or libdhcp being finished */ ++ do { ++ tvp = process_outstanding_timeouts(&tv); ++ status = omapi_one_dispatch(0, tvp); + - man_MANS = omapi.3 - EXTRA_DIST = $(man_MANS) - -diff -up dhcp-4.0.0/omapip/dispatch.c.libdhcp4client dhcp-4.0.0/omapip/dispatch.c ---- dhcp-4.0.0/omapip/dispatch.c.libdhcp4client 2007-11-30 11:51:43.000000000 -1000 -+++ dhcp-4.0.0/omapip/dispatch.c 2008-01-22 17:04:28.000000000 -1000 -@@ -37,7 +37,7 @@ - #include - #include - --static omapi_io_object_t omapi_io_states; -+omapi_io_object_t omapi_io_states; - time_t cur_time; - - OMAPI_OBJECT_ALLOC (omapi_io, -diff -up dhcp-4.0.0/omapip/errwarn.c.libdhcp4client dhcp-4.0.0/omapip/errwarn.c ---- dhcp-4.0.0/omapip/errwarn.c.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 -+++ dhcp-4.0.0/omapip/errwarn.c 2008-01-22 17:04:28.000000000 -1000 -@@ -37,6 +37,11 @@ - #include - #include - ++ 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_Control *libdhcp_ctl, int argc, char **argv, ++ char **envp) ++#else ++int main(int argc, char **argv, char **envp) ++#endif ++{ +#ifdef LIBDHCP -+#include -+extern LIBDHCP_Control *libdhcp_control; ++ libdhcp_control = libdhcp_ctl; +#endif -+ - #ifdef DEBUG - int log_perror = -1; - #else -@@ -46,7 +51,9 @@ int log_priority; - void (*log_cleanup) (void); + int fd; + int i; + struct interface_info *ip; +@@ -122,6 +158,7 @@ main(int argc, char **argv) { + /* Initialize client globals. */ + memset(&default_duid, 0, sizeof(default_duid)); - #define CVT_BUF_MAX 1023 +#ifndef LIBDHCP - static char mbuf [CVT_BUF_MAX + 1]; + /* Make sure that file descriptors 0 (stdin), 1, (stdout), and + 2 (stderr) are open. To do this, we assume that when we + open a file the lowest available file descriptor is used. */ +@@ -140,6 +177,7 @@ main(int argc, char **argv) { + #if !(defined (DEBUG) || defined (__CYGWIN32__)) + setlogmask (LOG_UPTO (LOG_INFO)); + #endif +#endif - static char fbuf [CVT_BUF_MAX + 1]; - /* Log an error message, then exit... */ -@@ -56,6 +63,16 @@ void log_fatal (const char * fmt, ... ) - va_list list; + /* Set up the OMAPI. */ + status = omapi_init (); +@@ -485,8 +523,12 @@ main(int argc, char **argv) { + } + } - 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. -@@ -89,6 +106,7 @@ void log_fatal (const char * fmt, ... ) - if (log_cleanup) - (*log_cleanup) (); - exit (1); ++ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE)) +#endif - } + write_client_pid_file(); - /* Log an error message... */ -@@ -99,6 +117,13 @@ int log_error (const char * fmt, ...) ++#ifndef LIBDHCP + if (!quiet) { + log_info ("%s %s", message, PACKAGE_VERSION); + log_info (copyright); +@@ -497,6 +539,7 @@ main(int argc, char **argv) { + log_perror = 0; + quiet_interface_discovery = 1; + } ++#endif - do_percentm (fbuf, fmt); + /* If we're given a relay agent address to insert, for testing + purposes, figure out what it is. */ +@@ -702,11 +745,17 @@ main(int argc, char **argv) { + arg_conf_len = 0; + } +#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. - */ -@@ -114,7 +139,7 @@ int log_error (const char * fmt, ...) - write (STDERR_FILENO, mbuf, strlen (mbuf)); - write (STDERR_FILENO, "\n", 1); - } -- ++ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) { +#endif - return 0; - } - -@@ -126,6 +151,13 @@ int log_info (const char *fmt, ...) - - do_percentm (fbuf, fmt); + /* Parse the lease database. */ + read_client_leases (); + /* Rewrite the lease database... */ + rewrite_client_leases (); +#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. - */ -@@ -141,7 +173,7 @@ int log_info (const char *fmt, ...) - write (STDERR_FILENO, mbuf, strlen (mbuf)); - write (STDERR_FILENO, "\n", 1); - } -- ++ } +#endif - return 0; - } -@@ -152,7 +184,13 @@ int log_debug (const char *fmt, ...) - va_list list; + /* XXX */ + /* config_counter(&snd_counter, &rcv_counter); */ +@@ -725,7 +774,7 @@ main(int argc, char **argv) { + if (!persist) { + /* Nothing more to do. */ + log_info ("No broadcast interfaces found - exiting."); +- exit (0); ++ return (0); + } + } else if (!release_mode && !exit_mode) { + /* Call the script with the list of interfaces. */ +@@ -863,6 +912,7 @@ main(int argc, char **argv) { + dmalloc_outstanding = 0; + #endif - 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. - */ -@@ -168,7 +206,7 @@ int log_debug (const char *fmt, ...) - write (STDERR_FILENO, mbuf, strlen (mbuf)); - write (STDERR_FILENO, "\n", 1); - } -- -+#endif - return 0; - } - -diff -up dhcp-4.0.0/omapip/alloc.c.libdhcp4client dhcp-4.0.0/omapip/alloc.c ---- dhcp-4.0.0/omapip/alloc.c.libdhcp4client 2007-07-12 20:43:42.000000000 -1000 -+++ dhcp-4.0.0/omapip/alloc.c 2008-01-22 17:04:28.000000000 -1000 -@@ -37,6 +37,33 @@ - - #include ++#ifndef LIBDHCP + /* If we're not supposed to wait before getting the address, + don't. */ + if (nowait) +@@ -875,6 +925,132 @@ main(int argc, char **argv) { -+#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)); -+} + /* Start dispatching packets and timeouts... */ + dispatch (); ++#else ++ if (libdhcp_control) { ++ if (libdhcp_control->timeout) ++ libdhcp_control->now = time(NULL); ++ else ++ libdhcp_control->now = 0; ++ } + -+static void record_pointer(void *ptr) { -+ tsearch(ptr, &(all_pointers), ptr_comparator); -+} ++ libdhcp_dispatch(); + -+static void forget_pointer(void *ptr) { -+ tdelete(ptr, &(all_pointers), ptr_comparator); -+} ++ /* libdhcp is finished with us. */ + -+void omapi_free_all_pointers(void) { -+ if (all_pointers != NULL) -+ tdestroy(all_pointers, free); -+ all_pointers = NULL; -+} -+#endif ++ /* close all file descriptors: */ ++ for (ip = interfaces; ip; ip = ip->next) { ++ shutdown(ip->wfdesc, SHUT_RDWR); ++ close(ip->wfdesc); + - #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) - struct dmalloc_preamble *dmalloc_list; -@@ -72,7 +99,9 @@ dmalloc(unsigned size, const char *file, - return NULL; ++ 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; ++ 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; ++ 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(&dhcpv6_universe, '\0', sizeof(struct universe)); ++ memset(&nwip_universe, '\0', sizeof(struct universe)); ++ memset(&fqdn_universe, '\0', sizeof(struct universe)); ++ memset(&vendor_class_universe, '\0', sizeof(struct universe)); ++ memset(&vendor_universe, '\0', sizeof(struct universe)); ++ memset(&vsio_universe, '\0', sizeof(struct universe)); ++ memset(&isc_universe, '\0', sizeof(struct universe)); ++ memset(&isc6_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; +@@ -1270,7 +1446,20 @@ void dhcpack (packet) + if (client -> new -> rebind < cur_time) + client -> new -> rebind = TIME_MAX; - foo = malloc(len); -- +#ifdef LIBDHCP -+ record_pointer(foo); ++ /* 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 - if (!foo) - return NULL; - bar = (void *)(foo + DMDOFFSET); -@@ -191,6 +220,9 @@ dfree(void *ptr, const char *file, int l - 0, (unsigned char *)ptr + DMDOFFSET, 0, 1, RC_MALLOC); - #endif - free (ptr); ++ + bind_lease (client); ++ +#ifdef LIBDHCP -+ forget_pointer(ptr); ++ client->packet.siaddr.s_addr = set_siaddr; +#endif } - #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ -diff -up dhcp-4.0.0/dst/Makefile.am.libdhcp4client dhcp-4.0.0/dst/Makefile.am ---- dhcp-4.0.0/dst/Makefile.am.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 -+++ dhcp-4.0.0/dst/Makefile.am 2008-01-22 17:04:28.000000000 -1000 -@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DMINIRES_LIB -DHMAC_MD5 - - lib_LIBRARIES = libdst.a - --noinst_LIBRARIES = libdstnomd5.a -+noinst_LIBRARIES = libdstnomd5.a libdstLIBDHCP.a + void bind_lease (client) +@@ -1306,6 +1495,9 @@ void bind_lease (client) + return; + } - libdst_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \ - base64.c prandom.c -@@ -10,4 +10,8 @@ libdst_a_SOURCES = dst_support.c dst_api - libdstnomd5_a_SOURCES = dst_support.c dst_api.c hmac_link.c \ - base64.c prandom.c ++#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); -+libdstLIBDHCP_a_CFLAGS = -DLIBDHCP -+libdstLIBDHCP_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \ -+ base64.c prandom.c -+ - EXTRA_DIST = dst_internal.h md5.h md5_locl.h -diff -up dhcp-4.0.0/dst/hmac_link.c.libdhcp4client dhcp-4.0.0/dst/hmac_link.c ---- dhcp-4.0.0/dst/hmac_link.c.libdhcp4client 2007-12-05 14:50:22.000000000 -1000 -+++ dhcp-4.0.0/dst/hmac_link.c 2008-01-22 17:04:28.000000000 -1000 -@@ -39,6 +39,10 @@ static const char rcsid[] = "$Header: /p +@@ -1398,10 +1590,12 @@ void state_stop (cpp) + } + } - #include "dst_internal.h" ++#ifndef LIBDHCP + int commit_leases () + { + return 0; + } ++#endif + int write_lease (lease) + struct lease *lease; +@@ -2074,6 +2268,10 @@ void state_panic (cpp) + tell the shell script that we failed to allocate an address, + and try again later. */ + if (onetry) { +#ifdef LIBDHCP -+extern void* dmalloc(size_t,char *,int); ++ script_init (client, "FAIL", (struct string_list *)0); ++ return; +#endif -+ - #ifdef USE_MD5 - # include "md5.h" - # ifndef _MD5_H_ -@@ -87,7 +91,11 @@ dst_hmac_md5_sign(const int mode, DST_KE - MD5_CTX *ctx = NULL; + if (!quiet) + log_info ("Unable to obtain a lease on first try.%s", + " Exiting."); +@@ -2691,7 +2889,9 @@ void destroy_client_lease (lease) + free_client_lease (lease, MDL); + } - if (mode & SIG_MODE_INIT) -+#ifdef LIBDHCP -+ ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); -+#else - ctx = (MD5_CTX *) malloc(sizeof(*ctx)); ++#ifndef LIBDHCP + FILE *leaseFile = NULL; +#endif - else if (context) - ctx = (MD5_CTX *) *context; - if (ctx == NULL) -@@ -154,7 +162,11 @@ dst_hmac_md5_verify(const int mode, DST_ - MD5_CTX *ctx = NULL; + int leases_written = 0; - if (mode & SIG_MODE_INIT) + void rewrite_client_leases () +@@ -3235,6 +3435,54 @@ void script_write_params (client, prefix + int script_go (client) + struct client_state *client; + { +#ifdef LIBDHCP -+ ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); ++ 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 - ctx = (MD5_CTX *) malloc(sizeof(*ctx)); + char *scriptName; + char *argv [2]; + char **envp; +@@ -3311,6 +3559,7 @@ int script_go (client) + time(&cur_time); + return (WIFEXITED (wstatus) ? + WEXITSTATUS (wstatus) : -WTERMSIG (wstatus)); +#endif - else if (context) - ctx = (MD5_CTX *) *context; - if (ctx == NULL) -@@ -218,8 +230,11 @@ dst_buffer_to_hmac_md5(DST_KEY *dkey, co + } - 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); + void client_envadd (struct client_state *client, +@@ -3393,6 +3642,9 @@ void go_daemon () - memset(hkey->hk_ipad, 0, sizeof(hkey->hk_ipad)); -@@ -348,7 +363,11 @@ dst_hmac_md5_key_from_file_format(DST_KE - 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 */ -@@ -440,8 +459,11 @@ dst_hmac_md5_generate_key(DST_KEY *key, - return(0); - - len = size > 64 ? 64 : size; + /* Don't become a daemon if the user requested otherwise. */ + if (no_daemon) { +#ifdef LIBDHCP -+ buff = dmalloc(len+8,__FILE__,__LINE__); -+#else - buff = malloc(len+8); -- ++ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE)) +#endif - n = dst_random(DST_RAND_SEMI, len, buff); - n += dst_random(DST_RAND_KEY, len, buff); - if (n <= len) { /* failed getting anything */ -@@ -464,7 +486,11 @@ dst_hmac_md5_init() - { - if (dst_t_func[KEY_HMAC_MD5] != NULL) - return (1); + write_client_pid_file (); + return; + } +@@ -3402,6 +3654,10 @@ void go_daemon () + return; + state = 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)); ++ return; +#endif - if (dst_t_func[KEY_HMAC_MD5] == NULL) - return (0); - memset(dst_t_func[KEY_HMAC_MD5], 0, sizeof(struct dst_func)); -diff -up dhcp-4.0.0/common/Makefile.am.libdhcp4client dhcp-4.0.0/common/Makefile.am ---- dhcp-4.0.0/common/Makefile.am.libdhcp4client 2007-11-16 01:04:11.000000000 -1000 -+++ dhcp-4.0.0/common/Makefile.am 2008-01-22 17:04:28.000000000 -1000 ++ + /* Stop logging to stderr... */ + log_perror = 0; + +diff -up dhcp-4.0.0//common/Makefile.am.libdhcp4client dhcp-4.0.0//common/Makefile.am +--- dhcp-4.0.0//common/Makefile.am.libdhcp4client 2007-11-16 01:04:11.000000000 -1000 ++++ dhcp-4.0.0//common/Makefile.am 2008-08-01 10:17:46.000000000 -1000 @@ -1,11 +1,17 @@ AM_CPPFLAGS = -I.. -DLOCALSTATEDIR='"@localstatedir@"' @@ -387,9 +452,24 @@ diff -up dhcp-4.0.0/common/Makefile.am.libdhcp4client dhcp-4.0.0/common/Makefile man_MANS = dhcp-eval.5 dhcp-options.5 EXTRA_DIST = $(man_MANS) -diff -up dhcp-4.0.0/common/discover.c.libdhcp4client dhcp-4.0.0/common/discover.c ---- dhcp-4.0.0/common/discover.c.libdhcp4client 2007-10-05 12:29:51.000000000 -1000 -+++ dhcp-4.0.0/common/discover.c 2008-01-22 17:04:28.000000000 -1000 +diff -up dhcp-4.0.0//common/alloc.c.libdhcp4client dhcp-4.0.0//common/alloc.c +--- dhcp-4.0.0//common/alloc.c.libdhcp4client 2007-10-23 14:54:11.000000000 -1000 ++++ dhcp-4.0.0//common/alloc.c 2008-08-01 10:17:46.000000000 -1000 +@@ -1004,7 +1004,11 @@ int executable_statement_reference (ptr, + 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) +diff -up dhcp-4.0.0//common/discover.c.libdhcp4client dhcp-4.0.0//common/discover.c +--- dhcp-4.0.0//common/discover.c.libdhcp4client 2007-10-05 12:29:51.000000000 -1000 ++++ dhcp-4.0.0//common/discover.c 2008-08-01 10:17:46.000000000 -1000 @@ -883,6 +883,10 @@ add_ipv6_addr_to_interface(struct interf register that interface with the network I/O software, figure out what subnet it's on, and add it to the list of interfaces. */ @@ -429,40 +509,9 @@ diff -up dhcp-4.0.0/common/discover.c.libdhcp4client dhcp-4.0.0/common/discover. #if defined (F_SETFD) if (fallback_interface) { -diff -up dhcp-4.0.0/common/tree.c.libdhcp4client dhcp-4.0.0/common/tree.c ---- dhcp-4.0.0/common/tree.c.libdhcp4client 2007-08-22 03:41:37.000000000 -1000 -+++ dhcp-4.0.0/common/tree.c 2008-01-22 17:04:28.000000000 -1000 -@@ -41,7 +41,7 @@ - # include - #endif - --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 *)); -@@ -2859,6 +2859,7 @@ int evaluate_numeric_expression (result, - 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; -diff -up dhcp-4.0.0/common/options.c.libdhcp4client dhcp-4.0.0/common/options.c ---- dhcp-4.0.0/common/options.c.libdhcp4client 2007-11-30 11:51:43.000000000 -1000 -+++ dhcp-4.0.0/common/options.c 2008-01-22 17:04:28.000000000 -1000 -@@ -3392,6 +3392,7 @@ fqdn6_universe_decode(struct option_stat - return 0; - } - -+__attribute__ ((visibility ("default"))) - void option_space_foreach (struct packet *packet, struct lease *lease, - struct client_state *client_state, - struct option_state *in_options, -diff -up dhcp-4.0.0/common/dispatch.c.libdhcp4client dhcp-4.0.0/common/dispatch.c ---- dhcp-4.0.0/common/dispatch.c.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 -+++ dhcp-4.0.0/common/dispatch.c 2008-01-22 17:04:28.000000000 -1000 +diff -up dhcp-4.0.0//common/dispatch.c.libdhcp4client dhcp-4.0.0//common/dispatch.c +--- dhcp-4.0.0//common/dispatch.c.libdhcp4client 2008-08-01 10:17:45.000000000 -1000 ++++ dhcp-4.0.0//common/dispatch.c 2008-08-01 10:17:46.000000000 -1000 @@ -34,8 +34,24 @@ #include "dhcpd.h" @@ -732,495 +781,446 @@ diff -up dhcp-4.0.0/common/dispatch.c.libdhcp4client dhcp-4.0.0/common/dispatch. } +#endif } -diff -up dhcp-4.0.0/common/alloc.c.libdhcp4client dhcp-4.0.0/common/alloc.c ---- dhcp-4.0.0/common/alloc.c.libdhcp4client 2007-10-23 14:54:11.000000000 -1000 -+++ dhcp-4.0.0/common/alloc.c 2008-01-22 17:04:28.000000000 -1000 -@@ -1004,7 +1004,11 @@ int executable_statement_reference (ptr, - return 1; +diff -up dhcp-4.0.0//common/options.c.libdhcp4client dhcp-4.0.0//common/options.c +--- dhcp-4.0.0//common/options.c.libdhcp4client 2007-11-30 11:51:43.000000000 -1000 ++++ dhcp-4.0.0//common/options.c 2008-08-01 10:17:46.000000000 -1000 +@@ -3392,6 +3392,7 @@ fqdn6_universe_decode(struct option_stat + return 0; } -+#ifdef LIBDHCP -+struct packet *free_packets; -+#else - static struct packet *free_packets; -+#endif - - #if defined (DEBUG_MEMORY_LEAKAGE) || \ - defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) -diff -up dhcp-4.0.0/includes/dhcpd.h.libdhcp4client dhcp-4.0.0/includes/dhcpd.h ---- dhcp-4.0.0/includes/dhcpd.h.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 -+++ dhcp-4.0.0/includes/dhcpd.h 2008-01-22 17:05:02.000000000 -1000 -@@ -1199,14 +1199,6 @@ struct hardware_link { ++__attribute__ ((visibility ("default"))) + void option_space_foreach (struct packet *packet, struct lease *lease, + struct client_state *client_state, + struct option_state *in_options, +diff -up dhcp-4.0.0//common/tree.c.libdhcp4client dhcp-4.0.0//common/tree.c +--- dhcp-4.0.0//common/tree.c.libdhcp4client 2007-08-22 03:41:37.000000000 -1000 ++++ dhcp-4.0.0//common/tree.c 2008-08-01 10:17:46.000000000 -1000 +@@ -41,7 +41,7 @@ + # include + #endif - 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 binding_scope *global_scope; ++struct binding_scope __attribute__ ((visibility ("default"))) *global_scope; - struct protocol { - struct protocol *next; -@@ -1664,7 +1656,6 @@ extern const char *path_dhcpd_pid; + static int do_host_lookup PROTO ((struct data_string *, + struct dns_host_entry *)); +@@ -2859,6 +2859,7 @@ int evaluate_numeric_expression (result, + result of that evaluation. There should never be both an expression + and a valid data_string. */ - extern int dhcp_max_agent_option_packet_length; ++__attribute__ ((visibility ("default"))) + int evaluate_option_cache (result, packet, lease, client_state, + in_options, cfg_options, scope, oc, file, line) + struct data_string *result; +diff -up dhcp-4.0.0//configure.ac.libdhcp4client dhcp-4.0.0//configure.ac +--- dhcp-4.0.0//configure.ac.libdhcp4client 2007-12-14 08:24:56.000000000 -1000 ++++ dhcp-4.0.0//configure.ac 2008-08-01 10:17:46.000000000 -1000 +@@ -1,5 +1,32 @@ + AC_INIT([DHCP], [4.0.0], [dhcp-users@isc.org]) --int main(int, char **); - void postconf_initialization(int); - void postdb_startup(void); - void cleanup PROTO ((void)); -@@ -2337,7 +2328,6 @@ extern void (*bootp_packet_handler) PROT - extern void (*dhcpv6_packet_handler)(struct interface_info *, - const char *, int, - int, const struct iaddr *, isc_boolean_t); --extern struct timeout *timeouts; - extern omapi_object_type_t *dhcp_type_interface; - #if defined (TRACING) - extern trace_type_t *interface_trace; -@@ -2392,6 +2382,10 @@ extern struct universe dhcpv6_universe; - extern struct universe nwip_universe; - extern struct universe fqdn_universe; - extern struct universe vsio_universe; -+extern struct universe vendor_class_universe; -+extern struct universe vendor_universe; -+extern struct universe isc_universe; -+extern struct universe isc6_universe; - extern int dhcp_option_default_priority_list []; - extern int dhcp_option_default_priority_list_count; - extern const char *hardware_types [256]; -diff -up dhcp-4.0.0/client/Makefile.am.libdhcp4client dhcp-4.0.0/client/Makefile.am ---- dhcp-4.0.0/client/Makefile.am.libdhcp4client 2007-12-12 09:23:42.000000000 -1000 -+++ dhcp-4.0.0/client/Makefile.am 2008-01-22 17:04:28.000000000 -1000 -@@ -1,10 +1,18 @@ - dist_sysconf_DATA = dhclient.conf - sbin_PROGRAMS = dhclient -+lib_LTLIBRARIES = libdhcp4client.la - dhclient_SOURCES = clparse.c dhclient.c dhc6.c \ - scripts/bsdos scripts/freebsd scripts/linux scripts/netbsd \ - scripts/nextstep scripts/openbsd scripts/solaris - dhclient_LDADD = ../common/libdhcp.a ../minires/libres.a \ - ../omapip/libomapi.a ../dst/libdst.a -+libdhcp4client_la_CFLAGS = -DLIBDHCP -DLOCALSTATEDIR='"@localstatedir@"' -+libdhcp4client_la_LDFLAGS = -version-info \ -+ $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -+ -release $(LT_RELEASE) -+libdhcp4client_la_SOURCES = clparse.c dhclient.c dhc6.c -+libdhcp4client_la_LIBADD = ../common/libdhcpLIBDHCP.a ../minires/libres.a \ -+ ../omapip/libomapiLIBDHCP.a ../dst/libdstLIBDHCP.a - man_MANS = dhclient.8 dhclient-script.8 dhclient.conf.5 dhclient.leases.5 - EXTRA_DIST = $(man_MANS) - -diff -up dhcp-4.0.0/client/dhclient.c.libdhcp4client dhcp-4.0.0/client/dhclient.c ---- dhcp-4.0.0/client/dhclient.c.libdhcp4client 2008-01-22 17:04:28.000000000 -1000 -+++ dhcp-4.0.0/client/dhclient.c 2008-01-22 17:05:47.000000000 -1000 -@@ -83,14 +83,50 @@ int nowait=0; - char *mockup_relay = NULL; - int bootp_broadcast_always = 0; ++dnl Versioning ++dnl (from glib's configure.in ...) ++dnl Making releases: ++dnl DHCP_MICRO_VERSION += 1; ++dnl DHCP_INTERFACE_AGE += 1; ++dnl DHCP_BINARY_AGE += 1; ++dnl if any functions have been added, set DHCP_INTERFACE_AGE to 0. ++dnl if backwards compatibility has been broken (e.g., functions removed, ++dnl function signatures changed), ++dnl set DHCP_BINARY_AGE and DHCP_INTERFACE_AGE to 0. ++DHCP_MAJOR_VERSION=4 ++DHCP_MINOR_VERSION=0 ++DHCP_MICRO_VERSION=0 ++DHCP_INTERFACE_AGE=0 ++DHCP_BINARY_AGE=0 ++DHCP_VERSION_SUFFIX= ++DHCP_VERSION=$DHCP_MAJOR_VERSION.$DHCP_MINOR_VERSION.$DHCP_MICRO_VERSION$DHCP_VERSION_SUFFIX ++ ++LT_RELEASE=$DHCP_MAJOR_VERSION.$DHCP_MINOR_VERSION ++LT_CURRENT=`expr $DHCP_MICRO_VERSION - $DHCP_INTERFACE_AGE` ++LT_REVISION=$DHCP_INTERFACE_AGE ++AC_SUBST(DHCP_VERSION) ++AC_SUBST(LT_RELEASE) ++AC_SUBST(LT_CURRENT) ++AC_SUBST(LT_REVISION) ++AC_SUBST(LT_AGE) ++ + # we specify "foreign" to avoid having to have the GNU mandated files, + # like AUTHORS, COPYING, and such + AM_INIT_AUTOMAKE([foreign]) +@@ -20,7 +47,8 @@ if test "$GCC" = "yes"; then + fi + fi -+#ifdef LIBDHCP -+FILE *leaseFile = NULL; -+#endif +-AC_PROG_RANLIB ++AC_PROG_LIBTOOL + - extern u_int32_t default_requested_options[]; + AC_CONFIG_HEADERS([includes/config.h]) - static void usage PROTO ((void)); + # we sometimes need to know byte order for building packets +diff -up dhcp-4.0.0//dst/Makefile.am.libdhcp4client dhcp-4.0.0//dst/Makefile.am +--- dhcp-4.0.0//dst/Makefile.am.libdhcp4client 2008-08-01 10:17:45.000000000 -1000 ++++ dhcp-4.0.0//dst/Makefile.am 2008-08-01 10:17:46.000000000 -1000 +@@ -2,7 +2,7 @@ AM_CPPFLAGS = -DMINIRES_LIB -DHMAC_MD5 - static isc_result_t write_duid(struct data_string *duid); + lib_LIBRARIES = libdst.a --int --main(int argc, char **argv) { -+#ifdef LIBDHCP -+#include "isc-dhcp/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); +-noinst_LIBRARIES = libdstnomd5.a ++noinst_LIBRARIES = libdstnomd5.a libdstLIBDHCP.a + + libdst_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \ + base64.c prandom.c +@@ -10,4 +10,8 @@ libdst_a_SOURCES = dst_support.c dst_api + libdstnomd5_a_SOURCES = dst_support.c dst_api.c hmac_link.c \ + base64.c prandom.c + ++libdstLIBDHCP_a_CFLAGS = -DLIBDHCP ++libdstLIBDHCP_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \ ++ base64.c prandom.c + -+__attribute__ ((visibility ("default"))) -+int dhcpv4_client (LIBDHCP_Control *libdhcp_ctl, int argc, char **argv, -+ char **envp) -+#else -+int main(int argc, char **argv, char **envp) -+#endif -+{ + EXTRA_DIST = dst_internal.h md5.h md5_locl.h +diff -up dhcp-4.0.0//dst/hmac_link.c.libdhcp4client dhcp-4.0.0//dst/hmac_link.c +--- dhcp-4.0.0//dst/hmac_link.c.libdhcp4client 2007-12-05 14:50:22.000000000 -1000 ++++ dhcp-4.0.0//dst/hmac_link.c 2008-08-01 10:17:46.000000000 -1000 +@@ -39,6 +39,10 @@ static const char rcsid[] = "$Header: /p + + #include "dst_internal.h" + +#ifdef LIBDHCP -+ libdhcp_control = libdhcp_ctl; ++extern void* dmalloc(size_t,char *,int); +#endif - int fd; - int i; - struct interface_info *ip; -@@ -122,6 +158,7 @@ main(int argc, char **argv) { - /* Initialize client globals. */ - memset(&default_duid, 0, sizeof(default_duid)); ++ + #ifdef USE_MD5 + # include "md5.h" + # ifndef _MD5_H_ +@@ -87,7 +91,11 @@ dst_hmac_md5_sign(const int mode, DST_KE + MD5_CTX *ctx = NULL; -+#ifndef LIBDHCP - /* Make sure that file descriptors 0 (stdin), 1, (stdout), and - 2 (stderr) are open. To do this, we assume that when we - open a file the lowest available file descriptor is used. */ -@@ -140,6 +177,7 @@ main(int argc, char **argv) { - #if !(defined (DEBUG) || defined (__CYGWIN32__)) - setlogmask (LOG_UPTO (LOG_INFO)); - #endif + 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) +@@ -154,7 +162,11 @@ dst_hmac_md5_verify(const int mode, DST_ + MD5_CTX *ctx = NULL; - /* Set up the OMAPI. */ - status = omapi_init (); -@@ -485,8 +523,12 @@ main(int argc, char **argv) { - } - } - + if (mode & SIG_MODE_INIT) +#ifdef LIBDHCP -+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE)) ++ ctx = (MD5_CTX *) dmalloc(sizeof(*ctx),__FILE__,__LINE__); ++#else + ctx = (MD5_CTX *) malloc(sizeof(*ctx)); +#endif - write_client_pid_file(); + else if (context) + ctx = (MD5_CTX *) *context; + if (ctx == NULL) +@@ -218,8 +230,11 @@ dst_buffer_to_hmac_md5(DST_KEY *dkey, co -+#ifndef LIBDHCP - if (!quiet) { - log_info ("%s %s", message, PACKAGE_VERSION); - log_info (copyright); -@@ -497,6 +539,7 @@ main(int argc, char **argv) { - log_perror = 0; - quiet_interface_discovery = 1; - } + 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); - /* If we're given a relay agent address to insert, for testing - purposes, figure out what it is. */ -@@ -702,11 +745,17 @@ main(int argc, char **argv) { - arg_conf_len = 0; - } - + memset(hkey->hk_ipad, 0, sizeof(hkey->hk_ipad)); +@@ -348,7 +363,11 @@ dst_hmac_md5_key_from_file_format(DST_KE + if (eol == NULL) + return (-4); + len = eol - p; +#ifdef LIBDHCP -+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) { ++ tmp = dmalloc(len + 2,__FILE__,__LINE__); ++#else + tmp = malloc(len + 2); +#endif - /* Parse the lease database. */ - read_client_leases (); - - /* Rewrite the lease database... */ - rewrite_client_leases (); + memcpy(tmp, p, len); + *(tmp + len) = 0x0; + key_len = b64_pton((char *)tmp, key, HMAC_LEN+1); /* see above */ +@@ -440,8 +459,11 @@ dst_hmac_md5_generate_key(DST_KEY *key, + 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 */ +@@ -464,7 +486,11 @@ dst_hmac_md5_init() + { + 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)); +diff -up dhcp-4.0.0//includes/dhcpd.h.libdhcp4client dhcp-4.0.0//includes/dhcpd.h +--- dhcp-4.0.0//includes/dhcpd.h.libdhcp4client 2008-08-01 10:17:46.000000000 -1000 ++++ dhcp-4.0.0//includes/dhcpd.h 2008-08-01 10:17:46.000000000 -1000 +@@ -1199,14 +1199,6 @@ struct hardware_link { - /* XXX */ - /* config_counter(&snd_counter, &rcv_counter); */ -@@ -725,7 +774,7 @@ main(int argc, char **argv) { - if (!persist) { - /* Nothing more to do. */ - log_info ("No broadcast interfaces found - exiting."); -- exit (0); -+ return (0); - } - } else if (!release_mode && !exit_mode) { - /* Call the script with the list of interfaces. */ -@@ -863,6 +912,7 @@ main(int argc, char **argv) { - dmalloc_outstanding = 0; - #endif + 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; +-}; -+#ifndef LIBDHCP - /* If we're not supposed to wait before getting the address, - don't. */ - if (nowait) -@@ -875,6 +925,132 @@ main(int argc, char **argv) { + struct protocol { + struct protocol *next; +@@ -1664,7 +1656,6 @@ extern const char *path_dhcpd_pid; - /* 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; -+ 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; + extern int dhcp_max_agent_option_packet_length; + +-int main(int, char **); + void postconf_initialization(int); + void postdb_startup(void); + void cleanup PROTO ((void)); +@@ -2337,7 +2328,6 @@ extern void (*bootp_packet_handler) PROT + extern void (*dhcpv6_packet_handler)(struct interface_info *, + const char *, int, + int, const struct iaddr *, isc_boolean_t); +-extern struct timeout *timeouts; + extern omapi_object_type_t *dhcp_type_interface; + #if defined (TRACING) + extern trace_type_t *interface_trace; +@@ -2392,6 +2382,10 @@ extern struct universe dhcpv6_universe; + extern struct universe nwip_universe; + extern struct universe fqdn_universe; + extern struct universe vsio_universe; ++extern struct universe vendor_class_universe; ++extern struct universe vendor_universe; ++extern struct universe isc_universe; ++extern struct universe isc6_universe; + extern int dhcp_option_default_priority_list []; + extern int dhcp_option_default_priority_list_count; + extern const char *hardware_types [256]; +diff -up dhcp-4.0.0//omapip/Makefile.am.libdhcp4client dhcp-4.0.0//omapip/Makefile.am +--- dhcp-4.0.0//omapip/Makefile.am.libdhcp4client 2007-05-29 06:32:11.000000000 -1000 ++++ dhcp-4.0.0//omapip/Makefile.am 2008-08-01 10:17:46.000000000 -1000 +@@ -1,10 +1,18 @@ + lib_LIBRARIES = libomapi.a ++noinst_LIBRARIES = libomapiLIBDHCP.a + noinst_PROGRAMS = svtest + + libomapi_a_SOURCES = protocol.c buffer.c alloc.c result.c connection.c \ + errwarn.c listener.c dispatch.c generic.c support.c \ + handle.c message.c convert.c hash.c auth.c inet_addr.c \ + array.c trace.c mrtrace.c toisc.c iscprint.c + -+ libdhcp_control = 0; ++libomapiLIBDHCP_a_CFLAGS = -DLIBDHCP ++libomapiLIBDHCP_a_SOURCES = alloc.c array.c auth.c buffer.c connection.c \ ++ convert.c dispatch.c errwarn.c handle.c hash.c listener.c \ ++ mrtrace.c result.c support.c toisc.c trace.c generic.c message.c \ ++ protocol.c + -+ 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; -+ 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(&dhcpv6_universe, '\0', sizeof(struct universe)); -+ memset(&nwip_universe, '\0', sizeof(struct universe)); -+ memset(&fqdn_universe, '\0', sizeof(struct universe)); -+ memset(&vendor_class_universe, '\0', sizeof(struct universe)); -+ memset(&vendor_universe, '\0', sizeof(struct universe)); -+ memset(&vsio_universe, '\0', sizeof(struct universe)); -+ memset(&isc_universe, '\0', sizeof(struct universe)); -+ memset(&isc6_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 + man_MANS = omapi.3 + EXTRA_DIST = $(man_MANS) - /*NOTREACHED*/ - return 0; -@@ -1270,7 +1446,20 @@ void dhcpack (packet) - if (client -> new -> rebind < cur_time) - client -> new -> rebind = TIME_MAX; +diff -up dhcp-4.0.0//omapip/alloc.c.libdhcp4client dhcp-4.0.0//omapip/alloc.c +--- dhcp-4.0.0//omapip/alloc.c.libdhcp4client 2007-07-12 20:43:42.000000000 -1000 ++++ dhcp-4.0.0//omapip/alloc.c 2008-08-01 10:17:46.000000000 -1000 +@@ -37,6 +37,33 @@ + + #include +#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 ++/* 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)); ++} + - bind_lease (client); ++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; +@@ -72,7 +99,9 @@ dmalloc(unsigned size, const char *file, + return NULL; + + foo = malloc(len); +- +#ifdef LIBDHCP -+ client->packet.siaddr.s_addr = set_siaddr; ++ record_pointer(foo); ++#endif + if (!foo) + return NULL; + bar = (void *)(foo + DMDOFFSET); +@@ -191,6 +220,9 @@ dfree(void *ptr, const char *file, int l + 0, (unsigned char *)ptr + DMDOFFSET, 0, 1, RC_MALLOC); + #endif + free (ptr); ++#ifdef LIBDHCP ++ forget_pointer(ptr); +#endif } - void bind_lease (client) -@@ -1306,6 +1495,9 @@ void bind_lease (client) - return; - } + #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ +diff -up dhcp-4.0.0//omapip/dispatch.c.libdhcp4client dhcp-4.0.0//omapip/dispatch.c +--- dhcp-4.0.0//omapip/dispatch.c.libdhcp4client 2007-11-30 11:51:43.000000000 -1000 ++++ dhcp-4.0.0//omapip/dispatch.c 2008-08-01 10:17:46.000000000 -1000 +@@ -37,7 +37,7 @@ + #include + #include + +-static omapi_io_object_t omapi_io_states; ++omapi_io_object_t omapi_io_states; + time_t cur_time; + + OMAPI_OBJECT_ALLOC (omapi_io, +diff -up dhcp-4.0.0//omapip/errwarn.c.libdhcp4client dhcp-4.0.0//omapip/errwarn.c +--- dhcp-4.0.0//omapip/errwarn.c.libdhcp4client 2008-08-01 10:17:44.000000000 -1000 ++++ dhcp-4.0.0//omapip/errwarn.c 2008-08-01 10:17:46.000000000 -1000 +@@ -37,6 +37,11 @@ + #include + #include +#ifdef LIBDHCP -+ if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_LEASE_DATABASE)) ++#include ++extern LIBDHCP_Control *libdhcp_control; +#endif - /* Write out the new lease. */ - write_client_lease (client, client -> new, 0, 0); - -@@ -1398,10 +1590,12 @@ void state_stop (cpp) - } - } ++ + #ifdef DEBUG + int log_perror = -1; + #else +@@ -46,7 +51,9 @@ int log_priority; + void (*log_cleanup) (void); + #define CVT_BUF_MAX 1023 +#ifndef LIBDHCP - int commit_leases () - { - return 0; - } + static char mbuf [CVT_BUF_MAX + 1]; +#endif + static char fbuf [CVT_BUF_MAX + 1]; - int write_lease (lease) - struct lease *lease; -@@ -2074,6 +2268,10 @@ void state_panic (cpp) - tell the shell script that we failed to allocate an address, - and try again later. */ - if (onetry) { + /* Log an error message, then exit... */ +@@ -56,6 +63,16 @@ void log_fatal (const char * fmt, ... ) + va_list list; + + do_percentm (fbuf, fmt); ++ +#ifdef LIBDHCP -+ script_init (client, "FAIL", (struct string_list *)0); -+ return; ++ 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. +@@ -89,6 +106,7 @@ void log_fatal (const char * fmt, ... ) + if (log_cleanup) + (*log_cleanup) (); + exit (1); +#endif - if (!quiet) - log_info ("Unable to obtain a lease on first try.%s", - " Exiting."); -@@ -2691,7 +2889,9 @@ void destroy_client_lease (lease) - free_client_lease (lease, MDL); } -+#ifndef LIBDHCP - FILE *leaseFile = NULL; -+#endif - int leases_written = 0; + /* Log an error message... */ +@@ -99,6 +117,13 @@ int log_error (const char * fmt, ...) + + do_percentm (fbuf, fmt); - void rewrite_client_leases () -@@ -3218,6 +3418,54 @@ void script_write_params (client, prefix - 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; ++ if (libdhcp_control && libdhcp_control->eh) { ++ va_start (list, fmt); ++ libdhcp_control->eh(libdhcp_control, LOG_ERR, fbuf, list); ++ va_end(list); ++ } +#else - char *scriptName; - char *argv [2]; - char **envp; -@@ -3294,6 +3542,7 @@ int script_go (client) - time(&cur_time); - return (WIFEXITED (wstatus) ? - WEXITSTATUS (wstatus) : -WTERMSIG (wstatus)); + /* %Audit% This is log output. %2004.06.17,Safe% + * If we truncate we hope the user can get a hint from the log. + */ +@@ -114,7 +139,7 @@ int log_error (const char * fmt, ...) + write (STDERR_FILENO, mbuf, strlen (mbuf)); + write (STDERR_FILENO, "\n", 1); + } +- +#endif + return 0; } - void client_envadd (struct client_state *client, -@@ -3376,6 +3625,9 @@ void go_daemon () +@@ -126,6 +151,13 @@ int log_info (const char *fmt, ...) + + do_percentm (fbuf, fmt); - /* 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)) ++ 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. + */ +@@ -141,7 +173,7 @@ int log_info (const char *fmt, ...) + write (STDERR_FILENO, mbuf, strlen (mbuf)); + write (STDERR_FILENO, "\n", 1); + } +- +#endif - write_client_pid_file (); - return; - } -@@ -3385,6 +3637,10 @@ void go_daemon () - return; - state = 1; + return 0; + } + +@@ -152,7 +184,13 @@ int log_debug (const char *fmt, ...) + va_list list; + do_percentm (fbuf, fmt); +- +#ifdef LIBDHCP -+ return; ++ 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. + */ +@@ -168,7 +206,7 @@ int log_debug (const char *fmt, ...) + write (STDERR_FILENO, mbuf, strlen (mbuf)); + write (STDERR_FILENO, "\n", 1); + } +- +#endif -+ - /* Stop logging to stderr... */ - log_perror = 0; + return 0; + } diff --git a/dhcp-4.0.0-memory.patch b/dhcp-4.0.0-memory.patch new file mode 100644 index 0000000..aedaa65 --- /dev/null +++ b/dhcp-4.0.0-memory.patch @@ -0,0 +1,37 @@ +diff -up dhcp-4.0.0//common/lpf.c.memory dhcp-4.0.0//common/lpf.c +--- dhcp-4.0.0//common/lpf.c.memory 2007-07-12 20:43:41.000000000 -1000 ++++ dhcp-4.0.0//common/lpf.c 2008-08-01 10:08:01.000000000 -1000 +@@ -245,6 +245,7 @@ static void lpf_tr_filter_setup (info) + struct interface_info *info; + { + struct sock_fprog p; ++ memset(&p,'\0', sizeof(struct sock_fprog)); + + /* Set up the bpf filter program structure. This is defined in + bpf.c */ +diff -up dhcp-4.0.0//common/packet.c.memory dhcp-4.0.0//common/packet.c +--- dhcp-4.0.0//common/packet.c.memory 2007-11-30 11:51:43.000000000 -1000 ++++ dhcp-4.0.0//common/packet.c 2008-08-01 10:08:01.000000000 -1000 +@@ -135,6 +135,7 @@ void assemble_udp_ip_header (interface, + struct ip ip; + struct udphdr udp; + ++ memset( &ip, '\0', sizeof ip); + /* Fill out the IP header */ + IP_V_SET (&ip, 4); + IP_HL_SET (&ip, 20); +diff -up dhcp-4.0.0//minires/ns_name.c.memory dhcp-4.0.0//minires/ns_name.c +--- dhcp-4.0.0//minires/ns_name.c.memory 2005-03-17 10:15:17.000000000 -1000 ++++ dhcp-4.0.0//minires/ns_name.c 2008-08-01 10:08:01.000000000 -1000 +@@ -71,6 +71,11 @@ ns_name_ntop(const u_char *src, char *ds + dn = dst; + eom = dst + dstsiz; + ++ if (dn >= eom) { ++ errno = EMSGSIZE; ++ return (-1); ++ } ++ + while ((n = *cp++) != 0) { + if ((n & NS_CMPRSFLGS) != 0) { + /* Some kind of compression pointer. */ diff --git a/dhcp-4.0.0-release-by-ifup.patch b/dhcp-4.0.0-release-by-ifup.patch new file mode 100644 index 0000000..ea74981 --- /dev/null +++ b/dhcp-4.0.0-release-by-ifup.patch @@ -0,0 +1,85 @@ +diff -up dhcp-4.0.0//client/dhclient.c.release dhcp-4.0.0//client/dhclient.c +--- dhcp-4.0.0//client/dhclient.c.release 2008-08-01 10:09:01.000000000 -1000 ++++ dhcp-4.0.0//client/dhclient.c 2008-08-01 10:09:17.000000000 -1000 +@@ -412,9 +412,81 @@ main(int argc, char **argv) { + kill(oldpid, SIGTERM); + } + fclose(pidfd); ++ } else { ++ /* handle release for interfaces requested with Red Hat ++ * /sbin/ifup - pidfile will be /var/run/dhclient-$interface.pid ++ */ ++ ++ if ((path_dhclient_pid == NULL) || (*path_dhclient_pid == '\0')) ++ path_dhclient_pid = "/var/run/dhclient.pid"; ++ ++ char *new_path_dhclient_pid; ++ struct interface_info *ip; ++ int pdp_len = strlen(path_dhclient_pid), pfx, dpfx; ++ ++ /* find append point: beginning of any trailing '.pid' ++ * or '-$IF.pid' */ ++ for (pfx=pdp_len; (pfx >= 0) && (path_dhclient_pid[pfx] != '.') && (path_dhclient_pid[pfx] != '/'); pfx--); ++ if (pfx == -1) ++ pfx = pdp_len; ++ ++ if (path_dhclient_pid[pfx] == '/') ++ pfx += 1; ++ ++ for (dpfx=pfx; (dpfx >= 0) && (path_dhclient_pid[dpfx] != '-') && (path_dhclient_pid[dpfx] != '/'); dpfx--); ++ if ((dpfx > -1) && (path_dhclient_pid[dpfx] != '/')) ++ pfx = dpfx; ++ ++ for (ip = interfaces; ip; ip = ip->next) { ++ if (interfaces_requested && (ip->flags & (INTERFACE_REQUESTED)) && (ip->name != NULL)) { ++ int n_len = strlen(ip->name); ++ ++ new_path_dhclient_pid = (char*) malloc(pfx + n_len + 6); ++ strncpy(new_path_dhclient_pid, path_dhclient_pid, pfx); ++ sprintf(new_path_dhclient_pid + pfx, "-%s.pid", ip->name); ++ ++ if ((pidfd = fopen(new_path_dhclient_pid, "r")) != NULL) { ++ e = fscanf(pidfd, "%ld\n", &temp); ++ oldpid = (pid_t)temp; ++ ++ if (e != 0 && e != EOF) { ++ if (oldpid) { ++ if (kill(oldpid, SIGTERM) == 0) ++ unlink(path_dhclient_pid); ++ } ++ } ++ ++ fclose(pidfd); ++ } ++ ++ free(new_path_dhclient_pid); ++ } ++ } ++ } ++ } else { ++ FILE *pidfp = NULL; ++ long temp = 0; ++ pid_t dhcpid = 0; ++ int dhc_running = 0; ++ char procfn[256] = ""; ++ ++ if ((pidfp = fopen(path_dhclient_pid, "r")) != NULL) { ++ if ((fscanf(pidfp, "%ld", &temp)==1) && ((dhcpid=(pid_t)temp) > 0)) { ++ snprintf(procfn,256,"/proc/%u",dhcpid); ++ dhc_running = (access(procfn, F_OK) == 0); ++ } ++ ++ fclose(pidfp); ++ } ++ ++ if (dhc_running) { ++ log_fatal("dhclient(%u) is already running - exiting. ", dhcpid); ++ return(1); + } + } + ++ write_client_pid_file(); ++ + if (!quiet) { + log_info ("%s %s", message, PACKAGE_VERSION); + log_info (copyright); diff --git a/dhcp-4.0.0-selinux.patch b/dhcp-4.0.0-selinux.patch index ebcf51a..9f76e49 100644 --- a/dhcp-4.0.0-selinux.patch +++ b/dhcp-4.0.0-selinux.patch @@ -1,7 +1,7 @@ diff -up dhcp-4.0.0//client/dhclient.c.selinux dhcp-4.0.0//client/dhclient.c ---- dhcp-4.0.0//client/dhclient.c.selinux 2008-05-16 13:42:18.000000000 -1000 -+++ dhcp-4.0.0//client/dhclient.c 2008-05-16 13:57:54.000000000 -1000 -@@ -2908,6 +2908,11 @@ void rewrite_client_leases () +--- dhcp-4.0.0//client/dhclient.c.selinux 2008-08-01 10:16:48.000000000 -1000 ++++ dhcp-4.0.0//client/dhclient.c 2008-08-01 10:16:48.000000000 -1000 +@@ -2708,6 +2708,11 @@ void rewrite_client_leases () return; } @@ -13,7 +13,7 @@ diff -up dhcp-4.0.0//client/dhclient.c.selinux dhcp-4.0.0//client/dhclient.c /* If there is a default duid, write it out. */ if (default_duid.len != 0) write_duid(&default_duid); -@@ -3011,6 +3016,10 @@ write_duid(struct data_string *duid) +@@ -2811,6 +2816,10 @@ write_duid(struct data_string *duid) log_error("can't create %s: %m", path_dhclient_db); return ISC_R_IOERROR; } @@ -24,7 +24,7 @@ diff -up dhcp-4.0.0//client/dhclient.c.selinux dhcp-4.0.0//client/dhclient.c } /* It would make more sense to write this as a hex string, -@@ -3058,6 +3067,10 @@ write_client6_lease(struct client_state +@@ -2858,6 +2867,10 @@ write_client6_lease(struct client_state log_error("can't create %s: %m", path_dhclient_db); return ISC_R_IOERROR; } @@ -35,7 +35,7 @@ diff -up dhcp-4.0.0//client/dhclient.c.selinux dhcp-4.0.0//client/dhclient.c } stat = fprintf(leaseFile, "lease6 {\n"); -@@ -3161,6 +3174,10 @@ int write_client_lease (client, lease, r +@@ -2961,6 +2974,10 @@ int write_client_lease (client, lease, r log_error ("can't create %s: %m", path_dhclient_db); return 0; } diff --git a/dhcp-4.0.0-unicast-bootp.patch b/dhcp-4.0.0-unicast-bootp.patch new file mode 100644 index 0000000..059c150 --- /dev/null +++ b/dhcp-4.0.0-unicast-bootp.patch @@ -0,0 +1,99 @@ +diff -up dhcp-4.0.0//server/bootp.c.unicast dhcp-4.0.0//server/bootp.c +--- dhcp-4.0.0//server/bootp.c.unicast 2007-10-26 12:46:50.000000000 -1000 ++++ dhcp-4.0.0//server/bootp.c 2008-08-01 10:12:38.000000000 -1000 +@@ -58,6 +58,7 @@ void bootp (packet) + char msgbuf [1024]; + int ignorep; + int peer_has_leases = 0; ++ int norelay = 0; + + if (packet -> raw -> op != BOOTREQUEST) + return; +@@ -73,7 +74,7 @@ void bootp (packet) + ? inet_ntoa (packet -> raw -> giaddr) + : packet -> interface -> name); + +- if (!locate_network (packet)) { ++ if ((norelay = locate_network (packet)) == 0) { + log_info ("%s: network unknown", msgbuf); + return; + } +@@ -384,6 +385,13 @@ void bootp (packet) + from, &to, &hto); + goto out; + } ++ } else if (norelay == 2) { ++ to.sin_addr = raw.ciaddr; ++ to.sin_port = remote_port; ++ if (fallback_interface) { ++ result = send_packet (fallback_interface, (struct packet *)0, &raw, outgoing.packet_length, from, &to, &hto); ++ goto out; ++ } + + /* If it comes from a client that already knows its address + and is not requesting a broadcast response, and we can +diff -up dhcp-4.0.0//server/dhcp.c.unicast dhcp-4.0.0//server/dhcp.c +--- dhcp-4.0.0//server/dhcp.c.unicast 2007-11-02 12:09:02.000000000 -1000 ++++ dhcp-4.0.0//server/dhcp.c 2008-08-01 10:12:38.000000000 -1000 +@@ -3904,6 +3904,7 @@ int locate_network (packet) + struct data_string data; + struct subnet *subnet = (struct subnet *)0; + struct option_cache *oc; ++ int norelay = 0; + + /* See if there's a Relay Agent Link Selection Option, or a + * Subnet Selection Option. The Link-Select and Subnet-Select +@@ -3919,12 +3920,24 @@ int locate_network (packet) + from the interface, if there is one. If not, fail. */ + if (!oc && !packet -> raw -> giaddr.s_addr) { + if (packet -> interface -> shared_network) { +- shared_network_reference +- (&packet -> shared_network, +- packet -> interface -> shared_network, MDL); +- return 1; ++ struct in_addr any_addr; ++ any_addr.s_addr = INADDR_ANY; ++ ++ if (!packet -> packet_type && memcmp(&packet -> raw -> ciaddr, &any_addr, 4)) { ++ struct iaddr cip; ++ memcpy(cip.iabuf, &packet -> raw -> ciaddr, 4); ++ cip.len = 4; ++ if (!find_grouped_subnet(&subnet, packet->interface->shared_network, cip, MDL)) ++ norelay = 2; ++ } ++ ++ if (!norelay) { ++ shared_network_reference(&packet -> shared_network, packet -> interface -> shared_network, MDL); ++ return 1; ++ } ++ } else { ++ return 0; + } +- return 0; + } + + /* If there's an option indicating link connection, and it's valid, +@@ -3947,7 +3960,10 @@ int locate_network (packet) + data_string_forget (&data, MDL); + } else { + ia.len = 4; +- memcpy (ia.iabuf, &packet -> raw -> giaddr, 4); ++ if (norelay) ++ memcpy (ia.iabuf, &packet->raw->ciaddr, 4); ++ else ++ memcpy (ia.iabuf, &packet->raw->giaddr, 4); + } + + /* If we know the subnet on which the IP address lives, use it. */ +@@ -3955,7 +3971,10 @@ int locate_network (packet) + shared_network_reference (&packet -> shared_network, + subnet -> shared_network, MDL); + subnet_dereference (&subnet, MDL); +- return 1; ++ if (norelay) ++ return norelay; ++ else ++ return 1; + } + + /* Otherwise, fail. */ diff --git a/dhcp.spec b/dhcp.spec index f9573f7..11d986c 100644 --- a/dhcp.spec +++ b/dhcp.spec @@ -26,16 +26,16 @@ Source10: libdhcp_control.h Source11: dhcp.schema Source12: get-ldap-patch.sh -Patch0: %{name}-3.0.5-errwarn-message.patch +Patch0: %{name}-4.0.0-errwarn-message.patch Patch1: %{name}-4.0.0-ldap-configuration.patch -Patch2: %{name}-3.0.6-memory.patch +Patch2: %{name}-4.0.0-memory.patch Patch3: %{name}-4.0.0-options.patch -Patch4: %{name}-3.0.5-release-by-ifup.patch -Patch5: %{name}-3.0.5-dhclient-decline-backoff.patch -Patch6: %{name}-3.0.5-enable-timeout-functions.patch -Patch7: %{name}-3.0.5-unicast-bootp.patch +Patch4: %{name}-4.0.0-release-by-ifup.patch +Patch5: %{name}-4.0.0-dhclient-decline-backoff.patch +Patch6: %{name}-4.0.0-enable-timeout-functions.patch +Patch7: %{name}-4.0.0-unicast-bootp.patch Patch8: %{name}-4.0.0-fast-timeout.patch -Patch9: %{name}-3.0.5-failover-ports.patch +Patch9: %{name}-4.0.0-failover-ports.patch Patch10: %{name}-4.0.0-dhclient-usage.patch Patch11: %{name}-4.0.0-default-requested-options.patch Patch12: %{name}-4.0.0-xen-checksum.patch @@ -46,6 +46,7 @@ Patch16: %{name}-4.0.0-NetworkManager-crash.patch Patch17: %{name}-4.0.0-selinux.patch Patch18: %{name}-4.0.0-libdhcp4client.patch Patch19: %{name}-4.0.0-O_CLOEXEC.patch +Patch20: %{name}-4.0.0-inherit-leases.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) BuildRequires: autoconf @@ -199,6 +200,9 @@ client library. # Make sure all open file descriptors are closed-on-exec for SELinux %patch19 -p1 +# If we have an active lease, do not down the interface (#453982) +%patch20 -p1 + # Copy in documentation and example scripts for LDAP patch to dhcpd %{__install} -p -m 0644 %{SOURCE5} . %{__install} -p -m 0644 %{SOURCE6} doc/ @@ -427,9 +431,12 @@ fi %{_libdir}/libdhcp4client.so %changelog -* Thu Jul 24 2008 David Cantrell - 12:4.0.0-17 +* Fri Aug 01 2008 David Cantrell - 12:4.0.0-17 - Carry over RES_OPTIONS from ifcfg-ethX files to /etc/resolv.conf (#202923) - Clean up Requires tags for devel packages +- Allow SEARCH variable in ifcfg files to override search path (#454152) +- Do not down interface if there is an active lease (#453982) +- Clean up how dhclient-script restarts ypbind * Sat Jun 21 2008 David Cantrell - 12:4.0.0-16 - Remove instaces of \032 in domain search option (#450042) diff --git a/linux b/linux index e4c1819..17e2e91 100755 --- a/linux +++ b/linux @@ -47,16 +47,20 @@ make_resolv_conf() { rscf=`mktemp /tmp/XXXXXX`; echo '; generated by /sbin/dhclient-script' > $rscf - if [ -n "$new_domain_search" ]; then - echo "search ${new_domain_search//\\032/ }" >> $rscf - else - if [ -n "$new_domain_name" ]; then - echo "search ${new_domain_name//\\032/ }" >> $rscf + if [ -z "$SEARCH" ]; then + if [ -n "$new_domain_search" ]; then + echo "search ${new_domain_search//\\032/ }" >> $rscf + else + if [ -n "$new_domain_name" ]; then + echo "search ${new_domain_name//\\032/ }" >> $rscf + fi fi + else + echo "search $SEARCH" >> $rscf fi if [ -n "$RES_OPTIONS" ]; then - echo options $RES_OPTIONS >> $rscf + echo "options $RES_OPTIONS" >> $rscf fi for nameserver in $new_domain_name_servers; do @@ -355,8 +359,10 @@ function dhconfig() { let contents=contents+1 fi - if [ $contents -gt 0 ] && [ -r /var/run/ypbind.pid ] && yppid=$(cat /var/run/ypbind.pid) && [ -d /proc/${yppid} ] && [ "$(if [ -x /usr/bin/readlink ]; then readlink /proc/${yppid}/exe; else echo /sbin/ypbind; fi)" = "/sbin/ypbind" ]; then - kill -HUP $yppid + if [ $contents -gt 0 ]; then + if [ -x /etc/rc.d/init.d/ypbind ] && [ -r /var/run/ypbind.pid ]; then + service ypbind restart >/dev/null 2>&1 + fi fi elif [ -n "$new_nis_servers" ]; then save_previous /etc/yp.conf @@ -368,8 +374,10 @@ function dhconfig() { let contents=contents+1 done - if [ $contents -gt 0 ] && [ -r /var/run/ypbind.pid ] && yppid=$(cat /var/run/ypbind.pid) && [ -d /proc/${yppid} ] && [ "$(if [ -x /usr/bin/readlink ]; then readlink /proc/${yppid}/exe; else echo /sbin/ypbind; fi)" = "/sbin/ypbind" ]; then - kill -HUP $yppid + if [ $contents -gt 0 ]; then + if [ -x /etc/rc.d/init.d/ypbind ] && [ -r /var/run/ypbind.pid ]; then + service ypbind restart >/dev/null 2>&1 + fi fi fi @@ -511,8 +519,8 @@ if [ x$reason = xEXPIRE ] || [ x$reason = xFAIL ] || [ x$reason = xRELEASE ] \ /bin/rm -f /etc/yp.conf /bin/mv -f /etc/yp.conf.predhclient.$interface /etc/yp.conf - if [ -r /var/run/ypbind.pid ] && yppid=$(cat /var/run/ypbind.pid) && [ -d /proc/${yppid} ] && [ "$(if [ -x /usr/bin/readlink ]; then readlink /proc/${yppid}/exe; else echo /sbin/ypbind; fi)" = "/sbin/ypbind" ]; then - kill -HUP $yppid + if [ -x /etc/rc.d/init.d/ypbind ] && [ -r /var/run/ypbind.pid ]; then + service ypbind restart >/dev/null 2>&1 fi fi fi @@ -554,10 +562,7 @@ if [ x$reason = xTIMEOUT ] && [ "x$new_routers" != 'x' ]; then exit_with_hooks 0 fi - if [ -z "${dhc_dbus}" ] || (( ( dhc_dbus & 2 ) != 2 )); then - ifconfig $interface inet 0 down - fi - + ifconfig $interface inet 0 down exit_with_hooks 1 elif [ x$reason = xTIMEOUT ]; then exit_with_hooks 1