diff --git a/headers/os/package/hpkg/HPKGDefs.h b/headers/os/package/hpkg/HPKGDefs.h index 5f45be9e34..5de3998edb 100644 --- a/headers/os/package/hpkg/HPKGDefs.h +++ b/headers/os/package/hpkg/HPKGDefs.h @@ -73,11 +73,13 @@ enum { // maximum number of bytes of data to be encoded inline; more will be allocated // on the heap -#define B_HPKG_MAX_INLINE_DATA_SIZE 8 +enum { + B_HPKG_MAX_INLINE_DATA_SIZE = 8 +}; // name of file containing package information (in package's root folder) -#define B_HPKG_PACKAGE_INFO_FILE_NAME ".PackageInfo" +extern const char* const B_HPKG_PACKAGE_INFO_FILE_NAME; // package attribute IDs diff --git a/headers/os/package/hpkg/PackageInfoAttributeValue.h b/headers/os/package/hpkg/PackageInfoAttributeValue.h index b888a016a5..8cc785b6e7 100644 --- a/headers/os/package/hpkg/PackageInfoAttributeValue.h +++ b/headers/os/package/hpkg/PackageInfoAttributeValue.h @@ -8,6 +8,8 @@ #include +#include + #include #include #include diff --git a/headers/private/package/hpkg/HPKGDefsPrivate.h b/headers/private/package/hpkg/HPKGDefsPrivate.h index 3f97d2b346..edbdb7f6fd 100644 --- a/headers/private/package/hpkg/HPKGDefsPrivate.h +++ b/headers/private/package/hpkg/HPKGDefsPrivate.h @@ -64,17 +64,41 @@ struct hpkg_repo_header { // attribute tag arithmetics // (using 6 bits for id, 3 for type, 1 for hasChildren and 2 for encoding) -#define HPKG_ATTRIBUTE_TAG_COMPOSE(id, type, encoding, hasChildren) \ - (((uint16(encoding) << 10) | (uint16((hasChildren) ? 1 : 0) << 9) \ - | (uint16(type) << 6) | (uint16(id))) + 1) -#define HPKG_ATTRIBUTE_TAG_ENCODING(tag) \ - ((uint16((tag) - 1) >> 10) & 0x3) -#define HPKG_ATTRIBUTE_TAG_HAS_CHILDREN(tag) \ - (((uint16((tag) - 1) >> 9) & 0x1) != 0) -#define HPKG_ATTRIBUTE_TAG_TYPE(tag) \ - ((uint16((tag) - 1) >> 6) & 0x7) -#define HPKG_ATTRIBUTE_TAG_ID(tag) \ - (uint16((tag) - 1) & 0x3f) +static inline uint16 +compose_attribute_tag(uint16 id, uint16 type, uint16 encoding, bool hasChildren) +{ + return ((encoding << 10) | (uint16(hasChildren ? 1 : 0) << 9) | (type << 6) + | id) + + 1; +} + + +static inline uint16 +attribute_tag_encoding(uint16 tag) +{ + return ((tag - 1) >> 10) & 0x3; +} + + +static inline bool +attribute_tag_has_children(uint16 tag) +{ + return (((tag - 1) >> 9) & 0x1) != 0; +} + + +static inline uint16 +attribute_tag_type(uint16 tag) +{ + return ((tag - 1) >> 6) & 0x7; +} + + +static inline uint16 +attribute_tag_id(uint16 tag) +{ + return (tag - 1) & 0x3f; +} } // namespace BPrivate diff --git a/src/add-ons/kernel/file_systems/packagefs/Jamfile b/src/add-ons/kernel/file_systems/packagefs/Jamfile index 7a4833ebea..5313fdca0f 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Jamfile +++ b/src/add-ons/kernel/file_systems/packagefs/Jamfile @@ -77,6 +77,7 @@ HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES = DataReader.cpp ErrorOutput.cpp FDDataReader.cpp + HPKGDefs.cpp PackageContentHandler.cpp PackageData.cpp PackageDataReader.cpp diff --git a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp index f04fd504e5..4a53765061 100644 --- a/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/volume/Volume.cpp @@ -956,8 +956,10 @@ Volume::_AddPackageContent(Package* package, bool notify) for (PackageNodeList::Iterator it = package->Nodes().GetIterator(); PackageNode* node = it.Next();) { // skip over ".PackageInfo" file, it isn't part of the package content - if (strcmp(node->Name(), B_HPKG_PACKAGE_INFO_FILE_NAME) == 0) + if (strcmp(node->Name(), + BPackageKit::BHPKG::B_HPKG_PACKAGE_INFO_FILE_NAME) == 0) { continue; + } error = _AddPackageContentRootNode(package, node, notify); if (error != B_OK) { _RemovePackageContent(package, node, notify); @@ -981,8 +983,10 @@ Volume::_RemovePackageContent(Package* package, PackageNode* endNode, PackageNode* nextNode = package->Nodes().GetNext(node); // skip over ".PackageInfo" file, it isn't part of the package content - if (strcmp(node->Name(), B_HPKG_PACKAGE_INFO_FILE_NAME) != 0) + if (strcmp(node->Name(), + BPackageKit::BHPKG::B_HPKG_PACKAGE_INFO_FILE_NAME) != 0) { _RemovePackageContentRootNode(package, node, NULL, notify); + } node = nextNode; } diff --git a/src/bin/package/PackageWritingUtils.cpp b/src/bin/package/PackageWritingUtils.cpp index da83e349b0..25cbe669e7 100644 --- a/src/bin/package/PackageWritingUtils.cpp +++ b/src/bin/package/PackageWritingUtils.cpp @@ -36,7 +36,8 @@ add_current_directory_entries(BPackageWriter& packageWriter, // skip the .PackageInfo, if requested if (skipPackageInfo - && strcmp(entry->d_name, B_HPKG_PACKAGE_INFO_FILE_NAME) == 0) { + && strcmp(entry->d_name, + BPackageKit::BHPKG::B_HPKG_PACKAGE_INFO_FILE_NAME) == 0) { continue; } diff --git a/src/bin/package/command_create.cpp b/src/bin/package/command_create.cpp index ff8ad02c9e..2e9d0275eb 100644 --- a/src/bin/package/command_create.cpp +++ b/src/bin/package/command_create.cpp @@ -150,8 +150,8 @@ command_create(int argc, const char* const* argv) } // add the .PackageInfo - result = packageWriter.AddEntry(B_HPKG_PACKAGE_INFO_FILE_NAME, - packageInfoFD); + result = packageWriter.AddEntry( + BPackageKit::BHPKG::B_HPKG_PACKAGE_INFO_FILE_NAME, packageInfoFD); if (result != B_OK) return 1; diff --git a/src/build/libpackage/Jamfile b/src/build/libpackage/Jamfile index 9cd255bf7e..f35bbc2076 100644 --- a/src/build/libpackage/Jamfile +++ b/src/build/libpackage/Jamfile @@ -28,6 +28,7 @@ HPKG_SOURCES = DataReader.cpp ErrorOutput.cpp FDDataReader.cpp + HPKGDefs.cpp PackageContentHandler.cpp PackageData.cpp PackageDataReader.cpp diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile index 628dd78ba3..8a92e8d7ae 100644 --- a/src/kits/package/Jamfile +++ b/src/kits/package/Jamfile @@ -19,6 +19,7 @@ HPKG_SOURCES = DataReader.cpp ErrorOutput.cpp FDDataReader.cpp + HPKGDefs.cpp PackageContentHandler.cpp PackageData.cpp PackageDataReader.cpp diff --git a/src/kits/package/hpkg/HPKGDefs.cpp b/src/kits/package/hpkg/HPKGDefs.cpp new file mode 100644 index 0000000000..f9d303c5f3 --- /dev/null +++ b/src/kits/package/hpkg/HPKGDefs.cpp @@ -0,0 +1,20 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + + +namespace BPackageKit { + +namespace BHPKG { + + +const char* const B_HPKG_PACKAGE_INFO_FILE_NAME = ".PackageInfo"; + + +} // namespace BHPKG + +} // namespace BPackageKit diff --git a/src/kits/package/hpkg/PackageReaderImpl.cpp b/src/kits/package/hpkg/PackageReaderImpl.cpp index 6f7b2986d8..40551e7b8b 100644 --- a/src/kits/package/hpkg/PackageReaderImpl.cpp +++ b/src/kits/package/hpkg/PackageReaderImpl.cpp @@ -433,6 +433,13 @@ PackageReaderImpl::Init(int fd, bool keepFD) return B_BAD_DATA; } + // version + if (B_BENDIAN_TO_HOST_INT16(header.version) != B_HPKG_VERSION) { + ErrorOutput()->PrintError("Error: Invalid/unsupported package file " + "version (%d)\n", B_BENDIAN_TO_HOST_INT16(header.version)); + return B_MISMATCHED_VALUES; + } + // header size fHeapOffset = B_BENDIAN_TO_HOST_INT16(header.header_size); if ((size_t)fHeapOffset < sizeof(hpkg_header)) { @@ -441,13 +448,6 @@ PackageReaderImpl::Init(int fd, bool keepFD) return B_BAD_DATA; } - // version - if (B_BENDIAN_TO_HOST_INT16(header.version) != B_HPKG_VERSION) { - ErrorOutput()->PrintError("Error: Invalid/unsupported package file " - "version (%d)\n", B_BENDIAN_TO_HOST_INT16(header.version)); - return B_BAD_DATA; - } - // total size fTotalSize = B_BENDIAN_TO_HOST_INT64(header.total_size); if (fTotalSize != (uint64)st.st_size) { diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp b/src/kits/package/hpkg/PackageWriterImpl.cpp index fa03dc6f01..f424eb7904 100644 --- a/src/kits/package/hpkg/PackageWriterImpl.cpp +++ b/src/kits/package/hpkg/PackageWriterImpl.cpp @@ -1442,7 +1442,7 @@ PackageWriterImpl::_WriteAttributeChildren(Attribute* attribute) while (Attribute* child = it.Next()) { // write tag uint8 encoding = child->value.ApplicableEncoding(); - WriteUnsignedLEB128(HPKG_ATTRIBUTE_TAG_COMPOSE(child->id, + WriteUnsignedLEB128(compose_attribute_tag(child->id, child->value.type, encoding, !child->children.IsEmpty())); // write value diff --git a/src/kits/package/hpkg/ReaderImplBase.cpp b/src/kits/package/hpkg/ReaderImplBase.cpp index 2f8c733679..3346df1cf3 100644 --- a/src/kits/package/hpkg/ReaderImplBase.cpp +++ b/src/kits/package/hpkg/ReaderImplBase.cpp @@ -799,7 +799,7 @@ ReaderImplBase::_ReadAttribute(uint8& _id, AttributeValue& _value, if (tag != 0) { // get the type - uint16 type = HPKG_ATTRIBUTE_TAG_TYPE(tag); + uint16 type = attribute_tag_type(tag); if (type >= B_HPKG_ATTRIBUTE_TYPE_ENUM_COUNT) { fErrorOutput->PrintError("Error: Invalid %s section: attribute " "type %d not supported!\n", fCurrentSection->name, type); @@ -807,12 +807,12 @@ ReaderImplBase::_ReadAttribute(uint8& _id, AttributeValue& _value, } // get the value - error = ReadAttributeValue(type, HPKG_ATTRIBUTE_TAG_ENCODING(tag), + error = ReadAttributeValue(type, attribute_tag_encoding(tag), _value); if (error != B_OK) return error; - _id = HPKG_ATTRIBUTE_TAG_ID(tag); + _id = attribute_tag_id(tag); if (_id >= B_HPKG_ATTRIBUTE_ID_ENUM_COUNT) { fErrorOutput->PrintError("Error: Invalid %s section: " "attribute id %d not supported!\n", fCurrentSection->name, _id); @@ -821,7 +821,7 @@ ReaderImplBase::_ReadAttribute(uint8& _id, AttributeValue& _value, } if (_hasChildren != NULL) - *_hasChildren = HPKG_ATTRIBUTE_TAG_HAS_CHILDREN(tag); + *_hasChildren = attribute_tag_has_children(tag); if (_tag != NULL) *_tag = tag; diff --git a/src/kits/package/hpkg/WriterImplBase.cpp b/src/kits/package/hpkg/WriterImplBase.cpp index 9b85cd16f8..94da235d01 100644 --- a/src/kits/package/hpkg/WriterImplBase.cpp +++ b/src/kits/package/hpkg/WriterImplBase.cpp @@ -782,7 +782,7 @@ WriterImplBase::_WritePackageAttributes( uint8 encoding = attribute->ApplicableEncoding(); // write tag - WriteUnsignedLEB128(HPKG_ATTRIBUTE_TAG_COMPOSE( + WriteUnsignedLEB128(compose_attribute_tag( attribute->id, attribute->type, encoding, !attribute->children.IsEmpty()));