[pacman-dev] [PATCH 1/1] fix db filename handling
From: Christian Hesse <mail@eworm.de> If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets this wrong: It saves to new filename and fails when accessing ${repo}.db. This introduces a new field 'deny_rename' to payload. If set pacman downloads to the filename specified in payload.remote_name. --- lib/libalpm/be_sync.c | 2 ++ lib/libalpm/dload.c | 36 ++++++++++++++++++++---------------- lib/libalpm/dload.h | 1 + 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 123d953..622153d 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -223,6 +223,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) payload.handle = handle; payload.force = force; payload.unlink_on_fail = 1; + payload.deny_rename = 1; ret = _alpm_download(&payload, syncpath, NULL, NULL); _alpm_dload_payload_reset(&payload); @@ -245,6 +246,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename); payload.handle = handle; payload.force = 1; + payload.deny_rename = 1; payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL); /* set hard upper limit of 16KiB */ diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 8537b3d..381e548 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -547,23 +547,27 @@ static int curl_download_internal(struct dload_payload *payload, goto cleanup; } - if(payload->content_disp_name) { - /* content-disposition header has a better name for our file */ - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + if(payload->deny_rename) { + payload->destfile_name = get_fullpath(localpath, payload->remote_name, ""); } else { - const char *effective_filename = strrchr(effective_url, '/'); - if(effective_filename && strlen(effective_filename) > 2) { - effective_filename++; - - /* if destfile was never set, we wrote to a tempfile. even if destfile is - * set, we may have followed some redirects and the effective url may - * have a better suggestion as to what to name our file. in either case, - * refactor destfile to this newly derived name. */ - if(!payload->destfile_name || strcmp(effective_filename, - strrchr(payload->destfile_name, '/') + 1) != 0) { - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + if(payload->content_disp_name) { + /* content-disposition header has a better name for our file */ + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + } else { + const char *effective_filename = strrchr(effective_url, '/'); + if(effective_filename && strlen(effective_filename) > 2) { + effective_filename++; + + /* if destfile was never set, we wrote to a tempfile. even if destfile is + * set, we may have followed some redirects and the effective url may + * have a better suggestion as to what to name our file. in either case, + * refactor destfile to this newly derived name. */ + if(!payload->destfile_name || strcmp(effective_filename, + strrchr(payload->destfile_name, '/') + 1) != 0) { + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + } } } } diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 95bb91a..bd01d8b 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -38,6 +38,7 @@ struct dload_payload { int allow_resume; int errors_ok; int unlink_on_fail; + int deny_rename; alpm_list_t *servers; #ifdef HAVE_LIBCURL CURLcode curlerr; /* last error produced by curl */ -- 1.8.4
On 05/09/13 01:35, Christian Hesse wrote:
From: Christian Hesse <mail@eworm.de>
If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets this wrong: It saves to new filename and fails when accessing ${repo}.db.
This introduces a new field 'deny_rename' to payload. If set pacman downloads to the filename specified in payload.remote_name.
Is there any case where we want to allow renaming of files? We have expected names for both databases and package files (based on what is in the database). So I guess this should be done by default?
--- lib/libalpm/be_sync.c | 2 ++ lib/libalpm/dload.c | 36 ++++++++++++++++++++---------------- lib/libalpm/dload.h | 1 + 3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 123d953..622153d 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -223,6 +223,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) payload.handle = handle; payload.force = force; payload.unlink_on_fail = 1; + payload.deny_rename = 1;
ret = _alpm_download(&payload, syncpath, NULL, NULL); _alpm_dload_payload_reset(&payload); @@ -245,6 +246,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename); payload.handle = handle; payload.force = 1; + payload.deny_rename = 1; payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL);
/* set hard upper limit of 16KiB */ diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 8537b3d..381e548 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -547,23 +547,27 @@ static int curl_download_internal(struct dload_payload *payload, goto cleanup; }
- if(payload->content_disp_name) { - /* content-disposition header has a better name for our file */ - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + if(payload->deny_rename) { + payload->destfile_name = get_fullpath(localpath, payload->remote_name, ""); } else { - const char *effective_filename = strrchr(effective_url, '/'); - if(effective_filename && strlen(effective_filename) > 2) { - effective_filename++; - - /* if destfile was never set, we wrote to a tempfile. even if destfile is - * set, we may have followed some redirects and the effective url may - * have a better suggestion as to what to name our file. in either case, - * refactor destfile to this newly derived name. */ - if(!payload->destfile_name || strcmp(effective_filename, - strrchr(payload->destfile_name, '/') + 1) != 0) { - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + if(payload->content_disp_name) { + /* content-disposition header has a better name for our file */ + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + } else { + const char *effective_filename = strrchr(effective_url, '/'); + if(effective_filename && strlen(effective_filename) > 2) { + effective_filename++; + + /* if destfile was never set, we wrote to a tempfile. even if destfile is + * set, we may have followed some redirects and the effective url may + * have a better suggestion as to what to name our file. in either case, + * refactor destfile to this newly derived name. */ + if(!payload->destfile_name || strcmp(effective_filename, + strrchr(payload->destfile_name, '/') + 1) != 0) { + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + } } } } diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 95bb91a..bd01d8b 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -38,6 +38,7 @@ struct dload_payload { int allow_resume; int errors_ok; int unlink_on_fail; + int deny_rename; alpm_list_t *servers; #ifdef HAVE_LIBCURL CURLcode curlerr; /* last error produced by curl */
On Thu, Sep 05, 2013 at 01:12:10PM +1000, Allan McRae wrote:
On 05/09/13 01:35, Christian Hesse wrote:
From: Christian Hesse <mail@eworm.de>
If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets this wrong: It saves to new filename and fails when accessing ${repo}.db.
This introduces a new field 'deny_rename' to payload. If set pacman downloads to the filename specified in payload.remote_name.
Is there any case where we want to allow renaming of files? We have expected names for both databases and package files (based on what is in the database). So I guess this should be done by default?
Yep, the only case where it makes sense to allow renaming is for -U operations. We should probably rename the field (deny_rename seems weird, since we *always* rename regardless). Maybe call it "trust_remote_name" -- set this to true for alpm_fetch_pkgurl() and only trust things like the content-disposition and redirects when allow_remote_name is non-zero.
--- lib/libalpm/be_sync.c | 2 ++ lib/libalpm/dload.c | 36 ++++++++++++++++++++---------------- lib/libalpm/dload.h | 1 + 3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 123d953..622153d 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -223,6 +223,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) payload.handle = handle; payload.force = force; payload.unlink_on_fail = 1; + payload.deny_rename = 1;
ret = _alpm_download(&payload, syncpath, NULL, NULL); _alpm_dload_payload_reset(&payload); @@ -245,6 +246,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename); payload.handle = handle; payload.force = 1; + payload.deny_rename = 1; payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL);
/* set hard upper limit of 16KiB */ diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 8537b3d..381e548 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -547,23 +547,27 @@ static int curl_download_internal(struct dload_payload *payload, goto cleanup; }
- if(payload->content_disp_name) { - /* content-disposition header has a better name for our file */ - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + if(payload->deny_rename) { + payload->destfile_name = get_fullpath(localpath, payload->remote_name, ""); } else { - const char *effective_filename = strrchr(effective_url, '/'); - if(effective_filename && strlen(effective_filename) > 2) { - effective_filename++; - - /* if destfile was never set, we wrote to a tempfile. even if destfile is - * set, we may have followed some redirects and the effective url may - * have a better suggestion as to what to name our file. in either case, - * refactor destfile to this newly derived name. */ - if(!payload->destfile_name || strcmp(effective_filename, - strrchr(payload->destfile_name, '/') + 1) != 0) { - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + if(payload->content_disp_name) { + /* content-disposition header has a better name for our file */ + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + } else { + const char *effective_filename = strrchr(effective_url, '/'); + if(effective_filename && strlen(effective_filename) > 2) { + effective_filename++; + + /* if destfile was never set, we wrote to a tempfile. even if destfile is + * set, we may have followed some redirects and the effective url may + * have a better suggestion as to what to name our file. in either case, + * refactor destfile to this newly derived name. */ + if(!payload->destfile_name || strcmp(effective_filename, + strrchr(payload->destfile_name, '/') + 1) != 0) { + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + }
Uggh. I wish I would have spent more time designing my downloader rewrite... so many regrets...
} } } diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 95bb91a..bd01d8b 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -38,6 +38,7 @@ struct dload_payload { int allow_resume; int errors_ok; int unlink_on_fail; + int deny_rename; alpm_list_t *servers; #ifdef HAVE_LIBCURL CURLcode curlerr; /* last error produced by curl */
From: Christian Hesse <mail@eworm.de> If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets this wrong: It saves to new filename and fails when accessing ${repo}.db. We need the remote filename only when downloading remote files with pacman's -U operation. This introduces a new field 'trust_remote_name' to payload. If set pacman downloads to the filename given by the server. The field trust_remote_name is set in alpm_fetch_pkgurl(). Fixes FS#36791 ([pacman] downloads to wrong filename with redirect). --- lib/libalpm/dload.c | 40 +++++++++++++++++++++++----------------- lib/libalpm/dload.h | 1 + 2 files changed, 24 insertions(+), 17 deletions(-) diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 8537b3d..c12f259 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -547,25 +547,29 @@ static int curl_download_internal(struct dload_payload *payload, goto cleanup; } - if(payload->content_disp_name) { - /* content-disposition header has a better name for our file */ - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); - } else { - const char *effective_filename = strrchr(effective_url, '/'); - if(effective_filename && strlen(effective_filename) > 2) { - effective_filename++; - - /* if destfile was never set, we wrote to a tempfile. even if destfile is - * set, we may have followed some redirects and the effective url may - * have a better suggestion as to what to name our file. in either case, - * refactor destfile to this newly derived name. */ - if(!payload->destfile_name || strcmp(effective_filename, - strrchr(payload->destfile_name, '/') + 1) != 0) { - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + if (payload->trust_remote_name) { + if(payload->content_disp_name) { + /* content-disposition header has a better name for our file */ + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + } else { + const char *effective_filename = strrchr(effective_url, '/'); + if(effective_filename && strlen(effective_filename) > 2) { + effective_filename++; + + /* if destfile was never set, we wrote to a tempfile. even if destfile is + * set, we may have followed some redirects and the effective url may + * have a better suggestion as to what to name our file. in either case, + * refactor destfile to this newly derived name. */ + if(!payload->destfile_name || strcmp(effective_filename, + strrchr(payload->destfile_name, '/') + 1) != 0) { + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + } } } + } else { + payload->destfile_name = get_fullpath(localpath, payload->remote_name, ""); } ret = 0; @@ -678,6 +682,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) STRDUP(payload.fileurl, url, RET_ERR(handle, ALPM_ERR_MEMORY, NULL)); payload.allow_resume = 1; payload.handle = handle; + payload.trust_remote_name = 1; /* download the file */ ret = _alpm_download(&payload, cachedir, &final_file, &final_pkg_url); @@ -702,6 +707,7 @@ char SYMEXPORT *alpm_fetch_pkgurl(alpm_handle_t *handle, const char *url) sig_filepath = filecache_find_url(handle, payload.fileurl); if(sig_filepath == NULL) { payload.handle = handle; + payload.trust_remote_name = 1; payload.force = 1; payload.errors_ok = (handle->siglevel & ALPM_SIG_PACKAGE_OPTIONAL); diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 95bb91a..6c9f7a7 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -38,6 +38,7 @@ struct dload_payload { int allow_resume; int errors_ok; int unlink_on_fail; + int trust_remote_name; alpm_list_t *servers; #ifdef HAVE_LIBCURL CURLcode curlerr; /* last error produced by curl */ -- 1.8.4
On Wed, Sep 04, 2013 at 05:35:51PM +0200, Christian Hesse wrote:
From: Christian Hesse <mail@eworm.de>
If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets this wrong: It saves to new filename and fails when accessing ${repo}.db.
This introduces a new field 'deny_rename' to payload. If set pacman downloads to the filename specified in payload.remote_name. --- lib/libalpm/be_sync.c | 2 ++ lib/libalpm/dload.c | 36 ++++++++++++++++++++---------------- lib/libalpm/dload.h | 1 + 3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 123d953..622153d 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -223,6 +223,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) payload.handle = handle; payload.force = force; payload.unlink_on_fail = 1; + payload.deny_rename = 1;
ret = _alpm_download(&payload, syncpath, NULL, NULL); _alpm_dload_payload_reset(&payload); @@ -245,6 +246,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename); payload.handle = handle; payload.force = 1; + payload.deny_rename = 1; payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL);
/* set hard upper limit of 16KiB */ diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 8537b3d..381e548 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -547,23 +547,27 @@ static int curl_download_internal(struct dload_payload *payload, goto cleanup; }
- if(payload->content_disp_name) { - /* content-disposition header has a better name for our file */ - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + if(payload->deny_rename) { + payload->destfile_name = get_fullpath(localpath, payload->remote_name, "");
This is actually a leak. payload->destfile_name should already be set with this exact value earlier in the function. You only need to worry about the negative case where we allow renaming. I've fixed this up on my own branch.
} else { - const char *effective_filename = strrchr(effective_url, '/'); - if(effective_filename && strlen(effective_filename) > 2) { - effective_filename++; - - /* if destfile was never set, we wrote to a tempfile. even if destfile is - * set, we may have followed some redirects and the effective url may - * have a better suggestion as to what to name our file. in either case, - * refactor destfile to this newly derived name. */ - if(!payload->destfile_name || strcmp(effective_filename, - strrchr(payload->destfile_name, '/') + 1) != 0) { - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + if(payload->content_disp_name) { + /* content-disposition header has a better name for our file */ + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + } else { + const char *effective_filename = strrchr(effective_url, '/'); + if(effective_filename && strlen(effective_filename) > 2) { + effective_filename++; + + /* if destfile was never set, we wrote to a tempfile. even if destfile is + * set, we may have followed some redirects and the effective url may + * have a better suggestion as to what to name our file. in either case, + * refactor destfile to this newly derived name. */ + if(!payload->destfile_name || strcmp(effective_filename, + strrchr(payload->destfile_name, '/') + 1) != 0) { + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + } } } } diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 95bb91a..bd01d8b 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -38,6 +38,7 @@ struct dload_payload { int allow_resume; int errors_ok; int unlink_on_fail; + int deny_rename; alpm_list_t *servers; #ifdef HAVE_LIBCURL CURLcode curlerr; /* last error produced by curl */ -- 1.8.4
On Sat, Sep 07, 2013 at 12:05:00AM -0400, Dave Reisner wrote:
On Wed, Sep 04, 2013 at 05:35:51PM +0200, Christian Hesse wrote:
From: Christian Hesse <mail@eworm.de>
If the server redirects from ${repo}.db to ${repo}.db.tar.gz pacman gets this wrong: It saves to new filename and fails when accessing ${repo}.db.
This introduces a new field 'deny_rename' to payload. If set pacman downloads to the filename specified in payload.remote_name. --- lib/libalpm/be_sync.c | 2 ++ lib/libalpm/dload.c | 36 ++++++++++++++++++++---------------- lib/libalpm/dload.h | 1 + 3 files changed, 23 insertions(+), 16 deletions(-)
diff --git a/lib/libalpm/be_sync.c b/lib/libalpm/be_sync.c index 123d953..622153d 100644 --- a/lib/libalpm/be_sync.c +++ b/lib/libalpm/be_sync.c @@ -223,6 +223,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) payload.handle = handle; payload.force = force; payload.unlink_on_fail = 1; + payload.deny_rename = 1;
ret = _alpm_download(&payload, syncpath, NULL, NULL); _alpm_dload_payload_reset(&payload); @@ -245,6 +246,7 @@ int SYMEXPORT alpm_db_update(int force, alpm_db_t *db) snprintf(payload.fileurl, len, "%s/%s.db.sig", server, db->treename); payload.handle = handle; payload.force = 1; + payload.deny_rename = 1; payload.errors_ok = (level & ALPM_SIG_DATABASE_OPTIONAL);
/* set hard upper limit of 16KiB */ diff --git a/lib/libalpm/dload.c b/lib/libalpm/dload.c index 8537b3d..381e548 100644 --- a/lib/libalpm/dload.c +++ b/lib/libalpm/dload.c @@ -547,23 +547,27 @@ static int curl_download_internal(struct dload_payload *payload, goto cleanup; }
- if(payload->content_disp_name) { - /* content-disposition header has a better name for our file */ - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + if(payload->deny_rename) { + payload->destfile_name = get_fullpath(localpath, payload->remote_name, "");
This is actually a leak. payload->destfile_name should already be set with this exact value earlier in the function. You only need to worry about the negative case where we allow renaming.
I've fixed this up on my own branch.
And this is me replying to the wrong patch. Looks like v2 has the same issue, though.
} else { - const char *effective_filename = strrchr(effective_url, '/'); - if(effective_filename && strlen(effective_filename) > 2) { - effective_filename++; - - /* if destfile was never set, we wrote to a tempfile. even if destfile is - * set, we may have followed some redirects and the effective url may - * have a better suggestion as to what to name our file. in either case, - * refactor destfile to this newly derived name. */ - if(!payload->destfile_name || strcmp(effective_filename, - strrchr(payload->destfile_name, '/') + 1) != 0) { - free(payload->destfile_name); - payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + if(payload->content_disp_name) { + /* content-disposition header has a better name for our file */ + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, payload->content_disp_name, ""); + } else { + const char *effective_filename = strrchr(effective_url, '/'); + if(effective_filename && strlen(effective_filename) > 2) { + effective_filename++; + + /* if destfile was never set, we wrote to a tempfile. even if destfile is + * set, we may have followed some redirects and the effective url may + * have a better suggestion as to what to name our file. in either case, + * refactor destfile to this newly derived name. */ + if(!payload->destfile_name || strcmp(effective_filename, + strrchr(payload->destfile_name, '/') + 1) != 0) { + free(payload->destfile_name); + payload->destfile_name = get_fullpath(localpath, effective_filename, ""); + } } } } diff --git a/lib/libalpm/dload.h b/lib/libalpm/dload.h index 95bb91a..bd01d8b 100644 --- a/lib/libalpm/dload.h +++ b/lib/libalpm/dload.h @@ -38,6 +38,7 @@ struct dload_payload { int allow_resume; int errors_ok; int unlink_on_fail; + int deny_rename; alpm_list_t *servers; #ifdef HAVE_LIBCURL CURLcode curlerr; /* last error produced by curl */ -- 1.8.4
participants (3)
-
Allan McRae
-
Christian Hesse
-
Dave Reisner