- Added partition type id udf_entity_id constants
- Added udf_entity_id::{udf_entity_id(),matches()}
- Added partial udf_metadata_partition_map
- Added actual space for partition maps to udf_logical_descriptor,
since I now allocate said descriptors on the stack sometimes,
instead of just casting a pre-allocated chunk of memory to said
descriptor type.
git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5313 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
@@ -37,6 +37,11 @@ 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
|
||||||
|
const udf_entity_id Udf::kMetadataPartitionMapId(0, "*UDF Metadata Partition");
|
||||||
|
const udf_entity_id Udf::kSparablePartitionMapId(0, "*UDF Sparable Partition");
|
||||||
|
const udf_entity_id Udf::kVirtualPartitionMapId(0, "*UDF Virtual Partition");
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// Helper functions
|
// Helper functions
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
@@ -148,15 +153,40 @@ udf_timestamp::dump() const
|
|||||||
// udf_entity_id
|
// udf_entity_id
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
|
|
||||||
|
udf_entity_id::udf_entity_id(uint8 flags, char *identifier, char *identifier_suffix)
|
||||||
|
: _flags(flags)
|
||||||
|
{
|
||||||
|
if (identifier)
|
||||||
|
strncpy(_identifier, identifier, kIdentifierLength);
|
||||||
|
else
|
||||||
|
memset(_identifier, 0, kIdentifierLength);
|
||||||
|
if (identifier_suffix)
|
||||||
|
strncpy(_identifier_suffix, identifier_suffix, kIdentifierSuffixLength);
|
||||||
|
else
|
||||||
|
memset(_identifier_suffix, 0, kIdentifierSuffixLength);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
udf_entity_id::dump() const
|
udf_entity_id::dump() const
|
||||||
{
|
{
|
||||||
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_entity_id");
|
DUMP_INIT(CF_PUBLIC | CF_DUMP, "udf_entity_id");
|
||||||
PRINT(("flags: %d\n", flags()));
|
PRINT(("flags: %d\n", flags()));
|
||||||
PRINT(("identifier: `%s'\n", identifier()));
|
PRINT(("identifier: `%.23s'\n", identifier()));
|
||||||
PRINT(("identifier_suffix: `%s'\n", identifier_suffix()));
|
PRINT(("identifier_suffix: `%s'\n", identifier_suffix()));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
udf_entity_id::matches(const udf_entity_id &id) const
|
||||||
|
{
|
||||||
|
bool result = true;
|
||||||
|
for (int i = 0; i < udf_entity_id::kIdentifierLength; i++) {
|
||||||
|
if (identifier()[i] != id.identifier()[i]) {
|
||||||
|
result = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// udf_extent_address
|
// udf_extent_address
|
||||||
|
|||||||
@@ -157,7 +157,11 @@ private:
|
|||||||
*/
|
*/
|
||||||
struct udf_entity_id {
|
struct udf_entity_id {
|
||||||
public:
|
public:
|
||||||
|
udf_entity_id(uint8 flags = 0, char *identifier = NULL,
|
||||||
|
char *identifier_suffix = NULL);
|
||||||
|
|
||||||
void dump() const;
|
void dump() const;
|
||||||
|
bool matches(const udf_entity_id &id) const;
|
||||||
|
|
||||||
// Get functions
|
// Get functions
|
||||||
uint8 flags() const { return _flags; }
|
uint8 flags() const { return _flags; }
|
||||||
@@ -168,12 +172,18 @@ public:
|
|||||||
|
|
||||||
// Set functions
|
// Set functions
|
||||||
void set_flags(uint8 flags) { _flags = flags; }
|
void set_flags(uint8 flags) { _flags = flags; }
|
||||||
|
|
||||||
|
static const int kIdentifierLength = 23;
|
||||||
|
static const int kIdentifierSuffixLength = 8;
|
||||||
private:
|
private:
|
||||||
uint8 _flags;
|
uint8 _flags;
|
||||||
char _identifier[23];
|
char _identifier[kIdentifierLength];
|
||||||
char _identifier_suffix[8];
|
char _identifier_suffix[kIdentifierSuffixLength];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
extern const udf_entity_id kMetadataPartitionMapId;
|
||||||
|
extern const udf_entity_id kSparablePartitionMapId;
|
||||||
|
extern const udf_entity_id kVirtualPartitionMapId;
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// ECMA-167 Part 2
|
// ECMA-167 Part 2
|
||||||
@@ -213,7 +223,6 @@ struct udf_volume_structure_descriptor_header {
|
|||||||
bool id_matches(const char *id);
|
bool id_matches(const char *id);
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
// Volume structure descriptor ids
|
// Volume structure descriptor ids
|
||||||
extern const char* kVSDID_BEA;
|
extern const char* kVSDID_BEA;
|
||||||
extern const char* kVSDID_TEA;
|
extern const char* kVSDID_TEA;
|
||||||
@@ -223,7 +232,6 @@ extern const char* kVSDID_ECMA167_2;
|
|||||||
extern const char* kVSDID_ECMA167_3;
|
extern const char* kVSDID_ECMA167_3;
|
||||||
extern const char* kVSDID_ECMA168;
|
extern const char* kVSDID_ECMA168;
|
||||||
|
|
||||||
|
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
// ECMA-167 Part 3
|
// ECMA-167 Part 3
|
||||||
//----------------------------------------------------------------------
|
//----------------------------------------------------------------------
|
||||||
@@ -693,6 +701,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
extern const uint8 kMaxPartitionDescriptors;
|
extern const uint8 kMaxPartitionDescriptors;
|
||||||
#define UDF_MAX_PARTITION_MAPS 2
|
#define UDF_MAX_PARTITION_MAPS 2
|
||||||
|
#define UDF_MAX_PARTITION_MAP_SIZE 64
|
||||||
|
|
||||||
/*! \brief Partition Descriptor
|
/*! \brief Partition Descriptor
|
||||||
|
|
||||||
@@ -889,23 +898,32 @@ private:
|
|||||||
UDF type 2 for virtual maps or maps on systems not supporting
|
UDF type 2 for virtual maps or maps on systems not supporting
|
||||||
defect management.
|
defect management.
|
||||||
|
|
||||||
|
Note that we actually allocate memory for the partition maps
|
||||||
|
here due to the fact that we allocate udf_logical_descriptor
|
||||||
|
objects on the stack sometimes.
|
||||||
|
|
||||||
See UDF-2.01 2.2.8, 2.2.9
|
See UDF-2.01 2.2.8, 2.2.9
|
||||||
*/
|
*/
|
||||||
uint8 _partition_maps[0];
|
uint8 _partition_maps[UDF_MAX_PARTITION_MAPS * UDF_MAX_PARTITION_MAP_SIZE];
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Generic partition map
|
/*! \brief (Mostly) common portion of various partition maps
|
||||||
|
|
||||||
See also: ECMA-167 3/10.7.1
|
See also: ECMA-167 3/10.7.1
|
||||||
*/
|
*/
|
||||||
struct udf_generic_partition_map {
|
struct udf_partition_map_header {
|
||||||
public:
|
public:
|
||||||
uint8 type() const { return _type; }
|
uint8 type() const { return _type; }
|
||||||
uint8 length() const { return _length; }
|
uint8 length() const { return _length; }
|
||||||
uint8 *map_data() { return _map_data; }
|
uint8 *map_data() { return _map_data; }
|
||||||
const uint8 *map_data() const { return _map_data; }
|
const uint8 *map_data() const { return _map_data; }
|
||||||
|
|
||||||
|
udf_entity_id& partition_type_id()
|
||||||
|
{ return *reinterpret_cast<udf_entity_id*>(&_map_data[2]); }
|
||||||
|
const udf_entity_id& partition_type_id() const
|
||||||
|
{ return *reinterpret_cast<const udf_entity_id*>(&_map_data[2]); }
|
||||||
|
|
||||||
void set_type(uint8 type) { _type = type; }
|
void set_type(uint8 type) { _type = type; }
|
||||||
void set_length(uint8 length) { _length = length; }
|
void set_length(uint8 length) { _length = length; }
|
||||||
private:
|
private:
|
||||||
@@ -1044,6 +1062,34 @@ private:
|
|||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
|
/* ----UDF Specific---- */
|
||||||
|
/*! \brief Metadata partition map
|
||||||
|
|
||||||
|
Note that this map is a customization of the ECMA-167
|
||||||
|
type 2 partition map.
|
||||||
|
|
||||||
|
See also: UDF-2.50 2.2.10
|
||||||
|
*/
|
||||||
|
struct udf_metadata_partition_map {
|
||||||
|
uint8 type;
|
||||||
|
uint8 length;
|
||||||
|
uint8 reserved1[2];
|
||||||
|
|
||||||
|
/*! - flags: 0
|
||||||
|
- identifier: "*UDF Metadata Partition"
|
||||||
|
- identifier_suffix: per UDF-2.50 2.1.5
|
||||||
|
*/
|
||||||
|
udf_entity_id partition_type_id;
|
||||||
|
uint16 volume_sequence_number;
|
||||||
|
|
||||||
|
/*! corresponding type 1 or type 2 sparable partition
|
||||||
|
map in same logical volume
|
||||||
|
*/
|
||||||
|
uint16 partition_number;
|
||||||
|
uint8 reserved2[24];
|
||||||
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
|
||||||
/*! \brief Unallocated space descriptor
|
/*! \brief Unallocated space descriptor
|
||||||
|
|
||||||
See also: ECMA-167 3/10.8
|
See also: ECMA-167 3/10.8
|
||||||
|
|||||||
Reference in New Issue
Block a user