From eccba76d2bd15a361edb1fa835a0b6ef2604270a Mon Sep 17 00:00:00 2001 From: Josh Elsasser Date: Mon, 9 Apr 2007 23:06:28 +0000 Subject: [PATCH] Fix UPnP for vendors which specify relative paths and no urlbase. --- libtransmission/upnp.c | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/libtransmission/upnp.c b/libtransmission/upnp.c index 618ded95c..81aa1fa1d 100644 --- a/libtransmission/upnp.c +++ b/libtransmission/upnp.c @@ -121,7 +121,8 @@ devicePulseHttp( tr_upnp_device_t * dev, static tr_http_t * devicePulseGetHttp( tr_upnp_device_t * dev ); static int -parseRoot( const char *buf, int len, char ** soap, char ** scpd ); +parseRoot( const char * root, const char *buf, int len, + char ** soap, char ** scpd ); static void addUrlbase( const char * base, char ** path ); static int @@ -664,7 +665,8 @@ devicePulse( tr_upnp_device_t * dev, int port ) tr_dbg( "upnp device %s: fetch root failed with http code %i", dev->host, code ); } - else if( parseRoot( body, len, &dev->soap, &dev->scpd ) ) + else if( parseRoot( dev->root, body, len, + &dev->soap, &dev->scpd ) ) { tr_dbg( "upnp device %s: parse root failed", dev->host ); } @@ -941,7 +943,8 @@ devicePulseHttp( tr_upnp_device_t * dev, } static int -parseRoot(const char *buf, int len, char ** soap, char ** scpd ) +parseRoot( const char * root, const char *buf, int len, + char ** soap, char ** scpd ) { const char * end, * ii, * jj, * kk, * urlbase; char * basedup; @@ -998,7 +1001,16 @@ parseRoot(const char *buf, int len, char ** soap, char ** scpd ) } } - basedup = tr_xmlDupContents( urlbase, end ); + if( NULL == urlbase ) + { + basedup = strrchr( root, '/' ); + assert( NULL != basedup ); + basedup = tr_dupstr( root, basedup - root + 1 ); + } + else + { + basedup = tr_xmlDupContents( urlbase, end ); + } addUrlbase( basedup, soap ); addUrlbase( basedup, scpd ); free( basedup );