#include <archive_entry.h>
#define INIT_ARCHIVE(ar) \
- archive_read_support_compression_all((ar)); \
- archive_read_support_format_all((ar))
+ archive_read_support_compression_gzip((ar)); \
+ archive_read_support_format_tar((ar))
using __gnu_cxx::stdio_filebuf;
struct archive* archive;
struct archive_entry* entry;
unsigned int i;
+ char buf[PATH_MAX];
+ string absroot;
archive = archive_read_new();
INIT_ARCHIVE(archive);
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
(real_filename.c_str()));
// Extract file
- unsigned int flags = ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_UNLINK;
+ unsigned int flags = ARCHIVE_EXTRACT_OWNER | ARCHIVE_EXTRACT_PERM | ARCHIVE_EXTRACT_TIME | ARCHIVE_EXTRACT_UNLINK;
if (archive_read_extract(archive, entry, flags) != ARCHIVE_OK) {
// If a file fails to install we just print an error message and