/*
 * An FFS file system is a sequence of cylinder groups.
 *
 * Each cylinder group is laid out as follows:
 *
 *	fs superblock (Fsblk)
 *	cylinder group block (Cgblk)
 *	inodes
 *	data
 *
 * The location of the fs superblock in the first cylinder
 * group is known.  The rest of the info about cylinder group
 * layout can be derived from the super block.
 */

#define daddr_t u32int
#define time_t u32int

typedef struct Cgblk Cgblk;
typedef struct Cylgrp Cylgrp;
typedef struct Cylsum Cylsum;
typedef struct Cylsumtotal Cylsumtotal;
typedef struct Ffs Ffs;
typedef struct Fsblk Fsblk;
typedef struct Inode1 Inode1;
typedef struct Inode Inode;
typedef struct Dirent Dirent;

enum
{
	BYTESPERSEC = 512,

	/* constants for Fsblk */
	FSMAXMNTLEN = 512,
	FSMAXMNTLEN2 = 468,
	FSMAXVOLLEN = 32,				/* UFS2 */
	FSNOCSPTRSLEN = 128-12,
	FSNOCSPTRSLEN2 = 128-16,	/* UFS2 */
	FSMAXSNAP = 20,
	FSMAGIC = 0x011954,
	FSMAGIC2 = 0x19540119,
	FSCHECKSUM = 0x7c269d38,
	
	/* Fsblk.inodefmt */
	FS42INODEFMT = -1,
	FS44INODEFMT = 2,

	/* offset and size of first boot block */
	BBOFF = 0,
	BBSIZE = 8192,

	/* offset and size of first super block */
	SBOFF = BBOFF+BBSIZE,
	SBOFF2 = BBOFF+65536,			/* UFS2 */
	SBOFFPIGGY = BBOFF+262144,		/* UFS2 */
	SBSIZE = 8192,

	/* minimum block size */
	MINBSIZE = 4096,

	/* maximum fragments per block */
	MAXFRAG = 8,

	/* constants for Cgblk */
	CGMAGIC = 0x090255,

	/* inode-related */
	ROOTINODE = 2,
	WHITEOUT = 1,

	NXADDR = 2,	/* UFS2 */
	NDADDR = 12,
	NIADDR = 3,

	/* permissions in Inode.mode */
	IEXEC = 00100,
	IWRITE = 0200,
	IREAD = 0400,
	ISVTX = 01000,
	ISGID = 02000,
	ISUID = 04000,

	/* type in Inode.mode */
	IFMT = 0170000,
	IFIFO = 0010000,
	IFCHR = 0020000,
	IFDIR = 0040000,
	IFBLK = 0060000,
	IFREG = 0100000,
	IFLNK = 0120000,
	IFSOCK = 0140000,
	IFWHT = 0160000,

	/* type in Dirent.type */
	DTUNKNOWN = 0,
	DTFIFO = 1,
	DTCHR = 2,
	DTDIR = 4,
	DTBLK = 6,
	DTREG = 8,
	DTLNK = 10,
	DTSOCK = 12,
	DTWHT = 14,
};

struct Cylsum
{
	u32int	ndir;
	u32int	nbfree;
	u32int	nifree;
	u32int	nffree;
};

struct Cylsumtotal
{
	u64int	ndir;
	u64int	nbfree;
	u64int	nifree;
	u64int	nffree;
	u64int	numclusters;
	u64int	unused[3];
};

/* Fields beginning with underscore are deprecated in UFS2 */
struct Fsblk
{
	u32int	unused0;
	u32int	unused1;
	daddr_t	sfragno;		/* fragment address of super block in file system */
	daddr_t	cfragno;		/* fragment address if cylinder block in file system */
	daddr_t	ifragno;		/* fragment offset of inode blocks in file system */
	daddr_t	dfragno;		/* fragment offset of data blocks in cg */
	u32int	_cgoffset;		/* block (maybe fragment?) offset of Cgblk in cylinder */
	u32int	_cgmask;
	time_t	_time;
	u32int	_nfrag;			/* number of blocks in fs * fragsperblock */
	u32int	_ndfrag;
	u32int	ncg;			/* number of cylinder groups in fs */
	u32int	blocksize;		/* block size in fs */
	u32int	fragsize;		/* frag size in fs */
	u32int	fragsperblock;	/* fragments per block: blocksize / fragsize */
	u32int	minfree;		/* ignored by us */
	u32int	rotdelay;		/* ... */
	u32int	rps;
	u32int	bmask;
	u32int	fmask;
	u32int	bshift;
	u32int	fshift;
	u32int	maxcontig;
	u32int	maxbpg;
	u32int	fragshift;
	u32int	fsbtodbshift;
	u32int	sbsize;			/* size of super block */
	u32int	unused2;		/* more stuff we don't use ... */
	u32int	unused3;
	u32int	nindir;
	u32int	inosperblock;	/* inodes per block */
	u32int	_nspf;
	u32int	optim;
	u32int	_npsect;
	u32int	_interleave;
	u32int	_trackskew;
	u32int	id[2];
	daddr_t	_csaddr;		/* blk addr of cyl grp summary area */
	u32int	cssize;			/* size of cyl grp summary area */
	u32int	cgsize;			/* cylinder group size */
	u32int	_trackspercyl;	/* tracks per cylinder */
	u32int	_secspertrack;	/* sectors per track */
	u32int	_secspercyl;	/* sectors per cylinder */
	u32int	_ncyl;			/* cylinders in fs */
	u32int	_cylspergroup;	/* cylinders per group */
	u32int	inospergroup;	/* inodes per group */
	u32int	fragspergroup;	/* data blocks per group * fragperblock */
	Cylsum	_cstotal;		/* more unused... */
	u8int	fmod;
	u8int	clean;
	u8int	ronly;
	u8int	_flags;
	/* char fsmnt[512]; in UFS1 */
		char	fsmnt[FSMAXMNTLEN2];
		char	volname[FSMAXVOLLEN];
		u64int	swuid;
		u32int	pad;
	u32int	cgrotor;
	uchar	ocsp[FSNOCSPTRSLEN]; /* last 4 bytes is contigdirs in UFS2 */
	u32int	contigdirs;		/* csp in UFS2 */
	u32int	csp;			/* maxcluster in UFS2 */
	u32int	maxcluster;		/* active in UFS2 */
	u32int	_cpc;
	/* u16int	opostbl[16][8]; in UFS1 */
		u32int	maxbsize;
		u64int	spare64[17];
		u64int	sblockloc;
		Cylsumtotal	cstotal;
		u64int	time;
		u64int	nfrag;
		u64int	ndfrag;
		u64int	csaddr;
		u64int	pendingblocks;
		u32int	pendinginodes;
	u32int	snapinum[FSMAXSNAP];
	u32int	avgfilesize;
	u32int	avgfpdir;
	/* u32int sparecon[26], pendingblocks, pendinginodes; in UFS1 */
		u32int	savecgsize;
		u32int	sparecon[26];
		u32int	flags;
	u32int	contigsumsize;
	u32int	maxsymlinklen;
	u32int	_inodefmt;		/* format of on-disk inodes */
	u64int	maxfilesize;	/* maximum representable file size */
	u64int	qbmask;
	u64int	qfmask;
	u32int	state;
	u32int	_postblformat;
	u32int	_nrpos;
	u32int	_postbloff;
	u32int	_rotbloff;
	u32int	magic;			/* FSMAGIC or FSMAGIC2 */
};

/*
 * Cylinder group block for a file system.
 */
struct Cgblk
{
	u32int	unused0;
	u32int	magic;			/* CGMAGIC */
	u32int	time;			/* time last written */
	u32int	num;			/* we are cg #cgnum */
	u16int	ncyl;			/* number of cylinders in gp */
	u16int	nino;			/* number of inodes */
	u32int	nfrag;			/* number of fragments  */
	Cylsum	csum;
	u32int	rotor;
	u32int	frotor;
	u32int	irotor;
	u32int	frsum[MAXFRAG];	/* counts of available frags */
	u32int	btotoff;
	u32int	boff;
	u32int	imapoff;		/* offset to used inode map */
	u32int	fmapoff;		/* offset to free fragment map */
	u32int	nextfrag;		/* next free fragment */
	u32int	csumoff;
	u32int	clusteroff;
	u32int	ncluster;
	u32int	sparecon[13];
};

struct Cylgrp
{
	/* these are block numbers not fragment numbers */
	u64int	bno;			/* disk block address of start of cg */
	u64int	ibno;			/* disk block address of first inode */
	u64int	dbno;			/* disk block address of first data */
	u64int	cgblkno;
};

/*
 * this is the on-disk structure
 */
struct Inode1
{
	u16int	mode;
	u16int	nlink;
	u32int	unused;
	u64int	size;
	u32int	atime;
	u32int	atimensec;
	u32int	mtime;
	u32int	mtimensec;
	u32int	ctime;
	u32int	ctimensec;
	/* rdev is db[0] */
	u32int	db[NDADDR];
	u32int	ib[NIADDR];
	u32int	flags;
	u32int	nblock;
	u32int	gen;
	u32int	uid;
	u32int	gid;
	u32int	spare[2];
};

struct Inode
{
	u16int	mode;
	u16int	nlink;
	u32int	uid;
	u32int	gid;
	u32int	blksize;
	u64int	size;
	u64int	nblock;
	u64int	atime;
	u64int	mtime;
	u64int	ctime;
	u64int	btime;
	u32int	atimensec;
	u32int	mtimensec;
	u32int	ctimensec;
	u32int	btimensec;
	u32int	gen;
	u32int	kernflags;
	u32int	flags;
	u32int	extsize;
	u64int	ext[NXADDR];
	u64int	db[NDADDR];
	u64int	ib[NIADDR];
	u64int	spare[3];
};

struct Dirent
{
	u32int	ino;
	u16int	reclen;
	u8int	type;
	u8int	namlen;
	char		name[1];
};

/*
 * main file system structure
 */
struct Ffs
{
	int		ufs;
	int		blocksize;
	u64int	nblock;
	int		fragsize;
	int		fragsperblock;
	int		inosperblock;
	u64int	blockspergroup;
	u64int	fragspergroup;
	int		inospergroup;

	u64int	nfrag;
	u64int	ndfrag;

	int		ncg;
	Cylgrp	*cg;

	Disk		*disk;
};

