/* inquiry.c */
#include
#include
#include
#include
#include
#include
#include "send_scsi_cmd.h"
#define SENSE_BYTES 18 // La dimensione del buffer di sense.
#define INQUIRY_BYTES 36 // La dimensione del buffer dati.
int main(int argc, char *argv[])
{
// Sintassi: nome del device, numero dell'unità.
ULONG unit;
if(argc > 2)
{
if(sscanf(argv[2], "%lu", &unit))
{
WORD retval;
UBYTE command[6] = { SCSI_INQUIRY, 0, 0, 0, INQUIRY_BYTES, 0};
UBYTE sensereturn[SENSE_BYTES];
char vendor[9], prod_id[17], rev[5];
struct sizedbuffer cmd, data, sense;
UBYTE * bpnt;
cmd.buf = command;
cmd.len = 6; // CDB a 6 bytes.
data.buf = malloc(INQUIRY_BYTES);
if(data.buf == 0)
{
printf("Out of ammo!!\n");
return 20;
}
data.len = INQUIRY_BYTES;
sense.buf = sensereturn;
sense.len = SENSE_BYTES;
retval = Send_SCSI_CMD( argv[1],
unit,
0L,
&cmd,
&data,
&sense,
0,
SCSIF_AUTOSENSE|SCSIF_READ // Fase dati in lettura.
);
if(retval == 0)
printf("Tutto ok.\n");
else {
if((retval >> 8) == HFERR_BadStatus) // CHECK_CONDITION
printf("Errore SCSI. Status %x, vedi buffer di SENSE.\n", (UBYTE)retval);
else if(retval >> 8)
printf("Errore all'apertura dell'unità: %u\n", (retval >> 8));
free(data.buf);
return 20;
}
/* Interpretazione del buffer in uscita:
ATTENZIONE: le stringhe non sono 0 terminated come in C!
Per questo motivo si effettuano delle copie.
'bpnt' è usato per scandire il buffer ritornato. */
bpnt = data.buf;
printf("Tipo del dispositivo: %u\n", bpnt[0] & 0x1fL);
printf("Il dispositivo %s rimuovibile.\n",
bpnt[1] & 0x80 ? "è" : "non è");
printf("Versione ANSI SCSI: %u\n", bpnt[2] & 0x0f);
strncpy(vendor, &bpnt[8], 8);
strncpy(prod_id, &bpnt[16], 16);
strncpy(rev, &bpnt[32], 4);
vendor[8]=0; prod_id[16]=0; rev[4]=0; // Delimita le stringhe.
printf("Quest'arnese è un %s versione %s, prodotto da %s\n", prod_id, rev, vendor);
free(data.buf);
}
}
return 0;
}