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 } 56