Changeset 9c96634 in mainline for uspace/srv/fs/cdfs/cdfs_ops.c


Ignore:
Timestamp:
2017-05-15T18:29:10Z (7 years ago)
Author:
Jiri Svoboda <jiri@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
fec333b3
Parents:
8d2dd7f2
Message:

CDFS decoding of volume label.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fs/cdfs/cdfs_ops.c

    r8d2dd7f2 r9c96634  
    208208        service_id_t service_id;  /**< Service ID of block device */
    209209        cdfs_enc_t enc;           /**< Filesystem string encoding */
     210        char *vol_ident;          /**< Volume identifier */
    210211} cdfs_t;
    211212
     
    483484 * @param data  File name buffer
    484485 * @param dsize Fine name buffer size
     486 * @param enc   Encoding
    485487 * @param dtype Directory entry type
    486488 * @return      Decoded file name (allocated string)
     
    515517       
    516518        return name;
     519}
     520
     521/** Decode volume identifier.
     522 *
     523 * @param data  Volume identifier buffer
     524 * @param dsize Volume identifier buffer size
     525 * @param enc   Encoding
     526 * @return      Decoded volume identifier (allocated string)
     527 */
     528static char *cdfs_decode_vol_ident(void *data, size_t dsize, cdfs_enc_t enc)
     529{
     530        char *ident;
     531        size_t i;
     532       
     533        ident = cdfs_decode_str(data, dsize, enc);
     534        if (ident == NULL)
     535                return NULL;
     536       
     537        /* Trim trailing spaces */
     538        i = str_size(ident);
     539        while (i > 0 && ident[i - 1] == ' ')
     540                --i;
     541        ident[i] = '\0';
     542       
     543        return ident;
    517544}
    518545
     
    841868 * @param rlba          Place to store LBA of root dir
    842869 * @param rsize         Place to store size of root dir
     870 * @param vol_ident     Place to store pointer to volume identifier
    843871 * @return              EOK if found, ENOENT if not
    844872 */
    845873static int cdfs_find_joliet_svd(service_id_t sid, cdfs_lba_t altroot,
    846     uint32_t *rlba, uint32_t *rsize)
     874    uint32_t *rlba, uint32_t *rsize, char **vol_ident)
    847875{
    848876        cdfs_lba_t bi;
     
    899927                *rlba = uint32_lb(vol_desc->data.prisec.root_dir.lba);
    900928                *rsize = uint32_lb(vol_desc->data.prisec.root_dir.size);
     929
     930                *vol_ident = cdfs_decode_vol_ident(vol_desc->data.prisec.ident,
     931                    32, enc_ucs2);
     932
    901933                block_put(block);
    902934                return EOK;
     
    908940/** Read the volume descriptors. */
    909941static bool iso_read_vol_desc(service_id_t sid, cdfs_lba_t altroot,
    910     uint32_t *rlba, uint32_t *rsize, cdfs_enc_t *enc)
     942    uint32_t *rlba, uint32_t *rsize, cdfs_enc_t *enc, char **vol_ident)
    911943{
    912944        /* First 16 blocks of isofs are empty */
     
    962994        uint32_t jrsize;
    963995       
    964         rc = cdfs_find_joliet_svd(sid, altroot, &jrlba, &jrsize);
     996        rc = cdfs_find_joliet_svd(sid, altroot, &jrlba, &jrsize, vol_ident);
    965997        if (rc == EOK) {
    966998                /* Found */
     
    9721004                *rsize = uint32_lb(vol_desc->data.prisec.root_dir.size);
    9731005                *enc = enc_ascii;
     1006                *vol_ident = cdfs_decode_vol_ident(vol_desc->data.prisec.ident,
     1007                    32, enc_ascii);
    9741008        }
    9751009       
     
    9861020       
    9871021        rc = iso_read_vol_desc(fs->service_id, altroot, &node->lba,
    988             &node->size, &fs->enc);
     1022            &node->size, &fs->enc, &fs->vol_ident);
    9891023        if (rc != EOK)
    9901024                return false;
     
    10321066static int cdfs_fsprobe(service_id_t service_id, vfs_fs_probe_info_t *info)
    10331067{
     1068        char *vol_ident;
     1069
    10341070        /* Initialize the block layer */
    10351071        int rc = block_init(service_id, BLOCK_SIZE);
     
    10701106        uint32_t rsize;
    10711107        cdfs_enc_t enc;
    1072         if (!iso_read_vol_desc(service_id, altroot, &rlba, &rsize, &enc)) {
     1108        if (!iso_read_vol_desc(service_id, altroot, &rlba, &rsize, &enc,
     1109            &vol_ident)) {
    10731110                block_cache_fini(service_id);
    10741111                block_fini(service_id);
    10751112                return EIO;
    10761113        }
     1114       
     1115        str_cpy(info->label, FS_LABEL_MAXLEN + 1, vol_ident);
     1116        free(vol_ident);
    10771117       
    10781118        return EOK;
     
    11601200        block_cache_fini(fs->service_id);
    11611201        block_fini(fs->service_id);
     1202        free(fs->vol_ident);
    11621203        free(fs);
    11631204}
Note: See TracChangeset for help on using the changeset viewer.