Removed "udf_" prefix from udf on-disk data structures, as they already
live in the Udf:: namespace, and I'll be referencing them fully qualified in makeudfimage and don't feel like typing udf twice each time. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5474 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -61,7 +61,7 @@ public:
|
|||||||
\param isEmpty If set to true, indicates that the given extent is unrecorded
|
\param isEmpty If set to true, indicates that the given extent is unrecorded
|
||||||
and thus its contents should be interpreted as all zeros.
|
and thus its contents should be interpreted as all zeros.
|
||||||
*/
|
*/
|
||||||
status_t FindExtent(off_t start, udf_long_address *extent, bool *isEmpty) {
|
status_t FindExtent(off_t start, long_address *extent, bool *isEmpty) {
|
||||||
DEBUG_INIT_ETC(CF_PUBLIC | CF_FILE_OPS | CF_HIGH_VOLUME, "AllocationDescriptorList<>",
|
DEBUG_INIT_ETC(CF_PUBLIC | CF_FILE_OPS | CF_HIGH_VOLUME, "AllocationDescriptorList<>",
|
||||||
("start: %Ld, extent: %p, isEmpty: %p", start, extent, isEmpty));
|
("start: %Ld, extent: %p, isEmpty: %p", start, extent, isEmpty));
|
||||||
off_t startBlock = start >> fVolume->BlockShift();
|
off_t startBlock = start >> fVolume->BlockShift();
|
||||||
@@ -213,7 +213,7 @@ public:
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef udf_short_address DescriptorType;
|
typedef short_address DescriptorType;
|
||||||
|
|
||||||
inline uint8 GetType(DescriptorType &descriptor) const {
|
inline uint8 GetType(DescriptorType &descriptor) const {
|
||||||
return descriptor.type();
|
return descriptor.type();
|
||||||
@@ -236,7 +236,7 @@ private:
|
|||||||
|
|
||||||
class LongDescriptorAccessor {
|
class LongDescriptorAccessor {
|
||||||
public:
|
public:
|
||||||
typedef udf_long_address DescriptorType;
|
typedef long_address DescriptorType;
|
||||||
|
|
||||||
inline uint8 GetType(DescriptorType &descriptor) const {
|
inline uint8 GetType(DescriptorType &descriptor) const {
|
||||||
return descriptor.type();
|
return descriptor.type();
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ class CachedBlock {
|
|||||||
inline void Keep();
|
inline void Keep();
|
||||||
inline void Unset();
|
inline void Unset();
|
||||||
inline uint8 *SetTo(off_t block, bool empty = false);
|
inline uint8 *SetTo(off_t block, bool empty = false);
|
||||||
inline uint8 *SetTo(udf_long_address address, bool empty = false);
|
inline uint8 *SetTo(long_address address, bool empty = false);
|
||||||
template <class Accessor, class Descriptor>
|
template <class Accessor, class Descriptor>
|
||||||
inline uint8* SetTo(Accessor &accessor, Descriptor &descriptor,
|
inline uint8* SetTo(Accessor &accessor, Descriptor &descriptor,
|
||||||
bool empty = false);
|
bool empty = false);
|
||||||
@@ -126,7 +126,7 @@ CachedBlock::SetTo(off_t block, bool empty = false)
|
|||||||
}
|
}
|
||||||
|
|
||||||
inline uint8 *
|
inline uint8 *
|
||||||
CachedBlock::SetTo(udf_long_address address, bool empty = false)
|
CachedBlock::SetTo(long_address address, bool empty = false)
|
||||||
{
|
{
|
||||||
off_t block;
|
off_t block;
|
||||||
if (fVolume->MapBlock(address, &block) == B_OK)
|
if (fVolume->MapBlock(address, &block) == B_OK)
|
||||||
@@ -139,8 +139,8 @@ template <class Accessor, class Descriptor>
|
|||||||
inline uint8*
|
inline uint8*
|
||||||
CachedBlock::SetTo(Accessor &accessor, Descriptor &descriptor, bool empty = false)
|
CachedBlock::SetTo(Accessor &accessor, Descriptor &descriptor, bool empty = false)
|
||||||
{
|
{
|
||||||
// Make a udf_long_address out of the descriptor and call it a day
|
// Make a long_address out of the descriptor and call it a day
|
||||||
udf_long_address address;
|
long_address address;
|
||||||
address.set_to(accessor.GetBlock(descriptor),
|
address.set_to(accessor.GetBlock(descriptor),
|
||||||
accessor.GetPartition(descriptor));
|
accessor.GetPartition(descriptor));
|
||||||
return SetTo(address, empty);
|
return SetTo(address, empty);
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ DirectoryIterator::GetNextEntry(char *name, uint32 *length, vnode_id *id)
|
|||||||
return B_ENTRY_NOT_FOUND;
|
return B_ENTRY_NOT_FOUND;
|
||||||
|
|
||||||
uint8 data[kMaxFileIdSize];
|
uint8 data[kMaxFileIdSize];
|
||||||
udf_file_id_descriptor *entry = reinterpret_cast<udf_file_id_descriptor*>(data);
|
file_id_descriptor *entry = reinterpret_cast<file_id_descriptor*>(data);
|
||||||
|
|
||||||
uint32 block = 0;
|
uint32 block = 0;
|
||||||
off_t offset = fPosition;
|
off_t offset = fPosition;
|
||||||
@@ -51,7 +51,7 @@ DirectoryIterator::GetNextEntry(char *name, uint32 *length, vnode_id *id)
|
|||||||
// then, based on the information therein, read in the variable
|
// then, based on the information therein, read in the variable
|
||||||
// length tail portion as well.
|
// length tail portion as well.
|
||||||
error = Parent()->Read(offset, entry, &entryLength, &block);
|
error = Parent()->Read(offset, entry, &entryLength, &block);
|
||||||
if (!error && entryLength >= sizeof(udf_file_id_descriptor) && entry->tag().init_check(block) == B_OK) {
|
if (!error && entryLength >= sizeof(file_id_descriptor) && entry->tag().init_check(block) == B_OK) {
|
||||||
PDUMP(entry);
|
PDUMP(entry);
|
||||||
offset += entry->total_length();
|
offset += entry->total_length();
|
||||||
|
|
||||||
|
|||||||
@@ -37,16 +37,16 @@ const char* Udf::kVSDID_ECMA167_2 = "NSR02";
|
|||||||
const char* Udf::kVSDID_ECMA167_3 = "NSR03";
|
const char* Udf::kVSDID_ECMA167_3 = "NSR03";
|
||||||
const char* Udf::kVSDID_ECMA168 = "CDW02";
|
const char* Udf::kVSDID_ECMA168 = "CDW02";
|
||||||
|
|
||||||
// udf_entity_ids
|
// entity_ids
|
||||||
const udf_entity_id Udf::kMetadataPartitionMapId(0, "*UDF Metadata Partition");
|
const entity_id Udf::kMetadataPartitionMapId(0, "*UDF Metadata Partition");
|
||||||
const udf_entity_id Udf::kSparablePartitionMapId(0, "*UDF Sparable Partition");
|
const entity_id Udf::kSparablePartitionMapId(0, "*UDF Sparable Partition");
|
||||||
const udf_entity_id Udf::kVirtualPartitionMapId(0, "*UDF Virtual Partition");
|
const entity_id Udf::kVirtualPartitionMapId(0, "*UDF Virtual Partition");
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// Helper functions
|
// Helper functions
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
const char *Udf::udf_tag_id_to_string(udf_tag_id id)
|
const char *Udf::tag_id_to_string(tag_id id)
|
||||||
{
|
{
|
||||||
switch (id) {
|
switch (id) {
|
||||||
case TAGID_UNDEFINED:
|
case TAGID_UNDEFINED:
|
||||||
@@ -103,39 +103,39 @@ const char *Udf::udf_tag_id_to_string(udf_tag_id id)
|
|||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_volume_structure_descriptor_header
|
// volume_structure_descriptor_header
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
/*! \brief Returns true if the given \a id matches the header's id.
|
/*! \brief Returns true if the given \a id matches the header's id.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
udf_volume_structure_descriptor_header::id_matches(const char *id)
|
volume_structure_descriptor_header::id_matches(const char *id)
|
||||||
{
|
{
|
||||||
return strncmp(this->id, id, 5) == 0;
|
return strncmp(this->id, id, 5) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_charspec
|
// charspec
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_charspec::dump() const
|
charspec::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_charspec");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "charspec");
|
||||||
PRINT(("character_set_type: %d\n", character_set_type()));
|
PRINT(("character_set_type: %d\n", character_set_type()));
|
||||||
PRINT(("character_set_info: `%s'\n", character_set_info()));
|
PRINT(("character_set_info: `%s'\n", character_set_info()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_timestamp
|
// timestamp
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_timestamp::dump() const
|
timestamp::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_timestamp");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "timestamp");
|
||||||
PRINT(("type: %d\n", type()));
|
PRINT(("type: %d\n", type()));
|
||||||
PRINT(("timezone: %d\n", timezone()));
|
PRINT(("timezone: %d\n", timezone()));
|
||||||
PRINT(("year: %d\n", year()));
|
PRINT(("year: %d\n", year()));
|
||||||
@@ -150,10 +150,10 @@ udf_timestamp::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_entity_id
|
// entity_id
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
udf_entity_id::udf_entity_id(uint8 flags, char *identifier, char *identifier_suffix)
|
entity_id::entity_id(uint8 flags, char *identifier, char *identifier_suffix)
|
||||||
: _flags(flags)
|
: _flags(flags)
|
||||||
{
|
{
|
||||||
if (identifier)
|
if (identifier)
|
||||||
@@ -167,19 +167,19 @@ udf_entity_id::udf_entity_id(uint8 flags, char *identifier, char *identifier_suf
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_entity_id::dump() const
|
entity_id::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_entity_id");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "entity_id");
|
||||||
PRINT(("flags: %d\n", flags()));
|
PRINT(("flags: %d\n", flags()));
|
||||||
PRINT(("identifier: `%.23s'\n", identifier()));
|
PRINT(("identifier: `%.23s'\n", identifier()));
|
||||||
PRINT(("identifier_suffix: `%s'\n", identifier_suffix()));
|
PRINT(("identifier_suffix: `%s'\n", identifier_suffix()));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool
|
||||||
udf_entity_id::matches(const udf_entity_id &id) const
|
entity_id::matches(const entity_id &id) const
|
||||||
{
|
{
|
||||||
bool result = true;
|
bool result = true;
|
||||||
for (int i = 0; i < udf_entity_id::kIdentifierLength; i++) {
|
for (int i = 0; i < entity_id::kIdentifierLength; i++) {
|
||||||
if (identifier()[i] != id.identifier()[i]) {
|
if (identifier()[i] != id.identifier()[i]) {
|
||||||
result = false;
|
result = false;
|
||||||
break;
|
break;
|
||||||
@@ -189,29 +189,29 @@ udf_entity_id::matches(const udf_entity_id &id) const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_extent_address
|
// extent_address
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_extent_address::dump() const
|
extent_address::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_extent_address");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "extent_address");
|
||||||
PRINT(("length: %ld\n", length()));
|
PRINT(("length: %ld\n", length()));
|
||||||
PRINT(("location: %ld\n", location()));
|
PRINT(("location: %ld\n", location()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_logical_block_address::dump() const
|
logical_block_address::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_logical_block_address");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "logical_block_address");
|
||||||
PRINT(("block: %ld\n", block()));
|
PRINT(("block: %ld\n", block()));
|
||||||
PRINT(("partition: %d\n", partition()));
|
PRINT(("partition: %d\n", partition()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_long_address::dump() const
|
long_address::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_long_address");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "long_address");
|
||||||
PRINT(("length: %ld\n", length()));
|
PRINT(("length: %ld\n", length()));
|
||||||
PRINT(("block: %ld\n", block()));
|
PRINT(("block: %ld\n", block()));
|
||||||
PRINT(("partiton: %d\n", partition()));
|
PRINT(("partiton: %d\n", partition()));
|
||||||
@@ -220,14 +220,14 @@ udf_long_address::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_tag
|
// descriptor_tag
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_tag::dump() const
|
descriptor_tag ::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_descriptor_tag");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "descriptor_tag");
|
||||||
PRINT(("id: %d (%s)\n", id(), udf_tag_id_to_string(udf_tag_id(id()))));
|
PRINT(("id: %d (%s)\n", id(), tag_id_to_string(tag_id(id()))));
|
||||||
PRINT(("version: %d\n", version()));
|
PRINT(("version: %d\n", version()));
|
||||||
PRINT(("checksum: %d\n", checksum()));
|
PRINT(("checksum: %d\n", checksum()));
|
||||||
PRINT(("serial_number: %d\n", serial_number()));
|
PRINT(("serial_number: %d\n", serial_number()));
|
||||||
@@ -243,9 +243,9 @@ udf_tag::dump() const
|
|||||||
\todo Calc the CRC.
|
\todo Calc the CRC.
|
||||||
*/
|
*/
|
||||||
status_t
|
status_t
|
||||||
udf_tag::init_check(uint32 diskBlock)
|
descriptor_tag ::init_check(uint32 diskBlock)
|
||||||
{
|
{
|
||||||
DEBUG_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_HIGH_VOLUME, "udf_descriptor_tag");
|
DEBUG_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_HIGH_VOLUME, "descriptor_tag");
|
||||||
PRINT(("location (paramater) == %ld\n", diskBlock));
|
PRINT(("location (paramater) == %ld\n", diskBlock));
|
||||||
PRINT(("location (in structure) == %ld\n", location()));
|
PRINT(("location (in structure) == %ld\n", location()));
|
||||||
status_t error = (diskBlock == location()) ? B_OK : B_NO_INIT;
|
status_t error = (diskBlock == location()) ? B_OK : B_NO_INIT;
|
||||||
@@ -265,13 +265,13 @@ udf_tag::init_check(uint32 diskBlock)
|
|||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_primary_descriptor
|
// primary_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_primary_descriptor::dump() const
|
primary_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_primary_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "primary_descriptor");
|
||||||
|
|
||||||
CS0String string;
|
CS0String string;
|
||||||
|
|
||||||
@@ -309,13 +309,13 @@ udf_primary_descriptor::dump() const
|
|||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_anchor_volume_descriptor_pointer
|
// anchor_volume_descriptor_pointer
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_anchor_descriptor::dump() const
|
anchor_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_anchor_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "anchor_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("main_vds:\n"));
|
PRINT(("main_vds:\n"));
|
||||||
@@ -326,13 +326,13 @@ udf_anchor_descriptor::dump() const
|
|||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_implementation_use_descriptor
|
// implementation_use_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_implementation_use_descriptor::dump() const
|
implementation_use_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_implementation_use_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "implementation_use_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("vds_number: %ld\n", vds_number()));
|
PRINT(("vds_number: %ld\n", vds_number()));
|
||||||
@@ -343,15 +343,15 @@ udf_implementation_use_descriptor::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_partition_descriptor
|
// partition_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
const uint8 Udf::kMaxPartitionDescriptors = 2;
|
const uint8 Udf::kMaxPartitionDescriptors = 2;
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_partition_descriptor::dump() const
|
partition_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_partition_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "partition_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("vds_number: %ld\n", vds_number()));
|
PRINT(("vds_number: %ld\n", vds_number()));
|
||||||
@@ -372,13 +372,13 @@ udf_partition_descriptor::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_logical_descriptor
|
// logical_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_logical_descriptor::dump() const
|
logical_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_logical_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "logical_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("vds_number: %ld\n", vds_number()));
|
PRINT(("vds_number: %ld\n", vds_number()));
|
||||||
@@ -418,7 +418,7 @@ udf_logical_descriptor::dump() const
|
|||||||
case 2: {
|
case 2: {
|
||||||
PRINT((" partition_number: %d\n", *reinterpret_cast<const uint16*>(&(maps[offset+38]))));
|
PRINT((" partition_number: %d\n", *reinterpret_cast<const uint16*>(&(maps[offset+38]))));
|
||||||
PRINT((" entity_id:\n"));
|
PRINT((" entity_id:\n"));
|
||||||
const udf_entity_id *id = reinterpret_cast<const udf_entity_id*>(&(maps[offset+4]));
|
const entity_id *id = reinterpret_cast<const entity_id*>(&(maps[offset+4]));
|
||||||
if (id) // To kill warning when DEBUG==0
|
if (id) // To kill warning when DEBUG==0
|
||||||
PDUMP(id);
|
PDUMP(id);
|
||||||
break;
|
break;
|
||||||
@@ -430,8 +430,8 @@ udf_logical_descriptor::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
udf_logical_descriptor&
|
logical_descriptor&
|
||||||
udf_logical_descriptor::operator=(const udf_logical_descriptor &rhs)
|
logical_descriptor::operator=(const logical_descriptor &rhs)
|
||||||
{
|
{
|
||||||
_tag = rhs._tag;
|
_tag = rhs._tag;
|
||||||
_vds_number = rhs._vds_number;
|
_vds_number = rhs._vds_number;
|
||||||
@@ -459,13 +459,13 @@ udf_logical_descriptor::operator=(const udf_logical_descriptor &rhs)
|
|||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_physical_partition_map
|
// physical_partition_map
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_physical_partition_map::dump()
|
physical_partition_map::dump()
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_physical_partition_map");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "physical_partition_map");
|
||||||
PRINT(("type: %d\n", type()));
|
PRINT(("type: %d\n", type()));
|
||||||
PRINT(("length: %d\n", length()));
|
PRINT(("length: %d\n", length()));
|
||||||
PRINT(("volume_sequence_number: %d\n", volume_sequence_number()));
|
PRINT(("volume_sequence_number: %d\n", volume_sequence_number()));
|
||||||
@@ -473,13 +473,13 @@ udf_physical_partition_map::dump()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_sparable_partition_map
|
// sparable_partition_map
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_sparable_partition_map::dump()
|
sparable_partition_map::dump()
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_sparable_partition_map");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "sparable_partition_map");
|
||||||
PRINT(("type: %d\n", type()));
|
PRINT(("type: %d\n", type()));
|
||||||
PRINT(("length: %d\n", length()));
|
PRINT(("length: %d\n", length()));
|
||||||
PRINT(("partition_type_id:"));
|
PRINT(("partition_type_id:"));
|
||||||
@@ -494,13 +494,13 @@ udf_sparable_partition_map::dump()
|
|||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_unallocated_space_descriptor
|
// unallocated_space_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_unallocated_space_descriptor::dump() const
|
unallocated_space_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_unallocated_space_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "unallocated_space_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("vds_number: %ld\n", vds_number()));
|
PRINT(("vds_number: %ld\n", vds_number()));
|
||||||
@@ -510,25 +510,25 @@ udf_unallocated_space_descriptor::dump() const
|
|||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_terminating_descriptor
|
// terminating_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_terminating_descriptor::dump() const
|
terminating_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_terminating_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "terminating_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
}
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_file_set_descriptor
|
// file_set_descriptor
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_file_set_descriptor::dump() const
|
file_set_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "udf_file_set_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS | CF_DUMP, "file_set_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("recording_date_and_time:\n"));
|
PRINT(("recording_date_and_time:\n"));
|
||||||
@@ -562,9 +562,9 @@ udf_file_set_descriptor::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_file_id_descriptor::dump() const
|
file_id_descriptor::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS, "udf_file_id_descriptor");
|
DUMP_INIT(CF_PUBLIC | CF_VOLUME_OPS, "file_id_descriptor");
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
PRINT(("version_number: %d\n", version_number()));
|
PRINT(("version_number: %d\n", version_number()));
|
||||||
@@ -584,9 +584,9 @@ udf_file_id_descriptor::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_icb_entry_tag::dump() const
|
icb_entry_tag::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC, "udf_icb_entry_tag");
|
DUMP_INIT(CF_PUBLIC, "icb_entry_tag");
|
||||||
PRINT(("prior_entries: %ld\n", prior_recorded_number_of_direct_entries()));
|
PRINT(("prior_entries: %ld\n", prior_recorded_number_of_direct_entries()));
|
||||||
PRINT(("strategy_type: %d\n", strategy_type()));
|
PRINT(("strategy_type: %d\n", strategy_type()));
|
||||||
PRINT(("strategy_parameters:\n"));
|
PRINT(("strategy_parameters:\n"));
|
||||||
@@ -604,7 +604,7 @@ udf_icb_entry_tag::dump() const
|
|||||||
uint16 entry_count;
|
uint16 entry_count;
|
||||||
uint8 reserved;
|
uint8 reserved;
|
||||||
uint8 file_type;
|
uint8 file_type;
|
||||||
udf_logical_block_address parent_icb_location;
|
logical_block_address parent_icb_location;
|
||||||
union {
|
union {
|
||||||
uint16 all_flags;
|
uint16 all_flags;
|
||||||
struct {
|
struct {
|
||||||
@@ -629,9 +629,9 @@ udf_icb_entry_tag::dump() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_icb_header::dump() const
|
icb_header::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_icb_header");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "icb_header");
|
||||||
|
|
||||||
PRINT(("tag:\n"));
|
PRINT(("tag:\n"));
|
||||||
DUMP(tag());
|
DUMP(tag());
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -1,3 +1,9 @@
|
|||||||
|
//----------------------------------------------------------------------
|
||||||
|
// This software is part of the OpenBeOS distribution and is covered
|
||||||
|
// by the OpenBeOS license.
|
||||||
|
//
|
||||||
|
// Copyright (c) 2003 Tyler Dauwalder, [email protected]
|
||||||
|
//---------------------------------------------------------------------
|
||||||
#include "Icb.h"
|
#include "Icb.h"
|
||||||
|
|
||||||
#include "time.h"
|
#include "time.h"
|
||||||
@@ -9,7 +15,7 @@
|
|||||||
|
|
||||||
using namespace Udf;
|
using namespace Udf;
|
||||||
|
|
||||||
Icb::Icb(Volume *volume, udf_long_address address)
|
Icb::Icb(Volume *volume, long_address address)
|
||||||
: fVolume(volume)
|
: fVolume(volume)
|
||||||
, fData(volume)
|
, fData(volume)
|
||||||
, fInitStatus(B_NO_INIT)
|
, fInitStatus(B_NO_INIT)
|
||||||
@@ -25,7 +31,7 @@ Icb::Icb(Volume *volume, udf_long_address address)
|
|||||||
off_t block;
|
off_t block;
|
||||||
error = fVolume->MapBlock(address, &block);
|
error = fVolume->MapBlock(address, &block);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
udf_icb_header *header = reinterpret_cast<udf_icb_header*>(fData.SetTo(block));
|
icb_header *header = reinterpret_cast<icb_header*>(fData.SetTo(block));
|
||||||
PDUMP(header);
|
PDUMP(header);
|
||||||
error = header->tag().init_check(address.block());
|
error = header->tag().init_check(address.block());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class DirectoryIterator;
|
|||||||
class Volume;
|
class Volume;
|
||||||
|
|
||||||
/*! \brief Abstract interface to file entry structure members
|
/*! \brief Abstract interface to file entry structure members
|
||||||
that are not commonly accessible through udf_file_icb_entry().
|
that are not commonly accessible through file_icb_entry().
|
||||||
|
|
||||||
This is necessary, since we can't use virtual functions in
|
This is necessary, since we can't use virtual functions in
|
||||||
the disk structure structs themselves, since we generally
|
the disk structure structs themselves, since we generally
|
||||||
@@ -62,7 +62,7 @@ private:
|
|||||||
|
|
||||||
class Icb {
|
class Icb {
|
||||||
public:
|
public:
|
||||||
Icb(Volume *volume, udf_long_address address);
|
Icb(Volume *volume, long_address address);
|
||||||
status_t InitCheck();
|
status_t InitCheck();
|
||||||
vnode_id Id() { return fId; }
|
vnode_id Id() { return fId; }
|
||||||
|
|
||||||
@@ -94,18 +94,18 @@ public:
|
|||||||
private:
|
private:
|
||||||
Icb(); // unimplemented
|
Icb(); // unimplemented
|
||||||
|
|
||||||
udf_tag& Tag() { return (reinterpret_cast<udf_icb_header*>(fData.Block()))->tag(); }
|
descriptor_tag & Tag() { return (reinterpret_cast<icb_header*>(fData.Block()))->tag(); }
|
||||||
udf_icb_entry_tag& IcbTag() { return (reinterpret_cast<udf_icb_header*>(fData.Block()))->icb_tag(); }
|
icb_entry_tag& IcbTag() { return (reinterpret_cast<icb_header*>(fData.Block()))->icb_tag(); }
|
||||||
AbstractFileEntry* AbstractEntry() {
|
AbstractFileEntry* AbstractEntry() {
|
||||||
DEBUG_INIT(CF_PRIVATE | CF_HIGH_VOLUME, "Icb");
|
DEBUG_INIT(CF_PRIVATE | CF_HIGH_VOLUME, "Icb");
|
||||||
return (Tag().id() == TAGID_EXTENDED_FILE_ENTRY)
|
return (Tag().id() == TAGID_EXTENDED_FILE_ENTRY)
|
||||||
// ? reinterpret_cast<udf_extended_file_icb_entry*>(fData.Block())
|
// ? reinterpret_cast<extended_file_icb_entry*>(fData.Block())
|
||||||
// : reinterpret_cast<udf_file_icb_entry*>(fData.Block()));
|
// : reinterpret_cast<file_icb_entry*>(fData.Block()));
|
||||||
? &fExtendedEntry
|
? &fExtendedEntry
|
||||||
: &fFileEntry;
|
: &fFileEntry;
|
||||||
}
|
}
|
||||||
udf_file_icb_entry* FileEntry() { return (reinterpret_cast<udf_file_icb_entry*>(fData.Block())); }
|
file_icb_entry* FileEntry() { return (reinterpret_cast<file_icb_entry*>(fData.Block())); }
|
||||||
udf_extended_file_icb_entry& ExtendedEntry() { return *(reinterpret_cast<udf_extended_file_icb_entry*>(fData.Block())); }
|
extended_file_icb_entry& ExtendedEntry() { return *(reinterpret_cast<extended_file_icb_entry*>(fData.Block())); }
|
||||||
|
|
||||||
template <class DescriptorList>
|
template <class DescriptorList>
|
||||||
status_t _Read(DescriptorList &list, off_t pos, void *buffer, size_t *length, uint32 *block);
|
status_t _Read(DescriptorList &list, off_t pos, void *buffer, size_t *length, uint32 *block);
|
||||||
@@ -117,8 +117,8 @@ private:
|
|||||||
status_t fInitStatus;
|
status_t fInitStatus;
|
||||||
vnode_id fId;
|
vnode_id fId;
|
||||||
SinglyLinkedList<DirectoryIterator*> fIteratorList;
|
SinglyLinkedList<DirectoryIterator*> fIteratorList;
|
||||||
FileEntry<udf_file_icb_entry> fFileEntry;
|
FileEntry<file_icb_entry> fFileEntry;
|
||||||
FileEntry<udf_extended_file_icb_entry> fExtendedEntry;
|
FileEntry<extended_file_icb_entry> fExtendedEntry;
|
||||||
};
|
};
|
||||||
|
|
||||||
/*! \brief Does the dirty work of reading using the given DescriptorList object
|
/*! \brief Does the dirty work of reading using the given DescriptorList object
|
||||||
@@ -147,7 +147,7 @@ Icb::_Read(DescriptorList &list, off_t pos, void *_buffer, size_t *length, uint3
|
|||||||
PRINT(("pos: %Ld\n", pos));
|
PRINT(("pos: %Ld\n", pos));
|
||||||
PRINT(("bytesLeft: %ld\n", bytesLeft));
|
PRINT(("bytesLeft: %ld\n", bytesLeft));
|
||||||
|
|
||||||
udf_long_address extent;
|
long_address extent;
|
||||||
bool isEmpty = false;
|
bool isEmpty = false;
|
||||||
error = list.FindExtent(pos, &extent, &isEmpty);
|
error = list.FindExtent(pos, &extent, &isEmpty);
|
||||||
if (!error) {
|
if (!error) {
|
||||||
|
|||||||
@@ -16,14 +16,14 @@ walk_volume_recognition_sequence(int device, off_t offset,
|
|||||||
static status_t
|
static status_t
|
||||||
walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
||||||
uint32 blockSize, uint32 blockShift,
|
uint32 blockSize, uint32 blockShift,
|
||||||
udf_logical_descriptor &logicalVolumeDescriptor,
|
logical_descriptor &logicalVolumeDescriptor,
|
||||||
udf_partition_descriptor partitionDescriptors[],
|
partition_descriptor partitionDescriptors[],
|
||||||
uint8 &partitionDescriptorCount);
|
uint8 &partitionDescriptorCount);
|
||||||
static status_t
|
static status_t
|
||||||
walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
walk_volume_descriptor_sequence(extent_address descriptorSequence,
|
||||||
int device, uint32 blockSize, uint32 blockShift,
|
int device, uint32 blockSize, uint32 blockShift,
|
||||||
udf_logical_descriptor &logicalVolumeDescriptor,
|
logical_descriptor &logicalVolumeDescriptor,
|
||||||
udf_partition_descriptor partitionDescriptors[],
|
partition_descriptor partitionDescriptors[],
|
||||||
uint8 &partitionDescriptorCount);
|
uint8 &partitionDescriptorCount);
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
@@ -32,8 +32,8 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
status_t
|
status_t
|
||||||
Udf::udf_recognize(int device, off_t offset, off_t length, uint32 blockSize,
|
Udf::udf_recognize(int device, off_t offset, off_t length, uint32 blockSize,
|
||||||
uint32 &blockShift, udf_logical_descriptor &logicalVolumeDescriptor,
|
uint32 &blockShift, logical_descriptor &logicalVolumeDescriptor,
|
||||||
udf_partition_descriptor partitionDescriptors[],
|
partition_descriptor partitionDescriptors[],
|
||||||
uint8 &partitionDescriptorCount)
|
uint8 &partitionDescriptorCount)
|
||||||
{
|
{
|
||||||
DEBUG_INIT_ETC(CF_PRIVATE, NULL, ("device: %d, offset: %Ld, length: %Ld, "
|
DEBUG_INIT_ETC(CF_PRIVATE, NULL, ("device: %d, offset: %Ld, length: %Ld, "
|
||||||
@@ -78,8 +78,8 @@ Udf::udf_recognize(int device, off_t offset, off_t length, uint32 blockSize,
|
|||||||
DEBUG_INIT_ETC(CF_PRIVATE, NULL, ("device: %d, offset: %Ld, length: %Ld, "
|
DEBUG_INIT_ETC(CF_PRIVATE, NULL, ("device: %d, offset: %Ld, length: %Ld, "
|
||||||
"blockSize: %ld, volumeName: %p", device, offset, length,
|
"blockSize: %ld, volumeName: %p", device, offset, length,
|
||||||
blockSize, volumeName));
|
blockSize, volumeName));
|
||||||
udf_logical_descriptor logicalVolumeDescriptor;
|
logical_descriptor logicalVolumeDescriptor;
|
||||||
udf_partition_descriptor partitionDescriptors[Udf::kMaxPartitionDescriptors];
|
partition_descriptor partitionDescriptors[Udf::kMaxPartitionDescriptors];
|
||||||
uint8 partitionDescriptorCount;
|
uint8 partitionDescriptorCount;
|
||||||
uint32 blockShift;
|
uint32 blockShift;
|
||||||
status_t error = udf_recognize(device, offset, length, blockSize, blockShift,
|
status_t error = udf_recognize(device, offset, length, blockSize, blockShift,
|
||||||
@@ -118,8 +118,8 @@ walk_volume_recognition_sequence(int device, off_t offset, uint32 blockSize, uin
|
|||||||
ssize_t bytesRead = read_pos(device, address, chunk.Data(), blockSize);
|
ssize_t bytesRead = read_pos(device, address, chunk.Data(), blockSize);
|
||||||
if (bytesRead == (ssize_t)blockSize)
|
if (bytesRead == (ssize_t)blockSize)
|
||||||
{
|
{
|
||||||
udf_volume_structure_descriptor_header* descriptor =
|
volume_structure_descriptor_header* descriptor =
|
||||||
reinterpret_cast<udf_volume_structure_descriptor_header*>(chunk.Data());
|
reinterpret_cast<volume_structure_descriptor_header*>(chunk.Data());
|
||||||
if (descriptor->id_matches(kVSDID_ISO)) {
|
if (descriptor->id_matches(kVSDID_ISO)) {
|
||||||
SIMPLE_PRINT(("found ISO9660 descriptor\n"));
|
SIMPLE_PRINT(("found ISO9660 descriptor\n"));
|
||||||
foundISO = true;
|
foundISO = true;
|
||||||
@@ -166,8 +166,8 @@ static
|
|||||||
status_t
|
status_t
|
||||||
walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
||||||
uint32 blockSize, uint32 blockShift,
|
uint32 blockSize, uint32 blockShift,
|
||||||
udf_logical_descriptor &logicalVolumeDescriptor,
|
logical_descriptor &logicalVolumeDescriptor,
|
||||||
udf_partition_descriptor partitionDescriptors[],
|
partition_descriptor partitionDescriptors[],
|
||||||
uint8 &partitionDescriptorCount)
|
uint8 &partitionDescriptorCount)
|
||||||
{
|
{
|
||||||
DEBUG_INIT(CF_PRIVATE, NULL);
|
DEBUG_INIT(CF_PRIVATE, NULL);
|
||||||
@@ -183,7 +183,7 @@ walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
|||||||
off_t block = avds_locations[i];
|
off_t block = avds_locations[i];
|
||||||
off_t address = (offset + block) << blockShift;
|
off_t address = (offset + block) << blockShift;
|
||||||
MemoryChunk chunk(blockSize);
|
MemoryChunk chunk(blockSize);
|
||||||
udf_anchor_descriptor *anchor = NULL;
|
anchor_descriptor *anchor = NULL;
|
||||||
|
|
||||||
status_t anchorErr = chunk.InitCheck();
|
status_t anchorErr = chunk.InitCheck();
|
||||||
if (!anchorErr) {
|
if (!anchorErr) {
|
||||||
@@ -195,7 +195,7 @@ walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!anchorErr) {
|
if (!anchorErr) {
|
||||||
anchor = reinterpret_cast<udf_anchor_descriptor*>(chunk.Data());
|
anchor = reinterpret_cast<anchor_descriptor*>(chunk.Data());
|
||||||
anchorErr = anchor->tag().init_check(block+offset);
|
anchorErr = anchor->tag().init_check(block+offset);
|
||||||
if (anchorErr) {
|
if (anchorErr) {
|
||||||
PRINT(("block %Ld: invalid anchor\n", block));
|
PRINT(("block %Ld: invalid anchor\n", block));
|
||||||
@@ -235,10 +235,10 @@ walk_anchor_volume_descriptor_sequences(int device, off_t offset, off_t length,
|
|||||||
|
|
||||||
static
|
static
|
||||||
status_t
|
status_t
|
||||||
walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
walk_volume_descriptor_sequence(extent_address descriptorSequence,
|
||||||
int device, uint32 blockSize, uint32 blockShift,
|
int device, uint32 blockSize, uint32 blockShift,
|
||||||
udf_logical_descriptor &logicalVolumeDescriptor,
|
logical_descriptor &logicalVolumeDescriptor,
|
||||||
udf_partition_descriptor partitionDescriptors[],
|
partition_descriptor partitionDescriptors[],
|
||||||
uint8 &partitionDescriptorCount)
|
uint8 &partitionDescriptorCount)
|
||||||
{
|
{
|
||||||
DEBUG_INIT_ETC(CF_PRIVATE, NULL, ("descriptorSequence.loc:%ld, descriptorSequence.len:%ld",
|
DEBUG_INIT_ETC(CF_PRIVATE, NULL, ("descriptorSequence.loc:%ld, descriptorSequence.len:%ld",
|
||||||
@@ -254,7 +254,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
off_t block = descriptorSequence.location()+i;
|
off_t block = descriptorSequence.location()+i;
|
||||||
off_t address = block << blockShift;
|
off_t address = block << blockShift;
|
||||||
MemoryChunk chunk(blockSize);
|
MemoryChunk chunk(blockSize);
|
||||||
udf_tag *tag = NULL;
|
descriptor_tag *tag = NULL;
|
||||||
|
|
||||||
PRINT(("descriptor #%ld (block %Ld):\n", i, block));
|
PRINT(("descriptor #%ld (block %Ld):\n", i, block));
|
||||||
|
|
||||||
@@ -268,7 +268,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!loopErr) {
|
if (!loopErr) {
|
||||||
tag = reinterpret_cast<udf_tag*>(chunk.Data());
|
tag = reinterpret_cast<descriptor_tag *>(chunk.Data());
|
||||||
loopErr = tag->init_check(block);
|
loopErr = tag->init_check(block);
|
||||||
}
|
}
|
||||||
if (!loopErr) {
|
if (!loopErr) {
|
||||||
@@ -279,7 +279,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
case TAGID_PRIMARY_VOLUME_DESCRIPTOR:
|
case TAGID_PRIMARY_VOLUME_DESCRIPTOR:
|
||||||
{
|
{
|
||||||
udf_primary_descriptor *primary = reinterpret_cast<udf_primary_descriptor*>(tag);
|
primary_descriptor *primary = reinterpret_cast<primary_descriptor*>(tag);
|
||||||
PDUMP(primary);
|
PDUMP(primary);
|
||||||
(void)primary; // kill the warning
|
(void)primary; // kill the warning
|
||||||
break;
|
break;
|
||||||
@@ -293,7 +293,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
case TAGID_IMPLEMENTATION_USE_VOLUME_DESCRIPTOR:
|
case TAGID_IMPLEMENTATION_USE_VOLUME_DESCRIPTOR:
|
||||||
{
|
{
|
||||||
udf_implementation_use_descriptor *imp_use = reinterpret_cast<udf_implementation_use_descriptor*>(tag);
|
implementation_use_descriptor *imp_use = reinterpret_cast<implementation_use_descriptor*>(tag);
|
||||||
PDUMP(imp_use);
|
PDUMP(imp_use);
|
||||||
(void)imp_use; // kill the warning
|
(void)imp_use; // kill the warning
|
||||||
break;
|
break;
|
||||||
@@ -301,7 +301,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
case TAGID_PARTITION_DESCRIPTOR:
|
case TAGID_PARTITION_DESCRIPTOR:
|
||||||
{
|
{
|
||||||
udf_partition_descriptor *partition = reinterpret_cast<udf_partition_descriptor*>(tag);
|
partition_descriptor *partition = reinterpret_cast<partition_descriptor*>(tag);
|
||||||
PDUMP(partition);
|
PDUMP(partition);
|
||||||
if (partition->tag().init_check(block) == B_OK) {
|
if (partition->tag().init_check(block) == B_OK) {
|
||||||
// Check for a previously discovered partition descriptor with
|
// Check for a previously discovered partition descriptor with
|
||||||
@@ -376,7 +376,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
case TAGID_LOGICAL_VOLUME_DESCRIPTOR:
|
case TAGID_LOGICAL_VOLUME_DESCRIPTOR:
|
||||||
{
|
{
|
||||||
udf_logical_descriptor *logical = reinterpret_cast<udf_logical_descriptor*>(tag);
|
logical_descriptor *logical = reinterpret_cast<logical_descriptor*>(tag);
|
||||||
PDUMP(logical);
|
PDUMP(logical);
|
||||||
if (foundLogicalVolumeDescriptor) {
|
if (foundLogicalVolumeDescriptor) {
|
||||||
// Keep the vd with the highest vds_number
|
// Keep the vd with the highest vds_number
|
||||||
@@ -392,7 +392,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
case TAGID_UNALLOCATED_SPACE_DESCRIPTOR:
|
case TAGID_UNALLOCATED_SPACE_DESCRIPTOR:
|
||||||
{
|
{
|
||||||
udf_unallocated_space_descriptor *unallocated = reinterpret_cast<udf_unallocated_space_descriptor*>(tag);
|
unallocated_space_descriptor *unallocated = reinterpret_cast<unallocated_space_descriptor*>(tag);
|
||||||
PDUMP(unallocated);
|
PDUMP(unallocated);
|
||||||
(void)unallocated; // kill the warning
|
(void)unallocated; // kill the warning
|
||||||
break;
|
break;
|
||||||
@@ -400,7 +400,7 @@ walk_volume_descriptor_sequence(udf_extent_address descriptorSequence,
|
|||||||
|
|
||||||
case TAGID_TERMINATING_DESCRIPTOR:
|
case TAGID_TERMINATING_DESCRIPTOR:
|
||||||
{
|
{
|
||||||
udf_terminating_descriptor *terminating = reinterpret_cast<udf_terminating_descriptor*>(tag);
|
terminating_descriptor *terminating = reinterpret_cast<terminating_descriptor*>(tag);
|
||||||
PDUMP(terminating);
|
PDUMP(terminating);
|
||||||
(void)terminating; // kill the warning
|
(void)terminating; // kill the warning
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -17,8 +17,8 @@ namespace Udf {
|
|||||||
|
|
||||||
status_t udf_recognize(int device, off_t offset, off_t length,
|
status_t udf_recognize(int device, off_t offset, off_t length,
|
||||||
uint32 blockSize, uint32 &blockShift,
|
uint32 blockSize, uint32 &blockShift,
|
||||||
udf_logical_descriptor &logicalVolumeDescriptor,
|
logical_descriptor &logicalVolumeDescriptor,
|
||||||
udf_partition_descriptor partitionDescriptors[],
|
partition_descriptor partitionDescriptors[],
|
||||||
uint8 &partitionDescriptorCount);
|
uint8 &partitionDescriptorCount);
|
||||||
status_t udf_recognize(int device, off_t offset, off_t length,
|
status_t udf_recognize(int device, off_t offset, off_t length,
|
||||||
uint32 blockSize, char *volumeName);
|
uint32 blockSize, char *volumeName);
|
||||||
|
|||||||
@@ -23,11 +23,11 @@ extern "C" {
|
|||||||
|
|
||||||
namespace Udf {
|
namespace Udf {
|
||||||
|
|
||||||
udf_long_address
|
long_address
|
||||||
to_long_address(vnode_id id, uint32 length)
|
to_long_address(vnode_id id, uint32 length)
|
||||||
{
|
{
|
||||||
DEBUG_INIT_ETC(CF_PUBLIC | CF_HELPER, NULL, ("vnode_id: %Ld (0x%Lx), length: %ld", id, id, length));
|
DEBUG_INIT_ETC(CF_PUBLIC | CF_HELPER, NULL, ("vnode_id: %Ld (0x%Lx), length: %ld", id, id, length));
|
||||||
udf_long_address result;
|
long_address result;
|
||||||
result.set_block((id >> 16) & 0xffffffff);
|
result.set_block((id >> 16) & 0xffffffff);
|
||||||
result.set_partition(id & 0xffff);
|
result.set_partition(id & 0xffff);
|
||||||
result.set_length(length);
|
result.set_length(length);
|
||||||
@@ -36,7 +36,7 @@ to_long_address(vnode_id id, uint32 length)
|
|||||||
}
|
}
|
||||||
|
|
||||||
vnode_id
|
vnode_id
|
||||||
to_vnode_id(udf_long_address address)
|
to_vnode_id(long_address address)
|
||||||
{
|
{
|
||||||
DEBUG_INIT(CF_PUBLIC | CF_HELPER, NULL);
|
DEBUG_INIT(CF_PUBLIC | CF_HELPER, NULL);
|
||||||
vnode_id result = address.block();
|
vnode_id result = address.block();
|
||||||
@@ -50,7 +50,7 @@ to_vnode_id(udf_long_address address)
|
|||||||
}
|
}
|
||||||
|
|
||||||
time_t
|
time_t
|
||||||
make_time(udf_timestamp ×tamp)
|
make_time(timestamp ×tamp)
|
||||||
{
|
{
|
||||||
DEBUG_INIT_ETC(CF_HELPER | CF_HIGH_VOLUME, NULL, ("timestamp: (tnt: 0x%x, type: %d, timezone: %d = 0x%x, year: %d, "
|
DEBUG_INIT_ETC(CF_HELPER | CF_HIGH_VOLUME, NULL, ("timestamp: (tnt: 0x%x, type: %d, timezone: %d = 0x%x, year: %d, "
|
||||||
"month: %d, day: %d, hour: %d, minute: %d, second: %d)", timestamp.type_and_timezone(),
|
"month: %d, day: %d, hour: %d, minute: %d, second: %d)", timestamp.type_and_timezone(),
|
||||||
|
|||||||
@@ -24,11 +24,11 @@ extern "C" {
|
|||||||
|
|
||||||
namespace Udf {
|
namespace Udf {
|
||||||
|
|
||||||
udf_long_address to_long_address(vnode_id id, uint32 length = 0);
|
long_address to_long_address(vnode_id id, uint32 length = 0);
|
||||||
|
|
||||||
vnode_id to_vnode_id(udf_long_address address);
|
vnode_id to_vnode_id(long_address address);
|
||||||
|
|
||||||
time_t make_time(udf_timestamp ×tamp);
|
time_t make_time(timestamp ×tamp);
|
||||||
|
|
||||||
} // namespace Udf
|
} // namespace Udf
|
||||||
|
|
||||||
|
|||||||
@@ -72,11 +72,13 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
udf_logical_descriptor logicalVolumeDescriptor;
|
logical_descriptor logicalVolumeDescriptor;
|
||||||
udf_partition_descriptor partitionDescriptors[Udf::kMaxPartitionDescriptors];
|
partition_descriptor partitionDescriptors[Udf::kMaxPartitionDescriptors];
|
||||||
uint8 partitionDescriptorCount;
|
uint8 partitionDescriptorCount;
|
||||||
uint32 blockShift;
|
uint32 blockShift;
|
||||||
|
|
||||||
|
// Run through the volume recognition and descriptor sequences to
|
||||||
|
// see if we have a potentially valid UDF volume on our hands
|
||||||
error = udf_recognize(device, offset, length, blockSize, blockShift,
|
error = udf_recognize(device, offset, length, blockSize, blockShift,
|
||||||
logicalVolumeDescriptor, partitionDescriptors,
|
logicalVolumeDescriptor, partitionDescriptors,
|
||||||
partitionDescriptorCount);
|
partitionDescriptorCount);
|
||||||
@@ -98,15 +100,15 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length,
|
|||||||
&& !error; i++)
|
&& !error; i++)
|
||||||
{
|
{
|
||||||
uint8 *maps = logicalVolumeDescriptor.partition_maps();
|
uint8 *maps = logicalVolumeDescriptor.partition_maps();
|
||||||
udf_partition_map_header *header =
|
partition_map_header *header =
|
||||||
reinterpret_cast<udf_partition_map_header*>(maps+offset);
|
reinterpret_cast<partition_map_header*>(maps+offset);
|
||||||
PRINT(("partition map %d (type %d):\n", i, header->type()));
|
PRINT(("partition map %d (type %d):\n", i, header->type()));
|
||||||
if (header->type() == 1) {
|
if (header->type() == 1) {
|
||||||
PRINT(("map type: physical\n"));
|
PRINT(("map type: physical\n"));
|
||||||
udf_physical_partition_map* map =
|
physical_partition_map* map =
|
||||||
reinterpret_cast<udf_physical_partition_map*>(header);
|
reinterpret_cast<physical_partition_map*>(header);
|
||||||
// Find the corresponding partition descriptor
|
// Find the corresponding partition descriptor
|
||||||
udf_partition_descriptor *descriptor = NULL;
|
partition_descriptor *descriptor = NULL;
|
||||||
for (uint8 j = 0; j < partitionDescriptorCount; j++) {
|
for (uint8 j = 0; j < partitionDescriptorCount; j++) {
|
||||||
if (map->partition_number() ==
|
if (map->partition_number() ==
|
||||||
partitionDescriptors[j].partition_number())
|
partitionDescriptors[j].partition_number())
|
||||||
@@ -135,27 +137,27 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length,
|
|||||||
error = B_ERROR;
|
error = B_ERROR;
|
||||||
}
|
}
|
||||||
} else if (header->type() == 2) {
|
} else if (header->type() == 2) {
|
||||||
// Figure out what kind of partition map we have based
|
// Figure out what kind of type 2 partition map we have based
|
||||||
// on the type identifier
|
// on the type identifier
|
||||||
const udf_entity_id &typeId = header->partition_type_id();
|
const entity_id &typeId = header->partition_type_id();
|
||||||
DUMP(typeId);
|
DUMP(typeId);
|
||||||
DUMP(kSparablePartitionMapId);
|
DUMP(kSparablePartitionMapId);
|
||||||
if (typeId.matches(kVirtualPartitionMapId)) {
|
if (typeId.matches(kVirtualPartitionMapId)) {
|
||||||
PRINT(("map type: virtual\n"));
|
PRINT(("map type: virtual\n"));
|
||||||
udf_virtual_partition_map* map =
|
virtual_partition_map* map =
|
||||||
reinterpret_cast<udf_virtual_partition_map*>(header);
|
reinterpret_cast<virtual_partition_map*>(header);
|
||||||
virtualCount++;
|
virtualCount++;
|
||||||
(void)map; // kill the warning for now
|
(void)map; // kill the warning for now
|
||||||
} else if (typeId.matches(kSparablePartitionMapId)) {
|
} else if (typeId.matches(kSparablePartitionMapId)) {
|
||||||
PRINT(("map type: sparable\n"));
|
PRINT(("map type: sparable\n"));
|
||||||
udf_sparable_partition_map* map =
|
sparable_partition_map* map =
|
||||||
reinterpret_cast<udf_sparable_partition_map*>(header);
|
reinterpret_cast<sparable_partition_map*>(header);
|
||||||
sparableCount++;
|
sparableCount++;
|
||||||
(void)map; // kill the warning for now
|
(void)map; // kill the warning for now
|
||||||
} else if (typeId.matches(kMetadataPartitionMapId)) {
|
} else if (typeId.matches(kMetadataPartitionMapId)) {
|
||||||
PRINT(("map type: metadata\n"));
|
PRINT(("map type: metadata\n"));
|
||||||
udf_metadata_partition_map* map =
|
metadata_partition_map* map =
|
||||||
reinterpret_cast<udf_metadata_partition_map*>(header);
|
reinterpret_cast<metadata_partition_map*>(header);
|
||||||
metadataCount++;
|
metadataCount++;
|
||||||
(void)map; // kill the warning for now
|
(void)map; // kill the warning for now
|
||||||
} else {
|
} else {
|
||||||
@@ -224,8 +226,8 @@ Volume::Mount(const char *deviceName, off_t offset, off_t length,
|
|||||||
}
|
}
|
||||||
// See if it's valid, and if so, create the root icb
|
// See if it's valid, and if so, create the root icb
|
||||||
if (!error) {
|
if (!error) {
|
||||||
udf_file_set_descriptor *fileSet =
|
file_set_descriptor *fileSet =
|
||||||
reinterpret_cast<udf_file_set_descriptor*>(chunk.Data());
|
reinterpret_cast<file_set_descriptor*>(chunk.Data());
|
||||||
fileSet->tag().init_check(0);
|
fileSet->tag().init_check(0);
|
||||||
PDUMP(fileSet);
|
PDUMP(fileSet);
|
||||||
fRootIcb = new Icb(this, fileSet->root_directory_icb());
|
fRootIcb = new Icb(this, fileSet->root_directory_icb());
|
||||||
@@ -267,10 +269,11 @@ Volume::Name() const {
|
|||||||
/*! \brief Maps the given logical block to a physical block.
|
/*! \brief Maps the given logical block to a physical block.
|
||||||
*/
|
*/
|
||||||
status_t
|
status_t
|
||||||
Volume::MapBlock(udf_long_address address, off_t *mappedBlock)
|
Volume::MapBlock(long_address address, off_t *mappedBlock)
|
||||||
{
|
{
|
||||||
DEBUG_INIT_ETC(CF_PRIVATE | CF_HIGH_VOLUME, "Volume", ("long_address(block: %ld, partition: %d), %p",
|
DEBUG_INIT_ETC(CF_PRIVATE | CF_HIGH_VOLUME, "Volume",
|
||||||
address.block(), address.partition(), mappedBlock));
|
("partition: %d, block: %ld, mappedBlock: %p",
|
||||||
|
address.partition(), address.block(), mappedBlock));
|
||||||
status_t error = mappedBlock ? B_OK : B_BAD_VALUE;
|
status_t error = mappedBlock ? B_OK : B_BAD_VALUE;
|
||||||
if (!error) {
|
if (!error) {
|
||||||
Partition *partition = _GetPartition(address.partition());
|
Partition *partition = _GetPartition(address.partition());
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ public:
|
|||||||
status_t Unmount();
|
status_t Unmount();
|
||||||
|
|
||||||
// Address mapping
|
// Address mapping
|
||||||
status_t MapBlock(udf_long_address address, off_t *mappedBlock);
|
status_t MapBlock(long_address address, off_t *mappedBlock);
|
||||||
status_t MapExtent(udf_long_address logicalExtent, udf_extent_address &physicalExtent);
|
status_t MapExtent(long_address logicalExtent, extent_address &physicalExtent);
|
||||||
|
|
||||||
// Miscellaneous info
|
// Miscellaneous info
|
||||||
const char *Name() const;
|
const char *Name() const;
|
||||||
@@ -77,7 +77,7 @@ private:
|
|||||||
uint32 fBlockSize;
|
uint32 fBlockSize;
|
||||||
uint32 fBlockShift;
|
uint32 fBlockShift;
|
||||||
Partition *fPartitions[UDF_MAX_PARTITION_MAPS];
|
Partition *fPartitions[UDF_MAX_PARTITION_MAPS];
|
||||||
Icb *fRootIcb; // Destroyed by vfs via callback to udf_release_node()
|
Icb *fRootIcb; // Destroyed by vfs via callback to release_node()
|
||||||
CS0String fName;
|
CS0String fName;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -487,7 +487,8 @@ udf_walk(void *ns, void *_dir, const char *filename, char **resolvedPath, vnode_
|
|||||||
int
|
int
|
||||||
udf_ioctl(void *ns, void *node, void *cookie, int cmd, void *buffer, size_t bufferLength)
|
udf_ioctl(void *ns, void *node, void *cookie, int cmd, void *buffer, size_t bufferLength)
|
||||||
{
|
{
|
||||||
DEBUG_INIT(CF_ENTRY | CF_VOLUME_OPS, NULL);
|
DEBUG_INIT_ETC(CF_ENTRY | CF_VOLUME_OPS, NULL, ("node: %p, cmd: 0x%x, "
|
||||||
|
"buf: %p, len: %ld\n", node, cmd, buffer, bufferLength));
|
||||||
// FUNCTION_START(("node: %p, cmd: %d, buf: %p, len: %ld\n", node, cmd, buffer, bufferLength));
|
// FUNCTION_START(("node: %p, cmd: %d, buf: %p, len: %ld\n", node, cmd, buffer, bufferLength));
|
||||||
RETURN(B_ERROR);
|
RETURN(B_ERROR);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user