diff options
-rw-r--r-- | lib/libalpm/alpm.h | 3 | ||||
-rw-r--r-- | lib/libalpm/dload.c | 35 | ||||
-rw-r--r-- | lib/libalpm/sync.c | 2 |
3 files changed, 24 insertions, 16 deletions
diff --git a/lib/libalpm/alpm.h b/lib/libalpm/alpm.h index 65b8e2fb..101d686b 100644 --- a/lib/libalpm/alpm.h +++ b/lib/libalpm/alpm.h @@ -1361,7 +1361,8 @@ int alpm_db_remove_server(alpm_db_t *db, const char *url); * @param dbs list of package databases to update * @param force if true, then forces the update, otherwise update only in case * the databases aren't up to date - * @return 0 on success, -1 on error (pm_errno is set accordingly) + * @return 0 on success, -1 on error (pm_errno is set accordingly), + * 1 if all databases are up to to date */ int alpm_db_update(alpm_handle_t *handle, alpm_list_t *dbs, int force); diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 9ed1a02a..935f5418 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -789,6 +789,10 @@ cleanup: return ret; } +/* Returns -1 if an error happened for a required file + * Returns 0 if a payload was actually downloaded + * Returns 1 if no files were downloaded and all errors were non-fatal + */ static int curl_download_internal(alpm_handle_t *handle, alpm_list_t *payloads /* struct dload_payload */, const char *localpath) @@ -796,6 +800,7 @@ static int curl_download_internal(alpm_handle_t *handle, int active_downloads_num = 0; int err = 0; int max_streams = handle->parallel_downloads; + int updated = 0; /* was a file actually updated */ CURLM *curlm = handle->curlm; while(active_downloads_num > 0 || payloads) { @@ -847,6 +852,8 @@ static int curl_download_internal(alpm_handle_t *handle, */ payloads = NULL; err = -1; + } else if(ret == 0) { + updated = 1; } } else { _alpm_log(handle, ALPM_LOG_ERROR, _("curl transfer error: %d\n"), msg->msg); @@ -855,11 +862,15 @@ static int curl_download_internal(alpm_handle_t *handle, } _alpm_log(handle, ALPM_LOG_DEBUG, "curl_download_internal return code is %d\n", err); - return err; + return err ? -1 : updated ? 0 : 1; } #endif +/* Returns -1 if an error happened for a required file + * Returns 0 if a payload was actually downloaded + * Returns 1 if no files were downloaded and all errors were non-fatal + */ int _alpm_download(alpm_handle_t *handle, alpm_list_t *payloads /* struct dload_payload */, const char *localpath) @@ -872,20 +883,18 @@ int _alpm_download(alpm_handle_t *handle, #endif } else { alpm_list_t *p; + int updated = 0; for(p = payloads; p; p = p->next) { struct dload_payload *payload = p->data; alpm_list_t *s; - int success = 0; + int ret = -1; if(payload->fileurl) { - if (handle->fetchcb(handle->fetchcb_ctx, payload->fileurl, localpath, payload->force) != -1) { - success = 1; - } + ret = handle->fetchcb(handle->fetchcb_ctx, payload->fileurl, localpath, payload->force); } else { - for(s = payload->servers; s; s = s->next) { + for(s = payload->servers; s && ret == -1; s = s->next) { const char *server = s->data; char *fileurl; - int ret; size_t len = strlen(server) + strlen(payload->filepath) + 2; MALLOC(fileurl, len, RET_ERR(handle, ALPM_ERR_MEMORY, -1)); @@ -893,18 +902,16 @@ int _alpm_download(alpm_handle_t *handle, ret = handle->fetchcb(handle->fetchcb_ctx, fileurl, localpath, payload->force); free(fileurl); - - if (ret != -1) { - success = 1; - break; - } } } - if(!success && !payload->errors_ok) { + + if(ret == -1 && !payload->errors_ok) { RET_ERR(handle, ALPM_ERR_EXTERNAL_DOWNLOAD, -1); + } else if(ret == 0) { + updated = 1; } } - return 0; + return updated ? 0 : 1; } } diff --git a/lib/libalpm/sync.c b/lib/libalpm/sync.c index 7fa50a13..2419cc69 100644 --- a/lib/libalpm/sync.c +++ b/lib/libalpm/sync.c @@ -815,7 +815,7 @@ static int download_files(alpm_handle_t *handle) } ret = _alpm_download(handle, payloads, cachedir); - if(ret != 0) { + if(ret == -1) { event.type = ALPM_EVENT_PKG_RETRIEVE_FAILED; EVENT(handle, &event); _alpm_log(handle, ALPM_LOG_WARNING, _("failed to retrieve some files\n")); |