void LogSmiValue(char *pValue, int nCount) { int i, nSeek = 0, len; char szOID[30]; char *pszValue; TIMESTAMP *t; TIMEDATE *d; SMIValue *p; VAROBJECT *pObject; BYTE type; for(i=0; i<nCount; i++) { p = (SMIValue *)(pValue + nSeek); pObject = VARAPI_GetObject(&p->oid); type = pObject ? pObject->var.type : 0; OidToString(&p->oid, szOID); if (p->len > 0) { COMMAND_LOG("%4d: %s=", i+1, pObject ? pObject->pszName : "Unknown"); switch(type) { case VARSMI_BOOL : COMMAND_LOG("%s(%0d)\xd\xa", p->stream.u8 == 0 ? "FALSE" : "TRUE", p->stream.u8); break; case VARSMI_BYTE : COMMAND_LOG("%0d\xd\xa", p->stream.u8); break; case VARSMI_WORD : COMMAND_LOG("%0d\xd\xa", p->stream.u16); break; case VARSMI_UINT : COMMAND_LOG("%0d\xd\xa", p->stream.u32); break; case VARSMI_CHAR : COMMAND_LOG("%0d\xd\xa", p->stream.s8); break; case VARSMI_SHORT : COMMAND_LOG("%0d\xd\xa", (signed short)p->stream.s16); break; case VARSMI_INT : COMMAND_LOG("%0d\xd\xa", (signed int)p->stream.s32); break; case VARSMI_OID : COMMAND_LOG("%0d.%0d.%0d\xd\xa", (BYTE)p->stream.id.id1, (BYTE)p->stream.id.id2, (BYTE)p->stream.id.id3); break; case VARSMI_IPADDR : COMMAND_LOG("%0d.%0d.%0d.%0d\xd\xa", (BYTE)p->stream.str[0], (BYTE)p->stream.str[1], (BYTE)p->stream.str[2], (BYTE)p->stream.str[3]); break; case VARSMI_TIMESTAMP : t = (TIMESTAMP *)p->stream.str; COMMAND_LOG("%04d/%02d/%02d %02d:%02d:%02d\xd\xa", t->year, t->mon, t->day, t->hour, t->min, t->sec); break; case VARSMI_TIMEDATE : d = (TIMEDATE *)p->stream.str; COMMAND_LOG("%04d/%02d/%02d\xd\xa", d->year, d->mon, d->day); break; case VARSMI_STRING : len = MIN(p->len, 45); pszValue = (char *)MALLOC(len+1); if (pszValue != NULL) { memcpy(pszValue, p->stream.str, len); pszValue[len] = 0; COMMAND_LOG("'%s'\xd\xa", pszValue); FREE(pszValue); } break; case VARSMI_UNKNOWN : case VARSMI_EUI64 : case VARSMI_STREAM : case VARSMI_OPAQUE : FILEDUMP(CMD_HISTORY_LOG_FILE, p->stream.str, MIN(p->len, 15), FALSE, FALSE); break; } } else { COMMAND_LOG("%4d: %s(%s), %s(%0d), LEN=%0d\xd\xa", i+1, pObject ? pObject->pszName : "Unknown", szOID, VARAPI_GetTypeName(type), type, p->len); } nSeek += (p->len + 5); } }
int AppleSCSIPDT03Emulator::SendCommand ( UInt8 * cdb, UInt8 cbdLen, IOMemoryDescriptor * dataDesc, UInt64 * dataLen, SCSITaskStatus * scsiStatus, SCSI_Sense_Data * senseBuffer, UInt8 * senseBufferLen ) { STATUS_LOG ( ( "AppleSCSIPDT03Emulator::SendCommand, LUN = %qd\n", GetLogicalUnitNumber ( ) ) ); switch ( cdb[0] ) { case kSCSICmd_TEST_UNIT_READY: { COMMAND_LOG ( ( "SCSI Command: TEST_UNIT_READY\n" ) ); *scsiStatus = kSCSITaskStatus_GOOD; *dataLen = 0; break; } case kSCSICmd_INQUIRY: { COMMAND_LOG ( ( "SCSI Command: INQUIRY\n" ) ); if ( cdb[1] == 1 ) { COMMAND_LOG ( ( "INQUIRY VPD requested, PDT03 doesn't support it\n" ) ); *scsiStatus = kSCSITaskStatus_CHECK_CONDITION; if ( senseBuffer != NULL ) { UInt8 amount = min ( *senseBufferLen, sizeof ( SCSI_Sense_Data ) ); bzero ( senseBuffer, *senseBufferLen ); bcopy ( &gInvalidCDBFieldSenseData, senseBuffer, amount ); *senseBufferLen = amount; } } else if ( ( cdb[1] == 2 ) || ( cdb[2] != 0 ) || ( cdb[3] != 0 ) ) { COMMAND_LOG ( ( "Illegal request\n" ) ); // Don't support CMDDT bit, or PAGE_CODE without EVPD set. *scsiStatus = kSCSITaskStatus_CHECK_CONDITION; if ( senseBuffer != NULL ) { UInt8 amount = min ( *senseBufferLen, sizeof ( SCSI_Sense_Data ) ); bzero ( senseBuffer, *senseBufferLen ); bcopy ( &gInvalidCDBFieldSenseData, senseBuffer, amount ); *senseBufferLen = amount; } } else { COMMAND_LOG ( ( "Standard INQUIRY\n" ) ); *dataLen = min ( sizeof ( sInquiryData ), *dataLen ); dataDesc->writeBytes ( 0, &sInquiryData, *dataLen ); *scsiStatus = kSCSITaskStatus_GOOD; } } break; case kSCSICmd_REQUEST_SENSE: { COMMAND_LOG ( ( "SCSI Command: REQUEST_SENSE (desc = %s, allocation length = %d bytes) - returning CHECK CONDITION with INVALID COMMAND\n", (cdb[1] & 0x01) ? "TRUE" : "FALSE", cdb[4] ) ); *scsiStatus = kSCSITaskStatus_CHECK_CONDITION; *dataLen = 0; if ( senseBuffer != NULL ) { UInt8 amount = min ( *senseBufferLen, sizeof ( SCSI_Sense_Data ) ); bzero ( senseBuffer, *senseBufferLen ); bcopy ( &gInvalidCommandSenseData, senseBuffer, amount ); *senseBufferLen = amount; } } break; default: { COMMAND_LOG ( ( "SCSI Command: Unknown: 0x%X\n", cdb[0] ) ); *scsiStatus = kSCSITaskStatus_CHECK_CONDITION; if ( senseBuffer != NULL ) { UInt8 amount = min ( *senseBufferLen, sizeof ( SCSI_Sense_Data ) ); bzero ( senseBuffer, *senseBufferLen ); bcopy ( &gInvalidCommandSenseData, senseBuffer, amount ); *senseBufferLen = amount; } } break; } return 1; }