On 05/09/13 01:35, Christian Hesse wrote:
> From: Christian Hesse <[email protected]>
> 
> 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 */
> 


Reply via email to