From d3b8a3ace12e7c457ac4dedcb3c9410090f7ebe2 Mon Sep 17 00:00:00 2001 From: Stephan Raue Date: Sun, 15 Feb 2015 20:36:22 +0100 Subject: [PATCH] kodi: add PR6408 Signed-off-by: Stephan Raue --- .../kodi/patches/kodi-999.98-PR6408.patch | 73 +++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 packages/mediacenter/kodi/patches/kodi-999.98-PR6408.patch diff --git a/packages/mediacenter/kodi/patches/kodi-999.98-PR6408.patch b/packages/mediacenter/kodi/patches/kodi-999.98-PR6408.patch new file mode 100644 index 0000000000..6b601f7a2b --- /dev/null +++ b/packages/mediacenter/kodi/patches/kodi-999.98-PR6408.patch @@ -0,0 +1,73 @@ +From d8fff72de0159160fb4ca1c249c8365e9e1b6785 Mon Sep 17 00:00:00 2001 +From: wsnipex +Date: Wed, 11 Feb 2015 16:58:25 +0100 +Subject: [PATCH] [curl] use better method to stat shoutcast and friends + +--- + xbmc/filesystem/CurlFile.cpp | 31 +++++++++++++++++++------------ + 1 file changed, 19 insertions(+), 12 deletions(-) + +diff --git a/xbmc/filesystem/CurlFile.cpp b/xbmc/filesystem/CurlFile.cpp +index 7d68dab..ee63ff5 100644 +--- a/xbmc/filesystem/CurlFile.cpp ++++ b/xbmc/filesystem/CurlFile.cpp +@@ -123,6 +123,19 @@ extern "C" size_t header_callback(void *ptr, size_t size, size_t nmemb, void *st + return state->HeaderCallback(ptr, size, nmemb); + } + ++/* used only by CCurlFile::Stat to bail out of unwanted transfers */ ++extern "C" int transfer_abort_callback(void *clientp, ++ curl_off_t dltotal, ++ curl_off_t dlnow, ++ curl_off_t ultotal, ++ curl_off_t ulnow) ++{ ++ if(dlnow > 0) ++ return 1; ++ else ++ return 0; ++} ++ + /* fix for silly behavior of realloc */ + static inline void* realloc_simple(void *ptr, size_t size) + { +@@ -1285,7 +1298,6 @@ int CCurlFile::Stat(const CURL& url, struct __stat64* buffer) + SetRequestHeaders(m_state); + g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_TIMEOUT, g_advancedSettings.m_curlconnecttimeout); + g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_NOBODY, 1); +- g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_WRITEDATA, NULL); /* will cause write failure*/ + g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_FILETIME , 1); + + if(url2.IsProtocol("ftp")) +@@ -1311,25 +1323,20 @@ int CCurlFile::Stat(const CURL& url, struct __stat64* buffer) + || result == CURLE_RECV_ERROR /* some silly shoutcast servers */ ) + { + /* some http servers and shoutcast servers don't give us any data on a head request */ +- /* request normal and just fail out, it's their loss */ ++ /* request normal and just bail out via progress meter callback after we received data */ + /* somehow curl doesn't reset CURLOPT_NOBODY properly so reset everything */ + SetCommonOptions(m_state); + SetRequestHeaders(m_state); + g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_TIMEOUT, g_advancedSettings.m_curlconnecttimeout); +- g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_RANGE, "0-0"); +- g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_WRITEDATA, NULL); /* will cause write failure*/ +- g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_FILETIME, 1); +- result = g_curlInterface.easy_perform(m_state->m_easyHandle); +- } ++ g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_FILETIME, 1); ++ g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_XFERINFOFUNCTION, transfer_abort_callback); ++ g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_NOPROGRESS, 0); + +- if( result == CURLE_HTTP_RANGE_ERROR ) +- { +- /* crap can't use the range option, disable it and try again */ +- g_curlInterface.easy_setopt(m_state->m_easyHandle, CURLOPT_RANGE, NULL); + result = g_curlInterface.easy_perform(m_state->m_easyHandle); ++ + } + +- if( result != CURLE_WRITE_ERROR && result != CURLE_OK ) ++ if( result != CURLE_ABORTED_BY_CALLBACK && result != CURLE_OK ) + { + g_curlInterface.easy_release(&m_state->m_easyHandle, NULL); + errno = ENOENT;