Changeset 3faa03d in mainline for uspace/lib/label/src/label.c
- Timestamp:
- 2015-07-02T16:30:16Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1626cd4
- Parents:
- 78d50bd
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/label/src/label.c
r78d50bd r3faa03d 40 40 #include <stdlib.h> 41 41 42 #include "gpt.h" 43 44 static label_ops_t *probe_list[] = { 45 &gpt_label_ops, 46 NULL 47 }; 48 42 49 int label_open(service_id_t sid, label_t **rlabel) 43 50 { 44 label_t *label; 51 label_ops_t **ops; 52 int rc; 45 53 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 } 49 61 50 list_initialize(&label->parts); 51 *rlabel = label; 52 return EOK; 62 return ENOTSUP; 53 63 } 54 64 55 65 int label_create(service_id_t sid, label_type_t ltype, label_t **rlabel) 56 66 { 57 label_ t *label;67 label_ops_t *ops = NULL; 58 68 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 } 62 77 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); 66 82 } 67 83 … … 71 87 return; 72 88 73 free(label);89 label->ops->close(label); 74 90 } 75 91 76 92 int label_destroy(label_t *label) 77 93 { 78 free(label); 79 return EOK; 94 return label->ops->destroy(label); 80 95 } 81 96 … … 83 98 { 84 99 memset(linfo, 0, sizeof(label_info_t)); 85 linfo->dcnt = dc_empty; 100 linfo->dcnt = dc_label; 101 linfo->ltype = label->ltype; 86 102 return EOK; 87 103 } … … 89 105 label_part_t *label_part_first(label_t *label) 90 106 { 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); 98 108 } 99 109 100 110 label_part_t *label_part_next(label_part_t *part) 101 111 { 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); 109 113 } 110 114 111 115 void label_part_get_info(label_part_t *part, label_part_info_t *pinfo) 112 116 { 113 pinfo->block0 = 0; 114 pinfo->nblocks = 0; 117 return part->label->ops->part_get_info(part, pinfo); 115 118 } 116 119 … … 118 121 label_part_t **rpart) 119 122 { 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); 130 124 } 131 125 132 126 int label_part_destroy(label_part_t *part) 133 127 { 134 list_remove(&part->llabel); 135 free(part); 136 return EOK; 128 return part->label->ops->part_destroy(part); 137 129 } 138 130
Note:
See TracChangeset
for help on using the changeset viewer.