/* 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; }