X-Git-Url: https://git.sven.stormbind.net/?a=blobdiff_plain;f=include%2Flibexfat.h;h=fecd7f23719bebd3d0db5650eed5cc533c70afc2;hb=refs%2Fheads%2Fmaster;hp=062350135b76a85ff71103ceaccc702291ac128c;hpb=f542bb61a7ee5c41095242cf7b9b499fa014d316;p=sven%2Fexfatprogs.git diff --git a/include/libexfat.h b/include/libexfat.h index 0623501..2ed9aa7 100644 --- a/include/libexfat.h +++ b/include/libexfat.h @@ -45,6 +45,8 @@ typedef __u32 clus_t; #define EXFAT_SET_VOLUME_LABEL 0x02 #define EXFAT_GET_VOLUME_SERIAL 0x03 #define EXFAT_SET_VOLUME_SERIAL 0x04 +#define EXFAT_GET_VOLUME_GUID 0x05 +#define EXFAT_SET_VOLUME_GUID 0x06 #define EXFAT_MAX_SECTOR_SIZE 4096 @@ -52,6 +54,8 @@ typedef __u32 clus_t; (pbr)->bsx.sect_per_clus_bits)) #define EXFAT_SECTOR_SIZE(pbr) (1 << (pbr)->bsx.sect_size_bits) +#define EXFAT_MAX_HASH_COUNT (UINT16_MAX + 1) + enum { BOOT_SEC_IDX = 0, EXBOOT_SEC_IDX, @@ -76,6 +80,7 @@ struct exfat_blk_dev { struct exfat_user_input { char dev_name[255]; bool writeable; + unsigned int sector_size; unsigned int cluster_size; unsigned int sec_per_clu; unsigned int boundary_align; @@ -84,6 +89,7 @@ struct exfat_user_input { __u16 volume_label[VOLUME_LABEL_MAX_LEN]; int volume_label_len; unsigned int volume_serial; + const char *guid; }; struct exfat; @@ -102,18 +108,27 @@ typedef __u32 bitmap_t; #define EXFAT_BITMAP_SIZE(__c_count) \ (DIV_ROUND_UP(__c_count, BITS_PER) * sizeof(bitmap_t)) +#define BITMAP_GET(bmap, bit) \ + (((bitmap_t *)(bmap))[BIT_ENTRY(bit)] & BIT_MASK(bit)) + +#define BITMAP_SET(bmap, bit) \ + (((bitmap_t *)(bmap))[BIT_ENTRY(bit)] |= BIT_MASK(bit)) + +#define BITMAP_CLEAR(bmap, bit) \ + (((bitmap_t *)(bmap))[BIT_ENTRY(bit)] &= ~BIT_MASK(bit)) + static inline bool exfat_bitmap_get(char *bmap, clus_t c) { clus_t cc = c - EXFAT_FIRST_CLUSTER; - return ((bitmap_t *)(bmap))[BIT_ENTRY(cc)] & BIT_MASK(cc); + return BITMAP_GET(bmap, cc); } static inline void exfat_bitmap_set(char *bmap, clus_t c) { clus_t cc = c - EXFAT_FIRST_CLUSTER; - (((bitmap_t *)(bmap))[BIT_ENTRY(cc)] |= BIT_MASK(cc)); + BITMAP_SET(bmap, cc); } static inline void exfat_bitmap_clear(char *bmap, clus_t c) @@ -139,6 +154,7 @@ int exfat_get_blk_dev_info(struct exfat_user_input *ui, struct exfat_blk_dev *bd); ssize_t exfat_read(int fd, void *buf, size_t size, off_t offset); ssize_t exfat_write(int fd, void *buf, size_t size, off_t offset); +ssize_t exfat_write_zero(int fd, size_t size, off_t offset); size_t exfat_utf16_len(const __le16 *str, size_t max_size); ssize_t exfat_utf16_enc(const char *in_str, __u16 *out_str, size_t out_size); @@ -147,6 +163,9 @@ ssize_t exfat_utf16_dec(const __u16 *in_str, size_t in_len, off_t exfat_get_root_entry_offset(struct exfat_blk_dev *bd); int exfat_read_volume_label(struct exfat *exfat); int exfat_set_volume_label(struct exfat *exfat, char *label_input); +int __exfat_set_volume_guid(struct exfat_dentry *dentry, const char *guid); +int exfat_read_volume_guid(struct exfat *exfat); +int exfat_set_volume_guid(struct exfat *exfat, const char *guid); int exfat_read_sector(struct exfat_blk_dev *bd, void *buf, unsigned int sec_off); int exfat_write_sector(struct exfat_blk_dev *bd, void *buf, @@ -170,6 +189,7 @@ int exfat_o2c(struct exfat *exfat, off_t device_offset, bool exfat_heap_clus(struct exfat *exfat, clus_t clus); int exfat_root_clus_count(struct exfat *exfat); int read_boot_sect(struct exfat_blk_dev *bdev, struct pbr **bs); +int exfat_parse_ulong(const char *s, unsigned long *out); /* * Exfat Print