diff --git a/cmake/XRootDFindLibs.cmake b/cmake/XRootDFindLibs.cmake index d07063aad52..058dd4c6f8c 100644 --- a/cmake/XRootDFindLibs.cmake +++ b/cmake/XRootDFindLibs.cmake @@ -84,6 +84,12 @@ if( ENABLE_HTTP ) endif() endif() +if( BUILD_TPC ) +set ( CMAKE_REQUIRED_LIBRARIES ${CURL_LIBRARIES} ) +check_function_exists( curl_multi_wait HAVE_CURL_MULTI_WAIT ) +compiler_define_if_found( HAVE_CURL_MULTI_WAIT HAVE_CURL_MULTI_WAIT ) +endif() + if( ENABLE_CEPH ) find_package( ceph ) if( CEPH_FOUND ) diff --git a/src/XrdTpc/XrdTpcCurlMulti.cc b/src/XrdTpc/XrdTpcCurlMulti.cc index 6a821c8db6f..9ee033eea87 100644 --- a/src/XrdTpc/XrdTpcCurlMulti.cc +++ b/src/XrdTpc/XrdTpcCurlMulti.cc @@ -4,7 +4,7 @@ #include #include -#ifndef HAS_CURL_MULTI +#ifndef HAVE_CURL_MULTI_WAIT CURLMcode curl_multi_wait_impl(CURLM *multi_handle, int timeout_ms, int *numfds) { int max_fds; fd_set read_fd_set[FD_SETSIZE]; diff --git a/src/XrdTpc/XrdTpcCurlMulti.hh b/src/XrdTpc/XrdTpcCurlMulti.hh index 44a10676aed..a82bbd8226e 100644 --- a/src/XrdTpc/XrdTpcCurlMulti.hh +++ b/src/XrdTpc/XrdTpcCurlMulti.hh @@ -1,11 +1,7 @@ #include -#if defined(curl_multi_wait) -#define HAS_CURL_MULTI -#endif - -#ifndef HAS_CURL_MULTI +#ifndef HAVE_CURL_MULTI_WAIT CURLMcode curl_multi_wait_impl(CURLM *multi_handle, int timeout_ms, int *numfds); #endif diff --git a/src/XrdTpc/XrdTpcMultistream.cc b/src/XrdTpc/XrdTpcMultistream.cc index 90412f11d38..5268afe4cfe 100644 --- a/src/XrdTpc/XrdTpcMultistream.cc +++ b/src/XrdTpc/XrdTpcMultistream.cc @@ -286,7 +286,7 @@ int TPCHandler::RunCurlWithStreamsImpl(XrdHttpExtReq &req, State &state, continue; } int fd_count; -#ifdef HAS_CURL_MULTI +#ifdef HAVE_CURL_MULTI_WAIT mres = curl_multi_wait(multi_handle, NULL, 0, max_sleep_time*1000, &fd_count); #else diff --git a/src/XrdTpc/XrdTpcState.cc b/src/XrdTpc/XrdTpcState.cc index 1c282935ef1..d2ec978e60c 100644 --- a/src/XrdTpc/XrdTpcState.cc +++ b/src/XrdTpc/XrdTpcState.cc @@ -51,6 +51,7 @@ void State::Move(State &other) other.m_stream = NULL; } + bool State::InstallHandlers(CURL *curl) { curl_easy_setopt(curl, CURLOPT_USERAGENT, "xrootd-tpc/" XrdVERSION); curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &State::HeaderCB); @@ -136,7 +137,7 @@ int State::Header(const std::string &header) { return 0; } m_recv_status_line = true; - } else if (header.size() == 0 || header == "\n") { + } else if (header.size() == 0 || header == "\n" || header == "\r\n") { m_recv_all_headers = true; } else if (header != "\r\n") { @@ -178,7 +179,7 @@ size_t State::WriteCB(void *buffer, size_t size, size_t nitems, void *userdata) int State::Write(char *buffer, size_t size) { int retval = m_stream->Write(m_start_offset + m_offset, buffer, size); if (retval == SFS_ERROR) { - return -1; + return -1; } m_offset += retval; return retval; diff --git a/src/XrdTpc/XrdTpcStream.hh b/src/XrdTpc/XrdTpcStream.hh index afb54293f79..50296eb83eb 100644 --- a/src/XrdTpc/XrdTpcStream.hh +++ b/src/XrdTpc/XrdTpcStream.hh @@ -21,7 +21,8 @@ class Stream { public: Stream(std::unique_ptr fh, size_t max_blocks, size_t buffer_size) : m_avail_count(max_blocks), - m_fh(std::move(fh)) + m_fh(std::move(fh)), + m_offset(0) { m_buffers.reserve(max_blocks); for (size_t idx=0; idx < max_blocks; idx++) { diff --git a/src/XrdTpc/XrdTpcTPC.cc b/src/XrdTpc/XrdTpcTPC.cc index e659519a2ef..b438861244e 100644 --- a/src/XrdTpc/XrdTpcTPC.cc +++ b/src/XrdTpc/XrdTpcTPC.cc @@ -296,7 +296,7 @@ int TPCHandler::RunCurlWithUpdates(CURL *curl, XrdHttpExtReq &req, State &state, continue; } int fd_count; -#ifdef HAS_CURL_MULTI +#ifdef HAVE_CURL_MULTI_WAIT mres = curl_multi_wait(multi_handle, NULL, 0, max_sleep_time*1000, &fd_count); #else mres = curl_multi_wait_impl(multi_handle, max_sleep_time*1000, &fd_count);