Beispiel #1
0
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;
	
}