From 51210a700286ab679d0acdd5033f125b5f1b8ab2 Mon Sep 17 00:00:00 2001 From: uweseimet <48174652+uweseimet@users.noreply.github.com> Date: Wed, 23 Jun 2021 02:05:47 +0200 Subject: [PATCH] Use exception for unsupported LUN handling, reduces duplicate code (#111) * Use exception for unsupported LUN handling in order to reduce duplicate code * Code improvements based on review * Added header --- src/raspberrypi/controllers/sasidev_ctrl.cpp | 122 +++-------- src/raspberrypi/controllers/sasidev_ctrl.h | 2 + src/raspberrypi/controllers/scsidev_ctrl.cpp | 209 +++---------------- src/raspberrypi/exceptions.h | 31 +++ 4 files changed, 99 insertions(+), 265 deletions(-) create mode 100644 src/raspberrypi/exceptions.h diff --git a/src/raspberrypi/controllers/sasidev_ctrl.cpp b/src/raspberrypi/controllers/sasidev_ctrl.cpp index 7166d005..896c95b2 100644 --- a/src/raspberrypi/controllers/sasidev_ctrl.cpp +++ b/src/raspberrypi/controllers/sasidev_ctrl.cpp @@ -19,6 +19,7 @@ #include "devices/scsi_host_bridge.h" #include "controllers/scsidev_ctrl.h" #include "devices/scsi_daynaport.h" +#include "exceptions.h" //=========================================================================== // @@ -498,7 +499,13 @@ void FASTCALL SASIDEV::Command() ctrl.blocks = 0; // Execution Phase - Execute(); + try { + Execute(); + } + catch (lunexception& e) { + LOGINFO("%s unsupported LUN %d", __PRETTY_FUNCTION__, (int)e.getlun()); + Error(); + } #else // Request the command ctrl.bus->SetREQ(TRUE); @@ -912,19 +919,13 @@ void FASTCALL SASIDEV::Error() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdTestUnitReady() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE("%s TEST UNIT READY Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->TestUnitReady(ctrl.cmd); @@ -945,19 +946,13 @@ void FASTCALL SASIDEV::CmdTestUnitReady() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdRezero() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE( "%s REZERO UNIT Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Rezero(ctrl.cmd); @@ -978,18 +973,11 @@ void FASTCALL SASIDEV::CmdRezero() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdRequestSense() { - DWORD lun; - ASSERT(this); LOGTRACE( "%s REQUEST SENSE Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); ctrl.length = ctrl.unit[lun]->RequestSense(ctrl.cmd, ctrl.buffer); ASSERT(ctrl.length > 0); @@ -1008,19 +996,13 @@ void FASTCALL SASIDEV::CmdRequestSense() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdFormat() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE( "%s FORMAT UNIT Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Format(ctrl.cmd); @@ -1041,19 +1023,13 @@ void FASTCALL SASIDEV::CmdFormat() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdReassign() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE("%s REASSIGN BLOCKS Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Reassign(ctrl.cmd); @@ -1112,17 +1088,11 @@ void FASTCALL SASIDEV::CmdReleaseUnit() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdRead6() { - DWORD lun; DWORD record; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Get record number and block number record = ctrl.cmd[1] & 0x1f; @@ -1168,17 +1138,11 @@ void FASTCALL SASIDEV::CmdRead6() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::DaynaPortWrite() { - DWORD lun; DWORD data_format; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Error if not a host bridge if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')) { @@ -1232,17 +1196,11 @@ void FASTCALL SASIDEV::DaynaPortWrite() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdWrite6() { - DWORD lun; DWORD record; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Special receive function for the DaynaPort if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'D', 'P')){ @@ -1286,19 +1244,13 @@ void FASTCALL SASIDEV::CmdWrite6() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdSeek6() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE("%s SEEK(6) Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Seek(ctrl.cmd); @@ -1319,19 +1271,13 @@ void FASTCALL SASIDEV::CmdSeek6() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdAssign() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE("%s ASSIGN Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Assign(ctrl.cmd); @@ -1355,19 +1301,13 @@ void FASTCALL SASIDEV::CmdAssign() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdSpecify() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE("%s SPECIFY Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Assign(ctrl.cmd); @@ -1391,18 +1331,9 @@ void FASTCALL SASIDEV::CmdSpecify() //--------------------------------------------------------------------------- void FASTCALL SASIDEV::CmdInvalid() { - DWORD lun; - ASSERT(this); LOGWARN("%s Command not supported", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (ctrl.unit[lun]) { - // Command processing on drive - ctrl.unit[lun]->InvalidCmd(); - } - // Failure (Error) Error(); } @@ -1979,3 +1910,18 @@ void SASIDEV::GetPhaseStr(char *str) } } #endif + +//--------------------------------------------------------------------------- +// +// Validate LUN +// +//--------------------------------------------------------------------------- +DWORD FASTCALL SASIDEV::GetLun() +{ + DWORD lun = (ctrl.cmd[1] >> 5) & 0x07; + if (!ctrl.unit[lun]) { + throw lunexception(lun); + } + + return lun; +} diff --git a/src/raspberrypi/controllers/sasidev_ctrl.h b/src/raspberrypi/controllers/sasidev_ctrl.h index 41c3791c..6d02c1b0 100644 --- a/src/raspberrypi/controllers/sasidev_ctrl.h +++ b/src/raspberrypi/controllers/sasidev_ctrl.h @@ -163,6 +163,8 @@ protected: // Special operations void FASTCALL FlushUnit(); // Flush the logical unit + DWORD FASTCALL GetLun(); // Get the validated LUN + protected: #ifndef RASCSI Device *host; // Host device diff --git a/src/raspberrypi/controllers/scsidev_ctrl.cpp b/src/raspberrypi/controllers/scsidev_ctrl.cpp index 703161f4..d4bd2e43 100644 --- a/src/raspberrypi/controllers/scsidev_ctrl.cpp +++ b/src/raspberrypi/controllers/scsidev_ctrl.cpp @@ -18,6 +18,7 @@ #include "gpiobus.h" #include "devices/scsi_host_bridge.h" #include "devices/scsi_daynaport.h" +#include "exceptions.h" //=========================================================================== // @@ -611,18 +612,11 @@ void FASTCALL SCSIDEV::CmdInquiry() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdModeSelect() { - DWORD lun; - ASSERT(this); LOGTRACE( "%s MODE SELECT Command", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive ctrl.length = ctrl.unit[lun]->SelectCheck(ctrl.cmd); @@ -720,18 +714,11 @@ void FASTCALL SCSIDEV::CmdRelease10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdModeSense() { - DWORD lun; - ASSERT(this); LOGTRACE( "%s MODE SENSE Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive ctrl.length = ctrl.unit[lun]->ModeSense(ctrl.cmd, ctrl.buffer); @@ -755,19 +742,13 @@ void FASTCALL SCSIDEV::CmdModeSense() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdStartStop() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE( "%s START STOP UNIT Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->StartStop(ctrl.cmd); @@ -788,19 +769,13 @@ void FASTCALL SCSIDEV::CmdStartStop() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSendDiag() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE( "%s SEND DIAGNOSTIC Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->SendDiag(ctrl.cmd); @@ -821,19 +796,13 @@ void FASTCALL SCSIDEV::CmdSendDiag() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdRemoval() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE( "%s PREVENT/ALLOW MEDIUM REMOVAL Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Removal(ctrl.cmd); @@ -854,19 +823,13 @@ void FASTCALL SCSIDEV::CmdRemoval() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdReadCapacity() { - DWORD lun; int length; ASSERT(this); LOGTRACE( "%s READ CAPACITY Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive length = ctrl.unit[lun]->ReadCapacity(ctrl.cmd, ctrl.buffer); @@ -890,17 +853,11 @@ void FASTCALL SCSIDEV::CmdReadCapacity() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdRead10() { - DWORD lun; DWORD record; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Receive message if host bridge if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'B', 'R')) { @@ -950,17 +907,11 @@ void FASTCALL SCSIDEV::CmdRead10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdWrite10() { - DWORD lun; DWORD record; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Receive message with host bridge if (ctrl.unit[lun]->GetID() == MAKEID('S', 'C', 'B', 'R')) { @@ -1010,19 +961,13 @@ void FASTCALL SCSIDEV::CmdWrite10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSeek10() { - DWORD lun; BOOL status; ASSERT(this); LOGTRACE( "%s SEEK(10) Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->Seek(ctrl.cmd); @@ -1043,18 +988,12 @@ void FASTCALL SCSIDEV::CmdSeek10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdVerify() { - DWORD lun; BOOL status; DWORD record; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Get record number and block number record = ctrl.cmd[2]; @@ -1113,16 +1052,9 @@ void FASTCALL SCSIDEV::CmdVerify() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSynchronizeCache() { - DWORD lun; - ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + GetLun(); // Make it do something (not implemented)... @@ -1137,17 +1069,11 @@ void FASTCALL SCSIDEV::CmdSynchronizeCache() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdReadDefectData10() { - DWORD lun; ASSERT(this); LOGTRACE( "%s READ DEFECT DATA(10) Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive ctrl.length = ctrl.unit[lun]->ReadDefectData10(ctrl.cmd, ctrl.buffer); @@ -1169,15 +1095,9 @@ void FASTCALL SCSIDEV::CmdReadDefectData10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdReadToc() { - DWORD lun; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive ctrl.length = ctrl.unit[lun]->ReadToc(ctrl.cmd, ctrl.buffer); @@ -1198,17 +1118,11 @@ void FASTCALL SCSIDEV::CmdReadToc() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdPlayAudio10() { - DWORD lun; BOOL status; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->PlayAudio(ctrl.cmd); @@ -1229,17 +1143,11 @@ void FASTCALL SCSIDEV::CmdPlayAudio10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdPlayAudioMSF() { - DWORD lun; BOOL status; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->PlayAudioMSF(ctrl.cmd); @@ -1260,17 +1168,11 @@ void FASTCALL SCSIDEV::CmdPlayAudioMSF() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdPlayAudioTrack() { - DWORD lun; BOOL status; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive status = ctrl.unit[lun]->PlayAudioTrack(ctrl.cmd); @@ -1291,18 +1193,11 @@ void FASTCALL SCSIDEV::CmdPlayAudioTrack() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdModeSelect10() { - DWORD lun; - ASSERT(this); LOGTRACE( "%s MODE SELECT10 Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive ctrl.length = ctrl.unit[lun]->SelectCheck10(ctrl.cmd); @@ -1323,18 +1218,11 @@ void FASTCALL SCSIDEV::CmdModeSelect10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdModeSense10() { - DWORD lun; - ASSERT(this); LOGTRACE( "%s MODE SENSE(10) Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Command processing on drive ctrl.length = ctrl.unit[lun]->ModeSense10(ctrl.cmd, ctrl.buffer); @@ -1358,17 +1246,11 @@ void FASTCALL SCSIDEV::CmdModeSense10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdGetMessage10() { - DWORD lun; SCSIBR *bridge; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Error if not a host bridge if ((ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) && @@ -1412,16 +1294,9 @@ void FASTCALL SCSIDEV::CmdGetMessage10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSendMessage10() { - DWORD lun; - ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Error if not a host bridge if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'B', 'R')) { @@ -1465,17 +1340,11 @@ void FASTCALL SCSIDEV::CmdSendMessage10() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdRetrieveStats() { - DWORD lun; SCSIDaynaPort *dayna_port; ASSERT(this); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Error if not a DaynaPort SCSI Link if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){ @@ -1509,20 +1378,13 @@ void FASTCALL SCSIDEV::CmdRetrieveStats() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSetIfaceMode() { - DWORD lun; - // BOOL status; SCSIDaynaPort *dayna_port; ASSERT(this); LOGTRACE("%s",__PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Error if not a DaynaPort SCSI Link if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){ @@ -1560,18 +1422,11 @@ void FASTCALL SCSIDEV::CmdSetIfaceMode() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdSetMcastAddr() { - DWORD lun; - ASSERT(this); LOGTRACE("%s Set Multicast Address Command ", __PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){ LOGWARN("Received a SetMcastAddress command for a non-daynaport unit"); @@ -1601,7 +1456,6 @@ void FASTCALL SCSIDEV::CmdSetMcastAddr() //--------------------------------------------------------------------------- void FASTCALL SCSIDEV::CmdEnableInterface() { - DWORD lun=0; BOOL status; SCSIDaynaPort *dayna_port; @@ -1609,12 +1463,7 @@ void FASTCALL SCSIDEV::CmdEnableInterface() LOGTRACE("%s",__PRETTY_FUNCTION__); - // Logical Unit - lun = (ctrl.cmd[1] >> 5) & 0x07; - if (!ctrl.unit[lun]) { - Error(); - return; - } + DWORD lun = GetLun(); // Error if not a DaynaPort SCSI Link if (ctrl.unit[lun]->GetID() != MAKEID('S', 'C', 'D', 'P')){ @@ -1907,7 +1756,13 @@ void FASTCALL SCSIDEV::Receive() } // Execution Phase - Execute(); + try { + Execute(); + } + catch (lunexception& e) { + LOGINFO("%s unsupported LUN %d", __PRETTY_FUNCTION__, (int)e.getlun()); + Error(); + } break; // Message out phase diff --git a/src/raspberrypi/exceptions.h b/src/raspberrypi/exceptions.h new file mode 100644 index 00000000..d6d4e874 --- /dev/null +++ b/src/raspberrypi/exceptions.h @@ -0,0 +1,31 @@ +//--------------------------------------------------------------------------- +// +// SCSI Target Emulator RaSCSI (*^..^*) +// for Raspberry Pi +// +// Powered by XM6 TypeG Technology. +// Copyright (C) 2016-2020 GIMONS +// [ Exceptions ] +// +//--------------------------------------------------------------------------- + +#if !defined(exceptions_h) +#define exceptions_h + +class lunexception : public std::exception { +private: + DWORD lun; + +public: + lunexception(DWORD lun) { + this->lun = lun; + } + + ~lunexception() { } + + DWORD getlun() { + return lun; + } +}; + +#endif