Author: bonefish Date: 2009-11-13 14:45:49 +0100 (Fri, 13 Nov 2009) New Revision: 34018 Changeset: http://dev.haiku-os.org/changeset/34018/haiku Added: haiku/trunk/headers/private/haiku_package/ haiku/trunk/headers/private/haiku_package/haiku_package.h haiku/trunk/src/bin/package/ haiku/trunk/src/bin/package/DataReader.cpp haiku/trunk/src/bin/package/DataReader.h haiku/trunk/src/bin/package/FDCloser.h haiku/trunk/src/bin/package/Jamfile haiku/trunk/src/bin/package/PackageAttributeValue.h haiku/trunk/src/bin/package/PackageData.cpp haiku/trunk/src/bin/package/PackageData.h haiku/trunk/src/bin/package/PackageDataReader.cpp haiku/trunk/src/bin/package/PackageDataReader.h haiku/trunk/src/bin/package/PackageEntry.cpp haiku/trunk/src/bin/package/PackageEntry.h haiku/trunk/src/bin/package/PackageEntryAttribute.cpp haiku/trunk/src/bin/package/PackageEntryAttribute.h haiku/trunk/src/bin/package/PackageReader.cpp haiku/trunk/src/bin/package/PackageReader.h haiku/trunk/src/bin/package/PackageWriter.cpp haiku/trunk/src/bin/package/PackageWriter.h haiku/trunk/src/bin/package/Stacker.h haiku/trunk/src/bin/package/Strings.cpp haiku/trunk/src/bin/package/Strings.h haiku/trunk/src/bin/package/command_create.cpp haiku/trunk/src/bin/package/command_dump.cpp haiku/trunk/src/bin/package/command_extract.cpp haiku/trunk/src/bin/package/command_list.cpp haiku/trunk/src/bin/package/package.cpp haiku/trunk/src/bin/package/package.h Modified: haiku/trunk/src/bin/Jamfile Log: Implemented a tool ("package") that implements creation and extraction of packages of the newly invented Haiku Package format (http://dev.haiku-os.org/wiki/PackageFormat). It basically works, but it's still work in progress (e.g. compression is not implemented yet), as is the format itself. Added: haiku/trunk/headers/private/haiku_package/haiku_package.h =================================================================== --- haiku/trunk/headers/private/haiku_package/haiku_package.h (rev 0) +++ haiku/trunk/headers/private/haiku_package/haiku_package.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,155 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef _HAIKU_PACKAGE_H +#define _HAIKU_PACKAGE_H + + +#include <SupportDefs.h> + + +// header +struct hpkg_header { + uint32 magic; // "hpkg" + uint16 header_size; + uint16 version; + uint64 total_size; + + // package attributes section + uint32 attributes_compression; + uint32 attributes_length_compressed; + uint32 attributes_length_uncompressed; + + // TOC section + uint32 toc_compression; + uint64 toc_length_compressed; + uint64 toc_length_uncompressed; + + uint64 toc_attribute_types_length; + uint64 toc_attribute_types_count; + uint64 toc_strings_length; + uint64 toc_strings_count; +}; + + +// magic, version +enum { + B_HPKG_MAGIC = 'hpkg', + B_HPKG_VERSION = 1 +}; + + +// compression types +enum { + B_HPKG_COMPRESSION_NONE = 0, + B_HPKG_COMPRESSION_ZLIB = 1 +}; + + +// attribute types +enum { + // types + B_HPKG_ATTRIBUTE_TYPE_INVALID = 0, + B_HPKG_ATTRIBUTE_TYPE_INT = 1, + B_HPKG_ATTRIBUTE_TYPE_UINT = 2, + B_HPKG_ATTRIBUTE_TYPE_STRING = 3, + B_HPKG_ATTRIBUTE_TYPE_RAW = 4 +}; + + +// attribute encodings +enum { + // signed/unsigned int encodings + B_HPKG_ATTRIBUTE_ENCODING_INT_8_BIT = 0, + B_HPKG_ATTRIBUTE_ENCODING_INT_16_BIT = 1, + B_HPKG_ATTRIBUTE_ENCODING_INT_32_BIT = 2, + B_HPKG_ATTRIBUTE_ENCODING_INT_64_BIT = 3, + + // string encodings + B_HPKG_ATTRIBUTE_ENCODING_STRING_INLINE = 0, + // null-terminated string + B_HPKG_ATTRIBUTE_ENCODING_STRING_TABLE = 1, + // unsigned LEB128 index into string table + + // raw data encodings + B_HPKG_ATTRIBUTE_ENCODING_RAW_INLINE = 0, + // unsigned LEB128 size, raw bytes + B_HPKG_ATTRIBUTE_ENCODING_RAW_HEAP = 1 + // unsigned LEB128 size, unsigned LEB128 offset into the heap +}; + + +// attribute tag arithmetics +#define B_HPKG_ATTRIBUTE_TAG_COMPOSE(index, encoding, hasChildren) \ + (((uint64(index) << 3) | uint64(encoding) << 1 \ + | ((hasChildren) ? 1 : 0)) + 1) +#define B_HPKG_ATTRIBUTE_TAG_INDEX(tag) (uint64((tag) - 1) >> 3) +#define B_HPKG_ATTRIBUTE_TAG_ENCODING(tag) ((uint64((tag) - 1) >> 1) & 0x3) +#define B_HPKG_ATTRIBUTE_TAG_HAS_CHILDREN(tag) ((uint64((tag) - 1) & 0x1) != 0) + + +// standard attribute names +#define B_HPKG_ATTRIBUTE_NAME_DIRECTORY_ENTRY "dir:entry" + // path/entry name (string) +#define B_HPKG_ATTRIBUTE_NAME_FILE_TYPE "file:type" + // file type (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_PERMISSIONS "file:permissions" + // file permissions (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_USER "file:user" + // file user (string) +#define B_HPKG_ATTRIBUTE_NAME_FILE_GROUP "file:group" + // file group (string) +#define B_HPKG_ATTRIBUTE_NAME_FILE_ATIME "file:atime" + // file access time in seconds (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_MTIME "file:mtime" + // file modification time in seconds (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_CRTIME "file:crtime" + // file creation time in seconds (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_ATIME_NANOS "file:atime:nanos" + // file access time nanoseconds fraction (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_MTIME_NANOS "file:mtime:nanos" + // file modification time nanoseconds fraction (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_CRTIM_NANOS "file:crtime:nanos" + // file creation time nanoseconds fraction (uint) +#define B_HPKG_ATTRIBUTE_NAME_FILE_ATTRIBUTE "file:attribute" + // file attribute (string) +#define B_HPKG_ATTRIBUTE_NAME_FILE_ATTRIBUTE_TYPE "file:attribute:type" + // file attribute type (uint) +#define B_HPKG_ATTRIBUTE_NAME_DATA "data" + // (file/attribute) data (raw) +#define B_HPKG_ATTRIBUTE_NAME_DATA_COMPRESSION "data:compression" + // (file/attribute) data compression (uint, default: none) +#define B_HPKG_ATTRIBUTE_NAME_DATA_SIZE "data:size" + // (file/attribute) uncompressed data size (uint) +#define B_HPKG_ATTRIBUTE_NAME_DATA_CHUNK_SIZE "data:chunk_size" + // the size of compressed (file/attribute) data chunks (uint) +#define B_HPKG_ATTRIBUTE_NAME_SYMLINK_PATH "symlink:path" + // symlink path (string) + + +// file types (B_HPKG_ATTRIBUTE_NAME_FILE_TYPE) +enum { + B_HPKG_FILE_TYPE_FILE = 0, + B_HPKG_FILE_TYPE_DIRECTORY = 1, + B_HPKG_FILE_TYPE_SYMLINK = 2 +}; + + +// 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 + + +// default values +enum { + B_HPKG_DEFAULT_FILE_TYPE = B_HPKG_FILE_TYPE_FILE, + B_HPKG_DEFAULT_FILE_PERMISSIONS = 0644, + B_HPKG_DEFAULT_DIRECTORY_PERMISSIONS = 0755, + B_HPKG_DEFAULT_SYMLINK_PERMISSIONS = 0777, + B_HPKG_DEFAULT_DATA_COMPRESSION = B_HPKG_COMPRESSION_NONE, + B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB = 64 * 1024 +}; + + +#endif // _HAIKU_PACKAGE_H Modified: haiku/trunk/src/bin/Jamfile =================================================================== --- haiku/trunk/src/bin/Jamfile 2009-11-13 00:16:21 UTC (rev 34017) +++ haiku/trunk/src/bin/Jamfile 2009-11-13 13:45:49 UTC (rev 34018) @@ -218,6 +218,7 @@ SubInclude HAIKU_TOP src bin mkdos ; SubInclude HAIKU_TOP src bin mkfs ; SubInclude HAIKU_TOP src bin multiuser ; +SubInclude HAIKU_TOP src bin package ; SubInclude HAIKU_TOP src bin patch ; SubInclude HAIKU_TOP src bin pc ; SubInclude HAIKU_TOP src bin pcmcia-cs ; Added: haiku/trunk/src/bin/package/DataReader.cpp =================================================================== --- haiku/trunk/src/bin/package/DataReader.cpp (rev 0) +++ haiku/trunk/src/bin/package/DataReader.cpp 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,67 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "DataReader.h" + +#include <errno.h> +#include <string.h> +#include <unistd.h> + + +// #pragma mark - DataReader + + +DataReader::~DataReader() +{ +} + + +// #pragma mark - FDDataReader + + +FDDataReader::FDDataReader(int fd) + : + fFD(fd) +{ +} + + +status_t +FDDataReader::ReadData(off_t offset, void* buffer, size_t size) +{ + ssize_t bytesRead = pread(fFD, buffer, size, offset); + if (bytesRead < 0) + return errno; + return (size_t)bytesRead == size ? B_OK : B_ERROR; +} + + +// #pragma mark - BufferDataReader + + +BufferDataReader::BufferDataReader(const void* data, size_t size) + : + fData(data), + fSize(size) +{ +} + + +status_t +BufferDataReader::ReadData(off_t offset, void* buffer, size_t size) +{ + if (size == 0) + return B_OK; + + if (offset < 0) + return B_BAD_VALUE; + + if (size > fSize || offset > fSize - size) + return B_ERROR; + + memcpy(buffer, (const uint8*)fData + offset, size); + return B_OK; +} Added: haiku/trunk/src/bin/package/DataReader.h =================================================================== --- haiku/trunk/src/bin/package/DataReader.h (rev 0) +++ haiku/trunk/src/bin/package/DataReader.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,46 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef DATA_READER_H +#define DATA_READER_H + + +#include <SupportDefs.h> + + +class DataReader { +public: + virtual ~DataReader(); + + virtual status_t ReadData(off_t offset, void* buffer, + size_t size) = 0; +}; + + +class FDDataReader : public DataReader { +public: + FDDataReader(int fd); + + virtual status_t ReadData(off_t offset, void* buffer, + size_t size); + +private: + int fFD; +}; + + +class BufferDataReader : public DataReader { +public: + BufferDataReader(const void* data, size_t size); + + virtual status_t ReadData(off_t offset, void* buffer, + size_t size); + +private: + const void* fData; + size_t fSize; +}; + + +#endif // DATA_READER_H Added: haiku/trunk/src/bin/package/FDCloser.h =================================================================== --- haiku/trunk/src/bin/package/FDCloser.h (rev 0) +++ haiku/trunk/src/bin/package/FDCloser.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,27 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef FD_CLOSER_H +#define FD_CLOSER_H + + +struct FDCloser { + FDCloser(int fd) + : + fFD(fd) + { + } + + ~FDCloser() + { + if (fFD >= 0) + close(fFD); + } + +private: + int fFD; +}; + + +#endif // FD_CLOSER_H Added: haiku/trunk/src/bin/package/Jamfile =================================================================== --- haiku/trunk/src/bin/package/Jamfile (rev 0) +++ haiku/trunk/src/bin/package/Jamfile 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,25 @@ +SubDir HAIKU_TOP src bin package ; + +UsePrivateHeaders kernel shared ; +UsePrivateHeaders haiku_package ; + +DEFINES += B_ENABLE_INCOMPLETE_POSIX_AT_SUPPORT ; + # TODO: Remove when it is complete! + +BinCommand package : + command_create.cpp + command_dump.cpp + command_extract.cpp + command_list.cpp + DataReader.cpp + package.cpp + PackageData.cpp + PackageDataReader.cpp + PackageEntry.cpp + PackageEntryAttribute.cpp + PackageReader.cpp + PackageWriter.cpp + Strings.cpp + : + $(TARGET_LIBSUPC++) +; Added: haiku/trunk/src/bin/package/PackageAttributeValue.h =================================================================== --- haiku/trunk/src/bin/package/PackageAttributeValue.h (rev 0) +++ haiku/trunk/src/bin/package/PackageAttributeValue.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,147 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_ATTRIBUTE_VALUE_H +#define PACKAGE_ATTRIBUTE_VALUE_H + + +#include <string.h> + +#include <haiku_package.h> + + +struct PackageAttributeValue { + union { + int64 signedInt; + uint64 unsignedInt; + const char* string; + struct { + uint64 size; + union { + uint64 offset; + uint8 raw[B_HPKG_MAX_INLINE_DATA_SIZE]; + }; + } data; + }; + uint8 type; + uint8 encoding; + +public: + inline PackageAttributeValue(); + + inline void SetTo(int8 value); + inline void SetTo(uint8 value); + inline void SetTo(int16 value); + inline void SetTo(uint16 value); + inline void SetTo(int32 value); + inline void SetTo(uint32 value); + inline void SetTo(int64 value); + inline void SetTo(uint64 value); + inline void SetTo(const char* value); + inline void SetToData(uint64 size, uint64 offset); + inline void SetToData(uint64 size, const void* rawData); +}; + + +PackageAttributeValue::PackageAttributeValue() + : + type(B_HPKG_ATTRIBUTE_TYPE_INVALID) +{ +} + + +void +PackageAttributeValue::SetTo(int8 value) +{ + signedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_INT; +} + + +void +PackageAttributeValue::SetTo(uint8 value) +{ + unsignedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_UINT; +} + + +void +PackageAttributeValue::SetTo(int16 value) +{ + signedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_INT; +} + + +void +PackageAttributeValue::SetTo(uint16 value) +{ + unsignedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_UINT; +} + + +void +PackageAttributeValue::SetTo(int32 value) +{ + signedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_INT; +} + + +void +PackageAttributeValue::SetTo(uint32 value) +{ + unsignedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_UINT; +} + + +void +PackageAttributeValue::SetTo(int64 value) +{ + signedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_INT; +} + + +void +PackageAttributeValue::SetTo(uint64 value) +{ + unsignedInt = value; + type = B_HPKG_ATTRIBUTE_TYPE_UINT; +} + + +void +PackageAttributeValue::SetTo(const char* value) +{ + string = value; + type = B_HPKG_ATTRIBUTE_TYPE_STRING; +} + + +void +PackageAttributeValue::SetToData(uint64 size, uint64 offset) +{ + data.size = size; + data.offset = offset; + type = B_HPKG_ATTRIBUTE_TYPE_RAW; + encoding = B_HPKG_ATTRIBUTE_ENCODING_RAW_HEAP; +} + + +void +PackageAttributeValue::SetToData(uint64 size, const void* rawData) +{ + data.size = size; + if (size > 0) + memcpy(data.raw, rawData, size); + type = B_HPKG_ATTRIBUTE_TYPE_RAW; + encoding = B_HPKG_ATTRIBUTE_ENCODING_RAW_INLINE; +} + + +#endif // PACKAGE_ATTRIBUTE_VALUE_H Added: haiku/trunk/src/bin/package/PackageData.cpp =================================================================== --- haiku/trunk/src/bin/package/PackageData.cpp (rev 0) +++ haiku/trunk/src/bin/package/PackageData.cpp 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,38 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "PackageData.h" + +#include <string.h> + + +PackageData::PackageData() + : + fCompressedSize(0), + fUncompressedSize(0), + fCompression(B_HPKG_COMPRESSION_NONE), + fEncodedInline(true) +{ +} + + +void +PackageData::SetData(uint64 size, uint64 offset) +{ + fUncompressedSize = fCompressedSize = size; + fOffset = offset; + fEncodedInline = false; +} + + +void +PackageData::SetData(uint8 size, const void* data) +{ + fUncompressedSize = fCompressedSize = size; + if (size > 0) + memcpy(fInlineData, data, size); + fEncodedInline = true; +} Added: haiku/trunk/src/bin/package/PackageData.h =================================================================== --- haiku/trunk/src/bin/package/PackageData.h (rev 0) +++ haiku/trunk/src/bin/package/PackageData.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,47 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_DATA_H +#define PACKAGE_DATA_H + + +#include <haiku_package.h> + + +class PackageData { +public: + PackageData(); + + uint64 CompressedSize() const + { return fCompressedSize; } + uint64 UncompressedSize() const + { return fUncompressedSize; } + uint64 Offset() const { return fOffset; } + uint32 Compression() const { return fCompression; } + + bool IsEncodedInline() const + { return fEncodedInline; } + const uint8* InlineData() const { return fInlineData; } + + void SetData(uint64 size, uint64 offset); + void SetData(uint8 size, const void* data); + + void SetCompression(uint32 compression) + { fCompression = compression; } + void SetUncompressedSize(uint64 size) + { fUncompressedSize = size; } + +private: + uint64 fCompressedSize; + uint64 fUncompressedSize; + union { + uint64 fOffset; + uint8 fInlineData[B_HPKG_MAX_INLINE_DATA_SIZE]; + }; + uint32 fCompression; + bool fEncodedInline; +}; + + +#endif // PACKAGE_DATA_H Added: haiku/trunk/src/bin/package/PackageDataReader.cpp =================================================================== --- haiku/trunk/src/bin/package/PackageDataReader.cpp (rev 0) +++ haiku/trunk/src/bin/package/PackageDataReader.cpp 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,112 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "PackageDataReader.h" + +#include <new> + +#include <haiku_package.h> + +#include "PackageData.h" + + +// #pragma mark - PackageDataReader + + +PackageDataReader::PackageDataReader(DataReader* dataReader) + : + fDataReader(dataReader) +{ +} + + +PackageDataReader::~PackageDataReader() +{ +} + + +// #pragma mark - UncompressedPackageDataReader + + +class UncompressedPackageDataReader : public PackageDataReader { +public: + UncompressedPackageDataReader(DataReader* dataReader) + : + PackageDataReader(dataReader) + { + } + + status_t Init(const PackageData& data) + { + fOffset = data.Offset(); + fSize = data.UncompressedSize(); + return B_OK; + } + + virtual uint64 Size() const + { + return fSize; + } + + virtual size_t BlockSize() const + { + // TODO: Some other value? + return 64 * 1024; + } + + virtual status_t ReadData(off_t offset, void* buffer, size_t size) + { + if (size == 0) + return B_OK; + + if (offset < 0) + return B_BAD_VALUE; + + if ((uint64)offset > fSize || size > fSize - offset) + return B_ERROR; + + return fDataReader->ReadData(fOffset + offset, buffer, size); + } + +private: + uint64 fOffset; + uint64 fSize; +}; + + +// #pragma mark - PackageDataReaderFactory + + +/*static*/ status_t +PackageDataReaderFactory::CreatePackageDataReader(DataReader* dataReader, + const PackageData& data, PackageDataReader*& _reader) +{ + PackageDataReader* reader; + + switch (data.Compression()) { + case B_HPKG_COMPRESSION_NONE: + reader = new(std::nothrow) UncompressedPackageDataReader( + dataReader); + break; + case B_HPKG_COMPRESSION_ZLIB: + // TODO:... + return B_UNSUPPORTED;; + default: + return B_BAD_VALUE; + } + + if (reader == NULL) + return B_NO_MEMORY; + + status_t error = reader->Init(data); + if (error != B_OK) { + delete reader; + return error; + } + + _reader = reader; + return B_OK; +} Added: haiku/trunk/src/bin/package/PackageDataReader.h =================================================================== --- haiku/trunk/src/bin/package/PackageDataReader.h (rev 0) +++ haiku/trunk/src/bin/package/PackageDataReader.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,38 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_DATA_READER_H +#define PACKAGE_DATA_READER_H + + +#include "DataReader.h" + + +class PackageData; + + +class PackageDataReader : public DataReader { +public: + PackageDataReader(DataReader* dataReader); + virtual ~PackageDataReader(); + + virtual status_t Init(const PackageData& data) = 0; + + virtual uint64 Size() const = 0; + virtual size_t BlockSize() const = 0; + +protected: + DataReader* fDataReader; +}; + + +class PackageDataReaderFactory { +public: + static status_t CreatePackageDataReader(DataReader* dataReader, + const PackageData& data, + PackageDataReader*& _reader); +}; + + +#endif // PACKAGE_DATA_READER_H Added: haiku/trunk/src/bin/package/PackageEntry.cpp =================================================================== --- haiku/trunk/src/bin/package/PackageEntry.cpp (rev 0) +++ haiku/trunk/src/bin/package/PackageEntry.cpp 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,24 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "PackageEntry.h" + + +PackageEntry::PackageEntry(PackageEntry* parent, const char* name) + : + fParent(parent), + fName(name), + fUserToken(NULL), + fMode(S_IFREG | S_IRUSR | S_IRGRP | S_IROTH), + fSymlinkPath(NULL) +{ + fAccessTime.tv_sec = 0; + fAccessTime.tv_nsec = 0; + fModifiedTime.tv_sec = 0; + fModifiedTime.tv_nsec = 0; + fCreationTime.tv_sec = 0; + fCreationTime.tv_nsec = 0; +} Added: haiku/trunk/src/bin/package/PackageEntry.h =================================================================== --- haiku/trunk/src/bin/package/PackageEntry.h (rev 0) +++ haiku/trunk/src/bin/package/PackageEntry.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,84 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_ENTRY_H +#define PACKAGE_ENTRY_H + + +#include <sys/stat.h> + +#include "PackageData.h" + + +class PackageEntry { +public: + PackageEntry(PackageEntry* parent, + const char* name); + + const PackageEntry* Parent() const { return fParent; } + const char* Name() const { return fName; } + void* UserToken() const { return fUserToken; } + + mode_t Mode() const { return fMode; } + + const timespec& AccessTime() const + { return fAccessTime; } + const timespec& ModifiedTime() const + { return fModifiedTime; } + const timespec& CreationTime() const + { return fCreationTime; } + + PackageData& Data() { return fData; } + + const char* SymlinkPath() const { return fSymlinkPath; } + + void SetUserToken(void* token) + { fUserToken = token; } + + void SetType(uint32 type); + void SetPermissions(uint32 permissions); + + void SetAccessTime(uint32 seconds) + { fAccessTime.tv_sec = seconds; } + void SetAccessTimeNanos(uint32 nanos) + { fAccessTime.tv_nsec = nanos; } + void SetModifiedTime(uint32 seconds) + { fModifiedTime.tv_sec = seconds; } + void SetModifiedTimeNanos(uint32 nanos) + { fModifiedTime.tv_nsec = nanos; } + void SetCreationTime(uint32 seconds) + { fCreationTime.tv_sec = seconds; } + void SetCreationTimeNanos(uint32 nanos) + { fCreationTime.tv_nsec = nanos; } + + void SetSymlinkPath(const char* path) + { fSymlinkPath = path; } +private: + PackageEntry* fParent; + const char* fName; + void* fUserToken; + mode_t fMode; + timespec fAccessTime; + timespec fModifiedTime; + timespec fCreationTime; + PackageData fData; + const char* fSymlinkPath; +}; + + +inline void +PackageEntry::SetType(uint32 type) +{ + fMode = (fMode & ~(uint32)S_IFMT) | (type & S_IFMT); +} + + +inline void +PackageEntry::SetPermissions(uint32 permissions) +{ + fMode = (fMode & ~(uint32)ALLPERMS) | (permissions & ALLPERMS); +} + + +#endif // PACKAGE_ENTRY_H Added: haiku/trunk/src/bin/package/PackageEntryAttribute.cpp =================================================================== --- haiku/trunk/src/bin/package/PackageEntryAttribute.cpp (rev 0) +++ haiku/trunk/src/bin/package/PackageEntryAttribute.cpp 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,15 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "PackageEntryAttribute.h" + + +PackageEntryAttribute::PackageEntryAttribute(const char* name) + : + fName(name), + fType(0) +{ +} Added: haiku/trunk/src/bin/package/PackageEntryAttribute.h =================================================================== --- haiku/trunk/src/bin/package/PackageEntryAttribute.h (rev 0) +++ haiku/trunk/src/bin/package/PackageEntryAttribute.h 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,30 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ +#ifndef PACKAGE_ENTRY_ATTRIBUTE_H +#define PACKAGE_ENTRY_ATTRIBUTE_H + + +#include "PackageData.h" + + +class PackageEntryAttribute { +public: + PackageEntryAttribute(const char* name); + + const char* Name() const { return fName; } + uint32 Type() const { return fType; } + + PackageData& Data() { return fData; } + + void SetType(uint32 type) { fType = type; } + +private: + const char* fName; + uint32 fType; + PackageData fData; +}; + + +#endif // PACKAGE_ENTRY_ATTRIBUTE_H Added: haiku/trunk/src/bin/package/PackageReader.cpp =================================================================== --- haiku/trunk/src/bin/package/PackageReader.cpp (rev 0) +++ haiku/trunk/src/bin/package/PackageReader.cpp 2009-11-13 13:45:49 UTC (rev 34018) @@ -0,0 +1,1276 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxxx + * Distributed under the terms of the MIT License. + */ + + +#include "PackageReader.h" + +#include <errno.h> +#include <fcntl.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <sys/stat.h> +#include <unistd.h> + +#include <new> + +#include <ByteOrder.h> + +#include <haiku_package.h> + +#include "PackageData.h" +#include "PackageEntry.h" +#include "PackageEntryAttribute.h" + + +// maximum TOC size, we support reading +static const size_t kMaxTOCSize = 64 * 1024 * 1024; + + +enum { + ATTRIBUTE_INDEX_DIRECTORY_ENTRY = 0, + ATTRIBUTE_INDEX_FILE_TYPE, + ATTRIBUTE_INDEX_FILE_PERMISSIONS, + ATTRIBUTE_INDEX_FILE_USER, + ATTRIBUTE_INDEX_FILE_GROUP, + ATTRIBUTE_INDEX_FILE_ATIME, + ATTRIBUTE_INDEX_FILE_MTIME, + ATTRIBUTE_INDEX_FILE_CRTIME, + ATTRIBUTE_INDEX_FILE_ATIME_NANOS, + ATTRIBUTE_INDEX_FILE_MTIME_NANOS, + ATTRIBUTE_INDEX_FILE_CRTIM_NANOS, [... truncated: 3819 lines follow ...]