utils: Convert Windows args to utf-8 string
This commit is contained in:
parent
9b8bb5f140
commit
380c843217
6 changed files with 62 additions and 1 deletions
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <tuple>
|
||||||
|
|
||||||
#include <event2/buffer.h>
|
#include <event2/buffer.h>
|
||||||
#include <event2/keyvalq_struct.h>
|
#include <event2/keyvalq_struct.h>
|
||||||
|
@ -511,6 +512,10 @@ static int CommandLineRPC(int argc, char *argv[])
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
util::WinCmdLineArgs winArgs;
|
||||||
|
std::tie(argc, argv) = winArgs.get();
|
||||||
|
#endif
|
||||||
SetupEnvironment();
|
SetupEnvironment();
|
||||||
if (!SetupNetworking()) {
|
if (!SetupNetworking()) {
|
||||||
fprintf(stderr, "Error: Initializing networking failed\n");
|
fprintf(stderr, "Error: Initializing networking failed\n");
|
||||||
|
|
|
@ -185,6 +185,10 @@ static bool AppInit(int argc, char* argv[])
|
||||||
|
|
||||||
int main(int argc, char* argv[])
|
int main(int argc, char* argv[])
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
util::WinCmdLineArgs winArgs;
|
||||||
|
std::tie(argc, argv) = winArgs.get();
|
||||||
|
#endif
|
||||||
SetupEnvironment();
|
SetupEnvironment();
|
||||||
|
|
||||||
// Connect bitcoind signal handlers
|
// Connect bitcoind signal handlers
|
||||||
|
|
|
@ -552,6 +552,10 @@ static void SetupUIArgs()
|
||||||
#ifndef BITCOIN_QT_TEST
|
#ifndef BITCOIN_QT_TEST
|
||||||
int main(int argc, char *argv[])
|
int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
|
#ifdef WIN32
|
||||||
|
util::WinCmdLineArgs winArgs;
|
||||||
|
std::tie(argc, argv) = winArgs.get();
|
||||||
|
#endif
|
||||||
SetupEnvironment();
|
SetupEnvironment();
|
||||||
|
|
||||||
std::unique_ptr<interfaces::Node> node = interfaces::MakeNode();
|
std::unique_ptr<interfaces::Node> node = interfaces::MakeNode();
|
||||||
|
|
32
src/util.cpp
32
src/util.cpp
|
@ -61,6 +61,7 @@
|
||||||
#include <codecvt>
|
#include <codecvt>
|
||||||
|
|
||||||
#include <io.h> /* for _commit */
|
#include <io.h> /* for _commit */
|
||||||
|
#include <shellapi.h>
|
||||||
#include <shlobj.h>
|
#include <shlobj.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1200,6 +1201,10 @@ void SetupEnvironment()
|
||||||
} catch (const std::runtime_error&) {
|
} catch (const std::runtime_error&) {
|
||||||
setenv("LC_ALL", "C", 1);
|
setenv("LC_ALL", "C", 1);
|
||||||
}
|
}
|
||||||
|
#elif defined(WIN32)
|
||||||
|
// Set the default input/output charset is utf-8
|
||||||
|
SetConsoleCP(CP_UTF8);
|
||||||
|
SetConsoleOutputCP(CP_UTF8);
|
||||||
#endif
|
#endif
|
||||||
// The path locale is lazy initialized and to avoid deinitialization errors
|
// The path locale is lazy initialized and to avoid deinitialization errors
|
||||||
// in multithreading environments, it is set explicitly by the main thread.
|
// in multithreading environments, it is set explicitly by the main thread.
|
||||||
|
@ -1265,3 +1270,30 @@ int ScheduleBatchPriority()
|
||||||
return 1;
|
return 1;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace util {
|
||||||
|
#ifdef WIN32
|
||||||
|
WinCmdLineArgs::WinCmdLineArgs()
|
||||||
|
{
|
||||||
|
wchar_t** wargv = CommandLineToArgvW(GetCommandLineW(), &argc);
|
||||||
|
std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> utf8_cvt;
|
||||||
|
argv = new char*[argc];
|
||||||
|
args.resize(argc);
|
||||||
|
for (int i = 0; i < argc; i++) {
|
||||||
|
args[i] = utf8_cvt.to_bytes(wargv[i]);
|
||||||
|
argv[i] = &*args[i].begin();
|
||||||
|
}
|
||||||
|
LocalFree(wargv);
|
||||||
|
}
|
||||||
|
|
||||||
|
WinCmdLineArgs::~WinCmdLineArgs()
|
||||||
|
{
|
||||||
|
delete[] argv;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::pair<int, char**> WinCmdLineArgs::get()
|
||||||
|
{
|
||||||
|
return std::make_pair(argc, argv);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
} // namespace util
|
||||||
|
|
16
src/util.h
16
src/util.h
|
@ -29,6 +29,7 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_set>
|
#include <unordered_set>
|
||||||
|
#include <utility>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include <boost/thread/condition_variable.hpp> // for boost::thread_interrupted
|
#include <boost/thread/condition_variable.hpp> // for boost::thread_interrupted
|
||||||
|
@ -361,6 +362,21 @@ inline void insert(std::set<TsetT>& dst, const Tsrc& src) {
|
||||||
dst.insert(src.begin(), src.end());
|
dst.insert(src.begin(), src.end());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef WIN32
|
||||||
|
class WinCmdLineArgs
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
WinCmdLineArgs();
|
||||||
|
~WinCmdLineArgs();
|
||||||
|
std::pair<int, char**> get();
|
||||||
|
|
||||||
|
private:
|
||||||
|
int argc;
|
||||||
|
char** argv;
|
||||||
|
std::vector<std::string> args;
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
} // namespace util
|
} // namespace util
|
||||||
|
|
||||||
#endif // BITCOIN_UTIL_H
|
#endif // BITCOIN_UTIL_H
|
||||||
|
|
|
@ -31,7 +31,7 @@ class UacommentTest(BitcoinTestFramework):
|
||||||
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + 'a' * 256], expected, match=ErrorMatch.FULL_REGEX)
|
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + 'a' * 256], expected, match=ErrorMatch.FULL_REGEX)
|
||||||
|
|
||||||
self.log.info("test -uacomment unsafe characters")
|
self.log.info("test -uacomment unsafe characters")
|
||||||
for unsafe_char in ['/', ':', '(', ')']:
|
for unsafe_char in ['/', ':', '(', ')', '₿', '🏃']:
|
||||||
expected = "Error: User Agent comment \(" + re.escape(unsafe_char) + "\) contains unsafe characters."
|
expected = "Error: User Agent comment \(" + re.escape(unsafe_char) + "\) contains unsafe characters."
|
||||||
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + unsafe_char], expected, match=ErrorMatch.FULL_REGEX)
|
self.nodes[0].assert_start_raises_init_error(["-uacomment=" + unsafe_char], expected, match=ErrorMatch.FULL_REGEX)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue