diff options
author | Andrew Gregory <andrew.gregory.8@gmail.com> | 2014-10-01 07:35:31 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2015-01-21 05:27:47 +0100 |
commit | 4ba0561fe722aa5e68b8e4d68eb368cba5a9a0cb (patch) | |
tree | f415f5a068905879be29b93024e4836309358230 | |
parent | f917a4a55a30c7e4e38e5efc8401519677794617 (diff) | |
download | pacman-4ba0561fe722aa5e68b8e4d68eb368cba5a9a0cb.tar.gz pacman-4ba0561fe722aa5e68b8e4d68eb368cba5a9a0cb.tar.xz |
extract_single_file: factor out db file extraction
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 <andrew.gregory.8@gmail.com>
-rw-r--r-- | lib/libalpm/add.c | 60 |
1 files changed, 32 insertions, 28 deletions
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c index 76ecf1bc..edd913c1 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); +} + 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); + } + + 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) { |