static inline int InitializeSCSIDevice(struct SBP2Device *dev) { inquiry_data id; sense_data sd; read_capacity_data rcd; int stat; XPRINTF("IEEE1394_disk: InitializeSCSIDevice.\n"); memset(&id, 0, sizeof(inquiry_data)); if ((stat = scsiInquiry(dev, &id, sizeof(inquiry_data))) < 0) { XPRINTF("IEEE1394_disk: Error - scsiInquiry returned %d.\n", stat); return -1; } printf("IEEE1394_disk: Vendor: %.8s\n", id.vendor); printf("IEEE1394_disk: Product: %.16s\n", id.product); printf("IEEE1394_disk: Revision: %.4s\n", id.revision); if((stat = scsiReadCapacity(dev, &rcd, sizeof(read_capacity_data))) != 0) { XPRINTF("IEEE1394_disk: Error - scsiReadCapacity %d\n", stat); return -1; } dev->sectorSize = rcd.block_length; dev->maxLBA = rcd.last_lba; printf("IEEE1394_disk: sectorSize %lu maxLBA %lu\n", dev->sectorSize, dev->maxLBA); while((stat = scsiTestUnitReady(dev)) != 0) { XPRINTF("IEEE1394_disk: Error - scsiTestUnitReady %d\n", stat); stat = scsiRequestSense(dev, &sd, sizeof(sense_data)); if (stat != 0) XPRINTF("IEEE1394_disk: Error - scsiRequestSense %d\n", stat); if ((sd.error_code == 0x70) && (sd.sense_key != 0x00)) { XPRINTF("IEEE1394_disk: Sense Data key: %02X code: %02X qual: %02X\n", sd.sense_key, sd.add_sense_code, sd.add_sense_qual); if ((sd.sense_key == 0x02) && (sd.add_sense_code == 0x04) && (sd.add_sense_qual == 0x02)) { XPRINTF("IEEE1394_disk: Error - Additional initalization is required for this device!\n"); if ((stat = scsiStartStopUnit(dev)) != 0) { XPRINTF("IEEE1394_disk: Error - scsiStartStopUnit %d\n", stat); return -1; } } } } return 0; }
/* * Class: edu_uw_apl_tupelo_model_physical_PhysicalDisk * Method: productID * Signature: (Ljava/lang/String;)Ljava/lang/String; */ JNIEXPORT jstring JNICALL Java_edu_uw_apl_tupelo_model_physical_PhysicalDisk_productID (JNIEnv *env, jobject thiz, jstring path ) { char* pathC = (char*)(*env)->GetStringUTFChars( env, path, NULL ); if( pathC == NULL ) { /* out of memory */ return NULL; } char vendorID[32] = { 0 }; char productID[32] = { 0 }; char serialNumber[32] = { 0 }; int sc = scsiInquiry( pathC, vendorID, productID, serialNumber ); (*env)->ReleaseStringUTFChars( env, path, pathC ); if( sc ) return NULL; return (*env)->NewStringUTF( env, productID ); }