154359Sroberto/* Checks for the RS/6000 AIX adjtime() bug, in which if a negative 254359Sroberto * offset is given, the system gets messed up and never completes the 354359Sroberto * adjustment. If the problem is fixed, this program will print the 454359Sroberto * time, sit there for 10 seconds, and exit. If the problem isn't fixed, 554359Sroberto * the program will print an occasional "result=nnnnnn" (the residual 654359Sroberto * slew from adjtime()). 754359Sroberto * 854359Sroberto * Compile this with bsdcc and run it as root! 954359Sroberto */ 1054359Sroberto#include <signal.h> 1154359Sroberto#include <sys/time.h> 1254359Sroberto#include <time.h> 1354359Sroberto#include <stdio.h> 1454359Sroberto 1554359Srobertoint timeout(); 1654359Srobertostruct timeval adjustment, result; 1754359Sroberto 1854359Srobertoint 1954359Srobertomain ( 2054359Sroberto int argc, 2154359Sroberto char *argv[] 2254359Sroberto ) 2354359Sroberto{ 2454359Sroberto struct itimerval value, oldvalue; 2554359Sroberto int i; 2654359Sroberto time_t curtime; 2754359Sroberto 2854359Sroberto curtime = time(0); 2954359Sroberto printf("Starting: %s", ctime(&curtime)); 3054359Sroberto value.it_interval.tv_sec = value.it_value.tv_sec = 1; 3154359Sroberto value.it_interval.tv_usec = value.it_value.tv_usec = 0; 3254359Sroberto adjustment.tv_sec = 0; 3354359Sroberto adjustment.tv_usec = -2000; 3454359Sroberto signal(SIGALRM, timeout); 3554359Sroberto setitimer(ITIMER_REAL, &value, &oldvalue); 3654359Sroberto for (i=0; i<10; i++) { 3754359Sroberto pause(); 3854359Sroberto } 3954359Sroberto} 4054359Sroberto 4154359Srobertoint 4254359Srobertotimeout( 4354359Sroberto int sig, 4454359Sroberto int code, 4554359Sroberto struct sigcontext *scp 4654359Sroberto ) 4754359Sroberto{ 4854359Sroberto signal (SIGALRM, timeout); 4954359Sroberto if (adjtime(&adjustment, &result)) 5054359Sroberto printf("adjtime call failed\n"); 5154359Sroberto if (result.tv_sec != 0 || result.tv_usec != 0) { 5254359Sroberto printf("result.u = %d.%06.6d ", (int) result.tv_sec, 5354359Sroberto (int) result.tv_usec); 5454359Sroberto } 5554359Sroberto} 56