Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP Posting-Version: version B 2.10.1 6/24/83; site brl-tgr.ARPA Path: utzoo!watmath!clyde!burl!ulysses!mhuxl!houxm!houxz!vax135!cornell!uw-beaver!tektronix!hplabs!hao!seismo!brl-tgr!gwyn From: gwyn@brl-tgr.ARPA (Doug Gwyn ) Newsgroups: net.news.b,net.bugs.4bsd Subject: Re: alarm() bug in 4.2 Message-ID: <3166@brl-tgr.ARPA> Date: Tue, 10-Jul-84 23:56:12 EDT Article-I.D.: brl-tgr.3166 Posted: Tue Jul 10 23:56:12 1984 Date-Received: Fri, 13-Jul-84 03:09:47 EDT References: <282@voder.UUCP> Organization: Ballistics Research Lab Lines: 44 The following fixes the round-down behavior of 4.2BSD alarm(3): /* alarm -- system call emulation for 4.2BSD last edit: 14-Dec-1983 D A Gwyn */ extern int _setitimer(); typedef struct { unsigned long tv_sec; /* seconds */ long tv_usec; /* microseconds */ } timeval; typedef struct { timeval it_interval; /* timer interval */ timeval it_value; /* current value */ } itimerval; unsigned alarm( sec ) unsigned sec; /* timeout in seconds */ { itimerval newit; /* new interval data */ itimerval oldit; /* old interval data */ /* set alarm clock timeout interval (0 disables) */ newit.it_value.tv_sec = (unsigned long)sec; newit.it_value.tv_usec = 0L; /* avoid retriggering once timer expires */ newit.it_interval.tv_sec = 0L; newit.it_interval.tv_usec = 0L; if ( _setitimer( 0, &newit, &oldit ) < 0 ) /* real time */ return -1; /* SIGALRM now pending */ return (unsigned)oldit.it_value.tv_sec + (oldit.it_value.tv_usec > 500L ? 1 : 0); }