diff --git a/RELNOTES b/RELNOTES index dd06e76e..3fe70bac 100644 --- a/RELNOTES +++ b/RELNOTES @@ -54,6 +54,9 @@ work on other platforms. Please report any problems and suggested fixes to via two ./configure parameters, --enable-paranoia and --enable-early-chroot. +- ./configure was extended to cover many optional build features, such + as failover, server tracing, debugging, and the execute() command. + Changes since 4.0.0 (new features) - Added DHCPv6 rapid commit support. diff --git a/common/execute.c b/common/execute.c index ac63b084..0e8ef18c 100644 --- a/common/execute.c +++ b/common/execute.c @@ -729,8 +729,10 @@ void write_statements (file, statements, indent) struct executable_statement *statements; int indent; { - struct executable_statement *r, *x; +#if defined ENABLE_EXECUTE struct expression *expr; +#endif + struct executable_statement *r, *x; const char *s, *t, *dot; int col; diff --git a/common/parse.c b/common/parse.c index 041a0de8..eea0925e 100644 --- a/common/parse.c +++ b/common/parse.c @@ -2017,13 +2017,15 @@ int parse_executable_statement (result, cfile, lose, case_context) int *lose; enum expression_context case_context; { +#if defined(ENABLE_EXECUTE) + unsigned len; + struct expression **ep; +#endif enum dhcp_token token; const char *val; - unsigned len; struct class *cta; struct option *option=NULL; struct option_cache *cache; - struct expression **ep; int known; int flag; int i; diff --git a/configure.ac b/configure.ac index f09ad129..24a76785 100644 --- a/configure.ac +++ b/configure.ac @@ -30,10 +30,72 @@ AC_DEFINE_UNQUOTED([DHCP_BYTE_ORDER], [$byte_order], [Define to BIG_ENDIAN for MSB (Motorola or SPARC CPUs) or LITTLE_ENDIAN for LSB (Intel CPUs).]) -# DHCPv6 is off by default +# Optional compile-time DEBUGging. +AC_ARG_ENABLE(debug, + AC_HELP_STRING([--enable-debug], + [create a debug-only version of the software (default is no).])) +# This is very much off by default. +if test "$enable_debug" = "yes" ; then + AC_DEFINE([DEBUG], [1], + [Define to compile debug-only DHCP software.]) + # Just override CFLAGS to totally to remove optimization. + CFLAGS="-g" +fi +# XXX: there are actually quite a lot more DEBUG_ features we could enable, +# but I don't want to pollute the --help space. +# +#/* #define DEBUG_TOKENS */ +#/* #define DEBUG_PACKET */ +#/* #define DEBUG_EXPRESSIONS */ +#/* #define DEBUG_FIND_LEASE */ +#/* #define DEBUG_EXPRESSION_PARSE */ +#/* #define DEBUG_CLASS_MATCHING */ +#/* #define DEBUG_MEMORY_LEAKAGE */ +#/* #define DEBUG_MALLOC_POOL */ +#/* #define DEBUG_LEASE_STATE_TRANSITIONS */ +#/* #define DEBUG_RC_HISTORY */ +#/* #define DEBUG_RC_HISTORY_EXHAUSTIVELY */ +#/* #define RC_HISTORY_MAX 10240 */ +#/* #define POINTER_DEBUG */ +#/* #define DEBUG_FAILOVER_MESSAGES */ +#/* #define DEBUG_FAILOVER_TIMING */ +#/* #define DEBUG_DUMP_ALL_LEASES */ + +# Failover optional compile-time feature. +AC_ARG_ENABLE(failover, + AC_HELP_STRING([--enable-failover], + [enable support for failover (default is yes)])) +# Failover is on by default, so define if it is not explicitly disabled. +if test "$enable_failover" != "no"; then + AC_DEFINE([FAILOVER_PROTOCOL], [1], + [Define to include Failover Protocol support.]) +fi + +# execute() support. +AC_ARG_ENABLE(execute, + AC_HELP_STRING([--enable-execute], + [enable support for execute() in config (default is yes)])) +# execute() is on by default, so define if it is not explicitly disabled. +if test "$enable_execute" != "no" ; then + AC_DEFINE([ENABLE_EXECUTE], [1], + [Define to include execute() config language support.]) +fi + +# Server tracing support. +AC_ARG_ENABLE(tracing, + AC_HELP_STRING([--enable-tracing], + [enable support for server activity tracing (default is yes)])) +# tracing is on by default, so define if it is not explicitly disabled. +if test "$enable_tracing" != "no" ; then + AC_DEFINE([TRACING], [1], + [Define to include server activity tracing support.]) +fi + +# DHCPv6 optional compile-time feature. AC_ARG_ENABLE(dhcpv6, AC_HELP_STRING([--enable-dhcpv6], [enable support for DHCPv6 (default is yes)])) +# DHCPv6 is on by default, so define if it is not explicitly disabled. if test "$enable_dhcpv6" != "no"; then AC_DEFINE([DHCPv6], [1], [Define to 1 to include DHCPv6 support.]) diff --git a/includes/site.h b/includes/site.h index 98d33254..dc81ae7b 100644 --- a/includes/site.h +++ b/includes/site.h @@ -94,7 +94,7 @@ /* Define this if you want DHCP failover protocol support in the DHCP server. */ -#define FAILOVER_PROTOCOL +/* #define FAILOVER_PROTOCOL */ /* Define this if you want DNS update functionality to be available. */ @@ -171,7 +171,7 @@ /* Define this if you want to be able to execute external commands during conditional evaluation. */ -#define ENABLE_EXECUTE +/* #define ENABLE_EXECUTE */ /* Define this if you aren't debugging and you want to save memory (potentially a _lot_ of memory) by allocating leases in chunks rather @@ -182,4 +182,4 @@ /* Define this if you want to be able to save and playback server operational traces. */ -#define TRACING +/* #define TRACING */ diff --git a/minires/res_init.c b/minires/res_init.c index b96b326b..b38fdbf0 100644 --- a/minires/res_init.c +++ b/minires/res_init.c @@ -76,7 +76,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93"; -static const char rcsid[] = "$Id: res_init.c,v 1.10 2007/10/01 14:47:35 explorer Exp $"; +static const char rcsid[] = "$Id: res_init.c,v 1.11 2008/02/28 21:21:56 dhankins Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -99,7 +99,6 @@ static const char rcsid[] = "$Id: res_init.c,v 1.10 2007/10/01 14:47:35 explorer /* Options. Should all be left alone. */ #define RESOLVSORT #define RFC1535 -#define DEBUG static void res_setoptions (res_state, const char *, const char *); @@ -389,14 +388,12 @@ minires_vinit(res_state statp, int preinit) { dots--; } *pp = NULL; -#ifdef DEBUG if (statp->options & RES_DEBUG) { printf(";; res_init()... default dnsrch list:\n"); for (pp = statp->dnsrch; *pp; pp++) printf(";;\t%s\n", *pp); printf(";;\t..END..\n"); } -#endif #endif /* !RFC1535 */ } @@ -411,11 +408,9 @@ res_setoptions(res_state statp, const char *options, const char *source) { const char *cp = options; int i; -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";; res_setoptions(\"%s\", \"%s\")...\n", options, source); -#endif while (*cp) { /* skip leading and inner runs of spaces */ while (*cp == ' ' || *cp == '\t') @@ -427,10 +422,8 @@ res_setoptions(res_state statp, const char *options, const char *source) { statp->ndots = i; else statp->ndots = RES_MAXNDOTS; -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";;\tndots=%d\n", statp->ndots); -#endif } else if (!strncmp(cp, "timeout:", sizeof("timeout:") - 1)) { i = atoi(cp + sizeof("timeout:") - 1); if (i <= RES_MAXRETRANS) @@ -444,14 +437,12 @@ res_setoptions(res_state statp, const char *options, const char *source) { else statp->retry = RES_MAXRETRY; } else if (!strncmp(cp, "debug", sizeof("debug") - 1)) { -#ifdef DEBUG if (!(statp->options & RES_DEBUG)) { printf(";; res_setoptions(\"%s\", \"%s\")..\n", options, source); statp->options |= RES_DEBUG; } printf(";;\tdebug\n"); -#endif } else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) { statp->options |= RES_USE_INET6; } else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) { diff --git a/minires/res_mkupdate.c b/minires/res_mkupdate.c index f8d84004..368bcb05 100644 --- a/minires/res_mkupdate.c +++ b/minires/res_mkupdate.c @@ -27,7 +27,7 @@ */ #if !defined(lint) && !defined(SABER) -static const char rcsid[] = "$Id: res_mkupdate.c,v 1.11 2007/07/13 06:43:42 shane Exp $"; +static const char rcsid[] = "$Id: res_mkupdate.c,v 1.12 2008/02/28 21:21:56 dhankins Exp $"; #endif /* not lint */ #include @@ -50,7 +50,6 @@ static const char rcsid[] = "$Id: res_mkupdate.c,v 1.11 2007/07/13 06:43:42 shan #include "arpa/nameser.h" /* Options. Leave them on. */ -#define DEBUG #define MAXPORT 1024 static int getnum_str(const u_char **, const u_char *); diff --git a/minires/res_query.c b/minires/res_query.c index ff119e4c..606c984c 100644 --- a/minires/res_query.c +++ b/minires/res_query.c @@ -76,7 +76,7 @@ #if defined(LIBC_SCCS) && !defined(lint) static const char sccsid[] = "@(#)res_query.c 8.1 (Berkeley) 6/4/93"; -static const char rcsid[] = "$Id: res_query.c,v 1.8 2007/09/05 17:32:10 dhankins Exp $"; +static const char rcsid[] = "$Id: res_query.c,v 1.9 2008/02/28 21:21:56 dhankins Exp $"; #endif /* LIBC_SCCS and not lint */ #include @@ -95,8 +95,6 @@ static const char rcsid[] = "$Id: res_query.c,v 1.8 2007/09/05 17:32:10 dhankins #include "arpa/nameser.h" /* Options. Leave them on. */ -#define DEBUG - #if PACKETSZ > 1024 #define MAXPACKET PACKETSZ #else @@ -128,37 +126,29 @@ res_nquery(res_state statp, hp->rcode = NOERROR; /* default */ -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";; res_query(%s, %d, %d)\n", name, class, type); -#endif rcode = res_nmkquery(statp, QUERY, name, class, type, NULL, 0, NULL, buf, sizeof(buf), &n); if (rcode != ISC_R_SUCCESS) { -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";; res_query: mkquery failed\n"); -#endif RES_SET_H_ERRNO(statp, NO_RECOVERY); return rcode; } rcode = res_nsend(statp, buf, n, answer, anslen, &n); if (rcode != ISC_R_SUCCESS) { -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";; res_query: send error\n"); -#endif RES_SET_H_ERRNO(statp, TRY_AGAIN); return rcode; } if (hp->rcode != NOERROR || ntohs(hp->ancount) == 0) { -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";; rcode = %d, ancount=%d\n", hp->rcode, ntohs(hp->ancount)); -#endif switch (hp->rcode) { case NXDOMAIN: RES_SET_H_ERRNO(statp, HOST_NOT_FOUND); @@ -347,11 +337,9 @@ res_nquerydomain(res_state statp, const char *longname = nbuf; int n, d; -#ifdef DEBUG if (statp->options & RES_DEBUG) printf(";; res_nquerydomain(%s, %s, %d, %d)\n", name, domain?domain:"", class, type); -#endif if (domain == NULL) { /* * Check for trailing '.'; diff --git a/omapip/buffer.c b/omapip/buffer.c index 4e851280..4204574c 100644 --- a/omapip/buffer.c +++ b/omapip/buffer.c @@ -442,7 +442,6 @@ isc_result_t omapi_connection_writer (omapi_object_t *h) unsigned first_byte; omapi_buffer_t *buffer; omapi_connection_object_t *c; - isc_result_t status; if (!h || h -> type != omapi_type_connection) return ISC_R_INVALIDARG; @@ -504,6 +503,7 @@ isc_result_t omapi_connection_writer (omapi_object_t *h) #if defined (TRACING) if (trace_record ()) { + isc_result_t status; trace_iov_t iov [2]; int32_t connect_index; diff --git a/omapip/connection.c b/omapip/connection.c index 618eaa75..93509696 100644 --- a/omapip/connection.c +++ b/omapip/connection.c @@ -437,7 +437,6 @@ isc_result_t omapi_disconnect (omapi_object_t *h, int force) { omapi_connection_object_t *c; - isc_result_t status; #ifdef DEBUG_PROTOCOL log_debug ("omapi_disconnect(%s)", force ? "force" : ""); @@ -449,6 +448,7 @@ isc_result_t omapi_disconnect (omapi_object_t *h, #if defined (TRACING) if (trace_record ()) { + isc_result_t status; int32_t index; index = htonl (c -> index); diff --git a/omapip/mrtrace.c b/omapip/mrtrace.c index 838e304c..c3fe8606 100644 --- a/omapip/mrtrace.c +++ b/omapip/mrtrace.c @@ -38,6 +38,7 @@ #include +#if defined(TRACING) static void trace_mr_output_input (trace_type_t *, unsigned, char *); static void trace_mr_output_stop (trace_type_t *); static void trace_mr_input_input (trace_type_t *, unsigned, char *); @@ -46,6 +47,7 @@ static void trace_mr_statp_input (trace_type_t *, unsigned, char *); static void trace_mr_statp_stop (trace_type_t *); static void trace_mr_randomid_input (trace_type_t *, unsigned, char *); static void trace_mr_randomid_stop (trace_type_t *); +#endif /* TRACING */ trace_type_t *trace_mr_output; trace_type_t *trace_mr_input; trace_type_t *trace_mr_statp; @@ -404,9 +406,9 @@ int trace_mr_select (int s, fd_set *r, fd_set *w, fd_set *x, struct timeval *t) unsigned int trace_mr_res_randomid (unsigned int oldid) { - u_int32_t id; int rid = oldid; #if defined (TRACING) + u_int32_t id; unsigned buflen = 0; char *buf = (char *)0; isc_result_t status; diff --git a/server/dhcp.c b/server/dhcp.c index 93a594ac..7376932e 100644 --- a/server/dhcp.c +++ b/server/dhcp.c @@ -796,7 +796,9 @@ void dhcprelease (packet, ms_nulltp) release_lease (lease, packet); } log_info ("%s", msgbuf); +#if defined(FAILOVER_PROTOCOL) out: +#endif if (lease) lease_dereference (&lease, MDL); } @@ -918,8 +920,10 @@ void dhcpdecline (packet, ms_nulltp) if (!ignorep) log_info ("%s: %s", msgbuf, status); - + +#if defined(FAILOVER_PROTOCOL) out: +#endif if (options) option_state_dereference (&options, MDL); if (lease) @@ -3153,6 +3157,7 @@ int find_lease (struct lease **lp, struct data_string client_identifier; struct hardware h; +#if defined(FAILOVER_PROTOCOL) /* Quick check to see if the peer has leases. */ if (peer_has_leases) { struct pool *pool; @@ -3168,6 +3173,7 @@ int find_lease (struct lease **lp, } } } +#endif /* FAILOVER_PROTOCOL */ if (packet -> raw -> ciaddr.s_addr) { cip.len = 4; @@ -3487,7 +3493,9 @@ int find_lease (struct lease **lp, is not active, and is not ours to reallocate, forget about it. */ if (ip_lease && (uid_lease || hw_lease) && ip_lease -> binding_state != FTS_ACTIVE && +#if defined(FAILOVER_PROTOCOL) !lease_mine_to_reallocate (ip_lease) && +#endif packet -> packet_type == DHCPDISCOVER) { #if defined (DEBUG_FIND_LEASE) log_info ("ip lease not ours to offer."); diff --git a/server/dhcpd.c b/server/dhcpd.c index c6084df3..3540e532 100644 --- a/server/dhcpd.c +++ b/server/dhcpd.c @@ -1342,8 +1342,8 @@ isc_result_t dhcp_io_shutdown (omapi_object_t *obj, void *foo) static isc_result_t dhcp_io_shutdown_countdown (void *vlp) { - dhcp_failover_state_t *state; #if defined (FAILOVER_PROTOCOL) + dhcp_failover_state_t *state; int failover_connection_count = 0; #endif struct timeval tv; diff --git a/server/mdb.c b/server/mdb.c index 43104b4d..42b3abc6 100644 --- a/server/mdb.c +++ b/server/mdb.c @@ -1515,6 +1515,7 @@ void make_binding_state_transition (struct lease *lease) case FTS_ABANDONED: case FTS_RESET: lease -> next_binding_state = FTS_FREE; +#if defined(FAILOVER_PROTOCOL) /* If we are not in partner_down, leases don't go from EXPIRED to FREE on a timeout - only on an update. If we're in partner_down, they expire at mclt past @@ -1524,6 +1525,7 @@ void make_binding_state_transition (struct lease *lease) lease -> tsfp = (lease -> pool -> failover_peer -> me.stos + lease -> pool -> failover_peer -> mclt); +#endif /* FAILOVER_PROTOCOL */ break; case FTS_FREE: