From 5a17c877a37519cde216603a181e5e14db1ec529 Mon Sep 17 00:00:00 2001 From: Marcus Holland-Moritz Date: Mon, 26 Jun 2023 00:39:20 +0200 Subject: [PATCH] More moving from std::string to fs::path --- src/dwarfs/block_manager.cpp | 2 +- src/dwarfs/entry.cpp | 2 +- src/dwarfs/file_scanner.cpp | 4 ++-- src/dwarfs/mmap.cpp | 22 +++++++++++++--------- src/dwarfs/os_access_generic.cpp | 16 +++++++++++----- src/dwarfs/scanner.cpp | 2 +- test/test_helpers.cpp | 7 +++++-- 7 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/dwarfs/block_manager.cpp b/src/dwarfs/block_manager.cpp index 12e8c9e2..285836a9 100644 --- a/src/dwarfs/block_manager.cpp +++ b/src/dwarfs/block_manager.cpp @@ -459,7 +459,7 @@ void block_manager_::add_inode(std::shared_ptr ino) { auto e = ino->any(); if (size_t size = e->size(); size > 0) { - auto mm = os_->map_file(e->path(), size); + auto mm = os_->map_file(e->fs_path(), size); LOG_TRACE << "adding inode " << ino->num() << " [" << ino->any()->name() << "] - size: " << size; diff --git a/src/dwarfs/entry.cpp b/src/dwarfs/entry.cpp index 8226ed7a..81d29ab8 100644 --- a/src/dwarfs/entry.cpp +++ b/src/dwarfs/entry.cpp @@ -384,7 +384,7 @@ const std::string& link::linkname() const { return link_; } void link::accept(entry_visitor& v, bool) { v.visit(this); } void link::scan(os_access& os, progress& prog) { - link_ = os.read_symlink(path()); + link_ = u8string_to_string(os.read_symlink(path()).u8string()); prog.original_size += size(); prog.symlink_size += size(); } diff --git a/src/dwarfs/file_scanner.cpp b/src/dwarfs/file_scanner.cpp index 11e3c651..9e67de5e 100644 --- a/src/dwarfs/file_scanner.cpp +++ b/src/dwarfs/file_scanner.cpp @@ -294,7 +294,7 @@ void file_scanner_::hash_file(file* p) { std::shared_ptr mm; if (size > 0) { - mm = os_.map_file(p->path(), size); + mm = os_.map_file(p->fs_path(), size); } prog_.current.store(p); @@ -313,7 +313,7 @@ void file_scanner_::add_inode(file* p) { std::shared_ptr mm; auto const size = p->size(); if (size > 0) { - mm = os_.map_file(p->path(), size); + mm = os_.map_file(p->fs_path(), size); } inode->scan(mm, ino_opts_); ++prog_.similarity_scans; diff --git a/src/dwarfs/mmap.cpp b/src/dwarfs/mmap.cpp index 8b51d01b..e1e1f1d9 100644 --- a/src/dwarfs/mmap.cpp +++ b/src/dwarfs/mmap.cpp @@ -29,6 +29,8 @@ #include #endif +#include + #include "dwarfs/error.h" #include "dwarfs/mmap.h" @@ -111,21 +113,23 @@ void const* mmap::addr() const { return mf_.const_data(); } size_t mmap::size() const { return mf_.size(); } mmap::mmap(std::string const& path) - : mf_(path, boost::iostreams::mapped_file::readonly) - , page_size_(get_page_size()) { - assert(mf_.is_open()); -} + : mmap(std::filesystem::path(path)) {} mmap::mmap(std::filesystem::path const& path) - : mmap(path.string()) {} - -mmap::mmap(std::string const& path, size_t size) - : mf_(path, boost::iostreams::mapped_file::readonly, size) + : mf_(boost::filesystem::path(path.wstring()), + boost::iostreams::mapped_file::readonly) , page_size_(get_page_size()) { assert(mf_.is_open()); } +mmap::mmap(std::string const& path, size_t size) + : mmap(std::filesystem::path(path), size) {} + mmap::mmap(std::filesystem::path const& path, size_t size) - : mmap(path.string(), size) {} + : mf_(boost::filesystem::path(path.wstring()), + boost::iostreams::mapped_file::readonly, size) + , page_size_(get_page_size()) { + assert(mf_.is_open()); +} } // namespace dwarfs diff --git a/src/dwarfs/os_access_generic.cpp b/src/dwarfs/os_access_generic.cpp index 43f4d56e..0d8bdc7a 100644 --- a/src/dwarfs/os_access_generic.cpp +++ b/src/dwarfs/os_access_generic.cpp @@ -66,12 +66,14 @@ file_stat make_file_stat(fs::path const& path) { rv.blksize = 0; rv.blocks = 0; + auto wps = path.wstring(); + if (status.type() == fs::file_type::symlink) { ::WIN32_FILE_ATTRIBUTE_DATA info; - if (::GetFileAttributesExA(path.c_str(), GetFileExInfoStandard, &info) == + if (::GetFileAttributesExW(wps.c_str(), GetFileExInfoStandard, &info) == 0) { throw std::system_error(::GetLastError(), std::system_category(), - "GetFileAttributesExA"); + "GetFileAttributesExW"); } rv.dev = 0; rv.ino = 0; @@ -86,7 +88,7 @@ file_stat make_file_stat(fs::path const& path) { rv.ctime = time_from_filetime(info.ftCreationTime); } else { struct ::__stat64 st; - if (::_stat64(path.c_str(), &st) != 0) { + if (::_wstat64(wps.c_str(), &st) != 0) { throw std::system_error(errno, std::generic_category(), "_stat64"); } rv.dev = st.st_dev; @@ -109,7 +111,7 @@ file_stat make_file_stat(fs::path const& path) { file_stat make_file_stat(fs::path const& path) { struct ::stat st; - if (::lstat(path.c_str(), &st) != 0) { + if (::lstat(path.string().c_str(), &st) != 0) { throw std::system_error(errno, std::generic_category(), "lstat"); } @@ -173,7 +175,11 @@ os_access_generic::map_file(fs::path const& path, size_t size) const { } int os_access_generic::access(fs::path const& path, int mode) const { - return ::access(path.c_str(), mode); +#ifdef _WIN32 + return ::_waccess(path.wstring().c_str(), mode); +#else + return ::access(path.string().c_str(), mode); +#endif } } // namespace dwarfs diff --git a/src/dwarfs/scanner.cpp b/src/dwarfs/scanner.cpp index 231da396..16d1e6b9 100644 --- a/src/dwarfs/scanner.cpp +++ b/src/dwarfs/scanner.cpp @@ -457,7 +457,7 @@ scanner_::scan_tree(std::filesystem::path const& path, DWARFS_CHECK(parent, "expected directory"); queue.pop_front(); - const std::string& path = parent->path(); + auto path = parent->fs_path(); try { auto d = os_->opendir(path); diff --git a/test/test_helpers.cpp b/test/test_helpers.cpp index a92b4de0..82a9b8d3 100644 --- a/test/test_helpers.cpp +++ b/test/test_helpers.cpp @@ -31,6 +31,7 @@ #include #include "dwarfs/overloaded.h" +#include "dwarfs/util.h" #include "loremipsum.h" #include "mmap_mock.h" #include "test_helpers.h" @@ -287,8 +288,10 @@ size_t os_access_mock::size() const { return root_ ? root_->size() : 0; } std::vector os_access_mock::splitpath(fs::path const& path) { std::vector parts; - folly::split('/', path.string(), parts); - while (!parts.empty() && parts.front().empty()) { + for (auto const& p : path) { + parts.emplace_back(u8string_to_string(p.u8string())); + } + while (!parts.empty() && (parts.front().empty() || parts.front() == "/")) { parts.erase(parts.begin()); } return parts;