diff options
Diffstat (limited to '0041-use-CURLOPT_XFERINFOFUNCTION-instead-of-deprecated-C.patch')
-rw-r--r-- | 0041-use-CURLOPT_XFERINFOFUNCTION-instead-of-deprecated-C.patch | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/0041-use-CURLOPT_XFERINFOFUNCTION-instead-of-deprecated-C.patch b/0041-use-CURLOPT_XFERINFOFUNCTION-instead-of-deprecated-C.patch new file mode 100644 index 0000000..af12eec --- /dev/null +++ b/0041-use-CURLOPT_XFERINFOFUNCTION-instead-of-deprecated-C.patch @@ -0,0 +1,131 @@ +From d0b0baa3f2624b6de0ca92c051c154f0cff43f1a Mon Sep 17 00:00:00 2001 +From: zhangxiaoyu <zhangxiaoyu58@huawei.com> +Date: Tue, 14 Mar 2023 10:33:38 +0800 +Subject: [PATCH 41/53] use CURLOPT_XFERINFOFUNCTION instead of deprecated + CURLOPT_PROGRESSFUNCTION since curl 7.32.0 + +Signed-off-by: zhangxiaoyu <zhangxiaoyu58@huawei.com> +--- + .../modules/image/oci/registry/http_request.c | 12 +++++++++++ + src/utils/http/http.c | 21 ++++++++++++++----- + src/utils/http/http.h | 7 +++++++ + test/image/oci/registry/registry_ut.cc | 8 +++++++ + 4 files changed, 43 insertions(+), 5 deletions(-) + +diff --git a/src/daemon/modules/image/oci/registry/http_request.c b/src/daemon/modules/image/oci/registry/http_request.c +index f29c2017..ce8b7667 100644 +--- a/src/daemon/modules/image/oci/registry/http_request.c ++++ b/src/daemon/modules/image/oci/registry/http_request.c +@@ -691,6 +691,16 @@ static int progress(void *p, double dltotal, double dlnow, double ultotal, doubl + return 0; + } + ++static int xfer(void *p, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow) ++{ ++ bool *cancel = p; ++ if (*cancel) { ++ // return nonzero code means abort transition ++ return -1; ++ } ++ return 0; ++} ++ + int http_request_file(pull_descriptor *desc, const char *url, const char **custom_headers, char *file, + resp_data_type type, CURLcode *errcode) + { +@@ -721,6 +731,8 @@ int http_request_file(pull_descriptor *desc, const char *url, const char **custo + options->show_progress = 1; + options->progressinfo = &desc->cancel; + options->progress_info_op = progress; ++ options->xferinfo = &desc->cancel; ++ options->xferinfo_op = xfer; + options->timeout = true; + + ret = setup_common_options(desc, options, url, custom_headers); +diff --git a/src/utils/http/http.c b/src/utils/http/http.c +index bf163d86..986f1f0d 100644 +--- a/src/utils/http/http.c ++++ b/src/utils/http/http.c +@@ -219,12 +219,23 @@ static void http_custom_general_options(CURL *curl_handle, const struct http_get + /* disable progress meter, set to 0L to enable and disable debug output */ + if (options->show_progress == 0) { + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1L); +- } else if (options->show_progress && options->progressinfo && options->progress_info_op) { +- curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, options->progress_info_op); +- /* pass the struct pointer into the progress function */ +- curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, options->progressinfo); +- curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 0L); + } else { ++ /* libcurl support option CURLOPT_XFERINFOFUNCTION when version >= 7.32.0 ++ * #define CURL_VERSION_BITS(x,y,z) ((x)<<16|(y)<<8|(z)) ++ * CURL_VERSION_BITS(7,32,0) = 0x072000 */ ++#if (LIBCURL_VERSION_NUM >= 0x072000) ++ if (options->xferinfo && options->xferinfo_op) { ++ curl_easy_setopt(curl_handle, CURLOPT_XFERINFOFUNCTION, options->xferinfo_op); ++ /* pass the struct pointer into the progress function */ ++ curl_easy_setopt(curl_handle, CURLOPT_XFERINFODATA, options->xferinfo); ++ } ++#else ++ if (options->progressinfo && options->progress_info_op) { ++ curl_easy_setopt(curl_handle, CURLOPT_PROGRESSFUNCTION, options->progress_info_op); ++ /* pass the struct pointer into the progress function */ ++ curl_easy_setopt(curl_handle, CURLOPT_PROGRESSDATA, options->progressinfo); ++ } ++#endif + curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 0L); + } + +diff --git a/src/utils/http/http.h b/src/utils/http/http.h +index 343d92c3..cdd6d64f 100644 +--- a/src/utils/http/http.h ++++ b/src/utils/http/http.h +@@ -17,6 +17,7 @@ + + #include <stdbool.h> + #include <stddef.h> ++#include <curl/curl.h> + + #ifdef __cplusplus + extern "C" { +@@ -25,6 +26,9 @@ extern "C" { + typedef int(*progress_info_func)(void *p, + double dltotal, double dlnow, + double ultotal, double ulnow); ++typedef int(*xferinfo_func)(void *p, ++ curl_off_t dltotal, curl_off_t dlnow, ++ curl_off_t ultotal, curl_off_t ulnow); + + struct http_get_options { + unsigned with_head : 1, /* if set, means write output with response HEADER */ +@@ -77,6 +81,9 @@ struct http_get_options { + + void *progressinfo; + progress_info_func progress_info_op; ++ ++ void *xferinfo; ++ xferinfo_func xferinfo_op; + }; + + #define HTTP_RES_OK 0 +diff --git a/test/image/oci/registry/registry_ut.cc b/test/image/oci/registry/registry_ut.cc +index 8d9ea92b..f4f8a763 100644 +--- a/test/image/oci/registry/registry_ut.cc ++++ b/test/image/oci/registry/registry_ut.cc +@@ -221,6 +221,14 @@ int invokeHttpRequestV2(const char *url, struct http_get_options *options, long + if (options->progress_info_op(options->progressinfo, 0, 0, 0, 0) != 0) { + return -1; + } ++ ++ cancel = (bool *)options->xferinfo; ++ while (!(*cancel)) { ++ sleep(1); // schedule out to let cancel variable set to be true ++ } ++ if (options->xferinfo_op(options->xferinfo, 0, 0, 0, 0) != 0) { ++ return -1; ++ } + } + } else if (util_has_prefix(url, "http://hub-mirror.c.163.com/v2/library/busybox/blobs/sha256:91f30d77")) { + if (retry) { +-- +2.25.1 + |