summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp
diff options
context:
space:
mode:
authorSamuel Bowman <sam@sambowman.tech>2022-02-12 14:21:28 -0500
committerLinus Groh <mail@linusgroh.de>2022-07-21 20:13:44 +0100
commitbe1c5c6b9f2d69074e076efdee4816dd22a2ad70 (patch)
tree74cb9e632826fd48898355f87ed7df57089c7d87 /Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp
parent27861477740873c74f660cbfe8862e634c02861f (diff)
downloadserenity-be1c5c6b9f2d69074e076efdee4816dd22a2ad70.zip
Kernel+LibPartition: Move DiskPartitionMetadata into LibPartition
This commit creates a new library LibPartition which will contain partition related code sharable between Kernel and Userland and includes DiskPartitionMetadata as the first shared class.
Diffstat (limited to 'Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp')
-rw-r--r--Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp98
1 files changed, 98 insertions, 0 deletions
diff --git a/Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp b/Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp
new file mode 100644
index 0000000000..0ce3eced3b
--- /dev/null
+++ b/Userland/Libraries/LibPartition/DiskPartitionMetadata.cpp
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2020, Liav A. <liavalb@hotmail.co.il>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include <LibPartition/DiskPartitionMetadata.h>
+
+namespace Partition {
+
+DiskPartitionMetadata::PartitionType::PartitionType(u8 partition_type)
+{
+ m_partition_type[0] = partition_type;
+}
+DiskPartitionMetadata::PartitionType::PartitionType(Array<u8, 16> partition_type)
+ : m_partition_type_is_uuid(true)
+{
+ m_partition_type.span().overwrite(0, partition_type.data(), partition_type.size());
+}
+UUID DiskPartitionMetadata::PartitionType::to_uuid() const
+{
+ VERIFY(is_uuid());
+ return m_partition_type;
+}
+u8 DiskPartitionMetadata::PartitionType::to_byte_indicator() const
+{
+ VERIFY(!is_uuid());
+ return m_partition_type[0];
+}
+bool DiskPartitionMetadata::PartitionType::is_uuid() const
+{
+ return m_partition_type_is_uuid;
+}
+bool DiskPartitionMetadata::PartitionType::is_valid() const
+{
+ return !all_of(m_partition_type, [](auto const octet) { return octet == 0; });
+}
+
+DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, u8 partition_type)
+ : m_start_block(start_block)
+ , m_end_block(end_block)
+ , m_type(partition_type)
+{
+ VERIFY(m_type.is_valid());
+}
+
+DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, Array<u8, 16> partition_type)
+ : m_start_block(start_block)
+ , m_end_block(end_block)
+ , m_type(partition_type)
+{
+ VERIFY(m_type.is_valid());
+}
+
+DiskPartitionMetadata::DiskPartitionMetadata(u64 start_block, u64 end_block, Array<u8, 16> partition_type, UUID unique_guid, u64 special_attributes)
+ : m_start_block(start_block)
+ , m_end_block(end_block)
+ , m_type(partition_type)
+ , m_unique_guid(unique_guid)
+ , m_attributes(special_attributes)
+{
+ VERIFY(m_type.is_valid());
+ VERIFY(!m_unique_guid.is_zero());
+}
+
+DiskPartitionMetadata DiskPartitionMetadata::offset(u64 blocks_count) const
+{
+ return { blocks_count + m_start_block, blocks_count + m_end_block, m_type.m_partition_type };
+}
+
+u64 DiskPartitionMetadata::start_block() const
+{
+ return m_start_block;
+}
+
+u64 DiskPartitionMetadata::end_block() const
+{
+ return m_end_block;
+}
+
+Optional<u64> DiskPartitionMetadata::special_attributes() const
+{
+ if (m_attributes == 0)
+ return {};
+ return m_attributes;
+}
+
+DiskPartitionMetadata::PartitionType const& DiskPartitionMetadata::type() const
+{
+ return m_type;
+}
+
+const UUID& DiskPartitionMetadata::unique_guid() const
+{
+ return m_unique_guid;
+}
+
+}