[dhcp-agent-commits] dhcp-agent/src dhcp-client-control.c,1.12,1.13 dhcp-client-states.c,1.20,1.21 d
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2002-12-29 05:09:58
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory sc8-pr-cvs1:/tmp/cvs-serv5247 Modified Files: dhcp-client-control.c dhcp-client-states.c dhcp-client.c dhcp-client.h dhcp-interface.c dhcp-librawnet.h dhcp-libutil.h dhcp-rawnet.c dhcp-sniff.c dhcp-sysconf.c dhcp-timer.c Log Message: fixed problem with forking out and losing data Index: dhcp-client-control.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client-control.c,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** dhcp-client-control.c 27 Dec 2002 02:53:45 -0000 1.12 --- dhcp-client-control.c 29 Dec 2002 05:09:55 -0000 1.13 *************** *** 123,127 **** /* create client control object */ ! dhcp_client_control_t *dhcp_client_control_create(char *interface, int promiscuous) { dhcp_client_control_t *dc; --- 123,127 ---- /* create client control object */ ! dhcp_client_control_t *dhcp_client_control_create(char *interface, int promiscuous, int clear_interface) { dhcp_client_control_t *dc; *************** *** 139,143 **** dc->interface = xstrdup(interface); dc->cache = client_cache_create(dc->interface); - dc->timer = create_timer(); dc->conf = create_client_conf(dc->interface); --- 139,142 ---- *************** *** 173,177 **** if((dc->rawnet = rawnet_create(interface, stringbuffer_getstring(filter), sport, dport, ! promiscuous)) == NULL) { ERROR_MESSAGE("could not acquire rawnet handler."); dhcp_client_control_destroy(dc); --- 172,176 ---- if((dc->rawnet = rawnet_create(interface, stringbuffer_getstring(filter), sport, dport, ! promiscuous, clear_interface)) == NULL) { ERROR_MESSAGE("could not acquire rawnet handler."); dhcp_client_control_destroy(dc); *************** *** 213,216 **** --- 212,220 ---- dc->client_id = create_client_id(interface_addr); dc->discover_offer_retries = 0; /* reset discover offer. */ + + /* create state context */ + + dc->context = dhcp_client_control_context_create(); + return dc; } *************** *** 242,248 **** client_conf_destroy(dc->conf); - if(dc->timer) - destroy_timer(dc->timer); - if(dc->interface) xfree(dc->interface); --- 246,249 ---- *************** *** 257,260 **** --- 258,308 ---- } + /* Context information. This serves one purpose. It lets us + * destroy the control, recreate it and copy back information we + * cannot cache anywhere. */ + + dhcp_client_control_context_t *dhcp_client_control_context_create(void) + { + dhcp_client_control_context_t *context = xcalloc(sizeof(dhcp_client_control_context_t)); + + context->timer = create_timer(); + + return context; + } + + void dhcp_client_control_destroy_context(dhcp_client_control_context_t *context) + { + if(context->timer) + destroy_timer(context->timer); + + xfree(context); + + return; + } + + dhcp_client_control_context_t *dhcp_client_control_copy_context(dhcp_client_control_t *dc) + { + dhcp_client_control_context_t *context; + + context = dhcp_client_control_context_create(); + + /* copy individual fields over. */ + memcpy(&context->sip_addr, &dc->context->sip_addr, IP_ADDR_LEN); + memcpy(&context->shw_addr, &dc->context->shw_addr, ETH_ADDR_LEN); + + /* copy over the timer. */ + context->timer = timer_copy(dc->context->timer); + + return context; + } + + void dhcp_client_control_set_context(dhcp_client_control_t *dc, dhcp_client_control_context_t *context) + { + dhcp_client_control_destroy_context(dc->context); + dc->context = context; + + return; + } + /* Utility routine to bring down interface. we need this because * we have to be explicit about bringing down the interface. We *************** *** 275,279 **** void dhcp_client_set_server_ip_address(dhcp_client_control_t *dc, ip_addr_t ip_addr) { ! memcpy(&dc->sip_addr, &ip_addr, sizeof(ip_addr_t)); return; --- 323,327 ---- void dhcp_client_set_server_ip_address(dhcp_client_control_t *dc, ip_addr_t ip_addr) { ! memcpy(&dc->context->sip_addr, &ip_addr, sizeof(ip_addr_t)); return; *************** *** 282,286 **** void dhcp_client_set_server_hw_address(dhcp_client_control_t *dc, eth_addr_t eth_addr) { ! memcpy(&dc->shw_addr, ð_addr, sizeof(eth_addr_t)); return; --- 330,334 ---- void dhcp_client_set_server_hw_address(dhcp_client_control_t *dc, eth_addr_t eth_addr) { ! memcpy(&dc->context->shw_addr, ð_addr, sizeof(eth_addr_t)); return; *************** *** 291,299 **** ip_addr_t dhcp_client_get_server_ip_address(dhcp_client_control_t *dc) { ! return dc->sip_addr; } eth_addr_t dhcp_client_get_server_hw_address(dhcp_client_control_t *dc) { ! return dc->shw_addr; } --- 339,347 ---- ip_addr_t dhcp_client_get_server_ip_address(dhcp_client_control_t *dc) { ! return dc->context->sip_addr; } eth_addr_t dhcp_client_get_server_hw_address(dhcp_client_control_t *dc) { ! return dc->context->shw_addr; } Index: dhcp-client-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client-states.c,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -d -r1.20 -r1.21 *** dhcp-client-states.c 27 Dec 2002 02:53:45 -0000 1.20 --- dhcp-client-states.c 29 Dec 2002 05:09:55 -0000 1.21 *************** *** 309,312 **** --- 309,313 ---- } + /* setup our timers. */ static void client_setup_timers(dhcp_client_control_t *dc) { *************** *** 320,324 **** } ! reinitialize_timer(dc->timer); do_sysconf(timer_options, dc, 0); cache_entry_purge_list(timer_options); --- 321,325 ---- } ! reinitialize_timer(dc->context->timer); do_sysconf(timer_options, dc, 0); cache_entry_purge_list(timer_options); *************** *** 336,340 **** * safe. we shouldn't overflow. */ ! next_timer = timer_peek_next_timer(dc->timer); if(next_timer < RECOMMENDED_MAX_SECS_WAIT) { --- 337,341 ---- * safe. we shouldn't overflow. */ ! next_timer = timer_peek_next_timer(dc->context->timer); if(next_timer < RECOMMENDED_MAX_SECS_WAIT) { *************** *** 550,554 **** options = client_build_release_option_list(dc); ! build_dhcp_release(dc->rawnet, dc->xid, options, dc->sip_addr, dc->shw_addr); if(rawnet_send_packet(dc->rawnet) < 0) { --- 551,555 ---- options = client_build_release_option_list(dc); ! build_dhcp_release(dc->rawnet, dc->xid, options, dc->context->sip_addr, dc->context->shw_addr); if(rawnet_send_packet(dc->rawnet) < 0) { *************** *** 619,627 **** * which is not a timer interrupt. */ ! next_timer = timer_peek_next_timer(dc->timer); time_before = time(NULL); /* now fire off the next timer. */ ! if(timer_set_next(dc->timer)) { FATAL_MESSAGE ("no timers set. we should have at least one for lease expiry sent to us from the server."); --- 620,628 ---- * which is not a timer interrupt. */ ! next_timer = timer_peek_next_timer(dc->context->timer); time_before = time(NULL); /* now fire off the next timer. */ ! if(timer_set_next(dc->context->timer)) { FATAL_MESSAGE ("no timers set. we should have at least one for lease expiry sent to us from the server."); *************** *** 664,668 **** * we at most lag by one second which is not bad. */ ! timer_add_trigger(dc->timer, next_timer, timer_get_current_id(dc->timer)); } } --- 665,669 ---- * we at most lag by one second which is not bad. */ ! timer_add_trigger(dc->context->timer, next_timer, timer_get_current_id(dc->context->timer)); } } *************** *** 719,723 **** options = client_build_renew_option_list(dc); ! build_dhcp_request_unicast(dc->rawnet, dc->xid, dc->secs, options, dc->sip_addr, dc->shw_addr); /* find out how much time we have until the next timer. --- 720,724 ---- options = client_build_renew_option_list(dc); ! build_dhcp_request_unicast(dc->rawnet, dc->xid, dc->secs, options, dc->context->sip_addr, dc->context->shw_addr); /* find out how much time we have until the next timer. *************** *** 804,805 **** --- 805,813 ---- } + /* utility state: call this if reinitializing our client control + * useful when recreating the control (e.g. after a fork). */ + int client_reinitialize(dhcp_client_control_t *dc) + { + client_setup_timers(dc); + return 0; + } Index: dhcp-client.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client.c,v retrieving revision 1.17 retrieving revision 1.18 diff -C2 -d -r1.17 -r1.18 *** dhcp-client.c 23 Dec 2002 01:21:52 -0000 1.17 --- dhcp-client.c 29 Dec 2002 05:09:55 -0000 1.18 *************** *** 89,93 **** /* global vars affecting other code. */ - int interactive = 1; /* by default we begin interactive (messages on stdout/stderr). */ char *work_dir = CLIENT_WORK_DIR; /* our default working directory */ --- 89,92 ---- *************** *** 192,196 **** static int do_client_dhcp_loop(int only_setup, dhcp_client_control_t *dc, int state) { - unsigned char have_setup = 0; while(1) { --- 191,194 ---- *************** *** 231,235 **** /* if alarm then check for timer type so we can set our state accordingly. */ ! switch (timer_get_current_id(dc->timer)) { case TIMER_RENEW: --- 229,233 ---- /* if alarm then check for timer type so we can set our state accordingly. */ ! switch (timer_get_current_id(dc->context->timer)) { case TIMER_RENEW: *************** *** 258,262 **** * return here. */ ! if(have_setup && only_setup) { return state; } --- 256,260 ---- * return here. */ ! if((state == STATE_WAIT) && only_setup) { return state; } *************** *** 365,368 **** --- 363,367 ---- { dhcp_client_control_t *dc; + dhcp_client_control_context_t *dc_context; int state; *************** *** 399,403 **** setup_interrupt_handlers(); /* setup signal handling */ ! if((dc = dhcp_client_control_create(interface, promiscuous)) == NULL) { ERROR_MESSAGE("encountered a fatal error. I'm exiting."); client_states[STATE_DO_SHUTDOWN] (dc); --- 398,402 ---- setup_interrupt_handlers(); /* setup signal handling */ ! if((dc = dhcp_client_control_create(interface, promiscuous, 1)) == NULL) { ERROR_MESSAGE("encountered a fatal error. I'm exiting."); client_states[STATE_DO_SHUTDOWN] (dc); *************** *** 422,437 **** * ... otherwise ... */ dhcp_client_control_destroy(dc); ! interactive = 0; go_background(work_dir); setup_interrupt_handlers(); /* setup signal handling, * we lose them after we fork in go_background. */ ! if((dc = dhcp_client_control_create(interface, promiscuous)) == NULL) { ERROR_MESSAGE("encountered a fatal error. I'm exiting.", interface); client_states[STATE_DO_SHUTDOWN] (NULL); } if(file_create_pid(interface)) { ERROR_MESSAGE("could not create PID file for interface: %s"); --- 421,464 ---- * ... otherwise ... */ + /* We need to destroy our client control object before + * backgrounding ourselves. Since we close file + * descriptors and enter a different process space. + * + * This accumilates to losing a _lot_ of things: + * + * (1) Any raw network devices, or anything else which + * has a descriptor open is now closed. + * + * (2) Our signal handlers are gone. + * + * (3) Our concept of timers is gone. + * + * The only thing we keep is our state which ought to be + * STATE_WAIT + * + * Unfortunately destroying the control means valuable + * data like timers, and addresses are lost. we can + * however make a copy of this information and just label + * it a context. This way we set it after recreating the + * control + */ + + dc_context = dhcp_client_control_copy_context(dc); dhcp_client_control_destroy(dc); ! set_interactive(0); go_background(work_dir); setup_interrupt_handlers(); /* setup signal handling, * we lose them after we fork in go_background. */ ! /* set clear_interface to 0 on create call because by now we're configured fine. */ ! if((dc = dhcp_client_control_create(interface, promiscuous, 0)) == NULL) { ERROR_MESSAGE("encountered a fatal error. I'm exiting.", interface); client_states[STATE_DO_SHUTDOWN] (NULL); } + /* set old context information. */ + dhcp_client_control_set_context(dc, dc_context); + if(file_create_pid(interface)) { ERROR_MESSAGE("could not create PID file for interface: %s"); *************** *** 441,444 **** --- 468,474 ---- if(fake_hw_addr) /* Marla, you liar, you big tourist, I need this. Now get out! */ dhcp_client_control_use_fake_hw_addr(dc, fake_hw_addr); + + /* call reinitialize for things like resetting the timer. */ + client_reinitialize(dc); } Index: dhcp-client.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** dhcp-client.h 27 Dec 2002 02:53:45 -0000 1.10 --- dhcp-client.h 29 Dec 2002 05:09:55 -0000 1.11 *************** *** 28,31 **** --- 28,40 ---- /* data structures. */ + typedef struct { + + /* use these for unicasting. */ + ip_addr_t sip_addr; /* server or relay agent ip address */ + eth_addr_t shw_addr; /* server or relay agent hardware address. */ + timer_keeper_t *timer; /* timer for rebind/renew. */ + + } dhcp_client_control_context_t; + /* client control object. */ typedef struct { *************** *** 39,43 **** time_t started; /* the amount of milliseconds since we started. */ time_t secs; /* secs -- used to save secs value. */ - timer_keeper_t *timer; /* timer for rebind/renew. */ char *interface; /* interface name. */ --- 48,51 ---- *************** *** 46,62 **** int discover_offer_retries; /* counter for retries on discover_offer */ - /* use these for unicasting. */ - ip_addr_t sip_addr; /* server or relay agent ip address */ - eth_addr_t shw_addr; /* server or relay agent hardware address. */ - - /* use these when filling in dhcp headers. */ - ip_addr_t yiaddr; /* our assigned ip address. */ - ip_addr_t siaddr; /* server ip address. */ - ip_addr_t giaddr; /* relay agent ip address. */ - ip_addr_t ciaddr; /* client ip address. */ - /* use this for validation purposes. */ uint16_t server_port; /* port to expect UDP packets from. */ } dhcp_client_control_t; --- 54,65 ---- int discover_offer_retries; /* counter for retries on discover_offer */ /* use this for validation purposes. */ uint16_t server_port; /* port to expect UDP packets from. */ + /* context information: this information is stateful so keep it seperate + * so it may be saved in case we need to recreate our control object. */ + + dhcp_client_control_context_t *context; + } dhcp_client_control_t; *************** *** 100,106 **** extern int client_fatal_error(dhcp_client_control_t *dc); extern int client_do_shutdown(dhcp_client_control_t *dc); /* client control. */ ! extern dhcp_client_control_t *dhcp_client_control_create(char *interface, int promiscuous); extern dhcp_client_control_t *dhcp_client_control_create_dummy(char *interface); extern void dhcp_client_control_destroy(dhcp_client_control_t *dc); --- 103,110 ---- extern int client_fatal_error(dhcp_client_control_t *dc); extern int client_do_shutdown(dhcp_client_control_t *dc); + extern int client_reinitialize(dhcp_client_control_t *dc); /* client control. */ ! extern dhcp_client_control_t *dhcp_client_control_create(char *interface, int promiscuous, int clear_interface); extern dhcp_client_control_t *dhcp_client_control_create_dummy(char *interface); extern void dhcp_client_control_destroy(dhcp_client_control_t *dc); *************** *** 119,122 **** --- 123,133 ---- extern ip_addr_t dhcp_client_get_server_ip_address(dhcp_client_control_t *dc); extern eth_addr_t dhcp_client_get_server_hw_address(dhcp_client_control_t *dc); + + /* context information. */ + + extern dhcp_client_control_context_t *dhcp_client_control_context_create(void); + extern void dhcp_client_control_destroy_context(dhcp_client_control_context_t *context); + extern dhcp_client_control_context_t *dhcp_client_control_copy_context(dhcp_client_control_t *dc); + extern void dhcp_client_control_set_context(dhcp_client_control_t *dc, dhcp_client_control_context_t *context); #endif /* DHCP_CLIENT_H */ Index: dhcp-interface.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-interface.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dhcp-interface.c 27 Dec 2002 02:53:45 -0000 1.4 --- dhcp-interface.c 29 Dec 2002 05:09:55 -0000 1.5 *************** *** 107,117 **** if(set_addr) /* set an address as we bring this up. */ { ! if(addr == 0) { ! ic->interface_entry->intf_addr.addr_type = ADDR_TYPE_NONE; ! } else { ! ic->interface_entry->intf_addr.addr_type = ADDR_TYPE_IP; ! addr_mtob(&netmask, IP_ADDR_LEN, &ic->interface_entry->intf_addr.addr_bits); ! memcpy(&ic->interface_entry->intf_addr.addr_ip, &addr, IP_ADDR_LEN); ! } } --- 107,115 ---- if(set_addr) /* set an address as we bring this up. */ { ! ! ic->interface_entry->intf_addr.addr_type = ADDR_TYPE_IP; ! addr_mtob(&netmask, IP_ADDR_LEN, &ic->interface_entry->intf_addr.addr_bits); ! memcpy(&ic->interface_entry->intf_addr.addr_ip, &addr, IP_ADDR_LEN); ! } *************** *** 126,132 **** if(interface_set_info(ic)) { ! ERROR_MESSAGE("could not bring up interface %s : %s", ! ic->interface_entry->intf_name, strerror(errno)); ! return -1; } --- 124,136 ---- if(interface_set_info(ic)) { ! ! /* setting 0 address under Linux with dnet currently ! * fails. so we'll ignore the error for now. FIXME: ! * update when dnet is fixed. (the address is set to 0 ! * but dnet doesn't get further than netmask settings. */ ! ! /* ERROR_MESSAGE("could not bring up interface %s : %s", ! ic->interface_entry->intf_name, strerror(errno)); ! return -1; */ } *************** *** 144,147 **** --- 148,152 ---- } + ic->interface_entry->intf_addr.addr_type = ADDR_TYPE_NONE; ic->interface_entry->intf_flags &= ~INTF_FLAG_UP; Index: dhcp-librawnet.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-librawnet.h,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dhcp-librawnet.h 27 Dec 2002 02:53:21 -0000 1.7 --- dhcp-librawnet.h 29 Dec 2002 05:09:55 -0000 1.8 *************** *** 315,319 **** /* rawnet routines. */ extern rawnet_t *rawnet_create(const char *device, const char *filter, int sport, int dport, ! int promiscuous); extern void rawnet_destroy(rawnet_t *net); extern int rawnet_get_packet(rawnet_t *net, struct timeval *tm); --- 315,319 ---- /* rawnet routines. */ extern rawnet_t *rawnet_create(const char *device, const char *filter, int sport, int dport, ! int promiscuous, int clear_address); extern void rawnet_destroy(rawnet_t *net); extern int rawnet_get_packet(rawnet_t *net, struct timeval *tm); *************** *** 333,337 **** int (*check) (void *arg), time_t max_timeout); ! extern int rawnet_interface_up(rawnet_t *net, ip_addr_t addr, ip_addr_t netmask, int mtu); extern int rawnet_interface_down(rawnet_t *net); extern list_t *rawnet_list_active_interfaces(void); --- 333,337 ---- int (*check) (void *arg), time_t max_timeout); ! extern int rawnet_interface_up(rawnet_t *net, ip_addr_t addr, ip_addr_t netmask, int mtu, int clear_address); extern int rawnet_interface_down(rawnet_t *net); extern list_t *rawnet_list_active_interfaces(void); Index: dhcp-libutil.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-libutil.h,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** dhcp-libutil.h 23 Dec 2002 01:21:52 -0000 1.19 --- dhcp-libutil.h 29 Dec 2002 05:09:55 -0000 1.20 *************** *** 246,249 **** --- 246,250 ---- extern void reinitialize_timer(timer_keeper_t *timer); extern uint32_t timer_peek_next_timer(timer_keeper_t *timer); + extern timer_keeper_t *timer_copy(timer_keeper_t *timer); /* var file. */ Index: dhcp-rawnet.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-rawnet.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dhcp-rawnet.c 27 Dec 2002 02:53:45 -0000 1.4 --- dhcp-rawnet.c 29 Dec 2002 05:09:55 -0000 1.5 *************** *** 95,107 **** /* bring up interface, and assign ourselves the address passed. */ ! int rawnet_interface_up(rawnet_t *net, ip_addr_t addr, ip_addr_t netmask, int mtu) { ! if(interface_up(net->intf_handle, addr, netmask, mtu, 1)) { ERROR_MESSAGE("could not bring interface up."); return -1; } ! memcpy(&net->cip_addr, &addr, IP_ADDR_LEN); /* set our IP address. */ return 0; } --- 95,108 ---- /* bring up interface, and assign ourselves the address passed. */ ! int rawnet_interface_up(rawnet_t *net, ip_addr_t addr, ip_addr_t netmask, int mtu, int set_address) { ! if(interface_up(net->intf_handle, addr, netmask, mtu, set_address)) { ERROR_MESSAGE("could not bring interface up."); return -1; } ! /* now set our address, whether we set it earlier or not. */ ! rawnet_get_ip_addr(net, &net->cip_addr); return 0; } *************** *** 191,195 **** rawnet_t *rawnet_create(const char *device, const char *filter, ! int dhcp_src_port, int dhcp_dst_port, int promiscuous) { rawnet_t *net; --- 192,196 ---- rawnet_t *rawnet_create(const char *device, const char *filter, ! int dhcp_src_port, int dhcp_dst_port, int promiscuous, int clear_address) { rawnet_t *net; *************** *** 225,229 **** /* interface down */ /* bring it up with dum values. */ ! if(rawnet_interface_up(net, 0, 0, -1)) { ERROR_MESSAGE("error trying to bring device up: %s", device); rawnet_destroy(net); --- 226,240 ---- /* interface down */ /* bring it up with dum values. */ ! if(rawnet_interface_up(net, 0, 0, -1, clear_address)) { ! ERROR_MESSAGE("error trying to bring device up: %s", device); ! rawnet_destroy(net); ! return NULL; ! } ! } else if(clear_address) { ! ! /* interface down but we've been told to clear its address, ! * so our caller wants us to initialize it either way. */ ! ! if(rawnet_interface_up(net, 0, 0, -1, clear_address)) { ERROR_MESSAGE("error trying to bring device up: %s", device); rawnet_destroy(net); Index: dhcp-sniff.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-sniff.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dhcp-sniff.c 23 Dec 2002 00:51:25 -0000 1.4 --- dhcp-sniff.c 29 Dec 2002 05:09:55 -0000 1.5 *************** *** 118,128 **** /* It's ok not to set ports since we're not writing any packets. */ ! net = rawnet_create(interface_name, stringbuffer_getstring(filter), 0, 0, 1); ! ! stringbuffer_destroy(filter); ! if(net == NULL) { FATAL_MESSAGE("unable to access raw network"); } INFO_MESSAGE("opened %s for packet capturing", interface_name); --- 118,126 ---- /* It's ok not to set ports since we're not writing any packets. */ ! net = rawnet_create(interface_name, stringbuffer_getstring(filter), 0, 0, 1, 0); if(net == NULL) { FATAL_MESSAGE("unable to access raw network"); } + stringbuffer_destroy(filter); INFO_MESSAGE("opened %s for packet capturing", interface_name); Index: dhcp-sysconf.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-sysconf.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** dhcp-sysconf.c 23 Dec 2002 01:21:52 -0000 1.10 --- dhcp-sysconf.c 29 Dec 2002 05:09:55 -0000 1.11 *************** *** 221,225 **** uint32_t *secs = value; ! timer_add_trigger(dc->timer, *secs, TIMER_IP_LEASE); return 0; } --- 221,225 ---- uint32_t *secs = value; ! timer_add_trigger(dc->context->timer, *secs, TIMER_IP_LEASE); return 0; } *************** *** 229,233 **** uint32_t *secs = value; ! timer_add_trigger(dc->timer, *secs, TIMER_REBIND); return 0; } --- 229,233 ---- uint32_t *secs = value; ! timer_add_trigger(dc->context->timer, *secs, TIMER_REBIND); return 0; } *************** *** 237,241 **** uint32_t *secs = value; ! timer_add_trigger(dc->timer, *secs, TIMER_RENEW); return 0; } --- 237,241 ---- uint32_t *secs = value; ! timer_add_trigger(dc->context->timer, *secs, TIMER_RENEW); return 0; } *************** *** 426,430 **** } ! if(rawnet_interface_up(dc->rawnet, addr, netmask, (int)mtu)) { ERROR_MESSAGE("could not bring interface up: %s", rawnet_get_device_name(dc->rawnet)); return -1; --- 426,430 ---- } ! if(rawnet_interface_up(dc->rawnet, addr, netmask, (int)mtu, 1)) { ERROR_MESSAGE("could not bring interface up: %s", rawnet_get_device_name(dc->rawnet)); return -1; Index: dhcp-timer.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-timer.c,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** dhcp-timer.c 19 Dec 2002 17:20:36 -0000 1.7 --- dhcp-timer.c 29 Dec 2002 05:09:55 -0000 1.8 *************** *** 175,176 **** --- 175,202 ---- return trigger->seconds; } + + /* make a copy of a timer: achtung this doesn't fiddle with any + * timers already set. */ + timer_keeper_t *timer_copy(timer_keeper_t *timer) + { + timer_keeper_t *timer_copy; + timer_trigger_t *trigger; + list_t *list_ptr; + + timer_copy = create_timer(); + + /* now copy over individual triggers by recreating them. */ + + for(list_ptr = timer->triggers; list_ptr; + list_ptr = list_ptr->next) { + + trigger = list_ptr->data; + timer_copy->triggers = add_to_list(timer_copy->triggers, + create_trigger(trigger->seconds, trigger->id)); + } + + timer_copy->triggers = sort_list(timer_copy->triggers, compare_triggers_shortest); + return timer_copy; + } + + |