rpms/dhcp/devel dhcp-3.0.6-dhclient-usage.patch, NONE, 1.1 dhcp-3.0.6-ignore-hyphen-x.patch, NONE, 1.1 dhcp-3.0.6-libdhcp4client.patch, NONE, 1.1 dhcp-3.0.6-manpages.patch, NONE, 1.1 dhcp-3.0.6-options.patch, NONE, 1.1 dhcp.spec, 1.167, 1.168 dhcp-3.0.5-dhclient-usage.patch, 1.2, NONE dhcp-3.0.5-extended-new-option-info.patch, 1.4, NONE dhcp-3.0.5-libdhcp4client.patch, 1.11, NONE dhcp-3.0.5-manpages.patch, 1.2, NONE dhcp-3.0.5-options.patch, 1.2, NONE

David Cantrell (dcantrel) fedora-extras-commits at redhat.com
Thu Aug 16 18:33:39 UTC 2007


Author: dcantrel

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

Modified Files:
	dhcp.spec 
Added Files:
	dhcp-3.0.6-dhclient-usage.patch 
	dhcp-3.0.6-ignore-hyphen-x.patch 
	dhcp-3.0.6-libdhcp4client.patch dhcp-3.0.6-manpages.patch 
	dhcp-3.0.6-options.patch 
Removed Files:
	dhcp-3.0.5-dhclient-usage.patch 
	dhcp-3.0.5-extended-new-option-info.patch 
	dhcp-3.0.5-libdhcp4client.patch dhcp-3.0.5-manpages.patch 
	dhcp-3.0.5-options.patch 
Log Message:
* Wed Aug 15 2007 David Cantrell <dcantrell at redhat.com> - 12:3.0.6-3
- Remove the -x switch enabling extended new option info.  If given to
  dhclient now, it's ignored.


dhcp-3.0.6-dhclient-usage.patch:

--- NEW FILE dhcp-3.0.6-dhclient-usage.patch ---
diff -up dhcp-3.0.6/client/dhclient.c.usage dhcp-3.0.6/client/dhclient.c
--- dhcp-3.0.6/client/dhclient.c.usage	2007-08-15 11:48:12.000000000 -0400
+++ dhcp-3.0.6/client/dhclient.c	2007-08-15 11:50:22.000000000 -0400
@@ -808,16 +808,25 @@ int main (argc, argv, envp)
 
 static void usage ()
 {
-	log_info ("%s %s", message, DHCP_VERSION);
-	log_info (copyright);
-	log_info (arr);
-	log_info (url);
-
-	log_error ("Usage: dhclient [-1dqr] [-nw] [-p <port>] %s",
-		   "[-s server]");
-	log_error ("                [-cf config-file] [-lf lease-file]%s",
-		   "[-pf pid-file] [-e VAR=val]");
-	log_fatal ("                [-sf script-file] [interface]");
+	printf ("%s %s\n", message, DHCP_VERSION);
+	printf (copyright);
+	printf ("\n");
+	printf (arr);
+	printf ("\n");
+	printf (url);
+	printf ("\n");
+
+	printf ("Usage: dhclient [-1dqr] [-nw] [-p <port>] %s",
+	   "[-s server]");
+	printf ("                [-cf config-file] [-lf lease-file]%s",
+	   "[-pf pid-file] [-e VAR=val]");
+	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-3.0.6-ignore-hyphen-x.patch:

--- NEW FILE dhcp-3.0.6-ignore-hyphen-x.patch ---
diff -up dhcp-3.0.6/client/dhclient.c.enoi dhcp-3.0.6/client/dhclient.c
--- dhcp-3.0.6/client/dhclient.c.enoi	2007-08-15 16:14:32.000000000 -0400
+++ dhcp-3.0.6/client/dhclient.c	2007-08-15 16:17:17.000000000 -0400
@@ -259,6 +259,9 @@ int main (argc, argv, envp)
 		} else if (!strcmp (argv [i], "--version")) {
 			log_info ("isc-dhclient-%s", DHCP_VERSION);
 			exit (0);
+		} else if (!strcmp (argv [i], "-x")) {
+			/* ignored for compatibility */
+			continue;
 		} else if (!strcmp (argv [i], "-I")) {
 			if ((++i == argc) || (argv[i] == NULL) || (*(argv[i])=='\0')) {
 				usage ();

dhcp-3.0.6-libdhcp4client.patch:

--- NEW FILE dhcp-3.0.6-libdhcp4client.patch ---
diff -up dhcp-3.0.6/client/dhclient.c.libdhcp4client dhcp-3.0.6/client/dhclient.c
--- dhcp-3.0.6/client/dhclient.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/client/dhclient.c	2007-08-15 16:26:24.000000000 -0400
@@ -82,16 +82,52 @@ int quiet=0;
 int nowait=0;
 int bootp_broadcast_always = 0;
 
+#ifdef LIBDHCP
+FILE *leaseFile = NULL;
+#endif
+
 extern u_int32_t default_requested_options[];
 
 static void usage PROTO ((void));
 
 void do_release(struct client_state *);
 
+#ifdef LIBDHCP
+#include "libdhcp_control.h"
+LIBDHCP_Control *libdhcp_control;
+static void libdhcp_dispatch(void)
+{
+	struct timeval tv = { 0, 0 }, *tvp;
+	isc_result_t status;
+
+	/* Wait for a packet, or a timeout, or libdhcp being finished */
+	do {
+		tvp = process_outstanding_timeouts(&tv);
+		status = omapi_one_dispatch(0, tvp);
+
+		if (libdhcp_control && ((status == ISC_R_TIMEDOUT) || (libdhcp_control->timeout && (time(NULL) >= (libdhcp_control->timeout + libdhcp_control->now))))) {
+			if (libdhcp_control->callback)
+				libdhcp_control->callback(libdhcp_control, DHC_TIMEDOUT, NULL);
+
+			break;
+		}
+	} while ((status != ISC_R_TIMEDOUT) && ((!libdhcp_control) || (!(libdhcp_control->finished))));
+}
+
+extern void omapi_free_all_pointers(void);
+
+__attribute__ ((visibility ("default")))
+int dhcpv4_client (libdhcp_ctl, argc, argv, envp)
+	LIBDHCP_Control *libdhcp_ctl;
+#else
 int main (argc, argv, envp)
+#endif
 	int argc;
 	char **argv, **envp;
 {
+#ifdef LIBDHCP
+	libdhcp_control = libdhcp_ctl;
+#endif
 	int i;
 	struct servent *ent;
 	struct interface_info *ip;
@@ -119,6 +155,7 @@ int main (argc, argv, envp)
 	char *arg_conf = NULL;
 	int arg_conf_len = 0;
 
+#ifndef LIBDHCP
 	/* Make sure we have stdin, stdout and stderr. */
 	i = open ("/dev/null", O_RDWR);
 	if (i == 0)
@@ -139,6 +176,7 @@ int main (argc, argv, envp)
 #if !(defined (DEBUG) || defined (SYSLOG_4_2) || defined (__CYGWIN32__))
 	setlogmask (LOG_UPTO (LOG_INFO));
 #endif	
+#endif
 
 	/* Set up the OMAPI. */
 	status = omapi_init ();
@@ -431,8 +469,12 @@ int main (argc, argv, envp)
 		}
 	}
 
+#ifdef LIBDHCP
+	if (libdhcp_control && (libdhcp_control->capability & DHCP_USE_PID_FILE))
+#endif
 	write_client_pid_file();
 
+#ifndef LIBDHCP
 	if (!quiet) {
 		log_info ("%s %s", message, DHCP_VERSION);
 		log_info (copyright);
@@ -441,6 +483,7 @@ int main (argc, argv, envp)
 		log_info ("%s", "");
 	} else
 		log_perror = 0;
+#endif
 
 	/* If we're given a relay agent address to insert, for testing
 	   purposes, figure out what it is. */
@@ -672,11 +715,17 @@ int main (argc, argv, envp)
 		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); */
@@ -695,7 +744,7 @@ int main (argc, argv, envp)
 		if (!persist) {
 			/* Nothing more to do. */
 			log_info ("No broadcast interfaces found - exiting.");
-			exit (0);
+			return (0);
 		}
 	} else if (!release_mode) {
 		/* Call the script with the list of interfaces. */
@@ -789,6 +838,7 @@ int main (argc, argv, envp)
 	dmalloc_outstanding = 0;
 #endif
 
+#ifndef LIBDHCP
 	/* If we're not supposed to wait before getting the address,
 	   don't. */
 	if (nowait)
@@ -801,6 +851,126 @@ int main (argc, argv, envp)
 
 	/* 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;
@@ -1191,7 +1361,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)
@@ -1227,6 +1410,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);
 
@@ -1327,11 +1513,13 @@ int commit_leases ()
 	return 0;
 }
 
+#ifndef LIBDHCP
 int write_lease (lease)
 	struct lease *lease;
 {
 	return 0;
 }
+#endif
 
 int write_host (host)
 	struct host_decl *host;
@@ -1902,6 +2090,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.");
@@ -2506,7 +2698,9 @@ void destroy_client_lease (lease)
 	free_client_lease (lease, MDL);
 }
 
+#ifndef LIBDHCP
 FILE *leaseFile;
+#endif
 
 void rewrite_client_leases ()
 {
@@ -2902,6 +3096,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;
@@ -2978,6 +3220,7 @@ int script_go (client)
 	GET_TIME (&cur_time);
 	return (WIFEXITED (wstatus) ?
 		WEXITSTATUS (wstatus) : -WTERMSIG (wstatus));
+#endif
 }
 
 void client_envadd (struct client_state *client,
@@ -3061,6 +3304,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;
 	}
@@ -3070,6 +3316,10 @@ void go_daemon ()
 		return;
 	state = 1;
 
+#ifdef LIBDHCP
+	return;
+#endif
+
 	/* Stop logging to stderr... */
 	log_perror = 0;
 
diff -up dhcp-3.0.6/omapip/alloc.c.libdhcp4client dhcp-3.0.6/omapip/alloc.c
--- dhcp-3.0.6/omapip/alloc.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/omapip/alloc.c	2007-08-15 16:24:55.000000000 -0400
@@ -40,6 +40,33 @@ static char copyright[] =
 
 #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;
@@ -77,7 +104,9 @@ VOIDPTR dmalloc (size, file, line)
 		return (VOIDPTR)0;
 
 	foo = malloc(len);
-
+#ifdef LIBDHCP
+	record_pointer(foo);
+#endif
 	if (!foo)
 		return (VOIDPTR)0;
 	bar = (VOIDPTR)(foo + DMDOFFSET);
@@ -199,6 +228,9 @@ void dfree (ptr, file, line)
 		     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-3.0.6/omapip/dispatch.c.libdhcp4client dhcp-3.0.6/omapip/dispatch.c
--- dhcp-3.0.6/omapip/dispatch.c.libdhcp4client	2004-11-24 12:39:17.000000000 -0500
+++ dhcp-3.0.6/omapip/dispatch.c	2007-08-15 16:24:55.000000000 -0400
@@ -34,7 +34,7 @@
 
 #include <omapip/omapip_p.h>
 
-static omapi_io_object_t omapi_io_states;
+omapi_io_object_t omapi_io_states;
 TIME cur_time;
 
 OMAPI_OBJECT_ALLOC (omapi_io,
diff -up dhcp-3.0.6/omapip/errwarn.c.libdhcp4client dhcp-3.0.6/omapip/errwarn.c
--- dhcp-3.0.6/omapip/errwarn.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/omapip/errwarn.c	2007-08-15 16:24:55.000000000 -0400
@@ -39,6 +39,11 @@ static char copyright[] =
 #include <omapip/omapip_p.h>
 #include <errno.h>
 
+#ifdef LIBDHCP
+#include <libdhcp_control.h>
+extern LIBDHCP_Control *libdhcp_control;
+#endif
+
 #ifdef DEBUG
 int log_perror = -1;
 #else
@@ -48,7 +53,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... */
@@ -58,6 +65,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.
@@ -93,6 +110,7 @@ void log_fatal (const char * fmt, ... )
   if (log_cleanup)
 	  (*log_cleanup) ();
   exit (1);
+#endif
 }
 
 /* Log an error message... */
@@ -103,6 +121,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.
    */
@@ -120,7 +145,7 @@ int log_error (const char * fmt, ...)
 	  if (write (STDERR_FILENO, "\n", 1) <= 0)
 	    return 0;
   }
-
+#endif
   return 0;
 }
 
@@ -132,6 +157,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.
    */
@@ -149,7 +181,7 @@ int log_info (const char *fmt, ...)
 	  if (write (STDERR_FILENO, "\n", 1) <= 0)
 	    return 0;
   }
-
+#endif
   return 0;
 }
 
@@ -160,7 +192,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.
    */
@@ -178,7 +216,7 @@ int log_debug (const char *fmt, ...)
 	  if (write (STDERR_FILENO, "\n", 1) <= 0)
 	    return 0;
   }
-
+#endif
   return 0;
 }
 
diff -up dhcp-3.0.6/includes/dhcpd.h.libdhcp4client dhcp-3.0.6/includes/dhcpd.h
--- dhcp-3.0.6/includes/dhcpd.h.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/includes/dhcpd.h	2007-08-15 16:24:55.000000000 -0400
@@ -861,14 +861,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;
@@ -1795,7 +1787,6 @@ extern void (*bootp_packet_handler) PROT
 					    struct dhcp_packet *, unsigned,
 					    unsigned int,
 					    struct iaddr, struct hardware *));
-extern struct timeout *timeouts;
 extern omapi_object_type_t *dhcp_type_interface;
 #if defined (TRACING)
 trace_type_t *interface_trace;
diff -up dhcp-3.0.6/common/discover.c.libdhcp4client dhcp-3.0.6/common/discover.c
--- dhcp-3.0.6/common/discover.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/common/discover.c	2007-08-15 16:24:55.000000000 -0400
@@ -121,6 +121,10 @@ isc_result_t interface_initialize (omapi
    register that interface with the network I/O software, figure out what
    subnet it's on, and add it to the list of interfaces. */
 
+#ifdef LIBDHCP
+int have_setup_fallback = 0;
+#endif
+
 void discover_interfaces (state)
 	int state;
 {
@@ -139,7 +143,9 @@ void discover_interfaces (state)
 	char *s;
 #endif
 	isc_result_t status;
+#ifndef LIBDHCP
 	static int setup_fallback = 0;
+#endif
 	int wifcount = 0;
 
 	/* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */
@@ -692,10 +698,17 @@ void discover_interfaces (state)
 		log_fatal ("Not configured to listen on any interfaces!");
 	}
 
+#ifdef LIBDHCP
+	if (!have_setup_fallback) {
+		have_setup_fallback = 1;
+		maybe_setup_fallback ();
+	}
+#else
 	if (!setup_fallback) {
 		setup_fallback = 1;
 		maybe_setup_fallback ();
 	}
+#endif
 
 #if defined (HAVE_SETFD)
 	if (fallback_interface) {
diff -up dhcp-3.0.6/common/alloc.c.libdhcp4client dhcp-3.0.6/common/alloc.c
--- dhcp-3.0.6/common/alloc.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/common/alloc.c	2007-08-15 16:24:55.000000000 -0400
@@ -1009,7 +1009,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-3.0.6/common/tree.c.libdhcp4client dhcp-3.0.6/common/tree.c
--- dhcp-3.0.6/common/tree.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/common/tree.c	2007-08-15 16:24:55.000000000 -0400
@@ -40,7 +40,7 @@ static char copyright[] =
 #include "dhcpd.h"
 #include <omapip/omapip_p.h>
 
-struct binding_scope *global_scope;
+struct binding_scope __attribute__ ((visibility ("default"))) *global_scope;
 
 static int do_host_lookup PROTO ((struct data_string *,
 				  struct dns_host_entry *));
@@ -2615,6 +2615,7 @@ 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-3.0.6/common/options.c.libdhcp4client dhcp-3.0.6/common/options.c
--- dhcp-3.0.6/common/options.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/common/options.c	2007-08-15 16:24:55.000000000 -0400
@@ -2152,6 +2152,7 @@ int fqdn_option_space_encapsulate (resul
 	return 1;
 }
 
+__attribute__ ((visibility ("default")))
 void option_space_foreach (struct packet *packet, struct lease *lease,
 			   struct client_state *client_state,
 			   struct option_state *in_options,
diff -up dhcp-3.0.6/common/dispatch.c.libdhcp4client dhcp-3.0.6/common/dispatch.c
--- dhcp-3.0.6/common/dispatch.c.libdhcp4client	2007-08-15 16:24:55.000000000 -0400
+++ dhcp-3.0.6/common/dispatch.c	2007-08-15 16:24:55.000000000 -0400
@@ -39,8 +39,24 @@ static char copyright[] =
 
 #include "dhcpd.h"
 
-struct timeout *timeouts;
-static struct timeout *free_timeouts;
+struct timeout {
+#ifndef LIBDHCP
+	struct timeout *next;
+#endif
+	TIME when;
+	void (*func) PROTO ((void *));
+	void *what;
+	tvref_t ref;
+	tvunref_t unref;
+};
+
+#ifdef LIBDHCP
+static struct timeout *timeouts = NULL;
+static int ntimeouts = 0;
+#else
+static struct timeout *timeouts = NULL;
+static struct timeout *free_timeouts = NULL;
+#endif
 
 void set_time(TIME t)
 {
@@ -53,9 +69,41 @@ 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;
@@ -73,9 +121,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
@@ -104,13 +158,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
@@ -119,7 +188,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) {
@@ -128,7 +219,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!");
 		}
@@ -158,22 +249,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) {
@@ -193,10 +338,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;
@@ -205,13 +355,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-3.0.6/dst/hmac_link.c.libdhcp4client dhcp-3.0.6/dst/hmac_link.c
--- dhcp-3.0.6/dst/hmac_link.c.libdhcp4client	2001-02-22 02:22:08.000000000 -0500
+++ dhcp-3.0.6/dst/hmac_link.c	2007-08-15 16:24:55.000000000 -0400
@@ -38,6 +38,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_
@@ -86,7 +90,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) 
@@ -153,7 +161,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) 
@@ -217,8 +229,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));
@@ -347,7 +362,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 */
@@ -439,8 +458,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 */
@@ -463,7 +485,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-3.0.6/Makefile.dist.libdhcp4client dhcp-3.0.6/Makefile.dist
--- dhcp-3.0.6/Makefile.dist.libdhcp4client	2004-06-10 13:59:10.000000000 -0400
+++ dhcp-3.0.6/Makefile.dist	2007-08-15 16:24:55.000000000 -0400
@@ -22,7 +22,7 @@
 #   http://www.isc.org/
 
 
-SUBDIRS=	common $(MINIRES) dst omapip server client relay dhcpctl
+SUBDIRS=	common $(MINIRES) dst omapip server client relay dhcpctl libdhcp4client
 
 all:
 	@for dir in ${SUBDIRS}; do \
diff -up dhcp-3.0.6/configure.libdhcp4client dhcp-3.0.6/configure
--- dhcp-3.0.6/configure.libdhcp4client	2004-09-10 17:02:30.000000000 -0400
+++ dhcp-3.0.6/configure	2007-08-15 16:24:55.000000000 -0400
@@ -246,7 +246,7 @@ if [ ! -d $workname ]; then
 fi
 
 if [ x"$dirs" = x ]; then
-  dirs=". client server relay common omapip dhcpctl minires dst"
+  dirs=". client server relay common omapip dhcpctl minires dst libdhcp4client"
 fi
 
 for foo in $dirs; do

dhcp-3.0.6-manpages.patch:

--- NEW FILE dhcp-3.0.6-manpages.patch ---
diff -up dhcp-3.0.6/client/dhclient.8.manpages dhcp-3.0.6/client/dhclient.8
--- dhcp-3.0.6/client/dhclient.8.manpages	2007-05-01 16:42:55.000000000 -0400
+++ dhcp-3.0.6/client/dhclient.8	2007-08-15 12:08:48.000000000 -0400
@@ -82,6 +82,28 @@ relay
 .B -w
 ]
 [
+.B -I
+.I dhcp-client-identifier
+]
+[
+.B -H
+.I host-name
+.R |
+.B -F fqdn.fqdn
+]
+[
+.B -V
+.I vendor-class-identifier
+]
+[
+.B -R
+.I request option list
+]
+[
+.B -T
+.I timeout
+]
+[
 .I if0
 [
 .I ...ifN
@@ -265,6 +287,110 @@ than waiting until it has acquired an IP
 supplying the
 .B -nw
 flag.
+.PP
+The -I <id> argument allows you to specify the dhcp-client-identifier string,
+<id>, to be sent to the dhcp server on the command line.  It is equivalent to
+the top level dhclient.conf statement:
+.br
+ \fBsend dhcp-client-identifier "<id>";\fR
+.br
+The -I <id> command line option will override any top level dhclient.conf
+ 'send dhcp-client-identifier' statement, but more specific per-interface
+ 'interface "X" { send dhcp-client-identifier...; }' statements in dhclient.conf
+will override the -I <id> command line option for interface "X".
+This option is provided as a Red Hat extension to enable dhclient to work
+on IBM zSeries z/OS Linux guests.
+.PP
+The -B option instructs dhclient to set the bootp broadcast flag in request
+packets, so that servers will always broadcast replies. This is equivalent
+to specifying the 'bootp-broadcast-always' option in dhclient.conf, and has
+the same effect as specifying 'always-broadcast' in the server's dhcpd.conf.
+This option is provided as a Red Hat extension to enable dhclient to work
+on IBM zSeries z/OS Linux guests.
+.PP
+The -H <host-name> option allows you to specify the DHCP host-name option
+to send to the server on the dhclient command line. It is equivalent to the
+top level dhclient.conf statement:
+.br
+\f send host-name "<host-name>";\fR
+.br
+The -H <host-name> option  will override any top level dhclient.conf
+ 'send host-name' statement, but more specific per-interface
+ 'interface "X" { send host-name...;' statements in dhclient.conf
+will override the -H <host-name> command line option for interface "X".
+The host-name option only specifies the client's host name 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 host.
+The -H <host-name> option cannot be used with the -F <fqdn.fqdn> option.
+Only one -H <host-name> option may be specified.
+The -H <host-name> option is provided as a Red Hat extension to simplify
+configuration of clients of DHCP servers that require the host-name option
+to be sent (eg. some modern cable modems), and for dynamic DNS updates (DDNS).
+.PP
+The -F <fqdn.fqdn> option allows you to specify the DHCP fqdn.fqdn option
+to send to the server on the dhclient command line. It is equivalent to the
+top level dhclient.conf statement:
+.br
+\f send fqdn.fqdn "<domain-name>";\fR
+.br
+The -F <fqdn.fqdn> option  will override any top level dhclient.conf
+ 'send fqdn.fqdn' statement, but more specific per-interface
+ 'interface "X" { send fqdn.fqdn...;' statements in dhclient.conf
+will override the -F <fqdn.fqdn> command line option for interface "X".
+This option cannot be used with the -H <host-name> option.
+The DHCP fqdn.fqdn option must specify the complete domain name of the client
+host, which the server may use for dynamic DNS updates.
+Only one -F <fqdn.fqdn> option may be specified.
+The -F <fqdn.fqdn> option is provided as a Red Hat extension to simplify
+configuration of DDNS.
+.PP
+The -T <timeout> option allows you to specify the time after which
+the dhclient will decide that no DHCP servers can be contacted when
+no responses have been received. It is equivalent to the
+.br
+\f timeout <integer>;\fR
+.br
+dhclient.conf statement, and will override any such statements in dhclient.conf.
+.br
+This option is provided as a Red Hat extension.
+.PP
+The -V <vendor-class-identifier> option allows you to specify the DHCP
+vendor-class-identifier option to send to the server on the dhclient command
+line.  It is equivalent to the top level dhclient.conf statement:
+.br
+\f send vendor-class-identifier "<vendor-class-identifier>";\fR
+.br
+The -V <vendor-class-identifier> option  will override any top level
+dhclient.conf
+ 'send vendor-class-identifier' statement, but more specific per-interface
+ 'interface "X" { send vendor-class-identifier...;' statements in dhclient.conf
+will override the -V <vendor-class-identifier> command line option for
+interface "X".
+The -V <vendor-class-identifier> option is provided as a Red Hat extension to
+simplify configuration of clients of DHCP servers that require the
+vendor-class-identifier option to be sent.
+.PP
+The -R <request option list> option allows you to specify the list of options
+the client is to request from the server on the dhclient command line.
+The option list must be a single string, consisting of option names separated
+by at least one comma 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
+.br
+You can specify a different list of options to request with the -R <option list>
+argument.  This is equivalent to the dhclient.conf statement:
+.br
+\f    request <option list> ;\fR
+.br
+The -R argument is provided as a Red Hat extension to ISC dhclient to
+facilitate requesting a list of options from the server different to the
+default.
+.PP
 .SH CONFIGURATION
 The syntax of the dhclient.conf(5) file is discussed separately.
 .SH OMAPI
diff -up dhcp-3.0.6/client/dhclient-script.8.manpages dhcp-3.0.6/client/dhclient-script.8
--- dhcp-3.0.6/client/dhclient-script.8.manpages	2005-09-28 15:17:08.000000000 -0400
+++ dhcp-3.0.6/client/dhclient-script.8	2007-08-15 11:55:11.000000000 -0400
@@ -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,27 @@ 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-3.0.6/client/dhclient.conf.5.manpages dhcp-3.0.6/client/dhclient.conf.5
--- dhcp-3.0.6/client/dhclient.conf.5.manpages	2007-05-01 16:42:55.000000000 -0400
+++ dhcp-3.0.6/client/dhclient.conf.5	2007-08-15 11:56:40.000000000 -0400
@@ -185,7 +185,8 @@ 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. 
+domain-name, domain-name-servers, host-name, nis-domain, nis-servers,
+and ntp-servers options.
 .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
@@ -581,6 +582,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 a Red Hat extension to enable dhclient to work
+on IBM zSeries z/OS 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-3.0.6/dhcpctl/dhcpctl.3.manpages dhcp-3.0.6/dhcpctl/dhcpctl.3
--- dhcp-3.0.6/dhcpctl/dhcpctl.3.manpages	2004-09-24 17:08:38.000000000 -0400
+++ dhcp-3.0.6/dhcpctl/dhcpctl.3	2007-08-15 12:59:06.000000000 -0400
@@ -43,7 +43,7 @@
 .\"
 .\"
 .Sh SYNOPSIS
-.Fd #include <dhcpctl/dhcpctl.h>
+.Fd #include <dhcpctl.h>
 .Ft dhcpctl_status
 .Fo dhcpctl_initialize
 .Fa void
@@ -426,7 +426,7 @@ that most error checking has been ommitt
 #include <netinet/in.h>
 
 #include <isc/result.h>
-#include <dhcpctl/dhcpctl.h>
+#include <dhcpctl.h>
 
 int main (int argc, char **argv) {
 	dhcpctl_data_string ipaddrstring = NULL;
diff -up dhcp-3.0.6/server/dhcpd.conf.5.manpages dhcp-3.0.6/server/dhcpd.conf.5
--- dhcp-3.0.6/server/dhcpd.conf.5.manpages	2007-05-01 16:42:56.000000000 -0400
+++ dhcp-3.0.6/server/dhcpd.conf.5	2007-08-15 13:00:35.000000000 -0400
@@ -531,9 +531,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;
@@ -592,9 +592,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 
@@ -606,10 +604,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 
@@ -1133,7 +1129,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==;
 };
 
@@ -1156,7 +1152,7 @@ dhcpd.conf file:
 .PP
 .nf
 key DHCP_UPDATER {
-  algorithm HMAC-MD5.SIG-ALG.REG.INT;
+  algorithm hmac-md5;
   secret pRP5FapFoJ95JEL06sv4PQ==;
 };
 
diff -up dhcp-3.0.6/common/dhcp-options.5.manpages dhcp-3.0.6/common/dhcp-options.5
--- dhcp-3.0.6/common/dhcp-options.5.manpages	2006-04-26 11:12:43.000000000 -0400
+++ dhcp-3.0.6/common/dhcp-options.5	2007-08-15 12:10:12.000000000 -0400
@@ -834,6 +834,24 @@ 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 Red Hat dhclient users:
+.br
+The RedHat dhclient-script interprets trailing 0 octets of the target
+as indicating the subnet class of the route - so for this
+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
+the Red Hat 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
+.br
+which slightly increases the usefulness of the static-routes option.
 .RE
 .PP
 .nf

dhcp-3.0.6-options.patch:

--- NEW FILE dhcp-3.0.6-options.patch ---
diff -up dhcp-3.0.6/client/dhclient.c.options dhcp-3.0.6/client/dhclient.c
--- dhcp-3.0.6/client/dhclient.c.options	2007-08-15 11:19:40.000000000 -0400
+++ dhcp-3.0.6/client/dhclient.c	2007-08-15 11:43:18.000000000 -0400
@@ -38,6 +38,12 @@ static char ocopyright[] =
 #include "dhcpd.h"
 #include "version.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... */
 
@@ -74,6 +80,9 @@ int client_env_count=0;
 int onetry=0;
 int quiet=0;
 int nowait=0;
+int bootp_broadcast_always = 0;
+
+extern u_int32_t default_requested_options[];
 
 static void usage PROTO ((void));
 
@@ -100,6 +109,15 @@ int main (argc, argv, envp)
 	int no_dhclient_pid = 0;
 	int no_dhclient_script = 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;
 
 	/* Make sure we have stdin, stdout and stderr. */
 	i = open ("/dev/null", O_RDWR);
@@ -203,6 +221,88 @@ int main (argc, argv, envp)
 		} else if (!strcmp (argv [i], "--version")) {
 			log_info ("isc-dhclient-%s", DHCP_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_OPTION_LEN) {
+				log_error("-I option dhcp-client-identifier string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_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_OPTION_LEN) {
+				log_error("-H option host-name string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_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_OPTION_LEN) {
+				log_error("-F option fqdn.fqdn string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_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_OPTION_LEN) {
+				log_error("-V option vendor-class-identifier string \"%s\" is too long - maximum length is: %d",  argv[i], DHCP_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 {
@@ -339,6 +439,167 @@ int main (argc, argv, envp)
 	/* 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 ();
 
@@ -1912,7 +2173,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);
@@ -1996,7 +2258,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);
@@ -2055,7 +2319,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-3.0.6/client/clparse.c.options dhcp-3.0.6/client/clparse.c
--- dhcp-3.0.6/client/clparse.c.options	2007-08-15 11:19:40.000000000 -0400
+++ dhcp-3.0.6/client/clparse.c	2007-08-15 11:44:34.000000000 -0400
@@ -81,6 +81,7 @@ isc_result_t read_client_conf ()
 	top_level_config.requested_options = default_requested_options;
 	top_level_config.omapi_port = -1;
 	top_level_config.do_forward_update = 1;
+	top_level_config.bootp_broadcast_always = 0;
 
 	group_allocate (&top_level_config.on_receipt, MDL);
 	if (!top_level_config.on_receipt)
@@ -227,7 +228,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;
@@ -549,6 +551,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;
diff -up dhcp-3.0.6/includes/dhcpd.h.options dhcp-3.0.6/includes/dhcpd.h
--- dhcp-3.0.6/includes/dhcpd.h.options	2007-08-15 11:19:40.000000000 -0400
+++ dhcp-3.0.6/includes/dhcpd.h	2007-08-15 11:45:51.000000000 -0400
@@ -773,6 +773,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-3.0.6/includes/dhctoken.h.options dhcp-3.0.6/includes/dhctoken.h
--- dhcp-3.0.6/includes/dhctoken.h.options	2005-09-22 12:19:57.000000000 -0400
+++ dhcp-3.0.6/includes/dhctoken.h	2007-08-15 11:46:11.000000000 -0400
@@ -309,7 +309,8 @@ enum dhcp_token {
 	DOMAIN_NAME = 613,
 	DO_FORWARD_UPDATE = 614,
 	KNOWN_CLIENTS = 615,
-	ATSFP = 616
+	ATSFP = 616,
+	BOOTP_BROADCAST_ALWAYS = 617
 };
 
 #define is_identifier(x)	((x) >= FIRST_TOKEN &&	\
diff -up dhcp-3.0.6/common/conflex.c.options dhcp-3.0.6/common/conflex.c
--- dhcp-3.0.6/common/conflex.c.options	2007-08-15 11:19:40.000000000 -0400
+++ dhcp-3.0.6/common/conflex.c	2007-08-15 11:45:02.000000000 -0400
@@ -599,6 +599,8 @@ static enum dhcp_token intern (atom, 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"))


Index: dhcp.spec
===================================================================
RCS file: /cvs/pkgs/rpms/dhcp/devel/dhcp.spec,v
retrieving revision 1.167
retrieving revision 1.168
diff -u -r1.167 -r1.168
--- dhcp.spec	18 Jul 2007 15:09:40 -0000	1.167
+++ dhcp.spec	16 Aug 2007 18:33:06 -0000	1.168
@@ -13,7 +13,7 @@
 Summary:  DHCP (Dynamic Host Configuration Protocol) server and relay agent
 Name:     dhcp
 Version:  3.0.6
-Release:  2%{?dist}
+Release:  3%{?dist}
 Epoch:    12
 License:  ISC
 Group:    System Environment/Daemons
@@ -34,26 +34,26 @@
 Source13: libdhcp_control.h
 
 Patch0:   %{name}-3.0.5-Makefile.patch
-Patch5:   %{name}-3.0.5-warnings.patch
-Patch10:  %{name}-3.0.5-extended-new-option-info.patch
-Patch15:  %{name}-3.0.5-errwarn-message.patch
-Patch20:  %{name}-3.0.5-ldap-configuration.patch
-Patch25:  %{name}-3.0.6-memory.patch
-Patch30:  %{name}-3.0.5-options.patch
-Patch35:  %{name}-3.0.5-release-by-ifup.patch
-Patch40:  %{name}-3.0.5-dhclient-decline-backoff.patch
-Patch45:  %{name}-3.0.5-enable-timeout-functions.patch
-Patch50:  %{name}-3.0.5-inherit-leases.patch
-Patch55:  %{name}-3.0.5-unicast-bootp.patch
-Patch60:  %{name}-3.0.5-fast-timeout.patch
-Patch65:  %{name}-3.0.5-failover-ports.patch
-Patch70:  %{name}-3.0.5-dhclient-usage.patch
-Patch75:  %{name}-3.0.5-default-requested-options.patch
-Patch80:  %{name}-3.0.5-prototypes.patch
-Patch85:  %{name}-3.0.5-manpages.patch
-Patch90:  %{name}-3.0.5-libdhcp4client.patch
-Patch95:  %{name}-3.0.6-xen-checksum.patch
-Patch100: %{name}-3.0.5-dhclient-anycast.patch
+Patch1:   %{name}-3.0.5-warnings.patch
+Patch2:   %{name}-3.0.5-errwarn-message.patch
+Patch3:   %{name}-3.0.5-ldap-configuration.patch
+Patch4:   %{name}-3.0.6-memory.patch
+Patch5:   %{name}-3.0.6-options.patch
+Patch6:   %{name}-3.0.5-release-by-ifup.patch
+Patch7:   %{name}-3.0.5-dhclient-decline-backoff.patch
+Patch8:   %{name}-3.0.5-enable-timeout-functions.patch
+Patch9:   %{name}-3.0.5-inherit-leases.patch
+Patch10:  %{name}-3.0.5-unicast-bootp.patch
+Patch11:  %{name}-3.0.5-fast-timeout.patch
+Patch12:  %{name}-3.0.5-failover-ports.patch
+Patch13:  %{name}-3.0.6-dhclient-usage.patch
+Patch14:  %{name}-3.0.5-default-requested-options.patch
+Patch15:  %{name}-3.0.5-prototypes.patch
+Patch16:  %{name}-3.0.6-manpages.patch
+Patch17:  %{name}-3.0.6-libdhcp4client.patch
+Patch18:  %{name}-3.0.6-xen-checksum.patch
+Patch19:  %{name}-3.0.5-dhclient-anycast.patch
+Patch20:  %{name}-3.0.6-ignore-hyphen-x.patch
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires: groff openldap-devel
@@ -150,64 +150,60 @@
 %patch0 -p1 -b .Makefile
 
 # Fix up anything that fails -Wall -Werror
-%patch5 -p1 -b .warnings
-
-# Extended new option info patch.  Adds the -x option to dhclient, which is
-# needed for dhcdbd and NetworkManager
-%patch10 -p1 -b .enoi
+%patch1 -p1 -b .warnings
 
 # 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
-%patch15 -p1 -b .message
+%patch2 -p1 -b .message
 
 # Add support for dhcpd.conf data in LDAP
-%patch20 -p1 -b .ldap
+%patch3 -p1 -b .ldap
 
 # 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
-%patch25 -p1 -b .memory
+%patch4 -p1 -b .memory
 
 # Add more dhclient options (-I, -B, -H, -F, -T, -V, and -R)
-%patch30 -p1 -b .options
+%patch5 -p1 -b .options
 
 # Handle releasing interfaces requested by /sbin/ifup
 # pid file is assumed to be /var/run/dhclient-$interface.pid
-%patch35 -p1 -b .release
+%patch6 -p1 -b .release
 
 # If we receive a DHCP offer in dhclient and it's DECLINEd in dhclient-script,
 # backoff for an amount of time before trying again
-%patch40 -p1 -b .decline
+%patch7 -p1 -b .decline
 
 # Enable cancel_all_timeouts() and relinquish_timeouts() regardless of
 # the DEBUG_MEMORY_LEAKAGE_ON_EXIT macro
-%patch45 -p1 -b .etf
+%patch8 -p1 -b .etf
 
 # Inherit active leases
-%patch50 -p1 -b .inherit
+%patch9 -p1 -b .inherit
 
 # Support unicast BOOTP for IBM pSeries systems (and maybe others)
-%patch55 -p1 -b .unicast
+%patch10 -p1 -b .unicast
 
 # Fast timeout for dhclient
-%patch60 -p1 -b .fast
+%patch11 -p1 -b .fast
 
 # Use the following IANA-registered failover ports:
 # dhcp-failover 647/tcp
 # dhcp-failover 647/udp
 # dhcp-failover 847/tcp
 # dhcp-failover 847/udp
-%patch65 -p1 -b .failover
+%patch12 -p1 -b .failover
 
 # 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)
-%patch70 -p1 -b .usage
+%patch13 -p1 -b .usage
 
 # Add NIS domain, NIS servers, and NTP servers to the list of default
 # requested DHCP options
-%patch75 -p1 -b .dho
+%patch14 -p1 -b .dho
 
 # Add missing prototypes to take care of gcc warnings
 # in dst/dst_api.c: add b64_pton() and b64_ntop()
@@ -216,7 +212,7 @@
 # in minires/res_comp.c: add ns_name_uncompress(), ns_name_compress(), and
 #                        ns_name_skip()
 # in minires/res_init.c: add res_randomid()
-%patch80 -p1 -b .prototypes
+%patch15 -p1 -b .prototypes
 
 # Man page updates explaining new features added from the above patches.
 # Normally these man page changes would be included in the feature patch,
@@ -226,16 +222,19 @@
 # and not affect the code changes in the other patches.  It's actually
 # pretty common to update or alter these man pages independent of the code
 # changes.
-%patch85 -p1 -b .manpages
+%patch16 -p1 -b .manpages
 
 # Add the libdhcp4client target (library version of dhclient)
-%patch90 -p1 -b .libdhcp4client
+%patch17 -p1 -b .libdhcp4client
 
 # Handle Xen partial UDP checksums
-%patch95 -p1 -b .xen
+%patch18 -p1 -b .xen
 
 # Add anycast support to dhclient (for OLPC)
-%patch100 -p1 -b .anycast
+%patch19 -p1 -b .anycast
+
+# Ignore the old extended new option info command line switch (-x)
+%patch20 -p1 -b .enoi
 
 # Copy in documentation and example scripts for LDAP patch to dhcpd
 %{__install} -p -m 0644 %SOURCE6 .
@@ -293,9 +292,8 @@
 COPTS="-fPIC -Werror -Dlint -fno-strict-aliasing"
 
 # DO NOT use the %%configure macro because this configure script is not autognu
-# Enable extended option info patch (-DEXTENDED_NEW_OPTION_INFO)
 CC="%{__cc}" ./configure \
-   --copts "$RPM_OPT_FLAGS $COPTS %{?bigptrs} -DEXTENDED_NEW_OPTION_INFO" \
+   --copts "$RPM_OPT_FLAGS $COPTS %{?bigptrs}" \
    --work-dir %{workdir}
 
 %{__sed} 's/@DHCP_VERSION@/%{version}/' < %SOURCE5 > libdhcp4client.pc
@@ -433,6 +431,10 @@
 %{_libdir}/libdhcp4client.a
 
 %changelog
+* Wed Aug 15 2007 David Cantrell <dcantrell at redhat.com> - 12:3.0.6-3
+- Remove the -x switch enabling extended new option info.  If given to
+  dhclient now, it's ignored.
+
 * Wed Jul 18 2007 Florian La Roche <laroche at redhat.com> - 12:3.0.6-2
 - use a new macro name vendor -> vvendor to not overwrite the
   RPMTAG_VENDOR setting


--- dhcp-3.0.5-dhclient-usage.patch DELETED ---


--- dhcp-3.0.5-extended-new-option-info.patch DELETED ---


--- dhcp-3.0.5-libdhcp4client.patch DELETED ---


--- dhcp-3.0.5-manpages.patch DELETED ---


--- dhcp-3.0.5-options.patch DELETED ---




More information about the fedora-extras-commits mailing list