static int dump_sb(const char* spec)
{
- int fd;
+ struct exfat_dev* dev;
struct exfat_super_block sb;
- fd = exfat_open(spec, 1);
- if (fd < 0)
+ dev = exfat_open(spec, 1);
+ if (dev == NULL)
return 1;
- if (exfat_read(fd, &sb, sizeof(struct exfat_super_block)) < 0)
+ if (exfat_read(dev, &sb, sizeof(struct exfat_super_block)) < 0)
{
- exfat_close(fd);
+ exfat_close(dev);
exfat_error("failed to read from `%s'", spec);
return 1;
}
if (memcmp(sb.oem_name, "EXFAT ", sizeof(sb.oem_name)) != 0)
{
- exfat_close(fd);
+ exfat_close(dev);
exfat_error("exFAT file system is not found on `%s'", spec);
return 1;
}
print_cluster_info(&sb);
print_other_info(&sb);
- exfat_close(fd);
+ exfat_close(dev);
return 0;
}
return cluster + 1;
fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start))
+ cluster * sizeof(cluster_t);
- exfat_pread(ef->fd, &next, sizeof(next), fat_offset);
+ exfat_pread(ef->dev, &next, sizeof(next), fat_offset);
return le32_to_cpu(next);
}
void exfat_flush_cmap(struct exfat* ef)
{
- exfat_pwrite(ef->fd, ef->cmap.chunk, (ef->cmap.chunk_size + 7) / 8,
+ exfat_pwrite(ef->dev, ef->cmap.chunk, (ef->cmap.chunk_size + 7) / 8,
exfat_c2o(ef, ef->cmap.start_cluster));
ef->cmap.dirty = 0;
}
fat_offset = s2o(ef, le32_to_cpu(ef->sb->fat_sector_start))
+ current * sizeof(cluster_t);
next_le32 = cpu_to_le32(next);
- exfat_pwrite(ef->fd, &next_le32, sizeof(next_le32), fat_offset);
+ exfat_pwrite(ef->dev, &next_le32, sizeof(next_le32), fat_offset);
}
static cluster_t allocate_cluster(struct exfat* ef, cluster_t hint)
static void erase_raw(struct exfat* ef, size_t size, off_t offset)
{
- exfat_pwrite(ef->fd, ef->zero_cluster, size, offset);
+ exfat_pwrite(ef->dev, ef->zero_cluster, size, offset);
}
static int erase_range(struct exfat* ef, struct exfat_node* node,
le16_t name[EXFAT_NAME_MAX + 1];
};
+struct exfat_dev;
+
struct exfat
{
+ struct exfat_dev* dev;
struct exfat_super_block* sb;
- int fd;
le16_t* upcase;
size_t upcase_chars;
struct exfat_node* root;
void exfat_debug(const char* format, ...)
__attribute__((format(printf, 1, 2)));
-int exfat_open(const char* spec, int ro);
-int exfat_close(int fd);
-int exfat_fsync(int fd);
-off_t exfat_seek(int fd, off_t offset, int whence);
-ssize_t exfat_read(int fd, void* buffer, size_t size);
-ssize_t exfat_write(int fd, const void* buffer, size_t size);
-void exfat_pread(int fd, void* buffer, size_t size, off_t offset);
-void exfat_pwrite(int fd, const void* buffer, size_t size, off_t offset);
+struct exfat_dev* exfat_open(const char* spec, int ro);
+int exfat_close(struct exfat_dev* dev);
+int exfat_fsync(struct exfat_dev* dev);
+off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence);
+ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size);
+ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size);
+void exfat_pread(struct exfat_dev* dev, void* buffer, size_t size,
+ off_t offset);
+void exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size,
+ off_t offset);
ssize_t exfat_generic_pread(const struct exfat* ef, struct exfat_node* node,
void* buffer, size_t size, off_t offset);
ssize_t exfat_generic_pwrite(struct exfat* ef, struct exfat_node* node,
#error You should define _FILE_OFFSET_BITS=64
#endif
-int exfat_open(const char* spec, int ro)
+struct exfat_dev
{
int fd;
+};
+
+struct exfat_dev* exfat_open(const char* spec, int ro)
+{
+ struct exfat_dev* dev;
struct stat stbuf;
- fd = open(spec, ro ? O_RDONLY : O_RDWR);
- if (fd < 0)
+ dev = malloc(sizeof(struct exfat_dev));
+ if (dev == NULL)
+ {
+ exfat_error("failed to allocate memory for device structure");
+ return NULL;
+ }
+
+ dev->fd = open(spec, ro ? O_RDONLY : O_RDWR);
+ if (dev->fd < 0)
{
+ free(dev);
exfat_error("failed to open `%s' in read-%s mode", spec,
ro ? "only" : "write");
- return -1;
+ return NULL;
}
- if (fstat(fd, &stbuf) != 0)
+ if (fstat(dev->fd, &stbuf) != 0)
{
- exfat_close(fd);
+ close(dev->fd);
+ free(dev);
exfat_error("failed to fstat `%s'", spec);
- return -1;
+ return NULL;
}
if (!S_ISBLK(stbuf.st_mode) && !S_ISREG(stbuf.st_mode))
{
- exfat_close(fd);
+ close(dev->fd);
+ free(dev);
exfat_error("`%s' is neither a block device, nor a regular file",
spec);
- return -1;
+ return NULL;
}
- return fd;
+ return dev;
}
-int exfat_close(int fd)
+int exfat_close(struct exfat_dev* dev)
{
- if (close(fd) != 0)
+ if (close(dev->fd) != 0)
{
+ free(dev);
exfat_error("close failed");
return 1;
}
+ free(dev);
return 0;
}
-int exfat_fsync(int fd)
+int exfat_fsync(struct exfat_dev* dev)
{
- if (fsync(fd) != 0)
+ if (fsync(dev->fd) != 0)
{
exfat_error("fsync failed");
return 1;
return 0;
}
-off_t exfat_seek(int fd, off_t offset, int whence)
+off_t exfat_seek(struct exfat_dev* dev, off_t offset, int whence)
{
- return lseek(fd, offset, whence);
+ return lseek(dev->fd, offset, whence);
}
-ssize_t exfat_read(int fd, void* buffer, size_t size)
+ssize_t exfat_read(struct exfat_dev* dev, void* buffer, size_t size)
{
- return read(fd, buffer, size);
+ return read(dev->fd, buffer, size);
}
-ssize_t exfat_write(int fd, const void* buffer, size_t size)
+ssize_t exfat_write(struct exfat_dev* dev, const void* buffer, size_t size)
{
- return write(fd, buffer, size);
+ return write(dev->fd, buffer, size);
}
-void exfat_pread(int fd, void* buffer, size_t size, off_t offset)
+void exfat_pread(struct exfat_dev* dev, void* buffer, size_t size,
+ off_t offset)
{
- if (pread(fd, buffer, size, offset) != size)
+ if (pread(dev->fd, buffer, size, offset) != size)
exfat_bug("failed to read %zu bytes from file at %"PRIu64, size,
(uint64_t) offset);
}
-void exfat_pwrite(int fd, const void* buffer, size_t size, off_t offset)
+void exfat_pwrite(struct exfat_dev* dev, const void* buffer, size_t size,
+ off_t offset)
{
- if (pwrite(fd, buffer, size, offset) != size)
+ if (pwrite(dev->fd, buffer, size, offset) != size)
exfat_bug("failed to write %zu bytes to file at %"PRIu64, size,
(uint64_t) offset);
}
return -1;
}
lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder);
- exfat_pread(ef->fd, bufp, lsize, exfat_c2o(ef, cluster) + loffset);
+ exfat_pread(ef->dev, bufp, lsize, exfat_c2o(ef, cluster) + loffset);
bufp += lsize;
loffset = 0;
remainder -= lsize;
return -1;
}
lsize = MIN(CLUSTER_SIZE(*ef->sb) - loffset, remainder);
- exfat_pwrite(ef->fd, bufp, lsize, exfat_c2o(ef, cluster) + loffset);
+ exfat_pwrite(ef->dev, bufp, lsize, exfat_c2o(ef, cluster) + loffset);
bufp += lsize;
loffset = 0;
remainder -= lsize;
ef->noatime = match_option(options, "noatime");
}
-static int verify_vbr_checksum(void* sector, off_t sector_size, int fd)
+static int verify_vbr_checksum(struct exfat_dev* dev, void* sector,
+ off_t sector_size)
{
uint32_t vbr_checksum;
int i;
- exfat_pread(fd, sector, sector_size, 0);
+ exfat_pread(dev, sector, sector_size, 0);
vbr_checksum = exfat_vbr_start_checksum(sector, sector_size);
for (i = 1; i < 11; i++)
{
- exfat_pread(fd, sector, sector_size, i * sector_size);
+ exfat_pread(dev, sector, sector_size, i * sector_size);
vbr_checksum = exfat_vbr_add_checksum(sector, sector_size,
vbr_checksum);
}
- exfat_pread(fd, sector, sector_size, i * sector_size);
+ exfat_pread(dev, sector, sector_size, i * sector_size);
for (i = 0; i < sector_size / sizeof(vbr_checksum); i++)
if (le32_to_cpu(((const le32_t*) sector)[i]) != vbr_checksum)
{
static int commit_super_block(const struct exfat* ef)
{
- exfat_pwrite(ef->fd, ef->sb, sizeof(struct exfat_super_block), 0);
- return exfat_fsync(ef->fd);
+ exfat_pwrite(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0);
+ return exfat_fsync(ef->dev);
}
static int prepare_super_block(const struct exfat* ef)
parse_options(ef, options);
- ef->fd = exfat_open(spec, ef->ro);
- if (ef->fd < 0)
+ ef->dev = exfat_open(spec, ef->ro);
+ if (ef->dev == NULL)
{
if (ef->ro || !match_option(options, "ro_fallback"))
return -EIO;
- ef->fd = exfat_open(spec, 1);
- if (ef->fd < 0)
+ ef->dev = exfat_open(spec, 1);
+ if (ef->dev == NULL)
return -EIO;
exfat_warn("device is write-protected, mounting read-only");
ef->ro_fallback = ef->ro = 1;
ef->sb = malloc(sizeof(struct exfat_super_block));
if (ef->sb == NULL)
{
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
exfat_error("failed to allocate memory for the super block");
return -ENOMEM;
}
memset(ef->sb, 0, sizeof(struct exfat_super_block));
- exfat_pread(ef->fd, ef->sb, sizeof(struct exfat_super_block), 0);
+ exfat_pread(ef->dev, ef->sb, sizeof(struct exfat_super_block), 0);
if (memcmp(ef->sb->oem_name, "EXFAT ", 8) != 0)
{
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
exfat_error("exFAT file system is not found");
return -EIO;
}
if (ef->sb->version.major != 1 || ef->sb->version.minor != 0)
{
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
exfat_error("unsupported exFAT version: %hhu.%hhu",
ef->sb->version.major, ef->sb->version.minor);
free(ef->sb);
}
if (ef->sb->fat_count != 1)
{
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
exfat_error("unsupported FAT count: %hhu", ef->sb->fat_count);
return -EIO;
/* officially exFAT supports cluster size up to 32 MB */
if ((int) ef->sb->sector_bits + (int) ef->sb->spc_bits > 25)
{
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
exfat_error("too big cluster size: 2^%d",
(int) ef->sb->sector_bits + (int) ef->sb->spc_bits);
ef->zero_cluster = malloc(CLUSTER_SIZE(*ef->sb));
if (ef->zero_cluster == NULL)
{
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
exfat_error("failed to allocate zero sector");
return -ENOMEM;
}
/* use zero_cluster as a temporary buffer for VBR checksum verification */
- if (verify_vbr_checksum(ef->zero_cluster, SECTOR_SIZE(*ef->sb),
- ef->fd) != 0)
+ if (verify_vbr_checksum(ef->dev, ef->zero_cluster,
+ SECTOR_SIZE(*ef->sb)) != 0)
{
free(ef->zero_cluster);
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
return -EIO;
}
if (ef->root == NULL)
{
free(ef->zero_cluster);
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
exfat_error("failed to allocate root node");
return -ENOMEM;
exfat_reset_cache(ef);
free(ef->root);
free(ef->zero_cluster);
- exfat_close(ef->fd);
+ exfat_close(ef->dev);
free(ef->sb);
return -EIO;
}
free(ef->root);
ef->root = NULL;
finalize_super_block(ef);
- exfat_close(ef->fd); /* close descriptor immediately after fsync */
- ef->fd = 0;
+ exfat_close(ef->dev); /* close descriptor immediately after fsync */
+ ef->dev = NULL;
free(ef->zero_cluster);
ef->zero_cluster = NULL;
free(ef->cmap.chunk);
exfat_error("out of memory");
return -ENOMEM;
}
- exfat_pread(ef->fd, it->chunk, CLUSTER_SIZE(*ef->sb),
+ exfat_pread(ef->dev, it->chunk, CLUSTER_SIZE(*ef->sb),
exfat_c2o(ef, it->cluster));
return 0;
}
exfat_error("invalid cluster while reading directory");
return 1;
}
- exfat_pread(ef->fd, it->chunk, CLUSTER_SIZE(*ef->sb),
+ exfat_pread(ef->dev, it->chunk, CLUSTER_SIZE(*ef->sb),
exfat_c2o(ef, it->cluster));
}
return 0;
}
ef->upcase_chars = le64_to_cpu(upcase->size) / sizeof(le16_t);
- exfat_pread(ef->fd, ef->upcase, le64_to_cpu(upcase->size),
+ exfat_pread(ef->dev, ef->upcase, le64_to_cpu(upcase->size),
exfat_c2o(ef, le32_to_cpu(upcase->start_cluster)));
break;
goto error;
}
- exfat_pread(ef->fd, ef->cmap.chunk, le64_to_cpu(bitmap->size),
+ exfat_pread(ef->dev, ef->cmap.chunk, le64_to_cpu(bitmap->size),
exfat_c2o(ef, ef->cmap.start_cluster));
break;
next_entry(ef, node->parent, &cluster, &offset);
meta2_offset = co2o(ef, cluster, offset);
- exfat_pread(ef->fd, &meta1, sizeof(meta1), meta1_offset);
+ exfat_pread(ef->dev, &meta1, sizeof(meta1), meta1_offset);
if (meta1.type != EXFAT_ENTRY_FILE)
exfat_bug("invalid type of meta1: 0x%hhx", meta1.type);
meta1.attrib = cpu_to_le16(node->flags);
exfat_unix2exfat(node->mtime, &meta1.mdate, &meta1.mtime, &meta1.mtime_cs);
exfat_unix2exfat(node->atime, &meta1.adate, &meta1.atime, NULL);
- exfat_pread(ef->fd, &meta2, sizeof(meta2), meta2_offset);
+ exfat_pread(ef->dev, &meta2, sizeof(meta2), meta2_offset);
if (meta2.type != EXFAT_ENTRY_FILE_INFO)
exfat_bug("invalid type of meta2: 0x%hhx", meta2.type);
meta2.size = meta2.real_size = cpu_to_le64(node->size);
meta1.checksum = exfat_calc_checksum(&meta1, &meta2, node->name);
- exfat_pwrite(ef->fd, &meta1, sizeof(meta1), meta1_offset);
- exfat_pwrite(ef->fd, &meta2, sizeof(meta2), meta2_offset);
+ exfat_pwrite(ef->dev, &meta1, sizeof(meta1), meta1_offset);
+ exfat_pwrite(ef->dev, &meta2, sizeof(meta2), meta2_offset);
node->flags &= ~EXFAT_ATTRIB_DIRTY;
}
uint8_t entry_type;
entry_type = EXFAT_ENTRY_FILE & ~EXFAT_ENTRY_VALID;
- exfat_pwrite(ef->fd, &entry_type, 1, co2o(ef, cluster, offset));
+ exfat_pwrite(ef->dev, &entry_type, 1, co2o(ef, cluster, offset));
next_entry(ef, node->parent, &cluster, &offset);
entry_type = EXFAT_ENTRY_FILE_INFO & ~EXFAT_ENTRY_VALID;
- exfat_pwrite(ef->fd, &entry_type, 1, co2o(ef, cluster, offset));
+ exfat_pwrite(ef->dev, &entry_type, 1, co2o(ef, cluster, offset));
while (name_entries--)
{
next_entry(ef, node->parent, &cluster, &offset);
entry_type = EXFAT_ENTRY_FILE_NAME & ~EXFAT_ENTRY_VALID;
- exfat_pwrite(ef->fd, &entry_type, 1, co2o(ef, cluster, offset));
+ exfat_pwrite(ef->dev, &entry_type, 1, co2o(ef, cluster, offset));
}
}
meta1.checksum = exfat_calc_checksum(&meta1, &meta2, node->name);
- exfat_pwrite(ef->fd, &meta1, sizeof(meta1), co2o(ef, cluster, offset));
+ exfat_pwrite(ef->dev, &meta1, sizeof(meta1), co2o(ef, cluster, offset));
next_entry(ef, dir, &cluster, &offset);
- exfat_pwrite(ef->fd, &meta2, sizeof(meta2), co2o(ef, cluster, offset));
+ exfat_pwrite(ef->dev, &meta2, sizeof(meta2), co2o(ef, cluster, offset));
for (i = 0; i < name_entries; i++)
{
struct exfat_entry_name name_entry = {EXFAT_ENTRY_FILE_NAME, 0};
memcpy(name_entry.name, node->name + i * EXFAT_ENAME_MAX,
EXFAT_ENAME_MAX * sizeof(le16_t));
next_entry(ef, dir, &cluster, &offset);
- exfat_pwrite(ef->fd, &name_entry, sizeof(name_entry),
+ exfat_pwrite(ef->dev, &name_entry, sizeof(name_entry),
co2o(ef, cluster, offset));
}
const int name_entries = DIV_ROUND_UP(name_length, EXFAT_ENAME_MAX);
int i;
- exfat_pread(ef->fd, &meta1, sizeof(meta1),
+ exfat_pread(ef->dev, &meta1, sizeof(meta1),
co2o(ef, old_cluster, old_offset));
next_entry(ef, node->parent, &old_cluster, &old_offset);
- exfat_pread(ef->fd, &meta2, sizeof(meta2),
+ exfat_pread(ef->dev, &meta2, sizeof(meta2),
co2o(ef, old_cluster, old_offset));
meta1.continuations = 1 + name_entries;
meta2.name_hash = exfat_calc_name_hash(ef, name);
node->entry_cluster = new_cluster;
node->entry_offset = new_offset;
- exfat_pwrite(ef->fd, &meta1, sizeof(meta1),
+ exfat_pwrite(ef->dev, &meta1, sizeof(meta1),
co2o(ef, new_cluster, new_offset));
next_entry(ef, dir, &new_cluster, &new_offset);
- exfat_pwrite(ef->fd, &meta2, sizeof(meta2),
+ exfat_pwrite(ef->dev, &meta2, sizeof(meta2),
co2o(ef, new_cluster, new_offset));
for (i = 0; i < name_entries; i++)
memcpy(name_entry.name, name + i * EXFAT_ENAME_MAX,
EXFAT_ENAME_MAX * sizeof(le16_t));
next_entry(ef, dir, &new_cluster, &new_offset);
- exfat_pwrite(ef->fd, &name_entry, sizeof(name_entry),
+ exfat_pwrite(ef->dev, &name_entry, sizeof(name_entry),
co2o(ef, new_cluster, new_offset));
}
if (entry.length == 0)
entry.type ^= EXFAT_ENTRY_VALID;
- exfat_pwrite(ef->fd, &entry, sizeof(struct exfat_entry_label),
+ exfat_pwrite(ef->dev, &entry, sizeof(struct exfat_entry_label),
co2o(ef, cluster, offset));
return 0;
}
return DIV_ROUND_UP(le32_to_cpu(sb.cluster_count), CHAR_BIT);
}
-int cbm_write(off_t base, int fd)
+int cbm_write(struct exfat_dev* dev, off_t base)
{
uint32_t allocated_clusters =
DIV_ROUND_UP(cbm_size(), CLUSTER_SIZE(sb)) +
BMAP_SET(bitmap, i);
else
BMAP_CLR(bitmap, i);
- if (exfat_write(fd, bitmap, bitmap_size) < 0)
+ if (exfat_write(dev, bitmap, bitmap_size) < 0)
return errno;
free(bitmap);
off_t cbm_alignment(void);
off_t cbm_size(void);
-int cbm_write(off_t base, int fd);
+int cbm_write(struct exfat_dev* dev, off_t base);
#endif /* ifndef MKFS_CBM_H_INCLUDED */
return (off_t) le32_to_cpu(sb.fat_sector_count) * SECTOR_SIZE(sb);
}
-static cluster_t fat_write_entry(cluster_t cluster, cluster_t value, int fd)
+static cluster_t fat_write_entry(struct exfat_dev* dev, cluster_t cluster,
+ cluster_t value)
{
le32_t fat_entry = cpu_to_le32(value);
- if (exfat_write(fd, &fat_entry, sizeof(fat_entry)) < 0)
+ if (exfat_write(dev, &fat_entry, sizeof(fat_entry)) < 0)
return 0;
return cluster + 1;
}
-static cluster_t fat_write_entries(cluster_t cluster, uint64_t length, int fd)
+static cluster_t fat_write_entries(struct exfat_dev* dev, cluster_t cluster,
+ uint64_t length)
{
cluster_t end = cluster + DIV_ROUND_UP(length, CLUSTER_SIZE(sb));
while (cluster < end - 1)
{
- cluster = fat_write_entry(cluster, cluster + 1, fd);
+ cluster = fat_write_entry(dev, cluster, cluster + 1);
if (cluster == 0)
return 0;
}
- return fat_write_entry(cluster, EXFAT_CLUSTER_END, fd);
+ return fat_write_entry(dev, cluster, EXFAT_CLUSTER_END);
}
-int fat_write(off_t base, int fd)
+int fat_write(struct exfat_dev* dev, off_t base)
{
cluster_t c = 0;
exfat_bug("unexpected FAT location: %"PRIu64" (expected %u)",
base, le32_to_cpu(sb.fat_sector_start) * SECTOR_SIZE(sb));
- if (!(c = fat_write_entry(c, 0xfffffff8, fd))) /* media type */
+ if (!(c = fat_write_entry(dev, c, 0xfffffff8))) /* media type */
return errno;
- if (!(c = fat_write_entry(c, 0xffffffff, fd))) /* some weird constant */
+ if (!(c = fat_write_entry(dev, c, 0xffffffff))) /* some weird constant */
return errno;
- if (!(c = fat_write_entries(c, cbm_size(), fd)))
+ if (!(c = fat_write_entries(dev, c, cbm_size())))
return errno;
- if (!(c = fat_write_entries(c, uct_size(), fd)))
+ if (!(c = fat_write_entries(dev, c, uct_size())))
return errno;
- if (!(c = fat_write_entries(c, rootdir_size(), fd)))
+ if (!(c = fat_write_entries(dev, c, rootdir_size())))
return errno;
return 0;
off_t fat_alignment(void);
off_t fat_size(void);
-int fat_write(off_t base, int fd);
+int fat_write(struct exfat_dev* dev, off_t base);
#endif /* ifndef MKFS_FAT_H_INCLUDED */
int order;
off_t (*get_alignment)(void);
off_t (*get_size)(void);
- int (*write_data)(off_t, int);
+ int (*write_data)(struct exfat_dev*, off_t);
};
static int init_sb(off_t volume_size, int sector_bits, int spc_bits,
return 0;
}
-static int erase_device(int fd)
+static int erase_device(struct exfat_dev* dev)
{
off_t erase_size;
off_t erase_blocks;
erase_blocks = DIV_ROUND_UP(erase_size, block_size);
- if (exfat_seek(fd, 0, SEEK_SET) == (off_t) -1)
+ if (exfat_seek(dev, 0, SEEK_SET) == (off_t) -1)
{
exfat_error("seek failed");
return 1;
for (i = 0; i < erase_blocks; i++)
{
- if (exfat_write(fd, block, block_size) < 0)
+ if (exfat_write(dev, block, block_size) < 0)
{
free(block);
exfat_error("failed to erase block %"PRIu64, i);
};
#undef FS_OBJECT
-static off_t write_structure(int fd, struct exfat_structure* structure,
- off_t current)
+static off_t write_structure(struct exfat_dev* dev,
+ struct exfat_structure* structure, off_t current)
{
off_t alignment = structure->get_alignment();
off_t base = ROUND_UP(current, alignment);
- if (exfat_seek(fd, base, SEEK_SET) == (off_t) -1)
+ if (exfat_seek(dev, base, SEEK_SET) == (off_t) -1)
{
exfat_error("seek to %"PRIu64" failed", base);
return -1;
}
if (structure->order > 0)
{
- int rc = structure->write_data(base, fd);
+ int rc = structure->write_data(dev, base);
if (rc != 0)
{
exfat_error("%s creation failed: %s", structure->name,
return base + structure->get_size();
}
-static int write_structures(int fd)
+static int write_structures(struct exfat_dev* dev)
{
off_t current;
size_t i;
remainder = 0;
for (i = 0; i < sizeof(structures) / sizeof(structures[0]); i++)
{
- current = write_structure(fd, &structures[i], current);
+ current = write_structure(dev, &structures[i], current);
if (current == (off_t) -1)
return 1;
remainder += structures[i].order;
static int mkfs(const char* spec, int sector_bits, int spc_bits,
const char* volume_label, uint32_t volume_serial, int first_sector)
{
- int fd;
+ struct exfat_dev* dev;
off_t volume_size;
- fd = exfat_open(spec, 0);
- if (fd < 0)
+ dev = exfat_open(spec, 0);
+ if (dev == NULL)
return 1;
- volume_size = exfat_seek(fd, 0, SEEK_END);
+ volume_size = exfat_seek(dev, 0, SEEK_END);
if (volume_size == (off_t) -1)
{
- exfat_close(fd);
+ exfat_close(dev);
exfat_error("seek failed");
return 1;
}
if (set_volume_label(volume_label) != 0)
{
- exfat_close(fd);
+ exfat_close(dev);
return 1;
}
volume_serial = get_volume_serial(volume_serial);
if (volume_serial == 0)
{
- exfat_close(fd);
+ exfat_close(dev);
exfat_error("failed to get current time to form volume id");
return 1;
}
if (init_sb(volume_size, sector_bits, spc_bits, volume_serial,
first_sector) != 0)
{
- exfat_close(fd);
+ exfat_close(dev);
return 1;
}
printf("Creating... %2u%%", 0);
fflush(stdout);
- if (erase_device(fd) != 0)
+ if (erase_device(dev) != 0)
{
- exfat_close(fd);
+ exfat_close(dev);
return 1;
}
- if (write_structures(fd) != 0)
+ if (write_structures(dev) != 0)
{
- exfat_close(fd);
+ exfat_close(dev);
return 1;
}
puts("\b\b\b\bdone.");
printf("Flushing... ");
fflush(stdout);
- if (exfat_fsync(fd) != 0)
+ if (exfat_fsync(dev) != 0)
{
- exfat_close(fd);
+ exfat_close(dev);
return 1;
}
puts("done.");
- if (exfat_close(fd) != 0)
+ if (exfat_close(dev) != 0)
return 1;
printf("File system created successfully.\n");
return 0;
return CLUSTER_SIZE(sb);
}
-int rootdir_write(off_t base, int fd)
+int rootdir_write(struct exfat_dev* dev, off_t base)
{
- if (exfat_write(fd, &label_entry, sizeof(struct exfat_entry)) < 0)
+ if (exfat_write(dev, &label_entry, sizeof(struct exfat_entry)) < 0)
return 1;
- if (exfat_write(fd, &bitmap_entry, sizeof(struct exfat_entry)) < 0)
+ if (exfat_write(dev, &bitmap_entry, sizeof(struct exfat_entry)) < 0)
return 1;
- if (exfat_write(fd, &upcase_entry, sizeof(struct exfat_entry)) < 0)
+ if (exfat_write(dev, &upcase_entry, sizeof(struct exfat_entry)) < 0)
return 1;
sb.rootdir_cluster = cpu_to_le32(OFFSET_TO_CLUSTER(base));
return 0;
off_t rootdir_alignment(void);
off_t rootdir_size(void);
-int rootdir_write(off_t base, int fd);
+int rootdir_write(struct exfat_dev* dev, off_t base);
#endif /* ifndef MKFS_ROOTDIR_H_INCLUDED */
return cpu_to_le32(sum);
}
-int uct_write(off_t base, int fd)
+int uct_write(struct exfat_dev* dev, off_t base)
{
- if (exfat_write(fd, upcase_table, sizeof(upcase_table)) < 0)
+ if (exfat_write(dev, upcase_table, sizeof(upcase_table)) < 0)
return errno;
upcase_entry.checksum = uct_checksum();
upcase_entry.start_cluster = cpu_to_le32(OFFSET_TO_CLUSTER(base));
off_t uct_alignment(void);
off_t uct_size(void);
-int uct_write(off_t base, int fd);
+int uct_write(struct exfat_dev* dev, off_t base);
#endif /* ifndef MKFS_UCT_H_INCLUDED */
return 12 * SECTOR_SIZE(sb);
}
-int vbr_write(off_t base, int fd)
+int vbr_write(struct exfat_dev* dev, off_t base)
{
uint32_t checksum;
le32_t* sector = malloc(SECTOR_SIZE(sb));
if (sector == NULL)
return errno;
- if (exfat_write(fd, &sb, sizeof(struct exfat_super_block)) < 0)
+ if (exfat_write(dev, &sb, sizeof(struct exfat_super_block)) < 0)
{
free(sector);
return errno;
sector[SECTOR_SIZE(sb) / sizeof(sector[0]) - 1] = cpu_to_le32(0xaa550000);
for (i = 0; i < 8; i++)
{
- if (exfat_write(fd, sector, SECTOR_SIZE(sb)) < 0)
+ if (exfat_write(dev, sector, SECTOR_SIZE(sb)) < 0)
{
free(sector);
return errno;
}
memset(sector, 0, SECTOR_SIZE(sb));
- if (exfat_write(fd, sector, SECTOR_SIZE(sb)) < 0)
+ if (exfat_write(dev, sector, SECTOR_SIZE(sb)) < 0)
{
free(sector);
return errno;
}
checksum = exfat_vbr_add_checksum(sector, SECTOR_SIZE(sb), checksum);
- if (exfat_write(fd, sector, SECTOR_SIZE(sb)) < 0)
+ if (exfat_write(dev, sector, SECTOR_SIZE(sb)) < 0)
{
free(sector);
return errno;
for (i = 0; i < SECTOR_SIZE(sb) / sizeof(sector[0]); i++)
sector[i] = cpu_to_le32(checksum);
- if (exfat_write(fd, sector, SECTOR_SIZE(sb)) < 0)
+ if (exfat_write(dev, sector, SECTOR_SIZE(sb)) < 0)
{
free(sector);
return errno;
off_t vbr_alignment(void);
off_t vbr_size(void);
-int vbr_write(off_t base, int fd);
+int vbr_write(struct exfat_dev* dev, off_t base);
#endif /* ifndef MKFS_VBR_H_INCLUDED */