diff --git a/dhcp-3.1.0-libdhcp4client.patch b/dhcp-3.1.0-libdhcp4client.patch new file mode 100644 index 0000000..556e2ad --- /dev/null +++ b/dhcp-3.1.0-libdhcp4client.patch @@ -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 + +-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 + #include + ++#ifdef LIBDHCP ++#include ++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 + ++#ifdef LIBDHCP ++/* OK, we need a quick and dirty way of freeing all memory used by libdhcp. ++ All pointers will be stored in a glibc tree on alloc, and removed on free. ++ This is not too expensive for light single-call library use. ++*/ ++#include ++extern void tdestroy (void *root, void (*free_node)(void *nodep)); ++static void *all_pointers=0L; ++static int ptr_comparator(const void *p1, const void *p2) { ++ return ((p1 == p2) ? 0 : ((p1 > p2) ? 1 : -1)); ++} ++ ++static void record_pointer(void *ptr) { ++ tsearch(ptr, &(all_pointers), ptr_comparator); ++} ++ ++static void forget_pointer(void *ptr) { ++ tdelete(ptr, &(all_pointers), ptr_comparator); ++} ++ ++void omapi_free_all_pointers(void) { ++ if (all_pointers != NULL) ++ tdestroy(all_pointers, free); ++ all_pointers = NULL; ++} ++#endif ++ + #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ + defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) + struct dmalloc_preamble *dmalloc_list; +@@ -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 + #include + +-struct binding_scope *global_scope; ++struct binding_scope __attribute__ ((visibility ("default"))) *global_scope; + + static int do_host_lookup PROTO ((struct data_string *, + struct dns_host_entry *)); +@@ -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 \ diff --git a/dhcp.spec b/dhcp.spec index 28fbead..66bc61a 100644 --- a/dhcp.spec +++ b/dhcp.spec @@ -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 @@ License: ISC 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 @@ Header files for development with the Internet Software Consortium (ISC) 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 - -# Replace @PRODUCTNAME@ +%{__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@ 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} < site.conf +VARDB=%{_localstatedir}/lib/dhcpd +ADMMANDIR=%{_mandir}/man8 +FFMANDIR=%{_mandir}/man5 +LIBMANDIR=%{_mandir}/man3 +USRMANDIR=%{_mandir}/man1 +LIBDIR=%{_libdir} +INCDIR=%{_includedir} +EOF +%{__cat} <> 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" -%install -%{__rm} -rf %{buildroot} -%{__make} install DESTDIR=%{buildroot} +# 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} -%{__rm} %{buildroot}%{_sysconfdir}/dhclient.conf +%{__sed} 's/@DHCP_VERSION@/%{version}/' < %{SOURCE5} > libdhcp4client.pc +%{__make} %{?_smp_mflags} CC="%{__cc}" -%{__mkdir} -p %{buildroot}/sbin -%{__mv} %{buildroot}%{_sbindir}/dhclient %{buildroot}/sbin/dhclient -%{__install} -p -m 0755 client/scripts/linux %{buildroot}/sbin/dhclient-script +%install +%{__rm} -rf %{buildroot} +%{__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} < %{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} < %{buildroot}%{_sysconfdir}/sysconfig/dhcrelay # Command line options here INTERFACES="" DHCPSERVERS="" EOF -%{__cat} < %{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 @@ fi %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 @@ fi %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 - 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 - 12:3.1.0-12 - Requires line fixes