From: Montandalar Date: Sat, 11 Jan 2020 19:47:34 +0000 (+1100) Subject: Map download: Escape ':' to '_' (#9235) X-Git-Tag: 5.2.0~233 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=8d75c118d99b3ccf383ceb3b7bbc9b84a1d837b2;p=oweals%2Fminetest.git Map download: Escape ':' to '_' (#9235) This is necessary under Windows systems, and direct IPv6 connections. Windows universally disallows ':' from occuring in filenames. Other disallowed characters on Windows: \ / * ? " < > | are not relevant to hostnames, IPv4 or IPv6 addresses. Anyone who has got an existing server map saved on Linux with ':' in the world save will want to keep that save. --- diff --git a/src/client/client.cpp b/src/client/client.cpp index 315fcd410..94b483802 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -782,11 +782,20 @@ void Client::initLocalMapSaving(const Address &address, return; } - const std::string world_path = porting::path_user - + DIR_DELIM + "worlds" - + DIR_DELIM + "server_" + std::string world_path; +#define set_world_path(hostname) \ + world_path = porting::path_user \ + + DIR_DELIM + "worlds" \ + + DIR_DELIM + "server_" \ + hostname + "_" + std::to_string(address.getPort()); + set_world_path(hostname); + if (!fs::IsDir(world_path)) { + std::string hostname_escaped = hostname; + str_replace(hostname_escaped, ':', '_'); + set_world_path(hostname_escaped); + } +#undef set_world_path fs::CreateAllDirs(world_path); m_localdb = new MapDatabaseSQLite3(world_path);