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