forked from premiere/premiere-libtorrent
refactored netlink based ip_notifier in a separated class
This commit is contained in:
parent
81d669399b
commit
266beaaab2
|
@ -48,8 +48,6 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
#include "libtorrent/aux_/disable_warnings_pop.hpp"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace std::placeholders;
|
|
||||||
|
|
||||||
namespace libtorrent { namespace aux
|
namespace libtorrent { namespace aux
|
||||||
{
|
{
|
||||||
namespace
|
namespace
|
||||||
|
@ -57,7 +55,49 @@ namespace
|
||||||
#if defined TORRENT_BUILD_SIMULATOR
|
#if defined TORRENT_BUILD_SIMULATOR
|
||||||
// TODO: ip_change_notifier_sim
|
// TODO: ip_change_notifier_sim
|
||||||
#elif TORRENT_USE_NETLINK
|
#elif TORRENT_USE_NETLINK
|
||||||
// TODO: ip_change_notifier_nl
|
struct ip_change_notifier_impl final : ip_change_notifier
|
||||||
|
{
|
||||||
|
explicit ip_change_notifier_impl(io_service& ios)
|
||||||
|
: m_socket(ios
|
||||||
|
, netlink::endpoint(netlink(NETLINK_ROUTE), RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR))
|
||||||
|
{}
|
||||||
|
|
||||||
|
// noncopyable
|
||||||
|
ip_change_notifier_impl(ip_change_notifier_impl const&) = delete;
|
||||||
|
ip_change_notifier_impl& operator=(ip_change_notifier_impl const&) = delete;
|
||||||
|
|
||||||
|
void async_wait(std::function<void(error_code const&)> cb) override
|
||||||
|
{
|
||||||
|
using namespace std::placeholders;
|
||||||
|
m_socket.async_receive(boost::asio::buffer(m_buf)
|
||||||
|
, std::bind(&ip_change_notifier_impl::on_notify, this, _1, _2, std::move(cb)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void cancel() override
|
||||||
|
{ m_socket.cancel();}
|
||||||
|
|
||||||
|
private:
|
||||||
|
netlink::socket m_socket;
|
||||||
|
std::array<char, 4096> m_buf;
|
||||||
|
|
||||||
|
void on_notify(error_code const& ec, std::size_t bytes_transferred
|
||||||
|
, std::function<void(error_code const&)> const& cb)
|
||||||
|
{
|
||||||
|
TORRENT_UNUSED(bytes_transferred);
|
||||||
|
|
||||||
|
// on linux we could parse the message to get information about the
|
||||||
|
// change but Windows requires the application to enumerate the
|
||||||
|
// interfaces after a notification so do that for Linux as well to
|
||||||
|
// minimize the difference between platforms
|
||||||
|
|
||||||
|
// Linux can generate ENOBUFS if the socket's buffers are full
|
||||||
|
// don't treat it as an error
|
||||||
|
if (ec.value() == boost::system::errc::no_buffer_space)
|
||||||
|
cb(error_code());
|
||||||
|
else
|
||||||
|
cb(ec);
|
||||||
|
}
|
||||||
|
};
|
||||||
#elif TORRENT_USE_SYSTEMCONFIGURATION
|
#elif TORRENT_USE_SYSTEMCONFIGURATION
|
||||||
|
|
||||||
template <typename T> void CFRefRetain(T h) { CFRetain(h); }
|
template <typename T> void CFRefRetain(T h) { CFRetain(h); }
|
||||||
|
@ -277,7 +317,7 @@ private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO: to remove when separated per platform
|
// TODO: to remove when separated per platform
|
||||||
#if defined TORRENT_BUILD_SIMULATOR || TORRENT_USE_NETLINK || defined TORRENT_WINDOWS
|
#if defined TORRENT_BUILD_SIMULATOR || defined TORRENT_WINDOWS
|
||||||
struct ip_change_notifier_impl final : ip_change_notifier
|
struct ip_change_notifier_impl final : ip_change_notifier
|
||||||
{
|
{
|
||||||
explicit ip_change_notifier_impl(io_service& ios);
|
explicit ip_change_notifier_impl(io_service& ios);
|
||||||
|
@ -339,6 +379,7 @@ private:
|
||||||
TORRENT_UNUSED(&ip_change_notifier_impl::on_notify);
|
TORRENT_UNUSED(&ip_change_notifier_impl::on_notify);
|
||||||
TORRENT_UNUSED(cb);
|
TORRENT_UNUSED(cb);
|
||||||
#elif TORRENT_USE_NETLINK
|
#elif TORRENT_USE_NETLINK
|
||||||
|
using namespace std::placeholders;
|
||||||
m_socket.async_receive(boost::asio::buffer(m_buf)
|
m_socket.async_receive(boost::asio::buffer(m_buf)
|
||||||
, std::bind(&ip_change_notifier_impl::on_notify, this, _1, _2, cb));
|
, std::bind(&ip_change_notifier_impl::on_notify, this, _1, _2, cb));
|
||||||
#elif defined TORRENT_WINDOWS
|
#elif defined TORRENT_WINDOWS
|
||||||
|
|
Loading…
Reference in New Issue