/* * Copyright (c) 2015 Jiri Svoboda * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * - Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * - Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * - The name of the author may not be used to endorse or promote products * derived from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @addtogroup libfdisk * @{ */ /** * @file Disk management library types. */ #ifndef LIBFDISK_TYPES_H_ #define LIBFDISK_TYPES_H_ #include <adt/list.h> #include <capa.h> #include <loc.h> #include <stdint.h> #include <types/label.h> #include <types/vol.h> #include <vbd.h> typedef enum { /** Primary partition space */ spc_pri, /** Logical partition space */ spc_log } fdisk_spc_t; /** Fdisk device flags */ typedef enum { /** Currently we can create a label */ fdf_can_create_label = 0x1, /** Currently we can delete the label */ fdf_can_delete_label = 0x2, /** Currently we can erase unknown data from disk */ fdf_can_erase_dev = 0x4 } fdisk_dev_flags_t; #define CU_LIMIT (cu_ybyte + 1) /** List of devices available for managing by fdisk */ typedef struct { /** Fdisk instance */ struct fdisk *fdisk; /** List of device info structures */ list_t devinfos; /* of fdisk_dev_info_t */ } fdisk_dev_list_t; /** Device information */ typedef struct { /** Containing device list */ fdisk_dev_list_t *devlist; /** Link in fdisk_dev_list_t.devinfos */ link_t ldevlist; /** Service ID */ service_id_t svcid; /** Service name or NULL if not determined yet */ char *svcname; } fdisk_dev_info_t; /** Open fdisk device */ typedef struct { /** Fdisk instance */ struct fdisk *fdisk; /** Service ID */ service_id_t sid; /** All partitions */ list_t parts; /** Primary partitions sorted by index */ list_t pri_idx; /* of fdisk_part_t */ /** Primary partitions sorted by block address */ list_t pri_ba; /** Logical partitions sorted by block address */ list_t log_ba; /** Extended partition or NULL */ struct fdisk_part *ext_part; /** Disk info */ vbd_disk_info_t dinfo; /** Alignment in blocks */ uint64_t align; } fdisk_dev_t; typedef struct { /** Label type */ label_type_t ltype; /** Label flags */ label_flags_t flags; } fdisk_label_info_t; /** Partition */ typedef struct fdisk_part { /** Containing device */ fdisk_dev_t *dev; /** Link to fdisk_dev_t.parts */ link_t lparts; /** Link to fdisk_dev_t.pri_idx */ link_t lpri_idx; /** Link to fdisk_dev_t.pri_ba */ link_t lpri_ba; /** Link to fdisk_dev_t.log_ba */ link_t llog_ba; /** Capacity */ capa_spec_t capacity; /** Partition kind */ label_pkind_t pkind; /** Partition contents */ vol_part_cnt_t pcnt; /** File system type */ vol_fstype_t fstype; /** Partition ID */ vbd_part_id_t part_id; /** Partition index */ int index; /** First block */ aoff64_t block0; /** Number of blocks */ aoff64_t nblocks; /** Service ID */ service_id_t svc_id; /** Volume label */ char *label; } fdisk_part_t; /** Specification of new partition */ typedef struct { /** Desired capacity */ capa_spec_t capacity; /** Partition kind */ label_pkind_t pkind; /** File system type */ vol_fstype_t fstype; /** Volume label */ const char *label; /** Mount point */ const char *mountp; } fdisk_part_spec_t; /** Partition info */ typedef struct { /** Capacity */ capa_spec_t capacity; /** Partition kind */ label_pkind_t pkind; /** Partition contents */ vol_part_cnt_t pcnt; /** File system type */ vol_fstype_t fstype; /** Volume label */ char *label; /** Service ID */ service_id_t svc_id; } fdisk_part_info_t; /** Free range iterator */ typedef struct { /** Device */ fdisk_dev_t *dev; /** Primary or logical partition space */ fdisk_spc_t spc; /** First block of free range */ aoff64_t b0; /** Next partition following the free range or @c NULL if the range * is at the end. */ fdisk_part_t *npart; } fdisk_free_range_t; /** Fdisk instance */ typedef struct fdisk { /** Volume service */ vol_t *vol; /** Virtual Block Device */ vbd_t *vbd; } fdisk_t; #endif /** @} */