/*
 *	$Source: /afs/athena.mit.edu/contrib/watchmaker/src/ofiles/RCS/ofiles.h,v $
 *	$Author: tytso $
 *	$Header: /afs/athena.mit.edu/contrib/watchmaker/src/ofiles/RCS/ofiles.h,v 1.2 92/08/18 16:11:27 tytso Exp Locker: tytso $
 */

#include <sys/param.h>
#include <sys/dir.h>
#include <sys/user.h>
#ifndef sparc
#include <sys/text.h>
#endif
#ifdef sequent
# define KERNEL
# include <sys/file.h>
# include <sys/vnode.h>
# include <sys/vfs.h>
# include <sys/inode.h>
# include <rpc/types.h>
# include <nfs/nfs.h>
# include <netinet/in.h>
# include <nfs/nfs_clnt.h>
# include <nfs/rnode.h>
# undef KERNEL
#else /* sequent */
# define KERNEL
# include <sys/file.h>
# undef KERNEL
#ifdef ultrix
# include <rpc/types.h>
# include <nfs/nfs.h>
# include <nfs/vnode.h>
# include <netinet/in.h>
# include <nfs/nfs_clnt.h>
# include <nfs/vfs.h>
# include <sys/inode.h>
#else
# include <sys/vnode.h>
# include <sys/vfs.h>
# include <ufs/inode.h>
#endif
#ifndef ultrix
# include <rpc/types.h>
# include <nfs/nfs.h>
# include <netinet/in.h>
# include <nfs/nfs_clnt.h>
# include <nfs/rnode.h>
#endif
#endif /* sequent */
#include <sys/socketvar.h>
#include <sys/socket.h>
#include <net/route.h>
#include <netinet/in_pcb.h>
#include <sys/protosw.h>
#include <netdb.h>
#include <machine/pte.h>
#include <sys/vmmac.h>
#include <sys/proc.h>
#include <nlist.h>
#include <sys/stat.h>
#include <strings.h>
#include <stdio.h>
#ifdef ultrix
#include <sys/mount.h>
#else
#include <mntent.h>
#endif
#include <pwd.h>

#define printff (void) printf
#define fprintff (void) fprintf
#define sprintff (void) sprintf
#ifdef ultrix
#define mntent fs_data
#define mnt_dir fd_path
#define mnt_fsname fd_devname
#define x_vptr x_gptr
#define DTYPE_VNODE DTYPE_INODE
#define i_dev g_dev
#define i_number g_number
#define i_mode g_mode
#define unp_vnode unp_inode
#endif

union fileid
{
    struct
    {
	long            fsid;
	long            nodeid;
    }               file;
    struct
    {
	dev_t           dev;
	enum vtype      type;
    }               special;
};

#define OFILE	0x1
#define CDIR	0x2
#define RDIR	0x4
#define TEXT	0x8

/*
 * File descriptors.
 */

extern int             mem;			/* fd for /dev/mem */
extern int             kmem;			/* fd for /dev/kmem */
extern int             swap;			/* fd for /dev/drum */

#ifndef ultrix
extern FILE           *mtab;			/* stdio file for /etc/mtab */
#endif

/*
 * Kernel tables.
 */

#ifdef sequent
# define UNIX "/dynix"
#else
# define UNIX "/vmunix"
#endif

/* WARNING!  This is dependant on the definition of nl[] in kutils.c! */
#define X_PROC		0
#define X_NPROC		1
#define X_USRPTMA	2
#define X_USRPT		3

extern struct nlist    nl[];
extern long            procbase;  	/* address of process table */
extern int             nproc;		/* number of entries in proc table */
extern struct pte     *Usrptma,		/* user page table map */
               *usrpt;			/* user page table  */

extern int             inodes[NOFILE];		/* inodes of open files */

int             eseek ();
int             eread ();
char           *vtype ();
char           *itype ();
char           *rtype ();
struct mntent  *getmntname ();
struct mntent  *getmntfile ();
union fileid   *getfileid ();
struct user    *getuser ();

/*
 * Program options.
 */

extern char           *progname;
extern int             terse;	/* if non-zero, only output pids */
extern int             debug;	/* set debugging output level */
extern int             filesonly;	/* match args as files, not mntents */
extern int             inode;	/* if non-zero, inode to match */

extern int errno;
#define error(m) \
(fprintf(stderr,"%s: ",progname), errno ? perror(m) : 0)
#define fail(m) \
(fprintf(stderr,"%s: ",progname), errno ? perror(m) : 0, exit(1))

#define istype(mode,type)	(((mode) & S_IFMT) == (type))
#define ispecial(mode)	(istype ((mode), S_IFBLK) || istype ((mode), S_IFCHR))

#define vspecial(vtype)	((vtype) == VCHR || (vtype) == VBLK)

#define nfsdev(rdev)	(major (rdev) == 0xff)

