forked from premiere/premiere-libtorrent
canonicalize paths when using UNC paths
This commit is contained in:
parent
c80e156120
commit
1c60ae4064
|
@ -140,6 +140,9 @@ namespace libtorrent
|
||||||
TORRENT_EXPORT std::string complete(std::string const& f);
|
TORRENT_EXPORT std::string complete(std::string const& f);
|
||||||
TORRENT_EXPORT bool is_complete(std::string const& f);
|
TORRENT_EXPORT bool is_complete(std::string const& f);
|
||||||
TORRENT_EXPORT std::string current_working_directory();
|
TORRENT_EXPORT std::string current_working_directory();
|
||||||
|
#if TORRENT_USE_UNC_PATHS
|
||||||
|
TORRENT_EXTRA_EXPORT std::string canonicalize_path(std::string const& f);
|
||||||
|
#endif
|
||||||
|
|
||||||
class TORRENT_EXPORT directory : public boost::noncopyable
|
class TORRENT_EXPORT directory : public boost::noncopyable
|
||||||
{
|
{
|
||||||
|
|
|
@ -167,6 +167,9 @@ namespace libtorrent
|
||||||
file_pool fp;
|
file_pool fp;
|
||||||
std::string utf8;
|
std::string utf8;
|
||||||
wchar_utf8(p, utf8);
|
wchar_utf8(p, utf8);
|
||||||
|
#if TORRENT_USE_UNC_PATHS
|
||||||
|
p = canonicalize_path(p);
|
||||||
|
#endif
|
||||||
boost::scoped_ptr<storage_interface> st(
|
boost::scoped_ptr<storage_interface> st(
|
||||||
default_storage_constructor(const_cast<file_storage&>(t.files()), 0, utf8, fp
|
default_storage_constructor(const_cast<file_storage&>(t.files()), 0, utf8, fp
|
||||||
, std::vector<boost::uint8_t>()));
|
, std::vector<boost::uint8_t>()));
|
||||||
|
@ -195,6 +198,9 @@ namespace libtorrent
|
||||||
, boost::function<void(int)> f, error_code& ec)
|
, boost::function<void(int)> f, error_code& ec)
|
||||||
{
|
{
|
||||||
file_pool fp;
|
file_pool fp;
|
||||||
|
#if TORRENT_USE_UNC_PATHS
|
||||||
|
p = canonicalize_path(p);
|
||||||
|
#endif
|
||||||
boost::scoped_ptr<storage_interface> st(
|
boost::scoped_ptr<storage_interface> st(
|
||||||
default_storage_constructor(const_cast<file_storage&>(t.files()), 0, p, fp
|
default_storage_constructor(const_cast<file_storage&>(t.files()), 0, p, fp
|
||||||
, std::vector<boost::uint8_t>()));
|
, std::vector<boost::uint8_t>()));
|
||||||
|
|
69
src/file.cpp
69
src/file.cpp
|
@ -536,6 +536,69 @@ namespace libtorrent
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if TORRENT_USE_UNC_PATHS
|
||||||
|
std::string canonicalize_path(std::string const& f)
|
||||||
|
{
|
||||||
|
std::string ret;
|
||||||
|
ret.resize(f.size());
|
||||||
|
char* write_cur = &ret[0];
|
||||||
|
char* last_write_sep = write_cur;
|
||||||
|
|
||||||
|
char const* read_cur = f.c_str();
|
||||||
|
char const* last_read_sep = read_cur;
|
||||||
|
|
||||||
|
// the last_*_sep pointers point to one past
|
||||||
|
// the last path separator encountered and is
|
||||||
|
// initializes to the first character in the path
|
||||||
|
while (*read_cur)
|
||||||
|
{
|
||||||
|
if (*read_cur != '\\')
|
||||||
|
{
|
||||||
|
*write_cur++ = *read_cur++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int element_len = read_cur - last_read_sep;
|
||||||
|
if (element_len == 1 && memcmp(last_read_sep, ".", 1) == 0)
|
||||||
|
{
|
||||||
|
--write_cur;
|
||||||
|
++read_cur;
|
||||||
|
last_read_sep = read_cur;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (element_len == 2 && memcmp(last_read_sep, "..", 2) == 0)
|
||||||
|
{
|
||||||
|
// find the previous path separator
|
||||||
|
if (last_write_sep > &ret[0])
|
||||||
|
{
|
||||||
|
--last_write_sep;
|
||||||
|
while (last_write_sep > &ret[0]
|
||||||
|
&& last_write_sep[-1] != '\\')
|
||||||
|
--last_write_sep;
|
||||||
|
}
|
||||||
|
write_cur = last_write_sep;
|
||||||
|
// find the previous path separator
|
||||||
|
if (last_write_sep > &ret[0])
|
||||||
|
{
|
||||||
|
--last_write_sep;
|
||||||
|
while (last_write_sep > &ret[0]
|
||||||
|
&& last_write_sep[-1] != '\\')
|
||||||
|
--last_write_sep;
|
||||||
|
}
|
||||||
|
++read_cur;
|
||||||
|
last_read_sep = read_cur;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*write_cur++ = *read_cur++;
|
||||||
|
last_write_sep = write_cur;
|
||||||
|
last_read_sep = read_cur;
|
||||||
|
}
|
||||||
|
// terminate destination string
|
||||||
|
*write_cur = 0;
|
||||||
|
ret.resize(write_cur - &ret[0]);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
size_type file_size(std::string const& f)
|
size_type file_size(std::string const& f)
|
||||||
{
|
{
|
||||||
error_code ec;
|
error_code ec;
|
||||||
|
@ -811,14 +874,12 @@ namespace libtorrent
|
||||||
FILE_SHARE_READ,
|
FILE_SHARE_READ,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
std::string p = convert_separators(path);
|
||||||
#if TORRENT_USE_UNC_PATHS
|
#if TORRENT_USE_UNC_PATHS
|
||||||
// UNC paths must be absolute
|
// UNC paths must be absolute
|
||||||
std::string p = convert_separators(path);
|
// network paths are already UNC paths
|
||||||
// network paths are not supported by UNC paths
|
|
||||||
if (path.substr(0,2) == "\\\\") p = path;
|
if (path.substr(0,2) == "\\\\") p = path;
|
||||||
else p = "\\\\?\\" + (is_complete(p) ? p : combine_path(current_working_directory(), p));
|
else p = "\\\\?\\" + (is_complete(p) ? p : combine_path(current_working_directory(), p));
|
||||||
#else
|
|
||||||
std::string p = convert_separators(path);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if TORRENT_USE_WSTRING
|
#if TORRENT_USE_WSTRING
|
||||||
|
|
|
@ -433,6 +433,10 @@ namespace libtorrent
|
||||||
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
#if defined TORRENT_DEBUG || TORRENT_RELEASE_ASSERTS
|
||||||
m_resume_data_loaded = false;
|
m_resume_data_loaded = false;
|
||||||
#endif
|
#endif
|
||||||
|
#if TORRENT_USE_UNC_PATHS
|
||||||
|
m_save_path = canonicalize_path(m_save_path);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!m_apply_ip_filter) ++m_ses.m_non_filtered_torrents;
|
if (!m_apply_ip_filter) ++m_ses.m_non_filtered_torrents;
|
||||||
|
|
||||||
if (!p.ti || !p.ti->is_valid())
|
if (!p.ti || !p.ti->is_valid())
|
||||||
|
|
|
@ -871,6 +871,15 @@ int test_main()
|
||||||
TEST_EQUAL(combine_path("test1", "test2"), "test1/test2");
|
TEST_EQUAL(combine_path("test1", "test2"), "test1/test2");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if TORRENT_USE_UNC_PATHS
|
||||||
|
TEST_EQUAL(canonicalize_path("c:\\a\\..\\b"), "c:\\b");
|
||||||
|
TEST_EQUAL(canonicalize_path("a\\..\\b"), "b");
|
||||||
|
TEST_EQUAL(canonicalize_path("a\\..\\.\\b"), "b");
|
||||||
|
TEST_EQUAL(canonicalize_path("\\.\\a"), "\\a");
|
||||||
|
TEST_EQUAL(canonicalize_path("\\\\bla\\.\\a"), "\\\\bla\\a");
|
||||||
|
TEST_EQUAL(canonicalize_path("c:\\bla\\a"), "c:\\bla\\a");
|
||||||
|
#endif
|
||||||
|
|
||||||
TEST_EQUAL(extension("blah"), "");
|
TEST_EQUAL(extension("blah"), "");
|
||||||
TEST_EQUAL(extension("blah.exe"), ".exe");
|
TEST_EQUAL(extension("blah.exe"), ".exe");
|
||||||
TEST_EQUAL(extension("blah.foo.bar"), ".bar");
|
TEST_EQUAL(extension("blah.foo.bar"), ".bar");
|
||||||
|
|
Loading…
Reference in New Issue