minor code corrections (#1430)
use compact span cast. extend split_path api with only_first_part flag. use single loadlibrary and getprocaddress for IP helper
This commit is contained in:
parent
192ef4962b
commit
1ec5c69dcd
|
@ -146,7 +146,8 @@ namespace libtorrent
|
||||||
TORRENT_EXTRA_EXPORT void hard_link(std::string const& file
|
TORRENT_EXTRA_EXPORT void hard_link(std::string const& file
|
||||||
, std::string const& link, error_code& ec);
|
, std::string const& link, error_code& ec);
|
||||||
|
|
||||||
TORRENT_EXTRA_EXPORT std::string split_path(std::string const& f);
|
TORRENT_EXTRA_EXPORT std::string split_path(std::string const& f
|
||||||
|
, bool only_first_part = false);
|
||||||
TORRENT_EXTRA_EXPORT char const* next_path_element(char const* p);
|
TORRENT_EXTRA_EXPORT char const* next_path_element(char const* p);
|
||||||
TORRENT_EXTRA_EXPORT std::string extension(std::string const& f);
|
TORRENT_EXTRA_EXPORT std::string extension(std::string const& f);
|
||||||
TORRENT_EXTRA_EXPORT std::string remove_extension(std::string const& f);
|
TORRENT_EXTRA_EXPORT std::string remove_extension(std::string const& f);
|
||||||
|
|
|
@ -173,6 +173,7 @@ namespace libtorrent
|
||||||
if (m_lock) m_lock->lock();
|
if (m_lock) m_lock->lock();
|
||||||
m_lock = rhs.m_lock;
|
m_lock = rhs.m_lock;
|
||||||
rhs.m_lock = nullptr;
|
rhs.m_lock = nullptr;
|
||||||
|
return *this;
|
||||||
}
|
}
|
||||||
private:
|
private:
|
||||||
Lock* m_lock;
|
Lock* m_lock;
|
||||||
|
|
106
src/enum_net.cpp
106
src/enum_net.cpp
|
@ -385,6 +385,41 @@ namespace libtorrent
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifdef TORRENT_WINDOWS
|
||||||
|
struct iphlpapi {
|
||||||
|
static constexpr char const* library_name = "iphlpapi.dll";
|
||||||
|
};
|
||||||
|
|
||||||
|
template <typename Library>
|
||||||
|
HMODULE get_library_handle()
|
||||||
|
{
|
||||||
|
static bool handle_checked = false;
|
||||||
|
static HMODULE handle = 0;
|
||||||
|
|
||||||
|
if (!handle_checked)
|
||||||
|
{
|
||||||
|
handle = LoadLibraryA(Library::library_name);
|
||||||
|
handle_checked = true;
|
||||||
|
}
|
||||||
|
return handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
template <typename Library, typename Signature>
|
||||||
|
Signature get_library_procedure(LPCSTR name)
|
||||||
|
{
|
||||||
|
static Signature proc = nullptr;
|
||||||
|
static bool failed_proc = false;
|
||||||
|
|
||||||
|
if ((proc == nullptr) && !failed_proc)
|
||||||
|
{
|
||||||
|
HMODULE const handle = get_library_handle<Library>();
|
||||||
|
if (handle) proc = (Signature)GetProcAddress(handle, name);
|
||||||
|
failed_proc = (proc == nullptr);
|
||||||
|
}
|
||||||
|
return proc;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
#if TORRENT_USE_GETIPFORWARDTABLE
|
#if TORRENT_USE_GETIPFORWARDTABLE
|
||||||
address build_netmask(int bits, int family)
|
address build_netmask(int bits, int family)
|
||||||
{
|
{
|
||||||
|
@ -590,22 +625,13 @@ namespace libtorrent
|
||||||
#elif TORRENT_USE_GETADAPTERSADDRESSES
|
#elif TORRENT_USE_GETADAPTERSADDRESSES
|
||||||
|
|
||||||
#if _WIN32_WINNT >= 0x0501
|
#if _WIN32_WINNT >= 0x0501
|
||||||
// Load Iphlpapi library
|
typedef ULONG (WINAPI *GetAdaptersAddresses_t)(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG);
|
||||||
HMODULE iphlp = LoadLibraryA("Iphlpapi.dll");
|
// Get GetAdaptersAddresses() pointer
|
||||||
if (iphlp)
|
auto GetAdaptersAddresses =
|
||||||
|
get_library_procedure<iphlpapi, GetAdaptersAddresses_t>("GetAdaptersAddresses");
|
||||||
|
|
||||||
|
if (GetAdaptersAddresses != nullptr)
|
||||||
{
|
{
|
||||||
// Get GetAdaptersAddresses() pointer
|
|
||||||
typedef ULONG (WINAPI *GetAdaptersAddresses_t)(ULONG,ULONG,PVOID,PIP_ADAPTER_ADDRESSES,PULONG);
|
|
||||||
GetAdaptersAddresses_t GetAdaptersAddresses = (GetAdaptersAddresses_t)GetProcAddress(
|
|
||||||
iphlp, "GetAdaptersAddresses");
|
|
||||||
|
|
||||||
if (GetAdaptersAddresses == nullptr)
|
|
||||||
{
|
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = error_code(boost::system::errc::not_supported, generic_category());
|
|
||||||
return std::vector<ip_interface>();
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG buf_size = 10000;
|
ULONG buf_size = 10000;
|
||||||
std::vector<char> buffer(buf_size);
|
std::vector<char> buffer(buf_size);
|
||||||
PIP_ADAPTER_ADDRESSES adapter_addresses
|
PIP_ADAPTER_ADDRESSES adapter_addresses
|
||||||
|
@ -622,7 +648,6 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
if (res != NO_ERROR)
|
if (res != NO_ERROR)
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = error_code(WSAGetLastError(), system_category());
|
ec = error_code(WSAGetLastError(), system_category());
|
||||||
return std::vector<ip_interface>();
|
return std::vector<ip_interface>();
|
||||||
}
|
}
|
||||||
|
@ -645,8 +670,6 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free memory
|
|
||||||
FreeLibrary(iphlp);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -915,20 +938,11 @@ namespace libtorrent
|
||||||
#elif TORRENT_USE_GETIPFORWARDTABLE
|
#elif TORRENT_USE_GETIPFORWARDTABLE
|
||||||
/*
|
/*
|
||||||
move this to enum_net_interfaces
|
move this to enum_net_interfaces
|
||||||
// Load Iphlpapi library
|
|
||||||
HMODULE iphlp = LoadLibraryA("Iphlpapi.dll");
|
|
||||||
if (!iphlp)
|
|
||||||
{
|
|
||||||
ec = boost::asio::error::operation_not_supported;
|
|
||||||
return std::vector<ip_route>();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get GetAdaptersInfo() pointer
|
// Get GetAdaptersInfo() pointer
|
||||||
typedef DWORD (WINAPI *GetAdaptersInfo_t)(PIP_ADAPTER_INFO, PULONG);
|
typedef DWORD (WINAPI *GetAdaptersInfo_t)(PIP_ADAPTER_INFO, PULONG);
|
||||||
GetAdaptersInfo_t GetAdaptersInfo = (GetAdaptersInfo_t)GetProcAddress(iphlp, "GetAdaptersInfo");
|
GetAdaptersInfo_t GetAdaptersInfo = get_library_procedure<iphlpapi, GetAdaptersInfo_t>("GetAdaptersInfo");
|
||||||
if (!GetAdaptersInfo)
|
if (GetAdaptersInfo == nullptr)
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = boost::asio::error::operation_not_supported;
|
ec = boost::asio::error::operation_not_supported;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
}
|
}
|
||||||
|
@ -937,7 +951,6 @@ namespace libtorrent
|
||||||
ULONG out_buf_size = 0;
|
ULONG out_buf_size = 0;
|
||||||
if (GetAdaptersInfo(adapter_info, &out_buf_size) != ERROR_BUFFER_OVERFLOW)
|
if (GetAdaptersInfo(adapter_info, &out_buf_size) != ERROR_BUFFER_OVERFLOW)
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = boost::asio::error::operation_not_supported;
|
ec = boost::asio::error::operation_not_supported;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
}
|
}
|
||||||
|
@ -945,7 +958,6 @@ namespace libtorrent
|
||||||
adapter_info = (IP_ADAPTER_INFO*)malloc(out_buf_size);
|
adapter_info = (IP_ADAPTER_INFO*)malloc(out_buf_size);
|
||||||
if (!adapter_info)
|
if (!adapter_info)
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = boost::asio::error::no_memory;
|
ec = boost::asio::error::no_memory;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
}
|
}
|
||||||
|
@ -973,20 +985,12 @@ namespace libtorrent
|
||||||
|
|
||||||
// Free memory
|
// Free memory
|
||||||
free(adapter_info);
|
free(adapter_info);
|
||||||
FreeLibrary(iphlp);
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Load Iphlpapi library
|
|
||||||
HMODULE iphlp = LoadLibraryA("Iphlpapi.dll");
|
|
||||||
if (!iphlp)
|
|
||||||
{
|
|
||||||
ec = boost::asio::error::operation_not_supported;
|
|
||||||
return std::vector<ip_route>();
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef DWORD (WINAPI *GetIfEntry_t)(PMIB_IFROW pIfRow);
|
typedef DWORD (WINAPI *GetIfEntry_t)(PMIB_IFROW pIfRow);
|
||||||
GetIfEntry_t GetIfEntry = (GetIfEntry_t)GetProcAddress(iphlp, "GetIfEntry");
|
auto GetIfEntry = get_library_procedure<iphlpapi, GetIfEntry_t>("GetIfEntry");
|
||||||
if (!GetIfEntry)
|
|
||||||
|
if (GetIfEntry == nullptr)
|
||||||
{
|
{
|
||||||
ec = boost::asio::error::operation_not_supported;
|
ec = boost::asio::error::operation_not_supported;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
|
@ -997,11 +1001,9 @@ namespace libtorrent
|
||||||
ADDRESS_FAMILY, PMIB_IPFORWARD_TABLE2*);
|
ADDRESS_FAMILY, PMIB_IPFORWARD_TABLE2*);
|
||||||
typedef void (WINAPI *FreeMibTable_t)(PVOID Memory);
|
typedef void (WINAPI *FreeMibTable_t)(PVOID Memory);
|
||||||
|
|
||||||
GetIpForwardTable2_t GetIpForwardTable2 = (GetIpForwardTable2_t)GetProcAddress(
|
auto GetIpForwardTable2 = get_library_procedure<iphlpapi, GetIpForwardTable2_t>("GetIpForwardTable2");
|
||||||
iphlp, "GetIpForwardTable2");
|
auto FreeMibTable = get_library_procedure<iphlpapi, FreeMibTable_t>("FreeMibTable");
|
||||||
FreeMibTable_t FreeMibTable = (FreeMibTable_t)GetProcAddress(
|
if (GetIpForwardTable2 != nullptr && FreeMibTable != nullptr)
|
||||||
iphlp, "FreeMibTable");
|
|
||||||
if (GetIpForwardTable2 && FreeMibTable)
|
|
||||||
{
|
{
|
||||||
MIB_IPFORWARD_TABLE2* routes = nullptr;
|
MIB_IPFORWARD_TABLE2* routes = nullptr;
|
||||||
int res = GetIpForwardTable2(AF_UNSPEC, &routes);
|
int res = GetIpForwardTable2(AF_UNSPEC, &routes);
|
||||||
|
@ -1026,7 +1028,6 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (routes) FreeMibTable(routes);
|
if (routes) FreeMibTable(routes);
|
||||||
FreeLibrary(iphlp);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -1034,11 +1035,9 @@ namespace libtorrent
|
||||||
// Get GetIpForwardTable() pointer
|
// Get GetIpForwardTable() pointer
|
||||||
typedef DWORD (WINAPI *GetIpForwardTable_t)(PMIB_IPFORWARDTABLE pIpForwardTable,PULONG pdwSize,BOOL bOrder);
|
typedef DWORD (WINAPI *GetIpForwardTable_t)(PMIB_IPFORWARDTABLE pIpForwardTable,PULONG pdwSize,BOOL bOrder);
|
||||||
|
|
||||||
GetIpForwardTable_t GetIpForwardTable = (GetIpForwardTable_t)GetProcAddress(
|
auto GetIpForwardTable = get_library_procedure<iphlpapi, GetIpForwardTable_t>("GetIpForwardTable");
|
||||||
iphlp, "GetIpForwardTable");
|
if (GetIpForwardTable == nullptr)
|
||||||
if (!GetIpForwardTable)
|
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = boost::asio::error::operation_not_supported;
|
ec = boost::asio::error::operation_not_supported;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
}
|
}
|
||||||
|
@ -1047,7 +1046,6 @@ namespace libtorrent
|
||||||
ULONG out_buf_size = 0;
|
ULONG out_buf_size = 0;
|
||||||
if (GetIpForwardTable(routes, &out_buf_size, FALSE) != ERROR_INSUFFICIENT_BUFFER)
|
if (GetIpForwardTable(routes, &out_buf_size, FALSE) != ERROR_INSUFFICIENT_BUFFER)
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = boost::asio::error::operation_not_supported;
|
ec = boost::asio::error::operation_not_supported;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
}
|
}
|
||||||
|
@ -1055,7 +1053,6 @@ namespace libtorrent
|
||||||
routes = (MIB_IPFORWARDTABLE*)malloc(out_buf_size);
|
routes = (MIB_IPFORWARDTABLE*)malloc(out_buf_size);
|
||||||
if (!routes)
|
if (!routes)
|
||||||
{
|
{
|
||||||
FreeLibrary(iphlp);
|
|
||||||
ec = boost::asio::error::no_memory;
|
ec = boost::asio::error::no_memory;
|
||||||
return std::vector<ip_route>();
|
return std::vector<ip_route>();
|
||||||
}
|
}
|
||||||
|
@ -1082,7 +1079,6 @@ namespace libtorrent
|
||||||
|
|
||||||
// Free memory
|
// Free memory
|
||||||
free(routes);
|
free(routes);
|
||||||
FreeLibrary(iphlp);
|
|
||||||
#elif TORRENT_USE_NETLINK
|
#elif TORRENT_USE_NETLINK
|
||||||
enum { BUFSIZE = 8192 };
|
enum { BUFSIZE = 8192 };
|
||||||
|
|
||||||
|
|
|
@ -720,7 +720,7 @@ namespace libtorrent
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string split_path(std::string const& f)
|
std::string split_path(std::string const& f, bool only_first_part)
|
||||||
{
|
{
|
||||||
if (f.empty()) return f;
|
if (f.empty()) return f;
|
||||||
|
|
||||||
|
@ -738,11 +738,13 @@ namespace libtorrent
|
||||||
if (p - start > 0)
|
if (p - start > 0)
|
||||||
{
|
{
|
||||||
ret.append(start, p - start);
|
ret.append(start, p - start);
|
||||||
|
if (only_first_part) return ret;
|
||||||
ret.append(1, '\0');
|
ret.append(1, '\0');
|
||||||
}
|
}
|
||||||
if (*p != 0) ++p;
|
if (*p != 0) ++p;
|
||||||
start = p;
|
start = p;
|
||||||
}
|
}
|
||||||
|
if (only_first_part) return ret;
|
||||||
ret.append(1, '\0');
|
ret.append(1, '\0');
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
|
@ -563,7 +563,7 @@ namespace libtorrent
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (m_files.empty())
|
if (m_files.empty())
|
||||||
m_name = split_path(path).c_str();
|
m_name = split_path(path, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// this is poor-man's emplace_back()
|
// this is poor-man's emplace_back()
|
||||||
|
|
|
@ -834,8 +834,9 @@ namespace libtorrent
|
||||||
, storage_error& ec)
|
, storage_error& ec)
|
||||||
{
|
{
|
||||||
file_storage const& fs = files();
|
file_storage const& fs = files();
|
||||||
|
#ifdef TORRENT_DISABLE_MUTABLE_TORRENTS
|
||||||
#ifndef TORRENT_DISABLE_MUTABLE_TORRENTS
|
TORRENT_UNUSED(links);
|
||||||
|
#else
|
||||||
if (!links.empty())
|
if (!links.empty())
|
||||||
{
|
{
|
||||||
TORRENT_ASSERT(int(links.size()) == fs.num_files());
|
TORRENT_ASSERT(int(links.size()) == fs.num_files());
|
||||||
|
|
|
@ -161,7 +161,7 @@ namespace libtorrent
|
||||||
{
|
{
|
||||||
// UTP_LOGV("incoming packet size:%d\n", size);
|
// UTP_LOGV("incoming packet size:%d\n", size);
|
||||||
|
|
||||||
if (p.size() < int(sizeof(utp_header))) return false;
|
if (p.size() < sizeof(utp_header)) return false;
|
||||||
|
|
||||||
utp_header const* ph = reinterpret_cast<utp_header const*>(p.data());
|
utp_header const* ph = reinterpret_cast<utp_header const*>(p.data());
|
||||||
|
|
||||||
|
|
|
@ -712,8 +712,7 @@ bool utp_incoming_packet(utp_socket_impl* s
|
||||||
, span<char const> p
|
, span<char const> p
|
||||||
, udp::endpoint const& ep, time_point receive_time)
|
, udp::endpoint const& ep, time_point receive_time)
|
||||||
{
|
{
|
||||||
return s->incoming_packet(
|
return s->incoming_packet({reinterpret_cast<std::uint8_t const*>(p.data()), p.size()}
|
||||||
span<std::uint8_t const>(reinterpret_cast<std::uint8_t const*>(p.data()), int(p.size()))
|
|
||||||
, ep, receive_time);
|
, ep, receive_time);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue