#include #include #include #ifndef BD_PART_API #define BD_PART_API GQuark bd_part_error_quark (void); #define BD_PART_ERROR bd_part_error_quark () typedef enum { BD_PART_ERROR_EXISTS, BD_PART_ERROR_INVAL, BD_PART_ERROR_FAIL, BD_PART_ERROR_TECH_UNAVAIL, } BDPartError; typedef enum { BD_PART_TABLE_MSDOS = 0, BD_PART_TABLE_GPT, BD_PART_TABLE_UNDEF } BDPartTableType; typedef enum { BD_PART_DISK_FLAG_GPT_PMBR_BOOT = 1 } BDPartDiskFlag; typedef enum { BD_PART_FLAG_BOOT = 1 << 1, BD_PART_FLAG_ROOT = 1 << 2, BD_PART_FLAG_SWAP = 1 << 3, BD_PART_FLAG_HIDDEN = 1 << 4, BD_PART_FLAG_RAID = 1 << 5, BD_PART_FLAG_LVM = 1 << 6, BD_PART_FLAG_LBA = 1 << 7, BD_PART_FLAG_HPSERVICE = 1 << 8, BD_PART_FLAG_CPALO = 1 << 9, BD_PART_FLAG_PREP = 1 << 10, BD_PART_FLAG_MSFT_RESERVED = 1 << 11, BD_PART_FLAG_BIOS_GRUB = 1 << 12, BD_PART_FLAG_APPLE_TV_RECOVERY = 1 << 13, BD_PART_FLAG_DIAG = 1 << 14, BD_PART_FLAG_LEGACY_BOOT = 1 << 15, BD_PART_FLAG_MSFT_DATA = 1 << 16, BD_PART_FLAG_IRST = 1 << 17, BD_PART_FLAG_ESP = 1 << 18, BD_PART_FLAG_GPT_SYSTEM_PART = 1 << 25, BD_PART_FLAG_GPT_READ_ONLY = 1 << 26, BD_PART_FLAG_GPT_HIDDEN = 1 << 27, BD_PART_FLAG_GPT_NO_AUTOMOUNT = 1 << 28 } BDPartFlag; typedef enum { BD_PART_TYPE_NORMAL = 0x00, BD_PART_TYPE_LOGICAL = 0x01, BD_PART_TYPE_EXTENDED = 0x02, BD_PART_TYPE_FREESPACE = 0x04, BD_PART_TYPE_METADATA = 0x08, BD_PART_TYPE_PROTECTED = 0x10 } BDPartType; typedef enum { BD_PART_TYPE_REQ_NORMAL = 0x00, BD_PART_TYPE_REQ_LOGICAL = 0x01, BD_PART_TYPE_REQ_EXTENDED = 0x02, BD_PART_TYPE_REQ_NEXT = 0x04 } BDPartTypeReq; typedef enum { BD_PART_ALIGN_MINIMAL, BD_PART_ALIGN_OPTIMAL, BD_PART_ALIGN_NONE } BDPartAlign; #define BD_PART_TYPE_SPEC (bd_part_spec_get_type ()) GType bd_part_spec_get_type (); typedef struct BDPartSpec { gchar *path; gchar *name; gchar *type_guid; guint64 type; guint64 start; guint64 size; guint64 flags; } BDPartSpec; /** * BDPartSpec: * @path: path of the partition (block device) * @name: name of the partition (for GPT partitions) * @type_guid: GUID of the partition's type (GPT) * @type: bit combination of partition's types (#BDPartType) * @start: start of the partition * @size: size of the partition * @flags: bit combination of partition's flags (#BDPartFlag) */ BDPartSpec* bd_part_spec_copy (BDPartSpec *data); void bd_part_spec_free (BDPartSpec *data); #define BD_PART_TYPE_DISK_SPEC (bd_part_disk_spec_get_type ()) GType bd_part_disk_spec_get_type (); typedef struct BDPartDiskSpec { gchar *path; BDPartTableType table_type; guint64 size; guint64 sector_size; guint64 flags; } BDPartDiskSpec; /** * BDPartDiskSpec: * @path: path of the disk (block device) * @table_type: type of the disk's partition table * @size: size of the disk * @sector_size: disk's sector size * @flags: bit combination of the disk's flags (#BDPartDiskFlag) */ BDPartDiskSpec* bd_part_disk_spec_copy (BDPartDiskSpec *data); void bd_part_disk_spec_free (BDPartDiskSpec *data); typedef enum { BD_PART_TECH_MBR = 0, BD_PART_TECH_GPT, } BDPartTech; typedef enum { BD_PART_TECH_MODE_CREATE_TABLE = 1 << 0, BD_PART_TECH_MODE_MODIFY_TABLE = 1 << 1, BD_PART_TECH_MODE_QUERY_TABLE = 1 << 2, BD_PART_TECH_MODE_MODIFY_PART = 1 << 3, BD_PART_TECH_MODE_QUERY_PART = 1 << 4, } BDPartTechMode; /** * bd_part_is_tech_avail: * @tech: the queried tech * @mode: a bit mask of queried modes of operation (#BDPartTechMode) for @tech * @error: (out): place to store error (details about why the @tech-@mode combination is not available) * * Returns: whether the @tech-@mode combination is available -- supported by the * plugin implementation and having all the runtime dependencies available */ gboolean bd_part_is_tech_avail (BDPartTech tech, guint64 mode, GError **error); /** * bd_part_create_table: * @disk: path of the disk block device to create partition table on * @type: type of the partition table to create * @ignore_existing: whether to ignore/overwrite the existing table or not * (reports an error if %FALSE and there's some table on @disk) * @error: (out): place to store error (if any) * * Returns: whether the partition table was successfully created or not * * Tech category: %BD_PART_TECH_MODE_CREATE_TABLE + the tech according to @type */ gboolean bd_part_create_table (const gchar *disk, BDPartTableType type, gboolean ignore_existing, GError **error); /** * bd_part_get_part_spec: * @disk: disk to remove the partition from * @part: partition to get spec for * @error: (out): place to store error (if any) * * Returns: (transfer full): spec of the @part partition from @disk or %NULL in case of error * * Tech category: %BD_PART_TECH_MODE_QUERY_PART + the tech according to the partition table type */ BDPartSpec* bd_part_get_part_spec (const gchar *disk, const gchar *part, GError **error); /** * bd_part_get_part_by_pos: * @disk: disk to remove the partition from * @position: position (in bytes) determining the partition * @error: (out): place to store error (if any) * * Returns: (transfer full): spec of the partition from @disk spanning over the @position or %NULL if no such * partition exists or in case of error (@error is set) * * Tech category: %BD_PART_TECH_MODE_QUERY_PART + the tech according to the partition table type */ BDPartSpec* bd_part_get_part_by_pos (const gchar *disk, guint64 position, GError **error); /** * bd_part_get_disk_spec: * @disk: disk to get information about * @error: (out): place to store error (if any) * * Returns: (transfer full): information about the given @disk or %NULL (in case of error) * * Tech category: %BD_PART_TECH_MODE_QUERY_TABLE + the tech according to the partition table type */ BDPartDiskSpec* bd_part_get_disk_spec (const gchar *disk, GError **error); /** * bd_part_get_disk_parts: * @disk: disk to get information about partitions for * @error: (out): place to store error (if any) * * Returns: (transfer full) (array zero-terminated=1): specs of the partitions from @disk or %NULL in case of error * * Tech category: %BD_PART_TECH_MODE_QUERY_TABLE + the tech according to the partition table type */ BDPartSpec** bd_part_get_disk_parts (const gchar *disk, GError **error); /** * bd_part_get_disk_free_regions: * @disk: disk to get free regions for * @error: (out): place to store error (if any) * * Returns: (transfer full) (array zero-terminated=1): specs of the free regions from @disk or %NULL in case of error * * Tech category: %BD_PART_TECH_MODE_QUERY_TABLE + the tech according to the partition table type */ BDPartSpec** bd_part_get_disk_free_regions (const gchar *disk, GError **error); /** * bd_part_get_best_free_region: * @disk: disk to get the best free region for * @type: type of the partition that is planned to be added * @size: size of the partition to be added * @error: (out): place to store error (if any) * * Returns: (transfer full): spec of the best free region on @disk for a new partition of type @type * with the size of @size or %NULL if there is none such region or if * there was an error (@error gets populated) * * Note: For the @type %BD_PART_TYPE_NORMAL, the smallest possible space that *is not* in an extended partition * is found. For the @type %BD_PART_TYPE_LOGICAL, the smallest possible space that *is* in an extended * partition is found. For %BD_PART_TYPE_EXTENDED, the biggest possible space is found as long as there * is no other extended partition (there can only be one). * * Tech category: %BD_PART_TECH_MODE_QUERY_TABLE + the tech according to the partition table type */ BDPartSpec* bd_part_get_best_free_region (const gchar *disk, BDPartType type, guint64 size, GError **error); /** * bd_part_create_part: * @disk: disk to create partition on * @type: type of the partition to create (if %BD_PART_TYPE_REQ_NEXT, the * partition type will be determined automatically based on the existing * partitions) * @start: where the partition should start (i.e. offset from the disk start) * @size: desired size of the partition (if 0, a max-sized partition is created) * @align: alignment to use for the partition * @error: (out): place to store error (if any) * * Returns: (transfer full): specification of the created partition or %NULL in case of error * * NOTE: The resulting partition may start at a different position than given by * @start and can have different size than @size due to alignment. * * Tech category: %BD_PART_TECH_MODE_MODIFY_TABLE + the tech according to the partition table type */ BDPartSpec* bd_part_create_part (const gchar *disk, BDPartTypeReq type, guint64 start, guint64 size, BDPartAlign align, GError **error); /** * bd_part_delete_part: * @disk: disk to remove the partition from * @part: partition to remove * @error: (out): place to store error (if any) * * Returns: whether the @part partition was successfully deleted from @disk * * Tech category: %BD_PART_TECH_MODE_MODIFY_TABLE + the tech according to the partition table type */ gboolean bd_part_delete_part (const gchar *disk, const gchar *part, GError **error); /** * bd_part_resize_part: * @disk: disk containing the paritition * @part: partition to resize * @size: new partition size, 0 for maximal size * @align: alignment to use for the partition end * @error: (out): place to store error (if any) * * Returns: whether the @part partition was successfully resized on @disk to @size * * NOTE: The resulting partition may be slightly bigger than requested due to alignment. * * Tech category: %BD_PART_TECH_MODE_MODIFY_TABLE + the tech according to the partition table type */ gboolean bd_part_resize_part (const gchar *disk, const gchar *part, guint64 size, BDPartAlign align, GError **error); /** * bd_part_set_part_flag: * @disk: disk the partition belongs to * @part: partition to set the flag on * @flag: flag to set * @state: state to set for the @flag (%TRUE = enabled) * @error: (out): place to store error (if any) * * Returns: whether the flag @flag was successfully set on the @part partition * or not. * * Tech category: %BD_PART_TECH_MODE_MODIFY_PART + the tech according to the partition table type */ gboolean bd_part_set_part_flag (const gchar *disk, const gchar *part, BDPartFlag flag, gboolean state, GError **error); /** * bd_part_set_disk_flag: * @disk: disk the partition belongs to * @flag: flag to set * @state: state to set for the @flag (%TRUE = enabled) * @error: (out): place to store error (if any) * * Returns: whether the flag @flag was successfully set on the @disk or not * * Tech category: %BD_PART_TECH_MODE_MODIFY_TABLE + the tech according to the partition table type */ gboolean bd_part_set_disk_flag (const gchar *disk, BDPartDiskFlag flag, gboolean state, GError **error); /** * bd_part_set_part_flags: * @disk: disk the partition belongs to * @part: partition to set the flag on * @flags: flags to set (mask combined from #BDPartFlag numbers) * @error: (out): place to store error (if any) * * Returns: whether the @flags were successfully set on the @part partition or * not * * Note: Unsets all the other flags on the partition. * Only GPT-specific flags and the legacy boot flag are supported on GPT * partition tables. * * Tech category: %BD_PART_TECH_MODE_MODIFY_PART + the tech according to the partition table type */ gboolean bd_part_set_part_flags (const gchar *disk, const gchar *part, guint64 flags, GError **error); /** * bd_part_set_part_name: * @disk: device the partition belongs to * @part: partition the should be set for * @name: name to set * @error: (out): place to store error (if any) * * Returns: whether the name was successfully set or not * * Tech category: %BD_PART_TECH_GPT-%BD_PART_TECH_MODE_MODIFY_PART */ gboolean bd_part_set_part_name (const gchar *disk, const gchar *part, const gchar *name, GError **error); /** * bd_part_set_part_type: * @disk: device the partition belongs to * @part: partition the should be set for * @type_guid: GUID of the type * @error: (out): place to store error (if any) * * Returns: whether the @type_guid type was successfully set for @part or not * * Tech category: %BD_PART_TECH_GPT-%BD_PART_TECH_MODE_MODIFY_PART */ gboolean bd_part_set_part_type (const gchar *disk, const gchar *part, const gchar *type_guid, GError **error); /** * bd_part_set_part_id: * @disk: device the partition belongs to * @part: partition the should be set for * @part_id: partition Id * @error: (out): place to store error (if any) * * Returns: whether the @part_id type was successfully set for @part or not * * Tech category: %BD_PART_TECH_MODE_MODIFY_PART + the tech according to the partition table type */ gboolean bd_part_set_part_id (const gchar *disk, const gchar *part, const gchar *part_id, GError **error); /** * bd_part_get_part_id: * @disk: device the partition belongs to * @part: partition the should be set for * @error: (out): place to store error (if any) * * Returns (transfer full): partition id type or %NULL in case of error * * Tech category: %BD_PART_TECH_MODE_QUERY_PART + the tech according to the partition table type */ gchar* bd_part_get_part_id (const gchar *disk, const gchar *part, GError **error); /** * bd_part_get_part_table_type_str: * @type: table type to get string representation for * @error: (out): place to store error (if any) * * Returns: (transfer none): string representation of @table_type * * Tech category: the tech according to @type */ const gchar* bd_part_get_part_table_type_str (BDPartTableType type, GError **error); /** * bd_part_get_flag_str: * @flag: flag to get string representation for * @error: (out): place to store error (if any) * * Returns: (transfer none): string representation of @flag * * Tech category: always available */ const gchar* bd_part_get_flag_str (BDPartFlag flag, GError **error); /** * bd_part_get_type_str: * @type: type to get string representation for * @error: (out): place to store error (if any) * * Returns: (transfer none): string representation of @type * * Tech category: always available */ const gchar* bd_part_get_type_str (BDPartType type, GError **error); #endif /* BD_KBD_API */