package: Suppress version mismatch errors where V1 is supported
* Add flags parameter to Init() of BPackageReader and friends. * Introduce flag B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE and don't print a version mismatch error when given. * package extract/list: Use the new flag.
This commit is contained in:
parent
64bb883062
commit
d59e0feb59
@ -166,6 +166,14 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// Reader Init() flags
|
||||||
|
enum {
|
||||||
|
B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE = 0x01
|
||||||
|
// Fail silently when encountering a package format version mismatch.
|
||||||
|
// Don't print anything to the error output.
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
B_HPKG_COMPRESSION_LEVEL_NONE = 0,
|
B_HPKG_COMPRESSION_LEVEL_NONE = 0,
|
||||||
B_HPKG_COMPRESSION_LEVEL_FASTEST = 1,
|
B_HPKG_COMPRESSION_LEVEL_FASTEST = 1,
|
||||||
|
@ -31,8 +31,8 @@ public:
|
|||||||
BPackageReader(BErrorOutput* errorOutput);
|
BPackageReader(BErrorOutput* errorOutput);
|
||||||
~BPackageReader();
|
~BPackageReader();
|
||||||
|
|
||||||
status_t Init(const char* fileName);
|
status_t Init(const char* fileName, uint32 flags = 0);
|
||||||
status_t Init(int fd, bool keepFD);
|
status_t Init(int fd, bool keepFD, uint32 flags = 0);
|
||||||
status_t ParseContent(
|
status_t ParseContent(
|
||||||
BPackageContentHandler* contentHandler);
|
BPackageContentHandler* contentHandler);
|
||||||
status_t ParseContent(BLowLevelPackageContentHandler*
|
status_t ParseContent(BLowLevelPackageContentHandler*
|
||||||
|
@ -28,8 +28,8 @@ public:
|
|||||||
PackageReaderImpl(BErrorOutput* errorOutput);
|
PackageReaderImpl(BErrorOutput* errorOutput);
|
||||||
~PackageReaderImpl();
|
~PackageReaderImpl();
|
||||||
|
|
||||||
status_t Init(const char* fileName);
|
status_t Init(const char* fileName, uint32 flags);
|
||||||
status_t Init(int fd, bool keepFD);
|
status_t Init(int fd, bool keepFD, uint32 flags);
|
||||||
status_t ParseContent(
|
status_t ParseContent(
|
||||||
BPackageContentHandler* contentHandler);
|
BPackageContentHandler* contentHandler);
|
||||||
status_t ParseContent(BLowLevelPackageContentHandler*
|
status_t ParseContent(BLowLevelPackageContentHandler*
|
||||||
|
@ -89,7 +89,8 @@ protected:
|
|||||||
|
|
||||||
protected:
|
protected:
|
||||||
template<typename Header, uint32 kMagic, uint16 kVersion>
|
template<typename Header, uint32 kMagic, uint16 kVersion>
|
||||||
status_t Init(int fd, bool keepFD, Header& header);
|
status_t Init(int fd, bool keepFD, Header& header,
|
||||||
|
uint32 flags);
|
||||||
status_t InitHeapReader(uint32 compression,
|
status_t InitHeapReader(uint32 compression,
|
||||||
uint32 chunkSize, off_t offset,
|
uint32 chunkSize, off_t offset,
|
||||||
uint64 compressedSize,
|
uint64 compressedSize,
|
||||||
@ -316,7 +317,7 @@ private:
|
|||||||
|
|
||||||
template<typename Header, uint32 kMagic, uint16 kVersion>
|
template<typename Header, uint32 kMagic, uint16 kVersion>
|
||||||
status_t
|
status_t
|
||||||
ReaderImplBase::Init(int fd, bool keepFD, Header& header)
|
ReaderImplBase::Init(int fd, bool keepFD, Header& header, uint32 flags)
|
||||||
{
|
{
|
||||||
status_t error = _Init(fd, keepFD);
|
status_t error = _Init(fd, keepFD);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
@ -345,9 +346,11 @@ ReaderImplBase::Init(int fd, bool keepFD, Header& header)
|
|||||||
|
|
||||||
// version
|
// version
|
||||||
if (B_BENDIAN_TO_HOST_INT16(header.version) != kVersion) {
|
if (B_BENDIAN_TO_HOST_INT16(header.version) != kVersion) {
|
||||||
|
if ((flags & B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE) == 0) {
|
||||||
ErrorOutput()->PrintError("Error: Invalid/unsupported %s file "
|
ErrorOutput()->PrintError("Error: Invalid/unsupported %s file "
|
||||||
"version (%d)\n", fFileType,
|
"version (%d)\n", fFileType,
|
||||||
B_BENDIAN_TO_HOST_INT16(header.version));
|
B_BENDIAN_TO_HOST_INT16(header.version));
|
||||||
|
}
|
||||||
return B_MISMATCHED_VALUES;
|
return B_MISMATCHED_VALUES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -776,7 +776,8 @@ Package::Load()
|
|||||||
// try current package file format version
|
// try current package file format version
|
||||||
{
|
{
|
||||||
PackageReaderImpl packageReader(&errorOutput);
|
PackageReaderImpl packageReader(&errorOutput);
|
||||||
status_t error = packageReader.Init(fd, false);
|
status_t error = packageReader.Init(fd, false,
|
||||||
|
BHPKG::B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE);
|
||||||
if (error == B_OK) {
|
if (error == B_OK) {
|
||||||
// parse content
|
// parse content
|
||||||
LoaderContentHandler handler(this);
|
LoaderContentHandler handler(this);
|
||||||
|
@ -82,6 +82,12 @@ struct VersionPolicyV1 {
|
|||||||
return data.UncompressedSize();
|
return data.UncompressedSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline status_t InitReader(PackageReader& packageReader,
|
||||||
|
const char* fileName)
|
||||||
|
{
|
||||||
|
return packageReader.Init(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
static status_t GetHeapReader(PackageReader& packageReader,
|
static status_t GetHeapReader(PackageReader& packageReader,
|
||||||
HeapReaderBase*& _heapReader, bool& _mustDelete)
|
HeapReaderBase*& _heapReader, bool& _mustDelete)
|
||||||
{
|
{
|
||||||
@ -128,6 +134,14 @@ struct VersionPolicyV2 {
|
|||||||
return data.Size();
|
return data.Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline status_t InitReader(PackageReader& packageReader,
|
||||||
|
const char* fileName)
|
||||||
|
{
|
||||||
|
return packageReader.Init(fileName,
|
||||||
|
BPackageKit::BHPKG
|
||||||
|
::B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE);
|
||||||
|
}
|
||||||
|
|
||||||
static status_t GetHeapReader(PackageReader& packageReader,
|
static status_t GetHeapReader(PackageReader& packageReader,
|
||||||
HeapReaderBase*& _heapReader, bool& _mustDelete)
|
HeapReaderBase*& _heapReader, bool& _mustDelete)
|
||||||
{
|
{
|
||||||
@ -755,7 +769,7 @@ do_extract(const char* packageFileName, const char* changeToDirectory,
|
|||||||
}
|
}
|
||||||
|
|
||||||
typename VersionPolicy::PackageReader packageReader(&errorOutput);
|
typename VersionPolicy::PackageReader packageReader(&errorOutput);
|
||||||
status_t error = packageReader.Init(packageFileName);
|
status_t error = VersionPolicy::InitReader(packageReader, packageFileName);
|
||||||
if (error != B_OK) {
|
if (error != B_OK) {
|
||||||
if (ignoreVersionError && error == B_MISMATCHED_VALUES)
|
if (ignoreVersionError && error == B_MISMATCHED_VALUES)
|
||||||
return;
|
return;
|
||||||
|
@ -47,6 +47,12 @@ struct VersionPolicyV1 {
|
|||||||
{
|
{
|
||||||
return data.UncompressedSize();
|
return data.UncompressedSize();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline status_t InitReader(PackageReader& packageReader,
|
||||||
|
const char* fileName)
|
||||||
|
{
|
||||||
|
return packageReader.Init(fileName);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
struct VersionPolicyV2 {
|
struct VersionPolicyV2 {
|
||||||
@ -60,6 +66,14 @@ struct VersionPolicyV2 {
|
|||||||
{
|
{
|
||||||
return data.Size();
|
return data.Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline status_t InitReader(PackageReader& packageReader,
|
||||||
|
const char* fileName)
|
||||||
|
{
|
||||||
|
return packageReader.Init(fileName,
|
||||||
|
BPackageKit::BHPKG
|
||||||
|
::B_HPKG_READER_DONT_PRINT_VERSION_MISMATCH_MESSAGE);
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -370,7 +384,7 @@ do_list(const char* packageFileName, bool listAttributes, bool filePathsOnly,
|
|||||||
// open package
|
// open package
|
||||||
BStandardErrorOutput errorOutput;
|
BStandardErrorOutput errorOutput;
|
||||||
typename VersionPolicy::PackageReader packageReader(&errorOutput);
|
typename VersionPolicy::PackageReader packageReader(&errorOutput);
|
||||||
status_t error = packageReader.Init(packageFileName);
|
status_t error = VersionPolicy::InitReader(packageReader, packageFileName);
|
||||||
if (error != B_OK) {
|
if (error != B_OK) {
|
||||||
if (ignoreVersionError && error == B_MISMATCHED_VALUES)
|
if (ignoreVersionError && error == B_MISMATCHED_VALUES)
|
||||||
return;
|
return;
|
||||||
|
@ -33,22 +33,22 @@ BPackageReader::~BPackageReader()
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BPackageReader::Init(const char* fileName)
|
BPackageReader::Init(const char* fileName, uint32 flags)
|
||||||
{
|
{
|
||||||
if (fImpl == NULL)
|
if (fImpl == NULL)
|
||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
|
|
||||||
return fImpl->Init(fileName);
|
return fImpl->Init(fileName, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
BPackageReader::Init(int fd, bool keepFD)
|
BPackageReader::Init(int fd, bool keepFD, uint32 flags)
|
||||||
{
|
{
|
||||||
if (fImpl == NULL)
|
if (fImpl == NULL)
|
||||||
return B_NO_INIT;
|
return B_NO_INIT;
|
||||||
|
|
||||||
return fImpl->Init(fd, keepFD);
|
return fImpl->Init(fd, keepFD, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -318,7 +318,7 @@ PackageReaderImpl::~PackageReaderImpl()
|
|||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
PackageReaderImpl::Init(const char* fileName)
|
PackageReaderImpl::Init(const char* fileName, uint32 flags)
|
||||||
{
|
{
|
||||||
// open file
|
// open file
|
||||||
int fd = open(fileName, O_RDONLY);
|
int fd = open(fileName, O_RDONLY);
|
||||||
@ -328,16 +328,16 @@ PackageReaderImpl::Init(const char* fileName)
|
|||||||
return errno;
|
return errno;
|
||||||
}
|
}
|
||||||
|
|
||||||
return Init(fd, true);
|
return Init(fd, true, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
PackageReaderImpl::Init(int fd, bool keepFD)
|
PackageReaderImpl::Init(int fd, bool keepFD, uint32 flags)
|
||||||
{
|
{
|
||||||
hpkg_header header;
|
hpkg_header header;
|
||||||
status_t error = inherited::Init<hpkg_header, B_HPKG_MAGIC, B_HPKG_VERSION>(
|
status_t error = inherited::Init<hpkg_header, B_HPKG_MAGIC, B_HPKG_VERSION>(
|
||||||
fd, keepFD, header);
|
fd, keepFD, header, flags);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
fHeapSize = HeapReader()->UncompressedHeapSize();
|
fHeapSize = HeapReader()->UncompressedHeapSize();
|
||||||
|
@ -624,7 +624,7 @@ PackageWriterImpl::_Init(const char* fileName,
|
|||||||
// in update mode, parse the TOC
|
// in update mode, parse the TOC
|
||||||
if ((Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) != 0) {
|
if ((Flags() & B_HPKG_WRITER_UPDATE_PACKAGE) != 0) {
|
||||||
PackageReaderImpl packageReader(fListener);
|
PackageReaderImpl packageReader(fListener);
|
||||||
result = packageReader.Init(FD(), false);
|
result = packageReader.Init(FD(), false, 0);
|
||||||
if (result != B_OK)
|
if (result != B_OK)
|
||||||
return result;
|
return result;
|
||||||
|
|
||||||
|
@ -74,7 +74,7 @@ RepositoryReaderImpl::Init(int fd, bool keepFD)
|
|||||||
{
|
{
|
||||||
hpkg_repo_header header;
|
hpkg_repo_header header;
|
||||||
status_t error = inherited::Init<hpkg_repo_header, B_HPKG_REPO_MAGIC,
|
status_t error = inherited::Init<hpkg_repo_header, B_HPKG_REPO_MAGIC,
|
||||||
B_HPKG_REPO_VERSION>(fd, keepFD, header);
|
B_HPKG_REPO_VERSION>(fd, keepFD, header, 0);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
return error;
|
return error;
|
||||||
|
|
||||||
|
@ -759,7 +759,7 @@ packagefs_mount_file(int fd, ::Directory*& _mountedDirectory)
|
|||||||
{
|
{
|
||||||
PackageLoaderErrorOutput errorOutput;
|
PackageLoaderErrorOutput errorOutput;
|
||||||
PackageReaderImpl packageReader(&errorOutput);
|
PackageReaderImpl packageReader(&errorOutput);
|
||||||
status_t error = packageReader.Init(fd, false);
|
status_t error = packageReader.Init(fd, false, 0);
|
||||||
if (error != B_OK)
|
if (error != B_OK)
|
||||||
RETURN_ERROR(error);
|
RETURN_ERROR(error);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user