1 Star 0 Fork 47

DriedYellowPeach/iSulad_1

forked from src-openEuler/iSulad 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0041-use-CURLOPT_XFERINFOFUNCTION-instead-of-deprecated-C.patch 5.41 KB
一键复制 编辑 原始数据 按行查看 历史
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
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/driedyellowpeach/iSulad_1.git
git@gitee.com:driedyellowpeach/iSulad_1.git
driedyellowpeach
iSulad_1
iSulad_1
master

搜索帮助

371d5123 14472233 46e8bd33 14472233