You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
116 lines
4.1 KiB
116 lines
4.1 KiB
From a5f1e659d52872a499a5744870cb3e6ff382642f Mon Sep 17 00:00:00 2001
|
|
From: "Richard W.M. Jones" <rjones@redhat.com>
|
|
Date: Tue, 25 Jul 2023 16:57:41 +0100
|
|
Subject: [PATCH] curl: Add ipresolve option
|
|
|
|
Allows you to force IPv4 or IPv6.
|
|
|
|
(cherry picked from commit d1b27c97f7fac00ee452a1d1b05805ee7145a49c)
|
|
---
|
|
plugins/curl/curl.c | 15 +++++++++++++++
|
|
plugins/curl/curldefs.h | 1 +
|
|
plugins/curl/nbdkit-curl-plugin.pod | 14 ++++++++++++++
|
|
plugins/curl/pool.c | 2 ++
|
|
4 files changed, 32 insertions(+)
|
|
|
|
diff --git a/plugins/curl/curl.c b/plugins/curl/curl.c
|
|
index 425f1d90..91fa65fb 100644
|
|
--- a/plugins/curl/curl.c
|
|
+++ b/plugins/curl/curl.c
|
|
@@ -68,6 +68,7 @@ struct curl_slist *headers = NULL;
|
|
const char *header_script = NULL;
|
|
unsigned header_script_renew = 0;
|
|
long http_version = CURL_HTTP_VERSION_NONE;
|
|
+long ipresolve = CURL_IPRESOLVE_WHATEVER;
|
|
char *password = NULL;
|
|
#ifndef HAVE_CURLOPT_PROTOCOLS_STR
|
|
long protocols = CURLPROTO_ALL;
|
|
@@ -314,6 +315,19 @@ curl_config (const char *key, const char *value)
|
|
}
|
|
}
|
|
|
|
+ else if (strcmp (key, "ipresolve") == 0) {
|
|
+ if (strcmp (value, "any") == 0 || strcmp (value, "whatever") == 0)
|
|
+ ipresolve = CURL_IPRESOLVE_WHATEVER;
|
|
+ else if (strcmp (value, "v4") == 0 || strcmp (value, "4") == 0)
|
|
+ ipresolve = CURL_IPRESOLVE_V4;
|
|
+ else if (strcmp (value, "v6") == 0 || strcmp (value, "6") == 0)
|
|
+ ipresolve = CURL_IPRESOLVE_V6;
|
|
+ else {
|
|
+ nbdkit_error ("unknown ipresolve: %s", value);
|
|
+ return -1;
|
|
+ }
|
|
+ }
|
|
+
|
|
else if (strcmp (key, "password") == 0) {
|
|
free (password);
|
|
if (nbdkit_read_password (value, &password) == -1)
|
|
@@ -495,6 +509,7 @@ curl_config_complete (void)
|
|
"header-script=<SCRIPT> Script to set HTTP/HTTPS headers.\n" \
|
|
"header-script-renew=<SECS> Time to renew HTTP/HTTPS headers.\n" \
|
|
"http-version=none|... Force a particular HTTP protocol.\n" \
|
|
+ "ipresolve=any|v4|v6 Force IPv4 or IPv6.\n" \
|
|
"password=<PASSWORD> The password for the user account.\n" \
|
|
"protocols=PROTO,PROTO,.. Limit protocols allowed.\n" \
|
|
"proxy=<PROXY> Set proxy URL.\n" \
|
|
diff --git a/plugins/curl/curldefs.h b/plugins/curl/curldefs.h
|
|
index 2a74a369..815be2e1 100644
|
|
--- a/plugins/curl/curldefs.h
|
|
+++ b/plugins/curl/curldefs.h
|
|
@@ -61,6 +61,7 @@ extern struct curl_slist *headers;
|
|
extern const char *header_script;
|
|
extern unsigned header_script_renew;
|
|
extern long http_version;
|
|
+extern long ipresolve;
|
|
extern char *password;
|
|
#ifndef HAVE_CURLOPT_PROTOCOLS_STR
|
|
extern long protocols;
|
|
diff --git a/plugins/curl/nbdkit-curl-plugin.pod b/plugins/curl/nbdkit-curl-plugin.pod
|
|
index 070f9a0f..e12ca197 100644
|
|
--- a/plugins/curl/nbdkit-curl-plugin.pod
|
|
+++ b/plugins/curl/nbdkit-curl-plugin.pod
|
|
@@ -208,6 +208,19 @@ meaning curl will negotiate the best protocol with the server. The
|
|
other settings are mainly for testing. See L<CURLOPT_HTTP_VERSION(3)>
|
|
for details.
|
|
|
|
+=item B<ipresolve=any>
|
|
+
|
|
+=item B<ipresolve=v4>
|
|
+
|
|
+=item B<ipresolve=v6>
|
|
+
|
|
+(nbdkit E<ge> 1.36)
|
|
+
|
|
+Force curl to use only IPv4 (C<ipresolve=v4>), only IPv6
|
|
+(C<ipresolve=v6>) or any IP version supported by your system
|
|
+(C<ipresolve=any>). The default is C<any>. See
|
|
+L<CURLOPT_IPRESOLVE(3)>.
|
|
+
|
|
=item B<password=>PASSWORD
|
|
|
|
Set the password to use when connecting to the remote server.
|
|
@@ -559,6 +572,7 @@ L<CURLOPT_COOKIEFILE(3)>,
|
|
L<CURLOPT_COOKIEJAR(3)>,
|
|
L<CURLOPT_FOLLOWLOCATION(3)>,
|
|
L<CURLOPT_HTTPHEADER(3)>,
|
|
+L<CURLOPT_IPRESOLVE(3)>,
|
|
L<CURLOPT_PROXY(3)>,
|
|
L<CURLOPT_SSL_CIPHER_LIST(3)>,
|
|
L<CURLOPT_SSLVERSION(3)>,
|
|
diff --git a/plugins/curl/pool.c b/plugins/curl/pool.c
|
|
index 731dd367..f0c3cb4f 100644
|
|
--- a/plugins/curl/pool.c
|
|
+++ b/plugins/curl/pool.c
|
|
@@ -257,6 +257,8 @@ allocate_handle (void)
|
|
curl_easy_setopt (ch->c, CURLOPT_HTTPHEADER, headers);
|
|
if (http_version != CURL_HTTP_VERSION_NONE)
|
|
curl_easy_setopt (ch->c, CURLOPT_HTTP_VERSION, (long) http_version);
|
|
+ if (ipresolve != CURL_IPRESOLVE_WHATEVER)
|
|
+ curl_easy_setopt (ch->c, CURLOPT_IPRESOLVE, (long) ipresolve);
|
|
|
|
if (password)
|
|
curl_easy_setopt (ch->c, CURLOPT_PASSWORD, password);
|
|
--
|
|
2.39.3
|
|
|