Added udf partition descriptor output to Build().

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@5635 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Tyler Dauwalder
2003-12-09 00:46:38 +00:00
parent 35947f6f39
commit 92572bc3ae
2 changed files with 64 additions and 5 deletions
+62 -3
View File
@@ -342,13 +342,72 @@ UdfBuilder::Build()
}
}
}
vdsNumber++;
// write partition descriptor
if (!error) {
_PrintUpdate(VERBOSITY_MEDIUM, "udf: Writing partition descriptor");
// build partition descriptor
vdsNumber++;
uint16 partitionNumber = 0;
Udf::partition_descriptor partition;
partition.set_vds_number(vdsNumber);
partition.set_partition_flags(1);
partition.set_partition_number(partitionNumber);
partition.partition_contents() = Udf::kPartitionContentsId;
memset(partition.partition_contents_use().data, 0,
partition.partition_contents_use().size());
partition.set_access_type(Udf::ACCESS_READ_ONLY);
partition.set_start(_Allocator().Tail());
partition.set_length(0);
// Can't set the length till we've built most of rest of the image,
// so we'll set it to 0 now and fix it once we know how big
// the partition really is.
partition.implementation_id() = Udf::kImplementationId;
memset(partition.implementation_use().data, 0,
partition.implementation_use().size());
memset(partition.reserved().data, 0,
partition.reserved().size());
partition.tag().set_id(Udf::TAGID_PARTITION_DESCRIPTOR);
partition.tag().set_version(3);
partition.tag().set_serial_number(0);
// note that the checksums haven't been set yet, since the
// location is dependent on which sequence (primary or reserve)
// the descriptor is currently being written to. Thus we have to
// recalculate the checksums for each sequence.
DUMP(partition);
// write partition descriptor to primary vds
partition.tag().set_location(primaryExtent.location()+vdsNumber);
partition.tag().set_checksums(partition);
ssize_t bytes = _OutputFile().WriteAt(partition.tag().location() << _BlockShift(),
&partition, sizeof(partition));
error = check_size_error(bytes, sizeof(partition));
if (!error && bytes < ssize_t(_BlockSize())) {
ssize_t bytesLeft = _BlockSize() - bytes;
bytes = _OutputFile().ZeroAt((partition.tag().location() << _BlockShift())
+ bytes, bytesLeft);
error = check_size_error(bytes, bytesLeft);
}
// write partition descriptor to reserve vds
if (!error) {
partition.tag().set_location(reserveExtent.location()+vdsNumber);
partition.tag().set_checksums(partition);
ssize_t bytes = _OutputFile().WriteAt(partition.tag().location() << _BlockShift(),
&partition, sizeof(partition));
error = check_size_error(bytes, sizeof(partition));
if (!error && bytes < ssize_t(_BlockSize())) {
ssize_t bytesLeft = _BlockSize() - bytes;
bytes = _OutputFile().ZeroAt((partition.tag().location() << _BlockShift())
+ bytes, bytesLeft);
error = check_size_error(bytes, bytesLeft);
}
}
}
// write logical vds
// Udf::logical_volume_descriptor logical;
// write partition descriptor
// Udf::partition_descriptor partition;
// Error check
if (error) {
+2 -2
View File
@@ -34,8 +34,8 @@ private:
static const int kMaxUpdateStringLength = 1024;
OutputFile& _OutputFile() { return fOutputFile; }
uint32 _BlockSize() const { return fBlockSize; }
uint32 _BlockShift() const { return fBlockShift; }
uint32 _BlockSize() const { return fBlockSize; }
uint32 _BlockShift() const { return fBlockShift; }
bool _DoUdf() const { return fDoUdf; }
bool _DoIso() const { return fDoIso; }
Udf::String& _UdfVolumeName() { return fUdfVolumeName; }