blob: 2b87ed591054979c706bd2e7514b272a5403dec0 [file] [log] [blame]
/*
* dlsof.h - FreeBSD 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.44 2011/09/07 19:14:59 abe Exp $
*/
#if !defined(FREEBSD_LSOF_H)
#define FREEBSD_LSOF_H 1
#include <stdlib.h>
#include <dirent.h>
#include <nlist.h>
#include <setjmp.h>
#include <signal.h>
#include <unistd.h>
# if FREEBSDV>=4000
# if FREEBSDV>=5000
# if FREEBSDV<6020
# if defined(__alpha__)
/*
* For Alpha below 6.2, #include <machine/pcpu.h> before #define'ing _KERNEL.
* Then #define PCPU_MD_FIELDS independently. This hack avoids a compiler
* complaint about register use.
*/
#include <machine/pcpu.h>
#define PCPU_MD_FIELDS \
struct alpha_pcb pc_idlepcb; /* pcb for idling */ \
u_int64_t pc_idlepcbphys; /* pa of pc_idlepcb */ \
u_int64_t pc_pending_ipis; /* pending IPI's */ \
u_int32_t pc_next_asn; /* next ASN to alloc */ \
u_int32_t pc_current_asngen /* ASN rollover check */
# endif /* defined(__alpha__) */
# endif /* FREEBSDV<6020 */
#define _KERNEL 1
# endif /* FREEBSDV>=5000 */
# if defined(HAS_VM_MEMATTR_T)
/*
* The d_mmap2_t function typedef in <sys/conf.h> may need the definition
* of vm_memattr_t for a pointer, but that definition is only available
* under _KERNEL in <sys/types.h>. Defining _KERNEL before including
* <sys/types.h> causes many compilation problems, so this expediency
* (hack) is used when the vm_memattr_t definition is needed.
*/
#define vm_memattr_t void
# endif /* defined(HAS_VM_MEMATTR_T) */
# if defined(NEEDS_BOOLEAN_T)
/*
* In FreeBSD 9 and above the boolean_t typedef is also needed and is also
* under _KERNEL in <sys/types.h>.
*/
#define boolean_t int
# endif /* defined(NEEDS_BOOLEAN_T) */
#include <sys/conf.h>
# if defined(HAS_VM_MEMATTR_T)
#undef vm_memattr_t
# endif /* defined(HAS_VM_MEMATTR_T) */
# if defined(NEEDS_BOOLEAN_T)
#undef boolean_t
# endif /* defined(NEEDS_BOOLEAN_T) */
# if defined(HAS_CONF_MINOR)
#undef minor
#include "fbsd_minor.h"
# endif /* defined(HAS_CONF_MINOR) */
# if FREEBSDV>=5000
#undef _KERNEL
# endif /* FREEBSDV>=5000 */
# endif /* FREEBSDV>=4000 */
#include <sys/filedesc.h>
#include <sys/mbuf.h>
#define NFS
#define m_stat mnt_stat
# if FREEBSDV>=3020
#define _KERNEL
# endif /* FREEBSDV>=3020 */
#include <sys/mount.h>
# if FREEBSDV>=3020
#undef _KERNEL
# endif /* FREEBSDV>=3020 */
#include <rpc/types.h>
#include <sys/protosw.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/un.h>
#include <sys/unpcb.h>
# if FREEBSDV>=3000
#undef INADDR_LOOPBACK
# endif /* FREEBSDV>=3000 */
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#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>
#include <sys/ucred.h>
#include <sys/uio.h>
# if defined(HAS_KVM_VNODE)
#define _KVM_VNODE
# endif /* defined(HAS_KVM_VNODE) */
#include <sys/vnode.h>
# if defined(HAS_KVM_VNODE)
#undef _KVM_VNODE
# endif /* defined(HAS_KVM_VNODE) */
#include <net/raw_cb.h>
#include <sys/domain.h>
#define pmap RPC_pmap
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
#undef pmap
# if FREEBSDV<2000
#include <ufs/quota.h>
#include <ufs/inode.h>
#include <ufs/ufsmount.h>
#include <ufs/mfsnode.h>
# else /* FREEBSDV>=2000 */
#include <paths.h>
#include <ufs/ufs/quota.h>
# if FREEBSDV>=4000 && FREEBSDV<5000
# if defined(__alpha__) || defined(__sparc64__)
#define dev_t void *
# endif /* defined(__alpha__) || defined(__sparc64__) */
# endif /* FREEBSDV>=4000 && FREEBSDV<5000 */
#include <ufs/ufs/inode.h>
# if defined(HAS_UFS1_2)
#define _KERNEL
struct vop_getextattr_args;
struct vop_deleteextattr_args;
struct vop_setextattr_args;
#include <ufs/ufs/extattr.h>
#define psignal LSOF_psignal
#define panicstr bp
#include <ufs/ufs/ufsmount.h>
#undef psignal
#undef panicstr
#undef _KERNEL
# endif /* defined(HAS_UFS1_2) */
# if FREEBSDV>=5010
#undef i_devvp
# endif /* FREEBSDV>=5010 */
# if FREEBSDV>=4000 && FREEBSDV<5000
# if defined(__alpha__) || defined(__sparc64__)
#undef dev_t
# endif /* defined(__alpha__) || defined(__sparc64__) */
# endif /* FREEBSDV>=4000 && FREEBSDV<5000 */
# if FREEBSDV<2020
#include <ufs/mfs/mfsnode.h>
# endif /* FREEBSDV<2020 */
# endif /* FREEBSDV<2000 */
# if FREEBSDV<5000
#include <nfs/nfsv2.h>
# else /* FREEBSDV>=5000 */
#include <nfs/nfsproto.h>
# endif /* FREEBSDV<5000 */
# if defined(HASRPCV2H)
#include <nfs/rpcv2.h>
# endif /* defined(HASRPCV2H) */
# if FREEBSDV>=5000
#include <nfsclient/nfs.h>
#include <nfsclient/nfsnode.h>
# else /* FREEBSDV<5000 */
#include <nfs/nfs.h>
#include <nfs/nfsnode.h>
# endif /* FREEBSDV>=5000 */
#include <sys/proc.h>
#include <kvm.h>
#undef TRUE
#undef FALSE
# if FREEBSDV<2000
#include <sys/kinfo.h>
# else /* FREEBSDV>=2000 */
#include <sys/sysctl.h>
# endif /* FREEBSDV<2000 */
# if defined(HASFDESCFS)
#define _KERNEL
#define KERNEL
# if FREEBSDV>=5000
#include <fs/fdescfs/fdesc.h>
# else /* FREEBSDV<5000 */
#include <miscfs/fdesc/fdesc.h>
# endif /* FREEBSDV>=5000 */
#undef _KERNEL
#undef KERNEL
# endif /* defined(HASFDESCFS) */
# if defined(HASNULLFS)
#define _KERNEL
#define KERNEL
struct vop_generic_args;
# if FREEBSDV>=5000
#include <fs/nullfs/null.h>
# else /* FREEBSDV<5000 */
#include <miscfs/nullfs/null.h>
# endif /* FREEBSDV>=5000 */
#undef _KERNEL
#undef KERNEL
# endif /* defined(HASNULLFS) */
# if defined(HASPROCFS)
# if FREEBSDV<2000
#include <procfs/pfsnode.h>
# else /* FREEBSDV>=2000 */
# if FREEBSDV<5000
#include <miscfs/procfs/procfs.h>
# endif /* FREEBSDV<5000 */
#include <machine/reg.h>
# endif /* FREEBSDV<2000 */
#define PNSIZ 5
# endif /* defined(HASPROCFS) */
# if defined(HASPSEUDOFS)
#include <fs/pseudofs/pseudofs.h>
# endif /* defined(HASPSEUDOFS) */
# if defined(HAS_ZFS)
#include "dzfs.h"
# endif /* defined(HAS_ZFS) */
# if FREEBSDV<2000
#define P_COMM p_comm
#define P_FD p_fd
#define P_PID p_pid
#define P_PGID p_pgrp
#define P_STAT p_stat
#define P_VMSPACE p_vmspace
# else /* FREEBSDV>=2000 */
# if FREEBSDV<5000
#define P_ADDR kp_eproc.e_paddr
#define P_COMM kp_proc.p_comm
#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_VMSPACE kp_proc.p_vmspace
# else /* FREEBSDV>=5000 */
#define P_ADDR ki_paddr
#define P_COMM ki_comm
#define P_FD ki_fd
#define P_PID ki_pid
#define P_PGID ki_pgid
#define P_PPID ki_ppid
#define P_STAT ki_stat
#define P_VMSPACE ki_vmspace
# endif /* FREEBSDV<5000 */
# endif /* FREEBSDV<2000 */
#define _KERNEL
#define KERNEL
#include <sys/fcntl.h>
/*
* The following circumventions were first needed in FreeBSD 8.0-CURRENT some
* time in August 2008 to avoid conflicts in /usr/src/sys/sys/libkern.h> and
* /usr/src/sys/sys/systm.h, called by <sys/file.h> or the header files it
* #include's when KERNEL or _KERNEL is #define'd.
*
* The circumventions may be needed or may be erroneous for earlier FreeBSD
* versions where testing was not possible.
*/
#define intrmask_t int
#define log log_kernel_lsof
#define pause pause_kernel_lsof
#define setenv setenv_kernel_lsof
#define uintfptr_t int
#define _SYS_LIBKERN_H_
#include <sys/file.h>
/*
* Attempt to remove the circumventions.
*/
#undef _SYS_LIBKERN_H_
#undef intrmask_t_lsof
#undef log_kernel_lsof
#undef pause_kernel_lsof
#undef setenv_kernel_lsof
#undef uintfptr_t
#undef _KERNEL
#undef KERNEL
# if defined(DTYPE_KQUEUE)
#define HASKQUEUE /* has the kqueue file type */
# if FREEBSDV>=4090
#define _KERNEL
# endif /* FREEBSDV>=4090 */
#include <sys/eventvar.h>
# if FREEBSDV>=4090
#undef _KERNEL
# endif /* FREEBSDV>=4090 */
# endif /* defined(DTYPE_KQUEUE) */
# if FREEBSDV<2000
#include <ufs/lockf.h>
# else /* FREEBSDV>=2000 */
struct vop_advlock_args { int dummy; }; /* to pacify lf_advlock() prototype */
# if FREEBSDV>=5000
#undef MALLOC_DECLARE
#define MALLOC_DECLARE(type) extern struct malloc_type type[1]
/* to pacify <sys/lockf.h> */
#define _KERNEL
# if defined(HAS_SYS_SX_H)
#include <sys/sx.h>
# endif /* defined(HAS_SYS_SX_H) */
# if defined(HAS_SI_PRIV) || defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
#include <fs/devfs/devfs_int.h>
# endif /* defined(SI_PRIV) || defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
#include <fs/devfs/devfs.h>
#undef _KERNEL
# endif /* FREEBSDV>=5000 */
#include <sys/lockf.h>
# endif /* FREEBSDV<2000 */
#include <vm/vm.h>
# if FREEBSDV>=2020
# if FREEBSDV>=4090
#define _KERNEL
# endif /* FREEBSDV>=4090 */
#include <sys/pipe.h>
# if FREEBSDV>=4090
#undef _KERNEL
# endif /* FREEBSDV>=4090 */
# if defined(HASVMLOCKH)
#include <vm/lock.h>
# endif /* defined(HASVMLOCKH) */
#include <vm/pmap.h>
# endif /* FREEBSDV>=2020 */
#include <vm/vm_map.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) */
#include <vm/vm_object.h>
#include <vm/vm_pager.h>
# if FREEBSDV>=2020
#undef B_NEEDCOMMIT
# if FREEBSDV>=5000
#include <sys/bio.h>
# endif /* FREEBSDV>=5000 */
#include <sys/buf.h>
#include <sys/user.h>
# if FREEBSDV<5000
#include <ufs/mfs/mfsnode.h>
# endif /* FREEBSDV<5000 */
# endif /* FREEBSDV>=2020 */
#include <string.h>
#define COMP_P const void
#define DEVINCR 1024 /* device table malloc() increment */
# if !defined(FREEBSD_KA_T)
# if FREEBSDV<2000
typedef off_t KA_T;
# else /* FREEBSDV>=2000 */
typedef u_long KA_T;
# endif /* FREEBSDV<2000 */
# endif /* !defined(FREEBSD_KA_T) */
#define KMEM "/dev/kmem"
#define MALLOC_P void
#define FREE_P MALLOC_P
#define MALLOC_S size_t
#define MAXSYSCMDL MAXCOMLEN /* max system command name length */
# 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
# if !defined(READLEN_T)
#define READLEN_T int
# endif /* !defined(READLEN_T) */
#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)
*/
struct file * Cfp;
# if FREEBSDV>=2000
extern kvm_t *Kd;
# endif /* FREEBSDV>=2000 */
# if defined(P_ADDR)
extern KA_T Kpa;
# endif /* defined(P_ADDR) */
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
extern int Np; /* number of kernel processes */
# if FREEBSDV>=2000
extern struct kinfo_proc *P; /* local process table copy */
# endif /* FREEBSDV>=2000 */
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 */
};
# if FREEBSDV==4100 || FREEBSDV==4110
#define XDR_VOID (xdrproc_t)xdr_void
#define XDR_PMAPLIST (xdrproc_t)xdr_pmaplist
# endif /* FREEBSDV==4100 || FREEBSDV==4110 */
# if FREEBSDV>=5000
#define XDR_VOID (const xdrproc_t)xdr_void
#define XDR_PMAPLIST (const xdrproc_t)xdr_pmaplist
# endif /* FREEBSDV>=5000 */
/*
* 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)
#include <sys/uio.h>
# if FREEBSDV<4000 || (FREEBSDV>=4000 && defined(HASNAMECACHE))
#include <sys/namei.h>
# else /* FREEBSDV>=4000 && !defined(HASNAMECACHE) */
/*
* The namecache struct definition should come from a header file that
* can be #include'd, but it has been moved to a kernel source file in
* 4.0-current for some reason unclear to me.
*
* So we must take the risk of defining it here. !!!! DANGER !!!!
*/
struct namecache {
LIST_ENTRY(namecache) nc_hash; /* hash chain */
LIST_ENTRY(namecache) nc_src; /* source vnode list */
TAILQ_ENTRY(namecache) nc_dst; /* destination vnode list */
struct vnode *nc_dvp; /* vnode of parent of name */
struct vnode *nc_vp; /* vnode the name refers to */
u_char nc_flag; /* flag bits */
u_char nc_nlen; /* length of name */
char nc_name[16]; /* segment name -- Strictly composed,
* the size of nc_name[] should be zero
* and rnmh.c in lsof/lib should read
* the name with a separate call to
* kvm_read(). Since that causes extra
* (and slow) calls to kvm_read(), the
* size is set here to an experimentally
* derived guess. The same experiment
* didn't reveal any extra kvm_read()
* suggesting the guess is a safe one.
* (VAA, 10 Apr 2002) */
};
# endif /* FREEBSDV<4000 || (FREEBSDV>=4000 && defined(HASNAMECACHE)) */
#define NCACHE namecache /* kernel's structure name */
#define NCACHE_NM nc_name /* name in NCACHE */
#define NCACHE_NMLEN nc_nlen /* name length in NCACHE */
# if FREEBSDV<2005
#define NCACHE_NXT nc_nxt /* link in NCACHE */
# else /* FREEBSDV>=2005 */
# if FREEBSDV<2010
#define NCACHE_NXT nc_lru.tqe_next /* link in NCACHE */
# else /* FREEBSDV>=2010 */
#include <stddef.h>
#define NCACHE_NXT nc_hash.le_next /* link in NCACHE */
# endif /* FREEBSDV<2010 */
# endif /* FREEBSDV<2005 */
#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) */
#if FREEBSDV>=5000
#define VNODE_VFLAG v_iflag
#define NCACHE_VROOT VV_ROOT
#endif /* FREEBSDV>=5000 */
#endif /* defined(FREEBSD_LSOF_H) */