[dhcp-agent-commits] dhcp-agent/src dhcp-interrupt.c,NONE,1.1 Makefile.am,1.6,1.7 dhcp-client-states
Status: Alpha
Brought to you by:
actmodern
From: <act...@us...> - 2002-11-15 21:07:26
|
Update of /cvsroot/dhcp-agent/dhcp-agent/src In directory usw-pr-cvs1:/tmp/cvs-serv32686/src Modified Files: Makefile.am dhcp-client-states.c dhcp-client.c dhcp-client.h dhcp-daemon.c dhcp-daemon.h dhcp-libutil.h dhcp-sysconf.c dhcp-sysconf.h dhcp-timer.c dhcp-util.c Added Files: dhcp-interrupt.c Log Message: redid interrupt handlers; almost got rebind/renew done --- NEW FILE: dhcp-interrupt.c --- /* $Header: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-interrupt.c,v 1.1 2002/11/15 21:06:47 actmodern Exp $ * * Copyright 2002 Thamer Alharbash * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * 3. The names of the authors may not be used to endorse or promote * products derived from this software without specific prior * written permission. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * Utility routines. * */ #define MODULE_NAME "dhcp-interrupt" #include "dhcp-local.h" #include "dhcp-libutil.h" /* wrap for volatine integers, or proper sig_atomic_t types. */ #ifdef HAVE_SIG_ATOMIC_T static sig_atomic_t have_shutdown = 0; static sig_atomic_t have_hup = 0; static sig_atomic_t have_alarm = 0; #else static volatile int have_shutdown = 0; static volatile int have_hup = 0; static volatile int have_alarm = 0; #endif /* All handlers do is setup atomic variables. */ /* term handler. */ RETSIGTYPE handle_shutdown(int i) { have_shutdown = 1; return (RETSIGTYPE) 0; } /* hup handler. */ RETSIGTYPE handle_hup(int i) { have_hup = 1; return (RETSIGTYPE) 0; } /* alarm handler. */ static RETSIGTYPE handle_alarm(int i) { have_alarm = 1; return (RETSIGTYPE) 0; } /* check which variables ere setup and return. * clear before returning. */ int got_interrupt_type(void) { if(have_shutdown) { have_shutdown = 0; return INTERRUPT_TERM; } if(have_hup) { have_hup = 0; return INTERRUPT_HUP; } if(have_alarm) { have_alarm = 0; return INTERRUPT_ALARM; } return INTERRUPT_NONE; } /* will trigger alarm for one time only. */ void set_alarm(uint32_t alarm_time) { add_interrupt_handler(SIGALRM, handle_alarm); alarm(alarm_time); return; } /* remove alarm. */ void remove_alarm(void) { have_alarm = 0; alarm(0); /* reset alarm to fire off immediately. */ while(!alarm); /* should happen _very_ soon. */ have_alarm = 0; /* now remove: this also makes sure we don't have a pending * SIGARLM. */ remove_interrupt(SIGALRM); return; } /* add signal handler. */ void add_interrupt_handler(int sigtype, void (*sighandler)(int)) { struct sigaction sa; memset(&sa, 0, sizeof(struct sigaction)); sa.sa_handler = sighandler; sigfillset(&sa.sa_mask); if(sigaction(sigtype, &sa, NULL)) FATAL_MESSAGE("could not set signal handler for: %d", sigtype); return; } /* block all signals. */ void block_interrupts(void) { sigset_t signal_mask; sigfillset(&signal_mask); sigprocmask(SIG_SETMASK, &signal_mask, NULL); return; } /* unblock signals temporarily so we can receive pending signals. */ int check_for_interrupts(void) { /* Easiest way to do this is unblock all signals, * then block them again. */ sigset_t signal_mask, o_mask; sigemptyset(&signal_mask); sigprocmask(SIG_SETMASK, &signal_mask, &o_mask); /* here we get all the signals. */ sigprocmask(SIG_SETMASK, &o_mask, NULL); return 0; } /* suspend indefinetly for a signal (useful for alarm). */ void suspend_for_interrupts(void) { sigset_t signal_mask; sigemptyset(&signal_mask); sigsuspend(&signal_mask); } /* remove an interrupt. */ void remove_interrupt(int sig) { sigset_t signal_set; sigemptyset(&signal_set); sigaddset(&signal_set, sig); if(sigpending(&signal_set)) { add_interrupt_handler(sig, SIG_IGN); sigfillset(&signal_set); sigdelset(&signal_set, sig); sigsuspend(&signal_set); add_interrupt_handler(sig, SIG_DFL); } return; } Index: Makefile.am =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/Makefile.am,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** Makefile.am 10 Nov 2002 16:14:38 -0000 1.6 --- Makefile.am 15 Nov 2002 21:06:47 -0000 1.7 *************** *** 41,45 **** dhcp-arp.c \ dhcp-icmp.c \ ! dhcp-route.c dhcp_sniff_SOURCES = dhcp-sniff.c \ --- 41,46 ---- dhcp-arp.c \ dhcp-icmp.c \ ! dhcp-route.c \ ! dhcp-interrupt.c dhcp_sniff_SOURCES = dhcp-sniff.c \ Index: dhcp-client-states.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client-states.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-client-states.c 10 Nov 2002 15:46:40 -0000 1.2 --- dhcp-client-states.c 15 Nov 2002 21:06:47 -0000 1.3 *************** *** 456,460 **** return STATE_FATAL_ERROR; } ! return STATE_WAIT; } --- 456,460 ---- return STATE_FATAL_ERROR; } ! return STATE_WAIT; } *************** *** 463,486 **** int client_wait(dhcp_client_control_t *dc) { ! struct timeval alarm_time; ! /* ! * setup signal based on renewal time ! * we actually don't care about lease ! * time since we purge our cache ! * when we exit and release our lease. ! * ! * FIXME: (check RFC compliance) ! */ ! rawnet_down(dc->rawnet); ! alarm_time.tv_sec = dc->renewal_time; ! alarm_time.tv_usec = 0; ! ! set_alarm(alarm_time); ! ! suspend_for_interrupts(); /* if we got a shutdown or HUP it will be caught later. */ rawnet_up(dc->rawnet); --- 463,479 ---- int client_wait(dhcp_client_control_t *dc) { ! /* take our raw network connection down. */ rawnet_down(dc->rawnet); + /* Ask our internal timer to setup our next alarm: this is + * for rebind, renewal, and expiry in that order. */ ! 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."); ! } + /* wait for any interrupts. */ + suspend_for_interrupts(); + rawnet_up(dc->rawnet); *************** *** 490,496 **** dhcp_client_update_secs(dc); ! return STATE_REQUEST_ACK; /* if we didn't an ALARM get it it's probably a HUP ! * or a TERM. in either case we can ! * return STATE_REQUEST_ACK here. */ } --- 483,490 ---- dhcp_client_update_secs(dc); ! return STATE_REQUEST_ACK; /* if we didn't get an ALARM it's ! * probably a HUP or a TERM. in ! * either case we can return ! * STATE_REQUEST_ACK here. */ } Index: dhcp-client.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-client.c 10 Nov 2002 15:46:40 -0000 1.2 --- dhcp-client.c 15 Nov 2002 21:06:47 -0000 1.3 *************** *** 222,227 **** check_for_interrupts(); ! if(want_shutdown) ! client_states[STATE_DO_SHUTDOWN](dc); /* if we're only running to be setup, --- 222,247 ---- check_for_interrupts(); ! ! switch(got_interrupt_type()) { ! ! case INTERRUPT_TERM: ! state = STATE_DO_SHUTDOWN; ! ! case INTERRUPT_HUP: ! /* for now shutdown. */ ! state = STATE_DO_SHUTDOWN; ! ! case INTERRUPT_ALARM: ! switch(timer_get_current_id(dc->timer)) { ! ! case TIMER_RENEW: ! case TIMER_IP_LEASE: ! state = STATE_DISCOVER_OFFER; ! ! case TIMER_REBIND: ! state = STATE_REQUEST_ACK; ! ! } ! } /* if we're only running to be setup, Index: dhcp-client.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-client.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-client.h 10 Nov 2002 15:46:40 -0000 1.2 --- dhcp-client.h 15 Nov 2002 21:06:47 -0000 1.3 *************** *** 36,43 **** client_conf_t *conf; /* configuration. */ ! uint32_t xid; /* unique xid */ ! time_t started; /* the amount of milliseconds since we started. */ time_t secs; /* secs -- used to save secs value. */ ! uint32_t renewal_time; /* when to renew lease (secs). */ char *interface; /* interface name. */ --- 36,43 ---- client_conf_t *conf; /* configuration. */ ! uint32_t xid; /* unique xid */ ! 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. */ *************** *** 71,74 **** --- 71,78 ---- #define STATE_FATAL_ERROR 5 #define STATE_DO_SHUTDOWN 6 + + /* timer IDs. */ + + enum client_timer_types { TIMER_IP_LEASE = 1, TIMER_REBIND, TIMER_RENEW }; /* prototypes. */ Index: dhcp-daemon.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-daemon.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-daemon.c 10 Nov 2002 15:46:40 -0000 1.2 --- dhcp-daemon.c 15 Nov 2002 21:06:47 -0000 1.3 *************** *** 33,64 **** #include "dhcp-log.h" - /* wrap for volatine integers, or proper sig_atomic_t types. */ - - #ifdef HAVE_SIG_ATOMIC_T - - sig_atomic_t want_shutdown = 0; - sig_atomic_t want_hup = 0; - - #else /* HAVE_SIG_ATOMIC_T */ - - volatile int want_shutdown = 0; - volatile int want_hup = 0; - - #endif /* HAVE_SIG_ATOMIC_T */ - - /* All handlers do is setup atomic variables. */ - - static RETSIGTYPE handle_shutdown(int i) - { - want_shutdown = 1; - return (RETSIGTYPE) 0; - } - - static RETSIGTYPE handle_hup(int i) - { - want_hup = 1; - return (RETSIGTYPE) 0; - } - /* setup our interrupt handles. */ void setup_interrupt_handlers(void) --- 33,36 ---- Index: dhcp-daemon.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-daemon.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** dhcp-daemon.h 10 Nov 2002 15:46:40 -0000 1.1 --- dhcp-daemon.h 15 Nov 2002 21:06:47 -0000 1.2 *************** *** 27,44 **** #define DHCP_DAEMON_H - /* global vars. */ - - #ifdef HAVE_SIG_ATOMIC_T - - extern sig_atomic_t want_shutdown; - extern sig_atomic_t want_hup; - - #else /* HAVE_SIG_ATOMIC_T */ - - extern volatile int want_shutdown; - extern volatile int want_hup; - - #endif /* HAVE_SIG_ATOMIC_T */ - /* prototypes. */ extern void go_background(char *dir); --- 27,30 ---- Index: dhcp-libutil.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-libutil.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** dhcp-libutil.h 10 Nov 2002 15:46:40 -0000 1.4 --- dhcp-libutil.h 15 Nov 2002 21:06:47 -0000 1.5 *************** *** 33,36 **** --- 33,37 ---- * * * * * * * * * * */ + /* native data structures. */ /* list object. */ typedef struct list { *************** *** 46,49 **** --- 47,52 ---- } stringbuffer; + /* utility data structures. */ + /* rtt object. */ typedef struct rtt { *************** *** 54,60 **** --- 57,70 ---- } rtt_t; + /* trigger object. */ + typedef struct { + uint32_t seconds; + uint32_t id; + } timer_trigger_t; + /* timer object. */ typedef struct { list_t *triggers; + uint32_t current_id; } timer_keeper_t; *************** *** 109,113 **** /* alarm handlers. */ extern int had_alarm(void); ! extern void set_alarm(struct timeval alarm_time); extern void remove_alarm(void); --- 119,123 ---- /* alarm handlers. */ extern int had_alarm(void); ! extern void set_alarm(uint32_t alarm_time); extern void remove_alarm(void); *************** *** 175,184 **** void set_interactive(uint8_t interactive_arg); ! /* Timer object. */ extern timer_keeper_t *create_timer(void); extern void destroy_timer(timer_keeper_t *timer); ! extern void timer_set_next(timer_keeper_t *timer); ! extern void timer_add_trigger(timer_keeper_t *timer, uint32_t time); extern int timer_purge(timer_keeper_t); /* var file. */ --- 185,195 ---- void set_interactive(uint8_t interactive_arg); ! /* timer object. */ extern timer_keeper_t *create_timer(void); extern void destroy_timer(timer_keeper_t *timer); ! extern int timer_set_next(timer_keeper_t *timer); ! extern void timer_add_trigger(timer_keeper_t *timer, uint32_t time, uint32_t id); extern int timer_purge(timer_keeper_t); + extern uint32_t timer_get_current_id(timer_keeper_t *timer); /* var file. */ *************** *** 208,211 **** --- 219,225 ---- extern void suspend_for_interrupts(void); extern void remove_interrupt(int sig); + extern RETSIGTYPE handle_hup(int i); + extern RETSIGTYPE handle_shutdown(int i); + extern int got_interrupt_type(void); /* constants. */ *************** *** 254,257 **** --- 268,275 ---- #define ERROR_LEVEL LOG_ERR /* Error level */ #define INFO_LEVEL LOG_INFO /* Normal level */ + + /* interrupt types. */ + + enum interrupt_types { INTERRUPT_NONE, INTERRUPT_ALARM, INTERRUPT_HUP, INTERRUPT_TERM }; #endif /* DHCP_LIBUTIL_H */ Index: dhcp-sysconf.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-sysconf.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-sysconf.c 10 Nov 2002 15:46:40 -0000 1.2 --- dhcp-sysconf.c 15 Nov 2002 21:06:47 -0000 1.3 *************** *** 103,110 **** { NULL, NULL, SYSCONF_UNSET, }, /* 48 X-Windows font servers. */ { NULL, NULL, SYSCONF_UNSET, }, /* 49 X-Windows system display manager. */ ! { NULL, NULL, SYSCONF_UNSET, }, /* 50 */ ! { NULL, NULL, SYSCONF_UNSET, }, /* 51 */ ! { NULL, NULL, SYSCONF_UNSET, }, /* 52 */ ! { NULL, NULL, SYSCONF_UNSET, }, /* 53 */ { NULL, NULL, SYSCONF_UNSET, }, /* 54 */ { NULL, NULL, SYSCONF_UNSET, }, /* 55 */ --- 103,113 ---- { NULL, NULL, SYSCONF_UNSET, }, /* 48 X-Windows font servers. */ { NULL, NULL, SYSCONF_UNSET, }, /* 49 X-Windows system display manager. */ ! { NULL, NULL, SYSCONF_UNSET, }, /* 50 Requested IP Address. */ ! { sysconf_setup_lease_time, ! NULL, SYSCONF_UNSET, }, /* 51 IP Address Lease Time. */ ! { sysconf_setup_renew_time, ! NULL, SYSCONF_UNSET, }, /* 52 Renewal Time (T1). */ ! { sysconf_setup_rebind_time, ! NULL, SYSCONF_UNSET, }, /* 53 Rebind Time. (T2). */ { NULL, NULL, SYSCONF_UNSET, }, /* 54 */ { NULL, NULL, SYSCONF_UNSET, }, /* 55 */ *************** *** 116,119 **** --- 119,152 ---- { NULL, NULL, SYSCONF_UNSET, }, /* 61 */ }; + + static int sysconf_setup_u32_timer(uint32_t seconds, int id, dhcp_client_control_t *dc) + { + timer_add_trigger(dc->timer, seconds, id); + return 0; + } + + int sysconf_setup_lease_time(void *value, dhcp_client_control_t *dc) + { + uint32_t seconds = *(uint32_t *)value; + + sysconf_setup_u32_timer(seconds, TIMER_IP_LEASE, dc); + return 0; + } + + int sysconf_setup_rebind_time(void *value, dhcp_client_control_t *dc) + { + uint32_t seconds = *(uint32_t *)value; + + sysconf_setup_u32_timer(seconds, TIMER_REBIND, dc); + return 0; + } + + int sysconf_setup_renew_time(void *value, dhcp_client_control_t *dc) + { + uint32_t seconds = *(uint32_t *)value; + + sysconf_setup_u32_timer(seconds, TIMER_RENEW, dc); + return 0; + } int sysconf_setup_routers(void *value, dhcp_client_control_t *dc) Index: dhcp-sysconf.h =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-sysconf.h,v retrieving revision 1.1.1.1 retrieving revision 1.2 diff -C2 -d -r1.1.1.1 -r1.2 *** dhcp-sysconf.h 29 Oct 2002 17:11:34 -0000 1.1.1.1 --- dhcp-sysconf.h 15 Nov 2002 21:06:47 -0000 1.2 *************** *** 40,43 **** --- 40,46 ---- /* System configuration routines. */ + extern int sysconf_setup_lease_time(void *value, dhcp_client_control_t *dc); + extern int sysconf_setup_rebind_time(void *value, dhcp_client_control_t *dc); + extern int sysconf_setup_renew_time(void *value, dhcp_client_control_t *dc); extern int sysconf_setup_routers(void *value, dhcp_client_control_t *dc); extern int sysconf_cleanup_routers(void *value, dhcp_client_control_t *dc); Index: dhcp-timer.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-timer.c,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** dhcp-timer.c 10 Nov 2002 15:46:40 -0000 1.2 --- dhcp-timer.c 15 Nov 2002 21:06:47 -0000 1.3 *************** *** 72,79 **** /* add a new trigger. */ ! void timer_add_trigger(timer_keeper_t *timer, uint32_t trigger_time) { ! uint32_t *trigger = xmalloc(sizeof(uint32_t)); ! *trigger = trigger_time; timer->triggers = add_to_list(timer->triggers, trigger); --- 72,81 ---- /* add a new trigger. */ ! void timer_add_trigger(timer_keeper_t *timer, uint32_t trigger_time, uint32_t id) { ! timer_trigger_t *trigger = xmalloc(sizeof(timer_trigger_t)); ! ! trigger->seconds = trigger_time; ! trigger->id = id; timer->triggers = add_to_list(timer->triggers, trigger); *************** *** 83,99 **** /* timer setup next trigger. */ ! void timer_set_next(timer_keeper_t *timer) { ! uint32_t *trigger; if(timer->triggers == NULL) ! return; timer->triggers = sort_list(timer->triggers, compare_triggers_shortest); trigger = timer->triggers->data; ! alarm(*trigger); timer->triggers = remove_from_list(timer->triggers, timer->triggers->data); xfree(trigger); } --- 85,109 ---- /* timer setup next trigger. */ ! int timer_set_next(timer_keeper_t *timer) { ! timer_trigger_t *trigger; if(timer->triggers == NULL) ! return 1; timer->triggers = sort_list(timer->triggers, compare_triggers_shortest); trigger = timer->triggers->data; ! set_alarm(trigger->seconds); ! timer->current_id = trigger->id; timer->triggers = remove_from_list(timer->triggers, timer->triggers->data); xfree(trigger); + + return 0; + } + + uint32_t timer_get_current_id(timer_keeper_t *timer) + { + return timer->current_id; } Index: dhcp-util.c =================================================================== RCS file: /cvsroot/dhcp-agent/dhcp-agent/src/dhcp-util.c,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** dhcp-util.c 9 Nov 2002 16:59:15 -0000 1.5 --- dhcp-util.c 15 Nov 2002 21:06:47 -0000 1.6 *************** *** 266,345 **** } - /* signal manipulation routines. */ - - /* add signal handler. */ - void add_interrupt_handler(int sigtype, void (*sighandler)(int)) - { - struct sigaction sa; - - memset(&sa, 0, sizeof(struct sigaction)); - - sa.sa_handler = sighandler; - sigfillset(&sa.sa_mask); - - if(sigaction(sigtype, &sa, NULL)) - FATAL_MESSAGE("could not set signal handler for: %d", sigtype); - - return; - } - - /* block all signals. */ - void block_interrupts(void) - { - sigset_t signal_mask; - - sigfillset(&signal_mask); - - sigprocmask(SIG_SETMASK, &signal_mask, NULL); - - return; - } - - /* unblock signals temporarily so we can receive pending signals. */ - int check_for_interrupts(void) - { - /* Easiest way to do this is unblock all signals, - * then block them again. */ - - sigset_t signal_mask, o_mask; - - sigemptyset(&signal_mask); - - sigprocmask(SIG_SETMASK, &signal_mask, &o_mask); - /* here we get all the signals. */ - sigprocmask(SIG_SETMASK, &o_mask, NULL); - - return 0; - } - - /* suspend indefinetly for a signal (useful for alarm). */ - void suspend_for_interrupts(void) - { - sigset_t signal_mask; - - sigemptyset(&signal_mask); - sigsuspend(&signal_mask); - - } - - void remove_interrupt(int sig) - { - sigset_t signal_set; - - sigemptyset(&signal_set); - sigaddset(&signal_set, sig); - - if(sigpending(&signal_set)) { - add_interrupt_handler(sig, SIG_IGN); - sigfillset(&signal_set); - sigdelset(&signal_set, SIGALRM); - - sigsuspend(&signal_set); - add_interrupt_handler(sig, SIG_DFL); - } - - return; - } - /* String routines. */ --- 266,269 ---- *************** *** 521,585 **** #endif /* HAVE_GETPROGNAME */ - - /* alarm handling routine and variable. */ - - /* wrap for volatine integers, or proper sig_atomic_t types. */ - - #ifdef HAVE_SIG_ATOMIC_T - - static sig_atomic_t have_alarm = 0; - - #else /* HAVE_SIG_ATOMIC_T */ - - static volatile int have_alarm = 0; - - #endif - - static RETSIGTYPE handle_alarm(int i) - { - have_alarm = 1; - return (RETSIGTYPE) 0; - } - - static struct timeval disarm_timer = { 0, 0 }; - - /* will trigger alarm for one time only. */ - void set_alarm(struct timeval alarm_time) - { - struct itimerval timer; - - timer.it_interval = alarm_time; - timer.it_value = disarm_timer; - - have_alarm = 0; - add_interrupt_handler(SIGALRM, handle_alarm); - - /* that's it. after this the timer is ticking. */ - setitimer(ITIMER_REAL, &timer, NULL); - - return; - } - - /* tells us whether we received an alarm or not.*/ - int had_alarm(void) - { - return have_alarm; - } - - /* remove alarm. */ - void remove_alarm(void) - { - struct itimerval timer; - - timer.it_interval = disarm_timer; - timer.it_value = disarm_timer; - - setitimer(ITIMER_REAL, &timer, NULL); - - /* now make sure we don't have a pending SIGARLM. */ - remove_interrupt(SIGALRM); - - return; - } /* check for seven bit cleanliness. */ --- 445,448 ---- |