]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/ntp/util/testrs6000.c
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / ntp / util / testrs6000.c
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 }