mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-17 16:31:27 -04:00
Better Unicode argument handling in FUSE driver on Windows
This commit is contained in:
parent
caba64040c
commit
859195c24e
@ -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
|
||||
|
@ -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); });
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user