diff --git a/lib/glacier/status/status.h b/lib/glacier/status/status.h index 3cd9b6a..d94253f 100644 --- a/lib/glacier/status/status.h +++ b/lib/glacier/status/status.h @@ -11,11 +11,11 @@ class Status { Status(ErrorCode code) : code_(code), message_() {} Status(ErrorCode code, StringView message) : code_(code), message_(message) {} - explicit operator bool() { return ok(); } - bool ok() { return code_ == OK; } + explicit operator bool() const { return ok(); } + bool ok() const { return code_ == OK; } - ErrorCode code() { return code_; } - StringView message() { return message_; } + ErrorCode code() const { return code_; } + StringView message() const { return message_; } private: ErrorCode code_; diff --git a/lib/mammoth/file/file.cpp b/lib/mammoth/file/file.cpp index 5de5cfa..60ac3e4 100644 --- a/lib/mammoth/file/file.cpp +++ b/lib/mammoth/file/file.cpp @@ -64,7 +64,11 @@ glcr::ErrorOr> ListDirectory(glcr::StringView path) { GetDirectoryRequest req; req.set_path(path); Directory dir; - RET_ERR(gVfsClient->GetDirectory(req, dir)); + auto status = gVfsClient->GetDirectory(req, dir); + if (!status.ok()) { + dbgln("Error in getting directory: {}", status.message()); + return status.code(); + } auto file_views = glcr::StrSplit(dir.filenames(), ','); glcr::Vector files; diff --git a/lib/mammoth/util/debug.cpp b/lib/mammoth/util/debug.cpp index ce5907f..706a476 100644 --- a/lib/mammoth/util/debug.cpp +++ b/lib/mammoth/util/debug.cpp @@ -15,6 +15,14 @@ void check(uint64_t code) { (void)ZProcessExit(code); } +void check(const glcr::Status& status) { + if (status.ok()) { + return; + } + dbgln("Crash: {}", status.message()); + (void)ZProcessExit(status.code()); +} + void crash(const char* str, uint64_t code) { dbgln(str); (void)ZProcessExit(code); diff --git a/lib/mammoth/util/debug.h b/lib/mammoth/util/debug.h index 4aeab01..c6fa5db 100644 --- a/lib/mammoth/util/debug.h +++ b/lib/mammoth/util/debug.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include #include @@ -16,5 +17,6 @@ void dbgln(const glcr::StringView& fmt, Args... args) { // Checks that the code is ok. // if not exits the process. void check(uint64_t); +void check(const glcr::Status&); void crash(const char*, z_err_t); diff --git a/sys/denali/denali.cpp b/sys/denali/denali.cpp index d25a0bc..4173651 100644 --- a/sys/denali/denali.cpp +++ b/sys/denali/denali.cpp @@ -16,7 +16,7 @@ uint64_t main(uint64_t init_port_cap) { YellowstoneClient stub(gInitEndpointCap); AhciInfo ahci; - RET_ERR(stub.GetAhciInfo(ahci)); + check(stub.GetAhciInfo(ahci)); mmth::OwnedMemoryRegion ahci_region = mmth::OwnedMemoryRegion::FromCapability(ahci.ahci_region()); ASSIGN_OR_RETURN(auto driver, AhciDriver::Init(glcr::Move(ahci_region))); diff --git a/sys/denali/lib/denali/denali.yunq.client.cpp b/sys/denali/lib/denali/denali.yunq.client.cpp index 83ef3b6..af49317 100644 --- a/sys/denali/lib/denali/denali.yunq.client.cpp +++ b/sys/denali/lib/denali/denali.yunq.client.cpp @@ -18,7 +18,7 @@ DenaliClient::~DenaliClient() { -glcr::ErrorCode DenaliClient::Read(const ReadRequest& request, ReadResponse& response) { +glcr::Status DenaliClient::Read(const ReadRequest& request, ReadResponse& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -41,18 +41,14 @@ glcr::ErrorCode DenaliClient::Read(const ReadRequest& request, ReadResponse& res RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; @@ -61,7 +57,7 @@ glcr::ErrorCode DenaliClient::Read(const ReadRequest& request, ReadResponse& res -glcr::ErrorCode DenaliClient::ReadMany(const ReadManyRequest& request, ReadResponse& response) { +glcr::Status DenaliClient::ReadMany(const ReadManyRequest& request, ReadResponse& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -84,18 +80,14 @@ glcr::ErrorCode DenaliClient::ReadMany(const ReadManyRequest& request, ReadRespo RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; diff --git a/sys/denali/lib/denali/denali.yunq.client.h b/sys/denali/lib/denali/denali.yunq.client.h index a2e8044..46fd28d 100644 --- a/sys/denali/lib/denali/denali.yunq.client.h +++ b/sys/denali/lib/denali/denali.yunq.client.h @@ -20,11 +20,11 @@ class DenaliClient { - [[nodiscard]] glcr::ErrorCode Read(const ReadRequest& request, ReadResponse& response); + [[nodiscard]] glcr::Status Read(const ReadRequest& request, ReadResponse& response); - [[nodiscard]] glcr::ErrorCode ReadMany(const ReadManyRequest& request, ReadResponse& response); + [[nodiscard]] glcr::Status ReadMany(const ReadManyRequest& request, ReadResponse& response); private: diff --git a/sys/denali/lib/denali/denali.yunq.server.cpp b/sys/denali/lib/denali/denali.yunq.server.cpp index 30323e3..9f9764e 100644 --- a/sys/denali/lib/denali/denali.yunq.server.cpp +++ b/sys/denali/lib/denali/denali.yunq.server.cpp @@ -104,7 +104,6 @@ glcr::Status DenaliServerBase::HandleRequest(const glcr::ByteBuffer& request, ReadRequest yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); @@ -125,7 +124,6 @@ glcr::Status DenaliServerBase::HandleRequest(const glcr::ByteBuffer& request, ReadManyRequest yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); diff --git a/sys/teton/teton.cpp b/sys/teton/teton.cpp index e8d234e..f89c689 100644 --- a/sys/teton/teton.cpp +++ b/sys/teton/teton.cpp @@ -21,7 +21,7 @@ uint64_t main(uint64_t init_port) { YellowstoneClient client(gInitEndpointCap); FramebufferInfo framebuffer; - RET_ERR(client.GetFramebufferInfo(framebuffer)); + check(client.GetFramebufferInfo(framebuffer)); dbgln("FB addr {x}, bpp {}, width {} , height {}, pitch {}", framebuffer.address_phys(), framebuffer.bpp(), framebuffer.width(), framebuffer.height(), framebuffer.pitch()); diff --git a/sys/victoriafalls/fs/ext2/ext2_block_reader.cpp b/sys/victoriafalls/fs/ext2/ext2_block_reader.cpp index a4a00ec..3262f48 100644 --- a/sys/victoriafalls/fs/ext2/ext2_block_reader.cpp +++ b/sys/victoriafalls/fs/ext2/ext2_block_reader.cpp @@ -12,7 +12,11 @@ glcr::ErrorOr> Ext2BlockReader::Init( req.set_lba(denali_info.lba_offset() + 2); req.set_size(2); ReadResponse resp; - RET_ERR(client.Read(req, resp)); + auto status = client.Read(req, resp); + if (!status.ok()) { + dbgln("Failed to read superblock: {}", status.message()); + return status.code(); + } mmth::OwnedMemoryRegion superblock = mmth::OwnedMemoryRegion::FromCapability(resp.memory()); @@ -70,7 +74,11 @@ glcr::ErrorOr Ext2BlockReader::ReadBlocks( req.set_lba(lba_offset_ + block_number * SectorsPerBlock()); req.set_size(num_blocks * SectorsPerBlock()); ReadResponse resp; - RET_ERR(denali_.Read(req, resp)); + auto status = denali_.Read(req, resp); + if (!status.ok()) { + dbgln("Failed to read blocks: {}", status.message()); + return status.code(); + } return mmth::OwnedMemoryRegion::FromCapability(resp.memory()); } @@ -92,7 +100,11 @@ glcr::ErrorOr Ext2BlockReader::ReadBlocks( } dbgln("Read many: {x}", req.lba().size()); ReadResponse resp; - RET_ERR(denali_.ReadMany(req, resp)); + auto status = denali_.ReadMany(req, resp); + if (!status.ok()) { + dbgln("Failed to read blocks: {}", status.message()); + return status.code(); + } return mmth::OwnedMemoryRegion::FromCapability(resp.memory()); } diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp index 59717dd..aa289d2 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.cpp @@ -18,7 +18,7 @@ VFSClient::~VFSClient() { -glcr::ErrorCode VFSClient::OpenFile(const OpenFileRequest& request, OpenFileResponse& response) { +glcr::Status VFSClient::OpenFile(const OpenFileRequest& request, OpenFileResponse& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -41,18 +41,14 @@ glcr::ErrorCode VFSClient::OpenFile(const OpenFileRequest& request, OpenFileResp RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; @@ -61,7 +57,7 @@ glcr::ErrorCode VFSClient::OpenFile(const OpenFileRequest& request, OpenFileResp -glcr::ErrorCode VFSClient::GetDirectory(const GetDirectoryRequest& request, Directory& response) { +glcr::Status VFSClient::GetDirectory(const GetDirectoryRequest& request, Directory& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -84,18 +80,14 @@ glcr::ErrorCode VFSClient::GetDirectory(const GetDirectoryRequest& request, Dire RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.h b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.h index 0a02404..35dab56 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.h +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.client.h @@ -20,11 +20,11 @@ class VFSClient { - [[nodiscard]] glcr::ErrorCode OpenFile(const OpenFileRequest& request, OpenFileResponse& response); + [[nodiscard]] glcr::Status OpenFile(const OpenFileRequest& request, OpenFileResponse& response); - [[nodiscard]] glcr::ErrorCode GetDirectory(const GetDirectoryRequest& request, Directory& response); + [[nodiscard]] glcr::Status GetDirectory(const GetDirectoryRequest& request, Directory& response); private: diff --git a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp index 13df75a..85a8a73 100644 --- a/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp +++ b/sys/victoriafalls/lib/victoriafalls/victoriafalls.yunq.server.cpp @@ -76,6 +76,7 @@ void VFSServerBase::ServerThread() { glcr::Status err = HandleRequest(recv_buffer, recv_cap, resp_buffer, resp_length, resp_cap); if (!err) { WriteError(resp_buffer, err.code()); + dbgln("Responding Error {}", err.message()); reply_err = static_cast(ZReplyPortSend(reply_port_cap, kHeaderSize, resp_buffer.RawPtr(), 0, nullptr)); } else { WriteHeader(resp_buffer, resp_length); @@ -103,7 +104,6 @@ glcr::Status VFSServerBase::HandleRequest(const glcr::ByteBuffer& request, OpenFileRequest yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); @@ -124,7 +124,6 @@ glcr::Status VFSServerBase::HandleRequest(const glcr::ByteBuffer& request, GetDirectoryRequest yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); diff --git a/sys/victoriafalls/victoriafalls.cpp b/sys/victoriafalls/victoriafalls.cpp index 493328d..56ee383 100644 --- a/sys/victoriafalls/victoriafalls.cpp +++ b/sys/victoriafalls/victoriafalls.cpp @@ -16,7 +16,7 @@ uint64_t main(uint64_t init_cap) { YellowstoneClient yellowstone(gInitEndpointCap); DenaliInfo denali_info; - RET_ERR(yellowstone.GetDenali(denali_info)); + check(yellowstone.GetDenali(denali_info)); ASSIGN_OR_RETURN(Ext2Driver ext2, Ext2Driver::Init(denali_info)); ASSIGN_OR_RETURN(auto server, VFSServer::Create(ext2)); diff --git a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.cpp b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.cpp index a81f086..0d22518 100644 --- a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.cpp +++ b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.cpp @@ -18,7 +18,7 @@ VoyageursClient::~VoyageursClient() { -glcr::ErrorCode VoyageursClient::RegisterKeyboardListener(const KeyboardListener& request) { +glcr::Status VoyageursClient::RegisterKeyboardListener(const KeyboardListener& request) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -41,7 +41,7 @@ glcr::ErrorCode VoyageursClient::RegisterKeyboardListener(const KeyboardListener RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. diff --git a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.h b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.h index acf97b4..4d03f6d 100644 --- a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.h +++ b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.client.h @@ -20,7 +20,7 @@ class VoyageursClient { - [[nodiscard]] glcr::ErrorCode RegisterKeyboardListener(const KeyboardListener& request); + [[nodiscard]] glcr::Status RegisterKeyboardListener(const KeyboardListener& request); private: diff --git a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp index e7e7d9b..f8376dc 100644 --- a/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp +++ b/sys/voyageurs/lib/voyageurs/voyageurs.yunq.server.cpp @@ -76,6 +76,7 @@ void VoyageursServerBase::ServerThread() { glcr::Status err = HandleRequest(recv_buffer, recv_cap, resp_buffer, resp_length, resp_cap); if (!err) { WriteError(resp_buffer, err.code()); + dbgln("Responding Error {}", err.message()); reply_err = static_cast(ZReplyPortSend(reply_port_cap, kHeaderSize, resp_buffer.RawPtr(), 0, nullptr)); } else { WriteHeader(resp_buffer, resp_length); @@ -103,7 +104,6 @@ glcr::Status VoyageursServerBase::HandleRequest(const glcr::ByteBuffer& request, KeyboardListener yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); diff --git a/sys/yellowstone/hw/gpt.cpp b/sys/yellowstone/hw/gpt.cpp index b2f2d35..ae44cbe 100644 --- a/sys/yellowstone/hw/gpt.cpp +++ b/sys/yellowstone/hw/gpt.cpp @@ -57,29 +57,29 @@ struct PartitionEntry { GptReader::GptReader(glcr::UniquePtr denali) : denali_(glcr::Move(denali)) {} -glcr::ErrorCode GptReader::ParsePartitionTables() { +glcr::Status GptReader::ParsePartitionTables() { ReadRequest req; req.set_device_id(0); req.set_lba(0); req.set_size(2); ReadResponse resp; - RET_ERR(denali_->Read(req, resp)); + RETURN_ERROR(denali_->Read(req, resp)); mmth::OwnedMemoryRegion lba_1_and_2 = mmth::OwnedMemoryRegion::FromCapability(resp.memory()); uint16_t* mbr_sig = reinterpret_cast(lba_1_and_2.vaddr() + 0x1FE); if (*mbr_sig != 0xAA55) { - dbgln("Invalid MBR Sig: {x}", *mbr_sig); - return glcr::FAILED_PRECONDITION; + return glcr::FailedPrecondition( + glcr::StrFormat("Invalid MBR Sig: {x}", *mbr_sig)); } MbrPartition* first_partition = reinterpret_cast(lba_1_and_2.vaddr() + 0x1BE); if (first_partition->boot_indicator != 0) { - dbgln("Boot indicator set: {}", first_partition->boot_indicator); - return glcr::FAILED_PRECONDITION; + return glcr::FailedPrecondition(glcr::StrFormat( + "Boot indicator set: {}", first_partition->boot_indicator)); } if (first_partition->os_type != 0xEE) { - dbgln("Incorrect OS type: {x}", first_partition->os_type); - return glcr::FAILED_PRECONDITION; + return glcr::FailedPrecondition( + glcr::StrFormat("Incorrect OS type: {x}", first_partition->os_type)); } #if GPT_DEBUG dbgln("LBAs: ({x}, {x})", first_partition->starting_lba, @@ -105,7 +105,7 @@ glcr::ErrorCode GptReader::ParsePartitionTables() { req.set_device_id(0); req.set_lba(header->lba_partition_entries); req.set_size(num_blocks); - RET_ERR(denali_->Read(req, resp)); + RETURN_ERROR(denali_->Read(req, resp)); mmth::OwnedMemoryRegion part_table = mmth::OwnedMemoryRegion::FromCapability(resp.memory()); for (uint64_t i = 0; i < num_partitions; i++) { @@ -130,5 +130,5 @@ glcr::ErrorCode GptReader::ParsePartitionTables() { } } - return glcr::OK; + return glcr::Status::Ok(); } diff --git a/sys/yellowstone/hw/gpt.h b/sys/yellowstone/hw/gpt.h index 90cb279..4ce95d3 100644 --- a/sys/yellowstone/hw/gpt.h +++ b/sys/yellowstone/hw/gpt.h @@ -10,7 +10,7 @@ class GptReader { public: GptReader(glcr::UniquePtr denali); - glcr::ErrorCode ParsePartitionTables(); + glcr::Status ParsePartitionTables(); uint64_t GetPrimaryPartitionLba() { return primary_partition_lba_; } diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp index 8cd6ede..d7baf54 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.cpp @@ -20,7 +20,7 @@ YellowstoneClient::~YellowstoneClient() { -glcr::ErrorCode YellowstoneClient::RegisterEndpoint(const RegisterEndpointRequest& request) { +glcr::Status YellowstoneClient::RegisterEndpoint(const RegisterEndpointRequest& request) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -43,7 +43,7 @@ glcr::ErrorCode YellowstoneClient::RegisterEndpoint(const RegisterEndpointReques RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. @@ -57,7 +57,7 @@ glcr::ErrorCode YellowstoneClient::RegisterEndpoint(const RegisterEndpointReques -glcr::ErrorCode YellowstoneClient::GetEndpoint(const GetEndpointRequest& request, Endpoint& response) { +glcr::Status YellowstoneClient::GetEndpoint(const GetEndpointRequest& request, Endpoint& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -80,18 +80,14 @@ glcr::ErrorCode YellowstoneClient::GetEndpoint(const GetEndpointRequest& request RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; @@ -100,7 +96,7 @@ glcr::ErrorCode YellowstoneClient::GetEndpoint(const GetEndpointRequest& request -glcr::ErrorCode YellowstoneClient::GetAhciInfo(AhciInfo& response) { +glcr::Status YellowstoneClient::GetAhciInfo(AhciInfo& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -123,18 +119,14 @@ glcr::ErrorCode YellowstoneClient::GetAhciInfo(AhciInfo& response) { RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; @@ -143,7 +135,7 @@ glcr::ErrorCode YellowstoneClient::GetAhciInfo(AhciInfo& response) { -glcr::ErrorCode YellowstoneClient::GetFramebufferInfo(FramebufferInfo& response) { +glcr::Status YellowstoneClient::GetFramebufferInfo(FramebufferInfo& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -166,18 +158,14 @@ glcr::ErrorCode YellowstoneClient::GetFramebufferInfo(FramebufferInfo& response) RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; @@ -186,7 +174,7 @@ glcr::ErrorCode YellowstoneClient::GetFramebufferInfo(FramebufferInfo& response) -glcr::ErrorCode YellowstoneClient::GetDenali(DenaliInfo& response) { +glcr::Status YellowstoneClient::GetDenali(DenaliInfo& response) { uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -209,18 +197,14 @@ glcr::ErrorCode YellowstoneClient::GetDenali(DenaliInfo& response) { RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); return glcr::OK; diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.h b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.h index a758d78..1793f69 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.h +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.client.h @@ -22,23 +22,23 @@ class YellowstoneClient { - [[nodiscard]] glcr::ErrorCode RegisterEndpoint(const RegisterEndpointRequest& request); + [[nodiscard]] glcr::Status RegisterEndpoint(const RegisterEndpointRequest& request); - [[nodiscard]] glcr::ErrorCode GetEndpoint(const GetEndpointRequest& request, Endpoint& response); + [[nodiscard]] glcr::Status GetEndpoint(const GetEndpointRequest& request, Endpoint& response); - [[nodiscard]] glcr::ErrorCode GetAhciInfo(AhciInfo& response); + [[nodiscard]] glcr::Status GetAhciInfo(AhciInfo& response); - [[nodiscard]] glcr::ErrorCode GetFramebufferInfo(FramebufferInfo& response); + [[nodiscard]] glcr::Status GetFramebufferInfo(FramebufferInfo& response); - [[nodiscard]] glcr::ErrorCode GetDenali(DenaliInfo& response); + [[nodiscard]] glcr::Status GetDenali(DenaliInfo& response); private: diff --git a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp index 9030940..c0205ae 100644 --- a/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp +++ b/sys/yellowstone/lib/yellowstone/yellowstone.yunq.server.cpp @@ -78,6 +78,7 @@ void YellowstoneServerBase::ServerThread() { glcr::Status err = HandleRequest(recv_buffer, recv_cap, resp_buffer, resp_length, resp_cap); if (!err) { WriteError(resp_buffer, err.code()); + dbgln("Responding Error {}", err.message()); reply_err = static_cast(ZReplyPortSend(reply_port_cap, kHeaderSize, resp_buffer.RawPtr(), 0, nullptr)); } else { WriteHeader(resp_buffer, resp_length); @@ -105,7 +106,6 @@ glcr::Status YellowstoneServerBase::HandleRequest(const glcr::ByteBuffer& reques RegisterEndpointRequest yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); @@ -124,7 +124,6 @@ glcr::Status YellowstoneServerBase::HandleRequest(const glcr::ByteBuffer& reques GetEndpointRequest yunq_request; - // TODO: Return status. RETURN_ERROR(yunq_request.ParseFromBytes(request, kHeaderSize, req_caps)); diff --git a/sys/yellowstone/yellowstone_server.cpp b/sys/yellowstone/yellowstone_server.cpp index bac6795..e4e05d6 100644 --- a/sys/yellowstone/yellowstone_server.cpp +++ b/sys/yellowstone/yellowstone_server.cpp @@ -23,7 +23,11 @@ glcr::ErrorOr HandleDenaliRegistration(z_cap_t endpoint_cap) { GptReader reader( glcr::UniquePtr(new DenaliClient(endpoint_cap))); - RET_ERR(reader.ParsePartitionTables()); + auto status = reader.ParsePartitionTables(); + if (!status.ok()) { + dbgln("GPT Reader: {}", status.message()); + return status.code(); + } return PartitionInfo{.device_id = 0, .partition_lba = reader.GetPrimaryPartitionLba()}; diff --git a/yunq/client.cpp.jinja b/yunq/client.cpp.jinja index 60bdf68..0643ad6 100644 --- a/yunq/client.cpp.jinja +++ b/yunq/client.cpp.jinja @@ -20,11 +20,11 @@ namespace {{package.cpp_namespace()}} { {% for method in interface.methods %} {% if method.request == None %} -glcr::ErrorCode {{interface.name}}Client::{{method.name}}({{method.response}}& response) { +glcr::Status {{interface.name}}Client::{{method.name}}({{method.response}}& response) { {% elif method.response == None %} -glcr::ErrorCode {{interface.name}}Client::{{method.name}}(const {{method.request}}& request) { +glcr::Status {{interface.name}}Client::{{method.name}}(const {{method.request}}& request) { {% else %} -glcr::ErrorCode {{interface.name}}Client::{{method.name}}(const {{method.request}}& request, {{method.response}}& response) { +glcr::Status {{interface.name}}Client::{{method.name}}(const {{method.request}}& request, {{method.response}}& response) { {% endif %} uint64_t buffer_size = kBufferSize; uint64_t cap_size = kCapBufferSize; @@ -49,18 +49,14 @@ glcr::ErrorCode {{interface.name}}Client::{{method.name}}(const {{method.request RET_ERR(ZReplyPortRecv(reply_port_cap, &buffer_size, buffer_.RawPtr(), &cap_size, cap_buffer_.RawPtr())); if (buffer_.At(0) != kSentinel) { - return glcr::INVALID_RESPONSE; + return glcr::InvalidResponse("Got an invalid response from server."); } // Check Response Code. RET_ERR(buffer_.At(8)); {% if method.response != None %} - // TODO: Return status. - auto status = response.ParseFromBytes(buffer_, 16, cap_buffer_); - if (!status) { - return status.code(); - } + RETURN_ERROR(response.ParseFromBytes(buffer_, 16, cap_buffer_)); {% endif %} return glcr::OK; diff --git a/yunq/client.h.jinja b/yunq/client.h.jinja index 4b764e0..1e62c83 100644 --- a/yunq/client.h.jinja +++ b/yunq/client.h.jinja @@ -23,11 +23,11 @@ class {{interface.name}}Client { {% for method in interface.methods %} {% if method.request == None %} - [[nodiscard]] glcr::ErrorCode {{method.name}}({{method.response}}& response); + [[nodiscard]] glcr::Status {{method.name}}({{method.response}}& response); {% elif method.response == None %} - [[nodiscard]] glcr::ErrorCode {{method.name}}(const {{method.request}}& request); + [[nodiscard]] glcr::Status {{method.name}}(const {{method.request}}& request); {% else %} - [[nodiscard]] glcr::ErrorCode {{method.name}}(const {{method.request}}& request, {{method.response}}& response); + [[nodiscard]] glcr::Status {{method.name}}(const {{method.request}}& request, {{method.response}}& response); {% endif %} {% endfor %} private: