Changeset 3faa03d in mainline for uspace/lib/label/src/label.c


Ignore:
Timestamp:
2015-07-02T16:30:16Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1626cd4
Parents:
78d50bd
Message:

Liblabel reading GPT and MBR partitions (primary only).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/lib/label/src/label.c

    r78d50bd r3faa03d  
    4040#include <stdlib.h>
    4141
     42#include "gpt.h"
     43
     44static label_ops_t *probe_list[] = {
     45        &gpt_label_ops,
     46        NULL
     47};
     48
    4249int label_open(service_id_t sid, label_t **rlabel)
    4350{
    44         label_t *label;
     51        label_ops_t **ops;
     52        int rc;
    4553
    46         label = calloc(1, sizeof(label_t));
    47         if (label == NULL)
    48                 return ENOMEM;
     54        ops = &probe_list[0];
     55        while (ops[0] != NULL) {
     56                rc = ops[0]->open(sid, rlabel);
     57                if (rc == EOK)
     58                        return EOK;
     59                ++ops;
     60        }
    4961
    50         list_initialize(&label->parts);
    51         *rlabel = label;
    52         return EOK;
     62        return ENOTSUP;
    5363}
    5464
    5565int label_create(service_id_t sid, label_type_t ltype, label_t **rlabel)
    5666{
    57         label_t *label;
     67        label_ops_t *ops = NULL;
    5868
    59         label = calloc(1, sizeof(label_t));
    60         if (label == NULL)
    61                 return ENOMEM;
     69        switch (ltype) {
     70        case lt_gpt:
     71                ops = &gpt_label_ops;
     72                break;
     73        case lt_mbr:
     74                ops = NULL;
     75                break;
     76        }
    6277
    63         list_initialize(&label->parts);
    64         *rlabel = label;
    65         return EOK;
     78        if (ops == NULL)
     79                return ENOTSUP;
     80
     81        return ops->create(sid, rlabel);
    6682}
    6783
     
    7187                return;
    7288
    73         free(label);
     89        label->ops->close(label);
    7490}
    7591
    7692int label_destroy(label_t *label)
    7793{
    78         free(label);
    79         return EOK;
     94        return label->ops->destroy(label);
    8095}
    8196
     
    8398{
    8499        memset(linfo, 0, sizeof(label_info_t));
    85         linfo->dcnt = dc_empty;
     100        linfo->dcnt = dc_label;
     101        linfo->ltype = label->ltype;
    86102        return EOK;
    87103}
     
    89105label_part_t *label_part_first(label_t *label)
    90106{
    91         link_t *link;
    92 
    93         link = list_first(&label->parts);
    94         if (link == NULL)
    95                 return NULL;
    96 
    97         return list_get_instance(link, label_part_t, llabel);
     107        return label->ops->part_first(label);
    98108}
    99109
    100110label_part_t *label_part_next(label_part_t *part)
    101111{
    102         link_t *link;
    103 
    104         link = list_next(&part->llabel, &part->label->parts);
    105         if (link == NULL)
    106                 return NULL;
    107 
    108         return list_get_instance(link, label_part_t, llabel);
     112        return part->label->ops->part_next(part);
    109113}
    110114
    111115void label_part_get_info(label_part_t *part, label_part_info_t *pinfo)
    112116{
    113         pinfo->block0 = 0;
    114         pinfo->nblocks = 0;
     117        return part->label->ops->part_get_info(part, pinfo);
    115118}
    116119
     
    118121    label_part_t **rpart)
    119122{
    120         label_part_t *part;
    121 
    122         part = calloc(1, sizeof(label_part_t));
    123         if (part == NULL)
    124                 return ENOMEM;
    125 
    126         part->label = label;
    127         list_append(&part->llabel, &label->parts);
    128         *rpart = part;
    129         return EOK;
     123        return label->ops->part_create(label, pspec, rpart);
    130124}
    131125
    132126int label_part_destroy(label_part_t *part)
    133127{
    134         list_remove(&part->llabel);
    135         free(part);
    136         return EOK;
     128        return part->label->ops->part_destroy(part);
    137129}
    138130
Note: See TracChangeset for help on using the changeset viewer.