/*
 * dlsof.h - NetBSD and OpenBSD header file for 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.38 2006/03/28 21:54:08 abe Exp $
 */


#if	!defined(NETBSD_LSOF_H)
#define	NETBSD_LSOF_H	1

#include <stdlib.h>
#include <dirent.h>
#include <nlist.h>
#include <paths.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>

# if	defined(HASGETBOOTFILE)
#include <util.h>
# endif	/* defined(HASGETBOOTFILE) */

#include <sys/filedesc.h>
#include <sys/mbuf.h>

# if	defined(HAS_LWP_H)
#include <sys/lwp.h>
# endif	/* defined(HAS_LWP_H) */

# if	(defined(OPENBSDV) && OPENBSDV>=3030) \
  ||	(defined(NETBSDV) && __NetBSD_Version__>=106060000)

#  if	defined(OPENBSDV) ||  __NetBSD_Version__<399001100
#define	_KERNEL
#  endif	/* defined(OPENBSDV) ||  __NetBSD_Version__<399001100 */

#  if	defined(NETBSDV) && __NetBSD_Version__<399001100
struct buf;	/* dummy for function prototype in <sys/buf.h> */
struct uio;	/* dummy for function prototype in <sys/buf.h> */
#  endif	/* defined(NETBSDV && __NetBSD_Version__<399001100) */

#include <sys/ucred.h>
# endif	/* (defined(OPENBSDV) && OPENBSDV>=3030)
	   || (defined(NETBSDV) && __NetBSD_Version__>=106060000) */

# if	defined(NETBSDV) && __NetBSD_Version__<399001100
#include <sys/buf.h>
# endif	/* defined(NETBSDV) && __NetBSD_Version__<399001100 */

# if	(defined(OPENBSDV) && OPENBSDV>=3030) \
  ||	(defined(NETBSDV) && __NetBSD_Version__>=106060000 \
  &&	__NetBSD_Version__<399001100)
#undef	_KERNEL
# endif	/* (defined(OPENBSDV) && OPENBSDV>=3030) \
	   || (defined(NETBSDV) && __NetBSD_Version__>=106060000 \
	   &&  __NetBSD_Version__<399001100) */

#define	NFS
#define m_stat	mnt_stat

# if	(defined(OPENBSDV) && OPENBSDV>=3030) \
  ||	(defined(NETBSDV) && __NetBSD_Version__>=106060000)
#define	_KERNEL
# endif	/* (defined(OPENBSDV) && OPENBSDV<3030)
	   || (defined(NETBSDV) && __NetBSD_Version__>=106060000) */

#include <sys/mount.h>

# if	(defined(OPENBSDV) && OPENBSDV>=3030) \
  ||	(defined(NETBSDV) && __NetBSD_Version__>=106060000)
#undef	_KERNEL
# endif	/* (defined(OPENBSDV) && OPENBSDV>=3030)
	   || (defined(NETBSDV) && __NetBSD_Version__>=106060000) */

#include <rpc/types.h>
#include <sys/protosw.h>

# if	defined(NETBSDV) && NETBSDV>=1003000
#define	sockproto	NETBSD_sockproto
# endif	/* defined(NETBSDV) && NETBSDV>=1003000 */

#include <sys/socket.h>

# if	defined(HASMSDOSFS)
#  if	HASMSDOSFS==1
#include <msdosfs/bpb.h>
#include <msdosfs/fat.h>
#  else	/* HASMSDOSFS!=1 */
#include <fs/msdosfs/bpb.h>
#include <fs/msdosfs/fat.h>
#  endif	/* HASMSDOSFS==1 */

#  if	(defined(OPENBSDV) && OPENBSDV<3030) \
   ||	(defined(NETBSDV) && __NetBSD_Version__<106060000)
/*
 * The netcred and netexport structures may be needed in the msdosfsmount
 * structure, defined in <msdosfs/msdosfsmount.h>.  So as a terrible hack,
 * the lsof Configure script extracts the netcred and netexport structure
 * definitions from <sys/mount.h> and places them in "netexport.h".
 *
 * When needed, the netcred and netexport structures netcred should really
 * be obtained from <sys/mount.h>.  However they are hidden in <sys/mount.h>
 * under _KERNEL, and that sometimes can't be defined when including
 * <sys/mount.h> without causing other seemingly insurmountable #include
 * problems.
 *
 * THIS IS A TERRIBLE AND FRAGILE HACK!!!  It might break if the netexport or
 * netcred definitions change radically in <sys/mount.h>.
 *
 * It is no longer needed for NetBSD Versions 1.6F and above, or for OpenBSD
 * versions 3.3 and above.
 */

#include "netexport.h"
#  endif	/* (defined(OPENBSDV) && OPENBSDV<3030)
		   || (defined(NETBSDV) && __NetBSD_Version__<106060000) */

#define	_KERNEL
struct nameidata;	/* to satisfy a function prototype in msdosfsmount.h */
#include <msdosfs/msdosfsmount.h>
#undef	_KERNEL
#include <msdosfs/direntry.h>
#include <msdosfs/denode.h>
# endif	/* defined(HASMSDOSFS) */

# if	defined(NETBSDV) && NETBSDV>=1003000
#undef	sockproto
# endif	/* defined(NETBSDV) && NETBSDV>=1003000 */

#include <sys/socketvar.h>
#include <sys/un.h>
#include <sys/unpcb.h>
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>

# if	defined(HASIPv6) && defined(NETBSDV) && !defined(HASINRIAIPv6)
#include <netinet/ip6.h>
#include <netinet6/in6_pcb.h>
# endif	/* defined(HASIPv6) && defined(NETBSDV) && !defined(HASINRIAIPv6) */

#include <net/route.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>

# if	defined(OPENBSDV)
#  if	!defined(TF_ECN_PERMIT)
#define	TF_ECN_PERMIT	0x00008000	/* other side said I could ECN */
#  endif	/* !defined(TF_ECN_PERMIT) */

#  if	!defined(TF_RCVD_CE)
#define	TF_RCVD_CE	0x00010000	/* send ECE in subsequent segs */
#  endif	/* !defined(TF_RCVD_CE) */

#  if	!defined(TF_SEND_CWR)
#define	TF_SEND_CWR	0x00020000	/* send CWR in next seg */
#  endif	/* !defined(TF_SEND_CWR) */

#  if	!defined(TF_DISABLE_ECN)
#define	TF_DISABLE_ECN	0x00040000	/* disable ECN for this connection */
#  endif	/* !defined(TF_DISABLE_ECN) */

# endif	/* defined(OPENBSDV) */

#include <sys/ucred.h>

# if	defined(UVM)
/*
 * Avoid conflicts with definitions in <vm/vm_param.h>.
 */

#undef	FALSE
#undef	TRUE
# endif	/* defined(UVM) */

#include <sys/vnode.h>

# if	defined(NETBSDV) && NETBSDV>=1003000
/*
 * Because late in the 1.3I NetBSD development cycle the sockproto structure
 * was placed under _KERNEL in <sys/socket.h>, and because defining _KERNEL
 * before #include'ing <sys/socket.h> causes other #include problems, the
 * sockproto structure definition that might have been in <sys/socket.h> is
 * renamed NETBSD_sockproto, and the following definition is used instead.
 *
 * Ugly, isn't it?
 */

struct sockproto {
	u_short sp_family;
	u_short sp_protocol;
};
# endif	/* defined(NETBSDV) && NETBSDV>=1003000 */

#include <net/raw_cb.h>
#include <sys/domain.h>
#define	pmap	RPC_pmap
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
#undef 	pmap
#define KERNEL
#include <ufs/ufs/quota.h>
# if	defined(DIRBLKSIZ)
#define	DIRENT_DIRBLKSIZ	DIRBLKSIZ
#undef	DIRBLKSIZ
# endif	/* defined(DIRBLKSIZ) */

# if	defined(HASI_FFS1)
#define	_KERNEL
#include <ufs/ufs/ufsmount.h>
#undef	_KERNEL
# endif	/* defined(HASI_FFS1) */

#include <ufs/ufs/inode.h>

# if	defined(DIRENT_BLKSIZ)
#define	DIRBLKSIZ	DIRENT_DIRBLKSIZ
#undef	DIRENT_DIRBLKSIZ
# endif	/*defined(DIRENT_BLKSIZ) */

# if	defined(HASBUFQ_H)
#  if	defined(NETBSDV) && NETBSDV>=2099010
#define	_KERNEL
#include <sys/bufq.h>
#undef	_KERNEL
#  endif	/* defined(NETBSDV) && NETBSDV>=2099010 */
#endif	/* defined(HASBUFQ_H) */

#undef KERNEL
#include <ufs/mfs/mfsnode.h>

# if	defined(HASNFSPROTO)
#include <nfs/rpcv2.h>
#include <nfs/nfsproto.h>
# else	/* !defined(HASNFSPROTO) */
#include <nfs/nfsv2.h>
# endif	/* defined(HASNFSPROTO) */

#include <nfs/nfs.h>
#include <nfs/nfsnode.h>
#include <sys/proc.h>
#include <kvm.h>
#include <sys/sysctl.h>
#  if	defined(HASKVMGETPROC2)
#define	P_ADDR		p_paddr
#define	P_COMM		p_comm
#define	P_CWDI		p_cwdi
#define	P_FD		p_fd
#define	P_PID		p_pid
#define	P_PGID		p__pgid
#define	P_PPID		p_ppid
#define	P_STAT		p_stat
#define	P_TRACEP	p_tracep
#define	P_UID		p_uid
#define	P_VMSPACE	p_vmspace
#  else	/* !defined(HASKVMGETPROC2) */
#define	P_ADDR		kp_eproc.e_paddr
#define	P_COMM		kp_proc.p_comm
#define	P_CWDI		kp_proc.p_cwdi
#define	P_FD		kp_proc.p_fd
#define	P_PID		kp_proc.p_pid
#define	P_PGID		kp_eproc.e_pgid
#define	P_PPID		kp_eproc.e_ppid
#define	P_STAT		kp_proc.p_stat
#define	P_TRACEP	kp_proc.p_tracep
#define	P_UID		kp_eproc.e_ucred.cr_uid
#define	P_VMSPACE	kp_proc.p_vmspace
#  endif	/* defined(HASKVMGETPROC2) */

# if	defined(HASFDESCFS)
#define	_KERNEL
#include <miscfs/fdesc/fdesc.h>
#undef	_KERNEL
# endif	/* defined(HASFDESCFS) */

# if	defined(HASKERNFS)
#define	_KERNEL
#define	Pkern		__Pkern
#define	Proot		__Proot
#define	Pnull		__Pnull
#define	Ptime		__Ptime
#define	Pint		__Pint
#define	Pstring		__Pstring
#define	Phostname	__Phostname
#define	Pavenrun	__Pavenrun
#define	Pdevice		__Pdevice
#define	Pmsgbuf		__Pmsgbuf
#define	Pipsecsadir	__Pipsecsadir
#define	Pipsecspdir	__Pipsecspdir
#define	Pipsecsa	__Pipseca
#define	Pipsecsp	__Pipsecsp
#include <miscfs/kernfs/kernfs.h>
#undef	_KERNEL
#undef	Pkern
#undef	Proot
#undef	Pnull
#undef	Ptime
#undef	Pint
#undef	Pstring
#undef	Phostname
#undef	Pavenrun
#undef	Pdevice
#undef	Pmsgbuf
#undef	Pipsecsadir
#undef	Pipsecspdir
#undef	Pipseca
#undef	Pipsecsp
#  if	defined(HASKERNFS_KFS_KT)
#define	kf_kt	kfs_kt
#  endif	/* defined(HASKERNFS_KFS_KT) */
# endif	/* defined(HASKERNFS) */

# if	defined(HASNULLFS)
#define	_KERNEL
#  if	defined(NETBSDV) && NETBSDV>=1005000 && __NetBSD_Version__<106060000
#include "netexport.h"
#  endif	/* defined(NETBSDV) && NETBSDV>=1005000
		   && __NetBSD_Version__<106060000 */
#include <miscfs/nullfs/null.h>
#undef	_KERNEL
# endif	/* defined(HASNULLFS) */

# if	defined(HASPROCFS)
#  if	defined(HASPROCFS_PFSROOT)
#define	_KERNEL
#  endif	/* defined(HASPROCFS_PFSROOT) */
#include <miscfs/procfs/procfs.h>
#  if	defined(HASPROCFS_PFSROOT)
#undef	_KERNEL
#define	Proot		PFSroot
#define	Pproc		PFSproc
#define	Pcurproc	PFScurproc
#define	Pmem		PFSmem
#define	Pregs		PFSregs
#define	Pfile		PFSfile
#define	Pfpregs		PFSfpregs
#define	Pctl		PFSctl
#define	Pstatus		PFSstatus
#define	Pnote		PFSnote
#define	Pnotepg		PFSnotepg
#   if	defined(NetBSDV)
#    if	NETBSDV>=2000000
#define	Pfd		PFSfd
#    endif	/* NETBSDV>=2000000 */
#    if	NETBSDV>=1006000
#define	Pmap		PFSmap
#define	Pmaps		PFSmaps
#    endif	/* NETBSDV>=1006000 */
#   endif	/* defined(NetBSDV) */
#  endif	/* defined(HASPROCFS_PFSROOT) */
#include <machine/reg.h>
# endif	/* defined(HASPROCFS) */

# if	defined(HASPTYFS)
#define	_KERNEL
#include <fs/ptyfs/ptyfs.h>
#include <miscfs/specfs/specdev.h>
#undef	_KERNEL
# endif	/* defined(HASPTYFS) */

#define	KERNEL
#define _KERNEL
#include <sys/file.h>
#include <sys/fcntl.h>

# if	defined(HAS_ADVLOCK_ARGS)
struct vop_advlock_args;
# endif	/* defined(HAS_ADVLOCK_ARGS) */

# if	defined(DTYPE_KQUEUE)
#define	HASKQUEUE				/* has the kqueue file type */
#  if	defined(OPENBSDV)
#include <sys/eventvar.h>
#  endif	/* defined(OPENBSDV) */
# endif	/* defined(DTYPE_KQUEUE) */

#include <sys/lockf.h>
#undef	KERNEL
#undef	_KERNEL

# if	defined(UVM)
#  if	defined(OPENBSDV)
#define	_UVM_UVM_FAULT_I_H_	1		/* avoid OpenBSD's
						/* <uvm/uvm_fault_i.h */
#  endif	/* defined(OPENBSDV) */
#define	FALSE	0
#define	TRUE	1
#include <uvm/uvm.h>
# endif	/* defined(UVM) */

# if	defined(HAS_UVM_INCL)
#include <uvm/uvm.h>
#include <uvm/uvm_map.h>
#include <uvm/uvm_object.h>
#include <uvm/uvm_pager.h>
# else	/* !defined(HAS_UVM_INCL) */
#include <vm/vm.h>
#include <vm/vm_map.h>
#include <vm/vm_object.h>
#include <vm/vm_pager.h>
# endif	/* defined(HAS_UVM_INCL) */

# if	defined(HAS_SYS_PIPEH)
#  if	OPENBSDV==2030 && defined(__sparc__)
#   if	defined(nbpg)
#undef	nbpg
#   endif	/* defined(nbpg) */
#define	nbpg	4096		/* WARNING!!!  This should be 8192 for sun4,
				 * but there's not much chance this value will
				 * ever be used by any lsof code.  (See the
				 * use of PIPE_NODIRECT in <sys/pipe.h>. */
#  endif	/* OPENBSDV==2030 && defined(__sparc__) */
#include <sys/pipe.h>
#endif	/* defined(HAS_SYS_PIPEH) */

#define	COMP_P		const void
#define DEVINCR		1024	/* device table malloc() increment */
typedef	u_long		KA_T;
#define	KMEM		"/dev/kmem"
#define MALLOC_P	void
#define FREE_P		MALLOC_P
#define MALLOC_S	size_t

# if	!defined(MAXSYSCMDL)
#define	MAXSYSCMDL	MAXCOMLEN	/* max system command name length */
# endif	/* !defined(MAXSYSCMDL) */

# if	defined(N_UNIXV)
#define	N_UNIX_TMP(x)	#x
#define	N_UNIX_STR(x)	N_UNIX_TMP(x)
#define	N_UNIX		N_UNIX_STR(N_UNIXV)
# endif	/* defined(N_UNIXV) */

#define QSORT_P		void
#define	READLEN_T	int
#define STRNCPY_L	size_t
#define SWAP		"/dev/drum"
#define	SZOFFTYPE	unsigned long long
					/* size and offset internal storage
					 * type */
#define	SZOFFPSPEC	"ll"		/* SZOFFTYPE print specification
					 * modifier */


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

extern struct file *Cfp;
extern kvm_t *Kd;
extern KA_T Kpa;

struct l_vfs {
	KA_T addr;			/* kernel address */
	fsid_t	fsid;			/* file system ID */
	char type[MFSNAMELEN];		/* type of file system */
	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

extern int Np;				/* number of kernel processes */

# if	defined(HASKVMGETPROC2)
struct kinfo_proc2 *P;			/* local process table copy */
# else	/* ! defined(HASKVMGETPROC2) */
struct kinfo_proc *P;			/* local process table copy */
# endif	/* defined(HASKVMGETPROC2) */

extern int pgshift;			/* kernel's page shift */

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 */

};


/*
 * Definitions for rdev.c
 */

#define	DIRTYPE	dirent
#define HASDNAMLEN	1	/* struct DIRTYPE has d_namlen element */


/*
 * Definitions for rnam.c and rnmh.c
 */

# if     defined(HASNCACHE)
#  if	(defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000)
#include <stddef.h>
#endif	/* (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) */

#include <sys/uio.h>
#include <sys/namei.h>
#define	NCACHE		namecache	/* kernel's structure name */
#define	NCACHE_NM	nc_name		/* name in NCACHE */
#define	NCACHE_NMLEN	nc_nlen		/* name length in NCACHE */
#define	NCACHE_NODEADDR	nc_vp		/* node address in NCACHE */
#define	NCACHE_PARADDR	nc_dvp		/* parent node address in NCACHE */

#  if	(defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000)
#define	NCACHE_NXT	nc_hash.le_next	/* link in NCACHE */
#  else	/* (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) */
#   if	defined(NetBSD1_0) && NetBSD<1994101
#define	NCACHE_NXT	nc_nxt		/* link in NCACHE */
#   else	/* !defined(NetBSD1_0) || NetBSD>=1994101 */
#define	NCACHE_NXT	nc_lru.tqe_next	/* link in NCACHE */
#   endif	/* defined(NetBSD1_0) && NetBSD<1994101 */
#  endif	/* (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) */

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

#endif	/* NETBSD_LSOF_H */
