/*
 * dlsof.h - Darwin header file for /dev/kmem-based lsof
 */


/*
 * Copyright 1994 Purdue Research Foundation, West Lafayette, Indiana
 * 47907.  All rights reserved.
 *
 * Written by Victor A. Abell
 *
 * This software is not subject to any license of the American Telephone
 * and Telegraph Company or the Regents of the University of California.
 *
 * Permission is granted to anyone to use this software for any purpose on
 * any computer system, and to alter it and redistribute it freely, subject
 * to the following restrictions:
 *
 * 1. Neither the authors nor Purdue University are responsible for any
 *    consequences of the use of this software.
 *
 * 2. The origin of this software must not be misrepresented, either by
 *    explicit claim or by omission.  Credit to the authors and Purdue
 *    University must appear in documentation and sources.
 *
 * 3. Altered versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 4. This notice may not be removed or altered.
 */


/*
 * $Id: dlsof.h,v 1.11 2005/11/01 20:24:51 abe Exp $
 */


#if	!defined(DARWIN_LSOF_H)
#define	DARWIN_LSOF_H	1

#include <stdlib.h>
#include <dirent.h>
#include <nlist.h>
#include <setjmp.h>
#include <string.h>
#include <unistd.h>
#include <sys/conf.h>
#include <sys/filedesc.h>
#include <sys/ucred.h>

#if	DARWINV<800
#include <sys/mount.h>
#define	m_stat	mnt_stat
#else	/* DARWINV>=800 */
#include <sys/mount_internal.h>
#define	m_stat	mnt_vfsstat
#endif	/* DARWINV>=800 */

#if	DARWINV<800
#include <sys/uio.h>
#include <sys/vnode.h>
#else	/* DARWINV>=800 */
#include <sys/vnode.h>
#define	_SYS_SYSTM_H_
struct nameidata { int dummy; };	/* to satisfy function  prototypes */
#include <sys/vnode_internal.h>
#endif	/* DARWINV>=800 */

#include <rpc/types.h>
#define	KERNEL_PRIVATE
#include <sys/socketvar.h>
#undef	KERNEL_PRIVATE
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/unpcb.h>

# if	defined(AF_NDRV)
#include <net/if_var.h>
#define	KERNEL
#include <sys/kern_event.h>
#undef	KERNEL
#include <net/ndrv.h>
#  if	DARWINV>=530
#define	KERNEL        1
#include <net/ndrv_var.h>
#undef  KERNEL
#  endif	/* DARWINV>=530 */
# endif	/* defined(AF_NDRV) */

# if	defined(AF_SYSTEM)
#include <sys/queue.h>
#define	KERNEL
#include <sys/kern_event.h>
#undef	KERNEL
# endif	/* defined(AF_SYSTEM) */

#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <net/route.h>
#include <netinet6/ipsec.h>
#include <netinet/in_pcb.h>
#include <netinet/ip_var.h>
#include <netinet/tcp.h>
#include <netinet/tcpip.h>
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h>
#include <netinet/tcp_var.h>
#include <arpa/inet.h>
#include <net/raw_cb.h>
#include <sys/domain.h>
#define	pmap	RPC_pmap
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
#undef	pmap

#include <sys/quota.h>
#include <sys/event.h>

# if	DARWINV<800
#include <paths.h>
#undef	MAXNAMLEN
#include <ufs/ufs/quota.h>
#include <paths.h>
#include <ufs/ufs/quota.h>
#include <ufs/ufs/inode.h>
#include <nfs/rpcv2.h>
#include <nfs/nfs.h>
#include <nfs/nfsproto.h>
#include <nfs/nfsnode.h>

#  if	DARWINV<600
#include <hfs/hfs.h>
#undef	offsetof
# else	/* DARWINV>=600 */
#define	KERNEL
#include <hfs/hfs_cnode.h>
#undef	KERNEL
#  endif        /* DARWINV<600 */
# endif	/* DARWINV<800 */

# if	DARWINV<800
#define	time	t1		/* hack to make dn_times() happy */
#include <miscfs/devfs/devfsdefs.h>
#undef	time
# endif	/* DARWINV<800 */

# if	DARWINV<800
#define	KERNEL
#include <miscfs/fdesc/fdesc.h>
#undef	KERNEL
# endif	/* DARWINV<800 */

# if	DARWINV<800
#include <sys/proc.h>
# else	/* DARWINV>=800 */
#define	PROC_DEF_ENABLED
#define	sleep	kernel_sleep
#include <sys/proc_internal.h>
#undef	sleep
# endif	/* DARWINV<800 */

#include <kvm.h>
#undef	TRUE
#undef	FALSE

# if	DARWINV<800
#include <sys/sysctl.h>
# else	/* DARWINV>=800 */
#include "/usr/include/sys/sysctl.h"
# endif	/* DARWINV<800 */

# if	DARWINV<800
#define	KERNEL
#include <sys/fcntl.h>
#include <sys/file.h>
#undef	KERNEL
# else	/* DARWINV>=800 */
#include <sys/fcntl.h>
#include <sys/file_internal.h>
# endif	/* DARWINV<800 */

# if	defined(HASKQUEUE)
#include <sys/eventvar.h>
# endif	/* defined(HASKQUEUE) */

# if	defined(DTYPE_PSXSEM)
#define	HASPSXSEM				/* has the POSIX semaphore file
						 * type */
# endif	/* defined(DTYPE_PSXSEM) */

# if	defined(DTYPE_PSXSHM)
#define	HASPSXSHM				/* has the POSIX shared memory
						 * file type */
# endif	/* defined(DTYPE_PSXSHM) */

struct vop_advlock_args { int dummy; };	/* to satisfy lf_advlock() prototype */
#include <sys/lockf.h>
#include <sys/lock.h>

/*
 * Compensate for removal of MAP_ENTRY_IS_A_MAP from <vm/vm_map.h>,
 *  This work-around was supplied by John Polstra <jdp@polstra.com>.
 */

# if	defined(MAP_ENTRY_IS_SUB_MAP) && !defined(MAP_ENTRY_IS_A_MAP)
#define	MAP_ENTRY_IS_A_MAP	0
# endif	/* defined(MAP_ENTRY_IS_SUB_MAP) && !defined(MAP_ENTRY_IS_A_MAP) */

#undef	B_NEEDCOMMIT
#include <sys/buf.h>
#include <sys/signal.h>
#define	user_sigaltstack	sigaltstack
#include <sys/user.h>

#define	COMP_P		const void
#define	DEVINCR		1024	/* device table malloc() increment */
#define	DIRTYPE		dirent	/* directory entry type */

typedef	u_long		KA_T;

#define	KMEM		"/dev/kmem"
#define	LOGINML		MAXLOGNAME
#define	MALLOC_P	void
#define	FREE_P		MALLOC_P
#define	MALLOC_S	size_t

#define	N_UNIX	"/mach_kernel"

#define	QSORT_P		void
#define	READLEN_T	int
#define	STRNCPY_L	size_t
#define	SWAP		"/dev/drum"

# if	DARWINV>=800
#define	SZOFFTYPE	unsigned long long
					/* size and offset internal storage
					 * type */
#define	SZOFFPSPEC	"ll"		/* SZOFFTYPE printf specification
					 * modifier */
# endif	/* DARWINV>=800 */


/*
 * Global storage definitions (including their structure definitions)
 */

struct file * Cfp;

extern int Kd;				/* KMEM descriptor */
extern KA_T Kpa;

struct l_vfs {
	KA_T addr;			/* kernel address */
	fsid_t	fsid;			/* file system ID */

# if	defined(MOUNT_NONE)
	short type;			/* type of file system */
# else	/* !defined(MOUNT_NONE) */
	char *typnm;			/* file system type name */
# endif	/* defined(MOUNT_NONE) */

	char *dir;			/* mounted directory */
	char *fsname;			/* file system name */
	struct l_vfs *next;		/* forward link */
};
extern struct l_vfs *Lvfs;

struct mounts {
        char *dir;              	/* directory (mounted on) */
	char *fsname;           	/* file system
					 * (symbolic links unresolved) */
	char *fsnmres;           	/* file system
					 * (symbolic links resolved) */
        dev_t dev;              	/* directory st_dev */
	dev_t rdev;			/* directory st_rdev */
	INODETYPE inode;		/* directory st_ino */
	mode_t mode;			/* directory st_mode */
	mode_t fs_mode;			/* file system st_mode */
        struct mounts *next;    	/* forward link */
};

#define	X_NCACHE	"ncache"
#define	X_NCSIZE	"ncsize"
#define	NL_NAME		n_name

struct sfile {
	char *aname;			/* argument file name */
	char *name;			/* file name (after readlink()) */
	char *devnm;			/* device name (optional) */
	dev_t dev;			/* device */
	dev_t rdev;			/* raw device */
	u_short mode;			/* S_IFMT mode bits from stat() */
	int type;			/* file type: 0 = file system
				 	 *	      1 = regular file */
	INODETYPE i;			/* inode number */
	int f;				/* file found flag */
	struct sfile *next;		/* forward link */

};

#define	XDR_VOID	(const xdrproc_t)xdr_void
#define	XDR_PMAPLIST	(const xdrproc_t)xdr_pmaplist


/*
 * Definitions for rnmh.c
 */

# if     defined(HASNCACHE)
#include <sys/uio.h>
#include <sys/namei.h>

#  if	!defined(offsetof)
#define	offsetof(type, member)	((size_t)(&((type *)0)->member))
#  endif	/* !defined(offsetof) */

#define	NCACHE		namecache	/* kernel's structure name */

#define	NCACHE_NM	nc_name		/* name in NCACHE */

#  if	DARWINV<700
#define	NCACHE_NMLEN	nc_nlen		/* name length in NCACHE */
#  endif	/* DARWINV<700 */

#define	NCACHE_NXT	nc_hash.le_next	/* link in NCACHE */
#define	NCACHE_NODEADDR	nc_vp		/* node address in NCACHE */
#define	NCACHE_PARADDR	nc_dvp		/* parent node address in NCACHE */

#  if	defined(HASNCVPID)
#define	NCACHE_NODEID	nc_vpid		/* node ID in NCACHE */
#define	NCACHE_PARID	nc_dvpid	/* parent node ID in NCACHE */
#  endif	/* defined(HASNCVPID) */
# endif  /* defined(HASNCACHE) */

#endif	/* DARWIN_LSOF_H */
