X-Git-Url: https://git.sven.stormbind.net/?p=sven%2Fexfatprogs.git;a=blobdiff_plain;f=lib%2Flibexfat.c;h=c54a7c8dc23bdb067acd218c9f1c28834b3da92b;hp=13dfbafe83eaf325658695882476e9e61d023f87;hb=20b882b37d525f27c85037871c4f35f7ad2c55ba;hpb=37cbd64649f64ddb88b4ab3d8a494ddf96890cf8 diff --git a/lib/libexfat.c b/lib/libexfat.c index 13dfbaf..c54a7c8 100644 --- a/lib/libexfat.c +++ b/lib/libexfat.c @@ -196,7 +196,7 @@ int exfat_get_blk_dev_info(struct exfat_user_input *ui, if (ioctl(fd, BLKSSZGET, &bd->sector_size) < 0) bd->sector_size = DEFAULT_SECTOR_SIZE; bd->sector_size_bits = sector_size_bits(bd->sector_size); - bd->num_sectors = blk_dev_size / DEFAULT_SECTOR_SIZE; + bd->num_sectors = blk_dev_size / bd->sector_size; bd->num_clusters = blk_dev_size / ui->cluster_size; exfat_debug("Block device name : %s\n", ui->dev_name); @@ -358,26 +358,27 @@ off_t exfat_get_root_entry_offset(struct exfat_blk_dev *bd) { struct pbr *bs; int nbytes; - unsigned int cluster_size; + unsigned int cluster_size, sector_size; off_t root_clu_off; - bs = (struct pbr *)malloc(sizeof(struct pbr)); + bs = (struct pbr *)malloc(EXFAT_MAX_SECTOR_SIZE); if (!bs) { exfat_err("failed to allocate memory\n"); return -ENOMEM; } - nbytes = exfat_read(bd->dev_fd, bs, sizeof(struct pbr), 0); - if (nbytes != sizeof(struct pbr)) { + nbytes = exfat_read(bd->dev_fd, bs, EXFAT_MAX_SECTOR_SIZE, 0); + if (nbytes != EXFAT_MAX_SECTOR_SIZE) { exfat_err("boot sector read failed: %d\n", errno); free(bs); return -1; } - cluster_size = (1 << bs->bsx.sect_per_clus_bits) * bd->sector_size; - root_clu_off = le32_to_cpu(bs->bsx.clu_offset) * bd->sector_size + - le32_to_cpu(bs->bsx.root_cluster - EXFAT_RESERVED_CLUSTERS) - * cluster_size; + sector_size = 1 << bs->bsx.sect_size_bits; + cluster_size = (1 << bs->bsx.sect_per_clus_bits) * sector_size; + root_clu_off = le32_to_cpu(bs->bsx.clu_offset) * sector_size + + (le32_to_cpu(bs->bsx.root_cluster) - EXFAT_RESERVED_CLUSTERS) * + cluster_size; free(bs); return root_clu_off; @@ -528,20 +529,19 @@ free: return ret; } -int exfat_show_volume_serial(struct exfat_blk_dev *bd, - struct exfat_user_input *ui) +int exfat_show_volume_serial(int fd) { struct pbr *ppbr; int ret; - ppbr = malloc(bd->sector_size); + ppbr = malloc(EXFAT_MAX_SECTOR_SIZE); if (!ppbr) { exfat_err("Cannot allocate pbr: out of memory\n"); return -1; } /* read main boot sector */ - ret = exfat_read_sector(bd, (char *)ppbr, BOOT_SEC_IDX); + ret = exfat_read(fd, (char *)ppbr, EXFAT_MAX_SECTOR_SIZE, 0); if (ret < 0) { exfat_err("main boot sector read failed\n"); ret = -1; @@ -559,7 +559,6 @@ static int exfat_update_boot_checksum(struct exfat_blk_dev *bd, bool is_backup) { unsigned int checksum = 0; int ret, sec_idx, backup_sec_idx = 0; - int sector_size = bd->sector_size; unsigned char *buf; buf = malloc(bd->sector_size); @@ -581,13 +580,10 @@ static int exfat_update_boot_checksum(struct exfat_blk_dev *bd, bool is_backup) goto free_buf; } - if (sec_idx == BOOT_SEC_IDX) { + if (sec_idx == BOOT_SEC_IDX) is_boot_sec = true; - sector_size = sizeof(struct pbr); - } else if (sec_idx >= EXBOOT_SEC_IDX && sec_idx < OEM_SEC_IDX) - sector_size = sizeof(struct exbs); - boot_calc_checksum(buf, sector_size, is_boot_sec, + boot_calc_checksum(buf, bd->sector_size, is_boot_sec, &checksum); } @@ -605,20 +601,22 @@ int exfat_set_volume_serial(struct exfat_blk_dev *bd, int ret; struct pbr *ppbr; - ppbr = malloc(bd->sector_size); + ppbr = malloc(EXFAT_MAX_SECTOR_SIZE); if (!ppbr) { exfat_err("Cannot allocate pbr: out of memory\n"); return -1; } /* read main boot sector */ - ret = exfat_read_sector(bd, (char *)ppbr, BOOT_SEC_IDX); + ret = exfat_read(bd->dev_fd, (char *)ppbr, EXFAT_MAX_SECTOR_SIZE, + BOOT_SEC_IDX); if (ret < 0) { exfat_err("main boot sector read failed\n"); ret = -1; goto free_ppbr; } + bd->sector_size = 1 << ppbr->bsx.sect_size_bits; ppbr->bsx.vol_serial = ui->volume_serial; /* update main boot sector */