diff --git a/dhcp-3.0.5-libdhcp4client.patch b/dhcp-3.0.5-libdhcp4client.patch new file mode 100644 index 0000000..6d55405 --- /dev/null +++ b/dhcp-3.0.5-libdhcp4client.patch @@ -0,0 +1,1045 @@ +--- dhcp-3.0.5/client/dhclient.c.libdhcp4client 2006-11-09 16:02:36.000000000 -0500 ++++ dhcp-3.0.5/client/dhclient.c 2006-11-09 16:02:36.000000000 -0500 +@@ -78,7 +78,9 @@ + int extended_option_environment = 0; + #endif + int bootp_broadcast_always = 0; +- ++#ifdef LIBDHCP ++FILE *leaseFile=0; ++#endif + static void usage PROTO ((void)); + + void do_release(struct client_state *); +@@ -89,10 +91,59 @@ + + extern u_int32_t default_requested_options[]; + +-int main (argc, argv, envp) ++#ifdef LIBDHCP ++#include "libdhcp_control.h" ++LIBDHCP_Control *libdhcp_control; ++static void libdhcp_dispatch(void) ++{ ++ struct timeval tv={0,0}, *tvp; ++ isc_result_t status; ++ struct interface_info *ip; ++ struct client_state *client; ++ ++ /* 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(0L) >= ++ ( libdhcp_control->timeout ++ +libdhcp_control->now ++ ) ++ ) ++ ) ++ ) ++ ) ++ { ++ if( libdhcp_control -> callback ) ++ libdhcp_control -> callback ++ ( libdhcp_control, DHC_TIMEDOUT, 0L ); ++ break; ++ } ++ } while ++ ( (status != ISC_R_TIMEDOUT) ++ &&( (!libdhcp_control) ++ ||(!(libdhcp_control->finished)) ++ ) ++ ); ++} ++ ++extern void omapi_free_all_pointers(void); ++int dhcpv4_client ++(libdhcp_ctl, argc, argv, envp) ++LIBDHCP_Control *libdhcp_ctl; ++#else ++int main ++(argc, argv, envp) ++#endif + int argc; + char **argv, **envp; + { ++#ifdef LIBDHCP ++ libdhcp_control = libdhcp_ctl; ++#endif + int i; + struct servent *ent; + struct interface_info *ip; +@@ -119,7 +170,7 @@ + int timeout_arg = 0; + char *arg_conf = 0L; + int arg_conf_len=0; +- ++#ifndef LIBDHCP + /* Make sure we have stdin, stdout and stderr. */ + i = open ("/dev/null", O_RDWR); + if (i == 0) +@@ -140,7 +191,7 @@ + #if !(defined (DEBUG) || defined (SYSLOG_4_2) || defined (__CYGWIN32__)) + setlogmask (LOG_UPTO (LOG_INFO)); + #endif +- ++#endif + /* Set up the OMAPI. */ + status = omapi_init (); + if (status != ISC_R_SUCCESS) +@@ -475,9 +526,12 @@ + log_fatal("dhclient(%u) is already running - exiting. ", dhcpid); + return(1); + } +- } ++ } ++#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); +@@ -486,7 +540,7 @@ + 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. */ + if (relay) { +@@ -773,12 +827,18 @@ + arg_conf_len = 0L; + } + ++#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); */ + +@@ -796,7 +856,7 @@ + if (!persist) { + /* Nothing more to do. */ + log_info ("No broadcast interfaces found - exiting."); +- exit (0); ++ return (0); + } + } else if (!release_mode) { + /* Call the script with the list of interfaces. */ +@@ -891,7 +951,7 @@ + dmalloc_longterm = dmalloc_outstanding; + dmalloc_outstanding = 0; + #endif +- ++#ifndef LIBDHCP + /* If we're not supposed to wait before getting the address, + don't. */ + if (nowait) +@@ -904,7 +964,123 @@ + + /* Start dispatching packets and timeouts... */ + dispatch (); ++#else ++ if ( libdhcp_control ) ++ { ++ if ( libdhcp_control->timeout ) ++ libdhcp_control->now = time(0L); ++ 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; ++ extended_option_environment = 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; ++ new_option_info_tree = 0; ++ log_isc_blurb = 0; ++ log_perror = 1; ++ global_scope = 0L; ++ root_group = 0L; ++ group_name_hash = 0L; ++ interfaces = 0L; ++ dummy_interfaces = 0L; ++ fallback_interface = 0L; ++extern int have_setup_fallback; ++ have_setup_fallback=0; ++ quiet_interface_discovery=1; ++ timeouts = 0L; ++ dhcp_type_interface=0L; ++ interface_vector = 0L; ++ interface_count =0; ++ interface_max = 0; ++ name_servers = 0; ++ domains = 0; ++ dhcp_type_interface=0L; ++ dhcp_type_group=0L; ++ dhcp_type_shared_network=0L; ++ dhcp_type_control=0L; ++ 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=0L; ++extern struct dhcp_packet *dhcp_free_list; ++ dhcp_free_list = 0L; ++extern struct packet *packet_free_list; ++ packet_free_list = 0L; ++extern struct binding_value *free_binding_values; ++ free_binding_values=0L; ++extern struct expression *free_expressions; ++ free_expressions=0L; ++extern struct option_cache *free_option_caches; ++ free_option_caches=0L; ++extern struct packet *free_packets; ++ free_packets=0L; ++extern pair free_pairs; ++ free_pairs=0L; ++extern omapi_io_object_t omapi_io_states; ++ memset(&omapi_io_states, '\0', sizeof(omapi_io_states)); ++ dhcp_control_object=0L; ++ unlink(current_pid_file); ++#endif + /*NOTREACHED*/ + return 0; + } +@@ -1301,8 +1477,25 @@ + client -> new -> rebind += cur_time; + 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) +@@ -1340,6 +1533,9 @@ + 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); + +@@ -1441,13 +1637,13 @@ + { + return 0; + } +- ++#ifndef LIBDHCP + int write_lease (lease) + struct lease *lease; + { + return 0; + } +- ++#endif + int write_host (host) + struct host_decl *host; + { +@@ -2020,6 +2216,10 @@ + 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."); +@@ -2631,7 +2831,9 @@ + free_client_lease (lease, MDL); + } + ++#ifndef LIBDHCP + FILE *leaseFile; ++#endif + + void rewrite_client_leases () + { +@@ -3079,16 +3281,60 @@ + int script_go (client) + struct client_state *client; + { +- int rval; ++ struct string_list *sp; ++ ++#ifdef LIBDHCP ++ if ( libdhcp_control && libdhcp_control->callback ) ++ { ++ char *reason=""; ++ for (sp = client->env; sp; sp = sp -> next) ++ if( strncmp(sp->string, "reason=", 7) == 0 ) ++ { ++ reason = sp->string + 7; ++ break; ++ } ++ (*libdhcp_control->callback) ++ ( libdhcp_control, ++ (strcmp(reason,"NBI")==0) ++ ? DHC4_NBI ++ :(strcmp(reason,"PREINIT")==0) ++ ? DHC4_PREINIT ++ :(strcmp(reason,"BOUND")==0) ++ ? DHC4_BOUND ++ :(strcmp(reason,"RENEW")==0) ++ ? DHC4_RENEW ++ :(strcmp(reason,"REBOOT")==0) ++ ? DHC4_REBOOT ++ :(strcmp(reason,"REBIND")==0) ++ ? DHC4_REBIND ++ :(strcmp(reason,"STOP")==0) ++ ? DHC4_STOP ++ :(strcmp(reason,"MEDIUM")==0) ++ ? DHC4_MEDIUM ++ :(strcmp(reason,"TIMEOUT")==0) ++ ? DHC4_TIMEOUT ++ :(strcmp(reason,"FAIL")==0) ++ ? DHC4_FAIL ++ :(strcmp(reason,"EXPIRE")==0) ++ ? DHC4_EXPIRE ++ :(strcmp(reason,"RELEASE")==0) ++ ? DHC4_RELEASE ++ : DHC4_NBI, ++ client ++ ); ++ if ( libdhcp_control->decline ) ++ return 1; ++ } ++ return 0; ++#else + char *scriptName; + char *argv [2]; + char **envp; +- char *epp [3]; + char reason [] = "REASON=NBI"; + static char client_path [] = CLIENT_PATH; + int i; +- struct string_list *sp, *next; + int pid, wpid, wstatus; ++ struct string_list *next; + + if (client) + scriptName = client -> config -> script_name; +@@ -3154,6 +3400,7 @@ + GET_TIME (&cur_time); + return (WIFEXITED (wstatus) ? + WEXITSTATUS (wstatus) : -WTERMSIG (wstatus)); ++#endif + } + + void client_envadd (struct client_state *client, +@@ -3244,6 +3491,9 @@ + + /* 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; + } +@@ -3252,7 +3502,9 @@ + if (state) + return; + state = 1; +- ++#ifdef LIBDHCP ++ return; ++#endif + /* Stop logging to stderr... */ + log_perror = 0; + +--- dhcp-3.0.5/common/alloc.c.libdhcp4client 2006-11-09 16:02:36.000000000 -0500 ++++ dhcp-3.0.5/common/alloc.c 2006-11-09 16:02:36.000000000 -0500 +@@ -1016,9 +1016,11 @@ + rc_register (file, line, ptr, bp, bp -> refcnt, 0, RC_MISC); + 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) + void relinquish_free_packets () +--- dhcp-3.0.5/common/discover.c.libdhcp4client 2006-11-09 16:02:36.000000000 -0500 ++++ dhcp-3.0.5/common/discover.c 2006-11-09 16:02:36.000000000 -0500 +@@ -120,7 +120,9 @@ + For each interface that's of type INET and not the loopback interface, + 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; + { +@@ -140,8 +142,10 @@ + #ifdef ALIAS_NAMES_PERMUTED + char *s; + #endif +- isc_result_t status; ++#ifndef LIBDHCP + static int setup_fallback = 0; ++#endif ++ isc_result_t status; + int wifcount = 0; + + /* Create an unbound datagram socket to do the SIOCGIFADDR ioctl on. */ +@@ -694,12 +698,17 @@ + log_info ("%s", ""); + 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) { + if (fcntl (fallback_interface -> rfdesc, F_SETFD, 1) < 0) +--- dhcp-3.0.5/common/lpf.c.libdhcp4client 2004-11-24 12:39:15.000000000 -0500 ++++ dhcp-3.0.5/common/lpf.c 2006-11-09 16:02:36.000000000 -0500 +@@ -216,6 +216,7 @@ + struct interface_info *info; + { + struct sock_fprog p; ++ memset(&p,'\0', sizeof(struct sock_fprog)); + + /* Set up the bpf filter program structure. This is defined in + bpf.c */ +--- dhcp-3.0.5/dst/hmac_link.c.libdhcp4client 2001-02-22 02:22:08.000000000 -0500 ++++ dhcp-3.0.5/dst/hmac_link.c 2006-11-09 16:02:36.000000000 -0500 +@@ -38,6 +38,10 @@ + + #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 @@ + 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 @@ + MD5_CTX *ctx = NULL; + + if (mode & SIG_MODE_INIT) +- ctx = (MD5_CTX *) malloc(sizeof(*ctx)); ++#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 @@ + + 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 @@ + 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 @@ + 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 @@ + { + 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)); +--- dhcp-3.0.5/omapip/alloc.c.libdhcp4client 2006-02-22 17:43:27.000000000 -0500 ++++ dhcp-3.0.5/omapip/alloc.c 2006-11-09 16:02:36.000000000 -0500 +@@ -40,6 +40,41 @@ + + #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 != 0L ) ++ tdestroy(all_pointers, free); ++ all_pointers = 0L; ++} ++#endif ++ + #if defined (DEBUG_MEMORY_LEAKAGE) || defined (DEBUG_MALLOC_POOL) || \ + defined (DEBUG_MEMORY_LEAKAGE_ON_EXIT) + struct dmalloc_preamble *dmalloc_list; +@@ -78,7 +113,9 @@ + return (VOIDPTR)0; + + foo = malloc(len); +- ++#ifdef LIBDHCP ++ record_pointer(foo); ++#endif + if (!foo) + return (VOIDPTR)0; + bar = (VOIDPTR)(foo + DMDOFFSET); +@@ -200,6 +237,9 @@ + 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) || \ +--- dhcp-3.0.5/omapip/dispatch.c.libdhcp4client 2006-11-09 16:02:36.000000000 -0500 ++++ dhcp-3.0.5/omapip/dispatch.c 2006-11-09 16:02:36.000000000 -0500 +@@ -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, +--- dhcp-3.0.5/omapip/errwarn.c.libdhcp4client 2006-11-09 16:02:36.000000000 -0500 ++++ dhcp-3.0.5/omapip/errwarn.c 2006-11-09 16:02:36.000000000 -0500 +@@ -39,6 +39,11 @@ + #include + #include + ++#ifdef LIBDHCP ++#include ++extern LIBDHCP_Control *libdhcp_control; ++#endif ++ + #ifdef DEBUG + int log_perror = -1; + #else +@@ -50,7 +55,9 @@ + 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... */ +@@ -60,6 +67,17 @@ + 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. +@@ -108,6 +126,7 @@ + if (log_cleanup) + (*log_cleanup) (); + exit (1); ++#endif + } + + /* Log an error message... */ +@@ -118,6 +137,14 @@ + + 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. + */ +@@ -134,7 +161,7 @@ + r=write (STDERR_FILENO, mbuf, strlen (mbuf)); + r=write (STDERR_FILENO, "\n", 1); + } +- ++#endif + return 0; + } + +@@ -146,6 +173,14 @@ + + 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. + */ +@@ -162,7 +197,7 @@ + r=write (STDERR_FILENO, mbuf, strlen (mbuf)); + r=write (STDERR_FILENO, "\n", 1); + } +- ++#endif + return 0; + } + +@@ -173,7 +208,14 @@ + 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. + */ +@@ -190,7 +232,7 @@ + r=write (STDERR_FILENO, mbuf, strlen (mbuf)); + r=write (STDERR_FILENO, "\n", 1); + } +- ++#endif + return 0; + } + +--- dhcp-3.0.5/configure.libdhcp4client 2004-09-10 17:02:30.000000000 -0400 ++++ dhcp-3.0.5/configure 2006-11-09 16:02:36.000000000 -0500 +@@ -246,7 +246,7 @@ + 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 +--- /dev/null 2006-11-09 08:39:48.641391297 -0500 ++++ dhcp-3.0.5/libdhcp4client/Makefile.dist 2006-11-09 16:03:42.000000000 -0500 +@@ -0,0 +1,86 @@ ++# Makefile.dist for libdhcp4client ++# ++# We get the libdhcp4client library from the patched ISC source code. We ++# rebuild key C files with -DLIBDHCP to turn on the library features we ++# need. Normal build results in standard ISC code (i.e., not LIBDHCP ++# stuff enabled). We then link together a static library and a shared ++# library with the new resulting objects. ++# ++# David Cantrell ++ ++PROGS = libdhcp4client.a libdhcp4client.so.1 ++HDRS = dhcp4client.h libdhcp_control.h ++SRCS = client_dhclient.c common_alloc.c common_discover.c dst_hmac_link.c \ ++ omapip_alloc.c omapip_errwarn.c ++OBJS = client_dhclient.o common_alloc.o common_discover.o dst_hmac_link.o \ ++ omapip_alloc.o omapip_errwarn.o ++ ++INCLUDES = -I$(TOP)/includes -I. ++CFLAGS = $(DEBUG) $(PREDEFINES) $(INCLUDES) $(COPTS) \ ++ -DCLIENT_PATH=${CLIENT_PATH} -DLIBDHCP ++ ++all: $(PROGS) ++ ++install: all ++ install -p -m 0755 -D libdhcp4client.so.1 $(DESTDIR)$(LIBDIR)/libdhcp4client.so.1 ++ ln -sf libdhcp4client.so.1 $(DESTDIR)/$(LIBDIR)/libdhcp4client.so ++ install -p -m 0644 -D libdhcp4client.a $(DESTDIR)$(LIBDIR)/libdhcp4client.a ++ install -p -m 0644 -D dhcp4client.h $(DESTDIR)$(INCDIR)/dhcp4client/dhcp4client.h ++ install -p -m 0644 -D libdhcp_control.h $(DESTDIR)$(INCDIR)/dhcp4client/libdhcp_control.h ++ ( cd $(TOP)/includes ; \ ++ find . -name "*.h" -type f | while read h ; do \ ++ install -p -m 0644 -D $$h $(DESTDIR)$(INCDIR)/dhcp4client/isc_dhcp/$$h ; \ ++ done ; \ ++ ) ++ ++depend: ++ $(MKDEP) $(INCLUDES) $(PREDEFINES) $(SRCS) ++ ++clean: ++ -rm -f $(OBJS) ++ ++realclean: clean ++ -rm -f $(PROG) *~ #* ++ ++distclean: realclean ++ -rm -f Makefile ++ ++# This isn't the cleanest way to set up links, but I prefer this so I don't ++# need object targets for each subdirectory. The idea is simple. Since ++# libdhcp4client is a linked together wad of objects from across the source ++# tree, we change / to _ when linking source files here. Follow this example: ++# ++# We need to use client/dhclient.c, so we make this link: ++# rm -f client_dhclient.c ++# ln -s $(TOP)/client/dhclient.c client_dhclient.c ++# ++# Simple. Given the way the ISC build system works, this is the easiest to ++# maintain and least invasive. ++# ++# David Cantrell ++links: ++ @for target in $(SRCS); do \ ++ source="`echo $$target | sed -e 's|_|/|'`"; \ ++ if [ ! -b $$target ]; then \ ++ rm -f $$target; \ ++ fi; \ ++ ln -s $(TOP)/$$source $$target; \ ++ done; \ ++ for hdr in $(HDRS); do \ ++ if [ ! -b $$hdr ]; then \ ++ rm -f $$hdr; \ ++ fi; \ ++ ln -s $(TOP)/libdhcp4client/$$hdr $$hdr; \ ++ done ++ ++# minires/res_query.o contains an undefined symbol __h_errno_set, is not ++# used by any dhcp code, and is optimized out by the linker when producing ++# the dhclient executable or a shared library ++ ++libdhcp4client.a: $(OBJS) ++ $(AR) crus $@ $(OBJS) ++ ++libdhcp4client.so.1: $(OBJS) ++ $(CC) -shared -o $@ -Wl,-soname,$@ $^ ++ ++# Dependencies (semi-automatically-generated) +--- /dev/null 2006-11-09 08:39:48.641391297 -0500 ++++ dhcp-3.0.5/libdhcp4client/dhcp4client.h 2006-11-09 16:02:36.000000000 -0500 +@@ -0,0 +1,24 @@ ++/* dhcp4client.h ++ * ++ * Interface to the ISC dhcp IPv4 client libdhcp4client library. ++ * ++ * ++ * Copyright(C) Jason Vas Dias Red Hat Inc. May 2006 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation at ++ * http://www.fsf.org/licensing/licenses/gpl.txt ++ * and included in this software distribution as the "LICENSE" file. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++ ++struct libdhcp_control_s; /* include libdhcp_control.h or libdhcp.h for this */ ++ ++extern int dhcpv4_client( struct libdhcp_control_s *dhc_ctl, int argc, char **argv, char **envp); ++ /* The ISC IPv4 DHCP client main() function . ++ */ +--- /dev/null 2006-11-09 08:39:48.641391297 -0500 ++++ dhcp-3.0.5/libdhcp4client/libdhcp_control.h 2006-11-09 16:02:36.000000000 -0500 +@@ -0,0 +1,102 @@ ++/* libdhcp_control.h ++ * ++ * DHCP client control API for libdhcp, a minimal interface to the ++ * ISC dhcp IPv4 client libdhcp4client library, ++ * and to the dhcpv6 DHCPv6 client libdhcp6client library. ++ * ++ * Each DHCP client library must include this file to be controlled ++ * by libdhcp. ++ * ++ * Copyright(C) Jason Vas Dias Red Hat Inc. May 2006 ++ * ++ * This program is free software; you can redistribute it and/or modify ++ * it under the terms of the GNU General Public License as published by ++ * the Free Software Foundation at ++ * http://www.fsf.org/licensing/licenses/gpl.txt ++ * and included in this software distribution as the "LICENSE" file. ++ * ++ * This program is distributed in the hope that it will be useful, ++ * but WITHOUT ANY WARRANTY; without even the implied warranty of ++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ * GNU General Public License for more details. ++ */ ++#ifndef LIBDHCP_CONTROL_H ++#define LIBDHCP_CONTROL_H ++ ++#include ++ ++#define LOG_FATAL 8 ++ ++typedef enum dhcp_state_e ++{ ++ ++ /* DHCPv4 client states - third callback arg will be a 'struct client_state *' */ ++ DHC4_NBI, /* failed: no broadcast interfaces found */ ++ DHC4_PREINIT, /* configuration started - bring the interface "UP" */ ++ DHC4_BOUND, /* lease obtained */ ++ DHC4_RENEW, /* lease renewed */ ++ DHC4_REBOOT, /* have valid lease, but now obtained a different one */ ++ DHC4_REBIND, /* new, different lease */ ++ DHC4_STOP, /* remove old lease */ ++ DHC4_MEDIUM, /* media selection begun */ ++ DHC4_TIMEOUT, /* timed out contacting DHCP server */ ++ DHC4_FAIL, /* all attempts to contact server timed out, sleeping */ ++ DHC4_EXPIRE, /* lease has expired, renewing */ ++ DHC4_RELEASE, /* releasing lease */ ++ /* This state raised by both clients: */ ++ DHC_TIMEDOUT, /* libdhcp_control timeout has been exceeded */ ++ /* DHCPv6 client states: */ ++ DHC6_BOUND, /* new lease obtained - arg is optinfo * */ ++ DHC6_REBIND, /* existing expired lease rebound - arg is optinfo * */ ++ DHC6_RELEASE /* existing lease expired - arg is dhcp6_iaidaddr*/ ++} DHCP_State; ++ ++struct libdhcp_control_s; ++ ++typedef ++int ( *LIBDHCP_Error_Handler ) ++ ( struct libdhcp_control_s *ctl, ++ int priority, /* ala syslog(3): LOG_EMERG=0 - LOG_DEBUG=7 (+ LOG_FATAL=8 : finished -> 1) */ ++ const char *fmt, ++ va_list ap ++ ); ++ ++typedef ++int ( *LIBDHCP_Callback ) ( struct libdhcp_control_s *control, enum dhcp_state_e, void* ); ++ /* The DHCP clients will call the users' callback on important state change events, ++ * with the second arg set to the client DHCP_State, and the third arg set to ++ * a client specific pointer as described below. ++ */ ++ ++typedef ++struct libdhcp_control_s ++{ ++ LIBDHCP_Callback callback; /* the DHCP clients' main loop calls this on state changes */ ++ uint16_t capability; /* LIBDHCP_Capability bits to enable */ ++ uint8_t finished; /* set to one to make clients exit their main loop */ ++ uint8_t decline; /* set to one to decline the lease (DHCPv4 only) */ ++ time_t timeout; /* (timeout+now) == time after which clients MUST return */ ++ time_t now; /* clients set this to time(0) on entering main loop */ ++ void *arg; /* user data pointer */ ++ LIBDHCP_Error_Handler eh; ++} LIBDHCP_Control; ++ ++typedef enum libdhcp_capability_e ++{/* DHCP client "capabilities" */ ++ DHCP_USE_LEASE_DATABASE = 1, /* use / do not use persistent lease database files */ ++ DHCP_USE_PID_FILE = 2, /* use / do not use pid file */ ++ /* ++ * DHCPv6 supports these capabilities in process, ++ * while the DHCPv4 client will fork and exec the dhclient-script to implement them if these ++ * bits are set - otherwise, if no bits are set, the callback is called and the script is ++ * not run. ++ */ ++ DHCP_CONFIGURE_INTERFACES = 4, /* configure interfaces UP/DOWN as required */ ++ DHCP_CONFIGURE_ADDRESSES = 8, /* configure interface addresses as required */ ++ DHCP_CONFIGURE_ROUTES =16, /* configure routes as required */ ++ DHCP_CONFIGURE_RESOLVER =32, /* configure resolv.conf as required */ ++ /* DHCPv6 only: */ ++ DHCP_CONFIGURE_RADVD =64, /* configure radvd.conf & restart radvd as required */ ++} LIBDHCP_Capability; ++ ++#endif +--- dhcp-3.0.5/Makefile.dist.libdhcp4client 2004-06-10 13:59:10.000000000 -0400 ++++ dhcp-3.0.5/Makefile.dist 2006-11-09 16:02:36.000000000 -0500 +@@ -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 b0d6541..45ef0d7 100644 --- a/dhcp.spec +++ b/dhcp.spec @@ -1,7 +1,14 @@ +# Use 64-bit pointers on POWER and z/Series +%ifarch ppc64 s390x +%define bigptrs -DPTRSIZE_64BIT +%endif + +%define workdir work.linux-2.2 + Summary: DHCP (Dynamic Host Configuration Protocol) server and relay agent. Name: dhcp Version: 3.0.5 -Release: 1%{?dist} +Release: 2%{?dist} Epoch: 12 License: distributable Group: System Environment/Daemons @@ -24,11 +31,10 @@ Patch6: dhcp-3.0.5-minires.patch Patch7: dhcp-3.0.5-omapip.patch Patch8: dhcp-3.0.5-relay.patch Patch9: dhcp-3.0.5-server.patch -Patch10: dhcp-3.0.4-lib-makefile.patch - -# patches that _must_ go after the split (in %%build) -Patch500: dhcp-3.0.4-libdhcp4client.patch -Patch501: dhcp-3.0.4-timeouts.patch +Patch10: dhcp-3.0.5-libdhcp4client.patch +Patch11: dhcp-3.0.5-timeouts.patch +Patch12: dhcp-3.0.5-mkdep.patch +Patch13: dhcp-3.0.5-fix-warnings.patch BuildRoot: %{_tmppath}/%{name}-%{version}-root Requires(post): chkconfig, coreutils @@ -74,7 +80,7 @@ provides the ISC DHCP client daemon. Libraries for interfacing with the ISC DHCP server. %package -n libdhcp4client -Summary: The ISC DHCP IPv4 client in a library for invocation from other programs +Summary: ISC DHCP IPv4 client in a library for invocation from other programs Group: Development/Libraries %description -n libdhcp4client @@ -103,8 +109,12 @@ client library . %patch7 -p1 -b .omapip %patch8 -p1 -b .relay %patch9 -p1 -b .server -%patch10 -p1 -b .lib-makefile +%patch10 -p1 -b .libdhcp4client +%patch11 -p1 -b .timeouts +%patch12 -p1 -b .mkdep +%patch13 -p1 -b .warnings +%build cp %SOURCE1 . cat <site.conf VARDB=%{_localstatedir}/lib/dhcpd @@ -120,50 +130,35 @@ cat <>includes/site.h #define _PATH_DHCLIENT_DB "%{_localstatedir}/lib/dhclient/dhclient.leases" EOF -FLAGS="-Dlint -Werror -Wno-unused -DEXTENDED_NEW_OPTION_INFO" +RPM_OPT_FLAGS="$RPM_OPT_FLAGS -Werror -Dlint -DEXTENDED_NEW_OPTION_INFO" -%ifarch ppc64 s390x -FLAGS="$FLAGS -DPTRSIZE_64BIT" -%endif +# DO NOT use the %%configure macro because this configure script is not autognu +CC="%{__cc}" ./configure \ + --copts "${RPM_OPT_FLAGS} %{?bigptrs}" \ + --work-dir %{workdir} -%ifarch s390 s390x -FLAGS="$FLAGS -fPIE" -%else -FLAGS="$FLAGS -fpie" -%endif - -RPM_OPT_FLAGS="$RPM_OPT_FLAGS $FLAGS" -CC="%{__cc}" ./configure --copts "$RPM_OPT_FLAGS" - -sed 's/@DHCP_VERSION@/'%{version}'/' < %SOURCE5 >libdhcp4client.pc -make -f libdhcp4client.Makefile CC="%{__cc}" libdhcp4client/. -%patch500 -p1 -b .lib -%patch501 -p1 -b .timeouts - -%build -make %{?_smp_mflags} CC="%{__cc}" -sed 's/@DHCP_VERSION@/'%{version}'/' < %SOURCE5 >libdhcp4client.pc -make -f libdhcp4client.Makefile CC="%{__cc}" +sed 's/@DHCP_VERSION@/'%{version}'/' < %SOURCE5 > libdhcp4client.pc +%{__make} %{?_smp_mflags} CC="%{__cc}" %install -rm -rf %{buildroot} -mkdir -p %{buildroot}/etc/sysconfig +rm -rf $RPM_BUILD_ROOT +mkdir -p $RPM_BUILD_ROOT/etc/sysconfig -make install DESTDIR=%{buildroot} +make install DESTDIR=$RPM_BUILD_ROOT -mkdir -p %{buildroot}/etc/rc.d/init.d +mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d install -m 0755 %SOURCE2 %{buildroot}/etc/rc.d/init.d/dhcpd -touch %{buildroot}%{_localstatedir}/lib/dhcpd/dhcpd.leases -mkdir -p %{buildroot}%{_localstatedir}/lib/dhclient/ -cat < %{buildroot}/etc/sysconfig/dhcpd +touch $RPM_BUILD_ROOT%{_localstatedir}/lib/dhcpd/dhcpd.leases +mkdir -p $RPM_BUILD_ROOT%{_localstatedir}/lib/dhclient/ +cat < $RPM_BUILD_ROOT/etc/sysconfig/dhcpd # Command line options here DHCPDARGS= EOF -install -m0755 %SOURCE3 %{buildroot}/etc/rc.d/init.d/dhcrelay +install -m0755 %SOURCE3 $RPM_BUILD_ROOT/etc/rc.d/init.d/dhcrelay -cat < %{buildroot}/etc/sysconfig/dhcrelay +cat < $RPM_BUILD_ROOT/etc/sysconfig/dhcrelay # Command line options here INTERFACES="" DHCPSERVERS="" @@ -171,15 +166,15 @@ EOF # Copy sample dhclient.conf file into position cp client/dhclient.conf dhclient.conf.sample -chmod 755 %{buildroot}/sbin/dhclient-script +chmod 755 $RPM_BUILD_ROOT/sbin/dhclient-script # Create per-package copies of dhcp-options and dhcp-eval common man-pages: -cp -fp ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcp-options.5 ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcpd-options.5 -cp -fp ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcp-options.5 ${RPM_BUILD_ROOT}%{_mandir}/man5/dhclient-options.5 -cp -fp ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcp-eval.5 ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcpd-eval.5 -cp -fp ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcp-eval.5 ${RPM_BUILD_ROOT}%{_mandir}/man5/dhclient-eval.5 +cp -fp $RPM_BUILD_ROOT%{_mandir}/man5/dhcp-options.5 $RPM_BUILD_ROOT%{_mandir}/man5/dhcpd-options.5 +cp -fp $RPM_BUILD_ROOT%{_mandir}/man5/dhcp-options.5 $RPM_BUILD_ROOT%{_mandir}/man5/dhclient-options.5 +cp -fp $RPM_BUILD_ROOT%{_mandir}/man5/dhcp-eval.5 $RPM_BUILD_ROOT%{_mandir}/man5/dhcpd-eval.5 +cp -fp $RPM_BUILD_ROOT%{_mandir}/man5/dhcp-eval.5 $RPM_BUILD_ROOT%{_mandir}/man5/dhclient-eval.5 -# Why not ship the doc/ documentation ? Some of it is quite useful. +# Why not ship the doc/ documentation? Some of it is quite useful. # Also generate DHCP options tables for C, perl, python: /usr/bin/perl %SOURCE6 > doc/dhcp_options.h /usr/bin/perl %SOURCE6 -pe > doc/dhcp_options.pl @@ -187,20 +182,18 @@ cp -fp ${RPM_BUILD_ROOT}%{_mandir}/man5/dhcp-eval.5 ${RPM_BUILD_ROOT}%{_mandir}/ /usr/bin/perl %SOURCE6 -d > doc/dhcp_options.txt # Install default (empty) dhcpd.conf: -cp -fp %SOURCE4 %{buildroot}/etc +cp -fp %SOURCE4 $RPM_BUILD_ROOT/etc -# libdhcp4client install -sed 's/@DHCP_VERSION@/'%{version}'/' < %SOURCE5 >libdhcp4client.pc -make -f libdhcp4client.Makefile install DESTDIR=$RPM_BUILD_ROOT LIBDIR=%{_libdir} +install -p -m 0644 -D libdhcp4client.pc $RPM_BUILD_ROOT%{_libdir}/pkgconfig/libdhcp4client.pc -# Fix debuginfo files list - don't ship links to .c files in the buildroot :-) -work=work.`./configure --print-sysname`; -find $work -type l -a -name '*.c' | -while read f; do - rm -f $f; - cp -fp ${f#$work/} $f; +# 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} @@ -325,6 +318,12 @@ exit 0 %{_libdir}/libdhcp4client.so %changelog +* Thu Nov 09 2006 David Cantrell - 12:3.0.5-2 +- Change the way libdhcp4client is compiled (patch main source, create new + Makefile rather than copy and patch code after main patches) +- Fix up problems generating compiler warnings +- Use 'gcc' for making dependencies + * Tue Nov 07 2006 David Cantrell - 12:3.0.5-1 - Upgrade to ISC dhcp-3.0.5 diff --git a/libdhcp4client.pc b/libdhcp4client.pc index c46db50..4a3af70 100644 --- a/libdhcp4client.pc +++ b/libdhcp4client.pc @@ -1,6 +1,7 @@ -Name: libdhcp4client -Description: ISC DHCP IPv4 client library -Version: @DHCP_VERSION@ -Libs: -ldhcp4client -Cflags: -I/usr/include/dhcp4client -ISC.Cflags= -I/usr/include/dhcp4client/isc_dhcp +ISC.Cflags=-I/usr/include/dhcp4client/isc_dhcp + +Name: libdhcp4client +Description: ISC DHCP IPv4 client library +Version: @DHCP_VERSION@ +Libs: -ldhcp4client +Cflags: -I/usr/include/dhcp4client