/*Commodore Computer Club n.61 pag.21
  VIRUS SCANNER - V1.2
  Visualizza caratteri ascii del bootblock ,permettendo la visione di virus
  File Viruscan.c - Compilato con Lattice Amigados C V5.00
*/

#include <exec/types.h>
#include <exec/io.h>
#include <devices/trackdisk.h>
#include <stdlib.h>
#include <stdio.h>

#define TD_READ   CMD_READ
#define BLOCKSIZE TD_SECTOR
#define NUMHEADS  2

struct Port      *diskport, *CreatePort();
struct IOStdReq  *diskreq,  *CreateStIO();

BYTE  *diskdata, diskbuffer[BLOCKSIZE]; /* Buffer per il disco */
SHORT error, testval;

void cleanup(s,c)       /* Gestione di errori ed uscita */
char *s; short c;
{
	fprintf(stderr,"\n%s\n",s);
    	exit(c);
}

void ReadCylSec(cyl,sec,hd)   /* Lettura random del disco */
SHORT cyl,sec,hd;
{
LONG offset;
diskreq->io_Length   = BLOCKSIZE;
diskreq->io_Data     = (APTR)diskbuffer;
diskreq->io_Command  = TD_READ;
offset = TD_SECTOR * (sec + NUMSECS * hd + NUMSECS * NUMHEADS * cyl);
diskreq->io_Offset   = offset;
DoIO(diskreq);
if (diskreq->io_Error !=0)
       cleanup("Errore dalla periferica!",2);
return;
}

void MotorOn()	       /* Accende il motore del drive */
{
diskreq->io_Length  = 1;
diskreq->io_Command = TD_MOTOR;
DoIO(diskreq);
return;
}

void MotorOff()        /* Spegne il motore del drive */
{
diskreq->io_Length  = 0;
diskreq->io_Command = TD_MOTOR;
DoIO(diskreq);
return;
}

void main(argc,argv)   /* Funzione principale di gestione */
int argc;
char **argv;
{
register int i,j,c,ndisk,error;

if (argc != 2)  cleanup("Uso: Viruscan n (n = 0,1,2,3)",3);

ndisk = atoi(argv[1]);
if (ndisk < 0 || ndisk > 3)
       cleanup("VIRUSCAN: Numero drive non compreso tra 0 e 3!",4);
diskdata = diskbuffer;
diskport = CreatePort(0,0);
diskreq  = CreateStdIO(diskport);
if ( (error = OpenDevice(TD_NAME,ndisk,diskreq,0) ) != 0 ) {	
       cleanup("Viruscan: Non riesco ad aprire la periferica!",error);
}

printf("\n\033[1m VIRUSCAN\033[0m: Scansione del drive df%d:\n\n",ndisk);
MotorOn();
for ( i = 0; i < 2; i++ ) {
	ReadCylSec(0,i,0);
	for ( j = 0; j < BLOCKSIZE; j++ ) {
		if (( c=(int)diskbuffer[j]) > 31 && c < 128 )
			putchar(c);
		}
	}
MotorOff();		CloseDevice(diskreq);
DeleteStdIO(diskreq);	DeletePort(diskport);
printf("\n\n%s\n\n\n","\033[1m VIRUSCAN\033[0m: Lavoro eseguito!");
}
/* -------------------------- End Of Program -------------------------- */
