/*      Copyright (c) 1985 AT&T */
/*        All Rights Reserved   */

/*      THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF AT&T     */
/*      The copyright notice above does not evidence any        */
/*      actual or intended publication of such source code.     */

/* @(#)inode.h	1.5 */
/*
 * The I node is the focus of all
 * file activity in unix. There is a unique
 * inode allocated for each active file,
 * each current directory, each mounted-on
 * file, text file, and the root. An inode is 'named'
 * by its dev/inumber pair. (iget/iget.c)
 * Data, from mode on, is read in
 * from permanent inode on volume.
 */

#define	NADDR	13
#define	NSADDR	(NADDR*sizeof(daddr_t)/sizeof(short))

struct iirem {		/* dsa */
	faddr_t	 i_vcid;	/* location of remote file */  /*UNIX*/
	faddr_t  i_pte_p;	/* ??? */		       /*UNIX*/
	int	 i_typ;		/* type of remote file */
	int 	 i_fid;		/* id of remote file   */
	int	 i_bid;		/* bind id of remote file */
	int	 i_tid;		/* tree connect id  */
	char	 (*i_gchar)();	/* function passed to nfc_nami */
	faddr_t	 i_path;	/* path name */
	int	 i_res1;
	int	 i_res2;
	union {
		long	 i_remlong[4];
  		int	 i_remshort[8];
	} i_remres_un;
};


struct	inode
{
	struct inode *i_forw;	/* hash chain forw */
	struct inode *i_back;	/* hash chain back */
	struct inode *av_forw;	/* free chain forw */
	struct inode *av_back;	/* free chain back */
	char	i_flag;
	cnt_t	i_count;	/* reference count */
	dev_t	i_dev;		/* device where inode resides */
	ino_t	i_number;	/* i number, 1-to-1 with device address */
	ushort	i_mode;
	short	i_nlink;	/* directory entries */
	ushort	i_uid;		/* owner */
	ushort	i_gid;		/* group of owner */
	off_t	i_size;		/* size of file */
	union {
	    struct {
		union {
			daddr_t i_a[NADDR];	/* if normal file/directory */
			short	i_f[NSADDR];	/* if fifo's */
		} i_p;
		daddr_t	i_l;		/* last logical block read (for read-ahead) */
	    } i_blks;
	    struct {					/*XNET*/
		long i_type;					
		union {
			struct iirem i_rem;
		} i_ndata;
	    } i_namef;
	} i_fdep
};


extern struct inode inode[];	/* The inode table itself */

/* flags */
#define	ILOCK	01		/* inode is locked */
#define	IUPD	02		/* file has been modified */
#define	IACC	04		/* inode access time to be updated */
#define	IMOUNT	010		/* inode is mounted on */
#define	IWANT	020		/* some process waiting on lock */
#define	ITEXT	040		/* inode is pure text prototype */
#define	ICHG	0100		/* inode has been changed */
#define	ISYN	0200		/* do synchronous write for iupdate */

/* modes */
#define	IFMT	0170000		/* type of file */
#define		IFDIR	0040000	/* directory */
#define		IFCHR	0020000	/* character special */
#define		IFBLK	0060000	/* block special */
#define		IFREG	0100000	/* regular */
#define		IFMPC	0030000	/* multiplexed char special */
#define		IFMPB	0070000	/* multiplexed block special */
#define		IFIFO	0010000	/* fifo special */
#define		IFNAM   0050000 /* name special */		/*XNET*/
#define	ISUID	04000		/* set user id on execution */
#define	ISGID	02000		/* set group id on execution */
#define ISVTX	01000		/* save swapped text even after use */
#define	IREAD	0400		/* read, write, execute permissions */
#define	IWRITE	0200
#define	IEXEC	0100

#define	i_addr	i_fdep.i_blks.i_p.i_a
#define	i_lastr	i_fdep.i_blks.i_l
#define	i_rdev	i_fdep.i_blks.i_p.i_a[0]

#define	i_faddr	i_fdep.i_blks.i_p.i_a
#define	NFADDR	10
#define	PIPSIZ	NFADDR*LBLOCK
#define	i_frptr	i_fdep.i_blks.i_p.i_f[NSADDR-5]
#define	i_fwptr	i_fdep.i_blks.i_p.i_f[NSADDR-4]
#define	i_frcnt	i_fdep.i_blks.i_p.i_f[NSADDR-3]
#define	i_fwcnt	i_fdep.i_blks.i_p.i_f[NSADDR-2]
#define	i_fflag	i_fdep.i_blks.i_p.i_f[NSADDR-1]
#define	IFIR	01
#define	IFIW	02

/* types for IFNAM type files */

#define IFREM	3L	/*remote inode*/

