Changeset 271e24a in mainline for uspace/lib


Ignore:
Timestamp:
2013-03-24T00:12:25Z (13 years ago)
Author:
Dominik Taborsky (AT DOT) <brembyseznamcz>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
30440ed
Parents:
ec50ac4a
Message:

hdisk - testing libmbr

Location:
uspace/lib
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/gpt/Makefile

    rec50ac4a r271e24a  
    3232
    3333SOURCES = \
    34         libgpt.c
     34        libgpt.c \
     35        global.c
    3536
    3637include $(USPACE_PREFIX)/Makefile.common
  • uspace/lib/gpt/libgpt.c

    rec50ac4a r271e24a  
    5252
    5353static int load_and_check_header(service_id_t handle, aoff64_t addr, size_t b_size, gpt_header_t * header);
    54 static gpt_parts_t * alloc_part_array(uint32_t num);
    55 static int extend_part_array(gpt_parts_t * p);
    56 static int reduce_part_array(gpt_parts_t * p);
     54static gpt_partitions_t * alloc_part_array(uint32_t num);
     55static int extend_part_array(gpt_partitions_t * p);
     56static int reduce_part_array(gpt_partitions_t * p);
    5757static long long nearest_larger_int(double a);
    5858
     
    162162 *                              error code is stored in errno
    163163 */
    164 gpt_parts_t * gpt_read_partitions(gpt_t * gpt)
     164gpt_partitions_t * gpt_read_partitions(gpt_t * gpt)
    165165{
    166166        int rc;
    167167        unsigned int i;
    168         gpt_parts_t * res;
     168        gpt_partitions_t * res;
    169169        uint32_t num_ent = uint32_t_le2host(gpt->raw_data->num_entries);
    170170        uint32_t ent_size = uint32_t_le2host(gpt->raw_data->entry_size);
     
    242242 * @return                              returns EOK on succes, specific error code otherwise
    243243 */
    244 int gpt_write_partitions(gpt_parts_t * parts, gpt_t * gpt, service_id_t dev_handle)
     244int gpt_write_partitions(gpt_partitions_t * parts, gpt_t * gpt, service_id_t dev_handle)
    245245{
    246246        int rc;
     
    283283}
    284284
    285 gpt_parts_t * gpt_add_partition(gpt_parts_t * parts, g_part_t * partition)
    286 {
    287        
    288 }
    289 
    290 gpt_parts_t * gpt_remove_partition(gpt_parts_t * parts, int idx)
    291 {
    292        
     285gpt_partitions_t * gpt_add_partition(gpt_partitions_t * parts, gpt_part_t * partition)
     286{
     287       
     288        extend_part_array(parts);
     289        return parts;
     290}
     291
     292gpt_partitions_t * gpt_remove_partition(gpt_partitions_t * parts, size_t idx)
     293{
     294        reduce_part_array(parts);
     295        return parts;
    293296}
    294297
     
    304307 * @param parts         partition list to be freed
    305308 */
    306 void gpt_free_partitions(gpt_parts_t * parts)
     309void gpt_free_partitions(gpt_partitions_t * parts)
    307310{
    308311        free(parts->part_array);
     
    316319 *
    317320 */
    318 void gpt_set_part_type(g_part_t * p, int type)
     321void gpt_set_part_type(gpt_part_t * p, int type)
    319322{
    320323        /* Beware: first 3 blocks are byteswapped! */
     
    386389}
    387390
    388 static gpt_parts_t * alloc_part_array(uint32_t num)
    389 {
    390         gpt_parts_t * res = malloc(sizeof(gpt_parts_t));
     391static gpt_partitions_t * alloc_part_array(uint32_t num)
     392{
     393        gpt_partitions_t * res = malloc(sizeof(gpt_partitions_t));
    391394        if (res == NULL) {
    392395                errno = ENOMEM;
     
    408411}
    409412
    410 static int extend_part_array(gpt_parts_t * p)
     413static int extend_part_array(gpt_partitions_t * p)
    411414{
    412415        unsigned int nsize = p->arr_size * 2;
     
    425428}
    426429
    427 static int reduce_part_array(gpt_parts_t * p)
     430static int reduce_part_array(gpt_partitions_t * p)
    428431{
    429432        if(p->arr_size > GPT_MIN_PART_NUM) {
  • uspace/lib/gpt/libgpt.h

    rec50ac4a r271e24a  
    3636#define __GPT_H__
    3737
    38 #define NAME    "libgpt"
     38#define LIBGPT_NAME     "libgpt"
    3939
     40#include <loc.h>
    4041#include <sys/types.h>
    4142
     
    5051
    5152/** GPT header signature ("EFI PART" in ASCII) */
    52 const uint8_t efi_signature[8] = {
    53         0x45, 0x46, 0x49, 0x20, 0x50, 0x41, 0x52, 0x54
    54 };
     53extern const uint8_t efi_signature[8];
    5554
    5655/** GPT header
     
    102101        /** Raw data access */
    103102        gpt_entry_t raw_data;   //TODO: a pointer or just a member?
    104 }g_part_t;
     103}gpt_part_t;
    105104
    106105typedef struct gpt_parts {
     
    111110        /** Resizable partition array */
    112111        gpt_entry_t * part_array;
    113 } gpt_parts_t;
     112} gpt_partitions_t;
     113
     114
     115typedef struct gpt_table {
     116        gpt_t * gpt;
     117        gpt_partitions_t * parts;
     118} gpt_table_t;
    114119
    115120struct partition_type {
     
    118123};
    119124
    120 struct partition_type gpt_ptypes[] = {
    121         { "Unused entry",                                       "00000000-0000-0000-0000-000000000000" },
    122         { "MBR partition scheme",                       "024DEE41-33E7-11D3-9D69-0008C781F39F" },
    123         { "EFI System",                                         "C12A7328-F81F-11D2-BA4B-00A0C93EC93B" },
    124         { "BIOS Boot",                                          "21686148-6449-6E6F-744E-656564454649" },
    125         { "Windows Reserved",                           "E3C9E316-0B5C-4DB8-817D-F92DF00215AE" },
    126         { "Windows Basic data",                         "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7" },
    127         { "Windows LDM metadata",                       "5808C8AA-7E8F-42E0-85D2-E1E90434CFB3" },
    128         { "Windows LDM data",                           "AF9B60A0-1431-4F62-BC68-3311714A69AD" },
    129         { "Windows Recovery Environment",       "DE94BBA4-06D1-4D40-A16A-BFD50179D6AC" },
    130         { "Windows IBM GPFS",                           "37AFFC90-EF7D-4E96-91C3-2D7AE055B174" },
    131         { "Windows Cluster metadata",           "DB97DBA9-0840-4BAE-97F0-FFB9A327C7E1" },
    132         { "HP-UX Data",                                         "75894C1E-3AEB-11D3-B7C1-7B03A0000000" },
    133         { "HP-UX Service",                                      "E2A1E728-32E3-11D6-A682-7B03A0000000" },
    134         { "Linux filesystem data",                      "EBD0A0A2-B9E5-4433-87C0-68B6B72699C7" },
    135         { "Linux filesystem data",                      "0FC63DAF-8483-4772-8E79-3D69D8477DE4" },
    136         { "Linux RAID",                                         "A19D880F-05FC-4D3B-A006-743F0F84911E" },
    137         { "Linux Swap",                                         "0657FD6D-A4AB-43C4-84E5-0933C84B4F4F" },
    138         { "Linux LVM",                                          "E6D6D379-F507-44C2-A23C-238F2A3DF928" },
    139         { "Linux Reserved",                                     "8DA63339-0007-60C0-C436-083AC8230908" },
    140         { "FreeBSD Boot",                                       "83BD6B9D-7F41-11DC-BE0B-001560B84F0F" },
    141         { "FreeBSD Data",                                       "516E7CB4-6ECF-11D6-8FF8-00022D09712B" },
    142         { "FreeBSD Swap",                                       "516E7CB5-6ECF-11D6-8FF8-00022D09712B" },
    143         { "FreeBSD UFS",                                        "516E7CB6-6ECF-11D6-8FF8-00022D09712B" },
    144         { "FreeBSD Vinum VM",                           "516E7CB8-6ECF-11D6-8FF8-00022D09712B" },
    145         { "FreeBSD ZFS",                                        "516E7CBA-6ECF-11D6-8FF8-00022D09712B" },
    146         { "Mac OS X HFS+",                                      "48465300-0000-11AA-AA11-00306543ECAC" },
    147         { "Mac OS X UFS",                                       "55465300-0000-11AA-AA11-00306543ECAC" },
    148         { "Mac OS X ZFS",                                       "6A898CC3-1DD2-11B2-99A6-080020736631" },
    149         { "Mac OS X RAID",                                      "52414944-0000-11AA-AA11-00306543ECAC" },
    150         { "Mac OS X RAID, offline",                     "52414944-5F4F-11AA-AA11-00306543ECAC" },
    151         { "Mac OS X Boot",                                      "426F6F74-0000-11AA-AA11-00306543ECAC" },
    152         { "Mac OS X Label",                                     "4C616265-6C00-11AA-AA11-00306543ECAC" },
    153         { "Mac OS X TV Recovery",                       "5265636F-7665-11AA-AA11-00306543ECAC" },
    154         { "Mac OS X Core Storage",                      "53746F72-6167-11AA-AA11-00306543ECAC" },
    155         { "Solaris Boot",                                       "6A82CB45-1DD2-11B2-99A6-080020736631" },
    156         { "Solaris Root",                                       "6A85CF4D-1DD2-11B2-99A6-080020736631" },
    157         { "Solaris Swap",                                       "6A87C46F-1DD2-11B2-99A6-080020736631" },
    158         { "Solaris Backup",                                     "6A8B642B-1DD2-11B2-99A6-080020736631" },
    159         { "Solaris /usr",                                       "6A898CC3-1DD2-11B2-99A6-080020736631" },
    160         { "Solaris /var",                                       "6A8EF2E9-1DD2-11B2-99A6-080020736631" },
    161         { "Solaris /home",                                      "6A90BA39-1DD2-11B2-99A6-080020736631" },
    162         { "Solaris Alternate sector",           "6A9283A5-1DD2-11B2-99A6-080020736631" },
    163         { "Solaris Reserved",                           "6A945A3B-1DD2-11B2-99A6-080020736631" },
    164         { "Solaris Reserved",                           "6A9630D1-1DD2-11B2-99A6-080020736631" },
    165         { "Solaris Reserved",                           "6A980767-1DD2-11B2-99A6-080020736631" },
    166         { "Solaris Reserved",                           "6A96237F-1DD2-11B2-99A6-080020736631" },
    167         { "Solaris Reserved",                           "6A8D2AC7-1DD2-11B2-99A6-080020736631" },
    168         { "NetBSD Swap",                                        "49F48D32-B10E-11DC-B99B-0019D1879648" },
    169         { "NetBSD FFS",                                         "49F48D5A-B10E-11DC-B99B-0019D1879648" },
    170         { "NetBSD LFS",                                         "49F48D82-B10E-11DC-B99B-0019D1879648" },
    171         { "NetBSD RAID",                                        "49F48DAA-B10E-11DC-B99B-0019D1879648" },
    172         { "NetBSD Concatenated",                        "2DB519C4-B10F-11DC-B99B-0019D1879648" },
    173         { "NetBSD Encrypted",                           "2DB519EC-B10F-11DC-B99B-0019D1879648" },
    174         { "ChromeOS ChromeOS kernel",           "FE3A2A5D-4F32-41A7-B725-ACCC3285A309" },
    175         { "ChromeOS rootfs",                            "3CB8E202-3B7E-47DD-8A3C-7FF2A13CFCEC" },
    176         { "ChromeOS future use",                        "2E0A753D-9E48-43B0-8337-B15192CB1B5E" },
    177         { "MidnightBSD Boot",                           "85D5E45E-237C-11E1-B4B3-E89A8F7FC3A7" },
    178         { "MidnightBSD Data",                           "85D5E45A-237C-11E1-B4B3-E89A8F7FC3A7" },
    179         { "MidnightBSD Swap",                           "85D5E45B-237C-11E1-B4B3-E89A8F7FC3A7" },
    180         { "MidnightBSD UFS",                            "0394Ef8B-237E-11E1-B4B3-E89A8F7FC3A7" },
    181         { "MidnightBSD Vinum VM",                       "85D5E45C-237C-11E1-B4B3-E89A8F7FC3A7" },
    182         { "MidnightBSD ZFS",                            "85D5E45D-237C-11E1-B4B3-E89A8F7FC3A7" }
    183 };
     125extern const struct partition_type gpt_ptypes[];
     126
    184127
    185128
     
    187130extern int gpt_write_gpt_header(gpt_t * header, service_id_t dev_handle);
    188131
    189 extern gpt_parts_t * gpt_read_partitions(gpt_t * gpt);
    190 extern int                       gpt_write_partitions(gpt_parts_t * parts, gpt_t * header, service_id_t dev_handle);
    191 extern int                       gpt_add_partition(gpt_parts_t * parts, g_part_t * partition);
    192 extern void                      gpt_remove_partition(gpt_parts_t * parts, int idx);
    193 extern void              gpt_set_part_type(g_part_t * p, int type);
    194 extern void              gpt_set_part_name(gpt_entry_t * p, char * name[], size_t length);
     132extern gpt_partitions_t * gpt_read_partitions(gpt_t * gpt);
     133extern int                                gpt_write_partitions(gpt_partitions_t * parts, gpt_t * header, service_id_t dev_handle);
     134extern gpt_partitions_t * gpt_add_partition(gpt_partitions_t * parts, gpt_part_t * partition);
     135extern gpt_partitions_t * gpt_remove_partition(gpt_partitions_t * parts, size_t idx);
     136extern void                       gpt_set_part_type(gpt_part_t * p, int type);
     137extern void                       gpt_set_part_name(gpt_entry_t * p, char * name[], size_t length);
    195138
    196139extern void gpt_free_gpt(gpt_t * gpt);
    197 extern void gpt_free_partitions(gpt_parts_t * parts);
     140extern void gpt_free_partitions(gpt_partitions_t * parts);
    198141
    199142#endif
     143
  • uspace/lib/mbr/libmbr.c

    rec50ac4a r271e24a  
    1212 *   notice, this list of conditions and the following disclaimer in the
    1313 *   documentation and/or other materials provided with the distribution.
    14  * - The name of the author may not be used to endorse or promote products
     14 * - The LIBMBR_NAME of the author may not be used to endorse or promote products
    1515 *   derived from this software without specific prior written permission.
    1616 *
     
    4545
    4646static br_block_t * alloc_br(void);
    47 static int decode_part(pt_entry_t * src, part_t * trgt, uint32_t base);
    48 static int decode_logical(mbr_t * mbr, mbr_parts_t * p, part_t * ext);
    49 static void encode_part(part_t * src, pt_entry_t * trgt, uint32_t base);
     47static int decode_part(pt_entry_t * src, mbr_part_t * trgt, uint32_t base);
     48static int decode_logical(mbr_t * mbr, mbr_partitions_t * p, mbr_part_t * ext);
     49static void encode_part(mbr_part_t * src, pt_entry_t * trgt, uint32_t base);
    5050
    5151/** Read MBR from specific device
     
    123123 * @return              linked list of partitions or NULL on error
    124124 */
    125 mbr_parts_t * mbr_read_partitions(mbr_t * mbr)
     125mbr_partitions_t * mbr_read_partitions(mbr_t * mbr)
    126126{
    127127        int rc, i;
    128         part_t * p;
    129         part_t * ext = NULL;
    130         mbr_parts_t * parts;
     128        mbr_part_t * p;
     129        mbr_part_t * ext = NULL;
     130        mbr_partitions_t * parts;
    131131
    132132        if (mbr == NULL)
     
    143143                        continue;
    144144               
    145                 p = malloc(sizeof(part_t));
     145                p = malloc(sizeof(mbr_part_t));
    146146                if (p == NULL) {
    147                         printf(NAME ": Error on memory allocation.\n");
     147                        printf(LIBMBR_NAME ": Error on memory allocation.\n");
    148148                        free(p);
    149149                        mbr_free_partitions(parts);
     
    159159        rc = decode_logical(mbr, parts, ext);
    160160        if (rc != EOK) {
    161                 printf(NAME ": Error occured during decoding the MBR.\n" \
    162                            NAME ": Partition list may be incomplete.\n");
     161                printf(LIBMBR_NAME ": Error occured during decoding the MBR.\n" \
     162                           LIBMBR_NAME ": Partition list may be incomplete.\n");
    163163        }
    164164
     
    173173 * @return                              returns EOK on succes, specific error code otherwise
    174174 */
    175 int mbr_write_partitions(mbr_parts_t * parts, mbr_t * mbr, service_id_t dev_handle)
     175int mbr_write_partitions(mbr_partitions_t * parts, mbr_t * mbr, service_id_t dev_handle)
    176176{
    177177        bool logical = false;
    178178        int i = 0;
    179179        int rc;
    180         part_t * p;
    181         part_t * ext = (parts->l_extended == NULL) ? NULL
    182                                         : list_get_instance(parts->l_extended, part_t, link);
     180        mbr_part_t * p;
     181        mbr_part_t * ext = (parts->l_extended == NULL) ? NULL
     182                                        : list_get_instance(parts->l_extended, mbr_part_t, link);
    183183       
    184184        br_block_t * last_ebr = NULL;
     
    194194
    195195        aoff64_t addr = ext->start_addr;
    196         part_t * prev_part = NULL;
     196        mbr_part_t * prev_part = NULL;
    197197
    198198        list_foreach(parts->list, it) {
    199                 p = list_get_instance(it, part_t, link);
     199                p = list_get_instance(it, mbr_part_t, link);
    200200                if (mbr_get_flag(p, ST_LOGIC)) {
    201201                        // writing logical partition
     
    269269
    270270        list_foreach(parts->list, it) {
    271                 p = list_get_instance(it, part_t, link);
     271                p = list_get_instance(it, mbr_part_t, link);
    272272                if (mbr_get_flag(p, ST_LOGIC)) {
    273273                        // extended does not exist, fail
     
    295295                        ext = p;
    296296
    297                 //p = list_get_instance(p->link.next, mbr_parts_t, link);
     297                //p = list_get_instance(p->link.next, mbr_partitions_t, link);
    298298                p = p->next;
    299299        }
     
    357357}
    358358
    359 /** part_t constructor */
    360 part_t * mbr_alloc_partition(void)
    361 {
    362         part_t * p = malloc(sizeof(part_t));
     359/** mbr_part_t constructor */
     360mbr_part_t * mbr_alloc_partition(void)
     361{
     362        mbr_part_t * p = malloc(sizeof(mbr_part_t));
    363363        if (p == NULL) {
    364364                return NULL;
     
    374374}
    375375
    376 mbr_parts_t * mbr_alloc_partitions(void)
    377 {
    378         mbr_parts_t * parts = malloc(sizeof(mbr_parts_t));
     376mbr_partitions_t * mbr_alloc_partitions(void)
     377{
     378        mbr_partitions_t * parts = malloc(sizeof(mbr_partitions_t));
    379379        if (parts == NULL) {
    380380                return NULL;
     
    387387
    388388/** Add partition */
    389 void mbr_add_partition(mbr_parts_t * parts, part_t * partition)
     389int mbr_add_partition(mbr_partitions_t * parts, mbr_part_t * partition)
    390390{
    391391        list_append(&(partition->link), &(parts->list));
     392        return EOK;
    392393}
    393394
    394395/** Remove partition */
    395 void mbr_remove_partition(mbr_parts_t * parts, int idx)
     396int mbr_remove_partition(mbr_partitions_t * parts, size_t idx)
    396397{
    397398        link_t * l = list_nth(&(parts->list), idx);
    398399        list_remove(l);
    399         part_t * p = list_get_instance(l, part_t, link);
     400        mbr_part_t * p = list_get_instance(l, mbr_part_t, link);
    400401        mbr_free_partition(p);
    401 }
    402 
    403 /** part_t destructor */
    404 void mbr_free_partition(part_t * p)
     402       
     403        return EOK;
     404}
     405
     406/** mbr_part_t destructor */
     407void mbr_free_partition(mbr_part_t * p)
    405408{
    406409        if (p->ebr != NULL)
     
    410413
    411414/** Get flag bool value */
    412 int mbr_get_flag(part_t * p, MBR_FLAGS flag)
     415int mbr_get_flag(mbr_part_t * p, MBR_FLAGS flag)
    413416{
    414417        return (p->status & (1 << flag)) ? 1 : 0;
     
    416419
    417420/** Set a specifig status flag to a value */
    418 void mbr_set_flag(part_t * p, MBR_FLAGS flag, bool value)
     421void mbr_set_flag(mbr_part_t * p, MBR_FLAGS flag, bool value)
    419422{
    420423        uint8_t status = p->status;
     
    438441 * @param parts         partition list to be freed
    439442 */
    440 void mbr_free_partitions(mbr_parts_t * parts)
     443void mbr_free_partitions(mbr_partitions_t * parts)
    441444{
    442445        list_foreach_safe(parts->list, cur_link, next) {
    443                 part_t * p = list_get_instance(cur_link, part_t, link);
     446                mbr_part_t * p = list_get_instance(cur_link, mbr_part_t, link);
    444447                list_remove(cur_link);
    445448                mbr_free_partition(p);
     
    462465}
    463466
    464 /** Parse partition entry to part_t */
    465 static int decode_part(pt_entry_t * src, part_t * trgt, uint32_t base)
     467/** Parse partition entry to mbr_part_t */
     468static int decode_part(pt_entry_t * src, mbr_part_t * trgt, uint32_t base)
    466469{
    467470        trgt->type = src->ptype;
     
    477480}
    478481
    479 /** Parse MBR contents to part_t list
     482/** Parse MBR contents to mbr_part_t list
    480483 * parameter 'p' is allocated for only used primary partitions
    481484 */
    482 static int decode_logical(mbr_t * mbr, mbr_parts_t * parts, part_t * ext)
     485static int decode_logical(mbr_t * mbr, mbr_partitions_t * parts, mbr_part_t * ext)
    483486{
    484487        int rc;
    485         part_t * p;
     488        mbr_part_t * p;
    486489
    487490        if (mbr == NULL || parts == NULL)
     
    534537}
    535538
    536 /** Convert part_t to pt_entry_t */
    537 static void encode_part(part_t * src, pt_entry_t * trgt, uint32_t base)
     539/** Convert mbr_part_t to pt_entry_t */
     540static void encode_part(mbr_part_t * src, pt_entry_t * trgt, uint32_t base)
    538541{
    539542        if (src != NULL) {
  • uspace/lib/mbr/libmbr.h

    rec50ac4a r271e24a  
    3636#define LIBMBR_LIBMBR_H_
    3737
    38 #define NAME    "libmbr"
     38#include <sys/types.h>
     39
     40#define LIBMBR_NAME     "libmbr"
    3941
    4042/** Number of primary partition records */
     
    108110
    109111
    110 //FIXME: make mbr_parts_t as the linked list for keeping the same interface as with GPT
     112//FIXME: make mbr_partitions_t as the linked list for keeping the same interface as with GPT
    111113/** Partition */
    112 typedef struct part {
     114typedef struct mbr_part {
    113115        /** The link in the doubly-linked list */
    114116        link_t link;
     
    118120        uint8_t status;
    119121        /** Address of first block */
    120         aoff64_t start_addr;
     122        uint32_t start_addr;
    121123        /** Number of blocks */
    122         aoff64_t length;
     124        uint32_t length;
    123125        /** Points to Extended Boot Record of logical partition */
    124126        br_block_t * ebr;
    125 } part_t;
     127} mbr_part_t;
    126128
    127129typedef struct mbr_parts {
     
    134136        /** Partition linked list */
    135137        list_t list;
    136 } mbr_parts_t;
     138} mbr_partitions_t;
    137139
     140typedef struct mbr_table {
     141        mbr_t * mbr;
     142        mbr_partitions_t * parts;
     143} mbr_table_t;
    138144
    139145/** Read/Write MBR header.
     
    146152
    147153/** Read/Write/Set MBR partitions. */
    148 extern mbr_parts_t * mbr_read_partitions(mbr_t * mbr);
    149 extern int                       mbr_write_partitions(mbr_parts_t * parts, mbr_t * mbr, service_id_t dev_handle);
    150 extern part_t *          mbr_alloc_partition(void);
    151 extern mbr_parts_t * mbr_alloc_partitions(void);
    152 extern void                      mbr_add_partition(mbr_parts_t * parts, part_t * partition);
    153 extern void                      mbr_remove_partition(mbr_parts_t * parts, int idx);
    154 extern int                       mbr_get_flag(part_t * p, MBR_FLAGS flag);
    155 extern void                      mbr_set_flag(part_t * p, MBR_FLAGS flag, bool value);
     154extern mbr_partitions_t * mbr_read_partitions(mbr_t * mbr);
     155extern int                      mbr_write_partitions(mbr_partitions_t * parts, mbr_t * mbr, service_id_t dev_handle);
     156extern mbr_part_t *     mbr_alloc_partition(void);
     157extern mbr_partitions_t * mbr_alloc_partitions(void);
     158extern int                      mbr_add_partition(mbr_partitions_t * parts, mbr_part_t * partition);
     159extern int                      mbr_remove_partition(mbr_partitions_t * parts, size_t idx);
     160extern int                      mbr_get_flag(mbr_part_t * p, MBR_FLAGS flag);
     161extern void                     mbr_set_flag(mbr_part_t * p, MBR_FLAGS flag, bool value);
    156162
    157163#define mbr_part_foreach(parts, iterator)       \
    158                         list_foreach(parts->list, iterator)
     164                        for (mbr_part_t * iterator = list_get_instance((parts)->list.head.next, mbr_part_t, link); \
     165                                iterator != list_get_instance(&(parts)->list.head, mbr_part_t, link); \
     166                                iterator = list_get_instance(iterator->link.next, mbr_part_t, link))
     167
    159168
    160169/** free() wrapper functions. */
    161170extern void mbr_free_mbr(mbr_t * mbr);
    162 extern void mbr_free_partition(part_t * p);
    163 extern void mbr_free_partitions(mbr_parts_t * parts);
     171extern void mbr_free_partition(mbr_part_t * p);
     172extern void mbr_free_partitions(mbr_partitions_t * parts);
    164173
    165174#endif
Note: See TracChangeset for help on using the changeset viewer.