Improve cdc_fuse_fs and path (#2)

Improve cdc_fuse_fs and path

Improves the error handling in path so that std:error_codes are not
assumed to be of system category, and also that their messages are
displayed. Also improves debug messages in GameletComponent.
This commit is contained in:
ljusten
2022-11-15 12:53:02 +01:00
committed by GitHub
parent 9fdccb3548
commit 23fcd5ef1d
9 changed files with 70 additions and 65 deletions

View File

@@ -66,6 +66,7 @@ cc_library(
deps = [
"@com_google_absl//absl/status",
"@com_google_absl//absl/strings",
"@com_google_absl//absl/strings:str_format",
],
)

View File

@@ -221,8 +221,8 @@ bool DirectoryIterator::Open(const std::string& path,
impl_->PushDir(dir, path::BaseName(path));
return true;
}
impl_->SetStatus(ErrnoToCanonicalStatus(
errno, absl::StrFormat("Failed to open directory '%s'", path)));
impl_->SetStatus(
ErrnoToCanonicalStatus(errno, "Failed to open directory '%s'", path));
return false;
}
@@ -259,7 +259,7 @@ bool DirectoryIterator::NextEntry(DirectoryEntry* entry) {
// Ignore access errors and proceed.
} else {
impl_->SetStatus(ErrnoToCanonicalStatus(
errno, absl::StrFormat("Failed to open directory '%s'", subdir)));
errno, "Failed to open directory '%s'", subdir));
return false;
}
}
@@ -278,8 +278,7 @@ bool DirectoryIterator::NextEntry(DirectoryEntry* entry) {
if (errno) {
impl_->SetStatus(ErrnoToCanonicalStatus(
errno, absl::StrFormat("Failed to iterate over directory '%s'",
impl_->DirsPath())));
errno, "Failed to iterate over directory '%s'", impl_->DirsPath()));
}
return false;
}

View File

@@ -16,8 +16,6 @@
#include <errno.h>
#include <string>
namespace cdc_ft {
absl::StatusCode ErrnoToCanonicalCode(int error_number) {
@@ -160,10 +158,4 @@ absl::StatusCode ErrnoToCanonicalCode(int error_number) {
}
}
absl::Status ErrnoToCanonicalStatus(int error_number,
absl::string_view message) {
return absl::Status(ErrnoToCanonicalCode(error_number),
absl::StrCat(message, ": ", strerror(error_number)));
}
} // namespace cdc_ft

View File

@@ -17,8 +17,10 @@
#ifndef COMMON_ERRNO_MAPPING_H_
#define COMMON_ERRNO_MAPPING_H_
#include <string>
#include "absl/status/status.h"
#include "absl/strings/string_view.h"
#include "absl/strings/str_format.h"
namespace cdc_ft {
@@ -26,8 +28,27 @@ namespace cdc_ft {
absl::StatusCode ErrnoToCanonicalCode(int error_number);
// Creates a status by converting the errno |error_number| to an absl code.
template <typename... Args>
absl::Status ErrnoToCanonicalStatus(int error_number,
absl::string_view message);
const absl::FormatSpec<Args...>& format,
Args... args) {
if (error_number == 0) return absl::OkStatus();
std::string msg = absl::StrFormat(format, args...);
return absl::Status(ErrnoToCanonicalCode(error_number),
absl::StrCat(msg, ": ", strerror(error_number)));
}
template <typename... Args>
absl::Status ErrorCodeToCanonicalStatus(const std::error_code& code,
const absl::FormatSpec<Args...>& format,
Args... args) {
if (!code) return absl::OkStatus();
std::string msg = absl::StrFormat(format, args...);
absl::StatusCode absl_code = code.category() == std::system_category()
? ErrnoToCanonicalCode(code.value())
: absl::StatusCode::kUnknown;
return absl::Status(absl_code, absl::StrCat(msg, ": ", code.message()));
}
} // namespace cdc_ft

View File

@@ -470,8 +470,7 @@ absl::StatusOr<FILE*> OpenFile(const std::string& path, const char* mode) {
#endif
if (!file) {
int err = errno;
return ErrnoToCanonicalStatus(
err, absl::StrFormat("Failed to open file '%s'", path));
return ErrnoToCanonicalStatus(err, "Failed to open file '%s'", path);
}
return file;
}
@@ -914,8 +913,7 @@ absl::Status GetStats(const std::string& path, Stats* stats) {
if (!result) {
int err = errno;
*stats = Stats();
return ErrnoToCanonicalStatus(err,
absl::StrFormat("Failed to stat '%s'", path));
return ErrnoToCanonicalStatus(err, "Failed to stat '%s'", path);
}
stats->mode = os_stats.st_mode;
@@ -973,14 +971,9 @@ absl::Status CreateSymlink(const std::string& target,
std::filesystem::create_directory_symlink(target_u8, link_path_u8,
error_code);
}
if (error_code) {
assert(error_code.category() == std::system_category());
return ErrnoToCanonicalStatus(
error_code.value(),
absl::StrFormat("Failed to create symlink '%s' with target '%s'",
link_path, target));
}
return absl::OkStatus();
return ErrorCodeToCanonicalStatus(
error_code, "Failed to create symlink '%s' with target '%s'", link_path,
target);
}
absl::StatusOr<std::string> GetSymlinkTarget(const std::string& link_path) {
@@ -989,9 +982,8 @@ absl::StatusOr<std::string> GetSymlinkTarget(const std::string& link_path) {
std::filesystem::path symlink_target =
std::filesystem::read_symlink(link_path_u8, error_code);
if (error_code) {
return ErrnoToCanonicalStatus(
error_code.value(),
absl::StrFormat("Failed to read symlink '%s'", link_path));
return ErrorCodeToCanonicalStatus(error_code, "Failed to read symlink '%s'",
link_path);
}
return symlink_target.u8string();
}
@@ -1014,26 +1006,16 @@ bool Exists(const std::string& path) {
absl::Status CreateDir(const std::string& path) {
std::error_code error_code;
std::filesystem::create_directory(std::filesystem::u8path(path), error_code);
if (error_code) {
assert(error_code.category() == std::system_category());
return ErrnoToCanonicalStatus(
error_code.value(),
absl::StrFormat("Failed to create directory '%s'", path));
}
return absl::OkStatus();
return ErrorCodeToCanonicalStatus(error_code,
"Failed to create directory '%s'", path);
}
absl::Status CreateDirRec(const std::string& path) {
std::error_code error_code;
std::filesystem::create_directories(std::filesystem::u8path(path),
error_code);
if (error_code) {
assert(error_code.category() == std::system_category());
return ErrnoToCanonicalStatus(
error_code.value(),
absl::StrFormat("Failed to create directory '%s'", path));
}
return absl::OkStatus();
return ErrorCodeToCanonicalStatus(error_code,
"Failed to create directory '%s'", path);
}
absl::Status RenameFile(const std::string& from_path,