mirror of
https://github.com/akuker/RASCSI.git
synced 2024-11-17 15:06:49 +00:00
Added PbDevices to PbServerInfo for client convenience (#176)
* Added device list to server info * Updated loggin * Added comment * Added comment * Added comment * Comment update * Deprecate LIST * Comment update * Updated duplicate ID/unit check * Updated logging * Updated logging * Unified error message handling: Errors are now consistently logged * REview * Added missing field initialization (reported by Eclipse IDE) * Added some translations * Fixed typo Co-authored-by: akuker <akuker@gmail.com>
This commit is contained in:
parent
157172b566
commit
79de9e29e0
@ -2697,19 +2697,19 @@ BOOL CHostFcb::Close()
|
|||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// FCB処理 マネージャ
|
// FCB processing manager
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// デストラクタ final
|
// Final destructor
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
CHostFcbManager::~CHostFcbManager()
|
CHostFcbManager::~CHostFcbManager()
|
||||||
{
|
{
|
||||||
// 実体が存在しないことを確認 (念のため)
|
// Confirm that the entity does not exist (just in case)
|
||||||
ASSERT(m_cRing.Next() == &m_cRing);
|
ASSERT(m_cRing.Next() == &m_cRing);
|
||||||
ASSERT(m_cRing.Prev() == &m_cRing);
|
ASSERT(m_cRing.Prev() == &m_cRing);
|
||||||
}
|
}
|
||||||
@ -2717,17 +2717,17 @@ CHostFcbManager::~CHostFcbManager()
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// 初期化 (ドライバ組込み時)
|
// Initialization (when the driver is installed)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void CHostFcbManager::Init()
|
void CHostFcbManager::Init()
|
||||||
{
|
{
|
||||||
|
|
||||||
// 実体が存在しないことを確認 (念のため)
|
// Confirm that the entity does not exist (just in case)
|
||||||
ASSERT(m_cRing.Next() == &m_cRing);
|
ASSERT(m_cRing.Next() == &m_cRing);
|
||||||
ASSERT(m_cRing.Prev() == &m_cRing);
|
ASSERT(m_cRing.Prev() == &m_cRing);
|
||||||
|
|
||||||
// メモリ確保
|
// Memory allocation
|
||||||
for (DWORD i = 0; i < XM6_HOST_FCB_MAX; i++) {
|
for (DWORD i = 0; i < XM6_HOST_FCB_MAX; i++) {
|
||||||
ring_t* p = new ring_t;
|
ring_t* p = new ring_t;
|
||||||
ASSERT(p);
|
ASSERT(p);
|
||||||
@ -2737,13 +2737,13 @@ void CHostFcbManager::Init()
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// 解放 (起動・リセット時)
|
// Clean (at startup/reset)
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void CHostFcbManager::Clean()
|
void CHostFcbManager::Clean()
|
||||||
{
|
{
|
||||||
|
|
||||||
// メモリ解放
|
// Fast task killer
|
||||||
CRing* p;
|
CRing* p;
|
||||||
while ((p = m_cRing.Next()) != &m_cRing) {
|
while ((p = m_cRing.Next()) != &m_cRing) {
|
||||||
delete (ring_t*)p;
|
delete (ring_t*)p;
|
||||||
@ -2752,26 +2752,26 @@ void CHostFcbManager::Clean()
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// 確保
|
// Alloc
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
CHostFcb* CHostFcbManager::Alloc(DWORD nKey)
|
CHostFcb* CHostFcbManager::Alloc(DWORD nKey)
|
||||||
{
|
{
|
||||||
ASSERT(nKey);
|
ASSERT(nKey);
|
||||||
|
|
||||||
// 末尾から選択
|
// Select from the end
|
||||||
ring_t* p = (ring_t*)m_cRing.Prev();
|
ring_t* p = (ring_t*)m_cRing.Prev();
|
||||||
|
|
||||||
// 使用中ならエラー (念のため)
|
// Error if in use (just in case)
|
||||||
if (p->f.isSameKey(0) == FALSE) {
|
if (p->f.isSameKey(0) == FALSE) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// リング先頭へ移動
|
// Move to the top of the ring
|
||||||
p->r.Insert(&m_cRing);
|
p->r.Insert(&m_cRing);
|
||||||
|
|
||||||
// キーを設定
|
// Set key
|
||||||
p->f.SetKey(nKey);
|
p->f.SetKey(nKey);
|
||||||
|
|
||||||
return &p->f;
|
return &p->f;
|
||||||
@ -2779,18 +2779,18 @@ CHostFcb* CHostFcbManager::Alloc(DWORD nKey)
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// 検索
|
// Search
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
CHostFcb* CHostFcbManager::Search(DWORD nKey)
|
CHostFcb* CHostFcbManager::Search(DWORD nKey)
|
||||||
{
|
{
|
||||||
ASSERT(nKey);
|
ASSERT(nKey);
|
||||||
|
|
||||||
// 該当するオブジェクトを検索
|
// Search for applicable objects
|
||||||
ring_t* p = (ring_t*)m_cRing.Next();
|
ring_t* p = (ring_t*)m_cRing.Next();
|
||||||
while (p != (ring_t*)&m_cRing) {
|
while (p != (ring_t*)&m_cRing) {
|
||||||
if (p->f.isSameKey(nKey)) {
|
if (p->f.isSameKey(nKey)) {
|
||||||
// リング先頭へ移動
|
// Move to the top of the ring
|
||||||
p->r.Insert(&m_cRing);
|
p->r.Insert(&m_cRing);
|
||||||
return &p->f;
|
return &p->f;
|
||||||
}
|
}
|
||||||
@ -2802,40 +2802,40 @@ CHostFcb* CHostFcbManager::Search(DWORD nKey)
|
|||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// 解放
|
// Free
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
void CHostFcbManager::Free(CHostFcb* pFcb)
|
void CHostFcbManager::Free(CHostFcb* pFcb)
|
||||||
{
|
{
|
||||||
ASSERT(pFcb);
|
ASSERT(pFcb);
|
||||||
|
|
||||||
// 解放
|
// Free
|
||||||
pFcb->SetKey(0);
|
pFcb->SetKey(0);
|
||||||
pFcb->Close();
|
pFcb->Close();
|
||||||
|
|
||||||
// リング末尾へ移動
|
// Move to the end of the ring
|
||||||
ring_t* p = (ring_t*)((size_t)pFcb - offsetof(ring_t, f));
|
ring_t* p = (ring_t*)((size_t)pFcb - offsetof(ring_t, f));
|
||||||
p->r.InsertTail(&m_cRing);
|
p->r.InsertTail(&m_cRing);
|
||||||
}
|
}
|
||||||
|
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
//
|
//
|
||||||
// ホスト側ファイルシステム
|
// Host side file system
|
||||||
//
|
//
|
||||||
//===========================================================================
|
//===========================================================================
|
||||||
|
|
||||||
DWORD CFileSys::g_nOption; ///< ファイル名変換フラグ
|
DWORD CFileSys::g_nOption; // File name conversion flag
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
//
|
//
|
||||||
/// デフォルトコンストラクタ
|
// Default constructor
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
CFileSys::CFileSys()
|
CFileSys::CFileSys()
|
||||||
{
|
{
|
||||||
m_nHostSectorCount = 0;
|
m_nHostSectorCount = 0;
|
||||||
|
|
||||||
// コンフィグデータ初期化
|
// Config data initialization
|
||||||
m_nDrives = 0;
|
m_nDrives = 0;
|
||||||
|
|
||||||
for (size_t n = 0; n < DriveMax; n++) {
|
for (size_t n = 0; n < DriveMax; n++) {
|
||||||
|
@ -89,6 +89,17 @@ DWORD bcm_host_get_peripheral_address(void)
|
|||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
GPIOBUS::GPIOBUS()
|
GPIOBUS::GPIOBUS()
|
||||||
{
|
{
|
||||||
|
actmode = TARGET;
|
||||||
|
baseaddr = 0;
|
||||||
|
gicc = 0;
|
||||||
|
gicd = 0;
|
||||||
|
gpio = 0;
|
||||||
|
level = 0;
|
||||||
|
pads = 0;
|
||||||
|
irpctl = 0;
|
||||||
|
qa7regs = 0;
|
||||||
|
signals = 0;
|
||||||
|
rpitype = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
@ -618,8 +618,7 @@ private:
|
|||||||
|
|
||||||
DWORD baseaddr; // Base address
|
DWORD baseaddr; // Base address
|
||||||
|
|
||||||
int rpitype;
|
int rpitype; // Type of Raspberry Pi
|
||||||
// Type of Raspberry Pi
|
|
||||||
|
|
||||||
volatile DWORD *gpio; // GPIO register
|
volatile DWORD *gpio; // GPIO register
|
||||||
|
|
||||||
|
@ -267,7 +267,7 @@ void Reset()
|
|||||||
// Get the list of attached devices
|
// Get the list of attached devices
|
||||||
//
|
//
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
PbDevices GetDevices() {
|
const PbDevices GetDevices() {
|
||||||
PbDevices devices;
|
PbDevices devices;
|
||||||
|
|
||||||
for (int i = 0; i < CtrlMax * UnitNum; i++) {
|
for (int i = 0; i < CtrlMax * UnitNum; i++) {
|
||||||
@ -433,8 +433,12 @@ bool MapController(Disk **map)
|
|||||||
|
|
||||||
bool ReturnStatus(int fd, bool status = true, const string msg = "")
|
bool ReturnStatus(int fd, bool status = true, const string msg = "")
|
||||||
{
|
{
|
||||||
|
if (!status && !msg.empty()) {
|
||||||
|
LOGWARN("%s", msg.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
if (fd == -1) {
|
if (fd == -1) {
|
||||||
if (msg.length()) {
|
if (!msg.empty()) {
|
||||||
FPRT(stderr, "Error: ");
|
FPRT(stderr, "Error: ");
|
||||||
FPRT(stderr, msg.c_str());
|
FPRT(stderr, msg.c_str());
|
||||||
FPRT(stderr, "\n");
|
FPRT(stderr, "\n");
|
||||||
@ -487,7 +491,7 @@ bool SetLogLevel(const string& log_level)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void LogDeviceList(const string& device_list)
|
void LogDevices(const string& device_list)
|
||||||
{
|
{
|
||||||
stringstream ss(device_list);
|
stringstream ss(device_list);
|
||||||
string line;
|
string line;
|
||||||
@ -536,10 +540,6 @@ bool ProcessCmd(int fd, const PbCommand &command)
|
|||||||
s << "Processing: cmd=" << PbOperation_Name(cmd) << ", id=" << id << ", un=" << un << ", type=" << PbDeviceType_Name(type) << ", params=" << params;
|
s << "Processing: cmd=" << PbOperation_Name(cmd) << ", id=" << id << ", un=" << un << ", type=" << PbDeviceType_Name(type) << ", params=" << params;
|
||||||
LOGINFO("%s", s.str().c_str());
|
LOGINFO("%s", s.str().c_str());
|
||||||
|
|
||||||
// Copy the Unit List
|
|
||||||
Disk *map[CtrlMax * UnitNum];
|
|
||||||
memcpy(map, disk, sizeof(disk));
|
|
||||||
|
|
||||||
// Check the Controller Number
|
// Check the Controller Number
|
||||||
if (id < 0 || id >= CtrlMax) {
|
if (id < 0 || id >= CtrlMax) {
|
||||||
error << "Invalid ID " << id << " (0-" << CtrlMax - 1 << ")";
|
error << "Invalid ID " << id << " (0-" << CtrlMax - 1 << ")";
|
||||||
@ -558,9 +558,13 @@ bool ProcessCmd(int fd, const PbCommand &command)
|
|||||||
ext = params.substr(len - 3);
|
ext = params.substr(len - 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy the Unit List
|
||||||
|
Disk *map[CtrlMax * UnitNum];
|
||||||
|
memcpy(map, disk, sizeof(disk));
|
||||||
|
|
||||||
// Connect Command
|
// Connect Command
|
||||||
if (cmd == ATTACH) {
|
if (cmd == ATTACH) {
|
||||||
if (map[id]) {
|
if (map[id * UnitNum + un]) {
|
||||||
error << "Duplicate ID " << id;
|
error << "Duplicate ID " << id;
|
||||||
return ReturnStatus(fd, false, error);
|
return ReturnStatus(fd, false, error);
|
||||||
}
|
}
|
||||||
@ -642,7 +646,6 @@ bool ProcessCmd(int fd, const PbCommand &command)
|
|||||||
delete pUnit;
|
delete pUnit;
|
||||||
|
|
||||||
error << "Tried to open an invalid file '" << file << "': " << e.getmsg();
|
error << "Tried to open an invalid file '" << file << "': " << e.getmsg();
|
||||||
LOGWARN("%s", error.str().c_str());
|
|
||||||
return ReturnStatus(fd, false, error);
|
return ReturnStatus(fd, false, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -672,17 +675,15 @@ bool ProcessCmd(int fd, const PbCommand &command)
|
|||||||
|
|
||||||
// Does the controller exist?
|
// Does the controller exist?
|
||||||
if (ctrl[id] == NULL) {
|
if (ctrl[id] == NULL) {
|
||||||
LOGWARN("Received a command for invalid controller %d", id);
|
error << "Received a command for invalid ID " << id;
|
||||||
|
return ReturnStatus(fd, false, error);
|
||||||
return ReturnStatus(fd, false, "No such device");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Does the unit exist?
|
// Does the unit exist?
|
||||||
pUnit = disk[id * UnitNum + un];
|
pUnit = disk[id * UnitNum + un];
|
||||||
if (pUnit == NULL) {
|
if (pUnit == NULL) {
|
||||||
LOGWARN("Received a command for invalid unit ID %d UN %d", id, un);
|
error << "Received a command for invalid ID " << id << ", unit " << un;
|
||||||
|
return ReturnStatus(fd, false, error);
|
||||||
return ReturnStatus(fd, false, "No such device");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Disconnect Command
|
// Disconnect Command
|
||||||
@ -704,16 +705,12 @@ bool ProcessCmd(int fd, const PbCommand &command)
|
|||||||
|
|
||||||
// Only MOs or CDs may be inserted/ejected, only MOs, CDs or hard disks may be protected
|
// Only MOs or CDs may be inserted/ejected, only MOs, CDs or hard disks may be protected
|
||||||
if ((cmd == INSERT || cmd == EJECT) && !pUnit->IsRemovable()) {
|
if ((cmd == INSERT || cmd == EJECT) && !pUnit->IsRemovable()) {
|
||||||
LOGWARN("%s requested for incompatible type %s", PbOperation_Name(cmd).c_str(), pUnit->GetID().c_str());
|
error << PbOperation_Name(cmd) << " operation denied (Device type " << pUnit->GetID() << " isn't removable)";
|
||||||
|
|
||||||
error << "Operation denied (Device type " << pUnit->GetID().c_str() << " isn't removable)";
|
|
||||||
return ReturnStatus(fd, false, error);
|
return ReturnStatus(fd, false, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((cmd == PROTECT || cmd == UNPROTECT) && (!pUnit->IsProtectable() || pUnit->IsReadOnly())) {
|
if ((cmd == PROTECT || cmd == UNPROTECT) && (!pUnit->IsProtectable() || pUnit->IsReadOnly())) {
|
||||||
LOGWARN("%s requested for incompatible type %s", PbOperation_Name(cmd).c_str(), pUnit->GetID().c_str());
|
error << PbOperation_Name(cmd) << " operation denied (Device type " << pUnit->GetID() << " isn't protectable)";
|
||||||
|
|
||||||
error << "Operation denied (Device type " << pUnit->GetID().c_str() << " isn't protectable)";
|
|
||||||
return ReturnStatus(fd, false, error);
|
return ReturnStatus(fd, false, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -761,7 +758,6 @@ bool ProcessCmd(int fd, const PbCommand &command)
|
|||||||
|
|
||||||
default:
|
default:
|
||||||
error << "Received unknown command: " << PbOperation_Name(cmd);
|
error << "Received unknown command: " << PbOperation_Name(cmd);
|
||||||
LOGWARN("%s", error.str().c_str());
|
|
||||||
return ReturnStatus(fd, false, error);
|
return ReturnStatus(fd, false, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -867,10 +863,9 @@ bool ParseArgument(int argc, char* argv[], int& port)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Display and log the device list
|
// Display and log the device list
|
||||||
const PbDevices devices = GetDevices();
|
const string devices = ListDevices(GetDevices());
|
||||||
const string device_list = ListDevices(devices);
|
cout << devices << endl;
|
||||||
cout << device_list << endl;
|
LogDevices(devices);
|
||||||
LogDeviceList(device_list);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -940,7 +935,7 @@ static void *MonThread(void *param)
|
|||||||
case LIST: {
|
case LIST: {
|
||||||
const PbDevices devices = GetDevices();
|
const PbDevices devices = GetDevices();
|
||||||
SerializeMessage(fd, devices);
|
SerializeMessage(fd, devices);
|
||||||
LogDeviceList(ListDevices(devices));
|
LogDevices(ListDevices(devices));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -964,6 +959,7 @@ static void *MonThread(void *param)
|
|||||||
serverInfo.set_current_log_level(current_log_level);
|
serverInfo.set_current_log_level(current_log_level);
|
||||||
serverInfo.set_default_image_folder(default_image_folder);
|
serverInfo.set_default_image_folder(default_image_folder);
|
||||||
GetAvailableImages(serverInfo);
|
GetAvailableImages(serverInfo);
|
||||||
|
serverInfo.set_allocated_devices(new PbDevices(GetDevices()));
|
||||||
SerializeMessage(fd, serverInfo);
|
SerializeMessage(fd, serverInfo);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,11 @@ enum PbDeviceType {
|
|||||||
// rascsi remote operations
|
// rascsi remote operations
|
||||||
enum PbOperation {
|
enum PbOperation {
|
||||||
NONE = 0;
|
NONE = 0;
|
||||||
|
// Returns the full server information
|
||||||
SERVER_INFO = 1;
|
SERVER_INFO = 1;
|
||||||
LOG_LEVEL = 2;
|
// Returns the device list only (required for rasctl/logging semantics compatibility)
|
||||||
LIST = 3;
|
LIST = 2 [deprecated = true];
|
||||||
|
LOG_LEVEL = 3;
|
||||||
ATTACH = 4;
|
ATTACH = 4;
|
||||||
DETACH = 5;
|
DETACH = 5;
|
||||||
INSERT = 6;
|
INSERT = 6;
|
||||||
@ -43,7 +45,6 @@ message PbResult {
|
|||||||
string msg = 2;
|
string msg = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// The device meta data
|
// The device meta data
|
||||||
message PbDevice {
|
message PbDevice {
|
||||||
int32 id = 1;
|
int32 id = 1;
|
||||||
@ -53,7 +54,7 @@ message PbDevice {
|
|||||||
bool read_only = 5;
|
bool read_only = 5;
|
||||||
// Note: Read-only media (e.g. CD-ROMs) are not protectable
|
// Note: Read-only media (e.g. CD-ROMs) are not protectable
|
||||||
bool protectable = 6;
|
bool protectable = 6;
|
||||||
// Note: Read-only media (e.g. CD-ROMs) are not protected by just read-only
|
// Note: Read-only media (e.g. CD-ROMs) are not protected but just read-only
|
||||||
bool protected = 7;
|
bool protected = 7;
|
||||||
bool removable = 8;
|
bool removable = 8;
|
||||||
bool removed = 9;
|
bool removed = 9;
|
||||||
@ -75,4 +76,6 @@ message PbServerInfo {
|
|||||||
string default_image_folder = 4;
|
string default_image_folder = 4;
|
||||||
// Files in the default folder
|
// Files in the default folder
|
||||||
repeated string available_image_files = 5;
|
repeated string available_image_files = 5;
|
||||||
|
// The attached devices
|
||||||
|
PbDevices devices = 6;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user