typedef struct Dosboot Dosboot;
typedef struct Dosboot32 Dosboot32;
typedef struct Dosbpb Dosbpb;
typedef struct Dosdir Dosdir;
typedef struct Dospart Dospart;
typedef struct Dosptr Dosptr;
typedef struct Fatinfo Fatinfo;
typedef struct Xfs Xfs;
typedef struct Xfile Xfile;
struct Dospart{
uchar active;
uchar hstart;
uchar cylstart[2];
uchar type;
uchar hend;
uchar cylend[2];
uchar start[4];
uchar length[4];
};
enum
{
/*
* dos partition types
*/
FAT12 = 0x01,
FAT16 = 0x04, /* partitions smaller than 32MB */
FATHUGE = 0x06, /* fat16 partitions larger than 32MB */
FAT32 = 0x0b,
FAT32X = 0x0c,
FATHUGEX = 0x0e,
DMDDO = 0x54,
FATRESRV = 2, /* number of reserved fat entries */
};
/*
* dos boot sector, the start of every dos partition
*/
struct Dosboot{
uchar magic[3];
uchar version[8];
uchar sectsize[2];
uchar clustsize;
uchar nresrv[2];
uchar nfats;
uchar rootsize[2];
uchar volsize[2];
uchar mediadesc;
uchar fatsize[2];
uchar trksize[2];
uchar nheads[2];
uchar nhidden[4];
uchar bigvolsize[4]; /* same as Dosboot32 up to here */
uchar driveno;
uchar reserved0;
uchar bootsig;
uchar volid[4];
uchar label[11];
uchar reserved1[8];
};
/*
* dos boot sector for FAT32
*/
enum
{
NOFATMIRROR = 0x0080, /* masks for extflags */
ACTFATMASK = 0x000f,
};
struct Dosboot32{
uchar magic[3];
uchar version[8];
uchar sectsize[2];
uchar clustsize;
uchar nresrv[2];
uchar nfats;
uchar rootsize[2];
uchar volsize[2];
uchar mediadesc;
uchar fatsize[2];
uchar trksize[2];
uchar nheads[2];
uchar nhidden[4];
uchar bigvolsize[4]; /* same as Dosboot up to here */
uchar fatsize32[4]; /* sectors per fat */
uchar extflags[2]; /* active fat flags */
uchar version1[2]; /* fat32 version; major & minor bytes */
uchar rootstart[4]; /* starting cluster of root dir */
uchar infospec[2]; /* fat allocation info sector */
uchar backupboot[2]; /* backup boot sector */
uchar reserved[12];
};
/*
* optional FAT32 info sector
*/
enum
{
FATINFOSIG1 = 0x41615252UL,
FATINFOSIG = 0x61417272UL,
};
struct Fatinfo
{
uchar sig1[4];
uchar pad[480];
uchar sig[4];
uchar freeclust[4]; /* num frre clusters; -1 is unknown */
uchar nextfree[4]; /* most recently allocated cluster */
uchar resrv[4*3];
};
/*
* BIOS paramater block
*/
struct Dosbpb{
MLock; /* access to fat */
int sectsize; /* in bytes */
int clustsize; /* in sectors */
int nresrv; /* sectors */
int nfats; /* usually 2; modified to 1 if fat mirroring disabled */
int rootsize; /* number of entries, for fat12 and fat16 */
long volsize; /* in sectors */
int mediadesc;
long fatsize; /* in sectors */
int fatclusters;
int fatbits; /* 12, 16, or 32 */
long fataddr; /* sector number of first valid fat entry */
long rootaddr; /* for fat16 or fat12, sector of root dir */
long rootstart; /* for fat32, cluster of root dir */
long dataaddr; /* initial sector of data clusters */
long freeptr; /* next free cluster candidate */
long freeclusters; /* count of free clusters, for fat32 */
int fatinfo; /* fat info sector location; 0 => none */
};
enum
{
DOSDIRSIZE = 32,
DOSEMPTY = 0xe5, /* first char in name if entry is unused */
DOSRUNE = 13, /* runes per dosdir in a long file name */
DOSNAMELEN = 261 /* max dos file name length */
};
struct Dosdir{
uchar name[8];
uchar ext[3];
uchar attr;
uchar reserved[1];
uchar ctime[3]; /* creation time */
uchar cdate[2]; /* creation date */
uchar adate[2]; /* last access date */
uchar hstart[2]; /* high bits of start for fat32 */
uchar time[2]; /* last modified time */
uchar date[2]; /* last modified date */
uchar start[2];
uchar length[4];
};
enum
{
DRONLY = 0x01,
DHIDDEN = 0x02,
DSYSTEM = 0x04,
DVLABEL = 0x08,
DDIR = 0x10,
DARCH = 0x20,
};
#define GSHORT(p) (((p)[0])|(p)[1]<<8)
#define GLONG(p) (((long)(p)[0])|(p)[1]<<8|(p)[2]<<16|(p)[3]<<24)
#define PSHORT(p,v) ((p)[0]=(v),(p)[1]=(v)>>8)
#define PLONG(p,v) ((p)[0]=(v),(p)[1]=(v)>>8,(p)[2]=(v)>>16,(p)[3]=(v)>>24)
struct Dosptr{
ulong addr; /* sector & entry within of file's directory entry */
ulong offset;
ulong paddr; /* of parent's directory entry */
ulong poffset;
ulong iclust; /* ordinal within file */
ulong clust;
ulong naddr; /* next block in directory (for writing multi entry elements) */
ulong prevaddr;
Iosect *p;
Dosdir *d;
};
#define QIDPATH(p) ((p)->addr*(Sectorsize/DOSDIRSIZE) + \
(p)->offset/DOSDIRSIZE)
struct Xfs{
Xfs *next;
int omode; /* of file containing external fs */
char *name; /* of file containing external f.s. */
Qid qid; /* of file containing external f.s. */
long ref; /* attach count */
Qid rootqid; /* of plan9 constructed root directory */
uchar isfat32; /* is a fat 32 file system? */
short dev;
short fmt;
long offset;
void *ptr;
};
struct Xfile{
Xfile *next; /* in hash bucket */
long fid;
ulong flags;
Qid qid;
Xfs *xf;
Dosptr *ptr;
};
enum{
Asis, Clean, Clunk
};
enum{
Invalid, Short, ShortLower, Long
};
enum{ /* Xfile flags */
Oread = 1,
Owrite = 2,
Orclose = 4,
Omodes = 3,
};
enum{
Enevermind,
Eformat,
Eio,
Enoauth,
Enomem,
Enonexist,
Eperm,
Enofilsys,
Eauth,
Econtig,
Ebadfcall,
Ebadstat,
Eversion,
Etoolong,
Eerrstr,
ESIZE
};
extern int chatty;
extern int errno;
extern int readonly;
extern char *deffile;
extern int trspaces;
|