rpms/dhcp/devel dhcp-4.0.0-default-requested-options.patch, NONE, 1.1 dhcp-4.0.0-dhclient-anycast.patch, NONE, 1.1 dhcp-4.0.0-dhclient-usage.patch, NONE, 1.1 dhcp-4.0.0-fast-timeout.patch, NONE, 1.1 dhcp-4.0.0-ldap-configuration.patch, NONE, 1.1 dhcp-4.0.0-libdhcp4client.patch, NONE, 1.1 dhcp-4.0.0-manpages.patch, NONE, 1.1 dhcp-4.0.0-options.patch, NONE, 1.1 dhcp-4.0.0-paths.patch, NONE, 1.1 dhcp-4.0.0-xen-checksum.patch, NONE, 1.1 .cvsignore, 1.19, 1.20 dhcp.spec, 1.189, 1.190 sources, 1.20, 1.21 Makefile.libdhcp4client, 1.2, NONE dhclient-script.8, 1.2, NONE dhclient.8, 1.2, NONE dhclient.conf.5, 1.2, NONE dhcp-3.0.5-Makefile.patch, 1.3, NONE dhcp-3.0.5-default-requested-options.patch, 1.1, NONE dhcp-3.0.5-fast-timeout.patch, 1.1, NONE dhcp-3.0.5-inherit-leases.patch, 1.1, NONE dhcp-3.0.5-prototypes.patch, 1.1, NONE dhcp-3.0.6-ignore-hyphen-x.patch, 1.1, NONE dhcp-3.1.0-dhclient-anycast.patch, 1.1, NONE dhcp-3.1.0-dhclient-usage.patch, 1.1, NONE dhcp-3.1.0-ldap-configuration.patch, 1.2, NONE dhcp-3.1.0-libdhcp4client.patch, 1.2, NONE dhcp-3.1.0-options.patch, 1.1, NONE dhcp-3.1.0-warnings.patch, 1.2, NONE dhcp-3.1.0-xen-checksum.patch, 1.1, NONE dhcp-options.5, 1.2, NONE dhcpctl.3, 1.1, NONE dhcpd.conf, 1.1, NONE dhcpd.conf.5, 1.2, NONE dhcpd.conf.sample, 1.4, NONE

David Cantrell (dcantrel) fedora-extras-commits at redhat.com
Thu Jan 3 20:41:32 UTC 2008


Author: dcantrel

Update of /cvs/pkgs/rpms/dhcp/devel
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv26817

Modified Files:
	.cvsignore dhcp.spec sources 
Added Files:
	dhcp-4.0.0-default-requested-options.patch 
	dhcp-4.0.0-dhclient-anycast.patch 
	dhcp-4.0.0-dhclient-usage.patch dhcp-4.0.0-fast-timeout.patch 
	dhcp-4.0.0-ldap-configuration.patch 
	dhcp-4.0.0-libdhcp4client.patch dhcp-4.0.0-manpages.patch 
	dhcp-4.0.0-options.patch dhcp-4.0.0-paths.patch 
	dhcp-4.0.0-xen-checksum.patch 
Removed Files:
	Makefile.libdhcp4client dhclient-script.8 dhclient.8 
	dhclient.conf.5 dhcp-3.0.5-Makefile.patch 
	dhcp-3.0.5-default-requested-options.patch 
	dhcp-3.0.5-fast-timeout.patch dhcp-3.0.5-inherit-leases.patch 
	dhcp-3.0.5-prototypes.patch dhcp-3.0.6-ignore-hyphen-x.patch 
	dhcp-3.1.0-dhclient-anycast.patch 
	dhcp-3.1.0-dhclient-usage.patch 
	dhcp-3.1.0-ldap-configuration.patch 
	dhcp-3.1.0-libdhcp4client.patch dhcp-3.1.0-options.patch 
	dhcp-3.1.0-warnings.patch dhcp-3.1.0-xen-checksum.patch 
	dhcp-options.5 dhcpctl.3 dhcpd.conf dhcpd.conf.5 
	dhcpd.conf.sample 
Log Message:
DOES NOT COMPILE YET... This is a work in progress for rebasing this package
on ISC dhcp-4.0.0, which is a new major version.  Lots of work going in to
rebasing the package.

DON'T TOUCH!


dhcp-4.0.0-default-requested-options.patch:

--- NEW FILE dhcp-4.0.0-default-requested-options.patch ---
diff -up dhcp-4.0.0/client/clparse.c.dho dhcp-4.0.0/client/clparse.c
--- dhcp-4.0.0/client/clparse.c.dho	2007-12-29 06:32:16.000000000 -1000
+++ dhcp-4.0.0/client/clparse.c	2007-12-29 06:35:41.000000000 -1000
@@ -37,7 +37,7 @@
 
 struct client_config top_level_config;
 
-#define NUM_DEFAULT_REQUESTED_OPTS	9
+#define NUM_DEFAULT_REQUESTED_OPTS	12
 struct option *default_requested_options[NUM_DEFAULT_REQUESTED_OPTS + 1];
 
 static void parse_client_default_duid(struct parse *cfile);
@@ -107,6 +107,21 @@ isc_result_t read_client_conf ()
 	option_code_hash_lookup(&default_requested_options[8],
 				dhcpv6_universe.code_hash, &code, 0, MDL);
 
+	/* 10 */
+	code = DHO_NIS_DOMAIN;
+	option_code_hash_lookup(&default_requested_options[9],
+				dhcp_universe.code_hash, &code, 0, MDL);
+
+	/* 11 */
+	code = DHO_NIS_SERVERS;
+	option_code_hash_lookup(&default_requested_options[10],
+				dhcp_universe.code_hash, &code, 0, MDL);
+
+	/* 12 */
+	code = DHO_NTP_SERVERS;
+	option_code_hash_lookup(&default_requested_options[11],
+				dhcp_universe.code_hash, &code, 0, MDL);
+
 	for (code = 0 ; code < NUM_DEFAULT_REQUESTED_OPTS ; code++) {
 		if (default_requested_options[code] == NULL)
 			log_fatal("Unable to find option definition for "

dhcp-4.0.0-dhclient-anycast.patch:

--- NEW FILE dhcp-4.0.0-dhclient-anycast.patch ---
diff -up dhcp-4.0.0/common/lpf.c.anycast dhcp-4.0.0/common/lpf.c
--- dhcp-4.0.0/common/lpf.c.anycast	2007-12-29 06:44:46.000000000 -1000
+++ dhcp-4.0.0/common/lpf.c	2007-12-29 10:40:11.000000000 -1000
@@ -331,6 +331,9 @@ ssize_t send_packet (interface, packet, 
 		return send_fallback (interface, packet, raw,
 				      len, from, to, hto);
 
+	if (hto == NULL && interface->anycast_mac_addr.hlen)
+		hto = &interface->anycast_mac_addr;
+
 	/* Assemble the headers... */
 	assemble_hw_header (interface, (unsigned char *)hh, &hbufp, hto);
 	fudge = hbufp % 4;	/* IP header must be word-aligned. */
diff -up dhcp-4.0.0/common/conflex.c.anycast dhcp-4.0.0/common/conflex.c
--- dhcp-4.0.0/common/conflex.c.anycast	2007-12-29 06:44:46.000000000 -1000
+++ dhcp-4.0.0/common/conflex.c	2007-12-29 10:39:30.000000000 -1000
@@ -715,6 +715,8 @@ intern(char *atom, enum dhcp_token dfv) 
 		}
 		if (!strcasecmp (atom + 1, "nd"))
 			return AND;
+		if (!strcasecmp (atom + 1, "nycast-mac"))
+			return ANYCAST_MAC;
 		if (!strcasecmp (atom + 1, "ppend"))
 			return APPEND;
 		if (!strcasecmp (atom + 1, "llow"))
diff -up dhcp-4.0.0/includes/dhcpd.h.anycast dhcp-4.0.0/includes/dhcpd.h
--- dhcp-4.0.0/includes/dhcpd.h.anycast	2007-12-29 06:44:46.000000000 -1000
+++ dhcp-4.0.0/includes/dhcpd.h	2007-12-29 10:42:56.000000000 -1000
@@ -1188,6 +1188,7 @@ struct interface_info {
 	int dlpi_sap_length;
 	struct hardware dlpi_broadcast_addr;
 # endif /* DLPI_SEND || DLPI_RECEIVE */
+	struct hardware anycast_mac_addr;
 };
 
 struct hardware_link {
diff -up dhcp-4.0.0/includes/dhctoken.h.anycast dhcp-4.0.0/includes/dhctoken.h
--- dhcp-4.0.0/includes/dhctoken.h.anycast	2007-12-29 06:44:46.000000000 -1000
+++ dhcp-4.0.0/includes/dhctoken.h	2007-12-29 10:44:00.000000000 -1000
@@ -346,7 +346,8 @@ enum dhcp_token {
 	WHITESPACE = 649,
 	TOKEN_ALSO = 650,
 	AFTER = 651,
-	BOOTP_BROADCAST_ALWAYS = 652
+	BOOTP_BROADCAST_ALWAYS = 652,
+	ANYCAST_MAC = 653
 };
 
 #define is_identifier(x)	((x) >= FIRST_TOKEN &&	\
diff -up dhcp-4.0.0/client/clparse.c.anycast dhcp-4.0.0/client/clparse.c
--- dhcp-4.0.0/client/clparse.c.anycast	2007-12-29 06:44:46.000000000 -1000
+++ dhcp-4.0.0/client/clparse.c	2007-12-29 10:38:55.000000000 -1000
@@ -550,6 +550,17 @@ void parse_client_statement (cfile, ip, 
 		}
 		return;
 
+	      case ANYCAST_MAC:
+		token = next_token (&val, (unsigned *)0, cfile);
+		if (ip) {
+			parse_hardware_param (cfile, &ip -> anycast_mac_addr);
+		} else {
+			parse_warn (cfile, "anycast mac address parameter %s",
+			            "not allowed here.");
+			skip_to_semi (cfile);
+		}
+		return;
+
 	      case REQUEST:
 		token = next_token (&val, (unsigned *)0, cfile);
 		if (config -> requested_options == default_requested_options)

dhcp-4.0.0-dhclient-usage.patch:

--- NEW FILE dhcp-4.0.0-dhclient-usage.patch ---
diff -up dhcp-4.0.0/client/dhclient.c.usage dhcp-4.0.0/client/dhclient.c
--- dhcp-4.0.0/client/dhclient.c.usage	2007-12-31 18:05:29.000000000 -1000
+++ dhcp-4.0.0/client/dhclient.c	2007-12-31 18:05:43.000000000 -1000
@@ -893,21 +893,30 @@ main(int argc, char **argv) {
 
 static void usage ()
 {
-	log_info ("%s %s", message, PACKAGE_VERSION);
-	log_info (copyright);
-	log_info (arr);
-	log_info (url);
+	printf ("%s %s", message, PACKAGE_VERSION);
+	printf (copyright);
+	printf ("\n");
+	printf (arr);
+	printf ("\n");
+	printf (url);
+	printf ("\n");
 
-	log_error ("Usage: dhclient %s %s",
+	printf ("Usage: dhclient %s %s",
 #ifdef DHCPv6
                    "[-4|-6] [-1dvrx] [-nw] [-p <port>]",
 #else /* DHCPv6 */
                    "[-1dvrx] [-nw] [-p <port>]",
 #endif /* DHCPv6 */
-		   "[-s server]");
-	log_error ("                [-cf config-file] [-lf lease-file]%s",
-		   "[-pf pid-file] [-e VAR=val]");
-	log_fatal ("                [-sf script-file] [interface]");
+		   "[-s server]\n");
+	printf ("                [-cf config-file] [-lf lease-file]%s",
+		   "[-pf pid-file] [-e VAR=val]\n");
+	printf ("                [ -I <dhcp-client-identifier> ] [-B]\n");
+	printf ("                [ -H <host-name> | -F <fqdn.fqdn> ] [ -T <timeout> ]\n");
+	printf ("                [ -V <vendor-class-identifier> ]\n");
+	printf ("                [ -R <request option list> ]\n");
+	printf ("                [-sf script-file] [interface]\n");
+
+	exit (EXIT_FAILURE);
 }
 
 isc_result_t find_class (struct class **c,

dhcp-4.0.0-fast-timeout.patch:

--- NEW FILE dhcp-4.0.0-fast-timeout.patch ---
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_
 		ip -> flags |= INTERFACE_RUNNING;
 		for (client = ip -> client; client; client = client -> next) {
 			client -> state = S_INIT;
-			/* Set up a timeout to start the initialization
-			   process. */
-			add_timeout (cur_time + random () % 5,
-				     state_reboot, client, 0, 0);
+			add_timeout (cur_time, state_reboot, client, 0, 0);
 		}
 	}
 	return ISC_R_SUCCESS;

dhcp-4.0.0-ldap-configuration.patch:

--- NEW FILE dhcp-4.0.0-ldap-configuration.patch ---
diff -up dhcp-4.0.0/server/Makefile.am.ldap dhcp-4.0.0/server/Makefile.am
--- dhcp-4.0.0/server/Makefile.am.ldap	2007-05-29 06:32:11.000000000 -1000
+++ dhcp-4.0.0/server/Makefile.am	2008-01-02 11:18:44.000000000 -1000
@@ -4,12 +4,12 @@ dist_sysconf_DATA = dhcpd.conf
 sbin_PROGRAMS = dhcpd
 dhcpd_SOURCES = dhcpd.c dhcp.c bootp.c confpars.c db.c class.c failover.c \
 		omapi.c mdb.c stables.c salloc.c ddns.c dhcpleasequery.c \
-		dhcpv6.c mdb6.c
+		dhcpv6.c mdb6.c ldap.c ldap_casa.c
 
 # libomapi.a this is here twice to handle circular library dependencies :(
-dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../dst/libdst.a \
+dhcpd_LDADD = ../common/libdhcp.a ../omapip/libomapi.a ../dst/libdstnomd5.a \
 	      ../dhcpctl/libdhcpctl.a ../minires/libres.a \
-	      ../omapip/libomapi.a
+	      ../omapip/libomapi.a -lldap
 
 man_MANS = dhcpd.8 dhcpd.conf.5 dhcpd.leases.5
 EXTRA_DIST = $(man_MANS)
diff -up dhcp-4.0.0/server/mdb.c.ldap dhcp-4.0.0/server/mdb.c
--- dhcp-4.0.0/server/mdb.c.ldap	2007-11-30 11:51:43.000000000 -1000
+++ dhcp-4.0.0/server/mdb.c	2008-01-02 11:18:44.000000000 -1000
@@ -600,6 +600,12 @@ int find_hosts_by_haddr (struct host_dec
 			 const char *file, int line)
 {
 	struct hardware h;
+	int ret;
+
+#if defined(LDAP_CONFIGURATION)
+	if ((ret = find_haddr_in_ldap (hp, htype, hlen, haddr, file, line)))
+		return ret;
+#endif
 
 	h.hlen = hlen + 1;
 	h.hbuf [0] = htype;
diff -up /dev/null dhcp-4.0.0/server/ldap_casa.c
--- /dev/null	2007-12-31 11:39:52.874087547 -1000
+++ dhcp-4.0.0/server/ldap_casa.c	2008-01-02 11:18:44.000000000 -1000
@@ -0,0 +1,138 @@
+/* ldap_casa.c
+   
+   CASA routines for DHCPD... */
+
+/* Copyright (c) 2004 Internet Systems Consorium, Inc. ("ISC")
+ * Copyright (c) 1995-2003 Internet Software Consortium.
+ * Copyright (c) 2006 Novell, Inc.
+
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions are met: 
+ * 1.Redistributions of source code must retain the above copyright notice, 
+ *   this list of conditions and the following disclaimer. 
+ * 2.Redistributions in binary form must reproduce the above copyright notice, 
+ *   this list of conditions and the following disclaimer in the documentation 
+ *   and/or other materials provided with the distribution. 
+ * 3.Neither the name of ISC, ISC DHCP, nor the names of its contributors 
+ *   may be used to endorse or promote products derived from this software 
+ *   without specific prior written permission. 
+
+ * THIS SOFTWARE IS PROVIDED BY INTERNET SYSTEMS CONSORTIUM AND CONTRIBUTORS 
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ISC OR CONTRIBUTORS BE LIABLE 
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * POSSIBILITY OF SUCH DAMAGE.
+
+ * This file was written by S Kalyanasundaram <skalyanasundaram at novell.com>
+ */
+
+#if defined(LDAP_CASA_AUTH)
+#include "ldap_casa.h"
+#include "dhcpd.h"
+
+int
+load_casa (void)
+{
+       if( !(casaIDK = dlopen(MICASA_LIB,RTLD_LAZY)))
+       	  return 0;
+       p_miCASAGetCredential = (CASA_GetCredential_T) dlsym(casaIDK, "miCASAGetCredential");
+       p_miCASASetCredential = (CASA_SetCredential_T) dlsym(casaIDK, "miCASASetCredential");
+       p_miCASARemoveCredential = (CASA_RemoveCredential_T) dlsym(casaIDK, "miCASARemoveCredential");
+
+       if((p_miCASAGetCredential == NULL) ||
+         (p_miCASASetCredential == NULL) ||
+         (p_miCASARemoveCredential == NULL))
+       {
+          if(casaIDK)
+            dlclose(casaIDK);
+          casaIDK = NULL;
+          p_miCASAGetCredential = NULL;
+          p_miCASASetCredential = NULL;
+          p_miCASARemoveCredential = NULL;
+          return 0;
+       }
+       else
+          return 1;
+}
+
+static void
+release_casa(void)
+{
+   if(casaIDK)
+   {
+      dlclose(casaIDK);
+      casaIDK = NULL;
+   }
+
+   p_miCASAGetCredential = NULL;
+   p_miCASASetCredential = NULL;
+   p_miCASARemoveCredential = NULL;
+
+}
+
+int
+load_uname_pwd_from_miCASA (char **ldap_username, char **ldap_password)
+ {
+   int                     result = 0;
+   uint32_t                credentialtype = SSCS_CRED_TYPE_SERVER_F;
+   SSCS_BASIC_CREDENTIAL   credential;
+   SSCS_SECRET_ID_T        applicationSecretId;
+   char                    *tempVar = NULL;
+
+   const char applicationName[10] = "dhcp-ldap";
+
+   if ( load_casa() )
+   {
+      memset(&credential, 0, sizeof(SSCS_BASIC_CREDENTIAL));
+      memset(&applicationSecretId, 0, sizeof(SSCS_SECRET_ID_T));
+
+      applicationSecretId.len = strlen(applicationName) + 1;
+      memcpy (applicationSecretId.id, applicationName, applicationSecretId.len);
+
+      credential.unFlags = USERNAME_TYPE_CN_F;
+
+      result = p_miCASAGetCredential (0,
+                 &applicationSecretId,NULL,&credentialtype,
+                 &credential,NULL);
+
+      if(credential.unLen)
+      {
+         tempVar = dmalloc (credential.unLen + 1, MDL);
+         if (!tempVar)
+             log_fatal ("no memory for ldap_username");
+         memcpy(tempVar , credential.username, credential.unLen);
+         *ldap_username = tempVar;
+
+         tempVar = dmalloc (credential.pwordLen + 1, MDL);
+         if (!tempVar)
+             log_fatal ("no memory for ldap_password");
+         memcpy(tempVar, credential.password, credential.pwordLen);
+         *ldap_password = tempVar;
+
+#if defined (DEBUG_LDAP)
+         log_info ("Authentication credential taken from CASA");
+#endif
+
+         release_casa();
+         return 1;
+
+        }
+        else
+        {
+            release_casa();
+            return 0;
+        }
+      }
+      else
+          return 0; //casa libraries not loaded
+ }
+
+#endif /* LDAP_CASA_AUTH */
+
diff -up dhcp-4.0.0/server/dhcpd.c.ldap dhcp-4.0.0/server/dhcpd.c
--- dhcp-4.0.0/server/dhcpd.c.ldap	2007-11-30 11:51:43.000000000 -1000
+++ dhcp-4.0.0/server/dhcpd.c	2008-01-02 11:18:44.000000000 -1000
@@ -505,6 +505,14 @@ main(int argc, char **argv) {
 	/* Add the ddns update style enumeration prior to parsing. */
 	add_enumeration (&ddns_styles);
 	add_enumeration (&syslog_enum);
+#if defined (LDAP_CONFIGURATION)
+	add_enumeration (&ldap_methods);
+#if defined (USE_SSL)
+	add_enumeration (&ldap_ssl_usage_enum);
+	add_enumeration (&ldap_tls_reqcert_enum);
+	add_enumeration (&ldap_tls_crlcheck_enum);
+#endif
+#endif
 
 	if (!group_allocate (&root_group, MDL))
 		log_fatal ("Can't allocate root group!");
diff -up /dev/null dhcp-4.0.0/server/ldap.c
--- /dev/null	2007-12-31 11:39:52.874087547 -1000
+++ dhcp-4.0.0/server/ldap.c	2008-01-02 11:18:44.000000000 -1000
@@ -0,0 +1,2004 @@
[...2283 lines suppressed...]
 };
 
 /* Variable-length array of data. */
@@ -421,6 +428,32 @@ struct hardware {
 	u_int8_t hbuf [17];
 };
 
+#if defined(LDAP_CONFIGURATION)
+# define LDAP_BUFFER_SIZE		8192
+# define LDAP_METHOD_STATIC		0
+# define LDAP_METHOD_DYNAMIC	1
+#if defined (USE_SSL)
+# define LDAP_SSL_OFF			0
+# define LDAP_SSL_ON			1
+# define LDAP_SSL_TLS			2
+# define LDAP_SSL_LDAPS			3
+#endif
+
+/* This is a tree of the current configuration we are building from LDAP */
+struct ldap_config_stack {
+	LDAPMessage * res;	/* Pointer returned from ldap_search */
+	LDAPMessage * ldent;	/* Current item in LDAP that we're processing.
+							in res */
+	int close_brace;	/* Put a closing } after we're through with
+						this item */
+	int processed;	/* We set this flag if this base item has been
+					processed. After this base item is processed,
+					we can start processing the children */
+	struct ldap_config_stack *children;
+	struct ldap_config_stack *next;
+};
+#endif
+
 typedef enum {
 	server_startup = 0,
 	server_running = 1,
@@ -626,6 +659,29 @@ struct lease_state {
 # define DEFAULT_PING_TIMEOUT 1
 #endif
 
+#if defined(LDAP_CONFIGURATION)
+# define SV_LDAP_SERVER				47
+# define SV_LDAP_PORT				48
+# define SV_LDAP_USERNAME			49
+# define SV_LDAP_PASSWORD			50
+# define SV_LDAP_BASE_DN			51
+# define SV_LDAP_METHOD				52
+# define SV_LDAP_DEBUG_FILE			53
+# define SV_LDAP_DHCP_SERVER_CN		54
+# define SV_LDAP_REFERRALS			55
+#if defined (USE_SSL)
+# define SV_LDAP_SSL				56
+# define SV_LDAP_TLS_REQCERT		57
+# define SV_LDAP_TLS_CA_FILE		58
+# define SV_LDAP_TLS_CA_DIR			59
+# define SV_LDAP_TLS_CERT			60
+# define SV_LDAP_TLS_KEY			61
+# define SV_LDAP_TLS_CRLCHECK		62
+# define SV_LDAP_TLS_CIPHERS		63
+# define SV_LDAP_TLS_RANDFILE		64
+#endif
+#endif
+
 #if !defined (DEFAULT_DEFAULT_LEASE_TIME)
 # define DEFAULT_DEFAULT_LEASE_TIME 43200
 #endif
@@ -2035,7 +2091,7 @@ extern int db_time_format;
 char *quotify_string (const char *, const char *, int);
 char *quotify_buf (const unsigned char *, unsigned, const char *, int);
 char *print_base64 (const unsigned char *, unsigned, const char *, int);
-char *print_hw_addr PROTO ((int, int, unsigned char *));
+char *print_hw_addr PROTO ((const int, const int, const unsigned char *));
 void print_lease PROTO ((struct lease *));
 void dump_raw PROTO ((const unsigned char *, unsigned));
 void dump_packet_option (struct option_cache *, struct packet *,
@@ -3158,6 +3214,20 @@ OMAPI_OBJECT_ALLOC_DECL (dhcp_failover_l
 
 const char *binding_state_print (enum failover_state);
 
+/* ldap.c */
+#if defined(LDAP_CONFIGURATION)
+extern struct enumeration ldap_methods;
+#if defined (USE_SSL)
+extern struct enumeration ldap_ssl_usage_enum;
+extern struct enumeration ldap_tls_reqcert_enum;
+extern struct enumeration ldap_tls_crlcheck_enum;
+#endif
+isc_result_t ldap_read_config (void);
+int find_haddr_in_ldap (struct host_decl **, int, unsigned,
+                        const unsigned char *, const char *, int);
+int find_subclass_in_ldap (struct class *, struct class **,
+                           struct data_string *);
+#endif
 
 /* mdb6.c */
 HASH_FUNCTIONS_DECL(ia_na, unsigned char *, struct ia_na, ia_na_hash_t);
diff -up dhcp-4.0.0/includes/site.h.ldap dhcp-4.0.0/includes/site.h
--- dhcp-4.0.0/includes/site.h.ldap	2006-07-31 12:19:51.000000000 -1000
+++ dhcp-4.0.0/includes/site.h	2008-01-02 11:18:44.000000000 -1000
@@ -183,3 +183,13 @@
    traces. */
 
 #define TRACING
+
+/* Define this if you want to read your config from LDAP. Read README.ldap
+   about how to set this up */
+
+#define LDAP_CONFIGURATION
+
+/* Define this if you want to enable LDAP over a SSL connection. You will need
+   to add -lcrypto -lssl to the LIBS= line of server/Makefile */
+
+#define USE_SSL
diff -up /dev/null dhcp-4.0.0/includes/ldap_casa.h
--- /dev/null	2007-12-31 11:39:52.874087547 -1000
+++ dhcp-4.0.0/includes/ldap_casa.h	2008-01-02 11:18:44.000000000 -1000
@@ -0,0 +1,83 @@
+/* ldap_casa.h
+   
+   Definition for CASA modules... */
+
+/* Copyright (c) 2004 Internet Systems Consorium, Inc. ("ISC")
+ * Copyright (c) 1995-2003 Internet Software Consortium.
+ * Copyright (c) 2006 Novell, Inc.
+
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without 
+ * modification, are permitted provided that the following conditions are met: 
+ * 1.Redistributions of source code must retain the above copyright notice, 
+ *   this list of conditions and the following disclaimer. 
+ * 2.Redistributions in binary form must reproduce the above copyright notice, 
+ *   this list of conditions and the following disclaimer in the documentation 
+ *   and/or other materials provided with the distribution. 
+ * 3.Neither the name of ISC, ISC DHCP, nor the names of its contributors 
+ *   may be used to endorse or promote products derived from this software 
+ *   without specific prior written permission. 
+
+ * THIS SOFTWARE IS PROVIDED BY INTERNET SYSTEMS CONSORTIUM AND CONTRIBUTORS 
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ISC OR CONTRIBUTORS BE LIABLE 
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
+ * POSSIBILITY OF SUCH DAMAGE.
+
+ * This file was written by S Kalyanasundaram <skalyanasundaram at novell.com>
+ */
+
+#if defined(LDAP_CASA_AUTH)
+#ifndef __LDAP_CASA_H__
+#define __LDAP_CASA_H__
+
+#include <micasa_mgmd.h>
+#include <dlfcn.h>
+#include <string.h>
+
+#define MICASA_LIB     "libmicasa.so.1"
+
+SSCS_TYPEDEF_LIBCALL(int, CASA_GetCredential_T)
+(
+       uint32_t            ssFlags,
+       SSCS_SECRET_ID_T   *appSecretID,
+       SSCS_SECRET_ID_T   *sharedSecretID,
+       uint32_t           *credentialType,
+       void               *credential,
+       SSCS_EXT_T         *ext 
+);
+SSCS_TYPEDEF_LIBCALL(int, CASA_SetCredential_T)
+(
+       uint32_t            ssFlags,
+       SSCS_SECRET_ID_T   *appSecretID,
+       SSCS_SECRET_ID_T   *sharedSecretID,
+       uint32_t            credentialType,
+       void               *credential,
+       SSCS_EXT_T         *ext
+);
+
+SSCS_TYPEDEF_LIBCALL(int, CASA_RemoveCredential_T)
+(
+       uint32_t            ssFlags,
+       SSCS_SECRET_ID_T   *appSecretID,
+       SSCS_SECRET_ID_T   *sharedSecretID,
+       SSCS_EXT_T         *ext
+);
+static CASA_GetCredential_T            p_miCASAGetCredential = NULL;
+static CASA_SetCredential_T            p_miCASASetCredential = NULL;
+static CASA_RemoveCredential_T         p_miCASARemoveCredential = NULL;
+static void                            *casaIDK = NULL;
+
+int load_casa(void);
+static void release_casa(void);
+int load_uname_pwd_from_miCASA(char **, char **);
+
+#endif /* __LDAP_CASA_H__ */
+#endif /* LDAP_CASA_AUTH */
+

dhcp-4.0.0-libdhcp4client.patch:

--- NEW FILE dhcp-4.0.0-libdhcp4client.patch ---
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-02 18:27:51.000000000 -1000
@@ -20,9 +20,37 @@ if test "$GCC" = "yes"; then
 	fi
 fi
 
-AC_PROG_RANLIB
+AC_PROG_LIBTOOL
+
 AC_CONFIG_HEADERS([includes/config.h])
 
+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 sometimes need to know byte order for building packets
 AC_C_BIGENDIAN(AC_SUBST(byte_order, BIG_ENDIAN), 
 	       AC_SUBST(byte_order, LITTLE_ENDIAN))
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-02 19:05:36.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
+
+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
+
 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-02 17:18:02.000000000 -1000
@@ -37,7 +37,7 @@
 #include <omapip/omapip_p.h>
 #include <sys/time.h>
 
-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-02 17:18:01.000000000 -1000
+++ dhcp-4.0.0/omapip/errwarn.c	2008-01-02 17:18:02.000000000 -1000
@@ -37,6 +37,11 @@
 #include <errno.h>
 #include <syslog.h>
 
+#ifdef LIBDHCP
+#include <isc-dhcp/libdhcp_control.h>
+extern LIBDHCP_Control *libdhcp_control;
+#endif
+
 #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
 static char mbuf [CVT_BUF_MAX + 1];
+#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;
 
   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);
+#endif
 }
 
 /* Log an error message... */
@@ -99,6 +117,13 @@ int log_error (const char * fmt, ...)
 
   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.
    */
@@ -114,7 +139,7 @@ int log_error (const char * fmt, ...)
 	  write (STDERR_FILENO, mbuf, strlen (mbuf));
 	  write (STDERR_FILENO, "\n", 1);
   }
-
+#endif
   return 0;
 }
 
@@ -126,6 +151,13 @@ int log_info (const char *fmt, ...)
 
   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.
    */
@@ -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;
 
   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-02 17:18:02.000000000 -1000
@@ -37,6 +37,33 @@
 
 #include <omapip/omapip_p.h>
 
+#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 <search.h>  
+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;
@@ -72,7 +99,9 @@ dmalloc(unsigned size, const char *file,
 		return NULL;
 
 	foo = malloc(len);
-
+#ifdef LIBDHCP
+	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
 }
 
 #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-02 17:18:01.000000000 -1000
+++ dhcp-4.0.0/dst/Makefile.am	2008-01-02 17:45:26.000000000 -1000
@@ -2,11 +2,15 @@ AM_CPPFLAGS = -DMINIRES_LIB -DHMAC_MD5
 
 lib_LIBRARIES = libdst.a
 
-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
 
+libdstLIBDHCP_a_CFLAGS = -DLIBDHCP
+libdstLIBDHCP_a_SOURCES = dst_support.c dst_api.c hmac_link.c md5_dgst.c \
+		   base64.c prandom.c
+
 libdstnomd5_a_SOURCES = dst_support.c dst_api.c hmac_link.c \
 		   base64.c prandom.c
 
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-02 17:18:02.000000000 -1000
@@ -39,6 +39,10 @@ static const char rcsid[] = "$Header: /p
 
 #include "dst_internal.h"
 
+#ifdef LIBDHCP
+extern void* dmalloc(size_t,char *,int);
+#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 (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;
 
 	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) 
@@ -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);
 
 	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;
+#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/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-02 17:23:13.000000000 -1000
@@ -1,11 +1,17 @@
 AM_CPPFLAGS = -I.. -DLOCALSTATEDIR='"@localstatedir@"'
 
-noinst_LIBRARIES = libdhcp.a
+noinst_LIBRARIES = libdhcp.a libdhcpLIBDHCP.a
 libdhcp_a_SOURCES = alloc.c bpf.c comapi.c conflex.c ctrace.c discover.c \
 		    dispatch.c dlpi.c dns.c ethernet.c execute.c fddi.c \
 		    icmp.c inet.c lpf.c memory.c nit.c options.c packet.c \
 		    parse.c print.c raw.c resolv.c socket.c tables.c tr.c \
 		    tree.c upf.c heap.c
+libdhcpLIBDHCP_a_CFLAGS = -DLIBDHCP
+libdhcpLIBDHCP_a_SOURCES = alloc.c bpf.c comapi.c conflex.c ctrace.c \
+                           discover.c dispatch.c dlpi.c dns.c ethernet.c \
+                           execute.c inet.c lpf.c memory.c nit.c options.c \
+                           packet.c parse.c print.c socket.c tables.c tr.c \
+                           tree.c upf.c
 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-02 17:18:02.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. */
 
+#ifdef LIBDHCP
+int have_setup_fallback = 0;
+#endif
+
 void 
 discover_interfaces(int state) {
 	struct iface_conf_list ifaces;
@@ -902,7 +906,9 @@ discover_interfaces(int state) {
 	isc_result_t status;
 	int wifcount = 0;
 
+#ifndef LIBDHCP
 	static int setup_fallback = 0;
+#endif
 
 	if (!begin_iface_scan(&ifaces)) {
 		log_fatal("Can't get list of interfaces.");
@@ -1242,10 +1248,17 @@ discover_interfaces(int state) {
 		log_fatal ("Not configured to listen on any interfaces!");
 	}
 
+#ifdef LIBDHCP
+	if ((local_family == AF_INET) && !have_setup_fallback) {
+		have_setup_fallback = 1;
+		maybe_setup_fallback ();
+	}
+#else
 	if ((local_family == AF_INET) && !setup_fallback) {
 		setup_fallback = 1;
 		maybe_setup_fallback();
 	}
+#endif
 
 #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-02 17:18:02.000000000 -1000
@@ -41,7 +41,7 @@
 # include <regex.h>
 #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-02 17:18:02.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-02 17:18:02.000000000 -1000
+++ dhcp-4.0.0/common/dispatch.c	2008-01-02 17:18:02.000000000 -1000
@@ -34,8 +34,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)
 {
@@ -48,9 +64,41 @@ void set_time(TIME t)
 
 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;
@@ -68,9 +116,15 @@ struct timeval *process_outstanding_time
 			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
@@ -99,13 +153,28 @@ void add_timeout (when, where, what, ref
 	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
@@ -114,7 +183,29 @@ void add_timeout (when, where, what, ref
 		}
 		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) {
@@ -123,7 +214,7 @@ void add_timeout (when, where, what, ref
 			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!");
 		}
@@ -153,22 +244,76 @@ void add_timeout (when, where, what, ref
 		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) {
@@ -188,10 +333,15 @@ void cancel_timeout (where, what)
 		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;
@@ -200,13 +350,20 @@ void cancel_all_timeouts ()
 		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
 }
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-02 17:18:02.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/includes/dhcpd.h.libdhcp4client dhcp-4.0.0/includes/dhcpd.h
--- dhcp-4.0.0/includes/dhcpd.h.libdhcp4client	2008-01-02 17:18:02.000000000 -1000
+++ dhcp-4.0.0/includes/dhcpd.h	2008-01-02 17:18:02.000000000 -1000
@@ -1199,14 +1199,6 @@ struct hardware_link {
 
 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;
@@ -1664,7 +1656,6 @@ extern const char *path_dhcpd_pid;
 
 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;
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-02 19:06:30.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
+libdhcp4client_la_LIBADD = ../common/libdhcpLIBDHCP.a ../dst/libdstLIBDHCP.a \
+		 ../omapip/libomapiLIBDHCP.a ../minires/libres.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-02 17:18:02.000000000 -1000
+++ dhcp-4.0.0/client/dhclient.c	2008-01-02 19:02:04.000000000 -1000
@@ -83,14 +83,50 @@ int nowait=0;
 char *mockup_relay = NULL;
 int bootp_broadcast_always = 0;
 
+#ifdef LIBDHCP
+FILE *leaseFile = NULL;
+#endif
+
 extern u_int32_t default_requested_options[];
 
 static void usage PROTO ((void));
 
 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;
+
+	/* 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_Control *libdhcp_ctl, int argc, char **argv,
+                   char **envp)
+#else
+int main(int argc, char **argv, char **envp)
+#endif
+{
+#ifdef LIBDHCP
+	libdhcp_control = libdhcp_ctl;
+#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));
 
+#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	
+#endif
 
 	/* Set up the OMAPI. */
 	status = omapi_init ();
@@ -485,8 +523,12 @@ main(int argc, char **argv) {
 		}
 	}
 
+#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, PACKAGE_VERSION);
 		log_info (copyright);
@@ -497,6 +539,7 @@ main(int argc, char **argv) {
 		log_perror = 0;
 		quiet_interface_discovery = 1;
 	}
+#endif
 
 	/* 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->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); */
@@ -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
 
+#ifndef LIBDHCP
 	/* If we're not supposed to wait before getting the address,
 	   don't. */
 	if (nowait)
@@ -875,6 +925,126 @@ main(int argc, char **argv) {
 
 	/* 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;
+
+	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(&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;
@@ -1270,7 +1440,20 @@ void dhcpack (packet)
 	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)
@@ -1306,6 +1489,9 @@ void bind_lease (client)
 		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);
 
@@ -1398,10 +1584,12 @@ void state_stop (cpp)
 	}
 }  
 
+#ifndef LIBDHCP
 int commit_leases ()
 {
 	return 0;
 }
+#endif
 
 int write_lease (lease)
 	struct lease *lease;
@@ -2074,6 +2262,10 @@ void state_panic (cpp)
 	   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.");
@@ -2691,7 +2883,9 @@ void destroy_client_lease (lease)
 	free_client_lease (lease, MDL);
 }
 
+#ifndef LIBDHCP
 FILE *leaseFile = NULL;
+#endif
 int leases_written = 0;
 
 void rewrite_client_leases ()
@@ -3218,6 +3412,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;
+#else
 	char *scriptName;
 	char *argv [2];
 	char **envp;
@@ -3294,6 +3536,7 @@ int script_go (client)
 	time(&cur_time);
 	return (WIFEXITED (wstatus) ?
 		WEXITSTATUS (wstatus) : -WTERMSIG (wstatus));
+#endif
 }
 
 void client_envadd (struct client_state *client,
@@ -3376,6 +3619,9 @@ void go_daemon ()
 
 	/* 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;
 	}
@@ -3385,6 +3631,10 @@ void go_daemon ()
 		return;
 	state = 1;
 
+#ifdef LIBDHCP
+	return;
+#endif
+
 	/* Stop logging to stderr... */
 	log_perror = 0;
 

dhcp-4.0.0-manpages.patch:

--- NEW FILE dhcp-4.0.0-manpages.patch ---
diff -up dhcp-4.0.0/server/dhcpd.conf.5.manpages dhcp-4.0.0/server/dhcpd.conf.5
--- dhcp-4.0.0/server/dhcpd.conf.5.manpages	2007-11-20 08:34:37.000000000 -1000
+++ dhcp-4.0.0/server/dhcpd.conf.5	2008-01-02 11:26:38.000000000 -1000
@@ -513,6 +513,9 @@ pool {
 };
 .fi
 .PP
+Dynamic BOOTP leases are not compatible with failover, and, as such,
+you need to disallow BOOTP in pools that you are using failover for.
+.PP
 The  server currently  does very  little  sanity checking,  so if  you
 configure it wrong, it will just  fail in odd ways.  I would recommend
 therefore that you either do  failover or don't do failover, but don't
@@ -527,9 +530,9 @@ primary server might look like this:
 failover peer "foo" {
   primary;
   address anthrax.rc.vix.com;
-  port 519;
+  port 647;
   peer address trantor.rc.vix.com;
-  peer port 520;
+  peer port 847;
   max-response-delay 60;
   max-unacked-updates 10;
   mclt 3600;
@@ -588,9 +591,7 @@ statement
 .B port \fIport-number\fR\fB;\fR
 .PP
 The \fBport\fR statement declares the TCP port on which the server
-should listen for connections from its failover peer.   This statement
-may not currently be omitted, because the failover protocol does not
-yet have a reserved TCP port number.
+should listen for connections from its failover peer.
 .RE
 .PP
 The 
@@ -602,10 +603,8 @@ statement
 .PP
 The \fBpeer port\fR statement declares the TCP port to which the
 server should connect to reach its failover peer for failover
-messages.   This statement may not be omitted because the failover
-protocol does not yet have a reserved TCP port number.   The port
-number declared in the \fBpeer port\fR statement may be the same as
-the port number declared in the \fBport\fR statement.
+messages.  The port number declared in the \fBpeer port\fR statement
+may be the same as the port number declared in the \fBport\fR statement.
 .RE
 .PP
 The
@@ -1272,7 +1271,7 @@ the zone containing PTR records - for IS
 .PP
 .nf
 key DHCP_UPDATER {
-  algorithm HMAC-MD5.SIG-ALG.REG.INT;
+  algorithm hmac-md5;
   secret pRP5FapFoJ95JEL06sv4PQ==;
 };
 
@@ -1295,7 +1294,7 @@ dhcpd.conf file:
 .PP
 .nf
 key DHCP_UPDATER {
-  algorithm HMAC-MD5.SIG-ALG.REG.INT;
+  algorithm hmac-md5;
   secret pRP5FapFoJ95JEL06sv4PQ==;
 };
 
@@ -2433,7 +2432,8 @@ statement
 The \fInext-server\fR statement is used to specify the host address of
 the server from which the initial boot file (specified in the
 \fIfilename\fR statement) is to be loaded.   \fIServer-name\fR should
-be a numeric IP address or a domain name.
+be a numeric IP address or a domain name.  If no \fInext-server\fR statement
+applies to a given client, the address 0.0.0.0 is used.
 .RE
 .PP
 The
diff -up dhcp-4.0.0/common/dhcp-options.5.manpages dhcp-4.0.0/common/dhcp-options.5
--- dhcp-4.0.0/common/dhcp-options.5.manpages	2007-09-17 07:52:01.000000000 -1000
+++ dhcp-4.0.0/common/dhcp-options.5	2008-01-02 11:26:38.000000000 -1000
@@ -896,6 +896,21 @@ classless IP routing - it does not inclu
 classless IP routing is now the most widely deployed routing standard,
 this option is virtually useless, and is not implemented by any of the
 popular DHCP clients, for example the Microsoft DHCP client.
+.PP
+NOTE to @PRODUCTNAME@ dhclient users:
+.br
+dhclient-script interprets trailing 0 octets of the target as indicating
+the subnet class of the route, so for the following static-routes value:
+.br
+        option static-routes 172.0.0.0 172.16.2.254,
+.br
+                             192.168.0.0 192.168.2.254;
+.br
+dhclient-script will create routes:
+.br
+        172/8 via 172.16.2.254 dev $interface
+.br
+        192.168/16 via 192.168.2.254 dev $interface
 .RE
 .PP
 .nf
diff -up dhcp-4.0.0/client/dhclient-script.8.manpages dhcp-4.0.0/client/dhclient-script.8
--- dhcp-4.0.0/client/dhclient-script.8.manpages	2006-02-24 13:16:27.000000000 -1000
+++ dhcp-4.0.0/client/dhclient-script.8	2008-01-02 11:26:38.000000000 -1000
@@ -47,7 +47,7 @@ customizations are needed, they should b
 exit hooks provided (see HOOKS for details).   These hooks will allow the
 user to override the default behaviour of the client in creating a
 .B /etc/resolv.conf
-file.
+file, and to handle DHCP options not handled by default.
 .PP
 No standard client script exists for some operating systems, even though
 the actual client may work, so a pioneering user may well need to create
@@ -91,6 +91,26 @@ present.   The
 .B ETCDIR/dhclient-exit-hooks
 script can modify the valid of exit_status to change the exit status
 of dhclient-script.
+.PP
+Immediately after dhclient brings an interface UP with a new IP address,
+subnet mask, and routes, in the REBOOT/BOUND states, it will check for the
+existence of an executable
+.B ETCDIR/dhclient-up-hooks
+script, and source it if found. This script can handle DHCP options in
+the environment that are not handled by default. A per-interface.
+.B ETCDIR/dhclient-${IF}-up-hooks
+script will override the generic script and be sourced when interface
+$IF has been brought up.
+.PP
+Immediately before dhclient brings an interface DOWN, removing its IP
+address, subnet mask, and routes, in the STOP/RELEASE  states, it will
+check for the existence of an executable
+.B ETCDIR/dhclient-down-hooks
+script, and source it if found. This script can handle DHCP options in
+the environment that are not handled by default. A per-interface
+.B ETCDIR/dhclient-${IF}-down-hooks
+script will override the generic script and be sourced when interface
+$IF is about to be brought down.
 .SH OPERATION
 When dhclient needs to invoke the client configuration script, it
 defines a set of variables in the environment, and then invokes
diff -up dhcp-4.0.0/client/dhclient.conf.5.manpages dhcp-4.0.0/client/dhclient.conf.5
--- dhcp-4.0.0/client/dhclient.conf.5.manpages	2007-08-23 06:06:08.000000000 -1000
+++ dhcp-4.0.0/client/dhclient.conf.5	2008-01-02 11:26:38.000000000 -1000
@@ -186,9 +186,9 @@ responding to the client send the client
 options.   Only the option names should be specified in the request
 statement - not option parameters.   By default, the DHCP server
 requests the subnet-mask, broadcast-address, time-offset, routers,
-domain-name, domain-name-servers and host-name options.  Note that if
-you enter a 'request' statement, you over-ride this default and these
-options will not be requested.
+domain-name, domain-name-servers host-name, nis-domain, nis-servers,
+and ntp-servers options.  Note that if you enter a 'request' statement,
+you over-ride this default and these options will not be requested.
 .PP
 In some cases, it may be desirable to send no parameter request list
 at all.   To do this, simply write the request statement but specify
@@ -626,6 +626,18 @@ database and will record the media type 
 Whenever the client tries to renew the lease, it will use that same
 media type.   The lease must expire before the client will go back to
 cycling through media types.
+.PP
+ \fBbootp-broadcast-always;\fR
+.PP
+The
+.B bootp-broadcast-always
+statement instructs dhclient to always set the bootp broadcast flag in
+request packets, so that servers will always broadcast replies.
+This is equivalent to supplying the dhclient -B argument, and has
+the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
+This option is provided as an extension to enable dhclient to work
+on IBM s390 Linux guests.
+.PP
 .SH SAMPLE
 The following configuration file is used on a laptop running NetBSD
 1.3.   The laptop has an IP alias of 192.5.5.213, and has one
diff -up dhcp-4.0.0/client/dhclient.8.manpages dhcp-4.0.0/client/dhclient.8
--- dhcp-4.0.0/client/dhclient.8.manpages	2007-10-04 07:13:25.000000000 -1000
+++ dhcp-4.0.0/client/dhclient.8	2008-01-02 11:26:38.000000000 -1000
@@ -91,6 +91,33 @@ relay
 .B -w
 ]
 [
+.B -B
+]
+[
+.B -I
+.I dhcp-client-identifier
+]
+[
+.B -H
+.I host-name
+]
+[
+.B -F
+.I fqdn.fqdn
+]
+[
+.B -V
+.I vendor-class-identifier
+]
+[
+.B -R
+.I request-option-list
+]
+[
+.B -T
+.I timeout
+]
+[
 .B -v
 ]
 [
@@ -118,16 +145,6 @@ important details about the network to w
 the location of a default router, the location of a name server, and
 so on.
 .PP
-If given the -4 command line argument (default), dhclient will use the
-DHCPv4 protocol to obtain an IPv4 address and configuration parameters.
-.PP
-If given the -6 command line argument, dhclient will use the DHCPv6
-protocol to obtain whatever IPv6 addresses are available along with
-configuration parameters.  Information-request is not yet supported.
-.PP
-If given the --version command line argument, dhclient will print its
-version number and exit.
-.PP
 On startup, dhclient reads the
 .IR dhclient.conf
 for configuration instructions.   It then gets a list of all the
@@ -181,67 +198,183 @@ file.   If interfaces are specified in t
 only configure interfaces that are either specified in the
 configuration file or on the command line, and will ignore all other
 interfaces.
-.PP
-If the DHCP client should listen and transmit on a port other than the
-standard (port 68), the
-.B -p
-flag may used.  It should be followed by the udp port number that
-dhclient should use.  This is mostly useful for debugging purposes.
-If a different port is specified for the client to listen on and
-transmit on, the client will also use a different destination port -
-one greater than the specified destination port.
-.PP
-The DHCP client normally transmits any protocol messages it sends
-before acquiring an IP address to, 255.255.255.255, the IP limited
-broadcast address.   For debugging purposes, it may be useful to have
-the server transmit these messages to some other address.   This can
-be specified with the 
-.B -s
-flag, followed by the IP address or domain name of the destination.
-.PP
-For testing purposes, the giaddr field of all packets that the client
-sends can be set using the
-.B -g
-flag, followed by the IP address to send.   This is only useful for testing,
-and should not be expected to work in any consistent or useful way.
-.PP
-The DHCP client will normally run in the foreground until it has
-configured an interface, and then will revert to running in the
-background.   To run force dhclient to always run as a foreground
-process, the
-.B -d
-flag should be specified.  This is useful when running the client
-under a debugger, or when running it out of inittab on System V
-systems.
-.PP
-The dhclient daemon creates its own environment when executing the
-dhclient-script to do the grunt work of interface configuration.
-To define extra environment variables and their values, use the
-.B -e
-flag, followed by the environment variable name and value assignment,
-just as one would assign a variable in a shell.  Eg:
-.B -e
-.I IF_METRIC=1
-.PP
-The client normally prints no output during its startup sequence.  It
-can be made to emit verbose messages displaying the startup sequence events
-until it has acquired an address by supplying the
-.B -v
-command line argument.  In either case, the client logs messages using
-the
-.B syslog (3)
-facility.  A
-.B -q
-command line argument is provided for backwards compatibility, but since
-dhclient is quiet by default, it has no effect.
-.PP
-The client normally doesn't release the current lease as it is not
-required by the DHCP protocol.  Some cable ISPs require their clients
-to notify the server if they wish to release an assigned IP address.
+.SH OPTIONS
+.TP
+.BI \-4
+Use the DHCPv4 protocol to obtain an IPv4 address and configuration
+parameters.
+
+.TP
+.BI \-6
+Use the DHCPv6 protocol to obtain whatever IPv6 addresses are available
+along with configuration parameters.  Information-request is not yet
+supported.
+
+.TP
+.BI \-p\ <port\ number>
+The UDP port number the DHCP client should listen and transmit on.  If
+unspecified,
+.B dhclient
+uses the default port 68.  This option is mostly useful for debugging
+purposes.  If a different port is specified for the client to listen and
+transmit on, the client will also use a different destination port - one
+greater than the specified destination port.
+
+.TP
+.BI \-d
+Force
+.B dhclient
+to run as a foreground process.  This is useful when running the client
+under a debugger, or when running it out of inittab on System V systems.
+
+.TP
+.BI \-e\ VAR=value
+Define additional environment variables for the environment where
+dhclient-script executes.  You may specify multiple
+.B \-e
+options on the command line.
+
+.TP
+.BI \-q
+Suppress all terminal and log output except error messages.
+
+.TP
+.BI \-1
+Try one to get a lease.  On failure, exit with code 2.
+
+.TP
+.BI \-r
+Tell
+.B dhclient
+to release the current lease it has from the server.  This is not required
+by the DHCP protocol, but some ISPs require their clients to notify the
+server if they wish to release an assigned IP address.
+
+.TP
+.BI \-lf\ <lease-file>
+Path to the lease database file.  If unspecified, the default
+.B DBDIR/dhclient.leases
+is used.
+
+.TP
+.BI \-pf\ <pid-file>
+Path to the process ID file.  If unspecified, the default
+.B RUNDIR/dhclient.pid
+is used.
+
+.TP
+.BI \-cf\ <config-file>
+Path to the client configuration file.  If unspecified, the default
+.B ETCDIR/dhclient.conf
+is used.
+
+.TP
+.BI \-sf\ <script-file>
+Path to the network configuration script invoked by
+.B dhclient
+when it gets a lease.  If unspecified, the default
+.B CLIENTBINDIR/dhclient-script
+is used.
+
+.TP
+.BI \-s\ <server>
+Specifiy the server IP address or fully qualified domain name to transmit
+DHCP protocol messages to.  Normally,
+.B dhclient
+transmits these messages to 255.255.255.255 (the IP limited broadcast
+address).  Overriding this is mostly useful for debugging purposes.
+
+.TP
+.BI \-g\ <relay>
+Only for debugging.  Set the giaddr field of all packets the client
+sends to the IP address specified.  This should not be expected to work
+in any consistent or useful way.
+
+.TP
+.BI \-n
+Do not configure any interfaces.  Most useful combined with the
+.B -w
+option.
+
+.TP
+.BI \-nw
+Become a daemon process immediately (nowait) rather than waiting until an IP
+address has been acquired.
+
+.TP
+.BI \-w
+Keep running even if no network interfaces are found.  The
+.B omshell
+program can be used to notify the client when a network interface has been
+added or removed so it can attempt to configure an IP address on that
+interface.
+
+.TP
+.BI \-B
+Set the BOOTP broadcast flag in request packets so servers will always
+broadcast replies.
+
+.TP
+.BI \-I\ <dhcp-client-identifier>
+Specify the dhcp-client-identifier option to send to the DHCP server.
+
+.TP
+.BI \-H\ <host-name>
+Specify the host-name option to send to the DHCP server.  The host-name
+string only contains the client's hostname prefix, to which the server will
+append the ddns-domainname or domain-name options, if any, to derive the
+fully qualified domain name of the client.  The
+.B -H
+option cannot be used with the
+.B -F
+option.
+
+.TP
+.BI \-F\ <fqdn.fqdn>
+Specify the fqdn.fqdn option to send to the DHCP server.  This option cannot
+be used with the
+.B -H
+option.  The fqdn.fqdn option must specify the complete domain name of the
+client host, which the server may use for dynamic DNS updates.
+
+.TP
+.BI \-V\ <vendor-class-identifier>
+Specify the vendor-class-identifier option to send to the DHCP server.
+
+.TP
+.BI \-R\ <option>[,<option>...]
+Specify the list of options the client is to request from the server.  The
+option list must be a single string consisting of option names separated
+by at least one command and optional space characters.  The default option
+list is:
+
+.BR
+    subnet-mask, broadcast-address, time-offset, routers,
+.BR
+    domain-name, domain-name-servers, host-name, nis-domain,
+.BR
+    nis-servers, ntp-servers
+
 The
-.B -r
-flag explicitly releases the current lease, and once the lease has been
-released, the client exits.
+.B -R
+option does not append options to the default request, it overrides the
+default request list.  Keep this in mind if you want to request an
+additional option besides the default request list.  You will have to
+specify all option names for the
+.B -R
+parameter.
+
+.TP
+.BI \-T\ <timeout>
+Specify the time after which
+.B dhclient
+will decide that no DHCP servers can be contacted when no responses have been
+received.
+
+.TP
+.BI \-v
+Enable verbose log messages.
+
 .PP
 If the client is killed by a signal (for example at shutdown or reboot)
 it won't execute the
@@ -253,57 +386,7 @@ or
 it will execute
 .B dhclient-script (8)
 at shutdown with the specific reason for calling the script set.
-.PP
-The
-.B -1
-flag will cause dhclient to try once to get a lease.  If it fails, dhclient
-exits with exit code two.
-.PP
-The DHCP client normally gets its configuration information from
-.B ETCDIR/dhclient.conf,
-its lease database from
-.B DBDIR/dhclient.leases,
-stores its process ID in a file called
-.B RUNDIR/dhclient.pid,
-and configures the network interface using
-.B CLIENTBINDIR/dhclient-script
-To specify different names and/or locations for these files, use the
-.B -cf,
-.B -lf,
-.B -pf
-and
-.B -sf
-flags, respectively, followed by the name of the file.   This can be
-particularly useful if, for example,
-.B DBDIR
-or
-.B RUNDIR
-has not yet been mounted when the DHCP client is started.
-.PP
-The DHCP client normally exits if it isn't able to identify any
-network interfaces to configure.   On laptop computers and other
-computers with hot-swappable I/O buses, it is possible that a
-broadcast interface may be added after system startup.   The
-.B -w
-flag can be used to cause the client not to exit when it doesn't find
-any such interfaces.   The
-.B omshell (1)
-program can then be used to notify the client when a network interface
-has been added or removed, so that the client can attempt to configure an IP
-address on that interface.
-.PP
-The DHCP client can be directed not to attempt to configure any interfaces
-using the
-.B -n
-flag.   This is most likely to be useful in combination with the
-.B -w
-flag.
-.PP
-The client can also be instructed to become a daemon immediately, rather
-than waiting until it has acquired an IP address.   This can be done by
-supplying the
-.B -nw
-flag.
+
 .SH CONFIGURATION
 The syntax of the dhclient.conf(5) file is discussed separately.
 .SH OMAPI

dhcp-4.0.0-options.patch:

--- NEW FILE dhcp-4.0.0-options.patch ---
diff -up dhcp-4.0.0/common/conflex.c.options dhcp-4.0.0/common/conflex.c
--- dhcp-4.0.0/common/conflex.c.options	2007-12-29 11:13:51.000000000 -1000
+++ dhcp-4.0.0/common/conflex.c	2007-12-29 11:13:51.000000000 -1000
@@ -769,6 +769,8 @@ intern(char *atom, enum dhcp_token dfv) 
 			return BALANCE;
 		if (!strcasecmp (atom + 1, "ound"))
 			return BOUND;
+		if (!strcasecmp (atom + 1, "ootp-broadcast-always"))
+			return BOOTP_BROADCAST_ALWAYS;
 		break;
 	      case 'c':
 		if (!strcasecmp (atom + 1, "ase"))
diff -up dhcp-4.0.0/includes/dhcpd.h.options dhcp-4.0.0/includes/dhcpd.h
--- dhcp-4.0.0/includes/dhcpd.h.options	2007-12-29 11:13:51.000000000 -1000
+++ dhcp-4.0.0/includes/dhcpd.h	2007-12-29 11:13:51.000000000 -1000
@@ -1055,6 +1055,9 @@ struct client_config {
 	int do_forward_update;		/* If nonzero, and if we have the
 					   information we need, update the
 					   A record for the address we get. */
+
+	int bootp_broadcast_always;	/* If nonzero, always set the BOOTP_BROADCAST
+					   flag in requests */
 };
 
 /* Per-interface state used in the dhcp client... */
diff -up dhcp-4.0.0/includes/dhctoken.h.options dhcp-4.0.0/includes/dhctoken.h
--- dhcp-4.0.0/includes/dhctoken.h.options	2007-10-31 09:13:33.000000000 -1000
+++ dhcp-4.0.0/includes/dhctoken.h	2007-12-29 11:13:51.000000000 -1000
@@ -345,7 +345,8 @@ enum dhcp_token {
 	RANGE6 = 648,
 	WHITESPACE = 649,
 	TOKEN_ALSO = 650,
-	AFTER = 651
+	AFTER = 651,
+	BOOTP_BROADCAST_ALWAYS = 652
 };
 
 #define is_identifier(x)	((x) >= FIRST_TOKEN &&	\
diff -up dhcp-4.0.0/client/dhclient.c.options dhcp-4.0.0/client/dhclient.c
--- dhcp-4.0.0/client/dhclient.c.options	2007-11-30 11:51:42.000000000 -1000
+++ dhcp-4.0.0/client/dhclient.c	2007-12-29 11:14:15.000000000 -1000
@@ -37,6 +37,12 @@
 #include <sys/wait.h>
 #include <limits.h>
 
+/*
+ * Defined in stdio.h when _GNU_SOURCE is set, but we don't want to define
+ * that when building ISC code.
+ */
+extern int asprintf(char **strp, const char *fmt, ...);
+
 TIME default_lease_time = 43200; /* 12 hours... */
 TIME max_lease_time = 86400; /* 24 hours... */
 
@@ -75,6 +81,9 @@ int onetry=0;
 int quiet=1;
 int nowait=0;
 char *mockup_relay = NULL;
+int bootp_broadcast_always = 0;
+
+extern u_int32_t default_requested_options[];
 
 static void usage PROTO ((void));
 
@@ -100,6 +109,15 @@ main(int argc, char **argv) {
 	int no_dhclient_script = 0;
 	int local_family_set = 0;
 	char *s;
+	char *dhcp_client_identifier_arg = NULL;
+	char *dhcp_host_name_arg = NULL;
+	char *dhcp_fqdn_arg = NULL;
+	char *dhcp_vendor_class_identifier_arg = NULL;
+	char *dhclient_request_options = NULL;
+
+	int timeout_arg = 0;
+	char *arg_conf = NULL;
+	int arg_conf_len = 0;
 
 	/* Initialize client globals. */
 	memset(&default_duid, 0, sizeof(default_duid));
@@ -224,6 +242,88 @@ main(int argc, char **argv) {
 		} else if (!strcmp (argv [i], "--version")) {
 			log_info ("isc-dhclient-%s", PACKAGE_VERSION);
 			exit (0);
+		} else if (!strcmp (argv [i], "-I")) {
+			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+				usage ();
+				return EXIT_FAILURE;
+			}
+
+			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
+				log_error("-I option dhcp-client-identifier string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_MAX_OPTION_LEN-1);
+				exit(1);
+			}
+
+			dhcp_client_identifier_arg = argv[i];
+		} else if (!strcmp (argv [i], "-B")) {
+			bootp_broadcast_always = 1;
+		} else if (!strcmp (argv [i], "-H")) {
+			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+				usage ();
+				return EXIT_FAILURE;
+			}
+
+			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
+				log_error("-H option host-name string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_MAX_OPTION_LEN-1);
+				exit(1);
+			}
+
+			if (dhcp_host_name_arg != NULL) {
+				log_error("The -H <host-name> and -F <fqdn> arguments are mutually exclusive");
+				exit(1);
+			}
+
+			dhcp_host_name_arg = argv[i];
+		} else if (!strcmp (argv [i], "-F")) {
+			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+				usage ();
+				return EXIT_FAILURE;
+			}
+
+			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
+				log_error("-F option fqdn.fqdn string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_MAX_OPTION_LEN-1);
+				exit(1);
+			}
+
+			if (dhcp_fqdn_arg != NULL) {
+				log_error("Only one -F <fqdn> argument can be specified");
+				exit(1);
+			}
+
+			if (dhcp_host_name_arg != NULL) {
+				log_error("The -F <fqdn> and -H <host-name> arguments are mutually exclusive");
+				exit(1);
+			}
+
+			dhcp_fqdn_arg = argv[i];
+		} else if (!strcmp (argv [i], "-T")) {
+			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+				usage ();
+				return EXIT_FAILURE;
+			}
+
+			if ((timeout_arg = atoi(argv[i])) <= 0) {
+				log_error("-T timeout option must be > 0 - bad value: %s",argv[i]);
+				exit(1);
+			}
+		} else if (!strcmp (argv [i], "-V")) {
+			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+				usage ();
+				return EXIT_FAILURE;
+			}
+
+			if (strlen(argv[i]) >= DHCP_MAX_OPTION_LEN) {
+				log_error("-V option vendor-class-identifier string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_MAX_OPTION_LEN-1);
+				exit(1);
+			}
+
+			dhcp_vendor_class_identifier_arg = argv[i];
+		} else if (!strcmp (argv [i], "-R")) {
+			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
+				usage ();
+				return EXIT_FAILURE;
+			}
+
+			dhclient_request_options=argv[i];
  		} else if (argv [i][0] == '-') {
  		    usage ();
 		} else {
@@ -370,6 +470,166 @@ main(int argc, char **argv) {
 	/* Parse the dhclient.conf file. */
 	read_client_conf ();
 
+	/* Parse any extra command line configuration arguments: */
+	if ((dhcp_client_identifier_arg != NULL) && (*dhcp_client_identifier_arg != '\0')) {
+		arg_conf_len = asprintf(&arg_conf, "send dhcp-client-identifier \"%s\";", dhcp_client_identifier_arg);
+
+		if ((arg_conf == 0) || (arg_conf_len <= 0))
+			log_fatal("Unable to send -I option dhcp-client-identifier");
+	}
+
+	if ((dhcp_host_name_arg != NULL) && (*dhcp_host_name_arg != '\0')) {
+		if (arg_conf == 0) {
+			arg_conf_len = asprintf(&arg_conf, "send host-name \"%s\";", dhcp_host_name_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to send -H option host-name");
+		} else {
+			char *last_arg_conf = arg_conf;
+			arg_conf = NULL;
+			arg_conf_len = asprintf( &arg_conf, "%s\nsend host-name \"%s\";", last_arg_conf, dhcp_host_name_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to send -H option host-name");
+
+			free(last_arg_conf);
+		}
+	}
+
+	if ((dhcp_fqdn_arg != NULL) && (*dhcp_fqdn_arg != '\0')) {
+		if (arg_conf == 0) {
+			arg_conf_len = asprintf(&arg_conf,  "send fqdn.fqdn \"%s\";", dhcp_fqdn_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to send -F option fqdn.fqdn");
+		} else {
+			char *last_arg_conf = arg_conf;
+			arg_conf = NULL;
+			arg_conf_len = asprintf( &arg_conf, "%s\nsend fqdn.fqdn \"%s\";", last_arg_conf, dhcp_fqdn_arg);
+
+			if ((arg_conf == 0)  || (arg_conf_len <= 0))
+				log_fatal("Unable to send -F option fqdn.fqdn");
+
+			free(last_arg_conf);
+		}
+	}
+
+	if (timeout_arg) {
+		if (arg_conf == 0) {
+			arg_conf_len = asprintf(&arg_conf,  "timeout %d;", timeout_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to process -T timeout argument");
+		} else {
+			char *last_arg_conf = arg_conf;
+			arg_conf = NULL;
+			arg_conf_len = asprintf( &arg_conf, "%s\ntimeout %d;", last_arg_conf, timeout_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len == 0))
+				log_fatal("Unable to process -T timeout argument");
+
+			free(last_arg_conf);
+		}
+	}
+
+	if ((dhcp_vendor_class_identifier_arg != NULL) && (*dhcp_vendor_class_identifier_arg != '\0')) {
+		if (arg_conf == 0) {
+			arg_conf_len = asprintf(&arg_conf,  "send vendor-class-identifier \"%s\";", dhcp_vendor_class_identifier_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to send -V option vendor-class-identifier");
+		} else {
+			char *last_arg_conf = arg_conf;
+			arg_conf = NULL;
+			arg_conf_len = asprintf(&arg_conf, "%s\nsend vendor-class-identifier \"%s\";", last_arg_conf, dhcp_vendor_class_identifier_arg);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to send -V option vendor-class-identifier");
+
+			free(last_arg_conf);
+		}
+	}
+
+	if (dhclient_request_options != NULL) {
+		if (arg_conf == 0) {
+			arg_conf_len = asprintf(&arg_conf,  "request %s;", dhclient_request_options);
+
+			if ((arg_conf == 0) || (arg_conf_len <= 0))
+				log_fatal("Unable to parse -R <request options list> argument");
+		} else {
+			char *last_arg_conf = arg_conf;
+			arg_conf = NULL;
+			arg_conf_len = asprintf(&arg_conf, "%s\nrequest %s;", last_arg_conf, dhclient_request_options);
+
+			if ((arg_conf == 0)  || (arg_conf_len <= 0))
+				log_fatal("Unable to parse -R <request options list> argument");
+
+			free(last_arg_conf);
+		}
+	}
+
+	if (arg_conf) {
+		if (arg_conf_len == 0)
+			if ((arg_conf_len = strlen(arg_conf)) == 0)
+				/* huh ? cannot happen ! */
+				log_fatal("Unable to process -I/-H/-F/-T/-V/-R configuration arguments");
+
+		/* parse the extra dhclient.conf configuration arguments
+		 * into top level config: */
+		struct parse *cfile = (struct parse *)0;
+		const char *val = NULL;
+		int token;
+
+		status = new_parse (&cfile, -1, arg_conf, arg_conf_len, "extra dhclient -I/-H/-F/-T/-V/-R configuration arguments", 0);
+
+		if ((status != ISC_R_SUCCESS) || (cfile -> warnings_occurred))
+			log_fatal("Cannot parse -I/-H/-F/-T/-V/-R configuration arguments !");
+		/* more detailed parse failures will be logged */
+
+		do {
+			token = peek_token (&val, (unsigned *)0, cfile);
+			if (token == END_OF_FILE)
+				break;
+
+			parse_client_statement (cfile, (struct interface_info *)0, &top_level_config);
+		} while (1);
+
+		if (cfile -> warnings_occurred)
+			log_fatal ("Cannot parse -I/-H/-F/-T/-V/-R configuration arguments !");
+		end_parse (&cfile);
+
+		if (timeout_arg) {
+			/* we just set the toplevel timeout, but per-client
+			 * timeouts may still be at defaults. Also, it makes no
+			 * sense having the reboot_timeout or backoff_cutoff
+			 * greater than the timeout:
+			 */
+			if ((top_level_config.backoff_cutoff == 15) && (top_level_config.backoff_cutoff > (timeout_arg / 2)))
+				top_level_config.backoff_cutoff = (((unsigned long)(timeout_arg / 2)) == 0) ? timeout_arg : (unsigned long)(timeout_arg / 2);
+
+			for (ip = interfaces; ip; ip = ip -> next) {
+				if (ip->client->config->timeout == 60)
+					ip->client->config->timeout = timeout_arg;
+
+				if ((ip->client->config->reboot_timeout == 10) && (ip->client->config->reboot_timeout > ip->client->config->timeout))
+					ip->client->config->reboot_timeout = ip->client->config->timeout;
+				if ((ip->client->config->backoff_cutoff == 15) && (ip->client->config->backoff_cutoff > top_level_config.backoff_cutoff))
+					ip->client->config->backoff_cutoff = top_level_config.backoff_cutoff;
+			}
+		}
+
+		if ((dhclient_request_options != 0) && (top_level_config.requested_options != default_requested_options)) {
+			for (ip = interfaces; ip; ip = ip -> next) {
+				if (ip->client->config->requested_options == default_requested_options)
+					ip->client->config->requested_options = top_level_config.requested_options;
+			}
+		}
+
+		free(arg_conf);
+		arg_conf = NULL;
+		arg_conf_len = 0;
+	}
+
 	/* Parse the lease database. */
 	read_client_leases ();
 
@@ -2105,7 +2365,8 @@ void make_discover (client, lease)
 	client -> packet.xid = random ();
 	client -> packet.secs = 0; /* filled in by send_discover. */
 
-	if (can_receive_unicast_unconfigured (client -> interface))
+	if ((!(bootp_broadcast_always || client->config->bootp_broadcast_always))
+	    && can_receive_unicast_unconfigured(client->interface))
 		client -> packet.flags = 0;
 	else
 		client -> packet.flags = htons (BOOTP_BROADCAST);
@@ -2189,7 +2450,9 @@ void make_request (client, lease)
 	} else {
 		memset (&client -> packet.ciaddr, 0,
 			sizeof client -> packet.ciaddr);
-		if (can_receive_unicast_unconfigured (client -> interface))
+		if ((!(bootp_broadcast_always ||
+		    client ->config->bootp_broadcast_always)) &&
+		    can_receive_unicast_unconfigured (client -> interface))
 			client -> packet.flags = 0;
 		else
 			client -> packet.flags = htons (BOOTP_BROADCAST);
@@ -2248,7 +2511,8 @@ void make_decline (client, lease)
 	client -> packet.hops = 0;
 	client -> packet.xid = client -> xid;
 	client -> packet.secs = 0; /* Filled in by send_request. */
-	if (can_receive_unicast_unconfigured (client -> interface))
+	if ((!(bootp_broadcast_always || client->config-> bootp_broadcast_always))
+	    && can_receive_unicast_unconfigured (client->interface))
 		client -> packet.flags = 0;
 	else
 		client -> packet.flags = htons (BOOTP_BROADCAST);
diff -up dhcp-4.0.0/client/clparse.c.options dhcp-4.0.0/client/clparse.c
--- dhcp-4.0.0/client/clparse.c.options	2007-12-08 09:36:00.000000000 -1000
+++ dhcp-4.0.0/client/clparse.c	2007-12-29 11:13:51.000000000 -1000
@@ -132,6 +132,7 @@ isc_result_t read_client_conf ()
 	/* Requested lease time, used by DHCPv6 (DHCPv4 uses the option cache)
 	 */
 	top_level_config.requested_lease = 7200;
+	top_level_config.bootp_broadcast_always = 0;
 
 	group_allocate (&top_level_config.on_receipt, MDL);
 	if (!top_level_config.on_receipt)
@@ -295,7 +296,8 @@ void read_client_leases ()
 	interface-declaration |
 	LEASE client-lease-statement |
 	ALIAS client-lease-statement |
-	KEY key-definition */
+	KEY key-definition |
+	BOOTP_BROADCAST_ALWAYS */
 
 void parse_client_statement (cfile, ip, config)
 	struct parse *cfile;
@@ -685,6 +687,12 @@ void parse_client_statement (cfile, ip, 
 		parse_reject_statement (cfile, config);
 		return;
 
+	      case BOOTP_BROADCAST_ALWAYS:
+		token = next_token(&val, (unsigned*)0, cfile);
+		config -> bootp_broadcast_always = 1;
+		parse_semi (cfile);
+		return;
+
 	      default:
 		lose = 0;
 		stmt = (struct executable_statement *)0;

dhcp-4.0.0-paths.patch:

--- NEW FILE dhcp-4.0.0-paths.patch ---
diff -up dhcp-4.0.0/includes/dhcpd.h.paths dhcp-4.0.0/includes/dhcpd.h
--- dhcp-4.0.0/includes/dhcpd.h.paths	2008-01-01 15:09:21.000000000 -1000
+++ dhcp-4.0.0/includes/dhcpd.h	2008-01-01 15:10:55.000000000 -1000
@@ -1306,11 +1306,11 @@ typedef unsigned char option_mask [16];
 #endif /* DEBUG */
 
 #ifndef _PATH_DHCPD_DB
-#define _PATH_DHCPD_DB		LOCALSTATEDIR"/db/dhcpd.leases"
+#define _PATH_DHCPD_DB		LOCALSTATEDIR"/dhcpd/dhcpd.leases"
 #endif
 
 #ifndef _PATH_DHCPD6_DB
-#define _PATH_DHCPD6_DB		LOCALSTATEDIR"/db/dhcpd6.leases"
+#define _PATH_DHCPD6_DB		LOCALSTATEDIR"/dhcpd/dhcpd6.leases"
 #endif
 
 #ifndef _PATH_DHCPD_PID
@@ -1340,11 +1340,11 @@ typedef unsigned char option_mask [16];
 #endif
 
 #ifndef _PATH_DHCLIENT_DB
-#define _PATH_DHCLIENT_DB	LOCALSTATEDIR"/db/dhclient.leases"
+#define _PATH_DHCLIENT_DB	LOCALSTATEDIR"/dhclient/dhclient.leases"
 #endif
 
 #ifndef _PATH_DHCLIENT6_DB
-#define _PATH_DHCLIENT6_DB	LOCALSTATEDIR"/db/dhclient6.leases"
+#define _PATH_DHCLIENT6_DB	LOCALSTATEDIR"/dhclient/dhclient6.leases"
 #endif
 
 #ifndef _PATH_RESOLV_CONF

dhcp-4.0.0-xen-checksum.patch:

--- NEW FILE dhcp-4.0.0-xen-checksum.patch ---
diff -up dhcp-4.0.0/common/nit.c.xen dhcp-4.0.0/common/nit.c
--- dhcp-4.0.0/common/nit.c.xen	2007-09-05 07:32:10.000000000 -1000
+++ dhcp-4.0.0/common/nit.c	2007-12-29 06:39:16.000000000 -1000
@@ -366,7 +366,7 @@ ssize_t receive_packet (interface, buf, 
 
 	/* Decode the IP and UDP headers... */
 	offset = decode_udp_ip_header (interface, ibuf, bufix,
-				       from, length, &paylen);
+				       from, length, &paylen, 0);
 
 	/* If the IP or UDP checksum was bad, skip the packet... */
 	if (offset < 0)
diff -up dhcp-4.0.0/common/dlpi.c.xen dhcp-4.0.0/common/dlpi.c
--- dhcp-4.0.0/common/dlpi.c.xen	2007-10-08 04:27:53.000000000 -1000
+++ dhcp-4.0.0/common/dlpi.c	2007-12-29 06:39:13.000000000 -1000
@@ -689,7 +689,7 @@ ssize_t receive_packet (interface, buf, 
 	length -= offset;
 #endif
 	offset = decode_udp_ip_header (interface, dbuf, bufix,
-				       from, length, &paylen);
+				       from, length, &paylen, 0);
 
 	/* If the IP or UDP checksum was bad, skip the packet... */
 	if (offset < 0) {
diff -up dhcp-4.0.0/common/upf.c.xen dhcp-4.0.0/common/upf.c
--- dhcp-4.0.0/common/upf.c.xen	2007-07-12 20:43:42.000000000 -1000
+++ dhcp-4.0.0/common/upf.c	2007-12-29 06:39:24.000000000 -1000
@@ -317,7 +317,7 @@ ssize_t receive_packet (interface, buf, 
 
 	/* Decode the IP and UDP headers... */
 	offset = decode_udp_ip_header (interface, ibuf, bufix,
-				       from, length, &paylen);
+				       from, length, &paylen, 0);
 
 	/* If the IP or UDP checksum was bad, skip the packet... */
 	if (offset < 0)
diff -up dhcp-4.0.0/common/lpf.c.xen dhcp-4.0.0/common/lpf.c
--- dhcp-4.0.0/common/lpf.c.xen	2007-12-29 06:37:53.000000000 -1000
+++ dhcp-4.0.0/common/lpf.c	2007-12-29 06:43:08.000000000 -1000
@@ -29,18 +29,33 @@
 #include "dhcpd.h"
 #if defined (USE_LPF_SEND) || defined (USE_LPF_RECEIVE)
 #include <sys/ioctl.h>
+#include <sys/socket.h>
 #include <sys/uio.h>
 #include <errno.h>
 
 #include <asm/types.h>
 #include <linux/filter.h>
 #include <linux/if_ether.h>
+#include <linux/if_packet.h>
 #include <netinet/in_systm.h>
 #include "includes/netinet/ip.h"
 #include "includes/netinet/udp.h"
 #include "includes/netinet/if_ether.h"
 #include <net/if.h>
 
+#ifndef PACKET_AUXDATA
+#define PACKET_AUXDATA 8
+
+struct tpacket_auxdata
+{
+	__u32		tp_status;
+	__u32		tp_len;
+	__u32		tp_snaplen;
+	__u16		tp_mac;
+	__u16		tp_net;
+};
+#endif
+
 /* Reinitializes the specified interface after an address change.   This
    is not required for packet-filter APIs. */
 
@@ -66,10 +81,14 @@ int if_register_lpf (info)
 	struct interface_info *info;
 {
 	int sock;
-	struct sockaddr sa;
+	union {
+		struct sockaddr_ll ll;
+		struct sockaddr common;
+	} sa;
+	struct ifreq ifr;
 
 	/* Make an LPF socket. */
-	if ((sock = socket(PF_PACKET, SOCK_PACKET,
+	if ((sock = socket(PF_PACKET, SOCK_RAW,
 			   htons((short)ETH_P_ALL))) < 0) {
 		if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
 		    errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
@@ -84,11 +103,16 @@ int if_register_lpf (info)
 		log_fatal ("Open a socket for LPF: %m");
 	}
 
+	memset (&ifr, 0, sizeof ifr);
+	strncpy (ifr.ifr_name, (const char *)info -> ifp, sizeof ifr.ifr_name);
+	if (ioctl (sock, SIOCGIFINDEX, &ifr))
+		log_fatal ("Failed to get interface index: %m");
+
 	/* Bind to the interface name */
 	memset (&sa, 0, sizeof sa);
-	sa.sa_family = AF_PACKET;
-	strncpy (sa.sa_data, (const char *)info -> ifp, sizeof sa.sa_data);
-	if (bind (sock, &sa, sizeof sa)) {
+	sa.ll.sll_family = AF_PACKET;
+	sa.ll.sll_ifindex = ifr.ifr_ifindex;
+	if (bind (sock, &sa.common, sizeof sa)) {
 		if (errno == ENOPROTOOPT || errno == EPROTONOSUPPORT ||
 		    errno == ESOCKTNOSUPPORT || errno == EPFNOSUPPORT ||
 		    errno == EAFNOSUPPORT || errno == EINVAL) {
@@ -170,9 +194,18 @@ static void lpf_gen_filter_setup (struct
 void if_register_receive (info)
 	struct interface_info *info;
 {
+	int val;
+
 	/* Open a LPF device and hang it on this interface... */
 	info -> rfdesc = if_register_lpf (info);
 
+	val = 1;
+	if (setsockopt (info -> rfdesc, SOL_PACKET, PACKET_AUXDATA, &val,
+			sizeof val) < 0) {
+		if (errno != ENOPROTOOPT)
+			log_fatal ("Failed to set auxiliary packet data: %m");
+	}
+
 #if defined (HAVE_TR_SUPPORT)
 	if (info -> hw_address.hbuf [0] == HTYPE_IEEE802)
 		lpf_tr_filter_setup (info);
@@ -291,7 +324,6 @@ ssize_t send_packet (interface, packet, 
 	double hh [16];
 	double ih [1536 / sizeof (double)];
 	unsigned char *buf = (unsigned char *)ih;
-	struct sockaddr sa;
 	int result;
 	int fudge;
 
@@ -309,15 +341,7 @@ ssize_t send_packet (interface, packet, 
 				(unsigned char *)raw, len);
 	memcpy (buf + ibufp, raw, len);
 
-	/* For some reason, SOCK_PACKET sockets can't be connected,
-	   so we have to do a sentdo every time. */
-	memset (&sa, 0, sizeof sa);
-	sa.sa_family = AF_PACKET;
-	strncpy (sa.sa_data,
-		 (const char *)interface -> ifp, sizeof sa.sa_data);
-
-	result = sendto (interface -> wfdesc,
-			 buf + fudge, ibufp + len - fudge, 0, &sa, sizeof sa);
+	result = write (interface -> wfdesc, buf + fudge, ibufp + len - fudge);
 	if (result < 0)
 		log_error ("send_packet: %m");
 	return result;
@@ -334,14 +358,35 @@ ssize_t receive_packet (interface, buf, 
 {
 	int length = 0;
 	int offset = 0;
+	int nocsum = 0;
 	unsigned char ibuf [1536];
 	unsigned bufix = 0;
 	unsigned paylen;
+	unsigned char cmsgbuf[CMSG_LEN(sizeof(struct tpacket_auxdata))];
+	struct iovec iov = {
+		.iov_base = ibuf,
+		.iov_len = sizeof ibuf,
+	};
+	struct msghdr msg = {
+		.msg_iov = &iov,
+		.msg_iovlen = 1,
+		.msg_control = cmsgbuf,
+		.msg_controllen = sizeof(cmsgbuf),
+	};
+	struct cmsghdr *cmsg;
 
-	length = read (interface -> rfdesc, ibuf, sizeof ibuf);
+	length = recvmsg (interface -> rfdesc, &msg, 0);
 	if (length <= 0)
 		return length;
 
+	for (cmsg = CMSG_FIRSTHDR(&msg); cmsg; cmsg = CMSG_NXTHDR(&msg, cmsg)) {
+		if (cmsg->cmsg_level == SOL_PACKET &&
+		    cmsg->cmsg_type == PACKET_AUXDATA) {
+			struct tpacket_auxdata *aux = (void *)CMSG_DATA(cmsg);
+			nocsum = aux->tp_status & TP_STATUS_CSUMNOTREADY;
+		}
+	}
+
 	bufix = 0;
 	/* Decode the physical header... */
 	offset = decode_hw_header (interface, ibuf, bufix, hfrom);
@@ -358,7 +403,7 @@ ssize_t receive_packet (interface, buf, 
 
 	/* Decode the IP and UDP headers... */
 	offset = decode_udp_ip_header (interface, ibuf, bufix, from,
-				       (unsigned)length, &paylen);
+				       (unsigned)length, &paylen, nocsum);
 
 	/* If the IP or UDP checksum was bad, skip the packet... */
 	if (offset < 0)
diff -up dhcp-4.0.0/common/bpf.c.xen dhcp-4.0.0/common/bpf.c
--- dhcp-4.0.0/common/bpf.c.xen	2007-08-22 23:49:51.000000000 -1000
+++ dhcp-4.0.0/common/bpf.c	2007-12-29 06:39:09.000000000 -1000
@@ -482,7 +482,7 @@ ssize_t receive_packet (interface, buf, 
 		offset = decode_udp_ip_header (interface,
 					       interface -> rbuf,
 					       interface -> rbuf_offset,
-  					       from, hdr.bh_caplen, &paylen);
+  					       from, hdr.bh_caplen, &paylen, 0);
 
 		/* If the IP or UDP checksum was bad, skip the packet... */
 		if (offset < 0) {
diff -up dhcp-4.0.0/common/packet.c.xen dhcp-4.0.0/common/packet.c
--- dhcp-4.0.0/common/packet.c.xen	2007-12-29 06:37:53.000000000 -1000
+++ dhcp-4.0.0/common/packet.c	2007-12-29 06:39:20.000000000 -1000
@@ -210,7 +210,7 @@ ssize_t
 decode_udp_ip_header(struct interface_info *interface,
 		     unsigned char *buf, unsigned bufix,
 		     struct sockaddr_in *from, unsigned buflen,
-		     unsigned *rbuflen)
+		     unsigned *rbuflen, int nocsum)
 {
   unsigned char *data;
   struct ip ip;
@@ -321,7 +321,7 @@ decode_udp_ip_header(struct interface_in
 					   8, IPPROTO_UDP + ulen))));
 
   udp_packets_seen++;
-  if (usum && usum != sum) {
+  if (!nocsum && usum && usum != sum) {
 	  udp_packets_bad_checksum++;
 	  if (udp_packets_seen > 4 &&
 	      (udp_packets_seen / udp_packets_bad_checksum) < 2) {
diff -up dhcp-4.0.0/includes/dhcpd.h.xen dhcp-4.0.0/includes/dhcpd.h
--- dhcp-4.0.0/includes/dhcpd.h.xen	2007-12-29 06:37:53.000000000 -1000
+++ dhcp-4.0.0/includes/dhcpd.h	2007-12-29 06:39:27.000000000 -1000
@@ -2561,7 +2561,7 @@ ssize_t decode_hw_header PROTO ((struct 
 				 unsigned, struct hardware *));
 ssize_t decode_udp_ip_header PROTO ((struct interface_info *, unsigned char *,
 				     unsigned, struct sockaddr_in *,
-				     unsigned, unsigned *));
+				     unsigned, unsigned *, int));
 
 /* ethernet.c */
 void assemble_ethernet_header PROTO ((struct interface_info *, unsigned char *,


Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/dhcp/devel/.cvsignore,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
--- .cvsignore	23 Oct 2007 18:28:01 -0000	1.19
+++ .cvsignore	3 Jan 2008 20:40:53 -0000	1.20
@@ -1 +1 @@
-dhcp-3.1.0.tar.gz
+dhcp-4.0.0.tar.gz


Index: dhcp.spec
===================================================================
RCS file: /cvs/pkgs/rpms/dhcp/devel/dhcp.spec,v
retrieving revision 1.189
retrieving revision 1.190
diff -u -r1.189 -r1.190
--- dhcp.spec	5 Dec 2007 01:34:29 -0000	1.189
+++ dhcp.spec	3 Jan 2008 20:40:53 -0000	1.190
@@ -1,19 +1,10 @@
-# Use 64-bit pointers on POWER and z/Series
-%ifarch ppc64 s390x
-%define bigptrs -DPTRSIZE_64BIT
-%endif
-
-# The workdir is used in the build system for ISC dhcp, we set it to this
-# value to avoid any problems guessing what it might be during installation.
-%define workdir work.linux-2.2
-
-# The vendor name to append to the version number
+# vendor string (e.g., Fedora, EL)
 %define vvendor Fedora
 
 Summary:  DHCP (Dynamic Host Configuration Protocol) server and relay agent
 Name:     dhcp
-Version:  3.1.0
-Release:  12%{?dist}
+Version:  4.0.0
+Release:  1%{?dist}
 # NEVER CHANGE THE EPOCH on this package.  The previous maintainer made
 # incorrect use of the epoch and that's why it is at 12 now.  It should have
 # never been used, but it was.  So we are stuck with it.
@@ -22,49 +13,39 @@
 Group:    System Environment/Daemons
 URL:      http://isc.org/products/DHCP/
 Source0:  ftp://ftp.isc.org/isc/%{name}/%{name}-%{version}.tar.gz
-Source1:  dhcpd.conf.sample
-Source2:  dhcpd.init
-Source3:  dhcrelay.init
-Source4:  dhcpd.conf
-Source5:  libdhcp4client.pc
-Source6:  README.ldap
-Source7:  draft-ietf-dhc-ldap-schema-01.txt
-Source8:  dhcpd-conf-to-ldap
-Source9:  linux
-Source10: Makefile.libdhcp4client
-Source11: dhcp4client.h
-Source12: libdhcp_control.h
-Source13: dhcp.schema
-Source14: dhclient-script.8
-Source15: dhclient.8
-Source16: dhclient.conf.5
-Source17: dhcp-options.5
-Source18: dhcpctl.3
-Source19: dhcpd.conf.5
-Source20: get-ldap-patch.sh
-
-Patch0:   %{name}-3.0.5-Makefile.patch
-Patch1:   %{name}-3.0.5-errwarn-message.patch
-Patch2:   %{name}-3.1.0-ldap-configuration.patch
-Patch3:   %{name}-3.0.6-memory.patch
-Patch4:   %{name}-3.1.0-options.patch
-Patch5:   %{name}-3.0.5-release-by-ifup.patch
-Patch6:   %{name}-3.0.5-dhclient-decline-backoff.patch
-Patch7:   %{name}-3.0.5-enable-timeout-functions.patch
-Patch8:   %{name}-3.0.5-inherit-leases.patch
-Patch9:   %{name}-3.0.5-unicast-bootp.patch
-Patch10:  %{name}-3.0.5-fast-timeout.patch
-Patch11:  %{name}-3.0.5-failover-ports.patch
-Patch12:  %{name}-3.1.0-dhclient-usage.patch
-Patch13:  %{name}-3.0.5-default-requested-options.patch
-Patch14:  %{name}-3.0.5-prototypes.patch
-Patch15:  %{name}-3.1.0-libdhcp4client.patch
-Patch16:  %{name}-3.1.0-xen-checksum.patch
-Patch17:  %{name}-3.1.0-dhclient-anycast.patch
-Patch18:  %{name}-3.0.6-ignore-hyphen-x.patch
-Patch19:  %{name}-3.1.0-warnings.patch
+Source1:  dhcpd.init
+Source2:  dhcrelay.init
+Source3:  libdhcp4client.pc
+Source5:  README.ldap
+Source6:  draft-ietf-dhc-ldap-schema-01.txt
+Source7:  dhcpd-conf-to-ldap
+Source8:  linux
+Source9:  dhcp4client.h
+Source10: libdhcp_control.h
+Source11: dhcp.schema
+Source12: get-ldap-patch.sh
+
+Patch0:   %{name}-3.0.5-errwarn-message.patch
+Patch1:   %{name}-4.0.0-ldap-configuration.patch
+Patch2:   %{name}-3.0.6-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
+Patch8:   %{name}-4.0.0-fast-timeout.patch
+Patch9:   %{name}-3.0.5-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
+Patch13:  %{name}-4.0.0-dhclient-anycast.patch
+Patch14:  %{name}-4.0.0-manpages.patch
+Patch15:  %{name}-4.0.0-paths.patch
+Patch16:  %{name}-4.0.0-libdhcp4client.patch
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
+BuildRequires: autoconf
+BuildRequires: automake
 BuildRequires: groff
 BuildRequires: openldap-devel
 
@@ -136,221 +117,181 @@
 Dynamic Host Configuration Protocol (DHCP) Internet Protocol version 4 (IPv4)
 client library.
 
-%package -n libdhcp4client-static
-Summary: Static archive for libdhcp4client
-Group: Development/Libraries
-Requires: libdhcp4client-devel = %{epoch}:%{version}-%{release}
-
-%description -n libdhcp4client-static
-The libdhcp4client-static package contains the static archive for
-libdhcp4client.
-
 %prep
 %setup -q
 
-# Add vendor to the version number
-%{__sed} -e 's|V%{version}|V%{version}-%{vvendor}|g' includes/version.h > includes/version.h.new
-%{__mv} includes/version.h.new includes/version.h
-
-# Use $(MAKE) and $(CC) in the Makefiles
-%patch0 -p1 -b .Makefile
-
 # Replace the standard ISC warning message about requesting help with an
 # explanation that this is a patched build of ISC DHCP and bugs should be
 # reported through bugzilla.redhat.com
-%patch1 -p1 -b .message
+%patch0 -p1
 
 # Add support for dhcpd.conf data in LDAP
-%patch2 -p1 -b .ldap
+# NOTE: Use get-ldap-patch.sh to pull down latest LDAP patch and then modify
+# it for this package.
+%patch1 -p1
 
 # Fix memory alignment and initialization problems in common/packet.c
 # Fix buffer overflow in minires library
 # Init struct sock_prog in common/lpf.c to NULL
-%patch3 -p1 -b .memory
+%patch2 -p1
 
 # Add more dhclient options (-I, -B, -H, -F, -T, -V, and -R)
-%patch4 -p1 -b .options
+%patch3 -p1
 
 # Handle releasing interfaces requested by /sbin/ifup
 # pid file is assumed to be /var/run/dhclient-$interface.pid
-%patch5 -p1 -b .release
+%patch4 -p1
 
 # If we receive a DHCP offer in dhclient and it's DECLINEd in dhclient-script,
 # backoff for an amount of time before trying again
-%patch6 -p1 -b .decline
+%patch5 -p1
 
 # Enable cancel_all_timeouts() and relinquish_timeouts() regardless of
 # the DEBUG_MEMORY_LEAKAGE_ON_EXIT macro
-%patch7 -p1 -b .etf
-
-# Inherit active leases
-%patch8 -p1 -b .inherit
+%patch6 -p1
 
 # Support unicast BOOTP for IBM pSeries systems (and maybe others)
-%patch9 -p1 -b .unicast
+%patch7 -p1
 
 # Fast timeout for dhclient
-%patch10 -p1 -b .fast
+%patch8 -p1
 
 # Use the following IANA-registered failover ports:
 # dhcp-failover 647/tcp
 # dhcp-failover 647/udp
 # dhcp-failover 847/tcp
 # dhcp-failover 847/udp
-%patch11 -p1 -b .failover
+%patch9 -p1
 
 # Update the usage screen for dhclient(8) indicating new options
 # Use printf() rather than log_info() to display the information
 # Also, return EXIT_FAILURE when the usage() screen is displayed (stop parsing)
-%patch12 -p1 -b .usage
+%patch10 -p1
 
 # Add NIS domain, NIS servers, and NTP servers to the list of default
 # requested DHCP options
-%patch13 -p1 -b .dho
-
-# Add missing prototypes to take care of gcc warnings
-# in dst/dst_api.c: add b64_pton() and b64_ntop()
-# in includes/minires/minires.h: remove macro for b64_pton
-# in minires/res_mkupdate.c: add b64_pton() and dn_comp()
-# in minires/res_comp.c: add ns_name_uncompress(), ns_name_compress(), and
-#                        ns_name_skip()
-# in minires/res_init.c: add res_randomid()
-%patch14 -p1 -b .prototypes
-
-# Add the libdhcp4client target (library version of dhclient)
-%patch15 -p1 -b .libdhcp4client
+%patch11 -p1
 
 # Handle Xen partial UDP checksums
-%patch16 -p1 -b .xen
+%patch12 -p1
 
 # Add anycast support to dhclient (for OLPC)
-%patch17 -p1 -b .anycast
+%patch13 -p1
 
-# Ignore the old extended new option info command line switch (-x)
-%patch18 -p1 -b .enoi
+# Patch man page contents
+%patch14 -p1
 
-# Fix up anything that fails -Wall -Werror
-%patch19 -p1 -b .warnings
+# Change paths to conform to our standards
+%patch15 -p1
+
+# Add the libdhcp4client target (library version of dhclient)
+%patch16 -p1
 
 # Copy in documentation and example scripts for LDAP patch to dhcpd
-%{__install} -p -m 0644 %{SOURCE6} .
-%{__install} -p -m 0644 %{SOURCE7} doc/
-%{__install} -p -m 0755 %{SOURCE8} contrib/
+%{__install} -p -m 0644 %{SOURCE5} .
+%{__install} -p -m 0644 %{SOURCE6} doc/
+%{__install} -p -m 0755 %{SOURCE7} contrib/
 
 # Copy in the Fedora/RHEL dhclient script
-%{__install} -p -m 0755 %{SOURCE9} client/scripts/
+%{__install} -p -m 0755 %{SOURCE8} client/scripts/
 
 # Copy in the libdhcp4client headers and Makefile.dist
-%{__mkdir} -p libdhcp4client
-%{__install} -p -m 0644 %{SOURCE10} libdhcp4client/Makefile.dist
-%{__install} -p -m 0644 %{SOURCE11} libdhcp4client/
+%{__install} -p -m 0644 %{SOURCE9} includes/
 
 # Copy in libdhcp_control.h to the isc-dhcp includes directory
-%{__install} -p -m 0644 %{SOURCE12} includes/isc-dhcp/
+%{__install} -p -m 0644 %{SOURCE10} includes/isc-dhcp/
 
 # Ensure we don't pick up Perl as a dependency from the scripts and modules
 # in the contrib directory (we copy this to /usr/share/doc in the final
 # package).
 %{__cp} -a contrib __fedora_contrib
-%{__chmod} -x __fedora_contrib/3.0b1-lease-convert
-%{__chmod} -x __fedora_contrib/dhcpd-conf-to-ldap
-%{__mv} __fedora_contrib/ms2isc/Registry.pm __fedora_contrib/ms2isc/Registry.perlmodule
-%{__rm} -f __fedora_contrib/dhcp.spec
+pushd __fedora_contrib
+%{__chmod} -x 3.0b1-lease-convert dhclient-tz-exithook.sh dhcpd-conf-to-ldap
+%{__chmod} -x sethostname.sh solaris.init
+%{__mv} ms2isc/Registry.pm ms2isc/Registry.perlmodule
+%{__rm} -f dhcp.spec
 
 # We want UNIX-style line endings
-%{__sed} -i -e 's/\r//' __fedora_contrib/ms2isc/readme.txt
-%{__sed} -i -e 's/\r//' __fedora_contrib/ms2isc/Registry.perlmodule
-%{__sed} -i -e 's/\r//' __fedora_contrib/ms2isc/ms2isc.pl
-
-# Copy in our modified man pages
-%{__install} -p -m 0644 %{SOURCE14} client/dhclient-script.8
-%{__install} -p -m 0644 %{SOURCE15} client/dhclient.8
-%{__install} -p -m 0644 %{SOURCE16} client/dhclient.conf.5
-%{__install} -p -m 0644 %{SOURCE17} common/dhcp-options.5
-%{__install} -p -m 0644 %{SOURCE18} dhcpctl/dhcpctl.3
-%{__install} -p -m 0644 %{SOURCE19} server/dhcpd.conf.5
+%{__sed} -i -e 's/\r//' ms2isc/readme.txt
+%{__sed} -i -e 's/\r//' ms2isc/Registry.perlmodule
+%{__sed} -i -e 's/\r//' ms2isc/ms2isc.pl
+popd
 
-# Replace @PRODUCTNAME@ in dhcp-options.5
+# Replace @PRODUCTNAME@
 %{__sed} -i -e 's|@PRODUCTNAME@|%{vvendor}|g' common/dhcp-options.5
+%{__sed} -i -e 's|@PRODUCTNAME@|%{vvendor}|g' configure.ac
 
-%build
-%{__cp} %{SOURCE1} .
-%{__cat} <<EOF > site.conf
-VARDB=%{_localstatedir}/lib/dhcpd
-ADMMANDIR=%{_mandir}/man8
-FFMANDIR=%{_mandir}/man5
-LIBMANDIR=%{_mandir}/man3
-USRMANDIR=%{_mandir}/man1
-LIBDIR=%{_libdir}
-INCDIR=%{_includedir}
-EOF
-%{__cat} <<EOF >> includes/site.h
-#define _PATH_DHCPD_DB    "%{_localstatedir}/lib/dhcpd/dhcpd.leases"
-#define _PATH_DHCLIENT_DB "%{_localstatedir}/lib/dhclient/dhclient.leases"
-EOF
+aclocal
+libtoolize --copy --force
+autoconf
+autoheader
+automake --foreign --add-missing --copy
 
-# Disable gcc's strict aliasing since ISC code tends to cast a lot.
-##
-## Use -fvisibility=hidden for libdhcp4client.  The way that library is
-## constructed, we need to follow the hide-by-default/expose-what-we-need
-## plan for the library API.
-#COPTS="-fPIC -Werror -Dlint -fno-strict-aliasing -fvisibility=hidden"
-COPTS="-fPIC -Werror -Dlint -fno-strict-aliasing"
-
-# DO NOT use the %%configure macro because this configure script is not autognu
-CC="%{__cc}" ./configure \
-   --copts "$RPM_OPT_FLAGS $COPTS %{?bigptrs}" \
-   --work-dir %{workdir}
+%build
+%configure \
+    --enable-dhcpv6 \
+    --with-srv-lease-file=%{_localstatedir}/lib/dhcpd/dhcpd.leases \
+    --with-cli-lease-file=%{_localstatedir}/lib/dhclient/dhclient.leases \
+    --with-srv-pid-file=%{_localstatedir}/run/dhcpd.pid \
+    --with-cli-pid-file=%{_localstatedir}/run/dhclient.pid \
+    --with-relay-pid-file=%{_localstatedir}/run/dhcrelay.pid
+%{__make} %{?_smp_mflags}
 
-%{__sed} 's/@DHCP_VERSION@/%{version}/' < %{SOURCE5} > libdhcp4client.pc
-%{__make} %{?_smp_mflags} CC="%{__cc}"
+%{__sed} 's/@DHCP_VERSION@/%{version}/' < %{SOURCE3} > libdhcp4client.pc
 
 %install
 %{__rm} -rf %{buildroot}
-%{__mkdir} -p %{buildroot}%{_sysconfdir}/sysconfig
-
 %{__make} install DESTDIR=%{buildroot}
-%{__install} -p -m 0644 %{SOURCE12} %{buildroot}%{_includedir}/isc-dhcp/
 
+%{__rm} %{buildroot}%{_sysconfdir}/dhclient.conf
+
+%{__mkdir} -p %{buildroot}/sbin
+%{__mv} %{buildroot}%{_sbindir}/dhclient %{buildroot}/sbin/dhclient
+%{__install} -p -m 0755 client/scripts/linux %{buildroot}/sbin/dhclient-script
+
+%{__install} -p -m 0644 %{SOURCE10} %{buildroot}%{_includedir}/isc-dhcp/
+%{__install} -p -m 0644 -D libdhcp4client.pc %{buildroot}%{_libdir}/pkgconfig/libdhcp4client.pc
+
+# Install init scripts
 %{__mkdir} -p %{buildroot}%{_initrddir}
-%{__install} -p -m 0755 %{SOURCE2} %{buildroot}%{_initrddir}/dhcpd
+%{__install} -p -m 0755 %{SOURCE1} %{buildroot}%{_initrddir}/dhcpd
+%{__install} -p -m 0755 %{SOURCE2} %{buildroot}%{_initrddir}/dhcrelay
 
+# Start empty lease databases
+%{__mkdir} -p %{buildroot}%{_localstatedir}/lib/dhcpd/
 touch %{buildroot}%{_localstatedir}/lib/dhcpd/dhcpd.leases
 %{__mkdir} -p %{buildroot}%{_localstatedir}/lib/dhclient/
-%{__cat} <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcpd
-# Command line options here
-DHCPDARGS=
-EOF
 
-%{__install} -p -m 0755 %{SOURCE3} %{buildroot}%{_initrddir}/dhcrelay
+# Create default sysconfig files for dhcpd and dhcrelay
+%{__mkdir} -p %{buildroot}%{_sysconfdir}/sysconfig
 
-%{__cat} <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcrelay
+%{__cat} << EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcrelay
 # Command line options here
 INTERFACES=""
 DHCPSERVERS=""
 EOF
 
-# Copy sample dhclient.conf file into position
+%{__cat} <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcpd
+# Command line options here
+DHCPDARGS=
+EOF
+
+# Copy sample conf files into position (called by doc macro)
 %{__cp} -p client/dhclient.conf dhclient.conf.sample
-%{__chmod} 0755 %{buildroot}/sbin/dhclient-script
+%{__cp} -p server/dhcpd.conf dhcpd.conf.sample
 
 # Install default (empty) dhcpd.conf:
-%{__cp} -fp %{SOURCE4} %{buildroot}%{_sysconfdir}
+%{__cat} << EOF > %{buildroot}%{_sysconfdir}/dhcpd.conf
+#
+# DHCP Server Configuration file.
+#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
+#   see 'man 5 dhcpd.conf'
+#
+EOF
 
 # Install dhcp.schema for LDAP configuration
 %{__mkdir} -p %{buildroot}%{_sysconfdir}/openldap/schema
-%{__install} -p -m 0644 -D %{SOURCE13} %{buildroot}%{_sysconfdir}/openldap/schema
-
-%{__install} -p -m 0644 -D libdhcp4client.pc %{buildroot}%{_libdir}/pkgconfig/libdhcp4client.pc
-
-# Sources files can't be symlinks for debuginfo package generation
-find %{workdir} -type l |
-while read f; do
-    %{__rm} -f linkderef
-    %{__cp} $f linkderef
-    %{__rm} -f $f
-    %{__mv} linkderef $f
-done
+%{__install} -p -m 0644 -D %{SOURCE11} %{buildroot}%{_sysconfdir}/openldap/schema
 
 %clean
 %{__rm} -rf %{buildroot}
@@ -387,7 +328,7 @@
 
 %files
 %defattr(-,root,root,-)
-%doc README README.ldap RELNOTES dhcpd.conf.sample doc/IANA-arp-parameters
+%doc LICENSE README README.ldap RELNOTES dhcpd.conf.sample
 %doc doc/IANA-arp-parameters doc/api+protocol doc/*.txt __fedora_contrib/*
 %dir %{_localstatedir}/lib/dhcpd
 %verify(not size md5 mtime) %config(noreplace) %{_localstatedir}/lib/dhcpd/dhcpd.leases
@@ -423,30 +364,31 @@
 
 %files devel
 %defattr(-,root,root,-)
-%{_includedir}/dhcpctl.h
+%{_includedir}/dhcpctl
 %{_includedir}/isc-dhcp
 %{_includedir}/omapip
 %{_libdir}/libdhcpctl.a
 %{_libdir}/libomapi.a
-%attr(0644,root,root) %{_mandir}/man3/omshell.3.gz
+%{_libdir}/libdst.a
 %attr(0644,root,root) %{_mandir}/man3/dhcpctl.3.gz
 %attr(0644,root,root) %{_mandir}/man3/omapi.3.gz
 
 %files -n libdhcp4client
 %defattr(0755,root,root,0755)
-%{_libdir}/libdhcp4client-%{version}.so.*
+#%{_libdir}/libdhcp4client-%{version}.so.*
 
 %files -n libdhcp4client-devel
 %defattr(0644,root,root,0755)
-%{_includedir}/dhcp4client
+#%{_includedir}/dhcp4client
 %{_libdir}/pkgconfig/libdhcp4client.pc
-%{_libdir}/libdhcp4client.so
-
-%files -n libdhcp4client-static
-%defattr(0644,root,root,0755)
-%{_libdir}/libdhcp4client.a
+#%{_libdir}/libdhcp4client.so
 
 %changelog
+* Wed Jan 02 2008 David Cantrell <dcantrell at redhat.com> - 12:4.0.0-1
+- Upgrade to ISC dhcp-4.0.0 (first ISC release to incorporate DHCPv6
+  protocol support, source tree uses GNU autoconf/automake)
+- Removed the libdhcp4client-static package
+
 * Tue Dec 04 2007 David Cantrell <dcantrell at redhat.com> - 12:3.1.0-12
 - Requires line fixes
 


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/dhcp/devel/sources,v
retrieving revision 1.20
retrieving revision 1.21
diff -u -r1.20 -r1.21
--- sources	23 Oct 2007 18:28:01 -0000	1.20
+++ sources	3 Jan 2008 20:40:53 -0000	1.21
@@ -1 +1 @@
-27d179a3c3fbef576566b456a1168246  dhcp-3.1.0.tar.gz
+31d79b27ce4a94089a0b9ce7f72307fa  dhcp-4.0.0.tar.gz


--- Makefile.libdhcp4client DELETED ---


--- dhclient-script.8 DELETED ---


--- dhclient.8 DELETED ---


--- dhclient.conf.5 DELETED ---


--- dhcp-3.0.5-Makefile.patch DELETED ---


--- dhcp-3.0.5-default-requested-options.patch DELETED ---


--- dhcp-3.0.5-fast-timeout.patch DELETED ---


--- dhcp-3.0.5-inherit-leases.patch DELETED ---


--- dhcp-3.0.5-prototypes.patch DELETED ---


--- dhcp-3.0.6-ignore-hyphen-x.patch DELETED ---


--- dhcp-3.1.0-dhclient-anycast.patch DELETED ---


--- dhcp-3.1.0-dhclient-usage.patch DELETED ---


--- dhcp-3.1.0-ldap-configuration.patch DELETED ---


--- dhcp-3.1.0-libdhcp4client.patch DELETED ---


--- dhcp-3.1.0-options.patch DELETED ---


--- dhcp-3.1.0-warnings.patch DELETED ---


--- dhcp-3.1.0-xen-checksum.patch DELETED ---


--- dhcp-options.5 DELETED ---


--- dhcpctl.3 DELETED ---


--- dhcpd.conf DELETED ---


--- dhcpd.conf.5 DELETED ---


--- dhcpd.conf.sample DELETED ---




More information about the fedora-extras-commits mailing list