mirror of
https://github.com/mhx/dwarfs.git
synced 2025-09-19 01:07:00 -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 dwarfsck_main(int argc, sys_char** argv);
|
||||||
int dwarfsextract_main(int argc, sys_char** argv);
|
int dwarfsextract_main(int argc, sys_char** argv);
|
||||||
int dwarfsbench_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
|
} // namespace dwarfs
|
||||||
|
@ -22,6 +22,6 @@
|
|||||||
#include "dwarfs/error.h"
|
#include "dwarfs/error.h"
|
||||||
#include "dwarfs_tool_main.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); });
|
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;
|
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;
|
return 0;
|
||||||
|
|
||||||
@ -1203,8 +1204,23 @@ void load_filesystem(dwarfs_userdata& userdata) {
|
|||||||
ti << "file system initialized";
|
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);
|
struct fuse_args args = FUSE_ARGS_INIT(argc, argv);
|
||||||
|
#endif
|
||||||
|
|
||||||
dwarfs_userdata userdata(std::cerr);
|
dwarfs_userdata userdata(std::cerr);
|
||||||
auto& opts = userdata.opts;
|
auto& opts = userdata.opts;
|
||||||
|
|
||||||
|
@ -29,6 +29,7 @@
|
|||||||
|
|
||||||
#include <folly/String.h>
|
#include <folly/String.h>
|
||||||
#include <folly/gen/String.h>
|
#include <folly/gen/String.h>
|
||||||
|
#include <folly/portability/Windows.h>
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
#include <delayimp.h>
|
#include <delayimp.h>
|
||||||
@ -36,24 +37,13 @@
|
|||||||
|
|
||||||
#include "dwarfs/error.h"
|
#include "dwarfs/error.h"
|
||||||
#include "dwarfs/tool.h"
|
#include "dwarfs/tool.h"
|
||||||
|
#include "dwarfs/util.h"
|
||||||
#include "dwarfs_tool_main.h"
|
#include "dwarfs_tool_main.h"
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
using namespace dwarfs;
|
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
|
#ifdef _WIN32
|
||||||
FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
|
FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
|
||||||
switch (dliNotify) {
|
switch (dliNotify) {
|
||||||
@ -71,20 +61,6 @@ FARPROC WINAPI delay_hook(unsigned dliNotify, PDelayLoadInfo pdli) {
|
|||||||
|
|
||||||
::exit(1);
|
::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
|
#endif
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
@ -94,11 +70,7 @@ int dwarfs_main_helper(int argc, sys_char** argv) {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
std::map<std::string_view, int (*)(int, sys_char**)> const functions{
|
std::map<std::string_view, int (*)(int, sys_char**)> const functions{
|
||||||
#ifdef _WIN32
|
|
||||||
{"dwarfs", &dwarfs_main_helper},
|
|
||||||
#else
|
|
||||||
{"dwarfs", &dwarfs_main},
|
{"dwarfs", &dwarfs_main},
|
||||||
#endif
|
|
||||||
{"mkdwarfs", &mkdwarfs_main},
|
{"mkdwarfs", &mkdwarfs_main},
|
||||||
{"dwarfsck", &dwarfsck_main},
|
{"dwarfsck", &dwarfsck_main},
|
||||||
{"dwarfsextract", &dwarfsextract_main},
|
{"dwarfsextract", &dwarfsextract_main},
|
||||||
@ -113,7 +85,7 @@ extern "C" const PfnDliHook __pfnDliFailureHook2 = delay_hook;
|
|||||||
|
|
||||||
int SYS_MAIN(int argc, sys_char** argv) {
|
int SYS_MAIN(int argc, sys_char** argv) {
|
||||||
if (argc > 1) {
|
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 (tool_arg.starts_with("--tool=")) {
|
||||||
if (auto it = functions.find(tool_arg.substr(7)); it != functions.end()) {
|
if (auto it = functions.find(tool_arg.substr(7)); it != functions.end()) {
|
||||||
std::vector<sys_char*> argv_copy;
|
std::vector<sys_char*> argv_copy;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user