#include "microdot.h"
#include "asyncio.h"

extern struct WBStartup *_WBenchMsg;

ULONG checkprogramval = MODE_NEWFILE;

static ULONG __inline dosum( ULONG *buffer, int cnt, ULONG sum )
{
	while( cnt-- )
		sum += *buffer++;

	return( sum );
}

ULONG __chip __aligned idblock[ 3 ] = { 0x7ec04e10, 0, 0x1940e120 };

void checkvalid( void )
{
	ULONG sum = NULL;
	char buffer[ 4096 ];

	if( prefs.checksumfailed ||  !( rand() % 5 ) )
	{
		struct AsyncFile *f;

		if( _WBenchMsg )
		{
			struct WBArg *wba = _WBenchMsg->sm_ArgList;
			BPTR old = CurrentDir( wba->wa_Lock );
			f = OpenAsync( wba->wa_Name, MODE_READ, 32768 );
			CurrentDir( old );
		}
		else
		{
			BPTR old = CurrentDir( GetProgramDir() );
			GetProgramName( buffer, sizeof( buffer ) );
			f = OpenAsync( buffer, MODE_READ, 32768 );
			CurrentDir( old );
		}

		if( f )
		{
			int rc;

			while( ( rc = ReadAsync( f, buffer, sizeof( buffer ) ) ) > 0 )
				sum = dosum( (ULONG*)buffer, rc >> 2, sum );

			CloseAsync( f );
		}
	}
	prefs.checksumfailed = checkprogramval ? 1 : 0;
	checkprogramval = sum;
}

#define ALERTTXT "\000\030\026VIRUS ALERT - MICRODOT EXECUTABLE CHECKSUM FAILED!\000\000"

void reportvalid( void )
{
	if( checkprogramval )
	{
		DisplayAlert( 0, ALERTTXT, 40 );
		exit( -1 );
	}
}

char unregistered[ 32 ];

#define UREGTXT "[UNREGISTERED/%ld]"

void initdays( void )
{
	int days = ( ( time( 0 ) - prefs.firstinstalltime ) + 86399 ) / 86400;

	sprintf( unregistered, UREGTXT, days );
	if( strlen( unregistered ) < 16 )
		exit( 0 );
}
