alarm() bug in 4.2

Doug Gwyn <gwyn> gwyn at brl-tgr.ARPA
Wed Jul 11 13:56:12 AEST 1984


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);
	}



More information about the Comp.bugs.4bsd.ucb-fixes mailing list