On 01/10/14 17:05, Andrew Gregory wrote:
> alpm's database files (.INSTALL, .MTREE, etc.) should be extracted no
> matter what; skip mtree/needbackup/noextract/noupgrade checks for them.
> 
> Signed-off-by: Andrew Gregory <[email protected]>

Ack.

> ---
>  lib/libalpm/add.c | 60 
> +++++++++++++++++++++++++++++--------------------------
>  1 file changed, 32 insertions(+), 28 deletions(-)
> 
> diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
> index a03af82..e5f5d42 100644
> --- a/lib/libalpm/add.c
> +++ b/lib/libalpm/add.c
> @@ -144,6 +144,29 @@ static int try_rename(alpm_handle_t *handle, const char 
> *src, const char *dest)
>       return 0;
>  }
>  
> +static int extract_db_file(alpm_handle_t *handle, struct archive *archive,
> +             struct archive_entry *entry, alpm_pkg_t *newpkg, const char 
> *entryname)
> +{
> +     char filename[PATH_MAX]; /* the actual file we're extracting */
> +     const char *dbfile;
> +     if(strcmp(entryname, ".INSTALL") == 0) {
> +             dbfile = "install";
> +     } else if(strcmp(entryname, ".CHANGELOG") == 0) {
> +             dbfile = "changelog";
> +     } else if(strcmp(entryname, ".MTREE") == 0) {
> +             dbfile = "mtree";
> +     } else if(*entryname == '.') {
> +             /* reserve all files starting with '.' for future possibilities 
> */
> +             _alpm_log(handle, ALPM_LOG_DEBUG, "skipping extraction of 
> '%s'\n", entryname);
> +             archive_read_data_skip(archive);
> +             return 0;
> +     }
> +     archive_entry_set_perm(entry, 0644);
> +     snprintf(filename, PATH_MAX, "%s%s-%s/%s",
> +                     _alpm_db_path(handle->db_local), newpkg->name, 
> newpkg->version, dbfile);
> +     return perform_extraction(handle, archive, entry, filename, filename);
> +}
> +

OK

>  static int extract_single_file(alpm_handle_t *handle, struct archive 
> *archive,
>               struct archive_entry *entry, alpm_pkg_t *newpkg, alpm_pkg_t 
> *oldpkg)
>  {
> @@ -157,36 +180,17 @@ static int extract_single_file(alpm_handle_t *handle, 
> struct archive *archive,
>       int errors = 0;
>       struct stat lsbuf;
>  
> -     if(strcmp(entryname, ".INSTALL") == 0) {
> -             /* the install script goes inside the db */
> -             snprintf(filename, PATH_MAX, "%s%s-%s/install",
> -                             _alpm_db_path(handle->db_local), newpkg->name, 
> newpkg->version);
> -             archive_entry_set_perm(entry, 0644);
> -     } else if(strcmp(entryname, ".CHANGELOG") == 0) {
> -             /* the changelog goes inside the db */
> -             snprintf(filename, PATH_MAX, "%s%s-%s/changelog",
> -                             _alpm_db_path(handle->db_local), newpkg->name, 
> newpkg->version);
> -             archive_entry_set_perm(entry, 0644);
> -     } else if(strcmp(entryname, ".MTREE") == 0) {
> -             /* the mtree file goes inside the db */
> -             snprintf(filename, PATH_MAX, "%s%s-%s/mtree",
> -                             _alpm_db_path(handle->db_local), newpkg->name, 
> newpkg->version);
> -             archive_entry_set_perm(entry, 0644);
> -     } else if(*entryname == '.') {
> -             /* for now, ignore all files starting with '.' that haven't
> -              * already been handled (for future possibilities) */
> -             _alpm_log(handle, ALPM_LOG_DEBUG, "skipping extraction of 
> '%s'\n", entryname);
> -             archive_read_data_skip(archive);
> +     if(*entryname == '.') {
> +             return extract_db_file(handle, archive, entry, newpkg, 
> entryname);
> +     }
> +

OK

> +     if (!alpm_filelist_contains(&newpkg->files, entryname)) {
> +             _alpm_log(handle, ALPM_LOG_WARNING, _("file not found in file 
> list for package %s. skipping extraction of %s\n"),
> +                             newpkg->name, entryname);
>               return 0;
> -     } else {
> -             if (!alpm_filelist_contains(&newpkg->files, entryname)) {
> -                     _alpm_log(handle, ALPM_LOG_WARNING, _("file not found 
> in file list for package %s. skipping extraction of %s\n"),
> -                                     newpkg->name, entryname);
> -                     return 0;
> -             }
> -             /* build the new entryname relative to handle->root */
> -             snprintf(filename, PATH_MAX, "%s%s", handle->root, entryname);
>       }
> +     /* build the new entryname relative to handle->root */
> +     snprintf(filename, PATH_MAX, "%s%s", handle->root, entryname);
>  
>       /* if a file is in NoExtract then we never extract it */
>       if(_alpm_fnmatch_patterns(handle->noextract, entryname) == 0) {
> 

OK.

Reply via email to