Changeset 8227d63 in mainline for uspace/lib/fdisk/src/fdisk.c


Ignore:
Timestamp:
2015-06-22T21:20:23Z (9 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
1356f85a
Parents:
e96047c
Message:

UI for creating and deleting partitions.

File:
1 edited

Legend:

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

    re96047c r8227d63  
    3939#include <fdisk.h>
    4040#include <loc.h>
     41#include <mem.h>
    4142#include <stdio.h>
    4243#include <stdlib.h>
    4344#include <str.h>
     45
     46static 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};
    4457
    4558static void fdisk_dev_info_delete(fdisk_dev_info_t *info)
     
    144157}
    145158
    146 void fdisk_dev_get_svcid(fdisk_dev_info_t *info, service_id_t *rsid)
     159void fdisk_dev_info_get_svcid(fdisk_dev_info_t *info, service_id_t *rsid)
    147160{
    148161        *rsid = info->svcid;
    149162}
    150163
    151 int fdisk_dev_get_svcname(fdisk_dev_info_t *info, char **rname)
     164int fdisk_dev_info_get_svcname(fdisk_dev_info_t *info, char **rname)
    152165{
    153166        char *name;
     
    169182}
    170183
    171 int fdisk_dev_capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap)
     184int fdisk_dev_info_capacity(fdisk_dev_info_t *info, fdisk_cap_t *cap)
    172185{
    173186        size_t bsize;
     
    179192                if (rc != EOK)
    180193                        return rc;
     194
     195                info->blk_inited = true;
    181196        }
    182197
     
    204219
    205220        dev->ltype = fdl_none;
     221        dev->sid = sid;
     222        list_initialize(&dev->parts);
    206223        *rdev = dev;
    207224        return EOK;
     
    211228{
    212229        free(dev);
     230}
     231
     232int 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
     245int 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;
    213269}
    214270
     
    230286int fdisk_label_destroy(fdisk_dev_t *dev)
    231287{
     288        fdisk_part_t *part;
     289
    232290        if (dev->ltype == fdl_none)
    233291                return ENOENT;
    234292
     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
    235299        dev->ltype = fdl_none;
    236300        return EOK;
     
    239303fdisk_part_t *fdisk_part_first(fdisk_dev_t *dev)
    240304{
    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);
    242312}
    243313
    244314fdisk_part_t *fdisk_part_next(fdisk_part_t *part)
    245315{
    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
     325int 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;
    247330}
    248331
     
    252335}
    253336
    254 int fdisk_part_create(fdisk_dev_t *dev, fdisk_partspec_t *pspec,
     337int fdisk_part_create(fdisk_dev_t *dev, fdisk_part_spec_t *pspec,
    255338    fdisk_part_t **rpart)
    256339{
     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;
    257353        return EOK;
    258354}
     
    260356int fdisk_part_destroy(fdisk_part_t *part)
    261357{
    262         return EOK;
     358        list_remove(&part->ldev);
     359        free(part);
     360        return EOK;
     361}
     362
     363void fdisk_pspec_init(fdisk_part_spec_t *pspec)
     364{
     365        memset(pspec, 0, sizeof(fdisk_part_spec_t));
    263366}
    264367
     
    266369{
    267370        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);
    270380        if (rc < 0)
    271381                return ENOMEM;
    272382
     383        return EOK;
     384}
     385
     386int 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;
     413found:
     414                cap->cunit = i;
     415        }
     416
     417        cap->value = val;
    273418        return EOK;
    274419}
     
    303448}
    304449
     450int 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
    305485/** @}
    306486 */
Note: See TracChangeset for help on using the changeset viewer.