Better Unicode argument handling in FUSE driver on Windows

This commit is contained in:
Marcus Holland-Moritz 2023-07-11 01:23:12 +02:00
parent caba64040c
commit 859195c24e
4 changed files with 23 additions and 35 deletions

View File

@ -35,6 +35,6 @@ int mkdwarfs_main(int argc, sys_char** argv);
int dwarfsck_main(int argc, sys_char** argv);
int dwarfsextract_main(int argc, sys_char** argv);
int dwarfsbench_main(int argc, sys_char** argv);
int dwarfs_main(int argc, char** argv);
int dwarfs_main(int argc, sys_char** argv);
} // namespace dwarfs

View File

@ -22,6 +22,6 @@
#include "dwarfs/error.h"
#include "dwarfs_tool_main.h"
int main(int argc, char** argv) {
int SYS_MAIN(int argc, dwarfs::sys_char** argv) {
return dwarfs::safe_main([&] { return dwarfs::dwarfs_main(argc, argv); });
}

View File

@ -993,7 +993,8 @@ int option_hdl(void* data, char const* arg, int key,
return 1;
}
opts->fsimage = std::filesystem::canonical(std::filesystem::path(arg));
opts->fsimage = std::filesystem::canonical(
std::filesystem::path(reinterpret_cast<char8_t const*>(arg)));
return 0;
@ -1203,8 +1204,23 @@ void load_filesystem(dwarfs_userdata& userdata) {
ti << "file system initialized";
}
int dwarfs_main(int argc, char** argv) {
int dwarfs_main(int argc, sys_char** argv) {
#ifdef _WIN32
std::vector<std::string> argv_strings;
std::vector<char*> argv_copy;
argv_strings.reserve(argc);
argv_copy.reserve(argc);
for (int i = 0; i < argc; ++i) {
argv_strings.push_back(sys_string_to_string(argv[i]));
argv_copy.push_back(argv_strings.back().data());
}
struct fuse_args args = FUSE_ARGS_INIT(argc, argv_copy.data());
#else
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
#endif
dwarfs_userdata userdata(std::cerr);
auto& opts = userdata.opts;

View File

@ -29,6 +29,7 @@
#include <folly/String.h>
#include <folly/gen/String.h>
#include <folly/portability/Windows.h>
#ifdef _WIN32
#include <delayimp.h>
@ -36,24 +37,13 @@
#include "dwarfs/error.h"
#include "dwarfs/tool.h"
#include "dwarfs/util.h"
#include "dwarfs_tool_main.h"
namespace {
using namespace dwarfs;
std::string to_narrow_string(sys_char const* str) {
#ifdef _WIN32
std::wstring_view view(str);
std::string rv(view.size(), 0);
std::transform(view.begin(), view.end(), rv.begin(),
[](sys_char c) { return static_cast<char>(c); });
return rv;
#else
return std::string(str);
#endif
}
#ifdef _WIN32
FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
switch (dliNotify) {
@ -71,20 +61,6 @@ FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
::exit(1);
}
int dwarfs_main_helper(int argc, sys_char** argv) {
std::vector<std::string> argv_strings;
std::vector<char*> argv_copy;
argv_strings.reserve(argc);
argv_copy.reserve(argc);
for (int i = 0; i < argc; ++i) {
argv_strings.push_back(to_narrow_string(argv[i]));
argv_copy.push_back(argv_strings.back().data());
}
return dwarfs_main(argc, argv_copy.data());
}
#endif
#ifdef _WIN32
@ -94,11 +70,7 @@ int dwarfs_main_helper(int argc, sys_char** argv) {
#endif
std::map<std::string_view, int (*)(int, sys_char**)> const functions{
#ifdef _WIN32
{"dwarfs", &dwarfs_main_helper},
#else
{"dwarfs", &dwarfs_main},
#endif
{"mkdwarfs", &mkdwarfs_main},
{"dwarfsck", &dwarfsck_main},
{"dwarfsextract", &dwarfsextract_main},
@ -113,7 +85,7 @@ extern "C" const PfnDliHook __pfnDliFailureHook2 = delay_hook;
int SYS_MAIN(int argc, sys_char** argv) {
if (argc > 1) {
auto tool_arg = to_narrow_string(argv[1]);
auto tool_arg = sys_string_to_string(argv[1]);
if (tool_arg.starts_with("--tool=")) {
if (auto it = functions.find(tool_arg.substr(7)); it != functions.end()) {
std::vector<sys_char*> argv_copy;