rpms/dhcp/devel dhcp-3.1.0-libdhcp4client.patch, 1.3, 1.4 dhcp.spec, 1.190, 1.191

David Cantrell (dcantrel) fedora-extras-commits at redhat.com
Fri Jan 11 00:49:52 UTC 2008


Author: dcantrel

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

Modified Files:
	dhcp.spec 
Added Files:
	dhcp-3.1.0-libdhcp4client.patch 
Log Message:
Final files to revert this tree back to dhcp-3.1.0 for now.  4.0.0 will come shortly, it's just not ready yet.


dhcp-3.1.0-libdhcp4client.patch:

Index: dhcp-3.1.0-libdhcp4client.patch
===================================================================
RCS file: dhcp-3.1.0-libdhcp4client.patch
diff -N dhcp-3.1.0-libdhcp4client.patch
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ dhcp-3.1.0-libdhcp4client.patch	11 Jan 2008 00:49:46 -0000	1.4
@@ -0,0 +1,1091 @@
+diff -up dhcp-3.1.0/omapip/dispatch.c.libdhcp4client dhcp-3.1.0/omapip/dispatch.c
+--- dhcp-3.1.0/omapip/dispatch.c.libdhcp4client	2005-03-17 15:15:21.000000000 -0500
++++ dhcp-3.1.0/omapip/dispatch.c	2007-10-24 14:55:56.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.1.0/omapip/errwarn.c.libdhcp4client dhcp-3.1.0/omapip/errwarn.c
+--- dhcp-3.1.0/omapip/errwarn.c.libdhcp4client	2007-10-24 14:55:56.000000000 -0400
++++ dhcp-3.1.0/omapip/errwarn.c	2007-10-24 14:57:16.000000000 -0400
+@@ -39,6 +39,11 @@ static char copyright[] =
+ #include <omapip/omapip_p.h>
+ #include <errno.h>
+ 
++#ifdef LIBDHCP
++#include <isc-dhcp/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.
+@@ -91,6 +108,7 @@ void log_fatal (const char * fmt, ... )
+   if (log_cleanup)
+ 	  (*log_cleanup) ();
+   exit (1);
++#endif
+ }
+ 
+ /* Log an error message... */
+@@ -101,6 +119,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.
+    */
+@@ -116,7 +141,7 @@ int log_error (const char * fmt, ...)
+ 	  write (STDERR_FILENO, mbuf, strlen (mbuf));
+ 	  write (STDERR_FILENO, "\n", 1);
+   }
+-
++#endif
+   return 0;
+ }
+ 
+@@ -128,6 +153,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.
+    */
+@@ -143,7 +175,7 @@ int log_info (const char *fmt, ...)
+ 	  write (STDERR_FILENO, mbuf, strlen (mbuf));
+ 	  write (STDERR_FILENO, "\n", 1);
+   }
+-
++#endif
+   return 0;
+ }
+ 
+@@ -154,7 +186,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.
+    */
+@@ -170,7 +208,7 @@ int log_debug (const char *fmt, ...)
+ 	  write (STDERR_FILENO, mbuf, strlen (mbuf));
+ 	  write (STDERR_FILENO, "\n", 1);
+   }
+-
++#endif
+   return 0;
+ }
+ 
+diff -up dhcp-3.1.0/omapip/alloc.c.libdhcp4client dhcp-3.1.0/omapip/alloc.c
+--- dhcp-3.1.0/omapip/alloc.c.libdhcp4client	2006-02-24 18:16:30.000000000 -0500
++++ dhcp-3.1.0/omapip/alloc.c	2007-10-24 14:55:56.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;
+@@ -78,7 +105,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);
+@@ -200,6 +229,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.1.0/configure.libdhcp4client dhcp-3.1.0/configure
+--- dhcp-3.1.0/configure.libdhcp4client	2005-03-17 15:14:55.000000000 -0500
++++ dhcp-3.1.0/configure	2007-10-24 14:55:56.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
+diff -up dhcp-3.1.0/dst/hmac_link.c.libdhcp4client dhcp-3.1.0/dst/hmac_link.c
+--- dhcp-3.1.0/dst/hmac_link.c.libdhcp4client	2001-02-22 02:22:08.000000000 -0500
++++ dhcp-3.1.0/dst/hmac_link.c	2007-10-24 14:55:56.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.1.0/common/discover.c.libdhcp4client dhcp-3.1.0/common/discover.c
+--- dhcp-3.1.0/common/discover.c.libdhcp4client	2006-11-07 18:41:39.000000000 -0500
++++ dhcp-3.1.0/common/discover.c	2007-10-24 14:55:56.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;
+ {
+@@ -141,7 +145,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. */
+@@ -695,10 +701,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.1.0/common/tree.c.libdhcp4client dhcp-3.1.0/common/tree.c
+--- dhcp-3.1.0/common/tree.c.libdhcp4client	2007-02-14 17:41:22.000000000 -0500
++++ dhcp-3.1.0/common/tree.c	2007-10-24 14:55:56.000000000 -0400
+@@ -41,7 +41,7 @@ static char copyright[] =
+ #include <omapip/omapip_p.h>
+ #include <ctype.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 *));
+@@ -2761,6 +2761,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.1.0/common/options.c.libdhcp4client dhcp-3.1.0/common/options.c
+--- dhcp-3.1.0/common/options.c.libdhcp4client	2007-05-23 15:26:22.000000000 -0400
++++ dhcp-3.1.0/common/options.c	2007-10-24 14:55:56.000000000 -0400
+@@ -2501,6 +2501,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.1.0/common/dispatch.c.libdhcp4client dhcp-3.1.0/common/dispatch.c
+--- dhcp-3.1.0/common/dispatch.c.libdhcp4client	2007-10-24 14:55:56.000000000 -0400
++++ dhcp-3.1.0/common/dispatch.c	2007-10-24 14:55:56.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.1.0/common/alloc.c.libdhcp4client dhcp-3.1.0/common/alloc.c
+--- dhcp-3.1.0/common/alloc.c.libdhcp4client	2006-06-01 16:23:17.000000000 -0400
++++ dhcp-3.1.0/common/alloc.c	2007-10-24 14:55:56.000000000 -0400
+@@ -1013,7 +1013,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.1.0/includes/dhcpd.h.libdhcp4client dhcp-3.1.0/includes/dhcpd.h
+--- dhcp-3.1.0/includes/dhcpd.h.libdhcp4client	2007-10-24 14:55:56.000000000 -0400
++++ dhcp-3.1.0/includes/dhcpd.h	2007-10-24 14:55:56.000000000 -0400
+@@ -1000,14 +1000,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;
+@@ -1960,7 +1952,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.1.0/client/dhclient.c.libdhcp4client dhcp-3.1.0/client/dhclient.c
+--- dhcp-3.1.0/client/dhclient.c.libdhcp4client	2007-10-24 14:55:56.000000000 -0400
++++ dhcp-3.1.0/client/dhclient.c	2007-10-24 14:56:20.000000000 -0400
+@@ -82,14 +82,50 @@ 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));
+ 
++#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_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 fd;
+ 	int i;
+ 	struct servent *ent;
+@@ -120,6 +156,7 @@ int main (argc, argv, envp)
+ 	char *arg_conf = NULL;
+ 	int arg_conf_len = 0;
+ 
++#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 decriptor is used. */
+@@ -143,6 +180,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 ();
+@@ -439,8 +477,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);
+@@ -449,6 +491,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. */
+@@ -680,11 +723,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); */
+@@ -703,7 +752,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 && !exit_mode) {
+ 		/* Call the script with the list of interfaces. */
+@@ -799,6 +848,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)
+@@ -811,6 +861,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;
+@@ -1203,7 +1373,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)
+@@ -1241,6 +1424,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);
+ 
+@@ -1343,11 +1529,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;
+@@ -1957,6 +2145,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.");
+@@ -2579,7 +2771,9 @@ void destroy_client_lease (lease)
+ 	free_client_lease (lease, MDL);
+ }
+ 
++#ifndef LIBDHCP
+ FILE *leaseFile;
++#endif
+ 
+ void rewrite_client_leases ()
+ {
+@@ -2960,6 +3154,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
+ 	int rval;
+ 	char *scriptName;
+ 	char *argv [2];
+@@ -3038,6 +3280,7 @@ int script_go (client)
+ 	GET_TIME (&cur_time);
+ 	return (WIFEXITED (wstatus) ?
+ 		WEXITSTATUS (wstatus) : -WTERMSIG (wstatus));
++#endif
+ }
+ 
+ void client_envadd (struct client_state *client,
+@@ -3120,6 +3363,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;
+ 	}
+@@ -3129,6 +3375,10 @@ void go_daemon ()
+ 		return;
+ 	state = 1;
+ 
++#ifdef LIBDHCP
++	return;
++#endif
++
+ 	/* Stop logging to stderr... */
+ 	log_perror = 0;
+ 
+diff -up dhcp-3.1.0/Makefile.dist.libdhcp4client dhcp-3.1.0/Makefile.dist
+--- dhcp-3.1.0/Makefile.dist.libdhcp4client	2005-03-17 15:14:54.000000000 -0500
++++ dhcp-3.1.0/Makefile.dist	2007-10-24 14:55:56.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 \


Index: dhcp.spec
===================================================================
RCS file: /cvs/pkgs/rpms/dhcp/devel/dhcp.spec,v
retrieving revision 1.190
retrieving revision 1.191
diff -u -r1.190 -r1.191
--- dhcp.spec	3 Jan 2008 20:40:53 -0000	1.190
+++ dhcp.spec	11 Jan 2008 00:49:46 -0000	1.191
@@ -1,10 +1,19 @@
-# vendor string (e.g., Fedora, EL)
+# 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
 %define vvendor Fedora
 
 Summary:  DHCP (Dynamic Host Configuration Protocol) server and relay agent
 Name:     dhcp
-Version:  4.0.0
-Release:  1%{?dist}
+Version:  3.1.0
+Release:  12%{?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.
@@ -13,39 +22,49 @@
 Group:    System Environment/Daemons
 URL:      http://isc.org/products/DHCP/
 Source0:  ftp://ftp.isc.org/isc/%{name}/%{name}-%{version}.tar.gz
-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
+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
 
 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
-BuildRequires: autoconf
-BuildRequires: automake
 BuildRequires: groff
 BuildRequires: openldap-devel
 
@@ -117,181 +136,221 @@
 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
-%patch0 -p1
+%patch1 -p1 -b .message
 
 # Add support for dhcpd.conf data in LDAP
-# NOTE: Use get-ldap-patch.sh to pull down latest LDAP patch and then modify
-# it for this package.
-%patch1 -p1
+%patch2 -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
-%patch2 -p1
+%patch3 -p1 -b .memory
 
 # Add more dhclient options (-I, -B, -H, -F, -T, -V, and -R)
-%patch3 -p1
+%patch4 -p1 -b .options
 
 # Handle releasing interfaces requested by /sbin/ifup
 # pid file is assumed to be /var/run/dhclient-$interface.pid
-%patch4 -p1
+%patch5 -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
-%patch5 -p1
+%patch6 -p1 -b .decline
 
 # Enable cancel_all_timeouts() and relinquish_timeouts() regardless of
 # the DEBUG_MEMORY_LEAKAGE_ON_EXIT macro
-%patch6 -p1
+%patch7 -p1 -b .etf
+
+# Inherit active leases
+%patch8 -p1 -b .inherit
 
 # Support unicast BOOTP for IBM pSeries systems (and maybe others)
-%patch7 -p1
+%patch9 -p1 -b .unicast
 
 # Fast timeout for dhclient
-%patch8 -p1
+%patch10 -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
-%patch9 -p1
+%patch11 -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)
-%patch10 -p1
+%patch12 -p1 -b .usage
 
 # Add NIS domain, NIS servers, and NTP servers to the list of default
 # requested DHCP options
-%patch11 -p1
+%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
 
 # Handle Xen partial UDP checksums
-%patch12 -p1
+%patch16 -p1 -b .xen
 
 # Add anycast support to dhclient (for OLPC)
-%patch13 -p1
+%patch17 -p1 -b .anycast
 
-# Patch man page contents
-%patch14 -p1
+# Ignore the old extended new option info command line switch (-x)
+%patch18 -p1 -b .enoi
 
-# Change paths to conform to our standards
-%patch15 -p1
-
-# Add the libdhcp4client target (library version of dhclient)
-%patch16 -p1
+# Fix up anything that fails -Wall -Werror
+%patch19 -p1 -b .warnings
 
 # Copy in documentation and example scripts for LDAP patch to dhcpd
-%{__install} -p -m 0644 %{SOURCE5} .
-%{__install} -p -m 0644 %{SOURCE6} doc/
-%{__install} -p -m 0755 %{SOURCE7} contrib/
+%{__install} -p -m 0644 %{SOURCE6} .
+%{__install} -p -m 0644 %{SOURCE7} doc/
+%{__install} -p -m 0755 %{SOURCE8} contrib/
 
 # Copy in the Fedora/RHEL dhclient script
-%{__install} -p -m 0755 %{SOURCE8} client/scripts/
+%{__install} -p -m 0755 %{SOURCE9} client/scripts/
 
 # Copy in the libdhcp4client headers and Makefile.dist
-%{__install} -p -m 0644 %{SOURCE9} includes/
+%{__mkdir} -p libdhcp4client
+%{__install} -p -m 0644 %{SOURCE10} libdhcp4client/Makefile.dist
+%{__install} -p -m 0644 %{SOURCE11} libdhcp4client/
 
 # Copy in libdhcp_control.h to the isc-dhcp includes directory
-%{__install} -p -m 0644 %{SOURCE10} includes/isc-dhcp/
+%{__install} -p -m 0644 %{SOURCE12} 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
-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
+%{__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
 
 # We want UNIX-style line endings
-%{__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
+%{__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
 
-# Replace @PRODUCTNAME@
+# Replace @PRODUCTNAME@ in dhcp-options.5
 %{__sed} -i -e 's|@PRODUCTNAME@|%{vvendor}|g' common/dhcp-options.5
-%{__sed} -i -e 's|@PRODUCTNAME@|%{vvendor}|g' configure.ac
-
-aclocal
-libtoolize --copy --force
-autoconf
-autoheader
-automake --foreign --add-missing --copy
 
 %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}
+%{__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
 
-%{__sed} 's/@DHCP_VERSION@/%{version}/' < %{SOURCE3} > libdhcp4client.pc
+# 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}
+
+%{__sed} 's/@DHCP_VERSION@/%{version}/' < %{SOURCE5} > libdhcp4client.pc
+%{__make} %{?_smp_mflags} CC="%{__cc}"
 
 %install
 %{__rm} -rf %{buildroot}
-%{__make} install DESTDIR=%{buildroot}
-
-%{__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
+%{__mkdir} -p %{buildroot}%{_sysconfdir}/sysconfig
 
-%{__install} -p -m 0644 %{SOURCE10} %{buildroot}%{_includedir}/isc-dhcp/
-%{__install} -p -m 0644 -D libdhcp4client.pc %{buildroot}%{_libdir}/pkgconfig/libdhcp4client.pc
+%{__make} install DESTDIR=%{buildroot}
+%{__install} -p -m 0644 %{SOURCE12} %{buildroot}%{_includedir}/isc-dhcp/
 
-# Install init scripts
 %{__mkdir} -p %{buildroot}%{_initrddir}
-%{__install} -p -m 0755 %{SOURCE1} %{buildroot}%{_initrddir}/dhcpd
-%{__install} -p -m 0755 %{SOURCE2} %{buildroot}%{_initrddir}/dhcrelay
+%{__install} -p -m 0755 %{SOURCE2} %{buildroot}%{_initrddir}/dhcpd
 
-# 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
 
-# Create default sysconfig files for dhcpd and dhcrelay
-%{__mkdir} -p %{buildroot}%{_sysconfdir}/sysconfig
+%{__install} -p -m 0755 %{SOURCE3} %{buildroot}%{_initrddir}/dhcrelay
 
-%{__cat} << EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcrelay
+%{__cat} <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcrelay
 # Command line options here
 INTERFACES=""
 DHCPSERVERS=""
 EOF
 
-%{__cat} <<EOF > %{buildroot}%{_sysconfdir}/sysconfig/dhcpd
-# Command line options here
-DHCPDARGS=
-EOF
-
-# Copy sample conf files into position (called by doc macro)
+# Copy sample dhclient.conf file into position
 %{__cp} -p client/dhclient.conf dhclient.conf.sample
-%{__cp} -p server/dhcpd.conf dhcpd.conf.sample
+%{__chmod} 0755 %{buildroot}/sbin/dhclient-script
 
 # Install default (empty) dhcpd.conf:
-%{__cat} << EOF > %{buildroot}%{_sysconfdir}/dhcpd.conf
-#
-# DHCP Server Configuration file.
-#   see /usr/share/doc/dhcp*/dhcpd.conf.sample
-#   see 'man 5 dhcpd.conf'
-#
-EOF
+%{__cp} -fp %{SOURCE4} %{buildroot}%{_sysconfdir}
 
 # Install dhcp.schema for LDAP configuration
 %{__mkdir} -p %{buildroot}%{_sysconfdir}/openldap/schema
-%{__install} -p -m 0644 -D %{SOURCE11} %{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
 
 %clean
 %{__rm} -rf %{buildroot}
@@ -328,7 +387,7 @@
 
 %files
 %defattr(-,root,root,-)
-%doc LICENSE README README.ldap RELNOTES dhcpd.conf.sample
+%doc README README.ldap RELNOTES dhcpd.conf.sample doc/IANA-arp-parameters
 %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
@@ -364,31 +423,30 @@
 
 %files devel
 %defattr(-,root,root,-)
-%{_includedir}/dhcpctl
+%{_includedir}/dhcpctl.h
 %{_includedir}/isc-dhcp
 %{_includedir}/omapip
 %{_libdir}/libdhcpctl.a
 %{_libdir}/libomapi.a
-%{_libdir}/libdst.a
+%attr(0644,root,root) %{_mandir}/man3/omshell.3.gz
 %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
+%{_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
+%files -n libdhcp4client-static
+%defattr(0644,root,root,0755)
+%{_libdir}/libdhcp4client.a
 
+%changelog
 * Tue Dec 04 2007 David Cantrell <dcantrell at redhat.com> - 12:3.1.0-12
 - Requires line fixes
 




More information about the fedora-extras-commits mailing list