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