Control: tag -1 + patch Hello,
On Tue, Dec 12, 2017 at 10:17:27PM +0100, Sebastian Ramacher wrote: > Source: ring > Version: 20171129.2.cf5bbff~ds1-1 > Severity: important > Tags: sid buster > > ring FTBFS against upnp 1.8 (available in experimental) > | ../../doltlibtool --tag=CXX --mode=compile g++-6 -DHAVE_CONFIG_H -I. > -I../.. -I/<<PKGBUILDDIR>>/daemon/src -I/<<PKGBUILDDIR>>/daemon/src/config > -I/<<PKGBUILDDIR>>/daemon/src/media -I/<<PKGBUILDDIR>>/daemon/test > -I/<<PKGBUILDDIR>>/daemon/src/dring -DPREFIX=\"/usr\" > -DPROGSHAREDIR=\"/usr/share/ring\" -DENABLE_TRACE -DRING_REVISION=\"\" > -DRING_DIRTY_REPO=\"dirty\" -DPJSIP_MAX_PKT_LEN=8000 -DPJ_AUTOCONF=1 > -DHAVE_SPEEX_CODEC -DHAVE_GSM_CODEC -DHAVE_OPUS -Wdate-time > -D_FORTIFY_SOURCE=2 > -I/<<PKGBUILDDIR>>/daemon/contrib/x86_64-linux-gnu/include -I./ -I../ > -DPREFIX=\"/usr\" -DPROGSHAREDIR=\"/usr/share/ring\" -g -O2 > -fdebug-prefix-map=/<<PKGBUILDDIR>>=. -fstack-protector-strong -Wformat > -Werror=format-security -DMSGPACK_DEFAULT_API_VERSION=1 -DPJ_AUTOCONF=1 > -I/<<PKGBUILDDIR>>/daemon/contrib/x86_64-linux-gnu/include -MT > libclient_la-videomanager.lo -MD -MP -MF .deps/libclient_la-videomanager.Tpo > -c -o libclient_la-videomanager.lo `test -f 'videomanager.cpp' || echo > './'`videomanager.cpp > | In file included from configurationmanager.cpp:43:0: > | /<<PKGBUILDDIR>>/daemon/src/upnp/upnp_context.h:225:48: error: > 'Upnp_Discovery' does not name a type > | void parseDevice(IXML_Document* doc, const Upnp_Discovery* d_event); > | ^~~~~~~~~~~~~~ > | /<<PKGBUILDDIR>>/daemon/src/upnp/upnp_context.h:227:45: error: > 'Upnp_Discovery' does not name a type > | void parseIGD(IXML_Document* doc, const Upnp_Discovery* d_event); > | ^~~~~~~~~~~~~~ > | Makefile:550: recipe for target 'libclient_la-configurationmanager.lo' > failed > | make[5]: *** [libclient_la-configurationmanager.lo] Error 1 > > Full log at > https://people.debian.org/~sramacher/logs/upnp/ring_amd64-2017-12-12T20:48:40Z.log the patch below makes ring build against both libupnp-dev/unstable (using libupnp 1.6) and libupnp-dev/experimental (using libupnp 1.8). Note I didn't do any runtime tests and for libupnp6 it depends on libupnp-dev 1.6.24-3 because on the earlier revisions the used compat code was broken and incomplete. Best regards Uwe diff --git a/debian/control b/debian/control index fb3c582bf2ec..8b79b341f8f2 100644 --- a/debian/control +++ b/debian/control @@ -29,7 +29,7 @@ Build-Depends: debhelper (>= 9), # ring-daemon libdbus-1-dev, libdbus-c++-dev, - libupnp-dev, + libupnp-dev (>= 1.6.24-3~), libgnutls28-dev (>= 3.4.14), libpulse-dev, libasound2-dev, diff --git a/debian/patches/libupnp1.8.patch b/debian/patches/libupnp1.8.patch new file mode 100644 index 000000000000..2d70866d8627 --- /dev/null +++ b/debian/patches/libupnp1.8.patch @@ -0,0 +1,187 @@ +--- a/daemon/src/upnp/upnp_context.cpp ++++ b/daemon/src/upnp/upnp_context.cpp +@@ -709,7 +709,7 @@ + * relevant lists + */ + void +-UPnPContext::parseDevice(IXML_Document* doc, const Upnp_Discovery* d_event) ++UPnPContext::parseDevice(IXML_Document* doc, const UpnpDiscovery* d_event) + { + if (not doc or not d_event) + return; +@@ -729,7 +729,7 @@ + } + + void +-UPnPContext::parseIGD(IXML_Document* doc, const Upnp_Discovery* d_event) ++UPnPContext::parseIGD(IXML_Document* doc, const UpnpDiscovery* d_event) + { + if (not doc or not d_event) + return; +@@ -766,7 +766,7 @@ + std::string baseURL = get_first_doc_item(doc, "URLBase"); + if (baseURL.empty()) { + /* get it from the discovery event location */ +- baseURL = std::string(d_event->Location); ++ baseURL = std::string(UpnpDiscovery_get_Location_cstr(d_event)); + } + + /* check if its a valid IGD: +@@ -925,7 +925,7 @@ + } + + int +-UPnPContext::cp_callback(Upnp_EventType event_type, void* event, void* user_data) ++UPnPContext::cp_callback(Upnp_EventType event_type, const void* event, void* user_data) + { + if (auto upnpContext = static_cast<UPnPContext*>(user_data)) + return upnpContext->handleUPnPEvents(event_type, event); +@@ -935,7 +935,7 @@ + } + + int +-UPnPContext::handleUPnPEvents(Upnp_EventType event_type, void* event) ++UPnPContext::handleUPnPEvents(Upnp_EventType event_type, const void* event) + { + switch( event_type ) + { +@@ -943,7 +943,7 @@ + /* RING_DBG("UPnP: CP received a discovery advertisement"); */ + case UPNP_DISCOVERY_SEARCH_RESULT: + { +- struct Upnp_Discovery* d_event = ( struct Upnp_Discovery* )event; ++ const UpnpDiscovery* d_event = ( const UpnpDiscovery* )event; + std::unique_ptr<IXML_Document, decltype(ixmlDocument_free)&> desc_doc(nullptr, ixmlDocument_free); + int upnp_err; + +@@ -952,18 +952,18 @@ + + /* check if we are already in the process of checking this device */ + std::unique_lock<std::mutex> lock(cpDeviceMutex_); +- auto it = cpDevices_.find(std::string(d_event->Location)); ++ auto it = cpDevices_.find(std::string(UpnpDiscovery_get_Location_cstr(d_event))); + + if (it == cpDevices_.end()) { +- cpDevices_.emplace(std::string(d_event->Location)); ++ cpDevices_.emplace(std::string(UpnpDiscovery_get_Location_cstr(d_event))); + lock.unlock(); + +- if (d_event->ErrCode != UPNP_E_SUCCESS) ++ if (UpnpDiscovery_get_ErrCode(d_event) != UPNP_E_SUCCESS) + RING_WARN("UPnP: Error in discovery event received by the CP: %s", +- UpnpGetErrorMessage(d_event->ErrCode)); ++ UpnpGetErrorMessage(UpnpDiscovery_get_ErrCode(d_event))); + + /* RING_DBG("UPnP: Control Point received discovery event from device:\n\tid: %s\n\ttype: %s\n\tservice: %s\n\tversion: %s\n\tlocation: %s\n\tOS: %s", +- d_event->DeviceId, d_event->DeviceType, d_event->ServiceType, d_event->ServiceVer, d_event->Location, d_event->Os); ++ d_event->DeviceId, d_event->DeviceType, d_event->ServiceType, d_event->ServiceVer, UpnpDiscovery_get_Location_cstr(d_event), d_event->Os); + */ + + /* note: this thing will block until success for the system socket timeout +@@ -971,7 +971,7 @@ + * in which case it will block for the libupnp specified timeout + */ + IXML_Document* desc_doc_ptr = nullptr; +- upnp_err = UpnpDownloadXmlDoc( d_event->Location, &desc_doc_ptr); ++ upnp_err = UpnpDownloadXmlDoc( UpnpDiscovery_get_Location_cstr(d_event), &desc_doc_ptr); + desc_doc.reset(desc_doc_ptr); + if ( upnp_err != UPNP_E_SUCCESS ) { + /* the download of the xml doc has failed; this probably happened +@@ -990,7 +990,7 @@ + * eg: if we switch routers or if a new device with the same IP appears + */ + lock.lock(); +- cpDevices_.erase(d_event->Location); ++ cpDevices_.erase(UpnpDiscovery_get_Location_cstr(d_event)); + lock.unlock(); + } else { + lock.unlock(); +@@ -1001,13 +1001,14 @@ + + case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: + { +- struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)event; ++ const UpnpDiscovery *d_event = (const UpnpDiscovery *)event; + +- RING_DBG("UPnP: Control Point received ByeBye for device: %s", d_event->DeviceId); ++ RING_DBG("UPnP: Control Point received ByeBye for device: %s", ++ UpnpDiscovery_get_DeviceID_cstr(d_event)); + +- if (d_event->ErrCode != UPNP_E_SUCCESS) ++ if (UpnpDiscovery_get_ErrCode(d_event) != UPNP_E_SUCCESS) + RING_WARN("UPnP: Error in ByeBye received by the CP: %s", +- UpnpGetErrorMessage(d_event->ErrCode)); ++ UpnpGetErrorMessage(UpnpDiscovery_get_ErrCode(d_event))); + + /* TODO: check if its a device we care about and remove it from the relevant lists */ + } +@@ -1053,13 +1054,13 @@ + + case UPNP_CONTROL_ACTION_COMPLETE: + { +- struct Upnp_Action_Complete *a_event = (struct Upnp_Action_Complete *)event; ++ const UpnpActionComplete *a_event = (const UpnpActionComplete *)event; + + /* RING_DBG("UPnP: Control Point async action complete"); */ + +- if (a_event->ErrCode != UPNP_E_SUCCESS) ++ if (UpnpActionComplete_get_ErrCode(a_event) != UPNP_E_SUCCESS) + RING_WARN("UPnP: Error in action complete event: %s", +- UpnpGetErrorMessage(a_event->ErrCode)); ++ UpnpGetErrorMessage(UpnpActionComplete_get_ErrCode(a_event))); + + /* TODO: no need for any processing here, just print out results. + * Service state table updates are handled by events. */ +@@ -1068,13 +1069,13 @@ + + case UPNP_CONTROL_GET_VAR_COMPLETE: + { +- struct Upnp_State_Var_Complete *sv_event = (struct Upnp_State_Var_Complete *)event; ++ const UpnpStateVarComplete *sv_event = (const UpnpStateVarComplete *)event; + + /* RING_DBG("UPnP: Control Point async get variable complete"); */ + +- if (sv_event->ErrCode != UPNP_E_SUCCESS) ++ if (UpnpStateVarComplete_get_ErrCode(sv_event) != UPNP_E_SUCCESS) + RING_WARN("UPnP: Error in get variable complete event: %s", +- UpnpGetErrorMessage(sv_event->ErrCode)); ++ UpnpGetErrorMessage(UpnpStateVarComplete_get_ErrCode(sv_event))); + + /* TODO: update state variables */ + } +--- a/daemon/src/upnp/upnp_context.h ++++ b/daemon/src/upnp/upnp_context.h +@@ -206,13 +206,19 @@ + */ + bool deviceRegistered_ {false}; + +- static int cp_callback(Upnp_EventType event_type, void* event, void* user_data); ++ static int cp_callback(Upnp_EventType event_type, const void* event, void* user_data); ++ ++#if UPNP_VERSION < 10800 ++ static inline int cp_callback(Upnp_EventType event_type, void* event, void* user_data) { ++ return cp_callback(event_type, (const void*)event, user_data); ++ }; ++#endif + + /** + * callback function for the UPnP client (control point) + * all UPnP events received by the client are processed here + */ +- int handleUPnPEvents(Upnp_EventType event_type, void* event); ++ int handleUPnPEvents(Upnp_EventType event_type, const void* event); + + + /* sends out async search for IGD */ +@@ -222,9 +228,9 @@ + * Parses the device description and adds desired devices to + * relevant lists + */ +- void parseDevice(IXML_Document* doc, const Upnp_Discovery* d_event); ++ void parseDevice(IXML_Document* doc, const UpnpDiscovery* d_event); + +- void parseIGD(IXML_Document* doc, const Upnp_Discovery* d_event); ++ void parseIGD(IXML_Document* doc, const UpnpDiscovery* d_event); + + + /* these functions directly create UPnP actions diff --git a/debian/patches/series b/debian/patches/series index 4a864f7695d1..ea48bdf7b588 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -1,3 +1,4 @@ dont-build-gnutls.patch namedirectory-old-restbed.patch jsoncpp-rename.patch +libupnp1.8.patch
signature.asc
Description: PGP signature