Changeset 8227d63 in mainline for uspace/lib/fdisk/src/fdisk.c
- Timestamp:
- 2015-06-22T21:20:23Z (9 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 1356f85a
- Parents:
- e96047c
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.