1 /* 2 libparted - a library for manipulating disk partitions 3 Copyright (C) 1999, 2000, 2001, 2002, 2007 Free Software Foundation, Inc. 4 5 This program is free software; you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. 17 */ 18 19 /** 20 * \addtogroup PedDisk 21 * @{ 22 */ 23 24 /** \file disk.h */ 25 26 #ifndef PED_DISK_H_INCLUDED 27 #define PED_DISK_H_INCLUDED 28 29 /** 30 * Partition types 31 */ 32 enum _PedPartitionType { 33 PED_PARTITION_NORMAL = 0x00, 34 PED_PARTITION_LOGICAL = 0x01, 35 PED_PARTITION_EXTENDED = 0x02, 36 PED_PARTITION_FREESPACE = 0x04, 37 PED_PARTITION_METADATA = 0x08, 38 PED_PARTITION_PROTECTED = 0x10 39 }; 40 41 /** 42 * Partition flags. 43 */ 44 enum _PedPartitionFlag { 45 PED_PARTITION_BOOT=1, 46 PED_PARTITION_ROOT=2, 47 PED_PARTITION_SWAP=3, 48 PED_PARTITION_HIDDEN=4, 49 PED_PARTITION_RAID=5, 50 PED_PARTITION_LVM=6, 51 PED_PARTITION_LBA=7, 52 PED_PARTITION_HPSERVICE=8, 53 PED_PARTITION_PALO=9, 54 PED_PARTITION_PREP=10, 55 PED_PARTITION_MSFT_RESERVED=11 56 }; 57 #define PED_PARTITION_FIRST_FLAG PED_PARTITION_BOOT 58 #define PED_PARTITION_LAST_FLAG PED_PARTITION_MSFT_RESERVED 59 60 enum _PedDiskTypeFeature { 61 PED_DISK_TYPE_EXTENDED=1, /**< supports extended partitions */ 62 PED_DISK_TYPE_PARTITION_NAME=2 /**< supports partition names */ 63 }; 64 #define PED_DISK_TYPE_FIRST_FEATURE PED_DISK_TYPE_EXTENDED 65 #define PED_DISK_TYPE_LAST_FEATURE PED_DISK_TYPE_PARTITION_NAME 66 67 struct _PedDisk; 68 struct _PedPartition; 69 struct _PedDiskOps; 70 struct _PedDiskType; 71 struct _PedDiskArchOps; 72 73 typedef enum _PedPartitionType PedPartitionType; 74 typedef enum _PedPartitionFlag PedPartitionFlag; 75 typedef enum _PedDiskTypeFeature PedDiskTypeFeature; 76 typedef struct _PedDisk PedDisk; 77 typedef struct _PedPartition PedPartition; 78 typedef const struct _PedDiskOps PedDiskOps; 79 typedef struct _PedDiskType PedDiskType; 80 typedef const struct _PedDiskArchOps PedDiskArchOps; 81 82 #include <parted/device.h> 83 #include <parted/filesys.h> 84 #include <parted/natmath.h> 85 #include <parted/geom.h> 86 87 /** @} */ 88 89 /** 90 * \addtogroup PedPartition 91 * 92 * @{ 93 */ 94 95 /** \file disk.h */ 96 97 /** 98 * PedPartition structure represents a partition. 99 */ 100 struct _PedPartition { 101 PedPartition* prev; 102 PedPartition* next; 103 104 /**< the partition table of the partition */ 105 PedDisk* disk; 106 PedGeometry geom; /**< geometry of the partition */ 107 108 /**< the partition number: In Linux, this is the 109 same as the minor number. No assumption 110 should be made about "num" and "type" 111 - different disk labels have different rules. */ 112 113 int num; 114 PedPartitionType type; /**< the type of partition: a bit field of 115 PED_PARTITION_LOGICAL, PED_PARTITION_EXTENDED, 116 PED_PARTITION_METADATA 117 and PED_PARTITION_FREESPACE. 118 Both the first two, and the last two are 119 mutually exclusive. 120 An extended partition is a primary 121 partition that may contain logical partitions. 122 There is at most one extended partition on 123 a disk. 124 A logical partition is like a primary 125 partition, except it's inside an extended 126 partition. Internally, pseudo partitions are 127 allocated to represent free space, or disk 128 label meta-data. These have the 129 PED_PARTITION_FREESPACE or 130 PED_PARTITION_METADATA bit set. */ 131 132 /**< The type of file system on the partition. NULL if unknown. */ 133 const PedFileSystemType* fs_type; 134 135 /**< Only used for an extended partition. The list of logical 136 partitions (and free space and metadata within the extended 137 partition). */ 138 PedPartition* part_list; 139 140 void* disk_specific; 141 }; 142 143 /** @} */ 144 145 /** 146 * \addtogroup PedDisk 147 * @{ 148 */ 149 150 /** 151 * Represents a disk label (partition table). 152 */ 153 struct _PedDisk { 154 PedDevice* dev; /**< the device where the 155 partition table lies */ 156 const PedDiskType* type; /**< type of disk label */ 157 const int* block_sizes; /**< block sizes supported 158 by this label */ 159 PedPartition* part_list; /**< list of partitions. Access with 160 ped_disk_next_partition() */ 161 162 void* disk_specific; 163 164 /* office use only ;-) */ 165 int needs_clobber; /**< clobber before write? */ 166 int update_mode; /**< mode without free/metadata 167 partitions, for easier 168 update */ 169 }; 170 171 struct _PedDiskOps { 172 /* disk label operations */ 173 int (*probe) (const PedDevice *dev); 174 int (*clobber) (PedDevice* dev); 175 PedDisk* (*alloc) (const PedDevice* dev); 176 PedDisk* (*duplicate) (const PedDisk* disk); 177 void (*free) (PedDisk* disk); 178 int (*read) (PedDisk* disk); 179 int (*write) (const PedDisk* disk); 180 /** \todo add label guessing op here */ 181 182 /* partition operations */ 183 PedPartition* (*partition_new) ( 184 const PedDisk* disk, 185 PedPartitionType part_type, 186 const PedFileSystemType* fs_type, 187 PedSector start, 188 PedSector end); 189 PedPartition* (*partition_duplicate) (const PedPartition* part); 190 void (*partition_destroy) (PedPartition* part); 191 int (*partition_set_system) (PedPartition* part, 192 const PedFileSystemType* fs_type); 193 int (*partition_set_flag) ( 194 PedPartition* part, 195 PedPartitionFlag flag, 196 int state); 197 int (*partition_get_flag) ( 198 const PedPartition* part, 199 PedPartitionFlag flag); 200 int (*partition_is_flag_available) ( 201 const PedPartition* part, 202 PedPartitionFlag flag); 203 void (*partition_set_name) (PedPartition* part, const char* name); 204 const char* (*partition_get_name) (const PedPartition* part); 205 int (*partition_align) (PedPartition* part, 206 const PedConstraint* constraint); 207 int (*partition_enumerate) (PedPartition* part); 208 209 /* other */ 210 int (*alloc_metadata) (PedDisk* disk); 211 int (*get_max_primary_partition_count) (const PedDisk* disk); 212 }; 213 214 struct _PedDiskType { 215 PedDiskType* next; 216 const char* name; /**< the name of the partition table type. 217 \todo not very intuitive name */ 218 PedDiskOps* const ops; 219 220 PedDiskTypeFeature features; /**< bitmap of supported features */ 221 }; 222 223 /** 224 * Architecture-specific operations. i.e. communication with kernel (or 225 * whatever) about changes, etc. 226 */ 227 struct _PedDiskArchOps { 228 char* (*partition_get_path) (const PedPartition* part); 229 int (*partition_is_busy) (const PedPartition* part); 230 int (*disk_commit) (PedDisk* disk); 231 }; 232 233 extern void ped_disk_type_register (PedDiskType* type); 234 extern void ped_disk_type_unregister (PedDiskType* type); 235 236 extern PedDiskType* ped_disk_type_get_next (PedDiskType* type); 237 extern PedDiskType* ped_disk_type_get (const char* name); 238 extern int ped_disk_type_check_feature (const PedDiskType* disk_type, 239 PedDiskTypeFeature feature); 240 241 extern PedDiskType* ped_disk_probe (PedDevice* dev); 242 extern int ped_disk_clobber (PedDevice* dev); 243 extern int ped_disk_clobber_exclude (PedDevice* dev, 244 const PedDiskType* exclude); 245 extern PedDisk* ped_disk_new (PedDevice* dev); 246 extern PedDisk* ped_disk_new_fresh (PedDevice* dev, 247 const PedDiskType* disk_type); 248 extern PedDisk* ped_disk_duplicate (const PedDisk* old_disk); 249 extern void ped_disk_destroy (PedDisk* disk); 250 extern int ped_disk_commit (PedDisk* disk); 251 extern int ped_disk_commit_to_dev (PedDisk* disk); 252 extern int ped_disk_commit_to_os (PedDisk* disk); 253 extern int ped_disk_check (const PedDisk* disk); 254 extern void ped_disk_print (const PedDisk* disk); 255 256 extern int ped_disk_get_primary_partition_count (const PedDisk* disk); 257 extern int ped_disk_get_last_partition_num (const PedDisk* disk); 258 extern int ped_disk_get_max_primary_partition_count (const PedDisk* disk); 259 260 /** @} */ 261 262 /** 263 * \addtogroup PedPartition 264 * 265 * @{ 266 */ 267 268 extern PedPartition* ped_partition_new (const PedDisk* disk, 269 PedPartitionType type, 270 const PedFileSystemType* fs_type, 271 PedSector start, 272 PedSector end); 273 extern void ped_partition_destroy (PedPartition* part); 274 extern int ped_partition_is_active (const PedPartition* part); 275 extern int ped_partition_set_flag (PedPartition* part, PedPartitionFlag flag, 276 int state); 277 extern int ped_partition_get_flag (const PedPartition* part, 278 PedPartitionFlag flag); 279 extern int ped_partition_is_flag_available (const PedPartition* part, 280 PedPartitionFlag flag); 281 extern int ped_partition_set_system (PedPartition* part, 282 const PedFileSystemType* fs_type); 283 extern int ped_partition_set_name (PedPartition* part, const char* name); 284 extern const char* ped_partition_get_name (const PedPartition* part); 285 extern int ped_partition_is_busy (const PedPartition* part); 286 extern char* ped_partition_get_path (const PedPartition* part); 287 288 extern const char* ped_partition_type_get_name (PedPartitionType part_type); 289 extern const char* ped_partition_flag_get_name (PedPartitionFlag flag); 290 extern PedPartitionFlag ped_partition_flag_get_by_name (const char* name); 291 extern PedPartitionFlag ped_partition_flag_next (PedPartitionFlag flag); 292 293 /** @} */ 294 295 /** 296 * \addtogroup PedDisk 297 * @{ 298 */ 299 300 extern int ped_disk_add_partition (PedDisk* disk, PedPartition* part, 301 const PedConstraint* constraint); 302 extern int ped_disk_remove_partition (PedDisk* disk, PedPartition* part); 303 extern int ped_disk_delete_partition (PedDisk* disk, PedPartition* part); 304 extern int ped_disk_delete_all (PedDisk* disk); 305 extern int ped_disk_set_partition_geom (PedDisk* disk, PedPartition* part, 306 const PedConstraint* constraint, 307 PedSector start, PedSector end); 308 extern int ped_disk_maximize_partition (PedDisk* disk, PedPartition* part, 309 const PedConstraint* constraint); 310 extern PedGeometry* ped_disk_get_max_partition_geometry (PedDisk* disk, 311 PedPartition* part, const PedConstraint* constraint); 312 extern int ped_disk_minimize_extended_partition (PedDisk* disk); 313 314 extern PedPartition* ped_disk_next_partition (const PedDisk* disk, 315 const PedPartition* part); 316 extern PedPartition* ped_disk_get_partition (const PedDisk* disk, int num); 317 extern PedPartition* ped_disk_get_partition_by_sector (const PedDisk* disk, 318 PedSector sect); 319 extern PedPartition* ped_disk_extended_partition (const PedDisk* disk); 320 321 /* internal functions */ 322 extern PedDisk* _ped_disk_alloc (const PedDevice* dev, const PedDiskType* type); 323 extern void _ped_disk_free (PedDisk* disk); 324 325 326 /** @} */ 327 328 /** 329 * \addtogroup PedPartition 330 * 331 * @{ 332 */ 333 334 extern PedPartition* _ped_partition_alloc (const PedDisk* disk, 335 PedPartitionType type, 336 const PedFileSystemType* fs_type, 337 PedSector start, 338 PedSector end); 339 extern void _ped_partition_free (PedPartition* part); 340 341 extern int _ped_partition_attempt_align ( 342 PedPartition* part, const PedConstraint* external, 343 PedConstraint* internal); 344 345 #endif /* PED_DISK_H_INCLUDED */ 346 347 /** @} */ 348