xref: /freebsd-src/contrib/ntp/util/testrs6000.c (revision c0b746e5e8d9479f05b3749cbf1f73b8928719bd)
1*c0b746e5SOllivier Robert /* Checks for the RS/6000 AIX adjtime() bug, in which if a negative
2*c0b746e5SOllivier Robert  * offset is given, the system gets messed up and never completes the
3*c0b746e5SOllivier Robert  * adjustment.  If the problem is fixed, this program will print the
4*c0b746e5SOllivier Robert  * time, sit there for 10 seconds, and exit.  If the problem isn't fixed,
5*c0b746e5SOllivier Robert  * the program will print an occasional "result=nnnnnn" (the residual
6*c0b746e5SOllivier Robert  * slew from adjtime()).
7*c0b746e5SOllivier Robert  *
8*c0b746e5SOllivier Robert  * Compile this with bsdcc and run it as root!
9*c0b746e5SOllivier Robert  */
10*c0b746e5SOllivier Robert #include <signal.h>
11*c0b746e5SOllivier Robert #include <sys/time.h>
12*c0b746e5SOllivier Robert #include <time.h>
13*c0b746e5SOllivier Robert #include <stdio.h>
14*c0b746e5SOllivier Robert 
15*c0b746e5SOllivier Robert int timeout();
16*c0b746e5SOllivier Robert struct timeval adjustment, result;
17*c0b746e5SOllivier Robert 
18*c0b746e5SOllivier Robert int
main(int argc,char * argv[])19*c0b746e5SOllivier Robert main (
20*c0b746e5SOllivier Robert 	int argc,
21*c0b746e5SOllivier Robert 	char *argv[]
22*c0b746e5SOllivier Robert 	)
23*c0b746e5SOllivier Robert {
24*c0b746e5SOllivier Robert 	struct itimerval value, oldvalue;
25*c0b746e5SOllivier Robert 	int i;
26*c0b746e5SOllivier Robert 	time_t curtime;
27*c0b746e5SOllivier Robert 
28*c0b746e5SOllivier Robert 	curtime = time(0);
29*c0b746e5SOllivier Robert 	printf("Starting: %s", ctime(&curtime));
30*c0b746e5SOllivier Robert 	value.it_interval.tv_sec = value.it_value.tv_sec = 1;
31*c0b746e5SOllivier Robert 	value.it_interval.tv_usec = value.it_value.tv_usec = 0;
32*c0b746e5SOllivier Robert 	adjustment.tv_sec = 0;
33*c0b746e5SOllivier Robert 	adjustment.tv_usec = -2000;
34*c0b746e5SOllivier Robert 	signal(SIGALRM, timeout);
35*c0b746e5SOllivier Robert 	setitimer(ITIMER_REAL, &value, &oldvalue);
36*c0b746e5SOllivier Robert 	for (i=0; i<10; i++) {
37*c0b746e5SOllivier Robert 		pause();
38*c0b746e5SOllivier Robert 	}
39*c0b746e5SOllivier Robert }
40*c0b746e5SOllivier Robert 
41*c0b746e5SOllivier Robert int
timeout(int sig,int code,struct sigcontext * scp)42*c0b746e5SOllivier Robert timeout(
43*c0b746e5SOllivier Robert 	int sig,
44*c0b746e5SOllivier Robert 	int code,
45*c0b746e5SOllivier Robert 	struct sigcontext *scp
46*c0b746e5SOllivier Robert 	)
47*c0b746e5SOllivier Robert {
48*c0b746e5SOllivier Robert 	signal (SIGALRM, timeout);
49*c0b746e5SOllivier Robert 	if (adjtime(&adjustment, &result))
50*c0b746e5SOllivier Robert 	    printf("adjtime call failed\n");
51*c0b746e5SOllivier Robert 	if (result.tv_sec != 0 || result.tv_usec != 0) {
52*c0b746e5SOllivier Robert 		printf("result.u = %d.%06.6d  ", (int) result.tv_sec,
53*c0b746e5SOllivier Robert 		       (int) result.tv_usec);
54*c0b746e5SOllivier Robert 	}
55*c0b746e5SOllivier Robert }
56