X-Git-Url: http://gitweb/?a=blobdiff_plain;f=pkgutil.cc;h=1bbb83d518fd7e49f0c3655ca76d5e18b3e6121f;hb=6a31b4ed420b0b829b000e3789a3508bbf0a3628;hp=216ca531de2dd92d507d474b42b5d3f8ccc70aad;hpb=d324dd089cd8d643a3d6616de11de178919e10e7;p=pkgutils-cross.git diff --git a/pkgutil.cc b/pkgutil.cc index 216ca53..1bbb83d 100644 --- a/pkgutil.cc +++ b/pkgutil.cc @@ -2,7 +2,7 @@ // pkgutils // // Copyright (c) 2000-2005 Per Liden -// Copyright (c) 2006-2007 by CRUX team (http://crux.nu) +// Copyright (c) 2006-2013 by CRUX team (http://crux.nu) // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by @@ -44,8 +44,12 @@ #include #define INIT_ARCHIVE(ar) \ - archive_read_support_compression_all((ar)); \ - archive_read_support_format_all((ar)) + archive_read_support_filter_gzip((ar)); \ + archive_read_support_filter_bzip2((ar)); \ + archive_read_support_filter_xz((ar)); \ + archive_read_support_format_tar((ar)) + +#define DEFAULT_BYTES_PER_BLOCK (20 * 512) using __gnu_cxx::stdio_filebuf; @@ -350,8 +354,8 @@ pair pkgutil::pkg_open(const string& filename) const INIT_ARCHIVE(archive); if (archive_read_open_filename(archive, - const_cast(filename.c_str()), - ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) + filename.c_str(), + DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) throw runtime_error_with_errno("could not open " + filename, archive_errno(archive)); for (i = 0; archive_read_next_header(archive, &entry) == @@ -374,7 +378,7 @@ pair pkgutil::pkg_open(const string& filename) const throw runtime_error("could not read " + filename); } - archive_read_finish(archive); + archive_read_free(archive); return result; } @@ -384,22 +388,25 @@ void pkgutil::pkg_install(const string& filename, const set& keep_list, struct archive* archive; struct archive_entry* entry; unsigned int i; + char buf[PATH_MAX]; + string absroot; archive = archive_read_new(); INIT_ARCHIVE(archive); if (archive_read_open_filename(archive, - const_cast(filename.c_str()), - ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) + filename.c_str(), + DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) throw runtime_error_with_errno("could not open " + filename, archive_errno(archive)); chdir(root.c_str()); + absroot = getcwd(buf, sizeof(buf)); for (i = 0; archive_read_next_header(archive, &entry) == ARCHIVE_OK; ++i) { string archive_filename = archive_entry_pathname(entry); - string reject_dir = trim_filename(root + string("/") + string(PKG_REJECTED)); - string original_filename = trim_filename(root + string("/") + archive_filename); + string reject_dir = trim_filename(absroot + string("/") + string(PKG_REJECTED)); + string original_filename = trim_filename(absroot + string("/") + archive_filename); string real_filename = original_filename; // Check if file is filtered out via INSTALL @@ -462,7 +469,7 @@ void pkgutil::pkg_install(const string& filename, const set& keep_list, throw runtime_error("could not read " + filename); } - archive_read_finish(archive); + archive_read_free(archive); } void pkgutil::ldconfig() const @@ -504,8 +511,8 @@ void pkgutil::pkg_footprint(string& filename) const INIT_ARCHIVE(archive); if (archive_read_open_filename(archive, - const_cast(filename.c_str()), - ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) + filename.c_str(), + DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) throw runtime_error_with_errno("could not open " + filename, archive_errno(archive)); for (i = 0; archive_read_next_header(archive, &entry) == @@ -523,7 +530,7 @@ void pkgutil::pkg_footprint(string& filename) const throw runtime_error_with_errno("could not read " + filename, archive_errno(archive)); } - archive_read_finish(archive); + archive_read_free(archive); // Too bad, there doesn't seem to be a way to reuse our archive // instance @@ -531,8 +538,8 @@ void pkgutil::pkg_footprint(string& filename) const INIT_ARCHIVE(archive); if (archive_read_open_filename(archive, - const_cast(filename.c_str()), - ARCHIVE_DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) + filename.c_str(), + DEFAULT_BYTES_PER_BLOCK) != ARCHIVE_OK) throw runtime_error_with_errno("could not open " + filename, archive_errno(archive)); for (i = 0; archive_read_next_header(archive, &entry) == @@ -605,7 +612,7 @@ void pkgutil::pkg_footprint(string& filename) const throw runtime_error("could not read " + filename); } - archive_read_finish(archive); + archive_read_free(archive); } void pkgutil::print_version() const