From f8a0733d4f13c3c61aca294a810f85ee83db6f66 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20R=C4=99korajski?= Date: Sat, 24 Oct 2020 11:01:34 +0200 Subject: [PATCH] - upstream fixes for building with libupnp-1.14 - rel 14 --- aMule.spec | 8 +- libupnp-1.14.patch | 353 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 358 insertions(+), 3 deletions(-) create mode 100644 libupnp-1.14.patch diff --git a/aMule.spec b/aMule.spec index 947a7e9..40a99df 100644 --- a/aMule.spec +++ b/aMule.spec @@ -5,7 +5,7 @@ Summary: Unix port of eMule client Summary(pl.UTF-8): Uniksowy port klienta eMule Name: aMule Version: 2.3.2 -Release: 13 +Release: 14 License: GPL v2+ Group: X11/Applications Source0: http://downloads.sourceforge.net/amule/%{name}-%{version}.tar.bz2 @@ -15,6 +15,7 @@ Patch1: %{name}-cas-datadir.patch Patch2: %{name}-ac.patch Patch3: %{name}-cryptopp.patch Patch4: binutils-2.34.patch +Patch5: libupnp-1.14.patch URL: http://www.amule.org/ BuildRequires: GeoIP-devel BuildRequires: autoconf >= 2.59 @@ -31,7 +32,7 @@ BuildRequires: gettext-tools >= 0.11.5 BuildRequires: gtk+2-devel >= 2:2.2.0 BuildRequires: libpng-devel >= 1.2.0 BuildRequires: libstdc++-devel -BuildRequires: libupnp1.6-devel >= 1.6.6 +BuildRequires: libupnp-devel >= 1.6.6 BuildRequires: pkgconfig >= 1:0.9.0 BuildRequires: readline-devel BuildRequires: wxGTK2-unicode-devel >= 2.8.12 @@ -39,7 +40,7 @@ BuildRequires: xorg-lib-libXpm-devel BuildRequires: zlib-devel >= 1.1.4 Requires: cryptopp >= 5.1 Requires: gd >= 2.0.0 -Requires: libupnp1.6 >= 1.6.6 +Requires: libupnp >= 1.6.6 Requires: wget Requires: zlib >= 1.1.4 Obsoletes: lmule @@ -98,6 +99,7 @@ Narzędzie do generownia statystyk aMule. %patch2 -p1 %patch3 -p1 %patch4 -p1 +%patch5 -p1 %build %{__aclocal} -I m4 diff --git a/libupnp-1.14.patch b/libupnp-1.14.patch new file mode 100644 index 0000000..2d70733 --- /dev/null +++ b/libupnp-1.14.patch @@ -0,0 +1,353 @@ +From f6dccde218fed8dabd3c61efce02d29b320858fe Mon Sep 17 00:00:00 2001 +From: Marcelo Roberto Jimenez +Date: Tue, 2 Oct 2018 18:17:43 -0300 +Subject: [PATCH] Make aMule compatible with libupnp 1.8 + +--- + src/UPnPBase.cpp | 110 +++++++++++++++++++++++++++-------------------- + src/UPnPBase.h | 6 +-- + 2 files changed, 66 insertions(+), 50 deletions(-) + +diff --git a/src/UPnPBase.cpp b/src/UPnPBase.cpp +index 01a7c3a05..d4063a136 100644 +--- a/src/UPnPBase.cpp ++++ b/src/UPnPBase.cpp +@@ -1127,7 +1127,7 @@ bool CUPnPControlPoint::PrivateDeletePortMapping( + + + // This function is static +-int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /*Cookie*/) ++int CUPnPControlPoint::Callback(Upnp_EventType_e EventType, const void *Event, void * /*Cookie*/) + { + std::ostringstream msg; + std::ostringstream msg2; +@@ -1149,24 +1149,25 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + msg2<< "UPNP_DISCOVERY_SEARCH_RESULT: "; + // UPnP Discovery + upnpDiscovery: +- struct Upnp_Discovery *d_event = (struct Upnp_Discovery *)Event; ++ UpnpDiscovery *d_event = (UpnpDiscovery *)Event; + IXML_Document *doc = NULL; +- int ret; +- if (d_event->ErrCode != UPNP_E_SUCCESS) { +- msg << UpnpGetErrorMessage(d_event->ErrCode) << "."; ++ int errCode = UpnpDiscovery_get_ErrCode(d_event); ++ if (errCode != UPNP_E_SUCCESS) { ++ msg << UpnpGetErrorMessage(errCode) << "."; + AddDebugLogLineC(logUPnP, msg); + } + // Get the XML tree device description in doc +- ret = UpnpDownloadXmlDoc(d_event->Location, &doc); ++ const char *location = UpnpDiscovery_get_Location_cstr(d_event); ++ int ret = UpnpDownloadXmlDoc(location, &doc); + if (ret != UPNP_E_SUCCESS) { + msg << "Error retrieving device description from " << +- d_event->Location << ": " << ++ location << ": " << + UpnpGetErrorMessage(ret) << + "(" << ret << ")."; + AddDebugLogLineC(logUPnP, msg); + } else { + msg2 << "Retrieving device description from " << +- d_event->Location << "."; ++ location << "."; + AddDebugLogLineN(logUPnP, msg2); + } + if (doc) { +@@ -1194,8 +1195,9 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + AddDebugLogLineC(logUPnP, msg); + } + // Add the root device to our list ++ int expires = UpnpDiscovery_get_Expires(d_event); + upnpCP->AddRootDevice(rootDevice, urlBase, +- d_event->Location, d_event->Expires); ++ location, expires); + } + // Free the XML doc tree + IXML::Document::Free(doc); +@@ -1216,28 +1218,35 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + case UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE: { + //fprintf(stderr, "Callback: UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE\n"); + // UPnP Device Removed +- struct Upnp_Discovery *dab_event = (struct Upnp_Discovery *)Event; +- if (dab_event->ErrCode != UPNP_E_SUCCESS) { ++ UpnpDiscovery *dab_event = (UpnpDiscovery *)Event; ++ int errCode = UpnpDiscovery_get_ErrCode(dab_event); ++ if (errCode != UPNP_E_SUCCESS) { + msg << "error(UPNP_DISCOVERY_ADVERTISEMENT_BYEBYE): " << +- UpnpGetErrorMessage(dab_event->ErrCode) << ++ UpnpGetErrorMessage(errCode) << + "."; + AddDebugLogLineC(logUPnP, msg); + } +- std::string devType = dab_event->DeviceType; ++ std::string devType = UpnpDiscovery_get_DeviceType_cstr(dab_event); + // Check for an InternetGatewayDevice and removes it from the list +- std::transform(devType.begin(), devType.end(), devType.begin(), tolower); ++ std::transform(devType.begin(), devType.end(), ++ devType.begin(), tolower); + if (stdStringIsEqualCI(devType, UPnP::Device::IGW)) { +- upnpCP->RemoveRootDevice(dab_event->DeviceId); ++ const char *deviceID = ++ UpnpDiscovery_get_DeviceID_cstr(dab_event); ++ upnpCP->RemoveRootDevice(deviceID); + } + break; + } + case UPNP_EVENT_RECEIVED: { + //fprintf(stderr, "Callback: UPNP_EVENT_RECEIVED\n"); + // Event reveived +- struct Upnp_Event *e_event = (struct Upnp_Event *)Event; +- const std::string Sid = e_event->Sid; ++ UpnpEvent *e_event = (UpnpEvent *)Event; ++ int eventKey = UpnpEvent_get_EventKey(e_event); ++ IXML_Document *changedVariables = ++ UpnpEvent_get_ChangedVariables(e_event); ++ const std::string sid = UpnpEvent_get_SID_cstr(e_event); + // Parses the event +- upnpCP->OnEventReceived(Sid, e_event->EventKey, e_event->ChangedVariables); ++ upnpCP->OnEventReceived(sid, eventKey, changedVariables); + break; + } + case UPNP_EVENT_SUBSCRIBE_COMPLETE: +@@ -1252,24 +1261,23 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + //fprintf(stderr, "Callback: UPNP_EVENT_RENEWAL_COMPLETE\n"); + msg << "error(UPNP_EVENT_RENEWAL_COMPLETE): "; + upnpEventRenewalComplete: +- struct Upnp_Event_Subscribe *es_event = +- (struct Upnp_Event_Subscribe *)Event; +- if (es_event->ErrCode != UPNP_E_SUCCESS) { ++ UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; ++ int errCode = UpnpEventSubscribe_get_ErrCode(es_event); ++ if (errCode != UPNP_E_SUCCESS) { + msg << "Error in Event Subscribe Callback"; +- UPnP::ProcessErrorMessage( +- msg.str(), es_event->ErrCode, NULL, NULL); ++ UPnP::ProcessErrorMessage(msg.str(), errCode, NULL, NULL); + } else { + #if 0 ++ const UpnpString *publisherUrl = ++ UpnpEventSubscribe_get_PublisherUrl(es_event); ++ const char *sid = UpnpEvent_get_SID_cstr(es_event); ++ int timeOut = UpnpEvent_get_TimeOut(es_event); + TvCtrlPointHandleSubscribeUpdate( +- GET_UPNP_STRING(es_event->PublisherUrl), +- es_event->Sid, +- es_event->TimeOut ); ++ publisherUrl, sid, timeOut); + #endif + } +- + break; + } +- + case UPNP_EVENT_AUTORENEWAL_FAILED: + //fprintf(stderr, "Callback: UPNP_EVENT_AUTORENEWAL_FAILED\n"); + msg << "error(UPNP_EVENT_AUTORENEWAL_FAILED): "; +@@ -1280,29 +1288,31 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + msg << "error(UPNP_EVENT_SUBSCRIPTION_EXPIRED): "; + msg2 << "UPNP_EVENT_SUBSCRIPTION_EXPIRED: "; + upnpEventSubscriptionExpired: +- struct Upnp_Event_Subscribe *es_event = +- (struct Upnp_Event_Subscribe *)Event; ++ UpnpEventSubscribe *es_event = (UpnpEventSubscribe *)Event; + Upnp_SID newSID; + memset(newSID, 0, sizeof(Upnp_SID)); + int TimeOut = 1801; ++ const char *publisherUrl = ++ UpnpEventSubscribe_get_PublisherUrl_cstr(es_event); + int ret = UpnpSubscribe( + upnpCP->m_UPnPClientHandle, +- GET_UPNP_STRING(es_event->PublisherUrl), ++ publisherUrl, + &TimeOut, + newSID); + if (ret != UPNP_E_SUCCESS) { + msg << "Error Subscribing to EventURL"; ++ int errCode = UpnpEventSubscribe_get_ErrCode(es_event); + UPnP::ProcessErrorMessage( +- msg.str(), es_event->ErrCode, NULL, NULL); ++ msg.str(), errCode, NULL, NULL); + } else { + ServiceMap::iterator it = +- upnpCP->m_ServiceMap.find(GET_UPNP_STRING(es_event->PublisherUrl)); ++ upnpCP->m_ServiceMap.find(publisherUrl); + if (it != upnpCP->m_ServiceMap.end()) { + CUPnPService &service = *(it->second); + service.SetTimeout(TimeOut); + service.SetSID(newSID); + msg2 << "Re-subscribed to EventURL '" << +- GET_UPNP_STRING(es_event->PublisherUrl) << ++ publisherUrl << + "' with SID == '" << + newSID << "'."; + AddDebugLogLineC(logUPnP, msg2); +@@ -1321,17 +1331,19 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + case UPNP_CONTROL_ACTION_COMPLETE: { + //fprintf(stderr, "Callback: UPNP_CONTROL_ACTION_COMPLETE\n"); + // This is here if we choose to do this asynchronously +- struct Upnp_Action_Complete *a_event = +- (struct Upnp_Action_Complete *)Event; +- if (a_event->ErrCode != UPNP_E_SUCCESS) { ++ UpnpActionComplete *a_event = (UpnpActionComplete *)Event; ++ int errCode = UpnpActionComplete_get_ErrCode(a_event); ++ IXML_Document *actionResult = ++ UpnpActionComplete_get_ActionResult(a_event); ++ if (errCode != UPNP_E_SUCCESS) { + UPnP::ProcessErrorMessage( + "UpnpSendActionAsync", +- a_event->ErrCode, NULL, +- a_event->ActionResult); ++ errCode, NULL, ++ actionResult); + } else { + // Check the response document + UPnP::ProcessActionResponse( +- a_event->ActionResult, ++ actionResult, + ""); + } + /* No need for any processing here, just print out results. +@@ -1342,21 +1354,25 @@ int CUPnPControlPoint::Callback(Upnp_EventType EventType, void *Event, void * /* + case UPNP_CONTROL_GET_VAR_COMPLETE: { + //fprintf(stderr, "Callback: UPNP_CONTROL_GET_VAR_COMPLETE\n"); + msg << "error(UPNP_CONTROL_GET_VAR_COMPLETE): "; +- struct Upnp_State_Var_Complete *sv_event = +- (struct Upnp_State_Var_Complete *)Event; +- if (sv_event->ErrCode != UPNP_E_SUCCESS) { ++ UpnpStateVarComplete *sv_event = (UpnpStateVarComplete *)Event; ++ int errCode = UpnpStateVarComplete_get_ErrCode(sv_event); ++ if (errCode != UPNP_E_SUCCESS) { + msg << "m_UpnpGetServiceVarStatusAsync"; + UPnP::ProcessErrorMessage( +- msg.str(), sv_event->ErrCode, NULL, NULL); ++ msg.str(), errCode, NULL, NULL); + } else { + #if 0 + // Warning: The use of UpnpGetServiceVarStatus and + // UpnpGetServiceVarStatusAsync is deprecated by the + // UPnP forum. ++ const char *ctrlUrl = ++ UpnpStateVarComplete_get_CtrlUrl(sv_event); ++ const char *stateVarName = ++ UpnpStateVarComplete_get_StateVarName(sv_event); ++ const DOMString currentVal = ++ UpnpStateVarComplete_get_CurrentVal(sv_event); + TvCtrlPointHandleGetVar( +- sv_event->CtrlUrl, +- sv_event->StateVarName, +- sv_event->CurrentVal ); ++ ctrlUrl, stateVarName, currentVal); + #endif + } + break; +diff --git a/src/UPnPBase.h b/src/UPnPBase.h +index 9eafbd143..92753b86a 100644 +--- a/src/UPnPBase.h ++++ b/src/UPnPBase.h +@@ -489,9 +489,9 @@ class CUPnPControlPoint + + // Callback function + static int Callback( +- Upnp_EventType EventType, +- void* Event, +- void* Cookie); ++ Upnp_EventType_e EventType, ++ const void *Event, ++ void *Cookie); + + private: + void OnEventReceived( +From 8784480c79680df5c224d6886a8b4cd3dc1d1801 Mon Sep 17 00:00:00 2001 +From: Marcelo Roberto Jimenez +Date: Tue, 25 Aug 2020 18:41:58 -0300 +Subject: [PATCH] Fixes libupnp API breakage + +Fixes github issue #213: Problem compiling with libupnp 1.14.0 + +UpnpInit() has long been deprecated and has been dropped in 1.14.0. + +Use UpnpInit2() instead. +--- + src/UPnPBase.cpp | 10 ++++------ + 2 files changed, 7 insertions(+), 6 deletions(-) + +diff --git a/src/UPnPBase.cpp b/src/UPnPBase.cpp +index 46ac7451e..dd244e5b0 100644 +--- a/src/UPnPBase.cpp ++++ b/src/UPnPBase.cpp +@@ -826,15 +826,13 @@ m_WanService(NULL) + + // Start UPnP + int ret; +- char *ipAddress = NULL; +- unsigned short port = 0; +- ret = UpnpInit(ipAddress, udpPort); ++ ret = UpnpInit2(0, udpPort); + if (ret != UPNP_E_SUCCESS) { +- msg << "error(UpnpInit): Error code "; ++ msg << "error(UpnpInit2): Error code "; + goto error; + } +- port = UpnpGetServerPort(); +- ipAddress = UpnpGetServerIpAddress(); ++ unsigned short port = UpnpGetServerPort(); ++ char *ipAddress = UpnpGetServerIpAddress(); + msg << "bound to " << ipAddress << ":" << + port << "."; + AddDebugLogLineN(logUPnP, msg); +From f28e82b95ba5f1d65dbacda393bd0ccc4df03a53 Mon Sep 17 00:00:00 2001 +From: Marcelo Roberto Jimenez +Date: Wed, 26 Aug 2020 12:41:38 -0300 +Subject: [PATCH] Fix for compilation error with previous commit +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +Somehow I did not get this error when compiling. + +UPnPBase.cpp: In constructor ‘CUPnPControlPoint::CUPnPControlPoint(short unsigned int)’: +UPnPBase.cpp:880:1: error: jump to label ‘error’ [-fpermissive] + error: + ^~~~~ +UPnPBase.cpp:832:8: note: from here + goto error; + ^~~~~ +UPnPBase.cpp:835:8: note: crosses initialization of ‘char* ipAddress’ + char *ipAddress = UpnpGetServerIpAddress(); + ^~~~~~~~~ +UPnPBase.cpp:834:17: note: crosses initialization of ‘short unsigned int port’ + unsigned short port = UpnpGetServerPort(); + ^~~~ +--- + src/UPnPBase.cpp | 10 ++++++++-- + 1 file changed, 8 insertions(+), 2 deletions(-) + +diff --git a/src/UPnPBase.cpp b/src/UPnPBase.cpp +index dd244e5b0..2c2eadcf2 100644 +--- a/src/UPnPBase.cpp ++++ b/src/UPnPBase.cpp +@@ -824,6 +824,12 @@ m_WanService(NULL) + // Null string at first + std::ostringstream msg; + ++ // Declare those here to avoid ++ // "jump to label ‘error’ [-fpermissive] crosses initialization ++ // of ‘char* ipAddress’" ++ unsigned short port; ++ char *ipAddress; ++ + // Start UPnP + int ret; + ret = UpnpInit2(0, udpPort); +@@ -831,8 +837,8 @@ m_WanService(NULL) + msg << "error(UpnpInit2): Error code "; + goto error; + } +- unsigned short port = UpnpGetServerPort(); +- char *ipAddress = UpnpGetServerIpAddress(); ++ port = UpnpGetServerPort(); ++ ipAddress = UpnpGetServerIpAddress(); + msg << "bound to " << ipAddress << ":" << + port << "."; + AddDebugLogLineN(logUPnP, msg); -- 2.44.0