fk98/src/dosfs.h
snow flurry 50f3806f15 dosfs: get_byte_offset requires an unsigned offset
No reason for it to be negative, and gcc -Wextra complains when
it's signed.
2020-11-16 20:30:41 -08:00

86 lines
2.1 KiB
C

/* fat12 */
#ifndef _FAT12_H
#define _FAT12_H
struct __attribute__((__packed__)) bpb {
uint8_t jmp[3]; /* presumably some machine code */
char oem_id[8];
uint16_t sect_size;
uint8_t sect_per_cluster;
uint16_t resv_sect;
uint8_t fat_ct;
uint16_t dirent_ct;
uint16_t sect_ct;
uint8_t media_type;
uint16_t fat_size;
uint16_t track_size;
uint16_t heads;
uint32_t hidden_sect;
uint32_t larg_sect_ct;
/*
* XXX: Most PC98 disks don't seem to have the extended
* BPB. Should we even care about these?
*/
uint8_t drive_num;
uint8_t _reserved;
uint8_t signature;
uint32_t serial_num;
char label[11];
char sys_id[8];
};
struct __attribute__((__packed__)) dos_dirent {
char filename[11];
uint8_t attributes;
#define ATTR_READONLY 0x01
#define ATTR_HIDDEN 0x02
#define ATTR_SYSTEM 0x04
#define ATTR_VOLID 0x08
#define ATTR_ISDIR 0x10
#define ATTR_ARCHIVE 0x20
#define ATTR_LFN (ATTR_READONLY|ATTR_HIDDEN|ATTR_SYSTEM|ATTR_VOLID)
uint8_t _reserved;
uint8_t creation_time_tenths;
uint16_t creation_time;
uint16_t creation_date;
uint16_t access_date;
uint16_t high_loc; /* only used with FAT32 */
uint16_t mod_time;
uint16_t mod_date;
uint16_t low_loc; /* entry cluster location */
uint32_t size;
};
#define FAT12_MAX_CLUSTERS 4085
#define FAT16_MAX_CLUSTERS 65525
typedef struct dosfs_t {
struct bpb ib;
unsigned int fs_ver;
int ifd;
unsigned int root_loc;
unsigned int root_size;
unsigned int data_loc;
unsigned int data_size;
} dosfs_t;
typedef struct dosfile_t {
struct dos_dirent ent;
char fname[9];
char fext[4];
unsigned int *fat_chain;
int fc_len;
struct dosfile_t *next;
} dosfile_t;
int open_image(const char *, int, dosfs_t *);
void close_image(dosfs_t *);
dosfile_t *dos_listdir(dosfs_t *, unsigned int);
void dos_freedir(dosfile_t *);
int get_byte_offset(dosfs_t *, dosfile_t *, unsigned int);
#endif /* !_FAT12_H */