summaryrefslogtreecommitdiff
path: root/diskman/partition.cc
diff options
context:
space:
mode:
authorA. Wilcox <AWilcox@Wilcox-Tech.com>2020-02-12 10:13:23 -0600
committerA. Wilcox <AWilcox@Wilcox-Tech.com>2020-02-12 10:13:23 -0600
commitd72ef990a3a417e4f9062517313afe325e7035e6 (patch)
tree87710964990847b4c0fe22392ba497680bc3c947 /diskman/partition.cc
parente16056761ebbfdbf8d0cf6b394e72d1689e7b3ce (diff)
downloadhorizon-d72ef990a3a417e4f9062517313afe325e7035e6.tar.gz
horizon-d72ef990a3a417e4f9062517313afe325e7035e6.tar.bz2
horizon-d72ef990a3a417e4f9062517313afe325e7035e6.tar.xz
horizon-d72ef990a3a417e4f9062517313afe325e7035e6.zip
DiskMan: Add partition support, codify the source of creation objects
Diffstat (limited to 'diskman/partition.cc')
-rw-r--r--diskman/partition.cc61
1 files changed, 61 insertions, 0 deletions
diff --git a/diskman/partition.cc b/diskman/partition.cc
index e69de29..308d002 100644
--- a/diskman/partition.cc
+++ b/diskman/partition.cc
@@ -0,0 +1,61 @@
+/*
+ * partition.cc - Implementation of the Partition class
+ * diskman, the Disk Manipulation library for
+ * Project Horizon
+ *
+ * Copyright (c) 2020 Adélie Linux and contributors. All rights reserved.
+ * This code is licensed under the AGPL 3.0 license, as noted in the
+ * LICENSE-code file in the root directory of this repository.
+ *
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+#include "partition.hh"
+#include "disk.hh"
+
+#include <blkid/blkid.h>
+#include <iostream>
+#include <libfdisk/libfdisk.h>
+#include <libudev.h>
+#include <stdexcept>
+
+namespace Horizon {
+namespace DiskMan {
+
+Partition::Partition(Disk &d, void *creation, int type) {
+ switch(type) {
+ case 0: { /* libfdisk */
+ struct fdisk_partition *part = static_cast<struct fdisk_partition *>(creation);
+ if(fdisk_partition_has_size(part)) {
+ /* XXX BUG FIXME TODO sector size */
+ this->_size = fdisk_partition_get_size(part) * 512;
+ } else {
+ this->_size = 0;
+ }
+ const char *name = fdisk_partname(d.node().c_str(),
+ fdisk_partition_get_partno(part) + 1);
+ const char *value;
+ value = blkid_get_tag_value(nullptr, "TYPE", name);
+ if(value != nullptr) this->_fs_type = std::string(value);
+ value = blkid_get_tag_value(nullptr, "LABEL", name);
+ if(value != nullptr) this->_label = std::string(value);
+ break;
+ }
+ case 1: { /* udev */
+ struct udev_device *dev = static_cast<struct udev_device *>(creation);
+ const char *value;
+ value = udev_device_get_property_value(dev, "ID_FS_TYPE");
+ if(value != nullptr) this->_fs_type = std::string(value);
+ value = udev_device_get_property_value(dev, "ID_FS_LABEL");
+ if(value != nullptr) this->_label = std::string(value);
+ value = udev_device_get_property_value(dev, "ID_PART_ENTRY_SIZE");
+ if(value != nullptr) this->_size = strtoull(value, nullptr, 10) * 512;
+ break;
+ }
+ default:
+ throw std::invalid_argument{ "invalid type code" };
+ }
+}
+
+}
+}