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