libalpm: download signatures with the external downloader

Ensure relevant signature files are downloaded when using the fetch
callback.

Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Masato TOYOSHIMA 2023-09-13 10:18:30 +10:00 committed by Allan McRae
parent 48729f8ecc
commit 2180e4d127

View file

@ -1015,6 +1015,22 @@ int _alpm_download(alpm_handle_t *handle,
if(payload->fileurl) { if(payload->fileurl) {
ret = handle->fetchcb(handle->fetchcb_ctx, payload->fileurl, localpath, payload->force); ret = handle->fetchcb(handle->fetchcb_ctx, payload->fileurl, localpath, payload->force);
if (ret != -1 && payload->download_signature) {
/* Download signature if requested */
char *sig_fileurl;
size_t sig_len = strlen(payload->fileurl) + 5;
int retsig = -1;
MALLOC(sig_fileurl, sig_len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(sig_fileurl, sig_len, "%s.sig", payload->fileurl);
retsig = handle->fetchcb(handle->fetchcb_ctx, sig_fileurl, localpath, payload->force);
free(sig_fileurl);
if(!payload->signature_optional) {
ret = retsig;
}
}
} else { } else {
for(s = payload->cache_servers; s && ret == -1; s = s->next) { for(s = payload->cache_servers; s && ret == -1; s = s->next) {
ret = payload_download_fetchcb(payload, s->data, localpath); ret = payload_download_fetchcb(payload, s->data, localpath);
@ -1022,6 +1038,23 @@ int _alpm_download(alpm_handle_t *handle,
for(s = payload->servers; s && ret == -1; s = s->next) { for(s = payload->servers; s && ret == -1; s = s->next) {
ret = payload_download_fetchcb(payload, s->data, localpath); ret = payload_download_fetchcb(payload, s->data, localpath);
} }
if (ret != -1 && payload->download_signature) {
/* Download signature if requested */
char *sig_fileurl;
size_t sig_len = strlen(s->data) + strlen(payload->filepath) + 6;
int retsig = -1;
MALLOC(sig_fileurl, sig_len, RET_ERR(handle, ALPM_ERR_MEMORY, -1));
snprintf(sig_fileurl, sig_len, "%s/%s.sig", (const char *)(s->data), payload->filepath);
retsig = handle->fetchcb(handle->fetchcb_ctx, sig_fileurl, localpath, payload->force);
free(sig_fileurl);
if(!payload->signature_optional) {
ret = retsig;
}
}
} }
if(ret == -1 && !payload->errors_ok) { if(ret == -1 && !payload->errors_ok) {