AUSAM/source/S/update.c
/*
* update for "disk" integrity and "lnode" checkpointing.
*/
#include <param.h>
#include <passwd.h>
#include <lnode.h>
#define CHECKPOINTTIME (15*60) /* minutes between lnode checkpoints */
#define SYNCTIME (5*60) /* maximum minutes between syncs */
#define SYNCFACTOR 32 /* multiply time for last sync
by this to get sleep time
also min sleep time */
char chkptf[] "/etc/lnodes.chkpt";
terminate()
{
signal( 14 , 1); /* no further signals please */
clktim(0);
unlink( chkptf );
sync();
exit();
}
checkpoint()
{
struct lnode lnodes[ MAXUSERS ];
register n;
signal( 15 , checkpoint ); /* catch real-time limit */
clktim( CHECKPOINTTIME );
if( creat( chkptf , 0600 ) == 0 ) {
if( n = limits( &lnodes , L_ALLLIM ) )
write( 0 , &lnodes , n * sizeof lnodes[0] );
close(0);
}
}
main()
{
long time(), syntim;
register tim;
signal(14,terminate); /* clean up and exit when system shutsdown */
close(0); close(1); close(2);
checkpoint();
for(;;) {
syntim = time();
sync();
tim = time() - syntim;
if( tim ) {
tim = SYNCFACTOR * tim;
if( tim > SYNCTIME ) tim = SYNCTIME;
} else tim = SYNCFACTOR;
sleep( tim );
}
}