I suspect that eventually we're going to end up returning a pointer to an allocated struct to describe the download result, but that's for another patch when the need arises... Fixes FS#33508. Signed-off-by: Dave Reisner <dreisner@archlinux.org> --- lib/libalpm/be_sync.c | 4 ++-- lib/libalpm/dload.c | 20 ++++++++++++-------- lib/libalpm/dload.h | 2 +- lib/libalpm/sync.c | 2 +- 4 files changed, 16 insertions(+), 12 deletions(-) diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index a5a2c10..66e351b 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -218,7 +218,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) payload.force = force; payload.unlink_on_fail = 1; - ret = _alpm_download(&payload, syncpath, NULL); + ret = _alpm_download(&payload, syncpath, NULL, NULL); _alpm_dload_payload_reset(&payload); if(ret == 0 && (level & ALPM_SIG_DATABASE)) { @@ -244,7 +244,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) /* set hard upper limit of 16KiB */ payload.max_size = 16 * 1024; - sig_ret = _alpm_download(&payload, syncpath, NULL); + sig_ret = _alpm_download(&payload, syncpath, NULL, NULL); /* errors_ok suppresses error messages, but not the return code */ sig_ret = payload.errors_ok ? 0 : sig_ret; _alpm_dload_payload_reset(&payload); diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 83d2051..927b0f4 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -386,7 +386,7 @@ static FILE *create_tempfile(struct dload_payload *payload, const char *localpat #define HOSTNAME_SIZE 256 static int curl_download_internal(struct dload_payload *payload, - const char *localpath, char **final_file) + const char *localpath, char **final_file, char **final_url) { int ret = -1; FILE *localf = NULL; @@ -523,6 +523,10 @@ static int curl_download_internal(struct dload_payload *payload, curl_easy_getinfo(curl, CURLINFO_CONDITION_UNMET, &timecond); curl_easy_getinfo(curl, CURLINFO_EFFECTIVE_URL, &effective_url); + if(final_url != NULL) { + *final_url = effective_url; + } + /* time condition was met and we didn't download anything. we need to * clean up the 0 byte .part file that's left behind. */ if(timecond == 1 && DOUBLE_EQ(bytes_dl, 0)) { @@ -613,13 +617,13 @@ cleanup: * @return 0 on success, -1 on error (pm_errno is set accordingly if errors_ok == 0) */ int _alpm_download(struct dload_payload *payload, const char *localpath, - char **final_file) + char **final_file, char **final_url) { alpm_handle_t *handle = payload->handle; if(handle->fetchcb == NULL) { #ifdef HAVE_LIBCURL - return curl_download_internal(payload, localpath, final_file); + return curl_download_internal(payload, localpath, final_file, final_url); #else RET_ERR(handle, ALPM_ERR_EXTERNAL_DOWNLOAD, -1); #endif @@ -653,7 +657,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) { char *filepath; const char *cachedir; - char *final_file = NULL; + char *final_file = NULL, *final_pkg_url = NULL; struct dload_payload payload; int ret = 0; @@ -673,7 +677,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) payload.handle = handle; /* download the file */ - ret = _alpm_download(&payload, cachedir, &final_file); + ret = _alpm_download(&payload, cachedir, &final_file, &final_pkg_url); _alpm_dload_payload_reset(&payload); if(ret == -1) { _alpm_log(handle, ALPM_LOG_WARNING, _("failed to download %s\n"), url); @@ -688,9 +692,9 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) char *sig_filepath, *sig_final_file = NULL; size_t len; - len = strlen(url) + 5; + len = strlen(final_pkg_url) + 5; MALLOC(payload.fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, NULL)); - snprintf(payload.fileurl, len, "%s.sig", url); + snprintf(payload.fileurl, len, "%s.sig", final_pkg_url); sig_filepath = filecache_find_url(handle, payload.fileurl); if(sig_filepath == NULL) { @@ -701,7 +705,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) /* set hard upper limit of 16KiB */ payload.max_size = 16 * 1024; - ret = _alpm_download(&payload, cachedir, &sig_final_file); + ret = _alpm_download(&payload, cachedir, &sig_final_file, NULL); if(ret == -1 && !payload.errors_ok) { _alpm_log(handle, ALPM_LOG_WARNING, _("failed to download %s\n"), payload.fileurl); diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 70e3479..95bb91a 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -48,7 +48,7 @@ struct dload_payload { void _alpm_dload_payload_reset(struct dload_payload *payload); int _alpm_download(struct dload_payload *payload, const char *localpath, - char **final_file); + char **final_file, char **final_url); #endif /* _ALPM_DLOAD_H */ diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index efd5c3f..6a5cab6 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -877,7 +877,7 @@ static int download_single_file(alpm_handle_t *handle, struct dload_payload *pay MALLOC(payload->fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1)); snprintf(payload->fileurl, len, "%s/%s", server_url, payload->remote_name); - if(_alpm_download(payload, cachedir, NULL) != -1) { + if(_alpm_download(payload, cachedir, NULL, NULL) != -1) { return 0; } -- 1.8.1.1