Changeset 8227d63 in mainline for uspace/lib/fdisk
- Timestamp:
- 2015-06-22T21:20:23Z (10 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1356f85a
- Parents:
- e96047c
- Location:
- uspace/lib/fdisk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
uspace/lib/fdisk/include/fdisk.h
re96047c r8227d63 44 44 extern fdisk_dev_info_t *fdisk_dev_first(fdisk_dev_list_t *); 45 45 extern fdisk_dev_info_t *fdisk_dev_next(fdisk_dev_info_t *); 46 extern int fdisk_dev_ get_svcname(fdisk_dev_info_t *, char **);47 extern void fdisk_dev_ get_svcid(fdisk_dev_info_t *, service_id_t *);48 extern int fdisk_dev_ capacity(fdisk_dev_info_t *, fdisk_cap_t *);46 extern int fdisk_dev_info_get_svcname(fdisk_dev_info_t *, char **); 47 extern void fdisk_dev_info_get_svcid(fdisk_dev_info_t *, service_id_t *); 48 extern int fdisk_dev_info_capacity(fdisk_dev_info_t *, fdisk_cap_t *); 49 49 50 50 extern int fdisk_dev_open(service_id_t, fdisk_dev_t **); 51 51 extern void fdisk_dev_close(fdisk_dev_t *); 52 extern int fdisk_dev_get_svcname(fdisk_dev_t *, char **); 53 extern int fdisk_dev_capacity(fdisk_dev_t *, fdisk_cap_t *); 52 54 53 55 extern int fdisk_label_get_info(fdisk_dev_t *, fdisk_label_info_t *); … … 57 59 extern fdisk_part_t *fdisk_part_first(fdisk_dev_t *); 58 60 extern fdisk_part_t *fdisk_part_next(fdisk_part_t *); 61 extern int fdisk_part_get_info(fdisk_part_t *, fdisk_part_info_t *); 59 62 extern int fdisk_part_get_max_avail(fdisk_dev_t *, fdisk_cap_t *); 60 extern int fdisk_part_create(fdisk_dev_t *, fdisk_part spec_t *,63 extern int fdisk_part_create(fdisk_dev_t *, fdisk_part_spec_t *, 61 64 fdisk_part_t **); 62 65 extern int fdisk_part_destroy(fdisk_part_t *); 66 extern void fdisk_pspec_init(fdisk_part_spec_t *); 63 67 64 68 extern int fdisk_cap_format(fdisk_cap_t *, char **); 69 extern int fdisk_cap_parse(const char *, fdisk_cap_t *); 65 70 extern int fdisk_ltype_format(fdisk_label_type_t, char **); 71 extern int fdisk_fstype_format(fdisk_fstype_t, char **); 66 72 67 73 #endif -
uspace/lib/fdisk/include/types/fdisk.h
re96047c r8227d63 41 41 #include <stdint.h> 42 42 43 typedef enum { 44 cu_byte = 0, 45 cu_kbyte, 46 cu_mbyte, 47 cu_gbyte, 48 cu_tbyte, 49 cu_pbyte, 50 cu_ebyte, 51 cu_zbyte, 52 cu_ybyte 53 } fdisk_cunit_t; 54 55 #define CU_LIMIT (cu_ybyte + 1) 56 57 /** File system type */ 58 typedef enum { 59 fdfs_none = 0, 60 fdfs_unknown, 61 fdfs_exfat, 62 fdfs_fat, 63 fdfs_minix, 64 fdfs_ext4 65 } fdisk_fstype_t; 66 67 /** Highest fstype value + 1 */ 68 #define FDFS_LIMIT (fdfs_ext4 + 1) 69 /** Lowest fstype allowed for creation */ 70 #define FDFS_CREATE_LO fdfs_exfat 71 /** Highest fstype allowed for creation + 1 */ 72 #define FDFS_CREATE_HI (fdfs_ext4 + 1) 73 74 /** Partition capacity */ 75 typedef struct { 76 uint64_t value; 77 fdisk_cunit_t cunit; 78 } fdisk_cap_t; 79 43 80 /** List of devices available for managing by fdisk */ 44 81 typedef struct { … … 70 107 } fdisk_label_type_t; 71 108 109 /** Highest label type + 1 */ 110 #define FDL_LIMIT (fdl_gpt + 1) 111 /** Lowest label type allowed for creation */ 112 #define FDL_CREATE_LO fdl_mbr 113 /** Highest label type allowed for creation + 1 */ 114 #define FDL_CREATE_HI (fdl_gpt + 1) 115 72 116 /** Open fdisk device */ 73 117 typedef struct { 118 /** Label type */ 74 119 fdisk_label_type_t ltype; 120 /** Partitions */ 121 list_t parts; /* of fdisk_part_t */ 122 /** Service ID */ 123 service_id_t sid; 75 124 } fdisk_dev_t; 76 125 … … 82 131 /** Partition */ 83 132 typedef struct { 133 /** Containing device */ 134 fdisk_dev_t *dev; 135 /** Link to fdisk_dev_t.parts */ 136 link_t ldev; 137 /** Capacity */ 138 fdisk_cap_t capacity; 139 /** File system type */ 140 fdisk_fstype_t fstype; 84 141 } fdisk_part_t; 85 86 typedef enum {87 cu_byte = 0,88 cu_kbyte,89 cu_mbyte,90 cu_gbyte,91 cu_tbyte,92 cu_pbyte,93 cu_ebyte,94 cu_zbyte,95 cu_ybyte96 } fdisk_cunit_t;97 98 /** Partition capacity */99 typedef struct {100 uint64_t value;101 fdisk_cunit_t cunit;102 } fdisk_cap_t;103 142 104 143 /** Specification of new partition */ 105 144 typedef struct { 106 } fdisk_partspec_t; 145 /** Desired capacity */ 146 fdisk_cap_t capacity; 147 /** File system type */ 148 fdisk_fstype_t fstype; 149 } fdisk_part_spec_t; 150 151 /** Partition info */ 152 typedef struct { 153 fdisk_cap_t capacity; 154 /** File system type */ 155 fdisk_fstype_t fstype; 156 } fdisk_part_info_t; 107 157 108 158 #endif -
uspace/lib/fdisk/src/fdisk.c
re96047c r8227d63 39 39 #include <fdisk.h> 40 40 #include <loc.h> 41 #include <mem.h> 41 42 #include <stdio.h> 42 43 #include <stdlib.h> 43 44 #include <str.h> 45 46 static const char *cu_str[] = { 47 [cu_byte] = "B", 48 [cu_kbyte] = "kB", 49 [cu_mbyte] = "MB", 50 [cu_gbyte] = "GB", 51 [cu_tbyte] = "TB", 52 [cu_pbyte] = "PB", 53 [cu_ebyte] = "EB", 54 [cu_zbyte] = "ZB", 55 [cu_ybyte] = "YB" 56 }; 44 57 45 58 static void fdisk_dev_info_delete(fdisk_dev_info_t *info) … … 144 157 } 145 158 146 void fdisk_dev_ get_svcid(fdisk_dev_info_t *info, service_id_t *rsid)159 void fdisk_dev_info_get_svcid(fdisk_dev_info_t *info, service_id_t *rsid) 147 160 { 148 161 *rsid = info->svcid; 149 162 } 150 163 151 int fdisk_dev_ get_svcname(fdisk_dev_info_t *info, char **rname)164 int fdisk_dev_info_get_svcname(fdisk_dev_info_t *info, char **rname) 152 165 { 153 166 char *name; … … 169 182 } 170 183 171 int fdisk_dev_ capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap)184 int fdisk_dev_info_capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap) 172 185 { 173 186 size_t bsize; … … 179 192 if (rc != EOK) 180 193 return rc; 194 195 info->blk_inited = true; 181 196 } 182 197 … … 204 219 205 220 dev->ltype = fdl_none; 221 dev->sid = sid; 222 list_initialize(&dev->parts); 206 223 *rdev = dev; 207 224 return EOK; … … 211 228 { 212 229 free(dev); 230 } 231 232 int fdisk_dev_get_svcname(fdisk_dev_t *dev, char **rname) 233 { 234 char *name; 235 int rc; 236 237 rc = loc_service_get_name(dev->sid, &name); 238 if (rc != EOK) 239 return rc; 240 241 *rname = name; 242 return EOK; 243 } 244 245 int fdisk_dev_capacity(fdisk_dev_t *dev, fdisk_cap_t *cap) 246 { 247 size_t bsize; 248 aoff64_t nblocks; 249 int rc; 250 251 rc = block_init(EXCHANGE_SERIALIZE, dev->sid, 2048); 252 if (rc != EOK) 253 return rc; 254 255 rc = block_get_bsize(dev->sid, &bsize); 256 if (rc != EOK) 257 return EIO; 258 259 rc = block_get_nblocks(dev->sid, &nblocks); 260 if (rc != EOK) 261 return EIO; 262 263 block_fini(dev->sid); 264 265 cap->value = bsize * nblocks; 266 cap->cunit = cu_byte; 267 268 return EOK; 213 269 } 214 270 … … 230 286 int fdisk_label_destroy(fdisk_dev_t *dev) 231 287 { 288 fdisk_part_t *part; 289 232 290 if (dev->ltype == fdl_none) 233 291 return ENOENT; 234 292 293 part = fdisk_part_first(dev); 294 while (part != NULL) { 295 (void) fdisk_part_destroy(part); /* XXX */ 296 part = fdisk_part_first(dev); 297 } 298 235 299 dev->ltype = fdl_none; 236 300 return EOK; … … 239 303 fdisk_part_t *fdisk_part_first(fdisk_dev_t *dev) 240 304 { 241 return NULL; 305 link_t *link; 306 307 link = list_first(&dev->parts); 308 if (link == NULL) 309 return NULL; 310 311 return list_get_instance(link, fdisk_part_t, ldev); 242 312 } 243 313 244 314 fdisk_part_t *fdisk_part_next(fdisk_part_t *part) 245 315 { 246 return NULL; 316 link_t *link; 317 318 link = list_next(&part->ldev, &part->dev->parts); 319 if (link == NULL) 320 return NULL; 321 322 return list_get_instance(link, fdisk_part_t, ldev); 323 } 324 325 int fdisk_part_get_info(fdisk_part_t *part, fdisk_part_info_t *info) 326 { 327 info->capacity = part->capacity; 328 info->fstype = part->fstype; 329 return EOK; 247 330 } 248 331 … … 252 335 } 253 336 254 int fdisk_part_create(fdisk_dev_t *dev, fdisk_part spec_t *pspec,337 int fdisk_part_create(fdisk_dev_t *dev, fdisk_part_spec_t *pspec, 255 338 fdisk_part_t **rpart) 256 339 { 340 fdisk_part_t *part; 341 342 part = calloc(1, sizeof(fdisk_part_t)); 343 if (part == NULL) 344 return ENOMEM; 345 346 part->dev = dev; 347 list_append(&part->ldev, &dev->parts); 348 part->capacity = pspec->capacity; 349 part->fstype = pspec->fstype; 350 351 if (rpart != NULL) 352 *rpart = part; 257 353 return EOK; 258 354 } … … 260 356 int fdisk_part_destroy(fdisk_part_t *part) 261 357 { 262 return EOK; 358 list_remove(&part->ldev); 359 free(part); 360 return EOK; 361 } 362 363 void fdisk_pspec_init(fdisk_part_spec_t *pspec) 364 { 365 memset(pspec, 0, sizeof(fdisk_part_spec_t)); 263 366 } 264 367 … … 266 369 { 267 370 int rc; 268 269 rc = asprintf(rstr, "%" PRIu64 " B", cap->value); 371 const char *sunit; 372 373 sunit = NULL; 374 375 if (cap->cunit < 0 || cap->cunit >= CU_LIMIT) 376 assert(false); 377 378 sunit = cu_str[cap->cunit]; 379 rc = asprintf(rstr, "%" PRIu64 " %s", cap->value, sunit); 270 380 if (rc < 0) 271 381 return ENOMEM; 272 382 383 return EOK; 384 } 385 386 int fdisk_cap_parse(const char *str, fdisk_cap_t *cap) 387 { 388 char *eptr; 389 char *p; 390 unsigned long val; 391 int i; 392 393 val = strtoul(str, &eptr, 10); 394 395 while (*eptr == ' ') 396 ++eptr; 397 398 if (*eptr == '\0') { 399 cap->cunit = cu_byte; 400 } else { 401 for (i = 0; i < CU_LIMIT; i++) { 402 if (str_lcasecmp(eptr, cu_str[i], 403 str_length(cu_str[i])) == 0) { 404 p = eptr + str_size(cu_str[i]); 405 while (*p == ' ') 406 ++p; 407 if (*p == '\0') 408 goto found; 409 } 410 } 411 412 return EINVAL; 413 found: 414 cap->cunit = i; 415 } 416 417 cap->value = val; 273 418 return EOK; 274 419 } … … 303 448 } 304 449 450 int fdisk_fstype_format(fdisk_fstype_t fstype, char **rstr) 451 { 452 const char *sfstype; 453 char *s; 454 455 sfstype = NULL; 456 switch (fstype) { 457 case fdfs_none: 458 sfstype = "None"; 459 break; 460 case fdfs_unknown: 461 sfstype = "Unknown"; 462 break; 463 case fdfs_exfat: 464 sfstype = "ExFAT"; 465 break; 466 case fdfs_fat: 467 sfstype = "FAT"; 468 break; 469 case fdfs_minix: 470 sfstype = "MINIX"; 471 break; 472 case fdfs_ext4: 473 sfstype = "Ext4"; 474 break; 475 } 476 477 s = str_dup(sfstype); 478 if (s == NULL) 479 return ENOMEM; 480 481 *rstr = s; 482 return EOK; 483 } 484 305 485 /** @} 306 486 */
Note:
See TracChangeset
for help on using the changeset viewer.