Commit 6f81bb4b authored by Max Audron's avatar Max Audron

upnp: add option to configure interface for db plugin

Add an option to the UPnP database plugin to configure which interface is used by upnp to discover servers. upnp by default selects the first interface that is not loopback, which in some cases might not be the desired interface. For example if wanting to access a DLNA server over a VPN connection. The "interface" option can now be set to the name of the desired interface to achieve this. The default behaviour remains unchanged.
parent 4ed60a57
...@@ -61,6 +61,15 @@ upnp ...@@ -61,6 +61,15 @@ upnp
Provides access to UPnP media servers. Provides access to UPnP media servers.
.. list-table::
:widths: 20 80
:header-rows: 1
* - Setting
- Description
* - **interface**
- Interface used to discover media servers. Decided by upnp if left unconfigured.
Storage plugins Storage plugins
=============== ===============
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include "util/ConstBuffer.hxx" #include "util/ConstBuffer.hxx"
#include "util/RecursiveMap.hxx" #include "util/RecursiveMap.hxx"
#include "util/SplitString.hxx" #include "util/SplitString.hxx"
#include "config/Block.hxx"
#include <cassert> #include <cassert>
#include <string> #include <string>
...@@ -76,10 +77,13 @@ class UpnpDatabase : public Database { ...@@ -76,10 +77,13 @@ class UpnpDatabase : public Database {
UpnpClient_Handle handle; UpnpClient_Handle handle;
UPnPDeviceDirectory *discovery; UPnPDeviceDirectory *discovery;
const char* interface;
public: public:
explicit UpnpDatabase(EventLoop &_event_loop) noexcept explicit UpnpDatabase(EventLoop &_event_loop, const ConfigBlock &block) noexcept
:Database(upnp_db_plugin), :Database(upnp_db_plugin),
event_loop(_event_loop) {} event_loop(_event_loop),
interface(block.GetBlockValue("interface", nullptr)) {}
static DatabasePtr Create(EventLoop &main_event_loop, static DatabasePtr Create(EventLoop &main_event_loop,
EventLoop &io_event_loop, EventLoop &io_event_loop,
...@@ -147,15 +151,15 @@ private: ...@@ -147,15 +151,15 @@ private:
DatabasePtr DatabasePtr
UpnpDatabase::Create(EventLoop &, EventLoop &io_event_loop, UpnpDatabase::Create(EventLoop &, EventLoop &io_event_loop,
[[maybe_unused]] DatabaseListener &listener, [[maybe_unused]] DatabaseListener &listener,
const ConfigBlock &) noexcept const ConfigBlock &block) noexcept
{ {
return std::make_unique<UpnpDatabase>(io_event_loop); return std::make_unique<UpnpDatabase>(io_event_loop, block);;
} }
void void
UpnpDatabase::Open() UpnpDatabase::Open()
{ {
handle = UpnpClientGlobalInit(nullptr); handle = UpnpClientGlobalInit(interface);
discovery = new UPnPDeviceDirectory(event_loop, handle); discovery = new UPnPDeviceDirectory(event_loop, handle);
try { try {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment