diff options
author | Dave Reisner <dreisner@archlinux.org> | 2011-08-12 21:03:45 +0200 |
---|---|---|
committer | Dan McGee <dan@archlinux.org> | 2011-08-15 13:26:08 +0200 |
commit | 6bf60568f8a956c980accdc6ae86c918eee5a881 (patch) | |
tree | 3c1aeb51229b177808ed55f3ff8d458258a8b1c3 | |
parent | 83f076d3a81e5a625c07fdaf82a5e598a1c75c71 (diff) | |
download | pacman-6bf60568f8a956c980accdc6ae86c918eee5a881.tar.gz pacman-6bf60568f8a956c980accdc6ae86c918eee5a881.tar.xz |
lib/dload: avoid deleting .part file on too-slow xfer
Take this opportunity to refactor the if/then/else logic into a
switch/case which is likely going to be needed to fine tune more
exceptions in the future.
Fixes FS#25531
Signed-off-by: Dave Reisner <dreisner@archlinux.org>
Signed-off-by: Dan McGee <dan@archlinux.org>
-rw-r--r-- | lib/libalpm/dload.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 67090845..5a63e488 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -306,19 +306,27 @@ static int curl_download_internal(struct dload_payload *payload, curl_easy_setopt(handle->curl, CURLOPT_NOPROGRESS, 1L); /* was it a success? */ - if(handle->curlerr == CURLE_ABORTED_BY_CALLBACK) { - goto cleanup; - } else if(handle->curlerr != CURLE_OK) { - if(!payload->errors_ok) { - handle->pm_errno = ALPM_ERR_LIBCURL; - _alpm_log(handle, ALPM_LOG_ERROR, _("failed retrieving file '%s' from %s : %s\n"), - payload->filename, hostname, error_buffer); - } else { - _alpm_log(handle, ALPM_LOG_DEBUG, "failed retrieving file '%s' from %s : %s\n", - payload->filename, hostname, error_buffer); - } - unlink(tempfile); - goto cleanup; + switch(handle->curlerr) { + case CURLE_OK: + break; + case CURLE_ABORTED_BY_CALLBACK: + goto cleanup; + case CURLE_OPERATION_TIMEDOUT: + dload_interrupted = 1; + /* fallthrough */ + default: + if(!payload->errors_ok) { + handle->pm_errno = ALPM_ERR_LIBCURL; + _alpm_log(handle, ALPM_LOG_ERROR, _("failed retrieving file '%s' from %s : %s\n"), + payload->filename, hostname, error_buffer); + if(!dload_interrupted) { + unlink(tempfile); + } + } else { + _alpm_log(handle, ALPM_LOG_DEBUG, "failed retrieving file '%s' from %s : %s\n", + payload->filename, hostname, error_buffer); + } + goto cleanup; } /* retrieve info about the state of the transfer */ |