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


/*
 * Portions Copyright 2005-2007 Apple Inc.  All rights reserved.
 *
 * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
 * 47907.  All rights reserved.
 *
 * Written by Allan Nathanson, Apple Inc., and Victor A. Abell, Purdue
 * University.
 *
 * 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 Apple Inc. 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, Apple
 *    Inc. 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.7 2011/08/07 22:52:30 abe Exp $
 */


#if	!defined(DARWIN_LSOF_H)
#define	DARWIN_LSOF_H	1

#include <stdlib.h>
#include <dirent.h>
#include <setjmp.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
#include <wctype.h>
#include <arpa/inet.h>
#include <sys/fcntl.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h>
#include <rpc/rpc.h>
#include <rpc/pmap_prot.h>
#include <libproc.h>

# if DARWINV<900
#define	vst_blksize	st_blksize
#define	vst_dev		st_dev
#define	vst_ino		st_ino
#define	vst_mode	st_mode
#define	vst_nlink	st_nlink
#define	vst_rdev	st_rdev
#define	vst_size	st_size
# endif	/* DARWINV<=900 */

#define	COMP_P		const void
#define	DEVINCR		1024		/* device table malloc() increment */
#define	DIRTYPE		dirent		/* directory entry type */
typedef	uintptr_t	KA_T;
#define	KA_T_FMT_X	"0x%08lx"
#define	LOGINML		MAXLOGNAME
#define	MALLOC_P	void
#define	FREE_P		MALLOC_P
#define	MALLOC_S	size_t
#define	MAXSYSCMDL	(MAXCOMLEN - 1)	/* max system command name length */
#define	MOUNTED		MNT_MNTTAB 
#define	QSORT_P		void
#define	READLEN_T	int
#define	STRNCPY_L	size_t
#define	SZOFFTYPE	unsigned long long
					/* size and offset internal storage
					 * type */
#define	SZOFFPSPEC	"ll"		/* SZOFFTYPE printf specification
					 * modifier */


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

struct file *Cfp;

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 */
	int is_nfs;			/* 1 if NFS file system, 0 if not */
        struct mounts *next;    	/* forward link */
};

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

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

#endif	/* DARWIN_LSOF_H */
