libstorage-ng
PartitionTable.h
1 /*
2  * Copyright (c) [2015-2018] SUSE LLC
3  *
4  * All Rights Reserved.
5  *
6  * This program is free software; you can redistribute it and/or modify it
7  * under the terms of version 2 of the GNU General Public License as published
8  * by the Free Software Foundation.
9  *
10  * This program is distributed in the hope that it will be useful, but WITHOUT
11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13  * more details.
14  *
15  * You should have received a copy of the GNU General Public License along
16  * with this program; if not, contact Novell, Inc.
17  *
18  * To contact Novell about this file by physical or electronic mail, you may
19  * find current contact information at www.novell.com.
20  */
21 
22 
23 #ifndef STORAGE_PARTITION_TABLE_H
24 #define STORAGE_PARTITION_TABLE_H
25 
26 
27 #include <vector>
28 
29 #include "storage/Utils/Swig.h"
30 #include "storage/Utils/Region.h"
31 #include "storage/Utils/Alignment.h"
32 #include "storage/Devices/Device.h"
33 #include "storage/Devices/Partition.h"
34 
35 
36 namespace storage
37 {
38  class Partitionable;
39 
40 
42  enum class PtType {
43  UNKNOWN, LOOP, MSDOS, GPT, DASD, MAC, IMPLICIT
44  };
45 
46  std::string get_pt_type_name(PtType pt_type);
47 
48 
53  {
54  public:
55 
56  PartitionSlot();
57 
58  Region region;
59 
60  unsigned int number;
61  unsigned nr() const ST_DEPRECATED { return number; }
62 
63  std::string name;
64 
65  bool primary_slot;
66  bool primary_possible;
67  bool extended_slot;
68  bool extended_possible;
69  bool logical_slot;
70  bool logical_possible;
71 
72  bool is_possible(PartitionType partition_type) const;
73 
74  friend std::ostream& operator<<(std::ostream& s, const PartitionSlot& partition_slot);
75 
76  };
77 
78 
79  // abstract class
80 
81  class PartitionTable : public Device
82  {
83  public:
84 
85  PtType get_type() const;
86 
92  Partition* create_partition(const std::string& name, const Region& region, PartitionType type);
93 
98  void delete_partition(Partition* partition);
99 
100  void delete_partition(const std::string& name) ST_DEPRECATED;
101 
110  unsigned int max_primary() const;
111 
117  bool extended_possible() const;
118 
127  unsigned int max_logical() const;
128 
129  unsigned int num_primary() const;
130  bool has_extended() const;
131  unsigned int num_logical() const;
132 
136  std::vector<Partition*> get_partitions();
137 
141  std::vector<const Partition*> get_partitions() const;
142 
146  Partition* get_partition(const std::string& name);
147 
154  const Partition* get_extended() const;
155 
159  const Partitionable* get_partitionable() const;
160 
161  Alignment get_alignment(AlignType align_type = AlignType::OPTIMAL) const;
162 
166  std::vector<PartitionSlot> get_unused_partition_slots(AlignPolicy align_policy = AlignPolicy::ALIGN_START_KEEP_END,
167  AlignType align_type = AlignType::OPTIMAL) const;
168 
174  Region align(const Region& region, AlignPolicy align_policy = AlignPolicy::ALIGN_START_AND_END,
175  AlignType align_type = AlignType::OPTIMAL) const;
176 
182 
188 
192  bool is_partition_id_supported(unsigned int id) const;
193 
194  public:
195 
196  class Impl;
197 
198  Impl& get_impl();
199  const Impl& get_impl() const;
200 
201  protected:
202 
203  PartitionTable(Impl* impl);
204 
205  };
206 
207 
208  bool is_partition_table(const Device* device);
209 
217 
221  const PartitionTable* to_partition_table(const Device* device);
222 
223 }
224 
225 #endif
Region align(const Region &region, AlignPolicy align_policy=AlignPolicy::ALIGN_START_AND_END, AlignType align_type=AlignType::OPTIMAL) const
region is sector-based.
bool extended_possible() const
Returns whether a extended partition is supported.
std::vector< PartitionSlot > get_unused_partition_slots(AlignPolicy align_policy=AlignPolicy::ALIGN_START_KEEP_END, AlignType align_type=AlignType::OPTIMAL) const
const Partition * get_extended() const
Returns the extended partition of the partition table.
const Partitionable * get_partitionable() const
PartitionType
Partition type (primary, extended, logical)
Definition: Partition.h:39
PartitionTable * to_partition_table(Device *device)
Converts pointer to Device to pointer to PartitionTable.
unsigned int max_primary() const
Highest number for a primary or extended partition.
A start/length pair with a block size.
Definition: Region.h:73
bool is_partition_legacy_boot_flag_supported() const
Returns whether the legacy boot flag is supported on partitions on the partition table.
AlignPolicy
Definition: Alignment.h:50
Partition * get_partition(const std::string &name)
std::vector< Partition * > get_partitions()
Get partitions of the partition table.
PtType
Partition Table Type.
Definition: PartitionTable.h:42
A class to calculate partition alignment based on hardware topology.
Definition: Alignment.h:91
An abstract base class of storage devices, and a vertex in the Devicegraph.
Definition: Device.h:75
Definition: Partitionable.h:40
unsigned int max_logical() const
Highest number for a logical partition.
bool is_partition_id_supported(unsigned int id) const
Returns whether the partition id is supported on the partition table.
Partition * create_partition(const std::string &name, const Region &region, PartitionType type)
region is sector-based.
bool is_partition_boot_flag_supported() const
Returns whether the boot flag is supported on partitions on the partition table.
AlignType
Definition: Alignment.h:36
Align to topology information.
A partition of a Partitionable, e.g. Disk or Md.
Definition: Partition.h:114
The storage namespace.
Definition: Actiongraph.h:37
Definition: PartitionTable.h:81
Number and name are only valid if one of the possible flags is true.
Definition: PartitionTable.h:52
void delete_partition(Partition *partition)
Delete a partition in the partition table.