[pacman-dev] [PATCH] Add config var to limit repo connection timeout
Nathan Aclander
nathan.aclander at gmail.com
Sat Apr 6 21:47:06 UTC 2019
New ConnectionTimeout variable sets the amount of time trying to connect
to a repository, before timing out and trying the next one.
Signed-off-by: Nathan Aclander <nathan.aclander at gmail.com>
---
doc/pacman.conf.5.asciidoc | 3 +++
etc/pacman.conf.in | 1 +
lib/libalpm/alpm.h | 3 +++
lib/libalpm/dload.c | 2 +-
lib/libalpm/handle.c | 7 +++++++
lib/libalpm/handle.h | 1 +
src/pacman/conf.c | 7 +++++++
src/pacman/conf.h | 1 +
8 files changed, 24 insertions(+), 1 deletion(-)
diff --git a/doc/pacman.conf.5.asciidoc b/doc/pacman.conf.5.asciidoc
index b297e332..dee5139e 100644
--- a/doc/pacman.conf.5.asciidoc
+++ b/doc/pacman.conf.5.asciidoc
@@ -205,6 +205,9 @@ Options
Disable defaults for low speed limit and timeout on downloads. Use this
if you have issues downloading files with proxy and/or security gateway.
+*ConnectionTimeout*::
+ Set the amount of time trying to connect to a repository, before timnig
+ out and trying the next one.
Repository Sections
-------------------
diff --git a/etc/pacman.conf.in b/etc/pacman.conf.in
index 7446944f..899ad18f 100644
--- a/etc/pacman.conf.in
+++ b/etc/pacman.conf.in
@@ -34,6 +34,7 @@ Architecture = auto
#TotalDownload
CheckSpace
#VerbosePkgLists
+#ConnectionTimeout = 10
# PGP signature checking
#SigLevel = Optional
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index ffb2ad96..e0bf12ca 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -890,6 +890,9 @@ int alpm_option_set_remote_file_siglevel(alpm_handle_t *handle, int level);
int alpm_option_set_disable_dl_timeout(alpm_handle_t *handle, unsigned short disable_dl_timeout);
+/** Sets the timeout for the curl connect phase. */
+int alpm_option_set_connecttimeout(alpm_handle_t *handle, unsigned int timeout);
+
/** @} */
/** @addtogroup alpm_api_databases Database Functions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 05813c40..4e0703b4 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -258,7 +258,7 @@ static void curl_set_handle_opts(struct dload_payload *payload,
curl_easy_reset(curl);
curl_easy_setopt(curl, CURLOPT_URL, payload->fileurl);
curl_easy_setopt(curl, CURLOPT_ERRORBUFFER, error_buffer);
- curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, 10L);
+ curl_easy_setopt(curl, CURLOPT_CONNECTTIMEOUT, handle->connecttimeout);
curl_easy_setopt(curl, CURLOPT_MAXREDIRS, 10L);
curl_easy_setopt(curl, CURLOPT_FILETIME, 1L);
curl_easy_setopt(curl, CURLOPT_NOPROGRESS, 0L);
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index 476779c4..92bc9038 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -556,6 +556,13 @@ int SYMEXPORT alpm_option_set_usesyslog(alpm_handle_t *handle, int usesyslog)
return 0;
}
+int SYMEXPORT alpm_option_set_connecttimeout(alpm_handle_t *handle, unsigned int timeout)
+{
+ CHECK_HANDLE(handle, return -1);
+ handle->connecttimeout = timeout;
+ return 0;
+}
+
static int _alpm_option_strlist_add(alpm_handle_t *handle, alpm_list_t **list, const char *str)
{
char *dup;
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index 14d20bbe..9defbc1b 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -103,6 +103,7 @@ struct __alpm_handle_t {
upgrade operations */
int remotefilesiglevel; /* Signature verification level for remote file
upgrade operations */
+ unsigned int connecttimeout; /* timeout for the connect phase */
/* error code */
alpm_errno_t pm_errno;
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index 3b79fbc7..2cdc157e 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -513,6 +513,8 @@ static int _parse_options(const char *key, char *value,
setrepeatingoption(value, "IgnoreGroup", &(config->ignoregrp));
} else if(strcmp(key, "HoldPkg") == 0) {
setrepeatingoption(value, "HoldPkg", &(config->holdpkg));
+ } else if(strcmp(key, "ConnectionTimeout") == 0) {
+ config->connecttimeout = atoi(value);
} else if(strcmp(key, "CacheDir") == 0) {
setrepeatingoption(value, "CacheDir", &(config->cachedirs));
} else if(strcmp(key, "HookDir") == 0) {
@@ -739,6 +741,10 @@ static int setup_libalpm(void)
alpm_option_set_totaldlcb(handle, cb_dl_total);
}
+ if(!config->connecttimeout) {
+ alpm_option_set_connecttimeout(handle, 10L);
+ }
+
alpm_option_set_arch(handle, config->arch);
alpm_option_set_checkspace(handle, config->checkspace);
alpm_option_set_usesyslog(handle, config->usesyslog);
@@ -749,6 +755,7 @@ static int setup_libalpm(void)
alpm_option_set_noextracts(handle, config->noextract);
alpm_option_set_disable_dl_timeout(handle, config->disable_dl_timeout);
+ alpm_option_set_connecttimeout(handle, config->connecttimeout);
for(i = config->assumeinstalled; i; i = i->next) {
char *entry = i->data;
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index f45ed436..e1f9934e 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -118,6 +118,7 @@ typedef struct __config_t {
/* select -Sc behavior */
unsigned short cleanmethod;
alpm_list_t *holdpkg;
+ unsigned int connecttimeout;
alpm_list_t *ignorepkg;
alpm_list_t *ignoregrp;
alpm_list_t *assumeinstalled;
--
2.21.0
More information about the pacman-dev
mailing list