From: Christian Hesse <[email protected]>

Add command line option ('--disable-download-timeout') and config file
option ('DisableDownloadTimeout') to disable defaults for low speed
limit and timeout on downloads. Use this if you have issues downloading
files with proxy and/or security gateway.

Signed-off-by: Christian Hesse <[email protected]>
---
 doc/pacman.8.txt      |  4 ++++
 doc/pacman.conf.5.txt |  4 ++++
 lib/libalpm/alpm.h    |  2 ++
 lib/libalpm/dload.c   |  6 ++++--
 lib/libalpm/handle.c  | 10 ++++++++++
 lib/libalpm/handle.h  |  1 +
 src/pacman/conf.c     |  4 ++++
 src/pacman/conf.h     |  4 +++-
 src/pacman/pacman.c   |  6 ++++++
 9 files changed, 38 insertions(+), 3 deletions(-)

diff --git a/doc/pacman.8.txt b/doc/pacman.8.txt
index 0fa727e..b761560 100644
--- a/doc/pacman.8.txt
+++ b/doc/pacman.8.txt
@@ -193,6 +193,10 @@ Options
 *\--confirm*::
        Cancels the effects of a previous '\--noconfirm'.
 
+*\--disable-download-timeout*::
+       Disable defaults for low speed limit and timeout on downloads. Use this
+       if you have issues downloading files with proxy and/or security gateway.
+
 
 Transaction Options (apply to '-S', '-R' and '-U')
 --------------------------------------------------
diff --git a/doc/pacman.conf.5.txt b/doc/pacman.conf.5.txt
index c665870..f92ee20 100644
--- a/doc/pacman.conf.5.txt
+++ b/doc/pacman.conf.5.txt
@@ -209,6 +209,10 @@ Options
        Displays name, version and size of target packages formatted
        as a table for upgrade, sync and remove operations.
 
+*DisableDownloadTimeout*::
+       Disable defaults for low speed limit and timeout on downloads. Use this
+       if you have issues downloading files with proxy and/or security gateway.
+
 
 Repository Sections
 -------------------
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h
index 2d2491d..1166385 100644
--- a/lib/libalpm/alpm.h
+++ b/lib/libalpm/alpm.h
@@ -926,6 +926,8 @@ int alpm_option_set_local_file_siglevel(alpm_handle_t 
*handle, int level);
 int alpm_option_get_remote_file_siglevel(alpm_handle_t *handle);
 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);
+
 /** @} */
 
 /** @addtogroup alpm_api_databases Database Functions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c
index 9d80358..28f1990 100644
--- a/lib/libalpm/dload.c
+++ b/lib/libalpm/dload.c
@@ -305,8 +305,10 @@ static void curl_set_handle_opts(struct dload_payload 
*payload,
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
        curl_easy_setopt(curl, CURLOPT_XFERINFOFUNCTION, dload_progress_cb);
        curl_easy_setopt(curl, CURLOPT_XFERINFODATA, (void *)payload);
-       curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1L);
-       curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 10L);
+       if(!handle->disable_dl_timeout) {
+               curl_easy_setopt(curl, CURLOPT_LOW_SPEED_LIMIT, 1L);
+               curl_easy_setopt(curl, CURLOPT_LOW_SPEED_TIME, 10L);
+       }
        curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, dload_parseheader_cb);
        curl_easy_setopt(curl, CURLOPT_WRITEHEADER, (void *)payload);
        curl_easy_setopt(curl, CURLOPT_NETRC, CURL_NETRC_OPTIONAL);
diff --git a/lib/libalpm/handle.c b/lib/libalpm/handle.c
index 28e8148..f760748 100644
--- a/lib/libalpm/handle.c
+++ b/lib/libalpm/handle.c
@@ -844,4 +844,14 @@ int SYMEXPORT 
alpm_option_get_remote_file_siglevel(alpm_handle_t *handle)
        }
 }
 
+int SYMEXPORT alpm_option_set_disable_dl_timeout(alpm_handle_t *handle,
+               unsigned short disable_dl_timeout)
+{
+       CHECK_HANDLE(handle, return -1);
+#ifdef HAVE_LIBCURL
+       handle->disable_dl_timeout = disable_dl_timeout;
+#endif
+       return 0;
+}
+
 /* vim: set noet: */
diff --git a/lib/libalpm/handle.h b/lib/libalpm/handle.h
index 652f17d..469aecc 100644
--- a/lib/libalpm/handle.h
+++ b/lib/libalpm/handle.h
@@ -60,6 +60,7 @@ struct __alpm_handle_t {
 #ifdef HAVE_LIBCURL
        /* libcurl handle */
        CURL *curl;             /* reusable curl_easy handle */
+       unsigned short disable_dl_timeout;
 #endif
 
 #ifdef HAVE_LIBGPGME
diff --git a/src/pacman/conf.c b/src/pacman/conf.c
index d8d64fb..de7715c 100644
--- a/src/pacman/conf.c
+++ b/src/pacman/conf.c
@@ -498,6 +498,8 @@ static int _parse_options(const char *key, char *value,
                                config->color = isatty(fileno(stdout)) ? 
PM_COLOR_ON : PM_COLOR_OFF;
                                enable_colors(config->color);
                        }
+               } else if(strcmp(key, "DisableDownloadTimeout") == 0) {
+                       config->disable_dl_timeout = 1;
                } else {
                        pm_printf(ALPM_LOG_WARNING,
                                        _("config file %s, line %d: directive 
'%s' in section '%s' not recognized.\n"),
@@ -815,6 +817,8 @@ static int setup_libalpm(void)
        alpm_option_set_noupgrades(handle, config->noupgrade);
        alpm_option_set_noextracts(handle, config->noextract);
 
+       alpm_option_set_disable_dl_timeout(handle, config->disable_dl_timeout);
+
        for(i = config->assumeinstalled; i; i = i->next) {
                char *entry = i->data;
                alpm_depend_t *dep = alpm_dep_from_string(entry);
diff --git a/src/pacman/conf.h b/src/pacman/conf.h
index 945de7c..4d39271 100644
--- a/src/pacman/conf.h
+++ b/src/pacman/conf.h
@@ -55,6 +55,7 @@ typedef struct __config_t {
        unsigned short checkspace;
        unsigned short usesyslog;
        unsigned short color;
+       unsigned short disable_dl_timeout;
        double deltaratio;
        char *arch;
        char *print_format;
@@ -203,7 +204,8 @@ enum {
        OP_VERBOSE,
        OP_DOWNLOADONLY,
        OP_REFRESH,
-       OP_ASSUMEINSTALLED
+       OP_ASSUMEINSTALLED,
+       OP_DISABLEDLTIMEOUT
 };
 
 /* clean method */
diff --git a/src/pacman/pacman.c b/src/pacman/pacman.c
index be52d1b..61e8b37 100644
--- a/src/pacman/pacman.c
+++ b/src/pacman/pacman.c
@@ -221,6 +221,8 @@ static void usage(int op, const char * const myname)
                addlist(_("      --logfile <path> set an alternate log 
file\n"));
                addlist(_("      --noconfirm      do not ask for any 
confirmation\n"));
                addlist(_("      --confirm        always ask for 
confirmation\n"));
+               addlist(_("      --disable-download-timeout\n"
+                         "                       use relaxed timeouts for 
download\n"));
        }
        list = alpm_list_msort(list, alpm_list_count(list), options_cmp);
        for(i = list; i; i = alpm_list_next(i)) {
@@ -443,6 +445,9 @@ static int parsearg_global(int opt)
                        free(config->rootdir);
                        config->rootdir = strdup(optarg);
                        break;
+               case OP_DISABLEDLTIMEOUT:
+                       config->disable_dl_timeout = 1;
+                       break;
                case OP_VERBOSE:
                case 'v':
                        (config->verbose)++;
@@ -934,6 +939,7 @@ static int parseargs(int argc, char *argv[])
                {"gpgdir",     required_argument, 0, OP_GPGDIR},
                {"dbonly",     no_argument,       0, OP_DBONLY},
                {"color",      required_argument, 0, OP_COLOR},
+               {"disable-download-timeout", no_argument, 0, 
OP_DISABLEDLTIMEOUT},
                {0, 0, 0, 0}
        };
 
-- 
2.10.2

Reply via email to