source: mainline/uspace/lib/fdisk/src/fdisk.c@ e96047c

lfn serial ticket/834-toolchain-update topic/msim-upgrade topic/simplify-dev-export
Last change on this file since e96047c was e96047c, checked in by Jiri Svoboda <jiri@…>, 11 years ago

Fdisk first prototype.

  • Property mode set to 100644
File size: 5.9 KB
Line 
1/*
2 * Copyright (c) 2015 Jiri Svoboda
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * - Redistributions of source code must retain the above copyright
10 * notice, this list of conditions and the following disclaimer.
11 * - Redistributions in binary form must reproduce the above copyright
12 * notice, this list of conditions and the following disclaimer in the
13 * documentation and/or other materials provided with the distribution.
14 * - The name of the author may not be used to endorse or promote products
15 * derived from this software without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */
28
29/** @addtogroup libfdisk
30 * @{
31 */
32/**
33 * @file Disk management library.
34 */
35
36#include <adt/list.h>
37#include <block.h>
38#include <errno.h>
39#include <fdisk.h>
40#include <loc.h>
41#include <stdio.h>
42#include <stdlib.h>
43#include <str.h>
44
45static void fdisk_dev_info_delete(fdisk_dev_info_t *info)
46{
47 if (info == NULL)
48 return;
49
50 if (info->blk_inited)
51 block_fini(info->svcid);
52
53 free(info->svcname);
54 free(info);
55}
56
57int fdisk_dev_list_get(fdisk_dev_list_t **rdevlist)
58{
59 fdisk_dev_list_t *devlist = NULL;
60 fdisk_dev_info_t *info;
61 category_id_t disk_cat;
62 service_id_t *svcs = NULL;
63 size_t count, i;
64 int rc;
65
66 devlist = calloc(1, sizeof(fdisk_dev_list_t));
67 if (devlist == NULL)
68 return ENOMEM;
69
70 list_initialize(&devlist->devinfos);
71
72 rc = loc_category_get_id("disk", &disk_cat, 0);
73 if (rc != EOK) {
74 rc = EIO;
75 goto error;
76 }
77
78 rc = loc_category_get_svcs(disk_cat, &svcs, &count);
79 if (rc != EOK) {
80 rc = EIO;
81 goto error;
82 }
83
84 for (i = 0; i < count; i++) {
85 info = calloc(1, sizeof(fdisk_dev_info_t));
86 if (info == NULL) {
87 rc = ENOMEM;
88 goto error;
89 }
90
91 info->svcid = svcs[i];
92 info->devlist = devlist;
93 list_append(&info->ldevlist, &devlist->devinfos);
94 }
95
96 *rdevlist = devlist;
97 free(svcs);
98 return EOK;
99error:
100 free(svcs);
101 fdisk_dev_list_free(devlist);
102 return rc;
103}
104
105void fdisk_dev_list_free(fdisk_dev_list_t *devlist)
106{
107 fdisk_dev_info_t *info;
108
109 if (devlist == NULL)
110 return;
111
112 while (!list_empty(&devlist->devinfos)) {
113 info = list_get_instance(list_first(
114 &devlist->devinfos), fdisk_dev_info_t,
115 ldevlist);
116
117 list_remove(&info->ldevlist);
118 fdisk_dev_info_delete(info);
119 }
120
121 free(devlist);
122}
123
124fdisk_dev_info_t *fdisk_dev_first(fdisk_dev_list_t *devlist)
125{
126 if (list_empty(&devlist->devinfos))
127 return NULL;
128
129 return list_get_instance(list_first(&devlist->devinfos),
130 fdisk_dev_info_t, ldevlist);
131}
132
133fdisk_dev_info_t *fdisk_dev_next(fdisk_dev_info_t *devinfo)
134{
135 link_t *lnext;
136
137 lnext = list_next(&devinfo->ldevlist,
138 &devinfo->devlist->devinfos);
139 if (lnext == NULL)
140 return NULL;
141
142 return list_get_instance(lnext, fdisk_dev_info_t,
143 ldevlist);
144}
145
146void fdisk_dev_get_svcid(fdisk_dev_info_t *info, service_id_t *rsid)
147{
148 *rsid = info->svcid;
149}
150
151int fdisk_dev_get_svcname(fdisk_dev_info_t *info, char **rname)
152{
153 char *name;
154 int rc;
155
156 if (info->svcname == NULL) {
157 rc = loc_service_get_name(info->svcid,
158 &info->svcname);
159 if (rc != EOK)
160 return rc;
161 }
162
163 name = str_dup(info->svcname);
164 if (name == NULL)
165 return ENOMEM;
166
167 *rname = name;
168 return EOK;
169}
170
171int fdisk_dev_capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap)
172{
173 size_t bsize;
174 aoff64_t nblocks;
175 int rc;
176
177 if (!info->blk_inited) {
178 rc = block_init(EXCHANGE_SERIALIZE, info->svcid, 2048);
179 if (rc != EOK)
180 return rc;
181 }
182
183 rc = block_get_bsize(info->svcid, &bsize);
184 if (rc != EOK)
185 return EIO;
186
187 rc = block_get_nblocks(info->svcid, &nblocks);
188 if (rc != EOK)
189 return EIO;
190
191 cap->value = bsize * nblocks;
192 cap->cunit = cu_byte;
193
194 return EOK;
195}
196
197int fdisk_dev_open(service_id_t sid, fdisk_dev_t **rdev)
198{
199 fdisk_dev_t *dev;
200
201 dev = calloc(1, sizeof(fdisk_dev_t));
202 if (dev == NULL)
203 return ENOMEM;
204
205 dev->ltype = fdl_none;
206 *rdev = dev;
207 return EOK;
208}
209
210void fdisk_dev_close(fdisk_dev_t *dev)
211{
212 free(dev);
213}
214
215int fdisk_label_get_info(fdisk_dev_t *dev, fdisk_label_info_t *info)
216{
217 info->ltype = dev->ltype;
218 return EOK;
219}
220
221int fdisk_label_create(fdisk_dev_t *dev, fdisk_label_type_t ltype)
222{
223 if (dev->ltype != fdl_none)
224 return EEXISTS;
225
226 dev->ltype = ltype;
227 return EOK;
228}
229
230int fdisk_label_destroy(fdisk_dev_t *dev)
231{
232 if (dev->ltype == fdl_none)
233 return ENOENT;
234
235 dev->ltype = fdl_none;
236 return EOK;
237}
238
239fdisk_part_t *fdisk_part_first(fdisk_dev_t *dev)
240{
241 return NULL;
242}
243
244fdisk_part_t *fdisk_part_next(fdisk_part_t *part)
245{
246 return NULL;
247}
248
249int fdisk_part_get_max_avail(fdisk_dev_t *dev, fdisk_cap_t *cap)
250{
251 return EOK;
252}
253
254int fdisk_part_create(fdisk_dev_t *dev, fdisk_partspec_t *pspec,
255 fdisk_part_t **rpart)
256{
257 return EOK;
258}
259
260int fdisk_part_destroy(fdisk_part_t *part)
261{
262 return EOK;
263}
264
265int fdisk_cap_format(fdisk_cap_t *cap, char **rstr)
266{
267 int rc;
268
269 rc = asprintf(rstr, "%" PRIu64 " B", cap->value);
270 if (rc < 0)
271 return ENOMEM;
272
273 return EOK;
274}
275
276int fdisk_ltype_format(fdisk_label_type_t ltype, char **rstr)
277{
278 const char *sltype;
279 char *s;
280
281 sltype = NULL;
282 switch (ltype) {
283 case fdl_none:
284 sltype = "None";
285 break;
286 case fdl_unknown:
287 sltype = "Unknown";
288 break;
289 case fdl_mbr:
290 sltype = "MBR";
291 break;
292 case fdl_gpt:
293 sltype = "GPT";
294 break;
295 }
296
297 s = str_dup(sltype);
298 if (s == NULL)
299 return ENOMEM;
300
301 *rstr = s;
302 return EOK;
303}
304
305/** @}
306 */
Note: See TracBrowser for help on using the repository browser.