diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..d52011e
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,119 @@
+#
+#    Copyright (c) 2010-2011 Nest, Inc.
+#    All rights reserved.
+#
+#    This document is the property of Nest. It is considered
+#    confidential and proprietary information.
+#
+#    This document may not be reproduced or transmitted in any form,
+#    in whole or in part, without the express written permission of
+#    Nest.
+#
+#    Description:
+#      This file is the makefile for the "list open files" (lsof) utility.
+#
+
+BuildConfigSpecialized	:= No
+BuildProductSpecialized	:= No
+
+include pre.mak
+
+PackageName		:= lsof
+
+PackageExtension	:= tar.bz2
+PackageSeparator	:= _
+
+PackagePatchArgs	:= -g 0 -p2
+
+PackageArchive		:= $(PackageName).$(PackageExtension)
+PackageWrapperDir	:= $(PackageName)$(PackageSeparator)$(PackageVersion)
+
+PackageSourceArchive	:= $(PackageWrapperDir)/$(PackageName)$(PackageSeparator)$(PackageVersion)$(PackageSeparator)src.tar
+PackageSourceDir	:= $(PackageWrapperDir)/$(PackageName)$(PackageSeparator)$(PackageVersion)$(PackageSeparator)src
+
+PackageBuildMakefile	= $(call GenerateBuildPaths,Configure)
+
+CleanPaths		+= $(PackageLicenseFile)
+
+all: $(PackageDefaultGoal)
+
+# Expand the wrapper directory which contains another archive
+# containing the source.
+
+$(PackageSourceArchive): $(PackageArchive)
+	$(call expand-archive,$(<),.)
+	$(Verbose)touch $(@)
+
+# Generate the package license contents.
+
+$(PackageSourceDir)/00README: source
+
+$(PackageLicenseFile): $(PackageSourceDir)/00README
+	$(Verbose)$(SED) -n -e '/^License$$/,/\*\/$$/{;p;/\*\/$$/q;}' < $< > $@
+
+# Extract the source from the archive and apply patches, if any.
+
+$(PackageSourceDir): $(PackageSourceArchive)
+	$(call expand-archive,$(<),$(PackageWrapperDir))
+	$(Verbose)touch $(@)
+	$(call patch-directory,$(@),$(PackagePatchArgs),$(PackagePatchPaths))
+
+# Prepare the sources.
+
+.PHONY: source
+source: | $(PackageSourceDir)
+
+# Patch the sources, if necessary.
+
+.PHONY: patch
+patch: source
+
+# Generate the package build makefile.
+
+$(PackageBuildMakefile): | $(PackageSourceDir) $(BuildDirectory)
+	$(call create-links,$(CURDIR)/$(PackageSourceDir),$(BuildDirectory))
+
+# Configure the source for building.
+
+.PHONY: configure
+configure: source $(PackageBuildMakefile)
+	$(Verbose)cd $(BuildDirectory) && \
+	LSOF_CC="$(CC)" \
+	LINUX_CLIB="-DGLIBCV=211" \
+	LSOF_INCLUDE="$(ToolIncDir)" \
+	LSOF_LINUX_INCL="$(call GenerateResultPaths,sw/tps/linux,include)" \
+	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+	./Configure \
+	-n \
+	$(TargetOS)
+
+# Build the source.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: build
+build: configure
+	$(Verbose)unset MAKEFLAGS && \
+	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+	CC="$(CC)" \
+	all
+
+# Stage the build to a temporary installation area.
+#
+# We have to unset MAKEFLAGS since they confuse the package build otherwise.
+
+.PHONY: stage
+stage: build | $(ResultDirectory)
+	$(Verbose)unset MAKEFLAGS && \
+	$(MAKE) $(JOBSFLAG) -C $(BuildDirectory) \
+	INSTALL="$(INSTALL) $(INSTALLFLAGS)" \
+	DESTDIR=$(ResultDirectory) \
+	install
+
+clean:
+	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageSourceDir)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(PackageWrapperDir)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(BuildDirectory)
+	$(Verbose)$(RM) $(RMFLAGS) -r $(ResultDirectory)
+
+include post.mak
diff --git a/lsof.patches/lsof-50.description b/lsof.patches/lsof-50.description
new file mode 100644
index 0000000..178860a
--- /dev/null
+++ b/lsof.patches/lsof-50.description
@@ -0,0 +1 @@
+This patch ensures that strftime and localtime are assumed to be present in a cross-compiled environment where LINUX_CLIB has been specified.
diff --git a/lsof.patches/lsof-50.patch b/lsof.patches/lsof-50.patch
new file mode 100644
index 0000000..3b4edc4
--- /dev/null
+++ b/lsof.patches/lsof-50.patch
@@ -0,0 +1,14 @@
+diff -aruN a/lsof_4.85_src/Configure b/lsof_4.85_src/Configure
+--- a/lsof_4.85_src/Configure	2011-09-27 10:27:40.000000000 -0700
++++ b/lsof_4.85_src/Configure	2012-01-02 13:14:04.450661164 -0800
+@@ -5318,8 +5318,8 @@
+ $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
+ if test -x ${LSOF_TMPC}.x	# {
+ then
+-  ./${LSOF_TMPC}.x
+-  if test $? -eq 0	# }
++  ./${LSOF_TMPC}.x > /dev/null 2>&1
++  if test $? -eq 0 || test "X$LINUX_CLIB" != "X"	# }
+   then
+     LSOF_CFGF="$LSOF_CFGF -DHAS_STRFTIME"
+     echo "present"
diff --git a/lsof.patches/lsof-51.description b/lsof.patches/lsof-51.description
new file mode 100644
index 0000000..7a3d3c5
--- /dev/null
+++ b/lsof.patches/lsof-51.description
@@ -0,0 +1 @@
+This patch adds a functional set of install commands.
diff --git a/lsof.patches/lsof-51.patch b/lsof.patches/lsof-51.patch
new file mode 100644
index 0000000..74d36f1
--- /dev/null
+++ b/lsof.patches/lsof-51.patch
@@ -0,0 +1,43 @@
+diff -aruN a/lsof_4.84_src/dialects/linux/Makefile b/lsof_4.84_src/dialects/linux/Makefile
+--- a/lsof_4.84_src/dialects/linux/Makefile	2008-04-15 06:30:04.000000000 -0700
++++ b/lsof_4.84_src/dialects/linux/Makefile	2010-09-08 12:07:58.000000000 -0700
+@@ -5,9 +5,9 @@
+ 
+ PROG=	lsof
+ 
+-BIN=	${DESTDIR}
++BIN=	${DESTDIR}/usr/bin
+ 
+-DOC=	${DESTDIR}
++DOC=	${DESTDIR}/usr/share/man/man8
+ 
+ I=/usr/include
+ S=/usr/include/sys
+@@ -51,23 +51,10 @@
+ 	(cd lib; ${MAKE} -f Makefile.skel clean)
+ 
+ install: all FRC
+-	@echo ''
+-	@echo 'Please write your own install rule.  Lsof should be installed'
+-	@echo 'setuid to root if you wish any lsof user to be able to examine'
+-	@echo 'all open files.  Your install rule actions might look something'
+-	@echo 'like this:'
+-	@echo ''
+-	@echo '    install -m 4xxx -o root -g $${GRP} $${PROG} $${BIN}'
+-	@echo '    install -m 444 $${MAN} $${DOC}'
+-	@echo ''
+-	@echo 'You will have to complete the 4xxx modes, the GRP value, and'
+-	@echo 'the skeletons for the BIN and DOC strings, given at the'
+-	@echo 'beginning of this Makefile, e.g.,'
+-	@echo ''
+-	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+-	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+-	@echo '    GRP= sys'
+-	@echo ''
++	mkdir -p ${BIN}
++	install ${PROG} ${BIN}
++	mkdir -p ${DOC}
++	install ${MAN} ${DOC}
+ 
+ ${LIB}: FRC
+ 	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
diff --git a/lsof.tar.bz2 b/lsof.tar.bz2
new file mode 100644
index 0000000..b7f32ad
--- /dev/null
+++ b/lsof.tar.bz2
Binary files differ
diff --git a/lsof.url b/lsof.url
new file mode 100644
index 0000000..ea4a69c
--- /dev/null
+++ b/lsof.url
@@ -0,0 +1 @@
+ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_4.85.tar.bz2
diff --git a/lsof.version b/lsof.version
new file mode 100644
index 0000000..12cf98e
--- /dev/null
+++ b/lsof.version
@@ -0,0 +1 @@
+4.85
diff --git a/lsof_4.85/00.README.FIRST_4.85 b/lsof_4.85/00.README.FIRST_4.85
new file mode 100644
index 0000000..f19e0d7
--- /dev/null
+++ b/lsof_4.85/00.README.FIRST_4.85
@@ -0,0 +1,29 @@
+A tour of the lsof_4.85 distribution:
+
+  00.README.FIRST_4.85 is this file.
+
+  README.lsof_4.85 contains distribution and security information.
+
+  RELEASE.SUMMARY_4.85 contains a summary of the lsof 4.85
+  distribution.
+
+  lsof_4.85_src.tar is the lsof 4.85 source tar archive.
+
+  lsof_4.85_src.tar.sig is a detached GPG certificate for
+  lsof_4.85_src.tar.
+
+I suggest you follow these steps:
+
+1.  Read 00.README.FIRST_4.85.
+
+2.  Read README.lsof_4.85 and follow its instructions to verify
+    the authenticity of lsof_4.85_src.tar.
+
+3.  Unpack lsof_4.85_src.tar -- use `tar xf lsof_4.85_src.tar`.
+    That will produce an lsof_4.85_src sub-directory.
+
+4.  Change to the lsof_4.85_src sub-directory and read its
+    00.README.FIRST file.
+
+Vic Abell <abe@purdue.edu>
+Tue Sep 27 14:06:28 EDT 2011
diff --git a/lsof_4.85/README.lsof_4.85 b/lsof_4.85/README.lsof_4.85
new file mode 100644
index 0000000..bbad47e
--- /dev/null
+++ b/lsof_4.85/README.lsof_4.85
@@ -0,0 +1,128 @@
+
+                Information About This Lsof Distribution
+
+
+What You Have
+=============
+
+If you got this far without being confused, then you are probably
+familiar with the construction of the lsof distribution or you have
+read RELEASE.SUMMARY_4.85.  If either is the case, please skip to
+the Inventory section.  If you haven't read RELEASE.SUMMARY_4.85,
+I suggest you do it now, because it explains how the lsof distribution
+is constructed and other useful things about lsof, including a
+summary of changes for the past few lsof revisions.
+
+Even though you may have thought you were getting lsof.tar.bz2,
+lsof.tar.gz or lsof.tar.Z with ftp, you really got lsof_4.85.tar.bz2,
+lsof_4.85.tar.gz or lsof_4.85.tar.Z.  That's because the triplet of
+lsof.tar.* files are symbolic links to their longer-named counterparts.
+
+The bzip2'd, gzip'd or compressed tar files with lsof_, followed by a
+number, are wrapper archives, designed to package the lsof source
+archive, this file, other documentation files, and a GPG authentication
+certificate together.
+
+The number, 4.85, is the lsof revision number.  When you bunzip2'd,
+gunzip'd or uncompressed lsof_4.85.tar.* and used tar to unpack
+lsof_4.85.tar, you got: 00.README.FIRST_4.85, describing the contents
+of lsof_4.85; README.lsof_4.85; lsof_4.85_src.tar; and
+lsof_4.85_src.tar.sig.  All are identified with the revision number.
+You're reading README.lsof_4.85.  lsof_4.85_src.tar.sig is a GPG
+certificate that authenticates the lsof source archive,
+lsof_4.85_src.tar.
+
+After you read the Inventory and Security sections, and hopefully
+after you check the GPG certificate, unpack the lsof_4.85_src.tar
+source archive and you will get a sub-directory, named lsof_4.85_src,
+that contains the lsof 4.85 source distribution.
+
+
+Inventory
+=========
+
+Once you have unpacked lsof_4.85_src.tar.tar, you can check
+lsof_4.85_src for completeness by changing to that sub-directory
+and running the Inventory script.  The lsof_4.85_src/Configure
+script runs the Inventory script, too.  The Configure script also
+calls a customization script, called Customize.  You can direct
+Configure to avoid calling Inventory and Customize with the -n
+option.
+
+See the Distribution Contents section of the 00DIST file and The
+Inventory Script section of the 00README file for more information
+on the contents of the lsof distribution, and the Configure,
+Customize and Inventory scripts.  The 00DIST and 00README files
+will be found in the lsof_4.85_src sub-directory you just created.
+
+
+Security
+========
+
+The md5 checksum for lsof_4.85_src.tar is:
+
+  MD5 (lsof_4.85_src.tar) = 93d972459bbae304951b438d63e03e64
+
+A good source for an MD5 checksum computation tool is the OpenSSL
+project whose work may be found at:
+
+  www.openssl.org
+
+You can use the openssl "dgst" operator to compute an MD5 checksum --
+e.g.,
+
+  $ openssl dgst -md5 lsof_4.85_src
+
+The old-style sum(1) checksum for lsof_4.85_src.tar (Please read
+the next paragraph if you don't get this value.) is:
+
+  62553   8391 lsof_4.85/lsof_4.85_src.tar
+
+If your dialect's sum(1) program defaults to the new style algorithm
+(e.g., Solaris), you may have to use its -r option (or use the
+Solaris /usr/ucb/sum).  If your Unix dialect doesn't have a sum(1)
+program (e.g., FreeBSD, or NetBSD), use its cksum(1) program with
+the -o1 option to get an old-style checksum.  You may also need to
+ignore the block count, depending on the block size used on your
+your system (i.e., 512 or 1,024).  The sum(1) that produced the
+above checksum considers block size to be 512; in contrast the BSD
+cksum(1) programs' -o1 option considers block size to be 1,024.
+
+lsof_4.85_src.tar.sig is a GPG certificate file, using my public
+key.  My key may be available on some public key servers under the
+names:
+
+    Victor A. Abell <abe@cc.purdue.edu>
+ or
+    Victor A. Abell <abe@purdue.edu>
+
+You will also find it at:
+
+  ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/Victor_A_Abell.gpg
+
+Get my key and install it in your public key ring.
+
+Once my key is installed, use this command to check the certificate
+of lsof_4.85_src.tar:
+
+    gpg --verify lsof_4.85_src.tar.sig lsof_4.85_src.tar
+
+If the certificate check isn't good, lsof_4.85_src.tar is suspect.
+Report the problem to me via e-mail at <abe@purdue.edu>.
+
+If you don't have GPG, you can compare the md5 checksum of
+lsof_4.85_src.tar to the value listed in this file.  However, that
+is a less reliable authentication method, since it can't detect
+changes to both lsof_4.85_src.tar and the md5 checksum value listed
+in this tile.
+
+Other Security
+==============
+
+Signature information for the distribution file that contains
+this file may be found in the CHECKSUMS file that is located
+where the distribution file was found.
+
+
+Victor A. Abell <abe@purdue.edu>
+Tue Sep 27 14:06:26 EDT 2011
diff --git a/lsof_4.85/RELEASE.SUMMARY_4.85 b/lsof_4.85/RELEASE.SUMMARY_4.85
new file mode 100644
index 0000000..63c72fa
--- /dev/null
+++ b/lsof_4.85/RELEASE.SUMMARY_4.85
@@ -0,0 +1,333 @@
+		    lsof (LiSt Open Files) version 4
+			    (revision 4.85)
+
+
+    ********************************************************************
+    | The latest release of lsof is always available via anonymous ftp |
+    | from lsof.itap.purdue.edu.  Look in pub/tools/unix/lsof.         |
+    ********************************************************************
+
+******************************************************************************
+| CHECK THE PATCHES/ SUBDIRECTORY FOR FIXES TO THE LATEST LSOF DISTRIBUTION. |
+******************************************************************************
+
+ **************************************************************************
+ | AVOID USING PRE-BUILT LSOF BINARIES: SEE THE "PRE-BUILT LSOF BINARIES" |
+ |                 SECTION IN 00README FOR AN EXPLANATION.                |
+ **************************************************************************
+
+   **********************************************************************
+   | READ 00LSOF-L FOR INFORMATION ON THE LSOF-L LISTSERV MAILING LIST. |
+   **********************************************************************
+
+    *********************************************************************
+    |      CHECK 00FAQ BEFORE REPORTING BUGS TO <abe@purdue.edu>.       |
+    | 00FAQ ALSO AT: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ |
+    *********************************************************************
+
+    ********************************************************************
+    | IMPORTANT!  This README file explains how the lsof tar archive   |
+    | is assembled -- it's a "wrapper" tar archive.  Please read the   |
+    | explanation of its naming and construction, immediately          |
+    | following the initial list of supported dialects.                |
+    ********************************************************************
+
+
+Lsof version 4 lists open files for running UNIX processes.  It is a
+descendent of ofiles, fstat, and lsof versions 1, 2, and 3.  It has
+been tested recently on these UNIX dialects.
+
+	AIX 5.3
+	Apple Darwin 9 and Mac OS X 10.[56]
+	FreeBSD 4.9 and 6.4 for x86-based systems
+	FreeBSD 8.[02] and 9.0 for AMD64-based systems
+	Linux 2.1.72 and above for x86-based systems
+	Solaris 9, 10 and 11
+
+Lsof 4 may work on other versions of these dialects, but hasn't been
+tested there recently.  Lsof versions 2 and 3 are still available and
+may provide older dialect version support.  See the notes on them in
+this file.
+
+The pub/tools/unix/lsof/contrib directory on lsof.itap.purdue.edu also
+contains information on other ports.
+
+Version 4 of lsof is distributed as bzip2'd, gzip'd and compressed tar
+archives in the files:
+
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof.tar.bz2
+  and
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof.tar.gz
+  and
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof.tar.Z
+
+These files are links to the current distribution, whose name includes
+the revision number:
+
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof_<rev>.tar.bz2
+  and
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof_<rev>.tar.gz
+  and
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof_<rev>.tar.Z
+
+<rev> is the revision number -- e.g., 4.85.  These archives are called
+wrappers, because the lsof source tar archive, its GPG certificate
+(lsof_<rev>_src.tar.sig), and some documentation files are wrapped
+together inside them.  (The GPG certificate authenticates the source
+tar archive.)  A tar archive with: a ``.bz2'' suffix has been
+compressed with bzip2; ``.gz'', with gzip; and ``.Z'', with compress.
+
+When the wrapper tar is gunzip'd or uncompressed, and its tar archive
+contents are extracted, an lsof_4.85 subdirectory is created in the
+directory where the extraction was performed.  The lsof_4.85
+subdirectory contains these files:
+
+	00.README.FIRST		contains introductory distribution
+				information.
+
+	README.lsof_4.85	contains instructions for the
+				security-conscious on how to be
+				sure that no one has tampered with
+				the distribution.
+
+	RELEASE_SUMMARY_4.85	is this file.
+
+	lsof_4.85_src.tar       is a tar archive, containing the
+				lsof sources.  When extracted with
+				tar it creates a subdirectory named
+				lsof_4.85_src in the directory
+				where the extraction was performed.
+				The lsof source files will be found
+				in lsof_4.85_src.
+
+	lsof_4.85_src.tar.sig   is a GPG certificate, authenticating
+				the lsof_4.85_src.tar archive.  See the
+				README.lsof_4.85 file for more
+				information on GPG authentication of
+				lsof_4.85_src.tar.
+
+If you've obtained this file and an lsof distribution from a mirror
+site, please be aware that THE LATEST VERSION OF LSOF IS AVAILABLE VIA
+ANONYMOUS FTP FROM LSOF.ITAP.PURDUE.EDU IN THE PUB/TOOLS/UNIX/LSOF
+DIRECTORY.
+
+Patches to lsof distributions may be found in the patches/ sub-
+directory where you found lsof.tar.bz2, lsof.tar.gz or lsof.tar.Z.
+If there are any patches to the current distribution, they will be
+found in the patches/4.85/ branch.
+
+(If you need a copy of gunzip, look for it at prep.ai.mit.edu in
+pub/gnu/gzip*.)
+
+* The September 27, 2011 revision (4.85): adds an automatic work-around for
+  an lgrp_root conflict in some Solaris 9 and 10 versions; supports FreeBSD
+  7.4 and 8.[12] (8.1 not tested); adds fixes for Solaris 11 kernel module
+  path determination; picked lint for Linux; added more Linux cross
+  configuration support; adds support for Mac OS X 10.6; tested on FreeBSD
+  6.4; adapts to FreeBSD ZFS update; drops support for FreeBSD 7.x; adjusts
+  for Solaris 10 with patch 144488-10; added Linux +|-e option support;
+  adjusts for a FreeBSD 9 change; fixes a Linux AF_UNIX path reporting bug;
+  adjusts for dropping of RPC headers from Linux GlibC 2.14; adds Linux
+  Netlink protocol support; corrects UDP6-lite Linux path.
+
+
+Read the 00.README.FIRST in the lsof distribution first.
+
+Read the 00DIST distribution file for more details on feature additions
+and bug fixes.
+
+The 00README distribution file has build instructions, dialect
+descriptions, special feature discussions, and installation hints.
+
+The 00FAQ file contains a list of frequently asked questions and their
+answers.
+
+The 00DCACHE file explains device cache file path formation.
+
+The 00PORTING file contains information on porting lsof to other UNIX
+dialects.
+
+The 00QUICKSTART file gives a quick introduction to using lsof.
+
+The distribution files lsof.8 (nroff source) and lsof.man (nroff
+formatted output) contain the manual page for lsof; it is the only
+other documentation besides the source code (it's included).
+
+
+Version 4 Binaries
+==================
+
+Version 4 binaries for some revisions, dialects, and platforms may be
+found in pub/tools/unix/lsof/binaries.  Check the README files for
+exact descriptions.  Check the dialect-specific Makefiles for
+installation instructions.  CHECKSUMS and GPG certificates are provided
+for authentication.
+
+Please think very carefully before you decide to use a pre-built binary
+instead of making your own from the sources.  Here are some points to
+consider:
+
+1. Lsof must run setgid or setuid.  Are you willing to trust that
+   power to a binary you didn't construct yourself?
+
+2. Lsof binaries may be generated on a system whose configuration
+   header files differ from yours.  Under Digital UNIX (DEC OSF/1), for
+   example, lsof includes header files from the machine's configuration
+   directory, /sys/<name>.  Are you willing to gamble that your
+   configuration directory's header files match the ones used to
+   compile lsof?
+
+3. Lsof is often configured with specific options that are determined
+   from the configuration of the system on which it is configured --
+   e.g., Solaris patch level, dynamic loader libraries, etc.  Are you
+   sure that the lsof binary you retrieve will have been configured for
+   your system? If you get a binary that is misconfigured for you, it
+   may not work at all.
+
+If you haven't already guessed, I believe firmly that you should
+retrieve sources and build your own binary.  If you still want to use
+the distribution binaries, please authenticate what you retrieved with
+the GPG certificates; please compare checksums, too.
+
+
+Version 4 Checksums
+===================
+
+Security checksums -- both MD5 and sum(1) -- for revisions of lsof
+version 4 are contained in the README.lsof_<rev> files in the wrapper
+tar archives of pub/tools/unix/lsof.
+
+The CHECKSUMS file, found with the distribution archives, contains
+information on validating the archives with external MD5 checksums and
+external GPG certificates.
+
+
+GPG Certificates
+================
+
+The lsof wrapper tar archive includes a GPG certificate file in its
+contained lsof_4.71_src.tar.sig file.
+
+Binary files have detached GPG certificates that may be found in their
+directories with ".sig" extensions.
+
+The certificates are signed with my GPG public key, which may be found
+in the file:
+
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/Victor_A_Abell.gpg
+
+My key may also be available at some public key servers,
+
+There is also authentication information in the CHECKSUMS file (a link
+to CHECKSUMS_<rev>), found with the lsof distribution files.  CHECKSUMS
+contains external MD5 checksums for the distribution files and
+information on using the external GPG certificates, found with the lsof
+distribution files.
+
+
+Old Dialect Support
+===================
+
+Remnants of source code and binaries for dialects for which lsof once
+provided support may be obtained by request.  Send the request to
+abe@purdue.edu.
+
+Dialects no longer supported include:
+
+	CDC EP/IX
+	MIPS RISC/os
+	Motorola V/88
+	Pyramid DC/OSx
+	Pyramid Reliant UNIX
+	Sequent DYNIX
+	SGI IRIX
+	SunOS 4.1.x
+	Ultrix
+
+Generally I drop support for a dialect when I no longer have access to
+a test system.
+
+
+Lsof Version 2
+==============
+
+The version 3 predecessor, revision 36 of version 2, is also available
+upon request.  Send the request to abe@purdue.edu.
+
+I recommend you avoid lsof version 2.  It's out of date and I no
+longer provide support for it.  (Versions 3 and 4 support more
+dialects, and have many enhancements, bug fixes, and improvements.)
+Version 2 was tested on the following UNIX dialects:
+
+	AIX 3.2.[1234] for the IBM RISC/System 6000
+	DEC OSF/1 1.[23] and 2.0 for the DEC Alpha
+	EP/IX 1.4.3 and 2.1.1 for the CDC 4680
+	ETAV 1.17 for the ETA-10P*
+	FreeBSD 1.0e for x86-based systems
+	HP-UX [789].x for HP systems
+	IRIX 4.0.5 and 5.1.1 for SGI systems
+	NEXTSTEP 2.1, 3.0, 3.1 for NeXT systems
+	Sequent Dynix 3.0.12 for Sequent Symmetry systems
+	SunOS 4.1.[123] for Sun 3 and 4 systems
+	SunOS 5.[13] (Solaris 2.[13]) for Sun 4 systems
+	Ultrix 2.2 and 4.2 for DEC systems
+
+(If you need a copy of gunzip, look for it at prep.ai.mit.edu in
+pub/gnu.)
+
+
+Version 2 Checksums
+===================
+
+MD5:
+	(OLD/lsof236tar.gz) = f8a1ab3971ea2f6a3ea16752f84409e8
+
+sum(1):
+	39996   106 OLD/lsof236tar.gz
+
+The file OLD/lsof236tar.gz.asc is a detached PGP certificate that may
+be used to authenticate OLD/lsof236tar.gz with my PGP public key.  You
+may find my PGP public key at:
+
+  ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD/Victor_A_Abell.pgp
+    
+
+Lsof Version 3
+==============
+
+The last revision of lsof version 3, 3.88, may obtained by request.
+Send the request to abe@purdue.edu.
+
+I recommend version 4 over version 3.  It is the version I actively
+support.
+
+Lsof version 3 was tested on these UNIX dialects:
+
+	AIX 3.2.5, 4.1[.[1234]], and 4.2
+	BSDI BSD/OS 2.0, 2.0.1, and 2.1 for x86-based systems
+	DC/OSx 1.1 for Pyramid systems
+	Digital UNIX (DEC OSF/1) 2.0, 3.0, 3.2, and 4.0
+	EP/IX 2.1.1 for the CDC 4680
+	FreeBSD 1.1.5.1, 2.0, 2.0.5, 2.1, 2.1.5 for x86-based
+	    systems
+	HP-UX 8.x, 9.x, 10.01, 10.10, and 10.20
+	IRIX 5.2, 5.3, 6.0, 6.0.1, and 6.[124]
+	Linux 2.0.3[01] and 2.1.57 for x86-based systems
+	NetBSD 1.0, 1.1, and 1.2 for x86 and SPARC-based
+	    systems
+	NEXTSTEP 2.1 and 3.[0123] for NEXTSTEP architectures
+	OpenBSD 1.2 and 2.0 for x86-based systems
+	Reliant UNIX 5.43 for Pyramid systems
+	RISC/os 4.52 for MIPS R2000-based systems
+	SCO OpenServer 1.1, 3.0, and 5.0.[024] for x86-based 
+	    systems
+	SCO UnixWare 2.1 and 2.1.1 for x86-based systems
+	Sequent PTX 2.1.[1569], 4.0.[23], 4.1.[024], 4.2[.1],
+	    and 4.3
+	Solaris 2.[12345], 2.5.1, and 2.6-Beta
+	SunOS 4.1.x
+	Ultrix 4.2, 4.3, 4.4, and 4.5
+
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src.tar b/lsof_4.85/lsof_4.85_src.tar
new file mode 100644
index 0000000..c4b47fc
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src.tar
Binary files differ
diff --git a/lsof_4.85/lsof_4.85_src.tar.sig b/lsof_4.85/lsof_4.85_src.tar.sig
new file mode 100644
index 0000000..2b6667e
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src.tar.sig
Binary files differ
diff --git a/lsof_4.85/lsof_4.85_src/00.README.FIRST b/lsof_4.85/lsof_4.85_src/00.README.FIRST
new file mode 100644
index 0000000..17c8d70
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00.README.FIRST
@@ -0,0 +1,47 @@
+Now that you have the lsof distribution, I suggest:
+
+*  If you're unfamiliar with lsof, read 00README for information on
+   Configuring and building lsof, 00QUICKSTART for tips on using lsof.
+
+   If you're too impatient for that, do this:
+
+      $ ./Configure <put your UNIX dialect's abbreviation here>
+        (Do the inventory step, as you prefer.)
+        (Do the customization step, as you prefer.)
+      $ make
+      $ ./lsof -h
+
+   To get a list of UNIX dialect abbreviations:
+
+      $ Configure -h
+
+   Please don't be impatient -- read the documentation first.
+
+*  Read the current distribution's details in 00DIST.
+
+*  If you want technical details, read 00DCACHE and 00PORTING.
+
+*  If you want to cross-configure, read 00XCONFIG.
+
+*  Use the test suite, described in 00TEST, by:
+
+	$ cd tests
+	$ make
+
+   and possibly:
+
+	$ make opt
+
+*  If you're having trouble, read 00FAQ.  (Please read 00FAQ before
+   you send a bug report.)
+
+*  Lsof contributors may find their names in 00CREDITS.  (Thanks, again.)
+
+*  Read the lsof.man page file.  Its nroff source is in lsof.8.
+
+*  Consider subscribing to the lsof-l mailing list -- read 00LSOF-L
+   for details.
+
+
+Vic Abell <abe@purdue.edu>
+April 19, 2002
diff --git a/lsof_4.85/lsof_4.85_src/00CREDITS b/lsof_4.85/lsof_4.85_src/00CREDITS
new file mode 100644
index 0000000..bf9dbc7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00CREDITS
@@ -0,0 +1,529 @@
+
+			    Lsof Credits
+
+I owe an enormous debt to the users of lsof who have contributed
+to its steady growth.  The size of the list of people who have
+helped me, while it has grown too large to include in the lsof man
+page any more, is a testimonial to their generosity.
+
+First I acknowledge a debt to the work of Dan Bernstein, Michael
+``Ford'' Ditto, Tom Dunigan, Alexander Dupuy, Vik Lall, Ray Moody,
+C. Spencer, Michael Spitzer and those who wrote Berkeley's fstat
+program, all contributors to lsof's predecessors.
+
+I thank Doug McKenzie for his HP-UX proctor program and Rich Kulawiec
+for pointing it out.
+
+Finally I thank all the following people who have used lsof, pointed
+out its flaws, described its shortcomings, offered suggestions for
+improving it, supplied code for it, gave me technical advice, and
+provided test systems where I was able to do development work.
+
+	Szilveszter Adam
+	David Addison
+	Elias Halldor Agustsson
+	Per Allansson
+	Jim Ankenbrandt
+	Richard Allen
+	Thomas Anders
+	Ric Anderson
+	Stuart Anderson
+	Michael Antlitz
+	Marc Auslander
+	Tigran Aivazian
+	Jos Backus
+	David Bacon
+	Alexis Ballier
+	Scott Ballew
+	Ade Barkah
+	Alon Bar-Lev
+	Brett Bartick
+	Anthony Baxter
+	John Beacom
+	Bruce Beare
+	M. Jay Beck
+	Marek Behun
+	Bill Behr
+	Michael Beirne
+	Marc Bejarano
+	Andrew Bell
+	Steve Bellenot
+	Robert Benites
+	Dmitry Berezin
+	Ulrich Bernhard
+	Peter J. Bertoncini
+	Dave Bianchi
+	Mark Bixby
+	Allan Black
+	Jan Blunck
+	Achim Bohnet
+	Steve Bonds
+	Mark Bonsack
+	Volker Borchert
+	Bill Bormann
+	Ermin Borovac
+	Heddy Boubaker
+	Pieter Bowman
+	Michael Bracewell
+	H. Merijn Brand
+	Danny Braniss
+	Thomas Braunbeck
+	Kieran Broadfoot
+	Dean Brock
+	Hal Brooks
+	Andrew Brown
+	Jim Brown
+	Michael Bryan
+	Matthew Burt
+	Robert Byrnes
+	Pierfrancesco Caci
+	Bill Campbell
+	David Capshaw
+	John Caruso
+	Jon Champlin
+	Kris Chandrasekhar
+	Albert Chin-A-Young
+	Bernt Christandl
+	Marc Christensen
+	Hans Petter Christiansen
+	Tom Christiansen
+	Yves Christophe
+	Richard Chycoski
+	A. Channing Clark
+	Axel Clauberg
+	John Clear
+	David Clissold
+	Richard Coley
+	John Colgrave
+	David Comay
+	Lionel Cons
+	Bob Cook
+	Patrick Connor
+	Carl Cook
+	Jim Cooper
+	Roger Cornelius
+	Doug Crabill
+	Eric Cronin
+	Kim Culhan
+	Dave Curry
+	Robert Dahlem
+	Guy Dallaire
+	D. Chris Daniels
+	Renata Maria Dart
+	Ian Darwin
+	Carl E. Davidson
+	David Day
+	Will Day
+	Frederic Delanoy
+	Mike Depot
+	Steve Dibbell
+	Hugh Dickins
+	David DiGiacomo
+	Casper Dik
+	John DiMarco
+	Don Draper
+	Michel Dubois
+	Eric Dumazet
+	Dick Dunbar
+	Marc Duponcheel
+	Jan Dvorak
+	Calle Dybedahl
+	John Dzubera
+	Jeff Earickson
+	Greg Earle
+	Bernd Eckenfels
+	Niklas Edmundsson
+	Philip Edwards
+	Robert Ehrlich
+	Mark W. Eichin
+	Doug Eldred
+	Scott Ellentuch
+	Tom Endo
+	Grant Erickson
+	Craig Everhart
+	Chris Evert
+	Bob Farmer
+	Sami Farin
+	Mike Feldman
+	Quentin Fennessy
+	Ian Fitchet
+	Toralf Foerster
+	Bob Foertsch
+	Pierre-Yves Fontaniere
+	Ralph Forsythe
+	Jason Fortezzo
+	Mike Fraser
+	Curt Freeland
+	Terry Friedrichsen
+	Mike Frysinger
+	Harvey Garner
+	Carson Gaspar
+	Stuart D. Gathman
+	Brian L. Gentry
+	Dave Gilbert
+	Steve Ginsberg
+	Edwin Groothuis
+	Jin Guojun
+	Kurt Gollhardt
+	Roman Gollent
+	Steve Gonczi
+	Bill Goodridge
+	Julian Gordon
+	Marcin Gozdalik
+	Henry Grebler
+	Richard Green
+	Chaskiel Grundman
+	Armin Gruner
+	David Gutierrez
+	Robert Hall
+	Garner Halloran
+	Adam Hammer
+	Charles Hannum
+	Vlad Harchev
+	Craig Harmer
+	Michael Haro
+	Peter Harvey
+	Steinar Haug
+	Sheldon Hearn
+	John Heasley
+	Wolfgang Hecht
+	Janet Hempstead
+	Michael Hennecke
+	Randolph J. Herber
+	Andrew Hill
+	Kurt Hillig
+	Steven Hinkle
+	Paul Hite
+	Billy Ho
+	Michael Hocke
+	Brett Hogden
+	Gaylord Holder
+	Kjetil Torgrim Homme
+	Pekka Honkanen
+	Jeffrey C. Honig
+	Heidi Hornstein
+	Michael A. Hovan III
+	Barbara Howe
+	J. Nelson Howell
+	Jeff Howie
+	Louis Huemiller
+	John Hughes
+	Gerrit Huizenga
+	Peter Ilieve
+	Mayer Ilovitz
+	Gregory A. Ivanov
+	John Jackson
+	Kurt Jaeger
+	Edward Jajko
+	Marian Jancar
+	Paul Jarc
+	Jakub Jelinek
+	Robert Jelinek
+	Bruce Jerrick
+	Carl Johnson
+	Dion Johnson
+	Jeff Johnson
+	Douglas B. Jones
+	LaMont Jones
+	Peter Jordan
+	Arne H. Juul
+	Pasi Kaara
+	Frank Kaefer
+	Keith Kalet
+	Claus Kalle
+	Henri Karrenbeld
+	Amir Katz
+	Henry Katz
+	Kawaljeet Kaur
+	Doug Kehn
+	Kris Kennaway
+	Terry Kennedy
+	Shane Kenney
+	Andrew Kephart
+	Robert Kiessling
+	Joshua Kinard
+	Don Kirouac
+	Steve Kirsch
+	Philip Kizer
+	Thomas Klausner
+	Roger Klorese
+	Peter Klosky
+	Przemek Klosowski
+	Angelos D. Keromytis
+	Radko Keves
+	Valdis Kletnieks
+	Chris Kordish
+	Alek O. Komarnitsky
+	Joseph Kowalski
+	Christian Krackowizer
+	Paul Kranenburg
+	Troyan Krastev
+	Brad Krebs
+	Alex Kreis
+	Johannes Kroeger
+	Vincent Kujala
+	Ken Laing
+	Shirley Lam
+	Erwin Lansing
+	Victoria H. Lau
+	Markus Lautenbacher
+	Steve Lacey
+	Marc Aurele La France
+	Chad R. Larson
+	Steve Laubscher
+	Andrei V. Lavreniyuk
+	Loc Le
+	Tin Le
+	Diane Lebel
+	Francis Le Bourse
+	Kyungjoon Lee
+	Marty Leisner
+	Maciej Lesniewski
+	Stuart Levy
+	Ben Lewis
+	Michael Lewis
+	Angel Li
+	Ambrose Li
+	Wendy Lin
+	Carl E. Lindberg
+	Onno van der Linden
+	Johan Lindquist
+	James Lingard
+	Jason Lingohr
+	Robert Lipe
+	Gabor Liptak
+	Friedel Loinger
+	Michael Long
+	Pete Lord
+	Steve Logue
+	Bela Lubkin
+	Pav Lucistnik
+	Horst Luehrsen
+	Andreas Luik
+	Timothy J. Luoma
+	Michael Mackenzie
+	Lawrence MacIntyre
+	Jerome Marchand
+	Benson Margulies
+	Claude Marinier
+	Chris Markle
+	Roy Marples
+	Eberhard Mater
+	James Mathiesen
+	Tom Matthews
+	Fletcher Mattox
+	David Mazieres
+	Brian McAllister
+	Scott McClung
+	Dale McCluskey
+	Terry McCoy
+	Sean McDermott
+	Duncan McEwan
+	Dwight McKay
+	William McVey
+	Eric McWhorter
+	Marjo F. Mercado
+	Dan Mercer
+	Bill Melvin
+	Andrew Merril
+	Richard van Meurs
+	Jim Mewes
+	Gary Millen
+	Timothy Miller
+	Davin Milun
+	Yuliy Minchev
+	Jim Mintha
+	Mike Miscevic
+	Arkadiusz Miskiewicz
+	Janardhan Molumuri
+	Nasser Momtaheni
+	Laurent Montaron
+	Phillip Moore
+	Dmitry Morozovsky
+	John Paul Morrison
+	John Gardiner Myers
+	Jeffrey Mogul
+	Dave Morrison
+	Pat Myrto
+	Toshiya Nakamura
+	Filippo Natali
+	Allan Nathanson
+	Chance Neale
+	Dan Nelson
+	Vladislav Nespor
+	Bjorn S. Nilsson
+	Anders Nordby
+	Joseph J. Nuspl Jr.
+	David O'Brien
+	Alexandre Oliva
+	Craig B. Olofson
+	Dave Olson
+	Rainer Orth
+	Sergey A. Osokin
+	Keith Parks
+	Will Partain
+	Vasco Pedro
+	Mark Peek
+	Ezra Peisach
+	Bill Pemberton
+	Lee Penn
+	Gildas Perrot
+	Jesse Perry
+	Nathan Peterson
+	Dominique Petitpierre
+	Hung Pham
+	Ray Phillips
+	Francois Pinard
+	Alex Podlecki
+	Lutz Poetschulat,
+	John Polstra
+	Scott Presnell
+	Mark Price
+	Philippe-Andre Prindeville
+	David Putz
+	Tom Qin
+	Kurtis Rader
+	Peter Radig
+	Jean-Pierre Radley
+	Tim Ramsey
+	Dewan Rashid
+	Richard J. Rauenzahn
+	Louis Rayman
+	Brian Redman
+	Eric S. Raymond
+	Erwin Reyns
+	Aaron Rhodes
+	Jim Reid
+	Jean-Luc Richier
+	Ingimar Robertson
+	Sylvain Robitaille
+	Larry Rogers
+	Malgorzata Roos
+	Larry Rosenman
+	Stephan Rossi
+	Kevin Ruderman
+	Wolfgang Rupprecht
+	Pavol Rusnak
+	Conrad J. Sabatier
+	Klaus Saggerer
+	Chris Schanzle
+	Igor Schein
+	Horst Scheuermann
+	Peter Schiffer
+	Michael Schmitz
+	Larry Schwimmer
+	Hendrik G. Seliger
+	Igor V. Semenyuk
+	Jonathan Sergent
+	Frank Sanders
+	Berkley Shands
+	Gregory Neil Shapiro
+	Eyal Shaynis
+	Michael Shields
+	Wesley Shields
+	Philip Shin
+	Anthony Shortland
+	Dave Sill
+	John Silva
+	Chuck Silvers
+	Gerry Singleton
+	Leonard Sitongia
+	Kevin Smallwood
+	Curt Smith
+	Ben Smithurst
+	Douglas R. Smith
+	Kevin Smith
+	Chang Song
+	Josh Soref
+	John Speno
+	Kenneth Stailey
+	Piet Starreveld
+	David Steiner
+	Charles Stephens
+	Marc Stephenson
+	Chip Stettler
+	Dave Stevens
+	Jeff Stewart
+	Diana Stockdale
+	Andreas Stolcke
+	Jeff Stoner
+	Sushila Subramanian
+	Jan Ole Suhr
+	Mike Sullivan
+	Patrick D. Sullivan
+	Peter Svensson
+	Chris Sylvain
+	Miklos Szeredi
+	Paul Szabo
+	Dale Talcott
+	Jon A. Tankersley
+	Jan Tax
+	Samuel Thibault
+	Andy Thomas
+	Matthew Thurmaier
+	Chris Timmons
+	Andrzej Tobola
+	R. Lindsay Todd
+	Zdenko Tomasic
+	Michael Townsend
+	Linus Torvalds
+	Mike Tracy
+	Dan Trinkle
+	Erik Trulsson
+	Lars Tunkrans
+	Lenny Turetsky
+	Kevin Vajk
+	Peter Valchev
+	John R. Vanderpool
+	Peter Van Epp
+	Peter C. Vernam
+	Peter Vines
+	Bob Ward
+	Jules van Weerden
+	Tom Weaver
+	Fernando A.B. Whitaker
+	Tom Whitty
+	Carson Wilson
+	David J. Wilson
+	Frank Winkler
+	Marc Winkler
+	Mark Vasoll
+	Holger VanKoll
+	Robert Vernon
+	Joep Vesseur
+	Larry Virden
+	Jos Vos
+	Jun Biao Wang
+	Christopher J Warweg
+	Bill Watson
+	Florian M. Weps
+	Joel White
+	Paul Wickman
+	Martin Wilke
+	Eric Williams
+	Steve Williams
+	Steve Wilson
+	Erich Wimmer
+	Wally Winzer, Jr.
+	Patrick Wolfe
+	Stephen Woods
+	James Woodward
+	Scott Worley
+	Jan Wortelboer
+	Joshua Wright
+	Sailu Yallapragada
+	Masatake Yamato
+	Donna Yobs
+	Ron Young
+	Blair Zajac
+	Karel Zak
+	Donald Zoch
+	Malcom Zung
+	and Waldemar Zurowski
+
+If I have omitted a contributor's name, the fault is wholly mine,
+and I apologize for the error.
+
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src/00DCACHE b/lsof_4.85/lsof_4.85_src/00DCACHE
new file mode 100644
index 0000000..a6c03ea
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00DCACHE
@@ -0,0 +1,745 @@
+
+    	Configuring The Device Cache File Path
+
+			    Contents
+
+		A.  Introduction and History
+		B.  Device Cache File Format
+		    1.	Integrity Checks
+		    2.	The Setgid and Setuid-root States
+		C. Device Cache File Path Options
+		    1.	Path Named by ``-D''
+		    2.	Path Named in Environment Variable
+		    3.	Default System-wide Path
+			a.  Build Procedure
+		    4.	Default Personal Path
+		    5.	Modified Default Personal Path
+		D. Displaying the Default Path
+		Appendix A, Unix Dialects Without a Device Cache
+		Appendix B, Lsof Dialects and Their Permissions
+		    1.	Setuid-root Lsof Dialects 
+		    2.	Setgid Lsof Dialects That Surrender Setgid
+		   	Permission
+
+
+A. Introduction and History
+===========================
+
+Lsof writes a file of information about the contents of the nodes
+in /dev (or /devices) to reduce its startup overhead on later calls.
+It does this for all Unix dialects, except those noted in Appendix A.
+
+This file, called the device cache file, enables lsof to avoid
+calling the kernel stat(2) function on every node in /dev (or
+/devices) from which it builds a table of correspondence between
+major/minor device numbers and device names.
+
+A full scan of /dev (or /devices) on some systems may involve
+calling the sometimes-slow stat(2) function 10,000 times or more.
+Furthermore, each stat(2) call consumes space in the kernel's name
+cache, forcing from it path name components that would be more
+useful when lsof tries to associate them with open files.
+
+While it's hard to question the usefulness of the device cache,
+it's also hard to decide where it should be written.  When the
+feature was first added, the device cache file was written to /tmp,
+and its ownership was set to that of the real user ID (UID) under
+which the creating lsof process was run.  However, to enable any
+process to update it when /dev (or /devices) changed, lsof set its
+modes to 0666, thus allowing anyone to read or write it.
+
+The writing of a world-readable and world-writable device cache
+file to any place has security weaknesses.  A clever intruder who
+carefully preserves the integrity of the file might be able to
+remove devices that would prevent lsof from observing the intruder's
+files.  A clever intruder might also be able to put a symbolic link
+in place and trick lsof into writing to the link's destination with
+its effective permissions, thus bypassing the real user's (possibly
+weaker) permissions.
+
+Later the location of the device cache file was changed.  It was
+converted to a personal file, located in the home directory of each
+real UID that executed lsof, and owned by that UID.  Thus it was
+no longer possible for one user to affect lsof's access to the
+device cache file, nor was it possible for a user to mount a symbolic
+link attack on a restricted file, but the result was that each lsof
+user had a private copy of the device cache file.
+
+The device cache file feature has undergone some further refinements
+in path name formation to reach its present state.  This documentation
+describes the path name formation options open to the lsof builder
+and user after those refinements, and how lsof attempts to insure
+that none of the options presents a security risk.
+
+
+B. Device Cache File Format
+===========================
+
+The device cache file is a flat file of ASCII text.  It has an
+initial statement of how many sections the file might contain --
+the possible sections are character devices, block devices, clone
+devices, pseudo devices, and checksum.  The character devices and
+checksum sections are always present.
+
+Each section has a header that numbers the entries in the section.
+
+The last section is a checksum section that contains a 16 bit cyclic
+redundancy (CRC) checksum of everything in the file but the checksum
+section itself.
+
+Lsof always sets the permission modes of the device cache file to
+0600, and the owner to the real UID of the process that executes
+lsof; the group, the real group ID (GID) of the lsof process.
+
+Setting the permission modes to 0600 means that a system-wide device
+cache file won't be usable unless the procedure that builds it
+changes the modes after lsof has written it.  A suitable procedure
+for building a system-wide device cache that shows how to adjust
+these inadequate permission modes is given in the Default System-wide
+Path section.
+
+
+B.1. Integrity Checks
+=====================
+
+When lsof opens the device cache file it makes these integrity
+checks:
+
+    1.  Lsof must gain permission from access(2) to be able to
+	open the file for reading.  If lsof is writing the file,
+	it usually cedes permission control to the applicable
+	directory and file modes and ownerships.  (Some additional
+	checks apply and they're described in the sections on path
+	options.)
+
+	By explicit design lsof never writes to the system-wide
+	device cache file, even when the real UID of its process
+	is root.  The system-wide device cache file must be written
+	with a root-owned procedure via the ``-D[b|u<path>'' options
+	-- i.e., under the system administrator's control.  (See
+	the Build Procedure sub-section of the Default System-wide
+	Path section.)
+
+    2.  The device cache file's modes must be 0600 (0644 if lsof
+	is reading a system-wide device cache file) and its size
+	must be non-zero.
+
+    3.  There must be a correctly formatted section count line
+	at the beginning of the file.
+
+    4.  Each section must have a header line with a count that
+	properly numbers the lines in the section.  The first words
+	of legal section titles are "device", "block", "clone",
+	"pseudo", and "CRC".
+
+    5.  The lines of a section must have the proper format.
+
+    6.  All lines are included in a 16 bit CRC, and it is recorded
+	in a non-checksummed section line at the end of the file.
+
+    7.  The checksum computed when the file is read must match the
+	checksum recorded when the file was written.
+
+    8.  The checksum section line must be followed by end-of-
+	information.
+
+    9.  Lsof must be able to get matching results from stat(2)
+	on a randomly chosen entry of the device section.
+
+
+B.2. The Setgid and Setuid-root States
+======================================
+
+There are two fundamental ways in which lsof is granted access to
+restricted system resources.  Both access methods are related to the
+effective permissions given the lsof binary or executable.
+
+The first and preferable way to grant lsof access to system resources
+through the permissions endowed on its executable is the giving of
+set group ID (setgid) permission.  The group is the one that has
+permission to read the kernel memory and swap devices -- e.g., /dev/kmem,
+/dev/mem, /dev/swap, etc.
+
+This method of granting access is called setgid mode because it
+enables lsof to run with an effective group ID set to the one
+granted by the permissions of its executable file and by the group
+that owns the executable file.  See the getegid(2) man page for a
+further discussion of effective group ID.
+
+Usually lsof only needs setgid permission to open access to the
+kernel memory files.  After they're open, lsof drops its setgid
+permission.
+
+The second and least preferable way to grant lsof access to system
+resources through the permissions endowed on its executable is the
+giving of set user ID to root (setuid-root) permission.  This is
+much too strong a permission, but necessary: to use the -X option
+fully for the version of lsof for AIX 5 and above; to use the
+version of lsof for HP-UX 11.11 and above; and to use the version
+of lsof for Linux 2.1.72 and above.  These lsof implementations
+require setuid-root permission to be able to access restricted
+resources -- e.g., the individual files of the /proc file system.
+(But note that the setuid-root Linux lsof doesn't need and has no
+device cache support.)
+
+Lsof never drops setuid-root permission, because it needs that
+power throughout its execution.  However, when the lsof process is
+setuid-root, lsof disallows these device cache file path options:
+
+    1.  It ignores the ``-D[b|r|u]<path>'' options.  It accepts
+        only the ``-Di'' and ``-Dr'' options.
+
+    2.	It refuses to recognize a path supplied via an environment
+	variable.
+
+    3.  It refuses to accept an additional path component from an
+	environment variable to be inserted in the middle of a
+	personal device cache file path.
+
+Each restriction is imposed because setuid-root power might allow
+a malicious user to form a device cache file path that would give
+read access to a normally inaccessible place (That's bad enough.),
+or write access to a critical system file (That's the worst case.)
+
+There is one further state that lsof can enter that is slightly
+different from the setuid-root and setgid states.  That state occurs
+when lsof is being run from a root shell -- i.e., the lsof real
+user ID is root.  To avoid accidental complications, when lsof is
+in this state, it ignores all environment variable options.
+
+In the rest of this document you will find more detailed discussion
+of the special restrictions caused by the type of permission that
+has been given the lsof executable.
+
+
+C. Device Cache File Path Options
+=================================
+
+Lsof offers five options for constructing the path to the device
+cache file.  Each has special conditions and safeguards that
+surround its use.  The options are:
+
+    1.	A device cache file that is named in the <path> component
+	of the parameters of lsof's ``-D'' option.
+
+	=========================================================
+	* This is a default option of the lsof distribution.	*
+	*							*
+	* Paths specified with this option are read-only unless	*
+	* the real UID of the lsof process is root (0), or the	*
+	* lsof process is able to surrender setgid permission	*
+	* (See Appendix B) and it is not setuid-root.		*
+	=========================================================
+
+    2.	A device cache file whose name is specified by an environment
+	variable.
+
+	=========================================================
+	* This is a default option of the lsof distribution.	*
+	*							*
+	* This option is enabled when the lsof dialect is able	*
+	* to surrender setgid permission (See Appendix B.), and	* 
+	* the lsof process is not setuid-root.			*
+	*							*
+	* The environment variable path is read-only if the	*
+	* lsof process does not surrender setgid permission	*
+	* (See Appendix B.)					*
+	=========================================================
+
+    3.	A system-wide default device cache file, located at a path
+	determined by the builder of lsof.  The lsof builder is also
+	responsible for building the device cache file, using a
+	different lsof path formation option at a suitable time --
+	e.g., when the system is booted.
+
+	=========================================================
+	* This is option is disabled by default in the lsof	*
+	* distribution.						*
+	*							*
+	* The path specified with this option is read-only.	*
+	=========================================================
+
+    4.	A default personal device cache file, located in the UID's
+	home directory.
+
+	=========================================================
+	* This is a default option of the lsof distribution.	*
+	=========================================================
+
+    5.	A personal device cache file whose name is modified by an
+	environment variable.
+
+	=========================================================
+	* This is a default option of the lsof distribution.	*
+	*							*
+	* The modified personal path is read-only if the lsof	*
+	* process does not surrender setgid permission.		*
+	*							*
+	* This option is disabled when the lsof process is	*
+	* setuid-root or its real UID is root (0).	   	*
+	=========================================================
+
+When there are multiple choices for the device cache file path,
+lsof chooses from the above list in the order the list is given,
+subject to restrictions based on the effective group and user IDs
+that are in effect.
+
+Each possible path name is discussed in a later section that
+describes the restrictions that apply to it and the method for
+building lsof to use it.
+
+In one special case lsof will use two paths in order.  When a
+system-wide device cache file is enabled, and lsof finds that it
+doesn't exist, lsof will attempt to use a personal device cache
+file.
+
+
+C.1. Path Named by ``-D''
+=========================
+
+The ``-D[b|r|u]<path>'' option can name a path for the device cache
+file where it is unconditionally built (`b'); read, but never
+rebuilt (`r'); and read and rebuilt, if necessary (`u').
+
+If the lsof process is setuid-root, no path may be specified with
+the ``-D'' option -- i.e., only the `i' function is accepted.  The
+`r' option may be used if it doesn't have a path argument.
+
+If the lsof process is not setuid-root, nor is the real UID of the
+lsof process root, a path may accompany the `b', `r', and `u'
+functions if the lsof process surrenders setgid permission.  (See
+Appendix B.)  If the process doesn't surrender setgid permission,
+then a path may accompany only `r'.
+
+Lsof's permission to access a device cache file at a path specified
+with ``-D[b|r|u]<path>'' depends completely on the permission modes
+and ownerships of the file and its directory components.
+
+When the real UID of the lsof process is root (0), paths may be
+specified with ``-D[b|r|u]''.
+
+====================================================================
+*								   *
+* The ``-D[b|r|u]<path>'' option is enabled by default in the lsof *
+* distribution by the following definition in the dialect's	   *
+* machine.h header file:					   *
+*								   *
+*	#define HASDCACHE 1					   *
+*								   *
+* To disable all device cache file options, including all ``-D''   *
+* forms, change the above line in the dialect's machine.h file to: *
+*								   *
+*	/* #define HASDCACHE 1 */				   *
+*								   *
+* or remove it.							   *
+*								   *
+* The ``-D[b|r|u]<path>'' options are disabled when the lsof	   *
+* process is setuid-root.  If the lsof process isn't setuid-root,  *
+* nor is its real UID root (0), and if the lsof process surrenders *
+* setgid permission, ``-D[b|r|u]'' may be accompanied by a path.   *
+*								   *
+* A path may accompany ``-D[b|u]'' when the real UID of the lsof   *
+* process is root.						   *
+*								   *
+* ``-Dr'' without a path name argument is always acceptable.	   *
+*								   *
+====================================================================
+
+
+C.2. Path Named in Environment Variable
+=======================================
+
+A device cache file path may be declared in an environment variable.
+This option is defined in the dialect's machine.h header file with
+the HASENVDC definition.  The value of the HASENVDC definition is
+the environment variable's name.
+
+Lsof will use the value of the environment variable named by HASENVDC
+for the device cache file path unless either of the following
+conditions apply:
+
+    1.	The lsof process is in the setuid-root state.
+or
+    2.	The effective and real UIDs of the lsof process are root
+	(0).
+
+Lsof uses the value of the HASENVDC environment variable as the
+device cache file path after it senses there is no path declared by
+a ``-D'' option.
+
+A path from an environment variable is read-only unless the lsof
+process surrenders setgid permission.  (See Appendix B.)
+
+====================================================================
+*								   *
+* The path name environment variable option is enabled by default, *
+* and the environment variable is named LSOFDEVCACHE in the lsof   *
+* distribution by the following definition in the dialect's	   *
+* machine.h header file:					   *
+*								   *
+*	#define HASENVDC "LSOFDEVCACHE"				   *
+*								   *
+* To disable the path name environment variable option, change	   *
+* the above line in the dialect's machine.h header file to:	   *
+*								   *
+*	/* #define HASENVDC "LSOFDEVCACHE" */			   *
+*								   *
+* or remove it.  To change the name of the environment variable,   *
+* change the quoted value of the HASENVDC definition -- e.g., this *
+* form changes the environment variable name to "FOOBAR":	   *
+*								   *
+*	#define HASENVDC "FOOBAR"				   *
+*								   *
+* You can disable the path name environment option by disabling	   *
+* all device cache file processing when you remove or by disabling *
+* the HASDCACHE definition in the dialect's machine.h header file. *
+*								   *
+* The path name environment option is disabled when the lsof	   *
+* process is setuid-root or when the real UID of the lsof process  *
+* is root (0).							   *
+*								   *
+* The path named in an environment variable is read-only unless    *
+* the lsof process surrenders setgid permission.  (See Appendix    *
+* B.)								   *
+*								   *
+====================================================================
+
+
+C.3. Default System-wide Path
+=============================
+
+When a default system-wide device cache file path is defined (It's
+not enabled by default in the lsof distribution.), lsof will use
+it after it discovers no path has been specified by a ``-D'' option
+and no path has been specified in the environment variable named
+in the string #define HASENVDC of the dialect's machine.h header
+file.
+
+Lsof must be able to open the system-wide device cache file --
+i.e., it must have read access to the file and search access to
+the directories that lead it.  As part of its integrity checks,
+lsof requires that the system-wide device cache file's permission
+modes be 0644.
+
+When lsof discovers that the named system-wide device cache file
+doesn't exist, it will attempt to open a personal device cache file
+should that path formation option be enabled.  This is the *only*
+case where lsof will attempt to use two device cache file paths.
+
+The system-wide device cache file is read-only; lsof will never
+attempt to write to it.  However, when the real UID of the lsof
+process is root, that process may name the system-wide device
+cache file with ``-D[b|u]<path>''.
+
+====================================================================
+*								   *
+* The system-wide file path option is disabled by default in the   *
+* lsof distribution.  This place-marking definition in a dialect's *
+* machine.h header file may be altered to enable a system-wide	   *
+* device cache file path:					   *
+*								   *
+*	/* #define HASSYSDC "/your/choice/of/path" */		   *
+*								   *
+* To enable the system-wide name option, declaring that its path   *
+* is ``/foo/bar/lsof.dc'', change the above line in the dialect's   *
+* machine.h header file to:					   *
+*								   *
+*	#define HASSYSDC "/foo/bar/lsof.dc"			   *
+*								   *
+* or change the quoted string of the definition to the path of	   *
+* your choice.							   *
+*								   *
+* You can disable the path name environment option by disabling	   *
+* all device cache file processing when you remove or disable the  *
+* HASDCACHE definition in the dialect's machine.h header file.	   *
+*								   *
+* The system-wide device cache file is read-only.		   *
+*								   *
+====================================================================
+
+
+C.3.a. Build Procedure
+======================
+
+The system administrator must build the system-wide device cache
+file at an appropriate time -- e.g., each time the system is booted,
+and each time a node is added, deleted or modified in /dev (or
+/devices).  The procedure that builds the system-wide device cache
+file must use lsof's ``-D[b|u]<path>'' options to build the file,
+and must change the file's permission modes to 0644 after it has
+been built.
+
+Here's a simple shell script procedure to build a system-wide device
+cache file.  It assumes:
+
+    1.  The Unix dialect's kernel supports the interpreter script
+	execution option -- i.e., a script whose first line has
+	the form ``#!<path_to_interpreter>''.
+    
+    2.	The chmod, echo, rm, sh, and test programs are located
+	in ``/bin''. 
+
+    3.	The string value of the HASSYSDC definition in the dialect's
+	machine.h header file is the path ``/your/choice/of/path''.
+
+    4.	The lsof executable is located in ``/usr/local/etc''.
+
+	#!/bin/sh
+	#
+	# Simple script to build a system-wide device cache file
+	# for lsof.
+
+	HASSYSDC=/your/choice/of/path
+	/bin/rm -f $HASSYSDC
+	/usr/local/etc/lsof -Du$HASSYSDC > /dev/null 2>&1
+	if /bin/test $? -ne 0
+	then
+		/bin/echo "WARNING: failed to create $HASSYSDC"
+		exit 1
+	fi
+	/bin/chmod 0644 $HASSYSDC
+	exit 0
+
+The invocation of lsof uses the ``-Du$HASSYSDC'' option to read
+the device cache file and recreate it if necessary.  The invocation
+can be made more efficient if a known process PID -- e.g., ``-p1''
+-- can be specified.  However, if that PID is not always active
+when lsof is called, lsof might set its exit code non-zero, causing
+the subsequent test to believe that the lsof call failed.  When in
+doubt, omit the PID specification and accept the extra lsof processing
+time for reporting and discarding all open file information.
+
+
+C.4. Default Personal Path
+==========================
+
+The default personal path option is defined by default in the lsof
+distribution.  The path is formed of the home directory of the real
+UID of the lsof process, followed optionally by the contents of
+the HASPERSDCPATH environment variable, followed by ``.lsof_'',
+followed by the first component (characters up to the first period)
+of the name returned by gethostname(2).
+
+If gethostname(2) returns nothing, then nothing will follow the
+``.lsof_'' string.  If the first character of what gethostname(2)
+returns is a `.', then all the gethostname(2) value will follow
+the ``/lsof_'' string.  (See the ``%l'' conversion for a way to
+make lsof include the entire host name in the path.)
+
+====================================================================
+*								   *
+* The personal path option is enabled by default in the lsof	   *
+* distribution.  The HASPERSDC #define in a dialect's machine.h	   *
+* header is a format specification that tells lsof how to form the *
+* personal device cache file path.  The conversions in the format  *
+* specification begin with `%' , ala the printf(3) function of the *
+* standard I/O library.  These conversions are supported:	   *
+*								   *
+*	``%%''	causes a single `%' to appear in the path.	   *
+*								   *
+*	``%0''	is a separator that marks the beginning of a path  *
+*		for a setuid-root lsof process or one whose real   *
+*		UID is 0.  When lsof reaches this conversion and   *
+*		the process is setuid-root or has a real UID of    *
+*		root, it erases any previously formed path and	   *
+*		restarts with the next HASPERSDC format character. *
+*		If lsof reaches this conversion and the process is *
+*		not setuid-root and its real UID is not root, path *
+*		formation is ended.				   *
+*								   *
+*	``%h''	causes the home directory of the real UID of the   *
+*		lsof process to appear in the path.		   *
+*								   *
+*	``%l''	causes the full name returned by gethostname(2) to *
+*		appear in the path.				   *
+*								   * 
+*	``%L''	causes the first component of the name returned by *
+*		gethostname(2) to appear in the path.  The first   *
+*		component is defined to be what appears to the	   *
+*		left of the first `.'.  If nothing appears to the  *
+*		left then everything will appear in the path.	   *
+*								   *
+*	``%p''	causes the value of (HASPERSDCPATH) from the	   *
+*		process environment to appear in the path.  If the *
+*		(HASPERSDCPATH) value doesn't end in a '/', one	   *
+*		will be added.					   *
+*								   *
+*	``%u''	causes the login name associated with the real UID *
+*		of the lsof process to appear in the path.	   *
+*								   *
+*	``%U''	causes the real UID of the lsof process, converted *
+*		to a decimal string, to appear in the path.	   *
+*								   *
+*	All other characters are copied from the format to the	   *
+*	path.  CAUTION: THINK VERY CAREFULLY ABOUT THE EFFECT OF   *
+*	USING CHARACTERS THAT FORM AN ABSOLUTE COMPONENT LIKE	   *
+*	``/tmp'' IN THE FORMAT.  Consider what power your dialect  *
+*	might have (e.g., if it is setuid-root) when lsof must	   *
+*	create a device cache file at the path.  Consider using a  *
+*	``%0'' conversion to declare an alternate path for lsof    *
+*	processes that are setuid-root or whose real uid is root.  *
+*	See the "How do I put the personal device cache file in    *
+*	/tmp?" question and answer in 00FAQ for an explanation of  *
+*	this example:						   *
+*								   *
+*	    #define HASPERSDC "/tmp/.lsof_%u_%l_pers%0%h/.lsof_%L" *
+*								   *
+* This is the format specification that appears in the machine.h   *
+* header files of the lsof distribution:			   *
+*								   *
+*	#define HASPERSDC "%h/%p.lsof_%L"			   *
+*								   *
+* It causes the path to be formed from the home directory of the   *
+* real UID of the lsof process (``%h''), followed by `/', followed *
+* by the contents of the environment variable named by		   *
+* HASPERSDCPATH and a trailing `/', as needed (``%p''), followed   *
+* by the string ``.lsof_'', and terminated with the first	   *
+* component of the host's name (``%L'').			   *
+*								   *
+* To change the personal path option, change the HASPERSDC string  *
+* and recompile lsof.  To disable the personal path option, remove *
+* or disable HASPERSDC.  The personal path option is disabled when *
+* HASDCACHE is not defined.					   *
+*								   *
+====================================================================
+
+
+C.5. Modified Default Personal Path
+===================================
+
+The modified default personal path form is a special case of the
+default personal path.  In this form the value of the environment
+variable named by the HASPERSDCPATH #define is inserted in the
+personal path when the ``%p'' conversion appears in the HASPERSDC
+format specification.
+
+This allows, for example, the lsof user to move personal device
+cache files to another branch of the home directory, perhaps to a
+sub-directory where multiple device cache files may appear from
+different machines that use the same NFS- mounted home directory.
+
+The HASPERSDCPATH definition of the dialect's machine.h header file
+names the environment variable.  By default in the lsof distribution
+it is LSOFPERSDCPATH.
+
+The modified personal path component is ignored when lsof process
+is setuid-root is root, lest it be maliciously or accidentally used in
+some convoluted form to access paths the real UID cannot.  The
+modified personal path component is also ignored when the real UID
+of the lsof process is root (0), so that lsof will not accidentally
+use a personal environment value.
+
+If the lsof process surrenders setgid permission (See Appendix B.),
+lsof can read from and write to the modified personal path.  If,
+however, the lsof process doesn't surrender setgid permission, the
+modified personal path is read-only.
+
+If your dialect runs setuid-root or doesn't surrender its setgid
+permission, and you want to use the LSOFPERSDCPATH environment
+variable to address a collection of device cache files in a
+subdirectory, you will have to gather the collection in the
+subdirectory yourself with shell copy or move commands.
+
+====================================================================
+*								   *
+* The modified personal path option is enabled by default in the   *
+* lsof distribution with these definitions in the dialect's	   *
+* machine.h header file:					   *
+*								   *
+*	#define HASPERSDCPATH "LSOFPERSDCPATH"			   *
+* and								   *
+*	#define HASPERSDC "%h/%p.lsof_%L"			   *
+*								   *
+* The value of the definition is the name of the environment	   *
+* variable that contains the modified personal path name	   *
+* component that is inserted in the personal path when ``%p''      *
+* appears in HASPERSDC.  See the Default Personal Path section	   *
+* for a complete description of the ``%p'' conversion.		   *
+*								   *
+* To disable the modified personal path name component, disable	   *
+* the HASPERSDCPATH definition in the dialect's machine.h header   *
+* file -- e.g., change it to:					   *
+*								   *
+*	/* #define HASPERSDCPATH "LSOFPERSDCPATH" */		   *
+*								   *
+* or remove the definition altogether.  If you do this, don't	   *
+* forget to remove any ``%p'' conversion from HASPERSDC.	   *
+*								   *
+* The modified personal path option is disabled when HASDCACHE is  *
+* not defined.							   *
+*								   *
+* The modified personal path environment variable value is ignored *
+* when the lsof process is setuid-root or when the real UID of	   *
+* the lsof process is root (0).					   *
+*								   *
+* The modified personal path is read-only when the lsof process	   *
+* doesn't surrender its setgid permission.			   *
+*								   *
+====================================================================
+
+
+D. Displaying the Default Path
+==============================
+
+Whatever device cache file path formation options you decide to
+use, remember that the lsof help output, displayed in response to
+its ``-h'' or ``-?'' help options, will display the read-mode
+default (the highest numbered) path that lsof has been enabled to
+form from which it will read.
+
+Since some paths are read-only, the path displayed in help option
+output may not be the one to which lsof will write, should that
+become necessary.  To see the read-only and write device cache file
+paths, environment variable names, and the personal device cache
+file format specification (HASPERSDC), use the -D? option.
+
+
+Appendix A, Unix Dialects Without a Device Cache
+================================================
+
+Linux lsof implementations that obtain their information from files
+in the /proc file system do not have device cache support.  Generally
+lsof for Linux versions 2.1.72 and greater are /proc based.
+
+
+Appendix B, Lsof Dialects and Their Permissions
+===============================================
+
+These are the permissions recommended in the lsof distribution.
+
+
+Appendix B.1 Setuid-root Lsof Dialects 
+======================================
+
+These dialect versions of lsof need root permission.  For general
+use they may have to be installed setuid-root.
+
+    Apple Darwin 9 and Mac OS X 10.[56]
+    HP-UX 11.11 and 11.23
+    Linux (no device cache support needed)
+
+
+Appendix B.2 Setgid Lsof Dialects That Surrender Setgid Permission
+==================================================================
+
+Lsof versions for these dialects have WILLDROPGID defined in their
+machine.h header files.
+
+    AIX 5.[12] and 5.3-ML1
+    FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems
+    FreeBSD 5.x and [6789].x for Alpha, AMD64 and Sparc64-based
+	systems
+    HP-UX 11.00
+    NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based
+	systems
+    NEXTSTEP 3.[13]
+    OpenBSD 2.[89] and 3.[0-9] for x86-based systems
+    OPENSTEP 4.x
+    SCO OpenServer Release 5.0.4 for x86-based systems
+    SCO|Caldera UnixWare 7.1.4 for x86-based systems
+    Solaris 2.6, 8, 9 and 10
+    Tru64 UNIX 5.1
+
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src/00DIALECTS b/lsof_4.85/lsof_4.85_src/00DIALECTS
new file mode 100644
index 0000000..12c5f0b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00DIALECTS
@@ -0,0 +1,6 @@
+	AIX 5.3
+	Apple Darwin 9 and Mac OS X 10.[56]
+	FreeBSD 4.9 and 6.4 for x86-based systems
+	FreeBSD 8.[02] and 9.0 for AMD64-based systems
+	Linux 2.1.72 and above for x86-based systems
+	Solaris 9, 10 and 11
diff --git a/lsof_4.85/lsof_4.85_src/00DIST b/lsof_4.85/lsof_4.85_src/00DIST
new file mode 100644
index 0000000..b13641b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00DIST
@@ -0,0 +1,4598 @@
+
+	    Notes for the distribution of lsof version 4
+
+********************************************************************
+| The latest release of lsof is always available via anonymous ftp |
+| from lsof.itap.purdue.edu.  Look in pub/tools/unix/lsof.         |
+********************************************************************
+
+		Contents
+
+	    Dialects Supported
+	    How Lsof Works
+	    Lsof Output
+	    Getting Started Quickly
+	    Limiting, Filtering, and Selecting Lsof Output
+	    Parsing Lsof Output with Another Program
+	    Repeat Mode
+	    Distribution Restrictions
+	    Cautions
+	    Distribution Contents
+	    Warranty
+	    Bug Reports
+	    The lsof-l Mailing List
+	    Version 3 Release Notes
+		3.0,  May 24, 1994
+		...
+		3.88, February 17, 1997
+	    What's New in Version 4
+	    Version 4 Release Notes
+		4.0, February 24, 1997
+		4.01, March 3, 1997
+		4.02, March 21, 1997
+		4.03, April 7, 1997
+		4.04, April 17, 1997
+		4.04 supplement, April 18, 1997
+		4.05, April 24, 1997
+		4.06, April 30, 1997
+		4.07, May 12, 1997
+		4.08, May 23, 1997
+		4.09, June 1, 1997
+		4.10, June 8, 1997
+		4.11, June 12, 1997
+		4.12, June 24, 1997
+		4.13, July 9, 1997
+		4.14, July 22, 1997
+		4.15, August 15, 1997
+		4.16, September 25, 1997
+		4.17, October 14, 1997
+		4.18, October 25, 1997
+		4.19, October 30, 1997
+		4.20, November 11, 1997
+		4.21, December 1, 1997
+		4.22, December 15, 1997
+		4.23, January 16, 1998
+		4.24, January 28, 1998
+		4.25, February 7, 1998
+		4.26, February 17, 1998
+		4.27, March 6, 1998
+		4.28, March 10, 1998
+		4.29, March 26, 1998
+		4.30, April 9, 1998
+		4.31, April 21, 1998
+		4.32, May 13, 1998
+		4.33, May 22, 1998
+		4.34, June 26, 1998
+		4.35, July 17, 1998
+		4.36, August 4, 1998
+		4.37, September 15, 1998
+		4.38, November 25, 1998
+		4.39, December 29, 1998
+		4.40, January 25, 1999
+		4.41, February 27, 1999
+		4.42, March 30, 1999
+		4.43, May 11, 1999
+		4.44, June 24, 1999
+		4.45, July 30, 1999
+		4.46, October 23, 1999
+		4.47, November 29, 1999
+		4.48, January 14, 2000
+		4.49, April 3, 2000
+		4.50, June 29, 2000
+		4.51, August 21, 2000
+		4.52, November 8, 2000
+		4.53, December 6, 2000
+		4.54, January 19, 2001
+		4.55, February 15, 2001
+		4.56, May 3, 2001
+		4.57, July 19, 2001
+		4.58, September 13, 2001
+		4.59, October 20, 2001
+		4.60, November 9, 2001
+		4.61, January 22, 2002
+		4.62, March 7, 2002
+		4.63, April 23, 2002
+		4.64, June 26, 2002
+		4.65, October 10, 2002
+		4.66, December 22, 2002
+		4.67, March 27, 2003
+		4.68, June 18, 2003
+		4.69, October 16, 2003
+		4.70, January 16, 2004
+		4.71, March 11, 2004
+		4.72, July 13, 2004
+		4.73, October 21, 2004
+		4.74, January 17, 2005
+		4.75, May 16, 2005
+		4.76, August 30, 2005
+		4.77, April 10, 2006
+		4.78, April 24, 2007
+		4.79, April 15, 2008
+		4.80, May 12, 2008
+		4.81, October 21, 2008
+		4.82, March 25, 2009
+		4.83, January 18, 2010
+		4.84, July 29, 2010
+		4.85, September 27, 2011
+
+
+Dialects Supported
+==================
+
+Lsof (for LiSt Open Files) lists files opened by processes on
+selected Unix systems.  Version 4 is a source reorganization of
+version 3, itself a major revision of version 2.  Version 4 has
+been tested on:
+
+	AIX 5.3
+	Apple Darwin 9 and Mac OS X 10.[56]
+	FreeBSD 4.9 and 6.4 for x86-based systems
+	FreeBSD 8.[02] and 9.0 for AMD64-based systems
+	Linux 2.1.72 and above for x86-based systems
+	Solaris 9, 10 and 11
+
+(The pub/tools/unix/lsof/contrib directory on lsof.itap.purdue.edu
+contains information on other ports.)
+
+If your favorite Unix dialect is not in the list, or if your version
+of it is more recent than the ones listed, please contact me at
+<abe@purdue.edu>.
+
+Version 3 of lsof was tested on:
+
+	AIX 3.2.5, 4.1[.[1234]], and 4.2
+	BSDI BSD/OS 2.0, 2.0.1, and 2.1 for x86-based systems
+	DC/OSx 1.1 for Pyramid systems
+	Digital UNIX (DEC OSF/1) 2.0, 3.0, 3.2, and 4.0
+	EP/IX 2.1.1 for the CDC 4680
+	FreeBSD 1.1.5.1, 2.0, 2.0.5, 2.1, 2.1.5 for x86-based
+		systems
+	HP-UX 8.x, 9.x, 10.01, 10.10, and 10.20
+	IRIX 5.2, 5.3, 6.0, 6.0.1, and 6.[124]
+	Linux through 2.0.27 for x86-based systems
+	NetBSD 1.0, 1.1, and 1.2 for x86 and SPARC-based
+		systems
+	NEXTSTEP 2.1 and 3.[0123]
+	OpenBSD 1.2 and 2.0 for x86-based systems
+	Reliant UNIX 5.43 for Pyramid systems
+	RISC/os 4.52 for MIPS R2000-based systems
+	SCO OpenServer Release 1.1, 3.0, and 5.0.x for x86-based 
+		systems
+	SCO UnixWare 2.1 and 2.1.1 for x86-based systems
+	Sequent PTX 2.1.[1569], 4.0.[23], 4.1.[024], 4.2[.1],
+		and 4.3
+	Solaris 2.[12345], 2.5.1, and 2.6-Beta
+	SunOS 4.1.x
+	Ultrix 4.2, 4.3, 4.4, and 4.5
+
+Version 3 and its predecessor, version 2, may be found at:
+
+	ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD
+
+
+How Lsof Works
+==============
+
+Using available kernel data access methods -- getproc(), getuser(),
+kvm_*(), nlist(), pstat(), read(), readx(), /proc -- lsof reads
+process table entries, task table entries, user areas and file
+pointers to reach the underlying structures that describe files
+opened by processes.
+
+Lsof interprets most file node structures -- advfsnodes, autonodes,
+cnodes, cdrnodes, devnodes, fifonodes, gnodes, hsnodes, inodes,
+mfsnodes, pcnodes, procnodes, rnodes, snodes, specnodes, s5inodes,
+tmpnodes.  It understands NFS connections.  It recognizes FIFOs,
+multiplexed files, Unix and Internet sockets.  It knows about
+streams.  It understands /proc file systems for some dialects.  On
+many dialects it recognizes execution text and library references.
+It knows about AFS on some Unix dialects.
+
+
+Lsof Output
+===========
+
+The lsof output describes:
+
+    * the identification number of the process (PID) that has opened
+      the file;
+
+    * the process group identification number (PGID) of the process
+      (optional);
+
+    * the process identification number of the parent process (PPID)
+      (optional);
+
+    * the command the process is executing;
+
+    * the owner of the process;
+
+    * for all files in use by the process, including the executing
+      text file and the shared libraries it is using:
+
+      * the file descriptor number of the file, if applicable;
+
+      * the file's access mode;
+
+      * the file's lock status;
+
+      * the file's device numbers;
+
+      * the file's inode number;
+
+      * the file's size or offset;
+
+      * the name of the file system containing the file;
+
+      * any available components of the file's path name;
+
+      * the names of the file's stream components;
+
+      * the file's local and remote network addresses;
+
+      * the TLI network (typically UDP) state of the file;
+
+      * the TCP state, read queue length, and write queue length
+	of the file;
+
+      * the file's TCP window read and write lengths (Solaris
+	only);
+
+      * other file or dialect-specific values.
+
+
+Getting Started Quickly
+=======================
+
+If you want to get started using lsof quickly, or see some examples
+of how lsof can be used, consult the 00QUICKSTART file of the lsof
+distribution.
+
+The 00QUICKSTART file won't help you build or install lsof, but it
+will cut through the density of the lsof man page, giving you more
+readily an idea of what you can do with lsof.
+
+For information on building and installing lsof, consult the 00README
+file of the lsof distribution.
+
+
+Limiting, Filtering, and Selecting Lsof Output
+==============================================
+
+Lsof accepts options to limit, filter, and select its output.
+These are the possible criteria:
+
+    * Process ID (PID) number -- to list the open files for a given
+      process;
+
+    * Process Group ID (PGID) -- to list the open files for all
+      the processes of a given process group;
+
+    * User ID number or login name -- to list the open files for
+      all the processes of a given user;
+
+    * Internet address -- to list the open files using a given
+      Internet address (host name), protocol, or port (number or
+      name); or to list all open Internet files;
+
+    * command name;
+
+    * file descriptor name or number;
+
+    * list all open NFS files;
+
+    * list all open Unix domain socket files;
+
+    * list all uses of a specific file;
+
+    * list all open files on a file system.
+
+Selection options are normally ORed -- i.e., an open file meeting
+any of the criteria is listed.  The selection options may be ANDed
+so that an open file will be listed only if it meets all the
+criteria.
+
+In the absence of any selection criteria, lsof lists files open to
+all processes.
+
+
+Parsing Lsof Output with Another Program
+========================================
+
+The lsof -F option directs it to produce "field" output that can
+easily be parsed by another program.  The lsof distribution contains
+sample awk, perl 4, and perl 5 scripts in its scripts subdirectory
+that show how to post-process field output.
+
+
+Repeat Mode
+===========
+
+Lsof can be directed to produce output, delay for a specified time,
+then repeat the output, cycling until stopped by an interrupt or
+quit signal.  This mode is useful for monitoring the status of some
+file operation -- e.g., an ftp transfer or a tape backup operation.
+
+Repeat mode is more efficient when combined with lsof's selection
+options, since they limit lsof overhead.
+
+It's possible to use lsof's field output options to supply repeat
+mode output to another process for its manipulation.  The scripts
+subdirectory of the lsof distribution has sample Perl scripts
+showing how to consume lsof repeat mode output from a pipe.
+
+
+Distribution Restrictions
+=========================
+
+Lsof may be used and distributed freely, subject to these limitations:
+
+1. Neither the author nor Purdue University is 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 author 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 from or altered in the lsof source
+   files.
+
+
+Cautions
+========
+
+Lsof is a tool that is closely tied to the Unix operating system
+version.  It uses header files that describe kernel structures and
+reads kernel structures that typically change from OS version to
+OS version.
+
+DON'T TRY TO USE AN LSOF BINARY, COMPILED FOR ONE UNIX OS VERSION,
+ON ANOTHER.
+
+On some Unix dialects, notably SunOS and Solaris, lsof versions
+may be even more restricted by architecture type.  An lsof binary,
+compiled for SunOS 4.1.3 on a sun4c machine, for example, won't
+work on a sun4m machine.
+
+AN LSOF BINARY, COMPILED FOR ONE SOLARIS 1.X ARCHITECTURE, ISN'T
+GUARANTEED TO WORK ON A DIFFERENT SOLARIS 1.X ARCHITECTURE.
+
+
+Distribution Contents
+=====================
+
+The lsof distribution is checked for completeness when it is
+constructed and by the Inventory script when you run the Configure
+script.  (See The Inventory Script section of the 00README file of
+this distribution.)
+
+Lsof is organized in these parts:
+
+    *  The main lsof directory, containing common sources,
+       configuration and setup scripts and three subdirectories:
+       dialects/, lib/, and scripts/.
+
+       Lsof is compiled in the main lsof directory after configuration.
+       The selected dialect sources are copied or linked from the
+       specified subdirectory.  (Symbolic linking is the standard
+       method.)
+
+       Common lsof definitions may be found in lsof.h; common
+       function prototypes, proto.h; and common storage, store.c.
+
+    *  The dialects/ subdirectory contains subdirectories with
+       sources specific to UNIX dialect implementations -- e.g.,
+       the dialects/sun/ subdirectory contains sources for the
+       SunOS (Solaris 1.x) and Solaris (2.x) implementations of
+       lsof.  The dialects subdirectories also contain Makefiles
+       and scripts for assisting dialect source configuration.
+
+       Dialect configuration definitions may be found in dlsof.h;
+       other dialect definitions, dlsof.h; dialect prototypes,
+       dproto.h; and dialect storage, dstore.c.
+
+    *  The lib/ subdirectory contains sources for common lsof
+       functions.  Not all dialects use the functions -- some have
+       their own versions of them.  The lib/ functions are enabled
+       and customized with #define's in the dialect machine.h header
+       files.
+
+    *  The scripts/ subdirectory contains sample scripts for
+       processing lsof field (-F) output.  The scripts are written
+       in AWK, Perl 4, and Perl 5.
+
+The 00PORTING file of the lsof distribution has more information
+on lsof components, configuration, and construction.
+
+
+Warranty
+========
+
+Lsof is provided as-is without any warranty of any kind, either
+expressed or implied, including, but not limited to, the implied
+warranties of merchantability and fitness for a particular purpose.
+The entire risk as to the quality and performance of lsof is with
+you.  Should lsof prove defective, you assume the cost of all
+necessary servicing, repair, or correction.
+
+
+Bug Reports
+===========
+
+Now that the obligatory disclaimer is out of the way, let me hasten
+to add that I accept lsof bug reports and try hard to respond to
+them.  I will also consider and discuss requests for new features,
+ports to new dialects, or ports to new OS versions.
+
+PLEASE DON'T SEND A BUG REPORT ABOUT LSOF TO THE UNIX DIALECT
+VENDOR.
+
+At worst such a bug report will confuse the vendor; at best, the
+vendor will forward the bug report to me.
+
+Please send all bug reports, requests, etc. to me via email at
+<abe@purdue.edu>.
+
+
+The lsof-l Mailing List
+=======================
+
+Information about lsof, including notices about the availability
+of new revisions, may be found in mailings of the lsof-l listserv.
+For more information about it, including instructions on how to
+subscribe, read the 00LSOF-L file of the lsof distribution.
+
+
+Version 3 Release Notes
+=======================
+
+See 00DIST in the last lsof 3 revision 3.88, for its complete
+set of release notes.  Lsof revision 3.88 may be found at:
+
+	ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD
+
+3.0		May 24, 1994
+		This is the first official release of lsof 3.
+
+...
+
+3.88		February 17, 1997
+
+		+======================================+
+		| This is the last version 3 revision. |
+		+======================================+
+
+		Added documentation files -- 00.README.FIRST[_<version>]
+		and 00RELEASE.SUMMARY_<version> -- to the distribution.
+
+
+What's new in Version 4
+=======================
+
+The main goal of version 4 was to eliminate the confusing common/
+fragment source file technique.  Changing the version number also
+provided an opportunity to restart the numbering, which at 3.88
+had risen to a large value.
+
+The sources that appeared in the dialects/common subdirectory of
+version 3 in fragment files have been incorporated into the version
+4 liblsof.a library as *.c files.  This results in significant
+changes to many source files, scripts, and Makefiles of all dialect
+versions.  It allows elimination of some source files -- ddev.c,
+dfile.c, dmnt.c -- for dialects now obtaining functions from
+liblsof.a that formerly came from making dialect source files by
+combining fragment files.
+
+The version 4 liblsof.a sources are stored in the lib/ subdirectory
+of the main lsof directory.  The liblsof.a functions are activated
+and conditioned in their source files by values #define'd in the
+dialect dlsof.h and machine.h header files.
+
+Dialects that provide a private version of a library function refrain
+from #define'ing the symbol that would activate the library function
+code.
+
+
+Version 4 Release Notes
+=======================
+
+4.0		February 24, 1997
+
+		+====================================+
+		| This is the first lsof 4 revision. |
+		+====================================+
+
+		Reorganized sources: eliminated code fragment files
+		and created a library in their place.  Modified or
+		deleted many dialect source and header files.
+		Changed documentation accordingly.
+
+		Added a warning to sgi/Makefile and 00FAQ that advises
+		against using the IRIX C compiler -n32 option when
+		compiling lsof.  Thanks go to Peter Ilieve
+		<peter@memex.co.uk> for bringing this to my attention.
+
+		Dropped IRIX 5.2 in mid-stream, because my 5.2 test
+		system was upgraded to 5.3.
+
+4.01		March 3, 1997
+		Added TFS support for Pyramid dialects.
+
+		Added test to Configure and to the IRIX dnode.c
+		for the different cnode struct that appears in
+		<cachefs/cachefs_fs.h> on the 6.2 IMPACT distribution.
+		Heddy Boubaker <boubaker@amfou.cenatls.cena.dgac.fr>
+		alerted me to the cnode change and helped test this
+		lsof adjustment.
+
+		Shut down the lsof child process before doing a -r
+		sleep().  A comment from Dan Mercer <dam@mmm.com>
+		prompted this.
+
+4.02		March 21, 1997
+
+		Based on a report from Pasi Kaara <Pasi.Kaara@atk.tpo.fi>,
+		disabled HP-UX CCIT support in lsof for HP-UX
+		versions 10 and above.  Pasi's report also led to
+		changes in the HP-UX machine.h to support use of
+		gcc to compile lsof for HP-UX 10.20 and warnings
+		against using `cc -Aa` or `gcc -ansi` to compile
+		lsof under HP-UX 10.x.
+
+		With help from Richard Allen <ra@hp.is> taught
+		HP-UX 10.x lsof to name file systems better by
+		using the virtual file system device number.  Elias
+		Halldor Agustsson <elias@rhi.hi.is> provided a test
+		system.
+
+		Changed NEXTSTEP and UNIXWARE Makefiles to use
+		safer quoting when generating version.h.  The change
+		was suggested by Bob Farmer <ucs_brf@unx1.shsu.edu>.
+
+		Added SHELL=/bin/sh string to all Makefiles.
+
+		Added support for Linux 2.1.28 on a test system,
+		kindly provided by Jonathan Sergent <sergent@purdue.edu>.
+		Configure tests the Linux 2.1.x's C library lseek()
+		function for proper handling of kernel offsets.
+		If lseek() appears suspect, Configure activates
+		the use of a private lseek() function.  Changed
+		the private nlist() function to nlist_private()
+		and taught it to use the query_module() syscall in
+		place of the deprecated get_kernel_syms() one.
+		Added rudimentary AX.25 support for Pierfrancesco
+		Caci <ik5pvx@infogroup.it> who helped test it.
+		Updated the old get_kernel_syms() code to recognize
+		and skip module name entries.
+
+		Prompted by Marty Leisner <leisner@sdsp.mc.xerox.com>,
+		eased the requirement that service name lookup for
+		the -i option be accompanied by a protocol name.  The
+		name is not needed if both TCP and UDP names yield the
+		same port number.
+
+		Added xusers.awk script from Dan Mercer <damercer@mmm.com>
+		to the distribution scripts/ subdirectory.
+
+		Changed Configure script to use LSOF_VERS for all
+		UNIX dialect version numbers and to pass LSOF_VERS
+		to the dialect Mksrc functions.  Also added the
+		ability for a dialect stanza to declare a different
+		dialect Makefile source.  Modified dialect Mksrc
+		files -- e.g., linux and sun -- accordingly.
+
+		Added support for BSD/OS 3.0 with help from Jim
+		Reid <jim@mpn.cp.philips.com>.  Terry Kennedy
+		<TERRY@spcvxa.spc.edu> kindly provided a test
+		system.  During the port corrected a bug that
+		prevented proper handling of revoked files.
+
+4.03		April 7, 1997
+		At the suggestion of Dan Mercer <damercer@mmm.com>,
+		made HP-UX building of lsof aware of differences
+		between the HP-UX bundled and unbundled C compilers.
+
+		Added the ability for the lsof builder to define the
+		default warning message issuance state.  By default the
+		issuance of warning messages is disabled; defining
+		WARNINGSTATE in machine.h disables it.  The Customize
+		script was updated to handle WARNINGSTATE.  Dan Mercer
+		suggested this.
+
+		Eliminated compiler complaint about improperly cast
+		get_Nl_value() argument in ncache_load() in lib/rnch.c.
+
+		Corrected zeromem() argument error in SCO dproc.c.
+		Sped up parent directory cache lookup slightly.
+
+		Updated for PTX 4.4, including additional VxFS (EFS)
+		file system support.
+
+4.04		April 17, 1997
+		At the suggestion of Bela Lubkin <belal@sco.COM>
+		changed device cache handling to be more tolerant
+		of a device cache file whose [cm]times are older
+		than the ones on /dev or /devices.  The change
+		required adding information to Solaris device cache
+		file clone lines, so the first time lsof 4.04 is
+		run under Solaris it will complain about a bad
+		cached clone device in a previous device cache
+		file, then regenerate it.
+
+		Added boot file path detection for SCO OSR 5 and
+		above, based on information supplied by Bela.
+
+		Fixed two bugs in DEC OSF/1 lsof -- an error in
+		reporting locks and a missing continue statement
+		in readdev() after a failure to open a directory.
+		Jan Ole Suhr <josuhr@informatik.tu-clausthal.de>
+		reported the second bug and supplied a fix.
+
+		Fixed XFS problems with IRIX 6.2 by abandoning the
+		idea that SGI will distribute XFS header files and
+		defining an lsof-private xfs_inode structure.  John
+		Paul Morrison <John.Paul.Morrison@MultiActive.com>
+		helped develop and test the 5.3 definition.  John
+		R. Vanderpool <fish@daacdev1.gsfc.nasa.gov> helped
+		develop and test the 6.2 definition.
+
+		Remove obsolete comments about common/*.frag files.
+
+		Updated Linux lsof for Linux version 2.1.35.
+
+4.04		April 18, 1997
+Supplement	Regenerated the 4.04 distribution to correct a non-
+		device-cache #define misplacement in the Solaris and
+		SunOS dlsof.h.  Alexandre Oliva <oliva@dcc.unicamp.br>
+		reported the problem.
+
+4.05		April 24, 1997
+		Corrected an error in 00DCACHE.
+
+		Made sure SCO /etc/ps/booted.systems is closed.
+
+		Based on an observation by Bela Lubkin <belal@sco.COM>
+		that the lsof child had needless file descriptors
+		open, closed all but the open pipes between the
+		lsof parent and child.
+
+		Decommissioned CDC EP/IX support; I no longer have a
+		test system.
+
+		Based on a suggestion from Patrick Connor
+		<connor@phreak.csd.sgi.com>, added -xansi to CFLAGS
+		for IRIX 5.3 and 6.[234].
+
+		Also at Patrick's suggestion changed Configure to
+		propagate exact SunOS 4.1.x version to the main
+		and library Makefiles.  This allowed the sunos413
+		and sunos413cc Configure abbreviations to be
+		shortened to sunos and sunoscc.
+
+		Updated obsolete argument uses (-H changed to -n)
+		in count_pf.perl* and watch_a_file.perl scripts.
+
+		Adjusted Solaris 2.6 lsof for Beta_Update with tips
+		from Casper Dik <casper@holland.Sun.COM>.
+
+		Fixed a Solaris 2.4 TCP address reporting bug.
+
+4.06		April 30, 1997
+		Added a step to the Makefile clean rules that does
+		a make clean in the lib subdirectory; suggested by
+		Casper Dik <casper@holland.Sun.COM>.  (Configure's
+		-clean argument already did this.)
+
+		Fixed an incorrect awk argument in the sunos*)
+		Configure stanza, reported by Alexandre Oliva
+		<oliva@dcc.unicamp.br>.
+
+		Added CD9660 (aka ISO) file system support to
+		FreeBSD, NetBSD, and OpenBSD with mods and help
+		from Kenneth Stailey <kstailey@disclosure.com>.
+		(BSDI already had CD9660 support.)  While at it,
+		added file descriptor system support to BSDI and
+		FreeBSD.
+
+		Added /kern file system support to OpenBSD.  The
+		support wasn't extended to BSDI, FreeBSD, or NetBSD,
+		because it requires Kenneth Stailey's changes to
+		/sys/miscfs/kernfs/kernfs.h.
+
+		Updated IRIX 6.3 support after getting access to
+		a test system, provided by John Paul Morrison
+		<John.Paul.Morrison@MultiActive.com>.  Improved
+		the handling of IRIX 5.1 and greater FIFOs.
+
+4.07		May 12, 1997
+		Based on AIX problem reports from David Capshaw
+		<David.Capshaw@SEMATECH.Org>, changed the aix*
+		Configure script stanza to avoid -bnolibpath for
+		gcc (which the GNU loader doesn't grok) and AIX
+		below 4.1.4 (where -bnolibpath hasn't been tested
+		or is known to be unimplemented), and to refuse to
+		use gcc for compiling lsof in AIX versions below
+		4.1 (because of possible structure alignment
+		problems).  Updated 00FAQ appropriately.
+
+		Added OpenBSD support for EXT2FS.  This support
+		has yet to be tested.
+		
+		Tested lsof under OpenBSD 2.1.
+
+		Activated /kern file system support for NetBSD when
+		Configure senses that /sys/miscfs/kernfs/kernfs.h
+		defines the kern_target structure.  This support
+		has not been tested under NetBSD, although it has
+		been tested under OpenBSD.
+
+		Made some simple changes to the BSDI machine.h,
+		suggested by Jeffrey C. Honig <jch@bsdi.com>.
+
+		Improved handling of alternate dialect Configure
+		abbreviations -- aix and aixgcc, hpux and hpuxgcc,
+		solaris and solariscc, and sunos and sunoscc.
+
+4.08		May 23, 1997
+		Cleaned up dialect Makefile's, staring with a suggestion
+		from Christopher Schanzle <chris@cam.nist.gov>.
+
+		Improved Configure's -clean processing.
+
+		Corrected bugs in Solaris lock reporting.
+
+		Changed NetBSD Configure stanza to put -I/usr/include
+		before -I/sys.
+
+4.09		June 1, 1997
+		Adjusted for latest FreeBSD 3.0 release.  This
+		required adding a new kernel name cache module for
+		reading BSD-form hashed kernel name cache entries,
+		rnmh.c, to the lsof library, and adding a #define
+		to each machine.h to select it.
+
+		Activated rnmh.c for BSDI 2.1, BSDI 3.0, NetBSD
+		1.2, and OpenBSD 2.1.
+
+4.10		June 8, 1997
+		Adjusted for Linux 2.1.x (x > 35) kernels with
+		hashed task structure pointers.  Marty Leisner
+		<leisner@sdsp.mc.xerox.com> and Jonathan Sergent
+		<sergent@io.com> tested the adjustment.
+
+		Replaced readdev() stat() calls with lstat() to
+		reduce device table and cache entries with the same
+		device number and inode values.  Added code to
+		remove all remaining duplicates.  This fixes a
+		Linux problem reported by Jonathan Sergent and
+		makes device node name output predictable.
+
+		Corrected a bug in UnixWare stream file handling
+		that prevented searching for the stream file by
+		its associated character device name.
+
+		Added Pyramid code to determine Reliant UNIX clone
+		major device number differently from that of DC/OSx.
+
+4.11		June 12, 1997
+		Changed Configure to sense that the PTX inp_[fl]addr
+		members of the inpcb structure of <netinet/in_pcb.h>
+		have a struct type and set HASINADDRSTR for use in
+		PTX dnode.c and dsock.c tests.
+
+		Changed PTX version 4.1.4 tests to use 4.1.3 instead.
+		Carson Wilson <carson@mcs.com> reported the need
+		to do this and tested the change.
+
+		Fixed a block device table indexing bug in lib/rdev.c,
+		reported by Carson Wilson.  The same bug was squashed
+		in pyramid/ddev.c.
+
+		Added code to the Pyramid Reliant UNIX kread()
+		function to compensate for an address boundary
+		error in the kernel's /dev/kmem driver.
+
+		Verified that lsof compiles and works under AIX
+		4.2.1.  Added an AIX test for the presence of NFS
+		header files, defined HAS_NFS and adjusted AIX
+		dialect sources accordingly.
+
+		Based on a suggestion from Gaylord Holder
+		<holder@phy.ucsf.EDU>, added DEC OSF/1 code to
+		auto-detect the booted file, whence kernel symbol
+		addresses are obtained.
+
+4.12		June 24, 1997
+		Corrected a device number sign extension problem
+		in the reading and writing of device cache file.
+		The problem was reported by Bela Lubkin <belal@sco.com>
+		and he suggested a fix.
+
+		Fixed an SCO stream device lookup problem.  The
+		report and solution came from Bela Lubkin
+
+		Enhanced the Configure script to enable cross-
+		configuration of lsof, based on suggestions from
+		Marty Leisner <leisner@sdsp.mc.xerox.com>.  A new
+		documentation file, 00XCONFIG, describes the process.
+
+		Made Pyramid OBJFS support conditional on the
+		presence of supporting header files.  Corrected
+		the Pyramid MkKernOpts script so it generates the
+		necessary -D's for the Nile/Jolt architecture.
+		Richard Coley <rcoley@pyra.co.uk> helped.
+
+		Added another IRIX xfs_inode variant for 6.2, 32
+		bits, no XFS rollup patch.
+
+		Tested under UnixWare 2.1.2.
+
+4.13		July 9, 1997
+		Taught Pyramid lsof to grok ttyfs vnodes with help
+		from Richard Coley <rcoley@pyra.co.uk>.  Fixed some
+		minor bugs in Pyramid FIFO reporting.  Eliminated
+		use of the Pyramid UCB compatibility library at
+		Richard's suggestion.
+
+		Eliminated reporting of "strange" inode numbers
+		for SCO OSR 3.2v5.0.x HPPS files with help from
+		Bela Lubkin <belal@sco.com>
+
+		Modified port to service name lookup to use a small
+		number of getservbyport() calls before reading the
+		entire map with getservent().  Changed port reporting
+		to represent a zero as `*' to be consistent with
+		other prt number reporting tools like netstat.
+		Casper Dik <casper@holland.Sun.COM> suggested these
+		changes -- the getserv*() one to improve performance
+		for large NIS service name maps.
+
+		Changed all readdev() functions to make the absence
+		of block devices a warning instead of a fatal error
+		after Brian Redman <ber@ms.com> reported his IRIX
+		6.4 system had no block devices.  (It really did
+		have block devices, but readdev()'s lstat() use
+		caused it to miss them in a directory symbolically
+		linked from /dev/dsk->/hw/disk.)  Fixed Brian's
+		real problem by changing the IRIX readdev() to use
+		stat() on /dev nodes if a Configure test shows /hw
+		is readable.  Extended the potential to do the same
+		to all readdev() functions.
+
+		For consistency and convenience changed some
+		Configure abbreviations and dialect subdirectory
+		names:  "decosf" abbreviation and "osf" dialect
+		subdirectory name to "du"; "netbsd" dialect
+		subdirectory name to "n+obsd"; "next3" abbreviation
+		and "next" dialect subdirectory name to "ns"; "sco"
+		abbreviation and dialect subdirectory name to "osr";
+		"sgi" dialect subdirectory name to "irix"; and
+		"unixware" abbreviation and dialect subdirectory
+		name to "uw".
+
+		Added #if/#endif clauses to the AIX rmdupdev()
+		function to avoid clone processing for AIX versions
+		less than 4.1.4.  The problem was reported by Toralf
+		Foerster <toralf.foerster@io-warnemuende.de>, who
+		supplied corrective code.
+
+		Added support for new style NetBSD inode with i_ffs
+		and i_e2fs union members.
+
+		Improved Configure and 00FAQ information on Digital
+		UNIX configuration subdirectory with suggestions
+		from Brad Krebs <brad@EECS.Berkeley.EDU>.
+
+4.14		July 22, 1997
+		Reorganized the Solaris handling of the inode
+		structure header file, ufs_inode.h, to eliminate
+		VxFS structure definition conflicts for Solaris
+		2.4, based on information from Greg Earle
+		<earle@netbsd4me.jpl.nasa.gov>.
+
+		Cleaned up some typos and confusion in Configure's
+		help output, based on comments from Bela Lubkin
+		<belal@sco.com>
+
+		Added a 00DIALECTS file, containing UNIX dialect
+		version numbers, that can be used by Configure and
+		the man page.
+
+4.15		August 15, 1997
+		Aligned `Configure -help` output better.  Removed
+		Configure's 2.6 Beta test adjustments.
+
+		Added improved Solaris VxFS configuration and
+		handling, based on information from Greg Earle
+		<earle@netbsd4me.jpl.nasa.gov>.
+
+		Added socket state -- TCO or TPI -- for socket
+		files at the suggestion of Ian Fitchet
+		<I.D.Fitchet@ftel.co.uk>.
+
+4.16		September 25, 1997
+		Added reporting of TCP/TPI queue lengths and window
+		sizes ala netstat to NAME column.  Added -T option
+		to select or de-select TCP/TPI info reporting.
+		(Window sizes are only reported for Solaris.)
+		Fixed anomalies along the way in SIZE/OFF processing
+		for some dialects.
+
+		Fixed service name argument processor to allow
+		minus signs as part of the name.  Consequently this
+		disallows names with embedded minus signs from
+		being specified as the start of a range.
+
+		Added 00FAQ entries explaining why lsof won't find
+		a file being edited with vi, why window sizes aren't
+		reported for all dialects, and what the "no more
+		information" message means.
+
+		Forced Pyramid CC to be /usr/ccs/bin/cc to avoid
+		accidental use of the BSD variant in /usr/ucb/cc.
+
+		Added support for Linux glibc2, including a Configure
+		test; cross-Configure support (00XCONFIG); and much
+		unfortunate and risky sleight-of-hand in lsof Linux
+		dialect header and source files, forced upon lsof
+		by incompatibilities between Linux kernel and glibc2
+		header files.
+
+		Included in scripts/identd.perl5 a Perl 5 implementation
+		of an identd server, using lsof, provided by Kapil
+		Chowksey <kchowksey@hss.hns.com>.
+
+		Updated IRIX 6.4 xfs_inode guess.
+
+4.17		October 14, 1997
+		Added -V option for verbose search result reporting.
+		Verbose reports are prepared for failure to locate
+		file names, command names, Internet addresses or
+		files, login names, NFS files, PIDs, PGIDs, and UIDs.
+
+		Augmented Linux NFS file test to cope with kernels
+		whose NFS code is in a loadable module.  Need for
+		the test was pointed out by Jonathan Sergent
+		<sergent@csociety.ecn.purdue.edu>.  The change
+		required that Linux have private dmnt.c source,
+
+		Completed a Linux 2.1.57 port on a system provided
+		by Jonathan Sergent.
+
+4.18		October 25, 1997
+		Eliminated memory leaks in alloc_lfile(), lkup_port(),
+		and NEXTSTEP's process_text() function.
+
+		Added recognition of OpenBSD 2.2 in Configure,
+		supplied by Kenneth Stailey <kstailey@disclosure.com>.
+
+		Consolidated print_file() functions to use the one
+		in lib/prtf.c.  Made it configurable and changed
+		it to size print columns dynamically.
+
+		!!! WARNING !!!
+
+		WITH DYNAMICALLY SIZED PRINT COLUMNS LSOF 4.18
+		PRODUCES OUTPUT SIGNIFICANTLY DIFFERENT FROM THAT
+		OF PREVIOUS REVISIONS.  LINES ARE GENERALLY SHORTER
+		AND THERE IS GENERALLY LESS BLANK SPACE BETWEEN
+		COLUMNS AND THE ITEMS IN THEM.  THERE ARE NO LONGER
+		ANY SPACES BETWEEN DEVICE NUMBER ELEMENTS, ONLY
+		COMMAS.
+
+		!!! WARNING !!!
+
+		Added special types and print specification modifiers
+		for file size and offset to handle UNIX dialects
+		with 64 bit sizes and offsets.  Paul Eggert
+		<eggert@twinsun.com> reported the need for this
+		addition.
+
+		With Paul Eggert's help picked lint from the lsof
+		library, the main level lsof sources, and the Sun
+		dialect sources.
+
+		Added documentation, including the file 00LSOF-L,
+		about the lsof-l LISTSERV.
+
+		Added support for Reliant UNIX on the RM600.  Bob
+		Passarella <rmpassar@pyramid.com> supplied the
+		changes.  Kevin Smith <kevin@pyramid.com> helped
+		arrange test systems.  While incorporating Bob's
+		changes, modified lib/rnch.c to handle kernel ncache
+		structs whose name is accessed via a char *, rather
+		than in a char array.
+
+		Changed #include order of <sys/socketvar.h> for
+		Solaris 2.x.  W. Richard Stevens <rstevens@kohala.com>
+		pointed out the need to do this.
+
+4.19		October 30, 1997
+		Changed Pyramid Reliant RM600 proc scan to skip
+		SSYS (p_flag) processes, since they don't seem to
+		have a readable u_cdir vnode.
+
+		Enabled Pyramid Reliant UNIX kread() work-around
+		for DC/OSx, too, since its read(/dev/kmem) kernel
+		driver seems to share the page boundary bug this
+		work-around circumvents.
+
+		Changed SzOffFtm_d and SzOffFtm_dv (new formats at
+		4.18 to print size and offset) from signed to
+		unsigned.  Setting them signed at 4.18 was an
+		oversight.
+
+		Plugged a memory leak that caused the loss of 130
+		bytes per repeat-mode pass.  Fixed it with a simple
+		work-around in main().  Lionel Cons <Lionel.Cons@cern.ch>
+		reported the leak.
+
+4.20		November 11, 1997
+		Tested under BSDI 3.1.
+
+		Added support for Reliant UNIX Mesh IPC files with
+		help from Billy Ho <bho@pyramid.com>.
+
+		Added support to Digital UNIX lsof that uses the
+		libmsfs tag_to_path() function (when it exists) to
+		look up AdvFS path names.  The idea and sample code
+		came from Dean Brock <brock@cs.unca.edu>.  Converted
+		Dean's code into more general purpose support for
+		private name cache lookups via the HASPRIVNMCACHE
+		#define in the dialect machine.h file and code
+		conditional on it in the printname() function.
+
+		Taught Digital UNIX lsof to recognize NFS3 file
+		systems.  Corrected Digital UNIX lsof DEVICE column
+		alignment.
+
+4.21		December 1, 1997
+		Squashed bug, introduced at revision 4.18, that
+		resulted in double reporting of each selected PID
+		when terse mode (-t) was specified.
+
+		Corrected minor bug, also introduced at 4.18, that
+		might cause an extra print_proc() pass when one
+		PID has been specified.
+
+		Added -R to lsof options in scripts/idrlogin.perl*.
+		The option should have been there -- it was supposed
+		to be mandatory for PGID reporting -- but a bug,
+		corrected in revision 4.18, previously made -R
+		unnecessary.
+
+		Enabled configuring for BSDI BSD/OS 4.0 per a
+		suggestion from Jeff Honig <jch@bsdi.com>.
+
+		Enabled replacement of scoff_t with off64_t (scoff_t
+		is used to type r_size and r_localsize in the rnode
+		struct) for IRIX 5.3 systems that have the NFS
+		kernel rollup patch (1477).  This compensates for
+		SGI's failure to distribute an updated <sys/fs/rnode.h>
+		with their patch.
+
+		Validated under Linux 2.0.3[12], Linux 2.1.64, and
+		NetBSD 1.3.
+
+		Added FreeBSD root directory reporting, courtesy
+		of Dan Nelson <dnelson@emsphone.com>.
+
+4.22		December 15, 1997
+		Made adjustments for Linux 2.1.7[02].
+
+		Improved NAME information for Linux UNIX domain
+		sockets.
+
+		Added option +|-M to control the reporting of
+		portmapper registration information in square
+		brackets after the TCP or UDP port or service name.
+		Kenneth Stailey <kstailey@disclosure.com> suggested
+		the feature and provided sample code from OpenBSD.
+		Reporting is disabled by default in the distribution
+		and may be enabled with +M; if lsof is compiled
+		with HASPMAPENABLED (e.g., from machine.h), reporting
+		will be enabled by default and can be disabled with
+		-M.
+
+		Changed the -w option to +|-w to match the syntax
+		of the +|-M option and to eliminate any options
+		that flip meaning when a symbol is defined at
+		compile time.  For both +|-M and +|-w, specifying
+		`-' when the default state is disabled or specifying
+		`+' when the default state is enabled causes no
+		problems.
+
+	!!!WARNING  The -w option has changed in lsof 4.22.  WARNING!!!
+
+		Made the +|- prefix legal for most options, but
+		didn't document it in the man page or help panel.
+		Most options that disable something -- e.g., -b,
+		-C, -n, -P -- now disable when the prefix is `-'
+		and enable when it is `+'.  Since the states these
+		options disable are enabled by default, I chose to
+		avoid documentation complexity and confusion by
+		not mentioning that they can be used with the `+'
+		prefix.
+
+		Condensed the help panel.
+
+		Made sure Digital UNIX Configure stanza puts normal
+		include path (e.g., /usr/include) before system
+		include paths.
+
+		Added IPX socket information reporting to Linux
+		with help from Jonathan Sergent <sergent@purdue.edu>.
+
+4.23		January 16, 1998
+		Fixed conflict arising from the quondam replacement
+		of the Sun Solaris <netdb.h> with a BIND/BSD version.
+
+		With help from Jonathan Sergent <sergent@purdue.edu>
+		developed a /proc file system based Linux lsof.
+		It needs some Linux 2.1.x release to work -- I'm
+		not sure which, but I tested under 2.1.72, 2.1.76,
+		and 2.1.79.  The Configure script selects special
+		sources for this lsof, so the full lsof distribution
+		now contains both /dev/kmem and /proc based sources
+		for Linux lsof.  An optional kernel mod, written
+		by Jonathan, enhances the /proc-based lsof ability
+		to recognize IPX socket files.  Reorganized and
+		augmented the Linux sections in 00FAQ to explain
+		the two types of Linux lsof.
+
+		Defined DOSTAT_FUNCTION for dostat() in misc.c to
+		select the function, stat() or lstat(), it will use.
+		DOSTAT_FUNCTION is normally undefined, defaults to
+		lstat(), and is only defined for the /proc-based
+		Linux lsof in its dlsof.h.
+
+		Made conditional on the presence of IRIX 6.4 XFS
+		rollup patch #6 an XFS node change introduced in
+		revision 4.16.   Identified the patch with help
+		from John R. Vanderpool <fish@daacdev1.gsfc.nasa.gov>.
+
+		Added NFS node compensation for NetBSD 1.3.  The
+		code and suggestion for it was supplied by Jean-Luc
+		Richier <richier@imag.fr>.
+
+		Added diagnostic messages to the /dev/kmem-based
+		Linux Mksrc script to report errors during the
+		construction of the kernel name cache header file,
+		kncache.h.  Added 00FAQ information on kncache.h.
+
+		Added a new Linux test host, running 2.0.33 and
+		GlibC, provided by Steve Logue <stevel@mail.cdsnet.net>.
+
+		Ported to PTX 4.1.3 and 4.4.2.  Adjusted lib/rnch.c
+		for 4.4.2 to allow customization f additional ncache
+		struct element names.
+
+4.24		January 28, 1998
+		Changed /proc-based Linux lsof offset test to use "/"
+		instead of "/etc/passwd".
+
+		To assist Jim Mintha <jim@geog.ubc.ca> with the
+		packaging of lsof for Debian Linux, added a
+		DEBIAN_LINUX_LSOF #define to trigger the activation
+		of special system map file location code in the
+		/dev/kmem-based dproc.c.
+
+		Applied modification to dialects/bsdi/dlsof.h from
+		Ingimar Robertson <iar@skyrr.is>, enabling lsof to
+		compile for BSDI BSD/OS 2.0.
+
+		Corrected a documentation error in 00DCACHE, pointed
+		out by Thomas Anders <anders@hmi.de>.  The error was
+		created when the -V option was added at lsof 4.17.
+
+		Made IRIX 5.3 through 6.3 lsof aware of IRIX SCSI
+		tape devices (e.g., /dev/tape).  Dave Olson of SGI
+		and Randolph J. Herber of FNAL provided valuable
+		advice, and Igor Schein <ischein@air-boston.com>
+		helped test.
+
+		Added a machine.h symbol (NEVER_HASDCACHE) that
+		prevents Customize from offering to change HASDCACHE.
+		The symbol may appear anywhere in machine.h --
+		e.g., in a comment.  Included the symbol in a
+		comment of the HASDCACHE section of the /proc-based
+		Linux lsof machine.h, and accompanied it with
+		warnings against #define'ing HASDCACHE.  Did the
+		same thing for WARNDEVACCESS (NEVER_WARNDEVACCESS
+		is the suppressant.)
+
+4.25		February 7, 1998
+		Corrected an IRIX mis-cast of file offset (position).
+		Igor Schein <ischein@air-boston.com> reported the
+		problem.  This was offered as a patch to 4.24.
+		Picked some lint Igor pointed out.
+
+		At Igor's suggestion added an optional decimal
+		digit size argument to the -o option.  This argument
+		specifies how many file offset decimal digits can
+		follow "0t" before lsof switches to a "0x..." form.
+		The argument size specification doesn't count the
+		two characters of the "0t".  A size of 0 means
+		unlimited.  The default is OFFDECDIG (8), preserving
+		compatibility with existing lsof output; it can be
+		changed by the lsof builder.  When size is specified
+		with -o it does not force offset display; -o without
+		a size still must be used to do that.
+
+		Added an IRIX 6.2, 32 bit system, XFS node patch,
+		courtesy of Ulrich Bernhard <rzubu@rzu.unizh.ch>.
+
+		For my own convenience enabled Configure to use
+		/usr/local/bin/gcc for NEXTSTEP.  This allows
+		circumvention of a gcc 2.8.0 ranlib problem on
+		my test 3.1 `040 cube.
+
+		Added flags recommended by the RISC/os and Ultrix
+		compilers for the updated (and longer) main.c.
+
+		Updated FreeBSD cd9660_node.h Configure test.
+
+4.26		February 17, 1998
+		Added shared process group processing for IRIX 5.3,
+		and IRIX 6.1 and above, based on investigation of
+		a bug report from Igor Schein <ischein@air-boston.com>.
+		Igor helped test this addition.
+
+		Improved handling of file system name arguments.
+		It's now done in a manner similar to fuser.  The
+		-f argument forces path names to be considered as
+		simple files, rather than as file system names.
+		The +f flag forces them to be considered as file
+		system names.  Normally path arguments are considered
+		file system names when they match a mounted-on
+		directory in the system's mount table, or when they
+		match a mounted file system's block device.  Igor
+		Schein helped test this change.
+
+		Igor also suggests that the proper compilation of
+		the IRIX 6.4 proc structure after patch 2536 has
+		been installed may need -DPIOMEMOPS.  So lsof's
+		MkKernOpts script was updated to propagate that
+		option from CCOPTS in /var/sysgen/system/irix.sm,
+		even though patch 2536 doesn't add -DPIOMEMOPS to
+		it.  Added a 00FAQ item on this patch.
+
+		Added a fatal warning message about names forced
+		to be file system names (with +f) that have no
+		match in the mount table.
+
+		Improved the -V message for files and file systems
+		for which no open files were found.  Added reporting
+		of /proc file and file system search failures.
+
+		Did some code reorganization to combine the multiple
+		ck_file_arg() functions into one.  Moved the new
+		function from the library to the top level and put
+		it in arg.c; moved the usage function from arg.c
+		to a new top-level source file, usage.c, to balance
+		top-level source file size.  The new usage.c depends
+		on version.h; arg.c no longer does.
+
+		Added flag recommended by the DU compiler for the
+		updated (and longer) main.c.
+
+4.27		March 6, 1998
+		At the request of Igor Schein <ischein@air-boston.com>
+		added a conditional repeat mode option, using the
+		`+' prefix to the `r' option.  +r operates as does
+		-r with the exception that it exits the first time
+		no open files have been listed during a cycle.
+		The exit code will be zero when any open files have
+		been listed; one, if none were ever listed.
+
+		Ported lsof to HP-UX 11.0 with the help of Richard
+		Allen.  This port hasn't been tested on a 64 bit
+		kernel; I'm sure it won't work there without more
+		mods.  It may not work on PA 2 architectures; I've
+		only tested it under PA 1 and a separate, busy
+		tester reported PA 2 problems that I've been unable
+		to investigate.
+
+		In anticipation of getting access to a 64 bit HP-UX
+		kernel and the pending start of the Solaris 2.7
+		Beta test (It will have 64 bit kernel addressing.),
+		started adding support for 64 bit kernel pointers.
+		This includes: ubiquitous use of the KA_T cast
+		for kernel pointers; a format to print them,
+		KA_T_FMT_X; a function to print them, print_kptr();
+		and modifications to most kernel-related functions
+		-- e.g., process_file(), process_node(),
+		process_socket(), readvfs() -- to process kernel
+		addresses as KA_T types.
+
+		Fixed minor bug in handling path name arguments
+		that end with a `/'.
+
+		Removed support for RISC/os; its test system is no
+		longer available.
+
+		Made modifications to insure that lsof output
+		doesn't contain non-printable characters.  All such
+		characters are now printed in the printf form
+		"\x%02x".  Several new common functions were
+		installed in misc.c to support "safe" printing.
+		This second major modification in 4.27 to common
+		and dialect code could have introduced bugs not
+		yet detected.
+
+4.28		March 10, 1998
+		Refined unprintable format to use \b, \f, \r, \n,
+		\t, and ^* (for CTRL) forms.  Corrected omission
+		of safestrprt() use for field output command name.
+		These changes were offered as patches to 4.27.
+
+		Made space an unprintable character (\x20) in the
+		COMMAND column; printable elsewhere, including the
+		NAME column, field output, and error messages.
+
+		Made sure FD column is parseable as a single entity
+		-- i.e., has no embedded space.  Thus, if the access
+		mode is unknown but there is a known lock mode, (a
+		very rare case) the access mode will be printed as
+		`-'.
+
+		Picked lint with gcc 2.8.0 under Solaris 2.6.
+
+		With the help of Dave Olson of SGI identified a
+		proc struct element that should have been added to
+		<sys/proc.h> by IRIX 6.4 patch 2536.  Added a
+		work-around for it to the lsof Configure script.
+		Igor Schein <ischein@air-boston.com> identified
+		that the patch caused a proc structure length
+		complaint from lsof.  Removed an obsolete 00FAQ
+		item on the patch, installed at lsof 4.26, explaining
+		that no solution was yet available.
+
+		Added a 00FAQ item on how BIND installs its own
+		header files, including <netdb.h>, which may cause
+		the rpcent struct definition to vanish.  Solaris
+		has an automatic lsof work-around, but that hasn't
+		been (and probably can't be) propagated to all
+		dialects supported by lsof.  The 00FAQ item recommends
+		re-installation of the vendor header files that
+		BIND has replaced.  (Others include <rpcent.h>,
+		<sys/bitypes.h>, and <sys/ctypes.h>.)
+
+		Made AIX AFS fixes.
+
+4.29		March 26, 1998
+		Corrected bug in Internet address matching.  The
+		matching formerly stopped if the foreign address
+		matched, thus failing to check the local address
+		for a match.  That led to a possible false "Internet
+		address not located" warning (i.e., in response to
+		-V) about the local address, when both foreign and
+		local addresses were specified with -i.  This
+		correction was offered as a patch to 4.28.
+
+		Changed readmnt() usage in an attempt to defer
+		mount readlink() and stat() delays until they are
+		necessary.
+
+		Corrected two bugs in the Digital UNIX readdev()
+		function.  Made the correction available as a patch
+		to 4.28 and regenerated the 4.28 DU binaries.
+
+		Added a missing argument to a print-kptr() call in
+		the HP-UX dsock.c.  The missing argument causes a
+		fatal gcc error.  The problem was reported by Eyal
+		Shaynis <eyal.shaynis@telrad.co.il>.  The fix was
+		offered as a 4.28 patch.
+
+		Adjusted for Digital UNIX 4.0D; the spec_node
+		structure is now defined in <sys/specdev.h>.  Kris
+		Chandrasekhar <Kris.Chandrasekhar@digital.com>
+		identified the need for the adjustment.
+
+		Incorporated a bug fix from Brian McAllister
+		<mcallister@mit.edu> to the DU readmnt() function.
+		This fix was offered as a patch to 4.28.
+
+		Added "safe" printing to a SunOS clone device error
+		message.
+
+		Corrected bug in tabling of Linux /proc-based lock
+		info.
+
+		Corrected bug in handling of SunOS TLI streams.
+		Dan Farmer <zen@trouble.org> reported the problem.
+
+		Added a Solaris 2.6 work-around to keep the BIND
+		<sys/bitypes.h> from colliding with the Solaris
+		<sys/int_types.h>.
+
+		Strengthened the Configure test for /proc-based
+		Linux lsof, based on a report from Marty Leisner
+		<leisner@sdsp.mc.xerox.com>.
+
+		Tested on OpenBSD 2.3.
+
+		Made AIX changes that allow use with 3.2.5.  The
+		changes were suggested and tested by Brett Hogden
+		<hogden@rge.com>.
+
+		Added Solaris 2.6 AFS support.  Disabled reporting
+		of some node numbers for Solaris 2.5 and above open
+		AFS files.  The node number computation algorithms
+		used for SunOS 4.1.x and Solaris less than 2.5 no
+		longer always work under Solaris 2.5 and above.
+
+4.30		April 9, 1998
+		Corrected a pid structure member naming error for
+		UnixWare < 2.1.2.  The problem was reported by
+		Richard van Meurs <vanmeurs.anva@atriserv.nl>.  He
+		supplied the correction.  This was offered as a
+		patch to 4.29.
+
+		Had a report from Igor Schein <ischein@air-boston.com>
+		that IRIX 6.4 patch 2839 is another SGI kernel
+		patch, along with 2536, that changes the size of
+		the proc structure in the kernel without changing
+		the proc structure in <sys/proc.h>.  Upon further
+		investigation found that the effect of these patches
+		on the proc structure is not consistent.  Therefore,
+		dropped the Configure patch test for IRIX 6.4 and
+		made the code in irix/dproc.c slightly more tolerant
+		of proc structure size differences for IRIX 6.4.
+		Igor help test the change.
+
+		Corrected Solaris >= 2.5 AFS inode number generation.
+		Craig Everhart <Craig_Everhart@transarc.com> helped
+		find the cause of the problem.  This was offered as
+		a patch to 4.29.
+
+		Refined the Linux /dev/kmem-based glibc evasion
+		for the timeval structure to make it work with
+		glibc version 2.0.7.  This required defining a new
+		global symbol, TIMEVAL_LSOF, default timeval, that
+		the /dev/kmem-based Linux lsof can set to its
+		private glibc timeval name, distinct from the kernel
+		timeval name.
+
+		Added support for Alpha to the /dev/kmem-based
+		Linux lsof.  Alexandre Oliva <oliva@dcc.unicamp.br>
+		provided a test system.  Added an item to 00FAQ
+		about lsof, the Alpha processor, and Linux.
+
+		Added a 00FAQ item about lsof year 2000 compliance.
+		Basically it says lsof is probably compliant,
+		because its only date or time computations are done
+		with time_t values, but I haven't done any specific
+		Y2K validation.  I don't have plans to do any.
+
+		Added support for UnixWare 7.  Chris Daniels
+		<chrisd@dlpco.com> provided a test system and Don
+		Draper <dond@sco.COM> provided technical information.
+		Added BFS and SFS file system support to lsof for
+		UW 2.1.[12] and 7.
+
+		Updated Solaris VxFS support for VxFS 3.2.1.  Greg
+		Earle <earle@netbsd4me.jpl.nasa.gov> reported the
+		need for the update.  Greg and Roger Klorese
+		<rogerk@veritas.com> provided technical information.
+		Scott McClung <mcclung@primenet.com> tested.
+
+		Changed IRIX XFS patch detection in anticipation of
+		learning there are multiple XFS patches for IRIX 6.4
+		that require different versions of the lsof-invented
+		xfs_inode structure.
+
+4.31		April 21, 1998
+		Added a VxFS #if/#endif wrap to a section of the
+		HP-UX dnode.c that wasn't properly protected.  The
+		problem was reported by  Peter Klosky <PKlosky@bdm.com>.
+		This was offered as a patch to 4.30.
+
+		Added support for Solaris 2.7 (first Beta release).
+		Mike Sullivan <Mike.Sullivan@Eng.Sun.COM> provided
+		technical advice and helped test.  Charles Stephens
+		<cfs@jurassic.eng.Sun.COM> also helped test.
+
+		Fixed bug in /proc-based Linux that caused it to
+		access /proc/mounts excessively.  Marty Leisner
+		<leisner@sdsp.mc.xerox.com> provided a syscall
+		trace that identified the bug.  The fix was offered
+		as a patch to 4.30.
+
+		Adjusted the IRIX 6.4 private structure definition
+		for the XFS node to accommodate patch 2970.  Igor
+		Schein <ischein@air-boston.com> identified the
+		patch and the required adjustment.
+	
+4.32		May 11, 1998
+		Corrected Solaris 2.7 code for reporting PCFS
+		(floppy disk) node numbers.  Casper Dik
+		<casper@holland.sun.com> supplied the fix.  The
+		fix was offered as a patch to 4.31.
+
+		Corrected a bug in conditional repeat mode handling
+		pointed out by Igor Schein <ischein@air-boston.com>.
+		This was offered as a patch to 4.31.
+
+		Improved reporting of AIX open(/dev/memory device)
+		errors.
+
+		Corrected a Solaris < 2.5 KA_T declaration error,
+		pointed out by Robert Kiessling <robert@easynet.de>.
+		Changed KA_T from a #define to a typedef for all
+		dialects to prevent future problems of this kind.
+
+		Changed the sample Perl 5 script big_brother.perl5
+		to report a four digit year from localtime().
+
+		Added support for AIX 4.3[.1].  Bill Pemberton
+		<wfp5p@tigger.itc.virginia.edu> provided a test
+		system.  Andrew Kephart <akephart@austin.ibm.com>
+		and Tom Weaver <tvweaver@austin.ibm.com> provided
+		technical assistance.  Niklas Edmundsson
+		<nikke@ing.umu.se> did 4.3.1 testing.
+
+		Added -qmaxmem option to CFLAGs for an AIX compilation
+		with an xlc version 4.x compiler.
+
+		Adjusted Linux socket handling for changes in the
+		AX25 members of the sock struct.   Richard Green
+		<rtg@tir.com> pointed out the problem.  Tested
+		/dev/kmem-based lsof under Linux 2.0.34.
+
+4.33		May 22, 1998
+		Added generic IPv6 support to common lsof sources
+		and specific IPv6 support to AIX sources.  Andrew
+		Kephart <akephart@austin.ibm.com> supplied the
+		additions and helped with testing.  Bill Pemberton
+		<wfp5p@tigger.itc.virginia.edu> provided a test
+		system.  The modification affected sources for
+		every dialect, whether it supports IPv6 or not, by
+		changing the interfaces to the common Internet
+		address function ent_inaddr().
+
+		Added support for the NetBSD UVM virtual memory
+		system.  Paul Kranenburg <pk@cs.few.eur.nl> supplied
+		technical details.
+
+		Bracketed HP-UX 11 use of <sys/spinlock.h> with
+		#if/#endif _KERNEL.
+
+		Corrected printing of PCB address in DEVICE column
+		for IRIX.
+
+4.34		June 26, 1998
+		Updated 00FAQ to discuss TCP and UDP ports private
+		to the AIX kernel and 00README to describe how ACLs
+		can be used to give lsof permission to read the
+		kernel memory devices.  Add information to 00FAQ
+		and 00README about other OpenBSD architectures
+		where lsof is reported to compile and run.  Added
+		section to 00FAQ discussing how an incorrect loader
+		path environment variable value can prevent lsof
+		from loading correctly.
+
+		Improved Solaris namefs and doorfs support so that
+		it is now possible to search for an open VDOOR file
+		by the path name of its fattached file system
+		object.  Igor Schein <igor@txc.com> requested the
+		ability to do such a search.  Even with the change,
+		lsof can't always identify path names for open
+		VDOOR files.
+
+		Also at Igor's request, improved reporting of
+		information on open Solaris VCHR files that share
+		a common vnode, and Solaris UNIX domain socket
+		files.
+
+		Corrected print_kptr() argument error in PTX dnode.c,
+		reported by Mark Price <mprice@sequent.com>.
+		Compensated for ncache element naming differences,
+		introduced at PTX 4.4.2; Kurtis D. Rader
+		<krader@sequent.com> reported the problem.
+
+		Changed output column title from INODE to NODE to
+		better reflect the column's contents of node IDs
+		for more than just inodes.
+
+		Improved Configuration and processing for Solaris
+		AFS.  Corrected AIX AFS 3.4 afs_rwlock_t simulation.
+
+		Corrected a cast problem with two AIX knlist()
+		calls, thus quieting an AIX 4.2.1 compiler argument
+		type warning.  Jon Champlin <champlin@us.ibm.com>
+		reported the problem.
+
+		Added support to most dialect versions (exception:
+		/proc-based Linux) to warn when the identity of
+		the kernel where lsof was compiled doesn't match
+		the running identity.  The warning can be suppressed
+		with -w.  Note: determining AIX state requires
+		calling oslevel, a potentially slow operation.
+		Jon Champlin <champlin@us.ibm.com> suggested this
+		addition.
+
+	!!!! WARNING !!!!    !!!! WARNING !!!!    !!!! WARNING !!!!
+
+		Those using the lsof cross-configuration capability
+		(see 00XCONFIG), should be aware that the kernel
+		identity test feature introduces two new basic
+		cross configuration environment variables, LSOF_ARCH
+		and LSOF_VSTR.
+
+	!!!! WARNING !!!!    !!!! WARNING !!!!    !!!! WARNING !!!!
+
+		Identified a situation where a Solaris UNIX domain
+		socket name is known and can be searched for by
+		name; added the necessary code.
+
+4.35		July 17, 1998
+		Made the kernel identity check an option with the
+		HASKERNIDCK #define in machine.h.  Enabled altering
+		of HASKERNIDCK with the Customize script.  Added
+		a clause to the help output that indicates the
+		build-time HASKERNIDCK status.
+
+		Added more information to the NAME column for
+		Solaris UNIX domain sockets.  Made them searchable
+		by their clone device path name.  Igor Schein
+		<igor@txc.com> requested this.
+
+		Completed the HP-UX 11 port with support for its
+		optional 64 bit kernel.  Rich Rauenzahn
+		<rrauenza@cup.hp.com> provided a test system.
+		Corrected errors with HP-UX 11 lock reporting and
+		private kernel structure and type definitions.
+		Added support for HP-UX NFS3 files.
+
+		Limited mount table warnings -- e.g., when -b is
+		used -- to one set per mount point.
+
+		Fixed some mount table scanning and usage bugs,
+		including one in Solaris, reported by Kjetil Torgrim
+		Homme <kjetilho@ifi.uio.no>.
+
+4.36		August 4, 1998
+		Made corrections and additions to IPv6 support and
+		to AF_ROUTE socket handling, supplied by Jean-Luc
+		Richier <Jean-Luc.Richier@imag.fr>.  Jean-Luc's
+		additions provide IPv6 support for the Inria IPv6
+		implementations on FreeBSD and NetBSD.
+
+		Fixed two Solaris 2.5, 2.5.1, 2.6 and 2.7 TCP and
+		UDP host name or IP address reporting bugs, reported
+		by James Mathiesen <James-Mathiesen@deshaw.com>.
+		This fix was offered as a patch to 4.35.
+
+		Updated the Customize script to cause ENTER to use
+		all defaults.  Amir J. Katz <amir@ndsoft.com>
+		suggested this and helped test the changes.
+
+		Updated Solaris ICMP and IP stream handling, based
+		on a report from Igor Schein <igor@txc.com>.
+
+		Fixed a bug in the Digital UNIX mount table handling,
+		reported by Bob Ward <bward@thehartford.com>.
+		While working on the bug, found and updated some
+		obsolete AdvFS code.  This fix was offered as a
+		patch to 4.35.
+
+4.37		September 15, 1998
+		Deactivated SGI IRIX support and archived revision
+		4.36 sources and binaries in pub/tools/unix/lsof/OLD.
+
+		Improved performance of FD searching.  This was
+		offered as a patch to 4.36.
+
+		Amir J. Katz <amir@ndsoft.com> pointed out that
+		ranlib isn't needed for AIX or Solaris.  Made
+		appropriate Configure script changes.
+
+		Fixed a file offset reporting bug for HP-UX VCHR
+		and VBLK device nodes located on a VxFS root.  Doug
+		Siebert <douglas-siebert@iowa.edu> reported the
+		bug.  The fix was offered as a patch to 4.36.
+
+		Resolved an HP-UX root device name reporting bug,
+		partly caused by an out-dated local copy of the
+		<sys/mount.h> mount structure, by generating a
+		local header file with the structure that can be
+		compiled without needing _KERNEL defined.  Doug
+		Siebert also reported this bug.
+
+		Changed some dialect source code -- Digital UNIX,
+		Solaris, SunOS, and UnixWare -- to make more
+		consistent with ps the user ID lsof reports in the
+		USER column.  Added a 00FAQ entry about it.  Igor
+		Schein <igor@txc.com> reported the Solaris and
+		SunOS lsof inconsistencies with what ps(1) reports.
+
+		Ported lsof to Pyramid ReliantUNIX 5.44.
+
+		Added brackets as comments to case, do, done, else,
+		endif, esac, if, and while statements in Configure
+		to assist in navigating its clauses.
+
+		Added more Linux 2.0.x glibc work-arounds.
+
+		Added support for UnixWare 7.0.1.
+
+		Ralph Forsythe <ralph@contact-paging.com> provided
+		a new FreeBSD test system.
+
+4.38		November 25, 1998
+		Added support for recent FreeBSD 3.0 distributions.
+		A 3.0 test system was provided by David O'Brien
+		<obrien@NUXI.com>.  This was offered as a patch
+		to 4.37.
+
+		Updated the scripts/idrlogin.perl* files to look
+		for sshd processes in addition to rlogind and
+		telnetd ones.
+
+		Added support for DU 5.0 Beta.  Berkley Shands
+		<berkley@cs.wustl.edu> provided a test system.
+
+		Added support for OpenBSD 2.4 with changes supplied
+		by Kenneth Stailey <kstailey@disclosure.com>.
+
+		Changed the Solaris 2.7 tests and documentation to
+		Solaris 7.
+
+		Made some changes to the header files for NEXTSTEP
+		3.3 and added support for OPENSTEP 4.x with help
+		from Michael A. Hovan III <mhovan@BLaCKSMITH.com>
+		and Carl Lindberg <Carl_Lindberg@BLaCKSMITH.com>.
+		The combined dialect subdirectory is named n+os.
+		One of Carl's changes propagates RC_CFLAGS to the
+		library Makefile.  Timothy J. Luoma <luomat@peak.org>
+		helped test under NEXTSTEP 3.3 and OPENSTEP 4.2.
+
+		Made UW 7.x version sensitive to the presence of
+		ptf7038.  Added peer PCB address to Unix domain
+		socket Name column, even when a path name has been
+		located.  Information for these changes was supplied
+		by Francis Le Bourse <flebourse@intelcom.fr>.  Lee
+		Penn <lee@dlpco.com> provided a test system.
+
+		Tested lsof under OSR 5.0.5 on a test system also
+		provided by Lee Penn.
+
+		Made path name argument processing more tolerant
+		of errors per a suggestion from Julian Gordon
+		<julian@cadence.com>.
+
+		Acquired a new UnixWare 2.x test system, generously
+		provided by Computer Classroom, Inc. -- Matthew
+		Thurmaier <matt@compclass.com>, Ken Laing
+		<ken@compclass.com>, and Andrew Merril
+		<andrew@compclass.com>. Updated Configure to accept
+		a UnixWare version of 2.1.3.
+
+		Updated kmem-based lsof for Linux 2.0.36.
+
+		Updated NetBSD sources for a change in a UVM virtual
+		mapping header file.
+
+		Corrected a cache allocation bug in Sun format
+		kernel name cache handling.  The bug only shows up
+		when the kernel name cache is inaccessible.
+
+4.39		December 29, 1998
+		Corrected problems with large device number handling
+		for 64 bit Solaris 7.  The problems were reported
+		by Steve Bellenot <bellenot@math.fsu.edu>.  Steve
+		helped test the fixes.  The fixes were offered as
+		two patches to lsof 4.38.
+
+		Improved FreeBSD Configure operations for header
+		files that must be obtained from the kernel source
+		tree, based on a suggestion from David O'Brien
+		<obrien@NUXI.com>.
+
+		For Bela Lubkin <filbo@deepthought.armory.com> made
+		optional with +f[cfn] the display of file structure
+		address, shared use count, and node structure
+		address.  /proc-based Linux doesn't implement this
+		feature, because it doesn't read kernel structures
+		from kernel memory.  Modified the PTX -X option to
+		take advantage of the new file structure display
+		option.  Added shared.perl5 to the scripts/
+		subdirectory to provide an example of how +f[fn]
+		might be used to track shared file descriptors and
+		files.
+
+		Added more /dev/kmem-based Linux glibc evasions,
+		provided by Jeff Johnson <jbj@redhat.com> and Maciej
+		Lesniewski <nimir@kis.p.lodz.pl>.  Jeff helped test
+		them on various Linux architectures.
+
+		Tested on AIX 4.3.2; no changes were required.
+		Doug Crabill <dgc@purdue.edu> provided a test
+		system.
+
+		Fixed -c option to detect missing command name when
+		following option begins with `+'.
+
+4.40		January 25, 1999
+		Added support for using the CDS compiler for Reliant
+		Unix 5.44 and above.  Made Reliant Unix MIPC support
+		optional, dependent on the presence of <sys/mipc.h>.
+
+		Based on a report from Michael Schmitz <MSchmitz@lbl.gov>
+		that /dev/kmem-based lsof misbehaves on a Linux
+		2.0.x m68k kernel without module support, made the
+		absence of query_module() or get_kernel_syms()
+		Linux kernel support a fatal error.  Updated relevant
+		sections of 00FAQ to reflect the change.
+
+		Added the ability to force the Linux Configure
+		stanza to use the /proc or /dev/kmem source base
+		via a LINUX_BASE environment variable specification.
+		This is a cross-configuration assist.
+
+		Added "+D <dir>" and "+d <dir>" options for directory
+		searching.  +D searches the entire tree, starting
+		at <dir>, including <dir>, its contents, and its
+		subdirectory branches; +d searches only <dir> and
+		its contents, but not its subdirectory branches.
+		Improved lsof's searching of the specified name
+		list to compensate for anticipated long lists from
+		+d and +D.
+
+		Made an egrep in the Solaris Configure stanza usable
+		by the standard and XPG4 egrep's.  Kenneth Stailey
+		<kstailey@disclosure.com> pointed out the improvement.
+
+		Fixed bugs in /dev/kmem-based Linux and UnixWare
+		Unix domain socket name searching.
+
+		Changed a Linux Alpha #include to be conditional
+		on the presence of its named header file, so that
+		lsof will compile on Red Hat 5.1 and 5.2 (Linux
+		kernel 2.0.35) where the header file is absent.
+		The problem was reported by Alexandre Oliva
+		<oliva@dcc.unicamp.br>.
+
+		Fixed an AIX 4.3+ bug in procinfo struct space
+		allocation, reported by Jeff Stewart <jws@purdue.edu>.
+		This was offered as a patch to 4.39.
+
+		Added an lstatsafely() function to offer the same
+		isolation for lstat() calls that statsafely() offers
+		for stat() calls.  This made DOSTAT_FUNCTION no
+		longer necessary, so deleted it.
+
+		With help from Laurent P. Montaron <lpm@sequent.com>
+		ported lsof to PTX 4.4.4.  Laurent did a monumental
+		job of identifying TCP/IP changes by their TCP
+		version, rather than by their PTX (With mix 'n
+		match PTX and TCP/IP versions, the PTX version
+		often has no bearing on the TCP/IP version.), and
+		changed the Configure script and pre-processor
+		#if/#else/#endif blocks to match.  He also updated
+		Unix domain socket handling for PTX TCP/IP versions
+		4.5 and above.
+
+		Updated CLIENT handle acquisition of fill_portmap()
+		in print.c to use the more modern RPC function
+		clnt_create() in place of clnttcp_create() where
+		possible.  PTX 4.4.4 requires clnt_create().
+
+4.41		February 27, 1999
+		Added FreeBSD 3.1 and and 4.0 support with help
+		from Sheldon Hearn <axl@iafrica.com>, David O'Brien
+		<obrien@NUXI.com>, and John Polstra <jdp@polstra.com>.
+
+		Corrected bungled AIX 4.3+ patch that went into
+		lsof 4.40.
+
+		Reorganized the Configure script to improve Makefile
+		construction.  A specific impetus for this was to
+		allow FreeBSD system-wide make flags to be propagated
+		to the lsof Makefiles, but other goals were to make
+		sure that the DEBUG= make entry can over-ride
+		standard CFLAGS values, and to better manage the
+		identification of compilers and their versions.
+		Two compiler-related values may now be supplied in
+		environment variables: 1) the compiler path in
+		LSOF_CC; and 2) the compiler version in LSOF_CCV.
+		00XCONFIG documents them.
+
+		Added support for Pyramid Reliant Unix bsdsfs,
+		msockfs, and sockfs file systems.
+
+		Added an optional LSOF_CINFO string to Configure,
+		producing a CINFO string in selected Makefiles,
+		producing a #define LSOF_CINFO in selected version.h
+		header files.  The purpose of this is to allow
+		Configure the option to propagate information to
+		the lsof -v output.  It is now used for Linux to
+		identify the code base, and for HP-UX 10.30 and
+		11.0 and Solaris 7 to identify the kernel bit size.
+
+		Added system information to NEXTSTEP and OPENSTEP
+		-v output, from the second line of hostinfo's
+		output.
+
+		Fixed a login name buffer overflow problem in the
+		processing of -u option values.  This was offered
+		as a patch to 4.40.  !!!THIS IS A SERIOUS STACK
+		OVERFLOW BUG; A LINUX EXPLOIT EXISTS FOR IT THAT
+		OPENS A BASH SHELL WITH LSOF'S AUTHORITY -- E.G,
+		SETGID(KMEM) POWER!!!
+
+		Improved the Solaris mount table filter so the
+		volume manager's fake mount point, "/vol", is
+		ignored and doesn't supplant "/" in NAME column
+		path assemblies.  Igor Schein <igor@txc.com> reported
+		this bug and provided important help in finding
+		it.  This was offered as a patch to 4.40.
+
+		Changed the Linux /dev/kmem-based lock ownership
+		test to answer a problem reported by Tom Christiansen
+		<tchrist@jhereg.perl.com>.  This was offered as a
+		patch to 4.40.
+
+		Installed an HP-UX 11 patch, suggested by Kevin
+		Vajk <kvajk@cup.hp.com>, that adjusts a private
+		lsof kernel header file, derived via Q4, to correspond
+		to an HP-UX patch bundle.
+
+		Made NetBSD 1.3I sockproto structure adjustment.
+
+4.42		March 30, 1999
+		Fixed a typo in the HP-UX dfile.c that caused +fF
+		and +fN output controls to swap effect.
+
+		Enabled for OpenBSD 2.5 per notice from Kenneth
+		Stailey <kstailey@kstailey.tzo.com>
+
+		Made more VM accommodations for FreeBSD 4.0.
+
+		Improved file system search reporting to include
+		path name components when they're available, instead
+		of mindlessly reporting the file system name in
+		the NAME column.  Guy Dallaire <gdallair@geocities.com>
+		brought the need for this change to my attention.
+
+		Updated Solaris 2.6 VxFS for Veritas Oracle Database
+		Edition 2.0, VxFS version 3.3, and VxVm version
+		2.5.4, based on a report from Chris Kordish
+		<chris.kordish@East.Sun.COM>.  Chris kindly provided
+		a test system.
+
+		Improved HP-UX ipc_s patch detection in Configure,
+		response in .../dialects/hpux/hpux11/ipc_s.h, and
+		documentation in 00FAQ, Kevin Vajk <kvajk@cup.hp.com>
+		helped test.
+
+		Added to Customize the option to suppress HASKERNIDCK
+		selection for specified dialects.  Suppressed it
+		for /proc-based Linux lsof, and removed its test
+		and code from there.  Tin Le <tin@netimages.com>
+		alerted me to the need for this update.
+
+		Ported to official Digital UNIX 5.0 release.
+
+		Changed DU lsof to use the knlist(3) function when
+		no kernel file has been specified with -k.  This
+		change was suggested by Erich Wimmer
+		<Erich.Wimmer@digital.com>.
+
+		Updated Configure for latest NetBSD (1.3I?) with
+		UVM support the default.
+
+4.43		May 11, 1999
+		Corrected a typo in the Solaris gcc discussion in
+		00FAQ.  Made changes to the Solaris 2.5[.1] private
+		tcp_s structure.  Both changes were done in response
+		to reports from Igor Schein <igor@txc.com>, who
+		tested the Solaris 2.5 change.
+
+		Made more IPv6 adjustments to lsof for Tru64 UNIX
+		(Digital UNIX) 5.0, based on information obtained
+		from Compaq by Berkley Shands <berkley@cs.wustl.edu>.
+
+		Corrected HP-UX error message about HP-UX 11 q4 usage.
+		Amir Katz <amir@ndsoft.com> reported the correction.
+
+		Fixed a GlibC 2.1 conflict in /proc-based Linux lsof.
+
+		Fixed a man page typo reported by Vlad Harchev
+		<hvv@hippo.ru>.
+
+		Changed some Solaris 2.7 references to Solaris 7
+		in Configure and 00XPORTING.
+
+		Added a Solaris example to the echo statements that
+		are the install rule in the SunOS/Solaris Makefile.
+
+		Added a field to the file structure output --
+		FILE-FLAG (file structure open flags, f_flag[s],
+		and process file flags, typically u_pofile)) --
+		enabled with +f[gG].  Its field output character
+		is 'G'.
+
+		Figured out another piece of the HP-UX 11 patched
+		ipc_s structure puzzle with the help of Keith Kalet
+		<KEITH_KALET@HP-USA-om41.om.hp.com>.
+
+		Fixed a PTX real vnode to real inode interpretation
+		bug.
+
+		Added link count to lsof output.  Eric Dumazet
+		<dumazet@risgw.ris.fr> requested and helped test
+		it.  The new +L option enables and filters it.
+		Its field output character is `k'.
+
+		Updated Configure script to recognize NetBSD 1.4.
+
+		Updated AFSConfig to handle default answers to
+		questions.
+
+		Incorporated patch from Jonathan Sergent <sergent@io.com>
+		that enables /proc-based Linux lsof to run on both
+		32 and 64 bit kernels.
+
+		Updated Configure script with a patch from David
+		O'Brien <obrien@NUXI.com> that recognizes FreeBSD 3.2.
+
+4.44		June 24, 1999
+		Corrected use of nlink member of hsnode for SunOS
+		4.1.x High Sierra File System files.  John Dzubera
+		<zube@tlaloc.stat.colostate.edu> reported the
+		problem and helped test the fix.  Also fixed a
+		SunOS segmentation fault bug.  These fixes were
+		offered as a patch to 4.43.
+
+		Improved handling of /proc-based Linux UNIX PCB
+		address.
+
+		Fixed a NEXTSTEP and OPENSTEP bug that made repeat
+		option (-r) processing malfunction.  This fix was
+		offered as a patch to 4.43.
+
+		Fixed Configure so it doesn't use -O in the Cflags
+		for the bundled HP-UX C compiler.  Jim Ankenbrandt
+		<jankenbrandt@penton.com> reported the problem.
+
+		Corrected output ordering of parent PID and process
+		group ID when both -R and -g are specified.
+
+		Enhanced the pdev.c and pdvn.c library modules for
+		wider use.  These dialect versions use the new
+		library modules: DEC OSF/1, Digital UNIX, and Tru64
+		UNIX; Pyramid DC/OSx and Reliant UNIX; SCO OSR and
+		UnixWare; and Sequent PTX.
+
+		Added basic clone device support to /dev/kmem-based
+		HP-UX lsof for HP-UX 10.30 and higher.
+
+		Added raw socket support to /proc-based Linux lsof.
+
+		Changed NODE-ADDR column title to NODE-ID in
+		anticipation of using more general identification
+		information in the column.
+
+		Ported to UnixWare 7.1, using a test system kindly
+		provided by Matt Thurmaier <matt@compclass.com>
+		and Don Draper <dond@sco.com>.
+
+		Updated for NetBSD 1.4C VM changes, and a new
+		current and root working directory structure.
+
+		Made minor adjustment for latest Tru64 UNIX 5.0
+		Beta release.
+
+4.45		July 30, 1999
+		Fixed quoting problem in DEC OSF/1, Digital Unix,
+		and Tru64 UNIX Makefile's install rule.  The problem
+		was reported by Berkley Shands <berkley@cs.wustl.edu>.
+		Fixed bug in Tru64 UNIX 4 lsof that caused FDs to
+		be skipped.  These fixes were offered in a patch
+		to 4.44.
+
+		Fixed a repeat-mode /proc-based Linux lsof bug,
+		reported by Sami Farin <sfarin@ratol.fi>.  This
+		was offered as a patch to 4.44.
+
+		Picked lint, some reported by Sami Farin.
+
+		Corrected a 00DCACHE documentation error in a sample
+		shell script.  The problem was reported by Chad R.
+		Larson <chad@larsons.org>.  Changed commented-out
+		entries in machine.h files so they require more
+		thought and work when the comments are removed,
+		based on a remark by Chad.
+
+		Compensated for the practice of Solaris 7 and above
+		to record the dev= value in /etc/mnttab in 32 bit
+		mode, even on 64 bit systems.  This was offered as
+		a patch to 4.44.
+
+		Added a C library test for /proc-based Linux lsof,
+		so that the #include files can be adjusted for a
+		non-GlibC environment.  The need for this was
+		reported by Andrew Hill <andrewh@tirin.openworld.co.uk>.
+		This was offered as a patch to 4.44.
+
+		Added support for Auspex LFS 1.8.1 and 1.9.2 to
+		SunOS 4.1.4 lsof.  The support was requested by
+		Quentin Fennessy <quentin@dvorak.amd.com>, who
+		provided information and did testing.
+
+		Enabled IPv6 support code for NetBSD and OpenBSD,
+		conditional on Configure script tests.  Wolfgang
+		Rupprecht <wolfgang@wsrcc.com> supplied the NetBSD
+		code and tested it.  The OpenBSD code I constructed
+		has been compiled but not tested.
+
+		Updated the identd Perl 5 script, based on a report
+		from Wendy Lin <af5@taiyang.cc.purdue.edu> that
+		the space in its response line in front of the user
+		name violates RFC 1413.
+
+		Added IPv6 support to /proc-based Linux lsof.
+		Jonathan Sergent <sergent@ETLA.NET> and Andrew
+		Thomas Sydelko <sydelko@ecn.purdue.edu> kindly
+		provided a test system.
+
+		Updated man page description of AIX multiplexed
+		files to indicate that they might be /dev/ptc or
+		/dev/pts, depending on the AIX version.  The
+		correction was suggested by Onno van der Linden
+		<onno@simplex.nl>.
+
+		Sylvain Robitaille <syl@alcor.concordia.ca> reports
+		lsof passes his Y2K tests.
+
+4.46		October 23, 1999
+		Corrected /proc-based Linux lsof to detect that an
+		IPv6 address is a mapped IPv4 address.  The problem
+		was reported and analyzed by Arkadiusz Miskiewicz
+		<misiek@misiek.eu.org>, who also tested the fix.
+
+		Added a libc5 library /dev/kmem-based Linux lsof
+		circumvention, supplied by Jason Lingohr
+		<lingman@lucid.net.au>.
+
+		Corrected a bug in -t (terse) AIX output, reported
+		by Wendy Lin <af5@taiyang.cc.purdue.edu>.  I
+		introduced the bug at revision 4.43 when adding
+		FILE_FLAG reporting.  This was offered as a patch
+		to 4.45.
+
+		Added a work-around for a problem in the OpenBSD
+		2.3 <sys/pipe.h> header file.  Volker Borchert
+		<bt@teknon.de> provided and tested it.
+
+		Improved description of cross-building lsof for a
+		64 bit Solaris 7 system on a 32 bit system with
+		suggestions from Phillip Edwards
+		<Philip.Edwards@sn.wpafb.af.mil>.
+
+		Fixed a gawk POSIX-mode pattern error in the Linux
+		/dev/kmem-based Mksrc script, based on a tip from
+		Ambrose C. Li <acli@mingpaoxpress.com>.
+
+		Fixed a bug in the Tru64 UNIX IPv6 handling, courtesy
+		of a report from Casper Dik <casper@holland.sun.com>.
+
+		Enabled support for OpenBSD 2.6.
+
+		Enabled support for BSDI BSD/OS 4.1, based on a
+		report from Jeffrey C Honig <jch@bsdi.com> that
+		only a Configure script change is necessary.
+
+		Enabled Configure script to use gcc for building
+		lsof for a 64 bit Solaris 7 and 8 kernels, if the
+		gcc version is 2.95 or above.
+
+		Improved -i option handling for systems with IPv6
+		support so that it will search for a host name in
+		both IPv4 and IPv6 families, when that is possible.
+		As a companion modification, changed -V processing
+		to report a single error when a multiple host name
+		match is requested.  Casper Dik <casper@holland.Sun.COM>
+		helped test.
+
+		Fixed a DEC OSF/1, Digital UNIX, Tru64 UNIX repeat
+		mode bug, reported by Mayer Ilovitz <mayer@cooper.edu>.
+		Mayer helped test the fix.  The fix was offered as a
+		patch to 4.45.
+
+		Changed Solaris socket file recognition scheme, so it
+		is (nearly) the same through Solaris 8, where the
+		previous clone device scheme no longer works.
+
+		With significant assistance from Casper Dik, added
+		support for Solaris 8 Beta and Beta refresh.  The
+		IPv6 support in Solaris 8 is still in some flux,
+		so there are temporary compensations for the
+		differences between Beta IPv6 support and Beta
+		refresh IPv6 support.  Casper and I hope those
+		differences disappear by FCS.
+
+		Improved the delivery of information on Solaris
+		2.5.1, 2.6, 7, and 8 door files.
+
+		Fixed a repeat mode bug that surfaces when /etc/passwd
+		changes between cycles.  The bug report and diagnostic
+		help were supplied by Igor Schein <igor@txc.com>.
+		The fix was offered as a patch to 4.45.
+
+		Added support for INRIA IPv6 to NetBSD.  Jean-Luc
+		Richier <Jean-Luc.Richier@imag.fr> provided patches
+		and a test system on which to verify them.
+
+		Added support for AIX 4.3.3.  Jeff W. Stewart
+		<jws@anaconda.cc.purdue.edu> provided a test system.
+
+		Made adjustments for FreeBSD 4.0-current.
+
+		Improved reporting of information for AIX sockets that
+		lack protocol control blocks.
+
+4.47		November 29, 1999
+		Based on a query from Jean-Pierre Radley <jpr@jpr.com>,
+		changed the lsof top-level Makefile to propagate
+		CFGF to the library Makefile.  (DEBUG was already
+		being propagated.)  Added osrgcc and scogcc Configure
+		abbreviations (to use gcc) for Jean-Pierre.
+
+		In response to a query from Igor Schein <igor@txc.com>,
+		improved the Configure script test for Solaris 7
+		and 8 that decides if the compiler can produce 64
+		bit executables.
+
+		Made an ugly hack, based on making a private rnode
+		structure definition from q4 output, to compensate
+		for HP-UX 10.20 and lower recent NFS3 patches.  HP
+		didn't supply an updated <nfs/rnode.h> with the
+		patches.  The problem was reported by Will Partain
+		<partain@mekb2.sps.mot.com>.  Elias Halldor Agustsson
+		<elias@hi.is> helped identify the patches as
+		PHNE_18173, PHNE_19426, PHNE_19937, and PHNE_20091,
+		and provided a test system.
+
+		Switched BSDI test system from 2.1 and 3.1 to 4.0.1,
+		courtesy of Terry Kennedy <terry@tmk.com>.
+
+		Added some more dev_t hacks for Alpha FreeBSD 4.0.
+
+		Added support for IPv6 on BSD 4.x.  The support hasn't
+		yet been tested, just compiled.
+
+		Added support for the mnt file system (mntfs or
+		/etc/mnttab) on Solaris 8.  Tested on Solaris 8
+		BETA-Refresh.
+
+		Made selection of optional fields (e.g., PPID with
+		-FR) in a field output specification select the
+		optional field, too, so that the option selector
+		for the field (e.g., -R) isn't also required.  This
+		change was made in response to an inquiry from John
+		DuBois <spcecdt@armory.com>.  This may require some
+		revision to scripts that parse all field output;
+		two scripts in the lsof distribution's scripts/
+		subdirectory had to be updated.
+
+		Corrected handling of Linux IPv4 addresses mapped
+		in IPv6 addresses.
+
+		Tested under OpenBSD 2.6.
+
+4.48		January 14, 2000
+		Modified -i argument processing of colon-separated
+		IPv6 addresses to recognize an IPv4 address mapped
+		in an IPv6 address and handle it as an IPv4 address.
+		This was offered as a patch to 4.47.
+
+		Added a defined symbol (NOWARNBLKDEV) to control
+		(inhibit) the issuance of a warning when no block
+		devices are found.  This was done anticipating its
+		need in FreeBSD 4.x, but that dialect version no
+		longer has any block devices, so HASBLKDEV was
+		disabled for it instead.  NOWARNBLKDEV was left in
+		place for possible use in the future.
+
+		Enabled KAME IPv6 Configure support for FreeBSD
+		when <netinet6/in6.h> is found.
+
+		Disabled use of gcc to compile lsof for 64 bit
+		HP-UX 11.
+
+		Updated Configure to recognized FreeBSD 3.4.
+
+		Based on suggestions from Bernt Christandl
+		<beb@MPA-Garching.MPG.DE> improved AFS configuration
+		for AIX and Solaris, and updated AIX AFS 3.5 support.
+		Johannes Tax <tax@bluedog.oit.unc.edu>, Hung T.
+		Pham <hung_pham@unc.edu>, and Curt Freeland
+		<curt@grumpy.cse.nd.edu> provided test systems.
+
+		Updated lsof's private rnode definition for AIX
+		4.3.3, since IBM still doesn't ship the
+		<oncplus/nfs/rnode.h> header file and the rnode
+		structure definition in <nfs/rnode.h> doesn't match
+		what the kernel uses.  This was offered as a patch
+		to 4.47.
+
+		Weakened the test in the Linux /proc-based lsof of
+		the field count of data lines in /proc/net/{tcp,udp}.
+		It appears that recent 2.3.x Linux kernels have
+		added untitled fields to these files.  The bug
+		report came from Gabor Liptak <gaborliptak@usa.net>.
+
+		Adjusted for a FreeBSD 4.0 change in the definition
+		of [_]KERNEL.  David O'Brien <obrien@NUXI.com> reported
+		the problem and provided a test system.
+
+		Removed the HASPPID bracket from Fppid (the -R
+		option state variable) so that the field select
+		table will compile even when HASPPID is not defined.
+		This problem was introduced at revision 4.47 with
+		code that causes some field output characters to
+		set option states.  The problem was reported by
+		David Bacon <bacon@birch.eecs.lehigh.edu>.
+
+4.49		April 3, 2000
+		Made clearer in man page that "Lxx" FDs are AIX
+		loader table references.  Also updated the 00FAQ
+		discussion of the Stale Segment ID bug to include
+		AIX 4.3.x.
+
+		Modified support for NetBSD 1.4Q to include the
+		<sys/buf.h> header file to cope with an MFS change.
+
+		Added support for OpenBSD UVM virtual memory.
+
+		Added support for AIX systems with > 2GB of memory.
+		Chris Sylvain <csylvain@itg.ummc.umaryland.edu>
+		reported the problem and provided the solution.
+		Chris also supplied some minor code cleanup.  This
+		was offered as a patch to 4.48.
+
+		Based on new information from Igor Schein <igor@txc.com>
+		made additional compensation in Configure script
+		for 64 bit Solaris 7 and 8 gcc.
+
+		Added some 00FAQ info on the effect ordering of
+		the +fg and -FG options has on output format.
+
+		Improved NetBSD IPv6 configuration, based on a
+		suggestion from Thomas Klausner
+		<wiz@danbala.ifoer.tuwien.ac.at>.  Added code to
+		convert IPv4-mapped-in-IPv6 addresses to IPv4
+		addresses.
+
+		Updated the information in 00FAQ and the HP-UX 11
+		binary directory README files on the HP-UX 11 ipis_s
+		patch with new information supplied by Eric McWhorter
+		<emcwhorter@xsis.xerox.com>.
+
+		Added documentation on changes to HASFSTYPE and
+		HASNCACHE, and the new HASPRIVPRIPP.
+
+		Adjusted Configure for FreeBSD 5.0.  Made additional,
+		necessary changes to Configure and the BSDI sources
+		to eliminate load errors.
+
+		Added KAME IPv6 support to FreeBSD at the request
+		of Ollivier Robert <roberto@eurocontrol.fr>, who
+		provided a test system.
+
+		Corrected the script that generates the CHECKSUMS
+		files for binaries to correctly name the detached
+		PGP certificate.  The documentation bug was reported
+		by Michael Hennecke <hennecke@rz.uni-karlsruhe.de>.
+
+4.50		June 29, 2000
+		Added a NetBSD alpha test host, courtesy of Ray
+		Phillips <r.phillips@mailbox.uq.edu.au>.  An lsof
+		4.49 binary, built on Ray's 1.4.1 system was made
+		available prior to the 3.50 release.
+
+		Upgraded the system map file tests in /dev/kmem-based
+		Linux lsof, making the use of DEBIAN_LINUX_LSOF
+		unnecessary.  Tested the changes on a system made
+		available by Vincent Kujala <kujala@geog.ubc.ca>
+		and Jim Mintha <jim@ic.uva.nl>.
+
+		Forced AIX to use the large-file-enabled versions
+		of lstat (lstat64) and stat (stat64) if <sys/stat.h>
+		contains stat64.  This should allow lsof to stat()
+		AIX files > 2GB even when the builder has not
+		defined the "large file enabled programming
+		environment."  Configure tests <sys/stat.h> and
+		puts -DHASSTAT64 in the Makefile's CFLAGS to make
+		this happen.  Fernando A.B. Whitaker
+		<whitaker@cenapad.unicamp.br> reported the problem.
+		This was offered as a patch to 4.48.
+
+		Enabled Configure script to handle OpenBSD 2.7.
+		Angelos D. Keromytis <angelos@dsl.cis.upenn.edu>
+		reported the availability of OpenBSD 2.7 and supplied
+		the Configure script patch.
+
+		Improved handling of DOOR and fattach()'d files in
+		Solaris.
+
+		Changed message about missing kernel symbol file
+		from "not yet determined" to "none found".
+
+		Updated FreeBSD, NetBSD, NEXTSTEP, OpenBSD, and
+		OPENSTEP support to report "no PCB" and the values
+		of the SO_CANTSENDMORE and SO_CANTRCVMORE state
+		flags when a socket structure has no inpcb pointer.
+		This modification was made to AIX lsof at revision
+		4.46.  Added an entry to 00FAQ about sockets that
+		have no inpcb pointer.
+
+		Upgraded support for FreeBSD 5.0-CURRENT.  Ben
+		Smithurst <ben@scientia.demon.co.uk> supplied
+		patches and did testing.  David O'Brien <obrien@NUXI.com>
+		supplied a test system.  The update included dropping
+		the Fctty part of file descriptor file system
+		support, conditional on a Configure script test.
+		I propagated those changes to BSDI, NetBSD, and
+		OpenBSD in anticipation of their having the
+		modification in the future.  David also arranged
+		with Michael Haro <mharo@area51.fremont.ca.us> for
+		a FreeBSD 3.4 test system.
+
+		In response to an lsof 3.72 bug report from Jim Mewes
+		<jim@corp.phone.com>, added more kernel address
+		filtering to the lsof function, kread(), that reads
+		Solaris kernel data.
+
+		In response to a report from Marc Duponcheel
+		<marc@offline.be>, added tests to the /proc-based
+		Linux lsof to ignore file systems of types "autofs"
+		and "pipfs".
+
+		Based on a report and information supplied by Casper
+		Dik <casper@holland.Sun.COM>, updated the ncache_load()
+		function in lib/rnch.c with new code that deals
+		with a post Solaris 8 change in kernel name cache
+		(DNLC) handling.  Casper tested the update, which
+		should be invisible to Solaris versions without
+		the new DNLC code.
+
+		Added support for Solaris VxFS QIO files, based on
+		a report from Kieran Broadfoot <kieran.broadfoot@gs.com>.
+		Kieran help test the support.
+
+		Added support for PTX 4.4.6 and 4.5[.1] with help
+		from the usual cast of good people at Sequent.
+
+		Added support for 64 bit file sizes and offsets on
+		BSDI, FreeBSD, NetBSD, and OpenBSD, based on a
+		report from Dan Nelson <dnelson@emsphone.com>.
+		Dan supplied a patch and did FreeBSD testing.
+
+		Added Configure script recognition of NetBSD 1.5,
+		based on a report from Andrew Brown <atatat@atatdot.net>.
+		Thomas Klausner <wiz@danbala.ifoer.tuwien.ac.at> updated
+		the NetBSD port package to use a pre-release of this
+		addition.
+
+		At the last minute saw a notice via deja.com's
+		UseNet search service that FreeBSD 3.5 had been
+		released and lsof didn't grok it.  Added recognition
+		of 3.5 to lsof's Configure script, but didn't have
+		the opportunity to test lsof on 3.5.
+
+4.51		August 21, 2000
+		Added Configure script support for the upcoming
+		Solaris 9 release based on suggestions from Casper
+		Dik <Casper.Dik@holland.sun.com>.
+
+		Changed sample Perl scripts to assume that
+		/usr/local/bin/perl is Perl 5 and Perl 4 may be
+		found in /usr/local/bin/perl4.
+
+		Updated Configure to recognize FreeBSD 4.1 and made
+		a FreeBSD pre-release distribution available.
+
+		Bela Lubkin <belal@sco.COM> tested lsof on the
+		upcoming SCO OSR 5.0.6 release and reports that
+		lsof appears to work properly.
+
+		Updated the AIX compiler test in Configure to
+		recognize its version 5.
+
+		Updated AIX 4.3.3 support with automatic recognition
+		of the proper rnode structure, based on machine
+		bit width.  Also added code to detect when processing
+		the -X option that lsof has been compiled with the
+		"other" AIX 4.3.3 user structure and to apply
+		compensations.  When a compensation method works,
+		it's applied during subsequent -X processing; when
+		none works, further -X processing is disabled.
+
+		Added Tru64 UNIX 5.1 support.  Updated Tru64 UNIX
+		library text file support to recognize new kernel
+		support for AdvFS library files.  Berkley Shands
+		<berkley@cs.wustl.edu> and Klaus Saggerer USG
+		[saggerer@zk3.dec.com> helped put me in contact
+		with Chang Song <song@zk3.dec.com>, the developer
+		of 5.1's new kernel name cache and he helped me
+		develop new code in lsof to access it.
+
+		Corrected reporting of PTX fattach()'d address.
+
+		Changed Configure and dlsof.h for NetBSD and OpenBSD
+		to use /usr/include/uvm header files when available.
+		Andrew Brown <atatat@atatdot.net>, Thomas Klausner
+		<wiz@danbala.ifoer.tuwien.ac.at>, and Wolfgang
+		Rupprecht <wolfgang@wsrcc.com> pointed out the need
+		to do this for NetBSD.  Andrew provided access to
+		a NetBSD 1.5 system for verifying the changes.
+
+		Installed snprintf() support, including a private
+		version in the lsof library for those UNIX dialects
+		without the function.  Changed all sources to use
+		it instead of sprintf() and strcpy().
+
+		Fixed a memory leak in the readvfs() functions of
+		BSDI, DEC/OSF1, Digital UNIX, FreeBSD, NetBSD,
+		OpenBSD, and Tru64 UNIX.
+
+		Tested on Linux 2.4.
+
+		Modified the Pyramid MkKernOpts script to compensate
+		for `uname -s` configuration alternatives.  Robert
+		Dahlem <Robert.Dahlem@ffm2.siemens.de> supplied
+		the modification.
+
+		Obtained access to an FCS Solaris 8 64 bit system
+		and built lsof on it, using Sun Workshop C 5.0 and
+		gcc 2.96 20000814 (experimental).  Both compilers
+		produce a working lsof.
+
+
+4.52		November 8, 2000
+		Completed work on an HP-UX 11.11 port that uses a
+		pstat(2) interface provided by HP.  To distinguish
+		it from its predecessors for HP-UX, this lsof
+		version is called PSTAT-based and the predecessor
+		versions are now called /dev/kmem-based.  I am
+		indebted to the far-sightedness and support of
+		these good people at HP for making PSTAT-based lsof
+		possible: Carl Davidson, Louis Huemiller, Rich
+		Rauenzahn, and Sailu Yallapragada.  The PSTAT-based
+		sources are in lsof_4.52/dialects/hpux/pstat, the
+		/dev/kmem-based ones in lsof_4.52/dialects/hpux/kmem.
+
+		Ported to IBM Monterey for Merced|Itanium, aka AIX
+		5L.  It configures via the Configure script's "aix"
+		abbreviation and has been tested on AIX 5L Beta 3.
+		Jay Beck, Steve Dibbell, Loc Le, Nasser Momtaheni,
+		and Malcom Zung of IBM provided generous support.
+		Since AIX 5L is still in Beta testing, this port
+		can't be considered complete.
+
+		Added Configure support for OpenBSD 2.8.  David
+		Mazieres <dm@cs.nyu.edu> provided a test system.
+
+		Based on a report from Marc Christensen
+		<marc@mecworks.com> added sockfs to the mount scan
+		exemption list for /proc-based Linux lsof.
+
+		Added large file, CDFS, and DOSFS for UnixWare 7.x.
+		Added UnixWare device memory mapping support.  All
+		UnixWare changes were supplied by Eric Dumazet
+		<edumazet@cosmosbay.com>  Eric also supplied some
+		miscellaneous bug fixes.
+
+		Deferred name cache loading until printname() needs
+		to use the name cache.
+
+		Terminated Pyramid, SunOS 4.1.x, and Ultrix support,
+		because test systems are no longer available.
+		Final Pyramid and Ultrix source code distributions
+		for lsof revision 4.51 may be found on lsof.itap.purdue.edu
+		in pub/tools/unix/lsof/OLD/src.  The no longer
+		supported SunOS 4.1.x source code is still distributed
+		with the Solaris source code.
+
+		Added code to set Solaris node address to real vnode
+		address, when applicable.
+
+		John Speno <speno@lopan.isc-net.upenn.edu> provided
+		information that enabled me to update the Tru64
+		AdvFS (MSFS) node definition for AdvFS version 5.
+
+		Added Tru64 5.x CFS support with help from Kris
+		Chandrasekhar <Kris.Chandrasekhar@compaq.com>,
+		Diane Lebel <lebel@zk3.dec.com>, and John Speno.
+		The support only provides information about cached
+		file attributes.
+
+		Installed a Configure patch for HP-UX 11 supplied by
+		Kenneth Stailey <kstailey@disclosure.com> that adds
+		another command to q4 input.
+
+		Tested on FreeBSD 4.2.
+
+		Will Day <willday@rom.oit.gatech.edu> and Frank
+		Winkler <frank.winkler@germany.sun.com> graciously
+		supplied Solaris 8 binaries.
+
+		Added Solaris 9 text file support, supplied by
+		Casper Dik <Casper.Dik@holland.sun.com>.
+
+4.53		December 6, 2000
+		Added the AIX 5L j2_lock.h to the distribution with
+		a Configure script step to use it when it's missing
+		from /usr/include/j2.
+
+		Removed SunOS 4.1.x support.
+
+		Removed Linux 2.0.x /dev/kmem support.
+
+		Fixed VBLK and VCHR special device file reporting
+		to handle /dev information more accurately.
+
+		Added a Apple Darwin / Mac OS X 1.2 port, provided
+		by Allan Nathanson <ajn@apple.com>.  Allan also
+		arranged for a test system so I can maintain this
+		port.  An additional test system was provided by
+		Dale Talcott.
+
+		Dropped claims of support for all UnixWare versions
+		except 7.1.0, since that is the only version on
+		which I can test lsof.  Even though lsof 4.53 is
+		deprecated for UnixWare 2.1.3, installed a patch
+		for it with testing done by A. Channing Clark
+		<clark.channing@heb.com>.
+
+		Dropped claims of support for all SCO OpenServer
+		versions except 5.0.5, since that is the only
+		version on which I can test lsof.
+
+4.54		January 19, 2001
+		Added compensation for a change that made the
+		FreeBSD mount structure invisible.  I can only test
+		back to 3.2 and the compensation works there, so
+		it's been #ifdef'd for 3.2 and above.  David O'Brien
+		<obrien@FreeBSD.org> provided the necessary clue.
+
+		Based on a report from Valdis Kletnieks
+		<Valdis.Kletnieks@vt.edu>, changed all IPv6 support
+		to report a TYPE of IPv6 for sockets with IPv4
+		addresses mapped in IPv6 addresses.  The previous
+		lsof behavior was to report their TYPE as IPv4.
+
+		Restored the Linux GlibC test to Configure, removed
+		at revision 4.53, based on a report from John Dzubera
+		<zube@cs.colostate.edu>, that RedHat Linux 6.0 still
+		needs the test.
+
+		Made setting of link count for Solaris more selective.
+
+		Limited Readlink() recursion to MAXSYMLINKS.  The bug
+		was reported by Jan Dvorak <johnydog@go.cz>.
+
+		Dropped the *claim* that lsof runs on Solaris 2.5.1.
+		It may well do so, but I no longer have access to a
+		test system.
+
+		Fixed an #endif comment typo, reported by Igor Schein.
+
+		Fixed a typo in a cast for a Tru64 UNIX 5.1 function
+		and updated Configure for Tru64 UNIX 5.0 and 5.1 with
+		information from Jesse Perry <jesse.perry@compaq.com>.
+
+		Corrected non-fatal typos in the AdvFS support in
+		dnode.c for Tru64 UNIX.
+
+		Added msdos file system support for NetBSD and OpenBSD.
+		Andrew Brown <atatat@atatdot.net> requested and helped
+		test it.
+
+4.55		February 15, 2001
+		Based on a report from Bernd Eckenfels <ecki@lina.inka.de>
+		added support in lsof for files in /proc/<PID>/maps
+		that have been deleted.
+
+		Changed PGRP output title to PGID, conforming to
+		the most common current abbreviation for Process
+		Group ID (PGID).  While some systems continue to
+		use *pgrp for internal kernel variable names, most
+		systems that support the display of PGID via ps(1)
+		now title it PGID.  The lsof -g and -Fg options
+		operations are unchanged in function; only titles
+		and descriptions have changed.  Also changed internal
+		variable names from *PGRP and *pgrp to *PGID and
+		*pgid where possible.
+
+		Dropped the *claim* that lsof runs on HP-UX 9.x.
+		It may well do so, but I no longer have access to
+		a test system.
+
+		In response to a suggestion from Jeff Howie
+		<jeff.howie@federated.ca> added support for command
+		name selection by regular expression.  A new form
+		of the -c option value is use to identify and
+		specify a regular expression.
+
+		Restore the *claim* that lsof works on UnixWare
+		7.0, since I re-acquired a test system.
+
+4.56		May 3, 2001
+		Corrected some problems Amir Katz <Amir_Katz@bmc.com>
+		found with Insure++, one in lib/dvch.c, the rest
+		in Solaris sources.  Amir's report also helped me
+		find an error in an snpf() call that caused (the
+		unsupported) Solaris 2.5.1 lsof to crash.  Wally
+		Winzer, Jr. <wally.winzer@ChampUSA.COM> helped test.
+
+		Added support for UnixWare 7.1.1 and above in-kernel
+		UNIX sockets.  John Hughes <john@Calva.COM> kindly
+		provided code and access to a test system.  John
+		also provided a test system and advice for adding
+		UnixWare 7.1.1 NonStop Cluster and CFS support.
+		More help with that effort came from Kurt Gollhardt
+		(SCO), Barbara Howe (SCO), Bela Lubkin (SCO), and
+		Dewan Rashid <Dewan.Rashid@ir.com>.
+
+		Archived a set of compilation hints (patches) from
+		Bill Melvin <Bill.Melvin@esc.edu> that make it
+		possible to compile the old, unsupported lsof 3.08
+		sources on UnixWare 1.x without NFS or CDFS support.
+
+		Installed support supplied by Allan Nathanson
+		<ajn@apple.com> for the Darwin "Gold Master" release,
+		Mac OS X 10.0 (aka Darwin 1.3 in its public source
+		version).  Added Allan's CVS repository suggestions
+		to the script that gets additional header files
+		from an open source repository.
+
+		Tested an HP-UX 11.11 kernel patch from Sailu
+		Yallapragada that enables reporting of TCP/IP
+		information for telnetd processes that use the
+		telnet multiplexor.  I don't yet know the kernel
+		patch ID.
+
+		Made the Solaris inclusion of <inet/mi.h> conditional
+		on the Solaris version.  (It's apparently not needed
+		at 2.6 and above.)  Bill Watson <bill.watson@uk.sun.com>
+		brought this to my attention.
+
+		Added alternate Linux 2.4.x lock extent test, supplied
+		by Jim Mintha <jim@ic.uva.nl>.
+
+		Rearranged the lines and pre-processor tests in
+		regex.h, lib/regex.c, and lib/snpf.c so that unifdef
+		can be used to eliminate copyright and GPL statements
+		when the files aren't being used for a particular
+		dialect.  (USE_LIB_* definitions in a dialect's
+		machine.h header file determine if one or more of
+		those three files are to be used.)
+
+		Added preliminary support for Solaris 8 with VxFS
+		3.4.  This support will be refined as I get
+		information from Veritas about how they will
+		distribute the kernel header files lsof needs.
+		Those header files were omitted from the standard
+		VxFS 3.4 distribution.  Technical assistance and
+		testing were provided by Calle Dybedahl <cdy@algonet.se>,
+		Gary Millen <gary.millen@veritas.com>, Rainer Orth
+		<ro@TechFak.Uni-Bielefeld.DE>, Peter C. Vernam
+		<pvernam@draper.com>, and Donna Yobs
+		<Donna.Yobs@veritas.com>
+
+		Tested on FreeBSD 4.3-STABLE.
+
+		Dropped the *claim* that lsof works on UNIX dialects
+		where I no longer have test systems: BSDI 2.1,
+		3.[01] and 4.0; DEC OSF/1, Digital UNIX and True
+		64 UNIX 2.0 and 3.2; FreeBSD 2.1.[67], 2.2[.x],
+		3.[012345] and 4.[01]; HP-UX 10.20; NetBSD 1.[234];
+		SCO OpenServer 5.0.5; and SCO UnixWare 7.0
+
+		Tested on Solaris 9 BETA, s81_36.
+
+4.57		July 19, 2001
+		Help (-h) and version (-v) output now have URLs
+		for the newly created and timeliest lsof FAQ
+		(00FAQ in the lsof distribution) at:
+
+		  ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
+
+		and the man page for the current lsof distribution
+		at:
+
+		  ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
+
+		Based on a report from Steve Laubscher
+		<slaubs@woodward.com>, modified dlsof.h for PTX
+		4.6[.1] to avoid a temporary dnlc_t definition
+		needed at PTX 4.5.1.
+
+		Corrected test for old Linux kernels in Configure.
+		Henri Karrenbeld <ishtar@cal044202.student.utwente.nl>
+		brought the error to my attention.  Limited Linux
+		claims to 2.1.72 and above in the documentation.
+
+		Improved HP-UX 11 Configure stanza and stream socket
+		handling.
+
+		Constructed a work-around for the HP-UX 11 optional
+		OnlineJFS package.  The work-around sadly requires
+		lsof to have a private version of the vx_inode
+		structure, since the OnlineJFS package doesn't
+		update <sys/fs/vx_inode.h>.  Troyan Krastev
+		<Troyan.Krastev@ricoh-usa.com> brought the bug to
+		my attention and Michael Bracewell
+		<michael@ra.TSS.PeachNet.EDU> provided a test system
+		where I developed the work-around.
+
+		Added locale support to lsof's isprint() test,
+		based on a suggestion from Dan Mercer <damercer@mmm.com>.
+		Lsof will use setlocale(), when that function and
+		its supporting <locale.h> header file are available.
+
+		Added OpenBSD 2.9 support.
+
+		Based on a report from Aaron Rhodes <arhodes@psionic.com>
+		and with testing help from Aaron, made the lsof
+		4.56 revision compile and work on OpenBSD 2.6.
+		While that OpenBSD version is no longer supported,
+		Aaron's report exposed a Configure script bug
+		affecting OpenBSD versions lsof does support.
+
+		Updated for FreeBSD 5.0-CURRENT.  Szilveszter Adam
+		<sziszi@petra.hos.u-szeged.hu> help test.  The lsof
+		FreeBSD ports packager, David O'Brien <obrien@FreeBSD.org>,
+		assisted.
+
+		Tested on AIX 5.1.  Loc Le and Nasser Momtaheni of
+		IBM provided test systems.
+
+4.58		September 13, 2001
+		Added options to safestrprt() and safestrprtn() to
+		surround the string with '"' and to suppress the
+		printing of an ending '\n'.  Use of these functions
+		in device cache file error message reporting answers
+		a suggestion for better error reporting from John
+		Jackson <jrj@purdue.edu>.
+
+		Fixed a Solaris 2.6 and above problem related to
+		searching for "large" (O_LARGEFILE) files by name;
+		lsof was using the wrong version of [l]stat(2).
+		The bug was reported by Daniel Trinkle
+		<trinkle@cs.purdue.edu>.
+
+		Added AIX 4.1.4 and above XTI socket support.
+
+		Added OSR Xenix Shared Data and Semaphore file type
+		support with modifications supplied by Bela Lubkin.
+
+		Updated OPENSTEP support with modifications from Carl
+		E. Lindberg <lindberg@clindberg.org>.  The changes
+		enable the correct reporting of executable and
+		library open files ("txt" type).
+
+		Limited claims of OpenServer support to the versions
+		where I currently test, 5.0.4 and 5.0.6.  (Lsof
+		probably works on 5.0.5.)
+
+		Enabled processing of -C option for PSTAT-based HP-UX
+		lsof.
+
+		Enabled and tested on FreeBSD 4.4.
+
+		Corrected a file system test example in 00QUICKSTART,
+		based on a report from Jun Biao WANG <wangjunb@cn.ibm.com>.
+
+		Made available for re-distribution a user-contributed
+		port of lsof 4.51 to Reliant UNIX 5.45.  Thomas
+		Mauterer <Thomas.Mauterer@philosys.de> contributed
+		the port.
+
+4.59		October 20, 2001
+		With the closing of the Sequent Synergy Links Lab
+		by IBM, terminated lsof support for PTX.  The last
+		tested PTX lsof revision, 4.58, is available on
+		lsof.itap.purdue.edu in .../lsof/OLD/src.
+
+		Adjusted for FreeBSD 5.0-CURRENT NFS header file
+		changes, based on a report from Jos Backus
+		<josb@cncdsl.com>.
+
+		Corrected a bug in the way Linux lsof identifies
+		the owner of a process.  Lionel Cons <lionel.cons@cern.ch>
+		reported the problem and tested the fix.  Added
+		code to avoid stat(2) calls on regular Linux files
+		whenever possible.  Lionel reported the need to do
+		this (AFS files) and tested the new code.
+
+		Added new output field for raw device number in
+		hex.  The field is identified with 'r'.  This field
+		is NOT selected when -F or -F0 is specified so that
+		its appearance won't disturb existing scripts that
+		process field output.
+
+		Added support for OpenUNIX 8.  A test system was
+		provided by Larry Rosenman <ler@lerctr.org>.
+		Matthew Thurmaier <matt@compclass.com> and many
+		people from Caldera provided technical assistance.
+
+		Added an additional UVM test to the NetBSD Configure
+		stanza.  Andrew Brown <atatat@atatdot.net> supplied
+		the test; it recognizes NetBSD 1.5Y UVM changes to
+		the vnode structure recently committed by Chuck
+		Silvers.
+
+		Applied Configure and get-xnu-headers.sh script
+		changes suppled by Allan Nathanson <ajn@apple.com>
+		for Darwin 1.4.
+
+		Added for Bela Lubkin <belal@mammoth.ca.caldera.com>
+		OSR-specific environment variables to supply values
+		to the Configure script.  The variables are described
+		in 00XCONFIG.
+
+		Added an IP version selector to the -i option
+		parameters.
+
+4.60		November 9, 2001
+		Added special handling to and corrected bugs in
+		the matching of IPv4 in IPv6 addresses to -i6:<...>
+		selectors.
+
+		Made 00FAQ corrections and updates, based on
+		discussions with Igor Schein <igor@txc.com>.
+
+		Modified Configure script to detect a 64 bit capable
+		gcc compiler and permit it to be used to build 64
+		bit (PA-RISC 2) lsof for HP-UX 11.00.  Tested with
+		HP's gcc package, which Rich Rauenzahn of HP kindly
+		installed on a test system at HP.  Stefan Marquardt
+		<stefan.marquardt@hagebau.de> helped test.
+
+		Made lsof's method of killing its child process
+		more robust, based on a suggestion from Bela Lubkin
+		<belal@caldera.com>.
+
+		Modified all dialect Makefile segments to accept
+		select -v #define's from the environment -- a
+		builder's comment, host, logname, system information
+		and user name.  This was done for Bela Lubkin, so
+		he can "tune" the -v output when he packages lsof
+		in the upcoming Caldera OSR 5.0.7 release.
+
+		Changed Perl scripts in scripts/ to put the lsof
+		path consistently in $LSOF.  Also added a fix from
+		Bela Lubkin to scripts/big_brother.perl5 that allows
+		it to tolerate SCO OSR "ago" clauses in open UDP
+		file information.  Strengthened emphasis in
+		scripts/00README that the scripts are examples that
+		shouldn't be expected to run on all UNIX dialects
+		without modification.
+
+		At Bela Lubkin's suggestion changed the device
+		cache file format examples in 00DCACHE and 00FAQ
+		to avoid "%U%".  That's an SCCS escape sequence.
+
+		Added support for OpenBSD 3.0.
+
+		Added +DAportable to CFLAGS for 32 bit HP-UX 11.
+		Amir Katz <Amir_Katz@bmc.com> suggested the addition.
+
+4.61		January 22, 2002
+		Updated field output example Perl scripts in the
+		scripts/ subdirectory to discover the lsof path,
+		starting at .. and proceeding through the PATH
+		environment variable's directories.
+
+		Added minor OSR Configure script fixes, provided
+		by Bela Lubkin <belal@caldera.com>.
+
+		In response to a report from Joshua Wright
+		<Joshua.Wright@jwu.edu> modified NetBSD and OpenBSD
+		Configure stanzas and sources so that lsof can be
+		built when there is no system source tree (e.g.,
+		/usr/src/sys).
+
+		In response to a report from Peter Valchev
+		<pvalchev@openbsd.org> improved the UVM test in
+		the OpenBSD Configure stanza.
+
+		Updated Configure script to recognize FreeBSD 4.5.
+		Updated for FreeBSD 5.0 procfs and pseudofs changes.
+
+		Updated HP-UX stanza to see if the compiler named
+		in the LSOF_CC environment variable is the bundled
+		compiler.  If it is, "-O" is omitted from the
+		compiler flags.
+
+		Updated Digital UNIX 4.x and Tru64 UNIX error message
+		related to kernel name list failures.  Added an FAQ
+		section about how a kloadsrv daemon failure can cause
+		knlist(3) to fail.  The condition was reported by
+		Douglas B. Jones <douglas@gpc.peachnet.edu>
+
+		Based on a report from Mark W. Eichin <eichin@thok.org>
+		made Linux lsof capable of handling and reporting
+		file sizes greater than 32 bits.
+
+		Tested on Solaris 9 BETA-Refresh.
+
+		Corrected a bug in the matching of IPv4 addresses,
+		mapped in IPv6 addresses, to an IPv4 parameter to
+		an -i option.
+
+		Ported to 64 bit Power AIX 5.1 kernel with advice
+		from David Clissold <cliss@austin.ibm.com> and Marc
+		Stephenson <marc@austin.ibm.com>, and on a test
+		system provided by Loc Le <lple@us.ibm.com>.
+
+4.62		March 7, 2002
+		Updated 00README to reflect the usefulness of gcc
+		for building AIX lsof.  Documented a report from
+		Brian L. Gentry <BGentry@nationsrent.com> of success
+		on AIX 4.3.3.  I documented my success on 32 bit
+		Power AIX 5.1 and my lack of success on ia64 AIX
+		5.1 and 64 bit Power AIX 5.1.
+
+		Improved UnixWare >=7.1.1 reporting of UNIX socket
+		NAME field information for NonStop Cluster systems
+		with a patch provided by John Hughes <john@Calva.COM>.
+		Offered John's improvement as a patch to lsof 4.61.
+
+		Corrected bugs in handling of open files on block
+		devices by OSR lsof.  The bugs were reported by
+		Bela Lubkin <filbo@deepthought.armory.com>.
+
+		Fixed bug in writing >32 bit device numbers for
+		block devices to the device cache file.
+
+		Added support for reporting block special nodes
+		not in /dev (or /devices).  That required "like
+		device special" be changed to "like block special"
+		and "like character special".  (00FAQ was updated.)
+
+		Based on a report from Peter Valchev <pvalchev@openbsd.org>
+		improved the definition of the source for NetBSD
+		and OpenBSD kernel symbols (the nlist() source
+		file).  NetBSD now defaults to getbootfile(3) if
+		it is available, /netbsd otherwise.  OpenBSD now
+		defaults to /dev/ksyms if it is available, /bsd
+		otherwise.
+
+		Made possible compilation under BSD/OS (BSDI) 5.0
+		with changes to Configure, dialects/bsdi/dlsof,
+		dialects/bsdi/dproc.c and lib/rnmh.c.  The changes
+		were suggested by Steven Hinkle <hinkle@bsdi.com>.
+		Note that these changes do not substantiate a claim
+		that lsof works on BSDI 5.0, because I haven't
+		tested it there.
+
+		Updated OpenUNIX private <sys/fs/memfs_mnode.h>,
+		based on a report from Larry Rosenman <ler@lerctr.org>
+		that it had been updated by Caldera patch OU800PK3.
+		Unfortunately the patch only corrects some of the
+		problems with the header file, so it is still
+		necessary to distribute a private patched version
+		of it with the lsof sources.
+
+		Applied a man page correction reported by Frederic
+		Delanoy <max_ok@yahoo.com>.
+
+		Corrected cast bugs related to using the HP-UX
+		bundled C compiler on HP-UX 11.11.
+
+4.63		April 23, 2002
+		Added HPUX_BOOTFILE environment variable for use
+		by the Configure script in determining HP-UX kernel
+		configuration information -- e.g., the state of
+		the ipis_s structure in the HP-UX 11 kernel.  The
+		change was suggested by Marc Bejarano <beej@alum.mit.edu>.
+		Marc also suggested some changes to the HP-UX
+		section in 00FAQ that discusses Configure's use of
+		q4 for HP-UX 11.
+
+		Fixed a bug in the Solaris lsof file system matching
+		code.  It was not reporting that VCHR files in
+		/devices were in / when /devices was in /, too.
+
+		Corrected bugs in device number, file size, file
+		offset, and raw device number field output generation.
+
+		Added recognition of OpenBSD 3.1 to the Configure
+		script with a suggestion from Peter Valchev
+		<pvalchev@sightly.net>.  Note that this change does
+		not constitute a claim that lsof works on OpenBSD
+		3.1, because I haven't tested it there.
+
+		Built an automated test suite.  (See 00TEST and
+		the tests/ sub-directory of the lsof main directory).
+		Bela Lubkin requested it.  Dale Talcott, John
+		Hughes, and Larry Rosenman helped me validate it
+		on their systems.
+
+		During the development of the test suite I discovered
+		the following lsof bugs or missing features, and
+		corrected or supplied them.
+
+		* Corrected the reporting of locks for:
+		  o Digital UNIX 4.0d and Tru64 Unix 5.[01];
+		  o HP-UX 10.30 and 11.00;
+		  o OpenUNIX 8;
+		  o UnixWare 7.1.1.
+
+		* Enabled HP-UX 10.30 and 11.00 to report open NFS
+		  file link counts.
+
+		* Corrected the reporting of UNIX domain socket
+		  names for Apple Darwin, FreeBSD 4.5 and above,
+		  NetBSD 1.4.1 and above, and for OpenBSD 3.0 and
+		  above.
+
+		* Enabled HP-UX 11.11 to stat(2) large files.
+
+		* Fixed handling of combination 32 and 64 bit
+		  device numbers in AIX 64 bit architectures.
+
+		Updated the AIX 4.3.3 NFS rnode recognition code,
+		first installed at revision 4.51.  It looks like
+		some IBM update has restored a single rnode structure
+		independent of the machine bit width.
+
+		Updated the NetBSD and OpenBSD sources so NetBSD
+		can process DTYPE_PIPE files, as OpenBSD was already
+		able to do.
+
+		Updated Darwin get-xnu-headers.sh script to reflect
+		information about a recent reorganization of the
+		Darwin CVS hierarchy, supplied by Allan Nathanson
+		<ajn@apple.com>.
+
+		Added defense against the standard I/O descriptor
+		attack.
+
+4.64		June 26, 2002
+		Corrected some FreeBSD pre-processor directives.
+		David O'Brien <obrien@NUXI.com> pointed them out.
+
+		Updated lsof's main() function to: 1) close all
+		open file descriptors above 2 before starting; and
+		2) to set a non-interfering umask.  Moved GET_MAX_FD
+		test from misc.c to proto.h, so that main() could
+		use it.  Added multiple-include protection to
+		proto.h.
+
+		Moved FAQ's test suite Q's & A's to a more appropriate
+		section.  Added a Q&A on HASSECURITY option and
+		its affect on searching for open files.  (That was
+		already in the man page.)
+
+		Updated hpux/kmem/dnode.c for HP-UX < 11 compilation
+		with information from John Dzubera <Zube@CS.ColoState.EDU>.
+		While lsof doesn't support HP-UX < 11 any more, I
+		try to avoid disabling it there when possible, and
+		a locking fix for HP-UX >= 11 in lsof 4.63
+		inadvertently disabled compilation of lsof for
+		HP-UX < 11.  Fixed long-standing bug in HP-UX 10.20
+		lock reporting.
+
+		Removed language from the test suite programs that
+		requires an ANSI-C compiler.  This allowed the test
+		suite to be validated with cc and gcc on the un-
+		supported HP-UX 10.20.
+
+		At the suggestion of Manuel Bouyer <bouyer@antioche.eu.org>
+		switched NetBSD and OpenBSD lsof from using nlist()
+		to using kvm_nlist().  Made the same change for
+		BSDI, Darwin, and FreeBSD.
+
+		Validated test suite on OPENSTEP 4.2.
+
+		In response to a suggestion from Jeff Stoner
+		<jstoner@blackboard.com> enhanced support for the
+		FD list of the -d option to allow it to be either
+		an exclusion or inclusion list, using the '^' prefix
+		to denote exclusions.
+
+		Made adjustments for FreeBSD 4.6 and 5.0-CURRENT.
+		Fixed a FreeBSD /etc/make.conf CFLAGS extraction
+		bug, reported by Kris Kennaway <kris@obsecurity.org>,
+		and new a bug in the fix, reported by Eric Cronin
+		<ecronin@eecs.umich.edu>
+
+		Added nullfs support for FreeBSD, NetBSD, and OpenBSD
+		at the request of Andrew Brown <atatat@atatdot.net>.
+
+		Modified all readmnt() functions to ignore mounted-on
+		directory names that don't begin with '/'.
+
+		Tested on NetBSD 1.6A and OpenBSD 3.1.
+
+		Upgraded to Solaris 9 FCS with two changes to the
+		BETA-Refresh support: 1) an adjustment to dnode.c
+		for a change in the so_so (sonode) structure; and
+		2) addition of Solaris 9 FCS specific DNLC code.
+		David Comay <David.Comay@Eng.Sun.COM> sent me the
+		dnode.c change and Casper Dik <Casper.Dik@sun.com>
+		helped with the new DNLC support code.
+
+		Applied OpenUNIX changes that permit lsof to compile
+		and run on the upcoming 8.0.1 release.  The changes
+		were supplied by Robert Lipe <robertl@caldera.com>.
+		Larry Rosenman <ler@lerctr.org> provided a test
+		system.
+
+		Added Solaris fd file system support.
+
+4.65		October 10, 2002
+		Adjusted for change in FreeBSD 5.0-CURRENT inode
+		structure, reported by David O'Brien <obrien@NUXI.com>.
+		Adjusted for changes in FreeBSD 5.0-CURRENT <sys/vnode.h>.
+		One change was reported by Anders Nordby
+		<anders@FreeBSD.org>.  Adjusted for FreeBSD 5.0-CURRENT
+		on sparc64 architecture.
+
+		Enhanced the error reporting of Solaris lsof when
+		it detects a kvm_open() failure, and added a 00FAQ
+		entry on the cause, based on a report from Peter
+		J. Bertoncini <pjb@anl.gov>.
+
+		Enabled compiling of lsof for NetBSD 1.5 with the
+		NULL file system, using a patch from Andrew Brown
+		<atatat@atatdot.net>.
+
+		Removed a hack in the LTbigf test program that was
+		once needed when it was compiled on Solaris 9 BETA-
+		Refresh with gcc.  The hack isn't needed on Solaris
+		9 FCS.  Janet Hempstead <jan@library.carleton.ca>
+		brought the need for this change to my attention.
+
+		Applied a patch, supplied by Andrew Brown
+		<atatat@atatdot.net>, that updates lsof for NetBSD
+		version 1.6F.  Corrected handling of the NetBSD
+		nullfs.
+
+		Updated to BSDI BSD/OS 4.3 on a test system kindly
+		provided by Terry Kennedy <terry@tmk.com>.
+
+		Updated to FreeBSD 4.7.
+
+		Updated to Apple Darwin 1.5, 5.x and 6.x with
+		patches supplied by Allan Nathanson <ajn@apple.com>.
+		The patches include IPv6 support.
+
+		Updated Configure to use the -bnolibpath loader
+		option when building lsof on a PowerPC, running
+		AIX 5 or greater.  Valdis Kletnieks
+		<Valdis.Kletnieks@vt.edu> informed me this was
+		needed.  Lsof for AIX 5.x was initially developed
+		on the IA64, where -bnolibpath can't be used and
+		I didn't think to restore it to PowerPC loads when
+		AIX 5.x became available for that architecture.
+
+		Updated to UnixWare 7.1.3 on a test system provided
+		by Larry Rosenman <ler@lerctr.org>.  Removed claims
+		that lsof works on OpenUNIX 8.0.1, because UnixWare
+		7.1.3 is the release name of OpenUNIX 8.0.1.
+
+		Based on a comment that his e-mail address was
+		wrong in the lsof distribution from Kenneth Stailey
+		<kstailey@disclosure.com>, removed all e-mail
+		addresses from lsof documentation files except this
+		one, 00DIST.  The addresses in 00DIST are used to
+		send revision release notices to those who contributed
+		to a revision, but the addresses in this file for
+		previous revisions and in other documentation files
+		sometimes grow stale and are never validated.
+
+4.66		December 22, 2002
+		Acquired Solaris 7 and 8 test systems, courtesy of
+		John Dzubera <Zube@CS.ColoState.EDU>.  Updated
+		00TEST and tests/TestDB accordingly.
+
+		Clarified FreeBSD 5.0 architecture claims at the
+		suggestion of David O'Brien <obrien@NUXI.com>.
+		Also implemented David's suggestion to change
+		Intel to x86.
+
+		Installed changes to DNLC handling in OSR lsof in
+		preparation for handling changes in the OSR 5.0.7
+		DNLC cache.  Information about the changes and
+		patches to handle them were supplied by Bela Lubkin
+		<filbo@deepthought.armory.com>.
+
+		Upgraded True 64 UNIX support to the 5.1B release
+		on a test system provided by Berkley Shands
+		<berkley@cse.wustl.edu>  Had to used relaxed ANSI
+		compilation because of an error in a system header
+		file and other lsof source usages.
+
+		Implemented the HASNOSOCKSECURITY compile-time
+		option.  When it and HASSECURITY are defined, lsof
+		will be built to list only the user's open files,
+		but will also list anyone else's open socket files,
+		provided the "-i" option selects their listing.
+		Updated the Customize script to ask about setting
+		HASNOSOCKSECURITY.  Left it undefined in all dialect
+		machine.h header files.  This change was requested
+		by Kenneth Stailey <kstailey@speakeasy.net> for
+		use with ntop.
+
+		Added support for OpenBSD 3.2 and its kernel trace
+		file.
+
+		Improved lsof help (-h) and version (-v) information
+		reporting.
+
+		Fixed a FreeBSD 4.7 and above off-by-two UNIX domain
+		socket path termination bug, reported by Ken Stailey
+		<kstailey@speakeasy.net>
+
+4.67		March 27, 2003
+		Began the transition of the lsof ftp server host
+		name from vic.cc.purdue.edu to lsof.itap.purdue.edu.
+		That reflects Purdue organizational changes.  This
+		first step makes the new name an alias to the old
+		one.   The old name, vic.cc.purdue.edu, will remain
+		usable for an extended period.
+
+		Corrected a revision number reference in section
+		17.17 of 00FAQ on the appearance of Solaris negative
+		DNLC caching handing.
+
+		Updated 00FAQ discussion of compilers for 64 bit
+		Solaris.
+
+		Validated test suite for 64 bit Solaris 8 and gcc.
+
+		At the request of Alek O. Komarnitsky <alek@komar.org>
+		added the "+c <width>" option to enable optional
+		changing of the COMMAND column output maximum width
+		from the default to <width>.  The default maximum
+		width remains CMDL, as defined in lsof.h.
+
+		Fixed three AIX kernel bit size detection bugs,
+		one in the AIX Configure script stanza, the second
+		and third in the AIX dproc.c get_kernel_access()
+		function.  The bugs were reported by Pierre-Yves
+		Fontaniere <pyf@cc.in2p3.fr>, who tested the fixes.
+
+		Added kernel event queue file support for FreeBSD,
+		NetBSD and OpenBSD.  Andrew Brown <atatat@atatdot.net>
+		supplied the code.
+
+		Updated to AIX 5.2 on a test system provided by
+		Dale Talcott <dtalcott@purdue.edu>.  Had to build
+		work-arounds for two missing AIX 5.2 header files,
+		<j2/j2_snapshot> and <proc/proc_public.h>.  Corrected
+		an off-by-one UNIX socket addressing bug.  Taught
+		AIX lsof to handle both jfs and jfs2 files at the
+		same time.  Adjusted for an IBM mistake in the
+		sizing of the fdsinfo structure in <procinfo.h>
+		Toshiya Nakamura <TOSHIYAN@jp.ibm.com> helped test,
+
+		Updated to FreeBSD 4.8.  Corrected another bug in
+		FreeBSD UNIX domain socket name handling.
+
+		Corrected gcc build problems on HP-UX 11i, reported
+		by Yuliy Minchev <yuliy@mobiltel.bg>.
+
+		Updated BSDI BSD/OS support to 4.3.1.
+
+		Augmented a lock ID test on NetBSD to check if the
+		ID is an LWP pointer.
+
+4.68		June 18, 2003
+		Enhanced Configure script's cleanup operations.
+
+		Added support for OpenBSD 3.3, based on a report
+		from Peter Valchev <pvalchev@sightly.net>.
+
+		Improved the description of the detached PGP
+		signature certificate file in the main lsof README
+		file, based on a suggestion from Diana Stockdale
+		<diana@mpl.ucsd.edu>.
+
+		Installed a work-around for FreeBSD 5.0-CURRENT on
+		Alpha to avoid a compiler register use complaint.
+
+		Corrected a 'c' option error message.  Gnele
+		<blaadeleng@yahoo.com> reported the problem.
+
+		Upgraded EXT2FS and UFS support for NetBSD and
+		OpenBSD to handle new inode information, and the
+		fast UFS1 and UFS2 file systems.
+		
+		With the help of Andrew Brown <atatat@atatdot.net>
+		determined the NetBSD snapshot (1.6F) at which
+		<sys/mount.h> could be included under _KERNEL, thus
+		eliminating the lsof netexport.h hack.  The same
+		change applies to OpenBSD versions 3.3 and above.
+
+		Applied a patch from Armin Gruner <ag@muc.de> that
+		corrects the use of the HASPROCFS definition in the
+		FreeBSD dialect sources.
+
+		Corrected spelling errors in 00FAQ and in the
+		generated 00.README.FIRST_<version> file of the
+		distribution archive.  John Jackson <jrj@purdue.edu>
+		and Ray Phillips <r.phillips@jkmrc.uq.edu.au>
+		spotted and reported the errors.
+
+		Corrected a spelling error in a comment and incorrect
+		use of an alarm function in the LTsock test program.
+
+		At the suggestion of Stuart Anderson <sba@srl.caltech.edu>
+		added preliminary (and incomplete) SAM-FS file system
+		support to Solaris lsof.  Completion awaits availability
+		of SAM-FS internals.
+
+		Fixed a Solaris device name printing bug, reported by
+		Ric Anderson <ric@tick.Telcom.Arizona.EDU>, only
+		visible when HASDCACHE is not defined.  Ric helped
+		test the fix.
+
+		Fixed an AIX kernel bit size handling bug related
+		to the NFS node (rnode) structure.
+
+		Corrected a print_kptr() function call error in the AIX
+		AFS code, reported by David Steiner
+		<david.r.steiner@Dartmouth.EDU>.  Upon further reflection
+		and because I no longer have appropriate AIX AFS test
+		systems, disabled AIX AFS support in the Configure script
+		for AIX versions above 4.3.3.0 or AIX AFS versions above 3.5.
+
+		Added support for FreeBSD 5.1.
+
+		With advice from Allan Nathanson <ajn@apple.com> adjusted
+		the Darwin get-xnu-headers.sh script to access the kernel
+		header files needed by lsof from a new form of the Apple
+		open source repository.
+
+		Installed Linux and lsof library bug fixes and
+		improvements, supplied by Marian Jancar <mjancar@suse.cz>.
+		One Linux improvement handles mount strings that
+		have octal escapes in them, eg., \040 for embedded
+		blanks.  Marian tested the changes.
+
+4.69		October 16, 2003
+		Received and applied an OpenBSD patch from Peter Valchev
+		<pvalchev@sightly.net> that replaces a ctob() call with
+		a sysconf() call.  Peter claims sysconf() is needed for
+		OpenBSD on SPARC.  (It is not needed for NetBSD on SPARC.)
+
+		With the upgrade of my only Solaris 7 test system
+		to, Solaris 8, dropped the *claim* that lsof works
+		on Solaris 7.  That doesn't mean it won't work
+		there, so those who want lsof for Solaris 7 probably
+		should be able to build it there and it probably
+		will work there.
+
+		Revised lsof's DNLC handling for BSD derivatives,
+		including: BSDI; Darwin, DEC OSF/1, Digital UNIX
+		and Tru64 UNIX; FreeBSD; NetBSD; and OpenBSD.  The
+		latest NetBSD distribution's dropping of the vnode
+		capability ID (v_id) required the revision.
+
+		Adjusted to the latest FreeBSD 5.1-CURRENT.
+
+		Added NetBSD support for using kvm_getproc2().
+
+		Added a patch from Andrew Brown <atatat@atatdot.net>
+		to handle NetBSD enum conflicts and changes in the
+		<miscfs/kernfs/kernfs.h> and <miscfs/procfs/procfs.h>
+		header files.
+
+		Added a "#define _KERNEL" to the AIX dnode2.c source
+		file for compatibility with a new <j2/j2_inode.h>
+		AIX 5.2 header file version.  The addition was
+		supplied by Dick Dunbar <Dick.Dunbar@Siebel.com>
+		and was offered as a patch to lsof 4.68/
+
+		Added support for a second type of Solaris SAMFS.
+		Stuart Anderson <sba@srl.caltech.edu> provided the
+		support.  SAMFS support in lsof SOLARIS remains
+		scanty, because Sun won't release any details on
+		its kernel structures.
+
+		Dropped the *claim* that lsof works on AIX 4.3.3,
+		because I was unable to test it there.  That doesn't
+		mean it won't work there, so those who want lsof
+		for AIX 4.3.3 probably should be able to build it
+		there and it probably will work there.
+
+		Updated for Solaris 10 on test systems provided by
+		Mike Miscevic <miscevic@hotpop.com>.  Casper Dik
+		<casper@holland.sun.com> provided significant help.
+		During the Solaris 10 port found and fixed an lofs
+		handling bug that prevented reporting of open lofs
+		file lock status.
+
+		Updated the DNLC test, LTdnlc, to provide a possible
+		explanation about file systems on which the test
+		might fail.
+
+		Modified the procedure for obtaining missing Darwin
+		XNU kernel header files.  The new one requires more
+		manual intervention, but is the best that can be
+		done with the way Apple open sources are now
+		organized.  00FAQ explains the new procedures for
+		those not used to downloading Apple open source
+		files.
+
+		Added support for Apple Darwin 7.0 (Mac OS X 10.3)
+		with patches supplied by Allan Nathanson <ajn@apple.com>.
+		Dropped the *claim* that lsof builds and works on
+		Apple Darwin below 6.0.
+
+		Validated lsof on FreeBSD 4.9, using a test system
+		provided by Ben Lewis <bl@purdue.edu>.
+
+		Validated lsof on FreeBSD 5.1-CURRENT for Amd64.
+		David O'Brien <obrien@FreeBSD.org> provided a test
+		system.
+
+		Changed the NetBSD Configure stanza to do header
+		file searches in /usr/include by default.  The
+		LSOF_INCLUDE and NETBSD_SYS environment variables
+		may still be used to specify other search paths.
+		Discussions with Andrew Brown and Wolfgang S.
+		Rupprecht <wolfgang@wsrcc.com> led to the change.
+
+4.70		January 16, 2004
+		Improved shell-portability of the linux stanza of
+		the Configure script with a patch from Paul Jarc
+		<prj@po.cwru.edu>.
+
+		Added a "silent" rule to tests/Makefile for Paul.
+		Updated, extended and clarified the test suite
+		documentation in 00FAQ and 00TEST.
+
+		Fixed Solaris 10 dlsof.h typo, reported by Mike
+		Miscevic <miscevic@hotpop.com>.  The typo prevents lsof
+		from loading cleanly in Solaris 10 builds past 40.
+
+		Fixed a Solaris HSFS node number reporting bug and
+		added a structure definition work-around for Solaris
+		10.
+
+		Converted PGP signing to GPG.  My previous PGP key can
+		be used, but the gpg "--allow-non-selfsigned-uid"
+		option may have to be used when it is imported into a
+		GPG key ring.
+
+		Added bz2 compression.
+
+		Updated for OpenBSD 3.4.
+
+		Added a work-around for a missing header file in the
+		s10_44 Solaris 10 build.
+
+		Added support for FreeBSD 5.2-BETA and 5.2-CURRENT.
+
+		Updated Linux AX25 support with modifications supplied
+		by Lutz Poetschulat <dl9cu@db0zwi.de>.
+
+		Added raw IPv6 support to Linux lsof.
+
+		Improved handling of parameters after "-i@".
+
+		Improved file name test in LTdnlc.c.
+
+		Added loop count controls to the reading of Solaris
+		lock chains.  The change was implemented as a result of
+		a report from Steve Gonczi <steve@relicore.com>.
+
+		Based on a report from John Jackson <jrj@purdue.edu>,
+		enabled a Solaris 10 <sys/lgrp.h> work-around for
+		Solaris 9, too.  (Patch 112233 installs an lgrp.h on
+		Solaris 9 that needs the work-around.)
+
+		With help from Andrew Brown <atatat@atatdot.net> and
+		John Heasley <heas@netbsd.org> added log-structured
+		file system (LFS) support for NetBSD and OpenBSD.
+
+		Added AMD64 to the list of FreeBSD 5.x-CURRENT
+		supported architectures.  FreeBSD.org provides a test
+		system, courtesy of (I believe) David O'Brien
+		<obrien@FreeBSD.org>.
+
+		Added a cast to lseek() in the HP-UX /dev/kmem-based
+		kread() function to make it work properly with the
+		bundled HP C compiler.
+
+4.71		March 11, 2004
+		Added text file support to Apple Darwin lsof and
+		enabled the lsof executable portion of the LTbasic
+		test.  Added support for Darwin kernel queue, POSIX
+		semaphore and POSIX shared memory files.  Tested on
+		Darwin 7.2 (aka Mac OS 10.3.2).
+
+		Added process_kqueue() function prototypes for FreeBSD,
+		NetBSD and OpenBSD.
+
+		Picked some lint in AIX sources, lib/rnmh.c and
+		tests/LTsock.c.
+
+		Added "-x [fl]" cross-over option, which enables +d and
+		+D processing to cross over symbolic links and|or file
+		system mount points.  Discussion with Johan Lindquist
+		<johan@smilfinken.net> and Eric Williams (aka The Ghost
+		In The Machine) <ewill3@earthlink.net> on Linux news
+		groups revealed the need for the option.
+
+		Updated support for UnixWare 7.1.4.
+
+		Added support for the optional reporting of socket
+		options, socket states and TCP flags for most currently
+		supported dialects. John Smith <lbalbalba@hotmail.com>
+		and Tristan Nefzger <tn@bhtrader.com> requested the
+		information.  The dialects and their versions for which
+		this feature has become available include:
+
+		    AIX 4.3.2 and 5.[12]
+		    Apple Darwin 7.2
+		    BSDI BSD/OS 4.3.1
+		    Digital UNIX and Tru64 UNIX 4.0
+		    FreeBSD 4.9 and 5.2
+		    HP-UX 11 and 11.11 (aka 11i)
+		    NetBSD 1.6ZH
+		    OpenBSD 3.4
+		    OPENSTEP 4.2
+		    OpenUNIX 8
+		    SCO OpenServer Release 5.0.6
+		    Solaris 2.6, 8, 9 and 10
+		    UnixWare 7.1.[134]
+
+		Modified the Configure stanza for HP-UX 11 with better
+		q4 detection.  Steve Bonds <3vhmxxm02@sneakemail.com>
+		supplied the modification.
+
+		Applied a patch from Mike Miscevic <miscevic@hotpop.com>
+		to enable lsof to compile with the zone support in the
+		Solaris 10 s10_b51 release.  Added information on lsof
+		zone behavior to 00FAQ.
+
+		Added a "-z [z]" option to Solaris 10 lsof.  It enables
+		the listing of zone name and can also be used to select
+		the listing of processes and their files from specified
+		zones.
+
+4.72		July 13, 2004
+		Corrected Solaris 10 ZONE column title display bug with
+		a patch from Joep Vesseur <Joep.Vesseur@Sun.COM>.  Joep's
+		fix was offered as a patch to 4.71.
+
+		Based on a report from Jean-Pierre Radley <jpr@jpr.com>
+		about an unexpected GNU uname Configure interaction on
+		OSR, and working from information received from Bela
+		Lubkin, changed the OSR Configure stanza to use
+		/bin/uname instead of uname.  Added an FAQ entry about
+		Configure version detection problems.
+
+		Added the +m and "+m m" options in response to a dialog
+		with Robert T. Brown <rbrown@netmentor.com>.  The
+		options allow the creation of a mount table supplement
+		file which can be used on selected dialects to get
+		device numbers when stat(2) and lstat(2) can't deliver
+		them.  (That's generally the result of an inaccessible
+		NFS server.)  Currently the new options are supported
+		only on Linux.
+
+		Made cpumask_t typedef _KERNEL compensation for FreeBSD
+		5.2-CURRENT.  Refined it for 5.2.1-RELEASE with testing
+		help from Scott Ellentuch <tuc@ttsg.com>.
+
+		Added support for FreeBSD 4.10.  Larry Rosenmann
+		<ler@lerctr.org> kindly provided a test system.
+
+		Added support for NetBSD 2.0 with patches supplied by
+		Andrew Brown <atatat@atatdot.net>.  Andrew also
+		provided two test systems.
+
+		Made handling of Linux maps file more robust, based on
+		a report from Jan Blunck <J.Blunck@tu-harburg.de>.  As
+		a side benefit, made handling of generated stat(2)
+		information more flexible.
+
+		As a result of a discussion with Jason Fortezzo
+		<fortezza@mechanicalism.net>, adjusted lsof for Solaris
+		to obtain the maximum user name length from ut_name of
+		the utmpx structure, if <utmpx.h> exists.
+
+		Tested under OpenBSD 3.5.
+
+		Updated 00README information about using gcc (via the
+		Configure aixgcc abbrevisiation) to compile lsof on
+		AIX.  Ann Janssen <ajanssen@nebook.com> made me aware
+		the information was out of date.
+
+		Added an AIX SIGDANGER handler and some 00FAQ sections
+		on lsof memory usage after a discussion with Tom Qin
+		<tom.qin@citigroup.com> about lsof memory usage.
+
+		Added scripts/sort_res.perl5, contributed by Fabian
+		Frederick <fabian.frederick@gmx.fr>.  The script
+		displays lsof output sorted by size and path name.
+
+		Improved handling of files on Linux NFS mount points
+		that use the root_squash option, based on discussions
+		with Paul Szabo <psz@maths.usyd.edu.au>.
+
+		Updated FreeBSD 5.2-CURRENT support, based on a problem
+		report from Filippo Natali <filippo@widestore.net>.
+
+		Corrected improper FreeeBSD 5.x-CURRENT #if condition,
+		reported by Kim Culhan <kimc@kim.net>.
+
+		Added a Configure script work-around for AIX 5.2 lsof
+		with JFS2, compiled by gcc >= 3.3.  The work-around
+		was supplied by Florian M. Weps <fmw@hactrn.ch>.
+
+4.73		October 21, 2004
+		Added an __XPG4_CHAR_CLASS__ #define before
+		#include'ing <ctype.h> on Solaris to restore lsof's
+		ability to display special characters such as acute-e.
+
+		Added wide-character (e.g., UTF-8) support where
+		possible, prompted by a request from Kyungjoon Lee
+		<kjoonlee@gmail.com>.  Some older dialects -- e.g.,
+		NetBSD 1.4.1 -- don't support wide characters, so the
+		wide character support is enabled by definitions in
+		each dialect's machine.h.  Dialects with wide-
+		character support are listed in 00FAQ.
+
+		Make a FreeBSD 5.2-CURRENT adjustment for <sys/pipe.h>,
+		supplied by Sergey A. Osokin <osa@FreeBSD.ORG>.
+
+		Implemented a Linux feature request made by Jakub
+		Jelinek <jakub@redhat.com> that enhances lsof's ability
+		to locate UNIX domain sockets whose paths are named as
+		arguments.  Jakub supplied suggested code.
+
+		Dropped *claims* that lsof works on AIX below 5.1, SCO
+		Dropped *claims* that lsof works on AIX below 5.1, SCO
+		Openserver 5.0.4, Tru64 UNIX 5.0, and UnixWare below
+		7.1.4.  Lsof will probably build and work on those UNIX
+		dialect versions, but I no longer have any way to test
+		lsof on them.
+
+		Added support for FreeBSD 5.3 and 6.0.  The FreeBSD
+		5.3 support hasn't been tested.
+
+		Added FD test code that will allow dialect versions to
+		test FD option selections.  Used the new code in the
+		PSTAT-based HP-UX lsof to enable it to avoid scanning
+		the mount table when its information is not needed.
+		The addition was made in response to a query from
+		Harvey Garner <Harvey.Garner@championusa.com> about
+		lsof performance in a busy NFS environment.
+
+		Upgraded lsof's AIX support level to AIX 5.3, based on
+		a report from Dick Dunbar <Dick.Dunbar@Siebel.com>.  (I
+		have not tested lsof under AIX 5.3.)  Based on Dick's
+		recommendation and local testing changed the C for AIX
+		version 6 and higher -qmaxmem option value to -1.
+
+		Made LSOF_AR environment variable more useful and
+		documented it in 00XCONFIG.
+
+		Corrected the use of sum(1) to generate signatures for
+		the lsof distribution and binaries to match the
+		documentation that claims it is sum -r output.  Jin
+		Guojun <jin@george.lbl.gov> noticed and reported the
+		problem.
+
+		Tested under OpenBSD 3.6.
+
+		Added checksum and GPG certificate files for the bz2,
+		gz and Z lsof distribution archives.  The new files
+		reside with the distribution archives and supplement
+		the signature information already inside the archives.
+
+		Validated on Solaris 10, i8xpc, build s10_63.
+
+4.74		January 17, 2005
+		Fixed a Solaris segment fault bug on systems that lack
+		a /dev/allkmem device.  Offered the fix as a patch to
+		lsof 4.73.  The bug was reported by Donald Zoch
+		<donald.zoch@amd.com>.
+
+		Updated lsof for FreeBSD 6.0 and higher for a change in
+		<sys/vnode.h>, based on a report from Sergey A. Osokin
+		<osa@FreeBSD.ORG>.  Made the update available in a 4.74
+		'A' edition pre-release.
+
+		Filed an HP bug report about missing pstat(2) CWD info
+		for LOFS on HP-UX 11.11 and higher.  The missing CWD
+		info was noticed by Ermin Borovac <e.borovac@bom.gov.au>.
+		Added info to 00FAQ about the problem, which can cause
+		the lsof test suite's LTbasic test to fail.
+
+		Updated the q4-generated tcp_s.h in the lsof
+		distribution and added socket option support for HP-UX
+		11.00.  Erwin Reyns <ereyns@europarl.eu.int> helped
+		test.
+
+		Updated for Solaris 10, build s10_69, with a patch
+		supplied by Mike Miscevic <miscevic@hotpop.com>.
+
+		Added v_path support to Solaris 10 lsof.  That relieves
+		it of having to read and decode the kernel DNLC, and
+		delivers full paths more reliably.
+
+		Added specialized NFS4 support to Solaris 10 lsof.
+
+		Applied Solaris 10 patches to lsof supplied by Casper
+		Dik <casper@holland.sun.com>.
+
+		Updated lsof for NetBSD 2.99.10 and tested it on a
+		system provided by Andrew Brown <atatat@atatdot.net>.
+
+		Added support for the FreeBSD 6.0-CURRENT f_vnode
+		pointer in the file structure.
+
+		Added BSDI, FreeBSD, NetBSD and OpenBSD support for the
+		*effnlink member of the inode structure.  This makes
+		the lsof LTnlink test run faster on all modified
+		dialects and correctly on OpenBSD.
+
+		Added ptyfs support for NetBSD, using modifications
+		provided by Andrew Brown.
+		
+		Changed the netbsd Configure stanza to look by default
+		for system header files in both /usr/include and
+		/usr/src.  (The NETBSD_SYS environment variable can
+		still be used to select an alternate for /usr/src.)
+
+		Corrects two FreeBSD 4.10 RPC/XDR type definitions.
+
+		Added an FAQ Q&A about setuid and setgid restrictions
+		in HP-UX 11.11.  The information in the answer was
+		supplied by Frank Sanders <frank.sanders@siemens.com>.
+
+		Added abbreviations for AXI FCIO and FSNAPSHOT file
+		flags.  Holger VanKoll <Holger.VanKoll@swisscom.com>
+		reported the missing FCIO.
+
+		Adjusted lsof's private AIX 64 bit rnode structure for
+		64 bit AIX 5.2 systems.  (IBM doesn't distribute a
+		correct <nfs/rnode.h> for it.)
+
+		Corrected a Linux socket inode printing bug reported by
+		Igor Schein <igor@txc.com>.
+
+		Updated for FreeBSD 4.11.  The support compiles but
+		hasn't been tested.
+
+		Back-ported a FreeBSD 6.0-CURRENT fix to FreeBSD
+		5.3-RELEASE-p1.  That was done to solve a compilation
+		problem reported by Radko Keves <rado@daemon.sk>.
+
+4.75		May 16, 2005
+		Dropped the *claim* that lsof works on DEC OSF/1 and
+		Digital UNIX, since my last 4.0 test system has been
+		removed.  The last tested distribution of lsof on DEC OSF/1
+		and Digital UNIX was revision 4.74.  It has been archived
+		on lsof.itap.purdue.edu in pub/tools/unix/lsof/OLD/src.
+
+		Added negation forms to the values in the -g (PGID) and
+		-p (PID) lists.  Negated PGID and PID values, like
+		negated UID or login name values, are applied without
+		ORing or ANDing and take effect before any other
+		selection criteria are applied.
+
+		At the request of Marcin Gozdalik <gozdal@gmail.com>
+		added a -X option for Linux.  The option inhibits the
+		reading of the /proc/net/tcp* and /proc/net/udp*
+		files.
+
+		Based on a report from David Gutierrez
+		<davegu1@hotmail.com> changed DEC OSF/1 process table
+		allocation to request memory in smaller increments.
+
+		Based on a report from jayjwa <jayjwa@atr2.ath.cx>
+		updated the Customize script to use "tail -n 1" where
+		possible.
+
+		Enabled support for FreeBSD 5.4.
+
+		Improved the BSDI, FreeBSD, NetBSD, OpenBSD and Solaris
+		kvm_open() and kvm_openfiles() error messages.
+
+		Enabled support for NetBSD 2.99.12.
+
+		Improved HP-UX Configure stanza with help from Piet
+		Starreveld <pstarrev@csc.com>.  Picked some lint Piet
+		found.
+
+		Enabled IPv6 support for HP-UX > 11.  Piet Starreveld
+		helped test it on 11.23, among others.
+
+		Updated for HP-UX 11.23 on the ia64 architecture.
+
+		Updated to latest FreeBSD 6.0-CURRENT, using a test
+		system provided by Andrzej Tobola <ato@iem.pw.edu.pl>.
+
+		Added support for SCO OSR 6.0.0 and UnixWare 7.1.4 with
+		help from Richard at SCO.
+
+		Corrected a Linux bug in NFS handling, reported by Karel Zak
+		<kzak@redhat.com>.  Karel supplied a patch.
+
+		Improved the code for accessing an AIX 3.2 and higher
+		sockaddr_un structure, thus eliminating a segmentation
+		fault possibility.
+
+		Updated for AIX 5.3.
+
+		Added preliminary (DEBUG) support for the AIX SANFS
+		file system.
+
+		Fixed a bug in the Solaris 10 processing of the vnode's
+		v_path pointer with code supplied by Edward Jajko
+		<ejajko@portal.com>.  The fix was offered as a patch to
+		4.74.
+
+		Dropped support for OpenUNIX 8, since a test system is
+		no longer available.  Archived an OpenUNIX-only
+		distribution of the last revision (4.74) tested on
+		OpenUNIX in pub/tools/unix/lsof/OLD/src.
+
+		Tested under Openbsd 3.7.
+
+		Tested under Darwin 7.7.0.
+
+		Enabled building on amd64 Solaris 10 with hints from
+		Marc Aurele La France <tsi@ualberta.ca>.  Marc provided
+		a test system.
+
+		Supplied a missing quote in the FreeBSD Configure
+		stanza.  Carl Cook <Info@quantum-sci.com> reported the
+		problem.
+
+		Removed "-O" option from tests/Makefile so that the
+		HP-UX bundled compiler won't complain.
+
+4.76		August 30, 2005
+		Corrected an example and spelling errors in man page.
+
+		Updated for Apple Darwin 8.x with changes supplied by
+		Allan Nathanson <ajn@apple.com>.  Allan also provided a
+		test system.
+
+		Completed documentation of CLRLFILEADD in all machine.h
+		files.
+
+		At the request of Chris Markle <cmarkle@sendmail.com>
+		added partial listen queue length to socket options
+		displayed when -Tf is specified.  Partial queue length
+		is not reported for all dialects.  (00FAQ lists the
+		ones where it is reported.)
+
+		Updated for FreeBSD 7.0 with information supplied by
+		Andrzej Tobola <ato@iem.pw.edu.pl>.
+
+		Updated Solaris VxFS support for VxFS versions 4 and
+		above with technical advice from Craig Harmer
+		<craig_harmer@symantec.com>, Gary Millen
+		<gary_millen@symantec.com> and Chuck Silvers
+		<charles_silvers@symantec.com>.  Testing help was
+		provided by Michael Antlitz <mantlitz@prophasys.com>,
+		Steve Ginsberg <steve@dhapdigital.com> and Kenneth
+		Stailey <kstailey@yahoo.com>.
+
+		Fixed a Solaris address space map processing bug.
+		Janardhan Molumuri <mjanardhan@gmail.com> reported the
+		bug and help me identify it.  Made the fix available as
+		a patch to 4.75.
+
+		Added support for Solaris 10 port and CTFS files.  The
+		CTFS support is imcomplete, because I don't know how
+		to get inode number, size and link count.  (There's
+		a new 00FAQ entry about that.)
+
+		Investigated a report from Christopher J Warweg
+		<warwegc@GAO.GOV> that the CHECKSUMS for the lsof 4.75
+		binary for 64 bit Solaris 8 was incorrect.  It was my
+		packaging error.  I rebuilt and repackaged the binary.
+
+		Enabled support for Linux map file names with embedded
+		spaces.
+
+4.77		April 10, 2006
+		Added -X option support for Solaris 10 and above.  When
+		-X is specified lsof will report cached v_node path
+		names for unlinked files, followed by "(deleted)".
+		Improved cached vnode path name handling by adding
+		"(?)" to the end of path names of questionable accuracy.
+		Updated 00FAQ to reflect these changes.
+
+		Updated for FreeBSD 7.0-CURRENT.
+
+		Fixed name addition spacing bug, reported by Stuart
+		Anderson <anderson@ligo.caltech.edu>.  Also updated
+		Solaris 10 SAMFS support at Stuart's request.
+
+		Added missing "break;" and another HASSTATVFS test to
+		the NetBSD and OpenBSD dnode.c.  Bill Behr
+		<bbehr@networkstoragecorp.com> reported those needs.
+
+		Fixed an HP-UX 11 file descriptor "chunk" size problem,
+		reported by Per Allansson <per@appgate.com>.  Per helped
+		devise the fix and tested it.  This fix was offered as
+		a patch to lsof 4.76.
+
+		Updated for FreeBSD 6.0-STABLE and FreeBSD
+		6.1-PRERELEASE.
+
+		Updated scripts/sort_res.perl5 with changes supplied by
+		Frederick Fabian <fabian.frederick@skynet.be>, the
+		author of the script.
+
+		Corrected +|-M man page documentation error, reported
+		by Roger Cornelius <rac@tenzing.org>.
+
+		Improved FreeBSD user device random seed generation in
+		response to a problem report from Danny Braniss
+		<danny@cs.huji.ac.il>.
+
+		Eliminated three syntax error bugs and other compiler
+		complaints from the PSTAT-based lsof.  H. Merijn Brand
+		<h.m.brand@xs4all.nl> reported the problems and tested
+		the fixes.
+
+		Eliminated compiler complaints in the test suite.
+
+		Investigated problems with the building of lsof on
+		PA-RISC HP-UX 11.23, based on a report from John
+		Orndorff <John.Orndorff@sungard.com>.  Found that
+		neither the HP bundled C compiler nor gcc would build
+		lsof, but the the HP unbundled ANSI C compiler would.
+		Concluded that HP bundled C compiler can't handle
+		<gssapi/gssapi.h>.  Devised a work-around to gcc's
+		omission of the rpcent structure definition of
+		<netdb.h> that allows it to compile lsof's print.c, but
+		the resulting binary doesn't run reliably.  Documented
+		the situation in 00FAQ.
+
+		Changed reporting of unknown file types.  The number of
+		an unknown type is now reported as four octets.  The
+		change was made in response to a Linux lsof bug report
+		from Karel Zak <kzak@redhat.com>.
+
+		Dropped the *claim* that lsof works on BSDI BSD/OS
+		since my last test system has been removed.  The last
+		tested distribution of lsof for BSDI BSD/OS was
+		revision 4.76.  It has been archived on
+		lsof.itap.purdue.edu in pub/tools/unix/lsof/OLD/src.
+
+		As a result of discussing the lsof source tar's MD5
+		checksum with Andrew Bell <andrew.bell.ia@gmail.com>,
+		changed the description of a suitable MD5 tool in the
+		lsof distribution's documentation to name the openssl
+		"dgst" command.
+
+		Enabled compilation on Solaris 10 1/06 with a fix sent
+		by Jason Fortezzo <fortezza@mechanicalism.net>.  Made
+		the fix available as a patch to 4.76.
+
+		Adjusted to FreeBSD 5.5-PRERELEASE.
+
+		Corrected a bug in the lsof library's process_file()
+		function to enable the locating of AIX XTI sockets by
+		their TCP/IP address values.  The bug was reported by
+		Michel Dubois <Dubois@sears.ca>.
+
+		Based on a bug report from Karel Zak <kzak@redhat.com>
+		added command name length checking to as many dialects
+		as possible (Linux for Karel) for the "-c c" option.
+
+		Updated for OpenBSD 3.[89].  Tested the 3.9 update on a
+		system provided by David Mazieres.  I have not tested
+		on OpenBSD 3.8, but David reports lsof 4.76 worked
+		there.
+
+		Ended regression testing of lsof on 32 bit Solaris 8
+		with the ending of access to a test system.  Lsof
+		continues to be tested on 64 bit Solaris 8.
+
+4.78		April 24, 2007
+		Added more information to the lsof FAQ about missing
+		link counts and sizes on Linux files.
+
+		Simplified Linux stat() and lstat() usage.
+
+		Relocated #define's that prevent OpenBSD compilation on
+		systems without a /proc file system.  Pieter Bowman
+		<bowman@math.utah.edu> reported the problem.
+
+		Added code to avoid processing Linux /proc/<PID>/maps
+		file entries with zero device and node numbers.  Some
+		such entries now have names associated with them that
+		are not path names -- e.g., "[heap]", "[stack]" or
+		"[vdso]".  Scott Worley <sworley@chkno.net> reported
+		lsof's mishandling of such entries.
+
+		Added SELinux security context support, provided by
+		James Antill <james.antill@redhat.com>.  I have not
+		tested this, but James and Karel Zak <kzak@redhat.com>
+		have.
+
+		Added the #include of <sys/types.h> to Solaris lsof to
+		enabled compilation on Solaris 10 6/06.  Peter Harvey
+		Peter.Harvey@Sun.COM diagnosed the problem and supplied
+		a patch.
+
+		Added better support for JFS2 on AIX 5.2 and 5.3, based
+		on bug reports and help from Thomas Braunbeck
+		<BRAUNBEC@de.ibm.com> and Tom Whitty <TWHITTY@cerner.com>.
+
+		Documented that lsof supports AIX 5.3 only up through
+		maintenance level 1 (ML1).
+
+		Enabled Solaris lsof to locate the AFS vnode operation
+		address for OpenAFS 1.4.1.  The fix was supplied by
+		Robert Jelinek <Robert.Jelinek@MorganStanley.com>.
+
+		Enabled support for Solaris 10 ZFS.  If the necessary
+		ZFS header files aren't found, lsof offers the option
+		to drop ZFS support, to use internal, possibly
+		inaccurate structure definitions, or to supply a path
+		to the missing header files.  Horst Scheuermann
+		<Horst.Scheuermann@uni-trier.de> provided a development
+		system and helped test the support.
+
+		Corrected a typo in the man page, reported by Eric S.
+		Raymond <esr@thyrsus.com>.
+
+		Changed the spelling of macroes to macros in lsof
+		source and documentations files, based on a suggestion
+		from Josh Soref <timeless@gmail.com> and verification
+		with the OED.
+
+		The following dialects are no longer supported: 32 bit
+		AIX 5.2, HP-UX 11, OpenStep 4.2, Solaris 2.6, Solaris
+		8, True Unix 64 and UnixWare 7.1.4.  Lsof may work on
+		them, but I no longer have test systems for them.
+		Support for OpenBSD ends at its version 3.9 for lack of
+		interest in the port.
+
+4.79		April 15, 2008
+
+		**************** IMPORTANT NOTE ******************
+		*                                                *
+		* Lsof support has been reduced to the following *
+		* dialects: AIX, FreeBSD, Linux and Solaris, and *
+		* only in selected versions of those dialects.   *
+		* The selected versions are listed in this file  *
+		* and in other lsof documentation.               *
+		*                                                *
+		* I have made this move because of retirement    *
+		* and because I no longer have many test systems *
+		* available to me.                               *
+		*                                                *
+		* Vic Abell                                      *
+		*                                                *
+		**************************************************
+
+		Fixed a Solaris VXFS permission problem when accessing
+		the VXFS inode offsets.  The bug was reported by
+		Gregory A. Ivanov <ivga@mts.ru>.  Gregory tested the
+		fix.
+
+		Moved an #include <string.h> later in FreeBSD dlsof.h
+		to enable compilation on recent FreeBSD releases.  The
+		change was supplied by Roy Marples <uberlord@gentoo.org>.
+
+		Improved Linux /proc file stream reading speed by applying
+		an expanded version of a patch from Eric Dumazet
+		<dada1@cosmosbay.com> that allocates a page size buffer
+		to each stream.  Improved TCP, TCP6, UDP and UDP6 hashing
+		by determining the hash bucket count from the /proc/net
+		sockstat and sockstat6 files.  The improvement was
+		suggested by Eric and he provided sample code.  Eric also
+		tested both improvements.
+
+		Modified Configure script to build lsof on FreeBSD
+		6.2.  Tested it on a system provided by Larry Rosenman
+		<ler@lerctr.org>.
+
+		Fixed a Linux maps file processing bug that prevented path
+		names from having an embedded colon.  James Lingard
+		<jchl@arastra.com> reported the bug and helped with its
+		fix.
+
+		Based on reports from Eric Dumazet and Samuel Thibault
+		<samuel.thibault@ens-lyon.org> added support for the
+		Linux 2.6.22 kernel's /proc/<PID>/fdinfo files -- i.e.,
+		file offset and flags.  Samuel Thibault provided a test
+		system.
+
+		Fixed a Linux UNIX socket memory leak, reported by
+		Philip Shin <pshin@xceedium.com>.  Phillip supplied the
+		fix.
+
+		With generous assistance from HP added support for an HP-UX
+		11.23 patch that makes TLI/XTI socket address information
+		available.
+
+		Fixed a header file problem for FreeBSD 6.2 on the Alpha
+		architecture.  The problem was reported by Pekka Honkanen
+		<phonkane@cc.hut.fi>.  Pekka tested the fix.
+
+		Based on a report and using suggested fixes from Karel Zak
+		<kzak@redhat.com>, made these changes to Linux lsof: corrected
+		a getpidcon() error message; insured that inode numbers are
+		handled correctly for their unsigned long long type; and
+		improved SELinux handling.  At the request of Alon Bar-Lev
+		<alonbl@gentoo.org> added the LINUX_HASSELINUX environment
+		variable to enable or inhibit SElinux support unconditionally.
+
+		Updated Configure for FreeBSD 8.0-CURRENT and tested lsof on
+		AMD64 there.
+
+		Added a patch provided by Oles Hnatkevych
+		<don_oles@able.com.ua> for FreeBSD systems where the root
+		file system is on a CD9660 device.
+
+		Added compensation for the disappearance of FMARK and FDEFER
+		from the FreeBSD 8.0-CURRENT <sys/file.h>.
+
+		Updated FreeBSD lsof with ZFS support.  Larry Rosenman
+		<ler@lerctr.org>, Erwin Lansing <erwin@FreeBSD.org>, Wesley
+		Shields <wxs@atarininja.org> and Dmitry Morozovsky
+		<marck@rinet.ru> provided test systems.
+
+		Fixed a socket file identification problem reported by
+		Pavol Rusnak <stick@gk2.sk>.  Pavol also reported the
+		cause of the problem.
+
+		Added the ability to format the repeat mode marker line
+		with strftime(3), where the dialect supports the
+		localtime(3) and strftime(3) C library functions.  The
+		addition was suggested by Mike Depot <mdepot@comcast.net>,
+		who also tested it.  The addition required creating a new
+		main lsof source module, util.c, that contains functions
+		whose compilation conflicts with the general header file
+		tree defined by lsof.h and dlsof.h.
+
+		Based on reports from Andrei V. Lavreniyuk
+		<andy.lavr@reactor-xg.kiev.ua> and Pav Lucistnik
+		<pav@FreeBSD.org> updated the FreeBSD 7.0 and above
+		file lock handling to use new locking structures.  The
+		update requires a terrible hack to get a definition for
+		the lock owner structure from a kernel source module
+		into a local lsof header file.
+
+4.80		May 12, 2008
+		Updated for a FreeBSD 7.0 and above byte level locking
+		change.  The problem was reported by Conrad J. Sabatier
+		<conrads@cox.net>, who helped test the update.  Wesley
+		Shields <wxs@FreeBSD.org> provided an 8.0-CURRENT test
+		system.
+
+		Propagated the FreeBSD 7.0 and above locking changes to
+		FreeBSD 6.x, based on a report from Edwin Groothuis
+		<edwin@FreeBSD.org>.
+
+		Added warnings for unsupported dialects or versions.
+
+		Added Linux support for the UDPLITE protocol.  Eric
+		Dumazet <dada1@cosmosbay.com> supplied a patch.
+
+		Added a missing quote to the Configure script's
+		FreeBSD stanza.
+
+		Added a usage.o rule to the HP-UX PSTAT-based
+		Makefile.  I mistakenly deleted the rule at revision
+		4.79.  The missing rule was reported by Kawaljeet Kaur
+		<kawaljeet.malviya@gmail.com> who tested the corrected
+		Makefile.
+
+4.81		October 21, 2008
+		Updated the Darwin libproc sources with changes from
+		Allan Nathanson <ajn@apple.com>.  Tested them on a iMac
+		mini, provided by Apple Inc.
+
+		Changed dummy declarations in library source files to
+		eliminate complaints about unused variables and empty
+		object files.  This change may not work on dialects I
+		can no longer test; it has been tested on some versions
+		of AIX, Darwin, FreeBSD, Linux and Solaris.
+
+		At the request of Hal Brooks <hal@uga.edu> added support
+		for Linux /proc/net/packet files.  Hal tested it.
+
+		Added socket file only performance enhancements to Linux
+		and PSTAT-based HPUX lsof.
+
+		Added htonl call around improper usage of INADDR_LOOPBACK;
+		report from an Apple engineer forwarded by Allan Nathanson
+		<ajn@apple.com>.
+
+		Adjusted for FreeBSD-8.0 change in device number handling.
+		The adjustment should work for FreeBSD 5 and above, should
+		the 8.0 change be propagated downward.  The problem was
+		reported by Pav Lucistnik <pav@FreeBSD.org>.  An updated
+		test system was provided by Erwin Lansing <erwin@FreeBSD.org>.
+
+		Reduced AIX support to version 5.3, since test systems with
+		older versions are no longer available to me.
+
+		At the request of Marjo F. Mercado <mmercado@xceedium.com>
+		and Phil Shin <pshin@xceedium.com> applied some speed
+		improvements to lsof, particularly when the files of
+		interest are /Internet files -- i.e., selected with lsof's 
+		-i" option.  Added a two new options to assist the
+		improvements: 1) "-c^<command>" to tell lsof to exclude the
+		named command(s); and 2) "-stcp|ud>:[^]state' to tell lsof
+		to include in its reporting or exclude ('^') from its
+		reporting Internet files in the named states (e.g., LISTEN,
+		^CLOSE_WAIT, IDLE, etc.)  For the most part these changes
+		apply only to AIX, Darwin, FreeBSD, PSTAT-based HP-UX, Linux
+		and Solaris, since those are the only places I could test
+		them.  They are controlled by the HASTCPUDPSTATE definition
+		in each dialect's machine.h header file.  Marjo and Phil
+		provided HP-UX 11.23 and 11.31 test systems.
+
+		Fixed a stat(2) problem on HP-UX 11.31 while testing the
+		speed improvements.
+
+		Adjusted for kernel header file changes in FreeBSD
+		8.0-CURRENT.  Larry Rosenman <ler@lerctr.org> provided
+		a test system.
+
+		Added a warning for Solaris systems where VxFS node info
+		can't be obtained from the VxFS utility library.  The
+		warning was requested by Tom Matthews <Tom.MATTHEWS@rbs.com>.
+
+		Corrected mishandling of file system path name arguments
+		that have trailing slashes, except, of course, the root
+		file system, "/".  Allan Nathanson <ajn@apple.com> reported
+		the bug.
+
+4.82		March 25, 2009
+		Corrected an over-zealous exclusion test that caused
+		lsof to report nothing when it was given no arguments
+		and built with HASSECURITY and HASNOSOCKSECURITY enabled.
+		Joshua Kinard <kumba@gentoo.org> reported the bug and
+		supplied information for reproducing it.
+
+		Based on a report from Dan Trinkle <trinkle@cs.purdue.edu>
+		corrected use of <sys/utsname.h> for 32 bit Solaris 10
+		and above compilations.  Simultaneously eliminated a
+		casting complaint in arg.c and updated Configure to use
+		the appropriate 64 bit compilation option (-xarch=v9 or
+		-m64) with the Solaris Sun C compiler.
+
+		Updated for FreeBSD 7.1-PRERELEASE with information
+		supplied by Larry Rosenman <ler@lerctr.org>.
+
+		Updated the Darwin libproc sources with changes from
+		Allan Nathanson <ajn@apple.com>.  Tested them on a iMac
+		mini, provided by Apple Inc.  Allan also provided man
+		page corrections.
+
+		Updated the FreeBSD Makefile to use the ${MAKE} variable
+		for ZFS dnode2.c module compilation, based on a suggestion
+		from Alexis Ballier <aballier@gentoo.org>.
+
+		Improved the Solaris VxFS library location test, based on a
+		suggestion from Jason Fortezzo <fortezza@mechanicalism.net>.
+		Jason tested the change.
+
+		Updated Solaris 10 ZFS support for ZFS version 4 and ZFS
+		pool version 10, using a test system kindly provided by
+		Vladislav Nespor <vladislav.nespor@id.ethz.ch>.  Renata
+		Maria Dart <renata@slac.stanford.edu> tested on ZFS
+		version 4, verifying that the update works there, too.
+		(ZFS pool version 10 is apparently the ZFS version shipped
+		with the 10/08 update to Solaris.  The original ZFS
+		support targeted ZFS version 3.)
+
+		I still consider ZFS support in Solaris lsof a hack,
+		because it depends on a znode structure definition that
+		I developed using dbx.  Sun is remiss in not distributing
+		the ZFS header files used to build the distributed kernel.
+
+		Because of the znode structure definition hack, I can't
+		guarantee that lsof ZFS support will work for any other
+		versions of ZFS.
+
+		Solaris 10: adjusted to a change in the way devices are
+		stored in the kernel; fixed a problem in zone handling;
+		and added rudimentary sharedfs support.  Carson Gaspar
+		<carson@taltos.org> reported the device number problem,
+		provided a test system, and tested the changes.  Peter
+		Vines <psv2b@eservices.virginia.edu> reported the zone
+		handling problem and tested the fix.
+
+		Adapted to FreeBSD 8.0-CURRENT changes in device number
+		computation.  Problem was reported by Erwin Lansing
+		<erwin@FreeBSD.org>.  Larry Rosenman <ler@lerctr.org>
+		provided a test system.
+
+		Corrected Solaris Configure test for appropriate VxFS
+		library when using gcc to compile lsof.
+
+		Updated for loss of KAME IPv6 FreeBSD accommodations.
+
+		Adapted to FreeBSD 7.2.  Made Configure script recognized
+		FreeBSD 6.3.
+
+4.83		January 18, 2010
+		Converted Solaris 10 and above ZFS support to use the CTF
+		debugger library, libctf.  Code was supplied by Robert
+		Byrnes <Robert.Byrnes@deshaw.com>.
+
+		Corrected a typo in the testing of the LINUX_HASSELINUX
+		environment variable in the Configure script.  The error
+		was reported by Mike Frysinger <vapier@gentoo.org>.
+		At Mike's request made Configure script accept LSOF_RANLIB
+		(ranlib command), LSOF_CFGF (additional configuration flags)
+		and LSOF_CFGL (additional library specifications) from the
+		environment.
+
+		Enabled complilation of Solaris 10 lsof after a recent Sun
+		patch which changed the PC file system's structure. Peter
+		Vernam <pvernam@draper.com> reported the problem and helped
+		with the fix.
+
+		Made the sort of configuration CFLAGS in the CkTestDB
+		script impervious to locale settings.
+
+		Ported to Solaris 11, using a test system kindly provided
+		by David Day <dday76@gmail.com>.
+
+		Adjusted to the disappearance of <nfs/rpcv2.h> in FreeBSD
+		8.0-BETA1.
+
+		Changed Solaris node type lookup to a hashed method and
+		added some ability for it to handle duplicate vnodeop names
+		in /dev/ksyms.
+
+		Updated for FreeBSD 9.0-CURRENT.  Andrzej Tobola
+		<ato@iem.pw.edu.pl> provided a test system.  Extends the
+		fix to FreeBSD 6.0 and above via a Configure test and a
+		compile-time definition.  The need for the extension was
+		reported by Erik Trulsson <ertr1013@student.uu.se>>
+
+		Made corrections to FAQ typographical errors, suggested
+		by Josh Soref <timeless@gmail.com>.
+		
+		Added __UCLIBC__ test to Linux dlsof.h so lsof would compile
+		on an Intel ARM XScale processor.  The addition was provided
+		by Doug Kehn <rdkehn@yahoo.com>.
+
+		Added test for <utmpx.h> to FreeBSD configuration.  Improved
+		its use in lsof.h.  The changes were supplied by Martin Wilke
+		<miwi@FreeBSD.org>.
+
+4.84		July 29, 2010
+		Fixed a man page nroff command error with a correction
+		supplied by Josh Soref <timeless@gmail.com>.
+
+		Made Configure script recognize FreeBSD 7.3.  Larry Rosenman
+		<ler@lerctr.org> provided a test system.
+
+		Improved task support, initially for Linux only, with help
+		provided by Jerome Marchand <jmarchan@redhat.com> and
+		Miklos Szeredi <mszeredi@suse.cz>.  The support includes a
+		new compile-time definition, HASTASKS, and a new run time
+		option, "-K" to select task reporting.
+
+		While adding help output support for "-K", reorganized the
+		printing of help columns to make it much easier to add a new
+		option description.
+
+		Updated the Solaris PC file system structure patch in
+		revision 4.83 so it will compile with gcc.
+
+		Disabled the Solaris lgrp_root work-around in the Solaris
+		machine.h so it won't cause compilation problems on Solaris
+		11.  It no longer causes compilation problems on my Solaris
+		9 and 10 test systems, but some older Solaris 9 and 10
+		versions may still need it, so the work-around was left in
+		the Sun machine.h and a FAQ entry was created about it.
+
+		Updated for Solaris 11 b134, using a test system kindly
+		provided by Carson Gaspar <carson@taltos.org>.  Made
+		provisions for the next ZFS version.  Added info about
+		the failure of the LTnlink test on ZFS file systems.
+
+		Corrected typo in Configure script, reported by Dmitry
+		Berezin <dmitryb@oit.rutgers.edu>.
+
+4.85		September 27, 2011
+		John Dzubera <Zube@CS.ColoState.EDU> kindly provided a patched
+		Solaris 9 test system with the lgrp_root conflict and I was
+		able to devise an automatic work-around for the conflict.  The
+		special note in .../dialects/sun/machine.h was removed and
+		the 17.28.1 FAQ entry was modified to reflect the update.
+
+		Added a Solaris 11 work-around for a typedef problem with
+		<sys/mutex.h>.  Carson Gaspar <carson@taltos.org> reported
+		the problem and supplied the work-around.
+
+		Added support for FreeBSD 7.4 and 8.2; tested on systems
+		provided by Larry Rosenman <ler@lerctr.org>.
+
+		Added support for 32 bit Solaris 11 lsof with mods supplied
+		by Jan Wortelboer <J.H.P.Wortelboer@uva.nl>.
+
+		Added Solaris 11 support for using an alternate genunix
+		location.  Bill Goodridge <bill@its.brooklyn.cuny.edu>
+		reported the alternate location.
+
+		Added further Linux cross configuration support to lsof's
+		Configure script.  The additional support was supplied by
+		Grant Erickson <erick205@umn.edu>.  See the descriptions of
+		the LINUX_* environmen  variables in 00XCONFIG for more
+		information.  Tested lsof on Linux kernel 2.6.32 and picked
+		some lint that surfaced during the test.
+
+		Added fixes and changes for Apple Mac OS X 10.6, provided by
+		Allan Nathanson <ajn@apple.com>.  Allan also provided a test
+		system.
+
+		Tested on FreeBSD 6.4 i386, using a test system provided by
+		Terry Kennedy <TERRY@tmk.com>.  Updated for recent FreeBSD ZFS
+		changes on an 8.2 amd64 test system also provided by Terry.
+
+		Changed documentation to indicate FreeBSD 7.x is no longer
+		supported, since I no longer have a test system.
+
+		Made some changes to the lsof man page, suggested by Navid
+		<evi1m4chine@googlemail.com>.
+
+		Added compensation for Solaris 10 systems that have patch
+		144488-10.  The patch requires that the new header file
+		<sys/socket_proto.h> be included while _KERNEL is defined.
+		Brett Bartick <Brett.bartick@nomura.com> reported the problem
+		first, followed by Stuart Anderson <anderson@ligo.caltech.edu>.
+		Michael Hocke <michael.hocke@nyu.edu> suggested a work-around
+		which I refined to limit it to the specific Solaris 10 instance
+		and then tested on a system provided by Charles Stephens
+		<cfs@cowlabs.com>
+
+		Added the +|-e option for Linux.  It exempts file systems
+		named by path from function calls that might block in the
+		kernel -- i.e., stat(2) and lstat(2), and when the +e form
+		is used, readlink (2).  The new packager of lsof for the
+		Linux Fedora and RHEL distributions, Peter Schiffer
+		<pschiffe@redhat.com>, asked for the feature so it could
+		be used with Clearcase file systems, whose implementation
+		can block stat(2) calls.  I consider this feature very risky
+		and easy to misuse -- e.g., specifying the file system as
+		'/' would exempt all file systems.  I don't intend to
+		propagate this option to any other UNIX dialect that lsof
+		currently supports.
+
+		Made FreeBSD 9 adjustment.
+
+		Fixed a Linux bug that prevented the display of paths for
+		abstact UNIX sockets.  Masatake Yamato <yamato@redhat.com>
+		reported the bug and supplied a patch.
+
+		Added compensation for the removal of RPC header files from
+		GlibC 2.14 for Linux.  Marek Behun <kabel@blackhole.sk>
+		reported the problem and supplied a patch.
+
+		Added support for Linux Netlink protocol.  Masatake Yamato
+		requested the support and supplied a patch.  Peter Schiffer
+		<pschiffe@redhat.com> provided a test system.
+
+		Corrected Linux UDP6-lite path.  The error was reported by
+		Masatake Yamato and he also supplied a patch.
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src/00FAQ b/lsof_4.85/lsof_4.85_src/00FAQ
new file mode 100644
index 0000000..24a4e52
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00FAQ
@@ -0,0 +1,7987 @@
+
+		Frequently Asked Questions about lsof
+
+**********************************************************************
+| The latest release of lsof is always available via anonymous ftp   |
+| from lsof.itap.purdue.edu.  Look in pub/lsof.README for its        |
+| location.                                                          |
+**********************************************************************
+
+______________________________________________________________________
+
+This file contains frequently asked questions about lsof and answers
+to them.
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
+______________________________________________________________________
+
+Table of Contents:
+
+1.0	General Concepts
+1.1	Lsof -- what is it?
+1.2	Where do I get lsof?
+1.2.1	Are there mirror sites?
+1.2.2	Are lsof executables available?
+1.2.3	How do I check the validity of an lsof distribution?
+1.2.4	Why can't I get the sum(1) result reported in
+	README.lsof_<revision>?
+1.2.5	Why won't gpg accept the lsof-signing PGP public key?
+1.3	Where can I get more lsof documentation?
+1.4	How do I report an lsof bug?
+1.5	Where can I get the lsof FAQ?
+1.5.1	How timely is the on-line FAQ?
+1.6	Is there a test suite?
+1.7	Is lsof vulnerable to the standard I/O descriptor attack?
+1.8	Can I alter lsof's make(1) behavior?
+1.9	Is there an lsof license?
+1.10	Language locale support
+1.10.1	Does lsof support language locales?  How do I use the support?
+1.10.2	Does lsof support wide characters in language locales?
+1.11	Are any files in the lsof distribution copyrighted?
+1.12	Are there other lsof-related resources?
+1.13	What does the "WARNING: unsupported dialect or version" mean?
+
+2.0	Lsof Ports
+2.1	What ports exist?
+2.2	What about a new port?
+2.2.1	User-contributed Ports
+2.3	Why isn't there an AT&T SVR4 port?
+2.4	Why isn't there an SGI IRIX port?
+2.5	Why does lsof's Configure script report "WARNING: unsupported
+	dialect or version"?
+
+3.0	Lsof Problems
+3.1	Configuration Problems
+3.1.1	Why can't Configure determine the UNIX dialect version?
+3.2	Compilation Problems
+3.2.1	Why does the compiler complain about missing header files?
+3.2.2   Why does gcc complain about the contents of header files
+	distributed by the system's vendor?
+3.2.3	Other header file problems
+3.3	Why doesn't lsof report full path names?
+3.3.1	Why do lsof -r reports show different path names?
+3.3.2	Why does lsof report the wrong path names?
+3.3.3	Why doesn't lsof report path names for unlinked (rm'd) files?
+3.3.4	Why doesn't lsof report the "correct" hard linked file path
+	name?
+3.3.5	When will lsof report path names for deleted files?
+3.4	Why is lsof so slow?
+3.5	Why doesn't lsof's setgid or setuid permission work?
+3.6	Does lsof have security problems?
+3.7	Will lsof show remote hosts using files via NFS?
+3.8	Why doesn't lsof report locks held on NFS files?
+3.8.1	Why does lsof report a one byte lock on byte zero as a full
+	file lock?
+3.9	Why does lsof report different values for open files on the
+	same file system (the automounter phenomenon)?
+3.10	Why don't lsof and netstat output match?
+3.10.1	Why can't lsof find accesses to some TCP and UDP ports?
+3.11	Why does lsof update the device cache file?
+3.12	Why doesn't lsof report state for UDP socket files?
+3.13	I am editing a file with vi; why doesn't lsof find the file?
+3.14	Why doesn't lsof report TCP/TPI window and queue sizes for my
+	dialect?
+3.14.1	Why doesn't lsof report socket options, socket states, and TCP
+	flags and values for my dialect?
+3.14.2	Why doesn't lsof report the partial listen queue connection
+	count for my dialect?
+3.15	What does "no more information" in the NAME column mean?
+3.16	Why doesn't lsof find a process that ps finds?
+3.17	Why doesn't -V report a search failure?
+3.18	Portmap problems
+3.18.1	Why isn't a name displayed for the portmap registration?
+3.18.2	How can I display only portmap registrations?
+3.18.3	Why doesn't lsof report portmap registrations for some ports?
+3.19	Why is `lsof | wc` bigger than my system's open file limit?
+3.20	Why doesn't lsof report file offset (position)?
+3.20.1	What does lsof report for size when the file doesn't really have
+	one?
+3.21	Problems with path name arguments
+3.21.1	How do I ask lsof to search a file system?
+3.21.2	Why doesn't lsof find all the open files in a file system?
+3.21.3	Why does the lsof exit code report it didn't find open files
+	when some files were listed?
+3.21.4	Why won't lsof find all the open files in a directory?
+3.21.5	Why are the +D and +d options so slow?
+3.21.6	Why do the +D and +d options produce warning messages?
+3.22	Why can't my C compiler find the rpcent structure definition?
+3.23	Why doesn't lsof report fully on file "foo" on UNIX dialect
+	"bar?"
+3.24	Why do I get a complaint when I execute lsof that some library
+	file can't be found?
+3.25	Why does lsof complain it can't open files?
+3.26	Why does lsof warn "compiled for x ... y; this is z."?
+3.27	How can I disable the kernel identity check?
+3.28	Why don't ps(1) and lsof agree on the owner of a process?
+3.29	Why doesn't lsof find an open socket file whose connection
+	state is past CLOSE_WAIT?
+3.30	Why don't machine.h definitions work when the surrounding
+	comments are removed?
+3.31	What do "can't read inpcb at 0x...", "no protocol control
+	block", "no PCB, CANTSENDMORE, CANTRCVMORE", etc. mean?
+3.32	What do the "unknown file system type" warnings mean?
+3.33	Installation
+3.33.1	How do I install lsof?
+3.33.2	How do I install a common lsof when I have machines that
+	need differently constructed lsof binaries?
+3.34	Why do lsof 4.53 and above reject device cache files built
+	by earlier lsof revisions?
+3.35	What do "like block special" and "like character special" mean
+	in the NAME column?
+3.36	Why does an lsof make fail because of undefined symbols?
+3.37	Command Regular Expressions (REs)
+3.37.1	What are basic and extended regular expressions?
+3.37.2	Why can't I put a slash in a command regular expression?
+3.37.3	Why does lsof say my command regular expression wasn't found?
+3.38	Why doesn't lsof report on shared memory segments?
+3.39	Why does lsof report two instances of itself?
+3.40	Why does lsof report '\n' in device cache file error messages?
+3.41	Kernel Symbol and Address Problems
+3.41.1	What does "lsof: WARNING: name cache hash size length error: 0"
+	mean?
+3.41.2	Why does lsof produce "garbage" output?
+3.42    Why does lsof report open files when run as super user that
+	it doesn't report when run with lesser privileges?
+3.43	Test Suite Problems
+3.43.1	Errors all tests can report:
+3.43.1.1 Why do tests complain "ERROR!!!  can't execute ../lsof"?
+3.43.1.2 Why do tests complain "ERROR!!! can't find ..." a file?
+3.43.1.3 Why do some tests fail to compile?
+3.43.1.4 Why do some tests always fail?
+3.43.1.5 Why does the test suite say it hasn't been validated on
+	 my dialect?
+3.43.1.6 Why do the tests complain they can't stat() or open()
+	 /dev/mem or /dev/kmem?
+3.43.2	LTbigf test issues
+3.43.2.1 Why does the LTbigf test say that the dialect doesn't
+	 support large files?
+3.43.2.2 Why does LTbigf complain about operations on its config.LTbigf*
+	 file?
+3.43.2.3 Why does LTbigf warn that lsof doesn't return file offsets?
+3.43.3	Why does the LTbasic test complain "ERROR!!! lsof this ..."
+	and "ERROR!!!  lsof that ..."?
+3.43.4	LTnfs test issues
+3.43.4.1 Why does the LTnfs test complain "couldn't find NFS file ..."?
+3.43.5	LTnlink test issues
+3.43.5.1 Why does the LTnlink test complain that its test file is on
+	 an NFS file system?
+3.43.5.2 Why does LTnlink delay and report "waiting for link count
+	 update: ..."?
+3.43.5.3 Why does LTnlink fail because of an unlink error?
+3.43.6	LTdnlc test issues
+3.43.6.1 Why won't the LTdnlc test run?
+3.43.6.2 What does the LTdnlc test mean by "... <path> found: 100.00%"?
+3.43.6.3 Why does the DNLC test fail?
+3.43.7	Why hasn't the test suite been qualified for 64 bit HP-UX
+	11 when lsof is compiled with gcc?
+3.43.8	LTszoff test issues
+3.43.8.1 Why does LTszoff warn that lsof doesn't return file offsets?
+3.43.9	LTlock test issues
+3.44	File descriptor list (the ``-d'' option) problems
+3.44.1	Why does lsof reject a ``-d'' FD list?
+3.44.2	Why are file descriptors other than those in my FD list
+	reported?
+3.45	How can I supply device numbers for inaccessible NFS file
+	systems?
+3.46	Why won't lsof find open files on over-mounted file systems?
+3.47	What can be done when lsof reports no more space?
+3.48	What if the lsof build encounters ar and ld problems?
+
+4.0	AIX Problems
+4.1	What is the Stale Segment ID bug and why is -X needed?
+4.1.1	Stale Segment ID APAR
+4.2	Gcc Work-around for AIX 4.1x
+4.3	Gcc and AIX 4.2
+4.4	Why won't lsof's Configure allow the use of gcc for AIX
+	below 4.1?
+4.5	What is an AIX SMT file type?
+4.6	Why does AIX lsof start so slowly?
+4.7	Why does exec complain it can't find libc.a[shr.o]?
+4.8	What does lsof mean when it says, "TCP no PCB, CANTSENDMORE,
+	CANTRCVMORE" in a socket file's NAME column?
+4.9	When the -X option is used on AIX 4.3.3, why does lsof disable
+	it, saying "WARNING: user struct mismatch; -X option disabled?"
+4.10	Why doesn't the -X option work on my AIX 5L or 5.[123] system?
+4.11	Why doesn't /usr/bin/oslevel report the correct AIX version?
+4.11.1	Why doesn't /usr/bin/oslevel report the correct AIX version
+	on AIX 5.1?
+4.12    Why does lsof for AIX 5.1 or above Power architecture
+	complain about kernel bit size?
+4.13	What can't gcc be used to compile lsof on the ia64 architecture
+	for AIX 5 and above?
+4.14	Why does lsof get a segmentation fault when compiled with gcc
+	for a 64 bit Power architecture AIX 5.1 kernel?
+4.15	Why does lsof ignore AFS on my AIX system?
+4.16	Why does lsof report "system paging space is low" and exit?
+4.17	Why does lsof have compilation and execution problems on AIX
+	5.3 above maintenance level 1?
+
+5.0	Apple Darwin Problems
+5.1	What do /dev/kmem-based and libproc-based mean?
+5.2	/dev/kmem-based Apple Darwin Questions
+5.2.1	Why does Configure ask for a path to the Darwin XNU kernel
+	header files?
+5.2.1.1	Why does Configure complain that Darwin XNU kernel header
+	files are missing?
+5.2.2	Why doesn't Apple Darwin lsof report text file information?
+5.2.3	Why doesn't Apple Darwin lsof support IPv6?
+5.2.4     Why does lsof complain about a mismatch between the release
+	for which lsof was compiled and the booted Mac OS X release?
+5.2.5	Why does lsof for Apple Darwin 8 and higher report
+	"stat(...): ..." in the NAME column?
+5.2.6	What are the limitations of Apple Darwin lsof link count
+	reporting?
+5.3	Libproc-based Apple Darwin Questions
+
+6.0	BSD/OS BSDI Problems
+6.0.5	Statement of deprecation
+
+7.0	DEC OSF/1, Digital UNIX, and Tru64 UNIX Problems
+7.1	Why does lsof complain about non-existent /dev/fd entries?
+7.2	Why does the Digital UNIX V3.2 ld complain about Ots* symbols?
+7.3	Why can't lsof locate named pipes (FIFOs) under V3.2?
+7.4	Why does lsof use the wrong configuration header files?
+	For example, why can't the lsof compilation find cpus.h?
+7.5	Why does lsof indicate incomplete paths with " -- " for Tru64
+	UNIX 5.1 files?
+7.6	Why doesn't lsof report link count, node number, and size
+	for some Tru64 5.x CFS files?
+7.7     Why does lsof say it can't read the kernel name list or
+	proc table on Digital UNIX 4.x or Tru64 UNIX?
+
+8.0	FreeBSD Problems
+8.1	Why doesn't lsof report on open kernfs files?
+8.2	Why doesn't lsof work on my FreeBSD system?
+8.3	Why doesn't lsof work on the RELEASE version of CURRENT?
+8.4	Why can't kvm_open() can't find some file?
+8.5	FreeBSD ZFS Problems
+8.5.1	Why does FreeBSD lsof report "WARNING: no ZFS support has been
+8.6	Why can't Configure create lsof_owner.h for FreeBSD 6 and above?
+8.6.1	Why are there lockf structure compiler errors for FreeBSD 6.0
+	and higher lsof?
+8.6.2	Why don't /usr/src/sys/sys/lockf.h and /usr/include/sys/lockf.h
+	match?
+
+9.0	HP-UX Problems
+9.1	What do /dev/kmem-based and PSTAT-based mean?
+9.2	/dev/kmem-based HP-UX lsof Questions
+9.2.1	Why doesn't a /dev/kmem-based HP-UX lsof compilation use -O?
+9.2.2	Why doesn't the /dev/kmem-based CCITT support work under 10.x?
+9.2.3	Why can't /dev/kmem-based lsof be compiled with `cc -Aa` or
+	`gcc -ansi` under HP-UX 10.x?
+9.2.4	Why does /dev/kmem-based lsof complain about no C compiler?
+9.2.5	Why does Configure complain about q4 for /dev/kmem-based lsof
+	for HP-UX 11?
+9.2.6	When compiling /dev/kmem-based lsof for HP-UX 11 what do the
+	"aCC runtime: ERROR..." messages mean?
+9.2.7	Why doesn't /dev/kmem-based lsof for HP-UX 11 report VxFS file
+	link counts, node numbers, and sizes correctly?
+9.2.8	Why can't /dev/kmem-based lsof be built with gcc for 64 bit
+	HP-UX 11?
+9.2.8.1	How can I acquire a gcc for building lsof for 64 bit HP-UX 11?
+9.2.9   Why does /dev/kmem-based lsof for HP-UX 11 report "unknown file
+	system type" for VxFS files?
+9.2.10	Why does the ANSI-C compiler complain about comments in HP-UX
+	11 header files?
+9.2.11  Why does dnode1.c cause the HP-UX 11 compiler to complain that
+	<sys/fs/vx_inode.h> is missing or incorrect?
+9.3	PSTAT-based HP-UX lsof Questions
+9.3.1	Why does PSTAT-based lsof complain about pst_static and
+	other PSTAT structures?
+9.3.2	Why does PSTAT-based lsof complain it can't read pst_*
+	structures?
+9.3.3	Why does PSTAT-based lsof rebuild the device cache file
+	after each reboot?
+9.3.4	Why doesn't PSTAT-based lsof report TCP addresses for
+	telnetd's open socket files?
+9.3.5   Why does PSTAT-based lsof cause an HP-UX 11.11 kernel panic?
+9.3.6   Why doesn't PSTAT-based lsof report a CWD that is on a loopback
+	(LOFS) file system?
+9.3.7	Why do some swinstall packages for PSTAT-based HP-UX 11.11
+	packages complain about setgid and setuid bits?
+9.3.8	Why won't the bundled C compiler build PSTAT-based lsof for
+	PA-RISC HP-UX 11.23?
+9.3.9	Why won't gcc build PSTAT-based lsof for PA-RISC HP-UX 11.23?
+9.3.10	Why does PSTAT-based lsof complain, "FATAL: pst_stream_size
+	should be: 672; is 72" on HP-UX 11.11 and above?
+9.4	Why won't the HP-UX depot install?
+
+10.0	Linux Problems
+10.1	What do /dev/kmem-based and /proc-based lsof mean?
+10.2	/proc-based Linux lsof Questions
+10.2.1	Why doesn't /proc-based lsof report file offsets (positions)?
+10.2.2	Why does /proc-based lsof report "can't identify protocol" for
+	some socket files?
+10.2.3	Why does /proc-based lsof warn about unsupported formats?
+10.2.4	Why does /proc-based lsof report "(deleted)" after a path name?
+10.2.5	Why doesn't /proc-based lsof report full open file information
+	for all processes?
+10.2.6	Why won't Customize offer to change HASDCACHE or WARNDEVACCESS
+	for /proc-based lsof?
+10.2.7	/proc-based lsof Linux NFS questions
+10.2.7.1 Why can't lsof find files on an accessible NFS file system?
+10.2.7.2 Why can't lsof find files on an inaccessible NFS file system?
+10.2.8	Why doesn't /proc-based Linux lsof report socket options and
+	values, socket state flags, and TCP options and values?
+10.2.9	Does /proc-based Linux lsof use a device cache?
+10.2.10	Why doesn't /proc-based Linux lsof report any or all file structure
+	values for its +fcfgGn option?
+10.3	Special Linux file types
+10.3.1	Why is ``DEL'' reported as a Linux file type?
+10.3.2	Why is ``unknown'' reported as a Linux file type?
+10.4	Linux ``mem'' Entry Problems
+10.4.1  What do ``path dev=xxx'' and ``path inode=yyy'' mean in the
+	NAME column of Linux ``mem'' file types?
+10.4.2  Why is neither link count nor size reported for some Linux
+	``DEL'' and ``mem'' file types?
+10.5	Special Linux NAME column messages
+10.5.1  What does ``(stat: xxx)'' mean in the NAME column of Linux
+	files?
+10.5.2  What does ``(readlink: xxx)'' mean in the NAME column of
+	Linux files?
+10.6	Why is ``NOFD'' reported as a Linux file type?
+10.7    Why does Linux lsof report a NAME column value that begins with
+	``/proc''?
+10.8	Linux /proc/net/tcp* and /proc/net/udp* issues
+10.8.1	Why use the Linux -X option?
+10.8.2	Why does lsof say ``-i is useless when -X is specified''?
+10.8.3	Why does lsof say ``can't identify protocol (-X specified)''?
+
+11.0	NetBSD Problems
+11.1	Why doesn't lsof report on open kernfs files?
+11.2	Why doesn't lsof report on open files on: file descriptor
+	file systems; /proc file systems; 9660 (CD-ROM) file systems;
+	MS-DOS (floppy disk) file systems; or kernel file systems?
+11.3    Why does lsof produce confusing results for nullfs file
+	systems?
+11.4	NetBSD header file problems
+11.4.1	Why can't the compiler find some NetBSD header files?
+11.4.2	Why does NetBSD lsof produce incorrect output?
+11.5	Why isn't lsof feature xxx enabled for NetBSD?
+
+12.0	NEXTSTEP and OPENSTEP Problems
+12.1	Why can't lsof report on 3.1 lockf() or fcntl(F_SETLK)
+	locks?
+12.2	Why doesn't lsof compile for NEXTSTEP with AFS?
+
+13.0	OpenBSD Problems
+13.1	Why doesn't lsof support kernfs on my OpenBSD system?
+13.2	Will lsof work on OpenBSD on non-x86-based architectures?
+13.3	<sys/pipe.h> problems
+13.3.1	Why does the compiler claim nbpg isn't defined?
+13.3.2	What value should I assign to nbpg?
+13.4	Why doesn't lsof report on open MS-DOS file system (floppy
+	disk) files?
+13.5	Why isn't lsof feature xxx enabled for OpenBSD?
+
+14.0	Output problems
+14.1	Why do the lsof column sizes change?
+14.2	Why does the offset have ``0t' and ``0x'' prefixes?
+14.3	What are the values printed in the FILE_FLAG column
+	and why is 0x<value> sometimes included?
+14.3.1	Why doesn't lsof display FILE_FLAG values for my dialect?
+14.4	Network Addresses
+14.4.1	Why does lsof's -n option cause IPv4 addresses, mapped to
+	IPv6, to be displayed in IPv6 notation?
+14.5	Why does lsof output \x, ^x, or \xnn for characters
+	sometimes?
+14.5.1  Why is space considered a non-printable character in command
+	names?
+14.6	Why doesn't lsof print all the characters of a command name?
+14.7	Why does lsof reject some -c command names, saying their lengths
+	are "> what system provides (nn)"?
+14.8	Why does lsof sometimes print TYPE numbers instead of names?
+14.9	Marker line format problems
+14.9.1	Why won't lsof accept a marker line format?
+14.9.2	Why does lsof reject the NL (%n) marker line format?
+14.10	How are protocol state name exclusion and inclusion used?
+14.10.1	Why doesn't my dialect support state name exclusion and inclusion?
+
+15.0	Pyramid Version Problems
+15.0.5	Statement of deprecation
+
+16.0	SCO Problems
+16.1	SCO OpenServer Problems
+16.1.1	How can I avoid segmentation faults when compiling lsof?
+16.1.2	Where is libsocket.a?
+16.1.3	Why do I get "warning C4200" messages when I compile lsof?
+16.2	SCO|Caldera UnixWare Problems
+16.2.1  Why doesn't lsof compile on my UnixWare 7.1.1 or above
+	system?
+16.2.2	Why does lsof complain about node_self() on my UnixWare
+	7.1.1 or above system?
+16.2.3  Why does UnixWare 7.1.1 or above complain about -lcluster,
+	node_self(), or libcluster.so?
+16.2.4  Why does UnixWare 7.1.1 or above lsof complain it can't
+	read the kernel name list?
+16.2.5  Why doesn't lsof report link count, node number, and size
+	for some UnixWare 7.1.1 or above CFS files?
+16.2.6  Why doesn't lsof report open files on all UnixWare 7.1.1
+	NonStop Cluster (NSC) nodes?
+16.2.7	Why doesn't lsof report the UnixWare 7.1.1 NonStop Cluster
+	(NSC) node a process is using?
+16.2.8  Why does the compiler complain about missing UnixWare 2.1[.x]
+	header files?
+
+17.0	Sun Problems
+17.0.5	Statement of deprecation
+17.1	My Sun gcc-compiled lsof doesn't work -- why?
+17.2	How can I make lsof compile with gcc under Solaris 2.[456],
+	2.5.1, 7, 8 or 9?
+17.3	Why does Solaris Sun C complain about system header files?
+17.4	Why doesn't lsof work under my Solaris 2.4 system?
+17.5	Where are the Solaris header files?
+17.6	Where is the Solaris /usr/src/uts/<architecture>/sys/machparam.h?
+17.7	Why does Solaris lsof say ``can't read proc table''?
+17.8	Why does Solaris lsof complain about a bad cached clone device?
+17.9	Why doesn't Solaris make generate .o files?
+17.10	Why does lsof report some Solaris 2.3 and 2.4 lock types as `N'?
+17.11	Why does lsof Configure say "WARNING: no cc in ..."?
+17.12	Solaris 7, 8 and 9 Problems
+17.12.1	Why does lsof say the compiler isn't adequate for Solaris
+	7, 8 or 9?
+17.12.2 Why does Solaris 7, 8 or 9 lsof say "FATAL: lsof was compiled
+	for..."?
+17.12.3	How do I build lsof for a 64 bit Solaris kernel under a 32
+	bit Solaris kernel?
+17.12.4	How do I install lsof for Solaris 7, 8 or 9?
+17.12.5 Why does my Solaris 7, 8 or 9 system say it cannot execute
+	lsof?
+17.12.6 What gcc will produce 64 bit Solaris 7, 8 and 9 executables?
+17.12.7 Why does lsof on my Solaris 7, 8 or 9 system say, "can't
+	read namelist from /dev/ksyms?"
+17.13	Solaris and COMMON
+17.13.1	What does COMMON mean in the NAME column for a Solaris VCHR
+	file?
+17.13.2	Why does a COMMON Solaris VCHR file sometimes seem to have an
+	incorrect minor device number?
+17.14	Why don't lsof and Solaris pfiles reports always match?
+17.15	Why does lsof say, "kvm_open(namelist=default, core=default):
+	Permission denied?"
+17.16	Why is lsof slow on my busy Solaris UFS file system?
+17.17	Why is lsof so slow on my Solaris 8 or 9 system?
+17.18	Solaris and VxFS
+17.18.1	Why doesn't lsof support VxFS 3.4 on Solaris 2.6, and above?
+17.18.2	Why does lsof report "vx_inode: vxfsu_get_ioffsets error"
+	for open Solaris 2.6 and above VxFS 3.4 and above files?
+17.18.3	Why does Solaris Configure claim there is no VxFS library?
+17.18.4	Why doesn't Solaris lsof report VxFS path name components?
+17.18.5	Why does Solaris 10 lsof report scrambled VxFS paths?
+17.19	Large file problems
+17.19.1	Why does lsof complain it can't stat(2) a Solaris 2.5.1
+	large file?
+17.20   Why does lsof get a segmentation fault on 64 bit Solaris
+	8 using NIS+?
+17.21	Will lsof crash the Solaris kernel?
+17.22   Why does lsof on Solaris 7, 8, or 9 report a kvm_open()
+	failure?
+17.23	Solaris and SAM-FS
+17.23.1	Why does Solaris lsof report "(limited SAM-FS info)"?
+17.23.2	Why can't lsof locate named SAM-FS files?
+17.24	Lsof and Solaris 10 zones
+17.24.1	How can I make lsof list the Solaris zone?
+17.24.2	Why doesn't lsof work in a Solaris 10 zone?
+17.24.3 Why does lsof complain it can't stat() Solaris 10 zone file
+	systems?
+17.25	Solaris 10 problems
+17.25.1 Why does Solaris 10 lsof sometimes report the wrong path name?
+17.25.2 Why does Solaris 10 lsof sometimes report only the mounted-on
+	directory and device?
+17.25.3 What does "(deleted)" mean in the NAME column of a Solaris 10
+	open file?
+17.25.4 What does "(?)" mean in the NAME column of a Solaris 10 open
+	file?
+17.26	Solaris contract file problems
+17.26.1	Why doesn't lsof report size, link count and node number for
+	Solaris 10 contract files?
+17.26.2 Why can't lsof locate a Solaris 10 contract file by path name?
+17.27	Solaris 10 ZFS probblems
+17.27.1	Why does Configure ask for the location of ZFS header files?
+17.27.2 Why do -h and -v output warn about possibly inaccurate ZFS
+	structure definitions?
+17.27.3 Why don't the Open Solaris ZFS header files provide correct
+	ZFS kernel structure definitions?
+17.28	Problems with Solaris 9 and above
+17.28.1	Why does the compiler complain about lgrp_root on Solaris 9
+	and above?
+
+18.0	Lsof Features
+18.1	Why doesn't lsof doesn't report on /proc entries on my
+	system?
+18.2	How do I disable the device cache file feature or alter
+	it's behavior?
+18.2.1	What's the risk with a perverted device cache file?
+18.2.2	How do I put the full host name in a personal device cache file
+	path?
+18.2.3	How do I put the personal device cache file in /tmp?
+18.3	Why doesn't lsof know about AFS files on my favorite dialect?
+18.3.1	Why doesn't lsof report node numbers for all AFS volume files,
+	or how do I reveal dynamic module addresses to lsof?
+______________________________________________________________________
+
+
+1.0	General Concepts
+
+1.1	Lsof -- what is it?
+
+	Lsof is a UNIX-specific tool.  Its name stands for LiSt
+	Open Files, and it does just that.  It lists information
+	about files that are open by the processes running on a
+	UNIX system.
+
+	See the lsof man page, the 00DIST file, the 00QUICKSTART
+	file, and the 00README file of the lsof distribution for
+	more information.
+
+1.2	Where do I get lsof?
+
+	Lsof is available via anonymous ftp from lsof.itap.purdue.edu.
+	Look in the pub/tools/unix/lsof sub-directory.
+
+	    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof
+
+	Bzip2'd, compressed and gzip'd tar files with GPG certificates
+	are available.
+
+1.2.1	Are there mirror sites?
+
+	On April 28, 2009 these sites appeared to have the lastest
+	lsof revision:
+
+	ftp://ftp.fu-berlin.de/pub/unix/tools/lsof
+	ftp://sunsite.ualberta.ca/pub/Mirror/lsof
+
+1.2.2	Are lsof executables available?
+
+	Some lsof executables are available in the subdirectory
+	tree pub/tools/unix/lsof/binaries  These are neither guaranteed
+	to be current nor cover every dialect and machine architecture.
+
+	I don't recommend you use pre-compiled lsof binaries; I
+	recommend you obtain the sources and build your own binary.
+	Even if you're a Sun user without a Sun C compiler, you
+	can use gcc to compile lsof.
+
+	If you must use a binary file, please be conscious of the
+	security and configuration implications in using an executable
+	of unknown or different origin.  The lsof binaries are
+	accompanied by GPG certificates.  Please use them!
+
+	Three additional cautions apply to executables:
+
+	1.  Don't try to use an lsof executable, compiled for one
+	    version of a UNIX dialect, on another.  Patches can
+	    make the dialect version different.
+
+	2.  If you want to use an lsof binary on multiple systems,
+	    they must be running the same dialect OS version and
+	    have the same patches and feature support.
+
+1.2.3	How do I check the validity of an lsof distribution?
+
+	There are two ways to check the validity of an lsof
+	distribution:
+
+	1.  Follow the instructions in the CHECKSUMS_<revision>
+	    file found with the lsof distribution.
+
+	    Checking with GPG is the best method.
+
+	2.  Follow the instructions in the "Security" section of the
+	    README.lsof_<revision> file found inside the lsof
+	    distribution.
+
+	    Again, checking with GPG is the best method.
+
+1.2.4	Why can't I get the sum(1) result reported in
+	README.lsof_<revision>?
+
+	The "Security" section of the README.lsof_<revision> file found
+	inside the lsof distribution gives md5, sum, and GPG certificate
+	information.
+
+	The simplest, the sum(1) signature, seems to be the trickiest.
+	That's because there are different sum(1) methods, BSD systems
+	usually have cksum(1) instead of sum(1), and different systems
+	compute the block size value differently.
+
+	First, the lsof sum results are computed with the old,
+	"alternate" algorithm.  On newer systems, you can use sum's
+	"-r" option to get that computation result.
+
+	Second, on BSD systems you usually must use cksum(1) instead
+	of sum(1), because they have no sum(1).  To tell cksum(1)
+	to use the old, "alternate" algorithm, use its "-o1" option.
+
+	Third, the second value that sum reports, the block count, may
+	be computed differently on different systems -- usually block
+	size is considered to be 512 or 1,024.  The lsof block counts
+	were computed on a system with a sum(1) option that considers
+	block size to be 512.  The BSD system cksum(1) -o1 option
+	considers block size to be 1,024.  If your sum(1) or cksum(1)
+	doesn't report a block count that matches the sum(1) signature
+	given in README.lsof_<revision>, check its man page to see what
+	block size it uses, then adjust its reported block count
+	appropriately.
+
+1.2.5	Why won't gpg accept the lsof-signing PGP public key?
+
+	An older PGP key that once signed lsof distributions is
+	included in lsof revisions prior to 4.70.  The PGP key is
+	indeed my key, but is incompatible with GPG.  It was created
+	about ten years ago and is still acceptable to PGP versions
+	2.6.2 through 6.5.2.
+
+	Lsof revisions 4.70 and above are signed with a copy of my PGP
+	key that has been made acceptable for use with GPG by importing
+	it under GPG's "--allow-non-selfsigned-uid" option.
+
+	You can find my GPG compatible key in lsof revisions 4.70 and
+	above and at:
+
+	    ftp://lsof.itap.purdue.edu/pub/Victor_A_Abell.gpg
+
+	If you have an older lsof revision with my PGP key, there are
+	two possible ways to use it:
+
+	* Use it with a PGP version from 2.6.2 through 6.5.2.
+
+	* Use GPG's "--allow-non-selfsigned-uid" option when you
+	  import my PGP key into your GPG key ring.
+
+	  $ gpg --allow-non-selfsigned-uid --import Victor_A_Abell.pgp
+
+1.3	Where can I get more lsof documentation?
+
+	A significant set of documentation may be found in the lsof
+	distribution (See "Where can I get lsof?).  There is a
+	manual page, copious documentation in files whose names
+	begin with 00, and a copy of this FAQ in the file 00FAQ
+	(perhaps slightly less recent than this file if you're
+	reading it via a web browser.)
+
+	Two URLs provide some documentation that appears in the
+	lsof distribution:
+
+	FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
+
+	man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
+
+1.4	How do I report an lsof bug?
+
+	If you believe you have discovered a bug in lsof, you can
+	report it via e-mail to <abe@purdue.edu>.  Do NOT report lsof
+	bugs to the UNIX dialect vendor. Make sure "lsof" appears in
+	the "Subject:" line so my e-mail filter won't classify your
+	letter as Spam.
+
+	Before you send me a bug report, please read the "Bug Reports"
+	section of the 00README file of the lsof distribution.  It
+	lists the steps you should take before and when reporting a
+	suspected bug.
+
+1.5	Where can I get the lsof FAQ?
+
+	This lsof FAQ is available in the file 00FAQ in the lsof
+	distribution and at the URL:
+
+	    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
+
+1.5.1	How timely is the on-line FAQ?
+
+	The on-line FAQ is sometimes too timely.  :-)
+
+	I update it as soon as new information is available.   That may
+	include information about support that won't appear in the lsof
+	source distribution until the next revision.  If you encounter
+	something like that, please send me e-mail at <abe@purdue.edu>.  I
+	may be able to point you at a pre-release distribution that contains
+	the support of interest.  Make sure "lsof" appears in the "Subject:"
+	line so my e-mail filter won't classify your letter as Spam.
+
+1.6	Is there a test suite?
+
+	Yes, as of lsof revision 4.63 there's an automated lsof
+	test suite in the tests/ sub-directory of the lsof top-level
+	directory.
+
+	More information on using the test suite, what it does,
+	how to use it and how to configure it may be found in the
+	00TEST file of the lsof distribution.  That file also
+	explains where the test suite has been tested.
+
+	Frequently asked questions about the test suite will be
+	asked and answered here in the FAQ.  (See "Test Suite
+	Problems.")
+
+	After lsof has been configured with the Configure script,
+	lsof can be made and tested with:
+
+	    $ make
+	    $ cd tests
+	    $ make
+
+	Under normal conditions -- i.e., unless the lsof tree has
+	been cleaned or purged severely -- all tests or individual
+	tests may be run by:
+
+	    $ cd test
+	    $ make
+	 or
+	    $ <run a single test>	(See 00TEST.)
+
+1.7	Is lsof vulnerable to the standard I/O descriptor attack?
+
+	Lsof revisions 4.63 and above are not vulnerable.
+
+	Lsof revisions 4.62 and below are vulnerable, but no damage
+	scenarios have so far been demonstrated.
+
+	The standard I/O descriptor attack is a local programmed
+	assault on setuid and setgid programs that tricks them into
+	opening a sensitive file with write access on a standard
+	descriptor, usually stderr (2), and writing error messages
+	to stderr.  If the attacker can control the content of the
+	error message, the attacker may gain elevated privileges.
+
+	The attack was first described in Pine Internet Advisory
+	PINE-CERT-20020401, available at:
+
+	    http://www.pine.nl/advisories/pine-cert-20020401.txt
+
+	If you are using an lsof revision below 4.63, you should
+	remove any setuid or setgid permissions you might have
+	given its executable.  Then you should upgrade to lsof
+	revision 4.63.
+
+1.8	Can I alter lsof's make(1) behavior?
+
+	Yes.  There are at least two ways to do that.
+
+	You can put replacements for lsof Makefile strings in your
+	environment.  If you specify the -e make option, make will
+	give environment variable values precedence over strings
+	from the Makefile.  For example, to change the compiler
+	string CC from the environment, you might do this with the
+	Bourne shell:
+
+	    $ CC=foobar; export CC
+	    $ make -e
+
+	You can also replace lsof Makefile strings in the make
+	command invocation.  Here's the previous example done that
+	way:
+
+	    $ make CC=foobar
+
+	Changing the CFGF, CFGL, and DEBUG strings used in lsof
+	Makefiles, either from the environment or from the make
+	invocation, can significantly alter lsof make(1) behavior.
+	I commonly use DEBUG to change the -O option to -g so I
+	can build an lsof executable for debugging -- e.g.,
+
+	    $ make DEBUG=-g
+	
+	(Look for DEBUG in this FAQ for other examples of its use.)
+
+	Consult the Makefiles to see what CFGL, CFGL, and other
+	lsof Makefile strings contain, and to see what influence
+	their alteration might have on lsof make(1) behavior.
+
+1.9	Is there an lsof license?
+
+	No.
+
+	The only restriction on the use or redistribution of lsof
+	is contained in this copyright statement, found in every
+	lsof source file.  (The copyright year in or format of the
+	notice may vary slightly.)
+
+	/*
+	 * Copyright 2002 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.
+	 */
+
+1.10	Language locale support
+
+1.10.1	Does lsof support language locales?  How do I use the support?
+
+	Most UNIX dialect versions of lsof support 8 bit language
+	locale characters -- e.g., the ability to print 8 bit
+	characters that have accents and other marks over them.
+	
+	See the answer to the "Does lsof support wide characters in
+	language locales?" question for information on when lsof's
+	language locale support covers characters wider than 8 bits.
+
+	To see if lsof supports language locales for your dialect, look
+	in the dialect's machine.h header file for the HASSETLOCALE
+	definition.  If it is present and not disabled, then lsof has
+	language locale support for the dialect.
+
+	To enable lsof's language locale support, you must specify in a
+	locale environment variable (e.g., LANG) a language locale
+	known to your system that supports the printing of marked
+	characters -- e.g, en_US.  (On some dialects locale(1) may be
+	used to list the known language locales.)
+
+	Note that LANG=C and LANG=POSIX are NOT language locales that
+	support the printing of marked characters.
+
+	If the language locale doesn't support the printing of marked
+	characters, lsof's OUTPUT of them follows the rules for
+	non-printable characters described in the OUTPUT section of
+	lsof(8).
+
+	Consult your dialect's setlocale(3) man page for the names of
+	environment variables other than LANG  -- e.g., LC_ALL,
+	LC_TYPE, etc. -- which may be used to define language locales.
+
+1.10.2	Does lsof support wide characters in language locales?
+
+	When lsof's language locale support is enabled with the
+	HASSETLOCALE definition, for selected dialects lsof will also
+	print wide characters (e.g., from UTF-8) when iswprint(3)
+	reports them to be printable.
+
+	Wide character support is available when HASWIDECHAR is defined
+	in a dialect's machine.h header file.  As of this writing on
+	July 22, 2004, the following dialect versions have wide character
+	support:
+
+	    AIX >= 4.3.2
+	    Apple Darwin >= 7.3.0
+	    FreeBSD >= 5.2
+	    HP-UX >= 11.00
+	    /proc-based Linux
+	    NetBSD >= 1.6
+	    SCO OpenServer >= 5.0.6
+	    Solaris >= 2.6
+	    Tru64 UNIX 5.1
+
+1.11	Are any files in the lsof distribution copyrighted?
+
+	Yes.  Most files carry the copyright of the Purdue Research
+	Foundation and may be redistributed under the terms that
+	accompany the copyright notice.  Those terms may also be found
+	in the answer to the question, "Is there an lsof license?")
+
+	A few files carry other copyright notices.  Some are BSD
+	notices and they explain the terms under which they are
+	included in the lsof distribution.
+	
+	Those that carry vendor copyright notices have been reproduced
+	in their original or modified forms with permission from the
+	copyright owners.  That permission is indicated in the README
+	files that accompany the files.
+
+1.12	Are there other lsof-related resources?
+
+	There are other resources available, connected to lsof.  Among
+	them are FreeBSD and Linux packages whose products use lsof and
+	two particularly interesting resources.
+
+	The two interesting resources are a Gnome Tool Kit (GTK) GUI
+	for lsof and a Perl wrapper module.
+
+	The GTK GUI is called Glsof and was developed by Gnele.  It can
+	be found at:
+
+	    http://www.sourceforge.net
+
+	The Perl wrapper module by Marc Beyer can be found at:
+
+	    http://search.cpan.org/dist/Unix-Lsof/
+
+1.13	What does the "WARNING: unsupported dialect or version" mean?
+
+	The lsof configure script issues that message for UNIX dialects
+	or their versions where I have been unable to test the current
+	revision of lsof.  The message doesn't mean that lsof won't
+	work, just that I have no direct evidence that it will.
+
+	If the COnfigure script succeeds, except for the warning, try
+	compiling) lsof.  If that succeeds, try the lsof test suite.
+
+2.0	Lsof Ports
+
+2.1	What ports exist?
+
+	The pub/lsof.README file carries the latest port information:
+
+	    AIX 5.[23] and 5.3
+	    FreeBSD 4.9 and 6.4 for x86-based systems
+	    FreeBSD 8.[02] for AMD64-based systems
+	    Linux 2.1.72 and above for x86-based systems
+	    Solaris 9, 10 and 11
+
+	In the above list the only UNIX dialects present are ones for
+	which I test the current lsof revision.  Lsof may still support
+	unlisted dialect versions -- e.g., HP-UX 10.20, Solaris 7, etc.
+	-- but I don't have access to systems where I could test lsof
+	on them, so I can't claim lsof works on them. If your dialect
+	isn't in the list, you should try building lsof on it anyway.
+
+	Lsof version 4 predecessors, versions 2 and 3, may support older
+	version of some dialects.  Contact me via e-mail at <abe@purdue.edu>
+	if you're interested in their distributions.  Make sure "lsof"
+	appears in the "Subject:" line so my e-mail filter won't classify
+	your letter as Spam.
+
+2.2	What about a new port?
+
+	The 00PORTING file in the distribution gives hints on doing
+	a port.  I will consider doing a port in exchange for
+	permanent access to a test host.  I require permanent access
+	so I can test new lsof revisions, because I will not offer
+	distributions of dialect ports I cannot upgrade and test.
+
+2.2.1	User-contributed Ports
+
+	Sometimes I receive contributions of ports of lsof to
+	systems where I can't test future revisions of lsof.  Hence,
+	I don't incorporate these contributions into my lsof
+	distribution.
+
+	However, I do make descriptions of these contributions
+	available.  You can find them in the 00INDEX and README
+	files at:
+
+	    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/contrib
+
+	Consult the 00INDEX file in the contrib/ directory for a
+	list of the available contributions and consult README
+	there for information on how to obtain them.
+
+2.3	Why isn't there an AT&T SVR4 port?
+
+	I haven't produced an AT&T SVR4 port because I haven't seen
+	a UNIX dialect that is strictly limited to the AT&T System
+	V, Release 4 source code.  Every one I have seen is a
+	derivative with vendor additions.
+
+	The vendor additions are significant to lsof because they
+	affect the internal kernel structures with which lsof does
+	business.  While some vendor derivatives of SVR4 are similar,
+	each one I have encounted so far has been different enough
+	from its siblings to require special source code.
+
+	If you're interested in an SVR4 version of lsof, here are
+	some existing ports you might consider:
+
+	    DC/OSx (This obsolete port is only available upon
+		    special request.)
+	    Reliant UNIX (This obsolete port is only available
+			  upon special request.)
+	    SCO|Caldera UnixWare (This is the most likely choice.)
+	    Solaris
+
+2.4	Why isn't there an SGI IRIX port?
+
+	Lsof support for IRIX was terminated at lsof revision 4.36,
+	because it had become increasingly difficult for me to
+	obtain information on the IRIX kernel structures lsof needs
+	to access.
+
+	At IRIX 6.5 I decided the obstacles were too large for me
+	to overcome, and I stopped supporting lsof on IRIX.  I have
+	sources to the last revision of lsof (4.36) for IRIX, but
+	that version of lsof does not work on IRIX 6.5 and is
+	vulnerable to the standard I/O descriptor attack.  (See
+	the "Is lsof vulnerable to the standard I/O descriptor
+	attack?" Q&A for more information.) Contact me to discuss
+	obtaining those sources.
+
+	If you wish to pursue the issue, don't contact me, contact
+	SGI.  This case was opened with SGI on the subject:
+
+	    Case ID:	0982584
+	    Category: Unix
+	    Priority: 30-Moderate Impact
+
+	    Problem Summary:
+	    kernel structure header files needed for continued lsof
+	    support
+
+	    Problem Description:
+	    Email In  07/17/98 19:09:23
+
+2.5	Why does lsof's Configure script report "WARNING: unsupported
+	dialect or version"?
+
+	Lsof's Configure script issues this message when it encounters
+	a dialect or its version that lsof once supported, but no
+	longer does.  Usually I drop support for a dialect or version
+	when I can no longer test lsof on it.
+
+	However, it's worth trying to compile and use lsof.  Be sure to
+	run the test suite.  (See the answer to the "Is there a test
+	suite?  question for information on the test suite.)
+
+	If you have problems with an unsupported dialect or version,
+	contact me via e-mail at <abe@purdue.edu> and I may be able to help.
+	Make sure "lsof" appears in the "Subject:" line so my e-mail filter
+	won't classify your letter as Spam.
+
+
+3.0	Lsof Problems
+
+3.1	Configuration Problems
+
+3.1.1	Why can't Configure determine the UNIX dialect version?
+
+	The lsof Configure script uses UNIX shell commands, often in a
+	command pipeline, to determine the UNIX dialect version.
+	(Consult the dialect stanza in Configure to determine which
+	commands are used.)  If Configure can't determine the dialect
+	version, probably one of the commands is not behaving as
+	Configure expects.
+
+	Symptoms of the failure include Configure warning messages and
+	incorrect version definitions in the Makefile CFLAGS.
+
+	If you suspect that the lsof Configure script is failing to
+	determine the dialect version correctly, try running the
+	commands from Configure stanza one at a time.  That will
+	usually reveal the source of the problem.  Be particularly
+	mindful that the PATH environment variable can cause commands
+	to be executed from non-standard directories.
+
+	If you can't determine the source of the problem, there is a
+	work-around.  You can supply the UNIX dialect version in the
+	LSOF_VSTR environment variable.  Use Configure as a guide to
+	forming what it expects in LSOF_VSTR.  There is also some
+	information on  LSOF_VSTR in the 00XCONFIG documentation file
+	of the lsof distribution.
+
+3.2	Compilation Problems
+
+3.2.1	Why does the compiler complain about missing header files?
+
+	When you use make to build lsof, the compiler may complain
+	that it can't find header files -- e.g.,
+
+	    $ make
+	    (cd lib; make DEBUG="-O" CFGF="-DAIXA=0 -DAIXV=4330 \
+	    -DLSOF_VSTR=\"4.3.3.0\"")
+	    gcc  -DAIXA=0 -DAIXV=4330 -DLSOF_VSTR="4.3.3.0" -O \
+	    -c ckkv.c
+	    In file included from ckkv.c:33: ../machine.h:70: \
+	    sys/types.h: A file or directory in the path name \
+	    does not exist. \
+
+       That type of complaint doesn't represent an lsof problem.
+       It represents a problem with a missing system header file
+       that probably should be found in /usr/include or in the
+       system source tree.
+
+       As a first step try using find(1) to locate the problem
+       header file.  If it's a system header file and can't be
+       found, here are some possible causes:
+
+	1. The file set, RPM or package containing the header files
+	   has not been installed.  Instructions for doing that
+	   are specific to the UNIX dialect and beyond the scope
+	   of this document.
+
+	2. If the compiler is gcc, the private gcc header files:
+
+	   * May not have been installed;
+	   
+	   * May have been installed incorrectly;
+	   
+	   * May not have been updated properly after the last
+	     compiler or system update;
+	     
+	   * Ones from a previous installation may not have been
+	     removed.
+	     
+	   A path leading to the gcc private header files can be
+	   found with `gcc -v`.  Consult the gcc documentation for
+	   instructions on proper installation of the private gcc
+	   header files.
+
+	3. On some dialects -- e.g., FreeBSD, NetBSD, OpenBSD --
+	   lsof may need to use header files that are located in
+	   the system source tree -- /sys or /usr/src/sys, for
+	   example.  Make sure the system source tree has been
+	   installed.
+
+3.2.2   Why does gcc complain about the contents of header files
+	distributed by the system's vendor?
+
+	When you use make to build lsof and gcc to compile it, gcc
+	may complain that it finds errors in system header files
+	-- e.g.,
+
+	    $ make
+	    (cd lib; make DEBUG="-O" CFGF="-Dsolaris=80000 \
+	     -DHASPR_GWINDOWS -m64 -DHASIPv6 -DHAS_VSOCK \
+	     -DLSOF_VSTR=\"5.8\"")
+	     gcc -Dsolaris=80000  -DHASPR_GWINDOWS -m64 -DHASIPv6 \
+	     -DHAS_VSOCK -DLSOF_VSTR="5.8"  -O  -c  dvch.c
+	    In file included from /usr/include/sys/proc.h:31, \
+             from /homes/abe/gnu/gcc-3.2.1/lib/gcc-lib/sparcv9-sun-solaris2/ \
+	     3.2.1/include/sys/user.h:267, from /usr/include/kvm.h:13, \
+	     from ../dlsof.h:53, from ../lsof.h:172, from dvch.c:43: \
+	     /homes/abe/gnu/gcc-3.2.1/lib/gcc-lib/sparcv9-sun-solaris2/\
+	      3.2.1/include/sys/task.h:59: parse error before "uint_t"
+
+	Errors like the above are most likely not problems in the
+	system's header files, but in the private copies of them
+	that were created when gcc was made or installed.  Note
+	the presense of
+	".../gcc-3.2.1/lib/gcc-lib/sparcv9-sun-solaris2/3.2.1/include/..."
+	in the paths for user.h and task.h.  It indicates both
+	header files are gcc-specific.
+
+	To solve errors like this requires comparing the header
+	files in the vendor's /usr/include tree to the gcc-specific
+	ones in gcc's private gcc-lib/.../include tree.  It may be
+	necessary to regenerate gcc-specific header files, correct
+	them or remove them.  See the gcc distribution for the
+	appropriate tools.
+
+	A possible temporary work-around is to direct gcc to use
+	the vendor's header files instead of its temporary ones by
+	declaring -I/usr/include in the compilation flags.
+
+3.2.3	Other header file problems
+
+	Don't overlook any vendor tools that might validate the
+	vendor header files installed on the system  -- e.g., the
+	Solaris pkgchk tool can be used to check the header files
+	that were installed from the SUNWhea package.
+
+	For other header file problems contact me at <abe@purdue.edu>.
+	Please follow the reporting guidelines in the "How do I
+	report an lsof bug?" section of this FAQ.
+
+3.3	Why doesn't lsof report full path names?
+
+	Lsof reports the full path name when it is specified as a
+	search argument for open files that match the argument.
+	However, if the argument is a file system mounted-on
+	directory, and lsof finds additional path name components
+	from the kernel name cache, it will report them.
+
+	Lsof reports path name for file system types that have path
+	name lookup features -- e.g., some versions of AdvFS for
+	Digital and Tru64 UNIX.  The Linux /proc-based lsof reports
+	full path names, because the Linux /proc file system provides
+	them.  Lsof on recent builds of Solaris 10 also report full
+	path names, because those Solaris kernels record the full path
+	name in the vnode structure.
+
+	Otherwise, lsof uses the kernel name cache, where it exists
+	and can be accessed, and reports some or all path name
+	components (e.g., the sys and proc.h components of
+	/usr/include/sys/proc.h) for these dialects:
+
+		Apple Darwin
+		DC/OSx
+		FreeBSD
+		HP-UX, /dev/kmem and PSTAT based
+		Linux, /dev/kmem-based
+		NetBSD
+		NEXTSTEP
+		OpenBSD
+		OPENSTEP
+		Reliant UNIX
+		SCO OpenServer
+		SCO|Caldera UnixWare
+		Solaris 2.x, 7, 8 and 9 (except for some VxFS versions;
+					 see the "Why doesn't Solaris
+					 lsof report VxFS path name
+					 components?" section for more
+					 information)
+		Solaris 10 (early builds) Tru64 UNIX
+
+	As far as I can determine, AFS path lookups don't share in
+	kernel name cache operations, so lsof can't identify open AFS
+	path name components.  Apparently Solaris VxFS versions 4 and
+	above don't share in kernel name cache operations, either, so
+	lsof can't display path name components for those open files.
+
+	Since the size of the kernel name cache is limited and the
+	cache is in constant flux, it does not always contain the names
+	of all components in an open file's path; sometimes it contains
+	none of them.
+
+	Lsof reports the file system directory name and whatever
+	components of the file's path it finds in the cache, starting
+	with the last component and working backwards through the
+	directories that contain it.  If lsof finds no path
+	components, lsof reports the file system device name instead.
+
+	When lsof does report some path components in the NAME
+	column, it prefixes them with the file system directory
+	name, followed by " -- ", followed by the components --
+	e.g., /usr -- sys/path.h for /usr/include/sys/path.h.  The
+	" -- " is omitted when lsof finds all the path name components
+	of a file's name.
+
+	The PSTAT-based HP-UX lsof relies on kernel name cache
+	contents, too, even though its information comes to lsof
+	via pstat() function calls.  Consequently, PSTAT-based
+	HP-UX lsof won't always report full paths, but may use the
+	" -- " partial path name notation, or may occasionally
+	report no path name at all but just the file system mounted-on
+	directory and device names.
+
+	Lsof can't obtain path name components from the kernel name
+	caches of the following dialects:
+
+	    AIX
+
+	Only the Linux kernel records full path names in the
+	structures it maintains about open files; instead, most
+	kernels convert path names to device and node number doublets
+	and use them for subsequent file references once files have
+	been opened.
+
+	To convert the device and node number doublet into a
+	complete path name, lsof would have to start at the root
+	node (root directory) of the file system on which the node
+	resides, and search every branch for the node, building
+	possible path names along the way.  That would be a time
+	consuming operation and require access to the raw disk
+	device (usually implying setuid-root permission).
+
+	If the prospect of all that local disk activity doesn't
+	concern you, think about the cost when the device is
+	NFS-mounted.
+
+	Try using the file system mount point and node number lsof
+	reports as parameters to find -- e.g.,
+
+	    $ find <mount_point> -inum <node_number> -print
+
+	and you may get an appreciation of what a file system
+	directory tree search would cost.
+
+3.3.1	Why do lsof -r reports show different path names?
+
+	When you run lsof with its repeat (``-r'') option, you may
+	notice that the extent to which it reports path names for
+	the same files may vary from cycle to cycle.  That happens
+	because other processes are making kernel calls affecting
+	the cache and causing entries to be removed from and added
+	to it.
+
+3.3.2	Why does lsof report the wrong path names?
+
+	Under some circumstances lsof may report an incorrect path
+	name component, especially for files in a rapidly changing
+	directory like /tmp.
+
+	In a rapidly changing directory, like /tmp, if the kernel
+	doesn't clear the cache entry when it removes a file, a
+	new file may be given the same keys and lead lsof to believe
+	that the old cache entry with the same keys belongs to the
+	new file.
+
+	Lsof tries to avoid this error by purging duplicate entries
+	from its copy of the kernel name cache when they have the
+	same device and inode number, but different names.
+
+	This error is less likely to occur in UNIX dialects where the
+	keys to the name cache are node address and possibly a
+	capability ID.  The Apple Darwin, Digital UNIX, FreeBSD, HP-UX,
+	NEXTSTEP, OPENSTEP, Solaris, Tru64 UNIX, and UnixWare dialects
+	use node address.  Apple Darwin, FreeBSD, NetBSD, OpenBSD,
+	Tru64 UNIX, and also use a capability ID to further identify
+	name cache entries.
+
+3.3.3	Why doesn't lsof report path names for unlinked (rm'd) files?
+
+	When lsof gets path name components from the kernel's name
+	cache, it does not report the path names of a file that has
+	been unlinked from its parent directory -- e.g., deleted via
+	rm, or the unlink() system call -- even when some process may
+	still hold the file open; lsof reports only the file system's
+	mounted-on directory and device.  That's because path name
+	components are removed from the kernel name cache when the file
+	is unlinked.
+
+	Unlinked open files are sometimes used by applications for
+	temporary, but invisible storage (i.e., ls won't show them,
+	and no other process can open them.)  However, they may
+	occasionally consume disk space to excess and cause concern
+	for a system administrator, who will be unable to locate
+	them with find, ls, du, or other tools that rely on finding
+	files by examining the directory tree.
+
+	By using lsof's +L option you can see the link count of
+	open files -- in the NLINK column.  An unlinked file will
+	have an NLINK value of zero.  By using the option +L1 you
+	can tell lsof to display only files whose link count is
+	less than one (i.e., zero).
+
+	There are some UNIX dialect-specific exceptions to lsof's
+	inability to report unlinked path names.  They are described in
+	the answer to the "When will lsof report path names for deleted
+	files?" question.
+
+3.3.4	Why doesn't lsof report the "correct" hard linked file path
+	name?
+
+	When lsof reports a rightmost path name component for a
+	file with hard links, the component may come from the
+	kernel's name cache.  Since the key which connects an open
+	file to the kernel name cache may be the same for each
+	differently named hard link, lsof may report only one name
+	for all open hard-linked files.   Sometimes that will be
+	"correct" in the eye of the beholder; sometimes it will
+	not.  Remember, the file identification keys significant
+	to the kernel are the device and node numbers, and they're
+	the same for all the hard linked names.
+
+3.3.5	When will lsof report path names for deleted files?
+
+	Lsof will report path names for deleted files for two
+	dialects:  Linux and later builds of Solaris 10.
+
+	Deleted Linux path names are reported by default and have
+	"(deleted)" at their ends.
+
+	The display of Solaris 10 deleted path names may be selected
+	with the -X option.  When selected they are also reported with
+	"(deleted)" at their ends.
+
+3.4	Why is lsof so slow?
+
+	Lsof may appear to be slow if network address to host name
+	resolution is slow.  This can happen, for example, when the
+	name server is unreachable, or when a Solaris PPP cache daemon
+	is malfunctioning.
+
+	To see if name lookup is causing lsof to be slow, turn it off
+	with the ``-n'' option.
+
+	Port service name lookup or portmap registration lookup may
+	also be causes of slow-down.  To suppress port service name
+	lookup, specify the ``-P'' option.
+
+	Lsof doesn't usually make direct portmap calls -- only when +M
+	is specified, or when HASPMAPENABLED is defined during lsof
+	construction.  (The lsof help panel, produced with `lsof -h`
+	will display the default portmap registration reporting
+	state.)  The quickest first step in checking if lsof is slow
+	because of the portmapper is to use lsof's ``-M'' option.
+
+	Lsof may be slow if UID to login name lookups are slow.
+	Suppress them with ``-l''.
+
+	On dialects where lsof uses the kernel name cache, try
+	disabling its use with ``-C''.  (You can tell if lsof uses the
+	kernel name cache by looking for ``-C'' in lsof's ``-h''
+	output.)  Of course, disabling kernel name cache use will mean
+	that lsof won't report full or partial path names, just file
+	system and character device names.
+
+	If you're just interested in the open files of one process, try
+	using the ``-p <Process-ID>'' option to limit lsof to that
+	process.  (The ``-p'' option may also be followed with a list
+	of Process-IDs.)
+
+	If you're interested in including or excluding certain
+	commands, try lsof's "-c[^]cmd" option.
+
+	If you're interested in certain Internet TCP and UDP states
+	(e.g., ESTABLISHED) or in excluding some (e.g., CLOSE_WAIT), try
+	lsof's "-s p:s" option.  More information on it may be found in
+	the answer to the "How are protocol state name exclusion and
+	inclusion used?" question.
+	
+	Your UNIX dialect may not support "-s p:s" and its associated
+	performance improvments to Internet-only file processing.  You
+	can find more information on those topics in the answer to the
+	"Why doesn't my dialect support state name exclusion and
+	inclusion?" question.
+
+	Older AIX lsof may be slow to start because of its oslevel
+	identity comparison.  (Newer AIX lsof uses uname(2).)  See the
+	"Why does AIX lsof start so slowly?" and "Why does lsof warn
+	"compiled for x ... y; this is z.?" sections for more
+	information.
+
+3.5	Why doesn't lsof's setgid or setuid permission work?
+
+	If you install lsof on an NFS file system that has been
+	mounted with the nosuid option, lsof may not be able to
+	use the setgid or setuid permission you give it, complaining
+	it can't open the kernel memory device -- e.g., /dev/kmem.
+
+	The only solution is to install lsof on a file system that
+	doesn't inhibit setgid or setuid permission.
+
+3.6	Does lsof have security problems?
+
+	I don't think so.  However, lsof does usually start with
+	setgid permission, and sometimes with setuid-root permission.
+	Any program that has setgid or setuid-root permission,
+	should always be regarded with suspicion.
+
+	Lsof drops setgid power, holding it only while it opens
+	access to kernel memory devices (e.g., /dev/kmem, /dev/mem,
+	/dev/swap).  That allows lsof to bypass the weaker security
+	of access(2) in favor of the stronger checks the kernel
+	makes when it examines the right of the lsof process to
+	open files declared with -k and -m.  Lsof also restricts
+	some device cache file naming options when it senses the
+	process has setuid-root power.
+
+	On a few dialects lsof requires setuid-root permission
+	during its full execution in order to access files in the
+	/proc file system.  These dialects include:
+
+	    DC/OSx 1.1 for Pyramid systems
+	    Reliant UNIX 5.4[34] for Pyramid systems
+
+	When lsof runs with setuid-root permission it severely
+	restricts all file accesses it might be asked to make with
+	its options.
+
+	The device cache file (typically .lsof_hostname in the home
+	directory of the real user ID that executes lsof) has 0600
+	modes.  (The suffix, hostname, is the first component of
+	the host's name returned by gethostname(2).)  However, even
+	when lsof runs setuid-root, it makes sure the file's
+	ownerships are changed to that of the real user and group.
+	In addition, lsof checks the file carefully before using
+	it (See the question "How do I disable the device cache
+	file feature or alter it's behavior?" for a description of
+	the checks.); discards the file if it fails the scrutiny;
+	complains about the condition of the file; then rebuilds
+	the file.
+
+	See the 00DCACHE file of the lsof distribution for more
+	information about device cache file handling and the risks
+	associated with the file.
+
+3.7	Will lsof show remote hosts using files via NFS?
+
+	No.  Remember, lsof displays open files for the processes
+	of the host on which it runs.  If the host on which lsof
+	is running is an NFS server, the remote NFS client processes
+	that are accessing files on the server leave no process
+	records on the server for lsof to examine.
+
+3.8	Why doesn't lsof report locks held on NFS files?
+
+	Generally lock information held by local processes on remote
+	NFS files is not recorded by the UNIX dialect kernel.  Hence,
+	lsof can't report it.
+
+	One exception is some patch levels of Solaris 2.3, and all
+	versions of Solaris 2.4 and above.  Lsof for those dialects
+	does report on locks held by local processes on remotely
+	mounted NFS files.
+
+3.8.1	Why does lsof report a one byte lock on byte zero as a full
+	file lock?
+	
+	When a process has a lock of length one, starting at byte
+	zero, lsof can't distinguish it from a full file lock.
+	That's because most UNIX dialects represent both locks the
+	same way in their file lock (flock or eflock) structures.
+
+3.9	Why does lsof report different values for open files on the
+	same file system (the automounter phenomenon)?
+
+	On UNIX dialects where file systems may be mounted by an
+	automounter with the ``direct'' type, lsof may sometimes
+	report difference DEVICE, SIZE/OFF, INODE and NAME values
+	when asked to report files open on the file system.
+
+	This happens because some files open on the file system --
+	e.g., the current directory of a shell that changed its
+	directory to the file system as the file system's first
+	reference -- may be characterized in the kernel with
+	temporary automounter node information.  The cd doesn't
+	cause the file system to be mounted.
+
+	A subsequent reference to the file system -- e.g., an ls
+	of any place in it -- will cause the file system to be
+	mounted.  Processes with files open to the mounted file
+	system are characterized in the kernel with data that
+	reflects the mounted file system's parameters.
+
+	Unfortunately some kernels (e.g., some versions of Solaris
+	2.x) don't revisit the process that did only a change-directory
+	for the purpose of updating the data associated with the
+	open directory file.  The file continues to be characterized
+	with temporary automounter information until it does another
+	directory change, even a trivial ``cd .''.
+
+	Lsof will report on both reference types, when supplied
+	the file system name as an argument, but the data lsof
+	reports will reflect what it finds in the kernel.  For the
+	different types lsof will display different data, including
+	different major and minor device numbers in the DEVICE
+	column, different lengths in the SIZE/OFF column, different
+	node numbers in the INODE column, and slightly different
+	file system names in the NAME column.
+
+	In contrast, fuser, where available, can only report on
+	one reference type when supplied the file system name as
+	an argument.  Usually it will report on the one that is
+	associated with the mounted file system information.  If
+	the only reference type is the temporary automounter one,
+	fuser will often be silent about it.
+
+3.10	Why don't lsof and netstat output match?
+
+	Lsof and netstat output don't match because lsof reports
+	the network information it finds in open file system objects
+	-- e.g., socket files -- while netstat often gets its
+	information from separate kernel tables.
+
+	The information available to netstat may describe network
+	activities never or no longer associated with open files,
+	but necessary for proper network state machine operation.
+
+	For example, a TCP connection in the FIN_WAIT_[12] state
+	may no longer have an associated open file, because the
+	connection has been closed at the application layer and is
+	now being closed at the TCP/IP protocol layer.
+
+3.10.1	Why can't lsof find accesses to some TCP and UDP ports?
+
+	Lsof stands for LiSt Open Files.  If there is no open file
+	connected to a TCP or UDP port, lsof won't find it.  That's
+	the most common reason why lsof doesn't find a port netstat
+	might report open.
+
+	One reason I've found on some UNIX dialects is that their
+	kernels set aside TCP and UDP ports for communicating with
+	support activities, running in application layer servers
+	-- the automounter daemons, and the NFS biod and nfsd
+	daemons are examples.  Netstat may report the ports are in
+	use, but lsof doesn't.
+
+	Another reason is that netstat may also be able to report
+	a port is open on a particular dialect, because it uses a
+	source of data different from what lsof uses -- e.g.,
+	netstat might examine kernel tables or use streams messages
+	to MIB2, while lsof relies on the information it finds in
+	open file structures and their descendants.
+
+	Sometimes it's possible to search the data netstat and lsof
+	use.  For example, on Linux /proc/tcp and /proc/udp can be
+	examined.  There might an entry there for a particular
+	protocol and port, but if the line on which the port appears
+	doesn't have an inode number that matches an inode number
+	of an open file, lsof won't be able to identify the process
+	using the port.
+
+	This is a tough question to which there is no easy answer.
+
+3.11	Why does lsof update the device cache file?
+
+	At the end of the lsof output you may see the message:
+
+	    lsof: WARNING: /Homes/abe/.lsof_vic was updated.
+
+	In this message /Homes/abe/.lsof_vic is the path to the
+	private device cache file for login abe.  (See 00DCACHE.)
+
+	Lsof issues this message when it finds it necessary to
+	recheck the system device directory (e.g., /dev or /devices)
+	and rebuild the device cache file during the open file
+	scan.  Lsof may need to do these things it finds that a
+	device directory node has changed, or if it cannot find a
+	device in the cache.
+
+3.12	Why doesn't lsof report state for UDP socket files?
+
+	Lsof reports UDP TPI connection state -- TS_IDLE (Idle),
+	TS_BOUND (Bound), etc. -- for some, but not all dialects.
+	TPI state is stream-based TCP/IP information that isn't
+	available in many dialects.
+
+	A fairly weak general rule is if netstat(1) reports UDP
+	TPI state, lsof may be able to report it, too.  But don't
+	be surprised if lsof fails to report UDP TPI state for your
+	dialect.  Other factors influence lsof's ability to report
+	UDP TPI state, including the availability of state number
+	data in kernel structures, and state number to state name
+	conversion data.
+
+3.13	I am editing a file with vi; why doesn't lsof find the file?
+
+	Classic implementations of vi usually don't keep open the file
+	being edited.  (Newer ones may do so in order to maintain an
+	advisory lock.)  Instead classic vi opens the file, makes a
+	temporary copy (usually in /tmp or /usr/tmp), and does its work
+	in that file.  When you save the file being edited from a
+	classic vi implementation, it reopens and rewrites the file.
+
+	During a classic vi session, except for the brief periods when
+	vi is reading or rewriting the file, lsof won't find an open
+	reference to the file from the vi process, because there is
+	none.
+
+3.14	Why doesn't lsof report TCP/TPI window and queue sizes for my
+	dialect?
+
+	Lsof only reports TCP/TPI window sizes for Solaris, because
+	only its netstat reports them.  The intent of providing
+	TCP/TPI information in lsof NAME column output is to make
+	it easier to match netstat output to lsof output.
+
+	In general lsof only reports queue sizes for both TCP and
+	UDP (TPI) connections on BSD-derived UNIX dialects, where
+	both sets of values appear in kernel socket queue structures.
+	SYSV-derived UNIX dialects whose TCP/IP implementations
+	are based on streams generally provide only TCP queue sizes,
+	not UDP (TPI) ones.
+
+	While you may find that netstat on some SYSV-derived UNIX
+	dialects with streams TCP/IP may report UDP (TPI) queue
+	sizes, you will probably also find that the sizes are always
+	zero -- netstat supplies a constant zero for UDP (TPI)
+	queue sizes to make its headers align the same for TCP and
+	UDP (TPI) connections.  Solaris seems to get it right --
+	i.e., its netstat does not report UDP (TPI) queue sizes.
+
+	When in doubt, I chose to avoid reporting UDP (TPI) queue
+	sizes for UNIX dialects whose netstat-reported values I
+	knew to be a constant zero or whose origin I couldn't
+	determine.  OSR is a dialect in this category.
+
+3.14.1	Why doesn't lsof report socket options, socket states, and TCP
+	flags and values for my dialect?
+
+	The lsof -T argument, 'f', that selects the reporting of socket
+	options, socket states and TCP flags was implemented at lsof
+	revision 4.71 for the following UNIX dialects, providing the
+	indicated information:
+
+	    AIX 4.3.2 and 5.1 and above
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    Apple Darwin 7.2 and above
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    Digital UNIX and Tru64 UNIX 4.0
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    FreeBSD 4.9 and above
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    HP-UX 11.00 (/dev/kmem-based lsof)
+		All socket options and values are reported.  No socket
+		states are reported.  Only the TF_NODELAY TCP flag and
+		the TF_MSS value are reported.
+	    HP-UX 11.11 and iiiv2 (PSTAT-based lsof)
+		All socket options and values, and socket states are
+		reported.  No TCP flags or values are reported.
+	    Linux
+		No socket options and values, socket states, or TCP
+		flags and values are reported.  The support for "-Tf"
+		could not be added to Linux, because socket options,
+		socket states, and TCP flags and values are not
+		available via the /proc file system.
+	    NetBSD 1.6G and above
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    OpenBSD 3.4 and above
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    OPENSTEP 4.2
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    OpenUNIX 8
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    SCO OpenServer Release 5.0.6
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+	    Solaris 2.6, 8 and above
+		The socket option display is limited to BROADCAST,
+		DEBUG, DGRAM_ERRIND, DONTROUTE and OOBINLINE.  Socket
+		values are limited to KEEPALIVE and LINGER.  No socket
+		states are reported.  The TCP DELACK, NODELAY and
+		SENTFIN flags are reported.  The TCP MSS value is
+		reported.
+	    UnixWare 7.1.[134]
+		All socket options and values, socket states, and TCP
+		flags and values described in lsof(8) are reported.
+
+3.14.2	Why doesn't lsof report the partial listen queue connection
+	count for my dialect?
+
+	The reporting of partial listen queue connections was added to
+	-Tf processing at lsof revision 4.76.  Currently it is reported
+	for these dialects:
+
+	    AIX 4.3.2
+		This dialect is no longer supported, so no attempt
+		was made to add partial listen queue length support
+		for it.
+	    AIX 5.1 and above
+		Partial listen queue information is available.
+	    Apple Darwin 7.2 and above
+		Partial listen queue information is available.
+	    Digital UNIX 4.0
+		This dialect is no longer supported, so no attempt
+		was made to add partial listen queue length support
+		for it.
+	    FreeBSD 4.9 and above
+		Partial listen queue information is available.
+	    HP-UX 11.00 (/dev/kmem-based lsof)
+		No partial listen queue information is available.
+	    HP-UX 11.11 and iiiv2 (PSTAT-based lsof)
+		No partial listen queue information is available.
+	    Linux
+		No partial listen queue information is available.
+	    NetBSD 1.6G and above
+		Partial listen queue information is available.
+	    OpenBSD 3.4 and above
+		Partial listen queue information is available.
+	    OPENSTEP 4.2
+		Partial listen queue information is available.
+	    OpenUNIX 8
+		This dialect is no longer supported, so no attempt
+		was made to add partial listen queue length support
+		for it.
+	    SCO OpenServer Release 5.0.6
+		No partial listen queue information is available.
+	    Solaris 2.6, 8 and above
+		Partial listen queue information is available.
+	    Tru64 UNIX 5.0
+		This dialect is no longer supported, so no attempt
+		was made to add partial listen queue length support
+		for it.
+	    Tru64 UNIX 5.1
+		Partial listen queue information is available.
+	    UnixWare 7.1.[134]
+		Partial listen queue information is available.
+
+
+3.15	What does "no more information" in the NAME column mean?
+
+	When lsof can find no successor structures -- a gnode,
+	inode, socket, or vnode -- connected to the file structure
+	of an open descriptor of a process, it reports "no more
+	information" in the NAME column.  The TYPE, DEVICE, SIZE/OFF,
+	and INODE columns will be blank.
+
+	Because the file structure is supposed to contain a pointer
+	to the next structure of a file's processing support, if
+	the pointer is NUL, lsof can go no further.
+
+	Some UNIX dialects have file structures for system processes
+	-- e.g., the sched process -- that have no successor
+	structure pointers.  The "no more information" NAME will
+	commonly appear for these processes in lsof output.
+
+	It may also be the case that lsof has read the file structure
+	while it is being assembled and before a successor structure
+	pointer value has been set.  The "no more information" NAME
+	will again result.
+
+	Unless lsof output is filled with "no more information"
+	NAME column messages, the appearance of a few should be no
+	cause for alarm.
+
+3.16	Why doesn't lsof find a process that ps finds?
+
+	If lsof fails to display open files for a process that ps
+	indicates exists, there may be several reasons for the
+	difference.
+
+	The process may be a "zombie" for which ps displays the
+	"(defunct)" state.  In that case, the process has exited
+	and has no open file information lsof can display.  It does
+	still have a process structure, sufficient for the needs
+	of ps.
+
+	Another possible explanation is that kernel tables and
+	structures may have been changing when lsof looked for the
+	process, making lsof unable to find all relevant process
+	structures.  Try repeating the lsof request.
+
+3.17	Why doesn't -V report a search failure?
+
+	The usual reason that -V won't report a search failure is
+	that lsof located the search item, but was prevented from
+	listing it by an option that doesn't participate in search
+	failure reporting.
+
+	For example, this lsof invocation:
+
+	    $ lsof -V -i TCP@foobar -a -d 999
+
+	won't report it can't find the Internet address TCP@foobar,
+	even if there is an open file connected to that address,
+	unless the open file also has a file descriptor number of
+	999 (the ``-a -d 999'' options).
+
+	Compile-time options can also affect -V results in much the
+	same way.  For example, if HASSECURITY and HASNOSOCKSECURITY
+	are defined at compile time, this lsof invocation, run by a
+	non-root user:
+
+	    $ lsof -V -c inetd
+
+	won't report that it can't find the inetd command, even if
+	there is a process running the inetd command, because the
+	HASSECURITY and HASNOSOCKSECURITY options prevent the
+	listing of all but the socket files of another user, and
+	no socket file selector (e.g., "-i") was specified.
+
+
+3.18	Portmap problems
+
+3.18.1	Why isn't a name displayed for the portmap registration?
+
+	When portmap registration reporting is enabled, any time
+	there is a registration for a local TCP or UDP port, lsof
+	displays it in square brackets, following the port number
+	or service name -- e.g., ``:1234[name]'' or ``:name[100083]''.
+
+	The TCP or UDP port number or service number (what follows
+	the `:') is displayed under the control of the lsof -P
+	option.  The registration identity is held by the portmapper
+	and may be a name or a number, depending on how the
+	registration's owner declared it.  Lsof reports what the
+	port map holds and cannot derive a registration name from
+	a registration number.
+
+	Lsof can be compiled with registration reporting enabled
+	or disabled by default, under the control of the HASPMAPENABLED
+	#define (usually in machine.h).  The lsof help panel (`lsof
+	-h`) will show the default.  Lsof is distributed with
+	reporting disabled by default.
+
+3.18.2	How can I display only portmap registrations?
+
+	Lsof doesn't have an option that will display only TCP or
+	UDP ports with portmap registrations.  The +M option only
+	enables the reporting of registration information when
+	Internet socket files are displayed; +M doesn't select
+	the displaying of Internet socket files -- the -i option
+	does that.
+
+	This simple lsof pipe to grep will do the job:
+
+		$ lsof -i +M | grep "\["
+
+	This works because -i selects Internet socket files, +M
+	enables portmap registration reporting, and only output
+	lines with opening square brackets will have registrations.
+
+	When portmap registration reporting is enabled by default,
+	because the lsof builder constructed it that way, +M is
+	not necessary.  (The lsof help panel, produced with `lsof
+	-h` will display the default portmapper registration
+	reporting state.)  However, specifying +M when reporting
+	is already enabled is acceptable, as is specifying -M when
+	reporting is already disabled.
+
+	Digression: lsof will accept `+' or `-' as a prefix to most
+	options.  (That isn't documented in the man page or help
+	panel to reduce confusion and complexity.)  The -i option
+	is as acceptable as +i, so the above example could be
+	written a little more tersely as:
+
+		$ lsof +Mi | grep "\["
+	
+	But be careful to use the ``Mi'' ordering, since ``iM''
+	implies M is an address argument to `i'.
+
+3.18.3	Why doesn't lsof report portmap registrations for some ports?
+
+	Lsof reports portmap registrations for local TCP and UDP
+	ports only.  It identifies local ports this way:
+
+	*  The port appears in the local address section of the
+	   kernel structure that contains it.
+
+	*  The port appears in the foreign address section of a
+	   kernel structure whose local and foreign Internet
+	   addresses are the same.
+
+	*  The port appears in the foreign address section of a
+	   kernel address structure whose Internet address is
+	   INADDR_LOOPBACK (127.0.0.1).
+
+	Following these rules, lsof ignores foreign portmapped
+	ports.  That's done for reasons of efficiency and possible
+	security prohibitions.  Contacting all remote portmappers
+	could take a long time and be blocked by network difficulties
+	(i.e., be inefficient).  Many firewalls block portmapper
+	access for security reasons.
+
+	Lsof may occasionally ignore portmap registration information
+	for a legitimate local port by virtue of its local port
+	rules.  This can happen when a port appears in the foreign
+	part of its kernel structure and the local and foreign
+	Internet addresses don't match (perhaps because they're on
+	different interfaces), and the foreign Internet address
+	isn't INADDR_LOOPBACK (127.0.0.1).
+
+3.19	Why is `lsof | wc` bigger than my system's open file limit?
+
+	There is a strong temptation to count open files by piping
+	lsof output to wc.  If your purpose is to compare the number
+	you get to some Unix system parameter that defines the
+	number of open files your system can have, resist the
+	temptation.
+
+	One reason is that lsof reports a number of "files" that
+	don't occupy Unix file table space -- current working
+	directories, root directories, jail directories, text files,
+	library files, memory mapped files are some.  Another reason
+	is that lsof can report a file shared by more than one
+	process that itself occupies only one file table slot.
+
+	If you want to know the number of open files that occupy
+	file table slots, use the +ff option and process the lsof
+	output's FILE_ADDR column information with standard Unix
+	tools like cut, grep, sed, and sort.
+
+	You might also consider using use lsof's field output with
+	+ff, selecting the file struct address with -FF, and
+	processing the output with an AWK or Perl script.  See the
+	list_fields.awk, list_fields.perl, and shared.perl5 scripts
+	in the scripts/ subdirectory of the lsof distribution for
+	hints on file struct post-processing filters.
+
+3.20	Why doesn't lsof report file offset (position)?
+
+	Lsof won't report a file offset (position) value if the -s
+	option has been specified, or if the dialect doesn't support
+	the displaying of file offset (position).
+
+	That lsof is reporting only file size is indicated by the
+	fact that the appropriate column header says SIZE instead
+	of SIZE/OFF.
+
+	If lsof doesn't support the displaying of file offset
+	(position) -- e.g., for Linux /proc-based lsof -- the -h
+	or -? output panel won't list the -o option.
+
+	Sometimes the availability of file offset information
+	depends on the dialect's kernel.  This is particularly true
+	for socket file offsets.
+	
+	Maintenance of offsets for pseudo-terminal devices varies
+	by UNIX dialect and is related to how the dialect kernel
+	implements pseudo-terminal support.  Kernels like AIX, for
+	example, that short-circuit the transfer of data between
+	socket and pseudo devices to reduce TCP/IP daemon interrupt
+	rates won't advance offsets in the TCP/IP daemon socket
+	files.  Instead they will advance offsets in the open
+	standard I/O files of the shell child precess where the
+	pseudo-terminal devices are used.
+
+	When in doubt about the behavior of lsof in reporting file
+	offset information, do some carefully measured experiments,
+	consult the lsof sources, or contact me at <abe@purdue.edu>
+	to discuss the matter.  Please follow the reporting guidelines
+	in the "How do I report an lsof bug?" section of this FAQ.
+
+3.20.1	What does lsof report for size when the file doesn't really have
+	one?
+
+	When a file has no true size -- e.g., it's a socket, a
+	FIFO, or a pipe -- lsof tries to report the information it
+	finds in the kernel that describes the contents of associated
+	kernel buffers.
+
+	Thus, for example, size for most TCP/IP files is socket
+	buffer size.  The size of the socket read buffer is reported
+	for read-only files; the size of the write buffer for
+	write-only files; and the sum of the buffers sizes for
+	read-write files.
+
+3.21	Problems with path name arguments
+
+3.21.1	How do I ask lsof to search a file system?
+
+	You can ask lsof to search for all open files on a file
+	system by specifying its mounted path name as an lsof
+	argument -- e.g.,
+
+	    $ lsof /
+
+	Output of the mount command will show file system mounted
+	path names.  It will also show the mounted-on device path
+	for the file system.
+
+	If the mounted-on device is a block device (the permission
+	field in output of `ls -l <device>` starts with a `b/),
+	you can specify it's name, too -- e.g.,
+
+	    $ lsof /dev/sd0a
+
+	If the mounted-on device isn't a block device -- for example,
+	some UNIX dialects call a CD-ROM device a character device
+	(ls output starts with a `c') -- you can force lsof to
+	assume that the specified device names a file system with
+	the +f option -- e.g.,
+
+	    $ lsof +f -- /dev/sd0a
+	
+	(Note: you must use ``--'' after +f or -f if a file name
+	follows immediately, because  +f and -f can be followed by
+	characters that specify flag output selections.)
+
+	When you use +f and lsof can't match the device to a file
+	system, lsof will issue a complaint.
+
+	The +f option may be used in some dialects to ask lsof to
+	search for an NFS file system by its server name and server
+	mount point.  If the mount application reports an NFS file
+	system mounted-on value that way, then this sample lsof
+	request should work.
+
+	    $ lsof +f -- fleet:/home/fleet/u5
+
+	Finally, you can use -f if you don't want a mounted file
+	system path name to be considered a request to report all
+	open files on the file system.  This is useful when you
+	want to know if anyone is using the file system's mounted
+	path name.  This example directs lsof to report on open
+	access to the `/' directory, including when it's being used
+	as a current working or root directory.
+
+	    $ lsof -f -- /
+
+	The lsof -f option performs the same function as -f does
+	in some fuser implementations.  However, since the lsof -c
+	option was chosen for another purpose before the `f' option
+	was added to lsof, +f was selected as the analogue to the
+	fuser -c option.  (Sorry for the potential confusion.)
+
+3.21.2	Why doesn't lsof find all the open files in a file system?
+
+	Lsof may not find all the open files in a file system for
+	several reasons.
+
+	First, some processes with files open on the file system
+	may have been changing status when lsof examined the process
+	table, and lsof "missed" them.  Remember, the kernel changes
+	much faster than lsof can respond to the changes.
+
+	Second, be sure you have specified the file system correctly.
+	Perhaps you specified a file instead.  You can use lsof's
+	-V option to have lsof report in detail on what it couldn't
+	find.  Make sure the report for the file system you specified
+	says "file system."  Here's some -V output:
+
+	    $ /lsof -V /tmp ./lsof.h ./lsof
+	    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  INODE NAME
+	    lsof    2688  abe  txt   VREG 18,1,7  1428583 226641 ./lsof
+	    lsof    2689  abe  txt   VREG 18,1,7  1428583 226641 ./lsof
+	    lsof: no file use located: ./lsof.h
+
+	You can also use lsof's +f option to force it to consider
+	a path name as a file system.  If lsof can't find a file
+	system by the specified name, it will issue a complaint --
+	e.g.,
+
+	    $ lsof +f -- /usr
+	    lsof: not a file system: /usr
+	
+	(/usr is a directory in the / file system.)
+
+3.21.3	Why does the lsof exit code report it didn't find open files
+	when some files were listed?
+
+	Sometimes lsof will list some open files, yet return a
+	non-zero exit code, suggesting it hasn't found all the
+	specified files.
+
+	The first thing you should when you suspect lsof is incorrect
+	is to repeat the request, adding the -V option.  In the
+	resulting report you may find that your file system
+	specification really wasn't a file system specification,
+	just a file specification.
+
+	Finally, if you specify two files or two file systems twice,
+	lsof will credit all matches to the first of the two and
+	believe that there were no matches for the second.  It's
+	possible to specify a single file system twice with different
+	path names by using both its mounted directory path name
+	and mounted-one device name.
+
+	    $ lsof +f -V spcuna:/sysprog /sysprog
+	    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF  INODE NAME
+	    ksh     11092  abe  cwd   VDIR 39,0,1     1536 226562 /sysprog
+	    (spcuna:/sysprog)
+	    ...
+	    lsof: no file system use located: spcuna:/sysprog
+	
+	All matches were credited to /sysprog; none to spcuna:/sysprog.
+
+3.21.4	Why won't lsof find all the open files in a directory?
+
+	When you give lsof a simple directory path name argument
+	(not a file system mounted-on name), you are asking it to
+	search for processes that have the directory open as a
+	file, or as a process-specific directory -- e.g., root or
+	current working directory.
+
+	If you want to list instances of open files inside the
+	directory, you need to specify the individual path names
+	of those files, or use the lsof +D and +d options.
+
+	See the answer to the question "Why are the +D and +d
+	options so slow?" before you use +D or +d casually.
+
+	See the answer to the question "Why do the +D and +d options
+	produce warning messages?" for an explanation of some
+	process authority limitations of +D and +d.
+
+3.21.5	Why are the +D and +d options so slow?
+
+	The +D and +d options cause lsof to build a path name search
+	list for a specified directory.  +D causes lsof to descend
+	the directory to its furthest subdirectory, while +d
+	restricts it to the top level.  In both cases, the specified
+	directory itself is included in the search list.  In both
+	symbolic links are ignored.
+
+	Building such a search list can take considerable time,
+	especially when the specified directory contains many files
+	and subdirectories -- lsof must call the system readlink()
+	and stat() functions for each file and directory.  Storing
+	the search list can cause lsof to use more than its normal
+	amount of dynamic memory -- each file recorded in the search
+	list consumes dynamic memory for its path name, characteristics,
+	and search linkages.  Using the list means lsof must search
+	it for every open file in the system.
+
+	Building the search list for a directory specified on some
+	file systems can be slow -- e.g., for an NFS directory with
+	many files.  Some file systems have special logging features
+	that can introduce additional delays to the building of
+	the search list -- e.g., NFS logging, or logging on a
+	Solaris UFS file system.  The bottom line is that slow
+	search list construction may not be so much an lsof problem
+	as a file system problem.  (Hint: if you're using Solaris
+	UFS logging, consider specifying the "logging,noatime"
+	option pair to reduce the number of atime writes to the
+	UFS logging queue and disk.)
+
+	A somewhat risky way to speed up lsof's building of the
+	search list is to use lsof's ``-O'' option.  It forces lsof
+	to do all system calls needed to build the search list
+	directly, rather than in a child process.  While direct
+	system calls are much faster, they can block in the kernel
+	-- e.g., when an NFS server stops responding -- stopping
+	lsof until the kernel operation unblocks.
+
+	As an example of the load +D can impose, consider that an
+	`lsof +D /` on a lightly loaded NeXT '040 cube with a 1GB
+	root file system disk took 4+ minutes of real time.  It
+	also generated several hundred error messages about files
+	and directories the lsof process didn't have permission to
+	access with stat(2).
+
+	The bottom line is that +D and +d should be used cautiously.
+	+D is more costly than +d for deeply nested directory trees,
+	because of the full directory descent it causes.  So use
+	+d where possible.  And you might need to consider the
+	performance of the file system that holds the directory
+	you name with +d or +D.
+
+	In view of these warnings, when is it appropriate to use
+	+D or +d?  Probably the most appropriate time is when you
+	would specify the directory's contents to lsof with a shell
+	globbing construct -- e.g., `lsof *`.  If that's what you
+	need to do, `lsof +d .` is probably more efficient than
+	having the shell produce a directory list, form it into an
+	argument vector, and pass the vector to lsof for it to
+	unravel.
+
+	See the answer to the question "Why do the +D and +d options
+	produce warning messages?" for an explanation of some
+	process authority limitations of +D and +d.
+
+3.21.6	Why do the +D and +d options produce warning messages?
+
+	+D and +d option processing is limited by the authority of
+	the lsof process -- i.e., lsof can only examine (with
+	lstat(2) and stat(2)) files the owner of the process can
+	access.
+
+	If the ownership, group membership, or permissions of the
+	specified directory, file within it, or directory within
+	it prevents the owner of the lsof process from using lstat(2)
+	or stat(2) on it, lsof will issue a warning message, naming
+	the path and giving the system's (lstat(2's or stat(2)'s)
+	reason (errno explanation text) for refusing access.
+
+	As an example, assume user abc has a subdirectory in /tmp,
+	owned by abc and readable, writable and searchable by only
+	its owner.  If user def asks lsof to search for all /tmp
+	references with +D or +d, lsof will be unable to lstat(2)
+	or stat(2) anything in abc's private subdirectory, and will
+	issue an appropriate warning.
+
+	Lsof warnings can usually be suppressed with the -w option.
+	However, using -w with +D or +d means that there will be
+	no indication why lsof couldn't find an open reference to
+	a restricted directory or something contained in it.
+
+	Hint: if you need to use +D or +d and avoid authority
+	warnings, and if you have super-user power, su and use lsof
+	with +D or +d as root.
+
+3.22	Why can't my C compiler find the rpcent structure definition?
+
+	When you try to compile lsof your compiler may complain
+	that the rpcent structure is undefined.  The complaints
+	may look like this:
+
+	    >print.c: In function `fill_portmap': 
+	    >print.c:213: dereferencing pointer to incomplete type
+	    >...
+
+	The most likely cause is that someone has allowed a BIND
+	installation to update /usr/include/netdb.h (or perhaps
+	/usr/include/rpc/netdb.h), removing the rpcent structure
+	definition that lsof expects to find there.
+
+	Only Solaris has an automatic work-around.  (See dlsof.h
+	in dialects/sun.).  The Solaris work-around succeeds because
+	there is another header file, <rpc/rpcent.h>, with the rpcent
+	structure definition, and there is a Solaris C pre-processor
+	test that can tell when the BIND <netdb.h> is in place and
+	hence <rpc/rpcent.h> must be included.
+
+	Doubtlessly there are similar work-arounds possible in
+	other UNIX dialects whose header files have been "touched"
+	by BIND, but in general I recommend restoration of the
+	vendor's <netdb.h> and any other header files BIND might
+	have replaced.  (I think BIND replaces <resolv.h>,
+	<sys/bitypes.h>, <sys/cdefs.h> -- and maybe others.)
+
+3.23	Why doesn't lsof report fully on file "foo" on UNIX dialect
+	"bar?"
+
+	Lsof sometimes won't report much information on a given
+	file, or may even report an error message in its NAME
+	column.  That's usually because the file is of a special
+	type -- e.g., in a file system specific to the UNIX dialect
+	-- and I haven't used a system where the file appeared
+	during my testing.
+
+	If you encounter such a situation, send me e-mail at
+	<abe@purdue.edu> and we may be able to devise an addition to
+	lsof that will report on the file in question.  Please follow
+	the reporting guidelines in the "How do I report an lsof bug?"
+	section of this FAQ.  Make sure "lsof" appears in the
+	"Subject:" line so my e-mail filter won't classify your letter
+	as Spam.
+
+3.24	Why do I get a complaint when I execute lsof that some library
+	file can't be found?
+
+	On systems where the LIBPATH (or the equivalent) environment
+	variable is used to record the library search path in
+	executable files when they are built, an incorrect value
+	may make it impossible for the system to find the shared
+	libraries needed to load lsof for execution.
+
+	This may be particularly true on systems like AIX >= 4.1.4,
+	where the lsof Makefile takes the precautionary step of
+	using the -bnolibpath loader flag to insure that the path
+	to the private static lsof library is not recorded in the
+	lsof binary.  Should LIBPATH be invalid when lsof is built,
+	it will be recorded in the lsof binary as the default
+	library path search order and lead to an inability to find
+	libraries when lsof is executed.
+
+	So, if you get missing library complaints when you try to
+	execute lsof, check LIBPATH, or whatever environment variable
+	is used on your system to define library search order in
+	executable files.  Use the tools at your disposal to look
+	at the library paths recorded in the lsof binary -- e.g.,
+	chatr on HP-UX, dump on AIX, ldd on Solaris.
+
+	Make sure, too, that when the correct library search path
+	has been recorded in the executable file, the required
+	library files exist at one or more of the search paths.
+
+
+3.25	Why does lsof complain it can't open files?
+
+	When lsof begins execution, unless it has been asked to
+	report only help or version information, typically it will
+	attempt to access kernel memory and symbol files -- e.g.,
+	/unix, /dev/kmem.  Even though lsof needs only permission
+	to open these files for reading, read access to them might
+	be restricted by ownerships and permission modes.
+
+	So the first step to diagnosing lsof problems with opening
+	files is to use ls(1) to examine the ownerships and permission
+	modes of the files that lsof wants to open.  You may find
+	that lsof needs to be installed with some type of special
+	ownership or permission modes to enable it to open the
+	necessary files for reading.  See the "Installing Lsof"
+	section of 00README for more information.
+
+3.26	Why does lsof warn "compiled for x ... y; this is z."?
+
+	Unless warnings are suppressed (with -w) or the kernel
+	identity check symbol (HASKERNIDCK) definition has been
+	deleted, all but one lsof dialect version (exception:
+	/proc-based Linux lsof) compare the identity of the running
+	kernel to that of the one for which lsof was constructed.
+	If the identities don't match, lsof issues a warning like
+	this:
+
+	    lsof: WARNING: compiled for Solaris release 5.7; this is 5.6.
+
+	Two kernel identity differences can generate this warning
+	-- the version number and the release number.
+
+	Build and running identity differences are usually significant,
+	because they usually indicate kernels whose structures are
+	different -- kernel structures commonly change at dialect
+	version releases.  Since lsof reads data from the kernel
+	in the form of structures, it is sensitive to changes in
+	them.  The general rule is that an lsof compiled for one
+	UNIX dialect version will not work correctly when run on
+	a different version.
+
+	There are three work-arounds: 1) use -w to suppress the
+	warning -- and risk missing other warnings; 2) permanently
+	disable the identity check by deleting the definition of
+	HASKERNIDCK in the dialect's machine.h header file -- with
+	the same risk; or 3) rebuild lsof on the system where it
+	is to be run.  (Deleting HASKERNIDCK can be done with the
+	Customize script or by editing machine.h.)
+
+	Generally checking kernel identity is a quick operation
+	for lsof.  However, it is potentially slow under AIX, where
+	lsof must run /usr/bin/oslevel.  To speed up lsof, use -w
+	to suppress the /usr/bin/oslevel test.  See "Why does AIX
+	lsof start so slowly?" for more information.
+
+3.27	How can I disable the kernel identity check?
+
+	The kernel identity check is controlled by the HASKERNIDCK
+	definition.  When it is defined, most dialects (exclusion:
+	/proc-based Linux lsof) will compare the build-time kernel
+	identity with the run-time one.
+
+	To disable the kernel identity check, disable the HASKERNIDCK
+	definition in the dialect's machine.h header file.  The
+	Customize script can be used to do that in its section
+	about the kernel identity check.
+
+	Caution: while disabling the kernel identity check may
+	result in smaller lsof startup overhead, it comes with the
+	risk of executing an lsof that may produce warning messages,
+	error messages, incorrect output, or no output at all.
+
+3.28	Why don't ps(1) and lsof agree on the owner of a process?
+
+	Generally the user ID lsof reports in its USER column is
+	the process effective user ID, as found in the process
+	structure.  Sometimes that may not agree with what ps(1)
+	reports for the same process.
+
+	There are sundry reasons for the difference.  Sometimes
+	ps(1) uses a different source for process information,
+	e.g., the /proc file system or the psinfo structure.
+	Sometimes the kernel is lax or confused (e.g., Solaris
+	2.5.1) about what ID to report as the effective user ID.
+	Sometimes the system carries only one user ID in its process
+	structure (some BSD derivatives), leaving lsof no choice.
+
+	The differences between lsof and ps(1) user identifications
+	should be small and normally it will be apparent that the
+	confusion is over a process whose application has changed
+	to an effective user ID different from the real one.
+
+3.29	Why doesn't lsof find an open socket file whose connection
+	state is past CLOSE_WAIT?
+
+	TCP/IP connections in states past CLOSE_WAIT -- e.g.,
+	FIN_WAIT_1, CLOSING, LAST_ACK, FIN_WAIT_2, and TIME_WAIT
+	-- don't always have open files associated with them.  When
+	they don't, lsof can't identify them.  When the connection
+	state advances from CLOSE_WAIT, sometimes the open file
+	associated with the connection is deleted.
+
+3.30	Why don't machine.h definitions work when the surrounding
+	comments are removed?
+
+	The machine.h header files in dialect subdirectories have
+	some commented-out definitions like:
+
+	    /* #define HASSYSDC "/your/choice/of/path */
+
+	You can't simply remove the comments and expect the definition
+	to work.  That's intended to make you think about what
+	value you are assigning to the symbol.  The assigned value
+	might have a system-specific convention.  HASSYSDC, for
+	example, might be /var/db/lsof.dc for FreeBSD, but it might
+	be /var/adm/lsof.dc for Solaris.
+
+	Symbols defined in the lsof documentation are described in
+	00PORTING, other machine.h comments, and other lsof
+	documentation files.  HASSYSDC, for example, is discussed
+	in 00DCACHE.  When comments and documentation don't suffice,
+	consult the source code for hints on how the symbol is
+	used.
+
+3.31	What do "can't read inpcb at 0x...", "no protocol control
+	block", "no PCB, CANTSENDMORE, CANTRCVMORE", etc. mean?
+
+	Sometimes lsof will report "can't read inpcb at 0x00000000",
+	"no protocol control block", "no PCB, CANTSENDMORE,
+	CANTRCVMORE" or a similar message in the NAME column for
+	open TCP socket files.  These messages mean the file's socket
+	structure lacks a pointer to the INternet Protocol Control
+	Block (inpcb) where lsof expects to find connection addresses
+	-- local and foreign ports, local and foreign IP addresses.
+	The socket file has probably been submitted to the shutdown(2)
+	function for processing.
+
+	In some implementations lsof issues the "no PCB, CANTSENDMORE,
+	CANTRCVMORE" message, which tries to explain the absence
+	of a protocol control block by showing the socket state
+	settings that have been made by the shutdown(2) function.
+
+	If a non-zero address follows the "0x" in the "can't read
+	inpcb" message, it means lsof couldn't read inpcb contents
+	from the indicated address in kernel memory.
+
+3.32	What do the "unknown file system type" warnings mean?
+
+	Lsof may report a message similar to"
+
+	    unknown file system type, v_op: 0x10472f10
+
+	in the NAME column for some files.
+
+	This means that lsof has encountered a vnode for the file
+	whose operation switch address (from v_op) references a
+	file system type for which there is no support in lsof.
+	After lsof identifies the file system type, it uses
+	pre-compiled code to locate the file system specific node
+	for the file where lsof finds information like file size,
+	device number, node number, etc.
+
+	To get some idea of what the file system type might be,
+	use nm on your kernel symbol file to locate the symbol name
+	that corresponds to the v_op address -- e.g., on Solaris
+	do:
+
+	    $ nm -x /dev/ksyms | grep 0x10472f10
+	    0x10472f10 ... |file_system_name_vnodeops
+
+	Where "file_system_name" is the clue to the unsupported
+	file system.
+
+	Lsof doesn't use the v_op address to identify file system
+	types on all dialects.  Sometimes it uses an index number
+	it finds in the vnode.  It will translate that symbol to
+	a short name in the warning message -- e.g., "nfs3" -- if
+	possible.
+
+3.33	Installation
+
+3.33.1	How do I install lsof?
+
+	There is no "standard" way to install lsof.  Too much
+	depends on local conditions for me to be able to provide
+	working install rules in the lsof make files.  (The skeleton
+	install rules you will find just give "hints.")  See the
+	"Installing Lsof" section of 00README for a fuller explanation.
+
+	To install lsof you will need to consider these questions:
+
+	*  Who should be able to use lsof?  (See HASSECURITY and
+	    HASNOSOCKSECURITY in the "Security" section of 00README.)
+
+	*  Where should lsof be installed?  This is a decision
+	   mostly dictated by local conditions.  Somewhere in
+	   /usr/local -- etc/ or sbin/ -- is a common choice.
+
+	*  What permissions should I give the lsof executable?
+	   The answer to this varies by dialect.  The make files
+	   have install rules that give hints.  The "Installing
+	   Lsof" section of 00README gives information, too.
+
+	*  What if I want to install lsof in a shared file system
+	   for machines that require different lsof configurations?
+	   See the next question and answer, "How do I install a
+	   common lsof when I have machines that need differently
+	   constructed lsof binaries?"
+
+3.33.2	How do I install a common lsof when I have machines that
+	need differently constructed lsof binaries?
+
+	A dilemma that faces some system administrators when they
+	install lsof in a shared file system -- e.g., NFS -- is
+	that they must have different lsof executables for different
+	systems.
+
+	The answer is to build an lsof wrapper script that is
+	executed in place of lsof.  The script can use system
+	commands to determine which lsof binary should be executed.
+
+	Consider this example.  You have HP-UX machines with 32
+	and 64 bit kernels that share the /usr/local/sbin directory
+	where you want to install lsof.  Consequently, on each
+	system you must use a different lsof executable, built for
+	the system's bit size.  (That's because lsof reads kernel
+	structures, sized by the kernel's bit size.)
+
+	One answer is to install three things in /usr/local/sbin:
+	1) a 32 bit lsof as lsof32; 2) a 64 bit lsof as lsof64;
+	and 3) an lsof script.  The script might look like this
+	one, based on work by Amir J. Katz:
+
+	    #!/bin/sh
+	    x=`/usr/bin/getconf KERNEL_BITS`  # returns 32 or 64
+	    if /usr/bin/test "X$x" = "X32"
+	    then
+	      lsof32 $*
+	    else
+	      if /usr/bin/test "X$x" = "X64"
+	      then
+		lsof64 $*
+	      else
+		echo "Can't determine which lsof executable to use;"
+		echo "getconf KERNEL_BITS says: $x"
+		exit 1
+	      fi
+	    fi
+
+	Solaris users should consult "How do I install lsof for
+	Solaris 7, 8 or 9?" for information on a similar trick
+	using the Solaris isaexec command.
+
+	Users of other dialects might be able to use a command like
+	uname(1) that can identify a distinguishing feature of the
+	system to be incorporated in pre-installed lsof executable
+	names.  For example, use `uname -r` and install binaries
+	with suffixes that match `uname -r` output.
+
+3.34	Why do lsof 4.53 and above reject device cache files built
+	by earlier lsof revisions?
+
+	When lsof revisions 4.53 run and encounter a device cache
+	file built by an earlier revision, it will reject the file
+	and build a new one.  The rejection will be advertised with
+	these messages:
+
+	    lsof: WARNING: no /dev device in <name>: 2 sections
+	    ...
+	    lsof: WARNING: created device cache file: <name>
+
+	This happens because the header line of the device cache
+	file was changed at revision 4.53 to contain the number of
+	the device on which the device directory resides.  The old
+	device cache file header line -- the "2 sections" line in
+	the above warning message, node reads "2 sections, dev=600".
+
+	This is not a serious problem, since lsof automatically
+	rebuilds the device cache file with the correct header
+	line.
+
+3.35	What do "like block special" and "like character special" mean
+	in the NAME column?
+
+	When lsof comes across an open block or character file
+	whose device, raw device and inode place it somewhere other
+	than /dev (or /devices), lsof doesn't report the /dev (or
+	/devices) name in the NAME column.  Instead lsof reports
+	the file system name and device or path name in the NAME
+	column and parenthetically adds "like block special <path>"
+	or "like character special <path>".
+
+	The value for <path> will point to a block or character
+	device in /dev (or /devices) whose raw device number matches
+	that of the open file being reported, but whose device
+	number or node number (or both) don't match.
+
+	Such an open file is connected to a device node that has
+	been created in a directory other than /dev (or /devices.)
+	See mknod(8) for information on how such nodes are created.
+	(Generally one needs root power to create device nodes with
+	mknod.)
+
+3.36	Why does an lsof make fail because of undefined symbols?
+
+	When lsof is compiled via the `make` step and the final
+	load step fails because of missing symbols, the problem
+	may not be lsof.  The problem may be that ld, called by
+	the compiler as part of the `make` step, can't find some
+	library that lsof needs.
+
+	First check the last compiler line of the make operation
+	-- e.g., the last line with cc or gcc in it before the
+	undefined symbol report -- for loader arguments, i.e.,
+	ones beginning with "-l".  Except for "-llsof" the rest
+	name system libraries.  ("-L./lib" precedes "-llsof" to
+	tell the loader its location.)
+
+	Check that all the named system libraries exist.  Look in
+	/lib and /usr/lib as a start, but that may not be the only
+	place system libraries live.  Consult your dialect's
+	documentation, e.g., the compiler and loader man pages,
+	for other possible locations.
+
+	If some system library doesn't exist, that may mean it was
+	never installed or was removed.  You'll have to re-install
+	the missing library.
+
+	You may find that all the system libraries lsof uses exist.
+	Your next step might be to use nm and grep to see if any
+	of them contain the undefined symbols.
+
+	    $ nm library | grep symbol
+
+	If the undefined symbol exists in some library named by
+	the lsof make step, then you might have a problem with some
+	environment variable that controls the load step.  The most
+	common is LD_LIBRARY_PATH.  It may have a setting that
+	causes ld to ignore a directory containing a library lsof
+	names.  If this is the case, try unsetting LD_LIBRARY_PATH
+	in the environment of the ld process -- e.g., do:
+
+	    $ unset LD_LIBRARY_PATH
+	or
+	    % unsetenv LD_LIBRARY_PATH
+
+	Consult your ld man page for other environment variables
+	that might affect library searching -- e.g., LIBPATH, LPATH,
+	SHLIB_PATH, etc.
+
+	If the undefined function doesn't exist in any libraries
+	lsof names, check other libraries.  See if the function
+	has a man page that names its library.  If the latter is
+	true, please let me know, because that is an lsof problem
+	I need to fix.
+
+	If none of these solutions work for you, send me some
+	documentation via e-mail at <abe@purdue.edu>.  Include `uname
+	-a` output, the output of the lsof `Configure ...` and `make`
+	steps, and the contents of the environment in force when the
+	`make` step was executed -- e.g., `env` or `printenv` output.
+	If you've located the libraries lsof names, send me that
+	information, too.  Make sure "lsof" appears in the "Subject:"
+	line so my e-mail filter won't classify your letter as Spam.
+
+3.37	Command Regular Expressions (REs)
+
+3.37.1	What are basic and extended regular expressions?
+
+	Lsof's ``-c'' option allows the specification of regular
+	expressions (REs), enclosed in two slash ('/') characters and
+	followed by these modifiers:
+	
+	    b	the RE is a basic RE.
+	    i	ignore case.
+	    x	the RE is an extended RE (the default).
+	
+	Note: the characters of the regular expression may need to
+	be quoted to prevent their expansion by the shell.
+
+	Example: this RE is an extended RE that matches exactly
+	four characters, whose third may be an upper ('O') or lower
+	case ('o') oh:
+
+	    -c /^..o.$/i
+
+	For simplicity's sake, an RE that is acceptable to egrep(1)
+	is usually called an extended RE.
+
+	REs suitable for the old line editor, ed(1), are often
+	called basic REs (and sometimes also called obsolete).
+
+	These are some ways basic REs usually differ from extended
+	REs.  (There are other differences.)
+
+	*  `|', `+', `?', '{', and '}' are ordinary characters.
+
+	*  `^' is an ordinary character except at the beginning of
+	   the RE.
+
+	*  `$' is an ordinary character except at the end of the
+	   RE.
+
+	*  `*' is an ordinary character if it appears at the
+	   beginning of the RE.
+
+	For more information on REs and the distinction between
+	basic and extended REs, consult your dialect's man pages
+	for ed(1), egrep(1), sed(1), and possibly regex(5) or
+	regex(7).
+
+3.37.2	Why can't I put a slash in a command regular expression?
+
+	Since a UNIX command name is the last part of a path to
+	the command's executable, the lsof command regular expression
+	(RE) syntax uses slash ('/') to mark the beginning and end
+	of an RE.  Slash may not appear in the RE and the `\'
+	back-slash escape is ineffective for "hiding" it.
+
+	More likely than not, if you try to put a slash in an lsof
+	command RE, you'll get this response:
+
+	    $ lsof -s/.\// ...
+	    lsof: invalid regexp modifier: /
+
+	Lsof is complaining the the first character it found after
+	the second slash isn't an lsof command RE modifier -- 'b',
+	'i', or 'x'.
+
+3.37.3	Why does lsof say my command regular expression wasn't found?
+
+	When you use both forms of lsof's -c option --
+	``-c <command>'' and ``-c /RE/[m]'' -- and ask that lsof
+	do a verbose search (``-V''), you may be surprised that
+	lsof will say that the regular expression wasn't found.
+
+	This can happen if the ``-c <command>'' form matches first,
+	because then the ``-c/RE/[m]'' test will never have been
+	applied.  For example:
+
+	    $ ./lsof -clsof -c/^..o.$/ -V -adcwd
+	    COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF  NODE NAME
+	    lsof    7850  abe  cwd   VDIR    6,0     2048 96442 / (/dev/sd0a)
+	    lsof: no command found for regex: ^..o.$
+
+	The ``-clsof'' option matched first, so the ``-c/^..o.$/
+	option wasn't tested.
+
+3.38	Why doesn't lsof report on shared memory segments?
+
+	Lsof reports on shared memory segments only if they're
+	associated with an open file.  That's consistent with lsof's
+	mission -- to LiSt Open Files.  Shared memory segments with
+	no file associations aren't open files.
+
+	That's not to say that a report on shared memory segments
+	and their associated processes wouldn't be useful.  But it
+	calls for a new tool, not more baggage for lsof.
+
+3.39	Why does lsof report two instances of itself?
+
+	When you ask lsof to report all open files and it has
+	permission to do so, you may see two lsof processes in the
+	output.  The processes are connected via pipes -- e.g.,
+	here's an HP-UX 11 example.
+
+	    COMMAND     PID USER   FD   TYPE     DEVICE ...
+	    ...
+	    lsof      29450  abe    7w  PIPE 0x48732408 ...
+	    lsof      29450  abe    8r  PIPE 0x48970808 ...
+	    ...
+	    lsof      29451  abe    6r  PIPE 0x48732408 ...
+	    lsof      29451  abe    9w  PIPE 0x48970808 ...
+
+	The first process will usually be the lsof you initiated;
+	the second, an lsof child process that is used to isolate
+	its parent process from kernel functions that can block --
+	e.g., readlink() or stat().
+
+	Information to and from the kernel functions is exchanged
+	via the two pipes.  When the parent process detects that
+	the child process has become blocked, it attempts to kill
+	the child.  Depending on the UNIX dialect that may succeed
+	or fail, but the parent won't be blocked in any event.
+
+	See the "BLOCKS AND TIMEOUTS" and "AVOIDING KERNEL BLOCKS"
+	sections of the lsof man page for more information on why
+	the child process is used and how you can specify lsof
+	options to avoid it.  (Caution: that may be risky.)
+
+3.40	Why does lsof report '\n' in device cache file error messages?
+
+	Lsof revisions prior to 4.58 may report '\n' in error
+	messages it delivers about problems in the device cache
+	file -- e.g.,
+
+	    lsof: WARNING: no ...: 4 sections\n
+
+	That's deliberately done to show the exact contents of the
+	device cache file line about which lsof is complaining,
+	including its terminating NL (New Line) '\n' character.
+	In the above example the line in the device cache file
+	causing the lsof complaint contains "4 sections" and ends
+	with a '\n'.
+
+	At revision 4.58 and above, device cache error messages
+	like the one in the above example have been changed to
+	read:
+
+	    lsof: WARNING: no ...: line "4 sections"
+
+	The terminal '\n' is no longer reported, the line contents
+	are enclosed in double quote marks ('"'), and the word
+	"line" has been added as a prefix to denote that what
+	follows is a line from the device cache file.
+
+3.41	Kernel Symbol and Address Problems
+
+3.41.1	What does "lsof: WARNING: name cache hash size length error: 0"
+	mean?
+
+	When run on some systems, lsof may issue this warning:
+
+	    lsof: WARNING: name cache hash size length error: 0
+
+	That is an example from a FreeBSD system where lsof reads
+	the kernel's _nchash variable and finds its value is zero.
+
+	Similar warnings include:
+
+	    WARNING: kernel name cache size:
+	    WARNING: can't read kernel's name cache:
+	    WARNING: no name cache address
+	    WARNING: name cache hash size length error:
+	    WARNING: unusable name cache size:
+
+	These warnings are issued when lsof is attempting to read
+	the kernel's name cache information.  They are usually the
+	result of a mis-match between the addresses for kernel
+	symbols lsof gets via nlist(2) and the addresses in use by
+	the kernel.
+
+	Lsof usually gets kernel symbol addresses from what it
+	believes to be the kernel boot file.  In FreeBSD, for
+	example, that's the path returned by getbootfile(3), usually
+	/kernel.  The boot file can have other names in other UNIX
+	dialects -- /unix, /vmunix, /bsd, /netbsd, /mach, /stand/vmunix,
+	etc.
+
+	Lsof will get incorrect (mismatched) addresses from the
+	boot file if it has been replaced by a newer one which
+	hasn't yet been booted -- e.g., if this is done in FreeBSD:
+
+	    # mv /kernel /kernel.OLD
+	    # mv /kernel.NEW /kernel
+
+	Until the FreeBSD system is rebooted, the booted kernel is
+	/kernel.OLD, but getbootfile() says it is /kernel.  If
+	symbol addresses important to lsof in /kernel.OLD and
+	/kernel don't match, the lsof WARNING messages result.
+
+3.41.2	Why does lsof produce "garbage" output?
+
+	Kernel name cache warnings may not be the only sign that
+	lsof is using incorrect symbol addresses to read kernel
+	values.  If there's no reasonable test lsof can make on
+	what it reads from the kernel, it may issue other warnings
+	or even report nonsensical results.
+
+	The warnings may appear on STDERR, such as:
+
+	    lsof: can't read proc table info
+
+	Or the warnings may appear in the NAME column as messages
+	saying lsof can't read or interpret some kernel structure --
+	e.g.,
+
+	    ... NAME
+	    ... can't read file struct from 0x12345
+
+	One possible work-around is to point lsof's kernel symbol
+	address gathering at the proper boot file.  That can be
+	done with lsof's -k option -- e.g.,
+
+	    $ lsof -k /kernel.OLD
+
+	The best work-around is to make sure the standard boot file
+	is properly sited -- e.g., if you've moved a new /kernel
+	in place, boot it.
+
+3.42    Why does lsof report open files when run as super user that
+	it doesn't report when run with lesser privileges?
+
+	The most likely cause is that the HASSECURITY option was
+	selected when the lsof executable was built.
+
+	If HASSECURITY is defined when lsof is built, and lsof is
+	run with the privileges of a non-ROOT user, it will only
+	list open files belonging to the user.  The same lsof
+	executable, when run with root user privileges, will list
+	all open files.
+
+	However, if HASSECURITY and HASNOSOCKSECURITY are both
+	defined when lsof is built, lsof will list open files
+	belonging to the user and will also list anyone else's open
+	socket files, provided their listing is selected with the
+	"-i" option.
+
+	So first ask yourself if the process whose open files lsof
+	won't list belong to a user other than the one under which
+	you're running lsof, and are not open socket files.  If
+	either is true, use lsof's help (-h or -?) option and look
+	for a line near the bottom of the help panel that says:
+
+	    "... can list all files..."
+
+	If the leading "..." says "Only root" then HASSECURITY was
+	defined when lsof was built.  If the trailing "..." says
+	", but anyone can list socket files" then HASNOSOCKSECURITY
+	was also defined.
+
+	Should you want an lsof not built with HASSECURITY defined,
+	rerun the lsof Configure script.  If you let Configure do
+	customization, make sure you answer 'n' when it asks if
+	you want to enable HASSECURITY and HASNOSOCKSECURITY.  If
+	you don't need to do customization, you can rebuild lsof
+	with the "-n" option to Configure.  Here's an example of
+	such a rebuild sequence:
+
+	    $ Configure -clean
+	    $ Configure -n <dialect-abbreviation>
+	    $ make
+
+	More information on the HASSECURITY and HASNOSOCKSECURITY
+	options may be found in the "Security" section of the
+	00README file of the lsof distribution.
+
+3.43	Test Suite Problems
+
+3.43.1	Errors all tests can report:
+
+3.43.1.1 Why do tests complain "ERROR!!!  can't execute ../lsof"?
+
+	All tests in the test suite expect an executable lsof file
+	to exist in the tests parent directory, ../lsof.
+
+	If there's none there, the tests/Makefile has a rule to
+	make it, but there are probably circumstances where that
+	rule may fail.
+
+	The work-around is to re-Configure and re-make lsof, then
+	run the test suite.
+
+3.43.1.2 Why do tests complain "ERROR!!! can't find ..." a file?
+
+	Many tests create (or use from a supplied environment
+	variable path) a test file and use lsof to find it.  When
+	lsof can't file the file, the tests report the error with
+	messages of the form:
+
+	    ERROR!!!  can't find ... : <some file path>
+	 or
+	    ERROR!!!  lsof couldn't find ...
+	
+	These type of error messages mean that the lsof field output
+	delivered to the test didn't contain a file that the test
+	could identify as the one it intended lsof to find.  It
+	might also mean that the process information -- command
+	name, PID or parent PID -- didn't match what the test
+	expected.
+
+	This could imply a bug in the test or a bug in lsof.  Try
+	using lsof to find a known file that is open.  For example,
+	while in the tests sub-directory, do this:
+
+	    $ sleep 30 < Makefile
+	    $ ../lsof Makefile
+
+	If lsof doesn't report that Makefile is open, then the
+	fault may be with lsof.  If lsof reports the file is open,
+	search further in the test code for the failure cause.
+
+3.43.1.3 Why do some tests fail to compile?
+
+	If a test suite program fails to compile, it may be because
+	I've never had an opportunity to compile the test on the
+	particular UNIX version you are using.
+
+	See Appendix B in 00TEST for a list of the UNIX dialects
+	where the test suite has been validate.
+
+3.43.1.4 Why do some tests always fail?
+
+	There are several tests in the optional group that have
+	conflicting or special requirements:
+
+	    LTbigf      needs a dialect and file system that support
+			large files.
+
+	    LTlock      won't work if the tests/ sub-directory is
+			on an NFS file system.
+
+	    LTnfs       won't work if the tests/ sub-directory is
+			not on an NFS file system.
+
+	So for two tests in particular, LTlock and LTnfs, one will
+	generally fail.
+
+	Some failing tests can be run successfully by supplying to
+	them a path to the appropriate type of file system with
+	the -p option.
+
+3.43.1.5 Why does the test suite say it hasn't been validated on
+	 my dialect?
+
+	When you use the default rule of the test suite's Makefile,
+	it may issue this complaint:
+
+	    $ cd tests
+	    $ make
+	    !!!WARNING!!!
+
+	    This dialect or its particular version may not have
+	    been validated with the lsof test suite.  Consequently
+	    some tests may fail or may not even compile.
+
+	    !!!WARNING!!!
+
+	You are then given the opportunity to answer 'y' to have
+	the test suite operation continue.
+
+	This message means that the tests/TestDB file in the tests
+	sub-directory doesn't show that the test suite has been
+	run with the combination of compiler flags found in
+	tests/config.cflags.  The tests might nor run; they may
+	encounter compiler failures.
+
+	See 00TEST for more information on the UNIX dialects where
+	the test suite has been validated and on the workings of
+	TestDB and its supporting scripts.
+
+	When the tests/Makefile "auto" rule is used, the message
+	is more terse and the condition is fatal.
+
+	    This suite has not been validated on:
+
+		<dialect_description>
+
+	No opportunity to continue is offered.
+
+	The tests/Makefile "silent" rule will skip checking for
+	the validation footprint.
+
+3.43.1.6 Why do the tests complain they can't stat() or open()
+	 /dev/mem or /dev/kmem?
+
+	When the tests detect that lsof for the dialect reads its
+	information from kernel memory (i.e., the LT_KMEM definition
+	is present in tests/config.cflags), and when the lsof
+	executable path is ../lsof, the tests make sure they can
+	stat() and open() for read access the relevant kernel memory
+	devices, /dev/kmem and possibly /dev/mem.
+
+	If those stat() or open() operations fail, the tests issue
+	an error message and quit.  The message explains why the
+	system rejected the operation in terms of system "errno"
+	symbols and messages.  More often than not the explanation
+	will be that the process lacks permission to access the
+	indicated device node.
+
+	One work-around is to give the lsof executable being tested
+	the necessary permission -- e.g., via chgrp, chmod, etc.
+	-- and set its path in the LT_LSOF_PATH environment variable.
+	(See 00TEST.)
+
+	Another work-around is to make sure the process that runs
+	the tests has the necessary permissions -- e.g., run it as
+	root, or enable the process login to access the resources.
+	For example, I can run the tests on my personal work-station
+	because /dev/kmem and /dev/mem are readable by the "kmem"
+	group and my login is in that group.
+
+
+3.43.2	LTbigf test issues
+
+3.43.2.1 Why does the LTbigf test say that the dialect doesn't
+	 support large files?
+
+	Large file support is defined dialect by dialect in the
+	lsof source files and Configure script.  If large file
+	support isn't defined there, it isn't defined in the LTbigf
+	test.
+
+	If you think that's wrong for a particular dialect, contact me
+	via e-mail at <abe@purdue.edu>.  Make sure "lsof" appears in the
+	"Subject:" line so my e-mail filter won't classify your letter
+	as Spam.
+
+3.43.2.2 Why does LTbigf complain about operations on its config.LTbigf*
+	 file?
+
+	The LTbigf must be able to write a large file test (size
+	> 32 bits) and seek within it and the process file ulimit
+	size must permit the operation.  If the default location
+	for the test file, tests/, isn't on a file system enabled
+	for large file operations or if the process ulimit file
+	block size is too small, lsof will get file operation
+	errors, particularly when seeking
+
+	There may be a work-around.  Specify the path to a file
+	LTbigf can write in a file system enabled for large file
+	operations a the -poption.  Make sure that the ulimit file
+	block size permits writing a large file.  For example,
+	presuming /scratch23 is large-file-enabled, and presuming
+	you have permission to raise the ulimit file block size,
+	this shell commands will allow the LTbigf test to run on
+	AIX:
+
+	    $ ./LTbigf -p /scratch23/abe/bigfile
+
+	(Note: syntax for the ulimit command varies by dialect and
+	by shell.  Discovering the proper variant is left to the
+	reader.)
+
+	More information on this subject can be found in the LTbigf
+	description in the 00TEST file.  If course, the LTbigf.c
+	source file in tests/ is the ultimate source of information,
+
+3.43.2.3 Why does LTbigf warn that lsof doesn't return file offsets?
+
+	On some dialects (e.g., Linux) lsof can't report file
+	offsets, because the data access method underlying lsof
+	doesn't provide them.  If LTbigf knows that lsof can't
+	report file offsets for the dialect, it issues this warning:
+
+	    LTbigf ... WARNING!!!  lsof can't return file offsets
+			for this dialect, so offset tests have
+			been disabled.
+	
+	LTbigf then performs the size test and skips the offset
+	tests.
+
+	For more information see 00TEST and the "Why doesn't
+	/proc-based lsof report file offsets (positions)?" Q&A of
+	this file.
+
+3.43.3	Why does the LTbasic test complain "ERROR!!! lsof this ..."
+	and "ERROR!!!  lsof that ..."?
+
+	The LTbasic test program uses lsof to examine a running
+	lsof process.  It looks for the lsof current working
+	directory, executable (if possible), and kernel memory file
+	(if applicable).
+
+	Failures to find those things result in the LTbasic error
+	messages.  More information on how LTbasic produces the error
+	messages may be found in the LTbasic.c source file.
+
+	On HP-UX 11.11 and higher, for example, if the test's current
+	working directory is on a loopback (LOFS) file system, LTbasic
+	won't be able to find the current working directory of the lsof
+	process because of a bug in the HP-UX kernel.
+
+	The solution for that HP-UX problem is to install an HP-UX
+	patch.  See the answer to the "Why doesn't PSTAT-based lsof
+	report a CWD that is on a loopback (LOFS) file system?"
+	question for more information on the patch.
+
+3.43.4	NFS test issues
+
+3.43.4.1 Why does the LTnfs test complain "couldn't find NFS file ..."?
+
+	The LTnfs test must work with an NFS test file.  After it
+	opens the file it asks lsof to find it on an NFS file system.
+	If the file isn't on an NFS file system, lsof won't find it,
+	and the NFS test script complains and fails.
+
+	The work-around is to use -p option to supply a path to a
+	regular NFS file (not a directory)  that is on an NFS file
+	system that LTnfs can read.  Presuming /share/bin/file is
+	such a file and can be opened for reading by the LTnfs
+	test, this sample shell command could be used to run the
+	LTnfs test successfully:
+
+	    $ ./LTnfs -p /share/bin/file
+
+	(If the NFS file system is enabled for large files, the
+	NFS test will produce the error message described in the
+	following Q&A.)
+
+3.43.5	LTnlink test issues
+
+3.43.5.1 Why does the LTnlink test complain that its test file is on
+	 an NFS file system?
+
+	The LTnlink test may complain:
+
+	    LTnlink ... WARNING!!!  test file <path> is NFS mounted.
+
+	and then issue an explanation and a hint about using the
+	-p option.
+
+	The LTnlist test does this because of the way NFS file
+	links are managed when an NFS file is unlinked and the
+	unlinking process still has the file open.  Unlike with
+	files on a local file system, when an NFS file that is
+	still open is unlinked, its link count is not reduced.
+
+	The file name is changed to a name of the form .nfsxxxx
+	and the link count is left unchanged until the process
+	holding the file open closes it.  That's done by NFS so it
+	can keep proper track of the file on NFS clients and servers.
+
+	Since the link count isn't reduced when the LTnlink test
+	program closes the NFS test file it still has open, lsof
+	won't find it for LTnlink with a link count of zero.
+	Consequently, LTnlink disables that test section and issues
+	its warning.
+
+	The warning suggests that the unlink test section can be
+	run by giving LTnlink a path to a test file with the -p
+	option.  That path must name a file LTnlink can write and
+	unlink.  Presuming /scratch23/abe/nlinkfile is on a local
+	file system and the LTnlink test can write to it and unlink
+	it, this sample shell command can be used to run the complete
+	LTnlink test successfully:
+
+	    $ LTnlink -p /scratch23/abe/nlinkfile
+
+3.43.5.2 Why does LTnlink delay and report "waiting for link count
+	 update: ..."?
+
+	On some UNIX dialects and file system combinations the
+	updating of link count after a file has been unlinked can
+	be delayed.  Consequently, lsof won't be able to report
+	the updated link count to LTnlink for a while.
+
+	When lsof doesn't report the proper link count to LTnlink,
+	it sleeps and repeats the lsof call, using the "waiting
+	for link count update: ..." message as a signal that it is
+	waiting for the expected lsof response.  The wait cycle
+	duration is limited to approximately one minute.
+
+3.43.5.3 Why does LTnlink fail because of an unlink error?
+
+	LTnlink may fail with an error similar to:
+
+	    LTnlink ... ERROR!! unlink(<name>) failed: (Permission denied).
+
+	That message will be followed by a short explanation.
+
+	The error means that the kernel support for the file system on
+	which the file <name> resides does not allow a process to
+	unlink a file while it has the file open.  (When LTnlink is run
+	without the "-p path" option, it creates a <name> that begins
+	with "./config.LTnlink" and ends with the LTnlink process ID
+	number.)
+
+	An unlink failure of this type runs counter to original UNIX
+	file system behavior, but it has been observed on some file
+	system types, especially on the ZFS file system.
+
+	The work-around is to run LTnlink on a file system that allows
+	a process to unlink a file it has open.  Usually /tmp has that
+	support.  So, try running LTnlink this way:
+
+	    $ ./LTnlink -p /tmp/<name>
+	
+	where <name> is a unique name in /tmp of your choosing.  To
+	be safe, create a subdirectory in /tmp, named by your login:
+
+	    $ rm -f /tmp/<login>
+	    $ mkdir /tmp/<login>
+	    $ ./LTnlink -p /tmp/<login>/<name>
+
+3.43.6	LTdnlc test issues
+
+3.43.6.1 Why won't the LTdnlc test run?
+
+	Lsof is unable to access the DNLC cache on AIX, because the
+	kernel symbols for the DNLC aren't exported.  Contact IBM
+	to learn why that decision was made.
+
+	The LTdnlc test won't work on Apple Darwin because lsof
+	can't obtain reliable DNLC information.
+
+	The LTdnlc test may fail on other dialects.  Failure causes
+	include: a busy system with a DNLC that is changing rapidly;
+	path name components too large for the DNLC; a file system
+	-- e.g., NFS, /tmp, loopback -- which doesn't fully
+	participate in the DNLC; or DNLC limitations (Many DNLC
+	implementations will only store path name components if
+	they are 31 characters or less.)
+
+	If you suspect the file system doesn't fully participate
+	in kernel DNLC processing, as a work-around rebuild and
+	test lsof on one that does.
+
+3.43.6.2 What does the LTdnlc test mean by "... <path> found: 100.00%"?
+
+	Even when it succeeds the LTdnlc test will report:
+
+	  LTdnlc ... /export/home/abe/src/lsof4/tests found: 100.00%
+
+	This message means that the LTdnlc test asked lsof to find
+	the file at the indicated path five times and lsof found
+	the full path name in the indicated percentage of calls.
+	The LTdnlc test considers it a failure if the percentage
+	falls below 50.0%
+
+3.43.6.3 Why does the DNLC test fail?
+
+	The DNLC test may fail when some component of the lsof
+	tests/ sub-directory can't be cached by the kernel DNLC.
+	Some kernels have a limit on the length of individual
+	components (typically) 32.
+
+3.43.7	Why hasn't the test suite been qualified for 64 bit HP-UX
+	11 when lsof is compiled with gcc?
+
+	When I attempted to qualify lsof for HP-UX 11, compiled
+	with gcc 3.0, the LTsock test failed.  I traced the failure
+	to a gcc compilation error.  Because LTsock is an important
+	test, I didn't feel that the test suite was qualified if
+	it failed.
+
+	LTsock compiles and runs correctly on 64 bit HP-UX 11 when
+	compiled with HP's ANSI-C.
+
+3.43.8	LTszoff test issues
+
+3.43.8.1 Why does LTszoff warn that lsof doesn't return file offsets?
+
+	On some dialects (e.g., Linux) lsof can't report file
+	offsets, because the data access method underlying lsof
+	doesn't provide them.  If LTszoff knows that lsof can't
+	report file offsets for the dialect, it issues this warning:
+
+	    LTszoff ... WARNING!!!  lsof can't return file offsets
+			  for this dialect, so offset tests have
+			  been disabled.
+	
+	LTszoff then performs the size test and skips the offset
+	tests.
+
+	For more information see 00TEST and the "Why doesn't
+	/proc-based lsof report file offsets (positions)?" Q&A of
+	this file.
+
+3.43.9	LTlock test issues
+
+3.44	File descriptor list (the ``-d'' option) problems
+
+3.44.1	Why does lsof reject a ``-d'' FD list?
+
+	Lsof rejects ``-d'' FD lists that contain both exclusions
+	and inclusions with messages like:
+
+	    lsof: exclude in an include list: ^1
+	    lsof: include in an exclude list: 2
+
+	That's because ``-d'' FD lists are processed as ORed lists,
+	so it makes no sense for them to contain both exclusions
+	and inclusions.
+	
+	I.e.,, if a ``-d'' FD list were to contain ``^cwd,1'', the
+	``^cwd'' member is useless, because the ``1'' member
+	dominates by saying "include only FD 1".  That effectively
+	excludes ``cwd'' FD.
+
+	Note that lists may have multiple members of the same type,
+	exclude or include.  They are processed as an ORed set.
+	If an FD isn't excluded by any member of an exclude list,
+	it is selected.  If an FD is included by any member of an
+	include list, it is selected.
+
+3.44.2	Why are file descriptors other than those in my FD list
+	reported?
+
+	The FD list that follows ``-d'' excludes or includes file
+	descriptors, but unless the ``-a'' (AND) option is specified,
+	the FD list selections are ORed to the other selections.
+
+	For example, the following lsof command will cause all file
+	descriptors to be listed for the lsof command, and all but
+	the cwd descriptor for all other commands, probably not
+	what was intended.
+
+	    $ lsof -clsof -d^cwd
+
+	Hint: use ``-a'' -- e.g.,
+
+	    $ lsof -clsof -a -d^cwd
+
+3.45	How can I supply device numbers for inaccessible NFS file
+	systems?
+
+	When lsof can't get device numbers for inaccessible NFS file
+	systems via stat(2) or lstat(2), it attempts to get them from
+	the mount table's dev=xxx options.  Successes are reported with
+	a warning message that indicates the source of the device
+	number and that output might be incomplete as a consequence of
+	the warnings.
+
+	Some system mount tables -- e.g., Linux /proc/mounts -- don't
+	have a dev=xxx option.  In that case, and provided lsof for the
+	dialect supports them, you can use the +m option to create a
+	mount table supplement file and the "+m m" option to use it.
+
+	First check the lsof -h (help) output to see if the +m and
+	"+m m" options are supported.  If they are, use +m to create a
+	mount table supplement file when all mounted file systems are
+	accessible.  Use "+m m" later to make the supplement available
+	when some mounted file systems might not be available.
+
+	Here's an example that creates a mount supplement file in
+	$HOME/mnt-sup and later makes it available to lsof.
+
+	    $ rm -f $HOME/mnt-sup
+	    $ lsof +m > $HOME/mnt-sup
+	    ...
+	    $ lsof +m $HOME/mnt-sup <other lsof options>
+
+	If lsof has to get the device number from the supplement, it
+	will issue an informative warning message.  The warning can be
+	suppressed with lsof's -w option.
+
+	Caution!  Since the mount table supplement file is static, it
+	is its supplier's responsibility to update it as file system
+	mounts change.
+
+	For more information, consult the lsof man page.  The
+	"ALTERNATE DEVICE NUMBERS" section has useful information on
+	how lsof acquires device numbers when stat(2) or lstat(2)
+	fail.
+
+3.46	Why won't lsof find open files on over-mounted file systems?
+
+	When a file system, /xyz for example, is mounted on the same
+	mount point as another file system, /abc for example, running
+	lsof with an argument of the path of the first file system's
+	mount point -- the over-mounted one, /abc -- probably will not
+	reveal any files open on /abc.
+
+	That's because lsof looks for open files on a file system by
+	looking for files with the file system's device number.  The
+	two file systems usually have different device numbers and lsof
+	determines the device number search key from the supplied name
+	of the second file system.
+
+	A general work-around exists only for Linux.  On that UNIX
+	dialect, when you know the over-mounted file system's mount
+	point path, you can ask lsof to report on all open files and
+	grep that output for the path of the over-mounted file system
+	mount point.
+
+3.47	What can be done when lsof reports no more space?
+
+	Many lsof methods cache information in memory, using the
+	dialects malloc() library function.  When malloc() can't
+	allocate the requested amount of memory, lsof exits with
+	warning messages similar to this AIX message:
+
+	    lsof: no more dev-ch space at pid 2257750: 0x82a8e600
+
+	Lsof then exits immediately and produces no more output.
+
+	A possible work-around is to increase the memory foot print
+	of the shell that runs lsof.  That is often done with the
+	ulimit(1) shell command.
+
+3.48	What if the lsof build encounters ar and ld problems?
+
+	The lsof main and library Makefiles use the library archiver,
+	ar, and the system loader, ld, applications.  Improperly
+	located, installed or configured versions of them may cause the
+	lsof build to encounter errors with them.
+
+	The application producing the error should identify itself in
+	its error messages.
+
+	The first thing to check the path of the application that is
+	being used.  Try `which ar` or `which ld` to see if perhaps the
+	PATH used during the build might be causing the wrong archiver
+	or loader to be used.
+
+	If the problem is with the use of the wrong archiver, and it's
+	not possible to correct the PATH to it, try using the LSOF_AR
+	environment variable to specify the path to and arguments for
+	the correct archiver.  See 00XCONFIG for more information and
+	note that LSOF_AR must specify the path to the archive
+	application and the arguments for it, less the terminating
+	library and module name arguments.
+
+	If the problem is with the loader, there is no lsof work-
+	around.  That's because lsof calls the loader via the C
+	compiler, so the problem must be fixed at the compiler (system)
+	level.
+
+
+4.0	AIX Problems
+
+4.1	What is the Stale Segment ID bug and why is -X needed?
+
+	Kevin Ruderman reports that he has been informed by IBM
+	that processes using the AIX 3.2.x, 4.1[.12345]], 4.2[.1],
+	and 4.3.x kernel's readx() function can cause other AIX
+	processes to hang because of what appears to be file system
+	corruption.
+
+	This failure, known as the Stale Segment ID bug, is caused
+	by an error in the AIX kernel's journaled segment memory
+	handler that causes the kernel's dir_search() function
+	erroneously to believe directory entries contain zeroes.
+	The process using the readx() call need not be doing anything
+	wrong.  Usually the system must be under such heavy load
+	that the segment ID being used in the readx() call has been
+	freed and then reallocated to another process since it was
+	obtained from kernel memory.
+
+	Lsof uses the readx() function to access library entry
+	structures, based on the segment ID it finds in the proc
+	structure of a process.  Since IBM probably will never fix
+	the kernel bug, I've added an AIX-specific option to lsof
+	that controls its use of the readx() function.
+	
+	By default lsof readx() use is disabled; specifying the
+	``-X'' option enables readx() use.
+
+	If you want to change the default readx() behavior of AIX
+	lsof, change the HASXOPT, HASXOPT_ROOT, and HASXOPT_VALUE
+	definitions in dialects/aix/machine.h.  You can also use
+	these definitions to enable or disable readx() -- consult
+	the comments in machine.h.  You may want to disable readx()
+	use permanently if you plan to make lsof publicly executable.
+
+	When HASXOPT_ROOT is defined, lsof will restrict use of
+	the -X option to processes whose real UID is root; if
+	HASXOPT_ROOT isn't defined, any user may specify the -X
+	option.  The Customize script offers the option to change
+	HASXOPT_ROOT when HASXOPT is defined and HASXOPT_ROOT is
+	named in any dialect's machine.h header file.
+
+	I have never seen lsof cause a problem with its use of
+	readx(), but I believe there is some chance it could, given
+	the right circumstances.
+
+4.1.1	Stale Segment ID APAR
+
+	Here are the details of the Stale Segment ID bug and IBM's
+	response, provided by Kevin Ruderman.
+
+	AIX V3
+	  APAR=ix49183
+	      user process hangs forever in kernel due to file
+	      system corruption
+	  STAT=closed prs  TID=tx2527 ISEV=2 SEV=2
+	       (A "closed prs" is one closed with a Permanent
+	       ReStriction.)
+	  RCOMP=575603001 aix v3 for rs/6 RREL=r320
+
+	AIX V4  (internal defect, no apar #)
+	  prefix        p
+	  name          175671
+	  abstract      KERMP: loop for ever in dir_search()
+
+	Problem description:
+
+	1. Some user application -- e.g., lsof -- gets the segment
+	   ID (SID) for the process private segment of a target
+	   process from the process table.
+
+	2. The target process exits, deleting the process private
+	   segment.
+
+	3. The SID is reallocated for use as a persistent segment.
+
+	4. The user application runs again and tries to read the
+	   user area structure from /dev/mem, using the SID it read
+	   from the process table.
+
+	5. The loads done by the driver for /dev/mem cause faults
+	   in the directory; new blocks are allocated; the size
+	   changed; and zero pages created.
+
+	6. The next application that looks for a file in the affected
+	   directory hangs in the kernel's dir_search() function
+	   because of the zero pages.  This occurs because the
+	   kernel's dir_search() function loops through the variable
+	   length entries one at a time, moving from one to the
+	   next by adding the length of the current entry to its
+	   address to get the address of the next entry. This
+	   process should end when the current pointer passes the
+	   end of the known directory length.
+
+	   However, while the directory length has increased, the
+	   entry length data has not, so when dir_search() reaches
+	   the zero pages, it loops forever, adding a length of
+	   zero to the current pointer, never passing the end of
+	   the directory length.  The application process is hung;
+	   it can't be killed or stopped.
+
+	IBM closed the problem with a PRS code (Permanent ReStriction)
+	under AIX Version 3 and had targeted a fix for AIX 4.2.  They
+	have recently (I became aware of it September 10, 1996)
+	cancelled the defect report altogether and have indicated they
+	are not going to fix the defect.
+
+4.2	Gcc Work-around for AIX 4.1x
+
+	When gcc is used to compile lsof for AIX 4.1x, it doesn't
+	align one element of the user structure correctly.  Xlc
+	sees the U_irss element as a type "long long" and aligns
+	it on an 8 byte boundary.  That's because the default mode
+	of xlc is -qlonglong; when -qlonglong is enabled, the
+	_LONG_LONG symbol is also defined.
+
+	Gcc sees U_irss as a two element array of type long, because
+	_LONG_LONG isn't defined.  Hence gcc aligns the U_irss
+	element array on a 4 byte boundary, rather than an 8 byte
+	one, making the gcc incantation of the user structure 4
+	bytes shorter than xlc's.
+
+	When the length of gcc's user structure is supplied as
+	argument 4 to the undocumented getuser() function of the
+	AIX kernel, getuser() rejects it as an incorrect size and
+	returns EINVAL.
+
+	Lsof has a work-around for this problem.  It involves a
+	special test in the Configure script when the "aixgcc"
+	Configure abbreviation is used -- e.g.,
+
+		$ Configure -n aixgcc
+
+	The test is to compile a small program with gcc and check
+	the alignment of U_irss.  If it's not aligned on an 8 byte
+	boundary, the Configure script makes a special copy of
+	<sys/user.h> in ./dialects/aix/aix<AIX_version> whose
+	U_irss will align properly, and generates compile time
+	options to use it.
+
+	While I have tested this work-around only with 4.1.4, it
+	should work with earlier versions of AIX 4.1.  It does not
+	work for AIX 4.2; a different work-around is employed there.
+	(See the next section.)
+
+	If you want to use this technique to compile other AIX
+	4.1x programs with gcc for using getuser(), check the
+	Configure script.
+
+	Stuart D. Gathman identified this gcc AIX alignment problem.
+
+4.3	Gcc and AIX 4.2[.1]
+
+	Alignment problems with gcc and AIX 4.2[.1] inside the user
+	structure are more severe, because there are some new 64
+	bit types in AIX that gcc doesn't yet (as of 2.7.x) support.
+	The <sys/user.h> U_irss element problem, discussed in 4.3
+	above, doesn't exist in 4.2[.1].
+
+	The AIX lsof machine.h header file has a work-around,
+	provided by Henry Grebler, that bypasses gcc alignment
+	problems.  Later versions of gcc (e.g., 2.8.x) will probably
+	bypass the problems as well.
+
+4.4	Why won't lsof's Configure allow the use of gcc for AIX
+	below 4.1?
+
+	Gcc can't reliably be used to compile lsof for AIX versions
+	below AIX 4.1 because of possible kernel structure element
+	alignment differences between it and xlc.
+
+4.5	What is an AIX SMT file type?
+
+	When you run AIX X clients with the DISPLAY environment
+	variable set to ``:0.0'' they communicate with the AIX X
+	server via files whose kernel file structure has an undefined
+	type (f_type == 0xf) -- at least there's no definition for
+	it in <sys/file.h>.
+
+	These are Shared Memory Transport (SMT) sockets, an artifact
+	of AIXWindows, designed for more efficient data transfers
+	between the X server and its clients.
+
+	Henry Grebler and David J. Wilson alerted me to the existence
+	of these files.  Mike Feldman and others helped me identify
+	them as SMT sockets.
+
+	The curious reader can find more about SMT sockets in
+	/usr/lpp/X11/README.SMT.
+
+4.6	Why does AIX lsof start so slowly?
+
+	When AIX lsof starts it compares the running kernel's
+	identity to the one for which it was built, using
+	/usr/bin/oslevel.  That comparison can sometimes take a
+	long time to complete, depending on the system's maintenance
+	level and how recently it was examined with oslevel.
+
+	AIX revisions 4.67 and above for AIX 5 and above don't use
+	oslevel to determine the kernel identity.  They use uname(2)
+	instead, and it is much faster.
+
+	You can skip the oslevel test by suppressing warning messages
+	with lsof's -w option.  Doing that carries with it the risk
+	of missing other warning messages, however.
+
+	You can also disable the kernel identity check by disabling
+	the definition of the HASKERNIDCK symbol by editing AIX
+	machine.h header file or by using the Customize script to
+	disable it.
+
+	See the "Why does lsof warn "compiled for x ... y; this is
+	z.?" section for more information.
+
+4.7	Why does exec complain it can't find libc.a[shr.o]?
+
+	When you try to execute lsof you may get this complaint:
+
+	    exec(): 0509-036 Cannot load program ./lsof because of
+		        the following errors:
+		    0509-022 Cannot load library libc.a[shr.o].
+		    0509-026 System error: A file or directory in
+			the path name does not exist.
+
+	This is probably the result of making lsof when the LIBPATH
+	environment variable contained a directory path that doesn't
+	contain libc.a.  You can see what LIBPATH contained when
+	lsof was made by using the dump application on lsof.  For
+	example, if LIBPATH contained /foo/bar when lsof was made,
+	you will see this (partial) dump output:
+
+	    $ dump -H lsof
+	    ...
+			***Import File Strings***
+	    INDEX  PATH                          BASE         ...
+	    0      /foo/bar
+
+	To correct the problem, revisit the lsof source directory
+	and remake lsof this way:
+
+	    $ unset LIBPATH; make		(sh or ksh)
+	or
+	    % unsetenv LIBPATH; make		(csh or tcsh)
+
+4.8	What does lsof mean when it says, "no PCB, CANTSENDMORE,
+	CANTRCVMORE" in a socket file's NAME column?
+
+	When an AIX application calls shutdown(2) on an open socket
+	file, but hasn't called close(2) on the file, the file will
+	remain visible to lsof as an open socket file without any
+	extended protocol information.
+
+	Lsof reports that state in the NAME column by saying that
+	there is "no PCB" (Protocol Control Block) for the protocol
+	(e.g., TCP in the NODE column).  If the open socket file
+	has the state variables SO_CANTSENDMORE and SO_CANTRCVMORE
+	set -- i.e., from the shutdown(2) call -- lsof reports them
+	with the CANTSENDMORE and CANTRCVMORE notes in the NAME
+	column.
+
+4.9	When the -X option is used on AIX 4.3.3, why does lsof disable
+	it, saying "WARNING: user struct mismatch; -X option disabled?"
+
+	The -X option causes lsof to read the loader information
+	of the user structure from virtual memory via the readx()
+	system call.  It does that with the user structure definition
+	from <sys/user.h> that was compiled into the lsof executable.
+
+	On AIX 4.3.3 there are two different user structure
+	definitions in two separate <sys/user.h> header files,
+	distributed at different times by IBM.  If lsof was compiled
+	with one and the kernel on which lsof is being run was
+	compiled with the other, lsof normally won't get correct
+	loader information when it calls readx().
+
+	In an attempt to compensate for that difference, lsof makes
+	an independent check of the loader information by getting
+	the user structure's open file count via readx() and
+	comparing it to the open file count obtained independently
+	via getprocs().  When the two counts don't match, lsof
+	tries to read the count (and re-read the loader information)
+	with two offsets, based on observed differences between
+	the two user structures.
+
+	When one of the three attempts produces a correct open file
+	count, lsof uses its corresponding offset on subsequent
+	readings of the loader information.
+
+	When none of the three attempts produces a correct open
+	file count, lsof issues the WARNING message and disables
+	-X processing.
+
+	To eliminate this problem, obtain an lsof binary that
+	matches the kernel of the AIX 4.3.3 system where you want
+	to run lsof.  Compiling lsof on the target system is the
+	preferred way to get a matching binary.
+
+4.10	Why doesn't the -X option work on my AIX 5L or 5.[123] system?
+
+	If your AIX 5L or 5.[123] system uses the ia64 architecture,
+	lsof needs setuid-root permission to be able to do the
+	processing that -X requires.
+
+	Check the output of `uname -a` to determine the architecture
+	type.
+
+	The work-around is to give lsof setuid-root permission.
+
+4.11	Why doesn't /usr/bin/oslevel report the correct AIX version?
+
+	The oslevel man page says, "The oslevel command reports
+	the level of the operating system using a subset of all
+	filesets installed on your system."
+
+	You can see which fileset is below the expected level with
+	oslevel's -l option.  For example, if you believe your
+	system is at AIX level 4.3.3, but oslevel reports 4.3.2,
+	use this oslevel command to find the filesets below 4.3.3:
+
+	    $ /usr/bin/oslevel -l 4.3.3.0
+
+	If you don't know what level argument to supply to oslevel's
+	-l option, use oslevel's -q option first.
+
+4.11.1	Why doesn't /usr/bin/oslevel report the correct AIX version
+	on AIX 5.1?
+
+	The subset list for oslevel on AIX 5.1 seems to include at
+	least two filesets, xlsmp.msg.en_US.rte and xlsmp.rte, that
+	do not install from AIX 5.1 media with a 5.1.0.0 level.
+	Hence, oslevel reports 5.0.0.0 instead of the expected
+	5.1.0.0.
+
+	If either xlsmp.msg.en_US.rte or xlsmp.rte is installed,
+	lsof's Configure script and run-time tests will identify
+	the AIX version incorrectly.  The run-time test will
+	issue a complaint message of this form:
+
+	    lsof: WARNING: compiled for AIX version xxx; this is yyy.
+
+	You can correct the Configure test by pre-defining the
+	oslevel value, setting the correct value in the LSOF_VSTR
+	environment variable before running the Configure script
+	-- e.g., to pre-define AIX 5.1 when using ksh, do this:
+
+	    $ LSOF_VSTR=5.1.0.0 Configure -n aix
+
+	You can't affect oslevel output without uninstalling
+	xlsmp.msg.en_US.rte and xlsmp.rte.  If you can't do that,
+	you'll have to put up with the run-time complaint.
+
+4.12    Why does lsof for AIX 5.1 or above Power architecture
+	complain about kernel bit size?
+
+	When you run an lsof binary on an AIX 5.1 or above Power
+	system, it might complain:
+
+	    lsof: FATAL: compiled for a 32 bit kernel.
+		  The bit size of this kernel is 64.
+	or
+	    exec: 0509-036 Cannot load program ./lsof because of
+			   the following errors:
+	          0509-032 Cannot run a 64-bit program on a 32-bit
+			   machine.
+
+	Starting at lsof revision 4.61, lsof binaries for Power
+	architecture systems running AIX 5.1 or above are closely
+	tied to the kernel bit size.  Lsof must do that so it can
+	read and understand kernel structures.
+
+	Lsof's Configure script tunes the lsof configuration so
+	that the binary built in the make(1) step is adjusted to
+	the kernel bit size.
+
+	An lsof binary knows the bit size for which it was constructed,
+	tests the bit size of the kernel under which it is running,
+	and objects if the two sizes don't match.  To see the bit
+	size for which lsof was constructed, run it with its -v
+	option and look for these lines in the output:
+
+	    configuration info: 32 bit kernel
+	 or
+	    configuration info: 64 bit kernel
+
+	(Note: these lines will appear only in -v output for AIX
+	5.1 and above lsof binaries, built for Power architecture.)
+
+	You can see the kernel bit size test method in the aix
+	stanza of the lsof Configure script and in the get_kernel_access()
+	function of the lsof .../dialects/aix/dproc.c source file.
+
+	There is more information on pre-defining the kernel bit
+	size when building lsof in Configure, 00PORTING, and
+	00XCONFIG.
+
+	The only work-around is to use an lsof binary built to
+	match the running kernel bit size.
+
+4.13	What can't gcc be used to compile lsof on the ia64 architecture
+	for AIX 5 and above?
+
+	Gcc can't be used to compile lsof on the ia64 architecture
+	for AIX 5 and above because I haven't had access to a system
+	that has a working gcc compiler.  The gcc compiler on my
+	one and only ia64 AIX 5.1 test system, provided by IBM,
+	didn't work at all.
+
+4.14	Why does lsof get a segmentation fault when compiled with gcc
+	for a 64 bit Power architecture AIX 5.1 kernel?
+
+	When lsof is configured with the lsof "aixgcc" Configure
+	abbreviation, the resulting lsof executable may cause a
+	segmentation violation when it is run.  I've observed this
+	with gcc version 2.9-aix43-010414-7.
+
+	As far as I have been able to tell, the segmentation fault
+	is the result of a gcc compilation, loading, or library
+	error.  Watching lsof run with gcc's companion debugger,
+	gdb, shows no error in the lsof source code that might
+	explain the fault.
+
+	The only work-around I know is to use the IBM C compiler
+	in place of gcc -- i.e., use the "aix" lsof Configure
+	abbreviation.
+
+4.15	Why does lsof ignore AFS on my AIX system?
+
+	The lsof Configure script quits on AIX when AFS is present,
+	the AIX version is greater than 4.3.3.0 or the AFS version
+	is greater than 3.5.  That's because I have no test systems
+	available for those AIX and AFS version combinations.
+
+	When the lsof Configure script detects an AIX and AFS
+	version combination that is unsupported, it will report:
+
+	  !!!FATAL: Lsof does not support AFS on this combination of
+		    AIX and AFS versions.  To disable AFS, set the
+		    value of the AIX_HAS_AFS environment variable to
+		    "no".
+
+	The only work-around is to set the AIX_HAS_AFS environment
+	variable as explained in the error message:
+
+	    $ AIX_HAS_NSF=no; export AIX_HAS_NFS
+	    $ ./Configure -n aix
+
+4.16	Why does lsof report "system paging space is low" and exit?
+
+	When AIX paging space runs low, the AIX kernel sends a SIGDANGER
+	signal to processes, warning them that they should reduce their
+	memory usage.
+
+	When lsof receives that signal, it issues the following fatal
+	error message and exits:
+
+	    lsof: FATAL: system paging space is low.
+
+	A possible work-around is to limit the amount of information
+	lsof must cache in its process memory with the "-c", "-g", "-l"
+	and "-p" options.
+
+	Also see the answer to the "What can be done when lsof reports
+	no more space?" question.
+
+4.17    Why does lsof have a compilation problem on AIX 5.3 above
+	maintenance level 1?
+
+	On some AIX 5.3 systems with maintenance levels 2 and higher
+	installed, lsof 4.77 and below may not compile properly.  The
+	compiler complains the snapshotObject structure definition,
+	needed by <j2/j2_inode.h>, is missing.
+
+	That problem is fixed in the 4.78 revision.
+
+
+5.0	Apple Darwin Problems
+
+5.1	What do /dev/kmem-based and libproc-based mean?
+
+	Lsof for Apple Darwin currently uses /dev/kmem to read kernel
+	data structures from which it gathers and reports open file
+	information.  That version of lsof is called /dev/kmem-based
+	lsof.
+
+	At an upcoming release lsof will use a library called libproc
+	to obtain information about open files.  That version of lsof
+	wil be called libproc-based lsof.
+
+	The /dev/kmem-based lsof sources may be found in the kmem
+	subdirectory of the dialects/darwin branch of the lsof source
+	tree.  When the supporting version of Apple Darwin is released,
+	the libproc-based lsof sources will be found in
+	.../dialects/darwin/libproc.
+
+5.2	/dev/kmem-based Apple Darwin Questions
+
+5.2.1	Why does Configure ask for a path to the Darwin XNU kernel
+	header files?
+
+	When lsof was ported to Apple Darwin by Allan Nathanson at
+	revision 4.53, some kernel header files needed by lsof
+	weren't being exported by the developers.  (That's still
+	true at lsof revision 4.76.)
+
+	At first a shell script that Allan provided would get the
+	missing header files by checking them out from the CVS
+	root.  Although the script was updated from time to time,
+	eventually the re-organization of Darwin sources has made
+	it impossible to update the script to do an automatic
+	download of the missing header files.
+
+	At lsof revision 4.69 and above it is necessary for the Darwin
+	lsof builder to download the Darwin XNU kernel headers before
+	attempting to build lsof.  The download my be done via a web
+	browser, starting at this URL:
+
+	    http://www.opensource.apple.com/darwinsource/index.html
+
+	Once there, select the link to the Mac OS X version that
+	matches the one on the system where lsof is to be built.
+
+	Follow that link's "[ Source ]" link.  Once there, select the
+	tar.gz link of the xnu* entry near the bottom of the page.
+	That entry should have a name that matches the xnu* name shown
+	by `uname -a` -- e.g., if uname reports:
+
+	    $ uname -a
+	    ... root:xnu/xnu-517.7.21 ...
+
+	Then the appropriate xnu* entry is xnu-517.7.21.  Clicking
+	its link should lead to an "Apple Open Source" page requesting
+	an Apple ID and password.
+
+	Enter them if they're available.  If an Apple ID and password
+	are not available, get them by following the instructions on
+	the page -- i.e., follow the signin.apple.com link.
+
+	Once a valid Apple ID and its password have been entered,
+	the download will begin.  Select the saving of the downloaded
+	xnu*.tar.gz file in an appropriate place on the Mac OS X
+	system.
+
+	Once the download completes, install it.  Use gunzip to
+	decompress the download and tar to extract the archive -- e.g.,
+
+	    $ gunzip -c xnu-517.7.21.tar.gz | tar xf -
+	
+	Remember the absolute path to the extracted archive.  That is
+	its installed place.  E.g., if the xnu-517.7.21.tar archive was
+	extracted to the lsof builder's home directory, its full
+	installation path will be something like:
+
+	    ~/xnu-517.7.21
+
+	Now run the lsof Configure script.  When it asks for the path
+	to the installed Darwin XNU kernel header files, supply the
+	path to the gunzip'd and extracted xnu* archive -- e.g.,
+	~/xnu-517.7.21.
+
+	The path to the Darwin XNU kernel headers may also be
+	supplied to the Configure script in the DARWIN_XNUDIR
+	environment variable, eliminating the need to enter it
+	interactively -- e.g.,
+
+	    $ DARWIN_XNUDIR=~/xnu-344.49 ./Configure -n darwin
+
+5.2.1.1	Why does Configure complain that Darwin XNU kernel header
+	files are missing?
+
+	These are some reasons why the lsof Configure script might
+	claim that Darwin XNU header files are missing:
+
+	    * The wrong path to them was specified.
+
+	    * The files and directories in the path are not readable
+	      and searchable -- i.e., check the modes and ownerships.
+
+	    * The downloaded archive doesn't match the Mac OS X
+	      version of the system.
+
+	If in doubt, revisit the Darwin XNU kernel header file
+	download instructions in the answer to the question "Why
+	does Configure ask for a path to the Darwin XNU kernel
+	header files?"
+
+	If Configure still can't find Darwin XNU kernel header
+	files, contact me via e-mail at <abe@purdue.edu> for help.
+	Make sure "lsof" appears in the "Subject:" line so my e-mail
+	filter won't classify your letter as Spam.
+
+5.2.2	Why doesn't Apple Darwin lsof report text file information?
+
+	At the first port of lsof to Apple Darwin, revision 4.53,
+	insufficient information was available -- logic and header
+	files -- to permit the installation of VM space scanning
+	for text files.  As of lsof 4.70 it is sill not available.
+
+	Text file support will be added to Apple Darwin lsof after
+	the necessary information becomes available.
+
+5.2.3	Why doesn't Apple Darwin lsof support IPv6?
+
+	At the first port of lsof to Apple Darwin, revision 4.53,
+	Apple Darwin lacked IPv6 support.  IPv6 became available
+	in Apple Darwin version 1.5 and support for it was added
+	to lsof then.
+
+5.2.4	Why does lsof complain about a mismatch between the release
+	for which lsof was compiled and the booted Mac OS X release?
+
+	When lsof is started on the "Gold Master" Darwin release
+	(aka Mac OS X), it complains:
+
+	    lsof: compiled for 1.0 release; this is 1.3.2.
+
+	This happens because the lsof binary released with Mac OS
+	X was built on a system whose release number (1.0) doesn't
+	match that of the released system -- usually 1.3.x  Lsof
+	makes this check because UNIX dialect OS changes are often
+	accompanied by header file changes that affect lsof.
+
+	In this specific case, this error can be ignored.  If you
+	don't want to do that, get the lsof distribution and build
+	lsof so its built-on and running-on Mac OS X release numbers
+	match.
+
+5.2.5	Why does lsof for Apple Darwin 8 and higher report
+	"stat(...): ..." in the NAME column?
+
+	Lsof for Apple Darwin 8 may report messages like these in the
+	NAME column:
+
+	    stat(/private/var/run/asl_prune): No such file or directory
+	 or
+	    stat(/private/var/db/netinfo/local.nidb/Config): Permission denied
+
+	Those messages indicate that lsof was unable to collect open
+	file information for the paths enclosed in "stat(...)" with the
+	stat(2) function, because the function encountered the reported
+	error.
+
+	A work-around for the "Permission denied" error is to run lsof
+	with elevated privileges -- e.g., when logged on as the super
+	user.
+
+	If the stat(2) error message is "No such file or directory",
+	the file probably has been unlinked (removed) and there is no
+	lsof work-around.
+
+5.2.6	What are the limitations of Apple Darwin lsof link count
+	reporting?
+
+	Lsof for Apple Darwin cannot report link count information
+	reliably.
+	
+	For Apple Darwin below 8 link count information is not always
+	available in the kernel node structures available to lsof.
+	When link count information is available, however, it includes
+	link counts of zero.  Thus, using lsof's +L1 option may result
+	in the finding of some files whose link counts are zero.
+
+	Lsof can report only some link count information for Apple
+	Darwin 8 and above.  Link count information is only available
+	for files where lsof can assemble the full file path and has
+	permission to apply stat(2) to it.  (See the answer to the "Why
+	does lsof for Apple Darwin 8 and higher report "stat(...): ..."
+	in the NAME column?" question for more information on stat(2)
+	failures.)
+
+	Apple Darwin 8 and above files that have been unlinked and thus
+	have a link count of zero cannot be found by stat(2) -- i.e.,
+	stat(2) returns a "No such file or directory" error.  As a
+	result lsof never displays link counts of zero and the use of
+	lsof's +L1 option to find them always fails.
+
+5.3	Libproc-based Apple Darwin Questions
+
+	
+6.0	BSD/OS BSDI Problems
+
+6.0.5	Statement of deprecation
+
+	As of lsof revision 4.76 support for BSDI BSD/OS has been
+	dropped.  The 4.76 distribution of lsof for BSDI BSD/OS may be
+	found on lsof.itap.purdue.edu in pub/tools/unix/lsof/OLD/src.
+
+
+7.0	DEC OSF/1, Digital UNIX, and Tru64 UNIX Problems
+
+7.1	Why does lsof complain about non-existent /dev/fd entries?
+
+	When you run lsof for Digital UNIX 3.2, lsof may complain:
+
+	    lsof: can't lstat /dev/fd/xxx: No such file or directory
+	    lsof: can't lstat /dev/fd/yyy: No such file or directory
+
+	(Or it may warn about other missing /dev/fd paths.)  When
+	you do an ``ls /dev/fd'' none of the missing paths are listed.
+
+	This is caused by a bug in the DEC library function
+	getdirentries().  For some reason, when /dev/fd is a file
+	system mount point, getdirentries() returns an incorrect
+	size for it to readdir().  (Lsof calls readdir() in its
+	ddev.c readdev() function.)  Because of the incorrect size,
+	readdir() goes past the end of the /dev/fd directory buffer,
+	encounters random paths and returns them to lsof.  Lsof
+	then attempts to lstat(2) the random paths, gets error
+	replies from lstat(2), and complains about the paths.
+
+	Duncan McEwan discovered this error and has reported it to
+	DEC.  Duncan also supplied an alternate readdir() function
+	as a work-around.  I've incorporated his readdir() in
+	dialects/osf/ddev.c (as the static ReadDir() function) with
+	some slight modifications, and enabled its use when the
+	USELOCALREADDIR symbol is defined.
+
+	The Configure script defines USELOCALREADDIR for Digital
+	UNIX version and 3.2.  If you don't want to use Duncan's
+	local readdir() function, edit the Makefile and remove
+	-DUSELOCALREADDIR from the CFGF string.  When DEC releases
+	a corrected getdirentries() function, I'll modify the
+	Configure script to stop defining USELOCALREADDIR.
+
+7.2	Why does the Digital UNIX V3.2 ld complain about Ots* symbols?
+
+	When you compile lsof on your Digital UNIX V3.2 system, ld
+	may complain:
+
+	    ld:
+	    Unresolved:
+	    knlist
+	    _OtsRemainder32Unsigned
+	    _OtsDivide64Unsigned
+	    _OtsRemainder64Unsigned
+	    _OtsDivide32Unsigned
+	    _OtsMove
+	    _OtsDivide32
+	    _OtsRemainder32
+	    *** Exit 1
+
+	Chris Eleveld reports this happens on Digital UNIX V3.2
+	systems after the Fortran compiler has been installed.
+
+	The best work-around seems to be to remove -lmld from the
+	CFGL string in the Makefile produced by Configure -- i.e.,
+	change:
+
+	    CFGL=    -lmld
+	to
+	    CFGL=
+
+	According to the V3.2 man page for nlist(3), this shouldn't
+	work, but my testing shows that it does.  Although I haven't
+	been able to test this second work-around, you might try
+	adding -lots to CFGL, rather than removing -lmld -- i.e.,
+	change:
+
+	    CFGL=    -lmld
+	to
+	    CFGL=    -lmld -lots
+
+	WARNING: my testing also shows that the V2.0 nlist(3) man
+	page means what it says when it calls for -lmld -- lsof
+	loaded without -mld under V2.0 can't locate the proc
+	(process) table address.
+
+	    DON'T REMOVE -lmld FROM THE DIGITAL UNIX V2.0 MAKEFILE.
+
+	If you run into this problem, please let me know what
+	problem you encountered and how you solved it.
+
+7.3	Why can't lsof locate named pipes (FIFOs) under V3.2?
+
+	While lsof for V3.2 can report on named pipes (FIFOs), it
+	can't find them by name.  That appears to happen because
+	of the way the V3.2 kernel lstat(2) function reports named
+	pipe device numbers.
+
+	The V3.2 kernel reports the device number as 0xfffffff,
+	while the kernel structures for named pipes that lsof
+	examines contain the device number of the file system on
+	which the named pipe resides.
+
+	Consequently, lsof can't match the device and inode number
+	pair it receives from applying lstat(2) to the named pipe
+	with any device and inode number pair it finds when scanning
+	kernel structures.
+
+	I don't have a work-around.  You can, of course, ask for
+	full lsof output and use a post-processing filer (e.g.,
+	grep) to locate the named pipe of interest.
+
+	This problem doesn't exist under V2.0.
+
+7.4	Why does lsof use the wrong configuration header files?
+	For example, why can't the lsof compilation find cpus.h?
+
+	DEC OSF/1, Digital UNIX, and Tru64 UNIX configuration header
+	files describe the hardware and software environment for
+	which your kernel boot file was constructed.  For example,
+	/sys/<name>/cpus.h defines the number of CPUs in its NCPUS
+	#define.
+
+	Lsof searches for the configuration header file subdirectory
+	in /sys (/usr/sys for Digital UNIX version 4.0 and Tru64
+	UNIX) by converting the first host name component to capital
+	letters -- e.g., TOMIS is derived from tomis.bio.purdue.edu.
+	If that subdirectory exists, lsof uses header files from
+	it.  (Configure reports what subdirectory is being used.)
+
+	If Configure doesn't find a host-name derived subdirectory,
+	it prompts you for the entry of a subdirectory name.  If
+	you can't find one, quit Configure and run the kernel
+	generation process to create a proper configuration sub-
+	directory.  If you don't identify a proper configuration
+	subdirectory and you try to compile lsof, the compiler will
+	complain about missing header files -- e.g., a missing
+	cpus.h.
+
+	Once you have located or generated a proper configuration
+	subdirectory, rerun Configure.  If you have generated a
+	configuration subdirectory whose name is derived from the
+	host name, Configure will find and use it.  If not, you
+	will have to specify its name to Configure.
+
+7.5	Why does lsof indicate incomplete paths with " -- " for Tru64
+	UNIX 5.1 files?
+
+	When lsof can't find a component of a path in the kernel's
+	name cache (aka DNLC), or can't determine that the left-most
+	component has as its parent the file system root, it uses
+	an "incomplete path" notation.  That notation begins with
+	the file system root name, followed by " -- ", followed by
+	the consecutive path name components lsof was able to find
+	in the DNLC -- e.g., "/ -- init".
+
+	Because the DNLC was significantly redesigned in Tru64 UNIX
+	5.1, lsof's handling of the cache had to be completely
+	redone.  As part of the DNLC redesign a name cache entry
+	parameter lsof formerly used to locate the file system root
+	of a path was removed.  With help from Chang Song I've been
+	able to implement an alternate method for detecting the
+	root of these file system types:  AdvFS (MSFS), CDFS, DVDFS,
+	FDFS, NFS, NFS3, and UFS.
+
+	When lsof doesn't know how to identify the root for a file
+	system type, it will resort to the " -- " incomplete path
+	notation.
+
+7.6	Why doesn't lsof report link count, node number, and size
+	for some Tru64 5.x CFS files?
+
+	Lsof reports link count, node number, and size for open
+	CFS files as recorded in their kernel node structure's
+	cached attributes.  Sometimes not all attributes are cached
+	on the system where lsof runs, so lsof cannot report them.
+
+7.7     Why does lsof say it can't read the kernel name list or
+	proc table on Digital UNIX 4.x or Tru64 UNIX?
+
+	By default on Digital UNIX 4 and Tru64 UNIX lsof reads the
+	addresses for kernel symbols with the knlist(3) function.
+	That function can fail, for example, when the kloadsrv
+	daemon isn't running or is malfunctioning.  When that
+	happens, lsof may abort with one of these error messages:
+
+	    lsof: can't read kernel name list from knlist(3): ...
+	  or
+	    lsof: can't read proc table info
+
+	The first message suggests a complete knlist(3) or kloadsrv
+	failure; the second, a partial one.
+
+	If you know the name of the file from which the running
+	system was booted, e.g., /vmunix, you can use lsof's -k
+	option to direct it to read kernel symbol addresses from
+	the name list of that file --
+
+	    $ lsof -k /vmunix ...
+
+	If that works, then knlist(3) is malfunctioning and you
+	need to fix it.
+
+
+8.0	FreeBSD Problems
+
+8.1	Why doesn't lsof report on open kernfs files?
+
+	Lsof doesn't report on open FreeBSD kernfs files because
+	the structures lsof needs aren't defined in the kernfs.h
+	header file in /sys/misc/kernfs.
+
+8.2	Why doesn't lsof work on my FreeBSD system?
+
+	If lsof doesn't work on your FreeBSD system, first make
+	sure you have the latest lsof revision.  See the answer to
+	the "Where do I get lsof?" question for information on how
+	to get the latest lsof revision.
+
+	Once you have gotten the latest lsof revision, Configure
+	and make it.  If Configure fails -- e.g., it complains
+	about an unknown FreeBSD version -- then lsof probably
+	hasn't been ported to your FreeBSD version yet, and there's
+	no need to go any further.  Follow the answer to the "How
+	do I report an lsof bug" to report the Configure complaint
+	to me.
+
+	If you are able to Configure and make lsof, run its test
+	suite.  (See the answer to the "Is there a test suite?"
+	question for more information on how to use lsof's test
+	suite.)
+
+	If lsof still fails, make sure your kernel sources, kernel
+	header files, kernel boot file, standard header files and
+	libraries are synchronized.  They should all be built from the
+	same CVS refresh.  (Don't forget to do a "make buildworld"
+	followed by a "make installworld".)  If they aren't, then the
+	KVM library or lsof may be using kernel structure definitions
+	that don't match the booted kernel; or lsof may fail to compile
+	properly because of header files in /usr/src/sys/sys and
+	/usr/include/sys that don't match.
+
+	If you have synchronized your kernel, header files and
+	libraries, and still can't get lsof to work, follow the
+	steps in the answer to the "How do I report an lsof bug"
+	question to report the problem to me.
+
+8.3	Why doesn't lsof work on the RELEASE version of CURRENT?
+
+	Lsof tracks the CURRENT release of the current leading edge
+	FreeBSD version, because my access to leading edge FreeBSD is
+	limited to FreeBDSD.org reference systems, all running the
+	CURRENT release.
+
+	Sometimes that tracking leads to changes in lsof that won't
+	work on an earlier RELEASE version of the current leading edge
+	version.
+
+	When that happens, please send e-mail to me <abe@purdue.edu>.
+	Make sure "lsof" appears in the "Subject:" line so my e-mail
+	filter won't classify your letter as Spam.
+
+8.4	Why does kvm_open() complain it can't find some file?
+
+	If lsof issues this complaint:
+
+	    lsof: kvm_open(execfile=/boot/kernel/kernel,
+		  corefile=/dev/mem: No such file or directory
+
+	Your FreeBSD system might not have a /dev/mem device.  If
+	not, create one -- e.g., as root do:
+
+	    # mknod /dev/mem c <major> 0
+	    # chmod 440 /dev/mem
+	    # chgrp kmem /dev/mem
+
+	For <major> use /dev/kmem's major device number.
+
+	You may have to run kldload, too -- again as root do:
+
+	    # kldload mem
+
+8.5	FreeBSD ZFS Problems
+
+8.5.1	Why does FreeBSD lsof report "WARNING: no ZFS support has been
+	defined."?
+
+	Lsof issues that message when it detects a file on a ZFS file
+	system, but has not been built with support for ZFS.  Lsof's
+	Configure script detects support can be added for ZFS when it
+	finds this file:
+
+	/usr/src/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h
+
+	That header file and others in the OpenSolaris files in
+	/usr/src enable lsof to extract information about ZFS files
+	from the kernel structures associated with them.
+
+8.6	Why can't Configure create lsof_owner.h for FreeBSD 6 and above?
+
+	Lsof may report:
+
+	    Creating ./lockf_owner.h from /usr/src/sys/kern/kern_lockf.c
+	    FATAL ERROR: can't read /usr/src/sys/kern/kern_lockf.c
+	    FATAL ERROR: ./lockf_owner.h creation failed (see 00FAQ)
+	or
+	    Creating ./lockf_owner.h from /usr/src/sys/kern/kern_lockf.c
+	    FATAL ERROR: ./lockf_owner.h creation failed (see 00FAQ)
+
+	Those messages mean that lsof's Configure script failed to
+	create a local header file, ./lockf_owner.h, needed to use the
+	new kernel file locking code of some versions of FreeBSD 6 and
+	above.
+
+	The changes that implement that new locking code alter the
+	lockf structure in <sys/lockf.h> and introduce a new structure,
+	lockf_entry, to that header file.  When Configure detects the
+	presence of the lockf_entry definition in <sys/lockf.h>, it
+	tries to construct the local header file, ./lockf_owner.h.
+
+	Configure has to do that  because an unfortunate side effect of
+	the new kernel file locking code is that <sys/lockf.h> doesn't
+	contain the lockf_owner structure definition referenced in its
+	own lockf structure.  Lsof needs to access elements of that
+	lockf_owner structure to determine if a lock belongs to the
+	process that has a file open.
+
+	The missing lockf_owner structure definition is in the kernel
+	source file, typically /usr/src/sys/kern/kern_lockf.c.
+	Configure tries to extract the lockf_owner structure definition
+	from kern_lockf.c into lsof's local header file, ./lockf_owner.h.
+	If Configure can't do that, it reports:
+
+	    FATAL ERROR: ./lockf_owner.h creation failed
+
+	If Configure can't even read kern_lockf.c, it first reports:
+
+	    FATAL ERROR: can't read /usr/src/sys/kern/kern_lockf.c
+
+	The work-around for this problem is to update the FreeBSD
+	kernel /usr/src tree (e.g., do a CVSup or csup) on the system
+	where lsof is to be built and then do a "make buildworld"
+	followed by a "make installworld".
+
+8.6.1	Why are there lockf structure compiler errors for FreeBSD 6.0
+	and higher lsof?
+
+	If, when compiling lsof, the compiler complains with error
+	messages like:
+
+	    dnode.c: In function 'get_lock_state':
+	    dnode.c:113: error: 'struct lockf' has no member named 'lf_flags'
+	    dnode.c:115: error: 'struct lockf' has no member named 'lf_id'
+	    ...
+	    
+	Then lsof is being built on a system that has new kernel file
+	locking code and lsof's Configure script failed to build a
+	local lockf_owner.h header file with a structure definition
+	lsof needs.
+
+	See the "Why can't Configure create lsof_owner.h for FreeBSD 6
+	and above?" section for more information and a work-around.
+
+8.6.2	Why don't /usr/src/sys/sys/lockf.h and /usr/include/sys/lockf.h
+	match?
+
+	This mismatch can cause the errors explained in the answer to
+	the "Why are there lockf structure compiler errors for FreeBSD
+	6.0 and higher lsof?" question.
+
+	If /usr/src/sys/sys/lockf.h has been updated with a CVSup or
+	csup, the new lockf.h won't be propagated to /usr/include/sys
+	until the "make buildworld" and "make installworld" steps have
+	been completed.
+
+
+9.0	HP-UX Problems
+
+9.1	What do /dev/kmem-based and PSTAT-based mean?
+
+	Lsof for HP-UX 11.0 and below uses /dev/kmem to read kernel
+	data structures from which it gathers and reports open file
+	information.  That version of lsof is called /dev/kmem-based
+	lsof.
+
+	Starting with HP-UX 10.10, finding definitions for the
+	necessary kernel structures became more difficult as HP no
+	longer distributed header files in /usr/include that defined
+	all kernel structures.  So I started "inventing" structure
+	definitions by using Q4 to display them.
+
+	By HP-UX 11, the process of invention became extremely
+	intensive to support.  Following a patch to the ipc_s
+	structure in early 1999, my invented definition of that
+	structure became incorrect.  Although I was able to devise
+	a work-around test for the patch with Q4, it was clear that
+	my inventions were bound to cause more problems.
+
+	Discussion with HP about the patch led to my proposing that
+	an lsof API in the HP-UX kernel was the proper solution.
+	Much to my surprise, HP agreed.  I believe Carl Davidson
+	was the prime mover behind that decision, but I know others
+	participated, among them Louis Huemiller, Rich Rauenzahn,
+	and Sailu Yallapragada.  I am indebted to these folks and
+	HP for their willingness to do this work.
+
+	The API was added to the PSTAT interface in a project named
+	PEGL, Pstat Enhancements for Glance and Lsof.  Louis and
+	Sailu did the bulk of the design and implementation work
+	and testing began in March, 2000
+
+	HP-UX 11.11 is the first version that provides PSTAT support
+	for lsof.  HP-UX versions in between 11.0 and 11.11 -- all
+	Beta versions as far as I can determine -- have no lsof
+	support.
+
+	See the "PSTAT-based HP-UX lsof Questions" section for
+	questions and answers specific to PSTAT-based HP-UX lsof.
+	The next section, "Why doesn't a /dev/kmem-based HP-UX lsof
+	compilation use -O?" covers /dev/kmem-based HP-UX lsof.
+
+	The /dev/kmem-based lsof sources may be found in the kmem
+	subdirectory of the dialects/hpux branch of the lsof source
+	tree.  The PSTAT-based lsof sources may be found in
+	.../dialects/hpux/pstat.
+
+9.2	/dev/kmem-based HP-UX lsof Questions
+
+	The sources for /dev/kmem-based lsof for HP-UX may be found
+	in lsof_<revision>/dialects/hpux/kmem.
+
+	Lsof's Configure shell script decides to use these sources
+	when it finds that the /usr/include/sys/pstat subdirectory
+	doesn't exist.
+
+	Lsof can be forced to use the /dev/kmem sources by setting
+	"/dev/kmem" in the HPUX_BASE environment variable.  Consult
+	the Configure shell script and 00XPORTING for more information.
+
+9.2.1	Why doesn't a /dev/kmem-based HP-UX lsof compilation use -O?
+
+	If you only have the standard (bundled) HP-UX C compiler
+	and haven't purchased and installed the optional one, then
+	you can't use cc's -O option.  The HP-UX cc(1) man page
+	says this:
+
+	  "Options
+	     Note that in the following list, the cc and c89 options
+	     -A , -G , -g , -O , -p , -v , -y , +z , and +Z are
+	     not supported by the C compiler provided as part of
+	     the standard HP-UX operating system.  They are supported
+	     by the C compiler sold as an optional separate product."
+
+	Lsof's Configure script tries to detect what C compiler
+	product you have installed by examining your compiler.  If
+	that examination reveals a standard (bundled) compiler,
+	lsof avoids using -O.
+
+	If the Configure compiler test fails, the C compiler will
+	complain that it doesn't support -O.  You can suppress that
+	complaint with this make invocation:
+
+	    $ make DEBUG=""
+	
+9.2.2	Why doesn't the /dev/kmem-based CCITT support work under 10.x?
+
+	Pasi Kaara, who originally provided the HP-UX CCITT support,
+	reports that it no longer works under HP-UX 10.x.
+	Consequently, at lsof revision 4.02 it has been disabled.
+
+9.2.3	Why can't /dev/kmem-based lsof be compiled with `cc -Aa` or
+	`gcc -ansi` under HP-UX 10.x?
+
+	Some HP-UX 10.x header files, needed by lsof, can't be
+	compiled properly in ANSI_C mode; structure element definition
+	and alignment problems result.  The f_offset member of the
+	file structure, for example, is incorrect.
+
+	This ANSI-C obstacle extends to using the -Aa option of
+	the HP C compiler and the -ansi option of gcc.
+
+9.2.4	Why does /dev/kmem-based lsof complain about no C compiler?
+
+	Lsof's Configure script looks in /bin and /usr/ccs/bin for
+	an HP C compiler, because it needs to know if the compiler
+	is the standard (bundled) one or the optional separate
+	product.  If it finds no compiler in either place, Configure
+	quits after complaining:
+
+	    No executable cc in /bin or /usr/ccs/bin
+
+	If you don't have a C compiler in either of these standard
+	places, you should consider installing it.  If you have
+	gcc installed, you can use it by declaring the ``hpuxgcc''
+	abbreviation to lsof's Configure script.
+
+	If you have a C compiler in a non-standard location, you
+	can use the HPUX_CCDIR[12] environment variables to name
+	the path to it.  Consult the 00XCONFIG file of the lsof
+	distribution for more information.
+
+9.2.5	Why does Configure complain about q4 for /dev/kmem-based lsof
+	for HP-UX 11?
+
+	When you run Configure on an HP-UX 11 system, it may complain:
+
+	  !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!
+	  Configure can't use /usr/contrib/bin/q4 to examine the ipis_s
+	  structure.  You must do that yourself, report the result in
+	  the HPUX_IPC_S_PATCH environment variable, then repeat the
+	  Configure step.  Consult the Configure script's use of
+	  /usr/contrib/bin/q4 and the 00XCONFIG file for information
+	  on ipis_s testing and the setting of HPUX_IPC_S_PATCH.
+	  !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!
+
+	This message states that Configure cannot use q4 from
+	/usr/contrib/bin to examine the kernel's boot image for
+	the ipis_s structure.  Maybe q4 hasn't been installed, or
+	perhaps Configure can't execute it.
+
+	Lsof needs to gather information about ipis_s to determine
+	if the ipis_s structure is defined in the kernel boot image,
+	if the ipis_s structure of the kernel boot image has an
+	ipis_msgsqueued member, and if the ipc_s structure of the
+	kernel boot image uses has an ipc_ipis member.
+
+	The ipis_s structure isn't described in any header file
+	HP-UX releases with HP-UX 11.  It appears in the private
+	lsof header file .../dialects/hpux/kmem/hpux11/ipc_s.h.
+	Lsof gets local and remote connection addresses (IP and
+	port numbers) from ipc_s, so an incorrect ipc_s definition
+	may cause incorrect reporting of TCP/IP connection addresses.
+	It definitely will cause incorrect reporting on 32 bit
+	kernels.  In any case lsof should be compiled with a correct
+	ipc_s definition no matter the kernel bit size, so the
+	Configure script always tests for it when the HP-UX version
+	is 11.
+
+	For lsof's Configure script to gather the necessary ipis_s
+	information q4 needs to be installed in /usr/contrib/bin
+	and the kernel boot image, /stand/vmunix, needs to have
+	been processed with pxdb.  If either is untrue, lsof issues
+	the above error message, perhaps preceded by q4 messages.
+	(Note: lsof's use of q4 may also fail if q4 can't execute
+	nm -- e.g., it can't find /usr/bin/nm, or there is a
+	conflicting, private version of nm earlier in the path.)
+
+	If /stand/vmunix hasn't been processed by pxdb, the q4
+	messages will include:
+
+	    q4: (error) vmunix not pxdb'd
+	or
+	    q4: (warning) /stand/vmunix has not been processed by pxdb.
+
+	It's possible to make a suitable private copy of /stand/vmunix
+	for configuring lsof.  That requires /opt/langtools/bin/pxdb
+	or the q4 version of pxdb from /usr/contrib/bin/q4pxdb.
+	The path to the result is supplied to the lsof Configure
+	script in the HPUX_BOOTFILE environment variable.  Configure
+	still requires /usr/contrib/bin/q4.
+
+	The following sample Bourne shell commands make a private
+	copy of /stand/vmunix in /tmp, process it with pxdb or
+	q4pxdb, and supply its path to lsof's Configure script in
+	HPUX_BOOTFILE.
+
+	    $ cp /stand/vmunix /tmp/vmunix.lsof
+
+	    $ /opt/langtools/bin/pxdb /tmp/vmunix.lsof
+	  or
+	    $ /usr/contrib/bin/q4pxdb /tmp/vmunix.lsof
+
+	    ... pxdb messages ...
+	    $ HPUX_BOOTFILE=/tmp/vmunix.lsof Configure -n hpux
+
+	It may also be necessary to use q4 outside the lsof Configure
+	script.  In that case q4 can be to determine the state of
+	ipis_s and ipc_s with these q4 commands:
+
+	    $ /usr/contrib/bin/q4 /stand/vmunix
+	    ...
+	    q4> fields -c struct ipc_s
+	    ...
+	    q4> fields -c struct ipis_s
+
+	Look in the q4 output for the ipc_ipis member of the ipc_s
+	structure, and look in the q4 output for the ipis_s structure
+	for the ipis_msgsqueued member.  If ipc_s has ipc_ipis but
+	ipis_s lacks ipis_msgsqueued, set HPUX_IPC_S_PATCH environment
+	variable to "1".  If ipc_s has ipc_ipis and ipis_s has
+	ipis_msgsqueued, set HPUX_IPC_S_PATCH to "2" -- e.g.,
+
+	    $ HPUX_IPC_S_PATCH=1 Configure -n hpux
+	  or
+	    $ HPUX_IPC_S_PATCH=2 Configure -n hpux
+
+	If ipc_s has no ipc_ipis member, set HPUX_IPC_S_PATCH to
+	"N" -- e.g., use this Configure step:
+
+	    $ HPUX_IPC_S_PATCH=N Configure -n hpux
+
+9.2.6	When compiling /dev/kmem-based lsof for HP-UX 11 what do the
+	"aCC runtime: ERROR..." messages mean?
+
+	When the lsof Makefile asks the HP-UX unbundled compiler
+	to load lsof, it may complain:
+
+	    /bin/cc -o lsof  -DHPUXV=1100 -DHASVXFS -DHPUXKERNBITS=64 \
+		-I/home/abe/src/lsof4/dialects/hpux/kmem/hpux11 +DD64 \
+		-DHAS_IPC_S_PATCH=2 -I/home/abe/src/lsof4/dialects/hpux/kmem \
+		-DLSOF_VSTR=\"B.11.00\"  -g dfile.o dmnt.o dnode.o dnode1.o \
+		dnode2.o dproc.o dsock.o  dstore.o  arg.o main.o misc.o \
+		node.o print.o proc.o store.o usage.o -L./lib -llsof  -lelf \
+		-lnsl
+	    aCC runtime: ERROR: Unexpected use of shared libraries
+	    aCC runtime: ERROR: Read aCC manpage, +A option
+	    /usr/lib/nls/loc/locales.1//is_IS.iso88591
+
+	This is a bug in the HP-UX national language support.
+	(Notice the last message with "locales" in it?)  Complain
+	to HP -- then use this work-around before executing make:
+
+	    $ unset LANG
+	    $ make
+
+9.2.7	Why doesn't /dev/kmem-based lsof for HP-UX 11 report VxFS file
+	link counts, node numbers, and sizes correctly?
+
+	This is usually the result of running an lsof binary whose
+	revision number is less than 4.57 on a system that has
+	OnlineJFS support installed.  It can also happen with lsof
+	4.57 binaries when the OnlineJFS support with which they
+	were built doesn't match the OnlineJFS status of the system
+	on which they are run.
+
+	The OnlineJFS status of lsof 4.57 and higher binaries can
+	be determined by running:
+
+	    $ lsof -v 2>&1 | grep HASONLINEJFS
+
+	If that shell pipe produces output, lsof was compiled with
+	OnlineJFS support enabled; no output, disabled.
+
+	If OnlineJFS is installed on an HP-UX 11 system the
+	/sbin/fs/vxfs/subtype executable exists and outputs "vxfs3.3"
+	when run.
+
+	The problem occurs because the optional OnlineJFS support
+	installation doesn't update <sys/fs/vx_inode.h>.  Consequently
+	lsof can be compiled with an incorrect definition of the
+	vx_inode structure and look for for link counts, node
+	numbers, and sizes in the wrong places in the structure.
+
+	The current response I have gotten from HP is that no
+	<sys/fs/vx_inode.h> update will be provided for OnlineJFS.
+
+	I've addressed this problem temporarily with a work-around
+	(hack) in lsof revision 4.57.
+
+9.2.8	Why can't /dev/kmem-based lsof be built with gcc for 64 bit
+	HP-UX 11?
+
+	When Configure is given the "hpuxgcc" abbreviation, the
+	HP-UX version is 11, and the kernel bit size is 64, the
+	lsof Configure script may abort with the messages:
+
+	    !!!!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!!!!
+
+	    APPARENTLY GCC CANNOT BUILD 64 BIT EXECUTABLES.
+	    A COMPILER MUST BE USED THAT CAN.  SEE 00FAQ
+	    FOR MORE INFORMATION.
+
+	(This is the "more information" in 00FAQ.)
+
+	This means the Configure script compiled a test program
+	with gcc the result wasn't an ELF-64 binary.  Lsof tries
+	two gcc modes, one with no options and another with the
+	-mlp64 option, before it concludes gcc can't be used.
+
+	See the "How can I acquire a gcc for building lsof for 64
+	bit HP-UX 11?" answer for information on where you might
+	be able to get a gcc for HP-UX 11 that can produce ELF-64
+	executables.
+
+9.2.8.1	How can I acquire a gcc for building lsof for 64 bit HP-UX 11?
+
+	Check this HP URL:
+
+	  http://h21007.www2.hp.com/dspp/tech/tech_TechSoftwareDetailPage_IDX/1,1703,547,00.html
+
+	(That's one very long link; be careful you cut 'n paste it
+	all.)
+
+	In November 2001 that URL led to a web page whose title
+	was "gcc for hp-ux 11."  The page offered a link for
+	downloading a 64 bit gcc 3.0 compiler for HP-UX 11.0 and
+	11i.  Rich Rauenzahn of HP installed that compiler on an
+	HP test system he allows me to use and I successfully built
+	a 64 bit lsof with it.
+
+	The HP package may install the 64 bit capable gcc in
+	/usr/local/pa20_64/bin/gcc, so you may have to adjust your
+	path or set the LSOF_CC environment variable to compensate.
+
+9.2.9   Why does /dev/kmem-based lsof for HP-UX 11 report "unknown file
+	system type" for some open files?
+
+	The lsof binary being used probably doesn't have support for
+	the VxFS file system.
+
+	To confirm that, check `lsof -v` output for "-DHASVXFS".  If
+	it's not present, lsof doesn't have VxFS support.
+
+	You also need to establish that lsof really is complaining
+	about VxFS files by checking the kernel boot file for the
+	symbol associated with the hexadecimal address reported in the
+	"unknown file system type" message -- e.g., "v_op: 0x8711c8."
+	Use nm(1) to do that:
+
+	    $ nm -x /stand/vmunix | grep 8711c8
+
+	If nm reports the symbol associated with the address is
+	vx_vnodeops, then lsof is complaining about an open VxFS file.
+
+	The solution in that case is to build lsof yourself (The
+	bundled C compiler will do it.), making sure that lsof's
+	Configure script detects the presence of VxFS.  Configure does
+	that by finding these two header files:
+
+	    /usr/include/sys/fs/vx_hpux.h
+	    /usr/include/sys/fs/vx_inode.h
+
+	If the system where you are building lsof doesn't have those
+	header files, but does have VxFS, you might be able to install
+	the header files by installing the HP JournalFS package from
+	the CoreOS CD -- in particular the file set JournalFS.VXFS-PRG
+	and its associated patch, PHKL_18543.  (My thanks to Steve
+	Bonds for that information.)
+
+	Finally, if you find that lsof isn't complaining about VxFS
+	when it complains about an unknown file system type, send
+	e-mail to me <abe@purdue.edu> for further assistance.  Make
+	sure "lsof" appears in the "Subject:" line so my e-mail filter
+	won't classify your letter as Spam.
+
+9.2.10	Why does the ANSI-C compiler complain about comments in HP-UX
+	11 header files?
+
+	When compiling lsof on HP-UX 11, the HP ANSI-C compiler's
+	pre-processor, cpp, may complain about comments in HP-UX header
+	files -- e.g.,
+
+	    cpp: "/usr/include/sys/cdfs.h", line 232: warning 2028:
+		Found comment inside comment started on line 232.
+	    cpp: "/usr/include/sys/cdnode.h", line 196: warning 2028:
+		Found comment inside comment started on line 196.
+	    cpp: "/usr/include/nfs/snode.h", line 30: warning 2028:
+		Found comment inside comment started on line 30
+
+	This is not a problem with lsof.  It is a problem with the
+	HP-UX header files; they have non-compliant ANSI-C comment
+	sequences in them -- e.g.,
+
+	    <sys/cdfs.h>: 232
+		/* struct  cdfs *cdfs_link;  /* linked list of file systems */
+
+	The initial "/*" is not terminated by an ending "*/" before the
+	appearance of a second "/*".
+
+9.2.11  Why does dnode1.c cause the HP-UX 11 compiler to complain that
+	<sys/fs/vx_inode.h> is missing or incorrect?
+
+	If CFLAGS in the lsof Makefile for an HP-UX 11 compilation
+	includes HASONLINEJFS, indicating the system has OnlineJFS
+	support, lsof needs the <sys/fs/vx_inode.h> header file.
+	Sometimes it is missing from /usr/include/sys/fs.
+
+	<sys/fs/vx_inode.h> is a header file that must be obtained from
+	Veritas.  If that proves impossible, please contact me via
+	e-mail at <abe@purdue.edu>.  Make sure "lsof" appears in the
+	"Subject:" line so my e-mail filter won't classify your letter
+	as Spam.
+
+
+9.3	PSTAT-based HP-UX lsof Questions
+
+	The sources for PSTAT-based lsof for HP-UX may be found in
+	lsof_<revision>/dialects/hpux/pstat.
+
+	Lsof's Configure shell script decides to use these sources
+	when it finds that the /usr/include/sys/pstat subdirectory
+	exists.
+
+	Lsof can be forced to use the PSTAT-based sources by setting
+	"pstat" in the HPUX_BASE environment variable.  Consult
+	the Configure shell script and 00XPORTING for more information.
+
+9.3.1	Why does PSTAT-based lsof complain about pst_static and
+	other PSTAT structures?
+
+	When lsof starts it may issue one of these fatal error
+	messages:
+
+	    lsof: FATAL: can't determine PSTAT static size
+	    lsof: FATAL: can't read <n> bytes of pst_static
+	    lsof: FATAL: pst_static doesn't contain <name>_size
+	    lsof: FATAL: <name>_size should be <n>
+
+	These messages indicate that lsof's tests for the proper
+	level of PSTAT support have failed.  The structure names,
+	given in <name>, and sizes, given in <n>, identify the
+	support deficiency more precisely.
+
+	You may need to upgrade the PSTAT support in your kernel
+	to be able to use PSTAT-based lsof.
+
+9.3.2	Why does PSTAT-based lsof complain it can't read pst_*
+	structures?
+
+	Lsof may put messages like the following in the NAME
+	column of its output.
+
+	    can't read cwd pst_filedetails: Permission denied
+	    can't read mem pst_filedetails: Permission denied
+	    can't read rtd pst_filedetails: Permission denied
+	    can't read txt pst_filedetails: Permission denied
+	    can't read pst_filedetails: Permission denied
+	    can't read 3 stream structures: Permission denied
+	    can't read pst_socket: Permission denied
+
+	These messages indicate that the lsof binary lacks the
+	authority to read the name structures for processes other
+	than ones belonging to the UID under which lsof is running.
+	Authority to read the structures of other processes is
+	limited to root processes -- i.e., lsof must have setuid-root
+	permission if it is to list open files for arbitrary
+	processes.
+
+	If you want to eliminate these errors, you must run lsof
+	as root or install it with setuid-root permission.
+
+9.3.3	Why does PSTAT-based lsof rebuild the device cache file
+	after each reboot?
+
+	After each HP-UX rebuild, the first time a user runs lsof it
+	will report:
+
+	    lsof: WARNING: device cache mismatch: /dev/tun...
+	    lsof: WARNING: created device cache file: /<user_path>
+
+	This happens because the device numbers on /dev/tun* device
+	nodes are recalculated at each reboot.  When lsof detects
+	a change in the device number of a /dev/tun* file, it rebuilds
+	its local device cache file.
+
+9.3.4	Why doesn't PSTAT-based lsof report TCP addresses for
+	telnetd's open socket files?
+
+	When lsof can't report TCP addresses for telnetd's open
+	socket files it is because an unpatched PSTAT kernel
+	interface doesn't report the addresses to lsof.
+
+	This has been addressed in PSTAT kernel patch PHKL_24047.
+	It is available from the HP IT Resource Center at:
+
+	    http://itrc.hp.com
+
+	In the page's "maintenance / support" box select the
+	"individual patches" link.  Once at its page, select the
+	"hp-ux" link.  On that page select the "Series 800" or
+	"Series 700" radio button and select "11.11" from the
+	pull-down list to the right of the button.  Under "search
+	or browse the path list" select "Search by Patch IDs" from
+	the pull down list, enter PHKL_24047 in the following text
+	box, and select search.  That should lead to information
+	about PHKL_24047 and a link for downloading it.  (You may
+	have to log in first and you may have to create a login
+	identity by registering before you can log in.)
+
+	Some time in March 2006 the PHKL_24047 patch was "lost"
+	by the HP-UX networking lab.  It has been "found" again
+	in August 2006 and will be re-released as a GRO patch
+	"some time."  I don't yet know when that will be.  You
+	must contact HP to learn about the availability of the
+	GRO patch.
+
+9.3.5	Why does PSTAT-based lsof cause an HP-UX 11.11 kernel panic?
+
+	When PSTAT-based lsof runs on some HP-UX 11.11 kernels,
+	the kernel may panic.  Symptoms include:
+
+	  Console message:
+	    0xFBE000301100EF00 00000000 0000EF00 -
+	    type 31 = legacy PA HEX chassis-code
+
+	  /var/adm/syslog:
+	    ... vmunix: Trap Type 15 (Data page fault)
+	    ... vmunix:   Instruction Address (pcsq.pcoq) = 0x...
+
+	The panic is caused by a bug in the way PSTAT's pstat_getstream()
+	function obtains module names from streams managed by the
+	otsam stream driver (part of OSI Transport Services).  Lsof
+	calls pstat_getstream() when it encounters an open otsam
+	stream file.  An HP-UX 11.11 system uses otsam if otsam
+	appears in /stand/system.
+
+	HP-UX 11.11 patch PHKL_24507 (available some time after
+	July 15, 2001) fixes the pstat_getstream() bug.  See the
+	information in the answer to the "Why doesn't PSTAT-based
+	lsof report TCP addresses for telnetd's open socket files?"
+	question for information on how to obtain the patch.
+
+9.3.6   Why doesn't PSTAT-based lsof report a CWD that is on a loopback
+	(LOFS) file system?
+
+	When PSTAT-based lsof reports on processes whose current
+	working directory (CWD) is on a loopback file system, lsof
+	can't report the open CWD file.  The reason is that the HP-UX
+	11.11 and above kernel's loopback file system code is not
+	passing the CWD file ID to the kernel's pstat(2) code.  Hence
+	lsof is given no information on the lofs CWD.
+
+	The problem was first reported to me by Ermin Borovac and an
+	internal bug report was filed with the HP-UX file system group
+	on October 26, 2004.  That report has now been answered by the
+	patch PHKL_33200 -- s700_800 11.11 lofs cumulative patch.  The
+	HP IT Resource Center (http://itrc.hp.com) is a source for the
+	patch.
+
+9.3.7	Why do some swinstall packages for PSTAT-based HP-UX 11.11
+	packages complain about setgid and setuid bits?
+
+	First, let me explain that I do not provide lsof swinstall
+	packages for lsof.  Others provide them and they should be
+	contacted about problems with their packages.
+
+	However, I have become aware of a problem with one package
+	about which I have some information I can share.  The problem
+	shows up in these swinstall messages:
+
+	    ERROR:   Unknown owner and/or group for file
+		     "/usr/local/bin/lsof". SUID and/or SGID bit was
+		     not set. 
+	    ERROR:   Failed installing fileset "lsof.lsof-RUN,r=4.73".
+		     Check the above output for details.
+
+	The swpackage SUID/SGID functionality was restricted by changes
+	for POSIX compliance, breaking backward compatibility.  The
+	patch PHCO_27671 allows SUID/SGID for uid/gid of 0 only, as a
+	compromise between backward compatibility and POSIX conformance.
+
+	If the setuid bit is to be set on the executable, the UID and
+	GID of the executable must be 0 (zero).
+
+9.3.8	Why won't the bundled C compiler build PSTAT-based lsof for
+	PA-RISC HP-UX 11.23?
+
+	A PA-RISC HP-UX 11.23 bundled C compiler dated May 2005 or
+	later will not build PSTAT-based lsof.  It will deliver error
+	messages related to the system's <gssapi/gssapi.h> header
+	file.
+
+	There is nothing wrong with that header file or lsof.  The
+	problem is that the bundled C compiler can't cope with the
+	gssapi.h header file.
+
+	The work-around is to use the HP ANSI C compiler.   Using gcc
+	is not a satisfactory work-around.  See the answer to the "Why
+	won't gcc build PSTAT-based lsof for PA-RISC HP-UX 11.23?"
+	question for more information.
+
+9.3.9	Why won't gcc build PSTAT-based lsof for PA-RISC HP-UX 11.23?
+
+	Gcc will not even compile PSTAT-based lsof revisions below 4.77
+	for PA-RISC HP-UX 11.23 dated May 2005 or later.  It reports
+	errors in lsof's print.c fill_portmap() function about missing
+	members of the rpcent structure.  That happens because gcc
+	defines _XOPEN_SOURCE_EXTENDED which disables the definition of
+	the rpcent structure in <netdb.h>.
+	
+	Using the HP bundled C compiler is not a viable work-around.
+	That is explained in the answer to the "Why won't the bundled C
+	compiler build PSTAT-based lsof for PA-RISC HP-UX 11.23?"
+
+	While an lsof revision 4.77 or higher can be compiled with gcc,
+	the results are unreliable.  Lsof will compile, but it
+	occasionally produces segment faults when it runs.  I have not
+	been able to reproduce the failure reliably or locate a
+	debugger that will work with the gcc-compiled lsof.
+
+	The only reliable work-around is to use the HP ANSI C
+	compiler.
+
+9.3.10	Why does PSTAT-based lsof complain, "FATAL: pst_stream_size
+	should be: 672; is 72" on HP-UX 11.11 and above?
+
+	This message indicates a mismatch between the PSTAT header
+	files used to build lsof (<sys/pstat.h> and those in the
+	/usr/include/sys/pstat subdirectory), and those that built the
+	running kernel.
+
+	Unfortunately the June 2008 patch set for HP-UX 11.23 creates
+	this inconsistency, because it does not contain all the patches
+	needed to match the kernel with the PSTAT header files.  Even
+	more serious is that the missing patches update the kernel's
+	PSTAT support to provide TCP/UDP endpoint information to lsof
+	from TCP/TLI streams.
+
+	The patch inconsistency comes about because, while the following
+	patch is installed,
+
+	    PHKL_36577  1.0  PM-PSTAT section 2 manpage changes
+
+	other kernel patches are not.
+
+	The PHKL_36577 patch updates the PSTAT header files and manual
+	pages to match kernel changes that other patches with the
+	following numbers (or patches that contain or supersede them)
+	contain:
+
+	    PHNE_36575  1.0  Cumulative STREAMS Patch
+	    PHNE_37670  1.0  cumulative ARPA Transport patch
+	    PHNE_37851  1.0  NFS cumulative patch
+
+	Those patches implement the kernel changes that support the
+	delivery of information promised in patch PHKL_36577.
+
+	The work-around is to install the missing patches.
+
+9.4	Why won't the HP-UX depot install?
+
+	I don't distribute lsof depots, so I can't support them.
+
+	From time to time depots prepared by various sites -- e.g.,
+	usually HP-UX software collection sites -- will contain errors
+	that cause installation of the depot to fail.
+
+	Do not contact me when this happens.  Instead, contact the
+	administrator of the site that prepared the depot.
+
+	As should be clear from the bulk of the lsof documentation, I
+	do not recommend you use pre-built lsof binaries in any form.
+	Instead, I recommend you obtain the lsof source distribution
+	and build lsof yourself.
+
+
+10.0	Linux
+
+10.1	What do /dev/kmem-based and /proc-based lsof mean?
+
+	At approximately Linux 2.1.72 and exactly at lsof revision
+	4.23 support for Linux forks.  The first fork, containing
+	the oldest lsof form is based on access to kernel memory
+	structures, and is called /dev/kmem-based lsof.  A
+	/dev/kmem-based lsof is heavily intertwined with the Linux
+	kernel version, its header files, and its system map file.
+	Typically a /dev/kmem-based lsof needs only setgid permission
+	to local all open file information.
+
+	After approximately Linux 2.1.72 and at revision 4.23 lsof
+	obtains all its information from the /proc file system.
+	That lsof is called the /proc-based lsof.  A /proc-based
+	lsof does not read kernel memory, needs neither kernel
+	header files nor the system map file, and is less likely
+	to be affected by Linux kernel changes.  However, it does
+	require setuid-root permission to list all open files, and
+	it can't report file offsets (positions).
+
+	After revision 4.52 the /dev/kmem-based Linux sources for
+	lsof are no longer distributed.  Information about them
+	may be found in the 00INDEX and README files at:
+
+	    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD/src
+
+10.2	/proc-based Linux lsof Questions
+
+10.2.1	Why doesn't /proc-based lsof report file offsets (positions)?
+
+	/proc-based lsof revisions 4.79 and above can only report file
+	offsets (positions) for the files of Linux kernels 2.6.22 and
+	above.
+
+	During its initialization /proc-based lsof tests to see if
+	offset information can be obtained.  If it cannot, lsof
+	disables offset reporting.  If the -o option was selected, lsof
+	also issues this warning:
+
+	    lsof: WARNING: can't report offset; disregarding -o.
+
+
+10.2.2	Why does /proc-based lsof report "can't identify protocol" for
+	some socket files?
+
+	/proc-based lsof may report:
+
+	    COMMAND PID ... TYPE ... NODE NAME
+	    pump    226 ... sock ...  309 can't identify protocol
+
+	This means that it can't identify the protocol (i.e., the
+	AF_* designation) being used by the open socket file.  Lsof
+	identifies protocols by matching the node number associated
+	with the /proc/<PID>/fd entry to the node numbers found in
+	selected files of the /proc/net sub-directory.  Currently
+	/proc-based lsof examines these protocol files:
+
+	    /proc/net/ax25		(untested)
+	    /proc/net/ipx		(needs kernel patch)
+	    /proc/net/raw
+	    /proc/net/raw6
+	    /proc/net/tcp
+	    /proc/net/tcp6
+	    /proc/net/udp
+	    /proc/net/udp6
+	    /proc/net/unix
+
+	If /proc-based lsof says it can't identify the protocol
+	for an open socket file, you may be able to identify the
+	protocol yourself by using grep to look for the specific
+	node number in the files of /proc/net -- e.g.,
+
+	    $ grep <node_number> /proc/net/*
+
+	You may not be able to find the desired node number, because
+	not all kernel protocol modules fully support /proc/net
+	information.
+
+	If you find a matching node number in a /proc/net file that is
+	not currently being processed by lsof, contact me via e-mail at
+	<abe@purdue.edu>.  I'll discuss adding support to /proc-based
+	lsof for the protocol of the /proc/net file with you.  Make
+	sure "lsof" appears in the "Subject:" line so my e-mail filter
+	won't classify your letter as Spam.
+
+	The code that matches node numbers of open IPX protocol
+	socket files to those in /proc/net/ipx requires Jonathan
+	Sergent's Linux 2.1.79 patch to /usr/src/linux/net/ipx/af_ipx.c.
+	The patch, suitable for input to Larry Wall's patch program,
+	may be found in the lsof distribution file:
+
+	    .../dialects/linux/proc/patches/net_ipx_af_ipx.c.patch
+
+10.2.3	Why does /proc-based lsof warn about unsupported formats?
+
+	Lsof may issue the following warning:
+
+	    lsof: WARNING: unsupported format: /proc/net/<file>
+
+	if the header line of the indicated <file> in /proc/net --
+	ax25, ipx, raw, tcp, udp, or unix -- doesn't match what
+	lsof expects to find.
+
+	When the header line of a /proc/net file isn't what lsof
+	expects, lsof probably can't parse the rest of the file
+	correctly and doesn't try.  As a result, lsof can't report
+	any NAME column information (e.g., local and remote addresses)
+	for socket files bound to the indicated network protocol.
+
+	If you get this warning, please send me e-mail at <abe@purdue.edu>.
+	Include the contents of the file lsof claims has an unsupported
+	format.  Make sure "lsof" appears in the "Subject:" line so my
+	e-mail filter won't classify your letter as Spam.
+
+10.2.4   Why does /proc-based lsof report "(deleted)" after a path name?
+
+	The "(deleted)" notation following a path name in /proc-based
+	lsof's NAME column comes from the /proc/<PID>/fd/<FD> entry
+	for the open file.  It's the Linux kernel's way of indicating
+	the file is open but has been unlinked (rm'd).
+
+10.2.5	Why doesn't /proc-based lsof report full open file information
+	for all processes?
+
+	/proc-based lsof can only report on processes whose /proc
+	files it has permission to read.  /proc normally grants
+	permission to read all its files only to root or to the
+	owning user ID.
+
+	Without permission to read most /proc files, lsof can only
+	report full information for processes belonging to the user
+	who is running lsof.  /proc-based lsof may be able to report
+	some information for all processes, depending on the
+	permissions of their associated /proc files, but usually
+	/proc-based lsof won't be able to access the files in
+	/proc/<PID>/fd/ that describe regular open files.
+
+	If you want /proc-based lsof to report on all processes, you
+	must install it with setuid-root permission.
+
+10.2.6	Why won't Customize offer to change HASDCACHE or WARNDEVACCESS
+	for /proc-based lsof?
+
+	/proc-based lsof doesn't read device information from /dev
+	or the device cache file, so it makes no sense to change
+	the state of device cache processing or /dev node accessibility
+	warnings.
+
+10.2.7	/proc-based lsof Linux NFS questions
+
+10.2.7.1 Why can't lsof find files on an accessible NFS file system?
+
+	On occasion lsof may be unable to identify that an open
+	file is on an NFS file system.  This is most likely the
+	result of a bug in the way the Linux kernel supplies
+	information to the reader of /proc/mounts (lsof) -- sometimes
+	that pseudo-file is truncated by the kernel.
+
+	One way to see if this is the case is to search for the
+	NFS file system in /proc/mounts -- e.g.,
+
+	    $ grep <NFS_file_system_mount_point> /proc/mounts
+
+	If you get no output or the third word of the output isn't
+	"nfs", then lsof won't consider the file system an NFS file
+	system.
+
+	A second test is to look at the end of /proc/mounts --
+	e.g.,
+
+	    $ tail /proc/mounts
+
+	If tail reports "# truncated" then /proc/mounts is incomplete
+	because of a Linux kernel bug.  The bug is documented at:
+
+	    http://www.xss.co.at/sysinfo/mounts.html
+
+	The bug is fixed in Linux kernel 2.4.18, and possibly in
+	some earlier Linux kernel versions.
+
+10.2.7.2 Why can't lsof find files on an inaccessible NFS file system?
+
+	If lsof issues this message about a Linux file system,
+	mounted from an NFS server:
+
+	    lsof: WARNING: can't stat() nfs file system /xxx/yyy
+
+	Then lsof won't be able to find any open files on the file
+	system.
+
+	That's because of an inadequacy in the Linux /proc file
+	system.  Its /proc/mounts file doesn't give the device
+	doublet (major and minor numbers) of the file system as do
+	many UNIX systems (e.g., Solaris).  The only way lsof can
+	get the device doublet for a Linux file system is to call
+	stat(2) on the file system path, which fails if the NFS
+	server isn't accessible.
+
+	When lsof doesn't know the device doublet of a file system,
+	it can't find open files on the inaccessible file system,
+	because it can't match the doublets of open files to the
+	doublet of the inaccessible file system.
+
+	This topic is covered extensively in lsof(8) it its ALTERNATE
+	DEVICE NUMBERS and BLOCKS AND TIMEOUTS sections.
+
+10.2.8	Why doesn't /proc-based Linux lsof report socket options and
+	values, socket state flags, and TCP options and values?
+
+	The Linux /proc file system doesn't report socket options
+	and values, socket states, and TCP options and values to
+	lsof.
+
+10.2.9	Does /proc-based Linux lsof use a device cache?
+
+	No.  The Linux /proc/<PID>/fd/* entries provide device names to
+	lsof via readlink(2).  It is not necessary to enable device
+	cache processing for /proc-based Linux lsof via the Customize
+	script or modifications to the Linux machine.h header file.
+
+10.2.10	Why doesn't /proc-based Linux lsof report any or all file structure
+	values for its +fcfgGn option?
+
+	/proc-based lsof revisions 4.79 and above can only report some
+	file structure values for Linux kernels below 2.6.22.
+
+	When running on Linux kernels at 2.6.22 and above lsof 4.79 can
+	report some file flag values -- i.e., in response to the +fg or
+	+fG options.  The flag values are obtained from the
+	/proc/<PID>/fdinfo/ files introduced at Linux kernel 2.6.22.
+
+	/proc-based Linux lsof tests its availability to obtain file
+	flag values at initialization.  If values are not available,
+	lsof disables file flag reporting.  If the flags were requested
+	with +fg or +fG, lsof displays this warning:
+
+	    lsof: WARNING: can't report file flags; disregarding +f.
+
+	As a special note, when Linux lsof can report flag bits, it
+	will not report 'R' for a read-only file.  There is no
+	read-only flag bit O_* symbol in <fcntl.h> (or <bits/fcntl.h>)
+	and lsof reports only bits that are set.  The absence of O_RDWR
+	and O_WRONLY flag bits implies the file is read-only.
+
+10.3	Special Linux file types
+
+10.3.1	Why is ``DEL'' reported as a Linux file type?
+
+	Lsof usually reports entries from the Linux /proc/<PID>/maps
+	file with ``mem'' in the TYPE column.  However, when lsof can't
+	stat(2) a path in the process' ``maps'' file and the ``maps''
+	file entry contains ``(deleted)'', indicating the file was
+	deleted after it had been opened, lsof reports the file type as
+	``DEL''.
+
+10.3.2	Why is ``unknown'' reported as a Linux file type?
+
+	Lsof may report a Linux file's type as ``unknown'' in the TYPE
+	column when lsof can't obtain complete stat(2) results for the
+	file.
+
+	Usually the NAME column will contain a ``(stat: xxx)'' error
+	message, but that could have been suppressed with the lsof
+	``-w'' option.
+
+10.4	Linux ``mem'' Entry Problems
+
+10.4.1  What do ``path dev=xxx'' and ``path inode=yyy'' mean in the
+	NAME column of Linux ``mem'' file types?
+
+	When the device or inode number in the process' ``maps'' file
+	entry doesn't match the stat(2) results from the file path,
+	lsof reports the inconsistent information from the stat(2) of
+	the path parenthetically after the path in the NAME column
+	in one of these forms:
+
+	    (path dev=xxx)              only the device number,
+					``xxx'', from a stat(2) of the
+					``maps'' file entry path
+					differs from the ``maps'' file
+					entry value reported in the
+					DEVICE column.
+
+	    (path inode=yyy)		only the inode number,
+					``yyy'', from a stat(2) of the
+					``maps'' file entry path
+					differs from the ``maps'' file
+					entry value reported in the
+					NODE column.
+
+	    (path dev=xxx inode=yyy)    Both device and inode numbers
+					differ.
+
+	Lsof reports the ``maps'' file device number in the DEVICE
+	column and the inode number in the NODE column.
+
+	When device and inode mismatches occur, lsof suppresses the
+	reporting of link count and size.  See the answer to the "Why
+	is neither link count nor size reported for some Linux ``DEL''
+	and ``mem'' file types?" question for more information.
+
+	Device and inode inconsistencies can occur when a file at a
+	``maps'' path is replaced after the process has started, or
+	when a different file system with similar path names is mounted
+	on top of the original file system.
+
+	The device inconsistency parenthetical messages can be
+	suppressed with lsof's ``-w'' option.
+
+10.4.2  Why is neither link count nor size reported for some Linux
+	``DEL'' and ``mem'' file types?
+
+	Link count and size are not reported for some entries from the
+	process' ``maps'' file because a stat(2) of the entry file path
+	failed or stat(2) delivered device or inode numbers that don't
+	match the ones in the ``maps'' entry.
+
+	When the stat(2) device or inode numbers don't match those in
+	the ``maps'' file entry, it is likely that the stat(2) results
+	don't apply to the file that was originally mapped by the
+	process and whose path appears in the ``maps'' file entry, so
+	lsof tries to avoid reporting possibly incorrect information.
+
+	See the answer to the "What do ``path dev=xxx'' and ``path
+	inode=yyy'' mean in the NAME column of Linux ``mem'' file
+	types?" for more information on how mismatched stat(2) device
+	and inode numbers are reported.
+
+10.5	Special Linux NAME column messages
+
+10.5.1  What does ``(stat: xxx)'' mean in the NAME column of Linux
+	files?
+
+	When lsof tried to stat(2) the path in the NAME column, the
+	stat(2) system call failed and produced an error message of
+	``xxx''.
+
+	This situation usually occurs if the lsof process lacks
+	permission to stat(2) the path -- e.g., the lsof executable
+	lacks root permission, or lsof is attempting to stat(2) a path
+	on an NFS device mounted with the root_squash option.
+
+	The message can be suppressed with lsof's ``-w'' option.
+
+10.5.2  What does ``(readlink: xxx)'' mean in the NAME column of
+	Linux files?
+
+	When lsof tried to convert the /proc/<PID>/fd path, reported in
+	the NAME column, to its full and more meaningful path, the
+	readlink(2) system call used to do the conversion failed.  The
+	readlink(2) failure message is ``xxx''.
+
+	This situation usually occurs if the lsof process lacks
+	permission to readlink(2) some part of the path -- e.g., the
+	lsof executable lacks root permission, or lsof is attempting to
+	stat(2) a path on an NFS device mounted with the root_squash
+	option.
+
+	The message can be suppressed with lsof's ``-w'' option.
+
+10.6	Why is ``NOFD'' reported as a Linux file type?
+
+	When lsof lacks permission to use opendir() on the fd/
+	subdirectory of a process' /proc/<PID> directory, it reports a
+	single file of the type ``NOFD'' (for no file descriptors).
+
+	Lsof reports the the /proc/<PID>/path in the NAME column,
+	followed by "(opendir: xxx)", where ``xxx'' is the error
+	message returned by opendir().
+
+	The ``NOFD'' entry can be suppressed with lsof's ``-w'' option.
+
+10.7    Why does Linux lsof report a NAME column value that begins with
+	``/proc''?
+
+	When lsof has problems processing a ``/proc/<PID>'' entry --
+	e.g., it can't convert the entry to a full and more meaningful
+	path name, or it can't access the /proc/<PID>/fd subdirectory
+	with opendir() -- it will report the /proc/<PID> path in the
+	NAME column.
+
+10.8	Linux /proc/net/tcp* and /proc/net/udp* issues
+
+10.8.1	Why use the Linux -X option?
+
+	If you're not interested in TCP/IP socket information for a
+	particular use of lsof, adding the -X option will make lsof run
+	more quickly, because -X inhibits the reading of the
+	/proc/net/tcp* and /proc/net/udp* files.  For example, you may
+	only be interested in knowing what process has a particular
+	file open.
+
+	When the Linux system has a large number of open TCP/IP socket
+	files, the time savings provided by -X can be significant.
+
+10.8.2	Why does lsof say ``-i is useless when -X is specified''?
+
+	If -X is specified, lsof can't report much information on open
+	TCP/IP socket files.  However, lsof's -i option requests that
+	information.  Hence, the two options conflict and can't be used
+	together.
+
+10.8.3	Why does lsof say ``can't identify protocol (-X specified)''?
+
+	If the Linux lsof -X option is specified and an open socket
+	file can't be identified without accessing the /proc/net/tcp*
+	and /proc/net/udp* files, lsof will report that it can't
+	identify the socket's protocol and that the failure may be
+	caused by the -X specification
+
+
+11.0	NetBSD Problems
+
+11.1	Why doesn't lsof report on open kernfs files?
+
+	Lsof doesn't report on open NetBSD kernfs files because the
+	structures lsof needs aren't defined in the kernfs.h header
+	file in /sys/misc/kernfs.
+
+11.2	Why doesn't lsof report on open files on: file descriptor
+	file systems; /proc file systems; 9660 (CD-ROM) file systems;
+	MS-DOS (floppy disk) file systems; or kernel file systems?
+
+	Lsof is not able to report on open files on certain file
+	system if /usr/src/sys/msdosfs didn't exist when the lsof
+	Configure script ran and lsof was made.  /usr/src/sys/msdosfs
+	contains header files lsof needs for collecting data on
+	certain file system files.
+
+	You can tell if an lsof executable above) lacks support
+	for a file system if the following test of `lsof -v` produces
+	nothing:
+
+	    $ lsof -v 2>&1 | grep <support_enabled_definition>
+	
+	The <support-enabled_definition> will be:
+
+	    File System Type	Definition	Note
+	    ----------------	----------	----
+	    File descriptor	HASFDESCFS
+	    /proc		HASPROCFS
+	    9660		HAS9660FS
+	    MS-DOS		HASMSDOSFS	(lsof 4.61 and above)
+	    Kernel		HASKERNFS
+
+	The work-around is to install /usr/src/sys, rerun the lsof
+	Configure script, and remake lsof.
+
+11.3    Why does lsof produce confusing results for nullfs file
+	systems?
+
+	Consider this report from /sbin/mount:
+
+	    /usr/home on /home type null (local)
+
+	(According to /sbin/mount /usr/home is the mounted-on device
+	and /home is the mounted-on directory.)
+
+	When lsof is asked to report on open files on /home, it
+	will report them as files on /usr/home instead.  That's an
+	artifact of the NetBSD kernel's dynamic name lookup cache
+	(DNLC) and the way the kernel handles nullfs mounted-on
+	directories.
+
+	While lsof will report all open files on /home when given
+	/home as a file system directory argument, even though
+	reporting them as located on /usr/home, lsof will not find
+	the same files when asked to report on all open files on
+	/usr/home when given /usr/home as a file system device
+	argument.  That's because from the mount perspective
+	/usr/home is equivalent to a device, but from the device
+	perspective it is still a directory.
+
+	So, what this lsof command reports:
+
+	    $ lsof /home
+	    ... NAME
+	    ... /usr/home/...
+
+	Won't be duplicated by this lsof command:
+
+	    $ lsof /usr/home
+
+	Another way to look at this confusing /home and /usr/home
+	example is to consider what stat(2) reports.  For /home
+	stat(2) reports a device doublet that matches what lsof
+	finds in open file node structures, while the device doublet
+	stat(2) reports for /usr/home won't match what lsof finds.
+	Nor does the mode reported by stat(2) indicate a block
+	devices, as is the expected case.
+
+	There is no simple answer to this confusion, nor is there
+	even a simple explanation.  Simply be aware that when
+	supplying file system arguments to lsof on NetBSD, use the
+	mounted-on directory name for a nullfs as the lsof argument,
+	and don't be surprised when the NAME column reports the
+	mounted-on device name.
+
+11.4	NetBSD header file problems
+
+11.4.1	Why can't the compiler find some NetBSD header files?
+
+	If the compiler's pre-processor complains it can't find some
+	header files when it compiles lsof source files, /usr/include
+	and /usr/src may not have all the header files lsof needs.
+
+	As a work-around use the NETBSD_SYS environment variable
+	to specify to lsof the location of the additional header
+	files -- e.g.,
+
+	    % setenv NETBSD_SYS /my_source
+	    % ./Configure -n netbsd
+	
+	 or
+	     $ NETBSD_SYS=/mys_source ./Configure -n netbsd
+
+	Caution: using this work-around may cause the lsof Configure
+	script to activate or omit different features, depending
+	on where it finds the header files that determine the state
+	of the features.
+
+11.4.2	Why does NetBSD lsof produce incorrect output?
+
+	If the NetBSD system's kernel was built from header files that
+	don't match those in /usr/include -- e.g., //usr/src has the
+	ones from which the kernel was built -- lsof may build, but
+	won't produce correct output.
+
+	As a possible work-around, try directing the C compiler to
+	select header files from /usr/src before it selects them from
+	/usr/include.  That can be done with the DEBUG make string --
+	e.g.,
+
+	    $ make DEBUG="-I/usr/src -I/usr/include"
+	
+	If that work-around fails, try using the LSOF_INCLUDE and
+	NETBSD_SYS environment variables to swap /usr/include and
+	/usr/src when running the Configure script, then use the make
+	DEBUG string when running make -- e.g.,
+
+	    $ LSOF_INCLUDE=/usr/src; export LSOF_INCLUDE
+	    $ NETBSD_SYS=/usr/include; export NETBSD_SYS
+	    $ ./Configure -n netbsd
+	    $ make DEBUG="-I/usr/src -I/usr/include"
+
+11.5	Why isn't lsof feature xxx enabled for NetBSD?
+
+	Lsof's Configure script enables NetBSD features by locating
+	and examining header files associated with the features,
+	and based on what it finds, setting compile-time definitions
+	in Makefiles.  (See 00PORTING for a list of the definitions.)
+
+	When Configure doesn't find header files or doesn't find
+	appropriate values in header files, that may mean the header
+	file tree lsof is searching is incomplete or out of date.
+
+	Lsof normally looks for NetBSD header files in /usr/include.
+	It can also be directed to look in other directories --
+	e.g., /sys -- if told to do so with the contents of the
+	LSOF_INCLUDE and NETBSD_SYS environment variables.
+
+	To determine what header file enables a missing feature,
+	check the NetBSD stanza in the Configure script.  Then
+	check the locations it checks for the indicated header
+	files and contents.
+
+	See 00XCONFIG for more information on LSOF_INCLUDE and
+	and NETBSD_SYS.
+
+
+12.0	NEXTSTEP and OPENSTEP Problems
+
+12.1	Why can't lsof report on 3.1 lockf() or fcntl(F_SETLK)
+	locks?
+
+	Lsof has code to test for locks defined with lockf() or
+	fcntl(F_SETLK) under NEXTSTEP 3.1, but that code has never
+	been tested.  I couldn't test it, because my NEXTSTEP 3.1
+	lockf() and fcntl(F_SETLK) functions return "Invalid
+	argument" every way I have tried to invoke them.
+
+	If your NEXTSTEP 3.1 system does allow you to use lockf()
+	and fcntl(F_SETLK) and lsof doesn't report locks set with
+	them, then the code in .../dialects/next/dnode.c probably
+	isn't correct.  Please contact me via e-mail at <abe@purdue.edu>
+	and tell me how you got your lockf() and fcntl(F_SETLK) system
+	calls to work.  Make sure "lsof" appears in the "Subject:" line
+	so my e-mail filter won't classify your letter as Spam.
+
+12.2	Why doesn't lsof compile for NEXTSTEP with AFS?
+
+	I no longer have a NEXTSTEP test system that has AFS.
+	Changes to lsof since I once had a test system have caused
+	me to change the AFS code in NEXTSTEP without being able
+	to test the changes.
+
+	If you need AFS support for NEXTSTEP and can't get it to
+	compile, please contact me.  Perhaps we can jointly fix
+	the problems.
+
+
+13.0	OpenBSD Problems
+
+13.1	Why doesn't lsof support kernfs on my OpenBSD system?
+
+	Lsof supports the kernel file system on OpenBSD versions
+	whose /sys/miscfs/kernfs/kernfs.h (or <miscfs/kernfs/kernfs.h>
+	header file correctly defines the kern_target structure.
+	The lsof Configure script's openbsd stanza checks for the
+	presence of the structure's kt_name element and activates
+	kernfs support for the CFLAGS -DHASKERNFS definition only
+	when it finds kt_name.
+
+	The kernfs.h header file is scheduled to be updated in the
+	OpenBSD 2.1 release, according to Kenneth Stailey, who
+	authored its changes.
+
+13.2	Will lsof work on OpenBSD on non-x86-based architectures?
+
+	I've not tested lsof on an OpenBSD system that uses a
+	non-x86-based architecture, but I've had one report that
+	lsof 4.33 compiles and works on OpenBSD for the pmax
+	architecture (decstation 3100).
+
+13.3	<sys/pipe.h> problems
+
+13.3.1	Why does the compiler claim nbpg isn't defined?
+
+	When compiling lsof on some (older) OpenBSD SPARC versions,
+	the compiler may complain:
+
+	    In file included from ../dlsof.h:191,
+	         from ../lsof.h:166,
+	         from fino.c:52:
+	    /usr/include/sys/pipe.h:83: `nbpg' undeclared here
+					(not in a function)
+	    /usr/include/sys/pipe.h:83: size of array `ms' has
+					non-integer type
+
+	This happens because <sys/pipe.h> uses NBPG from
+	<machine/param.h> to size the `ms' array, and some OpenBSD
+	systems define NBPG in terms of a kernel integer variable,
+	nbpg.
+
+	Lsof revisions 4.46 and above have a hack to dlsof.h,
+	developed by Volker Borchert that avoids the compiler
+	problem for SPARC OpenBSD 2.3.  The hack might work for
+	other OpenBSD SPARC versions, but hasn't been tested there.
+
+	If you want to enable the hack for your OpenBSD SPARC
+	version, modify this code in .../dialects/n+obsd/dlsof.h:
+
+	    # if    defined(OPENBSDV)
+	    #  if   OPENBSDV==2030 && defined(__sparc__)
+	    #   if  defined(nbpg)
+	    #undef  nbpg
+	    #   endif       /* defined(nbpg) */
+	    #define nbpg    4096            /* WARNING!!!  ... */
+	    #  endif        /* OPENBSDV==2030 && defined(__sparc__) */
+	    #include <sys/pipe.h>
+	    #endif  /* defined(OPENBSDV) */
+
+	You will probably want to change the second #if test to
+	match your OpenBSD version.  You may also want to change
+	what value is assigned to nbpg.  See the next section,
+	"What value should I assign to nbpg?"
+
+13.3.2	What value should I assign to nbpg?
+
+	If you need to enable the nbpg hack, described in "Why does
+	the compiler claim nbpg isn't defined?", you may also need
+	to assign a value other than 4096 to nbpg.  4096 works for
+	the sun4c processor and should work for sun4m, but 8192
+	may be needed for sun4.
+
+	Check <machine/param.h> and other OpenBSD documentation to
+	determine the correct nbpg assignment.
+
+13.4	Why doesn't lsof report on open MS-DOS file system (floppy
+	disk) files?
+
+	Lsof is not able to report on open MS-DOS file system files
+	if /usr/src/sys/msdosfs didn't exist when the lsof Configure
+	script ran and lsof was made.  /usr/src/sys/msdosfs contains
+	header files lsof needs for collecting data on MS-DOS file
+	system files.
+
+	You can tell if an lsof executable (revisions 4.61 and
+	above) lacks MS-DOS file system support if the following
+	command reports nothing:
+
+	    $ lsof -v 2>&1 | grep HASMSDOSFS
+
+	The work-around is to install /usr/src/sys, rerun the lsof
+	Configure script, and remake lsof.
+
+13.5	Why isn't lsof feature xxx enabled for OpenBSD?
+
+	Lsof's Configure script enables OpenBSD features by locating
+	and examining header files associated with the features,
+	and based on what if finds, setting compile-time definitions
+	in Makefiles.  (See 00PORTING for a list of the definitions.)
+
+	When Configure doesn't find header files or doesn't find
+	appropriate values in header files, that may mean the header
+	file tree lsof is searching is incomplete or out of date.
+
+	Lsof normally looks for OpenBSD header files in /usr/include
+	and /sys.  It can also be directed to look in other
+	directories if told to do so with the contents of the
+	LSOF_INCLUDE and NETBSD_SYS environment variables.
+
+	To determine what header file enables a missing feature,
+	check the OpenBSD stanza in the Configure script.  Then
+	check the locations it checks for the indicated header
+	files and contents.
+
+	See 00XCONFIG for more information on LSOF_INCLUDE and
+	and NETBSD_SYS.
+
+
+14.0	Output Problems
+
+14.1	Why do the lsof column sizes change?
+
+	Lsof dynamically sizes its output columns each time it runs
+	to make sure that each column takes the minimum space.
+	Column parsing -- e.g., with awk -- is possible, because
+	each column is guaranteed to be separated from the preceding
+	one by at lease one space, and no column except the last
+	(NAME) contains embedded spaces.
+
+14.2	Why does the offset have ``0t' and ``0x'' prefixes?
+
+	The offset value that appears in the SIZE/OFF column has
+	``0t' and ``0x'' prefixes to distinguish it from size values
+	that may appear in the same column.
+
+	Normally if the offset value is less than 100,000,000 (8
+	digits), it appears in decimal with a ``0t' prefix; over
+	99,999,999, in hexadecimal with a ``0x'' prefix.
+
+	A decimal offset is handy, for example, when tracking the
+	progress of an outbound ftp transfer.  When lsof reports
+	on the ftp process, it will report the size of the file
+	being sent with its open descriptor; it will report the
+	progress of the transfer via the offset of the outbound
+	open ftp data socket descriptor.
+
+	The ``-o [n]'' option may be used to specify the maximum
+	number of decimal digits to be printed after ``0t'' before
+	lsof switches to the hexadecimal digits after `0x''.  As
+	already noted, the default decimal digit count is 8.
+
+14.3	What are the values printed in the FILE_FLAG column
+	and why is 0x<value> sometimes included?
+
+	The two comma separated lists, separated by a semicolon,
+	printed in the FILE-FLAG column (when the "+fg" option is
+	specified), are short-hand names or hexadecimal values for
+	the bits lsof finds in the f_flag or f_flags member of file
+	structures for files (the first list, the one before the
+	semicolon), and process open files flags found in various
+	kernel structures, often named "pofile" (the second list,
+	the one after the semicolon).
+
+	Lsof determines the short-hand names from symbols in the
+	<fcntl.h>, <linux/fs.h>, <sys/fcntl.h>, <sys/fcntlcom.h>,
+	o<sys/file.h>, and <sys/user.h> header files.
+
+	See the discussion of FILE-FLAG in the OUTPUT section of
+	the lsof man page, and the FF_* and POF_* symbols in lsof.h
+	for a list of the names.
+
+	Bits with no names defined for them are represented by an
+	0x<value> member of the comma-separated list -- a hexadecimal
+	integer.  When "+fG" is specified (instead of "+fg"), lsof
+	will list all flag values as two hexadecimal integers,
+	separated by a semicolon.
+
+	When "-FG" is specified to get the flags in an output field,
+	the format defaults to hexadecimal.  You can get names
+	instead by following "-FG" with "+fg" -- e.g.,
+
+	    $ lsof -FG +fg ...
+
+	However, when you precede "-FG" with "+fg" -- e.g.,
+	
+	    $ lsof +fg -FG
+	    
+	the format will be hexadecimal; order is important.
+
+14.3.1	Why doesn't lsof display FILE_FLAG values for my dialect?
+
+	All versions of lsof except the /proc-based Linux lsof
+	report FILE-FLAG values.  Lsof can't obtain FILE-FLAG
+	information from the Linux /proc interface.
+
+14.4	Network Addresses
+
+14.4.1	Why does lsof's -n option cause IPv4 addresses, mapped to
+	IPv6, to be displayed in IPv6 notation?
+
+	When you use the -n option to tell lsof to display numeric
+	network addresses, and an IPv4 address has been mapped to
+	IPv6, lsof displays the address in IPv6 format and puts
+	"ipv4" in the TYPE column.  That combination indicates the
+	IPv4 address has been mapped to IPv6.
+
+	For example, the IPv4 address 1.2.3.4, when mapped to an
+	IPv6 address, will be displayed by lsof as:
+
+	    [::ffff:1.2.3.4]
+	
+	The enclosing brackets are lsof's signal that this is an
+	IPv6 address.  Inside the brackets is a standard IPv6
+	address, reported by inet_ntop().  The first two colons,
+	signifying zeroes in the first 64 bits of the IPv6 address,
+	and the hexadecimal ffff in the next 32 bits, indicate that
+	the last 32 bits contains a mapped IPv4 address, which is
+	then displayed in IPv4 dot notation.
+
+14.5	Why does lsof output \x, ^x, or \xnn for characters
+	sometimes?
+
+	Lsof displays only printable ASCII characters.  Lsof
+	considers a character printable if isprint(3) says it
+	is.  If isprint(3) says a character isn't printable,
+	the lsof may page explains:
+
+	   "...  Non-printable characters are printed in one of
+	    three forms: the C ``\[bfrnt]'' form; the control
+	    character `^' form (e.g., ``^@''); or hexadecimal
+	    leading ``\x'' form (e.g., ``\xab'').  Space is
+	    non-printable in the COMMAND column (``\x20'') and
+	    printable elsewhere."
+
+14.5.1  Why is space considered a non-printable character in command
+	names?
+
+	Space is considered an unprintable character in command
+	names because it is sometimes possible to hide the full
+	command name from scripts that parse ps(1) output by
+	embedding a space in the name.
+
+14.6	Why doesn't lsof print all the characters of a command name?
+
+	By default lsof prints the first nine characters of the
+	names of commands associated with processes.  If more
+	characters are required, the "w" value of the "+c w" option
+	may be used to specify a larger width.
+	
+	If "w" is zero ('0') lsof will print all characters of all
+	command names up to the limit of the number of characters
+	supplied by the particular UNIX dialect.  When reporting
+	command names, lsof replaces non-printable characters as
+	discussed in the answer to " Why does lsof output \x, ^x, or
+	\xnn for characters sometimes?"
+
+	See the answer to the "Why is space considered a non-printable
+	character in command names?" question for an explanation of why
+	spaces are replaced by the ``\x20'' representation in command
+	names.
+
+	The number of command name characters supplied to lsof by UNIX
+	dialects in files and structures varies by dialect.  For
+	example, Linux 2.4.27 supplies lsof the first 15 characters of
+	command names and Solaris 9 supplies 16.  Thus, even if "w" is
+	zero ('0'), lsof can't report more characters for command names
+	on those two UNIX dialects than they provide lsof.
+
+14.7	Why does lsof reject some -c command names, saying their lengths
+	are "> what system provides (nn)"?
+
+	The command name length that a specific system provides varies
+	from dialect to dialect.  As noted in the answer to the "Why
+	doesn't lsof print all the characters of a command name?"
+	question, Linux and Solaris provide a limited number of command
+	name characters.
+
+	When more characters are specified in the parameter to the -c
+	option, lsof considers it an error and issues a fatal error
+	message -- e.g.,
+
+	   lsof: "-c xxxxyyyy" length (8) > what system provides (7)
+
+	The only work-around is to specify no more characters to -c
+	that the system provides to lsof.
+
+14.8	Why does lsof sometimes print TYPE numbers instead of names?
+
+	When lsof can't convert a type number to a name for printing in
+	the TYPE column, it will report the number as four octets.
+
+14.9	Marker line format problems
+
+14.9.1	Why won't lsof accept a marker line format?
+
+	Lsof's Configure script must find the localtime(3) and
+	strftime(3) functions in the dialect's C library in order to
+	enable support for marker line formats.
+
+	Check the output of lsof's -v option for the presence of
+	-DHAS_STRFTIME in the compiler flags.  If it isn't there,
+	Configure didn't find the necessary two C library functions.
+
+	If you think lsof should have found the functions, make a copy
+	of the C test program in the Configure script that it uses to
+	find the functions.  Then use the copy, or a more informative
+	modification of it, to learn why Configure can't find the
+	functions.  You can find that program by searching for
+	strftime.
+
+14.9.2	Why does lsof reject the NL (%n) marker line format?
+
+	When repeat mode and field output (with -F) have both been
+	specified, lsof won't allow new line (NL) formats to be
+	specified with ``%n''.  That's because the marker line is
+	always guaranteed to be a single line.
+
+	There is no work-around to this restriction.
+
+14.10	How are protocol state name exclusion and inclusion used?
+
+	Protocol state name inclusion and exclusion with the ``-s p:s''
+	option and its arguments have some issues to consider.
+
+	First, there is the problem of determining what state names, if
+	any, the dialect produces.  Try running this lsof command to
+	find them:
+
+	    $ lsof -i
+
+	Knowing the state names of interest, the next problem is to
+	decide on the lsof options and their parameters that will
+	produce the desired output.  Here some examples are probably
+	the most useful.
+
+	To list only TCP socket files in LISTEN and CLOSE_WAIT states,
+	use:
+
+	    $ lsof -itcp -stcp:listen,close_wait
+	or
+	    $ lsof -iTCP -sTCP:LISTEN,CLOSE_WAIT
+
+	Case isn't important to lsof in protocol and state names.
+
+	To exclude TCP socket files in CLOSE_WAIT state, use:
+
+	    $ lsof -itcp -stcp:^close_wait
+
+	Note the `^' preceding close_wait; it selects exclusion.  You
+	can mix included and excluded names in a comma separated list,
+	but you may not include and exclude the same name for the same
+	protocol.
+
+	To list TCP files in LISTEN state and UDP files in Idle state,
+	use:
+
+	    $ lsof -i -stcp:listen -sudp:idle
+
+	Note: if you don't accompany the ``-s p:s'' list option and
+	argguments with the -i option, lsof will list all other regular
+	files, while applying the specified inclusion and exclusion
+	specifications to network files.  Generally, then, you want to
+	use -i with -s.
+
+14.10.1	Why doesn't my dialect support state name exclusion and inclusion?
+
+	When state name inclusion and exclusion was added, I had access
+	to test systems for AIX, Darwin, FreeBSD, Linux, PSTAT-based
+	HP-UX and Solaris.
+
+	Therefore, I was unable to add and test the support to any other
+	UNIX dialects.
+
+	If a dialect has the support, then the HASTCPUDPSTATE definition
+	in its machine.h header file will be active; if not, it will be
+	absent or commented out.
+
+	If your dialect doesn't have the support and you want it added,
+	you will have to provide me Internet access to a test host, where
+	I can compile lsof and have the credentials to test the changes
+	the support requires.  If that's possible for you, please contact
+	me via e-mail at <abe@purdue.edu>.  Make sure "lsof" appears in
+	the "Subject:" line so my e-mail filter won't classify your letter
+	as Spam.
+
+
+15.0	Pyramid Version Problems
+
+15.0.5	Statement of deprecation
+
+	As of lsof revision 4.52 support for all Pyramid versions has
+	been dropped.  Contact me via e-mail at <abe@purdue.edu> if you
+	are interested in obtaining the last lsof Pyramid distribution.
+	Make sure "lsof" appears in the "Subject:" line so my e-mail
+	filter won't classify your letter as Spam.
+
+
+16.0	SCO Problems
+
+16.1	SCO OpenServer Problems
+
+16.1.1	How can I avoid segmentation faults when compiling lsof?
+
+	If you have an older SCO OpenServer compiler, it may get
+	a segmentation fault when compiling some lsof modules.
+	That appears to happen because of the -Ox optimization
+	action requested in the lsof Makefile.
+
+	Try changing -Ox to -O with this make invocation:
+
+	    $ make DEBUG=-O
+
+	Bela Lubkin supplied this tip and Steve Williams verified
+	it.
+
+16.1.2	Where is libsocket.a?
+
+	If you compile lsof and the loader says it can't find the
+	socket library, libsocket.a, called by the -lsocket option
+	in the lsof compile flags, you probably are running an SCO
+	OpenServer release earlier than 5.0 and don't have the
+	TCP/IP Development System package installed.
+
+	You may have the necessary header files, because you have
+	the TCP/IP run-time package installed, but if you don't
+	have the TCP/IP Development System package installed, you
+	won't have libsocket.a.
+
+	Your choices are to install the TCP/IP Development System
+	package or upgrade to OpenServer Release 5.0.  You will
+	find libsocket.a in 5.0 -- you'll find all the libraries
+	and header files there, in fact -- and you can use gcc to
+	compile lsof if you don't want to install the 5.0 Development
+	System package.
+
+16.1.3	Why do I get "warning C4200" messages when I compile lsof?
+
+	When you compile lsof under OSR 3.2v4.2 (and perhaps under
+	earlier versions as well), you may get many compiler warning
+	messages of the form:
+
+	    node.c(183) : warning C4200: previous declarator is not
+	    compatible with default argument promotion
+
+	In my opinion this is a bug in the OSR compiler.  Because
+	the compiler cannot handle full ANSI-C prototypes, it
+	assumes default types for function parameters as it encounters
+	untyped in a function prototype -- e.g., in this function
+	declaration from node.c,
+
+	    readrnode(ra, r)
+		KA_T ra;
+		struct rnode *r;
+	    {
+	    ...
+	
+	the compiler assigns default int types to the ra and r
+	arguments.
+
+	Then, when the compiler encounters the fully typed parameters
+	after the function skeleton and sees parameters with types
+	that don't match the assumptions it previously made, it
+	whines about its own assumptions.
+
+	You can ignore these messages.
+
+16.2	SCO|Caldera UnixWare Problems
+
+16.2.1  Why doesn't lsof compile on my UnixWare 7.1.1 or above
+	system?
+
+	When you Configure lsof with the "uw" abbreviation and try
+	to compile it for UnixWare 7.1.1, you may get compiler
+	error messages like this:
+
+	    UX:acomp: ERROR: "dproc.c", line 98:
+		undefined struct/union member: p_pgidp
+
+	This suggest that you probably have a non-stop cluster
+	UnixWare 7.1.1 system.  Its <sys/proc.h> header file differs
+	from the one on the system where I did the lsof port to
+	UnixWare 7.1.1.  I currently don't have access to a non-stop
+	cluster system to be able to develop changes to lsof that
+	would make it compile and work there.
+
+	If you have a non-stop cluster UnixWare 7.1.1 system, want lsof
+	for it, and can offer me a test account on the system, please
+	contact me via e-mail at <abe@purdue.edu>.  Make sure "lsof"
+	appears in the "Subject:" line so my e-mail filter won't
+	classify your letter as Spam.
+
+	If you have a system with nsc_cfs and can offer me a test
+	account on it, please contact me via e-mail at <abe@purdue.edu>.
+	Make sure "lsof" appears in the "Subject:" line so my e-mail
+	filter won't classify your letter as Spam.
+
+16.2.2  Why does lsof complain about node_self() on my UnixWare
+	7.1.1 or above system?
+
+	If lsof exits immediately after issuing this message:
+
+	    can't identify process NSC node; node_self(): <message>
+
+	It means that lsof has been built to run on a NonStop
+	Cluster (NSC) UnixWare 7.1.1 or higher system and can't
+	get the number of the node on which it is running.  Lsof
+	uses the node number to determine the path to the kernel
+	boot file.
+
+	You can tell if lsof has been built for NSC by looking for
+	"-DHAS_UW_NSC" in lsof's "-v" option output.
+
+	If the system on which you're trying to run lsof isn't
+	running an NSC kernel, you will need to build a non-NSC
+	lsof.
+
+16.2.3  Why does UnixWare 7.1.1 or above complain about -lcluster,
+	node_self(), or libcluster.so?
+
+	When you build, compile, and load lsof for UnixWare 7.1.1
+	and above, ld may complain that it can't find the -lcluster
+	library or that the node_self symbol is undefined.  When
+	you try to run an existing lsof binary it may complain that
+	libcluster.so can't be found.
+
+	These messages mean the tests made by Configure on your
+	system led it to believe your system is running a NonStop
+	Cluster (NSC) kernel, or the lsof binary you're trying to
+	use was built on a NonStop Cluster system.  If an lsof
+	binary was built for NSC, this shell command produces
+	output:
+
+	    $ strings <lsof_binary> | grep HAS_UW_NSC
+
+	If that's not the case, and you can rebuild lsof, set the
+	UW_HAS_NSC environment variable to "N" and do this:
+
+	   $ Configure -n clean
+	   $ UW_HAS_NSC=N
+	   $ export UW_HAS_NSC
+	   $ Configure -n uw
+	   $ make
+
+	You can also edit Makefile and lib/Makefile.  Remove
+	-DHAS_UW_NSC from the CFGF strings.  Remove -lcluster from
+	the CFGL strings.  Then run make again.
+
+	If you have an existing NSC lsof binary and you want one
+	for a non-NSC system, you will have to build lsof yourself
+	on the system where you want to use it.  (That's always a
+	good idea anyway.)
+
+
+16.2.4  Why does UnixWare 7.1.1 or above lsof complain it can't
+	read the kernel name list?
+
+	If lsof complains:
+
+	    can't read kernel name list from <path>
+
+	It means that lsof can't find the booted kernel image file
+	at <path>.  On NonStop Cluster (NSC) UnixWare 7.1.1 or
+	higher systems lsof determines the booted file path by
+	examining this file:
+
+	    /stand/`node_self`/boot
+
+	If examining that file doesn't lead to an NSC path, lsof
+	uses:
+
+	    /stand/1/unix
+
+	On non-NSC systems lsof expects the booted kernel image to
+	be in /stand/unix.
+
+	If your booted kernel image is in a different place, use
+	lsof's "-k <path>" option to specify its path.
+
+16.2.5  Why doesn't lsof report link count, node number, and size
+	for some UnixWare 7.1.1 or above CFS files?
+
+	Lsof reports link count, node number, and size for open
+	CFS files as recorded in their kernel node structure's
+	cached attributes.  Sometimes not all attributes are cached
+	on the node where lsof runs, so lsof cannot report them.
+
+16.2.6  Why doesn't lsof report open files on all UnixWare 7.1.1
+	NonStop Cluster (NSC) nodes?
+
+	Lsof can only report on files open on the node on which it
+	runs, because the information lsof reports comes from the
+	private kernel memory of the node.  This may mean that
+	asking lsof to find a specific open file, or use of a
+	specific Internet address or port, may not report all open
+	instances on nodes other than the one used to run lsof.
+
+	You can use the NSC onnode(1) command to run lsof on specific
+	nodes, or the onall(1) command to run lsof on all nodes --
+	e.g.,
+
+	    $ onall lsof [options] 2>&1 | less
+	 or
+	    $ onnode node-number lsof [options] 2>&1 | less
+
+	Note that, when lsof is run all nodes, the path name
+	component assembly results it reports in its NAME column
+	may vary, because the dynamic name cache from which lsof
+	gets the components is private to the kernel of each node.
+
+	Also note the use of shell redirection in the examples to
+	merge the standard error file information from onnode and
+	onall with lsof's standard output file output.  That will
+	put the onnode and onall node announcements in proper
+	sequence with lsof's output.
+
+16.2.7	Why doesn't lsof report the UnixWare 7.1.1 NonStop Cluster
+	(NSC) node a process is using?
+
+	To induce lsof to report the node on which a process runs
+	would be a significant, non-standard modification to lsof.
+	It has much wider implications than merely the printing of
+	a number in an output column.  I'm not currently (April
+	2001) prepared to undertake such a modification.
+
+	If you want node-specific NSC information about open files,
+	run lsof under the control of onall(1) or onnode(1).
+
+	    $ onall lsof [options] 2>&1 | less
+	 or
+	    $ onnode node-number lsof [options] 2>&1 | less
+
+16.2.8  Why does the compiler complain about missing UnixWare 2.1[.x]
+	header files?
+
+	SCO|Caldera didn't ship the following header files with
+	UnixWare 2.1 through 2.1.3:
+
+	    <fs/proc/prdata.h>
+	    <fs/procfs/prdata.h>
+	    <sys/fs/fifonode.h>
+	    <sys/fs/namenode.h>
+
+	Lsof needs those header files for its compilation.  Contact
+	SCO|Caldera to get copies of those header files.
+	
+	If you can't get the header files from SCO|Caldera, please
+	contact me via e-mail at <abe@purdue.edu>.  Make sure "lsof"
+	appears in the "Subject:" line so my e-mail filter won't
+	classify your letter as Spam.
+
+
+17.0	Sun Problems
+
+17.0.5	Statement of deprecation
+
+	Lsof support for SunOS 4.1.x was last tested at revision 4.51.
+	Contact me via e-mail at <abe@purdue.edu> if you're interested in
+	obtaining it.  Make sure "lsof" appears in the "Subject:" line so
+	my e-mail filter won't classify your letter as Spam.
+
+17.1	My Sun gcc-compiled lsof doesn't work -- why?
+
+	Gcc can be used to build lsof successfully.  However, an
+	improperly installed Sun gcc compiler will usually not
+	produce a working lsof.
+
+	If your Sun gcc-compiled lsof doesn't report anything, or
+	reports ``can't read proc table,'' or gcc refuses to compile
+	lsof without error, check that the gcc step that "fixes"
+	Sun header files was run on the system where you're using
+	gcc to compile lsof.  As an alternative, if you have the
+	SunPro C 5.0 compiler or later available, use it to compile
+	lsof -- e.g., use the solariscc Configure abbreviations.
+
+17.2	How can I make lsof compile with gcc under Solaris 2.[456],
+	2.5.1, 7, 8 or 9?
+
+	Presuming your gcc-specific header files are wrong for
+	Solaris, edit the lsof Configure-generated Makefile and
+	lib/Makefile and make this change:
+
+		CFGF=   -Dsolaris=20400 ...
+	to
+		CFGF=   -Dsolaris=20400 -D__STDC__=0 -I/usr/include ...
+
+	or change:
+
+		CFGF=   -Dsolaris=20500 ...
+	to
+		CFGF=   -Dsolaris=20500 -D__STDC__=0 -I/usr/include ...
+
+	or change:
+
+		CFGF=   -Dsolaris=20501 ...
+	to
+		CFGF=   -Dsolaris=20501 -D__STDC__=0 -I/usr/include ...
+
+	This is only a temporary work-around.  You really should
+	instruct gcc to to update your gcc-specific header files
+	or install a recent gcc (e.g., 3.2), which has no need for
+	private copies of Solaris include files.
+
+17.3	Why does Solaris Sun C complain about system header files?
+
+	You're probably trying to use /usr/ucb/cc if you get compiler
+	complaints like:
+
+	    cc -O -Dsun -Dsolaris=20300 ...
+	    "/usr/include/sys/machsig.h", line 81: macro BUS_OBJERR
+	    redefines previous macro at "/usr/ucbinclude/sys/signal.h",
+	    line 444
+
+	Note the reference to "/usr/ucbinclude/sys/signal.h".  It
+	reveals that the BSD Compatibility Package C compiler is
+	in use.  Lsof requires the ANSI C version of the Solaris
+	C compiler, usually found in /usr/opt/bin/cc or
+	/opt/SUNWspro/bin/cc.
+
+	Try adding a CC string to the lsof Makefile that points to
+	the Sun ANSI C version of the Sun C compiler -- e.g.,
+
+	    CC= /usr/opt/bin/cc
+	or
+	    CC= /opt/SUNWspro/bin/cc.
+
+17.4	Why doesn't lsof work under my Solaris 2.4 system?
+
+	If lsof doesn't work under your Solaris 2.4 system -- e.g.,
+	it produces no output, little output, or the output is
+	missing command names or file descriptors -- you may have
+	a pair of conflicting Sun patches installed.
+
+	Solaris patch 101945-32 installs a kernel that was built
+	with a <sys/auxv.h> header file whose NUM_*_VECTORS
+	definitions don't match the ones in the <sys/auxv.h> updated
+	by Solaris patch 102303-02.
+
+	NUM_*_VECTORS in the kernel of patch 101945-32 are smaller
+	than the ones in the <sys/auxv.h> of patch 102303-02.  The
+	consequence is that when lsof is compiled with the <sys/auxv.h>
+	whose NUM_*_VECTORS definitions are larger than the ones
+	used to compile the patched kernel, lsof's user structure
+	does not align with the one that the kernel employs.
+
+	If you have these two patches installed, contact Sun and
+	complain about the mis-match.
+
+	You may be able to work around the problem by editing
+	/usr/include/sys/auxv.h to have the following NUM_*_VECTORS
+	definitions:
+
+		    #define NUM_GEN_VECTORS 4
+		    #define NUM_SUN_VECTORS 8
+	
+	The Configure script issues a prominent WARNING that you should
+	try the work-around.
+
+	I thank Leif Hedstrom for identifying the offending patches.
+
+17.5	Where are the Solaris header files?
+
+	If you try to compile lsof under Solaris and get a compiler
+	complaint that it can't find system header files, perhaps
+	you forgot to add the header file package, SUNWhea.
+
+17.6	Where is the Solaris /usr/src/uts/<architecture>/sys/machparam.h?
+
+	When you try to Configure lsof for Solaris 2.[23456], 2.5.1,
+	and 7 -- e.g., on a `uname -m` == sun4m system -- Configure
+	complains:
+
+	    grep: /usr/src/uts/sun4m/sys/machparam.h:
+			No such file or directory
+	    grep: /usr/src/uts/sun4m/sys/machparam.h:
+			No such file or directory
+
+	And when you try to compile the configured lsof, cc or gcc
+	complains:
+
+	    dproc.c:530: `KERNELBASE' undeclared (first use this function)
+
+	The explanation is that somehow your Solaris system doesn't
+	have the header files in /usr/src/uts it should have.  Perhaps
+	someone removed the directory to save space.  Perhaps you're
+	using a gcc installation, copied from another system.  In any
+	event, you will have to load the header files from the SUNWhea
+	package of your Solaris distribution.
+
+	KERNELBASE is an important symbol to lsof -- it keeps lsof
+	from sending an illegal kernel value to kvm_read() where
+	a segmentation violation might result (a bug in the kvm
+	library).  Lsof can get illegal kernel values because it
+	reads kernel values slowly with kvm_read() calls that the
+	kernel is changing rapidly.
+
+	Lsof doesn't need KERNELBASE at Solaris 2.5 and above,
+	because it has a KERNELBASE value whose address lsof can
+	find with /dev/ksyms and whose value it can read with
+	kvm_read().  Under Solaris 2.5 /usr/src/uts has moved to
+	/usr/platform.
+
+17.7	Why does Solaris lsof say ``can't read proc table''?
+
+	When lsof collects data on processes, using the kvm_*()
+	functions to scan the kernel's proc structure table, it
+	checks to make sure it has identified a reasonable number
+	of them -- a minimum of three.  When lsof can't identify
+	three processes during a scan, it repeats the scan.
+
+	When five scans fail to yield three processes, lsof issues
+	the fatal message:
+
+		lsof: can't read proc table
+
+	and exits.
+
+	Usually lsof fails to identify three processes during a
+	scan because its idea of the form of the proc structure
+	differs from that being used by the kernel.  Since the proc
+	structure is defined in <sys/proc.h> and other /usr/include
+	header files, the root cause of a proc structure discrepancy
+	usually can be found in the composition of /usr/include.
+
+	One common way that /usr/include header files can be
+	incorrect is that gcc was used to compile lsof, gcc used
+	its special (i.e., "fixed") header files instead of the
+	ones in /usr/include, and the special gcc header files
+	weren't updated when Solaris was.  Answers to these questions:
+
+	    My Sun gcc-compiled lsof doesn't work -- why?
+
+	    How can I make lsof compile with gcc under Solaris 2.[456],
+	    2.5.1, 7, 8 or 9?
+
+	    Why does Solaris Sun C complain about system header files?
+
+	discuss the gcc header file problem and offer suggestions
+	on how to fix it or work around it.
+
+	It may also be that you are trying to run a version of lsof
+	that was compiled on an older version of Solaris.  For
+	example, an lsof executable, compiled for Solaris 2.4, will
+	produce the ``can't read proc table'' message if you try
+	to run it under Solaris 2.5.  If you have compiled lsof
+	under Solaris 2.5 and it still won't work, see if the header
+	files in /usr/include have been updated to 2.5, or still
+	represent a previous version of Solaris.
+
+	Another source of header file discrepancies to consider is
+	the Solaris patch level and whether a binary kernel patch
+	was not matched with a corresponding header file update.
+	See the "Why doesn't lsof work under my Solaris 2.4 system?"
+	question for an example of one in Solaris 2.4 -- there may
+	be other such patch conflicts I don't know about.
+
+17.8    Why does Solaris lsof complain about a bad cached clone device?
+
+	When lsof revisions below 4.04 have been run on a Solaris
+	system and have been allowed to create a device cache file,
+	the running of revisions 4.04 and above on the same systems
+	may produce this complaint:
+
+	    lsof: bad cached clone device: ...
+	    lsof: WARNING: created device cache file: ...
+
+	This is the result of a change in the device cache file
+	that took place at lsof revision 4.04.  The change introduced
+	a node number into the clone device lines of the device
+	cache file and was done in such a way that lsof could detect
+	device cache files whose clone lines don't have node numbers
+	(lines created by previous lsof revisions) and recognize
+	the need to regenerate the device cache file.
+
+17.9	Why doesn't Solaris make generate .o files?
+
+	Solaris /usr/ccs/bin/make won't generate .o files from .c
+	files if /usr/share/lib/make/make.rules is missing.  It
+	may be found in and installed from the SUNWsport package.
+
+17.10	Why does lsof report some Solaris 2.3 and 2.4 lock types as `N'?
+
+	For Solaris 2.3 with patch P101318 installed at level 45
+	or above, and for all versions of Solaris 2.4, NFS locks
+	are represented by a NFS-specific kernel lock structure
+	that sometimes lacks a read or write lock type indicator.
+	When lsof encounters such a lock structure, it reports the
+	lock type as `N'.
+
+17.11	Why does lsof Configure say "WARNING: no cc in ..."?
+
+	When lsof's Configure script is executed with the solariscc
+	abbreviation it tries to make sure it's using the Sun C
+	compiler and not the UCB substitute from /usr/ucb/cc.
+	Thus, it looks for cc in the "standard" Sun compiler
+	location, /opt/SUNWspro/bin.
+
+	If Configure can't find cc there, it issues the warning:
+
+	    lsof: WARNING: no cc in /opt/SUNWspro/bin;
+		  using cc without path.
+
+	and uses cc for the compiler name, letting the shell find
+	cc with its PATH environment variable.
+
+	You can tell Configure where to find your cc with the
+	SOLARIS_CCDIR cross-configuration environment variable.
+	(See 00XCONFIG for more information on SOLARIS_CCDIR).
+	For example, use this Configure shell command:
+
+	    SOLARIS_CCDIR=/usr/special/bin Configure -n solariscc
+
+	(SOLARIS_CCDIR should be the full path to the directory
+	containing your cc.)
+
+17.12	Solaris 7, 8 and 9 Problems
+
+17.12.1	Why does lsof say the compiler isn't adequate for Solaris
+	7, 8 or 9?
+
+	Solaris 7, 8 and 9 kernels come in two flavors, 32 and 64
+	bit.  64 bit kernels run on machines that support the SPARC
+	v9 instruction set architecture.  Separate executables for
+	some programs, -- e.g., ones using libkvm like lsof -- must
+	be built for 32 and 64 bit kernels.
+
+	Previous Sun (e.g., SC4.0) and earlier gcc compilers will
+	build lsof for 32 bit kernels, but they won't build it for
+	64 bit kernels.  Compilers that will build lsof for 64 bit
+	Solaris 7, 8 and 9 kernels are the Sun WorkShop Compilers
+	C 5.0 and above, and recent gcc versions, e.g., 3.2.
+
+	When given the ``-xarch=v9'' flag, the C 5.0 compiler and
+	above, and associated loader and 64 bit libraries will
+	build a 64 bit lsof executable; when given the "-m64" or
+	"-mcpu=v9" (deprecated) flags, an appropriate gcc compiler
+	will build a 64 bit lsof executable.
+
+	When the lsof Configure script detects a 64 bit kernel is
+	in use (e.g., by executing `/bin/isainfo -kv`), and when
+	it finds that the specified compiler is inappropriate,
+	it complains with these messages:
+
+	For gcc:
+
+	    "!!!WARNING!!!=========!!!WARNING!!!=========!!!WARNING!!!"
+	    "!                                                       !"
+	    "! LSOF NEEDS TO BE CONFIGURED FOR A 64 BIT KERNEL, BUT  !"
+	    "! THIS GCC DOESN'T SUPPORT THE BUILDING OF 64 BIT       !"
+	    "! SOLARIS EXECUTABLES.  LSOF WILL BE CONFIGURED FOR A   !"
+	    "! 32 BIT echo KERNEL.                                   !"
+	    "!                                                       !"
+	    "!!!WARNING!!!=========!!!WARNING!!!=========!!!WARNING!!!"
+	
+	For Sun C:
+
+	  !!!WARNING!!!==========!!!WARNING!!!==========!!!WARNING!!!
+	  !                                                         !
+	  ! LSOF NEEDS TO BE CONFIGURED FOR A 64 BIT KERNEL, BUT    |
+	  ! THE VERSION OF SUN C AVAILABLE DOESN'T SUPPORT THE      !
+	  ! -xarch=v9 FLAG.  LSOF WILL BE CONFIGURED FOR A 32 BIT   !
+	  ! KERNEL.                                                 !
+	  !                                                         !
+	  !!!WARNING!!!==========!!!WARNING!!!==========!!!WARNING!!!
+
+17.12.2 Why does Solaris 7, 8 or 9 lsof say "FATAL: lsof was compiled
+	for..."?
+
+	Solaris 7, 8 or 9 lsof may say:
+
+	    lsof: FATAL: lsof was compiled for a xx bit kernel,
+		  but this machine has booted a yy bit kernel.
+	
+	    Where: xx = 32 or 64
+		   yy = 64 or 32
+	
+	    (xx and yy won't match.)
+	
+	This message indicates that lsof was compiled for one size
+	kernel and is being asked to execute on a different size
+	one.  That's not possible for programs like lsof that use
+	libkvm.
+
+	Depending on the instruction sets for which you need Solaris
+	7, 8 or 9 lsof, you may need two or more versions of lsof,
+	compiled for each kernel size, installed for use with
+	/usr/lib/isaexec.  See the "How do I install lsof for
+	Solaris 7, 8 or 9?" section of this document for more
+	information on that.
+
+17.12.3	How do I build lsof for a 64 bit Solaris kernel under a 32
+	bit Solaris kernel?
+
+	If your Solaris system has an appropriate compiler (e.g.,
+	WorkShop Compilers C 5.0 and above, or a recent gcc like
+	3.2) and the 64 bit libraries have been installed, you can
+	force lsof's Configure script to build a 64 bit version of
+	lsof with:
+
+	    $ SOLARIS_KERNBITS=64 Configure -n solariscc
+	
+	The SOLARIS_KERNBITS environment variable is part of the
+	lsof cross-configuration support, described in the 00XCONFIG
+	file of the lsof distribution.
+
+17.12.4	How do I install lsof for Solaris 7, 8 or 9?
+
+	If you are installing lsof where it will be used only under
+	the bit size kernel for which it was built, no special
+	installation is required.
+
+	If, however, you are installing different versions of lsof
+	for different bit sizes -- e.g., for use on a 64 bit NFS
+	server and from its 32 bit clients -- you should read the
+	man page for isaexec(3C) and install lsof according to its
+	instructions.
+
+	The executable at the directory where lsof is to be found
+	should be a hard link to /usr/lib/isaexec or a copy of it.
+	In the directory there must be instruction architecture
+	subdirectories -- e.g., .../sparc/ and .../sparcv9/.  The
+	lsof for 64 bit size kernels is installed in the .../sparcv9/
+	subdirectory; the one for 32 bit size kernels, in .../sparc/.
+
+	For example, if you're installing 32 and 64 bit lsof
+	executables in /usr/local/etc, you would:
+
+		# cd /usr/local/etc
+		# ln /usr/lib/isaexec lsof
+		# mkdir sparc sparcv9
+		# install the 32 bit lsof as sparc/lsof
+		# install the 64 bit lsof as sparcv9/lsof
+		# chmod, chown, and chgrp sparc/lsof and
+		  sparcv9/lsof appropriately
+
+	Lsof permissions and ownerships are the same whether one
+	or more lsof executables are being installed, with or
+	without the /usr/lib/isaexec hard link.
+
+17.12.5 Why does my Solaris 7, 8 or 9 system say it cannot execute
+	lsof?
+
+	When you attempt to execute lsof, your Solaris 7, 8 or 9
+	shell may complain:
+
+	    ksh: ./lsof: cannot execute
+
+	If the lsof executable exists and has the proper execution
+	permissions, this error may be the result of trying to
+	execute an lsof, built for a 64 bit kernel, on a 32 bit
+	kernel.
+
+	This will tell you about the lsof executable:
+
+	    $ file lsof
+	    lsof: ELF 64-bit MSB executable SPARCV9 Version 1,
+		  dynamically linked, not stripped
+	
+	The "64-bit" notation indicates the binary was built for
+	a 64 bit kernel.  To see the running kernel bit size, use
+	this command:
+
+	    $ isainfo -kv
+	    32-bit sparc kernel modules
+
+	The "32-bit" notation indicates a 32 bit kernel has been
+	booted.
+
+	The only work-around is to obtain, or Configure and make,
+	an lsof for the appropriate kernel bit size.  If you
+	Configure and make lsof on the kernel where you wish to
+	run it the proper compiler, the lsof Configure step will
+	generate Makefiles that can be used with make to build an
+	appropriate lsof executable.
+
+	To compile a 64 bit lsof, you must have an appropriate
+	compiler -- i.e., Sun WorkShop Compilers C 5.0 or higher
+	or a recent gcc like 3.2.
+
+17.12.6 What gcc will produce 64 bit Solaris 7, 8 and 9 executables?
+	8 and 9 executables?
+
+	Properly built and installed recent gcc versions -- e.g.,
+	3.2 -- will build lsof for 64 bit Solaris kernels.
+
+	If you update your gcc version to 3.2 or later, make sure
+	the private gcc header files become current -- i.e., clear
+	out any private header files from a previous gcc or Solaris
+	installation before installing the new ones, or build to
+	a new --prefix root and replace the old root with it after
+	the build and installation are complete.
+
+17.12.7 Why does lsof on my Solaris 7, 8 or 9 system say, "can't
+	read namelist from /dev/ksyms?"
+
+	You're probably trying to use an lsof executable built for
+	an earlier Solaris release on a 64 bit Solaris 7, 8 or 9
+	kernel.  The output from `lsof -v` will tell you the build
+	environment of your lsof executable.  You should also have
+	gotten a warning message that lsof is compiled for a
+	different Solaris version than the one under which it is
+	running -- something like this:
+
+	    lsof: WARNING: compiled for Solaris release X; this is Y
+
+	You need to build lsof on the system where you want to use
+	it.  For 64 bit Solaris 7, 8 and 9 you need a compiler that
+	can generate 64 bit Solaris executables -- e.g., the Sun
+	Workshop 5 C compiler or later, or a recent gcc version
+	like 3.2.  See the "Why does lsof say the compiler isn't
+	adequate for Solaris 7, 8 or 9?" section and the ones
+	following it for a discussion of building lsof for 64 bit
+	Solaris 7, 8 or 9.
+
+17.13	Solaris and COMMON
+
+17.13.1	What does COMMON mean in the NAME column for a Solaris VCHR
+	file?
+
+	When lsof puts COMMON or (COMMON) in the NAME column of a
+	Solaris VCHR file, it means that the file is handled by
+	the special file system functions of the kernel through a
+	common vnode.
+
+17.13.2	Why does a COMMON Solaris VCHR file sometimes seem to have an
+	incorrect minor device number?
+
+	When lsof reports on an open file in a Solaris special file
+	system that uses a COMMON vnode, and the file is a VCHR
+	file, lsof tries to locate the associated device node by
+	looking for matches on the major and minor device numbers
+	first.
+
+	If no major and minor match results, lsof then looks for
+	a match on pseudo and clone device files.  (See /devices/pseudo.)
+	Those device nodes are matched specially by either their
+	major or minor device numbers, but not both.  Hence, when
+	lsof finds a match under those special conditions, it may
+	report a value in its output DEVICE column that differs
+	from one of the major and minor numbers of the device node.
+
+	Here's an example from a sun4m Solaris 7 system:
+
+	    $ ls -li /devices/pseudo/pm@0:pm
+	    151261 crw-rw-rw-   1 root     sys      117,  0 ...
+	    $ lsof /devices/pseudo/pm@0:pm
+	    COMMAND ... DEVICE ...   NODE NAME
+	    powerd       117,1 ... 151261 /devices/pseudo/pm@0:pm (COMMON)
+	    Xsun    ...  117,0 ... 151261 /devices/pseudo/pm@0:pm
+
+	Note that the DEVICE value for the file with (COMMON) in
+	its name field has a different minor device number (1) from
+	what ls reports (0), while the DEVICE value for the file
+	without (COMMON) matches the ls output exactly.  Both match
+	on the major device number, 117.  The minor device number
+	mis-match is a result of the way the Solaris kernel handles
+	special file system common vnodes, and it's the reason lsof
+	puts (COMMON) after the name to signal that a mis-match is
+	possible.
+
+17.14	Why don't lsof and Solaris pfiles reports always match?
+
+	/usr/proc/bin/pfiles for Solaris 2.6, 7, 8, and 9 also
+	reports information on open files for processes.  Sometimes
+	the information it reports differs from what lsof reports.
+
+	There are several reasons why this might be true.  First,
+	because pfiles is a Sun product, based on Sun kernel
+	features, its developers have a better chance of knowing
+	exactly how open file information is organized.  I sometimes
+	have to guess at how kernel file structure linkages are
+	constructed by gleaning hints from header files.
+
+	Second, lsof is aimed at providing information, specifically
+	device and node numbers, that can be used to identify named
+	file system objects -- i.e., path names.  Thus, lsof tries
+	to make sure its device and node numbers match those reported
+	by stat(2).  Pfiles doesn't always report numbers that
+	match stat(2) -- e.g., for files using clone and pseudo
+	devices via common vnodes like the nlist() /dev/ksyms usage.
+
+	Here's the Solaris 7 COMMON VCHR example again with additional
+	pfiles output:
+
+	    $ ls -li /devices/pseudo/pm@0:pm
+	    151261 crw-rw-rw-   1 root     sys      117,  0 ...
+	    $ lsof /devices/pseudo/pm@0:pm
+	    vic1: 10 = lsof /dev/pm
+	    COMMAND ... DEVICE ...   NODE NAME
+	    powerd  ...  117,1 ... 151261 /devices/pseudo/pm@0:pm (COMMON)
+	    Xsun    ...  117,0 ... 151261 /devices/pseudo/pm@0:pm
+	    $ pfiles ...
+	    0: S_IFCHR ... dev:32,24 ino:61945 ... rdev:117,1
+	    ...
+	    14: S_IFCHR ... dev:32,24 ino:151261 ... rdev:117,0
+
+	Note that the NODE number, reported by lsof, matches what
+	ls(1) and stat(2) report, while the ino value pfiles reports
+	doesn't.   Lsof also indicates with the (COMMON) notation
+	that the DEVICE number is a pseudo one, derived from the
+	character device's value.  The lsof DEVICE value matches
+	the pfiles rdev value, correct behavior for a character
+	device, but pfiles gives no sign that it's not possible to
+	find that character device number in /devices with ls(1)
+	or stat(2).
+
+17.15	Why does lsof say, "kvm_open(namelist=default, core=default):
+	Permission denied?"
+
+	Lsof needs permission to read from the /dev/kmem and /dev/mem
+	memory devices.  Access to them is opened via a call to
+	the kvm_open() library function and it reports the indicated
+	message.
+
+	You must give lsof permission to read the memory devices.
+	The super user can almost always do that, but other lsof
+	users can do it if some group -- e.g., sys -- has permission
+	to read the memory devices, and the lsof binary is installed
+	with the group's ownership and with the setgid permission
+	bit enabled.
+
+17.16	Why is lsof slow on my busy Solaris UFS file system?
+
+	Lsof may be slow on a busy Solaris UFS file system when
+	UFS logging has been enabled with the "logging" mount
+	option.  That option can significantly increase disk
+	operations under certain conditions -- e.g., when a lot of
+	files are accessed quickly.
+
+	When only the "logging" option is specified to mount, all
+	file accesses (atime updates) are logged to the UFS logging
+	queue.  Each atime update requires two writes to the disk
+	to complete it.
+
+	If you want to do UFS logging -- and there are reliability
+	advantages to it -- consider using the "logging,noatime"
+	mount options instead.  That will shift atime updates from
+	the logging queue to fewer and independent asynchronous
+	operations, consequently making the UFS logging queue a
+	smaller bottleneck.
+
+	Consult mount_ufs(1M) for more information on the logging
+	and noatime options.
+
+	(My thanks to Casper Dik for this tip on improving the
+	performance of UFS logging.)
+
+17.17	Why is lsof so slow on my Solaris 8 or 9 system?
+
+	Solaris 8 has a post-release feature upgrade modifying
+	kernel name cache (DNLC) handling that can slow lsof
+	throughput dramatically.  The feature, sometimes called
+	negative DNLC caching, is standard in Solaris 9.
+
+	As best I can tell, when you install the Solaris 8 MU1
+	package, you get negative DNLC caching.  If this pipe
+	produces any output, your system has negative DNLC caching.
+
+	    $ nm /dev/ksyms | grep negative_cache_vnode
+
+	The reason negative DNLC caching perturbs lsof is that a
+	single vnode address (found in the negative_cache_vnode
+	kernel variable) is used to mark entries in the DNLC that
+	are not (the negative part) found on disk.
+
+	Since a single vnode address (the DNLC key lsof uses) can
+	represent many (I've seen upwards of 30,000.) DNLC entries,
+	their presence overloads lsof's internal DNLC hashing
+	function.  An overloaded hash function is a slow hash
+	function, and lsof's slows to a crawl when it encounters
+	thousands of keys that produce the same value when the lsof
+	DNLC hash function is applied to them.
+
+	The solution is simple -- ignore negative DNLC cache keys.
+	They don't represent path name components lsof can use.
+	Lsof revisions 4.50 and above have an addition that ignores
+	them and the performance of those lsof revisions improves
+	significantly when presented with negative DNLC cache keys.
+
+	If you don't have an lsof revision at 4.51 or later, there's
+	a work-around.  Use lsof's ``-C'' option.  It disables
+	lsof's DNLC caching.  Of course, that also inhibits the
+	reporting of any path name components from the kernel DNLC.
+	When ``-c'' is used, lsof will continue to report file
+	system and character device paths.
+
+17.18	Solaris and VxFS
+
+17.18.1	Why doesn't lsof support VxFS 3.4 on Solaris 2.6, and above?
+
+	Lsof will not support VxFS version 3.4 on Solaris 2.6 and above
+	unless some files from VxFS Update 2 have been installed.  VxFS
+	3.4 FCS and VxFS 3.4 update 1 lack the header files lsof
+	normally uses to obtain information from the VxFS 3.4 kernel
+	node structure, vx_inode.  VxFS 3.4 Update 2 provides a method
+	whereby lsof can obtain the necessary vx_inode information from
+	the vxfsu_get_ioffsets() function in Veritas utility
+	libraries.
+
+	The utility libraries (32 bit and 64 bit versions) may be
+	found in /opt/VRTSvxfs/lib.  An ancillary header file may
+	be found in /opt/VRTSvxfs/include/sys/fs/vx_libutil.h.
+	Documentation of the vxfsu_get_ioffsets(3) function may be
+	found in /opt/VRTS/man/man3/vxfsu_get_ioffsets.3.
+
+	Those files of VxFS 3.4 Update 2 may be downloaded from:
+
+	    ftp://ftp.veritas.com/pub/support/vxfs_34.i64243.tar
+
+	The vxfs_34.i64243.tar archive will unpack into an i64243
+	directory containing these files:
+
+	    $ ls i64243
+	    README
+	    libvxfsutil.sol26.sums
+	    libvxfsutil.sol26.tar.Z
+	    libvxfsutil.sol27.sums
+	    libvxfsutil.sol27.tar.Z
+	    libvxfsutil.sol28.sums
+	    libvxfsutil.sol28.tar.Z
+
+	Read README.  Select the *.tar.Z file appropriate for your
+	Solaris version.  Its contents will unpack into /opt/VRTS
+	and /opt/VRTSvxfs, so you will need sufficient permission
+	-- e.g., do it as root -- to unpack the uncompressed archive.
+	Once you've done that, it's a good idea to compare the
+	checksums of the archive you unpacked with the ones recorded
+	in the appropriate *.sums file.  Use `sum -r` to verify
+	the checksums.
+
+	For example, if you want the Solaris 8 version, uncompress
+	and unpack libvxfsutil.sol28.tar.Z -- e.g.,
+	
+	    $ su
+	    ...
+	    # cd i6423
+	    # zcat libvxfsutil.sol28.tar.Z | tar xf -
+
+	That should create these new files and subdirectories with
+	the indicated checksums:
+
+	    File or subdirectory			sum -r
+
+	    /opt/VRTSvxfs/include/vxfsutil.h		03938
+	    /opt/VRTSvxfs/lib/libvxfsutil.a		51794
+	    /opt/VRTSvxfs/lib/sparcv9/
+	    /opt/VRTSvxfs/lib/sparcv9/libvxfsutil.a	07420
+	    /opt/VRTS/man/man3/
+	    /opt/VRTS/man/man3/vxfsu_get_ioffsets.3	62480
+
+	Once these files are in place, run lsof's Configure script
+	for the solaris or solariscc abbreviation.  Configure will
+	locate the appropriate VxFS 3.4 Update 2 files and set up
+	for the making of an lsof that will properly display open
+	VxFS 3.4 file information.
+
+17.18.2	Why does lsof report "vx_inode: vxfsu_get_ioffsets error"
+	for open Solaris 2.6 and above VxFS 3.4 and above files?
+
+	Even when lsof supports VxFS 3.4 and above on Solaris 2.6 and
+	above, it may report "vx_inode: vxfsu_get_ioffsets error" in
+	the NAME column for all VxFS files.
+
+	The usual cause is that lsof doesn't have permission to
+	read the file at the end of the /dev/vxportal symbolic
+	link.  If, for example, lsof has been installed setgid(sys),
+	then the /dev/vxportal symbolic link destination should be
+	owned by the sys group and readable by it.
+
+	Update 2 for VxFS 3.4 sets the modes of the /dev/vxportal
+	symbolic link destination to 0640 and the group ownership
+	to sys.  But I have had a report that the modes are wrong
+	in a VxFS 4.0 installation.
+
+	Another cause may be that the system has more than one version
+	of VxFS installed (Only one can be active.), and lsof's
+	Configure script did not choose the header files and libraries
+	for the active VxFS version.  Configure opts for VxFS 4.0 and
+	above header files and libraries (in /opt/VRTS) in preference
+	to those for VxFS below 4.0 (in /opt/VRTSvxfs).
+
+	Look for the directories /opt/VRTS and /opt/VRTSvxfs.  If you
+	have /opt/VRTS, make sure its header and library symbolic links
+	point to those of the active VxFS version.
+	
+	If you have both directories, look at the CFLAGS that Configure
+	constructed for making lsof and see which directory path
+	follows a -I option.  If that doesn't match the directory path
+	of the active VxFS version, try pointing Configure at the
+	correct directory with the SOLARIS_VXFSINCL environment
+	variable -- e.g.,
+
+	    $ SOLARIS_VXFSINCL=/opt/.../include ./Configure -n solaris
+
+17.18.3	Why does Solaris Configure claim there is no VxFS library?
+
+	The lsof Configure script, when configuring for Solaris, may
+	report:
+
+	    FATAL: no VxFS .../libvxfsutil.a
+	
+	That fatal error message indicates lsof has found the VxFS
+	utility library's header files, but can't find the library
+	itself in the expected location adjacent to the header files.
+
+	One possible cause is an incorrect symbolic link from
+	/opt/VRTS/lib/sparcv9/libvxfsutil.a to the library's real
+	location.  (Some VxFS distributions declared the link
+	incorrectly.)  Use `ls -lL` on that path to see if it exists.
+	If it doesn't exist, the link may be missing an additional
+	leading "../" component.
+
+	If the problem is a missing "../" from the library's link, you
+	can correct the link or check with Veritas/Symantec for the
+	patch that corrects it.
+
+	If the problem is not a missing "../", and you know the
+	libvxfsutil.a location, you can define its path in the
+	SOLARIS_VXFSLIB environment variable before running the lsof
+	Configure script.  (See 00XCONFIG for information about using
+	the SOLARIS_VXFSLIB environment variable.)
+
+	If you have no libvxfsutil.a, you must obtain it from
+	Veritas/Symantec or find it in your VxFS installation package.
+
+17.18.4 Why doesn't Solaris lsof report VxFS path name components?
+
+	Solaris lsof will report path name components for VxFS versions
+	that use the common Solaris Dynamic Name Lookup Cache (DNLC) or
+	on some file systems of VxFS versions that support the VxFS
+	Reverse Name Lookup (RNL) facility.
+
+	VxFS versions 3.3 (approximately) and below use the common
+	Solaris DNLC.  (I haven't been able to determine exactly when
+	VxFS stopped using the DNLC.)  For versions above that boundary,
+	but below 4.0, lsof can't report path name components.
+
+	At VxFS 4.0 and above, lsof can be compiled to use the VxFS RNL
+	facility for reporting path names.  If "-DHASVXFSRNL" appears
+	in the compiler flags section of lsof "-v" option output, then
+	the lsof Configure script detected the VxFS RNL facility and
+	lsof has been compiled to use it.
+
+	Lsof's use of the RNL facility can fail when the VxFS file
+	system disk layout version is below 6.  In that case, lsof can
+	report no path name components.  For more information, see the
+	vxfs_inotopath(3) manual page.  any of the following commands
+	will show the disk layout version for a VxFS file system, when
+	supplied the block device or mount point on which the file
+	system is mounted.
+
+	    fstyp -v <block_device>
+	 or
+	    mkfs -m <block_device>
+	 or
+	    vxupgrade <mount_point>
+
+	You must have permission to read the block device -- e.g., be
+	the root user.
+
+	You may also be able to upgrade an older disk layout to one
+	that will work with the RNL.  See the vxupgrade(1M) man page
+	for more information on that.
+
+	When lsof can't report VxFS path name components, it reports
+	the file system mount point and the path name of device on
+	which it is mounted.  The device path name is enclosed in
+	parentheses.
+
+17.18.5	Why does Solaris 10 lsof report scrambled VxFS paths?
+
+	Solaris 10 lsof may report a bogus, scrambled path for an open
+	VxFS file, when lsof obtains the path from a vnode's cached
+	path.  Veritas/Symantec reports that their Solaris 10
+	implementation has bugs in the way it handles the Solaris 10
+	vnode cached path and those bugs will be fixed in an upcoming
+	patch some time after August 15, 2005.
+
+	When Solaris 10 lsof reports a path for an open VxFs file
+	obtained via the VxFS Reverse Name Lookup facility, the path
+	will be correct.
+
+	Also see the answers to the questions "Why does Solaris 10 lsof
+	sometimes report the wrong path name?" and "Why doesn't Solaris
+	lsof report VxFS path name components?"
+
+17.19	Large file problems
+
+17.19.1	Why does lsof complain it can't stat(2) a Solaris 2.5.1
+	large file?
+
+	When given an argument that is the path to a Solaris 2.5.1
+	file, enable for large file operations with the O_LARGEFILE
+	open(2) option, lsof complains that it can't stat(2) the
+	file.  That's because lsof isn't using a stat(2) call and
+	associated structure enabled for large files.
+
+	This error has been fixed, starting at lsof revision 4.58
+	for Solaris 2.6 and above.  That fix won't work on Solaris
+	2.5.1 and I no longer have access to a Solaris 2.5.1 test
+	system to develop a separate fix.
+
+	The work-around is to avoid specifying a O_LARGEFILE path
+	as an argument to lsof on Solaris 2.5.1.  Instead use a
+	combination of lsof and grep to achieve the same results,
+	albeit more clumsily.
+
+17.20   Why does lsof get a segmentation fault on 64 bit Solaris
+	8 using NIS+?
+
+	I have received a report from Gary Craig that lsof produces
+	a segmentation fault on his 64 bit Solaris 8 system using
+	NIS+.  Via an independent test program we have exonerated
+	lsof and tracked the fault to the NIS+ __nis_server_name()
+	function in the C name server library, -lnsl.
+
+	Lsof causes the __nis_server_name() NIS+ function to be
+	called by calling getservent() to read entries of the port
+	number to service name map.
+
+	The only Sun bug ID that appears to describe the problem
+	is 4304244, although its text is unclear enough to leave
+	room for doubt.
+
+	Until Sun eliminates the __nis_server_name() segmentation
+	fault cause, a work-around for lsof is to use its "-P"
+	option, causing lsof to avoid port to service name lookups.
+
+17.21	Will lsof crash the Solaris kernel?
+
+	I've received and investigated one report that it has when
+	the Sun hardware (a QME interface) was faulty.  Today (May
+	23, 2002) I've learned that Sun has reports of kernel
+	crashes caused by adb, lsof, and mdb.
+
+	The Sun investigation pinpointed a problem in the /dev/kmem
+	kernel driver and there is a Sun bug report, 4344513, about
+	the problem.  There is a fix in Solaris 9, and patches for
+	Solaris 7 and 8 (SPARC and x86).
+
+	To see if your Solaris system is fixed, look for a
+	/devices/pseudo/*allkmem node.
+
+	Extensive address filtering was added to lsof revision 4.50
+	to forestall what I then (July 2001) believed to be only
+	the possibility that lsof might crash Solaris.  However,
+	the filtering isn't perfect, since a filtered address might
+	become invalid after lsof has filtered it but before lsof
+	has delivered it to /dev/kmem.  That filtering work is
+	described in .../dialects/sun/solaris_kaddr_filters, also
+	available at:
+
+	ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/solaris_kaddr_filters
+
+	The best and safest work-around is to upgrade to Solaris
+	9 or install an appropriate patch or its equivalent from
+	this list:
+
+	    Solaris	SPARC		x86
+	    Version	Patch		Patch
+	    =======	=====		=====
+	       7	106541-20	106542-20
+	       8	108528-14	108529-14
+
+17.22   Why does lsof on Solaris 7, 8, or 9 report a kvm_open()
+	failure?
+
+	When lsof is started on some Solaris 7, 8, and 9 systems
+	it may report:
+
+	    lsof: kvm_open(namelist=default, corefile=default): \
+		  No such file or directory
+
+	Lsof revisions 4.65 and later will first report:
+
+	    lsof: cannot stat /dev/allkmem
+
+	The second message, not delivered in lsof revisions below
+	4.65, explains the cause of the kvm_open() failure; it
+	can't find /dev/allkmem.
+
+	/dev/allkmem is a device added to Solaris 7 and 8 in patches
+	and in the Solaris 9 FCS.  See the preceding "Will lsof
+	crash the Solaris kernel?" section for more information on
+	/dev/allkmem and the patches.
+
+	The kvm_open(3KVM) function in the KVM library of patched
+	Solaris 7 and 8 systems and in Solaris 9 expects to find
+	/dev/allkmem and exits on error when it does not.
+
+	If you have installed the patch that updated your KVM
+	library to a version that expects /dev/allkmem to be present
+	and it is not, you may need to reconfigure your system's
+	devices with devfsadm(1M) or enter "boot -r" to the OpenBoot
+	monitor's prompt (usually "ok").
+
+17.23	Solaris and SAM-FS
+
+17.23.1	Why does Solaris lsof report "(limited SAM-FS info)"?
+
+	Lsof 4.68 and above report "(limited SAM-FS info)" on
+	Solaris in the NAME column after the path or file system
+	name for all files it finds on SAM-FS file systems.
+
+	That's because no more information is known about the
+	composition of the nodes that follow SAM-FS vnodes.  If
+	you can provide that information, please contact me via
+	e-mail at <abe@purdue.edu>.  Make sure "lsof" appears in the
+	"Subject:" line so my e-mail filter won't classify your letter
+	as Spam.
+
+17.23.2	Why can't lsof locate named SAM-GS files?
+
+	Solaris lsof 4.68 and above can't locate files on SAM-FS
+	file systems when the files are named as lsof arguments
+	because lsof doesn't know how to locate open SAM-FS file
+	device and node number information.  (See also 'Why does
+	Solaris lsof report "(limited SAM-FS info)?')
+
+17.24	Lsof and Solaris 10 zones
+
+17.24.1	How can I make lsof list the Solaris zone?
+
+	Use the lsof "-z [z]" option.
+
+17.24.2	Why doesn't lsof work in a Solaris 10 zone?
+
+	When run from within a Solaris 10 zone, lsof will usually
+	report:
+
+	    lsof: can't stat(/devices): No such file or directory
+
+	That's because a Solaris zone usually has no /devices
+	subdirectory, a restriction of the zone implementation intended
+	to limit the ability of zone processes to control global system
+	resources, including physical devices.
+
+	While a zone may have a /dev subdirectory, that subdirectory
+	usually lacks the /dev/allkmem, /dev/mem and /dev/kmem devices
+	lsof and the KVM library it uses require.
+
+	The work-around is to run lsof in the global zone.  When it is
+	run in a global zone lsof will be able to report on processes
+	running in any zone, including the global zone.
+
+17.24.3 Why does lsof complain it can't stat() Solaris 10 zone file
+	systems?
+
+	When run from the global zone on Solaris 10 lsof may complain:
+
+	    lsof: WARNING: can't stat() 15 zone file systems;
+			   using dev= options
+
+	The warning message means lsof found the reported number of
+	file system entries in the mount table for which it didn't have
+	permission to get stat(2) results, but which had "zone=" and
+	"dev=" mount table options.
+
+	That is a normal restriction of Solaris 10 zones.  Since the
+	lsof warning message indicates it was able to find "dev="
+	options for the file systems, lsof will probably work
+	correctly.
+
+	One work-around is to relax the restrictions on zone mount
+	points, so that lsof can stat() them.  While that may be
+	possible by changing directory modes or group ownerships, it is
+	probably not a good idea, because it weakens the restrictions
+	zones are intended to provide.
+
+	Another work-around is to suppress the warning message with
+	lsof's "-w" option.  The down side of that is that it causes
+	the suppression of all warning messages, leading to the
+	possibility that some non-stat() warning messages will be
+	suppressed.
+
+17.25	Solaris 10 problems
+
+17.25.1 Why does Solaris 10 lsof sometimes report the wrong path name?
+
+	When a path name component is renamed -- e.g., with mv(1) --
+	Solaris 10 lsof may report the old component for an open file
+	that used the component in its path before the rename.  That's
+	because Solaris 10 lsof reports the path name cached in the
+	open file's vnode and the Solaris 10 kernel doesn't update the
+	open vnode's cached path name when a component of it is changed.
+
+	When an open file is deleted -- e.g., with rm(1) -- the path
+	name by which it was opened remains cached in the vnode.  Lsof
+	can be instructed to display that path name with the -X option.
+	The path name might be incorrect because of the rename problem
+	described above.  See the answer to the 'What does "(deleted)"
+	mean in the NAME column of a Solaris 10 open file?' question
+	for more information.
+
+	Lsof is sometimes able to detect that cached path name is
+	incorrect.  In that case lsof may report only the mounted-on
+	directory and device of the file system or it may report that
+	the path name is of questionable accuracy by appending a
+	trailing "(?)" to it in the NAME column.
+
+	See the answer to the "Why does Solaris 10 lsof sometimes
+	report only the mounted-on directory and device?" and 'What
+	does "(?)" mean in the NAME column of a Solaris 10 open file?'
+	questions for more information.
+
+17.25.2 Why does Solaris 10 lsof sometimes report only the mounted-on
+	directory and device?
+
+	For some regular open files lsof may report only the mounted-on
+	directory and device of the file system on which the file
+	resides.  That's because lsof was able to determine that the
+	path name cached in the open file's vnode is incorrect.
+
+	Lsof detects the cached path name is incorrect by applying
+	stat(2) to it, provided that no error was detected when stat(2)
+	was applied to the file system mounted-on directory during lsof
+	setup.  If a mounted-on directory stat(2) error was detected
+	during setup, lsof does no cached path name analysis and simply
+	reports it.
+
+	When the application of stat(2) to the cached path name returns
+	a no-entry reply (the ENOENT error number), lsof concludes the
+	path no longer exists (i.e., has been unlinked) and reports the
+	mounted-on directory and device of the file system.  That
+	behavior can be modified with the -X option in lsof revisions
+	4.77 and above.  See the answer to the 'What does "(deleted)"
+	mean in the NAME column of a Solaris 10 open file?' for more
+	information.
+
+	When the application of stat(2) to the cached path name returns
+	a permission error reply (the EACCES or EPERM error numbers),
+	lsof reports the cached path name and adds a trailing "(?)" to
+	indicate the reported path name is of questionable accuracy.
+	See the answer to the question 'What does "(?)" mean in the
+	NAME column of a Solaris 10 open file?' for more information.
+
+	If the application of stat(2) to the cached path name yields
+	any other error reply, lsof reports the mounted-on directory
+	and device of the file system.
+
+	When the application of stat(2) to the cached path name
+	succeeds, lsof compares the reported device and node numbers to
+	what it has obtained for the open file from kernel structures.
+	If they match, lsof reports the cached path name.  If they
+	don't match, lsof instead reports the mounted-on directory and
+	device of the file system.
+
+	A work-around that allows lsof to apply stat(2) successfully to
+	cached path names is to give lsof sufficient permission to do
+	it -- i.e., run lsof as the root user.
+
+17.25.3	What does "(deleted)" mean in the NAME column of a Solaris 10
+	open file?
+
+	When the -X option is specified to Solaris 10 lsof, it will
+	report in its NAME column the path name cached for a deleted
+	file in its vnode.  The path name will be followed by
+	"(deleted)".
+
+	Note that the path name cached in a file's vnode is the path
+	name by which the file was opened.  It is not updated by the
+	Solaris kernel when any path name component is changed.  Hence,
+	it may not represent the final path name the open file had.
+
+	See the answer to the "Why does Solaris 10 lsof sometimes
+	report the wrong path name?" question for more information on
+	how changing a path name component affects the correctness of a
+	what lsof reports.
+
+17.25.4 What does "(?)" mean in the NAME column of a Solaris 10 open
+	file?
+
+	When lsof encounters a path name cached in the open file's
+	vnode that stat(2) reports lsof lacks permission to access,
+	lsof adds "(?)" to the path name reported in the NAME column to
+	indicate the path name is of questionable accuracy.
+
+	See the answers to the "Why does Solaris 10 lsof sometimes
+	report the wrong path name?" and "Why does Solaris 10 lsof
+	sometimes report only the mounted-on directory and device?"
+	questions for more information on why lsof may report a path
+	name of questionable accuracy.
+
+	A work-around that allows lsof to apply stat(2) successfully to
+	cached path names is to give lsof sufficient permission to do
+	it -- i.e., run lsof as the root user.
+
+17.26	Solaris contract file problems
+
+17.26.1	Why doesn't lsof report size, link count and node number for
+	Solaris 10 contract files?
+
+	Lsof doesn't report size, link count or node number for Solaris
+	10 contract files because I don't know how to obtain them from
+	contract file kernel structures.
+
+17.26.2	Why can't lsof locate a Solaris 10 contract file by path name?
+
+	Because lsof can't find the node number of Solaris contract
+	files, it can't match the device and node numbers it gets from
+	applying stat(2) to the contract file path name with what it
+	finds in kernel data.
+
+17.27	Solaris 10 ZFS probblems
+
+17.27.1	Why does Configure ask for the location of ZFS header files?
+
+	To provide ZFS support when lsof is compiled it needs to have
+	access to the definitions of ZFS structures used by the kernel.
+	Those definitions are contained in header files that Sun does
+	not distribute with Solaris 10.
+
+	When the Configure script detects the system might support ZFS
+	by finding the <sys/fs/zfs.h> header file, it checks for the
+	required ZFS kernel structure definition header files.  When
+	they are not found, it asks if ZFS support should be included
+	and if so, with what definitions.
+
+	Two sources can be declared for definitions: 1) lsof's internal
+	ones; or 2) the necessary header files at some location other
+	than /usr/include/sys.
+	
+	The necessary header files are:
+
+	    dmu.h  zfs_acl.h      zfs_debug.h  zfs_rlock.h   zil.h
+	    spa.h  zfs_context.h  zfs_dir.h    zfs_vfsops.h  zio.h
+	    txg.h  zfs_ctldir.h   zfs_ioctl.h  zfs_znode.h   zio_impl.h
+	
+	The necessary header files might have been obtained, for
+	example, from the http://src.opensolaris.org Open Solaris
+	source site.  However, the Open Solaris header files might not
+	be adequate -- see the answer to the "Why don't the Open
+	Solaris ZFS header files provide correct ZFS kernel structure
+	definitions?' question for information on why the Open Solaris
+	ZFS header files might not provide correct ZFS kernel structure
+	definitions.
+
+	The supplied header file path must point to a directory that
+	contains a sys/ subdirectory where the matching header files
+	are located -- e.g., if the supplied path is /tmp/zfs, then
+	/tmp/zfs/sys must contain the necessary header files.
+
+	See the answer to the "Why do -h and -v output warn about
+	possibly inaccurate ZFS kernel structure definitions?" question
+	for information on the risks associated with using lsof's
+	internal definitions.
+
+17.27.2 Why do -h and -v output warn about possibly inaccurate ZFS
+	kernel structure definitions?
+
+	When lsof is configured to use its internal ZFS kernel
+	structure definitions, there is the chance that the definitions
+	may be out of date.  Hence, an lsof built with them may report
+	incorrect device numbers, file sizes, node numbers and link
+	counts.
+
+	Please contact me via e-mail at <abe@purdue.edu> for work-around
+	suggestions.  Make sure "lsof" appears in the "Subject:" line so
+	my e-mail filter won't classify your letter as Spam.
+
+17.27.3 Why don't the Open Solaris ZFS header files provide correct
+	ZFS kernel structure definitions?
+
+	The Open Solaris ZFS header files may not provide correct ZFS
+	kernel definitions.  An lsof built with them may report
+	incorrect device numbers, file sizes, node numbers and link
+	counts.
+
+	The definitions may be incorrect because the Open Solaris
+	header files are not synchronized with any particular Solaris
+	10 release.  Consequently they might contain modifications to
+	the structures not in the structure definitions used to build
+	the running kernel.  It may be that only Sun has header files
+	that match the kernel structures of the running Solaris 10
+	kernel.
+
+	Please contact me via e-mail at <abe@purdue.edu> for work-around
+	suggestions.  Make sure "lsof" appears in the "Subject:" line so
+	my e-mail filter won't classify your letter as Spam.
+
+
+17.28	Problems with Solaris 9 and above
+
+17.28.1	Why does the compiler complain about lgrp_root on Solaris 9
+	and above?
+
+	When compiling lsof 4.84 on later Solaris 9 and 10 systems, the
+	compiler may report the following error:
+
+	  /usr/include/sys/lgrp.h", line ...: identifier redeclared: lgrp_root
+
+	This error results from a conflict between usage of lgrp_root
+	in both <sys/lgrp.h> and <sys/lgrp_user.h> when _KMEMUSER or
+	_KERNEL is #define'd before <sys/lgrp.h> is #include'd.  This
+	problem is noted in Sunsolve bug ID 5064229.
+
+	The work-around is to use lsof revision 4.85 sources.
+
+
+18.0	Lsof Features
+
+18.1	Why doesn't lsof doesn't report on /proc entries on my
+	system?
+
+	/proc file system support is generally available only for
+	BSD, SYSV R4 dialects, and Tru64 UNIX (Digital UNIX, DEC
+	OSF/1).  It's also available for Linux, and Pyramid DC/OSx
+	and Reliant UNIX.
+
+	Even on some SYSV R4 dialects I encountered many problems
+	while trying to incorporate /proc file system support.
+	The chief problem is that some vendors don't distribute
+	the header file that describes the /proc file system node
+	-- usually called prdata.h.
+
+18.2	How do I disable the device cache file feature or alter
+	it's behavior?
+
+	To disable the device cache file feature for a dialect,
+	remove the HASDCACHE definition from the machine.h file of
+	the dialect's machine.h header file.  You can also use
+	HASDCACHE to change the default prefix (``.lsof'') of the
+	device cache file.
+
+	Be sure you consider disabling the device cache file feature
+	carefully.  Having a device cache file significantly reduces
+	lsof startup overhead by eliminating a full scan of /dev
+	(or /devices) once the device cache file has been created.
+	That full scan also overloads the kernel's name cache with
+	the names of the /dev (or /devices) nodes, reducing the
+	opportunity for lsof to find path name components of open
+	files.
+
+	If you're worried about the presence of mode 0600 device
+	cache files in the home directories of the real user IDs
+	that execute lsof, consider these checks that lsof makes
+	on the file before using it:
+
+	    1.  To read the device cache file, lsof must gain
+		permission from access(2).
+
+	    2.  The device cache file's modes must be 0600 (0644
+		if lsof is reading a system-wide device cache file)
+		and its size non-zero.
+
+	    3.  There must be a correctly formatted section count
+		line at the beginning of the file.
+
+	    4.  Each section must have a header line with a count
+	        that properly numbers the lines in the section.
+		Legal sections are device, clone, pseudo-device,
+		and CRC.
+
+	    5.  The lines of a section must have the proper format.
+
+	    6.  All lines are included in a 16 bit CRC, and it is
+		recorded in a non-checksummed section line at the
+		end of the file.
+
+	    7.  The checksum computed when the file is read must
+		match the checksum recorded when the file was
+		written.
+
+	    8.  The checksum section line must be followed by
+		end-of-information.
+
+	    9.  Lsof must be able to get matching results from
+		stat(2) on a randomly chosen entry of the device
+		section.
+
+	For more information on the device cache file, read the
+	00DCACHE file of the lsof distribution.
+
+18.2.1	What's the risk with a perverted device cache file?
+
+	Even with the checks that lsof makes on the device cache
+	file, it's conceivable that an intruder could modify it so
+	it would pass lsof's tests.
+
+	The only serious consequence I know of this change is the
+	removal of a file whose major device number identifies a
+	socket from some user ID's device cache file.  When such
+	a device has been removed from the device cache file, and
+	when lsof doesn't detect the removal, lsof may not be able
+	to identify socket files when executed by the affected user
+	ID.  Only certain dialects are at risk to this attack --
+	e.g., SCO OpenServer and Solaris 2.x, 7, 8, and 9.
+
+	If you're tracking a network intruder with lsof, that could
+	be important to you.  If you suspect that someone has
+	corrupted the device cache file you're using, I recommend
+	you use lsof's -Di option to tell it to ignore it and use
+	the contents of /dev (or /devices) instead; or remove the
+	device cache file (usually .lsof_hostname, where hostname
+	is the first component of the host's name returned by
+	gethostname(2)) from the user ID's home directory and let
+	lsof create a new one for you.
+
+18.2.2	How do I put the full host name in a personal device cache file
+	path?
+
+	Lsof constructs the personal device cache file path name
+	from a format specified in the HASPERSDC #define in the
+	dialect's machine.h header file.  As distributed HASPERSDC
+	declares the path to be ``.lsof_'' plus the first component
+	of the host name with the format ``.lsof_%L''.
+
+	If you want to change the way lsof constructs the personal
+	device cache file path name, you can change the HASPERSDC
+	#define and recompile lsof.  If, for example, you #define
+	HASPERSDC to be ``.lsof_%l'' (note the lower case `l'),
+	Configure and remake lsof, then the personal device cache
+	file path will be ``.lsof_'' plus the host name returned
+	by gethostname(2).
+
+	See the 00DCACHE file of the lsof distribution for more
+	information on the formation of the personal device cache
+	file path and the use of the HASPERSDC #define.
+
+18.2.3	How do I put the personal device cache file in /tmp?
+
+	Change the HASPERSDC definition in your dialect's machine.h
+	header file.
+	
+	When you redefine HASPERSDC, make sure you put at least
+	one user identification conversion in it to keep separate
+	the device cache files for each user of lsof.  Also give
+	some thought to including the ``%0'' conversion to define
+	an alternate path for setuid-root and root processes.
+
+	Here's a definition that puts a personal device cache file
+	in /tmp with the name ``.lsof_login_hostname_pers''.
+
+	    #define HASPERSDC "/tmp/.lsof_%u_%l_pers"
+
+	Thus the /tmp personal device cache file path for login
+	"abe" on host "lsof.itap.purdue.edu" would be:
+
+	    /tmp/.lsof_abe_lsof.itap.purdue.edu_pers
+
+	You can add the User ID (UID) with the "%U" conversion and
+	the first host name component with the ``%L'' conversion.
+
+	CAUTION: be careful using absolute paths like /tmp lest
+	lsof processes that are setuid-root or whose real UID is
+	root be used to exploit some security weakness via /tmp.
+	Elect instead to add an alternate path for those processes
+	with the ``%0'' conversion.  Here's an extension of the
+	previous HASPERSDC format for /tmp that declares an alternate
+	path:
+
+	    #define HASPERSDC "/tmp/.lsof_%u_%l_pers%0%h/.lsof_%L"
+
+	When the lsof process is setuid-root or its real UID is
+	root, presuming root's home directory is `/' and the host's
+	name is ``lsof.itap.purdue.edu'', the extended format yields:
+
+	    /.lsof_vic
+
+18.3	Why doesn't lsof know about AFS files on my favorite dialect?
+
+	Lsof currently supports AFS for these dialects:
+
+	    AIX 4.1.4 (AFS 3.4a)
+	    Linux 1.2.13 (AFS 3.3)
+	    NEXTSTEP 3.2 (AFS 3.3)
+	    Solaris 2.[56] (AFS 3.4a)
+
+	It may recognize AFS files on other versions of these
+	dialects, but I have no way to test that.  Lsof may report
+	correct information for AFS files on other dialects, but
+	I can't test that either.
+
+	AFS support must be custom crafted for each UNIX dialect
+	and then tested.  If lsof supports your favorite dialect,
+	but doesn't recognize its AFS files, probably I don't have
+	access to a test system.  If you want AFS support badly
+	for your dialect, consider helping me do the development
+	and testing.
+
+18.3.1	Why doesn't lsof report node numbers for all AFS volume files,
+	or how do I reveal dynamic module addresses to lsof?
+
+	When AFS is implemented via dynamic kernel modules -- e.g.,
+	in NEXTSTEP -- lsof can't obtain the addresses of AFS
+	variables in the kernel that it uses to identify AFS vnodes.
+	It can guess that a vnode is assigned to an AFS file and
+	it can obtain other information about AFS files, but it
+	has trouble computing AFS volume node numbers.
+
+	To determine node numbers for AFS volumes other than the
+	root volume, /afs, lsof needs access to a hashed volume
+	structure pointer table.  When it can't find the address
+	of that table, because AFS support is implemented via
+	dynamic kernel modules, lsof will return blanks in the
+	INODE column for AFS volume files.  Lsof can identify the
+	root volume's node number (0), and can compute the node
+	numbers for all other AFS files.
+
+	If you have a name list file that contains the addresses
+	of the AFS dynamic modules -- e.g., you saved module symbols
+	when you created a loadable module kernel with modload(8)
+	by specifying -sym -- lsof may be able to find the kernel
+	addresses it needs in that file.
+
+	Lsof looks up AFS dynamic kernel addresses for these dialects
+	at these default paths:
+
+	    NEXTSTEP 3.2	/usr/vice/etc/afs_loadable
+
+	A different path to a name list file with AFS dynamic kernel
+	addresses may be specified with the -A option, when the -A
+	option description appears in lsof's -h or -? (help) output.
+
+	If any addresses appear in the -A name list file that also
+	appear in the regular kernel name list file -- e.g., /vmunix
+	-- they must match, or lsof will silently ignore the -A
+	addresses on the presumption that they are out of date.
diff --git a/lsof_4.85/lsof_4.85_src/00LSOF-L b/lsof_4.85/lsof_4.85_src/00LSOF-L
new file mode 100644
index 0000000..7a58df6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00LSOF-L
@@ -0,0 +1,100 @@
+
+		    The Lsof Mailing List, lsof-l
+
+Information on lsof is available via a GNU Mailman mailing list, named
+lsof-l.  The server is located on the host rcac.purdue.edu.
+
+
+Subscribing
+===========
+
+You may subscribe to the lsof-l mailing list by sending e-mail to:
+
+  lsof-l-subscribe@rcac.purdue.edu
+
+The body of your e-mail may be empty.  You will receive a confirmation
+reply, explaining one further step you must take to complete your
+subscription.
+
+The list manager uses the e-mail address and real name in the "From:"
+line of your request to set those values in your subscription.  If you
+want different values in your subscription, consult the Mailman help
+information to learn how to specify them on your subscription request.
+(See the next "Get Help" section on how to obtain Mailman help
+information.)
+
+
+Get Help
+========
+
+More information about the rcac.purdue.edu GNU Mailman server is
+available by sending e-mail to lsof-l-request@rcac.purdue.edu with
+"help" in the subject line.  The body of your e-mail may be empty.
+
+The other information will be delivered by return e-mail.
+
+You can also obtain information on the Mailman e-mail commands in
+section 3.2 of the GNU Mailman documentation at:
+
+  http://www.gnu.org/software/mailman/mailman-member/mailman-member.html
+
+
+The Web Interface
+=================
+
+There is a web interface at:
+
+  https://lists.rcac.purdue.edu/listinfo/lsof-l
+
+You can use it to manage your lsof-l list entry.
+
+
+Posting and Moderation
+======================
+
+Once you have subscribed to lsof-l (and have an e-mail confirmation
+that your subscription was accepted), you may post messages to the list
+by sending e-mail directly to:
+
+  lsof-l@rcac.purdue.edu
+
+I moderate the lsof-l mailing list and try to keep its traffic low,
+mainly limiting it to announcements of new revisions, patches and
+security issues.  Postings don't appear until I've approved them.
+
+
+Send Bug Reports to Me Via E-Mail
+=================================
+
+DON'T SEND BUG REPORTS TO lsof-l.  Send them directly to me via e-mail
+at <abe@purdue.edu>.  Make sure lsof appears in the "Subject:" line and
+make sure you first read the "Bug Reports" section of the 00README file
+of the lsof distribution.
+
+
+Unsubscribing
+=============
+
+You can unsubscribe from lsof-l by sending e-mail to:
+
+  lsof-l-unsubscribe@rcac.purdue.edu
+
+The body of your e-mail may be empty.  You will receive a confirmation
+reply, explaining one further step you must take to complete the
+removal of your subscription.
+
+
+Archive
+=======
+
+There is an archive; use the link:
+
+  https://lists.rcac.purdue.edu/listinfo/lsof-l
+
+The archive link is the first one on the web page.  You will need the
+password you received or set when you subscribed, or later set via
+lsof-l-request or the web interface.
+
+
+Vic Abell <abe@purdue.edu>
+May 8, 2008
diff --git a/lsof_4.85/lsof_4.85_src/00MANIFEST b/lsof_4.85/lsof_4.85_src/00MANIFEST
new file mode 100644
index 0000000..36a34b0
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00MANIFEST
@@ -0,0 +1,363 @@
+.:
+00.README.FIRST
+00CREDITS
+00DCACHE
+00DIALECTS
+00DIST
+00FAQ
+00LSOF-L
+00MANIFEST
+00PORTING
+00QUICKSTART
+00README
+00TEST
+00XCONFIG
+AFSConfig*
+Configure*
+Customize*
+Inventory*
+arg.c
+dialects/
+lib/
+lsof.8
+lsof.h
+lsof.man
+lsof_fields.h
+main.c
+misc.c
+node.c
+print.c
+proc.c
+proto.h
+regex.h
+scripts/
+store.c
+tests/
+usage.c
+util.c
+version
+
+./dialects:
+aix/
+darwin/
+du/
+freebsd/
+hpux/
+linux/
+n+obsd/
+n+os/
+osr/
+sun/
+uw/
+
+./dialects/aix:
+Makefile
+Mksrc*
+aix5/
+ddev.c
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dnode2.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/aix/aix5:
+README
+j2/
+
+./dialects/aix/aix5/j2:
+j2_lock.h
+private_j2_snapshot.h
+
+./dialects/darwin:
+get-hdr-loc.sh*
+kmem/
+libproc/
+
+./dialects/darwin/kmem:
+Makefile
+Mksrc*
+ddev.c
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/darwin/libproc:
+Makefile
+Mksrc*
+ddev.c
+dfile.c
+dlsof.h
+dmnt.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/du:
+Makefile
+Mksrc*
+ddev.c
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/freebsd:
+Makefile
+Makefile.zfs
+Mksrc*
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dnode2.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+dzfs.h
+include/
+machine.h
+
+./dialects/freebsd/include:
+procfs/
+
+./dialects/freebsd/include/procfs:
+pfsnode.h
+
+./dialects/hpux:
+kmem/
+pstat/
+
+./dialects/hpux/kmem:
+Makefile
+Mksrc*
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dnode2.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+hpux11/
+machine.h
+
+./dialects/hpux/kmem/hpux11:
+ipc_s.h
+kernbits.h
+lla.h
+nfs_clnt.h
+proc.h
+rnode.h
+sth.h
+tcp_s.h
+udp_s.h
+vnode.h
+
+./dialects/hpux/pstat:
+Makefile
+Mksrc*
+dfile.c
+dlsof.h
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/linux:
+Makefile
+Mksrc*
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/n+obsd:
+Makefile
+Mksrc*
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/n+os:
+Makefile
+Mksrc*
+dlsof.h
+dnode.c
+dnode1.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+
+./dialects/osr:
+Makefile
+Mksrc*
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+include/
+machine.h
+
+./dialects/osr/include:
+netdb.h
+sys/
+
+./dialects/osr/include/sys:
+cdefs.h
+
+./dialects/sun:
+Makefile
+Mksrc*
+ddev.c
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dnode2.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+solaris_kaddr_filters
+
+./dialects/uw:
+Makefile
+Mksrc*
+dfile.c
+dlsof.h
+dmnt.c
+dnode.c
+dnode1.c
+dnode2.c
+dnode3.c
+dproc.c
+dproto.h
+dsock.c
+dstore.c
+machine.h
+uw7/
+
+./dialects/uw/uw7:
+README
+fs/
+sys/
+vm/
+
+./dialects/uw/uw7/fs:
+nsc_cfs/
+procfs/
+
+./dialects/uw/uw7/fs/nsc_cfs:
+cnode.h
+
+./dialects/uw/uw7/fs/procfs:
+README
+prdata.h
+
+./dialects/uw/uw7/sys:
+fs/
+
+./dialects/uw/uw7/sys/fs:
+README
+fifonode.h
+namenode.h
+
+./dialects/uw/uw7/vm:
+
+./lib:
+Makefile.skel
+ckkv.c
+cvfs.c
+dvch.c
+fino.c
+isfn.c
+lkud.c
+pdvn.c
+prfp.c
+ptti.c
+rdev.c
+regex.c
+rmnt.c
+rnam.c
+rnch.c
+rnmh.c
+snpf.c
+
+./scripts:
+00MANIFEST
+00README
+big_brother.perl5*
+count_pf.perl*
+count_pf.perl5*
+identd.perl5*
+idrlogin.perl*
+idrlogin.perl5*
+list_NULf.perl5*
+list_fields.awk
+list_fields.perl*
+shared.perl5*
+sort_res.perl5*
+watch_a_file.perl*
+xusers.awk*
+
+./tests:
+00README
+Add2TestDB*
+CkTestDB*
+LTbasic.c
+LTbigf.c
+LTdnlc.c
+LTlib.c
+LTlock.c
+LTnfs.c
+LTnlink.c
+LTsock.c
+LTszoff.c
+LTunix.c
+LsofTest.h
+Makefile
+TestDB
diff --git a/lsof_4.85/lsof_4.85_src/00PORTING b/lsof_4.85/lsof_4.85_src/00PORTING
new file mode 100644
index 0000000..73708c8
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00PORTING
@@ -0,0 +1,1825 @@
+
+		Guide to Porting lsof 4 to Unix OS Dialects
+
+**********************************************************************
+| The latest release of lsof is always available via anonymous ftp   |
+| from lsof.itap.purdue.edu.  Look in pub/lsof.README for its        |
+| location.                                                          |
+**********************************************************************
+
+			    Contents
+
+	How Lsof Works
+	/proc-based Linux Lsof -- a Different Approach
+	General Guidelines
+	Organization
+	Source File Naming Conventions
+	Coding Philosophies
+	Data Requirements
+	Dlsof.h and #include's
+	Definitions That Affect Compilation
+	Options: Common and Special
+	Defining Dialect-Specific Symbols and Global Storage
+	Coding Dialect-specific Functions
+	Function Prototype Definitions and the _PROTOTYPE Macro
+	The Makefile
+	The Mksrc Shell Script
+	The MkKernOpts Shell Script
+	Testing and the lsof Test Suite
+	Where Next?
+
+
+How Lsof Works
+--------------
+
+Before getting on with porting guidelines, just a word or two about
+how lsof works.
+
+Lsof obtains data about open UNIX dialect files by reading the
+kernel's proc structure information, following it to the related
+user structure, then reading the open file structures stored
+(usually) in the user structure.  Typically lsof uses the kernel
+memory devices, /dev/kmem, /dev/mem, etc. to read kernel data.
+
+Lsof stores information from the proc and user structures in an
+internal, local proc structure table.  It then processes the open
+file structures by reading the file system nodes that lie behind
+them, extracting and storing relevant data in internal local file
+structures that are linked to the internal local process structure.
+
+Once all data has been gathered, lsof reports it from its internal,
+local tables.
+
+There are a few variants on this subject.  Some systems don't have
+just proc structures, but have task structures, too, (e.g., NeXTSTEP
+and OSF/1 derivatives).  For some dialects lsof gets proc structures
+or process information (See "/proc-based Linux Lsof -- a Different
+Approach) from files of the /proc file system.  It's not necessary
+for lsof to read user structures on some systems (recent versions
+of HP-UX), because the data lsof needs can be found in the task or
+proc structures.  In the end lsof gathers the same data, just from
+slightly different sources.
+
+
+/proc-based Linux Lsof -- a Different Approach
+==============================================
+
+For a completely different approach to lsof construction, take a
+look at the /proc-based Linux sources in .../dialects/linux/proc.
+(The sources in .../dialects/linux/kmem are for a traditional lsof
+that uses /dev/kmem to read information from kernel structures.)
+
+The /proc-based lsof obtains all its information from the Linux
+/proc file system.  Consequently, it is relatively immune to changes
+in Linux kernel structures and doesn't need to be re-compiled each
+time the Linux kernel version changes.
+
+There are some down-sides to the Linux /proc-based lsof:
+
+    *  It must run setuid-root in order to be able to read the
+       /proc file system branches for all processes.  In contrast,
+       the /dev/kmem-based Linux lsof usually needs only setgid
+       permission.
+
+    *  It depends on the exact character format of /proc files, so
+       it is sensitive to changes in /proc file composition.
+
+    *  It is limited to the information a /proc file system
+       implementor decides to provide.  For example, if a
+       /proc/net/<protocol> file lacks an inode number, the
+       /proc-based lsof can't connect open socket files to that
+       protocol.  Another deficiency is that the /proc-based may
+       not be able to report file offset (position) information,
+       when it isn't available in the /proc/<PID>/fd/ entry for a
+       file.
+
+       In contrast the /dev/kmem-based lsof has full access to
+       kernel structures and "sees" new data as soon as it appears.
+       Of course, that new data requires that lsof be recompiled
+       and usually also requires changes to lsof.
+
+Overall the switch from a /dev/kmem base to a /proc one is an
+advantage to Linux lsof.  The switch was made at lsof revision 4.23
+for Linux kernel versions 2.1.72 (approximately) and higher.  The
+reason I'm not certain at which Linux kernel version a /proc-based
+lsof becomes possible is that the /proc additions needed to implement
+it have been added gradually to Linux 2.1.x in ways that I cannot
+measure.
+
+/proc-based lsof functions in many ways the same as /dev/kmem-based
+lsof.  It scans the /proc directory, looking for <PID>/ subdirectories.
+Inside each one it collects process-related data from the cwd, exe,
+maps, root, and stat information files.
+
+It collects open file information from the fd/ subdirectory of each
+<PID>/ subdirectory.  The lstat(2), readlink(2), and stat(2) system
+calls gather information about the files from the kernel.
+
+Lock information comes from /proc/locks.  It is matched to open
+files by inode number.  Mount information comes from /proc/mounts.
+Per domain protocol information comes from the files of /proc/net;
+it's matched to open socket files by inode number.
+
+The Linux /proc file system implementors have done an amazing job
+of providing the information lsof needs.  The /proc-based lsof
+project has so far generated only two kernel modification:
+
+    *  A modification to /usr/src/linux/net/ipx/af_ipx.c adds the
+       inode number to the entries of /proc/net/ipx.
+
+       Jonathan Sergent did this kernel modification.
+
+       It may be found in the .../dialects/linux/proc/patches
+       subdirectory of the lsof distribution.
+
+    *  An experimental modification to /usr/src/linux/fs/stat.c
+       allows lstat(2) to return file position information for
+       /proc/<PID>/fd/<FD> files.
+       
+       Contact me for this modification.
+
+
+One final note about the /proc-based Linux lsof: it doesn't need
+any functions from the lsof library in the lib/ subdirectory.
+
+
+General Guidelines
+------------------
+
+These are the general guidelines for porting lsof 4 to a new Unix
+dialect:
+
+    *  Understand the organization of the lsof sources and the
+       philosophies that guide their coding.
+
+    *  Understand the data requirements and determine the methods
+       of locating the necessary data in the new dialect's kernel.
+
+    *  Pick a name for the subdirectory in lsof4/dialects for your
+       dialect.  Generally I use a vendor operating system name
+       abbreviation.
+
+    *  Locate the necessary header files and #include them in the
+       dialect's dlsof.h file.  (You may not be able to complete
+       this step until you have coded all dialect-specific functions.)
+
+    *  Determine the optional library functions of lsof to be used
+       and set their definitions in the dialect's machine.h file.
+
+    *  Define the dialect's specific symbols and global storage
+       in the dialect's dlsof.h and dstore.c files.
+
+    *  Code the dialect-specific functions in the appropriate
+       source files of the dialect's subdirectory.
+
+       Include the necessary prototype definitions of the dialect-
+       specific functions in the dproto.h file in the dialect's
+       subdirectory.
+
+    *  Define the dialect's Makefile and source construction shell
+       script, Mksrc.
+
+    *  If there are #define's that affect how kernel structures
+       are organized, and those #define's are needed when compiling
+       lsof, build a MkKernOpts shell script to locate the #define's
+       and supply them to the Configure shell script.
+
+
+Organization
+------------
+
+The code in a dialect-specific version of lsof comes from three
+sources:
+
+    1)  functions common to all versions, located in the top level
+	directory, lsof4;
+
+    2)  functions specific to the dialect, located in the dialect's
+	subdirectory -- e.g., lsof4/dialects/sun;
+
+    3)  functions that are common to several dialects, although
+	not to all, organized in a library, liblsof.a.  The functions
+	in the library source can be selected and customized with
+	definitions in the dialect machine.h header files.
+
+The tree looks like this:
+
+			    lsof4 ----------------------+ 3) library --
+			    |   \			     lsof4/lib
+  1) fully common functions +    \
+      e.g., lsof4/main.c	  + lsof4/dialects/
+			   / / / / \
+			   + + + +  +
+  2) dialect-specific subdirectories -- e.g., lsof4/dialects/sun
+
+The code for a dialect-specific version is constructed from these
+three sources by the Configure shell script in the top level lsof4
+directory and definitions in the dialect machine.h header files.
+Configure uses the Mksrc shell script in each dialect's subdirectory,
+and may use an optional MkKernOpts shell script in selected dialect
+subdirectories.
+
+Configure calls the Mksrc shell script in each dialect's subdirectory
+to assemble the dialect-specific sources in the main lsof directory.
+Configure may call MkKernOpts to determine kernel compile-time
+options that are needed for compiling kernel structures correctly
+for use by lsof.  Configure puts the options in a dialect-specific
+Makefile it build, using a template in the dialect subdirectory.
+
+The assembly of dialect-specific sources in the main lsof directory
+is usually done by creating symbolic links from the top level to
+the dialect's subdirectory.  The LSOF_MKC environment variable may
+be defined prior to using Configure to change the technique used
+to assemble the sources -- most commonly to use cp instead of ln -s.
+
+The Configure script completes the dialect's Makefile by adding
+string definitions, including the necessary kernel compile-time
+options, to a dialect skeleton Makefile while copying it from the
+dialect subdirectory to the top level lsof4 directory.  Optionally
+Makefile may call the dialect's MkKernOpts script to add string
+definitions.
+
+When the lsof library, lsof4/lib/liblsof.a, is compiled its
+functions are selected and customized by #define's in the dialect
+machine.h header file.
+
+
+Source File Naming Conventions
+------------------------------
+
+With one exception, dialect-specific source files begin with a
+lower case `d' character -- ddev.c, dfile.c, dlsof.h.  The one
+exception is the header file that contains dialect-specific
+definitions for the optional features of the common functions.
+It's called machine.h for historical reasons.
+
+Currently all dialects use almost the same source file names.  One
+exception to the rule happens in dialects where there must be
+different source files -- e.g., dnode[123].c -- to eliminate node
+header file structure element name conflicts.  The source modules
+in a few subdirectories are organized that way.
+
+Unusual situations occur for NetBSD and OpenBSD, and for NEXTSTEP
+and OPENSTEP.  Each pair of dialects is so close in design that
+the same dialect sources from the n+obsd subdirectory serves NetBSD
+and OpenBSD; from n+os, NEXTSTEP and OPENSTEP.
+
+These are common files in lsof4/:
+
+    Configure	the configuration script
+
+    Customize	does some customization of the selected lsof
+		dialect
+
+    Inventory	takes an inventory of the files in an lsof
+		distribution
+
+    version	the version number
+
+    dialects/	the dialects subdirectory
+
+These are the common function source files in lsof4/:
+
+    arg.c	common argument processing functions
+
+    lsof.h	common header file that #include's the dialect-specific
+		header files
+
+    main.c	common main function for lsof 4
+
+    misc.c	common miscellaneous functions -- e.g., special versions
+		of stat() and readlink()
+
+    node.c	common node reading functions -- readinode(), readvnode()
+
+    print.c	common print support functions
+
+    proc.c	common process and file structure functions
+
+    proto.h	common prototype definitions, including the definition of
+		the _PROTOTYPE() macro
+
+    store.c	common global storage version.h	the current lsof version
+		number, derived from the file version by the Makefile
+
+    usage.c	functions to display lsof usage panel
+
+These are the dialect-specific files:
+
+    Makefile	the Makefile skeleton
+
+    Mksrc	a shell script that assists the Configure script
+		in configuring dialect sources
+
+    MkKernOpts  an optional shell script that identifies kernel
+		compile-time options for selected dialects -- e.g.,
+		Pyramid DC/OSx and Reliant UNIX
+
+    ddev.c	device support functions -- readdev() -- may be
+		eliminated by functions from lsof4/lib/
+
+    dfile.c	file processing functions -- may be eliminated by
+		functions from lsof4/lib/
+
+    dlsof.h	dialect-specific header file -- contains #include's
+		for system header files and dialect-specific global
+		storage declarations
+
+    dmnt.c	mount support functions -- may be eliminated by
+		functions from lsof4/lib/
+
+    dnode.c	node processing functions -- e.g., for gnode or vnode
+
+    dnode?.c	additional node processing functions, used when node
+		header files have duplicate and conflicting element
+		names.
+
+    dproc.c	functions to access, read, examine and cache data about
+		dialect-specific process structures -- this file contains
+		the dialect-specific "main" function, gather_proc_info()
+
+    dproto.h	dialect-specific prototype declarations
+
+    dsock.c	dialect-specific socket processing functions
+
+    dstore.c	dialect-specific global storage -- e.g., the nlist()
+		structure
+
+    machine.h	dialect specific definitions of common function options --
+		e.g., a HASINODE definition to activate the readinode()
+		function in lsof4/node.c
+
+		The machine.h header file also selects and customizes
+		the functions of lsof4/lib/.
+
+These are the lib/ files.  Definitions in the dialect machine.h
+header files select and customize the contained functions that are
+to be compiled and archived to liblsof.a.
+
+    Makefile.skel	is a skeleton Makefile, used by Configure
+			to construct the Makefile for the lsof
+			library.
+
+    cvfs.c		completevfs() function
+
+			USE_LIB_COMPLETEVFS selects it.
+
+			CVFS_DEVSAVE, CVFS_NLKSAVE, CVFS_SZSAVE,
+			and HASFSINO customize it.
+
+    dvch.c		device cache functions
+
+			HASDCACHE selects them.
+
+			DCACHE_CLONE, DCACHE_CLR, DCACHE_PSEUDO,
+			DVCH_CHOWN, DVCH_DEVPATH, DVCH_EXPDEV,
+			HASBLKDEV, HASENVDC, HASSYSDC, HASPERSDC,
+			HASPERSDCPATH, and NOWARNBLKDEV customize
+			them.
+
+    fino.c		find block and character device inode functions
+
+			HASBLKDEV and USE_LIB_FIND_CH_INO select them.
+
+    isfn.c		hashSfile() and is_file_named() functions
+
+			USE_LIB_IS_FILE_NAMED selects it.
+
+    lkud.c		device lookup functions
+
+			HASBLKDEV and USE_LIB_LKUPDEV select them.
+
+    pdvn.c		print device name functions
+
+			HASBLKDEV and USE_LIB_PRINTDEVNAME select them.
+
+    prfp.c		process_file() function
+
+			USE_LIB_PROCESS_FILE selects it.
+
+			FILEPTR, DTYPE_PIPE, HASPIPEFN, DTYPE_GNODE,
+			DTYPE_INODE, DTYPE_PORT, DTYPE_VNODE,
+			HASF_VNODE, HASKQUEUE, HASPRIVFILETYPE,
+			HASPSXSHM and HASPSXSEM customize it.
+
+    ptti.c		print_tcptpi() function
+
+			USE_LIB_PRINT_TCPTPI selects it.
+
+			HASSOOPT, HASSBSTATE, HASSOSTATE, AHSTCPOPT,
+			HASTCPTPIQ and HASTCPTPIW customize it.
+
+    rdev.c		readdev() function
+
+			USE_LIB_READDEV selects it.
+
+			DIRTYPE, HASBLKDEV, HASDCACHE, HASDNAMLEN,
+			RDEV_EXPDEV, RDEV_STATFN, USE_STAT, and
+			WARNDEVACCESS customize it.
+
+    rmnt.c		readmnt() function
+
+			USE_LIB_READMNT selects it.
+
+			HASFSTYPE, MNTSKIP, RMNT_EXPDEV, RMNT_FSTYPE,
+			and MOUNTS_FSTYPE customize it.
+
+    rnam.c		BSD format name cache functions
+
+			HASNCACHE and USE_LIB_RNAM select them.
+
+			HASFSINO, NCACHE, NCACHE_NC_CAST, NCACHE_NM,
+			NCACHE_NMLEN, NCACHE_NODEADDR, NCACHE_NODEID,
+			NCACHE_NO_ROOT, NCACHE_NXT, NCACHE_PARADDR,
+			NCACHE_PARID, NCACHE_SZ_CAST, NCHNAMLEN,
+			X_NCACHE, and X_NCSIZE, customize them.
+
+    rnch.c		Sun format name cache functions
+
+			HASNCACHE and USE_LIB_RNCH select them.
+
+			ADDR_NCACHE, HASDNLCPTR, HASFSINO, NCACHE_DP,
+			NCACHE_NAME, NCACHE_NAMLEN, NCACHE_NEGVN,
+			NCACHE_NODEID, NCACHE_NXT, NCACHE_PARID,
+			NCACHE_VP, X_NCACHE, and X_NCSIZE, customize
+			them.
+
+    snpf.c		Source for the snprintf() family of functions
+
+			USE_LIB_SNPF selects it.
+
+
+The comments and the source code in these library files give more
+information on customization.
+
+
+Coding Philosophies
+-------------------
+
+A few basic philosophies govern the coding of lsof 4 functions:
+
+    *  Use as few #if/#else/#endif constructs as possible, even at
+       the cost of nearly-duplicate code.
+
+       When #if/#else/#endif constructs are necessary:
+       
+       o  Use the form
+
+		#if	defined(s<symbol>)
+	
+	  in preference to
+	
+		#ifdef	<symbol>
+	
+	  to allow easier addition of tests to the #if.
+
+       o  Indent them to signify their level -- e.g.,
+
+		#if	/* level one */
+		# if	/* level two */
+		# endif	/* level two */
+		#else	/* level one */
+		#endif	/* level one */
+
+	o  Use ANSI standard comments on #else and #endif statements.
+
+    *  Document copiously.
+
+    *  Aim for ANSI-C compatibility:
+    
+       o  Use function prototypes for all functions, hiding them
+	  from compilers that cannot handle them with the _PROTOTYPE()
+	  macro.
+
+       o  Use the compiler's ANSI conformance checking wherever
+	  possible -- e.g., gcc's -ansi option.
+
+
+Data Requirements
+-----------------
+
+Lsof's strategy in obtaining open file information is to access
+the process table via its proc structures, then obtain the associated
+user area and open file structures.  The open file structures then
+lead lsof to file type specific structures -- cdrnodes, fifonodes,
+inodes, gnodes, hsfsnodes, pipenodes, pcnodes, rnodes, snodes,
+sockets, tmpnodes, and vnodes.
+
+The specific node structures must yield data about the open files.  The
+most important items and device number (raw and cooked) and node
+number.  (Lsof uses them to identify files and file systems named as
+arguments.)  Link counts and file sizes are important, too, as are the
+special characteristics of sockets, pipes, FIFOs, etc.
+
+This means that to begin an lsof port to a new Unix dialect you
+must understand how to obtain these structures from the dialect's
+kernel.  Look for kernel access functions -- e.g., the AIX readx()
+function, Sun and Sun-like kvm_*() functions, or SGI's syssgi()
+function.  Look for clues in header files -- e.g. external declarations
+and macros.
+
+If you have access to them, look at sources to programs like ps(1),
+or the freely available monitor and top programs.  They may give
+you important clues on reading proc and user area structures.  An
+appeal to readers of dialect-specific news groups may uncover
+correspondents who can help.
+
+Careful reading of system header files -- e.g., <sys/proc.h> --
+may give hints about how kernel storage is organized.  Look for
+global variables declared under a KERNEL or _KERNEL #if.  Run nm(1)
+across the kernel image (/vmunix, /unix, etc.) and look for references
+to structures of interest.
+
+Even if there are support functions for reading structures, like the
+kvm_*() functions, you must still understand how to read data from
+kernel memory.  Typically this requires an understanding of the
+nlist() function, and how to use /dev/kmem, /dev/mem, and /dev/swap.
+
+Don't overlook the possibility that you may have to use the process
+file system -- e.g., /proc.  I try to avoid using /proc when I can,
+since it usually requires that lsof have setuid(root) permission
+to read the individual /proc "files".
+
+Once you can access kernel structures, you must understand how
+they're connected.  You must answer questions like:
+
+    *  How big are kernel addresses?  How are they type cast?
+
+    *  How are kernel variable names converted to addresses?
+       Nlist()?
+
+    *  How are the proc structures organized?  Is it a static
+       table?  Are the proc structures linked?  Is there a
+       kernel pointer to the first proc structure?  Is there a
+       proc structure count?
+
+    *  How does one obtain copies of the proc structures?  Via
+       /dev/kmem?  Via a vendor API?
+
+    *  If this is a Mach derivative, is it necessary to obtain the
+       task and thread structures?  How?
+
+    *  How does one obtain the user area (or the utask area in Mach
+       systems) that corresponds to a process?
+
+    *  Where are the file structures located for open file
+       descriptors and how are they located?  Are all file
+       structures in the user area?  Is the file structure space
+       extensible?
+
+    *  Where do the private data pointers in file structures lead?
+       To gnodes?  To inodes?  To sockets?  To vnodes?  Hint: look
+       in <sys/file.h> for DTYPE_* instances and further pointers.
+
+    *  How are the nodes organized?  To what other nodes do they
+       lead and how?  Where are the common bits of information in
+       nodes -- device, node number, size -- stored?  Hint: look
+       in the header files for nodes for macros that may be used
+       to obtain the address of one node from another -- e.g., the
+       VTOI() macro that leads from a vnode to an inode.
+
+    *  Are text reference nodes identified and how?  Is it
+       necessary to examine the virtual memory map of a process or
+       a task to locate text references?  Some kernels have text
+       node pointers in the proc structures; some, in the user
+       area; Mach kernels may have text information in the task
+       structure, reached in various ways from the proc, user area,
+       or user task structure.
+
+    *  How is the device table -- e.g., /dev or /devices --
+       organized?  How is it read?  Using direct or dirent structures?
+
+       How are major/minor device numbers represented?  How are
+       device numbers assembled and disassembled?
+
+       Are there clone devices?  How are they identified?
+
+    *  How is mount information obtained?  Getmntinfo()?  Getmntent()?
+       Some special kernel call?
+
+    *  How are sockets identified and organized?  BSD-style?  As
+       streams?  Are there streams?
+
+    *  Are there special nodes -- CD-ROM nodes, FIFO nodes, etc.?
+
+    *  How is the kernel's name cache organized?  Can lsof access
+       it to get partial name components?
+
+
+Dlsof.h and #include's
+----------------------
+
+Once you have identified the kernel's data organization and know
+what structures it provides, you must add #include's to dlsof.h to
+access their definitions.  Sometimes it is difficult to locate the
+header files -- you may need to introduce -I specifications in the
+Makefile via the DINC shell variable in the Configure script.
+
+Sometimes it is necessary to define special symbols -- e.g., KERNEL,
+_KERNEL, _KMEMUSER -- to induce system header files to yield kernel
+structure definitions.  Sometimes making those symbol definitions
+cause other header file and definition conflicts.  There's no good
+general rule on how to proceed when conflicts occur.
+
+Rarely it may be necessary to extract structure definitions from
+system header files and move them to dlsof.h, create special versions
+of system header files, or obtain special copies of system header
+files from "friendly" (e.g., vendor) sources.  The dlsof.h header
+file in lsof4/dialects/sun shows examples of the first case; the
+second, no examples; the third, the irix5hdr subdirectory in
+lsof4/dialects/irix (a mixture of the first and third).
+
+Building up the necessary #includes in dlsof.h is an iterative
+process that requires attention as you build the dialect-specific
+functions that references kernel structures.  Be prepared to revisit
+dlsof.h frequently.
+
+
+Definitions That Affect Compilation
+-----------------------------------
+
+The source files at the top level and in the lib/ subdirectory
+contain optional functions that may be activated with definitions
+in a dialect's machine.h header file.  Some are functions for
+reading node structures that may not apply to all dialects -- e.g.
+CD-ROM nodes (cdrnode), or `G' nodes (gnode) -- and others are
+common functions that may occasionally be replaced by dialect-specific
+ones.  Once you understand your kernel's data organization, you'll
+be able to decide the optional common node functions to activate.
+
+Definitions in machine.h and dlsof.h also enable or disable other
+optional common features.  The following is an attempt to list all
+the definitions that affect lsof code, but CAUTION, it is only
+attempt and may be incomplete.  Always check lsof4 source code in
+lib/ and dialects/, and dialect machine.h header files for other
+possibilities
+
+    AFS_VICE		See 00XCONFIG.
+
+    AIX_KERNBITS	specifies the kernel bit size, 32 or 64, of the Power
+			architecture AIX 5.x kernel for which lsof was built.
+
+    CAN_USE_CLNT_CREATE	is defined for dialects where the more modern
+			RPC function clnt_create() can be used in
+			place of the deprecated clnttcp_create().
+
+    CLONEMAJ            defines the name of the variable that
+			contains the clone major device number.
+			(Also see HAS_STD_CLONE and HAVECLONEMAJ.)
+
+    DEVDEV_PATH		defines the path to the directory where device
+			nodes are stored, usually /dev.  Solaris 10
+			uses /devices.
+
+    DIALECT_WARNING	may be defined by a dialect to provide a
+			warning message that will be displayed with
+			help (-h) and version (-v) output.
+
+    FSV_DEFAULT		defines the default file structure values to
+			list.  It may be composed of or'd FSV_*
+			(See lsof.h) values.  The default is none (0).
+
+    GET_MAJ_DEV         is a macro to get major portion from device
+			number instead of via the standard major()
+			macro.
+
+    GET_MIN_DEV		is a macro to get minor portion from device
+			number instead of via the standard minor()
+			macro.
+
+    GET_MAX_FD		the name of the function that returns an
+			int for the maximum open file descriptor
+			plus one.  If not defined, defaults to
+			getdtablesize.
+
+    HAS9660FS           enables CD9660 file system support in a
+			BSD dialect.
+
+    HAS_ADVLOCK_ARGS    is defined for NetBSD and OpenBSD dialects
+			whose <sys/lockf.h> references vop_advlock_args.
+
+    HAS_AFS		enables AFS support code for the dialect.
+
+    HAS_ATOMIC_T	indicates the Linux version has an
+			<asm/atomic.h> header file and it contains
+			"typedef struct .* atomic_t;"
+
+    HASAOPT		indicates the dialect supports the AFS -A
+			option when HAS_AFS is also defined.
+
+    HAS_ASM_TERMIOBITS  indicates for Linux Alpha that the
+			<asm/termiobits.h> header file exists.
+
+    HASAX25CBPTR	indicates that the Linux sock struct has an
+			ax25_db pointer.
+
+    HASBLKDEV		indicates the dialect has block device support.
+
+    HASBUFQ_H		indicates the *NSD dialect has the <sys/bufq.h>
+			header file.
+
+    HASCACHEFS		enables cache file system support for the
+			dialect.
+
+    HAS_CDFS		enables CDFS file system support for the
+			dialect.
+
+    HASCDRNODE		enables/disables readcdrnode() in node.c.
+
+    HAS_CONN_NEW        indicates the Solaris version has the new form
+			of the conn_s structure, introduced in b134 of
+			Solaris 11.  This will always accompany the
+			HAS_IPCLASSIFIER_H definition.
+
+    HAS_CONST		indicates that the compiler supports the
+			const keyword.
+
+    HASCPUMASK_T	indicates the FreeBSD 5.2 or higher dialect
+			has cpumask_t typedef's.
+
+    HAS_CRED_IMPL_H	indicates the Solaris 10 dialect has the
+			<sys/cred_impl.h> header file available.
+
+    HASCWDINFO          indicates the cwdinfo structure is defined
+			in the NetBSD <sys/filedesc.h>.
+
+    HASDCACHE           enables device file cache file support.
+			The device cache file contains information
+			about the names, device numbers and inode
+			numbers of entries in the /dev (or /device)
+			node subtree that lsof saves from call to
+			call.  See the 00DCACHE file of the lsof
+			distribution for more information on this
+			feature.
+
+    HASDENTRY		indicates the Linux version has a dentry
+			struct defined in <linux/dcache.h>.
+
+    HASDEVKNC           indicates the Linux version has a kernel
+			name cached keyed on device number.
+
+    HAS_DINODE_U	indicates the OpenBSD version has a dinode_u
+			union in its inode structure.
+
+    HASDNLCPTR          is defined when the name cache entry of
+			<sys/dnlc.h> has a name character pointer
+			rather than a name character array.
+
+    HASEFFNLINK		indicates the *BSD system has the i_effnlink
+			member in the inode structure.
+
+    HASENVDC            enables the use of an environment-defined
+			device cache file path and defines the name
+			of the environment variable from which lsof
+			may take it.  (See the 00DCACHE file of
+			the lsof distribution for information on
+			when HASENVDC is used or ignored.)
+
+    HASEOPT		indicates the dialect supports the -e option to
+			eliminate kernel blocks on a named file system.
+
+    HASEXT2FS           is defined for BSD dialects for which ext2fs
+			file system support can be provided.  A value
+			of 1 indicates that the i_e2din member does not
+			exist; 2, it exists.
+
+    HASF_VNODE		indicates the dialect's file structure has an
+			f_vnode member in it.
+
+    HASFDESCFS		enables file descriptor file system support
+			for the dialect.   A value of 1 indicates
+			<miscfs/fdesc.h> has a Fctty definition; 2,
+			it does not.
+
+    HASFDLINK		indicates the file descriptor file system
+			node has the fd_link member.
+
+    HASFIFONODE		enables/disables readfifonode() in node.c.
+
+    HAS_FL_FD		indicates the Linux version has an fl_fd
+			element in the lock structure of <linux/fs.h>.
+
+    HAS_FL_FILE		indicates the Linux version has an fl_file
+			element in the lock structure of <linux/fs.h>.
+
+    HAS_FL_WHENCE	indicates the Linux version has an fl_whence
+			element in the lock structure of <linux/fs.h>.
+
+    HAS_F_OPEN		indicates the UnixWare 7.x dialect has the
+			f_open member in its file struct.
+
+    HASFSINO            enables the inclusion of the fs_ino element
+			in the lfile structure definition in lsof.h.
+			This contains the file system's inode number
+			and may be needed when searching the kernel
+			name cache.  See dialects/osr/dproc.c for
+			an example.
+
+    HAS_JFS2		The AIX >= 5.0 dialect has jfs2 support.
+
+    HASFSTRUCT		indicates the dialect has a file structure
+			the listing of whose element values can be
+			enabled with +f[cfn].  FSV_DEFAULT defines
+			the default listing values.
+
+    HASFSTYPE           enables/disables the use of the file system's
+			stat(2) st_fstype member.
+
+			If the HASFSTYPE value is 1, st_fstype is
+			treated as a character array; 2, it is
+			treated as an integer.
+
+			See also the RMNT_EXPDEV and RMNT_FSTYPE
+			documentation in lib/rmnt.c
+
+    HASGETBOOTFILE	indicates the NetBSD or OpenBSD dialect has
+			a getbootfile() function.
+
+    HASGNODE		enables/disables readgnode() in node.c.
+
+    HASHASHPID		is defined when the Linux version (probably
+			above 2.1.35) has a pidhash_next member in
+			its task structure.
+
+    HASHSNODE		enables/disables readhsnode() in node.c.
+
+    HASI_E2FS_PTR	indicates the BSD dialect has a pointer in
+			its inode to the EXTFS dinode.
+
+    HASI_FFS            indicates the BSD dialect has i_ffs_size
+			in <ufs/ufs/inode.h>.
+
+    HASI_FFS1		indicates the BSD dialect supports the fast
+			UFS1 and UFS2 file systems.
+
+    HAS_INKERNEL        indicates the SCO OSR 6.0.0 or higher, or
+			UnixWare 7.1.4 or higher system uses the
+			INKERNEL symbol in <netinet/in_pcb.h> or
+			<netinet/tcp_var.h>.
+
+    HASINODE		enables/disables readinode() in node.c.
+
+    HASINOKNC		indicates the Linux version has a kernel
+			name cache keyed on inode address.
+
+    HASINADDRSTR	is defined when the inp_[fl]addr members
+			of the inpcb structure are structures.
+
+    HASINRIAIPv6	is defined if the dialect has the INRIA IPv6
+			support.  (HASIPv6 will also be defined.)
+
+    HASINT16TYPE	is defined when the dialect has a typedef
+			for int16 that may conflict with some other
+			header file's redefinition (e.g., <afs/std.h>).
+
+    HASINT32TYPE	is defined when the dialect has a typedef
+			for int32 that may conflict with some other
+			header file's redefinition (e.g., <afs/std.h>).
+
+    HASINTSIGNAL	is defined when signal() returns an int.
+
+    HAS_IPCLASSIFIER_H	is defined for Solaris dialects that have the
+			<inet/ipclassifier.h> header file.
+
+    HAS_IPC_S_PATCH	is defined when the HP-UX 11 dialect has the
+			ipc_s patch installed.  It has a value of
+			1 if the ipc_s structure has an ipc_ipis
+			member, but the ipis_s structure lacks the
+			ipis_msgsqueued member; 2, if ipc_s has
+			ipc_ipis, but ipis_s lacks ipis_msgsqueued.
+
+    HASIPv6             indicates the dialect supports the IPv6
+			Internet address family.
+
+    HASKERNELKEYT       indicates the Linux version has a
+			__kernel_key_t typedef in <linux/types.h>.
+
+    HASKERNFS           is defined for BSD dialects for which
+			/kern file system support can be provided.
+
+    HASKERNFS_KFS_KT	indicates *kfs_kt is in the BSD dialect's
+			<miscfs/kernfs/kernfs.h>.
+
+    HASKOPT		enables/disables the ability to read the
+			kernel's name list from a file -- e.g., from
+			a crash dump file.
+
+    HASKQUEUE           indicates the dialect supports the kqueue
+			file type.
+
+    HASKVMGETPROC2      The *BSD dialect has the kvm_gettproc2()
+			function.
+
+    HAS_KVM_VNODE	indicates the FreeBSD 5.3 or higher dialect has
+			"defined(_KVM_VNODE)" in <sys/vnode.h>.
+
+    HASLFILEADD		defines additional, dialect-specific elements
+    SETLFILEADD		in the lfile structure (defined in lsof.h).
+			HASLFILEADD is a macro. The accompanying SETFILEADD
+			macro is used in the alloc_lfile() function of
+			proc.c to preset the additional elements.
+
+    HAS_LF_LWP          is defined for BSD dialects where the lockf
+			structure has an lf_lwp member.
+
+    HASLFS		indicates the *BSD dialect has log-structured
+			file system support.
+
+    HAS_LGRP_ROOT_CONFLICT
+			indicates the Solaris 9 or Solaris 10 system has 
+			a conflict over the lgrp_root symbol in the
+			<sys/lgrp.h> and <sys/lgrp_user.h> header files.
+
+    HAS_LIBCTF		indicates the Solaris 10 and above system has
+			the CTF library.
+
+    HAS_LOCKF_ENTRY	indicates the FreeBSD version has a lockf_entry
+			structure in its <sys/lockf.h> header file.
+
+    HAS_LWP_H		is defined for BSD dialects that have the
+			<sys/lwp.h> header file.
+
+    HASMOPT		enables/disables the ability to read kernel
+			memory from a file -- e.g., from a crash
+			dump file.
+
+    HASMSDOSFS		enables MS-DOS file system support in a
+			BSD dialect.
+
+    HASMNTSTAT          indicates the dialect has a stat(2) status
+			element in its mounts structure.
+
+    HASMNTSUP		indicates the dialect supports the mount supplement
+			option.
+
+    HASNAMECACHE	indicates the FreeBSD dialect has a namecache
+			structure definition in <sys/namei.h>.
+
+    HASNCACHE		enables the probing of the kernel's name cache
+			to obtain path name components.  A value
+			of 1 directs printname() to prefix the
+			cache value with the file system directory
+			name; 2, avoid the prefix.
+
+    HASNCVPID           The *BSD dialect namecache struct has an
+			nc_vpid member.
+
+    HASNETDEVICE_H	indicates the Linux version has a netdevice.h
+			header file.
+
+    HAS_NFS		enables NFS support for the dialect.
+
+    HASNFSKNC		indicates the LINUX version has a separate
+			NFS name cache.
+
+    HASNFSPROTO         indicates the NetBSD or OpenBSD version
+			has the nfsproto.h header file.
+
+    HASNFSVATTRP	indicates the n_vattr member of the nfsnode of
+			the *BSD dialect is a pointer.
+
+    HASNLIST		enables/disables nlist() function support.
+			(See NLIST_TYPE.)
+
+    HASNOFSADDR		is defined if the dialect has no file structure
+			addresses.  (HASFSTRUCT must be defined.)
+
+    HASNOFSCOUNT	is defined if the dialect has no file structure counts.
+			(HASFSTRUCT must be defined.)
+
+    HASNOFSFLAGS	is defined if the dialect has no file structure flags.
+			(HASFSTRUCT must be defined.)
+
+    HASNOFSNADDR	is defined if the dialect has no file structure node
+			addresses.  (HASFSTRUCT must be defined.)
+
+    HAS_NO_6PORT	is defined if the FreeBSD in_pcb.h has no in6p_.port
+			definitions.
+
+    HAS_NO_6PPCB	is defined if the FreeBSD in_pcb.h has no in6p_ppcb
+			definition.
+
+    HAS_NO_ISO_DEV	indicates the FreeBSD 6 and higher system has
+			no i_dev member in its iso_node structure.
+
+    HAS_NO_LONG_LONG	indicates the dialect has no support for the C
+			long long type.  This definition is used by
+			the built-in snprintf() support of lib/snpf.c.
+
+    HASNORPC_H		indicates the dialect has no /usr/include/rpc/rpc.h
+			header file.
+
+    HAS_NO_SI_UDEV	indicates the FreeBSD 6 and higher system has
+			no si_udev member in its cdev structure.
+
+    HASNOSOCKSECURITY   enables the listing of open socket files,
+			even when HASSECURITY restricts listing of
+			open files to the UID of the user who is
+			running lsof, provided socket file listing
+			is selected with the "-i" option.  This
+			definition is only effective when HASSECURITY
+			is also defined.
+
+    HASNULLFS           indicates the dialect (usually *BSD) has a
+			null file system.
+
+    HASOBJFS            indicates the Pyramid version has OBJFS
+			support.
+
+    HASONLINEJFS	indicates the HP-UX 11 dialect has the optional
+			OnlineJFS package installed.
+
+    HAS_PC_DIRENTPERSEC
+			indicates the Solaris 10 system's <sys/fs/pc_node.h>
+			header file has the pc_direntpersec() macro.
+
+    HAS_PAD_MUTEX	indicates the Solaris 11 system has the pad_mutex_t
+			typedef in its <sys/mutex.h> header file.
+
+    HASPERSDC           enables the use of a personal device cache
+			file path and specifies a format by which
+			it is constructed.  See the 00DCACHE file
+			of the lsof distribution for more information
+			on the format.
+
+    HASPERSDCPATH       enables the use of a modified personal
+			device cache file path and specifies the
+			name of the environment variable from which
+			its component may be taken.  See the 00DCACHE
+			file of the lsof distribution for more
+			information on the modified personal device
+			cache file path.
+
+    HASPINODEN		declares that the inode number of a /proc file
+			should be stored in its procfsid structure.
+
+    HASPIPEFN           defines the function that processes DTYPE_PIPE
+			file structures.  It's used in the prfp.c
+			library source file.  See the FreeBSD
+			dialect source for an example.
+
+    HASPIPENODE		enables/disables readpipenode() in node.c.
+
+    HASPMAPENABLED      enables the automatic reporting of portmapper
+			registration information for TCP and UDP
+			ports that have been registered.
+
+    HASPPID		indicates the dialect has parent PID support.
+
+    HASPR_LDT		indicates the Solaris dialect has a pr_ldt
+			member in the pronodetype enum.
+
+    HASPR_GWINDOWS	indicates the Solaris dialect has a pr_windows
+			member in the pronodetype enum.
+
+    HASPRINTDEV         this value defines a private function for
+			printing the dialect's device number.  Used
+			by print.c/print_file().  Takes one argument:
+
+			char *HASPRINTDEV(struct lfile *)
+
+    HASPRINTINO         this value names a private function for
+			printing the dialect's inode number.  Used
+			by print.c/print_file(). Takes one argument:
+
+			char *HASPRINTINO(struct lfile *)
+
+    HASPRINTNM          this value names a private function for
+			printing the dialect's file name.  Used by
+			print.c/print_file().  Takes one argument:
+
+			void HASPRINTNM(struct lfile *)
+
+    HASPRINTOFF         this value names a private function for
+			printing the dialect's file offset.  Used
+			by print.c/print_file().  Takes two arguments:
+
+			char *HASPRINTOFF(struct lfile *, int ty)
+
+			Where ty == 0 if the offset is to be printed
+			in 0t<decimal> format; 1, 0x<hexadecimal>.
+
+    HASPRINTSZ		this value names a private function for
+			printing the dialect's file size.  Used
+			by print.c/print_file(). Takes one argument:
+
+			char *HASPRINTSZ(struct lfile *)
+
+			void HASPRINTNM(struct lfile *)
+
+    HASPRIVFILETYPE     enables processing of the private file
+			type, whose number (from f_type of the file
+			struct) is defined by PRIVFILETYPE.
+			HASPRIVFILETYPE defines the function that
+			processes the file struct's f_data member.
+			Processing is initiated from the process_file()
+			function of the prfp.c library source file
+			or from the dialect's own process_file()
+			function.
+
+    HASPRIVNMCACHE      enables printing of a file path from a
+			private name cache.  HASPRIVNMCACHE defines
+			the name of the printing function.  The
+			function takes one argument, a struct lfile
+			pointer to the file, and returns non-zero
+			if it prints a cached name to stdout.
+
+    HASPRIVPRIPP        is defined for dialects that have a private
+			function for printing the IP protocol name.
+			When this is not defined, the function to
+			do that defaults to printiproto().
+
+    HASPROCFS		defines the name (if any) of the process file
+			system -- e.g., /proc.
+
+    HASPROCFS_PFSROOT	indicates PFSroot is in the BSD dialect's
+			<miscfs/procfs/procfs.h>.
+
+    HASPSEUDOFS         indicates the FreeBSD dialect has pseudofs
+			file system support.
+
+    HASPSXSEM		indicates the dialect has support for the POSIX
+			semaphore file type.
+
+    HASPSXSHM		indicates the dialect has support for the POSIX
+			shared memory file type.
+
+    HASPTYFS		indicates the *BSD dialect has a ptyfs file system.
+
+    HASRNODE		enables/disables readrnode() in node.c.
+
+    HASRNODE3		indicates the HPUX 10.20 or lower dialect has NFS3
+			support with a modified rnode structure.
+
+    HASRPCV2H		The FreeBSD dialect has <nfs/rpcv2.h>.
+
+    HAS_SANFS           indicates the AIX system has SANFS file system
+			support.
+
+    HASSBSTATE          indicates the dialect has socket buffer state
+			information (e.g., SBS_* symbols) available.
+
+    HASSECURITY         enables/disables restricting open file
+			information access.  (Also see HASNOSOCKSECURITY.)
+
+    HASSELINUX          indicates the Linux dialect has SELinux security
+			context support available.
+
+    HASSETLOCALE	is defined if the dialect has <locale.h> and
+			setlocale().
+
+    HAS_SI_PRIV         indicates the FreeBSD 6.0 and higher cdev
+			structure has an si_priv member.
+
+    HAS_SOCKET_PROTO_H	indicates the Solaris 10 system has the header file
+			<sys/socket_proto.h>.
+
+    HASSOUXSOUA		indicates that the Solaris <sys/socketvar.h> has
+			soua_* members in its so_ux_addr structure.
+
+    HASSPECDEVD		indicates the dialect has a special device
+			directory and defines the name of a function
+			that processes the results of a successful
+			stat(2) of a file in that directory.
+
+    HASSPECNODE         indicates the DEC OSF/1, or Digital UNIX,
+			or Tru64 UNIX <sys/specdev.h> has a spec_node
+			structure definition.
+
+    HASSNODE		indicates the dialect has snode support.
+
+    HAS_SOCKET_SK	indicates that the Linux socket structure
+			has the ``struct sock *sk'' member.
+
+    HASSOOPT            indicates the dialect has socket option
+			information (e.g., SO_* symbols) available.
+
+    HASSOSTATE          indicates the dialect has socket state
+			information (e.g., SS_* symbols) available.
+
+    HASSTATVFS          indicates the NetBSD dialect has a statvfs
+			struct definition.
+
+    HASSTAT64		indicates the dialect's <sys/stat.h> contains
+			stat64.
+
+    HAS_STD_CLONE	indicates the dialect uses a standard clone
+			device structure that can be used in common
+			library function clone processing.  If the
+			value is 1, the clone table will be built
+			by readdev() and cached when HASDCACHE is
+			defined; if the value is 2, it is assumed
+			the clone table is built independently.
+			(Also see CLONEMAJ and HAVECLONEMAJ.)
+
+    HASSTREAMS          enables/disables streams.  CAUTION, requires
+			specific support code in the dialect sources.
+
+    HAS_STRFTIME	indicates the dialect has the gmtime() and
+			strftime() C library functions that support
+			the -r marker format option.  Configure tests
+			for the functions and defines this symbol.
+
+    HASSYSDC            enables the use of a system-wide device
+			cache file and defines its path.  See the
+			00DCACHE file of the lsof distribution for
+			more information on the system-wide device
+			cache file path option.
+
+    HAS_SYS_PIPEH	indicates the dialect has a <sys/pipe.h>
+			header file.
+
+    HAS_SYS_SX_H	indicates the FreeBSD 7.0 and higher system has
+			a <sys/sx.h> header file.
+
+    HASTAGTOPATH        indicates the DEC OSF/1, Digital UNIX, or
+			Tru64 UNIX dialect has a libmsfs.so,
+			containing tag_to_path().
+
+    HASTMPNODE		enables/disables readtnode() in node.c.
+
+    HASTCPOPT           indicates the dialect has TCP option
+			information (i.e., from TF_* symbols)
+			available.
+
+    HASTCPTPIQ          is defined when the dialect can duplicate
+			the receive and send queue sizes reported
+			by netstat.
+
+    HASTCPTPIW          is defined when the dialect can duplicate
+			the receive and send window sizes reported
+			by netstat.
+
+    HASTCPUDPSTATE	is defined when the dialect has support for
+			TCP and UDP state, including the "-s p:s"
+			option and associated speed ehancements.
+
+    HASTFS		indicates that the Pyramid dialect has TFS
+			file system support.
+
+    HAS_UFS1_2		indicates the FreeBSD 6 and higher system has
+			UFS1 and UFS2 members in its inode structure.
+
+    HAS_UM_UFS		indicates the OpenBSD version has UM_UFS[12]
+			definitions.
+
+    HASUNMINSOCK	indicates the Linux version has a user name
+			element in the socket structure; a value of
+			0 says there is no unix_address member; 1,
+			there is.
+
+    HASUINT16TYPE	is defined when the dialect has a typedef
+			for u_int16 that may conflict with some other
+			header file's redefinition (e.g., <afs/std.h>).
+
+    HASUTMPX		indicates the dialect has a <utmpx.h> header
+			file.
+
+    HAS_UVM_INCL	indicates the NetBSD or OpenBSD dialect has
+			a <uvm> include directory.
+
+    HAS_UW_CFS      	indicates the UnixWare 7.1.1 or above dialect
+			has CFS file system support.
+
+    HAS_UW_NSC		indicates the UnixWare 7.1.1 or above dialect
+			has a NonStop Cluster (NSC) kernel.
+
+    HAS_V_LOCKF		indicates the FreeBSD version has a v_lockf
+			member in the vode structure, defined in
+			<sys/vnode.h>.
+
+    HAS_VM_MEMATTR_T	indicates the FreeBSD <sys/conf.h> uses the
+			vm_memattr_t typedef.
+
+    HASVMLOCKH		indicates the FreeBSD dialect has <vm/lock.h>.
+
+    HASVNODE		enables/disables readvnode() function in node.c.
+
+    HAS_V_PATH          indicates the dialect's vnode structure has a
+			v_path member.
+
+    HAS_VSOCK		indicates that the Solaris version has a VSOCK
+			member in the vtype enum
+
+    HASVXFS		enables Veritas VxFS file system support for
+			the dialect.  CAUTION, the dialect sources
+			must have the necessary support code.
+
+    HASVXFSDNLC         indicates the VxFS file system has its own
+			name cache.
+
+    HASVXFS_FS_H	indicates <sys/fs/vx_fs.h> exists.
+
+    HASVXFS_MACHDEP_H	indicates <sys/fs/vx_machdep.h> exists.
+
+    HASVXFS_OFF64_T	indicates <sys/fs/vx_solaris.h> exists and
+			has an off64_t typedef.
+
+    HASXVFSRNL		indicates the dialect has VxFS Reverse Name
+			Lookup (RNL) support.
+
+    HASVXFS_SOL_H	indicates <sys/fs/vx_sol.h> exists.
+
+    HASVXFS_SOLARIS_H	indicates <sys/fs/vx_solaris.h> exists.
+
+    HASVXFS_U64_T       if HASVXFS_SOLARIS_H is defined, this
+			variable indicates that <sys/fs/vx_solaris.h>
+			has a vx_u64_t typedef.
+
+    HASVXFSUTIL         indicates the Solaris dialect has VxFS 3.4
+			or higher and has the utility libraries,
+			libvxfsutil.a (32 bit) and libvxfsutil64.a
+			(64 bit).
+
+    HASVXFS_VX_INODE    indicates that <sys/fs/vx_inode.h> contains
+			a vx_inode structure.
+
+    HASWIDECHAR         indicates the dialect has the wide-character
+			support functions iswprint(), mblen() and mbtowc().
+
+    HASXNAMNODE         indicates the OSR dialect has <sys/fs/xnamnode.h>.
+
+    HASXOPT		defines help text for dialect-specific X option
+			and enables X option processing in usage.c and
+			main.c.
+
+    HASXOPT_ROOT        when defined, restricts the dialect-specific
+			X option to processes whose real user ID
+			is root.
+
+    HAS_ZFS		indicates the dialect has support for the ZFS file
+			system.
+
+    HASXOPT_VALUE	defines the default binary value for the X option
+			in store.c.
+
+    HASZONES		the Solaris dialect has zones.
+
+    HAVECLONEMAJ        defines the name of the status variable
+			that indicates a clone major device number
+			is available in CLONEMAJ.  (Also see CLONEMAJ
+			and HAS_STD_CLONE.)
+
+    HPUX_KERNBITS	defines the number of bits in the HP-UX 10.30
+			and above kernel "basic" word: 32 or 64.
+
+    KA_T		defines the type cast required to assign
+			space to kernel pointers.  When not defined
+			by a dialect header file, KA_T defaults to
+			unsigned long.
+
+    KA_T_FMT_X          defines the printf format for printing a
+			KA_T -- the default is "%#lx" for the
+			default unsigned long KA_T cast.
+
+    LSOF_ARCH		See 00XCONFIG.
+
+    LSOF_BLDCMT		See 00XCONFIG.
+
+    LSOF_CC		See 00XCONFIG.
+
+    LSOF_CCV		See 00XCONFIG.
+
+    LSOF_HOST		See 00XCONFIG.
+
+    LSOF_INCLUDE	See 00XCONFIG.
+
+    LSOF_LOGNAME	See 00XCONFIG.
+
+    LSOF_MKC		See the "The Mksrc Shell Script" section of
+			this file.
+
+    LSOF_SYSINFO	See 00XCONFIG.
+
+    LSOF_USER		See 00XCONFIG.
+
+    LSOF_VERS		See 00XCONFIG.
+
+    LSOF_VSTR		See 00XCONFIG.
+
+    MACH		defines a MACH system.
+
+    N_UNIXV		defines an alternate value for the N_UNIV symbol.
+
+    NCACHELDPFX		defines C code to be executed before calling
+			ncache_load().
+
+    NCACHELDSFX		defines C code to be executed after calling
+			ncache_load().
+
+    NEEDS_BOOLEAN_T	indicates the FreeBSD 9 and above system needs a
+			boolean_t definition for <sys/conf.h>.
+
+    NEVER_HASDCACHE	keeps the Customize script from offering to
+			change HASDCACHE by its presence anywhere
+			in a dialect's machine.h header file --
+			e.g., in a comment.  See the Customize
+			script or machine.h in dialects/linux/proc.
+
+    NEVER_WARNDEVACCESS	keeps the Customize script from offering to
+			change WARNDEVACCESS by its presence anywhere
+			in a dialect's machine.h header file --
+			including in a comment.  See the Customize
+			script or machine.h in dialects/linux/proc.
+
+    NLIST_TYPE		is the type of the nlist table, Nl[], if it is
+			not nlist.  HASNLIST must be set for this
+			definition to be effective.
+
+    NOWARNBLKDEV        specifies that no warning is to be issued
+			when no block devices are found.  This
+			definiton is used only when HASBLKDEV is
+			also defined.
+
+    OFFDECDIG           specifies how many decimal digits will be
+			printed for the file offset in a 0t form
+			before switching to a 0x form.  The count
+			includes the "0t".  A count of zero means
+			the size is unlimited.
+
+    PRIVFILETYPE        is the number of a private file type, found
+			in the f_type member of the file struct, to
+			be processed by the HASPRIVFILETYPE function.
+			See the AIX dialect sources for an example.
+
+    _PSTAT_STREAM_GET_XPORT
+			indicates the HP-UX PSTAT header files require
+			this symbol to be defined for proper handling of
+			stream export data.
+
+    TIMEVAL_LSOF        defines the name of the timeval structure.
+			The default is timeval.  /dev/kmem-based
+			Linux lsof redefines timeval with this
+			symbol to avoid conflicts between glibc
+			and kernel definitions.
+
+    TYPELOGSECSHIFT     defines the type of the cdfs_LogSecShift
+			member of the cdfs structure for UnixWare
+			7 and higher.
+
+    UID_ARG_T           defines the cast on a User ID when passed
+			as a function argument.
+
+    USE_LIB_COMPLETEVFS
+			selects the use of the completevfs() function
+			in lsof4/lib/cvfs.c.
+
+    USE_LIB_FIND_CH_INO
+			selects the use of the find_ch_ino() inode
+			function in lsof4/lib/fino.c.
+
+			Note: HASBLKDEV selects the has_bl_ino()
+			function.
+
+    USE_LIB_IS_FILE_NAMED
+			selects the use of the is_file_named() function
+			in lsof4/lib/isfn.c.
+
+    USE_LIB_LKUPDEV	selects the use of the lkupdev() function
+			in lsof4/lib/lkud.c.
+
+			Note: HASBLKDEV selects the lkupbdev() function.
+
+    USE_LIB_PRINTDEVNAME
+			selects the use of the printdevname() function
+			in lsof4/lib/pdvn.c.
+
+			Note: HASBLKDEV selects the printbdevname()
+			function.
+
+    USE_LIB_PRINT_TCPTPI
+			selects the use of the print_tcptpi() function
+			in lsof4/lib/ptti.c.
+
+    USE_LIB_PROCESS_FILE
+			selects the use of the process_file() function
+			in lsof4/lib/prfp.c.
+
+    USE_LIB_READDEV	selects the use of the readdev() and stkdir()
+			functions in lsof4/lib/rdev.c.
+
+    USE_LIB_READMNT	selects the use of the readmnt() function
+			in lsof4/lib/rmnt.c.
+
+    USE_LIB_RNAM	selects the use of the device cache functions
+			in lsof4/lib/rnam.c.
+
+			Note: HASNCACHE must also be defined.
+
+    USE_LIB_RNCH	selects the use of the device cache functions
+			in lsof4/lib/rnch.c.
+
+			Note: HASNCACHE must also be defined.
+
+    USE_STAT            is defined for those dialects that must
+			use the stat(2) function instead of lstat(2)
+			to scan /dev -- i.e., in the readdev()
+			function.
+
+    VNODE_VFLAG		is an alternate name for the vnode structure's
+			v_flag member.
+
+    WARNDEVACCESS	enables the issuing of a warning message when
+			lsof is unable to access /dev (or /device)
+			or one of its subdirectories, or stat(2)
+			a file in them. Some dialects (e.g., HP-UX)
+			have many inaccessible subdirectories and
+			it is appropriate to inhibit the warning
+			for them with WARNDEVACCESS.  The -w option
+			will also inhibit these warnings.
+
+    WARNINGSTATE        when defined, disables the default issuing
+			of warning messages.  WARNINGSTATE is
+			undefined by default for all dialects in
+			the lsof distribution.
+
+    WIDECHARINCL        defines the header file to be included (if any)
+			when wide-character support is enabled with
+			HASWIDECHAR.
+
+    zeromem()		defines a macro to zero memory -- e.g., using
+			bzero() or memset().
+
+Any dialect's machine.h file and Configure stanza can serve as a
+template for building your own.  All machine.h files usually have
+all definitions, disabling some (with comment prefix and suffix)
+and enabling others.
+
+
+Options: Common and Special
+---------------------------
+
+All but one lsof option is common; the specific option is ``-X''.
+If a dialect does not support a common option, the related #define
+in machine.h -- e.g., HASCOPT -- should be deselected.
+
+The specific option, ``-X'', may be used by any dialect for its
+own purpose.  Right now (May 30, 1995) the ``-X'' option is binary
+(i.e., it's not allowed arguments of its own, and its value must
+be 0 or 1) but that could be changed should the need arise.  The
+option is enabled with the HASXOPT definition in machine.h; its
+default value is defined by HASXOPT_VALUE.
+
+The value of HASXOPT should be the text displayed for ``-X'' by
+the usage() function in usage.c.  HASXOPT_VALUE should be the
+default value, 0 or 1.
+
+AIX for the IBM RICS System/6000 defines the ``-X'' option to
+control readx() usage, since there is a bug in AIX kernels that
+readx() can expose for other processes.
+
+
+Defining Dialect-Specific Symbols and Global Storage
+----------------------------------------------------
+
+A dialect's dlsof.h and dstore.c files contain dialect-specific
+symbol and global storage definitions.  There are symbol definitions,
+for example, for function and data casts, and for file paths.
+Dslof.h defines lookup names the nlist() table -- X_* symbols --
+when nlist() is being used.
+
+Global storage definitions include such things as structures for
+local Virtual File System (vfs) information; mount information;
+search file information; and kernel memory file descriptors --
+e.g., Kmem for /dev/kmem, Mem for /dev/mem, Swap for /dev/drum.
+
+
+Coding Dialect-specific Functions
+---------------------------------
+
+Each supported dialect must have some basic functions that the
+common functions of the top level may call.  Some of them may be
+obtained from the library in lsof4/lib, selected and customized by
+#define's in the dialect machine.h header file.  Others may have
+to be coded specifically for the dialect.
+
+Each supported dialect usually has private functions, too.  Those
+are wholly determined by the needs of the dialect's data organization
+and access.
+
+These are some of the basic functions that each dialect must supply
+-- they're all defined in proto.h:
+
+    initialize()		function to initialize the dialect
+
+    is_file_named()		function to check if a file was named
+				by an optional file name argument
+				(lsof4/lib/isfn.c)
+
+    gather_proc_info()		function to gather process table
+				and related information and cache it
+
+    printchdevname()		function to locate and optionally
+				print the name of a character device
+				(lsof4/lib/pdvn.c)
+
+    print_tcptpistate()         function to print the TCP or TPI
+				state for a TCP or UDP socket file,
+				if the one in lib/ptti.c isn't
+				suitable (define USE_LIB_PRINT_TCPTPI
+				to activate lib/ptti.c)
+
+    process_file()		function to process an open file
+				structure (lsof4/lib/prfp.c)
+
+    process_node()		function to process a primary node
+
+    process_socket()		function to process a socket
+
+    readdev() and stkdir()	functions to read and cache device
+				information (lsof4/lib/rdev.c)
+
+    readmnt()			function to read mount table information
+				(lsof4/lib/rmnt.c)
+
+Other common functions may be needed, and might be obtained from
+lsof4/lib, depending on the needs of the dialect's node and socket
+file processing functions.
+
+Check the functions in lsof4/lib and specific lsof4/dialects/*
+files for examples.
+
+As you build these functions you will probably have to add #include's
+to dlsof.h.
+
+
+Function Prototype Definitions and the _PROTOTYPE Macro
+-------------------------------------------------------
+
+Once you've defined your dialect-specific definitions, you should
+define their prototypes in dproto.h or locally in the file where
+they occur and are used.  Do this even if your compiler is not ANSI
+compliant -- the _PROTOTYPE macro knows how to cope with that and
+will avoid creating prototypes that will confuse your compiler.
+
+
+The Makefile
+------------
+
+Here are some general rules for constructing the dialect Makefile.
+
+    *  Use an existing dialect's Makefile as a template.
+
+    *  Make sure the echo actions of the install rule are appropriate.
+
+    *  Use the DEBUG string to set debugging options, like ``-g''.
+       You may also need to use the -O option when forking and
+       SIGCHLD signals defeat your debugger.
+
+    *  Don't put ``\"'' in a compiler flags -D<symbol>=<string>
+       clause in your Makefile.  Leave off the ``\"'' even though
+       you want <string> to be a string literal and instead adapt
+       the N_UNIX* macros you'll find in Makefiles for FreeBSD
+       and Linux.  That will allow the Makefile's version.h rule
+       to put CFLAGS into version.h without having to worry about
+       the ``\"'' sequences.
+
+    *  Finally, remember that strings can be passed from the top
+       level's Configure shell script.  That's an appropriate way
+       to handle options, especially if there are multiple versions
+       of the Unix dialect to which you are porting lsof 4.
+
+
+The Mksrc Shell Script
+----------------------
+
+Pattern your Mksrc shell script after an existing one from another
+dialect.  Change the D shell variable to the name of your dialect's
+subdirectory in lsof4/dialects.  Adjust any other shell variable
+to your local conditions.  (Probably that won't be necessary.)
+
+Note that, if using symbolic links from the top level to your
+dialect subdirectory is impossible or impractical, you can set the
+LSOF_MKC shell variable in Configure to something other than
+"ln -s" -- e.g., "cp," and Configure will pass it to the Mksrc
+shell script in the M environment variable.
+
+
+The MkKernOpts Shell Script
+---------------------------
+
+The MkKernOptrs shell script is used by some dialects -- e.g.,
+Pyramid DC/OSx and Reliant UNIX -- to determine the compile-time
+options used to build the current kernel that affect kernel structure
+definitions, so those same options can be used to build lsof.
+Configure calls MkKernOpts for the selected dialects.
+
+If your kernel is built with options that affect structure definitions.
+-- most commonly affected are the proc structure from <sys/proc.h>
+and the user structure from <sys/user.h> -- check the MkKernOpts
+in lsof4/dialects/irix for a comprehensive example.
+
+
+Testing and the Lsof Test Suite
+-------------------------------
+
+Once you have managed to create a port, here are some tips for
+testing it.
+
+*  First look at the test suite in the tests/ sub-directory of the
+   lsof distribution.  While it will need to be customized to be
+   usable with a new port, it should provide ideas on things to
+   test.  Look for more information about the test suite in the
+   00TEST file.
+
+*  Pick a simple process whose open files you are likely to
+   know and see if the lsof output agrees with what you know.
+   (Hint: select the process with `lsof -p <process_PID>`.)
+
+   Are the device numbers and device names correct?
+
+   Are the file system names and mount points correct?
+
+   Are inode numbers and sizes correct?
+
+   Are command names, file descriptor numbers, UIDs, PIDs, PGIDs,
+   and PPIDs correct?
+
+   A simple tool that does a stat(2) of the files being examined
+   and reports the stat struct contents can provide a reference for
+   some values; so can `ls -l /dev/<device>`.
+
+*  Let lsof list information about all open files and ask the
+   same questions.  Look also for error messages about not being
+   able to read a node or structure.
+
+*  Pick a file that you know is open -- open it and hold it
+   that way with a C program (not vi), if you must.  Ask lsof to
+   find the file's open instance by specifying its path to lsof.
+
+*  Create a C program that opens a large number of files and holds
+   them open.  Background the test process and ask lsof to list
+   its files.
+
+*  Generate some locks -- you may need to write a C program to
+   do this, hold the locked file open, and see if lsof can identify
+   the lock properly.  You may need to write several C programs
+   if your dialect supports different lock functions -- fnctl(),
+   flock(), lockf(), locking().
+
+*  Identify a process with known Internet file usage -- inetd
+   is a good one -- and ask lsof to list its open files.  See if
+   protocols and service names are listed properly.
+
+   See if your lsof identifies Internet socket files properly for
+   rlogind or telnetd processes.
+
+*  Create a UNIX domain socket file, if your dialect allows it,
+   hold it open by backgrounding the process, and see if lsof can
+   identify the open UNIX domain socket file properly.
+
+*  Create a FIFO file and see what lsof says about it.
+
+*  Watch an open pipe -- `lsof -u <your_login>  | less` is a
+   good way to do this.
+
+*  See if lsof can identify NFS files and their devices properly.
+   Open and hold open an NFS file and see if lsof can find the open
+   instance by path.
+
+*  If your test system has CD-ROM and floppy disk devices, open
+   files on them and see if lsof reports their information correctly.
+   Such devices often have special kernel structures associated
+   with them and need special attention from lsof for their
+   identification.  Pay particular attention to the inode numbers
+   lsof reports for CD-ROM and floppy disk files -- often they are
+   calculated dynamically, rather than stored in a kernel node
+   structure.
+
+*  If your implementation can probe the kernel name cache, look
+   at some processes with open files whose paths you know to see
+   if lsof identifies any name components.  If it doesn't, make
+   sure the name components are in the name cache by accessing
+   the files yourself with ls or a similar tool.
+
+*  If your dialect supports the /proc file system, use a C program
+   to open files there, background a test process, and ask lsof to
+   report its open files.
+
+*  If your dialect supports fattach(), create a small test program
+   to use it, background a test process, and ask lsof to report
+   its open files.
+
+I can supply some quick-and-dirty tools for reporting stat buffer
+contents, holding files open, creating UNIX domain files, creating
+FIFOs, etc., if you need them.
+
+
+Where Next?
+-----------
+
+Is this document complete?  Certainly not!  One might wish that it
+were accompanied by man pages for all lsof functions, by free beer
+or chocolates, by ...  (You get the idea.)
+
+But those things are not likely to happen as long as lsof is a
+privately supported, one man operation.
+
+So, if you need more information on how lsof is constructed or
+works in order to do a port of your own, you'll have to read the
+lsof source code.  You can also ask me questions via email, but
+keep in mind the private, one-man nature of current lsof support.
+
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src/00QUICKSTART b/lsof_4.85/lsof_4.85_src/00QUICKSTART
new file mode 100644
index 0000000..697734e
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00QUICKSTART
@@ -0,0 +1,1023 @@
+
+			A Quick Start for Lsof
+
+1.  Introduction
+================
+
+  Agreed, the lsof man page is dense and lsof has a plethora of
+  options.  There are examples, but the manual page format buries
+  them at the end.  How does one get started with lsof?
+
+  This file is an attempt to answer that question.  It plunges
+  immediately into examples of lsof use to solve problems that
+  involve looking at the open files of Unix processes.
+
+
+			    Contents
+
+	    1.  Introduction
+	    2.  Finding Uses of a Specific Open File
+	    3.  Finding Open Files Filling a File System
+		a.  Finding an Unlinked Open File
+	    4.  Finding Processes Blocking Umount
+	    5.  Finding Listening Sockets
+	    6.  Finding a Particular Network Connection
+	    7.  Identifying a Netstat Connection
+	    8.  Finding Files Open to a Named Command
+	    9.  Deciphering the Remote Login Trail
+		a.  The Fundamentals
+		b.  The idrlogin.perl[5] Scripts
+	    10. Watching an Ftp or Rcp Transfer
+	    11. Listing Open NFS Files
+	    12. Listing Files Open by a Specific Login
+		a.  Ignoring a Specific Login
+	    13. Listing Files Open to a Specific Process Group
+	    14. When Lsof Seems to Hang
+		a.  Kernel lstat(), readlink(), and stat() Blockages
+		b.  Problems with /dev or /devices
+		c.  Host and Service Name Lookup Hangs
+		d.  UID to Login Name Conversion Delays
+	    15. Output for Other Programs
+	    16. The Lsof Exit Code and Shell Scripts
+	    17. Strange messages in the NAME column
+
+			Options
+
+	    A.  Selection Options
+	    B.  Output Options
+	    C.  Precautionary Options
+	    D.  Miscellaneous Lsof Options
+
+
+2.  Finding Uses of a Specific Open File
+========================================
+
+  Often you're interested in knowing who is using a specific file.
+  You know the path to it and you want lsof to tell you the processes
+  that have open references to it.
+
+  Simple -- execute lsof and give it the path name of the file of
+  interest -- e.g.,
+
+  $ lsof /etc/passwd
+
+  Caveat: this only works if lsof has permission to get the status
+  (via stat(2)) of the file at the named path.  Unless the lsof
+  process has enough authority  -- e.g., it is being run with a
+  real User ID (UID) of root -- this AIX example won't work:
+
+  Further caveat: this use of lsof will fail if the stat(2) kernel
+  syscall returns different file parameters -- particularly device
+  and inode numbers -- than lsof finds in kernel node structures.
+  This condition is rare and is usually documented in the 00FAQ
+  file of the lsof distribution.
+
+  $ lsof /etc/security/passwd
+  lsof: status error on /etc/security/passwd: Permission denied
+
+
+3.  Finding Open Files Filling a File System
+============================================
+
+  Oh! Oh!  /tmp is filling and ls doesn't show that any large files
+  are being created.  Can lsof help?
+
+  Maybe.  If there's a process that is writing to a file that has
+  been unlinked, lsof may be able to discover the process for you.
+  You ask it to list all open files on the file system where /tmp
+  is located.
+
+  Sometimes /tmp is a file system by itself.  In that case,
+
+  $ lsof /tmp
+
+  is the appropriate command.  If, however, /tmp is part of another
+  file system, typically /, then you may have to ask lsof to list
+  all files open on the containing file system and locate the
+  offending file and its process by inspection -- e.g.,
+
+    $ lsof / | more
+  or
+    $ lsof / | grep ...
+
+  Caveat: there must be a file open to a for the lsof search to
+  succeed.  Sometimes the kernel may cause a file reference to
+  persist, even where there's no file open to a process.  (Can you
+  say kernel bug?  Maybe.)  In any event, lsof won't be able to
+  help in this case.
+
+  a.  Finding an Unlinked Open File
+  =================================
+
+  A pesky variant of a file that is filling a file system is an
+  unlinked file to which some process is still writing.  When a
+  process opens a file and then unlinks it, the file's resources
+  remain in use by the process, but the file's directory entries
+  are removed.  Hence, even when you know the directory where the
+  file once resided, you can't detect it with ls.
+
+  This can be an administrative problem when the unlinked file is
+  large, and the process that holds it open continues to write to
+  it.  Only when the process closes the file will its resources,
+  particularly disk space, be released.
+
+  Lsof can help you find unlinked files on local disks.  It has an
+  option, +L, that will list the link counts of open files.  That
+  helps because an unlinked file on a local disk has a zero link
+  count.  Note: this is NOT true for NFS files, accessed from a
+  remote server.
+
+  You could use the option to list all files and look for a zero
+  link count in the NLINK column -- e.g.,
+
+    $lsof +L
+    COMMAND   PID USER   FD  TYPE DEVICE SIZE/OFF NLINK  NODE NAME
+    ...
+    less    25366  abe  txt  VREG    6,0    40960     1 76319 /usr/...
+    ...
+  > less    25366  abe    3r VREG    6,0    17360     0 98768 / (/dev/sd0a)
+
+  Better yet, you can specify an upper bound to the +L option, and
+  lsof will select only files that have a link count less than the
+  upper bound.  For example:
+
+    $ lsof +L1
+    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NLINK  NODE NAME
+    less    25366  abe    3r  VREG    6,0    17360     0 98768 / (/dev/sd0a)
+
+  You can use lsof's -a (AND) option to narrow the link count search
+  to a particular file system.  For example, to look for zero link
+  counts on the /home file system, use:
+
+    $ lsof -a +L1 /home
+
+  CAUTION: lsof can't always report link counts for all file types
+  -- e.g., it may not report them for FIFOs, pipes, or sockets.
+  Remember also that link counts for NFS files on an NFS client
+  host don't behave as do link counts for files on local disks.
+
+
+4.  Finding Processes Blocking Umount
+=====================================
+
+  When you need to unmount a file system with the umount command,
+  you may find the operation blocked by a process that has a file
+  open on the file systems.  Lsof may be able to help you find the
+  process.  In response to:
+
+  $ lsof <file_system_name>
+
+  Lsof will display all open files on the named file system.  It
+  will also set its exit code zero when it finds some open files
+  and non-zero when it doesn't, making this type of lsof call
+  useful in shell scripts.  (See section 16.)
+
+  Consult the output of the df command for file system names.
+
+  See the caveat in the preceding section about file references
+  that persist in the kernel without open file traces.  That
+  situation may hamper lsof's ability to help with umount, too.
+
+
+5.  Finding Listening Sockets
+=============================
+
+  Sooner or later you may wonder if someone has installed a network
+  server that you don't know about.  Lsof can list for you all the
+  network socket files open on your machine with:
+
+    $ lsof -i
+
+  The -i option without further qualification lists all open Internet
+  socket files.  You can add network names or addresses, protocol
+  names, and service names or port numbers to the -i option to
+  refine the search.  (See the next section.)
+
+
+6.  Finding a Particular Network Connection
+===========================================
+
+  When you know the source or destination of a network connection
+  whose open files and process you'd like to identify, the -i option
+  may help.
+
+  If, for example, you want to know what process has a connection
+  open to or from the Internet host named aaa.bbb.ccc, you can ask
+  lsof to search for it with:
+
+  $ lsof -i@aaa.bbb.ccc
+
+  If you're interested in a particular protocol -- TCP or UDP --
+  and a specific port number or service name, you can add those
+  discriminators to the -i information:
+
+  $ lsof -iTCP@aaa.bbb.ccc:ftp-data
+
+  If you're interested in a particular IP version -- IPv4 or IPv6
+  -- and your UNIX dialect supports both (It does if "IPv[46]"
+  appears in the lsof -h output.), you can add the '4' or '6'
+  selector immediately after -i:
+
+  $ lsof -i4
+  $ lsof -i6
+
+
+7.  Identifying a Netstat Connection
+====================================
+
+  How do I identify the process that has a network connection
+  described in netstat output?  For example, if netstat says:
+
+  Proto Recv-Q Send-Q  Local Address          Foreign Address        (state)
+  tcp        0      0  vic.1023               ipscgate.login         ESTABLISHED
+
+  What process is connected to service name ``login'' on ipscgate?
+
+  Use lsof's -i option:
+
+  $lsof -iTCP@ipscgate:login
+  COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF  INODE NAME
+  rlogin    25023      abe    3u  inet 0x10144168      0t184    TCP lsof.itap.purdue.edu:1023->ipscgate.cc.purdue.edu:login
+  ...
+
+  There's another way.  Notice the 0x10144168 in the DEVICE column
+  of the lsof output?  That's the protocol control block (PCB)
+  address.  Many netstat applications will display it when given
+  the -A option:
+
+  $ netstat -A
+  PCB      Proto Recv-Q Send-Q  Local Address      Foreign Address    (state)
+  10144168 tcp        0      0  vic.1023           ipscgate.login     ESTABLISHED
+  ...
+
+  Using the PCB address, lsof, and grep, you can find the process this
+  way, too:
+
+  $ lsof -i | grep 10144168
+  rlogin    25023      abe    3u  inet 0x10144168      0t184    TCP lsof.itap.purdue.edu:1023->ipscgate.cc.purdue.edu:login
+  ...
+
+  If the file is a UNIX socket and netstat reveals and adress for it,
+  like this Solaris 11 example:
+
+  $ netstat -a -f unix
+  Active UNIX domain sockets
+  Address  Type          Vnode     Conn  Local Addr      Remote Addr
+  ffffff0084253b68 stream-ord 0000000 0000000
+
+  Using lsof's -U opetion and its output piped to a grep on the address
+  yields:
+
+  $ lsof -U | grep ffffff0084253b68
+  squid 1638 nobody 12u unix 18,98 0t10 9437188 /devices/pseudo/tl@0:ticots->0xffffff0084253b68 stream-ord
+  $ lsof -U |
+
+
+8.  Finding Files Open to a Named Command
+=========================================
+
+  When you want to look at the files open to a particular command,
+  you can look up the PID of the process running the command and
+  use lsof's -p option to specify it.
+
+  $ lsof -p <PID>
+
+  However, there's a quicker way, using lsof's -c option, provided
+  you don't mind seeing output for every process running the named
+  command.
+
+  $ lsof -c <first_characters_of_command_name_that_interest_you>
+
+  The lsof -c option is useful when you want to see how many instances
+  of a given command are executing and what their open files are.
+  One useful example is for the sendmail command.
+
+  $ lsof -c sendmail
+
+
+9.  Deciphering the Remote Login Trail
+======================================
+
+  If the network connection you're interested in tracing has been
+  initiated externally and is connected to an rlogind, sshd, or
+  telnetd process, asking lsof to identify that process might not
+  give a wholly satisfying answer.  The report may be that the
+  connection exists, but to a process owned by root.
+
+  a.  The Fundamentals
+  ====================
+
+    How do you get from there to the login name really using the
+    connection?  You have to know a little about how real and pseudo
+    ttys are paired in your system, and then use several lsof probes
+    to identify the login.
+
+    This example comes from a Solaris 2.4 system, named klaatu.cc.
+    I've logged on to it via rlogin from lsof.itap.  The first lsof
+    probe,
+
+    $ lsof -i@lsof.itap
+
+    yields (among other things):
+
+    COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF  INODE NAME
+    in.rlogin  7362     root    0u  inet 0xfc0193b0      0t242    TCP klaatu.cc.purdue.edu:login->lsof.itap.purdue.edu:1023
+    ...
+
+    This confirms that a connection exists.  A second lsof probe
+    shows:
+
+    $ lsof -p7362
+    COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF  INODE NAME
+    ...
+    in.rlogin  7362     root    0u  inet 0xfc0193b0      0t242    TCP klaatu.cc.purdue.edu:login->lsof.itap.purdue.edu:1023
+    ...
+    in.rlogin  7362     root    3u  VCHR    23,   0       0t66  52928 /devices/pseudo/clone@0:ptmx->pckt->ptm
+
+    7362 is the Process ID (PID) of the in.rlogin process, discovered
+    in the first lsof probe.  (I've abbreviated the output to simplify
+    the example.)  Now comes a need to understand Solaris pseudo-ttys.
+    The key indicator is in the DEVICE column for FD 3, the major/minor
+    device number of 23,0.  This translates to /dev/pts/0, so a third
+    lsof probe,
+
+    $ lsof /dev/pts/0
+    COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF  INODE NAME
+    ksh        7364      abe    0u  VCHR    24,   0     0t2410  53410 /dev/pts/../../devices/pseudo/pts@0:0
+
+    shows in part that login abe has a ksh process on /dev/pts/0.
+    (The NAME that lsof shows is not /dev/pts/0 but the full expansion
+    of the symbolic link that lsof finds at /dev/pts/0.)
+
+    Here's a second example, done on an HP-UX 9.01 host named ghg.ecn.
+    Again, I've logged on to it from lsof.itap, so I start with:
+
+    $ lsof -i@lsof.itap
+    COMMAND     PID     USER   FD   TYPE       DEVICE   SIZE/OFF  INODE NAME
+    rlogind   10214     root    0u  inet   0x041d5f00     0t1536    TCP ghg.ecn.purdue.edu:login->lsof.itap.purdue.edu:1023
+    ...
+
+    Then,
+
+    $ lsof -p10214
+    COMMAND     PID     USER   FD   TYPE       DEVICE   SIZE/OFF  INODE NAME
+    ...
+    rlogind   10214     root    0u  inet   0x041d5f00     0t2005    TCP ghg.ecn.purdue.edu:login->lsof.itap.purdue.edu:1023
+    ...
+    rlogind   10214     root    3u  VCHR  16,0x000030     0t2037  24642 /dev/ptym/ptys0
+
+    Here the key is the NAME /dev/ptym/ptys0.  In HP-UX 9.01 tty and
+    pseudo tty devices are paired with the names like /dev/ptym/ptys0
+    and /dev/pty/ttys0, so the following lsof probe is the final step.
+
+    $ lsof /dev/pty/ttys0
+    COMMAND     PID     USER   FD   TYPE       DEVICE   SIZE/OFF  INODE NAME
+    ksh       10215      abe    0u  VCHR  17,0x000030     0t3399  22607 /dev/pty/ttys0
+    ...
+
+    Here's a third example for an AIX 4.1.4 system.  I've used telnet
+    to connect to it from lsof.itap.purdue.edu.  I start with:
+
+    $ lsof -i@lsof.itap.purdue.edu
+    COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF      INODE NAME
+    ...
+    telnetd   15616     root    0u  inet 0x05a93400     0t5156        TCP cloud.cc.purdue.edu:telnet->lsof.itap.purdue.edu:3369
+
+    Then I look at the telnetd process:
+
+    $ lsof -p15616
+    COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF      INODE NAME
+    ...
+    telnetd   15616     root    0u  inet 0x05a93400     0t5641        TCP cloud.cc.purdue.edu:telnet->lsof.itap.purdue.edu:3369
+    ...
+    telnetd   15616     root    3u  VCHR    25,   0     0t5493        103 /dev/ptc/0
+
+    Here the key is /dev/ptc/0.  In AIX it's paired with /dev/pts/0.
+    The last probe for that shows:
+
+    $ lsof /dev/pts/0
+    COMMAND     PID     USER   FD   TYPE     DEVICE   SIZE/OFF      INODE NAME
+    ...
+    ksh       16642      abe    0u  VCHR    26,   0     0t6461        360 /dev/pts/0
+
+  b.  The idrlogin.perl[5] Scripts
+  ================================
+
+    There's another, perhaps easier way, to go about the job of
+    tracing a network connection.  The lsof distribution contains
+    two Perl scripts, idrlogin.perl (Perl 4) and idrlogin.perl5
+    (Perl 5), that use lsof field output to display values for
+    shells that are parented by rlogind, sshd, or telnetd, or
+    connected directly to TCP sockets.  The lsof test suite contains
+    a C library that can be adapted for use with C programs that
+    need to call lsof and process its field output.
+
+    The two Perl scripts use the lsof -R option; it causes the
+    paRent process ID (PPID) to be listed in the lsof output.  The
+    scripts identify all shell processes -- e.g., ones whose command
+    names end in ``sh'' -- and determine if: 1) the ultimate ancestor
+    process before a PID greater than 2 (e.g., init's PID is 1) is
+    rlogind, sshd, or telnetd; or 2) the shell process has open
+    TCP socket files.
+
+    Here's an example of output from idlogin.perl on a Solaris 2.4
+    system:
+
+    centurion: 1 = cd src/lsof4/scripts
+    centurion: 2 = ./idrlogin.perl
+    Login    Shell       PID Via           PID TTY        From
+    oboyle   ksh       12640 in.telnetd  12638 pts/5      opal.cc.purdue.edu
+    icdtest  ksh       15158 in.rlogind  15155 pts/6      localhost
+    sh       csh       18207 in.rlogind  18205 pts/1      babylon5.cc.purdue.edu
+    root     csh       18242 in.rlogind  18205 pts/1      babylon5.cc.purdue.edu
+    trouble  ksh       19208 in.rlogind  18205 pts/1      babylon5.cc.purdue.edu
+    abe      ksh       21334 in.rlogind  21332 pts/2      lsof.itap.purdue.edu
+
+    The scripts assume that its parent directory contains an
+    executable lsof.  If you decide to use one of the scripts, you
+    may want to customize it for your local lsof and perl paths.
+
+    Note that processes executing as remote shells are also
+    identified.
+
+    Here's another example from a UnixWare 7.1.0 system.
+
+    tweeker: 1 = cd src/lsof4/scripts
+    tweeker: 9 = ./idrlogin.perl
+    Login    Shell       PID Via           PID TTY        From
+    abe      ksh        9438 in.telnetd   9436 pts/3      lsof.itap.purdue.edu
+
+
+10. Watching an Ftp or Rcp Transfer
+===================================
+
+  The nature of the Internet being one of unpredictable performance
+  at times, occasionally you want to know if a file transfer, being
+  done by ftp or rcp, is making any progress.
+
+  To use lsof for watching a file transfer, you need to know the
+  PID of the file transfer process.  You can use ps to find that.
+  Then use lsof,
+
+  $ lsof -p<PID>
+
+  to examine the files open to the transfer process.  Usually the
+  ftp files or interest are at file descriptors 9 and 10 or 10 and
+  11; for rcp, 3 and 4.  They describe the network socket file and
+  the local data file.
+
+  If you want to watch only those file descriptors as the file
+  transfer progresses, try these lsof forms (for ftp in the example):
+
+    $ lsof -p<PID> -ad9,10 -r
+  or
+    $ lsof -p<PID> -ad10,11 -r
+
+  Some options need explaining:
+
+    -p<PID>	specifies that lsof is to restrict its attention
+		to the process whose ID is <PID>.  You can specify
+		a set of PIDs by separating them with commas.
+
+		    $ lsof -p 1234,5678,9012
+
+    -a		specifies that lsof is to AND its tests together.
+		The two tests that are specified are tests on the
+		PID and tests on file descriptions (``d9,10'').
+
+    d9,10	specifies that lsof is to test only file descriptors
+		9 and 10.  Note that the `-' is absent, since ``-a''
+		is a unary option and can be followed immediately
+		by another lsof option.
+
+    -r          tells lsof to list the requested open file information,
+		sleep for a default 15 seconds, then list the open
+		file information again.  You can specify a different
+		time (in seconds) after -r and override the default.
+		Lsof issues a short line of equal signs between
+		each set of output to distinguish it.
+
+  For an rcp transfer, the above example becomes:
+
+  $ lsof -p<PID> -ad3,4 -r
+
+
+11. Listing Open NFS Files
+==========================
+
+  Lsof will list all files open on remote file systems, supported
+  by an NFS server.  Just use:
+
+  $ lsof -N
+
+  Note, however, that when run on an NFS server, lsof will not list
+  files open to the server from one of its clients.  That's because
+  lsof can only examine the processes running on the machine where
+  it is called -- i.e., on the NFS server.
+
+  If you run lsof on the NFS client, using the -N option, it will
+  list files open by processes on the client that are on remote
+  NFS file systems.
+
+
+12. Listing Files Open by a Specific Login
+==========================================
+
+  If you're interested in knowing what files the processes owned
+  by a particular login name have open, lsof can help.
+
+    $ lsof -u<login>
+  or
+    $ lsof -u<User ID number>
+
+  You can specify either the login name or the UID associated with
+  it.  You can specify multiple login names and UID numbers, mixed
+  together, by separating them with commas.
+
+  $ lsof -u548,abe
+
+  On the subject of login names and UIDs, it's worth noting that
+  lsof can be told to report either.  By default it reports login
+  names; the -l option switches reporting to UIDs.  You might want
+  to use -l if login name lookup is slow for some reason.
+
+  a.  Ignoring a Specific Login
+  =============================
+
+    The -u option can also be used to direct lsof to ignore a
+    specific login name or UID, or a list of them.  Simply prefix
+    the login names or UIDs with a `^' character, as you might do
+    in a regular expression.  The `^' prefix is useful, for example,
+    when you want to have lsof ignore the files open to system
+    processes, owned by the root (UID 0) login.  Try:
+
+      $ lsof -u ^root
+    or
+      $ lsof -u ^0
+
+
+13. Listing Files Open to a Specific Process Group
+==================================================
+
+  There's a Unix collection of processes called a process group.
+  The name indicates that the processes of the group have a common
+  association and are grouped so that a signal sent to one (e.g.,
+  a keyboard kill stroke) is delivered to all.
+
+  This causes Unix to create a two element process group:
+
+  $ lsof | less
+
+  You can use lsof to look at the open files of all members of a
+  process group, if you know the process group ID number.  Assuming
+  that it is 12717 for the above example, this lsof command:
+
+  $ lsof -g12717 -adcwd
+
+  would produce on a Solaris 8 system:
+
+  $ lsof -g12717 -adcwd
+  COMMAND   PID  PGID USER  FD TYPE DEVICE SIZE/OFF    NODE NAME
+  sshd    11369 12717 root cwd VDIR    0,2      189 1449175 /tmp (swap)
+  sshd    12717 12717 root cwd VDIR  136,0     1024       2 /
+
+  The ``-g12717'' option specifies the process group ID of interest;
+  the ``-adcwd'' option specifies that options are to be ANDed and
+  that lsof should limit file output to information about current
+  working directory (``cwd'') files.
+
+
+14. When Lsof Seems to Hang
+===========================
+
+  On occasion when you run lsof it seems to hang and produce no
+  output.  This may result from system conditions beyond the control
+  of lsof.  Lsof has a number of options that may allow you to
+  bypass the blockage.
+
+  a.  Kernel lstat(), readlink(), and stat() Blockages
+  ====================================================
+
+    Lsof uses the kernel (system) calls lstat(), readlink(), and
+    stat() to locate mounted file system information.  When a file
+    system has been mounted from an NFS server and that server is
+    temporarily unavailable, the calls lsof uses may block in the
+    kernel.
+
+    Lsof will announce that it is being blocked with warning messages
+    (unless they have been suppressed by the lsof builder), but
+    only after a default waiting period of fifteen seconds has
+    expired for each file system whose server is unavailable.  If
+    you have a number of such file systems, the total wait may be
+    unacceptably long.
+
+    You can do two things to shorten your suffering: 1) reduce the
+    wait time with the -S option; or 2) tell lsof to avoid the
+    kernel calls that might block by specifying the -b option.
+
+      $ lsof -S 5
+    or
+      $ lsof -b
+
+    Avoiding the kernel calls that might block may result in the
+    lack of some information that lsof needs to know about mounted
+    file systems.  Thus, when you use -b, lsof warns that it might
+    lack important information.
+
+    The warnings that result from using -b (unless suppressed by
+    the lsof builder) can themselves be annoying.  You can suppress
+    them by adding the -w option.  (Of course, if you do, you won't
+    know what warning messages lsof might have issued.)
+
+    $ lsof -bw
+
+    Note: if the lsof builder suppressed warning message issuance,
+    you don't need to use -w to suppress them.  You can tell what
+    the default state of message warning issuance is by looking at
+    the -h (help) output.  If it says ``-w enable warnings'' then
+    warnings are disabled by default; ``-w disable warnings'', they
+    are enabled by default.
+
+  b.  Problems with /dev or /devices
+  ==================================
+
+    Lsof scans the /dev or /devices branch of your file system to
+    obtain information about your system's devices.  (The scan isn't
+    necessary when a device cache file exists.)
+
+    Sometimes that scan can take a very long time, especially if
+    you have a large number of devices, and if your kernel is
+    relatively slow to process the stat() system call on device
+    nodes.  You can't do anything about the stat() system call
+    speed.
+
+    However, you can make sure that lsof is allowed to use its
+    device cache file feature.  When lsof can use a device cache
+    file, it retains information it gleans via the stat() calls
+    on /dev or /devices in a separate file for later, faster
+    access.
+
+    The device cache file feature is described in the lsof man
+    page.  See the DEVICE CACHE FILE, LSOF PERMISSIONS THAT AFFECT
+    DEVICE CACHE FILE ACCESS, DEVICE CACHE FILE PATH FROM THE -D
+    OPTION, DEVICE CACHE PATH FROM AN ENVIRONMENT VARIABLE,
+    SYSTEM-WIDE DEVICE CACHE PATH, PERSONAL DEVICE CACHE PATH
+    (DEFAULT), and MODIFIED PERSONAL DEVICE CACHE PATH sections.
+
+    There is also a separate file in the lsof distribution, named
+    00DCACHE, that describes the device cache file in detail,
+    including information about possible security problems.
+
+    One final observation: don't overlook the possibility that your
+    /dev or /devices tree might be damaged.  See if
+
+      $ ls -R /dev
+    or
+      $ ls -R /devices
+
+    completes or hangs.  If it hangs, then lsof will probably hang,
+    too, and you should try to discover why ls hangs.
+
+    c.  Host and Service Name Lookup Hangs
+    ======================================
+
+    Lsof can hang up when it tries to convert an Internet dot-form
+    address to a host name, or a port number to a service name.  Both
+    hangs are caused by the lookup functions of your system.
+
+    An independent check for both types of hangs can be made with
+    the netstat program.  Run it without arguments.  If it hangs,
+    then it is probably having lookup difficulties.  When you run
+    it with -n it shouldn't hang and should report network and port
+    numbers instead of names.
+
+    Lsof has two options that serve the same purpose as netstat's
+    -n option.  The lsof -n option tells it to avoid host name
+    lookups; and -P, service name lookups.  Try those options when
+    you suspect lsof may be hanging because of lookup problems.
+
+      $ lsof -n
+    or
+      $ lsof -P
+    or
+      $ lsof -nP
+
+    d.  UID to Login Name Conversion Delays
+    =======================================
+
+    By default lsof converts User IDentification (UID) numbers to
+    login names when it produces output.  That conversion process
+    may sometimes hang because of system problems or interlocks.
+
+    You can tell lsof to skip the lookup with the -l option; it
+    will then report UIDs in the USER column.
+
+    $ lsof -l
+
+
+15. Output for Other Programs
+=============================
+
+  The -F option allows you to specify that lsof should describe
+  open files with a special form of output, called field output,
+  that can be parsed easily by a subsequent program.  The lsof
+  distribution comes with sample AWK, Perl 4, and Perl 5 scripts
+  that post-process field output.  The lsof test suite has a C
+  library that could be adapted for use by C programs that want to
+  process lsof field output from an in-bound pipe.
+
+  The lsof manual page describes field output in detail in its
+  OUTPUT FOR OTHER PROGRAMS section.  A quick look at a sample
+  script in the scripts/ subdirectory of the lsof distribution will
+  also give you an idea how field output works.
+
+  The most important thing about field output is that it is relatively
+  homogeneous across Unix dialects.  Thus, if you write a script
+  to post-process field output for AIX, it probably will work for
+  HP-UX, Solaris, and Ultrix as well.
+
+
+16. The Lsof Exit Code and Shell Scripts
+========================================
+
+  When lsof exits successfully it returns an exit code based on
+  the result of its search for specified files.  (If no files were
+  specified, then the successful exit code is 0 (zero).)
+
+  If lsof was asked to search for specific files, including any
+  files on specified file systems, it returns an exit code of 0
+  (zero) if it found all the specified files and at least one file
+  on each specified file system.  Otherwise it returns a 1 (one).
+
+  If lsof detects an error and makes an unsuccessful exit, it
+  returns an exit code of 1 (one).
+
+  You can use the exit code in a shell script to search for files
+  on a file system and take action based on the result -- e.g.,
+
+    #!/bin/sh
+    lsof <file_system_name> > /dev/null 2>&1
+    if test $? -eq 0
+    then
+      echo "<file_system_name> has some users."
+    else
+      echo "<file_system_name> may have no users."
+    fi
+
+
+17. Strange messages in the NAME column
+=======================================
+
+  When lsof encounters problems analyzing a particular file, it may
+  put a message in the file's NAME column.  Many of those messages
+  are explained in the 00FAQ file of the lsof distribution.
+
+  So consult 00FAQ first if you encounter a NAME column message you
+  don't understand.  (00FAQ is a possible source of information
+  about other unfamiliar things in lsof output, too.)
+  
+  If you can't find help in 00FAQ, you can use grep to look in the
+  lsof source files for the message -- e.g.,
+
+    $ cd .../lsof_4.76_src
+    $ grep "can't identify protocol" *.[ch]
+
+  The code associated with the message will usually make clear the
+  reason for the message.
+
+  If you have an lsof source tree that has been processed by the
+  lsof Configure script, you need grep only there.  If, however,
+  your source tree hasn't been processed by Configure, you may
+  have to look in the top-level lsof source directory and in the
+  dialects sub-directory for the UNIX dialect you are using - e.g.,
+
+    $ cd .../lsof_4.76_src
+    $ grep "can't identify protocol" *.[ch]
+    $ cd dialects/Linux
+    $ grep "can't identify protocol" *.[ch]
+
+  In rare cases you may have to look in the lsof library, too --
+  e.g.,
+
+    $ cd .../lsof_4.76_src
+    $ grep "can't identify protocol" *.[ch]
+    $ cd dialects/Linux
+    $ grep "can't identify protocol" *.[ch]
+    $ cd ../../lib
+    $ grep "can't identify protocol" *.[ch]
+
+
+Options
+=======
+
+  The following appendices describe the lsof options in detail.
+
+
+A.  Selection Options
+====================
+
+  Lsof has a rich set of options for selecting the files to be
+  displayed.  These include:
+
+	-a	tells lsof to AND the set of selection options that
+		are specified.  Normally lsof ORs them.
+		
+		For example, if you specify the -p<PID> and -u<UID>
+		options, lsof will display all files for the
+		specified PID or for the specified UID.
+
+		By adding -a, you specify that the listed files
+		should be limited to PIDs owned by the specified
+		UIDs -- i.e., they match the PIDs *and* the UIDs.
+
+		    $ lsof -p1234 -au 5678
+
+	-c	specifies that lsof should list files belonging
+		to processes having the associated command name.
+
+		Hint: if you want to select files based on more than
+		one command name, use multiple -c<name> specifications.
+
+		    $ lsof -clsof -cksh
+
+	-d      tells lsof to select by the associated file descriptor
+		(FD) set.  An FD set is a comma-separated list of
+		numbers and the names lsof normally displays in
+		its FD column:  cwd, Lnn, ltx, <number>, etc.  See
+		the OUTPUT section of the lsof man page for the
+		complete list of possible file descriptors.  Example:
+
+		    $ lsof -dcwd,0,1,2
+
+	-g      tells lsof to select by the associated process
+		group ID (PGID) set.  The PGID set is a comma-separated
+		list of PGID numbers.  When -g is specified, it also
+		enables the display of PGID numbers.
+
+		Note: when -g isn't followed by a PGID set, it
+		simply selects the listing of PGID for all processes.
+		Examples:
+
+		    $ lsof -g
+		    $ lsof -g1234,5678
+
+	-i	tells lsof to display Internet socket files.  If no
+		protocol/address/port specification follows -i,
+		lsof lists all Internet socket files.
+
+		If a specification follows -i, lsof lists only the
+		socket files whose Internet addresses match the
+		specification.
+
+		Hint: multiple addresses may be specified with
+		multiple -i options.  Examples:
+
+		    $ lsof -iTCP
+		    $ lsof -i@lsof.itap.purdue.edu:sendmail
+
+	-N	selects the listing of files mounted on NFS devices.
+
+	-U	selects the listing of socket files in the Unix
+		domain.
+
+
+B.  Output Options
+==================
+
+  Lsof has these options to control its output format:
+
+	-F	produce output that can be parsed by a subsequent
+		program.
+
+	-g	print process group (PGID) IDs.
+
+	-l	list UID numbers instead of login names.
+
+	-n	list network numbers instead of host names.
+
+	-o	always list file offset.
+
+	-P	list port numbers instead of port service names.
+
+	-s	always list file size.
+
+
+C.  Precautionary Options
+=========================
+
+  Lsof uses system functions that can block or take a long time,
+  depending on the health of the Unix dialect supporting it.  These
+  include:
+
+	-b	directs lsof to avoid system functions -- e.g.,
+		lstat(2), readlink(2), stat(2) -- that might block
+		in the kernel.  See the BLOCKS AND TIMEOUTS
+		section of the lsof man page.
+
+		You might want to use this option when you have
+		a mount from an NFS server that is not responding.
+
+	-C	tells lsof to ignore the kernel's name cache.  As
+		a precaution this option will have little effect on
+		lsof performance, but might be useful if the kernel's
+		name cache is scrambled.  (I've never seen that
+		happen.)
+
+	-D	might be used to direct lsof to ignore an existing
+		device cache file and generate a new one from /dev
+		(and /devices).  This might be useful if you have
+		doubts about the integrity of an existing device
+		cache file.
+
+	-l      tells lsof to list UID numbers instead of login
+		names -- this is useful when UID to login name
+		conversion is slow or inoperative.
+
+	-n	tells lsof to avoid converting Internet addresses
+		to host numbers.  This might be useful when your
+		host name lookup (e.g., DNS) is inoperative.
+
+	-O      tells lsof to avoid its strategy of forking to
+		perform potentially blocking kernel operations.
+		While the forking allows lsof to detect that a
+		block has occurred (and possibly break it), the
+		fork operation is a costly one.  Use the -O option
+		with care, lest your lsof be blocked.
+
+	-P      directs lsof to list port numbers instead of trying
+		to convert them to port service names.  This might
+		be useful if port to service name lookups (e.g.,
+		via NIS) are slow or failing.
+
+	-S      can be used to change the lstat/readlink/stat
+		timeout interval that governs how long lsof waits
+		for response from the kernel.  This might be useful
+		when an NFS server is slow or unresponsive.  When
+		lsof times out of a kernel function, it may have
+		less information to display.  Example:
+
+		    $ lsof -S2
+
+	-w	tells lsof to avoid issuing warning messages, if
+		they are enabled by default, or enable them if they
+		are disabled by default.  Check the -h (help) output
+		to determine their status.  If it says ``-w enable
+		warnings'', then warning messages are disabled by
+		default; ``-w disable warnings'', they are enabled
+		by default.
+
+		This may be a useful option, for example, when you
+		specify -b, if warning messages are enabled, because
+		it will suppress the warning messages lsof issues
+		about avoiding functions that might block in the
+		kernel.
+
+
+D.  Miscellaneous Lsof Options
+==============================
+
+  There are some lsof options that are hard to classify, including:
+
+	-?	these options select help output.
+	-h
+
+	-F      selects field output.  Field output is a mode where
+		lsof produces output that can be parsed easily by
+		subsequent programs -- e.g., AWK or Perl scripts.
+		See ``15. Output for Other Programs'' for more
+		information.
+
+	-k	specifies an alternate kernel symbol file -- i.e.,
+		where nlist() will get its information.  Example:
+
+		    $ lsof -k/usr/crash/vmunix.1
+
+	-m	specifies an alternate kernel memory file from
+		which lsof will read kernel structures in place
+		of /dev/kmem or kvm_read().  Example:
+
+		    $ lsof -m/usr/crash/vmcore.n
+
+	-r	tells lsof to repeat its scan every 15 seconds (the
+		default when no associated value is specified).  A
+		repeat time, different from the default, can follow
+		-r.  Example:
+
+		    $ lsof -r30
+
+	-v	displays information about the building of the
+		lsof executable.
+
+	--      The double minus sign option may be used to
+		signal the end of options.  It's particularly useful
+		when arguments to the last option are optional and
+		you want to supply a file path that could be confused
+		for arguments to the last option.  Example:
+
+		    $ lsof -g -- 1
+		
+		Where `1' is a file path, not PGID ID 1.
+
+
+Vic Abell <abe@purdue.edu>
+January 18, 2010
diff --git a/lsof_4.85/lsof_4.85_src/00README b/lsof_4.85/lsof_4.85_src/00README
new file mode 100644
index 0000000..bf041b8
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00README
@@ -0,0 +1,1535 @@
+
+			Making and Installing lsof 4
+
+********************************************************************
+| The latest release of lsof is always available via anonymous ftp |
+| from lsof.itap.purdue.edu.  Look in pub/tools/unix/lsof.         |
+********************************************************************
+
+				Contents
+
+	Pre-built Lsof Binaries
+	Making Lsof
+	    Other Configure Script Options
+	    Environment Variables
+	    Security
+	    Run-time Warnings
+	    Device Access Warnings
+	    NFS Blocks
+	    Caches -- Name and Device
+	    Raw Sockets
+	    Other Compile-time Definitions
+	    The AFSConfig Script
+	    The Inventory Script
+	    The Customize Script
+	    Cautions
+	    Warranty
+	    License
+	    Bug Reports
+	    The 00FAQ File
+	    The lsof-l Mailing List
+	    Field Output Example Scripts
+	    Field Output C Library
+	Testing Lsof
+	Dialect Notes
+	    AFS
+	    AIX
+	    Apple Darwin
+	    Auspex LFS (no longer maintained)
+	    BSDI BSD/OS
+	    DEC OSF/1, Digital UNIX, Tru64 UNIX
+	    FreeBSD
+	    HP-UX
+	    IPv6
+	    Linux
+	    NetBSD
+	    NEXTSTEP and OPENSTEP
+	    OpenBSD
+	    Pyramid DC/OSx and Reliant UNIX (no longer available)
+	    Caldera OpenUNIX
+	    SCO OpenServer
+	    SCO|Caldera UnixWare
+	    Solaris 2.x, 7, 8, 9 and 10
+	    Ultrix (no longer available)
+	    Veritas VxFS and VxVM
+	User-contributed Dialect Support
+	Dialects No Longer Supported
+	Installing Lsof
+	    Setuid-root Lsof Dialects
+	    Setgid Lsof Dialects
+	Porting lsof 4 to a New UNIX Dialect
+	Quick Start to Using lsof
+	Cross-configuring Lsof
+	Environment Variables Affecting the Configure Script
+
+
+=======================
+Pre-built Lsof Binaries
+=======================
+
+Avoid using pre-built lsof binaries if you can; build your own
+instead.
+
+I do not support lsof binaries built and packaged by third parties nor
+lsof binaries built from anything but the latest lsof revision.  (See
+the Bug Reports section for more information on the details of lsof
+support.)
+
+One important reasone for those support restrictions is that when lsof
+is built its Configure script tunes lsof to the features available on
+the building system, often embodied in supporting header files and
+libraries.  If the building system doesn't have support for a
+particular feature, lsof won't be built to support the feature on any
+system.
+
+The Veritas VxFS file system is a good example of a feature that
+requires build-time support.
+
+UNIX dialect version differences --  Solaris 8 versus 9, AIX 4.3.3
+vesus 5.2, etc. -- can also render a pre-built lsof binary useless
+on a different version.  So can kernel bit size.
+
+There are so many potential pitfalls to using an lsof binary
+improperly that I strongly recommend lsof be used only where it is
+built.
+
+
+===========
+Making Lsof
+===========
+
+	$ cd <lsof source directory>
+	$ ./Configure <your dialect's abbreviation>
+	$ make
+
+(Consult the 00FAQ and 00XCONFIG files of the lsof distribution
+for information about using make command invocations and environment
+variables to override lsof default Makefile strings.)
+
+This lsof distribution can be used with many UNIX dialects.  However,
+it must be configured specifically for each dialect.  Configuration
+is done in three ways: 1) by changing definitions in the machine.h
+header file of the UNIX dialect of interest; 2) by defining
+environment variable values prior to calling Configure (see the
+00XCONFIG file, the Environment Variabls and Environment Variables
+Affecting the Configure Script sections of this file); and 3) by
+running the Configure shell script found in the top level of the
+distribution directory.
+
+You may not need to change any machine.h definitions, but you might
+want to look at them anyway.  Pay particular attention to the
+definitions that are discussed in the Security section of this
+file.  Please read that section.
+
+The Configure script calls three other scripts in the lsof
+distribution: AFSConfig; Inventory; and Customize.  The AFSConfig
+script is called for selected dialects (AIX, HP-UX, NEXTSTEP, and
+Solaris) to locate AFS header files and determine the AFS version.
+See The AFSConfig Script section of this file for more information.
+
+The Inventory script checks the completeness of the lsof distribution.
+Configure calls Inventory after it has accepted the dialect
+abbreviation, but before it configures the top-level directory for
+the dialect.  See The Inventory Script section of this file for
+more information.
+
+Configure calls the Customize script after it has configured the
+top-level lsof directory for the declared dialect.  Customize helps
+you modify some of the important compile-time definitions of
+machine.h.  See the The Customize Script section.
+
+You should also think about where you will install lsof and its
+man page, and whom you will let execute lsof.  Please read the
+Installing Lsof section of this file for information on installation
+considerations.
+
+Once you have inspected the machine.h file for the dialect for
+which you want to build lsof, and made any changes you need, run
+the Configure script, supplying it with the abbreviation for the
+dialect.  (See the following table.)  Configure selects the
+appropriate options for the dialect and runs the Mksrc shell script
+in the dialect sub-directory to construct the appropriate source
+files in the top-level distribution directory.
+
+Configure may also run the MkKernOpts script in the dialect
+sub-directory to propagate kernel build options to the dialect
+Makefile.  This is done for only a few dialects -- e.g., DC/OSx,
+and Reliant UNIX.
+
+Configure creates a dialect-specific Makefile.  You may want to
+inspect or edit this Makefile to make it conform to local conventions.
+If you want the Makefile to install lsof and its man page, you will
+have to create an appropriate install rule.
+
+Lsof may be configured using UNIX dialect abbreviations from the
+following table.  Alternative abbreviations are indicated by a
+separating `|'.   For example, for SCO OpenServer you can use either
+the ``osr'' or the ``sco'' abbreviation:
+
+	$ Configure osr
+    or
+	$ Configure sco
+
+ Abbreviations		UNIX Dialect
+ -------------		------------
+
+    aix			IBM AIX 5.[23] and 5.3-ML1 using IBM's C Compiler
+    aixgcc		IBM AIX 5.[12] and 5.3-ML1 using gcc
+    darwin		Apple Darwin 7.x and 8.x for Power Macintosh systems
+    decosf		DEC OSF/1, Digital UNIX, Tru64 UNIX 4.0 and 5.1
+    digital_unix	Digital UNIX, DEC OSF/1, Tru64 UNIX 4.0 and 5.1
+    du			Digital UNIX, DEC OSF/1, Tru64 UNIX 4.0 and 5.1
+    freebsd		FreeBSD 4.x, 4.1x, 5.x and [67].x
+    hpux		HP-UX 11.00, 11.11 and 11.23, using HP's C
+			Compiler, both /dev/kmem-based and PSTAT-based
+    hpuxgcc		HP-UX 11.00, 11.11 and 11.23, using gcc, both
+			/dev/kmem-based and PSTAT-based
+    linux		Linux 2.1.72 and above for x86-based systems
+    netbsd		NetBSD 1.[456], 2.x and 3.x
+    next		NEXTSTEP 3.[13]
+    nextstep		NEXTSTEP 3.[13]
+    ns			NEXTSTEP 3.[13]
+    nxt			NEXTSTEP 3.[13]
+    openbsd		OpenBSD 2.[89] and 3.[0-9]
+    openstep		OPENSTEP 4.x
+    os			OPENSTEP 4.x
+    osr			SCO OpenServer Release 5.0.6, using the C compiler
+			from the SCO developer's kit
+    osrgcc		SCO OpenServer Release 5.0.6, using gcc
+    osr6		SCO Openserver 6.0.0, using the SCO C compiler
+    sco			SCO OpenServer Release 5.0.6, using the C compiler
+			from the SCO developer's kit
+    scogcc		SCO OpenServer Release 5.0.6, using gcc
+    solaris		Solaris 2.x, 7, 8, 9 and 10 using gcc
+    solariscc		Solaris 2.x, 7, 8, 9 and 10 using Sun's cc
+    tru64		Tru64 UNIX, DEC OSF/1, Digital UNIX 4.0 and 5.1
+    unixware		SCO|Caldera UnixWare 7.1.4
+    uw			SCO|Caldera UnixWare 7.1.4
+
+If you have an earlier version of a dialect not named in the above
+list, lsof may still work on your system.  I have no way of testing
+that myself.  Try configuring for the named dialect -- e.g., if
+you're using Solaris 2.1, try configuring for Solaris 2.5.1.
+
+After you have configured lsof for your UNIX dialect and have
+selected options via the Customize script (See the The Customize
+Script section.) , use the make command to build lsof -- e.g.,
+
+	$ make
+
+
+Other Configure Script Options
+==============================
+
+There are three other useful options to the Configure script besides
+the dialect abbreviation:
+
+	-clean          may be specified to remove all traces of
+			a dialect configuration, including the
+			Makefile, symbolic links, and library files.
+
+	-h              may be specified to obtain a list of
+	-help		Configure options, including dialect
+			abbreviations.
+
+	-n              may be specified to stop the Configure
+			script from calling the Customize and
+			Inventory scripts.
+
+			Caution: -n also suppresses the AFSConfig
+			step.
+
+
+
+Environment Variables
+=====================
+
+Lsof configuration, building, and execution may be affected by
+environment variable settings.  See the Definitions That Affect
+Compilation section in the 00PORTING file, the General Environment
+Variables section in the 00XCONFIG file, the Dialect-Specific
+Environment Variables section in the 00XCONFIG file, and the
+Environment Variables Affecting the Configure Script section of
+this file for more information.
+
+Note in the General Environment Variables section of the 00XCONFIG
+file that there are five environment variables that can be used to
+pre-define values in lsof's -v output: LSOF_BLDCMT, LSOF_HOST,
+LSOF_LOGNAME, LSOF_SYSINFO, and LSOF_USER.
+
+
+Security
+========
+
+If the symbol HASSECURITY is defined, a security mode is enabled,
+and lsof will allow only the root user to list all open files.
+Non-root users may list only open files whose processes have the
+same user ID as the real user ID of the lsof process (the one that
+its user logged on with).
+
+However, if HASNOSOCKSECURITY is also defined, anyone may list
+anyone else's open socket files, provided their listing is enabled
+with the "-i" option.
+
+Lsof is distributed with the security mode disabled -- HASSECURITY
+is not defined.  (When HASSECURITY is not defined, the definition
+of HASNOSOCKSECURITY has no meaning.)  You can enable the security
+mode by defining HASSECURITY in the Makefile or in the machine.h
+header file for the specific dialect you're using -- e.g.
+dialects/aix/machine.h.
+
+The Customize script, run by Configure when it has finished its
+work, gives you the opportunity to define HASSECURITY and
+HASNOSOCKSECURITY.  (See the The Customize Script section.)
+
+The lsof -h output indicates the state HASSECURITY and HASNOSOCKSECURITY
+had when lsof was built, reporting:
+
+    "Only root can list all files;"
+	if HASSECURITY was defined and HASNOSOCKSECURITY wasn't
+	defined;
+
+    "Only root can list all files, but anyone can list socket files."
+	if HASSECURITY and HASNOSOCKSECURITY were both defined;
+
+    "Anyone can list all files;"
+	if HASSECURITY wasn't defined.  (The definition of
+	HASNOSOCKSECURITY doesn't matter when HASSECURITY isn't
+	defined.)
+
+You should carefully consider the implications of using the default
+security mode.  When lsof is compiled in the absence of the
+HASSECURITY definition, anyone who can execute lsof may be able to
+see the presence of all open files.  This may allow the lsof user
+to observe open files -- e.g., log files used to track intrusions
+-- whose presence you would rather not disclose.
+
+All pre-compiled binaries on lsof.itap.purdue.edu and mirrored from
+it were constructed without the HASSECURITY definition.
+
+As distributed, lsof writes a user-readable and user-writable device
+cache file in the home directory of the real user ID executing
+lsof.  There are other options for constructing the device cache file
+path, and they each have security implications.
+
+The 00DCACHE file in the lsof distribution discusses device cache
+file path construction in great detail.   It tells how to disable
+the various device cache file path options, or how to disable the
+entire device cache file feature by removing the HASDCACHE definition
+from the dialect's machine.h file.  There is also information on
+the device cache file feature in the 00FAQ file.  (The 00DCACHE
+and 00FAQ files are part of the lsof distribution package.)
+
+The Customize script, run by Configure after it has finished its
+work, gives you the opportunity to change the compile-time options
+related to the device cache file.  (See The Customize Script
+section.)
+
+Since lsof may need setgid or setuid-root permission (See the Setgid
+Lsof Dialects and Setuid-root Lsof Dialects sections.), its security
+should always be viewed with skepticism.  Lest the setgid and
+setuid-root permissions allow lsof to read kernel name list or
+memory files, declared with the -k and -m options, that the lsof
+user can't normally access, lsof uses access(2) to establish its
+real user's authority to read such files when it can't surrender
+its power before opening them.  This change was added at the
+suggestion of Tim Ramsey.
+
+Lsof surrenders setgid permission on most dialects when it has
+gained access to the kernel's memory devices.  There are exceptions
+to this rule, and some lsof implementations need to run setuid-root.
+(The Setgid Lsof Dialects and Setuid-root Lsof Dialects sections
+contains a list of lsof implementations and the permissions
+recommended in the distribution's Makefiles.)
+
+The surrendering of setgid permission is controlled by the WILLDROPGID
+definition in the dialect machine.h header files.
+
+In the end you must judge for yourself and your installation the
+risks that lsof presents and restrict access to it according to
+your circumstances and judgement.
+
+
+Run-time Warnings
+=================
+
+Lsof can issue warning messages when it runs -- e.g., about the
+state of the device cache file, about an inability to access an
+NFS file system, etc.  Issuance of warnings are enabled by default
+in the lsof distribution.
+
+Issuance or warnings may be disabled by default by defining
+WARNINGSTATE in the dialect's machine.h.  The Customize script may
+also be used to change the default warning message issuance state.
+(See The Customize Script section.)
+
+The ``-w'' option description of the ``-h'' option (help) output
+will indicate the default warning issuance state.  Whatever the
+state may be, it can be reversed with ``-w''.
+
+
+Device Access Warnings
+======================
+
+When lsof encounters a /dev (or /devices) directory, one of its
+sub-directories, or one of their files that it cannot access with
+opendir(3) or stat(2), it issues a warning message and continues.
+Lsof will be more likely to issue such a warning when it has been
+installed with setgid(<some group name>) permission; it won't have
+trouble if it has been installed with setuid(root) permission or
+is being run under the root login.
+
+The lsof caller can inhibit or enable the warning with the -w
+option, depending on the issuance state of run-time warnings.  (See
+the Run-time Warnings section.)
+
+The warning messages do not appear when lsof obtains device
+information from a device cache file that it has built and believes
+to be current or when warning message issuance is disabled by
+default.  (See the "Caches -- Name and Device" section for more
+information on the device cache file.)
+
+The lsof builder can inhibit the warning by disabling the definition
+of WARNDEVACCESS in the dialect's machine.h or disable all warnings
+by defining WARNINGSTATE.  WARNDEVACCESS is defined by default for
+most dialects.  However, some dialects have some device directory
+elements that are private -- e.g., HP-UX -- and it is more convenient
+for the lsof user if warning messages about them are inhibited.
+
+Output from lsof's -h option indicates the status of WARNDEVACCESS.
+If it was defined when lsof was compiled, this message will appear:
+
+    /dev warnings = enabled
+
+If WARNDEVACCESS was not defined when lsof was compiled, this
+message will appear instead:
+
+    /dev warnings = disabled
+
+The Customize script, run by Configure after it has finished its
+work, gives you the opportunity to change the WARNDEVACCESS
+definition.  (See The Customize Script section.)
+
+
+NFS Blocks
+==========
+
+Lsof is susceptible to NFS blocks when it tries to lstat() mounted
+file systems and when it does further processing -- lstat() and
+readlink() -- on its optional file and file system arguments.
+
+Lsof tries to avoid being stopped completely by NFS blocks by doing
+the lstat() and readlink() functions in a child process, which
+returns the function response via a pipe.  The lsof parent limits
+the wait for data to arrive in the pipe with a SIGALRM, and, if
+the alarm trips, terminates the child process with a SIGINT and a
+SIGKILL.
+
+This is as reliable and portable a method for breaking NFS deadlocks
+as I have found, although it still fails under some combinations
+of NFS version, UNIX dialect, and NFS file system mount options.
+It generally succeeds when the "intr" or "soft" mount options are
+used; it generally fails when the "hard" mount option is used.
+
+When lsof cannot kill the child process, a second timeout causes
+it to stop waiting for the killed child to complete.  While the
+second timeout allows lsof to complete, it may leave behind a hung
+child process.  Unless warnings are inhibited by default or with
+the -w option, lsof reports the possible hung child.
+
+NFS block handling was updated with suggestions made by Andreas
+Stolcke.  Andreas suggested using the alternate device numbers that
+appear in the mount tables of some dialects when it is not possible
+to stat(2) the mount points.
+
+The -b option was added to direct lsof to avoid the stat(2) and
+readlink(2) calls that might block on NFS mount points and always
+use the alternate device numbers.  If warning message issuance is
+enabled and you don't want warning messages about what lsof is
+doing, use the -w option, too.
+
+The -O option directs lsof to avoid doing the potentially blocking
+operations in child processes.  Instead, when -O is specified, lsof
+does them directly.  While this consumes far less system overhead,
+it can cause lsof to hang, so I advise you to use -O sparingly.
+
+
+Caches -- Name and Device
+==========================
+
+Robert Ehrlich suggested that lsof obtain path name components for
+open files from the kernel's name cache.  Where possible, lsof
+dialect implementations do that.  The -C option inhibits kernel
+name cache examination.
+
+Since AFS apparently does not use the kernel's name cache, where
+lsof supports AFS it is unable to identify AFS files with path name
+components.
+
+Robert also suggested that lsof cache the information it obtains
+via stat(2) for nodes in /dev (or /devices) to reduce subsequent
+running time.  Lsof does that, too.
+
+In the default distribution the device cache file is stored in
+.lsof_hostname, mode 0600, in the home directory of the login of
+the user ID that executes lsof.  The suffix, hostname, is the first
+component of the host's name returned by gethostname(2).  If lsof
+is executed by a user ID whose home directory is NFS-mounted from
+several hosts, the user ID's home directory may collect several
+device cache files, one for each host from which it was executed.
+
+Lsof senses accidental or malicious damage to the device cache file
+with extensive integrity checks, including the use of a 16 bit CRC.
+It also tries to sense changes in /dev (or /devices) that indicate
+the device cache file is out of date.
+
+There are other options for forming the device cache file path.
+Methods the lsof builder can use to control and employ them are
+documented in the separate 00DCACHE file of the lsof distribution.
+
+
+Raw Sockets
+===========
+
+On many UNIX systems raw sockets use a separate network control
+block structure.  Display of files for applications using raw
+sockets -- ping, using ICMP, for example -- need special support
+for displaying their information.  This support is so dialect-specific
+and information to provide it so difficult to find that not all
+dialect revisions of lsof handle raw sockets completely.
+
+
+Other Compile-time Definitions
+==============================
+
+The machine.h and dlsof.h header files for each dialect contains
+definitions that affect the compilation of lsof.  Check the
+Definitions That Affect Compilation section of the 00PORTING file
+of the lsof distribution for their descriptions.  (Also see The
+Customize Script section.)
+
+
+The AFSConfig Script
+====================
+
+Lsof supports AFS on some combinations of UNIX dialect and AFS
+version.  See the AFS section of this document for a list of
+supported combinations.
+
+When configuring for dialects where AFS is supported, the Configure
+script calls the AFSConfig script to determine the location of AFS
+header files and the AFS version.  Configure will not call AFSConfig,
+even for the selected dialects, unless the file /usr/vice/etc/ThisCell
+exists.
+
+The AFS header file location is recorded in the AFSHeaders file;
+version, AFSVersion.  Once these values have been recorded, Configure
+can be told to skip the calling of AFSConfig by specifying its
+(Configure's) -n option.
+
+
+The Inventory Script
+====================
+
+The lsof distribution contains a script, called Inventory, that
+checks the distribution for completeness.  It uses the file 00MANIFEST
+in the distribution as a reference point.
+
+After the Configure script has accepted the dialect abbreviation,
+it normally calls the Inventory script to make sure the distribution
+is complete.
+
+After Inventory has run, it creates the file ".ck00MAN" in the
+top-level directory to record for itself the fact that the inventory
+has been check.  Should Inventory be called again, it senses this
+file and asks the caller if another check is in order, or if the
+check should be skipped.
+
+The -n option may be supplied to Configure to make it bypass the
+calling of the Inventory script.  (The option also causes Configure
+to avoid calling the Customize script.)
+
+The lsof power user may want to define (touch) the file ".neverInv".
+Configure avoids calling the Inventory script when ".neverInv"
+exists.
+
+
+The Customize Script
+====================
+
+Normally when the Configure script has finished its work, it calls
+another shell script in the lsof distribution called Customize.
+(You can tell Configure to bypass Customize with its -n option.)
+
+Customize leads you through the specification of these important
+compile-time definitions for the dialect's machine.h header file:
+
+	HASDCACHE		device cache file control
+	    HASENVDC		device cache file environment
+				variable name
+	    HASPERSDC		personal device cache file path
+				format
+	    HASPERSDCPATH	name of environment variable that
+				provides an additional component
+				of the personal device cache file
+				path
+	    HASSYSDC		system-wide device cache file path
+	HASKERNIDCK		the build-time to run-time kernel
+				identity check
+	HASSECURITY		the security option
+	HASNOSOCKSECURITY	the open socket listing option whe
+				HASSECURITY is defined
+	WARNDEVACCESS		/dev (or /devices) warning message
+				control
+	WARNINGSTATE		warning message issuance state
+
+The Customize script accompanies its prompting for entry of new
+values for these definitions with brief descriptions of each of
+them.  More information on these definitions may be found in this
+file or in the 00DCACHE and 00FAQ files of the lsof distribution.
+
+You don't need to run Customize after Configure.  You can run it
+later or you can edit machine.h directly.
+
+The -n option may be supplied to Configure to make it bypass the
+calling of the Customize script.  (The option also causes Configure
+to avoid calling the Inventory script.)
+
+The lsof power user may want to define (touch) the file ".neverCust".
+Configure avoids calling the Customize script when ".neverCust"
+exists.
+
+Customize CAUTION: the Customize script works best when it is
+applied to a newly configured lsof source base -- i.e., the machine.h
+header file has not been previously modified by the Customize
+script.  If you have previously configured lsof, and want to rerun
+the Customize script, I recommend you clean out the previous
+configuration and create a new one:
+
+	$ Configure -clean
+	$ Configure <dialect_abbreviation>
+	...
+	Customize in response to the Customize script prompts.
+
+
+Cautions
+========
+
+Lsof is a tool that is closely tied to the UNIX operating system
+version.  It uses header files that describe kernel structures and
+reads kernel structures that typically change from OS version to
+OS version, and even within a version as vendor patches are applied.
+
+DON'T TRY TO USE AN LSOF BINARY, COMPILED FOR ONE UNIX OS VERSION,
+ON ANOTHER.  VENDOR PATCHES INFLUENCE THE VERSION IDENTITY.
+
+On some UNIX dialects lsof versions may be even more restricted by
+architecture type.
+
+The bottom line is use lsof where you built it.  If you intend to
+use a common lsof binary on multiple systems, make sure all systems
+run exactly the same OS version and have exactly the same patches.
+
+
+Warranty
+========
+
+Lsof is provided as-is without any warranty of any kind, either
+expressed or implied, including, but not limited to, the implied
+warranties of merchantability and fitness for a particular purpose.
+The entire risk as to the quality and performance of lsof is with
+you.  Should lsof prove defective, you assume the cost of all
+necessary servicing, repair, or correction.
+
+
+License
+=======
+
+Lsof has no license.  Its use and distribution are subject to these
+terms and conditions, found in each lsof source file.  (The copyright
+year in or format of the notice may vary slightly.)
+
+    /*
+     * Copyright 2002 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.
+     */
+
+
+Bug Reports
+===========
+
+Now that the obligatory disclaimer is out of the way, let me hasten to
+add that I accept lsof bug reports and try hard to respond to them.  I
+will also consider and discuss requests for new features, ports to new
+dialects, or ports to new OS versions.
+
+PLEASE DON'T SEND BUG REPORTS ABOUT LSOF TO THE UNIX DIALECT OR DIALECT
+OPTION VENDOR.
+
+At worst such bug reports will confuse the vendor; at best, the vendor
+will forward the bug report to me.
+
+PLEASE DON'T SEND BUG REPORTS ABOUT LSOF BINARIES BUILT OR DISTRIBUTED
+BY SOMEONE ELSE, BECAUSE I CAN'T SUPPORT THEM.
+
+I do support binaries I built, obtained ONLY from lsof.itap.purdue.edu.
+Before reporting a problem with a lsof.itap.purdue.edu binary, please
+verify the correctness of the signatures found in its associated
+CHECKSUMS file.
+
+Before you send me a bug report, please do these things:
+
+    *  Make sure you try the latest lsof revision.
+
+       +  Download the latest revision from:
+
+	    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof
+
+       +  Verify the signatures of what you have downloaded;
+
+       +  While connected to lsof.itap.purdue.edu, check for patches:
+
+	    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/patches
+
+       +  If patches exist, install them in the latest revision
+	  you just downloaded.  Then build the latest revision and
+	  see if it fixes your bug.
+
+    *  If you're having trouble compiling lsof with gcc, try the
+       UNIX dialect vendor's compiler.  I don't have access to gcc on
+       all test systems, so my support for it is hit-and-miss, and so
+       is my ability to respond to gcc compilation problem reports.
+
+    *  Check the lsof frequently asked questions file, 00FAQ,
+       to see if there's a question and answer relevant to your
+       problem.
+
+    *  Make sure you're running the lsof you think you are by
+       checking the path to it with which(1).  When in doubt, use an
+       absolute path to lsof.  Make sure that lsof binary has
+       sufficient permissions to do what you ask, including internal
+       permissions given it (e.g., restrictions on what files lsof may
+       report for whom) during its build.
+
+When you send a bug report, make sure you include output from your
+running of lsof's Configure script.  If you were able to compile a
+running lsof, please also include:
+
+    *  Output from which(1) that shows the absolute path to the
+       lsof binary in question;
+
+    *  Output from running lsof with its -h and -v options at
+       lsof's absolute path;
+
+    *  Output from "ls -l" directed to lsof's absolute path.
+
+If you weren't able to compile a running lsof, please send me: the
+compiler error output; identification of the lsof revision you're using
+(contents of the lsof version.c file); identification of your system
+(full uname output or output from whatever other tool identifies the
+system); and compiler identification (e.g., gcc -v output).
+
+Either set of output will help me understand how lsof was configured
+and what UNIX dialect and lsof revision is involved.
+
+Please send all bug reports, requests, etc. to me via e-mail at
+<abe@purdue.edu>.  Make sure "lsof" appears in the "Subject:" line so
+my e-mail filter won't classify your letter as Spam.
+
+
+The 00FAQ File
+==============
+
+The lsof distribution contains an extensive frequently asked
+questions file on lsof features and problems.  I recommend you
+consult it before sending me e-mail.  Use your favorite editor or
+pager to search 00FAQ -- e.g., supplying as a search argument some
+fixed text from an lsof error message.
+
+
+The lsof-l Mailing List
+=======================
+
+Information about lsof, including notices about the availability
+of new revisions, may be found in mailings of the lsof-l listserv.
+For more information about it, including instructions on how to
+subscribe, read the 00LSOF-L file of the lsof distribution.
+
+
+Field Output Example Scripts
+============================
+
+Example AWK and Perl 4 or 5 scripts for post-processing lsof field
+output are locate in the scripts sub-directory of the lsof distribution.
+The scripts sub-directory contains a 00README file with information
+about the scripts.
+
+
+Field Output C Library
+======================
+
+The lsof test suite (See "Testing Lsof."), checks basic lsof
+operations using field output.  The test suite has its own library
+of C functions for common test program operations, including
+processing of field output.  The library or selections of its
+functions could be adapted for use by C programs that want to
+process lsof field output.  See the library in the file LTlib.c
+in the tests/ sub-directory
+
+
+Testing Lsof
+============
+
+Lsof has an automated test suite in the tests/ sub-directory that
+can be used to test some basic lsof features -- once lsof has been
+configured and made.  Tests are arranged in three groups: basic
+tests that should run on all dialects; standard tests that should
+run on all dialects; and optional tests that may not run on all
+dialects or may need special resources to run.  See 00TEST for more
+information.)
+
+CAUTION!!!  Before you attempt to use the test suite make sure that
+the lsof you want to test can access the necessary kernel resources
+-- e.g., /dev/mem, /dev/kmem, /proc, etc.  Usually you want to test
+the lsof you just built, so this is an important check.  (See
+00TEST.)
+
+To run the basic and standard tests, using the lsof in the parent
+directory of tests/, do this:
+
+	$ cd tests
+	$ make test
+    or	$ make std
+    or	$ make standard
+
+The basic and standard tests may be run as silently as possible,
+using the lsof in the parent directory of tests/, with:
+
+	$ cd tests
+	$ make auto
+
+This is the "automatic" test mode, designed for use by scripts that
+build lsof.  The caller is expected to test the make exit code to
+determine if the tests succeeded.  The caller should divert standard
+output and standard error to /dev/null to suppress make's error
+exit message.
+
+The optional tests may be run, using the lsof in the parent directory
+of tests/, with:
+
+	$ cd tests
+	$ make opt
+    or	$ make optional
+
+It's possible to excute individual tests, too.  See the 00TEST file
+of this distribution for more informaiton on the tests, what they
+do, and how to run and possibly customize each test.
+
+It's possible to run the tests, using an lsof other than the one
+in the parent directory of /tests, too.  See 00TEST for information
+about using the LT_LSOF_PATH environment variable to do that.
+
+
+=============
+Dialect Notes
+=============
+
+
+AFS
+===
+
+Lsof recognizes AFS files on the following combinations of UNIX
+dialect and AFS versions:
+
+	AIX 4.1.4 (AFS 3.4a)
+	Linux 1.2.13 (AFS 3.3)
+	NEXTSTEP 3.2 (AFS 3.3) (untested on recent lsof revisions)
+	Solaris 2.6 (AFS 3.4a)
+	Ultrix 4.2 RISC (AFS 3.2b) (no longer available)
+
+Lsof has not been tested under other combinations -- e.g. HP-UX
+10.10 and AFS 3.4a -- and probably won't even compile there.  Often
+when a UNIX dialect version or AFS version changes, the new header
+files come into conflict, causing compiler objections.
+
+
+AIX
+===
+
+Specify the aix Configure abbreviation for AIX 4.1.[45], 4.2[.1],
+4.3[.123], 5L, and 5.[123].
+
+Specify aixgcc on AIX above 4.1 to use the gcc compiler.  (Gcc can't be
+used to compile lsof on AIX 4.1 and below because of kernel structure
+alignment differences between it and xlc.)  Gcc results sometimes
+depend on the version of the gcc compiler that is used.
+
+Compilation of lsof with gcc on AIX 4.3[.123], 5L, and 5.[123] has been
+sparsely tested with varying degrees of success: it has been reported
+to succeed on AIX 4.3.3 and 32 bit Power AIX 5.1; to fail on ia64 AIX
+5.1 and 64 bit Power AIX 5.1; and to succeed on 32 and 64 bit Power AIX
+5.2.  Lsof compilation with gcc hasn't been tested on AIX 5.3.
+
+At revision 4.61 and above lsof is configured and built to match the
+bit size of the kernel of Power architecture AIX 5.1 systems.  Lsof
+binaries built for 32 and 64 bit kernels are not interchangeable.  See
+00FAQ for more information.
+
+The Configure script uses /usr/bin/oslevel to determine the AIX version
+for AIX less than 5 and ``uname -rv'' for AIX 5 and higher.  If
+/usr/bin/oslevel isn't executable on AIX less than 5, the Configure
+script issues a warning message and uses ``uname -rv'' to determine the
+AIX version.
+
+When Configure must use ``uname -rv'' on AIX less than 5 to determine
+the AIX version, the result will lack a correct third component --
+e.g., the `4' of ``4.1.4''.  If your AIX less than 5 system lacks lacks
+an executable oslevel, I suggest you edit the Configure-produced
+Makefile and complete the _AIXV definition in the CFGF string.
+
+By default lsof avoids using the kernel's readx() function, causing
+it to be unable to report information on some text and library file
+references.  The ``-X'' option allows the lsof user to ask for the
+information readx() supplies.
+
+Lsof avoids readx() to avoid the possibility of triggering a kernel
+problem, known as the Stale Segment ID kernel bug.  Kevin Ruderman
+reported this bug to me.  The bug shows up when the kernel's
+dir_search() function hangs, hanging the application process that
+called it so completely that the application process can neither
+be killed nor stopped.  The hang is the consequence of another
+process (perhaps lsof) making legitimate use of the kernel's readx()
+function to access the kernel memory that dir_search() is examining.
+IBM has indicated they have no plans to fix the bug.
+
+A fuller discussion of this bug may be found in the 00FAQ file of
+the lsof distribution.  There you will find a description of the
+Stale Segment ID bug, the APAR on it, and a discussion of the
+sequence of events that exposes it.
+
+I added the ``-X'' function so you can tell lsof to use readx(),
+but if you use ``-X'', you should be alert to its possibly serious
+side effects.  Although readx() is normally disabled, its state is
+controlled with the HASXOPT, HASXOPT_ROOT, and HASXOPT_VALUE
+definitions in dialects/aix/machine.h, and you can change its
+default state by changing those definitions.  You can also change
+HASXOPT_ROOT via the Customize script.
+
+You can also compile lsof with readx() use permanently enabled or
+disabled -- see the comments about the definitions in the
+dialects/aix/machine.h header file.  You may want to permanently
+disable lsof's use of readx() if you plan to make lsof publicly
+executable.  You can also restrict -X to processes whose real UID
+is root by defining HASXOPT_ROOT.
+
+I have never seen lsof cause the Stale Segment ID bug to occur and
+haven't had a report that it has, but I believe there is a possibility
+it could.
+
+AFS support for AIX was added with help help from Bob Cook and Jan
+Tax who provided test systems.
+
+Henry Grebler and David J. Wilson helped with lsof for AIX 4.2.
+
+Bill Pemberton provided an AIX 4.3 test system.  Andrew Kephart
+and Tom Weaver provided AIX 4.3 technical assistance.   Niklas
+Edmundsson did 4.3.1 testing.  Doug Crabill provided an AIX 4.3.2
+test system.  Jeff W. Stewart provided an AIX 4.3.3 test system.
+
+The SMT file type for AIX 4.1.[45], 4.2[.1], and 4.3[.12] is my
+fabrication.  See the 00FAQ file more information on it.
+
+Loc Le and Nasser Momtaheni of IBM provided test systems for AIX 5L and
+5.1.  Lsof for AIX 5L and 5.1 needs setuid-root permission to process
+the -X option on systems whose architecture type is ia64.
+
+Dale Talcott of Purdue provided AIX 5.1 and 5.2 test systems.  Dale and
+John Jackson of Purdue provided an AIX 5.3 test system.
+
+
+Apple Darwin
+============
+
+The Apple Darwin port was provided by Allan Nathanson for version
+1.2.  Allan also arranged for access to a test system for maintenance
+and regression testing.  Dale Talcott provided a test system, too.
+
+Allan supplied patches for updates to 1.4, 5.x, 6.x, 7.x and 8.x.
+
+
+BSDI BSD/OS
+===========
+
+As of lsof revision 4.77 support for BSDI BSD/OS has been
+discontinued.  Lsof revision 4.76 with BSDI BSD/OS support may be found
+on lsof.itap.purdue.edu in pub/tools/unix/lsof/src.
+
+
+DEC OSF/1, Digital UNIX, Tru64 UNIX
+===================================
+
+Robert Benites, Dean Brock, Angel Li, Dwight McKay, Berkley Shands,
+Ron Young and Steve Wilson have kindly provided test systems.
+Jeffrey Mogul has provided technical assistance.  Dave Morrison
+and Lawrence MacIntyre did Digital UNIX V3.2 testing.
+
+Lsof supports the ADVFS/MSFS layered file system product.  Lsof
+can locate all the open files of an ADVFS/MSFS file system when
+its path is specified, provided the file system is listed in
+/etc/fstab with an ``advfs'' type.  (This /etc/fstab caveat applies
+only to Digital UNIX 2.0.)  At Digital UNIX 4.0 and Tru64 UNIX,
+using code provided by David Brock, lsof 4.20 and above can locate
+ADVFS file paths.
+
+Testing of lsof on DEC OSF/1 and Digital UNIX 4.0 ended with lsof
+revision 4.74.  Hence, the lsof documentation has dropped the claim
+that it works there.  For a distribution of lsof 4.74 that was tested
+on DEC OSF/1 and Digital UNIX 4.0, check pub/tools/unix/lsof/OLD/src
+on the lsof ftp home, lsof.itap.purdue.edu.
+
+Lsof revisions past 4.74 have only been tested on Tru64 UNIX 5.1.
+
+
+FreeBSD
+=======
+
+Bill Bormann of Purdue University provided access to several FreeBSD
+test systems.  Ade Barkah, John Clear, Ralph Forsythe, Michael
+Haro, Kurt Jaeger, and William McVey have also provided FreeBSD
+test systems.
+
+The FreeBSD distribution header files are augmented by header files
+in the dialects/freebsd/include directory.
+
+David O'Brien maintains the lsof FreeBSD port package.
+
+
+HP-UX
+=====
+
+Lsof has two HP-UX bases: /dev/kmem for HP-UX 11.0 and earlier;
+and PSTAT for HP-UX 11.11 and later.  The lsof Configure script
+will pick the appropriate base.
+
+To use the CCITT x.25 socket support for HP-UX, you must have the
+x.25 header files in /etc/conf/x25
+
+Pasi Kaara helped with the HP-UX port, especially with its CCITT
+x.25 socket support.
+
+Richard Allen provided HP-UX 10.x and 11.x test systems, as did
+Mark Bixby, and Elias Halldor Agustsson.   Marc Winkler helped test
+the 10.20 port.  Richard J. Rauenzahn provided a 64 bit HP-UX 11
+test system and an HP-UX 11.11 development system.
+
+AFS support for HP-UX was added thanks to help from Chaskiel Moses
+Grundman, who provided a test system.
+
+The /dev/kmem-based HP-UX 11.00 support is extremely fragile.  It
+depends on privately developed kernel structure definitions.  (See
+.../dialects/hpux/hpux11 for the header files making the definitions.)
+Those header files and their definitions will not be updated by
+HP-UX 11.00 patches, making it likely that any patch changing a
+kernel structure critical to lsof will break lsof in some way.
+
+It's possible to build a 64 bit lsof for 64 bit HP-UX 11.00 with
+gcc, but you must have a gcc compiler capable of producing 64 bit
+executables.  See the 00FAQ file for more information.
+
+The PSTAT-based lsof for HP-UX 11.11 and later is much more solid.
+I am indebted to the vision of HP for providing an lsof kernel API
+through the PSTAT implementation.  Specifically I appreciate the
+help of HP staff members Carl Davidson, Louis Huemiller, Rich
+Rauenzahn, and Sailu Yallapragada that made PSTAT-based HP-UX lsof
+possible.
+
+
+IPv6
+====
+
+Lsof has IPv6 support that has been tested for these UNIX dialects:
+AIX 4.3.x; Apple Darwin 5.[12] and 6.0; the INRIA and KAME FreeBSD IPv6
+implementations; PSTAT-based HP-UX; /proc-based Linux; the INRIA and
+KAME NetBSD implementations; and Solaris 8 and 9.  Lsof has IPv6
+support that hasn't been tested for: OpenBSD (KAME); OpenUNIX 8; Tru64
+Unix 5.[01]; and UnixWare 7.1.[34].
+
+Please let me know if your UNIX dialect has IPv6 support and I'll
+see if it can be supported by lsof.
+
+
+Linux
+=====
+
+Tim Korb, Steve Logue, Joseph J. Nuspl Jr., and Jonathan Sergent
+have provided Linux test systems.
+
+Michael Shields helped add and test automatic handling of ELF/COFF
+form names in /System.map, Marty Leisner and Keith Parks have helped
+test many lsof revisions.  Marty has provided valuable suggestions,
+Linux hints, and code, too.
+
+The 00FAQ file gives some Linux tips, including information on
+coping with system map file problems.
+
+To determine the state of the Linux 2.1.x C library lseek() function,
+the lsof Configure script runs a test program that must have
+permission to read /dev/kmem.  The test determines if the lseek()
+function properly handles kernel offsets, which appear to be negative
+because their high order bit is set.  If the lseek() test reveals
+a faulty lseek(), Configure activates the use of a private lseek()
+function for kernel offset positioning.  See the Linux problems
+section of the 00FAQ file of the lsof distribution for more
+information.
+
+
+NetBSD
+======
+
+Greg Earle  and Paul Kranenburg have assisted with the NetBSD ports.
+Paul has provided test systems.  Ray Phillips provided a NetBSA
+Alpha test system.  Andrew Brown also provided a test system.
+
+The NetBSD dialect version of lsof is compiled using the dialect
+sources it shares with OpenBSD in the n+obsd dialect sub-directory.
+
+
+NEXTSTEP and OPENSTEP
+=====================
+
+Virtual memory header files that allow lsof to display text references
+were derived from the contents of /usr/include/vm of NEXTSTEP 2.0.
+NeXT did not ship the virtual memory header files with other NEXTSTEP
+or OPENSTEP versions.
+
+You may use the RC_FLAGS environment variable to declare compiler
+options outside the Makefile.  A common use of this variable is to
+define the architecture types to be included in a "fat" executable.
+See the comments in dialects/next/Makefile for an example.
+
+
+OpenBSD
+=======
+
+David Mazieres has provided OpenBSD test systems.  The OpenBSD
+dialect version of lsof is compiled using the dialect sources it
+shares with NetBSD in the n+obsd dialect sub-directory.
+
+Kenneth Stailey has provided OpenBSD testing and advice.
+
+John Dzubera (Zube) reports, "lsof 4.33 compiles and runs on OpenBSD
+2.3 for the pmax architecture (decstation 3100)."
+
+I have not tested lsof on OpenBSD 3.8, but David Mazieres reports
+revision 4.76 worked on OpenBSD 3.8.
+
+
+Pyramid DC/OSx and Reliant UNIX
+===============================
+
+As of lsof revision 4.52 support for all Pyramid dialects has been
+discontinued.  Lsof revision 4.51 with Pyramid support may be
+obtained upon request.  Send the request to abe@purdue.edu.
+
+These two UNIX dialects are very similar and share dialect-specific
+source files from the pyramid sub-directory.
+
+The Reliant Unix Pyramid C compiler issues warning messages that
+I haven't found a convenient way to suppress.  You can ignore
+warning messages about casts and conversions that lose bits.  The
+message "warning: undefining __STDC__" is intentionally caused by
+the lsof MkKernOpts configuration script to suppress warning messages
+about cast and conversion problems in standard system header files,
+such as <stdio.h> and <string.h>.
+
+Bruce Beare and Kevin Smith provided test systems.
+
+
+Caldera OpenUNIX
+================
+
+Larry Rosenman provided an OpenUNIX 8 test system.  Matthew Thurmaier
+provided technical assistance, along with these people from Caldera:
+Jack Craig, Robert Lipe, and Bela Lubkin.
+
+Robert Lipe supplied changes to lsof for OpenUNIX 8.0.1.  Those
+changes were also incorporated in UnixWare 7.1.3 when it became
+the release name for OpenUNIX 8.0.1.
+
+Support for lsof on OpenUNIX ended at lsof revision 4.74.  The last
+lsof revision, 4.74, tested on OpenUNIX, may be found at the lsof
+"home" ftp site, lsof.itap.purdue.edu, in pub/tools/unix/lsof/OLD/src.
+
+
+SCO OpenServer
+==============
+
+Dion Johnson, Bela Lubkin, and Nathan Peterson of SCO gave me copies
+of SCO OpenServer and the SCO OpenServer Development System 3.0
+and provided technical advice for the lsof port.
+
+Hugh Dickins, Bela Lubkin, Craig B. Olofson, and Nathan Peterson
+provided version 5.0 and gave technical advice for porting lsof to
+it.  Bela provided the 5.0.4 changes.  D. Chris Daniels provided
+a 5.0.4 test system, Lee Penn provided one for 5.0.5, and John
+Dubois for 5.0.6.
+
+The <netdb.h> header file was accidentally omitted from some SCO
+OpenServer Development System releases.  The Configure script will
+sense its absence and substitute an equivalent from the BSD
+distribution.  The BSD <netdb.h> and the <sys/cdefs.h> header file
+it includes are located in the dialects/os/include sub-directory
+tree.
+
+To compile lsof from its distribution sources you must have the
+TCP/IP and NSF headers in /usr/include.  While those are optional
+OpenServer packages, I have access to no system that doesn't have
+them, so I'm unable to build lsof for such a configuration.  However,
+it should be possible to modify the lsof Configure script and
+sources so lsof would compile and work without those optional
+packages.
+
+If you have an OpenServer system configured without the TCP/IP and
+NFS packages, and want to tackle the job of building lsof for it,
+contact me via e-mail at <abe@purdue.edu>.  I'll identify the
+Configure script, header file, and source file changes you will
+need to make.  (Caution: this is not a simple task, or I would have
+already done it.)
+
+The optional osrgcc and scogcc Configure abbreviations construct
+Makefiles for compiling lsof with gcc.
+
+The UnixWare 7.1.4 sources are used for OpenServer Release 6.0.0.
+Hence there is a separate Configure abbreviation for it, "osr6".
+Richard of SCO provided a test system and technical assistance.
+
+
+SCO|Caldera UnixWare
+============
+
+D. Chris Daniels, John Hughes, Ken Laing, Andrew Merril, Lee Penn, and
+Matthew Thurmaier provided test systems.  Bela Lubkin provided
+technical assistance.  Larry Rosenman provided 7.1.[34] test systems.
+
+
+Solaris 2.x, 7, 8, 9 and 10
+===========================
+
+SEE THE CAUTIONS SECTION OF THIS DOCUMENT.
+
+The latest Solaris revision of lsof 4 might work under Solaris
+2.[1-4] and 2.5[.1] and 7 but hasn't been tested there.  I have no
+test systems for those Solaris versions.
+
+Lsof will compile with gcc and the Sun C compiler under Solaris.
+If you want to use the Sun compiler, use the solariscc Configure
+abbreviation.  If you use a gcc version less than 2.8 on Solaris,
+make sure the gcc-specific includes have been updated for your
+version of Solaris -- i.e., run the gcc fixincludes script.
+
+Solaris 7, 8, 9 and 10 support for 64 bit kernels depends on a Sun
+WorkShop or Forte C compiler version that supports the "-xarch=v9"
+flag -- usually 5.0 or greater.  Gcc versions 2.95 and above *may*
+be configured and built for 64 bit support, but it takes some extra
+work, the resulting compiler may be fragile, and the gcc developers
+discourage it.  I've built 64 bit capable gcc compilers for Solaris
+7, 8 and 9 from gcc versions 2.95 through 3.0.1 and produced working
+lsof executables with them.  More information on 64 bit gcc for
+Solaris may be found in the 00FAQ file.
+
+Solaris 10 ZFS support is questionable, because Sun does not distribute
+the ZFS kernel structure definition header files.  The lsof Configure
+script and source code use some risky work-arounds.  ZFS file system
+support was made possible with help from Horst Scheuermann.
+
+Dave Curry and Steve Kirsch provided resources for Solaris 2.x
+ports.  Casper Dik and Gerry Singleton consulted and provided
+valuable assistance.
+
+Henry Katz, Joseph Kowalski, Charles Stephens, Mike Sullivan, and
+Mike Tracy provided technical assistance.
+
+AFS support was added to Solaris lsof with help from Curt Freeland,
+Heidi Hornstein, Michael L. Lewis, Terry McCoy, Phillip Moore, and
+Sushila R. Subramanian.
+
+Casper Dik provided valuable assistance for the Solaris 8 support.
+
+Sun has graciously provided me access to BETA versions of Solaris
+2.5, 2.6, 7, 8, and 9.
+
+John Dzubera provided Solaris 7 and 8 test systems.
+
+Mike Miscevic provided  Solaris 10 test systems.
+
+
+Ultrix
+======
+
+As of lsof revision 4.52 support for Ultrix is no longer available,
+because I no longer have an Ultrix test system.
+
+Terry Friedrichsen, Dwight McKay, and Jeffrey Mogul helped me with
+this port.
+
+DECnet support was added to Ultrix lsof with the help of John
+Beacom, who kindly provided a test system.  The Configure script
+decides that DECnet support is available if /usr/lib/libdnet.a and
+/usr/include/netdnet/dn.h exist and are readable.
+
+
+Veritas VxFS and VxVM
+=====================
+
+Lsof supports some versions of Veritas VxFS and VxVM on some UNIX
+dialects.  Consult the lsof Configure script for the specific
+dialect, and consult the lsof dialect-specific source files for
+the UNIX dialect of interest.  Veritas support will usually be
+found in a source file named dnode[1-9].c.
+
+Since Veritas rarely has a version number that can be extracted
+with shell commands, lsof doesn't use it.  Instead, when lsof
+supports Veritas, the Configure script will form compile-time
+definitions starting with HASVXFS.   Check the lsof 00PORTING
+documentation file for more information.
+
+Lsof Veritas support requires that the supporting Veritas header
+files be installed -- e.g., in /usr/include/sys/fs.  (The location
+will depend in the dialect's header file conventions.)
+
+Some information on lsof support for Veritas extensions may be
+found in the lsof 00DIST file.
+
+Chris Kordish and Andy Thomas have provided Solaris VxFS test
+systems.
+
+
+================================
+User-contributed Dialect Support
+================================
+
+There are some user-contributed dialect versions of lsof; more
+information on them can be found at:
+
+	ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/contrib
+
+Check the 00INDEX file there for details.
+
+
+============================
+Dialects No Longer Supported
+============================
+
+Because I don't have access to test systems, these UNIX dialects
+are no longer supported by lsof:
+
+	CDC EP/IX
+	/dev/kmem-based Linux
+	MIPS RISC/os
+	Motorola V/88
+	Pyramid DC/OSx
+	Pyramid Reliant UNIX
+	Sequent DYNIX
+	SGI IRIX
+	SunOS 4.x
+	Ultrix
+	UnixWare below 7.0
+
+Remnants of the support lsof once provided for these dialects may
+be found in:
+
+	ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD/binaries
+and
+	ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/OLD/dialects
+
+
+===============
+Installing Lsof
+===============
+
+The distributed Makefiles do not have actions that will install
+lsof.  I've come to the conclusion there is no standard for installing
+lsof or its man page, so I no longer distribute make rules for
+installing them.  You should adjust the Makefile for your local
+preferences.
+
+The Makefile does have an install rule that will cause lsof to
+compile by virtue of its dependency clause.  Some Makefiles also
+have a dependency that causes the production of a man page that is
+ready to install.  However, the actions of the install rule will
+not cause the lsof executable or its man page to be installed in
+any UNIX system-wide directory.
+
+Instead, after the compilation and optional man page production
+are completed, the install rule will produce a brief description
+of what actions you might add to the install rule.  The description
+will suggest the possible modes, ownerships, permissions, and
+destinations your install rule might employ to install the lsof
+executable and man page.
+
+As you form your install rule, keep in mind that lsof usually needs
+some type of special permission to do its job.  That may be permission
+to read memory devices such as /dev/kmem, /dev/mem, or /dev/swap,
+or it may be authorization to read entries in the /proc file system.
+
+Memory device access can usually be provided by setting the modes
+of the lsof executable so that it's effective group identifier when
+it runs is the same as the group that has permission to read the
+memory devices -- i.e., it is setgid-group.  The privileged group
+is usually kmem, sys, or system.
+
+Don't overlook using ACLs -- e.g., on AIX or Solaris 8 -- to give
+lsof permission to access memory devices.  ACLs, coupled to a
+separate group like kmem, can be safer than giving lsof setgid
+authorization to a commonly used system group.
+
+When lsof needs to read /proc file system entries, it must be
+installed with modes that make its effective user identifier root
+when it runs -- i.e., it must be setuid-root.  If lsof must be
+installed setuid-root (only the AIX 5L, PSTAT-based HPUX, and
+/proc-based Linux, ports need such power.), then access to memory
+devices is automatic (or not needed in the case of /proc-based
+Linux).
+
+Your choice of permissions for lsof may also be affected by your
+desire to allow anyone to use it or your need to restrict its usage
+to specific individuals.  You will have to be guided by local policy
+and convention in this case.
+
+The next two sections, Setgid Lsof Dialect Versions and Setuid-root
+Lsof Dialect Versions, list recommended install permissions.
+
+The system directory where you install the lsof executable is also
+open to choice.  A traditional place for a tool like lsof is
+/usr/local/etc, but recent changes in directory structure organization
+suggest that somewhere in /opt may be more suitable.
+
+Bear one other factor in mind when choosing a location for the lsof
+executable -- it usually is a shared executable, requiring access
+to shared libraries.  Thus, locations like /sbin or /usr/sbin are
+probably unsuitable.
+
+Once you've chosen a location for the executable you may find that
+the location for the man page follows -- e.g., if the executable
+goes in /usr/local/etc, then the man page goes in /usr/local/man.
+If the executable location doesn't imply a location for the man
+page, you'll have to let local custom guide you.
+
+
+Setuid-root Lsof Dialect Versions
+=================================
+
+These dialect versions should be installed with setuid-root
+permission -- i.e., the lsof binary should be owned by root and
+its setuid execution bit (04000) should be set.
+
+	AIX 5L and above for full use of the -X option
+	Apple Darwin 8.x for Power Macintosh systems
+	PSTAT-based HP-UX 11.11 and 11.23
+	/proc-based Linux (generally 2.1.72 and above)
+
+
+Setgid Lsof Dialect Versions
+============================
+
+These dialect versions should be installed with setgid permission,
+owned by the group that can read kernel memory devices such as
+/dev/drum, /dev/kmem, /dev/ksyms, /dev/mem, /dev/swap.  ACLs may
+be another mechanism (e.g., under AIX or Solaris 8) you can use to
+grant read permission to the kernel memory devices.
+
+	AIX 4.1.[45], 4.2[.1], and 4.3[.123]
+	Apple Darwin 7.x for Power Macintosh systems
+	DEC OSF/1, Digital UNIX, Tru64 UNIX 2.0, 3.2, 4.0, and 5.[01]
+	FreeBSD 2.1.6, 2.2[.x], 3.x, 4.x, 5.x and [67].x
+	/dev/kmem-based 11.00
+	NetBSD 1.[456], 2.x and 3.x
+	NEXTSTEP 3.[13]
+	OpenBSD 2.[89] and 3.[0-9]
+	OPENSTEP 4.x
+	Caldera OpenUNIX 8
+	SCO OpenServer 5.0.[46]
+	SCO UnixWare 7.0 and 7.1.[0134]
+	Solaris 2.6, 8, 9 and 10
+	Ultrix 4.2 (no longer available)
+
+====================================
+Porting lsof 4 to a New UNIX Dialect
+====================================
+
+If you're brave enough to consider this, look at the 00PORTING
+file.  Please contact me before you start.  I might be able to help
+you or even do the port myself.
+
+Don't overlook the contrib/ directory in pub/tools/unix/lsof on my
+ftp server, lsof.itap.purdue.edu.  It contains user-contributed ports
+of lsof to dialects I don't distribute, because I can't test new
+revisions of lsof on them.
+
+
+=========================
+Quick Start to Using lsof
+=========================
+
+For information on how to get started quickly using lsof, consult
+the 00QUICKSTART file of the lsof distribution.  It cuts past the
+formal density of the lsof man page to provide quick examples of
+using lsof to solve common open file display problems.
+
+
+======================
+Cross-configuring Lsof
+======================
+
+Using environment variables it is possible to Configure (and possibly
+build) lsof for one UNIX dialect on a different one -- e.g., you
+are running Configure on a Linux 2.3 system and you want to Configure
+and build lsof for Linux 2.4.
+
+See the 00XCONFIG file of the lsof distribution for a discussion
+of how to do this.
+
+
+====================================================
+Environment Variables Affecting the Configure Script
+====================================================
+
+Configure script actions can be modified by introducing values to
+the script via environment variables.  In many cases the environment
+variable values take the place of test operations the Configure
+script makes.
+
+For more information on environment variables that can affect
+Configure, consult the 00XCONFIG file of the lsof distribution.
+See the General Environment Variables sections for descriptions of
+ones that affect all dialects.  Consult the Dialect-Specific
+Environment Variables section for ones that might affect the dialect
+you are trying to configure.
+
+
+Vic Abell <abe@purdue.edu>
+April 24, 2007
diff --git a/lsof_4.85/lsof_4.85_src/00TEST b/lsof_4.85/lsof_4.85_src/00TEST
new file mode 100644
index 0000000..2b8038d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00TEST
@@ -0,0 +1,1019 @@
+
+			The Lsof Test Suite
+
+			    Contents
+
+		A.  Introduction
+		    1.  Test Suite Goals
+		    2.  Not a FAQ
+		    3.  Where have the tests been tested?
+		B.  Test Methodology
+		    1.  Test Limitations
+		    2.  Test Data Base and Scripts
+		    3.  The Makefile
+			3.1 The CkTestDB Script
+		    4.  The Lsof Executable and LT_LSOF_PATH
+		    5.  Automated Testing
+		C.  Configure Script Participation
+		    1.  config.cc
+		    2.  config.cflags
+			2.1  config.cflags Contents
+		    3.  config.ldflags
+		    4.  config.xobj
+		D.  Cleaning -- Quick or Spotless
+		E.  Test Libraries
+		    1.  LTlib.c
+		F.  The Individual Tests
+		    1.  LTbasic, a Basic Lsof Test
+		    2.  LTbigf, Test Sizes and Offsets for Large
+			(> 32 bit) Files
+		    3.  LTdnlc, Test the Kernel's Dynamic Name Lookup
+		        Cache
+		    4.  LTlock, Lock Tests
+		    5.  LTnfs, NFS Test
+		    6.  LTnlink, Link Count Test
+		    7.  LTsock, Test IPv4 Sockets
+		    8.  LTszoff, Test Sizes and Offsets for Small
+			(< 32 bit) Files
+		    9.  LTunix, Test UNIX Domain Sockets
+		Appendix A, Test Files
+		Appendix B, Test Validations
+		Appendix C, Test Failures
+
+
+A. Introduction
+===============
+
+Lsof has an automated test suite whose components are located in
+the tests/ sub-directory of the lsof top-level directory.  Configuring,
+building and testing lsof can be done with these shell commands:
+
+    $ Configure -n <dialect-abbreviation>
+    $ make
+    $ cd tests
+    $ make
+
+That's all there is to it!
+
+But read on for more dirty details.
+
+A.1. Test Suite Goals
+=====================
+
+The lsof test suite attempts to test basic lsof features.  It does
+not promise to test every lsof feature for every supported dialect.
+(That's a nearly impossible goal.)
+
+As a result, the test suite cannot promise that every lsof feature
+works as documented.  At best the test suite gives some assurance
+that basic, standard and some optional lsof features work.
+
+A.2. Not a FAQ
+==============
+
+One caution: this is not a frequently asked questions (FAQ) file
+for the lsof test suite.  FAQs on the lsof test suite will be found
+in the one and only lsof FAQ in file 00FAQ of the lsof distribution,
+or on-line at:
+
+    ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
+
+A.3. Where have the tests been tested?
+======================================
+
+OK, I just said this isn't an FAQ and here comes a question and
+answer that looks like an FAQ.  Consider it a very frequently asked
+question and indulge me -- let me answer it here.
+
+The lsof test suite hasn't been tested everywhere it might be
+possible to build lsof successfully.  That "everywhere" includes
+dialect versions -- e.g., Solaris < 2.6 -- to which I no longer
+have access.  On some dialect versions to which I have access, some
+tests won't run because the test system lacks support.
+
+In "Appendix B, Test Validations" I've tried to list where I compiled
+and tested the test suite and information on any tests I was unable
+to run.  In "Appendix C, Test Failures" I list where the test suite
+fails and why it failed.
+
+A.4 Where are the tests?
+========================
+
+This is another FAQ whose answer is that the tests are in the tests/
+sub-directory of the main lsof source directory.
+
+
+B. Test Methodology
+===================
+
+The test suite is made up of individual C programs.  Test setup is
+performed by the lsof Configure script itself, which writes a set
+of dialect configuration files in the tests/ subdirectory.  (See
+"C. Configure Script Participation.")
+
+Each program or script performs a specialized tests.  Those tests
+are described below in "F. The Individual Tests".
+
+Each test measures lsof functionality by putting a specific lsof
+command execution at the end of an in-bound (to the test) pipe.
+The caller asks lsof to write its results to the pipe in field
+output form.  (See the -F option in the lsof man page.)
+
+Using an in-bound lsof pipe allows the tests to measure a great
+deal of lsof functionality, including as an interesting side effect,
+the performance of field output.  Consequently, there's no special
+field output test.
+
+B.1. Test Limitations
+=====================
+
+One limitation of the tests is that they don't measure lsof formatted
+output -- i.e., the output normally see when lsof is run.  There
+are just too many variants of lsof output produced across the range
+of dialects where lsof runs, so field output is a more consistent
+way to process lsof output.
+
+But using field output does mean that the test suite doesn't check
+for lsof formatting problems, except in the field output itself.
+
+B.2. Test Data Base and Scripts
+===============================
+
+The TestDB file contains a simple data base that describes where
+the tests have been validated.  Entries are formed from a combination
+of the lines in the config.cflags file produced by the lsof Configure
+script.  The entries can be considered "lsof dialect footprints,"
+hereafter simply called "dialect footprints" or just "footprints."
+
+Two shell scripts support TestDB.  The first, Add2TestDB, will add
+a footprint to TestDB.  I don't recommend you use this script.
+Mostly it's for my use when I find that the test suite has been
+validated on a new dialect.
+
+It's also possible to add a footprint to TestDB by simply editing
+TestDB and pasting into it a copy of the footprint reported by a
+failed Makefile rule.  I don't generally recommend this be done,
+either.
+
+There are Makefile rules that use (and avoid) the CkTestDB script.
+(See "B.3 The Makefile".)
+
+The default (i.e., "all") Makefile rule uses the CkTestDB script
+to look for the footprint in TestDB. If no footprint is found, the
+script issues a warning, displays the unfound footprint, and asks
+if running the test suite should continue.
+
+The "auto" Makefile rule also uses CkTestDB, but with a special
+call that causes CkTestDB to look in TestDB for the footprint,
+report it when it can't be found, and then fail.  That CkTestDB
+failure causes the "auto" rule to fail, too.
+
+The "silent" Makefile rule doesn't use CkTestDB to look in TestDB
+for the footprint.  It runs the standard and basic tests as silently
+as possible, then returns a failure or success exit code that
+signals the result of the running of the tests.  (Use the "silent"
+rule carefully, because it will skip proving the tests have previously
+run on the dialect.)
+
+B.3. The Makefile
+=======================
+
+The Makefile runs the tests in the test suite.  It has these rules.
+
+    all         runs the basic test and the standard tests,
+		interacting with the caller should the footprint
+		not be found in TestDB.
+
+		(This is the default rule.)
+
+    auto        runs the basic test and the standard tests on a
+		previously validated system as silently as possible.
+
+		The footprint must be found in TestDB for this rule
+		to succeed.  (See the "silent" rule for one that
+		avoids checking TestDB.)
+
+		This rule is designed for lsof build scripts that
+		want a quick noiseless test to make sure what they
+		built works as it previously did.
+
+		This rule calls CkTestDB in a way that inhibits
+		its normal go-ahead request. (See "B.2.1 The CkTestDB
+		Script".)  If CkTestDB finds the footprint and all
+		tests succeed, this rule returns a zero exit code
+		(success).  If the footprint isn't found or if any
+		test fails, a non-zero exit code (failure) is
+		returned.
+
+    ckDB        calls the CkTestDB script to look for a footprint.
+		If none is found, the way CkTestDB was called (See
+		"B.3.1 The CkTestDB Script".) causes it to return
+		a non-zero exit code (failure) to this rule, and
+		the rule then returns a non-zero exit code (failure)
+		itself.
+
+		This rule is used by the "auto" rule.  If this rule
+		succeeds (zero exit code), the "auto" rule then
+		uses the "silent" rule.
+
+    clean       removes test and compiler output.  (See the "D.
+		Cleaning -- Quick or Spotless" section.)
+
+    opt		runs the optional tests.
+    optional
+
+    silent      runs the lsof basic and standard tests as silently
+		as possible (as the "auto" rule does), but without
+		using CkTestDB to look for a footprint.  If all
+		tests succeed, the rule returns a zero exit code
+		(success).  If any test fails, the rule returns a
+		non-zero exit code (failure).
+
+		Use the "silent" rule carefully, because it will
+		skip proving the tests have previously run on the
+		dialect.
+
+    spotless    does what the clean rule does and also removes the
+		config.* files created by ../Configure.  (See the
+		"D. Cleaning -- Quick or Spotless" section.)
+
+    std		runs the basic test and the standard tests.
+    standard
+
+The Makefile cleaning rules are further described in "D.  Cleaning
+-- Quick or Spotless."
+
+B.3.1 The CkTestDB Script
+=========================
+
+Some Makefile rules (e.g., "all" and "auto") use the CkTestDB script
+to make sure the tests have been run previously on the dialect.
+CkTestDB does that by looking for the dialect's footprint in TestDB.
+
+If no footprint is found, and if standard input is a TTY, CkTestDB
+asks for a go-ahead signal.  If standard input isn't a TTY, CkTestDB
+aborts the test run.  (See "B.2. Test Data Base and Scripts".)
+
+The Makefile "silent" rule does not call CkTestDB.  use the "silent"
+rule carefully, because it will skip proving the tests have previously
+run on the dialect.
+
+B.4. The Lsof Executable and LT_LSOF_PATH
+=========================================
+
+Normally the programs in the test suite use the lsof executable in
+their parent directory, ../lsof.  Usually that lsof has just been
+built and testing it is the next logical step.
+
+Be careful that ../lsof has sufficient permission to access the
+necessary kernel resources -- e.g., /dev/kmem, /dev/mem, /proc,
+etc.  If it doesn't the tests will fail.  (The tests do check to
+see if they can open /dev/mem and /dev/kmem for read access if
+LT_KMEM is defined in config.cflags and if the path to the lsof
+executable is ../lsof.)
+
+Here are two possible ways you can make sure the lsof being tested
+has sufficient permission: 1) use chmod and chgrp to enable its
+running and put its path in LT_LSOF_PATH, thus disabling the check
+in the tests for kernel memory access; or 2) run the tests (and
+hence the lsof being tested) under a login that has sufficient
+permission -- e.g., is in a group that can read /dev/kmem.
+
+You can direct the tests to use a different lsof executable by
+specifying its path in the LT_LSOF_PATH environment variable.  To
+test an lsof executable already installed in /usr/local/etc --
+provided that lsof is at revision 4.63 or higher -- do this:
+
+    $ LT_LSOF_PATH=/usr/local/etc/lsof
+    $ export LT_LSOF_PATH
+    $ cd .../lsof_<version>/tests
+    $ make
+
+When you specify an alternate executable path via LT_LSOF_PATH,
+that also prevents the tests from checking to see if they have
+kernel memory access.
+
+B.5 Automated Testing
+=====================
+
+Normally the lsof test suite is wordy and may require interaction.
+When you want to avoid those interferences, use the Makefile "auto"
+or "silent" rules.  (See the description of the "auto" and "silent"
+rules in "B.3 The Makefile".)
+
+The footprint must be present in TestDB in order to use the "auto"
+rule.  If it is not, the "auto" rule will fail and report the
+missing footprint.  Footprints in TestDB proclaim that the tests
+have previously succeeded on the dialect.
+
+The footprint need not be present in TestDB in order to use the
+"silent" rule.  Use the "silent" rule carefully, because it will
+skip proving the tests have previously run on the dialect.
+
+
+C. Configure Script Participation
+=================================
+
+An important step in setting up the test suite is performed by the
+Configure script in the lsof home directory (the parent to tests/.)
+
+Configure writes four files in tests/ that describe how the tests
+are to be compiled, configured and loaded.  The files also describe
+options that Configure selected that are important to the test
+suite.
+
+C.1. config.cc
+==============
+
+This file, config.cc, contains the name of or the path to the C
+compiler used to compile lsof.  The Makefile uses this file in
+place of the standard make(1) CC string with a shell in-place
+execution statement -- i.e., `cat config.cc`.
+
+If the LSOF_CC environment variable is supplied to the lsof Configure
+script, its value will appear in the config.cc file.
+
+C.2. config.cflags
+==================
+
+This file, config.cflags, contains C compiler flags that Makefile
+uses to compile the C programs in the test suite.  As with the
+compiler file, config.cc, the make rules incorporate the contents
+of this file into C compiler options with `cat config.cflags`.
+
+This file is also used by the Add2TestDB and CkTestDB shell scripts
+to build and match footprints.  (See "B.2. Test Data Base and
+Scripts.")
+
+C.2.1 config.cflags Contents
+============================
+
+The config.cflags file may contain the following C compiler flags.
+
+
+    -DLT_AIXA               is present if lsof was built for AIX.
+			    It contains the AIX architecture flag.
+			    (See the lsof Configure script or
+			    dialects/aix/dlsof.h for more information
+			    on the AIX architecture flag.)
+
+    -DLT_BIGF		    is present if lsof was built for a dialect
+			    that has large file (sizes and offsets >
+			    32 bits).
+
+    -DLT_CC		    is present if the lsof compiler is cc.
+
+    -DLT_DIAL_<abbr>	    always ends in (the <abbr> part) the
+			    "canonical" -- i.e., usually the most
+			    common abbreviation by which the dialect
+			    is known.
+
+			    Example: -DLT_DIAL_solaris
+
+    -DLT_GCC		    is present if the lsof compiler is gcc.
+
+    -DLT_K64		    is present if lsof has been built for a
+			    64 bit kernel
+
+    -DLT_KMEM		    is present if lsof has been built to
+			    use /dev/kmem to obtain kernel values.
+
+    -DLT_VERS=<vn>	    contains the version number for the
+			    dialect, as used in lsof pre-processor
+			    tests.
+
+			    Example for Solaris 10: -DLT_VERS=100000
+
+    -DLT_VPATH		    is present if the dialect has the v_path
+			    member in the vnode structure (e.g., some
+			    versions of Solaris 10).
+
+The config.cflags file may also contain dialect-specific compiler
+flags needed to activate a specific feature on the dialect.  For
+example, for HP-UX config.cflags might contain:
+
+    -D_LARGEFILE64_SOURCE   This compiler flag enables the use of
+			    large-file system library functions
+			    --e.g., open64().
+
+			    The lsof Configure script stanzas for
+			    the dialects select these options.
+
+
+C.3. config.ldflags
+===================
+
+This file, config.ldflags, contains the dialect loader flags --
+i.e., the equivalent to make(1) LFLAGS -- for loading the test
+programs.
+
+Example for Solaris: -lsocket           this adds the socket library
+					to the loading of the lsof
+					test programs.
+
+Example for UnixWare: -lsocket -lnsl    this adds the socket and
+					name server libraries to
+					the loading of the lsof
+					test programs.
+
+
+C.4. config.xobj
+================
+
+This file, config.xobj, contains the paths to any extra object
+files (.o's) that must be loaded when the test suite C programs
+are loaded.  Like config.cc and config.cflags, it's incorporated
+into the loader statements of the Makefile's rules with `cat
+config.xobj`.
+
+Examples for DEC OSF/1 and NEXTSTEP:
+
+    ../lib/snpf.o       this loads the private lsof object file
+			that contains an snprintf() function.  (The
+			DEC OSF/1 4.0 and NEXTSTEP 3.1 C libraries
+			don't have snprintf().)
+
+
+D. Cleaning -- Quick or Spotless
+================================
+
+There are two Makefile rules that clean the tests/ subdirectory --
+"clean" and "spotless".  They cause different degrees of cleaning.
+
+    clean       a "quick" clean that removes compiled object files,
+		executables and test files.  It does NOT remove
+		the configuration files that ../Configure and the
+		config.perl rule wrote.
+
+    spotless    cleans out everything clean does -- plus the
+		configuration files that ../Configure and the
+		config.perl rule wrote.
+
+		This is the rule used when `./Configure -clean` is
+		specified.  If this rule is used, `../Configure -n
+		<abbr>` and `../make`) must be run again before
+		the test suite can be used.
+
+
+E. Test Library
+===============
+
+The lsof test suite provides a C library.
+
+E.1. LTlib.c
+============
+
+This is a C library of common functions used by tests.  Configured
+at compile time by the contents of config.cflags, it uses the single
+header file LsofTest.h.  LsofTest.h tailors its definitions to the
+dialect at compile time, using the LT_DIAL_* definitions in
+config.cflags.
+
+Two particularly useful functions in the library are: ExecLsof(),
+which will execute an lsof child process; and RdFromLsof(), which
+will read from the in-bound lsof pipe, and decode the fields into
+structures that are easy for C programs to process.
+
+This library is a good model for processing field output in a C
+program from an in-bound lsof pipe.
+
+The source for the library, LTlib.c, contains more documentation.
+
+
+F. The Individual Tests
+=======================
+
+The individual tests are listed in this section.  The listings
+explain what the tests do, a few errors they might report, and how
+to use options and environment variables to customize the tests.
+
+The test descriptions are listed in this section in alphabetical
+order, not in the order they are run by Makefile.
+
+The Makefile runs the tests in three groups, basic tests, standard
+tests, and optional tests.  The default make "all" rule runs the
+basic and standard tests.  (The "standard", "std", and "test"
+Makefile rules are synonyms to "all".) If the standard tests succeed,
+Makefile suggests running the optional tests with the "opt" (or
+"optional") rule.
+
+The Makefile "auto" and "silent" rules run only the basic and
+standard tests.  They do not run or suggest you run the optional
+tests.
+
+    The basic test:
+	LTbasic
+
+    Standard tests:
+	LTnlink
+	LTsock
+	LTszoff
+	LTunix
+
+    Optional tests:
+	LTbigf
+	LTdnlc
+	LTlock
+	LTnfs
+
+The basic and standard tests should all succeed on all dialects,
+although LTnlink may warn that it can't perform its unlink test on
+an NFS file system.
+
+The optional tests may run, they may be disabled for specific
+dialects, or they may fail because of special resource needs --
+e.g., LTbigf will run only on UNIX dialects where it knows how to
+handle files whose lengths exceed 32 bits, and LTnfs needs access
+to an NFS file system mounted from a remote NFS server.
+
+Tests that need special resources usually provide a hint about the
+resources when they fail.  Information about special resource needs
+may also be found in the following sections about the individual
+tests.
+
+G.1. LTbasic, a Basic Lsof Test
+===============================
+
+This is the basic lsof test.  If it doesn't run, it's not likely
+any other tests will run, either.  Hence, if it fails, no Makefile
+rule runs any other tests.
+
+This test uses lsof to locate files in the lsof process, including
+current working directory, the lsof executable, and the /dev/kmem
+open file.
+
+Finding the lsof executable may not be possible on AIX if lsof was
+compiled without support for its -X option.
+
+Finding /dev/kmem use by lsof is only possible on dialects where
+lsof uses /dev/kmem.  The -DLT_KMEM define indicates that.
+
+Run this test:
+
+    $ ./LTbasic
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.2. LTbigf, Test Sizes and Offsets for Large (> 32 bit) Files
+==============================================================
+
+This is a test in the optional test group.
+
+This test is effective only when ../Configure has put -DLT_BIGF in
+config.cflags.  Without that definition this test simply reports
+that the dialect doesn't support large files.  That report is
+accompanied by a successful test exit code, so that the runner of
+the test (e.g., the Makefile) won't believe the test failed.
+
+When a dialect does support large files, the test attempts to create
+a file that looks very large -- e.g., has a length as reported by
+ls(1) of 0x140000000 bytes.  However, the file really has only a
+small amount of data in it, the rest of the file consists of a
+large standard UNIX file system "hole."
+
+By default the test file is named config.LTbigf<PID>, where PID is
+the Process ID of the LTbigf process.
+
+When that file is not on a file system enabled for large files, or
+when the process that runs LTbigf can't create a big file, LTbigf
+will report an error.  The error will be accompanied by hints that
+the -p option may need to be used to define a path where the test
+can write a large file, or the process ulimit file block size may
+need to be raised -- e.g., to "unlimited."
+
+LTbigf can't test file offset reporting on Linux kernels below
+2.6.22, because the /proc file systems of those kernels don't make
+file offsets available to lsof.
+
+Run this test:
+
+    $ ./LTbigf [-p <path>]
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.3. LTdnlc, Test the Kernel's Dynamic Name Lookup Cache
+========================================================
+
+This is a test in the optional test group.
+
+This test asks lsof to locate the current working directory of its
+own process and report the path it has assembled from the components
+it found in the kernel's Dynamic Name Lookup Cache (DNLC) or via
+other dialect-specific methods.  (E.g., Linux, HP-UX 11.11, and
+some Tru64 UNIX versions have private name lookup methods.)
+
+The test checks what lsof reports as the current working directory
+path for any missing components and counts the number of full paths
+returned.  (Symbolic link complications prevent testing for exact
+path matches.)  The test is repeated.  If full paths are returned
+at least half the time, the test considers itself successful.
+
+This test can't be run on AIX, because lsof can't access the DNLC
+there.  It can't be run on Apple Darwin versions below 8.0, either,
+because insufficiently reliable DNLC information is available there.
+This test may fail on other dialects when the file system -- e.g., NFS.
+/tmp, loopback -- doesn't fully participate in the dialect's DNLC.
+
+Run this test:
+
+    $ ./LTdnlc
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.4. LTlock, Lock Tests
+=======================
+
+This is a test in the optional test group.
+
+This test uses flock() and fcntl() to set and clear file locks,
+and measures lsof's ability to report them.  The choice of system
+lock call is based on the dialect.  (There are LT_DIAL_* pre-processor
+tests in LTlock.c.)
+
+This test can't be run on an NFS client file system, because NFS
+lock information is kept on the server.  Lsof on the client can't
+see that server kernel data.
+
+By default the test attempts to create a file named config.LTlock<PID>,
+where PID is the Process ID of the locking test process.  It uses
+lsof to determine if the file is on a client NFS file system.  If
+it is, the test aborts, hinting that the -p option can be used to
+specify a non-client-NFS test file path.
+
+This test can't be run on Darwin, because insufficient file system
+lock information is available to lsof there.
+
+Run this test:
+
+    $ ./LTlock [-p <path>]
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.6. LTnfs, NFS Test
+====================
+
+This is a test in the optional test group.
+
+This test verifies that lsof can locate files mounted on a client
+NFS system from an NFS server.
+
+By default it creates a test file, config.LTnfs<PID>, where PID is
+the Process ID of the test process.  The test then uses lsof to
+find the file on an NFS file system.
+
+If lsof can't find the file the test warns that the test file might
+not be on an NFS file system and hints that the -p option may be
+used to specify the path of an NFS file, provided the test can have
+read access to it there.  The test warning also states that the
+file at the path specified with -p must be a regular file, not a
+directory.
+
+This test can't be run on Darwin versions below 8.0, because
+insufficient NFS file information is available to lsof there.
+
+Run this test:
+
+    $ ./LTnfs [-p <path>]
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.7. LTnlink, Link Count Test
+=============================
+
+This is a test in the standard test group.
+
+The test checks lsof's reporting of link count (nlink in UNIX
+argot.)
+
+It creates a test file in the current working directory named
+config.LTnlink<PID>, where  PID is the Process ID of the test
+process.  It then uses stat(2) and lsof to measure the link count
+of the file.
+
+If LTnlink creates the test file in the current working directory
+and it is on an NFS file system, LTnlink won't be able to perform
+one section of its test.  In that section the test file is unlinked
+so its link count will be zero and lsof is asked to find it among
+the set of files whose link counts are zero.
+
+When an NFS file is unlinked its link count isn't reduced until
+the last open instance is closed on either the NFS clients or the
+NFS.  That's a consequence of NFS statelessness and leads to the
+occasional presence of files with names of the form .nfsxxxx.
+
+Should LTnlink find its test file on an NFS file system, it disables
+the unlink section of its tests and issues a warning.  It also
+issues a hint that the test file path can be named via the -p option
+to give a test file location that isn't on an NFS file system.
+
+This test can't be run on Darwin, because insufficient file system link
+count information is available to lsof there.
+
+Because some UNIX dialects delay the reporting of a link count
+update after a file has been unlinked, LTnlink may not get its
+expected response from lsof for a while after the test file has
+been unlinked.  In that cause LTnlink may delay for up to a minute,
+calling lsof once every two seconds and displaying a "waiting for
+link count update: ..." message.
+
+Some file systems -- e.g., ZFS on Solaris 11 -- don't allow LTnlink to
+unlink its test file, because LTnlink has the file open.  LTnlink
+explains that failure and suggests that it be run with path of the "-p
+path" option set to a file on /tmp.  See 00FAQ for more information.
+
+Run this test:
+
+    $ ./LTnlink [-p <path>]
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.7. LTsock, Test IPv4 Sockets
+==============================
+
+This is a test in the standard test group.
+
+This test uses lsof to locate open IPv4 socket files that the test
+has created itself.  The test opens a server socket, then forks a
+child process to connect to that socket.  After both are running,
+the test uses lsof to find the open socket files at their known
+host and port addresses.
+
+Run this test:
+
+    $ ./LTsock
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.8. LTszoff, Test Sizes and Offsets for Small (< 32 bit) Files
+===============================================================
+
+This is a test in the standard test group.
+
+This test checks lsof's reporting of file size and offset for small
+(< 32 bits) files.
+
+It creates a test file in the current working directory named
+config.LTszoff<PID>.  PID is the Process ID of the test process.
+
+LTszoff can't test file offset reporting on Linux kernels below
+2.6.22, because the /proc file systems of those kernels don't make
+file offsets available to lsof.
+
+Run this test:
+
+    $ ./LTszoff [-p <path>]
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+G.9.  LTunix, Test UNIX Domain Sockets
+======================================
+
+This is a test in the standard test group.
+
+This test checks lsof's reporting of UNIX domain sockets.
+
+The test creates a pair of UNIX domain sockets and uses bind(2) to
+associate the file system names config.LT0U<PID> (client) and
+config.LT1U<PID> (server) with them.  (PID is the test process ID.)
+The test then uses lsof to find the two open UNIX domain socket
+files.
+
+Run this test:
+
+    $ ./LTunix
+
+Environment variables: LT_LSOF_PATH defines the path to the lsof
+		       executable.  (The default is ../lsof.)
+
+
+Appendix A, Test Files
+======================
+
+These files may be created by suite tests.
+
+			Created
+    ./tests Name	by Test	    Use
+    ============	=======	    ===
+
+    config.LTbifg**     LTbigf      to test lsof's large file size
+				    and offset reporting
+
+    config.LTlock*	LTlock	    for locking tests
+
+    config.LTnfs*	LTnfs	    for NFS tests
+
+    config.LTnlink*	LTnlink	    for link count tests
+
+    config.LTszoff*     LTszoff     for small file size and and
+				    offset reporting
+
+    config.LT[01]U*     LTunix      two UNIX domain sockets, used
+				    to determine if lsof can report
+				    their open instances properly
+
+
+Appendix B, Test Validations
+============================
+
+This appendix lists the UNIX dialects and their versions where I
+have validated the test suite.  The list indicates the particular
+tests I was unable to run, mostly LTnfs because the test systems
+I used had no NFS file systems mounted.
+
+The information in the following table is encoded in a test data
+base file, TestDB, as footprints, using the tests compiler options
+written to config.cflags by the lsof Configure script.  See "B.2.
+Test Data Base and Scripts" for more information on the test data
+base, footprints, and the scripts that support them.
+
+    UNIX
+    Dialect	  Dialect Description		Untested Tests
+    ======= 	  ===================		==============
+    AIX		  4.3.3, Power, cc
+		  5.1, Power-32, cc
+		  5.1, Power-32, gcc
+		  5.1, Power-64, cc
+		  5.2, Power-32, cc
+		  5.2, Power-32, gcc
+		  5.2, Power-64, cc
+		  5.2, Power-64, gcc
+		  5.3, Power-64, cc
+    Darwin        1.4, 5.5, 6.x, 7.x gcc	Darwin lsof doesn't
+						have adequate support
+						to allow the LTbigf,
+						Ltdnlc, LTlock, LTnfs,
+						and LTnlink tests to
+						run.
+		  8.0, gcc			Darwin lsof doesn't
+						have adequate support
+						to allow the LTbigf,
+						LTlock and LTnlink
+						tests to run.
+		  9.0, gcc			Darwin lsof doesn't
+						have adequate support
+						to allow the LTlock
+						test to run.
+		  10.0, gcc			Darwin lsof doesn't
+						have adequate support
+						to allow the LTlock and
+						LTnlink tests to run.
+    FreeBSD       4.5, i386, gcc
+		  4.6, i386, gcc
+		  4.7, i386, gcc
+		  4.8, i386, gcc
+		  4.9, i386, gcc
+		  4.10, i386 gcc
+		  5.0, Alpha, gcc
+		  5.0, Sparc, gcc
+		  5.0, i386, gcc
+		  5.1, Alpha, gcc
+		  5.1, Amd64, gcc
+		  5.1, Sparc, gcc
+		  5.1, i386, gcc
+		  5.2, i386, gcc
+		  5.2, Alpha, gcc
+		  5.2, Amd64, gcc
+		  5.2, Sparc, gcc
+		  5.3, Alpha, gcc
+		  5.4, Alpha, gcc
+		  5.5, Alpha, gcc
+		  6.0, Alpha, gcc
+		  6.0, Amd64, gcc
+		  6.0, Sparc, gcc
+		  6.1, i386, gcc
+		  6.4, i386, gcc
+		  7.0 Alpha, gcc
+		  7.0 Amd64, gcc
+		  7.1 Amd64, gcc
+		  7.2 Amd64, gcc
+		  7.3 Amd64, gcc
+		  7.4 Amd64, gcc
+		  8.0 Amd64, gcc
+		  9/0 Amd64, gcc
+    DEC OSF/1	  4.0, cc
+    HP-UX	  10.20, cc			LTbigf
+		  10.20, gcc (1)		LTbigf
+		  11.00-32, ANSI-C		LTbigf, LTnfs
+		  11.00-64, ANSI-C
+		  11.11, ANSI-C
+		  11.23, ANSI-C
+    Linux         2.4.12-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.18-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.21-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.23-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.24-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.25-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.26-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.27-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.28-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.29-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.4.30-686            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.6.1-rc2	            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.6.18-686	            	LTbigf, no offset tests
+						LTszoff, no offset tests
+		  2.6.22-686			(Note: this Linux kernel
+						 supplies file offsets to
+						 lsof.)
+		  2.6.32-686			(Note: this Linux kernel
+						 supplies file offsets to
+						 lsof.)
+		  2.6.38-686
+    NEXTSTEP      3.1, gcc                   	LTnfs
+    NetBSD        1.4.1, Alpha, gcc          	LTnfs
+		  1.5x, x86, gcc           	LTnfs
+		  1.6x, Alpha, gcc		LTnfs
+		  1.6x, x86, gcc		LTnfs
+		  2.0x, alpha, gcc		LTnfs
+		  2.0x, sparc64, gcc		LTnfs
+		  2.0x, x86, gcc		LTnfs
+		  2.99.9, x86, gcc		LTnfs
+		  2.99.10, x86, gcc		LTnfs
+		  2.99.11, x86, gcc		LTnfs
+		  2.99.12, x86, gcc		LTnfs
+		  3.99., x86, gcc		LTnfs
+    OpenBSD       3.0, gcc
+		  3.1, gcc
+		  3.2, gcc
+		  3.3, gcc
+		  3.4, gcc
+		  3.5, gcc
+		  3.6, gcc
+		  3.7, gcc
+		  3.9, gcc
+    OPENSTEP	  4.2, gcc			LTnfs
+    OSR           5.04, cc              	LTnfs
+		  5.06, cc              	LTnfs
+    Solaris       2.6, cc			LTnfs
+		  2.6, gcc			LTnfs
+		  7-32, cc
+		  7-32, gcc			LTnfs
+		  8-32, cc
+		  8-32, gcc
+		  8-64, cc
+		  8-64, gcc
+		  9-64, Beta-Refresh, cc
+		  9-64, Beta-Refresh, gcc
+		  9-64, FCS, cc
+		  9-64, FCS, gcc
+		  10-32, i86pc, gcc
+		  10-32, i86pc, cc
+		  10-64, Sparc, cc
+		  10-64, Sparc, gcc
+		  11-64, Amd64, cc
+    Tru64 UNIX    5.0, cc
+    Tru64 UNIX    5.0, cc
+		  5.1, cc
+    UnixWare      7.1.1, NSC, cc            	LTnfs
+		  7.1.3, cc
+		  7.1.4, cc
+
+If you are able to run the test suite on dialect versions other
+than the ones listed above, please send e-mail to <abe@purdue.edu>,
+indicating the dialect version where you were able to run the test
+suite.  Please send me the footprint formed by CkTestDB, or run
+the Add2TestDB script and send me the footprint it reports.
+
+If you encounter problems compiling the tests or running them on
+a dialect version listed above, please send e-mail to <abe@purdue.edu>,
+naming the dialect version and providing the output from the lsof
+Configure script and make operation.
+
+1) John Dzubera did the HP-UX 10.20 gcc testing and provided its
+   footprint.
+
+
+Appendix C, Test Failures
+=========================
+
+I was unable to make the test suite run on the following dialects.
+
+    UNIX Dialect
+    and Description	 Failure
+    ===============	 =======
+    HP-UX 11-64, gcc     64 bit gcc 3.0 didn't compile the LTsock
+			 test correctly on my 64 bit HP-UX 11 test
+			 system.
+
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src/00XCONFIG b/lsof_4.85/lsof_4.85_src/00XCONFIG
new file mode 100644
index 0000000..c89ae8e
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/00XCONFIG
@@ -0,0 +1,703 @@
+
+			Cross-configuring Lsof
+
+Introduction
+============
+
+Lsof cross-configuration is useful when the target dialect or target
+dialect version for which lsof is to be configured and built differs
+from the one on which the Configure operation is done.
+
+Marty Leisner <leisner@sdsp.mc.xerox.com> suggested the method
+described here for lsof cross-configuration, and he supplied
+modifications to the Configure script for cross-configuring Linux
+lsof.
+
+Marty says:
+
+    "I used this to successfully compile (lsof) on the same machine
+     for (Linux) 2.0.30 and 2.1.42.  (I normally don't bring up a
+     2.1.42 machine all the time).  Also it (the 2.0.30 system)
+     doesn't have much storage and compiles on it are slow.
+
+     Set LSOF_VERS if it's not the (version of the) current system.
+     (Actually, you should get the version out of include/linux/version.h.)
+
+     Define LINUX_KERNEL to (the path) where the kernel sources
+     are (located).  (No longer necessary as of lsof revision 4.53.)
+
+     This should work on most systems; they put a kernel in
+     /usr/src/linux, which is the default.
+
+     Now I can just do:
+
+	LINUX_KERNEL=/some/other/kernel LSOF_VERS=2142 ./Configure linux
+
+     Comments?  Its very convenient when running multiple kernels.
+     (It would be (have been) very handy when the structures changed
+     between 2.0.2* and 2.0.30 , or whatever.)
+
+     I run multiple OSes at a time (not to mention multiple
+     architectures.  It's very pleasant to cross-build either
+     operating systems or versions."
+
+So, the situation is that you have lsof sources on a UNIX dialect
+version, and you want to configure them to build lsof for some
+other version of the same dialect, or perhaps for some other UNIX
+dialect altogether.
+
+
+The Cross-Configure Method
+==========================
+
+The lsof cross-configure method uses environment variables to tell
+the lsof Configure script about the target dialect.  The environment
+variables may specify alternate locations for Configure to examine
+when it determines characteristics of the target, or they may
+specify the values Configure would discover when it examined the
+target's characteristics.
+
+Consult each environment variable description for the UNIX dialect
+in which you're interested to see how it affects the operation of
+the Configure script.
+
+The number and values of the variables differ by dialect.  Each
+variable begins with an upper case version of the dialect's Configure
+abbreviation -- e.g., AIX for aix or aixgcc, LINUX for linux,
+UW for uw (UnixWare), etc.
+
+Of course, the UNIX dialect's version is probably different from
+that of the system on which you're doing the cross-configuration,
+so you will need to specify the new version, too.  For example, to
+configure for FreeBSD 3.0 on a 2.1.7 system, where the standard
+3.0 header files are in /3.0/usr/include and the 3.0 system sources
+are in /3.0/sys, do this:
+
+	LSOF_VERS=300 LSOF_INCLUDE=/3.0/usr/include \
+	FREEBSD_SYS=/3.0/sys Configure -n freebsd
+
+
+General Environment Variables
+=============================
+
+There are some environment variables whose names don't begin with
+an upper case rendering of a dialect abbreviation.  Generally they
+apply to all dialects.
+
+AFS_VICE        is for AFS configuration.   It need be set only if
+		lsof supports AFS on your dialect and you want to
+		specify an alternate path to the VICE files.
+
+		default: /usr/vice
+
+LSOF_AR         is the path to and arguments for the library archive
+		application that is used to build the lsof library,
+		liblsof.a.  When this value is placed in the library
+		Makefile as the contents of the AR make string, it is
+		followed by the path to the library and the relative
+		paths of the library module
+
+		default: ar cr
+
+LSOF_ARCH       is the architecture type string for the system.
+		Usually this is the output of `uname -m`.  Consult
+		the Configure script for details.  The LSOF_ARCH
+		value may have to be quoted if it contains spaces.
+
+		default: auto-detection (e.g., from `uname -m`)
+
+LSOF_BLDCMT     may be used to introduce a builder's comment into
+		lsof's -v output.  It defaults to the null string,
+		causing no builder's comment to appear in -v output.
+
+		default: none
+
+LSOF_CC         is the path to the C compiler.  You may need to
+		specify it if your C compiler is in a non-standard
+		place, not found by your path.  If you specify a
+		compiler different from the expected default, you
+		may have to change the compile time flags by
+		specifying new CFGF, CFGL, and DEBUG strings on
+		the make command line.
+
+		default: normally cc, but some dialects have other
+			 defaults and some have auto-detection.
+
+			 Check the dialect stanza in the lsof Configure
+			 script to see how LSOF_CC is set by default.
+
+LSOF_CCV        is the C compiler version.  You should specify it
+		if you have specified a compiler path in LSOF_CC.
+
+		default: the lsof Configure script knows how to find
+			 the version number of gcc and some other
+			 dialect-specific compilers.
+
+			 Check the dialect stanza in the lsof Configure
+			 script to see how lsof_CCV is set by default.
+
+LSOF_CFGF	may be used to specify additional configuration values
+		that will appear in the CFGF string of the Makefile.
+
+LSOF_CFGL	may be used to specify additional library specifications
+		that will appear in the CFGL string of the Makefile.
+
+LSOF_HOST       may be used to specify a value in lsof's -v output
+		other than the name of the host where lsof was
+		built.  A value of "none" inhibits host name display
+		in -v output.
+
+		default: the dialect's host name application -- e.g.,
+			 hostname or uname -n
+
+LSOF_INCLUDE    is the path to the standard header files.  You may
+		need to specify it if you want Configure to test
+		header files in a tree different from /usr/include,
+		and you want to compile lsof from the header files
+		in that different tree.
+
+LSOF_LOGNAME    may be used to specify a value in lsof's -v output
+		other than the one in the LOGNAME environment
+		variable for the login name of the person who built
+		lsof.  A value of "none" inhibits login name display
+		in -v output.
+
+		default: the LOGNAME environment variable
+
+LSOF_MAKE	is the path to the make command.
+
+		deafult: the output of `which make`, if it is not NULL;
+			 otherwise the string "make".
+
+LSOF_MKC        may be used to specify an alternate method of
+		connecting dialect sources to the top-level lsof
+		directory.  See 00PORTING for more information.
+
+		default: ln -s
+
+LSOF_RANLIB	may be used to specify an alternate command for the
+		randomizing of the lsof library.
+
+		default: ranlib for most dialects
+			 none for: IBM AIX; HP-UX; SCO OpenServer; Solaris
+				   and SCO|Caldera UnixWare
+
+LSOF_SYSINFO    may be used to specify a value in lsof's -v output
+		other than the standard system identification --
+		e.g., output from uname.  A value of "none" inhibits
+		system information display in -v output.
+
+		default: the dialect's standard system identification
+			 application output -- e.g., uname, sysinfo
+
+LSOF_USER	may be used to specify a value in lsof's -v output
+		other than the one in the USER environment variable
+		for the login name of the person who built lsof.
+		A value of "none" inhibits login name display in
+		-v output.
+
+		default: the USER environment variable
+
+LSOF_VERS       is the target dialect version number.  It must be
+		stated in the dialect's form -- e.g., FreeBSD 2.0.5
+		is given as 205, Solaris 7 as 70000, etc.  The
+		table, "Abbreviations, Variable Prefixes, and
+		Version Numbers," in this file gives the form for
+		LSOF_VERS for each dialect lsof supports.
+
+		default: auto-detection (e.g., from `uname -r`)
+
+LSOF_VSTR       is the version string from which LSOF_VERS is
+		derived.  Usually this is the output of `uname -r`
+		or `uname -v`.  Consult the Configure script for
+		details.   The LSOF_VSTR value may have to be quoted
+		if it contains spaces.
+
+		default: auto-detection (e.g., output from
+			 `hostname`, `uname -r`, or `uname -v)
+
+
+Make Strings
+============
+
+The CFGF, CFGL, and DEBUG strings can be specified on the make
+command line to change default values placed in the top-level and
+library Makefiles by Configure.  For example, Configure usually
+defines the compiler optimization level to be -O, but you can change
+that with "DEBUG=-g" on the make command -- e.g.,
+
+	$ make DEBUG=-g lsof
+
+Similarly, the CFGF string contains miscellaneous compile-time
+options, and CFGL contains loader options.  Consult the Makefiles
+generated by Configure for the values it defines by default for
+CFGF and CFGL.
+
+As an example, Configure might define CFGL to be "-L./lib -llsof -w"
+for NextStep 3.1; to remove "-w", use this make invocation:
+
+	$ make CFGL="-L./lib -llsof"
+
+
+Abbreviations, Variable Prefixes, and Version Numbers
+=====================================================
+
+The following table describes the relationship between Configure
+abbreviations, environment variable prefixes, and lsof UNIX dialect
+version numbers.  The lsof UNIX dialect version number must be
+declared exactly in the listed form when supplied via the LSOF_VERS
+environment variable.
+
+				Dialect	   Lsof Version
+   Configure	Variable	Version      Number for
+Abbreviation*	  Prefix	 Number       LSOF_VERS
+
+	 aix	     AIX	  3.2.5		   3250
+      aixgcc			  4.1.0		   4100
+				  4.1.4		   4140
+				  4.1.4		   4150
+				  4.2.0		   4200
+				  4.2.1		   4210
+				  4.3		   4300
+				  4.3.1		   4310
+				  4.3.2		   4320
+				  4.3.3		   4330
+				  5.0.x		   5000
+				  5.1.x		   5100
+				  5.2.x		   5200
+				  5.3.x		   5300
+      darwin	  DARWIN	  1.2*		    120
+				  1.3*		    130
+				  1.4*		    140
+				  5.[012]	    500
+				  5.[3-9]	    530
+				  6.x		    600
+				  7.x		    700
+				  8.x		    800
+	  du	      DU	  2.0		  20000
+				  3.0		  30000
+				  3.2		  30200
+				  4.0		  40000
+				  5.0		  50000
+				  5.1		  50100
+     freebsd	 FREEBSD	  1.x		   1000
+				  2.x		   2000
+				  2.0.5		   2005
+				  2.1.x		   2010
+				  2.2.x		   2020
+				  3.x		   30x0
+				  4.x		   40x0
+				  4.1x		   41x0
+				  5.x		   50x0
+				  6.x		   60x0
+				  7.x		   70x0
+				  8.x		   80x0
+				  9.x		   90x0
+	hpux	    HPUX	  9.1		    901
+     hpuxgcc	    HPUX	  9.5		    905
+				  10.0		   1000
+				  10.10		   1010
+				  10.20		   1020
+				  11.00		   1100
+				  11.11		   1111
+      linux	   LINUX	  2.1.x		  21xxx
+				  2.2.x		  22xxx
+				  2.3.x	     	  23xxx
+				  2.4.x		  24xxx
+				  2.6.x		  26xxx
+     netbsd	  NETBSD	  1.2		1002000
+				  1.3		1003000
+				  1.4		1004000
+				  1.5		1005000
+				  1.6		1006000
+				  2.0		2000000
+				  2.99.9        2099009
+				  2.99.10       2099010
+	 ns     NEXTSTEP	  3.1		     31
+    openbsd	 OPENBSD	  1.2		   1020
+				  2.0		   2000
+				  2.1		   2010
+				  2.2		   2020
+				  2.3		   2030
+				  2.4		   2040
+				  2.5		   2050
+				  2.6		   2060
+				  2.7		   2070
+				  2.8		   2080
+				  2.9		   2090
+				  3.0		   3000
+				  3.1		   3010
+				  3.2		   3020
+				  3.3		   3030
+				  3.4		   3040
+				  3.5		   3050
+				  3.6		   3060
+         os     OPENSTEP	  4.x		     4x
+	osr	     OSR	  3.2v2.0	     20
+				  3.2v2.1	     21
+				  3.2v4.0	     40
+				  3.2v4.1	     41
+				  3.2v4.2	     42
+				  3.2v5.0.0	    500
+				  3.2v5.0.2	    502
+				  3.2v5.0.4	    504
+				  3.2v5.0.6	    506
+         ou	      OU	  8.0.0		  80000
+    solaris      SOLARIS	  2.3		  20300
+  solariscc	 SOLARIS	  2.4		  20400
+				  2.5		  20500
+				  2.5.1		  20501
+				  2.6		  20600
+				  7		  70000
+				  8		  80000
+				  9		  90000
+				  10		 100000
+	 uw	      UW	  7.0		  70000
+	 	       		  7.1.0		  70100
+	 	       		  7.1.1		  70101
+	 	       		  7.1.3		  70103
+
+* -- The optional Configure abbreviations -- e.g., the ``decosf''
+     and ``digital_unix'' alternatives to ``du'' -- aren't listed
+     here.
+
+
+Dialect-Specific Environment Variables
+======================================
+
+Here are the dialect-specific environment variables, listed
+alphabetically.  The first part of any environment variable will
+be the dialect abbreviation, as specified to Configure, converted
+to upper case characters.  See the `Configure -help` output for a
+listing of the abbreviations.
+
+AIX_ARCH		specifies the AIX architecture when the AIX version is
+			5.0 or higher.  A value of "" signifies POWER; "ia64",
+			64 bit x86 (Itanium).
+
+			default: none (tested via `uname -a`)
+
+AIX_HAS_AFS		specifies the state of AIX ADS support when the AIX
+			version is 4.3.3 or lower.  (Lsof doesn't support AFS
+			above AIX 4.3.3.)  A value of "" allows the Configure
+			script to determine the AFS support state; "no",
+			disables AFS support; and "yes", forces the enabling of
+			AFS support.
+
+			default: none (tested via presence of AFS files and the
+				 lsof AFSConfig shell script)
+
+AIX_KERNBITS		specifies the kernel bit size, 32 or 64, of the Power
+			architecture AIX 5.x kernel for which lsof was built.
+
+			default: determined by the Configure script with a test
+				 program that uses <sys/systemcfg.h> macros.
+
+AIX_USHACK		If this environment variable has a value of "Y" or "y",
+			and if the aixgcc Configure abbreviation is selected,
+			the AIX 4.1 and greater gcc user structure hack is
+			activated; any other non-NULL value, it's not set; a
+			NULL value, it's tested by compilation.
+
+			default: none (tested by compilation)
+
+DARWIN_XNUDIR		If this environment variable has a value, the value is
+			used as the path to the Darwin XNU kernel source code.
+
+			default: none (entry requested)
+
+DARWIN_XNU_HEADERS	If this environment variable has a value, the value is
+			used as the path to the Darwin XNU kernel header files.
+			This path would match the DSTROOT environment variable
+			used when a "make installhdrs" was executed from the
+			Darwin XNU kernel source directory.
+
+			default: none
+
+DU_ADVFSV		specifies the DEC OSF/1, Digital UNIX, or Tru64 UNIX
+			ADVFS file system version -- e.g., 200 for 2.0, 400
+			for 4.0, etc.
+
+			default: determined via /usr/sbin/setld
+
+DU_CDIR			specifies the name of the DEC OSF/1, Digital UNIX, or
+			Tru64 UNIX system configuration directory.
+
+			default: first host name component, converted to upper
+				 case
+
+DU_SHLIB		specifies the DEC OSF/1, Digital UNIX, or Tru64 UNIX
+			shared library directory path.
+
+			default: /usr/shlib
+
+DU_SYSDIR		DEC OSF/1, Digital UNIX, or Tru64 UNIX system
+			directory path.
+
+			2.x and 3.x default: /sys
+			4.x default: /usr/sys
+
+FREEBSD_KERNEL		specifies the path to the FreeBSD kernel for FreeBSD
+			version less than 2.0.
+
+			default: /386bsd
+
+FREEBSD_SYS		specifies the path to the FreeBSD system source
+			directory.
+
+			default: /sys
+
+HPUX_BASE		specifies the HP-UX lsof source code base, kmem or
+			pstat, to be used.
+
+			default: determined by testing for the
+				 /usr/include/sys/pstat subdirectory
+
+HPUX_BOOTFILE		specifies the file in which lsof's Configure script can
+			find kernel information.  This specification may be
+			useful for defining the path to a copy of /stand/vmunix
+			that has been processed by pxdb or q4pxdb.
+
+			default: /stand/vmunix
+
+HPUX_CCDIR1		specifies the first directory where Configure might
+			find an HP-UX C compiler.  This is ignored when
+			LSOF_CC has been specified.
+
+			default: /bin
+
+HPUX_CCDIR2		specifies the second directory where Configure might
+			find an HP-UX C compiler.  This is ignored when
+			LSOF_CC has been specified.
+
+			default: /usr/ccs/bin
+
+HPUX_HASONLINEJFS	If this environment variable has a value of "Y" or "y",
+			the HASONLINEJFS definition will be enabled in the
+			Makefile CFLAGS.  That will cause dnode1.c to use an
+			alternate vx_inode.h header file in the hpux11 sub-
+			directory of dialects/hpux/kmem.
+
+			default: determined using nm and grep
+
+HPUX_IPC_S_PATCH	If this environment variable has a value of "1", the
+			ipc_s structure of the HP-UX 11 kernel is assumed to
+			have an ipc_ipis member, but it is assumed the ipis_s
+			structure lacks the ipis_msgsqueued member; "2", ipc_s
+			has ipc_ipis, but ipis_s has ipis_msgsqueued; "n" or
+			"N", ipc_s lacks ipc_ipis; any other non-NULL value is
+			considered an error; a NULL value, HPUX_IPC_S_PATCH is
+			determined by testing.
+			
+			default: determined with q4 and grep
+
+HPUX_KERNBITS		specifies the number of bits (32 or 64) in the HP-UX
+			11 "basic kernel word.
+
+			default: `getconf _SC_KERNEL_BITS`
+
+HPUX_LIBC1		specifies the first directory that might contain the
+			HP-UX C library, libc.sl.
+
+			default: /usr/lib
+
+HPUX_LIBC2		specifies the second directory that might contain the
+			HP-UX C library, libc.sl.
+
+			default: /lib
+
+HPUX_RNODE3		If this environment variable has a value of "1", the
+			Configure script will define HASRNODE3 in the Makefile
+			CFGF flags.   If it is defined, but not "1", Configure
+			will not define HASRNODE2.
+
+			default: determined using `nm -x /stand/vmunix` and
+				 `grep r_fh3 /usr/include/nfs/rnode.h`
+
+HPUX_X25DIR		specifies path to the HP-UX X25 directory that contains
+			configuration header files.
+
+			default: /etc/conf
+
+LINUX_CLIB		specifies the definition of the Linux C library:
+
+			default: ""             (standard C library)
+			others: -DGLIBCV=2      (glibc2)
+
+LINUX_CONF_CC		specifies the location of the C compiler to use during
+			the running of the Configure script:
+
+			default: the value of the LSOF_CC variable, if defined,
+				 or cc
+
+LINUX_HASSELINUX	If this environment variable has a value of "Y" or "y",
+			Configure unconditionally activates SELinux support.
+			If it has any other value, Configure unconditionally
+			inhibits SELinux suport.
+
+			Default: assumed to be "Y" if <selinux/selinux.h>
+				 exists
+
+LINUX_INCL		specifies the path to the header file tree:
+
+			default: /usr/include
+
+LINUX_LSEEK		If this environment variable has a value of "Y" or "y",
+			Configure uses Makefile.lseek in place of Makefile in
+			order to enable use of the private lseek() function for
+			2.1.x kernels; any other non-NULL value, Makefile.lseek
+			will isn't used; a NULL value, the alternate lseek()
+			need is determined by compilation.
+
+			default: determined by test program
+
+LINUX_VERSION_CODE	specifies the value of the LINUX_VERSION_CODE in the
+			same decimal form as found in the LINUX_VERSION_CODE
+			#define of /usr/include/linux/version.h:
+
+			default: the value of LINUX_VERSION_CODE in
+				 /usr/include/linux/version.h
+
+NETBSD_SYS		specifies the path to the NetBSD system source
+			directory.
+
+			default: /usr/include
+
+NETBSD_UVM		If this environment variable has a value of "Y" or "y",
+			the NetBSD system uses the UVM virtual memory system;
+			any other non-NULL value, it does not; a NULL value,
+			it will be determined by the contents of /etc/mk.conf.
+
+			default: tested by grep'ping /etc/mk.conf
+
+OPENBSD_SYS		specifies the path to the OpenBSD system source
+			directory.
+
+			default: /sys
+
+OPENBSD_UVM		If this environment variable has a value of "Y" or "y",
+			the OpenBSD system uses the UVM virtual memory system;
+			any other non-NULL value, it does not; a NULL value,
+			it will be determined by examining /bsd.
+
+			default: tested by grep'ping `nm /bsd` output
+
+
+OSR_CFGF		The value of this environment variable is made the
+			initial value for the compiler flags the lsof Configure
+			script constructs for the Makefile CFGF macro.
+
+			default: ""
+
+OSR_CFGL		The value of this environment variable is made the
+			initial value for the loader flags the lsof Configure
+			script constructs for the Makefile CFGL macro.
+
+			default: ""
+
+OSR_STATLSTAT		If this environment variable has a value of "Y" or "y",
+			HAS_STATLSTAT is defined in the Makefile's CFGL string;
+			any other non-NULL value, it's not defined; a NULL
+			value, it is determined with nm and grep.
+
+			default: determined with nm and grep
+
+
+SOLARIS_23P101318	If this environment variable has a non-NULL value, the
+			value is interpreted as the patch level of the Solaris
+			2.3 P101318 patch.
+
+			default: pkginfo tested with grep
+
+SOLARIS_24P101945	If this environment variable has a non-NULL value, the
+			value is interpreted as the patch level of the Solaris
+			2.4 P101945 patch.
+
+			default: pkginfo tested with grep
+
+SOLARIS_24P102303	If this environment variable has a non-NULL value, the
+			value is interpreted as the patch level of the Solaris
+			2.4 P102303 patch.
+
+			default: pkginfo tested with grep
+
+SOLARIS_26PR_GWINDOWS	If this environment variable has a value of "Y" or "y",
+			the HASPR_GWINDOWS definition is set in the Solaris 2.6
+			and 7 Makefile's CFG string; any other non-NULL value,
+			it's not set; a NULL value, it's tested by compilation.
+
+			default: tested by compilation
+
+SOLARIS_26PR_LDT	If this environment variable has a value of "Y" or "y",
+			the HASPR_LDT definition is set in the Solaris 2.6
+			Makefile's CFGL string; any other non-NULL value, it's
+			not set; a NULL value, it's tested by compilation.
+
+			default: tested by compilation
+
+SOLARIS_CCDIR		specifies the path to the Sun C compiler -- i.e., when
+			`Configure solariscc` is used.  This is ignored when
+			LSOF_CC has been specified.
+
+			default: /opt/SUNWspro/bin
+
+SOLARIS_INSTR		specifies the Sun C compiler target instruction set
+			when building lsof for a 64 bit kernel -- i.e., when
+			the Configure abbreviation is "solariscc".  Possible
+			values include amd64 and sparcv9.  This is ignored when
+			the Configure abbreviation is "solaris" -- i.e., the
+			compiler is gcc.
+
+			default: tested with /bin/isainfo -k
+
+SOLARIS_KERNBITS	specifies the number of bits in the Solaris 7, 8, 9 or
+			10 kernel: 32 or 64.
+
+			default: tested with /bin/isainfo -kv
+
+SOLARIS_VSOCK		If this environment variable has a value of "Y" or "y",
+			the HAS_VSOCK definition is in the Solaris Makefile's
+			CFGL string; any other non-NULL value, it's not set; a
+			NULL value, it's tested by compilation.
+
+			default: tested by compilation
+
+SOLARIS_VXFSINCL	This environment variable defines the path to the
+			header files of the VxFS 3.4 or greater version.  If
+			SOLARIS_VXFSINCL is not set, the default is used.
+
+			default: VxFS < 4.0:
+				    /opt/VRTSvxfs/include
+				 VxFS 4.0 and above:
+				    /opt/VRTSfssdk/<version>/include
+
+SOLARIS_VXFSLIB		This environment variable defines the path to the
+			VxFS 3.4 or greater utility libraries, libvxfsutil.a
+			(32 bit) and libvxfsutil64.a (64 bit).  If
+			SOLARIS_VXFSLIB is not set, the default is used.
+
+			Note:  end SOLARIS_VXFSLIB at the "/lib" component; do
+			       NOT put "/sparcv9" at its end.  The lsof
+			       Configure script will add "/sparcv9" if it is
+			       required; hence, if Configure finds that
+			       "/sparcv9" is needed, your SOLARIS_VXFSLIB
+			       directory tree must have a sparcv9 subdirectory.
+
+			default: `dirname $SOLARIS_VXFSINCL`/lib
+
+SUN_AFSAPATHDEF		specifies the path to the AFS library modload file
+			for either Solaris or SunOS.
+
+			default: /usr/vice/etc/modload/libafs
+				 Verified with ls.
+
+			Note: the SunOS support is no longer maintained.
+
+UW_HAS_NSC		If this environment variable has a value of "Y" or "y",
+			lsof will be configured for a UnixWare 7.1.1 or above
+			NonStop Cluster (NSC) system.
+
+			default: tested via /bin/node_self
+
+Vic Abell <abe@purdue.edu>
+September 27, 2011
diff --git a/lsof_4.85/lsof_4.85_src/AFSConfig b/lsof_4.85/lsof_4.85_src/AFSConfig
new file mode 100755
index 0000000..0c68cbd
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/AFSConfig
@@ -0,0 +1,346 @@
+#!/bin/sh
+#
+# $Id: AFSConfig,v 1.2 99/05/09 14:49:54 abe Exp $
+#
+# AFSConfig: configure for AFS
+
+AFSD=/usr/vice/etc/afsd
+AH=AFSHeaders
+AV=AFSVersion
+STD=/usr/afsws/include
+
+# Establish trap and stty handling.
+
+ISIG=":"
+trap 'rm -f $AH $AV; $ISIG; exit 1'  1 2 3 15
+stty -a 2>&1 | grep isig > /dev/null
+if test $? -eq 0
+then
+  stty -a 2>&1 | egrep -e -isig > /dev/null
+  if test $? -eq 0
+  then
+    ISIG="stty -isig"
+    stty isig
+  fi
+fi
+
+# Decide how to use echo.
+
+ECHO=`echo -n ""`
+if test "X$ECHO" = "X-n "
+then
+  EC="\c"
+  EO=""
+else
+  EC=""
+  EO="-n"
+fi
+
+# Decide (perhaps for a second time) that AFS is installed.
+
+CELL=""
+if test -r /usr/vice/etc/ThisCell
+then
+  cell=`awk '{print $1}' /usr/vice/etc/ThisCell`
+  if test -d /afs/$cell
+  then
+    CELL=$cell
+  else
+    CELL=`echo $cell | sed 's/\([^.]*\)\..*/\1/'`
+    if test "X$CELL" != "X"
+    then
+      if test ! -d /afs/$CELL
+      then
+        CELL=""
+      fi
+    fi
+  fi
+fi
+if test "X$CELL" = "X"
+then
+  echo ""
+  echo "This system does not appear to have AFS installed."
+  exit 1
+fi
+
+# See if AFS configuration is wanted.
+
+cat << .CAT_MARK
+
+AFS appears to be installed on this system; cell name "$CELL".
+
+Lsof needs to be configured for AFS by identifying: 1) the directory
+that includes the AFS header files needed to compile AFS support into
+lsof; and 2) the version of AFS that is installed.
+.CAT_MARK
+
+END=0
+while test $END = 0
+do
+  echo ""
+  echo $EO "Do you want to configure lsof for AFS (y|n) [y]? $EC"
+  read ANS EXCESS
+  if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+  then
+    exit 1
+  fi
+  if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+  then
+    END=1
+  else
+    echo ""
+    echo "Please answer y or n."
+  fi
+done
+
+# See if $AH exists and points to a likely place.
+
+AHOK=""
+echo ""
+echo "====================================================================="
+echo ""
+if test -r $AH
+then
+  AHP=`cat $AH`
+  if test -r $AHP
+  then
+    if test -r $AHP/afs/afs.h
+    then
+      cat << .CAT_MARK
+The location of the AFS header files required by lsof has been
+previously identified as "$AHP".
+
+Since <afs/afs.h> can be found there, that's probably correct.
+.CAT_MARK
+
+      END=0
+      while test $END = 0
+      do
+	echo ""
+	echo $EO "Do you want to use $AHP again (y|n) [y]? $EC"
+	read ANS EXCESS
+	if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+	then
+	  AHOK="ok"
+	  END=1
+	else
+	  if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+	  then
+	    rm -f $AH
+	    AHP=""
+	    END=1
+	  else
+	    echo ""
+	    echo "Please answer y or n."
+	  fi
+	fi
+      done
+    else
+      echo "\"$AHP\" has been previously specified as the location of the"
+      echo "AFS header files, but it lacks an afs/afs.h header file."
+      rm -f $AH
+      AHP=""
+    fi
+  else
+    echo "The file ./$AH exists, but has no AFS header file path in it."
+    rm -f $AH
+    AHP=""
+  fi
+else
+  echo "No previous header location has been specified."
+  rm -f $AH
+  AHP=""
+fi
+
+# See if the header files are in the "standard" place.
+
+if test "X$AHOK" != "Xok"
+then
+  if test -r $STD
+  then
+    echo ""
+    echo "====================================================================="
+    echo ""
+    echo "The AFS header files appear to be in the \"standard\" location --"
+    echo "i.e.: \"$STD\"."
+    END=0
+    while test $END = 0
+    do
+      echo ""
+      echo $EO "Do you want to let lsof use them (y|n) [y]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+      then
+	echo $STD > $AH
+	AHOK="ok"
+	END=1
+      else
+	if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+	then
+	  END=1
+	else
+	  echo ""
+	  echo "Please answer y or n."
+	fi
+      fi
+    done
+  fi
+fi
+
+# Ask for the AFS header file location.
+
+if test "X$AHOK" != "Xok"
+then
+  echo ""
+  echo "====================================================================="
+  echo ""
+  echo "Please specify the full path where lsof can find the AFS header"
+  echo "files.  A possible location is: \"/afs/$CELL/<sysname>/include\"."
+  cat << .CAT_MARK
+The <sysname> component of the path is the AFS system name that
+was used to configure and build AFS on this system.  It is usually
+constructed from a manufacturer or Unix operating system designation,
+followed by a version number -- e.g., hp800_ux90, sun4m_54, vax_ul43,
+etc.  You may have to consult your AFS documentation to determine
+what <sysname> applies to your configuration.
+.CAT_MARK
+
+  END=0
+  while test $END = 0
+  do
+    echo ""
+    echo $EO "Do you want to see the contents of /afs/$CELL (y|n) [y]? $EC"
+    read ANS EXCESS
+    if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+    then
+      END=1
+    else
+      if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+      then
+	echo ""
+	ls -C /afs/$CELL
+	END=1
+      else
+	echo ""
+	echo "Please answer y or n."
+      fi
+    fi
+  done
+  END=0
+  while test $END = 0
+  do
+    echo ""
+    echo $EO "AFS header file path: $EC"
+    read ANS EXCESS
+    fc=`expr "${ANS}X" : '\(.\).*'`
+    if test "X$fc" = "X/"
+    then
+      if test -r $ANS/afs/afs.h
+      then
+	echo $ANS > $AH
+	AHOK="ok"
+	END=1
+      else
+	echo ""
+	echo "$ANS/afs/afs.h doesn't exist."
+	echo "Please enter a path whose afs subdirectory contains afs.h"
+      fi
+    else
+      echo ""
+      echo "Please enter an absolute path name."
+    fi
+  done
+fi
+if test "X$AHOK" != "Xok"
+then
+  echo "AFSConfig: unknown error"
+  exit 1
+fi
+
+# Determine AFS version.
+
+if test -r $AV
+then
+  echo ""
+  echo "====================================================================="
+  echo ""
+  AVN=`cat $AV`
+  cat << .CAT_MARK
+The AFS version was previously specified as: $AVN
+.CAT_MARK
+
+  END=0
+  while test $END = 0
+  do
+    echo ""
+    echo $EO "Is this the correct version number (y|n) [y]? $EC"
+    read ANS EXCESS
+    if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+    then
+      exit 0
+    fi
+    if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+    then
+      rm -f $AV
+      END=1
+    else
+      echo "Please answer y or n."
+    fi
+  done
+fi
+
+# See if the version number can be determined.
+
+if test -r $AFSD
+then
+  ANS=`strings $AFSD | grep "Base configuration afs" | sed 's/^.*ion afs\([^ ]*\) .*/\1/'`
+  TV=`echo $ANS | sed 's/^\([0-9]*\)\.\([0-9]*\)\(.*\)/\1 \2 \3/' | awk '{printf "%d.%d%s\n",$1,$2,$3}'`
+  if test "X$ANS" = "X$TV"
+  then
+    echo ""
+    echo "====================================================================="
+    echo ""
+    cat << .CAT_MARK
+Examining $AFSD the AFS version number appears to be: $TV
+.CAT_MARK
+
+    END=0
+    while test $END = 0
+    do
+      echo ""
+      echo $EO "Do you want to use this version number (y/n) [y]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+      then
+	END=1
+      else
+	if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+	then
+	  echo $TV > $AV
+	  exit 0
+	else
+	  echo ""
+	  echo "Please answer y or n."
+	fi
+      fi
+    done
+  fi
+fi
+
+# Ask for the version number.
+
+echo ""
+echo "====================================================================="
+END=0
+while test $END = 0
+do
+  echo ""
+  echo $EO "Please enter the AFS version number: $EC"
+  read ANS EXCESS
+  TV=`echo $ANS | sed 's/^\([0-9]*\)\.\([0-9]*\)\(.*\)/\1 \2 \3/' | awk '{printf "%d.%d%s\n",$1,$2,$3}'`
+  if test "X$ANS" = "X$TV"
+  then
+    echo $TV > $AV
+    exit 0
+  fi
+done
diff --git a/lsof_4.85/lsof_4.85_src/Configure b/lsof_4.85/lsof_4.85_src/Configure
new file mode 100755
index 0000000..d7d0e02
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/Configure
@@ -0,0 +1,5564 @@
+#!/bin/sh 
+#
+# Configure -- configure lsof
+#
+# See the LSOF_HLP here document for usage.
+#
+# See the lsof distribution file 00XCONFIG for information on setting
+# environment variables for cross-configuring lsof -- e.g., for configuring
+# for Linux 2.3 on a machine running 2.4.  Marty Leisner suggested this
+# support and provided the Linux Configure stanza modifications.
+#
+# When configuring for a particular dialect, <target-dialect>, this script
+# requires that the subdirectory ./dialects/<target-dialect> contain a
+# shell script, named $LSOF_MK, that places its source modules in this
+# directory.
+#
+# $Id: Configure,v 1.160 2011/09/27 17:27:20 abe Exp $
+
+# LSOF_CFLAGS_OVERRIDE=1 may be introduced through the environment to cause
+#	the library Makefile's CFLAGS definition to override any in the
+#	environment.
+
+# LSOF_DISTRIBKVM may be introduced through the environment to specify the
+#	Sun4 kernel virtual memory type of distrib.cf
+
+LSOF_F="ddev.c dfile.c dlsof.h dmnt.c dnode*.c dproc.c dproto.h dsock.c dstore.c dzfs.h kernelbase.h machine.h machine.h.old new_machine.h __lseek.s"
+LSOF_HLP_BASE=./cfghlp.
+LSOF_HLP=${LSOF_HLP_BASE}$$
+
+# LSOF_LOCALSUFFIX may be introduced through the environment to select a local
+#	version of a Makefile.  It is used as a suffix to $LSOF_MKF.
+
+# LSOF_MAKE may be introduced through the environment to specify a path to the
+#	make command.   It defaults to `which make`, if that is non-NULL;
+#	otherwise to the string "make".
+
+if test "X$LSOF_MAKE" = "X"	# {
+then
+  LSOF_MAKE=`which make`
+  if test "X$LSOF_MAKE" = "X"	# {
+  then
+    LSOF_MAKE=make
+  fi	# }
+fi	# }
+
+LSOF_MK=Mksrc
+
+# LSOF_MKC is the dialect's Mksrc create command -- default "ln -s".
+
+# LSOF_MKFC may be introduced though the environment to change the name
+# used for the created make file.
+
+if test "X$LSOF_MKFC" = "X"	# {
+then
+  LSOF_MKFC=Makefile
+fi	# }
+
+LSOF_LIB=lib
+LSOF_MKF=Makefile
+LSOF_LIBMKF=Makefile
+LSOF_LIBMKFSKEL=Makefile.skel
+
+LSOF_VF=version
+
+# Make sure no other variable important to Makefile construction is
+# already set in the environment.
+#
+#	$AFS_VICE	    locatiion of AFS VICE directory
+#				(default = /usr/vice)
+#	$LSOF_AFS	    AFS temporary
+#	$LSOF_AFS_NQ	    AFS-not-qualified flag
+#	$LSOF_AFSV	    AFS version
+#	$LSOF_AR	    archive command and its arguments for making the
+#			    lsof library
+#	$LSOF_ARCH	    Unix dialect architecture as a string (may be
+#			    supplied externally)
+#	$LSOF_CC	    C compiler name (may be supplied externally)
+#	$LSOF_CCV	    C compiler version (may be supplied externally)
+#	$LSOF_CDIR	    configuration directory
+#	$LSOF_CFGD	    depend options
+#	$LSOF_CFGDN	    depend file name
+#	$LSOF_CFGF	    C flags -- e.g., -D's
+#	$LSOF_CFGL	    last lsof library loader flags -- e.g., -l's
+#	$LSOF_CINFO	    Configure information for LSOF_CINFO in version.h
+#	$LSOF_CTFH	    Solaris 10 and above libctf.h status
+#	$LSOF_CTFL	    Solaris 10 and above -lctf status
+#	$LSOF_DEBUG	    Makefile's DEBUG string
+#	$LSOF_DINC	    include flags -- -I's
+#	$LSOF_DINC_ADD	    include flags status
+#	$LSOF_DOC	    special document (man page) directory path
+#	$LSOF_ERR	    internal error flag
+#	$LSOF_FCFGL	    first lsof library loader flags -- e.g., -l's
+#			    that must precede $LSOF_LIB
+#	$LSOF_FBSD_ZFS      FreeBSD $LSOF_FBSD_ZFS_MKF status
+#	$LSOF_FBSD_ZFS_CFGF FreeBSD ZFS configure flags
+#	$LSOF_FBSD_ZFS_MKF  FreeBSD ZFS Makefile name
+#	$LSOF_FBSD_ZFS_SYS  FreeBSD ZFS system sources location
+#	$LSOF_HOST	    host name (e.g., from uname -n)
+#	$LSOF_INCLUDE	    directory where header files are found
+#			    (default = /usr/include)
+#	$LSOF_LD	    loader name if not $LSOF_CC
+#	$LSOF_LIB_NO	    if "N" don't configure the lsof library
+#	$LSOF_LOCALSUFFIX   local suffix for Makefile
+#	$LSOF_NBSD_BUFQH    NetBSD <sys/bufq.h> copy status
+#	$LSOF_NBSD_PTYFS    NetBSD ${NETBSD_SYS}/sys/fs/ptyfs/ copy status
+#	$LSOF_N_UNIXV	    *BSD system's kernel file
+#	$LSOF_PL	    patch level
+#	$LSOF_RANLIB	    randomizing command for the lsof library
+#	$LSOF_RANLIB_SUP    if non-NULL $LSOF_RANLIB was supplied
+#	$LSOF_SCRIPT_CALL   Customize and Inventory scripts call status
+#	$LSOF_SPMKF	    Special Makefile name
+#	$LSOF_TGT	    canonical target abbreviation (shortest)
+#	$LSOF_TMP	    internal temporary
+#	$LSOF_TMP1	    internal temporary
+#	$LSOF_TMP2	    internal temporary
+#	$LSOF_TMP3	    internal temporary
+#	$LSOF_TMP4	    internal temporary
+#	$LSOF_TMP5	    internal temporary
+#	$LSOF_TMP6	    internal temporary
+#	$LSOF_TMPC_BASE	    base name for $LSOF_TMPC
+#	$LSOF_TMPC	    temporary C source file base name
+#	$LSOF_TSTBIGF	    big file capability (for $LSOF_TSTCFLG)
+#	$LSOF_TSTCC	    tests CC file
+#	$LSOF_TSTCFLG	    tests CFLAGS file
+#	$LSOF_TSTDFLG	    dialect-specific values for $LSOF_TSTCFLG
+#	$LSOF_TSTK64	    status of 64 bit kernel (for $LSOF_TSTCFLG)
+#	$LSOF_TSTKMEM	    /dev/kmem usage status (for $LSOF_TSTCFLG)
+#	$LSOF_TSTLFF	    tests LDFLAGS file
+#	$LSOF_TSTLFLG	    tests LDFLAGS values
+#	$LSOF_TSTSUBD	    test subdirectory
+#	$LSOF_TSTVPATH	    test v_path state (for $LSOF_TSTCFLG)
+#	$LSOF_TSTXO	    test extra objects (for $LSOF_TSTXOC)
+#	$LSOF_TSTXOC	    test extra objects file
+#	$LSOF_UNSUP	    Lsof is unsupported on this dialect
+#	$LSOF_VERS	    Unix dialect version as a decimal number (may
+#			    be supplied externally)
+#	$LSOF_VSTR	    Unix dialect version as a string -- may be supplied
+#			    externally
+
+if test "X$AFS_VICE" = "X"	# {
+then
+  AFS_VICE="/usr/vice"
+fi	# }
+LSOF_AFS=""
+LSOF_AFS_NQ=""
+LSOF_AFSV=""
+if test "X$LSOF_ARCH" = "X"	# {
+then
+  LSOF_ARCH=""
+fi	# }
+LSOF_CDIR=""
+LSOF_CFGD=""
+LSOF_CFGDN=""
+LSOF_CINFO=""
+LSOF_CTFH=0
+LSOF_CTFL=0
+LSOF_DEBUG=""
+LSOF_DOC=""
+LSOF_ERR=""
+LSOF_FCFGL=""
+LSOF_FBSD_ZFS=0
+LSOF_FBSD_ZFS_CFGF=""
+LSOF_FBSD_ZFS_MKF="Makefile.zfs"
+LSOF_FBSD_ZFS_SYS=""
+LSOF_HOST=""
+if test "X$LSOF_INCLUDE" = "X"	# {
+then
+  LSOF_DINC=""
+  LSOF_INCLUDE="/usr/include"
+else
+  LSOF_DINC="-I$LSOF_INCLUDE"
+fi	# }
+LSOF_LD=""
+LSOF_LIB_NO=""
+LSOF_PL=""
+if test "X$LSOF_RANLIB" = "X"	# {
+then
+  LSOF_RANLIB="ranlib"
+  LSOF_RANLIB_SUP=""
+else
+  LSOF_RANLIB_SUP="Y"
+fi	# }
+LSOF_SCRIPT_CALL="yes"
+LSOF_SPMKF=""
+LSOF_TMP1=""
+LSOF_TMP2=""
+LSOF_TMPC_BASE=./lsof_Configure_tmp_
+LSOF_TMPC=${LSOF_TMPC_BASE}$$
+LSOF_TSTBIGF=""
+LSOF_TSTSUBD="./tests"
+LSOF_TSTCC="${LSOF_TSTSUBD}/config.cc"
+LSOF_TSTCFLG="${LSOF_TSTSUBD}/config.cflags"
+LSOF_TSTDFLG=""
+LSOF_TSTK64=0
+LSOF_TSTKMEM=1
+LSOF_TSTLFF="${LSOF_TSTSUBD}/config.ldflags"
+LSOF_TSTLFLG=""
+LSOF_TSTVPATH=0
+LSOF_TSTXO=""
+LSOF_TSTXOC="${LSOF_TSTSUBD}/config.xobj"
+LSOF_UNSUP="WARNING: unsupported dialect or version"
+if test "X$LSOF_VERS" = "X"	# {
+then
+  LSOF_VERS=""
+fi	# }
+if test "X$LSOF_VSTR" = "X"	# {
+then
+  LSOF_VSTR=""
+fi	# }
+
+# Establish echo type -- Berkeley or SYSV.
+
+j=`echo -n ""`
+if test "X$j" = "X-n "
+then
+  EC="\c"
+  EO=""
+else
+  EC=""
+  EO="-n"
+fi
+
+# Make sure temporary files are removed before an abnormal exit.
+
+trap 'rm -f ${LSOF_HLP_BASE}* ${LSOF_TMPC_BASE}*; exit 1' 1 2 3 15
+
+rm -f $LSOF_HLP
+cat > $LSOF_HLP << LSOF_HLP
+Usage: Configure <options> <target-dialect>
+  <options>:  -clean        : clean up previous configuration
+              -d|-dialects  : display a list of supported dialect versions
+              -h|-help      : display help information
+              -n            : avoid AFS, customization, and inventory checks
+  <target-dialect> (****USE -d TO GET TESTED DIALECT VERSION NUMBERS****):
+    aix|aixgcc              : IBM AIX xlc (aix) or gcc (aixgcc)
+    darwin                  : Apple Darwin
+    decosf                  : DEC OSF/1
+    digital_unix|du         : Digital UNIX
+    freebsd                 : FreeBSD
+    hpux|hpuxgcc            : HP-UX cc (hpux) or gcc (hpuxgcc)
+    linux                   : Linux
+    netbsd                  : NetBSD
+    nextstep|next|ns|nxt    : NEXTSTEP
+    openbsd                 : OpenBSD
+    openstep|os             : OPENSTEP
+    osr|sco                 : SCO OpenServer < 6.0.0, SCO devloper's compiler
+    osrgcc|scogcc           : SCO OpenServer < 6.0.0, gcc compiler
+    osr6                    : SCO OpenServer 6.0.0, SCO compiler
+    solaris|solariscc       : Solaris gcc (solaris) or cc (solariscc)
+    tru64		    : Tru64 UNIX
+    unixware|uw             : SCO|Caldera UnixWare
+LSOF_HLP
+
+LSOF_TGT="no-target"
+
+args=$#
+while test $args -gt 0	# {
+do
+  case $1 in	# {
+    -clean)
+      if test -r $LSOF_MKFC	# {
+      then
+	echo "$LSOF_MAKE -f $LSOF_MKFC clean"
+	$LSOF_MAKE -f $LSOF_MKFC clean
+      else
+	if test -r ${LSOF_LIB}/${LSOF_LIBMKF}	# {
+	then
+	  echo "(cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF} clean)"
+	  (cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF} clean)
+	else
+	  if test -r ${LSOF_LIB}/${LSOF_LIBMKF}.skel	# {
+	  then
+	    echo "(cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF}.skel clean)"
+	    (cd ${LSOF_LIB}; $LSOF_MAKE -f ${LSOF_LIBMKF}.skel clean)
+	  fi	# }
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_TSTSUBD}/Makefile	# {
+      then
+	echo "(cd ${LSOF_TSTSUBD}; $LSOF_MAKE spotless)"
+	(cd ${LSOF_TSTSUBD}; $LSOF_MAKE spotless)
+      else
+	echo '(cd ${LSOF_TSTSUBD}; rm *.o config.*)'
+	(cd ${LSOF_TSTSUBD}; rm *.o config.*)
+      fi	# }
+      rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF ${LSOF_TMPC_BASE}*
+      echo rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF ${LSOF_TMPC_BASE}*
+      rm -rf AFSHeaders AFSVersion solaris11 version.h vnode_if.h
+      echo "rm -rf AFSHeaders AFSVersion solaris11 version.h vnode_if.h"
+      rm -f ${LSOF_HLP_BASE}* cd9660_node.h lockf_owner.h fbsd_minor.h
+      echo "rm -f ${LSOF_HLP_BASE}* cd9660_node.h lockf_owner.h fbsd_minor.h"
+      rm -f dialects/aix/aix5/j2/j2_snapshot.h
+      echo "rm -f dialects/aix/aix5/j2/j2_snapshot.h"
+      rm -f dialects/sun/solaris10	# DEBUG -- for s10_44
+      echo "rm -f dialects/sun/solaris10"	# DEBUG -- for s10_44
+      rm -f dialects/du/du5_sys_malloc.h
+      echo "rm -f dialects/du/du5_sys_malloc.h"
+      rm -f dialects/hpux/kmem/hpux_mount.h
+      echo "rm -f dialects/hpux/kmem/hpux_mount.h"
+      rm -rf dialects/n+obsd/include
+      echo "rm -rf dialects/n+obsd/include"
+      rm -f dialects/uw/uw7/vm/swap.h
+      echo "rm -f dialects/uw/uw7/vm/swap.h"
+      rm -f ${LSOF_LIB}/${LSOF_LIBMKF}
+      echo "rm -f ${LSOF_LIB}/${LSOF_LIBMKF}"
+      exit 0
+      ;;
+ 
+    -d|-dialects)
+      if test -r ./00DIALECTS -a -r ./version	# {
+      then
+	V=`sed '/VN/s/.ds VN \(.*\)/\1/' version`
+	echo "lsof $V has been *tested* on these UNIX dialect versions:"
+	cat 00DIALECTS
+	echo Although "$V hasn't been tested on other versions of these dialects,"
+	echo "it may work.  Try \`Configure <dialect>\` and \`make\` to see."
+	rm -f $LSOF_HLP
+	exit 0
+      else
+	echo "Can't display UNIX dialect version information:"
+	if test ! -r ./00DIALECTS	# {
+	then
+	  echo "	./00DIALECTS is inaccessible."
+	fi	# }
+	if test ! -r ./version	# {
+	then
+	  echo "	./version is inaccessible."
+	fi	# }
+	rm -f $LSOF_HLP
+	exit 1
+      fi	# }
+      ;;
+
+    -h|-help) cat $LSOF_HLP
+      rm -f $LSOF_HLP
+      exit 0
+      ;;
+
+    -n*)
+      LSOF_SCRIPT_CALL="no"
+      ;;
+
+    *)
+      if test "X$LSOF_TGT" != "Xno-target"	# {
+      then
+	echo "Only one dialect may be configured at a time."
+	echo 'Both "$LSOF_TGT" and "$1" were specified.'
+	cat $LSOF_HLP
+	rm -f $LSOF_HLP
+	exit 1
+      else
+	LSOF_TGT=$1
+      fi	# }
+      ;;
+  esac	# }
+  shift
+  args=`expr $args - 1`
+done	# }
+
+case $LSOF_TGT in	# {
+ no-target)
+   echo "No target dialect was specified."
+   cat $LSOF_HLP
+   rm -f $LSOF_HLP
+   exit 1
+   ;;
+
+# Configure for AIX xlc and AIX gcc.
+
+  aix|aixgcc)
+
+  # AIXA stands for AIX architecture.  It is assigned these values in this
+  # stanza:
+  #
+  #    0	The AIX version is < 5.0, or the AIX 5.0 architecture is
+  #		Power and the kernel bit size is 32.
+  #
+  #    1	The AIX version is >= 5.0, the AIX architecture is Power,
+  #		and the kernel bit size is 64.
+  #
+  #    2	The AIX version is >= 5.0 and the architecture is IA64.
+
+    if test "X$LSOF_RANLIB_SUP" = "X"	# {
+    then
+      LSOF_RANLIB="@echo \\\\\\\\c"    # AIX make doesn't like a null ${RANLIB}.
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+
+      # If the AIX version isn't pre-defined, determine it.
+
+      LSOF_TMP1=`uname -v`
+      if test "X$LSOF_TMP1" = "X5"	# {
+      then
+
+	# If the AIX version is 5, build the version string with `uname -rv`
+	# output.
+
+	  LSOF_VSTR=`uname -r | awk '{printf "5.%d.0.0\n",\$1}'`
+	  echo "Uname reports the version is $LSOF_VSTR."
+      else
+
+	# See if oslevel can determine the version.
+
+	LSOF_TMP1=/usr/bin/oslevel
+	if test -x $LSOF_TMP1	# {
+	then
+	  echo "Determining AIX version with $LSOF_TMP1."
+	  echo "This may take a while, depending on your maintenance level."
+	  LSOF_VSTR=`$LSOF_TMP1 | sed 's/[^0-9]*\([0-9\.]*\).*/\1/'`
+	  echo "$LSOF_TMP1 reports the version is $LSOF_VSTR."
+	else
+
+	  # If oslevel can't be used, build the version string with
+	  # `uname -rv` and issue a warning.
+
+	  LSOF_VSTR=`uname -rv | awk '{printf "%d.%d.0.0\n",\$2,\$1}'`
+	  echo "WARNING: can't execute $LSOF_TMP1; uname -rv reports"
+	  echo "         the version is $LSOF_VSTR; edit CFGF in Makefile and"
+	  echo "         lib/Makefile to refine AIXV and LSOF_VSTR."
+	fi	# }
+      fi	# }
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+      LSOF_VERS=`echo $LSOF_VSTR | sed 's/\.//g'`
+    fi	# }
+    if test $LSOF_VERS -ge 4320	# {
+    then
+      LSOF_TSTBIGF=" "
+    fi	# }
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      if test "X$LSOF_TGT" = "Xaixgcc"	# {
+      then
+	LSOF_CC=gcc
+	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+      else
+	LSOF_CC=cc
+      fi	# }
+    fi	# }
+    LSOF_TGT="aix"
+    echo $LSOF_CC | grep gcc > /dev/null
+    if test $? -eq 0	# {
+    then
+
+    # Prevent use of gcc for AIX below 4.1.
+
+      if test $LSOF_VERS -lt 4100	# {
+      then
+	echo "********************************************************"
+	echo "* Sorry, but gcc can't be used to compile lsof for AIX *"
+	echo "* versions less than 4.1, because of possible kernel   *"
+	echo "* structure alignment differences between it and xlc.  *"
+	echo "********************************************************"
+	rm -f $LSOF_HLP
+	exit 1
+      fi	# }
+    fi	# }
+
+    # Test for AFS.
+
+    if test "X$AIX_HAS_AFS" != "X"	# {
+    then
+      LSOF_AFS=$AIX_HAS_AFS
+    fi	# }
+    if test "X$LSOF_AFS" != "Xno"	# {
+    then
+      if test "X$LSOF_AFS" = "Xyes" -o -r ${AFS_VICE}/etc/ThisCell	# {
+      then
+	if test "X$LSOF_AFS" != "Xyes"	# {
+	then
+	  if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
+	  then
+	    if test -r ./AFSHeaders -a -r ./AFSVersion	# {
+	    then
+	      LSOF_AFS="yes"
+	    fi	# }
+	  else
+	    if test ! -x ./AFSConfig	# {
+	    then
+	      echo "Can't find or execute the AFSConfig script"
+	      rm -f $LSOF_HLP
+	      exit 1
+	    fi	# }
+	    ./AFSConfig
+	    if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
+	    then
+	      LSOF_AFS="yes"
+	    fi	# }
+	  fi	# }
+	fi	# }
+	if test "X$LSOF_AFS" = "Xyes"	# {
+	then
+	  if test "X$LSOF_AFSV" = "X"	# {
+	  then
+	    if test -r ./AFSVersion	# {
+	    then
+	      LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
+	    else
+	      echo "!!!FATAL: no ./AFSVersion file.  It should have been"
+	      echo "          created by a previous AFS configuration run."
+	      rm -f $LSOF_HLP
+	      exit 1
+	    fi	# }
+	  fi	# }
+	  if test $LSOF_VERS -gt 4330 -o LSOF_AFSV -gt 305	# {
+	  then
+	    echo "!!!FATAL: Lsof does not support AFS on this combination of"
+	    echo "          AIX ($LSOF_VERS) and AFS ($LSOF_AFSV) versions."
+	    echo "          To disable AFS, set the value of the AIX_HAS_AFS"
+	    echo "          environment variable to \"no\"."
+	    rm -f $LSOF_HLP
+	    exit 1
+	  else
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
+	    LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
+	    if test -r ${LSOF_INCLUDE}/sys/inttypes.h  # {
+	    then
+	      grep "^typedef.*int16;" ${LSOF_INCLUDE}/sys/inttypes.h > /dev/null
+	      if test $? -eq 0      # {
+	      then
+		LSOF_CFGF="$LSOF_CFGF -DHASINT16TYPE"
+	      fi    # }
+	      grep "^typedef.*u_int32;" ${LSOF_INCLUDE}/sys/inttypes.h > /dev/null
+	      if test $? -eq 0      # {
+	      then
+		LSOF_CFGF="$LSOF_CFGF -DHASUINT16TYPE"
+	      fi    # }
+	      grep "^typedef.*int32;" ${LSOF_INCLUDE}/sys/inttypes.h > /dev/null
+	      if test $? -eq 0      # {
+	      then
+		LSOF_CFGF="$LSOF_CFGF -DHASINT32TYPE"
+	      fi    # }
+	    fi	# }
+	  fi      # }
+	fi	# }
+      fi	# }
+    fi	# }
+
+    # Miscellaneous AIX tests
+
+    if test -d ${LSOF_INCLUDE}/nfs	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS_NFS"
+    fi	# }
+    echo $LSOF_CC | grep cc | grep -v gcc > /dev/null
+    if test $? -eq 0 -a $LSOF_VERS -ge 4140 -a $LSOF_VERS -lt 5000	# {
+    then
+      LSOF_CFGL="$LSOF_CFGL -bnolibpath"
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/socket.h	# {
+    then
+      grep AF_INET6 ${LSOF_INCLUDE}/sys/socket.h > /dev/null
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/stat.h	# {
+    then
+      grep stat64 ${LSOF_INCLUDE}/sys/stat.h > /dev/null
+      if test $? -eq 0 # {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASSTAT64"
+      fi	# }
+    fi	# }
+#DEBUG SANFS    if test -r ${LSOF_INCLUDE}/sys/sanfs/sanfsnode.h???	# {
+#DEBUG SANFS    then
+#DEBUG SANFS      LSOF_CFGF="$LSOF_CFGF -DHAS_SANFS"
+#DEBUG SANFS    fi	# }
+    if test $LSOF_VERS -ge 5000	# {
+    then
+
+    # This is AIX 5 or greater.
+
+      if test -d ${LSOF_INCLUDE}/j2	# {
+      then
+
+      # The AIX > 5.0 system has jfs2 support.  Make the necesssary definitions
+      # and adjustments.
+
+	rm -f dialects/aix/aix5/j2/j2_snapshot.h
+	(cd dialects/aix/aix5/j2; ln -s private_j2_snapshot.h j2_snapshot.h)
+	LSOF_CFGF="$LSOF_CFGF -DHAS_JFS2"
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/aix/aix5"
+	if test $LSOF_VERS -ge 5200	# {
+	then
+	  if test -r ${LSOF_INCLUDE}/j2/j2_snapshot.h	# {
+	  then
+
+	  # The system has its own j2_snapshot.h, so make sure the
+	  # private lsof copy is discarded.
+
+	    rm -f dialects/aix/aix5/j2/j2_snapshot.h
+	  fi	# }
+	  echo $LSOF_CC | grep gcc > /dev/null
+	  if test $? -eq 0	# {
+	  then
+
+	  # Test gcc version for AIX 5.2.
+
+	    LSOF_TMP1=`echo $LSOF_CCV | awk -F . '{printf "%d%02d",$1,$2}'`
+	    if test $LSOF_TMP1 -ge 303	# {
+	    then
+
+	    # Add gcc >= 3.3 option to handle use of i_dev from the wInode
+	    # anonymous structure reference in the JFS2 inode structure of
+	    # <j2/j2_inode.h>.
+
+	      LSOF_CFGF="$LSOF_CFGF -fms-extensions"
+	    fi	# }
+	  fi	#}
+	fi	# }
+      fi	# }
+
+      # Determine the AIX architecture type and set AIXA accordingly.
+
+      if test "X$AIX_ARCH" = "X"	# {
+      then
+	uname -a | grep -i ia64 > /dev/null
+	if test $? -eq 0	# {
+	then
+	  AIX_ARCH="ia64"
+	else
+	  AIX_ARCH=""
+	fi	# }
+      fi	# }
+      if test "X$AIX_ARCH" = "Xia64"	# {
+      then
+
+      # This is AIX >= 5 on ia64.
+
+	LSOF_TSTK64=1
+	echo $LSOF_CC | grep gcc > /dev/null
+	if test $? -eq 0	# {
+	then
+
+	# Quit if gcc was specified as the compiler, since the gcc options to
+	# do an ia64 lsof compilation are unknown.
+
+	  echo "*************************************************************"
+	  echo "*                                                           *"
+	  echo "* !!!!!!!!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!!!!!!!!! *"
+	  echo "*                                                           *"
+	  echo "* Gcc can't be used to compile lsof for AIX 5 and above on  *"
+	  echo "* the ia64 architecture.  Consult lsof's FAQ (in the file   *"
+	  echo "* 00FAQ) for more information.                              *"
+	  echo "*                                                           *"
+	  echo "*************************************************************"
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+	LSOF_TMP1=2
+	if test "X$LSOF_AR" = "X"	# {
+	then
+	  LSOF_AR="/usr/bin/ar cr"
+	fi	# }
+	LSOF_CFGF="$LSOF_CFGF -q64"
+	LSOF_CFGL="$LSOF_CFGL -lelf"
+      else
+
+      # This is AIX >= 5 on Power architecture.
+
+	echo $LSOF_CC | grep cc | grep -v gcc > /dev/null
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGL="$LSOF_CFGL -bnolibpath"
+	fi	# }
+	if test "X$AIX_KERNBITS" = "X"	# {
+	then
+
+	# The kernel bit size wasn't predefined.  Determine it by compiling
+	# and executing a test program.
+
+	  rm -f ${LSOF_TMPC}.*
+	  echo "#include <sys/systemcfg.h>" > ${LSOF_TMPC}.c
+	  echo 'main(){ if (__KERNEL_32()) printf("32\\n");' >> ${LSOF_TMPC}.c
+	  echo 'else if (__KERNEL_64()) printf("64\\n");' >> ${LSOF_TMPC}.c
+	  echo 'else printf("0\\n");' >> ${LSOF_TMPC}.c
+	  echo "return(0); }" >> ${LSOF_TMPC}.c
+	  echo "Testing kernel bit size with $LSOF_CC"
+	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x
+	  if test ! -x ${LSOF_TMPC}.x	# {
+	  then
+	    echo "!!!FATAL: can't compile test program, ${LSOF_TMPC}.c."
+	    rm -f $LSOF_HLP rm -f ${LSOF_TMPC}.*
+	    exit 1
+	  fi	# }
+	  AIX_KERNBITS=`./${LSOF_TMPC}.x`
+	  rm -f ${LSOF_TMPC}.*
+	fi	# }
+
+      # Use the kernel bit size specification to select archiver and compiler
+      # options, and to update AIXA.
+
+	case $AIX_KERNBITS in	# {
+	32)
+	  if test "X$LSOF_AR" = "X"	# {
+	  then
+	    LSOF_AR="/usr/bin/ar cr"
+	  fi	# }
+	  LSOF_TMP1=0
+	  ;;
+	64)
+	  if test "X$LSOF_AR" = "X"	# {
+	  then
+	    LSOF_AR="/usr/bin/ar -X 64 -v -q"
+	  fi	# }
+	  LSOF_TSTK64=1
+	  LSOF_TMP1=1
+	  echo $LSOF_CC | grep gcc > /dev/null
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -maix64"
+	  else
+	    LSOF_CFGF="$LSOF_CFGF -q64"
+	  fi	# }
+	  ;;
+	*)
+	  echo "!!!FATAL: unrecognized kernel bit size: $AIX_KERNBITS"
+	  rm -f $LSOF_HLP
+	  exit 1
+	esac	# }
+
+      # Put kernel bit size information in $LSOF_CINFO and $LSOF_CFGF.
+
+	echo "Kernel bit size: $AIX_KERNBITS"
+	LSOF_TMP2="${AIX_KERNBITS} bit kernel"
+	if test "X$LSOF_CINFO" != "X"	# {
+	then
+	  LSOF_CINFO="${LSOF_CINFO}  ${LSOF_TMP2}"
+	else
+	  LSOF_CINFO="${LSOF_TMP2}"
+	fi	# }
+	LSOF_CFGF="$LSOF_CFGF -DAIX_KERNBITS=${AIX_KERNBITS}"
+      fi	# }
+      LSOF_CFGF="$LSOF_CFGF -DAIXA=$LSOF_TMP1"
+      if test "X$LSOF_TSTDFLG" = "X"	# {
+      then
+	LSOF_TSTDFLG="-DLT_AIXA=$LSOF_TMP1"
+      else
+	LSOF_TSTDFLG="$LSOF_TSTDFLG -DLT_AIXA=$LSOF_TMP1"
+      fi	# }
+    else
+
+    # AIX is < 5, so set AIXA accordingly.
+
+      LSOF_CFGF="$LSOF_CFGF -DAIXA=0"
+      if test "X$LSOF_TSTDFLG" = "X"	# {
+      then
+	LSOF_TSTDFLG="-DLT_AIXA=0"
+      else
+	LSOF_TSTDFLG="$LSOF_TSTDFLG -DLT_AIXA=0"
+      fi	# }
+    fi	#}
+    LSOF_CFGF="$LSOF_CFGF -DAIXV=$LSOF_VERS"
+    LSOF_DIALECT_DIR=aix
+    echo $LSOF_CC | grep gcc > /dev/null
+    if test $? -eq 0 	# {
+    then
+
+    # Do gcc tests.
+
+      if test $LSOF_VERS -ge 4100 -a $LSOF_VERS -lt 4200	# {
+      then
+	if test "X$AIX_USHACK" = "X"	# {
+	then
+
+	  # Compile and run a gcc test program to evaluate the user structure.
+
+	  rm -f ${LSOF_TMPC}.*
+	  echo "#include <stddef.h>" > ${LSOF_TMPC}.c
+	  echo "#include <sys/user.h>" >> ${LSOF_TMPC}.c
+	  echo "main(){exit((offsetof(struct user, U_irss) & 0x7) ? 1 : 0);}" >>${LSOF_TMPC}.c
+	  echo "Testing user.h with $LSOF_CC"
+	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x
+	  if ! ${LSOF_TMPC}.x	# {
+	  then
+	    LSOF_TMP1=1
+	  else
+	    LSOF_TMP1=0
+	  fi	# }
+	  rm -f ${LSOF_TMPC}.*
+	else
+	  if test "$AIX_USHACK" = "Y" -o "$AIX_USHACK" = "y"	# {
+	  then
+	    LSOF_TMP1=1
+	  else
+	    LSOF_TMP1=0
+	  fi	# }
+	fi	# }
+	if test ${LSOF_TMP1} -eq 1	# {
+	then
+	  echo "Applying gcc AIX 4.1+ user struct alignment hack"
+	  rm -rf ./dialects/aix/aix$LSOF_VERS
+	  mkdir ./dialects/aix/aix$LSOF_VERS
+	  mkdir ./dialects/aix/aix${LSOF_VERS}/sys
+	    sed 's/U_irss\[/dummy_for_alignment, U_irss\[/' < ${LSOF_INCLUDE}/sys/user.h > ./dialects/aix/aix${LSOF_VERS}/sys/user.h
+	    LSOF_CFGF="$LSOF_CFGF -U_LONG_LONG -I`pwd`/dialects/aix/aix$LSOF_VERS"
+	fi	# }
+      fi	# }
+    else
+
+      # Get xlc version number
+
+      rm -f ${LSOF_TMPC}.*
+      echo "main(){}" > ${LSOF_TMPC}.c
+      echo "Getting version number of ${LSOF_CC}."
+      $LSOF_CC -c ${LSOF_TMPC}.c -I${LSOF_INCLUDE} -o ${LSOF_TMPC}.o -qlist > /dev/null 2>&1
+      LSOF_CCV=`head -1 ${LSOF_TMPC}.lst | sed 's/\(.*\) ---.*/\1/'`
+      rm ${LSOF_TMPC}.*
+      echo "The version is \"${LSOF_CCV}\"."
+      echo $LSOF_CCV | grep "Version [0-9]" > /dev/null
+      if test $? -eq 0	# {
+      then
+	LSOF_TMP=`echo $LSOF_CCV | sed 's/.*Version \([0-9]*\).*/\1/'`
+	if test "X$LSOF_TMP" != "X" -a $LSOF_TMP -ge 4    # {
+	then
+	  if test $LSOF_TMP -ge 6	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -qmaxmem=-1"
+	  else
+	    LSOF_CFGF="$LSOF_CFGF -qmaxmem=16384"
+	  fi	# }
+	fi	# }
+      fi	# }
+    fi	# }
+    if test $LSOF_VERS -ge 5300	# {
+    then
+      LSOF_UNSUP=""
+    fi	# }
+    ;;
+
+# Configure for Apple Darwin.
+
+  darwin)
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      LSOF_CC=cc
+      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+    # If the Darwin / Mac OS X version isn't pre-defined, determine it.
+
+      case $LSOF_VSTR in	# {
+      1.2*)
+	LSOF_VERS=120
+	;;
+      1.3*)
+	LSOF_VERS=130
+	;;
+      1.4*)
+	LSOF_VERS=140
+	;;
+      5.[012]*)
+	LSOF_VERS=500
+	;;
+      5.[3-9]*)
+	LSOF_VERS=530
+	;;
+      6.*)
+	LSOF_VERS=600
+	;;
+      7.*)			# Mac OS X 10.3 (Panther)
+	LSOF_VERS=700
+	;;
+      8.*)			# Mac OS X 10.4 (Tiger)
+	LSOF_VERS=800
+	;;
+      9.*)			# Mac OS X 10.5 (Leopard)
+	LSOF_VERS=900
+ 	;;
+      10.*)			# Mac OS X 10.6 (SnowLeopard)
+ 	LSOF_VERS=1000
+ 	;;
+      *)
+	echo Unknown Darwin release: `uname -r`
+	echo Assuming Darwin 10.0
+	LSOF_VERS=1000
+	;;
+      esac	# }
+    fi	# }
+
+    # Do Darwin version-specific stuff.
+
+    case $LSOF_VERS in	# {
+    120|130)
+      LSOF_TMP1="hfs/hfs.h hfs/hfs_macos_defs.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h"
+      ;;
+    140|500)
+      LSOF_TMP1="hfs/hfs.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h"
+      ;;
+    530)
+      LSOF_TMP1="hfs/hfs.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h net/ndrv.h net/ndrv_var.h"
+      ;;
+    600)
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      LSOF_TMP1="hfs/hfs.h hfs/hfs_catalog.h hfs/hfs_cnode.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h net/ndrv_var.h net/raw_cb.h netinet/ip_var.h netinet/tcp_var.h"
+      ;;
+    700)
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      LSOF_TMP1="hfs/hfs.h hfs/hfs_catalog.h hfs/hfs_cnode.h hfs/hfs_macos_defs.h hfs/rangelist.h miscfs/devfs/devfsdefs.h miscfs/devfs/devfs_proto.h miscfs/fdesc/fdesc.h net/ndrv_var.h net/raw_cb.h netinet/ip_var.h netinet/tcp_var.h sys/eventvar.h"
+      ;;
+    800)
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      LSOF_TMP1="net/ndrv_var.h net/raw_cb.h netinet/ip_var.h netinet/tcp_var.h sys/eventvar.h sys/file_internal.h sys/mount_internal.h sys/proc_internal.h sys/vnode_internal.h"
+      ;;
+    900|1000)
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      LSOF_TMP1=""
+      LSOF_UNSUP=""
+      LSOF_TSTBIGF=" "			# enable LTbigf test
+      ;;
+    *)
+      echo "Unsupported Darwin version: $LSOF_VERS"
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    LSOF_TMP2=""
+    LSOF_TMP3=""
+    LSOF_TMP4=""
+    LSOF_CFGF="$LSOF_CFGF -mdynamic-no-pic"
+    LSOF_CFGL="$LSOF_CFGL -lcurses"
+
+    if test "X$DARWIN_XNUDIR" != "X"	# {
+    then
+      LSOF_TMP2="${DARWIN_XNUDIR}/bsd"
+      LSOF_TMP3="${DARWIN_XNUDIR}/osfmk"
+      LSOF_TMP4=""
+    else
+      LSOF_TMP2="${DARWIN_XNU_HEADERS}/System/Library/Frameworks/Kernel.framework/Versions/A/PrivateHeaders"
+      LSOF_TMP3="${DARWIN_XNU_HEADERS}/System/Library/Frameworks/System.framework/Versions/B/PrivateHeaders"
+      LSOF_TMP4=""
+      if test "X$DARWIN_XNU_HEADERS" != "X"	# {
+      then
+	LSOF_TMP4="${DARWIN_XNU_HEADERS}/usr/include"
+      fi	# }
+    fi	# }
+
+    # Test Darwin base.
+
+    if test "X$DARWIN_BASE" = "X" -o "X$DARWIN_BASE" = "Xlibproc"	# {
+    then
+      LSOF_TMP5=""
+      if test $LSOF_VERS -ge 800 -o "X$DARWIN_BASE" = "Xlibproc"	# {
+      then
+	if test -r ${LSOF_INCLUDE}/libproc.h	# {
+	then
+	    DARWIN_BASE="libproc"
+	else
+	  if test -r ${LSOF_INCLUDE}/../local/include/libproc.h	# {
+	  then
+	    DARWIN_BASE="libproc"
+	    LSOF_TMP5="-I${LSOF_INCLUDE}/../local/include"
+	  else
+	    echo "FATAL: can't find libproc.h"
+	    rm -f $LSOF_HLP
+	    exit 1
+	  fi	# }
+	fi	# }
+      else
+
+      # The default Darwin base is /dev/kmem.
+
+	DARWIN_BASE="/dev/kmem"
+      fi	# }
+    fi	# }
+    if test "X$DARWIN_BASE" = "Xlibproc"	# {
+    then
+
+    # Configure for libproc-based Darwin lsof.
+
+      echo "Configuring libproc-based Darwin lsof"
+      LSOF_CINFO="libproc-based"
+      LSOF_DIALECT_DIR=darwin/libproc
+      if test $LSOF_VERS -lt 1000 	# {
+      then
+	LSOF_CFGL="$LSOF_CFGL -lproc"
+      fi	# }
+      LSOF_TSTKMEM=0
+      LSOF_DINC="$LSOF_DINC $LSOF_TMP5"
+      if test ! -r ${LSOF_INCLUDE}/sys/proc_info.h	# {
+      then
+	if test "X$LSOF_TMP5" = "X" -o ! -r ${LSOF_TMP5}/sys/proc_info.h # {
+	then
+	  echo "FATAL: can't find sys/proc_info.h"
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+      fi	# }
+
+    # Add header file paths for libproc-based Darwin lsof.
+
+      for i in $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
+      do
+	if test -d $i -a "X$i" != "X/usr/include"	# {
+	then
+	  LSOF_DINC="$LSOF_DINC -I${i}"
+	fi	# }
+      done	# }
+
+    # Do other libproc-based Darwin lsof setups.
+      
+      if test -r ${LSOF_INCLUDE}/utmpx.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASUTMPX"
+      fi	# }
+    else
+      if test "X$DARWIN_BASE" != "X/dev/kmem"	# {
+      then
+	echo "Darwin base unrecognized: $DARWIN_BASE"
+	rm -f $LSOF_HLP
+	exit 1
+      fi	# }
+    
+    # Configure for /dev/kmem-based Darwin lsof.
+
+      echo "Configuring /dev/kmem-based Darwin lsof"
+      LSOF_CINFO="/dev/kmem-based"
+      LSOF_DIALECT_DIR=darwin/kmem
+
+    # Make sure needed /dev/kmem-base XNU Darwin kernel header files are
+    # present.
+
+      LSOF_TMP5=""
+      for i in $LSOF_TMP1	# {
+      do
+	LSOF_TMP6=0
+	for j in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
+	do
+	  if test "X${j}" != "X" -a -r ${j}/${i}  # {
+	  then
+	    LSOF_TMP6=1
+	    break
+	  fi	# }
+	done	# }
+	if test $LSOF_TMP6 -ne 1	# {
+	then
+	  if test "X$LSOF_TMP5" = "X"	# {
+	  then
+	    LSOF_TMP5=$i
+	  else
+	    LSOF_TMP5="$LSOF_TMP5 $i"
+	  fi	# }
+	fi			# }
+      done	# }
+      if test "X$LSOF_TMP5" != "X"	# {
+      then
+
+      # If any Darwin XNU kernel header files are missing, call the
+      # get-hdr-loc.sh script to find the path.
+
+	LSOF_TMP6=`pwd`/dialects/darwin/get-hdr-loc.sh
+	if test ! -x $LSOF_TMP6	# {
+	then
+	  echo "FATAL: can't execute: $LSOF_TMP6"
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+	DARWIN_XNUDIR=`$LSOF_TMP6 $LSOF_TMP5`
+	if test $? -ne 0	# {
+	then
+	  echo "FATAL: $LSOF_TMP6 returns: $DARWIN_XNUDIR"
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+	LSOF_TMP2="${DARWIN_XNUDIR}/bsd"
+	LSOF_TMP3="${DARWIN_XNUDIR}/osfmk"
+	LSOF_TMP4=""
+      fi	# }
+
+    # Add header file paths for /dev/kmem-based Darwin lsof.
+
+      for i in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
+      do
+	if test -d $i -a "X$i" != "X/usr/include"	# {
+	then
+	  LSOF_DINC="$LSOF_DINC -I${i}"
+	fi	# }
+      done	# }
+
+    # Make conditional feature definitions for /dev/kmem-based Darwin lsof.
+
+      for i in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE      # {
+      do
+	if test "X${i}" != "X" -a -r ${i}/sys/namei.h	# {
+	then
+	  grep -q nc_vpid ${i}/sys/namei.h
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
+	  fi	# }
+	  break
+	fi	# }
+      done	# }
+      for i in $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 $LSOF_INCLUDE	# {
+      do
+	if test "X${i}" != "X"	# {
+	then
+	  if test $LSOF_VERS -ge 800	# {
+	  then
+	    if test -r ${i}/sys/file_internal.h	# {
+	    then
+	      grep -q DTYPE_KQUEUE ${i}/sys/file_internal.h
+	      if test $? -eq 0	# {
+	      then
+	        LSOF_CFGF="$LSOF_CFGF -DHASKQUEUE"
+	      fi	# }
+	      break
+	    fi	# }
+	  else
+	    if test $LSOF_VERS -ge 700	# {
+	    then
+	      if test -r ${i}/sys/file.h	# {
+	      then
+	        grep -q DTYPE_KQUEUE ${i}/sys/file.h
+	        if test $? -eq 0	# {
+	        then
+	          LSOF_CFGF="$LSOF_CFGF -DHASKQUEUE"
+	        fi	# }
+	      fi	# }
+	      break
+	    fi	# }
+	  fi	# }
+	fi	# }
+      done	# }
+      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS"
+    fi	# }
+    LSOF_CFGF="$LSOF_CFGF -DDARWINV=$LSOF_VERS"
+    LSOF_CFLAGS_OVERRIDE=1
+    ;;
+
+# Configure for DEC OSF/1, Digital UNIX, or Tru64 UNIX.
+
+  digital_unix|du|decosf|tru64)
+    LSOF_TGT="du"
+    LSOF_TSTBIGF=" "
+    LSOF_TSTK64=1
+    if test "X$LSOF_DINC" = "X"	# {
+    then
+      LSOF_DINC="-I/usr/include"
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the DEC OSF/1, Digital UNIX, or Tru64 UNIX version isn't
+      # predefined, determine it.
+
+      case $LSOF_VSTR in	# {
+      V2.0)
+	LSOF_VERS=20000
+	;;
+      V3.0)
+	LSOF_VERS=30000
+	;;
+      V3.2)
+	LSOF_VERS=30200
+	;;
+      ?4.0)
+	LSOF_TSTXO="../lib/snpf.o"
+	LSOF_VERS=40000
+	;;
+      ?5.0)
+	LSOF_VERS=50000
+	;;
+      ?5.1)
+	LSOF_VERS=50100
+	;;
+      *)
+	echo "WARNING: unknown version; assuming version is 2.0"
+	LSOF_VERS=20000
+	;;
+      esac	# }
+    fi	# }
+
+    # Do DEC OSF/1, Digital UNIX, or Tru64 UNIX version specific stuff.
+
+    case $LSOF_VERS in	# {
+      20000)
+	LSOF_CFGF="$LSOF_CFGF -Olimit 1024"
+	LSOF_TMP1="/sys"
+	;;
+      30000)
+	LSOF_CFGF="$LSOF_CFGF -Olimit 1024"
+	LSOF_TMP1="/sys"
+	LSOF_TMP2=-DUSELOCALREADDIR
+	;;
+      30200)
+	LSOF_CFGF="$LSOF_CFGF -Olimit 1024"
+	LSOF_TMP1="/sys"
+	LSOF_TMP2=-DUSELOCALREADDIR
+	;;
+      40000)
+	LSOF_TMP1="/usr/sys"
+	;;
+      50000|50100)
+	LSOF_CFGF="$LSOF_CFGF -DUSE_STAT"
+	LSOF_TMP1="/usr/sys"
+	;;
+      *)
+	echo "WARNING: unknown version: $LSOF_VERS"
+	rm -f $LSOF_HLP
+	exit 1
+	;;
+    esac	# }
+    if test "X$DU_SYSDIR" = "X"	# {
+    then
+      DU_SYSDIR=$LSOF_TMP1
+    fi	# }
+    LSOF_HOST=`uname -n`
+    if test "X$DU_CDIR" = "X"	# {
+    then
+      LSOF_CDIR=`expr $LSOF_HOST : '\([^\.]*\)\..*$'`
+      if test "X$LSOF_CDIR" = "X"	# {
+      then
+	LSOF_CDIR=$LSOF_HOST
+      fi	# }
+      LSOF_CDIR=`echo $LSOF_CDIR | tr a-z A-Z`
+    else
+      LSOF_CDIR=$DU_CDIR
+    fi	# }
+    LSOF_LOOP=1
+    while test $LSOF_LOOP = 1	# {
+    do
+      if test -d ${DU_SYSDIR}/$LSOF_CDIR	# {
+      then
+	echo "Using header files in ${DU_SYSDIR}/$LSOF_CDIR"
+	LSOF_LOOP=0
+      else
+	cat << .CAT_MARK
+
+Please enter the name of the subdirectory in $DU_SYSDIR that contains the
+configuration files for this host.  Usually its name would be $LSOF_CDIR, but
+that subdirectory doesn't seem to exist.  The lsof compilation needs header
+files specific to this machine's configuration found in that directory.
+
+If you can't specify the appropriate configuration subdirectory, quit this
+Configure step now and generate a proper configuration subdirectory with the
+kernel generation process.
+
+.CAT_MARK
+
+	echo "$DU_SYSDIR contains:"
+	echo ""
+	ls -CF $DU_SYSDIR
+	echo ""
+	echo -n "Configuration subdirectory name? "
+	read LSOF_CDIR LSOF_EXCESS
+	if test "X$LSOF_CDIR" = "X" -o ! -d ${DU_SYSDIR}/$LSOF_CDIR	# {
+	then
+	  echo ""
+	  echo Cannot access directory ${DU_SYSDIR}/$LSOF_CDIR.
+	fi	# }
+      fi	# }
+    done	# }
+
+    # Determine the ADVFS file system version.
+
+    if test "X$DU_ADVFSV" = "X"	# {
+    then
+      echo "Determining the ADVFS version -- this will take a while."
+      LSOF_ADVFSV=`/usr/sbin/setld -i | grep "^OSFADVFSBIN[0-9]" | sed 's/\([^ ]*\).*/\1/' | sort -u | tail -1 | sed 's/OSFADVFSBIN//'`
+    else
+      LSOF_ADVFSV=$DU_ADVFSV
+    fi	# }
+    case $LSOF_ADVFSV in	# {
+    1*)
+      LSOF_ADVFSV=100
+      echo "The ADVFS version is 1."
+      ;;
+    2*)
+      LSOF_ADVFSV=200
+      echo "The ADVFS version is 2."
+      ;;
+    3*)
+      LSOF_ADVFSV=300
+      echo "The ADVFS version is 3."
+      ;;
+    4*)
+      LSOF_ADVFSV=400
+      echo "The ADVFS version is 4."
+      ;;
+    5*)
+      LSOF_ADVFSV=500
+      echo "The ADVFS version is 5."
+      ;;
+    *)
+      echo "The ADVFS version is unknown; it will be assumed to be 1."
+      LSOF_ADVFSV=100
+      ;;
+    esac	# }
+    LSOF_CFGF="$LSOF_CFGF -DDUV=$LSOF_VERS -DADVFSV=$LSOF_ADVFSV $LSOF_TMP2"
+    if test "X$DU_SYSINC" = "X"	# {
+    then
+      DU_SYSINC="/usr/sys/include"
+    fi	# }
+    LSOF_DINC="$LSOF_DINC -I${DU_SYSDIR}/$LSOF_CDIR -I$DU_SYSINC"
+    LSOF_CFGL="$LSOF_CFGL -lmld"
+    if test "X${DU_SHLIB}" = "X"	# {
+    then
+      DU_SHLIB=/usr/shlib
+    fi	# }
+    if test -r ${DU_SHLIB}/libmsfs.so	# {
+    then
+      nm ${DU_SHLIB}/libmsfs.so | grep tag_to_path > /dev/null 2>&1
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASTAGTOPATH"
+	LSOF_CFGL="$LSOF_CFGL -lmsfs"
+      fi	# }
+    fi	# }
+    grep "^struct spec_node {" ${DU_SYSDIR}/include/sys/specdev.h > /dev/null 2>&1
+    if test $? -eq 0	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASSPECNODE"
+    fi	# }
+    if test $LSOF_VERS -ge 50000	# {
+    then
+
+    # Make du5_sys_malloc.h for DU 5.0 and above.  Enable strict ANSI checking
+    # on 5.0 and 5.1A, but not 5.1B.  Enable IPv6 handling.
+
+      LSOF_TMP1="-std1"
+      if test $LSOF_VERS -ge 50100	# {
+      then
+	LSOF_TMP1="-std"
+	if test -x /usr/sbin/sizer	# {
+	then
+	  /usr/sbin/sizer -v | grep -q 5.1A
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_TMP1="-std1"
+	  fi	# }
+	fi	# }
+      fi	# }
+      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
+      LSOF_TMP1=${LSOF_INCLUDE}/sys/malloc.h
+      if test -r $LSOF_TMP1	# {
+      then
+	LSOF_TMP2=dialects/du/du5_sys_malloc.h
+	rm -f $LSOF_TMP2
+	echo "#if !defined(MANUFACTURED_DU5_SYS_MALLOC_H)" > $LSOF_TMP2
+	echo "/* By lsof Configure:" `date` " */" >> $LSOF_TMP2
+	echo "#define MANUFACTURED_DU5_SYS_MALLOC_H" >> $LSOF_TMP2
+	grep "^#define[ 	]MALLOC_NUM_BUCKETS" $LSOF_TMP1 >> $LSOF_TMP2
+	echo "struct percpukmembuckets {" >> $LSOF_TMP2
+	sed '1,/^struct percpukmembuckets/d' $LSOF_TMP1 | sed -n '1,/^};/p' >> $LSOF_TMP2
+	echo "#endif" >> $LSOF_TMP2
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/du"
+      fi	# }
+
+    # Enable IPv6 for Tru64 UNIX 5.0 and above.
+
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/namei.h
+    then
+      grep -q nc_vpid ${LSOF_INCLUDE}/sys/namei.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
+      fi	# }
+    fi	# }
+    LSOF_DIALECT_DIR=du
+    ;;
+
+# Configure for FreeBSD.
+
+  freebsd)
+    LSOF_FBSD_ZFS=0
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      LSOF_CC=cc
+      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+    # If the FreeBSD version isn't pre-defined, determine it.
+
+      case $LSOF_VSTR in	# {
+      1.*)
+	LSOF_VERS=1000
+	;;
+      2.0-*)
+	LSOF_VERS=2000
+	;;
+      2.0.5-*)
+	LSOF_VERS=2005
+	;;
+      2.1*)
+	LSOF_VERS=2010
+	;;
+      2.2*)
+	LSOF_VERS=2020
+	;;
+      3.0*)
+	LSOF_VERS=3000
+	;;
+      3.1*)
+	LSOF_VERS=3010
+	;;
+      3.2*)
+	LSOF_VERS=3020
+	;;
+      3.3*)
+	LSOF_VERS=3030
+	;;
+      3.4*)
+	LSOF_VERS=3040
+	;;
+      3.5*)
+	LSOF_VERS=3050
+	;;
+      3*)
+	LSOF_VERS=3050
+	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for FreeBSD 3.5"
+	;;
+      4.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4000
+	;;
+      4.1-*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4010
+	;;
+      4.2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4020
+	;;
+      4.3*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4030
+	;;
+      4.4*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4040
+	;;
+      4.5*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4050
+	;;
+      4.6*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4060
+	;;
+      4.7*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4070
+	;;
+      4.8*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4080
+	;;
+      4.9*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4090
+	;;
+      4.10*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4100
+	;;
+      4.11*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=4110
+	;;
+      4*)
+	LSOF_VERS=4100
+	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for FreeBSD 4.10"
+	;;
+      5.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=5000
+	;;
+      5.1*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=5010
+	;;
+      5.2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=5020
+	;;
+      5.3*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=5030
+	;;
+      5.4*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=5040
+	;;
+      5.5*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=5050
+	;;
+      5*)
+	LSOF_VERS=5050
+	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for FreeBSD 5.5"
+	;;
+      6.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=6000
+	;;
+      6.1*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=6010
+	;;
+      6.2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=6020
+	;;
+      6.3*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=6030
+	;;
+      6.4*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=6040
+	;;
+      6*)
+	LSOF_VERS=6000
+	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for FreeBSD 6.0"
+	;;
+      7.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=7000
+	;;
+      7.1*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=7010
+	;;
+      7.2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=7020
+	;;
+      7.3*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=7030
+	;;
+      7.4*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=7040
+	;;
+      7*)
+	LSOF_VERS=7000
+	echo "!!!WARNING!!!  Unsupported FreeBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for FreeBSD 7.0"
+	;;
+      8.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=8000
+	;;
+      8.1*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=8010
+	;;
+      8.2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=8020
+	;;
+      9*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=9000
+	;;
+      *)
+	echo Unknown FreeBSD release: `uname -r`
+	echo Assuming FreeBSD 2.x
+	LSOF_CFGL="$LSOF_CFGL -lkvm"
+	LSOF_VERS=2000
+	LSOF_N_UNIXV=`/usr/sbin/sysctl -n kern.bootfile`
+	if test "X$LSOF_N_UNIXV" = "X"	# {
+	then
+	  LSOF_N_UNIXV="/kernel"
+	fi	# }
+	;;
+      esac	# }
+    fi	# }
+
+    # Clear LSOF_UNSUP message for supported versions of FreeBSD.
+    
+    case $LSOF_VERS in  # {
+    4090|6040|8000|8020|9000)
+      LSOF_UNSUP=""
+      ;;
+    esac	# }
+
+    # Get system CFLAGS from FREEBSD_MAKE_CONF (default=/etc/make.conf).
+
+    if test "X$FREEBSD_MAKE_CONF" = "X"	# {
+    then
+      FREEBSD_MAKE_CONF="/etc/make.conf"
+    fi	# }
+    if test -r $FREEBSD_MAKE_CONF	# {
+    then
+      LSOF_TMP1=`echo "all:\n.include <bsd.prog.mk>" | $LSOF_MAKE -f- -VCFLAGS`
+      LSOF_TMP=1
+      while test $LSOF_TMP -eq 1	# {
+      do
+	echo $LSOF_TMP1 | grep -q -e '-O'
+	if test $? -eq 0	# {
+	then
+	  if test "X$LSOF_DEBUG" = "X"
+	  then	# {
+	    LSOF_DEBUG=`echo $LSOF_TMP1 | sed 's/.*\(-O[^ $]*\).*/\1/'`
+	  fi	# }
+	  LSOF_TMP1=`echo $LSOF_TMP1 | sed 's/\(.*\)-O[^ $]*\(.*\)/\1 \2/' | sed 's/^  *//g' | sed 's/  */ /g' | sed 's/  *$//'`
+	else
+	  LSOF_TMP=0
+	fi	# }
+	LSOF_FBSD_ZFS_CFGF="$LSOF_CFGF $LSOF_TMP1"
+      done	# }
+      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
+    fi	# }
+
+    # Determine path to FreeBSD sources.
+
+    LSOF_DINC_ADD=0
+    if test "X$FREEBSD_SYS" = "X"	# {
+    then
+      if test -d /usr/src/sys	# {
+      then
+	FREEBSD_SYS=/usr/src/sys
+      else
+	if test -d /sys	# {
+	then
+	  FREEBSD_SYS="/sys"
+	else
+	  echo "!!!WARNING!!!  No kernel sources in /usr/src/sys or /sys"
+	fi	# }
+      fi	# }
+    fi	# }
+
+    # Do FreeBSD version-specific stuff.
+
+    case $LSOF_VERS in	# {
+    1000)
+      LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
+      LSOF_CFGL="$LSOF_CFGL -lutil"
+      LSOF_DINC="$LSOF_DINC -I`pwd`/dialects/freebsd/include"
+      if test "X$FREEBSD_KERNEL" = "X"	# {
+      then
+	LSOF_N_UNIXV="/386bsd"
+      else
+	LSOF_N_UNIXV=$FREEBSD_KERNEL
+      fi	# }
+      ;;
+    2000|2005|2010)
+      LSOF_CFGL="$LSOF_CFGL -lkvm"
+      ;;
+    2020)
+      LSOF_CFGL="$LSOF_CFGL -lkvm"
+      if test -r ${LSOF_INCLUDE}/vm/lock.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASVMLOCKH"
+      fi	# }
+      ;;
+    3000|3010|3020|3030|3040|3050)
+      LSOF_CFGL="$LSOF_CFGL -lkvm"
+      if test -r ${LSOF_INCLUDE}/nfs/rpcv2.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASRPCV2H"
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/vm/lock.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASVMLOCKH"
+      fi	# }
+      ;;
+    4000|4010|4020|4030|4040|4050|4060|4070|4080|4090|4100|4110|5000|5010|5020|5030|5040|5050|6000|6010|6020|6030|6040|7000|7010|7020|7030|7040|8000|8010|8020|9000)
+      if test -r ${LSOF_INCLUDE}/nfs/rpcv2.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASRPCV2H"
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/namei.h	# {
+      then
+	grep -q "^struct[ 	]*namecache[ 	]*{" ${LSOF_INCLUDE}/sys/namei.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASNAMECACHE"
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
+      then
+	grep -q i_effnlink ${LSOF_INCLUDE}/ufs/ufs/inode.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASEFFNLINK=i_effnlink"
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/file.h	# {
+      then
+	grep -q f_vnode ${LSOF_INCLUDE}/sys/file.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASF_VNODE"
+	fi	# }
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lkvm"
+      if test $LSOF_VERS -ge 5000	# {
+      then
+
+      # Do FreeBSD 5 and higher version-specific stuff.
+
+	if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
+	then
+	  grep VT_FDESC ${LSOF_INCLUDE}/sys/vnode.h > /dev/null 2>&1
+	  if test $? -eq 0	# {
+	  then
+	    if test ! -r ${LSOF_INCLUDE}/fs/devfs/devfs.h	# {
+	    then
+	      if test -r ${FREEBSD_SYS}/fs/devfs/devfs.h	# {
+	      then
+		LSOF_DINC_ADD=1
+	      else
+		echo "!!!FATAL: lsof cannot locate the devfs.h header file"
+		echo "          in ${LSOF_INCLUDE}/fs/devfs/devfs.h or"
+		echo "          ${FREEBSD_SYS}/fs/devfs/devfs.h.  Consult"
+		echo "          00FAQ for an explanation."
+		exit 1
+	      fi	# }
+	    fi	# }
+	  fi	# }
+	fi	# }
+
+      # Do FreeBSD 5.2 and higher version-specific stuff.
+
+	if test $LSOF_VERS -ge 5020	# {
+	then
+
+	# Determine the status of the cpumask_t typedef.
+
+	  rm -f ${LSOF_TMPC}.*
+	  cat > ${LSOF_TMPC}.c << .LSOF_END_HERE_DOC3
+#undef _KERNEL
+#include <sys/types.h>
+main() {
+cpumask_t c;
+}
+.LSOF_END_HERE_DOC3
+	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
+	  LSOF_TMP1=$?
+	  rm -f ${LSOF_TMPC}.*
+	  if test $LSOF_TMP1 -ne 0	# {
+	  then
+
+	  # The cpumask_t typedef is unknown when _KERNEL is not defined.
+
+	    if test -r ${LSOF_INCLUDE}/sys/types.h \
+		    -a -r ${LSOF_INCLUDE}/machine/_types.h	# {
+	    then
+	      grep -q cpumask_t ${LSOF_INCLUDE}/sys/types.h
+	      if test $? -eq 0	# {
+	      then
+	        grep -q __cpumask_t ${LSOF_INCLUDE}/machine/_types.h
+	        if test $? -eq 0	# {
+	        then
+		  LSOF_CFGF="$LSOF_CFGF -DHASCPUMASK_T"
+	        else
+		  $LSOF_CC -E ${LSOF_INCLUDE}/machine/_types.h 2>/dev/null | grep -q __cpumask_t
+		  if test $? -eq 0  # {
+		  then
+		    LSOF_CFGF="$LSOF_CFGF -DHASCPUMASK_T"
+		  fi	# }
+	        fi	# }
+	      fi	# }
+	    fi	# }
+	  fi	# }
+	  if test -r ${LSOF_INCLUDE}/sys/socketvar.h	# {
+	  then
+	    grep -q SBS_CANT ${LSOF_INCLUDE}/sys/socketvar.h
+	    if test $? -eq 0	# {
+	    then
+		LSOF_CFGF="$LSOF_CFGF -DHASSBSTATE"
+	    fi	# }
+	  fi	# }
+	fi	# }
+	if test $LSOF_VERS -ge 5030	# {
+	then
+
+	# Do FreeBSD 5.3 and higher version-specific stuff.
+
+	  if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
+	  then
+	    grep -q "defined(_KVM_VNODE)" ${LSOF_INCLUDE}/sys/vnode.h
+	    if test $? -eq 0	# {
+	    then
+		LSOF_CFGF="$LSOF_CFGF -DHAS_KVM_VNODE"
+	    fi	#}
+	  fi	# }
+	fi	# }
+	if test $LSOF_VERS -ge 6000	# {
+	then
+
+	# Do FreeBSD 6.0 and higher version-specific stuff.
+
+	  if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
+	  then
+	    grep -q i_din2 ${LSOF_INCLUDE}/ufs/ufs/inode.h
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHAS_UFS1_2"
+	    fi	# }
+	  fi	# }
+	  if test -r ${LSOF_INCLUDE}/sys/conf.h	# {
+	  then
+	    grep -q vm_memattr_t ${LSOF_INCLUDE}/sys/conf.h
+	    if test $? -eq 0	#{
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHAS_VM_MEMATTR_T"
+	    fi	# }
+	    grep -q "^#define	minor(" ${LSOF_INCLUDE}/sys/conf.h
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHAS_CONF_MINOR"
+	      rm -f fbsd_minor.h
+	      if test -r ${LSOF_INCLUDE}/sys/types.h	# {
+	      then
+		LSOF_TMP1=`grep "^#define[ 	]minor(" ${LSOF_INCLUDE}/sys/types.h`
+		if test "X$LSOF_TMP1" != "X"	# {
+		then
+		  echo "Creating fbsd_minor.h"
+		  cat > fbsd_minor.h << FBSD_MINOR1
+/*
+ * fbsd_minor.h -- created by lsof Configure script on
+FBSD_MINOR1
+		  echo $EO " * $EC" >> ./fbsd_minor.h
+		  date >> ./fbsd_minor.h
+		  cat >> ./fbsd_minor.h << FBSD_MINOR2
+ */
+
+#if	!defined(FBSD_MINOR_H)
+#define	FBSD_MINOR_H
+
+FBSD_MINOR2
+		  echo $EO "${LSOF_TMP1}${EC}" >> fbsd_minor.h
+		  cat >> ./fbsd_minor.h << FBSD_MINOR3
+
+#endif	/* defined(FBSD_MINOR_H) */
+FBSD_MINOR3
+		fi	# }
+	      fi	# }
+	    else
+	      if test -r ${FREEBSD_SYS}/fs/devfs/devfs_int.h	# {
+	      then
+		grep -q cdev2priv ${FREEBSD_SYS}/fs/devfs/devfs_int.h
+		if test $? -eq 0	# {
+		then
+		  LSOF_CFGF="$LSOF_CFGF -DHAS_CDEV2PRIV"
+		fi	# }
+	      fi	# }
+	    fi	# }
+	    grep -q "si_udev;" ${LSOF_INCLUDE}/sys/conf.h
+	    if test $? -ne 0	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHAS_NO_SI_UDEV"
+	    fi	# }
+	    grep -q si_priv ${LSOF_INCLUDE}/sys/conf.h
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHAS_SI_PRIV"
+	    fi	# }
+	  fi	# }
+	  if test -r ${LSOF_INCLUDE}/sys/sx.h	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_SX_H"
+	  fi	# }
+
+	# Do ZFS test.  Try for the newer OpenSolaris files first -- i.e.,
+	# the ones in ${FREEBSD_SYS}/cddl/contrib/opensolaris.  If that fails,
+	# try for the older ones in ${FREEBSD}/contrib/opensolaris.
+
+	  LSOF_FBSD_ZFS_SYS=${FREEBSD_SYS}/cddl
+	  if test ! -r ${LSOF_FBSD_ZFS_SYS}/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h	# {
+	  then
+	    LSOF_FBSD_ZFS_SYS=${FREEBSD_SYS}
+	    if test ! -r ${LSOF_FBSD_ZFS_SYS}/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h	# {
+	    then
+	      LSOF_FBSD_ZFS_SYS=""
+	    fi	# }
+	  fi	# }
+	  if test "X$LSOF_FBSD_ZFS_SYS" != "X"	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_ZFS"
+	    LSOF_FBSD_ZFS=1
+	    LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DFREEBSDV=$LSOF_VERS"
+	    LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_ZFS"
+	    grep -q z_phys ${LSOF_FBSD_ZFS_SYS}/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_Z_PHYS"
+	    fi	# }
+	  fi	# }
+	  if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
+	  then
+
+	  # See if the vnode contains the byte level lock pointer.
+
+	    grep -q v_lockf ${LSOF_INCLUDE}/sys/vnode.h
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHAS_V_LOCKF"
+	      if test $LSOF_FBSD_ZFS -eq 1	# {
+	      then
+	        LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_V_LOCKF"
+	      fi	# }
+	    fi	# }
+	  fi	# }
+	  if test -r ${LSOF_INCLUDE}/sys/lockf.h	# {
+	  then
+
+	  # Determine the type of locking structure to which the inode or
+	  # vnode points.
+
+	    grep -q "^struct lockf_entry" ${LSOF_INCLUDE}/sys/lockf.h
+	    if test $? -eq 0	# {
+	    then
+
+	    # Build the ./lockf_owner.h header file.
+
+	      LSOF_TMP1=""
+	      LSOF_TMP2=0
+	      echo "Creating ./lockf_owner.h from ${FREEBSD_SYS}/kern/kern_lockf.c"
+	      rm -f ./lockf_owner.h
+	      if test -r ${FREEBSD_SYS}/kern/kern_lockf.c	# {
+	      then
+		LSOF_TMP1=`grep -n "^struct lock_owner" ${FREEBSD_SYS}/kern/kern_lockf.c | sed 's/\([0-9]*\):.*$/\1/'`
+		if test "X$LSOF_TMP1" != "X"	# {
+		then
+		  LSOF_TMP2=0
+		  for i in `grep -n "};" ${FREEBSD_SYS}/kern/kern_lockf.c | sed 's/\([0-9]*\):.*$/\1/'` # {
+		  do
+		    if test $LSOF_TMP2 -eq 0 -a $i -gt $LSOF_TMP1	# {
+		    then
+		      LSOF_TMP2=$i
+		    fi	# }
+		  done	# }
+		  if test $LSOF_TMP2 -eq 0	# {
+		  then
+		    LSOF_TMP1=""
+		  else
+		    cat > ./lockf_owner.h << LOCKF_OWNER1
+/*
+ * lockf_owner.h -- created by lsof Configure script on
+LOCKF_OWNER1
+		    echo $EO " * $EC" >> ./lockf_owner.h
+		    date >> ./lockf_owner.h
+		    cat >> ./lockf_owner.h << LOCKF_OWNER2
+ */
+
+#if	!defined(LOCKF_OWNER_H)
+#define	LOCKF_OWNER_H
+
+LOCKF_OWNER2
+		    ed -s ${FREEBSD_SYS}/kern/kern_lockf.c >> ./lockf_owner.h << LOCKF_OWNER3
+${LSOF_TMP1},${LSOF_TMP2}p
+LOCKF_OWNER3
+		    if test $? -ne 0	# {
+		    then
+		      LSOF_TMP1=""
+		    else
+		      cat >> ./lockf_owner.h << LOCKF_OWNER4
+
+#endif	/* defined(LOCKF_OWNER_H) */
+LOCKF_OWNER4
+		    fi	# }
+		  fi	# }
+		fi	# }
+	      else
+		echo "FATAL ERROR: can't read ${FREEBSD_SYS}/kern/kern_lockf.c"
+	      fi	# }
+	      if test "X$LSOF_TMP1" != "X" -a "X$LSOF_TMP2" != "X0" # {
+	      then
+		echo "./lockf_owner.h creation succeeded."
+	        LSOF_CFGF="$LSOF_CFGF -DHAS_LOCKF_ENTRY"
+	      else
+		echo "FATAL ERROR: ./lockf_owner.h creation failed (see 00FAQ)"
+		rm -f $LSOF_HLP
+		exit 1
+	      fi	# }
+	    fi	# }
+
+	  # Test for in6p_.port in inpcb structure.
+
+	    if test -r ${LSOF_INCLUDE}/netinet/in_pcb.h	# {
+	    then
+	      grep -q 'in6p_.port' ${LSOF_INCLUDE}/netinet/in_pcb.h
+	      if test $? -ne 0	# {
+	      then
+		LSOF_CFGF="$LSOF_CFGF -DHAS_NO_6PORT"
+	      fi	# }
+	    fi	# }
+
+	  # Test for in6p_ppcb in inpcb structure.
+
+	    if test -r ${LSOF_INCLUDE}/netinet/in_pcb.h	# {
+	    then
+	      grep -q 'in6p_ppcb' ${LSOF_INCLUDE}/netinet/in_pcb.h
+	      if test $? -ne 0	# {
+	      then
+		LSOF_CFGF="$LSOF_CFGF -DHAS_NO_6PPCB"
+	      fi	# }
+	    fi	# }
+	    if test -r ${LSOF_INCLUDE}/sys/conf.h	# {
+	    then
+	      grep -q 'doadump(boolean_t)' ${LSOF_INCLUDE}/sys/conf.h
+	      if test $? -eq 0	# {
+	      then
+		LSOF_CFGF="$LSOF_CFGF -DNEEDS_BOOLEAN_T"
+	      fi	# }
+	    fi	# |
+	  fi	# }
+	fi	# }
+      fi	# }
+      ;;
+    *)
+      echo "Unknown FreeBSD release: $LSOF_VERS"
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    LSOF_CFGF="$LSOF_CFGF -DFREEBSDV=$LSOF_VERS"
+    if test $LSOF_VERS -lt 2000 -a "X$FREEBSD_KERNEL" = "X"	# {
+    then
+      if test ! -x $LSOF_N_UNIXV	# {
+      then
+	echo "Hmmm -- $LSOF_N_UNIXV doesn't appear to be your kernel file."
+	echo "Please enter the name of the file in / that contains"
+	echo "the kernel for this host.  It must be a regular file,"
+	echo "not a directory, and must be executable."
+	LSOF_LOOP=1
+	while test $LSOF_LOOP = 1	# {
+	do
+	  echo ""
+	  echo "/ contains:"
+	  echo ""
+	  ls -CF /
+	  echo ""
+	  echo -n "Kernel file name? "
+	  read LSOF_N_UNIXV LSOF_EXCESS
+	  LSOF_N_UNIXV="/$LSOF_N_UNIXV"
+	  if test ! -d $LSOF_N_UNIXV -a -x $LSOF_N_UNIXV	# {
+	  then
+	    LSOF_LOOP=0
+	  else
+	    echo ""
+	    echo $LSOF_N_UNIXV is not a regular executable file.
+	  fi	# }
+	done	# }
+      fi	# }
+      LSOF_N_UNIXV=`echo $LSOF_N_UNIXV | sed 's#^/*#/#'`
+      LSOF_CFGF="$LSOF_CFGF -DN_UNIXV=$LSOF_N_UNIXV"
+    fi	# }
+    if test -r ${FREEBSD_SYS}/miscfs/fdesc/fdesc.h	# {
+    then
+      LSOF_TMP1=${FREEBSD_SYS}/miscfs/fdesc/fdesc.h
+    else
+      if test $LSOF_VERS -ge 5000 -a -r ${LSOF_INCLUDE}/fs/fdescfs/fdesc.h  # {
+      then
+	LSOF_TMP1=${LSOF_INCLUDE}/fs/fdescfs/fdesc.h
+      else
+	LSOF_TMP1=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP1" != "X"	# {
+    then
+      grep -q Fctty $LSOF_TMP1
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=1"
+      else
+	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=2"
+      fi	# }
+      grep -q fd_link $LSOF_TMP1
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASFDLINK"
+      fi	# }
+      LSOF_DINC_ADD=1
+    fi	# }
+    if test $LSOF_VERS -ge 5000	# {
+    then
+      LSOF_TMP1="fs"
+    else
+      LSOF_TMP1="miscfs"
+    fi	# }
+    if test $LSOF_VERS -lt 5000	# {
+      then
+      if test -d ${FREEBSD_SYS}/${LSOF_TMP1}/procfs	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
+	LSOF_DINC_ADD=1
+      fi	# }
+    else
+      if test -d ${FREEBSD_SYS}/${LSOF_TMP1}/pseudofs	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASPSEUDOFS"
+	LSOF_DINC_ADD=1
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/${LSOF_TMP1}/nullfs/null.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
+    else
+      if test -r ${FREEBSD_SYS}/${LSOF_TMP1}/nullfs/null.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
+	LSOF_DINC_ADD=1
+      fi	# }
+    fi	# }
+    if test -r ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h	# {
+    then
+      rm -f cd9660_node.h
+      grep -q "^#ifdef [_]*KERNEL" ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h
+      if test $? -eq 0	# {
+      then
+	ln -s ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h cd9660_node.h
+      else
+	sed -e '/^ \* Prototypes for ISOFS vnode operations/,$c\
+	\ The ISOFS prototypes were removed by Configure. */' \
+	< ${FREEBSD_SYS}/isofs/cd9660/cd9660_node.h > cd9660_node.h
+	echo "" >> cd9660_node.h
+      fi	# }
+      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS"
+      if test $LSOF_VERS -ge 6000	# {
+      then
+	grep -q "i_dev;" cd9660_node.h
+	if test $? -ne 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_NO_ISO_DEV"
+	fi	# }
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/namei.h
+    then
+      grep -q nc_vpid ${LSOF_INCLUDE}/sys/namei.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
+      fi	# }
+    fi	# }
+    if test $LSOF_DINC_ADD -eq 1	# {
+    then
+      if test "X$LSOF_DINC" = "X"	# {
+      then
+	LSOF_DINC="-I${FREEBSD_SYS}"
+      else
+	LSOF_DINC="$LSOF_DINC -I${LSOF_INCLUDE} -I${FREEBSD_SYS}"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/netinet/in.h	# {
+    then
+      grep IPV6_INRIA_VERSION ${LSOF_INCLUDE}/netinet/in.h > /dev/null
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASIPv6 -DHASINRIAIPv6"
+      fi	# }
+    fi	# }
+    echo $CFGF | grep HASIPv6 > /dev/null
+    if test $? -ne 0 -a -r ${LSOF_INCLUDE}/netinet6/in6.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/utmpx.h # {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASUTMPX"
+    fi	# }
+    LSOF_DIALECT_DIR=freebsd
+    ;;
+
+# Configure for HP-UX and HP-UX gcc.
+
+  hpux|hpuxgcc)
+    if test "X$LSOF_RANLIB_SUP" = "X"	# {
+    then
+      LSOF_RANLIB=""
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the HP-UX version isn't pre-defined, determine it.
+
+      LSOF_VERS=`echo $LSOF_VSTR | awk -F. '{printf "%d%02d",\$2,\$3}'`
+    fi	# }
+    if test $LSOF_VERS -ge 1020	# {
+    then
+      LSOF_TSTBIGF="-D_LARGEFILE64_SOURCE"
+    fi	# }
+
+    # Determine compiler.
+
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      if test "X$LSOF_TGT" = "Xhpuxgcc"	# {
+      then
+	LSOF_CC=gcc
+      else
+	if test "X$HPUX_CCDIR1" = "X"	# {
+	then
+	  HPUX_CCDIR1="/bin"
+	fi	# }
+	if test "X$HPUX_CCDIR2" = "X"	# {
+	then
+	  HPUX_CCDIR2="/usr/ccs/bin"
+	fi	# }
+	if test -x ${HPUX_CCDIR1}/cc	# {
+	then
+	  LSOF_CC=${HPUX_CCDIR1}/cc
+	else
+	  if test -x ${HPUX_CCDIR2}/cc	# {
+	  then
+	    LSOF_CC=${HPUX_CCDIR2}/cc
+	  else
+	    echo "No executable cc in $HPUX_CCDIR1 or $HPUX_CCDIR2"
+	    rm -f $LSOF_HLP
+	    exit 1
+	  fi	# }
+	fi	# }
+	$LSOF_CC -O < /dev/null 2>&1 | grep -q Bundled
+	if test $? -eq 0	# {
+	then
+	  LSOF_DEBUG="No-O"			# to disable -O
+	  if test "X$HPUX_LIBC1" = "X"	# {
+	  then
+	    HPUX_LIBC1="/usr/lib"
+	  fi	# }
+	  if test -r ${HPUX_LIBC1}/libc.sl	# {
+	  then
+	    LSOF_FCFGL="-L$HPUX_LIBC -lc"
+	  else
+	    if test "X$HPUX_LIBC2" = "X"	# {
+	    then
+	      HPUX_LIBC2="/usr/lib"
+	    fi	# }
+	    if test -r ${HPUX_LIBC2}/libc.sl	# {
+	    then
+	      LSOF_FCFGL="-L$HPUX_LIBC2 -lc"
+	    fi	# }
+	  fi	# }
+	fi	# }
+      fi	# }
+    fi	# }
+    echo $LSOF_CC | grep gcc > /dev/null
+    if test $? -eq 0	# {
+    then
+      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+    else
+      $LSOF_CC -O < /dev/null 2>&1 | grep -q Bundled
+      if test $? -eq 0	# {
+      then
+	LSOF_DEBUG="No-O"			# to disable -O
+      fi	# }
+    fi	# }
+    LSOF_TGT=hpux
+
+    # Test for "const void" support.
+
+    rm -f ${LSOF_TMPC}.*
+    echo "main() { const void *x; return(0); }" >> $LSOF_TMPC.c
+    $LSOF_CC $LSOF_TMPC.c -o $LSOF_TMPC.x > /dev/null 2>&1
+    if test $? -eq 0	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS_CONST"
+    fi	# }
+    rm -f ${LSOF_TMPC}.*
+
+    # Test HP-UX base.
+
+    if test "X$HPUX_BASE" = "X"	# {
+    then
+      if test -d $LSOF_INCLUDE/sys/pstat -a $LSOF_VERS -ge 1111 	# {
+      then
+	HPUX_BASE="pstat"
+      else
+	HPUX_BASE="/dev/kmem"
+      fi	# }
+    fi	# }
+    if test "X$HPUX_BASE" = "Xpstat"	# {
+    then
+
+      # Configure for pstat-based HP-UX lsof.
+
+      LSOF_CINFO="PSTAT-based"
+      echo "Configuring PSTAT-based HP-UX lsof"
+      LSOF_DIALECT_DIR=hpux/pstat
+      LSOF_CFGF="$LSOF_CFGF -DHPUXV=$LSOF_VERS -D_PSTAT64"
+      LSOF_CFGL="$LSOF_CFGL -lnsl"
+      LSOF_TSTKMEM=0
+      LSOF_TSTK64=1
+      ls -l $LSOF_CC | grep -q ansic
+      LSOF_TMP1=$?
+      ls -l $LSOF_CC | grep -q aCC
+      if test $? -eq 0 -o $LSOF_TMP1 -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -Ae +DD32"
+      else
+	echo $LSOF_CC | grep -q gcc
+	if test $? -ne 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF +DD32"
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/netinet/in6.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/pstat/stream_pstat_body.h	# {
+      then
+	grep -q PS_STR_XPORT_DATA ${LSOF_INCLUDE}/sys/pstat/stream_pstat_body.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -D_PSTAT_STREAM_GET_XPORT"
+	fi	# }
+      fi	# }
+      if test $LSOF_VERS -ge 1123	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -D_LARGEFILE64_SOURCE"
+      fi	# }
+    else
+      if test "X$HPUX_BASE" = "X/dev/kmem"	# {
+      then
+    
+	# Configure for /dev/kmem-based HP-UX lsof.
+
+	if test "X$HPUX_BOOTFILE" = "X"	# {
+	then
+	  HPUX_BOOTFILE="/stand/vmunix"
+	fi	# }
+	if test $LSOF_VERS -gt 1100	# {
+	then
+	  echo ""
+	  echo "************************************************"
+	  echo "*                                              *"
+	  echo "* !!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!! *"
+	  echo "*                                              *"
+	  echo "* LSOF DOES NOT SUPPORT THIS VERSION OF HP-UX. *"
+	  echo "*                                              *"
+	  echo "************************************************"
+	  echo ""
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+	LSOF_CFGF="$LSOF_CFGF -DHPUXV=$LSOF_VERS"
+	LSOF_CINFO="/dev/kmem-based"
+	LSOF_DIALECT_DIR=hpux/kmem
+	echo "Configuring /dev/kmem-based HP-UX lsof"
+	if test $LSOF_VERS -lt 1000	# {
+	then
+	  if test "X$HPUX_X25DIR" = "X"	# {
+	  then
+	    HPUX_X25DIR="/etc/conf"
+	  else
+	    HPUX_X25DIR=$HPUX_X25DIR
+	  fi	# }
+	  if test -r ${HPUX_X25DIR}/x25/x25addrstr.h	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHPUX_CCITT"
+	    LSOF_DINC="$LSOF_DINC -I$HPUX_X25DIR"
+	  fi	# }
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/fs/vx_inode.h -a -r ${LSOF_INCLUDE}/sys/fs/vx_hpux.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
+	fi	# }
+	if test $LSOF_VERS -ge 1030	# {
+	then
+	  if test "X$HPUX_KERNBITS" = "X"	# {
+	  then
+	    HPUX_KERNBITS=`getconf _SC_KERNEL_BITS`
+	  fi	# }
+	  LSOF_CFGF="$LSOF_CFGF -DHPUXKERNBITS=${HPUX_KERNBITS} -I`pwd`/dialects/hpux/kmem/hpux11"
+	  if test $HPUX_KERNBITS -eq 64	# {
+	  then
+	    LSOF_TSTK64=1
+	    echo ""
+	    echo "*****************************************"
+	    echo "*                                       *"
+	    echo "* NOTICE!  Configuring for 64 bit HP-UX *"
+	    echo "*                                       *"
+	    echo "*****************************************"
+	    echo $LSOF_CC | grep gcc > /dev/null
+	    if test $? -eq 0	# {
+	    then
+
+	    # Test gcc for 64 bit support, trying gcc with no options, then
+	    # with -mlp64, testing the result with file.
+
+	      echo ""
+	      echo "Testing $LSOF_CC for 64 bit support"
+	      rm -f ${LSOF_TMPC}.*
+	      echo "main(){}" > ${LSOF_TMPC}.c
+	      LSOF_TMP1=""
+	      $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
+	      if test $? -eq 0	# {
+	      then
+		/bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null
+		if test $? -eq 0	# {
+		then
+		    LSOF_TMP1=" "
+		fi	# }
+	      fi	# }
+	      if test "X$LSOF_TMP1" = "X"	# {
+	      then
+		rm -f ${LSOF_TMPC}.x
+		$LSOF_CC ${LSOF_TMPC}.c -mlp64 -o ${LSOF_TMPC}.x > /dev/null 2>&1
+		if test $? -eq 0	# {
+		then
+		  /bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null
+		  if test $? -eq 0	# {
+		  then
+		      LSOF_TMP1="-mlp64"
+		  fi	# }
+		fi	# }
+	      fi	# }
+	      rm -f ${LSOF_TMPC}.*
+	      if test "X$LSOF_TMP1" = "X"	# {
+	      then
+		echo ""
+		echo "***************************************************"
+		echo "*                                                 *"
+		echo "* !!!!!!!!!!!!!!!!! FATAL ERROR !!!!!!!!!!!!!!!!! *"
+		echo "*                                                 *"
+		echo "* APPARENTLY GCC CANNOT BUILD 64 BIT EXECUTABLES. *"
+		echo "* A COMPILER MUST BE USED THAT CAN.  SEE 00FAQ    *"
+		echo "* FOR MORE INFORMATION.                           *"
+		echo "*                                                 *"
+		echo "***************************************************"
+		echo ""
+		rm -f $LSOF_HLP
+		exit 1
+	      else
+		if test "X$LSOF_TMP1" != "X "	# {
+		then
+		  LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
+		fi	# }
+		LSOF_CFGL="$LSOF_CFGL -lelf"
+		LSOF_CINFO="${LSOF_CINFO}, 64 bit HP-UX"
+	      fi	# }
+	    else
+
+	    # Set options for the HP-UX compiler.
+
+	      LSOF_CFGF="$LSOF_CFGF +DD64"
+	      LSOF_CFGL="$LSOF_CFGL -lelf"
+	      LSOF_CINFO="${LSOF_CINFO}, 64 bit HP-UX"
+	    fi	# }
+	  else
+	    LSOF_CFGF="$LSOF_CFGF -D_FILE_OFFSET_BITS=64"
+	    LSOF_CINFO="${LSOF_CINFO}, 32 bit HP-UX"
+	    echo $LSOF_CC | grep gcc > /dev/null
+	    if test $? -ne 0	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF +DAportable"
+	    fi	# }
+	  fi	# }
+	  LSOF_CFGL="$LSOF_CFGL -lnsl"
+	else
+
+	# When HP-UX is less than 10.30, but greater than or equal to 10,
+	# check NFS3 rnode status.
+
+	  if test $LSOF_VERS -ge 1000	# {
+	  then
+	    LSOF_TMP1=0
+	    if test "X$HPUX_RNODE3" = "X"	# {
+	    then
+	      nm -x $HPUX_BOOTFILE | grep -q nfs_vnodeops3
+	      if test $? -eq 0	# {
+	      then
+		if test -r ${LSOF_INCLUDE}/nfs/rnode.h	# {
+		then
+		  grep -q r_fh3 ${LSOF_INCLUDE}/nfs/rnode.h
+		  if test $? -ne 0	# {
+		  then
+		    LSOF_TMP1=1
+		  fi	# }
+		fi	# }
+	      fi	# }
+	    else
+	      if test "X$HPUX_RNODE3" = "X1"	# {
+	      then
+		LSOF_TMP1=1
+	      fi	# }
+	    fi	# }
+	    if test $LSOF_TMP1 -eq 1	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHASRNODE3"
+	    fi	# }
+	  fi # }
+	fi	# }
+	if test $LSOF_VERS -eq 1100	# {
+	then
+
+	# Test for the ipis_s structure.  If it is present, set HAS_IPC_S_PATCH.
+
+	  if test "X$HPUX_IPC_S_PATCH" = "X"	# {
+	  then
+	    if test -x /usr/contrib/Q4/bin/q4exe	# {
+	    then
+	      LSOF_TMP=/usr/contrib/Q4/bin/q4exe
+	    else
+	      LSOF_TMP=/usr/contrib/bin/q4
+	    fi	# }
+	    if test -x $LSOF_TMP	# {
+	    then
+	      rm -f ${LSOF_TMPC}.out
+	      echo ""
+	      echo $EO "Looking in $HPUX_BOOTFILE for ipis_s with $LSOF_TMP ... $EC"
+	      echo "yes\\nfields -c struct ipis_s" | $LSOF_TMP $HPUX_BOOTFILE > ${LSOF_TMPC}.out 2>&1
+	      if test $? -ne 0	# {
+	      then
+		echo ""
+		echo ""
+		echo "!!!ERROR!!! $LSOF_TMP failed and produced the following output."
+		echo ""
+		cat ${LSOF_TMPC}.out
+		HPUX_IPC_S_PATCH=fail
+	      else
+		grep ipis_s ${LSOF_TMPC}.out > /dev/null 2>&1
+		if test $? -eq 0	# {
+		then
+		  echo "ipis_s exists."
+
+		# See if ipis_msgsqueued is present.
+
+		  grep ipis_msgsqueued ${LSOF_TMPC}.out > /dev/null 2>&1
+		  if test $? -eq 0	# {
+		  then
+		    HPUX_IPC_S_PATCH=2
+		  else
+		    HPUX_IPC_S_PATCH=1
+		  fi	# }
+		else
+		  echo "ipis_s doesn't exist."
+		  HPUX_IPC_S_PATCH=N
+		fi	# }
+	      fi	# }
+	      rm -f ${LSOF_TMPC}.out
+	    else
+	      echo "Can't locate or execute $LSOF_TMP"
+	      echo $EO "ls says: $EC"
+	      ls -ld $LSOF_TMP
+	      HPUX_IPC_S_PATCH=fail
+	    fi	# }
+	  fi	# }
+	  if test "X$HPUX_IPC_S_PATCH" = "Xfail"	# {
+	  then
+	    echo ""
+	    echo "!!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!"
+	    echo "Configure can't use $LSOF_TMP to examine the ipis_s"
+	    echo "structure.  You must do that yourself, report the result in"
+	    echo "the HPUX_IPC_S_PATCH environment variable, then repeat the"
+	    echo "Configure step.  Consult the Configure script's use of"
+	    echo "$LSOF_TMP and the 00XCONFIG file for information"
+	    echo "on ipis_s testing and the setting of HPUX_IPC_S_PATCH."
+	    echo "!!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!     !!!ERROR!!!"
+	    echo ""
+	    rm -f $LSOF_HLP
+	    exit 1
+	  fi	# }
+	  if test "X$HPUX_IPC_S_PATCH" = "X1" -o "X$HPUX_IPC_S_PATCH" = "X2" # {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_IPC_S_PATCH=$HPUX_IPC_S_PATCH"
+	  else
+	    if test "X$HPUX_IPC_S_PATCH" != "Xn" -a "X$HPUX_IPC_S_PATCH" != "XN" # {
+	    then
+	      echo "Illegal value for HPUX_IPC_S_PATCH: $HPUX_IPC_S_PATCH"
+	      rm -f $LSOF_HLP
+	      exit 1
+	    fi	# }
+	  fi	# }
+	fi	#}
+
+	# Manufacture an hpux_mount.h header file with a mount struct in it, as
+	# required.
+
+	if test -r ${LSOF_INCLUDE}/sys/mount.h	# {
+	then
+	  LSOF_TMP1="dialects/${LSOF_DIALECT_DIR}/hpux_mount.h"
+	  rm -f $LSOF_TMP1
+	  echo "#if !defined(MANUFACTURED_HPUX_SYS_MOUNT_H)" > $LSOF_TMP1
+	  echo "#define MANUFACTURED_HPUX_SYS_MOUNT_H" >> $LSOF_TMP1
+	  echo "/* By lsof Configure:" `date` " */" >> $LSOF_TMP1
+	  echo "struct mount" >> $LSOF_TMP1
+	  sed '1,/struct mount/d' ${LSOF_INCLUDE}/sys/mount.h | sed -n '1,/m_dev/p' >> $LSOF_TMP1
+	  echo "};" >> $LSOF_TMP1
+	  echo "#endif" >> $LSOF_TMP1
+	  LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/${LSOF_DIALECT_DIR}"
+	fi	# }
+
+	# Test for OnlineJFS.
+
+	if test $LSOF_VERS -ge 1100	# {
+	then
+	  if test "X$HPUX_HASONLINEJFS" = "X" -a -x /sbin/fs/vxfs/subtype  # {
+	  then
+	    LSOF_TMP1=`/sbin/fs/vxfs/subtype`
+	    if test "X$LSOF_TMP1" = "Xvxfs3.3"
+	    then
+	      HPUX_HASONLINEJFS="Y"
+	    fi	# }
+	  fi	# }
+	  if test "X$HPUX_HASONLINEJFS" = "XY" -o "X$HPUX_HASONLINEJFS" = "Xy"
+	  # {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASONLINEJFS"
+	  fi	# }
+	fi	# }
+
+	# Test for AFS.
+
+	if test -r ${AFS_VICE}/etc/ThisCell	# {
+	then
+	  if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
+	  then
+	    if test -r ./AFSHeaders -a -r ./AFSVersion	# {
+	    then
+	      LSOF_AFS="yes"
+	    fi	# }
+	  else
+	    if test ! -x ./AFSConfig	# {
+	    then
+	      echo "Can't find or execute the AFSConfig script"
+	      rm -f $LSOF_HLP
+	      exit 1
+	    fi	# }
+	    ./AFSConfig
+	    if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
+	    then
+	      LSOF_AFS="yes"
+	    fi	# }
+	  fi	# }
+	  if test "X$LSOF_AFS" = "Xyes"	# {
+	  then
+	    LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
+	    LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
+	  fi	# }
+	fi	# }
+      else
+	echo "HP-UX base unrecognized: $HPUX_BASE"
+	rm -f $LSOF_HLP
+	exit 1
+      fi	# }
+    fi	# }
+    ;;
+
+# Configure for Linux.
+
+  linux)
+    LSOF_TSTBIGF="-D_FILE_OFFSET_BITS=64"
+    LSOF_TSTKMEM=0
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      LSOF_CC=cc
+      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+    fi	# }
+    if test "X$LINUX_CONF_CC" = "X"	# {
+    then
+      LINUX_CONF_CC=$LSOF_CC
+    fi	#}
+    LSOF_DIALECT_DIR=""
+    if test "X$LINUX_INCL" = "X" # {
+    then
+      LINUX_INCL=/usr/include
+    else
+      LSOF_DINC="$LSOF_DINC -I${LINUX_INCL}"
+    fi	# }
+    if test "X$LINUX_VERSION_CODE" = "X" # {
+    then
+      if test -r "$LINUX_INCL/linux/version.h" # {
+      then
+        LINUX_VERSION_CODE=`cat $LINUX_INCL/linux/version.h | sed -n 's/.\+LINUX_VERSION_CODE \([[:digit:]]\+\)$/\1/p'`
+      fi # }
+    fi # }
+    LSOF_VSTR=`echo $LINUX_VERSION_CODE | perl -e '$version=<STDIN>; chomp($version); printf("%d.%d.%d\n", ($version >> 16) & 0xFF, ($version >> 8) & 0xFF, $version & 0xFF);'`
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the Linux version isn't predefined, determine it.
+
+      LSOF_VERS=`echo $LSOF_VSTR | sed 's/\./ /g' | awk '{printf "%d%d%03d",\$1,\$2,\$3}'`
+    fi	# }
+    LSOF_CFGF="$LSOF_CFGF -DLINUXV=$LSOF_VERS"
+    if test $LSOF_VERS -lt 21072	# {
+    then
+      echo ""
+	echo "!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!"
+	echo "!                                                        !"
+	echo "! THE /PROC-BASED LSOF SOURCES HAVE NOT BEEN TESTED ON   !"
+	echo "! LINUX KERNELS BELOW 2.1.72, AND MAY NOT WORK ON THIS   !"
+	echo "! KERNEL.  IT SHOULD USE A /DEV/KMEM-BASED LSOF.         !"
+	echo "!                                                        !"
+	echo "!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!==!!!WARNING!!!"
+	echo ""
+    else
+      LSOF_UNSUP=""
+    fi	# }
+
+    # If the Linux C library type isn't predefined, determine it.
+
+    if test "X$LINUX_CLIB" = "X"	# {
+    then
+      echo -n "Testing C library type with $LINUX_CONF_CC ... "
+      rm -f ${LSOF_TMPC}.*
+      cat > $LSOF_TMPC.c << .LSOF_END_HERE_DOC1
+#include <features.h>
+main() {
+#if defined(__GLIBC__) && defined(__GLIBC_MINOR__)
+printf("-DGLIBCV=%d\n",__GLIBC__*100+__GLIBC_MINOR__);
+#elif defined(__GLIBC__)
+printf("-DGLIBCV=%d00\n",__GLIBC__);
+#else
+printf("\n");
+#endif
+return(0); }
+.LSOF_END_HERE_DOC1
+      $LINUX_CONF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x > /dev/null 2>&1
+      if test -x ${LSOF_TMPC}.x	# {
+      then
+	LINUX_CLIB=`${LSOF_TMPC}.x`
+	LSOF_TMP=$?
+      else
+	LINUX_CLIB=""
+	LSOF_TMP=1
+      fi	# }
+      rm -f ${LSOF_TMPC}.*
+      echo "done"
+      if test $LSOF_TMP -ne 0	# {
+      then
+	echo "Cannot determine C library type; assuming it is not glibc."
+	LINUX_CLIB=""
+      else
+	if test "X$LINUX_CLIB" = "X"	# {
+	then
+	  echo "The C library type is not glibc."
+	else
+	  echo "The C library type is glibc, version \"$LINUX_CLIB\"."
+	fi	# }
+      fi	# }
+    fi	# }
+    if test "X$LINUX_CLIB" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF $LINUX_CLIB"
+    fi	# }
+
+    # Test for IPv6 support.
+
+    if test -r ${LSOF_INCLUDE}/netinet/ip6.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+    fi	# }
+
+    # Test for <rpc/rpc.h>.
+
+    if ! test -r ${LSOF_INCLUDE}/rpc/rpc.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASNORPC_H"
+    fi	# }
+
+    # Test for SELinux support.
+
+    LSOF_TMP1=0
+    if test "X$LINUX_HASSELINUX" = "X"	# {
+    then
+      if test -r ${LSOF_INCLUDE}/selinux/selinux.h	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    else
+      if test "X$LINUX_HASSELINUX" = "XY" -o "X$LINUX_HASSELINUX" = "Xy" # {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    if test $LSOF_TMP1 -eq 1	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASSELINUX"
+      LSOF_CFGL="$LSOF_CFGL -lselinux"
+    fi	# }
+    LSOF_DIALECT_DIR="linux"
+    LSOF_CFGF="$LSOF_CFGF -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE"
+    ;;
+
+# Configure for NetBSD.
+
+  netbsd)
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      LSOF_CC=cc
+      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+      
+      # Validate the NetBSD version.
+
+      case $LSOF_VSTR in	# {
+      1.2*)
+	LSOF_VERS="1002000"
+	;;
+      1.3*)
+	LSOF_VERS="1003000"
+	;;
+      1.4*)
+	LSOF_VERS="1004000"
+	;;
+      1.5*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="1005000"
+	;;
+      1.6*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="1006000"
+	;;
+      1*)
+	LSOF_VERS="1006000"
+	echo "!!!WARNING!!!  Unsupported NetBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for NetBSD 1.6"
+	;;
+      2.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="2000000"
+	;;
+      2.99.9)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="2099009"
+	;;
+      2.99.10)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="2099010"
+	;;
+      2.99.*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="2099010"
+	;;
+      2*)
+	LSOF_VERS="2000000"
+	echo "!!!WARNING!!!  Unsupported NetBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for NetBSD 2.0"
+	;;
+      3.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="3000000"
+	;;
+      3.99.*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS="3099000"
+	;;
+      3*)
+	LSOF_VERS="3000000"
+	echo "!!!WARNING!!!  Unsupported NetBSD version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for NetBSD 3.0"
+	;;
+      *)
+	echo "Unknown NetBSD release: $LSOF_VSTR"
+	echo Assuming NetBSD 1.6
+	LSOF_VERS="1006000"
+	;;
+      esac	# }
+    fi	# }
+
+    # Test for legal NetBSD version.
+
+    case $LSOF_VERS in	# {
+    1002000|1003000|1004000|1005000|1006000)
+      ;;
+    2000000|2099009|2099010)
+      ;;
+    3000000|3099000)
+      ;;
+    *)
+      echo "Unknown NetBSD version: $LSOF_VERS"
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    LSOF_CFGF="$LSOF_CFGF -DNETBSDV=$LSOF_VERS"
+    LSOF_TMP1="-DN_UNIXV=/netbsd"
+    if test -r ${LSOF_INCLUDE}/util.h	# {
+    then
+      grep -q getbootfile ${LSOF_INCLUDE}/util.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGL="$LSOF_CFGL -lutil"
+	LSOF_TMP1="-DHASGETBOOTFILE"
+      fi	# }
+    fi	# }
+    LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
+    if test -r ${LSOF_INCLUDE}/kvm.h	# {
+    then
+      grep -q kvm_getproc2 ${LSOF_INCLUDE}/kvm.h
+      if test $? -eq 0	# {
+      then
+	  LSOF_CFGF="$LSOF_CFGF -DHASKVMGETPROC2"
+      fi	# }
+    fi	# }
+
+  # Here begin the dual tests on header files that may be in $LSOF_INCLUDE
+  # or $NETBSD_SYS.
+  #
+  # Note that $LSOF_TMP1 holds an indicator of the need for -I$NETBSD_SYS.
+  # LSOF_TMP4 contains a temporary indicator of the use of $NETBSD_SYS.
+
+    LSOF_TMP1=0
+    if test "X$NETBSD_SYS" = "X"	# {
+    then
+      if test -d /usr/src	# {
+      then
+	NETBSD_SYS="/usr/src/sys"
+      else
+	NETBSD_SYS=$LSOF_INCLUDE
+      fi	# }
+    fi	# }
+    LSOF_TMP2="nfs/nfsproto.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASNFSPROTO"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    LSOF_TMP2="netinet/ip6.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    else
+      LSOF_TMP2="netinet/in.h"
+      if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+	LSOF_TMP4=0
+      else
+	if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+	then
+	  LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	  LSOF_TMP4=1
+	else
+	  LSOF_TMP3=""
+	fi	# }
+      fi	# }
+      if test "X$LSOF_TMP3" != "X"	# {
+      then
+	grep -q IPV6_INRIA_VERSION $LSOF_TMP3
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASIPv6 -DHASINRIAIPv6"
+	  if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	  then
+	    LSOF_TMP1=1
+	  fi	# }
+	fi	# }
+      fi # }
+    fi	# }
+    LSOF_TMP2="miscfs/fdesc/fdesc.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q Fctty $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=1"
+      else
+	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=2"
+      fi	# }
+      grep -q fd_link $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASFDLINK"
+      fi	# }
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    LSOF_TMP2="miscfs/nullfs/null.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    LSOF_TMP2="miscfs/procfs"
+    if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+      if test -r ${LSOF_TMP3}/procfs.h	# {
+      then
+	grep -q PFSroot ${LSOF_TMP3}/procfs.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASPROCFS_PFSROOT"
+	fi #	}
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/bufq.h"
+    LSOF_NBSD_BUFQH=0
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASBUFQ_H"
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	if test $NETBSD_SYS != $LSOF_INCLUDE	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASBUFQ_H"
+	  LSOF_NBSD_BUFQH=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="isofs/cd9660"
+    if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=1"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    else
+      LSOF_TMP2="fs/cd9660"
+      if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+	LSOF_TMP4=0
+      else
+	if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
+	then
+	  LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	  LSOF_TMP4=1
+	else
+	  LSOF_TMP3=""
+	fi	# }
+      fi	# }
+      if test "X$LSOF_TMP3" != "X"	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=1"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="msdosfs"
+    if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=1"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    else
+      LSOF_TMP2="fs/msdosfs"
+      if test -d ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+	LSOF_TMP4=0
+      else
+	if test -d ${NETBSD_SYS}/$LSOF_TMP2	# {
+	then
+	  LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	  LSOF_TMP4=1
+	else
+	  LSOF_TMP3=""
+	fi	# }
+      fi	# }
+      if test "X$LSOF_TMP3" != "X"	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=2"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="miscfs/kernfs/kernfs.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q "kt_name;" $LSOF_TMP3
+      if test $? -eq 0	# {
+	then
+ 	  LSOF_CFGF="$LSOF_CFGF -DHASKERNFS"
+	  if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	  then
+	    LSOF_TMP1=1
+	  fi	# }
+	  grep -q "*kfs_kt;" $LSOF_TMP3
+	  if test $? -eq 0      # {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASKERNFS_KFS_KT"
+	  fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/namei.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q nc_vpid $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="ufs/ufs/inode.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q i_ffs_size $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASI_FFS"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      else
+	grep -q i_ffs1_size $LSOF_TMP3
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASI_FFS1"
+	  if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	  then
+	    LSOF_TMP1=1
+	  fi	# }
+	fi	# }
+      fi	# }
+      grep -q i_ffs_effnlink $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASEFFNLINK=i_ffs_effnlink"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/vnode.h"
+    LSOF_NBSD_PTYFS=0
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "XLSOF_TMP3" != "X"	# {
+    then
+      grep -q VT_EXT2FS $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASEXT2FS"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+	LSOF_TMP2="ufs/ufs/inode.h"
+	if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+	then
+	  LSOF_TMP5="${LSOF_INCLUDE}/$LSOF_TMP2"
+	  LSOF_TMP6=0
+	else
+	  if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+	  then
+	    LSOF_TMP5="${NETBSD_SYS}/$LSOF_TMP2"
+	    LSOF_TMP6=1
+	  else
+	    LSOF_TMP5=""
+	  fi	# }
+	fi	# }
+	if test "X$LSOF_TMP5" != "X"	# {
+	then
+	  grep -q "*e2fs_din" $LSOF_TMP5
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASI_E2FS_PTR"
+	    if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	    then
+	      LSOF_TMP1=$LSOF_TMP6
+	    fi	# }
+	  fi	# }
+	fi	# }
+      fi	# }
+      grep -q VT_LFS $LSOF_TMP3
+      if test $? -eq 0   # {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASLFS"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+      grep -q VT_PTYFS $LSOF_TMP3
+      if test $? -eq 0   # {
+      then
+	LSOF_TMP2="fs/ptyfs/ptyfs.h"
+	if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASPTYFS"
+	else
+	  if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+	  then
+	    if test $NETBSD_SYS != $LSOF_INCLUDE	# {
+	    then
+	      LSOF_CFGF="$LSOF_CFGF -DHASPTYFS"
+	      LSOF_NBSD_PTYFS=1
+	    fi	# }
+	  fi	# }
+	fi	# }
+      fi	# }
+      if test "X$NETBSD_UVM" = "X"	# {
+      then
+	grep -q UVM $LSOF_TMP3
+	if test $? -ne 0	# {
+	then
+	  egrep -q "v_uvm;|v_uobj;" $LSOF_TMP3
+	  if test $? -eq 0	# {
+	  then
+	    NETBSD_UVM="Y"
+	  fi	# }
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="nfs/nfsnode.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q "*n_vattr" $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNFSVATTRP"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/lockf.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q vop_advlock_args $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_ADVLOCK_ARGS"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+      grep -q lf_lwp $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_LF_LWP"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/lwp.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS_LWP_H"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/filedesc.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      grep -q "^struct cwdinfo {" $LSOF_TMP3
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASCWDINFO"
+	if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+	then
+	  LSOF_TMP1=1
+	fi	# }
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/pipe.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+      LSOF_TMP4=0
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+	LSOF_TMP4=1
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_PIPEH"
+      if test $LSOF_TMP1 -eq 0 -a $LSOF_TMP4 -eq 1	# {
+      then
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/statvfs.h 	# {
+    then
+      grep -q '^struct statvfs {' ${LSOF_INCLUDE}/sys/statvfs.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASSTATVFS"
+      fi	# }
+    fi	# }
+
+  # Here end the dual NetBSD tests for header files in $LSOF_INCLUDE or
+  # NETBSD_SYS.
+  #
+  # After this LSOF_TMP1 may be reused.
+
+    if test $LSOF_TMP1 -eq 1	# {
+    then
+      LSOF_DINC="-I$LSOF_INCLUDE -I$NETBSD_SYS"
+    fi	# }
+
+  # Build special header files, as required.
+
+    rm -rf dialects/n+obsd/include
+    if test "X$NETBSD_UVM" = "XY" -o "X$NETBSD_UVM" = "Xy"	# {
+    then
+      mkdir dialects/n+obsd/include
+      touch dialects/n+obsd/include/opt_uvmhist.h
+      touch dialects/n+obsd/include/opt_lockdebug.h
+      LSOF_CFGF="$LSOF_CFGF -DUVM -I`pwd`/dialects/n+obsd/include"
+      if test -d ${LSOF_INCLUDE}/uvm	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_UVM_INCL"
+      fi	# }
+    fi	# }
+    LSOF_TMP2="sys/mount.h"
+    if test -r ${LSOF_INCLUDE}/$LSOF_TMP2	# {
+    then
+      LSOF_TMP3="${LSOF_INCLUDE}/$LSOF_TMP2"
+    else
+      if test -r ${NETBSD_SYS}/$LSOF_TMP2	# {
+      then
+	LSOF_TMP3="${NETBSD_SYS}/$LSOF_TMP2"
+      else
+	LSOF_TMP3=""
+      fi	# }
+    fi	# }
+    if test "X$LSOF_TMP3" != "X"	# {
+    then
+
+      # Build a local NetBSD netexport.h header file for possible use by
+      # <msdosfs/msdosfsmount.h>.  Make sure CFGL contains a -I for it.
+
+      LSOF_TMP1=${LSOF_TMPC}.edscr
+      LSOF_TMP2=${LSOF_TMPC}.netcred
+      LSOF_TMP3=${LSOF_TMPC}.netexport
+      LSOF_TMP4=dialects/n+obsd/include/netexport.h
+      if test ! -d dialects/n+obsd/include	# {
+      then
+	mkdir dialects/n+obsd/include
+      fi	# }
+      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 
+      echo "/^struct netcred" > $LSOF_TMP1
+      echo "1,.-1d" >> $LSOF_TMP1
+      echo "/^};" >> $LSOF_TMP1
+      echo "1,.w $LSOF_TMP2" >> $LSOF_TMP1
+      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
+      rm -f $LSOF_TMP1
+      echo "/^struct netexport" > $LSOF_TMP1
+      echo "1,.-1d" >> $LSOF_TMP1
+      echo "/^};" >> $LSOF_TMP1
+      echo "1,.w $LSOF_TMP3" >> $LSOF_TMP1
+      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
+      echo "/*" > $LSOF_TMP4
+      echo " * netexport.h" >> $LSOF_TMP4
+      echo -n " * Created by Configure: " >> $LSOF_TMP4
+      echo `date` >> $LSOF_TMP4
+      echo " */" >> $LSOF_TMP4
+      echo "" >> $LSOF_TMP4
+      echo "#if	!defined(NETEXPORT_H)" >> $LSOF_TMP4
+      echo "#define	NETEXPORT_H" >> $LSOF_TMP4
+      echo "" >> $LSOF_TMP4
+      echo "#include <net/radix.h>" >> $LSOF_TMP4
+      echo "" >> $LSOF_TMP4
+      if test -r $LSOF_TMP2	# {
+      then
+	cat $LSOF_TMP2 >> $LSOF_TMP4
+	echo "" >> $LSOF_TMP4
+      fi	# }
+      if test -r $LSOF_TMP3	# {
+      then
+	cat $LSOF_TMP3 >> $LSOF_TMP4
+      fi	# }
+      echo "#endif	/* !defined(NETEXPORT_H) */" >> $LSOF_TMP4
+      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3
+      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
+      if test $? -ne 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
+      fi	# }
+    fi	# }
+    if test $LSOF_NBSD_BUFQH -eq 1	# {
+    then
+
+    # Make a local copy of $NETBSD_SYS/sys/bufq.h.
+
+      if test ! -d dialects/n+obsd/include	# {
+      then
+	mkdir dialects/n+obsd/include
+      fi	# }
+      if test ! -d dialects/n+obsd/include/sys	# {
+      then
+	mkdir dialects/n+obsd/include/sys
+      fi	# }
+      cp $NETBSD_SYS/sys/bufq.h dialects/n+obsd/include/sys
+      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
+      if test $? -ne 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
+      fi	# }
+    fi	# }
+    if test $LSOF_NBSD_PTYFS -eq 1	# {
+    then
+
+    # Make a local copy of $NETBSD_SYS/sys/fs/ptyfs/.
+
+      if test ! -d dialects/n+obsd/include	# {
+      then
+	mkdir dialects/n+obsd/include
+      fi	# }
+      if test ! -d dialects/n+obsd/include/fs	# {
+      then
+	mkdir dialects/n+obsd/include/fs
+      fi	# }
+      rm -rf dialects/n+obsd/include/fs/ptyfs
+      mkdir dialects/n+obsd/include/fs/ptyfs
+      cp $NETBSD_SYS/fs/ptyfs/*.h dialects/n+obsd/include/fs/ptyfs
+      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
+      if test $? -ne 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
+      fi	# }
+    fi	# }
+    LSOF_CFGL="$LSOF_CFGL -lkvm"
+    LSOF_DIALECT_DIR=n+obsd
+    ;;
+
+# Configure for NeXTSTEP or OPENSTEP.
+
+  nextstep|next|ns|nxt|openstep|os)
+    LSOF_TGT="ns"
+    LSOF_TSTXO="../lib/snpf.o"
+    if test "X$LSOF_AR" = "X"	# {
+    then
+      LSOF_AR="rm -f \${LIB}; ar cr"
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`hostinfo | sed -n 's/.*NeXT Mach \([0-9\.]*\).*/\1/p'`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the NeXSTEP version isn't predefined, determine it.
+
+      LSOF_VERS=`echo $LSOF_VSTR | sed -n 's/\([0-9]*\)\.\([0-9]*\)/\1\2/p'`
+    fi	# }
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      if test -x /usr/local/bin/gcc	# {
+      then
+	LSOF_CC=/usr/local/bin/gcc
+	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+      else
+	LSOF_CC=cc
+	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+      fi	# }
+    fi	# }
+    echo $LSOF_CC | grep gcc > /dev/null
+    if test $? -eq 0	# {
+    then
+      LSOF_CFGL="$LSOF_CFGL -w"
+      LSOF_DEBUG="-pedantic -O"
+    fi	# }
+    LSOF_CFGF="$LSOF_CFGF -DSTEPV=$LSOF_VERS"
+    LSOF_DIALECT_DIR=n+os
+
+    # Test for AFS.
+
+    if test -r ${AFS_VICE}/etc/ThisCell	# {
+    then
+      if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
+      then
+	if test -r ./AFSHeaders -a -r ./AFSVersion	# {
+	then
+	  LSOF_AFS="yes"
+	fi	# }
+      else
+	if test ! -x ./AFSConfig	# {
+	then
+	  echo "Can't find or execute the AFSConfig script"
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+	./AFSConfig
+	if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
+	then
+	    LSOF_AFS="yes"
+	fi	# }
+      fi	# }
+      if test "X$LSOF_AFS" = "Xyes"	# {
+      then
+	LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
+	LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
+	LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
+      fi	# }
+    fi	# }
+    ;;
+
+# Configure for OpenBSD.  (OpenBSD uses NetBSD dialect sources and version
+# numbering.
+
+  openbsd)
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      LSOF_CC=cc
+      LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the OpenBSD version isn't pre-defined, determine it.
+
+      case $LSOF_VSTR in	# {
+      1*)
+	LSOF_VERS=1020
+	echo "!!!WARNING!!!  Unsupported OpenBSD 1.x version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for OpenBSD 1.2"
+	;;
+      2.5*)
+	LSOF_VERS=2050
+	;;
+      2.6*)
+	LSOF_VERS=2060
+	;;
+      2.7*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=2070
+	;;
+      2.8*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=2080
+	;;
+      2.9*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=2090
+	;;
+      2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=2090
+	echo "!!!WARNING!!!  Unsupported OpenBSD 2.x version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for OpenBSD 2.9"
+	;;
+      3.0*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3000
+	;;
+      3.1*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3010
+	;;
+      3.2*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3020
+	;;
+      3.3*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3030
+	;;
+      3.4*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3040
+	;;
+      3.5*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3050
+	;;
+      3.6*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3060
+	;;
+      3.7*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3070
+	;;
+      3.8*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3080
+	;;
+      3.9*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3090
+	;;
+      3*)
+	LSOF_TSTBIGF=" "
+	LSOF_VERS=3090
+	echo "!!!WARNING!!!  Unsupported OpenBSD 3.x version: $LSOF_VSTR"
+	echo "!!!WARNING!!!  Configuring for OpenBSD 3.9"
+	;;
+      *)
+	echo "Unknown OpenBSD release: $LSOF_VSTR"
+	echo Assuming OpenBSD 3.9
+	LSOF_VERS=3090
+	;;
+      esac	# }
+    fi	# }
+
+    # Test for legal OpenBSD version.
+
+    case $LSOF_VERS in	# {
+    1020|2050|2060|2070|2080|2090|3000|3010|3020|3030|3040|3050|3060|3070|3080|3090)
+      ;;
+    *)
+      echo "Unknown OpenBSD version: $LSOF_VERS"
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    LSOF_CFGF="$LSOF_CFGF -DOPENBSDV=$LSOF_VERS"
+    if test -r /dev/ksyms	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DN_UNIXV=/dev/ksyms"
+    else
+      LSOF_CFGF="$LSOF_CFGF -DN_UNIXV=/bsd"
+    fi
+    if test -r ${LSOF_INCLUDE}/nfs/nfsproto.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASNFSPROTO"
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/netinet6/in6.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+    fi	# }
+    LSOF_TMP1=0
+    if test "X$OPENBSD_SYS" = "X"	# {
+    then
+      OPENBSD_SYS="/sys"
+    fi	# }
+    if test -r ${OPENBSD_SYS}/miscfs/fdesc/fdesc.h	# {
+    then
+      grep -q Fctty ${OPENBSD_SYS}/miscfs/fdesc/fdesc.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=1"
+      else
+	LSOF_CFGF="$LSOF_CFGF -DHASFDESCFS=2"
+      fi	# }
+      grep -q fd_link ${OPENBSD_SYS}/miscfs/fdesc/fdesc.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASFDLINK"
+      fi	# }
+      LSOF_TMP1=1
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
+    then
+      grep -q VT_LFS ${LSOF_INCLUDE}/sys/vnode.h
+      if test $? -eq 0   # {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASLFS"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/miscfs/nullfs/null.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
+    else
+      if test -r ${OPENBSD_SYS}/miscfs/nullfs/null.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNULLFS"
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    if test -d ${OPENBSD_SYS}/miscfs/procfs	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASPROCFS"
+      LSOF_TMP1=1
+    fi	# }
+    if test -d ${OPENBSD_SYS}/isofs/cd9660	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=1"
+      LSOF_TMP1=1
+    else
+      if test -d ${OPENBSD_SYS}/fs/cd9660	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS9660FS=2"
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    if test -d ${OPENBSD_SYS}/msdosfs	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=1"
+      LSOF_TMP1=1
+    else
+      if test -d ${OPENBSD_SYS}/fs/msdosfs	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASMSDOSFS=2"
+	LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    if test -r ${OPENBSD_SYS}/miscfs/kernfs/kernfs.h	# {
+    then
+      grep -q "kt_name;" ${OPENBSD_SYS}/miscfs/kernfs/kernfs.h
+      if test $? -eq 0	# {
+	then
+ 	  LSOF_CFGF="$LSOF_CFGF -DHASKERNFS"
+	  LSOF_TMP1=1
+      fi	# }
+    fi	# }
+    if test $LSOF_TMP1 -eq 1 -a "X$LSOF_INCLUDE" != "X$OPENBSD_SYS"	# {
+    then
+      LSOF_DINC="-I$LSOF_INCLUDE -I$OPENBSD_SYS"
+    fi	# }
+    grep -q VT_EXT2FS ${LSOF_INCLUDE}/sys/vnode.h
+    if test $? -eq 0	# {
+    then
+      LSOF_TMP1=1
+      if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
+      then
+	grep -q "*e2fs_din" ${LSOF_INCLUDE}/ufs/ufs/inode.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASI_E2FS_PTR"
+	fi	# }
+	grep -q "^#define[ 	]i_e2din" ${LSOF_INCLUDE}/ufs/ufs/inode.h
+	if test $? -eq 0	# {
+	then
+	  LSOF_TMP1=2
+	fi	# }
+      fi	# }
+      LSOF_CFGF="$LSOF_CFGF -DHASEXT2FS=$LSOF_TMP1"
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h	# {
+    then
+      grep -q i_effnlink ${LSOF_INCLUDE}/ufs/ufs/inode.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASEFFNLINK=i_effnlink"
+      fi	# }
+      grep -q dinode_u ${LSOF_INCLUDE}/ufs/ufs/inode.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_DINODE_U"
+      fi	# }
+      grep -q i_ffs1_size ${LSOF_INCLUDE}/ufs/ufs/inode.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASI_FFS1"
+      fi	# }
+      grep -q UM_UFS ${LSOF_INCLUDE}/ufs/ufs/inode.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_UM_UFS"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/namei.h
+    then
+      grep -q nc_vpid ${LSOF_INCLUDE}/sys/namei.h
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASNCVPID"
+      fi	# }
+    fi	# }
+    if test "X$OPENBSD_UVM" = "X"	# {
+    then
+      if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
+      then
+	grep -q UVM ${LSOF_INCLUDE}/sys/vnode.h
+	if test $? -ne 0	# {
+	then
+	  egrep -q "v_uvm;|v_uobj;" ${LSOF_INCLUDE}/sys/vnode.h
+	  if test $? -eq 0	# {
+	  then
+	    OPENBSD_UVM="Y"
+	  fi	# }
+	fi	# }
+      fi	# }
+    fi	# }
+    if test "X$OPENBSD_UVM" = "XY" -o "X$OPENBSD_UVM" = "Xy"	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DUVM"
+      if test -d ${LSOF_INCLUDE}/uvm	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_UVM_INCL"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/mount.h -a $LSOF_VERS -lt 3030	# {
+    then
+
+      # Build a local OpenBSD netexport.h header file for possible use by
+      # <msdosfs/msdosfsmount.h>.  Make sure CFGL contains a -I for it.
+
+      LSOF_TMP1=${LSOF_TMPC}.edscr
+      LSOF_TMP2=${LSOF_TMPC}.netcred
+      LSOF_TMP3=${LSOF_TMPC}.netexport
+      LSOF_TMP4=dialects/n+obsd/include/netexport.h
+      if test ! -d dialects/n+obsd/include	# {
+      then
+	mkdir dialects/n+obsd/include
+      fi	# }
+      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3 $LSOF_TMP4 
+      echo "/^struct netcred" > $LSOF_TMP1
+      echo "1,.-1d" >> $LSOF_TMP1
+      echo "/^};" >> $LSOF_TMP1
+      echo "1,.w $LSOF_TMP2" >> $LSOF_TMP1
+      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
+      rm -f $LSOF_TMP1
+      echo "/^struct netexport" > $LSOF_TMP1
+      echo "1,.-1d" >> $LSOF_TMP1
+      echo "/^};" >> $LSOF_TMP1
+      echo "1,.w $LSOF_TMP3" >> $LSOF_TMP1
+      ed ${LSOF_INCLUDE}/sys/mount.h < $LSOF_TMP1 > /dev/null 2>&1
+      echo "/*" > $LSOF_TMP4
+      echo " * netexport.h" >> $LSOF_TMP4
+      echo -n " * Created by Configure: " >> $LSOF_TMP4
+      echo `date` >> $LSOF_TMP4
+      echo " */" >> $LSOF_TMP4
+      echo "" >> $LSOF_TMP4
+      echo "#if	!defined(NETEXPORT_H)" >> $LSOF_TMP4
+      echo "#define	NETEXPORT_H" >> $LSOF_TMP4
+      echo "" >> $LSOF_TMP4
+      echo "#include <net/radix.h>" >> $LSOF_TMP4
+      echo "" >> $LSOF_TMP4
+      if test -r $LSOF_TMP2	# {
+      then
+	cat $LSOF_TMP2 >> $LSOF_TMP4
+	echo "" >> $LSOF_TMP4
+      fi	# }
+      if test -r $LSOF_TMP3	# {
+      then
+	cat $LSOF_TMP3 >> $LSOF_TMP4
+      fi	# }
+      echo "#endif	/* !defined(NETEXPORT_H) */" >> $LSOF_TMP4
+      rm -f $LSOF_TMP1 $LSOF_TMP2 $LSOF_TMP3
+      echo $LSOF_CFGF | grep /dialects/n+obsd/include > /dev/null 2>&1
+      if test $? -ne 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/n+obsd/include"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/lockf.h	# {
+    then
+      grep vop_advlock_args ${LSOF_INCLUDE}/sys/lockf.h > /dev/null
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_ADVLOCK_ARGS"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/pipe.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_PIPEH"
+    fi	# }
+    LSOF_CFGL="$LSOF_CFGL -lkvm"
+    LSOF_DIALECT_DIR=n+obsd
+    ;;
+
+# Configure for SCO OpenServer.
+
+  osr|osrgcc|sco|scogcc)
+    if test "X$LSOF_RANLIB_SUP" = "X"	# {
+    then
+      LSOF_RANLIB=""
+    fi	# }
+    if test "X$OSR_CFGF" != "X"	# {
+    then
+
+    # Adopt LSOF_CFGF from OSR_CFGF in environment.
+
+      LSOF_CFGF=$OSR_CFGF
+    fi	# }
+    if test "X$OSR_CFGL" != "X"	# {
+    then
+
+    # Adopt LSOF_CFGL from OSR_CFGL in environment.
+
+      LSOF_CFGL=$OSR_CFGL
+    fi	# }
+
+  # Evaluate compiler specification.
+
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      if test "X$LSOF_TGT" = "Xosr" -o "X$LSOF_TGT" = "Xsco"	# {
+      then
+	LSOF_CC=cc
+	LSOF_TMP1=1
+      else
+	LSOF_CC=gcc
+	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+	LSOF_TMP1=2
+      fi	# }
+    else
+	LSOF_TMP1=0
+    fi	# }
+    LSOF_TGT="osr"
+
+  # Determine version.
+
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR="`LANG=C_C.C /bin/uname -X 2>/dev/null | grep Release | sed 's/Release = \(.*\)/\1/'`"
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the SCO OpenServer release version isn't predefined, determine it.
+
+      case $LSOF_VSTR in	# {
+      3.2v2.0)
+	LSOF_VERS="20"
+	;;
+      3.2v2.1)
+	LSOF_VERS="21"
+	;;
+      3.2v4.0)
+	LSOF_VERS="40"
+	;;
+      3.2v4.1)
+	LSOF_VERS="41"
+	;;
+      3.2v4.2)
+	LSOF_VERS="42"
+	;;
+      3.2v5.*)
+	LSOF_TSTLFLG="-lsocket"
+	LSOF_VERS="`echo $LSOF_VSTR | sed 's/3\.2v//; s/\.//g'`"
+	;;
+      *)
+	echo Unknown SCO OpenServer release: $LSOF_VSTR
+	echo Assuming 3.2.0 or 3.2.1
+	LSOF_VERS="0"
+	;;
+      esac	# }
+    fi	# }
+
+    # Do SCO OpenServer specific stuff.
+
+    case $LSOF_VERS in	# {
+    0)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -nointl"
+	LSOF_DEBUG="-Ox"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
+      LSOF_MKC="cp"
+      ;;
+    20)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_DEBUG="-Ox"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
+      LSOF_MKC="cp"
+      ;;
+    21)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -nointl"
+	LSOF_DEBUG="-Ox"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
+      LSOF_MKC="cp"
+      ;;
+    40)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -nointl"
+	LSOF_DEBUG="-Ox"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
+      ;;
+    41)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -nointl"
+	LSOF_DEBUG="-Ox"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
+      ;;
+    42)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -nointl"
+	LSOF_DEBUG="-Ox"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lrpc -lsocket -lc_s"
+      ;;
+    5*)
+      if test $LSOF_TMP1 -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -belf"
+	LSOF_DEBUG="-O3 -Kspace"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lsocket"
+      ;;
+    *)
+      echo "Unsupported SCO OpenServer release: $LSOF_VERS"
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    LSOF_CFGF="$LSOF_CFGF -DOSRV=$LSOF_VERS"
+    if test "X$OSR_STATLSTAT" = "X"	# {
+    then
+      echo "Testing libc.a for statlstat"
+      /bin/nm /lib/libc.a | grep statlstat > /dev/null 2>&1
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_STATLSTAT"
+      fi	# }
+    else
+      if test "X$OSR_STATLSTAT" = "XY" -o "X$OSR_STATLSTAT" = "Xy"	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_STATLSTAT"
+      fi	# }
+    fi	# }
+    if test -r ${LSOF_INCLUDE}/sys/fs/nfs/rnode.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHAS_NFS"
+    fi	# }
+    if test ! -r ${LSOF_INCLUDE}/netdb.h	# {
+    then
+      LSOF_DINC="$LSOF_DINC -I`pwd`/dialects/osr/include"
+    fi	# }
+    LSOF_DIALECT_DIR=osr
+    ;;
+
+# Configure for Sun Solaris, SunPro C and gcc.
+
+  solaris|solariscc)
+    if test "X$LSOF_RANLIB_SUP" = "X"	# {
+    then
+      LSOF_RANLIB=""
+    fi	# }
+    if test "X$LSOF_CC" = "X"	# {
+    then
+      if test "X$LSOF_TGT" = "Xsolariscc"	# {
+      then
+	if test "X$SOLARIS_CCDIR" = "X"	# {
+	then
+	  SOLARIS_CCDIR="/opt/SUNWspro/bin"
+	fi	# }
+	if test -x ${SOLARIS_CCDIR}/cc	# {
+	then
+	  LSOF_CC=${SOLARIS_CCDIR}/cc
+	else
+	  if test -x /opt/SunStudioExpress/bin/cc	# {
+	  then
+	    LSOF_CC=/opt/SunStudioExpress/bin/cc
+	  else
+	    echo "WARNING: no cc in ${SOLARIS_CCDIR}; using cc without path."
+	    LSOF_CC=cc
+	  fi	# }
+	fi	# }
+	LSOF_CCV=`$LSOF_CC -V 2>&1 | sed -n 's/^cc: \(.*\)/\1/p'`
+      else
+	LSOF_CC=gcc
+	LSOF_CCV=`$LSOF_CC -v 2>&1 | sed -n 's/.*version \(.*\)/\1/p'`
+      fi	# }
+    fi	# }
+    LSOF_TGT="solaris"
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -r`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the Solaris version isn't predefined, determine it.
+
+      case $LSOF_VSTR in	# {
+      5.[0-2])
+	LSOF_VERS="20300"
+	;;
+      5.3)
+	LSOF_VERS="20300"
+	;;
+      5.4)
+	LSOF_VERS="20400"
+	;;
+      5.5)
+	LSOF_VERS="20500"
+	;;
+      5.5.1)
+	LSOF_VERS="20501"
+	;;
+      5.6*)
+	LSOF_TSTLFLG="-lsocket -lnsl"
+	LSOF_VERS="20600"
+	;;
+      5.7*)
+	LSOF_TSTBIGF=" "
+	LSOF_TSTLFLG="-lsocket -lnsl"
+	LSOF_VERS="70000"
+	;;
+      5.8*)
+	LSOF_TSTBIGF=" "
+	LSOF_TSTLFLG="-lsocket -lnsl"
+	LSOF_VERS="80000"
+	;;
+      5.9*)
+	LSOF_TSTBIGF=" "
+	LSOF_TSTLFLG="-lsocket -lnsl"
+	LSOF_VERS="90000"
+	;;
+      5.10*)
+	LSOF_TSTBIGF=" "
+	LSOF_TSTLFLG="-lsocket -lnsl"
+	LSOF_VERS="100000"
+	;;
+      5.11*)
+	LSOF_TSTBIGF=" "
+	LSOF_TSTLFLG="-lsocket -lnsl"
+	LSOF_VERS="110000"
+	;;
+      *)
+	echo Unknown Solaris version: $LSOF_VSTR
+	rm -f $LSOF_HLP
+	exit 1
+      esac	# }
+    fi	# }
+
+    # Clear LSOF_UNSUP message for selected Solaris versions.
+
+    case $LSOF_VERS in	# {
+    90000|100000|110000)
+      LSOF_UNSUP=""
+      ;;
+    esac	# }
+
+    # Do Solaris version-specific stuff.
+
+    case $LSOF_VERS in	# {
+    20300)
+
+      # Solaris patch 101318-32 creates a longer kernel tcp_s structure,
+      # and 101318-45 changes the way the vnode's v_filocks member is
+      # handled.  The following code creates a symbol definition for
+      # patch 101318 whose value is the patch level.  No symbol is defined
+      # if the patch level is not greater than zero.
+
+      if test "X$SOLARIS_23P101318" = "X"	# {
+      then
+	LSOF_PL=`grep -h SUNW_PATCHID=101318 /var/sadm/pkg/SUNWcar*/pkginfo | sed 's/.*-//' | sort -u | tail -1`
+	if test "X$LSOF_PL" = "X"	# {
+	then
+	  LSOF_PL=0
+	fi	# }
+      else
+	LSOF_PL=$SOLARIS_23P101318
+      fi	# }
+      if test $LSOF_PL -gt 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DP101318=$LSOF_PL"
+      fi	# }
+      ;;
+    20400)
+      if test "X$SOLARIS_24P101945" = "X"	# {
+      then
+	LSOF_PL=`grep -h SUNW_PATCHID=101945 /var/sadm/pkg/SUNWcar*/pkginfo | sed 's/.*-//' | sort -u | tail -1`
+	if test "X$LSOF_PL" = "X"	# {
+	then
+	  LSOF_PL=0
+	fi	# }
+      else
+	LSOF_PL=$SOLARIS_24P101945
+      fi	# }
+      if test $LSOF_PL -ge 32	# {
+      then
+	if test "X$SOLARIS_24P102303" = "X"	# {
+	then
+	  LSOF_PL=`grep -h SUNW_PATCHID=102303 /var/sadm/pkg/SUNWhea*/pkginfo | sed 's/.*-//' | sort -u | tail -1`
+	  if test "X$LSOF_PL" = "X"	# {
+	  then
+	    LSOF_PL=0
+	  fi	# }
+	else
+	  LSOF_PL=$SOLARIS_24P102303
+	fi	# }
+	if test $LSOF_PL -ge 2	# {
+	then
+	  echo "WARNING: your Solaris 2.4 system appears to have patches 101945-32 and 102303-2"
+	  echo "         installed.  This probably means the NUM_*_VECTORS definitions in"
+	  echo "         <sys/auxv.h> don't match the ones used to build your kernel.  Consult"
+	  echo "         the Sun Problems section of the 00FAQ file of the lsof distribution"
+	  echo "         for more information on how to work around the problem."
+	fi	# }
+      fi	# }
+      ;;
+    20500|20501)
+      ;;
+    20600|70000|80000|90000|100000|110000)
+      if test "X$SOLARIS_26PR_GWINDOWS" = "X"	# {
+      then
+	rm -f ${LSOF_TMPC}.*
+	echo "#define _KMEMUSER" > ${LSOF_TMPC}.c
+	echo "#include <sys/proc/prdata.h>" >> ${LSOF_TMPC}.c
+	echo "main(){" >> ${LSOF_TMPC}.c
+	echo "enum prnodetype p=PR_GWINDOWS;}" >> ${LSOF_TMPC}.c
+	echo "Testing prdata.h for PR_GWINDOWS, using $LSOF_CC"
+	echo $LSOF_CC | grep gcc > /dev/null
+	if test $? -eq 0	# {
+	then
+	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x  > /dev/null 2>&1
+	else
+	  $LSOF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x  > /dev/null 2>&1
+	fi	# }
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASPR_GWINDOWS"
+	fi	# }
+      else
+	if test "X$SOLARIS_26PR_GWINDOWS" = "XY" -o "X$SOLARIS_26PR_GWINDOWS" = "Xy"	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASPR_GWINDOWS"
+	fi	# }
+      fi	# }
+      if test "X$SOLARIS_26PR_LDT" = "X"	# {
+      then
+	rm -f ${LSOF_TMPC}.*
+	echo "#define _KMEMUSER" > ${LSOF_TMPC}.c
+	echo "#include <sys/proc/prdata.h>" >> ${LSOF_TMPC}.c
+	echo "main(){" >> ${LSOF_TMPC}.c
+	echo "enum prnodetype p=PR_LDT;}" >> ${LSOF_TMPC}.c
+	echo "Testing prdata.h for PR_LDT, using $LSOF_CC"
+	echo $LSOF_CC | grep gcc > /dev/null
+	if test $? -eq 0	# {
+	then
+	  $LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
+	else
+	  $LSOF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x > /dev/null 2>&1
+	fi	# }
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASPR_LDT"
+	fi	# }
+	rm -f ${LSOF_TMPC}.*
+      else
+	if test "X$SOLARIS_26PR_LDT" = "XY" -o "X$SOLARIS_26PR_LDT" = "Xy"	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASPR_LDT"
+	fi	# }
+      fi	# }
+      if test $LSOF_VERS -ge 70000	# {
+      then
+
+      # Do tests for Solaris 7 and above.
+
+	if test "X$SOLARIS_KERNBITS" = "X"	# {
+	then
+	  SOLARIS_KERNBITS=`/bin/isainfo -kv`
+	fi	# }
+	if test "X$SOLARIS_INSTR" = "X"	# {
+	then
+	  SOLARIS_INSTR=`/bin/isainfo -k`
+	fi	#}
+	echo $SOLARIS_KERNBITS | grep 64 > /dev/null
+	if test $? -eq 0	# {
+	then
+	  echo $LSOF_CC | grep gcc > /dev/null
+	  if test $? -eq 0	# {
+	  then
+
+	# Test gcc for 64 bit support.
+
+	    echo "Testing $LSOF_CC for 64 bit support"
+	    rm -f ${LSOF_TMPC}.*
+	    echo "main(){}" > ${LSOF_TMPC}.c
+	    LSOF_TMP1=""
+
+	# First try gcc's -m64 option -- it's the most current possibility.
+
+	    $LSOF_CC ${LSOF_TMPC}.c -m64 -o ${LSOF_TMPC}.x > /dev/null 2>&1
+	    if test $? -eq 0	# {
+	    then
+	      /bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null 
+	      if test $? -eq 0	# {
+	      then
+		LSOF_TMP1="-m64"
+	      fi	# }
+	    fi	# }
+	    rm -f ${LSOF_TMPC}.*
+	    if test "X$LSOF_TMP1" = "X"	# {
+	    then
+
+	    # Try using the older -mcpu=v9 option with gcc instead of -m64.
+
+	      echo "main(){}" > ${LSOF_TMPC}.c
+	      $LSOF_CC ${LSOF_TMPC}.c -mcpu=v9 -o ${LSOF_TMPC}.x > /dev/null 2>&1
+	      if test $? -eq 0	# {
+	      then
+		/bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null 
+		if test $? -eq 0	# {
+		then
+		  LSOF_TMP1="-mcpu=v9"
+		fi	# }
+	      fi	# }
+	      rm -f ${LSOF_TMPC}.*
+	    fi	# }
+	    if test "X$LSOF_TMP1" = "X"	# {
+	    then
+	      echo ""
+	      echo "!!!WARNING!!!=========!!!WARNING!!!=========!!!WARNING!!!"
+	      echo "!                                                       !"
+	      echo "! LSOF NEEDS TO BE CONFIGURED FOR A 64 BIT KERNEL, BUT  !"
+	      echo "! THIS GCC DOESN'T SUPPORT THE BUILDING OF 64 BIT       !"
+	      echo "! SOLARIS EXECUTABLES.  LSOF WILL BE CONFIGURED FOR A   !"
+	      echo "! 32 BIT KERNEL.                                        !"
+	      echo "!                                                       !"
+	      echo "!!!WARNING!!!=========!!!WARNING!!!=========!!!WARNING!!!"
+	      echo ""
+	    else
+	      echo ""
+	      echo "*********************************"
+	      echo "* Configuring for 64 bit kernel *"
+	      echo "*********************************"
+	      echo ""
+	      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP1"
+	      LSOF_CINFO="64 bit kernel"
+	      LSOF_TSTK64=1
+	    fi	# }
+	  else
+
+	  # Test Sun compiler for 64 bit support.
+
+	    case $SOLARIS_INSTR in	# {
+	    amd64*)
+	      LSOF_TMP1="amd64"
+	      LSOF_TMP2="amd64"
+	      ;;
+	    sparc*)
+	      LSOF_TMP1="v9"
+	      LSOF_TMP2="sparcv9"
+	      ;;
+	    *)
+	      LSOF_TMP1=""
+	      ;;
+	    esac	# }
+	    if test "X$LSOF_TMP1" != "X"	# {
+	    then
+	      echo "Testing $LSOF_CC for 64 bit $LSOF_TMP2 support"
+	      rm -f ${LSOF_TMPC}.*
+	      LSOF_TMP3="-xarch=$LSOF_TMP1"
+	      echo "main(){}" > ${LSOF_TMPC}.c
+	      LSOF_TMP4=`$LSOF_CC ${LSOF_TMPC}.c $LSOF_TMP3 -o ${LSOF_TMPC}.x 2>&1`
+	      if test $? -eq 0	# {
+	      then
+		/bin/file ${LSOF_TMPC}.x | /bin/grep 64 > /dev/null 
+		if test $? -ne 0	# {
+		then
+		  LSOF_TMP3=""
+		else
+		  echo "X$LSOF_TMP4" | grep "use -m64" > /dev/null 2>&1
+		  if test $? -eq 0	# {
+		  then
+		    LSOF_TMP3=-m64
+		  fi	# }
+		fi	# }
+	      fi	# }
+	      rm -f ${LSOF_TMPC}.*
+	    else
+	      LSOF_TMP3=""
+	    fi	# }
+	    if test "X$LSOF_TMP3" != "X"	# {
+	    then
+	      echo ""
+	      echo "*********************************"
+	      echo "* Configuring for 64 bit kernel *"
+	      echo "*********************************"
+	      echo ""
+	      LSOF_CFGF="$LSOF_CFGF $LSOF_TMP3"
+	      LSOF_CINFO="64 bit kernel"
+	      LSOF_TSTK64=1
+	    else
+	      echo ""
+	      echo "!!!WARNING!!!==========!!!WARNING!!!==========!!!WARNING!!!"
+	      echo "!"
+	      echo "! LSOF NEEDS TO BE CONFIGURED FOR A 64 BIT KERNEL, BUT"
+	      echo "! THE VERSION OF SUN C AVAILABLE DOESN'T SUPPORT THE"
+	      echo "! \"$LSOF_TMP2\" INSTRUCTION SET."
+	      echo "!"
+	      echo "! LSOF WILL BE CONFIGURED FOR A 32 BIT KERNEL."
+	      echo "!"
+	      echo "!!!WARNING!!!==========!!!WARNING!!!==========!!!WARNING!!!"
+	      echo ""
+	    fi	# }
+	  fi	# }
+	else
+	  echo ""
+	  echo "*********************************"
+	  echo "* Configuring for 32 bit kernel *"
+	  echo "*********************************"
+	  echo ""
+	  LSOF_CINFO="32 bit kernel"
+	fi	# }
+      fi	# }
+
+      # Do tests specific to Solaris 8 and above.
+
+      if test $LSOF_VERS -ge 80000	# {
+      then
+	if test -r ${LSOF_INCLUDE}/netinet/ip6.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+	fi	# }
+      fi	# }
+
+      # Do tests specific to Solaris 9 and above.
+
+      if test $LSOF_VERS -ge 90000	# {
+      then
+	if test -r ${LSOF_INCLUDE}/sys/socketvar.h	# {
+	then
+	  grep soua_vp ${LSOF_INCLUDE}/sys/socketvar.h > /dev/null 2>&1
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASSOUXSOUA"
+	  fi	# }
+	fi	# }
+	if test $LSOF_VERS -lt 110000	# {
+	then
+
+	# Do tests specific to Solaris 9 and 10.
+
+	  if test -r ${LSOF_INCLUDE}/sys/lgrp_user.h      # {
+	  then
+	    if test -r ${LSOF_INCLUDE}/sys/lgrp.h      # {
+	    then
+	      grep lgrp_root ${LSOF_INCLUDE}/sys/lgrp_user.h > /dev/null 2>&1
+	      if test $? -eq 0	# {
+	      then
+		grep lgrp_root ${LSOF_INCLUDE}/sys/lgrp.h > /dev/null 2>&1
+		if test $? -eq 0
+		then
+		  LSOF_CFGF="$LSOF_CFGF -DHAS_LGRP_ROOT_CONFLICT"
+		fi	# }
+	      fi	# }
+	    fi	# }
+	  fi	# }
+	fi	# }
+      fi	# }
+
+      # Do tests specific to Solaris 10 and above.
+
+      if test $LSOF_VERS -eq 100000	# {
+      then
+	if test -r ${LSOF_INCLUDE}/sys/socket_proto.h	# {
+	then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_SOCKET_PROTO_H"
+	fi	# }
+      fi	# }
+      if test $LSOF_VERS -ge 100000	# {
+      then
+	if test -r ${LSOF_INCLUDE}/inet/ipclassifier.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_IPCLASSIFIER_H"
+	  grep conn_ixa ${LSOF_INCLUDE}/inet/ipclassifier.h > /dev/null 2>&1
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_CONN_NEW"
+	  fi	#}
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/cred_impl.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_CRED_IMPL_H"
+
+	  # DEBUG -- Begin temporary hack for Solaris 10, build s10_44.
+
+	  grep "c2/audit.h" ${LSOF_INCLUDE}/sys/cred_impl.h > /dev/null
+	  if test $? -eq 0	# {
+	  then
+	    rm -rf `pwd`/dialects/sun/solaris10
+	    mkdir `pwd`/dialects/sun/solaris10
+	    mkdir `pwd`/dialects/sun/solaris10/c2
+	    touch `pwd`/dialects/sun/solaris10/c2/audit.h
+	    LSOF_CFGF="$LSOF_CFGF -I`pwd`/dialects/sun/solaris10"
+	  fi	# }
+
+	  # DEBUG -- End temporary hack for Solaris 10, build s10_44.
+
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/vnode.h	# {
+	then
+	  grep v_path ${LSOF_INCLUDE}/sys/vnode.h > /dev/null 2>&1
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_V_PATH"
+	    LSOF_TSTVPATH=1
+	  fi	# }
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/fs/pc_fs.h	# {
+	then
+	  grep pc_direntpersec ${LSOF_INCLUDE}/sys/fs/pc_fs.h > /dev/null 2>&1
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_PC_DIRENTPERSEC"
+	  fi	# }
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/zone.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASZONES"
+      fi	# }
+
+      # Check for Solaris 10 or higher CTF library and things that depend
+      # on it.
+
+      if test -r ${LSOF_INCLUDE}/libctf.h	# {
+      then
+	LSOF_CTFH=1
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/fs/zfs.h	# {
+      then
+	if test $LSOF_CTFH -eq 1	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_ZFS"
+	  LSOF_CTFL=1
+	else
+	  echo "WARNING: ZFS support not enabled; libctf.h missing."
+	fi	# }
+      fi	# }
+      if test $LSOF_VERS -ge 110000	# {
+      then
+
+      # Do things specific to Solaris 11 and above.
+
+	if test $LSOF_CTFH -eq 1	# {
+	then
+	  LSOF_CTFL=1
+	else
+	  echo "WARNING: socket support not enabled; libctf.h missing."
+	fi	# }
+	rm -rf ./solaris11
+	mkdir ./solaris11
+	mkdir ./solaris11/sys
+	touch ./solaris11/sys/extdirent.h
+	echo "./solaris11/sys/extdirent.h created"
+	LSOF_CFGF="$LSOF_CFGF -I`pwd`/solaris11"
+	if test -r ${LSOF_INCLUDE}/sys/mutex.h	# {
+	then
+
+	# Check <sys/mutex.h> 'for pad_mutex_t;'.
+
+	  grep 'pad_mutex_t;' ${LSOF_INCLUDE}/sys/mutex.h > /dev/null 2>&1
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_PAD_MUTEX"
+	  fi	# }
+	fi	# )
+      fi	# }
+
+      # If -lctf was added to LSOF_CFGL, define HAS_LIBCTF.
+
+      if test $LSOF_CTFL -eq 1	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_LIBCTF"
+	LSOF_CFGL="$LSOF_CFGL -lctf"
+      fi	# }
+      ;;
+    *)
+      echo "Unsupported Solaris version: $LSOF_VERS"
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    LSOF_CFGF="$LSOF_CFGF -Dsolaris=$LSOF_VERS"
+
+    # Test for <utmpx.h>
+    if test -r ${LSOF_INCLUDE}/utmpx.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASUTMPX"
+    fi	# }
+
+    # Test for VSOCK.
+
+    if test "X$SOLARIS_VSOCK" = "X"	# {
+    then
+      rm -f ${LSOF_TMPC}.*
+      echo "#include <sys/vnode.h>" > ${LSOF_TMPC}.c
+      echo "main(){" >> ${LSOF_TMPC}.c
+      echo "enum vtype p=VSOCK;}" >> ${LSOF_TMPC}.c
+      echo "Testing vnode.h for VSOCK, using $LSOF_CC"
+      echo $LSOF_CC | grep gcc > /dev/null
+      if test $? -eq 0	# {
+      then
+	$LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
+      else
+	$LSOF_CC ${LSOF_TMPC}.c -I$LSOF_INCLUDE -o ${LSOF_TMPC}.x > /dev/null 2>&1
+      fi	# }
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_VSOCK"
+      fi	# }
+      rm -f ${LSOF_TMPC}.*
+    else
+      if test "X$SOLARIS_VSOCK" = "XY" -o "X$SOLARIS_VSOCK" = "Xy"	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHAS_VSOCK"
+      fi	# }
+    fi	# }
+
+    # Test for AFS.
+
+    if test -r ${AFS_VICE}/etc/ThisCell	# {
+    then
+      if test "X$LSOF_SCRIPT_CALL" = "Xno"	# {
+      then
+	if test -r ./AFSHeaders -a -r ./AFSVersion	# {
+	then
+	  LSOF_AFS="yes"
+	fi	# }
+      else
+	if test ! -x ./AFSConfig	# {
+	then
+	  echo "Can't find or execute the AFSConfig script"
+	  rm -f $LSOF_HLP
+	  exit 1
+	fi	# }
+	./AFSConfig
+	if test $? -eq 0 -a -r ./AFSHeaders -a -r ./AFSVersion	# {
+	then
+	    LSOF_AFS="yes"
+	fi	# }
+      fi	# }
+      if test "X$LSOF_AFS" = "Xyes"	# {
+      then
+	if test "X$SUN_AFSAPATHDEF" = "X"	# {
+	then
+	  ls /usr/vice/etc/modload/libafs > /dev/null 2>&1
+	  if test $? -ne 0	# {
+	  then
+	    LSOF_TMP1=`ls /usr/vice/etc/modload/libafs* 2>/dev/null | wc -l`
+	    if test $LSOF_TMP1 -ne 0	# {
+	    then
+	      SUN_AFSAPATHDEF=`ls -t /usr/vice/etc/modload/libafs* | head -1`
+	    fi	# }
+	  fi	# }
+	fi	# }
+	if test "X$SUN_AFSAPATHDEF" != "X"	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DAFSAPATHDEF=\\\"$SUN_AFSAPATHDEF\\\""
+	fi	# }
+	LSOF_AFSV=`cat ./AFSVersion | sed 's/^\([0-9]*\)\.\([0-9]*\).*/\1 \2/' | awk '{printf "%d%02d\n",\$1,\$2}'`
+	LSOF_CFGF="$LSOF_CFGF -DHAS_AFS=$LSOF_AFSV"
+	LSOF_DINC="$LSOF_DINC -I`cat ./AFSHeaders`"
+      fi	# }
+    fi	# }
+
+    # Test for VxFS.
+    #
+    # If the location of the VxFS header files hasn't been defined in the
+    # environment, establish their likely locations.
+
+    LSOF_TMP2=$SOLARIS_VXFSINCL
+    if test -d /opt/VRTS/include	# {
+    then
+      LSOF_TMP2="$LSOF_TMP2 /opt/VRTS/include"
+    fi	# }
+    if test -d /opt/VRTSvxfs/include	# {
+    then
+      LSOF_TMP2="$LSOF_TMP2 /opt/VRTSvxfs/include"
+    fi	# }
+    LSOF_TMP1=0
+    for i in $LSOF_TMP2	# {
+    do
+      if test -r ${i}/vxfsutil.h	# {
+      then
+	LSOF_TMP1=1
+	SOLARIS_VXFSINCL=$i
+	break
+      fi	# }
+    done	# }
+    if test $LSOF_TMP1 -eq 1	# {
+    then
+
+    # The VxFS header files are for VxFS version 3.4 or above.  Enable VxFS
+    # for those versions.
+
+      LSOF_CFGF="$LSOF_CFGF -DHASVXFS -DHASVXFSUTIL -I$SOLARIS_VXFSINCL"
+
+    # Determine which libvxfsutil.a is required -- 32 or 64 bit.
+
+      LSOF_TMP2=""			# assume 32 bit
+      echo "X$LSOF_CINFO" | grep "^X64" > /dev/null 2>&1
+      if test $? -eq 0-a "X$SOLARIS_INSTR" != "X"	# {
+      then
+	case $SOLARIS_INSTR in	# {
+	amd64*)
+	  LSOF_TMP2="/amd64"
+	  ;;
+	sparcv9*)
+	  LSOF_TMP2="/sparcv9"
+	  ;;
+	esac	# }
+      fi	# }
+
+    # See if the correct library has been specified and exists.
+
+      if test "X$SOLARIS_VXFSLIB" = "X"	# {
+      then
+	SOLARIS_VXFSLIB=`dirname $SOLARIS_VXFSINCL`/lib
+      fi	# }
+      LSOF_TMP3="${SOLARIS_VXFSLIB}${LSOF_TMP2}/libvxfsutil.a"
+      if test ! -r $LSOF_TMP3	# {
+      then
+	echo "!!!FATAL: no VxFS $LSOF_TMP3"
+	exit 1
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -L$SOLARIS_VXFSLIB${LSOF_TMP2} -lvxfsutil -ldl"
+
+    # See if the library has the Reverse Name Lookup (RNL) function.
+
+      nm $LSOF_TMP3 | grep vxfs_inotopath > /dev/null 2>&1
+      if test $? -eq 0	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASVXFSRNL -DHASVXFSDNLC"
+      fi	# }
+    else
+
+    # See if there are VxFS header files for VxFS versions below 3.4.
+
+      if test -r ${LSOF_INCLUDE}/sys/fs/vx_inode.h	# {
+      then
+
+      # Define VxFS for VxFS versions below 3.4.  Make additional header
+      # file tests.
+
+	LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
+	if test -r ${LSOF_INCLUDE}/sys/fs/vx_fs.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_FS_H"
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/fs/vx_sol.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_SOL_H"
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/fs/vx_machdep.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_MACHDEP_H"
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/fs/vx_solaris.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_SOLARIS_H"
+	  grep "off32_t;" ${LSOF_INCLUDE}/sys/fs/vx_machdep.h > /dev/null
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASVXFS_OFF32_T"
+	  fi	# }
+	  grep "off64_t;" ${LSOF_INCLUDE}/sys/fs/vx_solaris.h > /dev/null
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASVXFS_OFF64_T"
+	  fi	# }
+	  grep "vx_u64_t;" ${LSOF_INCLUDE}/sys/fs/vx_solaris.h > /dev/null
+	  if test $? -eq 0	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHASVXFS_U64_T"
+	  fi	# }
+	fi	# }
+	egrep "struct[ 	]vx_inode[ 	]\{" ${LSOF_INCLUDE}/sys/fs/vx_inode.h > /dev/null
+	# } (dummy '}' to match '{' in above egrep)
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASVXFS_VX_INODE"
+	fi	# }
+      fi	# }
+    fi	# }
+
+    # Set libraries and dialect subdirectory.
+
+    LSOF_CFGL="$LSOF_CFGL -lkvm -lelf -lsocket -lnsl"
+    LSOF_DIALECT_DIR=sun
+
+    # Set local-specific stuff.
+
+    if test "X$LSOF_LOCALSUFFIX" = "XLOCAL"	# {
+    then
+      LSOF_DOC="\${DESTDIR}/usr/local/man"
+    fi	# }
+    ;;
+
+# Configure for SCO|Caldera OpenServer Release 6.0.0 and UnixWare.
+
+  osr6|unixware|uw)
+    LSOF_TMP1=$LSOF_TGT
+    LSOF_TGT="uw"
+    if test "X$LSOF_RANLIB_SUP" = "X"	# {
+    then
+      LSOF_RANLIB=""
+    fi	# }
+    if test "X$LSOF_VSTR" = "X"	# {
+    then
+      LSOF_VSTR=`uname -v`
+    fi	# }
+    if test "X$LSOF_VERS" = "X"	# {
+    then
+
+      # If the Openserver Release 6.0.0 or UnixWare version isn't pre-defined,
+      # determine it.
+
+      LSOF_VERS=`echo $LSOF_VSTR | sed 's/\([0-9\.]*\).*/\1/; s/\./ /g' | awk '{printf "%d%02d%02d\n", $1, $2, $3;}'`
+    fi	# }
+    if test $LSOF_TMP1 = "osr6"	# {
+    then
+      LSOF_CINFO="OSR6 support via UnixWare sources"
+
+    # Convert the OpenServer Release 6.0.0 version number to a UnixWare one.
+
+      case $LSOF_VERS in	# {
+      60000)
+	LSOF_VERS=70104
+	;;
+      *)
+	echo "Unknown OpenServer Release version: $LSOF_VERS"
+	rm -f $LSOF_HLP
+	exit 1
+      esac	# }
+    fi	# }
+    LSOF_CFGF="$LSOF_CFGF -DUNIXWAREV=$LSOF_VERS"
+
+    # Do OpenServer Release 6.0.0 and UnixWare version-specific stuff.
+
+    case $LSOF_VERS in	# {
+    20100|20101|20102|20103)
+      if test -r ${LSOF_INCLUDE}/sys/fs/vx_inode.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lsocket -lnsl -lelf -lgen"
+      ;;
+    70000|70001|70100|70101|70103|70104)
+      LSOF_TSTBIGF=" "
+      LSOF_TSTLFLG="-lsocket -lnsl"
+      if test $LSOF_VERS -lt 70103	# {
+      then
+	LSOF_DINC="$LSOF_DINC -I`pwd`/dialects/uw/uw7"
+      else	# $LSOF_VERS -ge 70103
+
+      # Process 7.1.3 and above.
+
+	if test -r ${LSOF_INCLUDE}/netinet/in6.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHASIPv6"
+	fi	# }
+	if test $LSOF_VERS -ge 70104	# {
+	then
+
+	# Process 7.1.4 and above.
+
+	  LSOF_TMP1=0
+	  if test -r ${LSOF_INCLUDE}/netinet/in_pcb.h	# {
+	  then
+	    grep INKERNEL ${LSOF_INCLUDE}/netinet/in_pcb.h > /dev/null 2>&1
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_TMP1=1
+	    fi	# }
+	  fi	# }
+	  if test $LSOF_TMP1 -eq 0 -a -r ${LSOF_INCLUDE}/netinet/tcp_var.h   # {
+	  then
+	    grep INKERNEL ${LSOF_INCLUDE}/netinet/tcp_var.h > /dev/null 2>&1
+	    if test $? -eq 0	# {
+	    then
+	      LSOF_TMP1=1
+	    fi	# }
+	  fi	# }
+	  if test $LSOF_TMP1 -eq 1	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DHAS_INKERNEL"
+	  fi	# }
+	fi	# }
+      fi	# }
+      if test ! -r ${LSOF_INCLUDE}/vm/swap.h -a -r ${LSOF_INCLUDE}/sys/swap.h	# {
+      then
+	(cd ./dialects/uw/uw7/vm; rm -f swap.h; ln -s ${LSOF_INCLUDE}/sys/swap.h swap.h)
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/fs/vx_gemini.h	# {
+      then
+	LSOF_CFGF="$LSOF_CFGF -DHASVXFS"
+      fi	# }
+      LSOF_CFGL="$LSOF_CFGL -lsocket -lnsl -lelf -lgen"
+      /bin/pkginfo 2> /dev/null | grep -i patch | grep -i ptf7038 > /dev/null
+      if test -r ${LSOF_INCLUDE}/sys/file.h	# {
+      then
+	grep f_open ${LSOF_INCLUDE}/sys/file.h > /dev/null
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_F_OPEN"
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/fs/cdfs_fs.h	# {
+      then
+	grep "cdfs_LogSecShift;" ${LSOF_INCLUDE}/sys/fs/cdfs_fs.h > /dev/null 2>&1
+	if test $? -eq 0	# {
+	then
+	  LSOF_TMP=`grep "cdfs_LogSecShift;" ${LSOF_INCLUDE}/sys/fs/cdfs_fs.h | sed 's/^[ 	]*\([^ 	]*\).*/\1/'`
+	  if test "X$LSOF_TMP" != "X"	# {
+	  then
+	    LSOF_CFGF="$LSOF_CFGF -DTYPELOGSECSHIFT=$LSOF_TMP"
+	  fi	# }
+	fi	# }
+      fi	# }
+      if test -r ${LSOF_INCLUDE}/sys/proc.h	# {
+      then
+	grep p_pgid ${LSOF_INCLUDE}/sys/proc.h > /dev/null
+	if test $? -eq 0	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_P_PGID"
+	fi	# }
+      fi	# }
+      if test $LSOF_VERS -ge 70101	# {
+      then
+
+	# Do OpenServer Release 6.0.0 and UnixWare 7.1.1 and above tests, as
+	# required.
+
+	if test "X$UW_HAS_NSC" = "X"	# {
+	then
+	  UW_HAS_NSC=N
+	  if test -x /bin/node_self	# {
+	  then
+	    /bin/node_self > /dev/null 2>&1
+	    if test $? -eq 0	# {
+	    then
+	      UW_HAS_NSC=Y
+	    fi	# }
+	  fi	# }
+	fi	# }
+	if test "X$UW_HAS_NSC" = "XY" -o "X$UW_HAS_NSC" = "Xy" 	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_UW_NSC"
+	  LSOF_CFGL="$LSOF_CFGL -lcluster"
+	fi	# }
+	if test -r ${LSOF_INCLUDE}/sys/nsc_synch.h	# {
+	then
+	  LSOF_CFGF="$LSOF_CFGF -DHAS_UW_CFS"
+	fi	# }
+      fi	# }
+      ;;
+    *)
+      echo Unsupported UnixWare version: `uname -v`
+      rm -f $LSOF_HLP
+      exit 1
+      ;;
+    esac	# }
+    if test -r ${LSOF_INCLUDE}/sys/fs/xnamnode.h	# {
+    then
+      LSOF_CFGF="$LSOF_CFGF -DHASXNAMNODE"
+    fi	# }
+    LSOF_DIALECT_DIR=uw
+    ;;
+
+# Handle unknown abbreviation.
+
+  *) 
+    echo "Can't configure for $LSOF_TGT."
+    cat $LSOF_HLP
+    rm -f $LSOF_HLP
+    exit 1
+    ;;
+
+# End of LSOF_TGT cases
+
+esac	# }
+
+# Do an inventory of the distribution, as required.
+
+if test "X$LSOF_SCRIPT_CALL" = "Xyes" -a ! -r ./.neverInv	# {
+then
+  if test ! -f ./Inventory	# Want -x, but Ultrix doesn't grok it.	# {
+  then
+    echo "Can't find Inventory script."
+    rm -f $LSOF_HLP
+    exit 1
+  fi	# }
+  ./Inventory
+fi	# }
+
+# Make sure target directory exists.
+
+if test ! -d ./dialects/$LSOF_DIALECT_DIR	# {
+then
+  echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR doesn't exist."
+  rm -f $LSOF_HLP
+  exit 1
+fi	# }
+
+# Make sure $LSOF_MK exists in the target directory.
+
+if test ! -r ./dialects/$LSOF_DIALECT_DIR/$LSOF_MK	# {
+then
+  echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR/$LSOF_MK doesn't exist."
+  rm -f $LSOF_HLP
+  exit 1
+fi	# }
+
+# Make sure $LSOF_MKF, $LSOF_SPMKF, or $LSOF_MKF.$LSOF_LOCALSUFFIX) exists
+# in the target directory.
+
+if test "X$LSOF_SPMKF" != "X"	# {
+then
+  LSOF_TMP1=$LSOF_SPMKF
+else
+  LSOF_TMP1=$LSOF_MKF
+fi	# }
+if test "X$LSOF_LOCALSUFFIX" != "X"	# {
+then
+  LSOF_REST=$LSOF_TMP1.$LSOF_LOCALSUFFIX
+else
+  LSOF_REST=$LSOF_TMP1
+fi	# }
+if test ! -r ./dialects/$LSOF_DIALECT_DIR/$LSOF_REST	# {
+then
+  echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR/$LSOF_REST doesn't exist."
+  rm -f $LSOF_HLP
+  exit 1
+fi	# }
+
+# If this is FreeBSD, make sure $LSOF_FBSD_ZFS_MKF exists.
+
+if test $LSOF_FBSD_ZFS -eq 1	# {
+then
+  if test ! ./dialects/$LSOF_DIALECT_DIR/$LSOF_FBSD_ZFS_MKF	# {
+  then
+    echo "Can't configure for $LSOF_TGT -- ./dialects/$LSOF_DIALECT_DIR/$LSOF_FBSD_ZFS_MKF doesn't exist."
+    rm -f $LSOF_HLP
+    exit 1
+  fi	# }
+fi	# }}
+
+# Make sure $LSOF_VF exists.  Extract the version number from it.
+
+if test ! -r $LSOF_VF	# {
+then
+  echo "Version number file, ./$LSOF_VF, doesn't exist."
+  rm -f $LSOF_HLP
+  exit 1
+else
+  LSOF_VN=`sed "s/.ds VN \(.*\)/\1/" < $LSOF_VF`
+fi	# }
+
+# Clean up in advance.
+
+rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF $LSOF_TSTCFLG $LSOF_TSTCC
+rm -f $LSOF_TSTXOC $LSOF_TSTLFF
+echo "rm -f $LSOF_F $LSOF_MKFC $LSOF_FBSD_ZFS_MKF $LSOF_TSTCFLG"
+echo "rm -f $LSOF_TSTCC $LSOF_TSTXOC $LSOF_TSTLFF"
+
+# Make sure there's a C compiler name.
+
+if test "X$LSOF_CC" = "X"	# {
+then
+  LSOF_CC=cc
+fi	# }
+
+# Do common feature analyses.
+
+# Check for localtime(3) and strftime(3).
+
+rm -f ${LSOF_TMPC}.*
+cat > $LSOF_TMPC.c << .LSOF_END_HERE_DOC2
+#include <time.h>
+main(){
+  time_t cl;
+  struct tm *ts;
+  char bf[32];
+  if ((cl = time(NULL)) == (time_t)-1)
+    return(1);
+  ts = localtime(&cl);
+  if (strftime(bf, sizeof(bf), "%D", ts) != 8)
+    return(1);
+  if ((bf[2] != '/') || (bf[5] != '/'))
+    return (1);
+  return(0);
+}
+.LSOF_END_HERE_DOC2
+echo $EO "Testing C library for localtime() and strftime(), using $LSOF_CC ... $EC"
+$LSOF_CC ${LSOF_TMPC}.c -o ${LSOF_TMPC}.x > /dev/null 2>&1
+if test -x ${LSOF_TMPC}.x	# {
+then
+  ./${LSOF_TMPC}.x > /dev/null 2>&1
+  if test $? -eq 0 || test "X$LINUX_CLIB" != "X"	# }
+  then
+    LSOF_CFGF="$LSOF_CFGF -DHAS_STRFTIME"
+    echo "present"
+  else
+    echo "unusable"
+  fi	# }
+else
+  echo "missing"
+fi	# }
+rm -f ${LSOF_TMPC}.[cox]
+
+# Make the dialect sources.
+
+if test "X$LSOF_MKC" = "X"	# {
+then
+  LSOF_MKC="ln -s"
+fi	# }
+LSOF_MKC=$LSOF_MKC ./dialects/$LSOF_DIALECT_DIR/$LSOF_MK $LSOF_TGT $LSOF_VERS
+
+# Make $LSOF_MKFC and ${LSOF_LIB}/$LSOF_LIBMKF.
+
+echo "# $LSOF_TGT Makefile for lsof revision $LSOF_VN" > $LSOF_MKFC
+echo "" >> $LSOF_MKFC
+echo "CC=	$LSOF_CC" >> $LSOF_MKFC
+if test "X$LSOF_CCV" != "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "CCV=	$LSOF_CCV" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_LIB_NO" = "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "LIB=	${LSOF_LIB}/liblsof.a" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_LD" != "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "LD=	$LSOF_LD" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_CINFO" != "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "CINFO=	$LSOF_CINFO" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_CFGD" != "X"	# {
+then
+  echo "CFGD=	$LSOF_CFGD" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_CFGDN" != "X"	# {
+then
+  echo "CFGDN=	$LSOF_CFGDN" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_ARCH" != "X"	# {
+then
+  LSOF_CFGF="$LSOF_CFGF -DLSOF_ARCH=\\\"$LSOF_ARCH\\\""
+fi	# }
+if test "X$LSOF_VSTR" != "X"	# {
+then
+  LSOF_TMP=`echo $LSOF_VSTR | sed 's/(/\\\\(/g' | sed 's/)/\\\\)/g'`
+  LSOF_CFGF="$LSOF_CFGF -DLSOF_VSTR=\\\"$LSOF_TMP\\\""
+fi	# }
+echo "" >> $LSOF_MKFC
+echo "CFGF=	$LSOF_CFGF" >> $LSOF_MKFC
+if test "X$LSOF_LIB_NO" = "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "CFGL=	$LSOF_FCFGL -L./$LSOF_LIB -llsof $LSOF_CFGL" >> $LSOF_MKFC
+fi	# }
+echo "" >> $LSOF_MKFC
+if test "X$LSOF_DEBUG" = "X"	# {
+then
+  LSOF_DEBUG="-O"
+else
+  if test "X$LSOF_DEBUG" = "XNo-O"	# {
+  then
+    LSOF_DEBUG=""
+  fi	# }
+fi	# }
+echo "DEBUG=	$LSOF_DEBUG" >> $LSOF_MKFC
+if test "X$LSOF_DINC" != "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "DINC=	$LSOF_DINC" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_DOC" != "X"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "DOC=$LSOF_DOC" >> $LSOF_MKFC
+fi	# }
+if test "X$LSOF_DISTRIBKVM" != "X" -a "X$LSOF_DISTRIBKVM" != "XKVM"	# {
+then
+  echo "" >> $LSOF_MKFC
+  echo "KVM=	$LSOF_DISTRIBKVM" >> $LSOF_MKFC
+fi	# }
+rm -f ${LSOF_LIB}/$LSOF_LIBMKF
+if test "X$LSOF_LIB_NO" = "X"	# {
+then
+  cp $LSOF_MKFC ${LSOF_LIB}/$LSOF_LIBMKF
+fi	# }
+cat ./dialects/$LSOF_DIALECT_DIR/$LSOF_REST >> $LSOF_MKFC
+if test "X$LSOF_LIB_NO" = "X"	# {
+then
+
+  # Put archiving and optional randomizing strings in ${LSOF_LIB}/$LSOF_LIBMKF.
+  #
+  # Process optional CFLAGS override.
+  #
+  # Add the library Makefile skeleton section.
+
+  echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  if test "X$LSOF_AR" = "X"	# {
+  then
+    echo "AR=	ar cr \${LIB} \${OBJ}" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  else
+    echo "AR=	$LSOF_AR \${LIB} \${OBJ}" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  fi	# }
+  if test "X$LSOF_RANLIB" != "X"	# {
+  then
+    echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
+    echo "RANLIB=	$LSOF_RANLIB \${LIB}" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  fi	# }
+  echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  if test "X$LSOF_CFLAGS_OVERRIDE" = "X"	# {
+  then
+    echo "CFLAGS=	\${CDEFS} \${INCL} \${DEBUG}" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  else
+    echo "override CFLAGS=\${CDEFS} \${INCL} \${DEBUG}" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  fi	# }
+  echo "" >> ${LSOF_LIB}/$LSOF_LIBMKF
+  cat ${LSOF_LIB}/$LSOF_LIBMKFSKEL >> ${LSOF_LIB}/$LSOF_LIBMKF
+  echo $LSOF_MKFC and ${LSOF_LIB}/$LSOF_LIBMKF created.
+else
+  echo $LSOF_MKFC created.
+fi	# }
+
+# If this is FreeBSD, create $LSOF_FBSD_ZFS_MKF.
+
+if test $LSOF_FBSD_ZFS -eq 1	# {
+then
+  rm -f $LSOF_FBSD_ZFS_MKF
+  echo "# $LSOF_TGT ZFS Makefile for lsof revision $LSOF_VN" > $LSOF_FBSD_ZFS_MKF
+  echo "" >> $LSOF_FBSD_ZFS_MKF
+  echo "CC=		$LSOF_CC" >> $LSOF_FBSD_ZFS_MKF
+  echo "" >> $LSOF_FBSD_ZFS_MKF
+  echo "CFLAGS=	$LSOF_FBSD_ZFS_CFGF" >> $LSOF_FBSD_ZFS_MKF
+  echo "" >> $LSOF_FBSD_ZFS_MKF
+  if test "X$LSOF_DEBUG" = "X"	# {
+  then
+    LSOF_DEBUG="-O"
+  else
+    if test "X$LSOF_DEBUG" = "XNo-O"	# {
+    then
+      LSOF_DEBUG=""
+    fi	# }
+  fi	# }
+  echo "DEBUG=	$LSOF_DEBUG" >> $LSOF_FBSD_ZFS_MKF
+  echo "" >> $LSOF_FBSD_ZFS_MKF
+  echo "OPENSOLARIS=	$LSOF_FBSD_ZFS_SYS" >> $LSOF_FBSD_ZFS_MKF
+  echo "" >> $LSOF_FBSD_ZFS_MKF
+  cat ./dialects/$LSOF_DIALECT_DIR/$LSOF_FBSD_ZFS_MKF >> $LSOF_FBSD_ZFS_MKF
+  echo $LSOF_FBSD_ZFS_MKF created.
+fi	# }
+
+# Create test cc file.
+
+echo "$LSOF_CC" > $LSOF_TSTCC
+echo "$LSOF_TSTCC created"
+
+# Create test cflags file.
+
+echo "-DLT_DIAL_$LSOF_TGT" > $LSOF_TSTCFLG
+if test "X$LSOF_TSTBIGF" != "X"	# {
+then
+  echo "-DLT_BIGF" >> $LSOF_TSTCFLG
+  if test "X$LSOF_TSTBIGF" != "X "	# {
+  then
+    for i in $LSOF_TSTBIGF	# {
+    do
+      echo "$i" >> $LSOF_TSTCFLG
+    done	# }
+  fi	# }
+fi	# }
+if test "X$LSOF_TSTDFLG" != "X"	# {
+then
+  for i in $LSOF_TSTDFLG	# {
+  do
+    echo "$i" >> $LSOF_TSTCFLG
+  done	# }
+fi	# }
+echo $LSOF_CC | grep gcc > /dev/null 2>&1
+if test $? -eq 0	# {
+then
+  echo "-DLT_GCC" >> $LSOF_TSTCFLG
+else
+  echo "-DLT_CC" >> $LSOF_TSTCFLG
+fi	# r}
+if test $LSOF_TSTKMEM -eq 1	# {
+then
+  echo "-DLT_KMEM" >> $LSOF_TSTCFLG
+fi	# }
+if test $LSOF_TSTK64 -eq 1	# {
+then
+  echo "-DLT_K64" >> $LSOF_TSTCFLG
+fi	# }
+echo "-DLT_VERS=$LSOF_VERS" >> $LSOF_TSTCFLG
+if test $LSOF_TSTVPATH -eq 1	# {
+then
+  echo "-DLT_VPATH" >> $LSOF_TSTCFLG
+fi	# }
+echo "$LSOF_TSTCFLG created"
+
+# Create tests loader flags file.
+
+echo $LSOF_TSTLFLG > $LSOF_TSTLFF
+echo "$LSOF_TSTLFF created"
+
+# Create test extra objects file.
+
+echo "$LSOF_TSTXO" > $LSOF_TSTXOC
+echo "$LSOF_TSTXOC created"
+
+rm -f $LSOF_HLP
+
+# Call Customize, as required.
+
+if test "X$LSOF_SCRIPT_CALL" = "Xyes" -a ! -r ./.neverCust	# {
+then
+  if test ! -f ./Customize	# {  Want -x, but Ultrix doesn't grok it.
+  then
+    echo "Can't find Customize script."
+    exit 1
+  fi	# }
+  ./Customize $LSOF_DIALECT_DIR
+fi	# }
+
+# Issue unsupported warning, as appropriate.
+
+if test "X$LSOF_UNSUP" != "X"	# {
+then
+  echo "$LSOF_UNSUP"
+fi	#}
+exit 0
diff --git a/lsof_4.85/lsof_4.85_src/Customize b/lsof_4.85/lsof_4.85_src/Customize
new file mode 100755
index 0000000..8fc9921
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/Customize
@@ -0,0 +1,1151 @@
+#!/bin/sh
+#
+# $Id: Customize,v 1.9 2005/05/11 13:02:18 abe Exp $
+#
+# Customize: customize dialect's machine.h header file.
+#
+# Allows easy modification of some important compile-time definitions for
+# lsof, made in the dialect's machine.h header file, including:
+#
+#	HASSECURITY	the security option
+#	HASNOSOCKSECURITY
+#			the socket oberalization of HASSECURITY
+#	HASDCACHE	enabling/disabling the device cache file
+#			(Note: changing the device cache file option isn't
+#			       offered when machine.h contains NEVER_HASDCACHE
+#			       anywhere, including in a comment.)
+#	HASENVDC	enabling/disabling device cache path from environment
+#	HASKERNIDCK	enabling/disabling the kernel identity check
+#			(not done for some dialects)
+#	HASPERSDC	enabling/disabling personal device cache path
+#			construction
+#	HASPERSDCPATH	enabling/disabling additional personal device cache
+#			path component
+#	HASSYSDC	enabling/disabling system-wide device cache file path
+#	HASXOPT_ROOT	enabling/disabling root use of the -X option
+#	WARNDEVACCESS	enabling inaccessible /dev node warnings
+#			(Note: changing the inaccessible /dev/node warning
+#			       option isn't offered when machine.h contains
+#			       NEVER_WARNDEVACCESS anywhere, including in a
+#			       comment.)
+#	WARNINGSTATE	enable/disabling default warning message state
+#
+# Usage: Customize [dialect_directory]
+#
+# where: dialect_directory (optional) is the directory in which the dialect's
+#	 dialect's sources, Makefile and scripts are found
+
+OLD=machine.h
+NEW=new_machine.h
+
+# Save optional dialect directory.
+
+if test $# -eq 1
+then
+  DialDir=$1
+else
+  DialDir=""
+fi
+
+# Establish trap and stty handling.
+
+ISIG=":"
+trap 'rm -f $NEW; $ISIG; exit 1' 1 2 3 15
+stty -a 2>&1 | grep isig > /dev/null
+if test $? -eq 0
+then
+  stty -a 2>&1 | egrep -e -isig > /dev/null
+  if test $? -eq 0
+  then
+    ISIG="stty -isig"
+    stty isig
+  fi
+fi
+
+# Decide how to use echo.
+
+ECHO=`echo -n ""`
+if test "X$ECHO" = "X-n "
+then
+  EC="\c"
+  EO=""
+else
+  EC=""
+  EO="-n"
+fi
+
+# Decide how to use tail(1).
+
+TMP1=`tail -n 1 $0 2> /dev/null`
+if test $? -eq 0 -a "X$TMP1" = "X#LAST_LINE"
+then
+  TA="-n 1"
+else
+  TA="-1"
+fi
+
+# Display the introduction and basic explanation.
+
+cat << .CAT_MARK
+
+You may now customize the machine.h header file for this UNIX
+dialect.  The customizations will take effect when you compile
+lsof.  You may also choose to skip customization and proceed to
+the compilation of lsof.
+
+If you don't know if you need to customize or want to know more
+about what you can customize, consult the 00DCACHE, 00FAQ, 00PORTING,
+and 00README files of the lsof distribution.  You might also find
+it helpful to examine the machine.h header file for the dialect
+you're customizing.
+
+You don't need to use this procedure to customize lsof; you can
+edit the machine.h header file directly.  If you later decide you
+want to use this procedure to customize machine.h, execute the
+./Customize script.
+.CAT_MARK
+
+END=0
+while test $END -eq 0
+do
+  echo ""
+  echo $EO "Do you want to customize (y|n) [y]? $EC"
+  read ANS EXCESS
+  if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+  then
+    exit 0
+  fi
+  if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+  then
+    echo ""
+    echo "Customizing ..."
+    END=1
+  else
+    echo ""
+    echo "Please answer y|n [y]."
+  fi
+done
+
+# See if $OLD exists.
+
+if test ! -r $OLD
+then
+  echo ""
+  echo "FATAL: The file \"$OLD\" doesn't exist.  Customization can't"
+  echo "continue without it."
+  echo ""
+  echo "Did you run the Configure script?"
+  echo ""
+  echo "Customize quits."
+  echo ""
+  exit 1
+fi
+
+# See if $NEW exists.
+
+if test -r $NEW
+then
+  echo ""
+  echo "====================================================================="
+  echo ""
+  echo "WARNING: \"$NEW\" exists.  Customization will replace it."
+  END=0
+  while test $END -eq 0
+  do
+    echo ""
+    echo $EO "Do you want to remove $NEW (y|n) [y]? $EC"
+    read ANS EXCESS
+    if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+    then
+      echo ""
+      echo "Removing $NEW"
+      echo ""
+      rm -f $NEW
+      END=1
+    else
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+      then
+        echo ""
+        echo "FATAL: Customize quits; it must be able to create \"$NEW\"."
+        echo ""
+        exit 1
+      else
+        echo ""
+        echo "Please answer y|n [y]."
+      fi
+    fi
+  done
+fi
+
+# Process HASSECURITY.
+
+cat << .CAT_MARK
+
+=====================================================================
+
+When HASSECURITY is enabled, only the root user may use lsof to
+examine all open files; other users may examine only the files
+belonging to the real user ID of their lsof process.  If
+HASNOSOCKSECURITY is also defined, anyone may list anyone else's
+open socket files, provided their listing is selected with the "-i"
+option.
+
+When HASSECURITY is disabled, anyone may use lsof to examine all
+open files.
+
+.CAT_MARK
+
+grep HASSECURITY $OLD | tail $TA | egrep "^#define" > /dev/null
+if test $? -eq 0
+then
+  echo "HASSECURITY is enabled."
+  NSEC=1
+else
+  echo "HASSECURITY is disabled."
+  NSEC=0
+fi
+END=0
+while test $END -eq 0
+do
+  echo ""
+  if test $NSEC -eq 1
+  then
+    echo $EO "Disable HASSECURITY (y|n) [n]? $EC"
+  else
+    echo $EO "Enable HASSECURITY (y|n) [n]? $EC"
+  fi
+  read ANS EXCESS
+  if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+  then
+    echo ""
+    if test $NSEC -eq 1
+    then
+      NSEC=0
+      echo "HASSECURITY will be disabled."
+    else
+      NSEC=1
+      echo "HASSECURITY will be enabled."
+    fi
+    END=1
+  else
+    if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+    then
+      echo ""
+      echo "HASSECURITY will not be changed."
+      END=1
+    else
+      echo ""
+      echo "Please answer y|n [n]."
+    fi
+  fi
+done
+
+# If HASSECURITY is enabled, see if HASNOSOCKSECURITY should also be defined.
+
+if test $NSEC -eq 1
+then
+  cat << .CAT_MARK
+
+====================================================================
+
+When HASSECURITY is enabled, you may also define HASNOSOCKSECURITY.
+
+When both are defined, no one but root may list all of anyone else's
+open files -- only their own open files -- but anyone may list
+anyone else's open socket files.
+
+This option is useful with ntop (http://www.ntop.org).
+
+.CAT_MARK
+
+  grep HASNOSOCKSECURITY $OLD | tail $TA | egrep "^#define" > /dev/null
+  if test $? -eq 0
+  then
+    echo "HASNOSOCKSECURITY is enabled."
+    SOCKSEC=1
+  else
+    echo "HASNOSOCKSECURITY is disabled."
+    SOCKSEC=0
+  fi
+  END=0
+  while test $END -eq 0
+  do
+    echo ""
+    if test $SOCKSEC -eq 1
+    then
+      echo $EO "Disable HASNOSOCKSECURITY (y|n) [n]? $EC"
+    else
+      echo $EO "Enable HASNOSOCKSECURITY (y|n) [n]? $EC"
+    fi
+    read ANS EXCESS
+    if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+    then
+      echo ""
+      if test $SOCKSEC -eq 1
+      then
+        SOCKSEC=0
+        echo "HASNOSOCKSECURITY will be disabled."
+      else
+        SOCKSEC=1
+        echo "HASNOSOCKSECURITY will be enabled."
+      fi
+      END=1
+    else
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+      then
+        echo ""
+        echo "HASNOSOCKSECURITY will not be changed."
+        END=1
+      else
+        echo ""
+        echo "Please answer y|n [n]."
+      fi
+    fi
+  done
+else
+  SOCKSEC=0
+fi
+
+# Process WARNINGSTATE.
+
+cat << .CAT_MARK
+
+=====================================================================
+
+When WARNINGSTATE is enabled, lsof will will issue whatever warning
+messages it finds necessary.  When WARNINGSTATE is disabled, lsof
+will issue no warning messages.  For individual uses of lsof, -w
+disables warning state and +w enables it.
+
+.CAT_MARK
+
+grep WARNINGSTATE $OLD | tail $TA | egrep "^#define" > /dev/null
+if test $? -eq 0
+then
+  echo "WARNINGSTATE is disabled."
+  WST=0
+else
+  echo "WARNINGSTATE is enabled."
+  WST=1
+fi
+END=0
+NWST=$WST
+while test $END -eq 0
+do
+  echo ""
+  if test $NWST -eq 0
+  then
+    echo $EO "Enable WARNINGSTATE? (y|n) [n]? $EC"
+  else
+    echo $EO "Disable WARNINGSTATE? (y|n) [n]? $EC"
+  fi
+  read ANS EXCESS
+  if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+  then
+    echo ""
+    if test $NWST -eq 0
+    then
+      echo "WARNINGSTATE will be enabled."
+      NWST=1
+    else
+      echo "WARNINGSTATE will be disabled."
+      NWST=0
+    fi
+    END=1
+  else
+    if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+    then
+      echo ""
+      echo "WARNINGSTATE will not be changed."
+      END=1
+    else
+      echo ""
+      echo "Please answer y|n [n]."
+    fi
+  fi
+done
+
+# Process WARNDEVACCESS, unless the dialect's machine.h header file contains
+# NEVER_WARNDEVACCESS.
+
+grep NEVER_WARNDEVACCESS $OLD > /dev/null
+if test $? -eq 0
+then
+  NEVERWDA=1
+  NWDA=0
+else
+  NEVERWDA=0
+  cat << .CAT_MARK
+
+=====================================================================
+
+When WARNDEVACCESS is enabled, lsof will issue warning messages
+when it can't access nodes in /dev (or /devices), subject to the
+default or explicit (-w) WARNINGSTATE.
+
+When WARNDEVACCESS is disabled, lsof will silently skip nodes in
+/dev (or /devices) that it can't access.
+
+.CAT_MARK
+
+  grep WARNDEVACCESS $OLD | tail $TA | egrep "^#define" > /dev/null
+  if test $? -eq 0
+  then
+    echo "WARNDEVACCESS is enabled."
+    WDA=1
+  else
+    echo "WARNDEVACCESS is disabled."
+    WDA=0
+  fi
+  END=0
+  NWDA=$WDA
+  while test $END -eq 0
+  do
+    echo ""
+    if test $NWDA -eq 1
+    then
+      echo $EO "Disable WARNDEVACCESS (y|n) [n]? $EC"
+    else
+      echo $EO "Enable WARNDEVACCESS (y|n) [n]? $EC"
+    fi
+    read ANS EXCESS
+    if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+    then
+      echo ""
+      if test $NWDA -eq 1
+      then
+        echo "WARNDEVACCESS will be disabled."
+        NWDA=0
+      else
+        echo "WARNDEVACCESS will be enabled."
+        NWDA=1
+      fi
+      END=1
+    else
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+      then
+	echo ""
+	echo "WARNDEVACCESS will not be changed."
+        END=1
+      else
+        echo ""
+        echo "Please answer y|n [n]."
+      fi
+    fi
+  done
+fi
+
+# Process HASDCACHE, unless the dialect's machine.h header file contains
+# NEVER_HASDCACHE.
+
+ENVV=""
+ENVN=0
+PDCV=""
+PDCN=0
+PDCPV=""
+PDCPN=0
+SDCV=""
+SDCN=0
+grep NEVER_HASDCACHE $OLD > /dev/null
+if test $? -eq 0
+then
+  NEVERDC=1
+  CDC=0
+  DC=0
+  NDC=0
+else
+  NEVERDC=0
+  cat << .CAT_MARK
+
+=====================================================================
+
+When HASDCACHE is enabled, lsof will write a device cache file that
+contains information about the nodes in /dev (or /devices).  The
+options HASENVDC, HASPERSDC, HASPERSDCPATH, and HASSYSDC define
+the device cache file path.
+
+When HASDCACHE is disabled, lsof won't write a device cache file.
+
+Consult the 00DCACHE and 00FAQ files of the lsof distribution for
+more information.
+
+.CAT_MARK
+
+  grep HASDCACHE $OLD | tail $TA | egrep "^#define" > /dev/null
+  if test $? -eq 0
+  then
+    echo "HASDCACHE is enabled."
+    DC=1
+  else
+    echo "HASDCACHE is disabled."
+    DC=0
+  fi
+  END=0
+  NDC=$DC
+  while test $END -eq 0
+  do
+    echo ""
+    if test $NDC -eq 1
+    then
+      echo $EO "Disable HASDCACHE (y|n) [n]? $EC"
+    else
+      echo $EO "Enable HASDCACHE (y|n) [n]? $EC"
+    fi
+    read ANS EXCESS
+    if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+    then
+      echo ""
+      if test $NDC -eq 1
+      then
+        echo "HASDCACHE will be disabled."
+        NDC=0
+      else
+        echo "HASDCACHE will be enabled."
+        NDC=1
+      fi
+      END=1
+    else
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+      then
+	echo ""
+	echo "HASDCACHE will not be changed."
+        END=1
+      else
+        echo ""
+        echo "Please answer y|n [n]."
+      fi
+    fi
+  done
+
+  # See if other device cache options need to be declared.
+
+  if test $DC -eq 1 -a $NDC -eq 1
+  then
+    cat << .CAT_MARK
+
+=====================================================================
+
+You have decided that HASDCACHE should be defined.  There are other
+definitions associated with HASDCACHE that specify options for the
+formation of the device cache file path.  You may change them.
+
+Consult the 00DCACHE and 00FAQ files of the lsof distribution for
+more information.
+
+The current path options are:
+  
+.CAT_MARK
+
+    grep HASENVDC $OLD | tail $TA | egrep "^#define"
+    egrep "HASPERSDC$|HASPERSDC[ 	]" $OLD | tail $TA | egrep "^#define"
+    grep HASPERSDCPATH $OLD | tail $TA | egrep "^#define"
+    grep HASSYSDC $OLD | tail $TA | egrep "^#define"
+    END=0
+    while test $END -eq 0
+    do
+      echo ""
+      echo $EO "Do you want to change path options (y|n) [n]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+      then
+        CDC=1
+        END=1
+      else
+        if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+        then
+	  CDC=0
+	  END=1
+        else
+	  if test "X$ANS" = "X"
+	  then
+	    echo ""
+	    echo "The path options will not be changed."
+	    CDC=0
+	    END=1
+	  else
+	    echo ""
+	    echo "Please answer y|n [n]."
+	  fi
+        fi
+      fi
+    done
+  else
+    CDC=0
+  fi
+  if test \( $NDC -eq 1 -a $DC -eq 0 \) -o \( $DC -eq 1 -a $CDC -eq 1 \)
+  then
+    cat << .CAT_MARK
+
+=====================================================================
+
+You may specify for HASENVDC the name of the environment variable
+from which lsof should take the device cache file path for non-root
+users.  Press ENTER to use the current value of HASENVDC:
+
+.CAT_MARK
+
+    echo $EO "        $EC"
+    TMP1=`grep HASENVDC $OLD | tail $TA | egrep "^#define"`
+    if test "X$TMP1" != "X"
+    then
+      TMP1=`echo "$TMP1" | sed 's/^#define[ 	]HASENVDC[ 	]"\([^"]*\)".*$/\1/'`
+      echo "$TMP1"
+    else
+      echo "no current HASENVDC value"
+    fi
+    END=0
+    GV=0
+    while test $END -eq 0
+    do
+      echo ""
+      echo $EO "Do you want to define a name for HASENVDC (y|n) [n]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+      then
+        ENVV=""
+        END=1
+      else
+        if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+        then
+	  GV=1
+	  END=1
+        else
+	  if test "X$ANS" = "X"
+	  then
+	    echo ""
+	    echo "HASENVDC will not be changed."
+	    ENVV=$TMP1
+	    END=1
+	  else
+	    echo ""
+	    echo "Please answer y|n [n]."
+	  fi
+        fi
+      fi
+    done
+    if test $GV -eq 1
+    then
+      echo ""
+      echo $EO "Please enter the HASENVDC name (no quotes): $EC"
+      read TMP1 EXCESS
+      ENVV=`echo $TMP1 | sed 's/^\"//' | sed 's/\"$//'`
+      if test "X$ENVV" = "X"
+      then
+	ENVN=1
+      fi
+    fi
+    cat << .CAT_MARK
+
+=====================================================================
+
+HASPERSDC is a format that specifies how the personal device cache
+path is constructed.  Consult the 00DCACHE and 00FAQ files of the
+lsof distribution for information on the conversions supported in
+HASPERSDC.  Press ENTER to use the curent HASPERSDC format:
+
+.CAT_MARK
+
+    echo $EO "        $EC"
+    TMP1=`egrep "HASPERSDC$|HASPERSDC[ 	]" $OLD | tail $TA | egrep "^#define"`
+    if test "X$TMP1" != "X"
+    then
+      TMP1=`echo "$TMP1" | sed 's/^#define[ 	]HASPERSDC[ 	]"\([^"]*\)".*$/\1/'`
+      echo "$TMP1"
+    else
+      echo "no current HASPERSDC format"
+    fi
+    END=0
+    GV=0
+    while test $END -eq 0
+    do
+      echo ""
+      echo $EO "Do you want to define a format for HASPERSDC (y|n) [n]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+      then
+        END=1
+      else
+        if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+        then
+	  GV=1
+	  END=1
+        else
+	  if test "X$ANS" = "X"
+	  then
+	    echo ""
+	    echo "HASPERSDC will not be changed."
+	    PDCV=$TMP1
+	    END=1
+	  else
+	    echo ""
+	    echo "Please answer y|n [n]."
+	  fi
+        fi
+      fi
+    done
+    if test $GV -eq 1
+    then
+      echo ""
+      echo $EO "Please enter the HASPERSDC format (no quotes): $EC"
+      read TMP1 EXCESS
+      PDCV=`echo $TMP1 | sed 's/^\"//' | sed 's/\"$//'`
+      if test "X$PDCV" = "X"
+      then
+	PDCN=1
+      fi
+    fi
+    cat << .CAT_MARK
+
+=====================================================================
+
+Specify for HASPERSDCPATH the name of the environment variable from
+which lsof should take a path name component to insert at the %p
+conversion in the HASPERSDC format.
+
+Consult the 00FAQ and 00DCACHE files of the lsof distribution for
+more information on HASPERSDCPATH usage.
+
+Press ENTER to use the current value for HASPERSDCPATH:
+
+.CAT_MARK
+
+    echo $EO "        $EC"
+    TMP1=`grep HASPERSDCPATH $OLD | tail $TA | egrep "^#define"`
+    if test "X$TMP1" != "X"
+    then
+      TMP1=`echo "$TMP1" | sed 's/^#define[ 	]HASPERSDCPATH[ 	]"\([^"]*\)".*$/\1/'`
+      echo "$TMP1"
+    else
+      echo "no current HASPERSDCPATH value"
+    fi
+    END=0
+    GV=0
+    while test $END -eq 0
+    do
+      echo ""
+      echo $EO "Do you want to change HASPERSDCPATH (y|n) [n]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+      then
+	echo ""
+	echo "HASPERSDCPATH will not be changed."
+	PDCPV=$TMP1
+        END=1
+      else
+        if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+        then
+	  GV=1
+	  END=1
+	else
+	  echo ""
+	  echo "Please answer y|n [n]."
+	fi
+      fi
+    done
+    if test $GV -eq 1
+    then
+      echo ""
+      echo $EO "Please enter the HASPERSDCPATH name (no quotes): $EC"
+      read TMP1 EXCESS
+      PDCPV=`echo $TMP1 | sed 's/^\"//' | sed 's/\"$//'`
+      if test "X$PDCPV" = "X"
+      then
+	PDCPN=1
+      fi
+    fi
+    cat << .CAT_MARK
+
+=====================================================================
+
+Specify for HASSYSDC the system-wide device cache file path.  Press
+ENTER to use the current HASSYSDC value:
+
+.CAT_MARK
+
+    echo $EO "        $EC"
+    TMP1=`grep HASSYSDC $OLD | tail $TA | egrep "^#define"`
+    if test "X$TMP1" != "X"
+    then
+      TMP1=`echo "$TMP1" | sed 's/^#define[ 	]HASSYSDC[ 	]"\([^"]*\)".*$/\1/'`
+      echo "$TMP1"
+    else
+      echo "no current HASSYSDC value"
+    fi
+    END=0
+    GV=0
+    while test $END -eq 0
+    do
+      echo ""
+      echo $EO "Do you want to define a system-device path (y|n) [n]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+      then
+        END=1
+      else
+        if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+        then
+	  GV=1
+	  END=1
+        else
+	  if test "X$ANS" = "X"
+	  then
+	    echo ""
+	    echo "No HASSYSDC change will be made."
+	    SDCV=$TMP1
+	    END=1
+	  else
+	    echo ""
+	    echo "Please answer y|n [n]."
+	  fi
+        fi
+      fi
+    done
+    if test $GV -eq 1
+    then
+      echo ""
+      echo $EO "Please enter the system-wide path (no quotes): $EC"
+      read TMP1 EXCESS
+      SDCV=`echo $TMP1 | sed 's/^\"//' | sed 's/\"$//'`
+      if test "X$SDCV" = "X"
+      then
+	SDCN=1
+      fi
+    fi
+  fi
+fi
+
+# If HASXOPT is defined, and HASXOPT_ROOT is mentioned,
+# ask about changing HASXOPT_ROOT.
+
+HXRC=0
+grep HASXOPT $OLD | tail $TA | egrep "^#define" > /dev/null
+if test $? -eq 0
+then
+  grep HASXOPT_ROOT $OLD > /dev/null
+  if test $? -eq 0
+  then
+    cat << .CAT_MARK
+
+=====================================================================
+
+HASXOPT is defined.  If the dialect for which you are customizing
+appears in the following list, you may want to change the definition
+of HASXOPT_ROOT to restrict the use of the X option to lsof processes
+whose real user ID is root, or enable use of it by all user IDs.
+
+  AIX           the -X option enables the risky operation of letting
+		lsof read library entry structures with readx().
+		If HASXOPT_ROOT is defined, only processes whose
+		real user ID is root will be allowed to use -X.
+		If HASXOPT_ROOT is undefined, any process will be
+		allowed to use -X.  Consult the 00FAQ file of the
+		lsof distribution for more information on why
+		readx() may be risky.
+
+.CAT_MARK
+
+    grep HASXOPT_ROOT $OLD | tail $TA | egrep "^#define" > /dev/null
+    if test $? -eq 0
+    then
+      echo "HASXOPT_ROOT is defined."
+      HXR="undefine"
+      HXRS=1
+    else
+      echo "HASXOPT_ROOT is not defined."
+      HXR="define"
+      HXRS=0
+    fi
+    END=0
+    while test $END -eq 0
+    do
+      echo ""
+      echo $EO "Do you want to $HXR HASXOPT_ROOT (y|n) [n]? $EC"
+      read ANS EXCESS
+      if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+      then
+        HXRA=1
+        END=1
+      else
+        if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+        then
+	  echo ""
+	  echo "HASXOPT_ROOT will not be changed."
+          HXRA=0
+          END=1
+        else
+          echo ""
+          echo "Please answer y|n [n]."
+        fi
+      fi
+    done
+    if test $HXRA -eq 1
+    then
+      HXRC=1
+    fi
+  fi
+fi
+
+# Process HASKERNIDCK.  Skip processing for selected dialect directories.
+
+case $DialDir in
+  linux/proc)
+    NIDCK=0
+    ;;
+  *)
+    cat << .CAT_MARK
+
+=====================================================================
+
+When HASKERNIDCK is enabled, lsof compares the identity of the
+kernel where it was built to the identity of the kernel where it
+is running.  This check can detect an lsof executable inappropriate
+for the system on which it is being run.
+
+The kernel identity check can take considerable time on some UNIX
+dialects -- e.g., AIX -- so there may be occasions when it is
+desirable to disable it, in spite of the increased risk of using
+an inappropriate lsof executable.
+
+.CAT_MARK
+
+    grep HASKERNIDCK $OLD | tail $TA | grep "^#define" > /dev/null
+    if test $? -eq 0
+    then
+      echo "HASKERNIDCK is enabled."
+      IDCK=1
+    else
+      echo "HASKERNIDCK is disabled."
+      IDCK=0
+    fi
+    END=0
+    NIDCK=$IDCK
+    while test $END -eq 0
+    do
+      echo ""
+      if test $NIDCK -eq 1
+      then
+        echo $EO "Disable HASKERNIDCK (y|n) [n]? $EC"
+      else
+        echo $EO "Enable HASKERNIDCK (y|n) [n]? $EC"
+      fi
+      read ANS EXCESS
+      if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+      then
+        echo ""
+        if test $NIDCK -eq 1
+        then
+          NIDCK=0
+          echo "HASKERNIDCK will be disabled."
+        else
+          NIDCK=1
+          echo "HASKERNIDCK will be enabled."
+        fi
+        END=1
+      else
+        if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+        then
+          echo ""
+          echo "HASKERNIDCK will not be changed."
+          END=1
+          NIDCK=$IDCK
+        else
+          echo ""
+          echo "Please answer y|n [n]."
+        fi
+      fi
+    done
+    ;;
+esac
+
+# Initialize new machine.h.
+
+rm -f $NEW
+cp $OLD $NEW
+chmod 0644 $NEW
+echo "" >> $NEW
+echo "/*" >> $NEW
+echo $EO " * Added by Customize on $EC" >> $NEW
+date >> $NEW
+echo " */" >> $NEW
+echo "" >> $NEW
+
+# Change HASSECURITY and HASNOSOCKSECURITY, as required.
+
+echo "#undef	HASSECURITY" >> $NEW
+echo "#undef	HASNOSOCKSECURITY" >> $NEW
+if test $NSEC -eq 1
+then
+  echo "#define	HASSECURITY	1" >> $NEW
+  if test $SOCKSEC -eq 1
+  then
+    echo "#define	HASNOSOCKSECURITY	1" >> $NEW
+  fi
+fi
+
+# Change WARNDEVACCESS, as required.
+
+if test $NEVERWDA -eq 0
+then
+  echo "#undef	WARNDEVACCESS" >> $NEW
+  if test $NWDA -eq 1
+  then
+    echo "#define	WARNDEVACCESS	1" >> $NEW
+  fi
+fi
+
+# Change WARNINGSTATE, as required.
+
+echo "#undef	WARNINGSTATE" >> $NEW
+if test $NWST -eq 0
+then
+  echo "#define	WARNINGSTATE	1" >> $NEW
+fi
+
+# Change device cache definitions, as required.
+
+if test \( $NDC -eq 1 -a $DC -eq 0 \) -o \( $DC -eq 1 -a $CDC -eq 1 \)
+then
+  if test "X$ENVV" = "X" -a "X$PDCV" = "X" -a "X$SDCV" = "X"
+  then
+    cat << .CAT_MARK
+
+FATAL: HASDCACHE is defined, but there is no definition for
+       any of HASENVDC, HASPERSDC, or HASSYSDC
+
+       No new machine.h has been created.
+
+       Customize quits.
+
+       Restart Customize and define at least one of HASENVDC,
+       HASPERSDC, or HASSYSDC.
+
+.CAT_MARK
+
+    rm -f $NEW
+    exit 1
+  fi
+fi
+if test "X$PDCV" != "X"
+then
+  echo "$PDCV" | grep "%p" > /dev/null
+  if test $? -eq 0 -a $PDCPN -eq 1
+  then
+    cat << .CAT_MARK
+
+FATAL: HASDCACHE is defined and HASPERSDC has a %p conversion,
+       but HASPERSDCPATH is NULL.
+
+       No new machine.h has been created.
+
+       Customize quits.
+
+       Restart Customize and define HASPERSDCPATH.
+
+.CAT_MARK
+
+    rm -f $NEW
+    exit 1
+  fi
+fi
+echo "#undef	HASDCACHE" >> $NEW
+if test $NEVERDC -eq 1
+then
+  echo "#undef	HASENVDC" >> $NEW
+  echo "#undef	HASPERSDC" >> $NEW
+  echo "#undef	HASPERSDCPATH" >> $NEW
+  echo "#undef	HASSYSDC" >> $NEW
+else
+  if test $NDC -eq 1
+  then
+    echo "#define	HASDCACHE	1" >> $NEW
+    if test "X$ENVV" != "X" -o $ENVN -eq 1
+    then
+      echo "#undef	HASENVDC" >> $NEW
+      if test $ENVN -eq 0
+      then
+        echo "#define	HASENVDC	\"$ENVV\"" >> $NEW
+      fi
+    fi
+    if test "X$PDCV" != "X" -o $PDCN -eq 1
+    then
+      echo "#undef	HASPERSDC" >> $NEW
+      if test $PDCN -eq 0
+      then
+        echo "#define	HASPERSDC	\"$PDCV\"" >> $NEW
+      fi
+    fi
+    if test "X$PDCPV" != "X" -o $PDCPN -eq 1
+    then
+      echo "#undef	HASPERSDCPATH" >> $NEW
+      if test $PDCPN -eq 0
+      then
+        echo "#define	HASPERSDCPATH	\"$PDCPV\"" >> $NEW
+      fi
+    fi
+    if test "X$SDCV" != "X" -o $SDCN -eq 1
+    then
+      echo "#undef	HASSYSDC" >> $NEW
+      if test $SDCN -eq 0
+      then
+        echo "#define	HASSYSDC	\"$SDCV\"" >> $NEW
+      fi
+    fi
+  fi
+fi
+
+# Change HASXOPT_ROOT, as required.
+
+if test $HXRC -eq 1
+then
+  if test $HXRS -eq 1
+  then
+    echo "#undef	HASXOPT_ROOT" >> $NEW
+  else
+    echo "#define	HASXOPT_ROOT	1" >> $NEW
+  fi
+fi
+
+# Change HASKERNIDCK, as required.
+
+echo "#undef	HASKERNIDCK" >> $NEW
+if test $NIDCK -eq 1
+then
+  echo "#define	HASKERNIDCK	1" >> $NEW
+fi
+
+# Replace the current machine.h with the new one, as requested.
+
+echo ""
+echo "====================================================================="
+echo ""
+echo "A new $OLD file has been created in \"$NEW\"."
+END=0
+while test $END -eq 0
+do
+  echo ""
+  echo "Do you want to rename $OLD to ${OLD}.old and replace it with"
+  echo $EO "$NEW (y|n) [y]? $EC"
+  read ANS EXCESS
+  if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+  then
+    END=1
+  else
+    if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+    then
+      rm -f ${OLD}.old
+      mv $OLD ${OLD}.old
+      mv $NEW $OLD
+      END=1
+    else
+      echo ""
+      echo "Please answer y|n [y]."
+    fi
+  fi
+done
+echo ""
+echo "You may now run the make command -- e.g.,"
+echo ""
+echo "        $ make"
+echo ""
+exit 0
+#LAST_LINE
diff --git a/lsof_4.85/lsof_4.85_src/Inventory b/lsof_4.85/lsof_4.85_src/Inventory
new file mode 100755
index 0000000..6b16fe5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/Inventory
@@ -0,0 +1,204 @@
+#!/bin/sh
+#
+# Inventory -- take an inventory of the lsof distribution's 00MANIFEST
+
+# Establish trap and stty handling.
+
+ISIG=":"
+trap '$ISIG; exit 1'  1 2 3 15
+stty -a 2>&1 | grep isig > /dev/null
+if test $? -eq 0
+then
+  stty -a 2>&1 | egrep -e -isig > /dev/null
+  if test $? -eq 0
+  then
+    ISIG="stty -isig"
+    stty isig
+  fi
+fi
+
+# Establish echo type -- Berkeley or SYSV.
+
+j=`echo -n ""`
+if test "X$j" = "X-n "
+then
+  EC="\c"
+  EO=""
+else
+  EC=""
+  EO="-n"
+fi
+
+# Display the introduction and basic explanation.
+
+cat << .CAT_MARK
+
+This configuration step (the Inventory script) takes inventory of
+the lsof distribution.  The script runs for a minute or two while
+it checks that all the subdirectories, information files, scripts,
+header files and source files that should be present really are.
+
+It's not absolutely necessary that you take inventory, but it's a
+good idea to do it right after the lsof distribution has been
+unpacked.  Once the inventory has been taken, this script creates
+the file ./.ck00MAN as a signal that the inventory step has been
+done.
+
+You can call the Inventory script directly at any time to take
+inventory.  You can inhibit the inventory step permanently by
+creating the file ./.neverInv, and you can tell the Configure script
+to skip the inventory and customization steps with the -n option.
+.CAT_MARK
+
+END=0
+while test $END = 0
+do
+  echo ""
+  echo $EO "Do you want to take inventory (y|n) [y]? $EC"
+  read ANS EXCESS
+  if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+  then
+    exit 0
+  fi
+  if test "X$ANS" = "Xy" -o "X$ANS" = "XY" -o "X$ANS" = "X"
+  then
+    END=1
+  else
+    echo ""
+    echo "Please answer y or n."
+  fi
+done
+
+# The current directory is assumed to be the lsof distribution home.
+
+D=`pwd`
+
+# If .ck00MAN exists, the manifest has already been checked.
+# See if the caller wants to check it again.
+
+CK=$D/.ck00MAN
+if test -r $CK
+then
+  cat << .CAT_MARK
+
+======================================================================
+
+The lsof distribution inventory in 00MANIFEST has already been checked.
+.CAT_MARK
+
+  END=0
+  while test $END = 0
+  do
+    echo ""
+    echo $EO "Do you want to check the inventory again (y|n) [n]? $EC"
+    read ANS EXCESS
+    if test "X$ANS" = "Xn" -o "X$ANS" = "XN" -o "X$ANS" = "X"
+    then
+      exit 0
+    else
+      if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+      then
+	END=1
+      else
+	echo ""
+	echo "Please answer y or n."
+      fi
+    fi
+  done
+fi
+echo ""
+
+# See if manifest exists.  Exit if it does not.
+
+if test ! -r 00MANIFEST
+then
+  echo "FATAL: 00MANIFEST file not found or not readable; Inventory exits."
+  echo ""
+  exit 1
+fi
+
+# Start the inventory.
+
+S=""
+echo "Conducting an inventory of the lsof distribution; this will take a while."
+echo ""
+echo $EO "Examining ${D}:$EC"
+ERR=0
+OK=1
+for i in `cat 00MANIFEST | sed 's/\*$//'`
+do
+  if test "X$i" != "X"
+  then
+    j=`expr $i : '\(.*\)/$'`
+    if test "X$j" != "X" -a "X$j" != "X0"
+    then
+
+    # Check a subdirectory reference.
+
+      if test ! -d ${D}/${S}/$j
+      then
+	if test $OK = 1
+	then
+	  echo ""
+	fi
+	echo "    Subdirectory ${S}/$j is missing. ++++"
+	ERR=1
+	OK=0
+      fi
+    else
+      s=`expr $i : '\(.*\):$'`
+      if test "X$s" != "X" -a "X$s" != "X0"
+      then
+
+      # Process a subdirectory change.
+
+	if test $OK -eq 1
+	then
+	  echo " OK"
+	fi
+	OK=1
+	S=$s
+	echo $EO "Examining $S:$EC"
+	if test ! -d ${D}/$S
+	then
+	  echo " ERROR"
+	  echo "    Subdirectory $S is missing. ++++"
+	  ERR=1
+	  OK=0
+	fi
+      else
+
+	# Process a file reference.
+
+	if test ! -r ${D}/${S}/$i
+	then
+	  if test $OK -eq 1
+	  then
+	    echo " ERROR"
+	  fi
+	  echo "    File ${S}/$i is missing. ++++"
+	  ERR=1
+	  OK=0
+	fi
+      fi
+    fi
+  fi
+done
+if test $OK -eq 1
+then
+  echo " OK"
+fi
+echo ""
+if test $ERR -ne 0
+then
+  echo "+++++++++++++++++++++++++++++++++++++++++++++++"
+  echo "+                                             +"
+  echo "+  SOME FILES OR DIRECTORIES MAY BE MISSING!  +"
+  echo "+                                             +"
+  echo "+++++++++++++++++++++++++++++++++++++++++++++++"
+else
+  echo "This lsof distribution seems to be complete."
+fi
+echo ""
+echo "" >> $CK
+exit $ERR
diff --git a/lsof_4.85/lsof_4.85_src/arg.c b/lsof_4.85/lsof_4.85_src/arg.c
new file mode 100644
index 0000000..28ba64f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/arg.c
@@ -0,0 +1,2491 @@
+/*
+ * arg.c - common argument processing support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: arg.c,v 1.50 2011/09/07 19:13:49 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	CMDRXINCR	32		/* CmdRx[] allocation increment */
+
+
+/*
+ * Local static variables
+ */
+
+static int NCmdRxA = 0;			/* space allocated to CmdRx[] */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int ckfd_range,(char *first, char *dash, char *last, int *lo, int *hi));
+_PROTOTYPE(static int enter_fd_lst,(char *nm, int lo, int hi, int excl));
+_PROTOTYPE(static int enter_nwad,(struct nwad *n, int sp, int ep, char *s, struct hostent *he));
+_PROTOTYPE(static struct hostent *lkup_hostnm,(char *hn, struct nwad *n));
+_PROTOTYPE(static char *isIPv4addr,(char *hn, unsigned char *a, int al));
+
+
+/*
+ * ckfd_range() - check fd range
+ */
+
+static int
+ckfd_range(first, dash, last, lo, hi)
+	char *first;			/* starting character */
+	char *dash;			/* '-' location */
+	char *last;			/* '\0' location */
+	int *lo;			/* returned low value */
+	int *hi;			/* returned high value */
+{
+	char *cp;
+/*
+ * See if the range character pointers make sense.
+ */
+	if (first >= dash || dash >= last) {
+	    (void) fprintf(stderr, "%s: illegal FD range for -d: ", Pn);
+	    safestrprt(first, stderr, 1);
+	    return(1);
+	}
+/*
+ * Assemble and check the high and low values.
+ */
+	for (cp = first, *lo = 0; *cp && cp < dash; cp++) {
+	    if (!isdigit((unsigned char)*cp)) {
+
+FD_range_nondigit:
+
+		(void) fprintf(stderr, "%s: non-digit in -d FD range: ", Pn);
+		safestrprt(first, stderr, 1);
+		return(1);
+	    }
+	    *lo = (*lo * 10) + (int)(*cp - '0');
+	}
+	for (cp = dash+1, *hi = 0; *cp && cp < last; cp++) {
+	    if (!isdigit((unsigned char)*cp))
+		goto FD_range_nondigit;
+	    *hi = (*hi * 10) + (int)(*cp - '0');
+	}
+	if (*lo >= *hi) {
+	    (void) fprintf(stderr, "%s: -d FD range's low >= its high: ", Pn);
+	    safestrprt(first, stderr, 1);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * ck_file_arg() - check file arguments
+ */
+
+int
+ck_file_arg(i, ac, av, fv, rs, sbp)
+	int i;			/* first file argument index */
+	int ac;			/* argument count */
+	char *av[];		/* argument vector */
+	int fv;			/* Ffilesys value (real or temporary) */
+	int rs;			/* Readlink() status if argument count == 1:
+				 *	0 = undone; 1 = done */
+	struct stat *sbp;	/* if non-NULL, pointer to stat(2) buffer
+				 * when argument count == 1 */
+{
+	char *ap, *fnm, *fsnm, *path;
+	short err = 0;
+	int fsm, ftype, j, k;
+	MALLOC_S l;
+	struct mounts *mp;
+	static struct mounts **mmp = (struct mounts **)NULL;
+	int mx, nm;
+	static int nma = 0;
+	struct stat sb;
+	struct sfile *sfp;
+	short ss = 0;
+
+#if	defined(CKFA_EXPDEV)
+	dev_t dev, rdev;
+#endif	/* defined(CKFA_EXPDEV) */
+
+#if	defined(HASPROCFS)
+	unsigned char ad, an;
+	int pfsnl = -1;
+	pid_t pid;
+	struct procfsid *pfi;
+#endif	/* defined(HASPROCFS) */
+
+/*
+ * Loop through arguments.
+ */
+	for (; i < ac; i++) {
+	    if (rs && (ac == 1) && (i == 0))
+		path = av[i];
+	    else {
+		if (!(path = Readlink(av[i]))) {
+		    ErrStat = 1;
+		    continue;
+		}
+	    }
+	/*
+	 * Remove terminating `/' characters from paths longer than one.
+	 */
+	    j = k = strlen(path);
+	    while ((k > 1) && (path[k-1] == '/')) {
+		k--;
+	    }
+	    if (k < j) {
+		if (path != av[i])
+		    path[k] = '\0';
+		else {
+		    if (!(ap = (char *)malloc((MALLOC_S)(k + 1)))) {
+			(void) fprintf(stderr, "%s: no space for copy of %s\n",
+			    Pn, path);
+			Exit(1);
+		    }
+		    (void) strncpy(ap, path, k);
+		    ap[k] = '\0';
+		    path = ap;
+		}
+	    }
+	/*
+	 * Check for file system argument.
+	 */
+	    for (ftype = 1, mp = readmnt(), nm = 0;
+		 (fv != 1) && mp;
+		 mp = mp->next)
+	    {
+		fsm = 0;
+		if (strcmp(mp->dir, path) == 0)
+		    fsm++;
+		else if (fv == 2 || (mp->fs_mode & S_IFMT) == S_IFBLK) {
+		    if (mp->fsnmres && strcmp(mp->fsnmres, path) == 0)
+			fsm++;
+		}
+		if (!fsm)
+		    continue;
+		ftype = 0;
+	    /*
+	     * Skip duplicates.
+	     */
+		for (mx = 0; mx < nm; mx++) {
+		    if (strcmp(mp->dir, mmp[mx]->dir) == 0
+		    &&  mp->dev == mmp[mx]->dev
+		    &&  mp->rdev == mmp[mx]->rdev
+		    &&  mp->inode == mmp[mx]->inode)
+			break;
+		}
+		if (mx < nm)
+		    continue;
+	    /*
+	     * Allocate space for and save another mount point match and
+	     * the type of match -- directory name (mounted) or file system
+	     * name (mounted-on).
+	     */
+		if (nm >= nma) {
+		    nma += 5;
+		    l = (MALLOC_S)(nma * sizeof(struct mounts *));
+		    if (mmp)
+			mmp = (struct mounts **)realloc((MALLOC_P *)mmp, l);
+		    else
+			mmp = (struct mounts **)malloc(l);
+		    if (!mmp) {
+			(void) fprintf(stderr,
+			    "%s: no space for mount pointers\n", Pn);
+			Exit(1);
+		    }
+		}
+		mmp[nm++] = mp;
+	    }
+	    if (fv == 2 && nm == 0) {
+		(void) fprintf(stderr, "%s: not a file system: ", Pn);
+		safestrprt(av[i], stderr, 1);
+		ErrStat = 1;
+		continue;
+	    }
+	/*
+	 * Loop through the file system matches.  If there were none, make one
+	 * pass through the loop, using simply the path name.
+	 */
+	    mx = 0;
+	    do {
+
+	    /*
+	     * Allocate an sfile structure and fill in the type and link.
+	     */
+		if (!(sfp = (struct sfile *)malloc(sizeof(struct sfile)))) {
+		    (void) fprintf(stderr, "%s: no space for files\n", Pn);
+		    Exit(1);
+		}
+		sfp->next = Sfile;
+		Sfile = sfp;
+		sfp->f = 0;
+		if ((sfp->type = ftype)) {
+
+		/*
+		 * For a non-file system path, use the path as the file name
+		 * and set a NULL file system name.
+		 */
+		    fnm = path;
+		    fsnm = (char *)NULL;
+		/*
+		 * Stat the path to obtain its characteristics.
+		 */
+		    if (sbp && (ac == 1))
+			sb = *sbp;
+		    else {
+			if (statsafely(fnm, &sb) != 0) {
+			    int en = errno;
+
+			    (void) fprintf(stderr, "%s: status error on ", Pn);
+			    safestrprt(fnm, stderr, 0);
+			    (void) fprintf(stderr, ": %s\n", strerror(en));
+			    Sfile = sfp->next;
+			    (void) free((FREE_P *)sfp);
+			    ErrStat = 1;
+			    continue;
+			}
+
+#if	defined(HASSPECDEVD)
+			(void) HASSPECDEVD(fnm, &sb);
+#endif	/* defined(HASSPECDEVD) */
+
+		    }
+		    sfp->i = (INODETYPE)sb.st_ino;
+		    sfp->mode = sb.st_mode & S_IFMT;
+		
+#if	defined(CKFA_EXPDEV)
+		/*
+		 * Expand device numbers before saving, so that they match the
+		 * already-expanded local mount info table device numbers.
+		 * (This is an EP/IX 2.1.1 and above artifact.)
+		 */
+		    sfp->dev = expdev(sb.st_dev);
+		    sfp->rdev = expdev(sb.st_rdev);
+#else	/* !defined(CKFA_EXPDEV) */
+		    sfp->dev = sb.st_dev;
+		    sfp->rdev = sb.st_rdev;
+#endif	/* defined(CKFA_EXPDEV) */
+
+#if	defined(CKFA_MPXCHAN)
+		/*
+		 * Save a (possible) multiplexed channel number.  (This is an
+		 * AIX artifact.)
+		 */
+		    sfp->ch = getchan(path);
+#endif	/* defined(CKFA_MPXCHAN) */
+
+		} else {
+		    mp = mmp[mx++];
+		    ss++;
+
+#if	defined(HASPROCFS)
+		/*
+		 * If this is a /proc file system, set the search flag and
+		 * abandon the sfile entry.
+		 */
+		    if (mp == Mtprocfs) {
+			Sfile = sfp->next;
+			(void) free((FREE_P *)sfp);
+			Procsrch = 1;
+			continue;
+		    }
+#endif	/* defined(HASPROCFS) */
+
+		/*
+		 * Derive file name and file system name for a mount point.
+		 *
+		 * Save the device numbers, inode number, and modes.
+		 */
+		    fnm = mp->dir;
+		    fsnm = mp->fsname;
+		    sfp->dev = mp->dev;
+		    sfp->rdev = mp->rdev;
+		    sfp->i = mp->inode;
+		    sfp->mode = mp->mode & S_IFMT;
+		}
+		ss = 1;		/* indicate a "safe" stat() */
+	    /*
+	     * Store the file name and file system name pointers in the sfile
+	     * structure, allocating space as necessary.
+	     */
+		if (!fnm || fnm == path) {
+		    sfp->name = fnm;
+
+#if	defined(HASPROCFS)
+		    an = 0;
+#endif	/* defined(HASPROCFS) */
+
+		} else {
+		    if (!(sfp->name = mkstrcpy(fnm, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr,
+			    "%s: no space for file name: ", Pn);
+			safestrprt(fnm, stderr, 1);
+			Exit(1);
+		    }
+
+#if	defined(HASPROCFS)
+		    an = 1;
+#endif	/* defined(HASPROCFS) */
+
+		}
+		if (!fsnm || fsnm == path) {
+		    sfp->devnm = fsnm;
+
+#if	defined(HASPROCFS)
+		    ad = 0;
+#endif	/* defined(HASPROCFS) */
+
+		} else {
+		    if (!(sfp->devnm = mkstrcpy(fsnm, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr,
+			    "%s: no space for file system name: ", Pn);
+			safestrprt(fsnm, stderr, 1);
+			Exit(1);
+		    }
+
+#if	defined(HASPROCFS)
+		    ad = 1;
+#endif	/* defined(HASPROCFS) */
+
+		}
+		if (!(sfp->aname = mkstrcpy(av[i], (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr,
+			"%s: no space for argument file name: ", Pn);
+			safestrprt(av[i], stderr, 1);
+		    Exit(1);
+		}
+
+#if	defined(HASPROCFS)
+	    /*
+	     * See if this is an individual member of a proc file system.
+	     */
+		if (!Mtprocfs || Procsrch)
+		    continue;
+
+# if	defined(HASFSTYPE) && HASFSTYPE==1
+		if (strcmp(sb.st_fstype, HASPROCFS) != 0)
+		    continue;
+# endif	/* defined(HASFSTYPE) && HASFSTYPE==1 */
+
+		if (pfsnl == -1)
+		    pfsnl = strlen(Mtprocfs->dir);
+		if (!pfsnl)
+		    continue;
+		if (strncmp(Mtprocfs->dir, path, pfsnl) != 0)
+		    continue;
+		if (path[pfsnl] != '/')
+
+# if	defined(HASPINODEN)
+		    pid = 0;
+# else	/* !defined(HASPINODEN) */
+		    continue;
+# endif	/* defined(HASPINODEN) */
+
+		else {
+		    for (j = pfsnl+1; path[j]; j++) {
+			if (!isdigit((unsigned char)path[j]))
+			    break;
+		    }
+		    if (path[j] || (j - pfsnl - 1) < 1
+		    ||  (sfp->mode & S_IFMT) != S_IFREG)
+
+# if	defined(HASPINODEN)
+			pid = 0;
+# else	/* !defined(HASPINODEN) */
+			continue;
+# endif	/* defined(HASPINODEN) */
+
+		    else
+			pid = atoi(&path[pfsnl+1]);
+		}
+		if (!(pfi = (struct procfsid *)malloc((MALLOC_S)
+			     sizeof(struct procfsid))))
+		{
+		    (void) fprintf(stderr, "%s: no space for %s ID: ",
+			Pn, Mtprocfs->dir);
+		    safestrprt(path, stderr, 1);
+		    Exit(1);
+		}
+		pfi->pid = pid;
+		pfi->f = 0;
+		pfi->nm = sfp->aname;
+		pfi->next = Procfsid;
+		Procfsid = pfi;
+
+# if	defined(HASPINODEN)
+		pfi->inode = (INODETYPE)sfp->i;
+# endif	/* defined(HASPINODEN) */
+
+	    /*
+	     * Abandon the Sfile entry, lest it be used in is_file_named().
+	     */
+		Sfile = sfp->next;
+		if (ad)
+		    (void) free((FREE_P *)sfp->devnm);
+		if (an)
+		    (void) free((FREE_P *)sfp->name);
+		(void) free((FREE_P *)sfp);
+#endif	/* defined(HASPROCFS) */
+
+	    } while (mx < nm);
+	}
+	if (!ss)
+	    err = 1;
+	return((int)err);
+}
+
+
+#if	defined(HASDCACHE)
+/*
+ * ctrl_dcache() - enter device cache control
+ */
+
+int
+ctrl_dcache(c)
+	char *c;			/* control string */
+{
+	int rc = 0;
+	
+	if (!c) {
+	    (void) fprintf(stderr,
+		"%s: no device cache option control string\n", Pn);
+	    return(1);
+	}
+/*
+ * Decode argument function character.
+ */
+	switch (*c) {
+	case '?':
+	    if (*(c+1) != '\0') {
+		(void) fprintf(stderr, "%s: nothing should follow -D?\n", Pn);
+		return(1);
+	    }
+	    DChelp = 1;
+	    return(0);
+	case 'b':
+	case 'B':
+	    if (Setuidroot
+
+#if	!defined(WILLDROPGID)
+	    ||  Myuid
+#endif	/* !defined(WILLDROPGID) */
+
+	    )
+		rc = 1;
+	    else
+		DCstate = 1;
+	    break;
+	case 'r':
+	case 'R':
+	    if (Setuidroot && *(c+1))
+		rc = 1;
+	    else
+		DCstate = 2;
+	    break;
+	case 'u':
+	case 'U':
+	    if (Setuidroot
+
+#if	!defined(WILLDROPGID)
+	    ||  Myuid
+#endif	/* !defined(WILLDROPGID) */
+
+	    )
+		rc = 1;
+	    else
+		DCstate = 3;
+	    break;
+	case 'i':
+	case 'I':
+	    if (*(c+1) == '\0') {
+		DCstate = 0;
+		return(0);
+	    }
+	    /* fall through */
+	default:
+	    (void) fprintf(stderr, "%s: unknown -D option: ", Pn);
+	    safestrprt(c, stderr, 1);
+	    return(1);
+	}
+	if (rc) {
+	    (void) fprintf(stderr, "%s: -D option restricted to root: ", Pn);
+	    safestrprt(c, stderr, 1);
+	    return(1);
+	}
+/*
+ * Skip to optional path name and save it.
+ */
+	for (c++; *c && (*c == ' ' || *c == '\t'); c++)
+	    ;
+	if (strlen(c)) {
+	    if (!(DCpathArg = mkstrcpy(c, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr, "%s: no space for -D path: ", Pn);
+		safestrprt(c, stderr, 1);
+		Exit(1);
+	    }
+	}
+	return(0);
+}
+#endif	/* defined(HASDCACHE) */
+
+
+/*
+ * enter_cmd_rx() - enter command regular expression
+ */
+
+int
+enter_cmd_rx(x)
+	char *x;			/* regular expression */
+{
+	int bmod = 0;
+	int bxmod = 0;
+	int i, re;
+	int imod = 0;
+	int xmod = 0;
+	int co = REG_NOSUB|REG_EXTENDED;
+	char reb[256], *xb, *xe, *xm;
+	MALLOC_S xl;
+	char *xp = (char *)NULL;
+/*
+ * Make sure the supplied string starts a regular expression.
+ */
+	if (!*x || (*x != '/')) {
+	    (void) fprintf(stderr, "%s: regexp doesn't begin with '/': ", Pn);
+	    if (x)
+		safestrprt(x, stderr, 1);
+	    return(1);
+	}
+/*
+ * Skip to the end ('/') of the regular expression.
+ */
+	xb = x + 1;
+	for (xe = xb; *xe; xe++) {
+	    if (*xe == '/')
+		break;
+	}
+	if (*xe != '/') {
+	    (void) fprintf(stderr, "%s: regexp doesn't end with '/': ", Pn);
+	    safestrprt(x, stderr, 1);
+	    return(1);
+	}
+/*
+ * Decode any regular expression modifiers.
+ */
+	for (i = 0, xm = xe + 1; *xm; xm++) {
+	    switch(*xm) {
+	    case 'b':			/* This is a basic expression. */
+		if (++bmod > 1) {
+		    if (bmod == 2) {
+			(void) fprintf(stderr,
+			    "%s: b regexp modifier already used: ", Pn);
+			safestrprt(x, stderr, 1);
+		    }
+		    i = 1;
+		} else if (xmod) {
+		    if (++bxmod == 1) {
+			(void) fprintf(stderr,
+			    "%s: b and x regexp modifiers conflict: ", Pn);
+			safestrprt(x, stderr, 1);
+		    }
+		    i = 1;
+		} else
+		    co &= ~REG_EXTENDED;
+		break;
+	    case 'i':			/* Ignore case. */
+		if (++imod > 1) {
+		    if (imod == 2) {
+			(void) fprintf(stderr,
+			    "%s: i regexp modifier already used: ", Pn);
+			safestrprt(x, stderr, 1);
+		    }
+		    i = 1;
+		} else
+		    co |= REG_ICASE;
+		break;
+	    case 'x':			/* This is an extended expression. */
+		if (++xmod > 1) {
+		    if (xmod == 2) {
+			(void) fprintf(stderr,
+			    "%s: x regexp modifier already used: ", Pn);
+			safestrprt(x, stderr, 1);
+		    }
+		    i = 1;
+		} else if (bmod) {
+		    if (++bxmod == 1) {
+			(void) fprintf(stderr,
+			    "%s: b and x regexp modifiers conflict: ", Pn);
+			safestrprt(x, stderr, 1);
+		    }
+		    i = 1;
+		} else
+		    co |= REG_EXTENDED;
+		break;
+	    default:
+		(void) fprintf(stderr, "%s: invalid regexp modifier: %c\n",
+		Pn, (int)*xm);
+		i = 1;
+	    }
+	}
+	if (i)
+	    return(1);
+/*
+ * Allocate space to hold expression and copy it there.
+ */
+	xl = (MALLOC_S)(xe - xb);
+	if (!(xp = (char *)malloc(xl + 1))) {
+	    (void) fprintf(stderr, "%s: no regexp space for: ", Pn);
+	    safestrprt(x, stderr, 1);
+	    Exit(1);
+	}
+	(void) strncpy(xp, xb, xl);
+	xp[(int)xl] = '\0';
+/*
+ * Assign a new CmdRx[] slot for this expression.
+ */
+	if (NCmdRxA >= NCmdRxU) {
+
+	/*
+	 * More CmdRx[] space must be assigned.
+	 */
+	    NCmdRxA += CMDRXINCR;
+	    xl = (MALLOC_S)(NCmdRxA * sizeof(lsof_rx_t));
+	    if (CmdRx)
+		CmdRx = (lsof_rx_t *)realloc((MALLOC_P *)CmdRx, xl);
+	    else
+		CmdRx = (lsof_rx_t *)malloc(xl);
+	    if (!CmdRx) {
+		(void) fprintf(stderr, "%s: no space for regexp: ", Pn);
+		safestrprt(x, stderr, 1);
+		Exit(1);
+	    }
+	}
+	i = NCmdRxU;
+	CmdRx[i].exp = xp;
+/*
+ * Compile the expression.
+ */
+	if ((re = regcomp(&CmdRx[i].cx, xp, co))) {
+	    (void) fprintf(stderr, "%s: regexp error: ", Pn);
+	    safestrprt(x, stderr, 0);
+	    (void) regerror(re, &CmdRx[i].cx, &reb[0], sizeof(reb));
+	    (void) fprintf(stderr, ": %s\n", reb);
+	    if (xp) {
+		(void) free((FREE_P *)xp);
+		xp = (char *)NULL;
+	    }
+	    return(1);
+	}
+/*
+ * Complete the CmdRx[] table entry.
+ */
+	CmdRx[i].mc = 0;
+	CmdRx[i].exp = xp;
+	NCmdRxU++;
+	return(0);
+}
+
+
+#if	defined(HASEOPT)
+/*
+ * enter_efsys() -- enter path of file system whose kernel blocks are to be
+ *		    eliminated
+ */
+
+int
+enter_efsys(e, rdlnk)
+	char *e;			/* file system path */
+	int rdlnk;			/* avoid readlink(2) if non-zero */
+{
+	char *ec;			/* pointer to copy of path */
+	efsys_list_t *ep;		/* file system path list pointer */
+	int i;				/* temporary index */
+	char *path;			/* Readlink() of file system path */
+
+	if (!e || (*e != '/')) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: -e not followed by a file system path: \"%s\"\n",
+		    Pn, e);
+	    return(1);
+	}
+	if (!(ec = mkstrcpy(e, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no space for -e string: ", Pn);
+	    safestrprt(e, stderr, 1);
+	    Exit(1);
+	}
+	if (rdlnk)
+	    path = ec;
+	else {
+	    if (!(path = Readlink(ec)))
+		return(1);
+	}
+/*
+ * Remove terminating `/' characters from paths longer than one.
+ */
+	for (i = (int)strlen(path); (i > 1) && (path[i - 1] == '/'); i--) {
+	    path[i - 1] = '\0';
+	}
+/*
+ * Enter file system path on list, avoiding duplicates.
+ */
+	for (ep = Efsysl; ep; ep = ep->next) {
+	   if (!strcmp(ep->path, path))
+		return(0);
+	}
+	if (!(ep = (efsys_list_t *)malloc((MALLOC_S)(sizeof(efsys_list_t))))) {
+	   (void) fprintf(stderr, "%s: no space for \"-e %s\" entry\n",
+		Pn, e);
+	   Exit(1);
+	}
+	ep->path = path;
+	ep->pathl = i;
+	ep->rdlnk = rdlnk;
+	ep->mp = (struct mounts *)NULL;
+	if (!(ep->next = Efsysl))
+	    Efsysl = ep;
+	return(0);
+}
+#endif	/* defined(HASEOPT) */
+
+
+/*
+ * enter_fd() - enter file descriptor list for searching
+ */
+
+int
+enter_fd(f)
+	char *f;			/* file descriptor list pointer */
+{
+	char c, *cp1, *cp2, *dash;
+	int err, excl, hi, lo;
+	char *fc;
+/*
+ *  Check for non-empty list and make a copy.
+ */
+	if (!f || (strlen(f) + 1) < 2) {
+	    (void) fprintf(stderr, "%s: no file descriptor specified\n", Pn);
+	    return(1);
+	}
+	if (!(fc = mkstrcpy(f, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no space for fd string: ", Pn);
+	    safestrprt(f, stderr, 1);
+	    Exit(1);
+	}
+/*
+ * Isolate each file descriptor in the comma-separated list, then enter it
+ * in the file descriptor string list.  If a descriptor has the form:
+ *
+ *	[0-9]+-[0-9]+
+ *
+ * treat it as an ascending range of file descriptor numbers.
+ *
+ * Accept a leading '^' as an excusion on match.
+ */
+	for (cp1 = fc, err = 0; *cp1;) {
+	    if (*cp1 == '^') {
+		excl = 1;
+		cp1++;
+	    } else
+		excl = 0;
+	    for (cp2 = cp1, dash = (char *)NULL; *cp2 && *cp2 != ','; cp2++) {
+		if (*cp2 == '-')
+		    dash = cp2;
+	    }
+	    if ((c = *cp2) != '\0')
+		*cp2 = '\0';
+	    if (cp2 > cp1) {
+		if (dash) {
+		    if (ckfd_range(cp1, dash, cp2, &lo, &hi))
+			err = 1;
+		    else {
+			if (enter_fd_lst((char *)NULL, lo, hi, excl))
+			    err = 1;
+		    }
+		} else {
+		    if (enter_fd_lst(cp1, 0, 0, excl))
+			err = 1;
+		}
+	    }
+	    if (c == '\0')
+		break;
+	    cp1 = cp2 + 1;
+	}
+	(void) free((FREE_P *)fc);
+	return(err);
+}
+
+
+/*
+ * enter_fd_lst() - make an entry in the FD list, Fdl
+ */
+
+static int
+enter_fd_lst(nm, lo, hi, excl)
+	char *nm;			/* FD name (none if NULL) */
+	int lo;				/* FD low boundary (if nm NULL) */
+	int hi;				/* FD high boundary (if nm NULL) */
+	int excl;			/* exclusion on match */
+{
+	char buf[256], *cp;
+	int n;
+	struct fd_lst *f, *ft;
+/*
+ * Don't allow a mixture of exclusions and inclusions.
+ */
+	if (FdlTy >= 0) {
+	    if (FdlTy != excl) {
+		if (!Fwarn) {
+
+		/*
+		 * If warnings are enabled, report a mixture.
+		 */
+		    if (nm) {
+			(void) snpf(buf, sizeof(buf) - 1, "%s%s",
+			    excl ? "^" : "", nm);
+		    } else {
+			if (lo != hi) {
+			    (void) snpf(buf, sizeof(buf) - 1, "%s%d-%d",
+				excl ? "^" : "", lo, hi);
+			} else {
+			    (void) snpf(buf, sizeof(buf) - 1, "%s%d",
+				excl ? "^" : "", lo);
+			}
+		    }
+		    buf[sizeof(buf) - 1] = '\0';
+		    (void) fprintf(stderr,
+		        "%s: %s in an %s -d list: %s\n", Pn,
+			excl ? "exclude" : "include",
+			FdlTy ? "exclude" : "include",
+			buf);
+		}
+		return(1);
+	    }
+	}
+/*
+ * Allocate an fd_lst entry.
+ */
+	if (!(f = (struct fd_lst *)malloc((MALLOC_S)sizeof(struct fd_lst)))) {
+	   (void) fprintf(stderr, "%s: no space for FD list entry\n", Pn);
+	   Exit(1);
+	}
+	if (nm) {
+
+	/*
+	 * Process an FD name.  First see if it contains only digits; if it
+	 * does, convert them to an integer and set the low and high
+	 * boundaries to the result.
+	 *
+	 * If the name has a non-digit, store it as a string, and set the
+	 * boundaries to impossible values (i.e., low > high).
+	 */
+	    for (cp = nm, n = 0; *cp; cp++) {
+		if (!isdigit((unsigned char)*cp))
+		    break;
+		n = (n * 10) + (int)(*cp - '0');
+	    }
+	    if (*cp) {
+		if (!(f->nm = mkstrcpy(nm, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr,
+			"%s: no space for copy of: %s\n", Pn, nm);
+		    Exit(1);
+		}
+		lo = 1;
+		hi = 0;
+	    } else {
+		f->nm = (char *)NULL;
+		lo = hi = n;
+	    }
+	} else
+	    f->nm = (char *)NULL;
+/*
+ * Skip duplicates.
+ */
+	for (ft = Fdl; ft; ft = ft->next) {
+	    if (f->nm) {
+		if (!ft->nm || strcmp(f->nm, ft->nm))
+		    continue;
+	    } else if ((lo != ft->lo) || (hi != ft->hi))
+		continue;
+	    (void) free((FREE_P *)f);
+	    return(0);
+	}
+/*
+ * Complete the fd_lst entry and link it to the head of the chain.
+ */
+	f->hi = hi;
+	f->lo = lo;
+	f->next = Fdl;
+	Fdl = f;
+	FdlTy = excl;
+	return(0);
+}
+
+
+/*
+ * enter_dir() - enter the files of a directory for searching
+ */
+
+#define	EDDEFFNL	128		/* default file name length */
+
+int
+enter_dir(d, descend)
+	char *d;			/* directory path name pointer */
+	int descend;			/* subdirectory descend flag:
+					 *	0 = don't descend
+					 *	1 = descend */
+{
+	char *av[2];
+	dev_t ddev;
+	DIR *dfp;
+	char *dn = (char *)NULL;
+	MALLOC_S dnl, dnamlen;
+	struct DIRTYPE *dp;
+	int en, sl;
+	int fct = 0;
+	char *fp = (char *)NULL;
+	MALLOC_S fpl = (MALLOC_S)0;
+	MALLOC_S fpli = (MALLOC_S)0;
+	struct stat sb;
+/*
+ * Check the directory path; reduce symbolic links; stat(2) it; make sure it's
+ * really a directory.
+ */
+	if (!d || !*d || *d == '+' || *d == '-') {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: +d not followed by a directory path\n", Pn);
+	    return(1);
+	}
+	if (!(dn = Readlink(d)))
+	    return(1);
+	if (statsafely(dn, &sb)) {
+	    if (!Fwarn) {
+		en = errno;
+		(void) fprintf(stderr, "%s: WARNING: can't stat(", Pn);
+		safestrprt(dn, stderr, 0);
+		(void) fprintf(stderr, "): %s\n", strerror(en));
+	    }
+	    if (dn && dn != d) {
+		(void) free((FREE_P *)dn);
+		dn = (char *)NULL;
+	    }
+	    return(1);
+	}
+	if ((sb.st_mode & S_IFMT) != S_IFDIR) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr, "%s: WARNING: not a directory: ", Pn);
+		safestrprt(dn, stderr, 1);
+	    }
+	    if (dn && dn != d) {
+		(void) free((FREE_P *)dn);
+		dn = (char *)NULL;
+	    }
+	    return(1);
+	}
+
+#if	defined(HASSPECDEVD)
+	(void) HASSPECDEVD(dn, &sb);
+#endif	/* defined(HASSPECDEVD) */
+
+	ddev = sb.st_dev;
+/*
+ * Stack the directory and record it in Sfile for searching.
+ */
+	Dstkn = Dstkx = 0;
+	Dstk = (char **)NULL;
+	(void) stkdir(dn);
+	av[0] = (dn == d) ? mkstrcpy(dn, (MALLOC_S *)NULL) : dn;
+	av[1] = (char *)NULL;
+	dn = (char *)NULL;
+	if (!ck_file_arg(0, 1, av, 1, 1, &sb)) {
+	    av[0] = (char *)NULL;
+	    fct++;
+	}
+/*
+ * Unstack the next directory and examine it.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dn = Dstk[Dstkx]))
+		continue;
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Open the directory path and prepare its name for use with the
+	 * files in the directory.
+	 */
+	    if (!(dfp = OpenDir(dn))) {
+		if (!Fwarn) {
+		    if ((en = errno) != ENOENT) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: can't opendir(", Pn);
+			safestrprt(dn, stderr, 0);
+			(void) fprintf(stderr, "): %s\n", strerror(en));
+		    }
+	        }
+		(void) free((FREE_P *)dn);
+		dn = (char *)NULL;
+		continue;
+	    }
+	    dnl = strlen(dn);
+	    sl = ((dnl > 0) && (*(dn + dnl - 1) == '/')) ? 0 : 1;
+	/*
+	 * Define space for possible addition to the directory path.
+	 */
+	    fpli = (MALLOC_S)(dnl + sl + EDDEFFNL + 1);
+	    if ((int)fpli > (int)fpl) {
+		fpl = fpli;
+		if (!fp)
+		    fp = (char *)malloc(fpl);
+		else
+		    fp = (char *)realloc(fp, fpl);
+		if (!fp) {
+		    (void) fprintf(stderr,
+			"%s: no space for path to entries in directory: %s\n",
+			Pn, dn);
+		    Exit(1);
+		}
+	    }
+	    (void) snpf(fp, (size_t)fpl, "%s%s", dn, sl ? "/" : "");
+	    (void) free((FREE_P *)dn);
+	    dn = (char *)NULL;
+	/*
+	 * Read the contents of the directory.
+	 */
+	    for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+
+	    /*
+	     * Skip: entries with no inode number;
+	     *	     entries with a zero length name;
+	     *	     ".";
+	     *	     and "..".
+	     */
+		if (!dp->d_ino)
+		    continue;
+
+#if     defined(HASDNAMLEN)
+		dnamlen = (MALLOC_S)dp->d_namlen;
+#else   /* !defined(HASDNAMLEN) */
+		dnamlen = (MALLOC_S)strlen(dp->d_name);
+#endif  /* defined(HASDNAMLEN) */
+
+		if (!dnamlen)
+		    continue;
+		if (dnamlen <= 2 && dp->d_name[0] == '.') {
+		    if (dnamlen == 1)
+			continue;
+		    if (dp->d_name[1] == '.')
+			continue;
+		}
+	    /*
+	     * Form the entry's path name.
+	     */
+		fpli = (MALLOC_S)(dnamlen - (fpl - dnl - sl - 1));
+		if ((int)fpli > 0) {
+		    fpl += fpli;
+		    if (!(fp = (char *)realloc(fp, fpl))) {
+			(void) fprintf(stderr, "%s: no space for: ", Pn);
+			safestrprt(dn, stderr, 0);
+			putc('/', stderr);
+			safestrprtn(dp->d_name, dnamlen, stderr, 1);
+			Exit(1);
+		    }
+		}
+		(void) strncpy(fp + dnl + sl, dp->d_name, dnamlen);
+		fp[dnl + sl + dnamlen] = '\0';
+	    /*
+	     * Lstatsafely() the entry; complain if that fails.
+	     *
+	     * Stack entries that represent subdirectories.
+	     */
+		if (lstatsafely(fp, &sb)) {
+		    if ((en = errno) != ENOENT) {
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"%s: WARNING: can't lstat(", Pn);
+			    safestrprt(fp, stderr, 0);
+			    (void) fprintf(stderr, "): %s\n", strerror(en));
+			}
+		    }
+		    continue;
+		}
+
+#if	defined(HASSPECDEVD)
+		(void) HASSPECDEVD(fp, &sb);
+#endif	/* defined(HASSPECDEVD) */
+
+		if (!(Fxover & XO_FILESYS)) {
+
+		/*
+		 * Unless "-x" or "-x f" was specified, don't cross over file
+		 * system mount points.
+		 */
+		    if (sb.st_dev != ddev)
+			continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFLNK) {
+
+		/*
+		 * If this is a symbolic link and "-x_ or "-x l" was specified,
+		 * Statsafely() the entry and process it.
+		 *
+		 * Otherwise skip symbolic links.
+		 */
+		    if (Fxover & XO_SYMLINK) {
+			if (statsafely(fp, &sb)) {
+			    if ((en = errno) != ENOENT) {
+				if (!Fwarn) {
+				    (void) fprintf(stderr,
+					"%s: WARNING: can't stat(", Pn);
+				    safestrprt(fp, stderr, 0);
+				    (void) fprintf(stderr,
+					") symbolc link: %s\n", strerror(en));
+				}
+			    }
+			    continue;
+		        }
+		    } else
+			continue;
+		}
+		if (av[0]) {
+		    (void) free((FREE_P *)av[0]);
+		    av[0] = (char *)NULL;
+		}
+		av[0] = mkstrcpy(fp, (MALLOC_S *)NULL);
+		if ((sb.st_mode & S_IFMT) == S_IFDIR && descend)
+
+		/*
+		 * Stack a subdirectory according to the descend argument.
+		 */
+		    stkdir(av[0]);
+	    /*
+	     * Use ck_file_arg() to record the entry for searching.  Force it
+	     * to consider the entry a file, not a file system.
+	     */
+		if (!ck_file_arg(0, 1, av, 1, 1, &sb)) {
+		    av[0] = (char *)NULL;
+		    fct++;
+		}
+	    }
+	    (void) CloseDir(dfp);
+	    if (dn && dn != d) {
+		(void) free((FREE_P *)dn);
+		dn = (char *)NULL;
+	    }
+	}
+/*
+ * Free malloc()'d space.
+ */
+	if (dn && dn != d) {
+	    (void) free((FREE_P *)dn);
+	    dn = (char *)NULL;
+	}
+	if (av[0] && av[0] != fp) {
+	    (void) free((FREE_P *)av[0]);
+	    av[0] = (char *)NULL;
+	}
+	if (fp) {
+	    (void) free((FREE_P *)fp);
+	    fp = (char *)NULL;
+	}
+	if (Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	}
+	if (!fct) {
+
+	/*
+	 * Warn if no files were recorded for searching.
+	 */
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: no files found in directory: ", Pn);
+		safestrprt(d, stderr, 1);
+	    }
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * enter_id() - enter PGID or PID for searching
+ */
+
+int
+enter_id(ty, p)
+	enum IDType ty;			/* type: PGID or PID */
+	char *p;			/* process group ID string pointer */
+{
+	char *cp;
+	int err, i, id, j, mx, n, ni, nx, x;
+	struct int_lst *s;
+
+	if (!p) {
+	    (void) fprintf(stderr, "%s: no process%s ID specified\n",
+		Pn, (ty == PGID) ? " group" : "");
+	    return(1);
+	}
+/*
+ * Set up variables for the type of ID.
+ */
+	switch (ty) {
+	case PGID:
+	    mx = Mxpgid;
+	    n = Npgid;
+	    ni = Npgidi;
+	    nx = Npgidx;
+	    s = Spgid;
+	    break;
+	case PID:
+	    mx = Mxpid;
+	    n = Npid;
+	    ni = Npidi;
+	    nx = Npidx;
+	    s = Spid;
+	    break;
+	default:
+	    (void) fprintf(stderr, "%s: enter_id \"", Pn);
+	    safestrprt(p, stderr, 0);
+	    (void) fprintf(stderr, "\", invalid type: %d\n", ty);
+	    Exit(1);
+	}
+/*
+ * Convert and store the ID.
+ */
+	for (cp = p, err = 0; *cp;) {
+
+	/*
+	 * Assemble ID.
+	 */
+	    for (i = id = x = 0; *cp && *cp != ','; cp++) {
+		if (!i) {
+		    i = 1;
+		    if (*cp == '^') {
+			x = 1;
+			continue;
+		    }
+		}
+
+#if	defined(__STDC__)
+		if (!isdigit((unsigned char)*cp))
+#else	/* !defined(__STDC__) */
+		if (!isascii(*cp) || ! isdigit((unsigned char)*cp))
+#endif	/* __STDC__ */
+
+		{
+		    (void) fprintf(stderr, "%s: illegal process%s ID: ",
+			Pn, (ty == PGID) ? " group" : "");
+		    safestrprt(p, stderr, 1);
+		    return(1);
+		}
+		id = (id * 10) + *cp - '0';
+	    }
+	    if (*cp)
+		cp++;
+	/*
+	 * Avoid entering duplicates and conflicts.
+	 */
+	    for (i = j = 0; i < n; i++) {
+		if (id == s[i].i) {
+		    if (x == s[i].x) {
+			j = 1;
+			continue;
+		    }
+		    (void) fprintf(stderr,
+			"%s: P%sID %d has been included and excluded.\n",
+			Pn,
+			(ty == PGID) ? "G" : "",
+			id);
+		    err = j = 1;
+		    break;
+		}
+	    }
+	    if (j)
+		continue;
+	/*
+	 * Allocate table table space.
+	 */
+	    if (n >= mx) {
+		mx += IDINCR;
+		if (!s)
+		    s = (struct int_lst *)malloc(
+			(MALLOC_S)(sizeof(struct int_lst) * mx));
+		else
+		    s = (struct int_lst *)realloc((MALLOC_P *)s,
+			(MALLOC_S)(sizeof(struct int_lst) * mx));
+		if (!s) {
+		    (void) fprintf(stderr, "%s: no space for %d process%s IDs",
+			Pn, mx, (ty == PGID) ? " group" : "");
+		    Exit(1);
+		}
+	    }
+	    s[n].f = 0;
+	    s[n].i = id;
+	    s[n++].x = x;
+	    if (x)
+		nx++;
+	    else
+		ni++;
+	}
+/*
+ * Save variables for the type of ID.
+ */
+	if (ty == PGID) {
+	    Mxpgid = mx;
+	    Npgid = n;
+	    Npgidi = ni;
+	    Npgidx = nx;
+	    Spgid = s;
+	} else {
+	    Mxpid = mx;
+	    Npid = Npuns = n;
+	    Npidi = ni;
+	    Npidx = nx;
+	    Spid = s;
+	}
+	return(err);
+}
+
+
+/*
+ * enter_network_address() - enter Internet address for searching
+ */
+
+int
+enter_network_address(na)
+	char *na;			/* Internet address string pointer */
+{
+	int ae, i, pr;
+	int ep = -1;
+	int ft = 0;
+	struct hostent *he = (struct hostent *)NULL;
+	char *hn = (char *)NULL;
+	MALLOC_S l;
+	struct nwad n;
+	char *p, *wa;
+	int pt = 0;
+	int pu = 0;
+	struct servent *se, *se1;
+	char *sn = (char *)NULL;
+	int sp = -1;
+	MALLOC_S snl = 0;
+
+#if	defined(HASIPv6)
+	char *cp;
+#endif	/* defined(HASIPv6) */
+
+	if (!na) {
+	    (void) fprintf(stderr, "%s: no network address specified\n", Pn);
+	    return(1);
+	}
+	zeromem((char *)&n, sizeof(n));
+	wa = na;
+/*
+ * Process an IP version type specification, IPv4 or IPv6, optionally followed
+ * by a '@' and a host name or Internet address, or a ':' and a service name or
+ * port number.
+ */
+	if ((*wa == '4') || (*wa == '6')) {
+	    if (*wa == '4')
+		ft = 4;
+	    else if (*wa == '6') {
+
+#if	defined(HASIPv6)
+		ft = 6;
+#else	/* !defined(HASIPv6) */
+		(void) fprintf(stderr, "%s: IPv6 not supported: -i ", Pn);
+		safestrprt(na, stderr, 1);
+		goto nwad_exit;
+#endif	/* defined(HASIPv6) */
+
+	    }
+	    wa++;
+	    if (!*wa) {
+
+	    /*
+	     * If nothing follows 4 or 6, then all network files of the
+	     * specified IP version are selected.  Sequential -i, -i4, and
+	     * -i6 specifications interact logically -- e.g., -i[46] followed
+	     * by -i[64] is the same as -i.
+	     */
+		if (!Fnet) {
+		    Fnet = 1;
+		    FnetTy = ft;
+		} else {
+		    if (FnetTy) {
+			if (FnetTy != ft)
+			    FnetTy = 0;
+		    } else
+			FnetTy = ft;
+		}
+		return(0);
+	    }
+	} else if (Fnet)
+	    ft = FnetTy;
+/*
+ * If an IP version has been specified, use it to set the address family.
+ */
+	switch (ft) {
+	case 4:
+	    n.af = AF_INET;
+	    break;
+
+#if	defined(HASIPv6)
+	case 6:
+	    n.af = AF_INET6;
+	    break;
+#endif	/* defined(HASIPv6) */
+
+	}
+/*
+ * Process protocol name, optionally followed by a '@' and a host name or
+ * Internet address, or a ':' and a service name or port number.
+ */
+	if (*wa && *wa != '@' && *wa != ':') {
+	    for (p = wa; *wa && *wa != '@' && *wa != ':'; wa++)
+		;
+	    if ((l = wa - p)) {
+		if (!(n.proto = mkstrcat(p, l, (char *)NULL, -1, (char *)NULL,
+			        -1, (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr,
+			"%s: no space for protocol name from: -i ", Pn);
+		    safestrprt(na, stderr, 1);
+nwad_exit:
+		    if (n.proto)
+			(void) free((FREE_P *)n.proto);
+		    if (hn)
+			(void) free((FREE_P *)hn);
+		    if (sn)
+			(void) free((FREE_P *)sn);
+		    return(1);
+		}
+	    /*
+	     * The protocol name should be "tcp", "udp" or "udplite".
+	     */
+		if ((strcasecmp(n.proto, "tcp") != 0)
+		&&  (strcasecmp(n.proto, "udp") != 0)
+		&&  (strcasecmp(n.proto, "udplite") != 0))
+		{
+		    (void) fprintf(stderr,
+			"%s: unknown protocol name (%s) in: -i ", Pn, n.proto);
+		    safestrprt(na, stderr, 1);
+		    goto nwad_exit;
+		}
+	    /*
+	     * Convert protocol name to lower case.
+	     */
+		for (p = n.proto; *p; p++) {
+		    if (*p >= 'A' && *p <= 'Z')
+			*p = *p - 'A' + 'a';
+		}
+	    }
+	}
+/*
+ * Process an IPv4 address (1.2.3.4), IPv6 address ([1:2:3:4:5:6:7:8]),
+ * or host name, preceded by a '@' and optionally followed by a colon
+ * and a service name or port number.
+ */
+	if (*wa == '@') {
+	    wa++;
+	    if (!*wa || *wa == ':') {
+
+#if	defined(HASIPv6)
+unacc_address:
+#endif	/* defined(HASIPv6) */
+
+		(void) fprintf(stderr,
+		    "%s: unacceptable Internet address in: -i ", Pn);
+		safestrprt(na, stderr, 1);
+		goto nwad_exit;
+	    }
+
+	    if ((p = isIPv4addr(wa, n.a, sizeof(n.a)))) {
+
+	    /*
+	     * Process IPv4 address.
+	     */
+		if (ft == 6) {
+		    (void) fprintf(stderr,
+			"%s: IPv4 addresses are prohibited: -i ", Pn);
+		    safestrprt(na, stderr, 1);
+		    goto nwad_exit;
+		}
+		wa = p;
+		n.af = AF_INET;
+	    } else if (*wa == '[') {
+
+#if	defined(HASIPv6)
+	    /*
+	     * Make sure IPv6 addresses are permitted.  If they are, assemble
+	     * one.
+	     */
+		if (ft == 4) {
+		    (void) fprintf(stderr,
+			"%s: IPv6 addresses are prohibited: -i ", Pn);
+		    safestrprt(na, stderr, 1);
+		    goto nwad_exit;
+		}
+		if (!(cp = strrchr(++wa, ']')))
+		    goto unacc_address;
+		*cp = '\0';
+		i = inet_pton(AF_INET6, wa, (void *)&n.a);
+		*cp = ']';
+		if (i != 1)
+		    goto unacc_address;
+		for (ae = i = 0; i < MAX_AF_ADDR; i++) {
+		    if ((ae |= n.a[i]))
+			break;
+		}
+		if (!ae)
+		    goto unacc_address;
+		if (IN6_IS_ADDR_V4MAPPED((struct in6_addr *)&n.a[0])) {
+		    if (ft == 6) {
+			(void) fprintf(stderr,
+			    "%s: IPv4 addresses are prohibited: -i ", Pn);
+			safestrprt(na, stderr, 1);
+			goto nwad_exit;
+		    }
+		    for (i = 0; i < 4; i++) {
+			n.a[i] = n.a[i+12];
+		    }
+		    n.af = AF_INET;
+		} else
+		    n.af = AF_INET6;
+		wa = cp + 1;
+#else	/* !defined(HASIPv6) */
+		(void) fprintf(stderr,
+		    "%s: unsupported IPv6 address in: -i ", Pn);
+		safestrprt(na, stderr, 1);
+		goto nwad_exit;
+#endif	/* defined(HASIPv6) */
+
+	    } else {
+
+	    /*
+	     * Assemble host name.
+	     */
+		for (p = wa; *p && *p != ':'; p++)
+		    ;
+		if ((l = p - wa)) {
+		    if (!(hn = mkstrcat(wa, l, (char *)NULL, -1, (char *)NULL,
+			       -1, (MALLOC_S *)NULL)))
+		    {
+			(void) fprintf(stderr,
+			    "%s: no space for host name: -i ", Pn);
+			safestrprt(na, stderr, 1);
+			goto nwad_exit;
+		    }
+
+#if	defined(HASIPv6)
+
+		/*
+		 * If no IP version has been specified, look up an IPv6 host
+		 * name first.  If that fails, look up an IPv4 host name.
+		 *
+		 * If the IPv6 version has been specified, look up the host
+		 * name only under its IP version specification.
+		 */
+		    if (!ft)
+			n.af = AF_INET6;
+		    if (!(he = lkup_hostnm(hn, &n)) && !ft) {
+			n.af = AF_INET;
+			he = lkup_hostnm(hn, &n);
+		    }
+#else	/* !defined(HASIPv6) */
+		    if (!ft)
+			n.af = AF_INET;
+		    he = lkup_hostnm(hn, &n);
+#endif	/* defined(HASIPv6) */
+		
+		    if (!he) {
+			fprintf(stderr, "%s: unknown host name (%s) in: -i ",
+			    Pn, hn);
+			safestrprt(na, stderr, 1);
+			goto nwad_exit;
+		    }
+		}
+		wa = p;
+	    }
+	}
+/*
+ * If there is no port number, enter the address.
+ */
+	if (!*wa)
+	    goto nwad_enter;
+/*
+ * Process a service name or port number list, preceded by a colon.
+ *
+ * Entries of the list are separated with commas; elements of a numeric range
+ * are specified with a separating minus sign (`-'); all service names must
+ * belong to the same protocol; embedded spaces are not allowed.  An embedded
+ * minus sign in a name is taken to be part of the name, the starting entry
+ * of a range can't be a service name.
+ */
+	if (*wa != ':' || *(wa + 1) == '\0') {
+
+unacc_port:
+	    (void) fprintf(stderr,
+		"%s: unacceptable port specification in: -i ", Pn);
+	    safestrprt(na, stderr, 1);
+	    goto nwad_exit;
+	}
+	for (++wa; wa && *wa; wa++) {
+	    for (ep = pr = sp = 0; *wa; wa++) {
+		if (*wa < '0' || *wa > '9') {
+
+		/*
+		 * Convert service name to port number, using already-specified
+		 * protocol name.  A '-' is taken to be part of the name; hence
+		 * the starting entry of a range can't be a service name.
+		 */
+		    for (p = wa; *wa && *wa != ','; wa++)
+			;
+		    if (!(l = wa - p)) {
+			(void) fprintf(stderr,
+			    "%s: invalid service name: -i ", Pn);
+			safestrprt(na, stderr, 1);
+			goto nwad_exit;
+		    }
+		    if (sn) {
+			if (l > snl) {
+			    sn = (char *)realloc((MALLOC_P *)sn, l + 1);
+			    snl = l;
+			}
+		    } else {
+			sn = (char *)malloc(l + 1);
+			snl = l;
+		    }
+		    if (!sn) {
+			(void) fprintf(stderr,
+			    "%s: no space for service name: -i ", Pn);
+			safestrprt(na, stderr, 1);
+			goto nwad_exit;
+		    }
+		    (void) strncpy(sn, p, l);
+		    *(sn + l) = '\0';
+		    if (n.proto) {
+
+		    /*
+		     * If the protocol has been specified, look up the port
+		     * number for the service name for the specified protocol.
+		     */
+			if (!(se = getservbyname(sn, n.proto))) {
+			    (void) fprintf(stderr,
+				"%s: unknown service %s for %s in: -i ",
+				Pn, sn, n.proto);
+			    safestrprt(na, stderr, 1);
+			    goto nwad_exit;
+			}
+			pt = (int)ntohs(se->s_port);
+		    } else {
+
+		    /*
+		     * If no protocol has been specified, look up the port
+		     * numbers for the service name for both TCP and UDP.
+		     */
+			if((se = getservbyname(sn, "tcp")))
+			    pt = (int)ntohs(se->s_port);
+			if ((se1 = getservbyname(sn, "udp")))
+			    pu = (int)ntohs(se1->s_port);
+			if (!se && !se1) {
+			    (void) fprintf(stderr,
+				"%s: unknown service %s in: -i ", Pn, sn);
+			    safestrprt(na, stderr, 1);
+			    goto nwad_exit;
+			}
+			if (se && se1 && pt != pu) {
+			    (void) fprintf(stderr,
+				"%s: TCP=%d and UDP=%d %s ports conflict;\n",
+				Pn, pt, pu, sn);
+			    (void) fprintf(stderr,
+				"      specify \"tcp:%s\" or \"udp:%s\": -i ",
+				sn, sn);
+			    safestrprt(na, stderr, 1);
+			    goto nwad_exit;
+			}
+			if (!se && se1)
+			    pt = pu;
+		    }
+		    if (pr)
+			ep = pt;
+		    else {
+			sp = pt;
+			if (*wa == '-')
+			    pr++;
+		    }
+		} else {
+
+		/*
+		 * Assemble port number.
+		 */
+		    for (; *wa && *wa != ','; wa++) {
+			if (*wa == '-') {
+			    if (pr)
+				goto unacc_port;
+			    pr++;
+			    break;
+			}
+			if (*wa < '0' || *wa > '9')
+			    goto unacc_port;
+			if (pr)
+			    ep = (ep * 10) + *wa - '0';
+			else
+			    sp = (sp * 10) + *wa - '0';
+		    }
+		}
+		if (!*wa || *wa == ',')
+		    break;
+		if (pr)
+		    continue;
+		goto unacc_port;
+	    }
+	    if (!pr)
+		ep = sp;
+	    if (ep < sp)
+		goto unacc_port;
+	/*
+	 * Enter completed port or port range specification.
+	 */
+
+nwad_enter:
+
+	    for (i = 1; i;) {
+		if (enter_nwad(&n, sp, ep, na, he))
+		    goto nwad_exit;
+
+#if	defined(HASIPv6)
+	    /*
+	     * If IPv6 is enabled, a host name was specified, and the
+	     * associated * address is for the AF_INET6 address family,
+	     * try to get and address for the AF_INET family, too, unless
+	     * IPv4 is prohibited.
+	     */
+		if (hn && (n.af == AF_INET6) && (ft != 6)) {
+		    n.af = AF_INET;
+		    if ((he = lkup_hostnm(hn, &n)))
+			continue;
+		}
+#endif	/* defined(HASIPv6) */
+
+		i = 0;
+	    }
+	    if (!*wa)
+		break;
+	}
+	if (sn)
+	    (void) free((FREE_P *)sn);
+	return(0);
+}
+
+/*
+ * enter_nwad() - enter nwad structure
+ */
+
+static int
+enter_nwad(n, sp, ep, s, he)
+	struct nwad *n;			/* pointer to partially completed
+					 * nwad (less port) */
+	int sp;				/* starting port number */
+	int ep;				/* ending port number */
+	char *s;			/* string that states the address */
+	struct hostent *he;		/* pointer to hostent struct from which
+					 * network address came */
+{
+	int ac;
+	unsigned char *ap;
+	static int na = 0;
+	struct nwad nc;
+	struct nwad *np;
+/*
+ * Allocate space for the argument specification.
+ */
+	if (strlen(s)) {
+	    if (!(n->arg = mkstrcpy(s, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr,
+		    "%s: no space for Internet argument: -i ", Pn);
+		safestrprt(s, stderr, 1);
+		Exit(1);
+	    }
+	} else
+	    n->arg = (char *)NULL;
+/*
+ * Loop through all hostent addresses.
+ */
+	for (ac = 1, nc = *n;;) {
+
+	/*
+	 * Test address specification -- it must contain at least one of:
+	 * protocol, Internet address or port.  If correct, link into search
+	 * list.
+	 */
+	    if (!nc.proto
+	    &&  !nc.a[0] && !nc.a[1] && !nc.a[2] && !nc.a[3]
+
+#if	defined(HASIPv6)
+	    &&  (nc.af != AF_INET6
+	    ||   (!nc.a[4]  && !nc.a[5]  && !nc.a[6]  && !nc.a[7]
+	    &&    !nc.a[8]  && !nc.a[9]  && !nc.a[10] && !nc.a[11]
+	    &&    !nc.a[12] && !nc.a[13] && !nc.a[14] && !nc.a[15]))
+#endif	/* defined(HASIPv6) */
+
+	    &&  sp == -1) {
+		(void) fprintf(stderr,
+		    "%s: incomplete Internet address specification: -i ", Pn);
+		safestrprt(s, stderr, 1);
+		return(1);
+	    }
+	/*
+	 * Limit the network address chain length to MAXNWAD for reasons of
+	 * search efficiency.
+	 */
+	    if (na >= MAXNWAD) {
+		(void) fprintf(stderr,
+		    "%s: network address limit (%d) exceeded: -i ",
+		    Pn, MAXNWAD);
+		safestrprt(s, stderr, 1);
+		return(1);
+	    }
+	/*
+	 * Allocate space for the address specification.
+	 */
+	    if ((np = (struct nwad *)malloc(sizeof(struct nwad))) == NULL) {
+		(void) fprintf(stderr,
+		    "%s: no space for network address from: -i ", Pn);
+		safestrprt(s, stderr, 1);
+		return(1);
+	    }
+	/*
+	 * Construct and link the address specification.
+	 */
+	    *np = nc;
+	    np->sport = sp;
+	    np->eport = ep;
+	    np->f = 0;
+	    np->next = Nwad;
+	    Nwad = np;
+	    na++;
+	/*
+	 * If the network address came from gethostbyname(), advance to
+	 * the next address; otherwise quit.
+	 */
+	    if (!he)
+		break;
+	    if (!(ap = (unsigned char *)he->h_addr_list[ac++]))
+		break;
+
+#if	defined(HASIPv6)
+	    {
+		int i;
+
+		for (i = 0;
+		     (i < (he->h_length - 1)) && (i < (MAX_AF_ADDR - 1));
+		     i++)
+		{
+		    nc.a[i] = *ap++;
+		}
+		nc.a[i] = *ap;
+	    }
+#else	/* !defined(HASIPv6) */
+	    nc.a[0] = *ap++;
+	    nc.a[1] = *ap++;
+	    nc.a[2] = *ap++;
+	    nc.a[3] = *ap;
+#endif	/* defined(HASIPv6) */
+
+	}
+	return(0);
+}
+
+
+#if	defined(HASTCPUDPSTATE)
+/*
+ * enter_state_spec() -- enter TCP and UDP state specifications
+ */
+
+int
+enter_state_spec(ss)
+	char *ss;			/* state specification string */
+{
+	char *cp, *ne, *ns, *pr;
+	int err, d, f, i, tx, x;
+	size_t len;
+	static char *ssc = (char *)NULL;
+	char *ty;
+/*
+ * Check the protocol specification.
+ */
+	if (!strncasecmp(ss, "tcp:", 4)) {
+	    pr = "TCP";
+	    tx = 0;
+	}
+
+#if	!defined(USE_LIB_PRINT_TCPTPI)
+	else if (!strncasecmp(ss, "UDP:", 4)) {
+	    pr = "UDP";
+	    tx = 1;
+	}
+
+#endif	/* !defined(USE_LIB_PRINT_TCPTPI) */
+
+	else {
+	    (void) fprintf(stderr, "%s: unknown -s protocol: \"%s\"\n",
+		Pn, ss);
+	    return(1);
+	}
+	cp = ss + 4;
+	if (!*cp) {
+	    (void) fprintf(stderr, "%s: no %s state names in: %s\n",
+		Pn, pr, ss);
+	    return(1);
+	}
+	(void) build_IPstates();
+	if (!(tx ? UdpSt : TcpSt)) {
+	    (void) fprintf(stderr, "%s: no %s state names available: %s\n",
+		Pn, pr, ss);
+	    return(1);
+	}
+/*
+ * Allocate the inclusion and exclusion tables for the protocol.
+ */
+	if (tx) {
+	    if (UdpNstates) {
+		if (!UdpStI) {
+		    if (!(UdpStI = (unsigned char *)calloc((MALLOC_S)UdpNstates,
+				   sizeof(unsigned char))))
+		    {
+			ty = "UDP state inclusion";
+
+no_IorX_space:
+
+			(void) fprintf(stderr, "%s: no %s table space\n",
+			    Pn, ty);
+			Exit(1);
+		    }
+		}
+		if (!UdpStX) {
+		    if (!(UdpStX = (unsigned char *)calloc((MALLOC_S)UdpNstates,
+				   sizeof(unsigned char))))
+		    {
+			ty = "UDP state exclusion";
+			goto no_IorX_space;
+		    }
+		}
+	    }
+	} else {
+	    if (TcpNstates) {
+		if (!TcpStI) {
+		    if (!(TcpStI = (unsigned char *)calloc((MALLOC_S)TcpNstates,
+				   sizeof(unsigned char))))
+		    {
+			ty = "TCP state inclusion";
+			goto no_IorX_space;
+		    }
+		}
+		if (!TcpStX) {
+		    if (!(TcpStX = (unsigned char *)calloc((MALLOC_S)TcpNstates,
+				   sizeof(unsigned char))))
+		    {
+			ty = "TCP state exclusion";
+			goto no_IorX_space;
+		    }
+		}
+	    }
+	}
+/*
+ * Convert the state names in the rest of the string to state indexes and
+ * record them in the appropriate inclusion or exclusion table.
+ */
+	if (ssc)
+	    (void) free((MALLOC_P *)ssc);
+	if (!(ssc = mkstrcpy(cp, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr,
+		"%s: no temporary state argument space for: %s\n", Pn, ss);
+	    Exit(1);
+	}
+	cp = ssc;
+	err = 0;
+	while (*cp) {
+	
+	/*
+	 * Determine inclusion or exclusion for this state name.
+	 */
+	    if (*cp == '^') {
+		x = 1;
+		cp++;
+	    } else
+		x = 0;
+	/*
+	 * Find the end of the state name.  Make sure it is non-null in length
+	 * and terminated with '\0'.
+	 */
+	    ns = cp;
+	    while (*cp && (*cp != ',')) {
+		cp++;
+	    }
+	    ne = cp;
+	    if (*cp) {
+		*cp = '\0';
+		cp++;
+	    }
+	    if (!(len = (size_t)(ne - ns))) {
+		(void) fprintf(stderr, "%s: NULL %s state name in: %s\n",
+		    Pn, pr, ss);
+		err = 1;
+		continue;
+	    }
+	/*
+	 * Find the state name in the appropriate table.
+	 */
+	    f = 0;
+	    if (tx) {
+		if (UdpSt) {
+		    for (i = 0; i < UdpNstates; i++) {
+			if (!strcasecmp(ns, UdpSt[i])) {
+			    f = 1;
+			    break;
+			}
+		    }
+		}
+	    } else {
+		if (TcpSt) {
+		    for (i = 0; i < TcpNstates; i++) {
+			if (!strcasecmp(ns, TcpSt[i])) {
+			    f = 1;
+			    break;
+			}
+		    }
+		}
+	    }
+	    if (!f) {
+		(void) fprintf(stderr, "%s: unknown %s state name: %s\n",
+		    Pn, pr, ns);
+		err = 1;
+		continue;
+	    }
+	/*
+	 * Set the inclusion or exclusion status in the appropriate table.
+	 */
+	    d = 0;
+	    if (x) {
+		if (tx) {
+		    if (!UdpStX[i]) {
+			UdpStX[i] = 1;
+			UdpStXn++;
+		    } else
+			d = 1;
+		} else {
+		    if (!TcpStX[i]) {
+			TcpStX[i] = 1;
+			TcpStXn++;
+		    } else
+			d = 1;
+		}
+	    } else {
+		if (tx) {
+		    if (!UdpStI[i]) {
+			UdpStI[i] = 1;
+			UdpStIn++;
+		    } else
+			d = 1;
+		} else {
+		    if (!TcpStI[i]) {
+			TcpStI[i] = 1;
+			TcpStIn++;
+		    } else
+			d = 1;
+		}
+	    }
+	    if (d) {
+
+	    /*
+	     * Report a duplicate.
+	     */
+		(void) fprintf(stderr, "%s: duplicate %s %sclusion: %s\n",
+		    Pn, pr,
+		    x ? "ex" : "in",
+		    ns);
+		err = 1;
+	    }
+	}
+/*
+ * Release any temporary space and return.
+ */
+	if (ssc) {
+	    (void) free((MALLOC_P *)ssc);
+	    ssc = (char *)NULL;
+	}
+	return(err);
+}
+#endif	/* defined(HASTCPUDPSTATE) */
+
+
+/*
+ * enter_str_lst() - enter a string on a list
+ */
+
+int
+enter_str_lst(opt, s, lp, incl, excl)
+	char *opt;			/* option name */
+	char *s;			/* string to enter */
+	struct str_lst **lp;		/* string's list */
+	int *incl;			/* included count */
+	int *excl;			/* excluded count */
+{
+	char *cp;
+	short i, x;
+	MALLOC_S len;
+	struct str_lst *lpt;
+
+	if (!s || *s == '-' || *s == '+') {
+	    (void) fprintf(stderr, "%s: missing %s option value\n",
+		Pn, opt);
+	    return(1);
+	}
+	if (*s == '^') {
+	    i = 0;
+	    x = 1;
+	    s++;
+	} else {
+	    i = 1;
+	    x = 0;
+	}
+	if (!(cp = mkstrcpy(s, &len))) {
+	    (void) fprintf(stderr, "%s: no string copy space: ", Pn);
+	    safestrprt(s, stderr, 1);
+	    return(1);
+	}
+	if ((lpt = (struct str_lst *)malloc(sizeof(struct str_lst))) == NULL) {
+	    (void) fprintf(stderr, "%s: no list space: ", Pn);
+	    safestrprt(s, stderr, 1);
+	    (void) free((FREE_P *)cp);
+	    return(1);
+	}
+	lpt->f = 0;
+	lpt->str = cp;
+	lpt->len = (int)len;
+	lpt->x = x;
+	if (i)
+	    *incl += 1;
+	if (x)
+	    *excl += 1;
+	lpt->next = *lp;
+	*lp = lpt;
+	return(0);
+}
+
+
+/*
+ * enter_uid() - enter User Identifier for searching
+ */
+
+int
+enter_uid(us)
+	char *us;			/* User IDentifier string pointer */
+{
+	int err, i, j, lnml, nn;
+	unsigned char excl;
+	MALLOC_S len;
+	char lnm[LOGINML+1], *lp;
+	struct passwd *pw;
+	char *s, *st;
+	uid_t uid;
+
+	if (!us) {
+	    (void) fprintf(stderr, "%s: no UIDs specified\n", Pn);
+	    return(1);
+	}
+	for (err = 0, s = us; *s;) {
+
+	/*
+	 * Assemble next User IDentifier.
+	 */
+	    for (excl = i = j = lnml = nn = uid = 0, st = s;
+		 *s && *s != ',';
+		 i++, s++)
+	    {
+		if (lnml >= LOGINML) {
+		    while (*s && *s != ',') {
+			s++;
+			lnml++;
+		    }
+		    (void) fprintf(stderr,
+			"%s: -u login name > %d characters: ", Pn,
+			    (int)LOGINML);
+		    safestrprtn(st, lnml, stderr, 1);
+		    err = j = 1;
+		    break;
+		}
+		if (i == 0 && *s == '^') {
+		    excl = 1;
+		    continue;
+		}
+		lnm[lnml++] = *s;
+		if (nn)
+		    continue;
+
+#if	defined(__STDC__)
+		if (isdigit((unsigned char)*s))
+#else	/* !defined(__STDC__) */
+		if (isascii(*s) && isdigit((unsigned char)*s))
+#endif	/* defined(__STDC__) */
+
+		    uid = (uid * 10) + *s - '0';
+		else
+		    nn++;
+	    }
+	    if (*s)
+		s++;
+	    if (j)
+		continue;
+	    if (nn) {
+	       lnm[lnml++] = '\0';
+		if ((pw = getpwnam(lnm)) == NULL) {
+		    (void) fprintf(stderr, "%s: can't get UID for ", Pn);
+		    safestrprt(lnm, stderr, 1);
+		    err = 1;
+		    continue;
+		} else
+		    uid = pw->pw_uid;
+	    }
+
+#if	defined(HASSECURITY) && !defined(HASNOSOCKSECURITY)
+	/*
+	 * If the security mode is enabled, only the root user may list files
+	 * belonging to user IDs other than the real user ID of this lsof
+	 * process.  If HASNOSOCKSECURITY is also defined, then anyone may
+	 * list anyone else's socket files.
+	 */
+	    if (Myuid && uid != Myuid) {
+		(void) fprintf(stderr,
+		    "%s: ID %d request rejected because of security mode.\n",
+		    Pn, uid);
+		err = 1;
+		continue;
+	    }
+#endif	/* defined(HASSECURITY)  && !defined(HASNOSOCKSECURITY) */
+
+	/*
+	 * Avoid entering duplicates.
+	 */
+	    for (i = j = 0; i < Nuid; i++) {
+		if (uid != Suid[i].uid)
+		    continue;
+		if (Suid[i].excl == excl) {
+		    j = 1;
+		    continue;
+		}
+		(void) fprintf(stderr,
+		    "%s: UID %d has been included and excluded.\n",
+			Pn, (int)uid);
+		err = j = 1;
+		break;
+	    }
+	    if (j)
+		continue;
+	/*
+	 * Allocate space for User IDentifier.
+	 */
+	    if (Nuid >= Mxuid) {
+		Mxuid += UIDINCR;
+		len = (MALLOC_S)(Mxuid * sizeof(struct seluid));
+		if (!Suid)
+		    Suid = (struct seluid *)malloc(len);
+		else
+		    Suid = (struct seluid *)realloc((MALLOC_P *)Suid, len);
+		if (!Suid) {
+		    (void) fprintf(stderr, "%s: no space for UIDs", Pn);
+		    Exit(1);
+		}
+	    }
+	    if (nn) {
+		if (!(lp = mkstrcpy(lnm, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr, "%s: no space for login: ", Pn);
+		    safestrprt(lnm, stderr, 1);
+		    Exit(1);
+		}
+		Suid[Nuid].lnm = lp;
+	    } else
+		Suid[Nuid].lnm = (char *)NULL;
+	    Suid[Nuid].uid = uid;
+	    Suid[Nuid++].excl = excl;
+	    if (excl)
+		Nuidexcl++;
+	    else
+		Nuidincl++;
+	}
+	return(err);
+}
+
+
+/*
+ * isIPv4addr() - is host name an IPv4 address
+ */
+
+static char *
+isIPv4addr(hn, a, al)
+	char *hn;			/* host name */
+	unsigned char *a;		/* address receptor */
+	int al;				/* address receptor length */
+{
+	int dc = 0;			/* dot count */
+	int i;				/* temorary index */
+	int ov[MIN_AF_ADDR];		/* octet values */
+	int ovx = 0;			/* ov[] index */
+/*
+ * The host name must begin with a number and the return octet value
+ * arguments must be acceptable.
+ */
+	if ((*hn < '0') || (*hn > '9'))
+	    return((char *)NULL);
+	if (!a || (al < MIN_AF_ADDR))
+	    return((char *)NULL);
+/*
+ * Start the first octet assembly, then parse tge remainder of the host
+ * name for four octets, separated by dots.
+ */
+	ov[0] = (int)(*hn++ - '0');
+	while (*hn && (*hn != ':')) {
+	    if (*hn == '.') {
+
+	    /*
+	     * Count a dot.  Make sure a preceding octet value has been
+	     * assembled.  Don't assemble more than MIN_AF_ADDR octets.
+	     */
+		dc++;
+		if ((ov[ovx] < 0) || (ov[ovx] > 255))
+		    return((char *)NULL);
+		if (++ovx > (MIN_AF_ADDR - 1))
+		    return((char *)NULL);
+		ov[ovx] = -1;
+	    } else if ((*hn >= '0') && (*hn <= '9')) {
+
+	    /*
+	     * Assemble an octet.
+	     */
+		if (ov[ovx] < 0)
+		    ov[ovx] = (int)(*hn - '0');
+		else
+		    ov[ovx] = (ov[ovx] * 10) + (int)(*hn - '0');
+	    } else {
+
+	    /*
+	     * A non-address character has been detected.
+	     */
+		return((char *)NULL);
+	    }
+	    hn++;
+	}
+/*
+ * Make sure there were three dots and four non-null octets.
+ */
+	if ((dc != 3)
+	||  (ovx != (MIN_AF_ADDR - 1))
+	||  (ov[ovx] < 0) || (ov[ovx] > 255))
+	    return((char *)NULL);
+/*
+ * Copy the octets as unsigned characters and return the ending host name
+ * character position.
+ */
+	for (i = 0; i < MIN_AF_ADDR; i++) {
+	     a[i] = (unsigned char)ov[i];
+	}
+	return(hn);
+}
+
+
+/*
+ * lkup_hostnm() - look up host name
+ */
+
+static struct hostent *
+lkup_hostnm(hn, n)
+	char *hn;			/* host name */
+	struct nwad *n;			/* network address destination */
+{
+	unsigned char *ap;
+	struct hostent *he;
+	int ln;
+/*
+ * Get hostname structure pointer.  Return NULL if there is none.
+ */
+
+#if	defined(HASIPv6)
+	he = gethostbyname2(hn, n->af);
+#else	/* !defined(HASIPv6) */
+	he = gethostbyname(hn);
+#endif	/* defined(HASIPv6) */
+
+	if (!he)
+	    return(he);
+/*
+ * Copy first hostname structure address to destination structure.
+ */
+
+#if	defined(HASIPv6)
+	if (n->af != he->h_addrtype)
+	    return((struct hostent *)NULL);
+	if (n->af == AF_INET6) {
+
+	/*
+	 * Copy an AF_INET6 address.
+	 */
+	    if (he->h_length > MAX_AF_ADDR)
+		return((struct hostent *)NULL);
+	    (void) memcpy((void *)&n->a[0], (void *)he->h_addr, he->h_length);
+	    if ((ln = MAX_AF_ADDR - he->h_length) > 0)
+		zeromem((char *)&n->a[he->h_length], ln);
+	    return(he);
+	}
+#endif	/* defined(HASIPv6) */
+
+/*
+ * Copy an AF_INET address.
+ */
+	if (he->h_length != 4)
+	    return((struct hostent *)NULL);
+	ap = (unsigned char *)he->h_addr;
+	n->a[0] = *ap++;
+	n->a[1] = *ap++;
+	n->a[2] = *ap++;
+	n->a[3] = *ap;
+	if ((ln = MAX_AF_ADDR - 4) > 0)
+	    zeromem((char *)&n->a[4], ln);
+	return(he);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/Makefile b/lsof_4.85/lsof_4.85_src/dialects/aix/Makefile
new file mode 100644
index 0000000..830a25f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/Makefile
@@ -0,0 +1,169 @@
+
+# AIX Makefile
+#
+# $Id: Makefile,v 1.14 2008/04/15 13:28:12 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    ddev.c dfile.c dmnt.c dnode.c dnode1.c dnode2.c dproc.c dsock.c \
+	dstore.c arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.o
+
+OBJ=	ddev.o dfile.o dmnt.o dnode.o dnode1.o dnode2.o dproc.o dsock.o \
+	dstore.o arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof Needs to be able to'
+	@echo 'read /dev/kmem and /dev/mem'.  Installing it segid to the group'
+	@echo 'that can read those devices is one way to allow it to read them.'
+	@echo 'normally that group is the system group and your install rule'
+	@echo 'might look something like this:'
+	@echo ''
+	@echo '    install -f $${BIN} -S -M 2755 -G $${GRP} $${PROG}'
+	@echo '    install -f $${DOC} -M 444 $${MAN}'
+	@echo ''
+	@echo 'You will have to complete the skeletons for the BIN, DOC, and'
+	@echo 'GRP strings given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo '    GRP= system'
+	@echo ''
+	@echo 'You might also consider giving lsof permission to read /dev/kmem'
+	@echo 'and /dev/mem via ACLs.  First, establish a new group to which'
+	@echo 'you will setgid lsof -- e.g., group kmem.  Next, change the ACLs'
+	@echo 'for /dev/kmem and /dev/mem to permit group kmem members to read'
+	@echo 'them.  Finally, install lsof setgid the kmem group with:
+	@echo ''
+	@echo '    GRP= kmem'
+
+${LIB}:	FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_CINFO	"${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+ddev.o:		${HDR} ddev.c
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dproc.o:	${HDR} dproc.c
+
+dnode2.o:	${HDR} dnode2.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/aix/Mksrc
new file mode 100755
index 0000000..397b61e
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make AIX source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.3 2003/03/21 17:39:46 abe Exp $
+
+
+D=dialects/aix
+L="dlsof.h ddev.c dfile.c dmnt.c dnode.c dnode1.c dnode2.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/README b/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/README
new file mode 100644
index 0000000..28adc0c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/README
@@ -0,0 +1,7 @@
+This directory exists to supply missing /usr/include/j2 header
+files for AIX 5 and above, or to supply alternatives that can be
+#include'd when distributed AIX 5 and above header files can't be
+used -- e.g., they #include missing header files.
+
+Vic Abell
+March 2, 2003
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/j2/j2_lock.h b/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/j2/j2_lock.h
new file mode 100644
index 0000000..9bfc511
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/j2/j2_lock.h
@@ -0,0 +1,19 @@
+/*
+ * j2_lock.h -- lsof private copy
+ *
+ * Needed for:
+ *
+ * 	AIX 5L, because it's missing there;
+ *	AIX 5.2, because it includes <proc/proc_public.h> and that header
+ *	    file is missing from AIX 5.2.
+ *
+ * V. Abell <abe@purdue.edu>
+ * Purdue University
+ */
+
+#if	!defined(LSOF_J2_LOCK_H)
+#define	LSOF_J2_LOCK_H
+typedef	long		event_t;
+#define	MUTEXLOCK_T	Simple_lock
+#define	RDWRLOCK_T	Complex_lock
+#endif	/* !defined(LSOF_J2_LOCK_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/j2/private_j2_snapshot.h b/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/j2/private_j2_snapshot.h
new file mode 100644
index 0000000..0760c0a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/aix5/j2/private_j2_snapshot.h
@@ -0,0 +1,17 @@
+/*
+ * j2_snapshot.h -- lsof private copy
+ *
+ * Needed for:
+ *
+ *	AIX 5.2, because this header file is missing and j2_inode.h #includes
+ *	    it.  The dummy snapshotObject structure definition is needed by
+ *          some releases of AIX 5.2 and above, but the structure's size does
+ *	    not affect lsof's use of the JFS2 inode structure.
+ */
+
+#if	!defined(_H_J2_SNAPSHOT)
+#define	_H_J2_SNAPSHOT
+struct snapshotObject {
+	uint64 d1;
+};
+#endif	/* !defined(_H_J2_SNAPSHOT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/ddev.c b/lsof_4.85/lsof_4.85_src/dialects/aix/ddev.c
new file mode 100644
index 0000000..4150aa6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/ddev.c
@@ -0,0 +1,728 @@
+/*
+ * ddev.c - AIX device support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ddev.c,v 1.14 2005/08/08 19:46:38 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	LIKE_BLK_SPEC	"like block special"
+#define	LIKE_CHR_SPEC	"like character special"
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int rmdupdev,(struct l_dev ***dp, int n, char *nm));
+
+
+#if	defined(HASDCACHE) && AIXV>=4140
+
+
+/*
+ * clr_sect() - clear cached clone and pseudo sections
+ */
+
+void
+clr_sect()
+{
+	struct clone *c, *c1;
+
+	if (Clone) {
+	    for (c = Clone; c; c = c1) {
+		c1 = c->next;
+		if (c->cd.name)
+		    (void) free((FREE_P *)c->cd.name);
+		(void) free((FREE_P *)c);
+	    }
+	    Clone = (struct clone *)NULL;
+	}
+}
+#endif	/* defined(HASDCACHE) && AIXV>=4140 */
+
+
+/*
+ * getchan() - get channel from file path name
+ */
+
+int
+getchan(p)
+	char *p;			/* file path name */
+{
+	int ch;
+	char *s;
+
+	if (!(s = strrchr(p, '/'))) 
+		return(-1);
+	if (*(++s) == '\0')
+		return(-1);
+	for (ch = 0; *s; s++) {
+
+#if	defined(__STDC__)
+		if ( ! isdigit(*s))
+#else
+		if ( ! isascii(*s) || ! isdigit(*s))
+#endif	/* __STDC__ */
+
+			return(-1);
+		ch = (ch * 10) + *s - '0';
+	}
+	return(ch);
+}
+
+
+/*
+ * printdevname() - print device name
+ */
+
+int
+printdevname(dev, rdev, f, nty)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+	int f;				/* 1 = follow with '\n' */
+	int nty;			/* node type: N_BLK or N_CHR */
+{
+	struct l_dev *dp;
+/*
+ * Search device table for a full match.
+ */
+	if ((dp = lkupdev(dev, rdev, 1, 1))) {
+	    if (Lf->ch < 0)
+		safestrprt(dp->name, stdout, f);
+	    else {
+		safestrprt(dp->name, stdout, 0);
+		(void) printf("/%d%s", Lf->ch, f ? "\n" : "");
+	    }
+	    return(1);
+	}
+/*
+ * Search device table for a match without inode number and dev.
+ */
+	if ((dp = lkupdev(&DevDev, rdev, 0, 1))) {
+
+	/*
+	 * A raw device match was found.  Record it as a name column addition.
+	 */
+	    char *cp, *ttl;
+	    int len;
+
+	    ttl = (nty == N_BLK) ? LIKE_BLK_SPEC : LIKE_CHR_SPEC;
+	    len = (int)(1 + strlen(ttl) + 1 + strlen(dp->name) + 1);
+	    if (!(cp = (char *)malloc((MALLOC_S)(len + 1)))) {
+		(void) fprintf(stderr, "%s: no nma space for: (%s %s)\n",
+		    Pn, ttl, dp->name);
+		Exit(1);
+	    }
+	    (void) snpf(cp, len + 1, "(%s %s)", ttl, dp->name);
+	    (void) add_nma(cp, len);
+	    (void) free((MALLOC_P *)cp);
+	    return(0);
+	}
+	return(0);
+}
+
+
+/*
+ * readdev() - read device names, modes and types
+ */
+
+void
+readdev(skip)
+	int skip;			/* skip device cache read if 1 */
+{
+
+#if	defined(HASDCACHE)
+	int dcrd;
+#endif	/* defined(HASDCACHE) */
+
+	DIR *dfp;
+	struct dirent *dp;
+	char *fp = (char *)NULL;
+	int i = 0;
+
+#if	defined(HASBLKDEV)
+	int j = 0;
+#endif	/* defined(HASBLKDEV) */
+
+	char *path = (char *)NULL;
+	MALLOC_S pl;
+	struct stat sb;
+
+#if	AIXV>=4140
+	struct clone *c;
+	dev_t cd;
+#endif	/* AIXV >=4140 */
+
+	if (Sdev)
+	    return;
+
+#if	defined(HASDCACHE)
+/*
+ * Read device cache, as directed.
+ */
+	if (!skip) {
+	    if (DCstate == 2 || DCstate == 3) {
+		if ((dcrd = read_dcache()) == 0)
+		    return;
+	    }
+	} else
+	    dcrd = 1;
+#endif	/* defined(HASDCACHE) */
+
+#if	AIXV>=4140
+/*
+ * Establish the clone major device for AIX 4.1.4 and above.
+ */
+	if (stat("/dev/clone", &sb) == 0) {
+	    cd = sb.st_rdev;
+	    CloneMaj = GET_MAJ_DEV(cd);
+	}
+#endif	/* AIXV >=4140 */
+
+	Dstk = (char **)NULL;
+	Dstkn = Dstkx = 0;
+	(void) stkdir("/dev");
+/*
+ * Unstack the next /dev or /dev/<subdirectory> directory.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dfp = opendir(Dstk[Dstkx]))) {
+
+#if	defined(WARNDEVACCESS)
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		    safestrprt(Dstk[Dstkx], stderr, 1);
+		}
+#endif	/* defined(WARNDEVACCESS) */
+
+		(void) free((FREE_P *)Dstk[Dstkx]);
+		Dstk[Dstkx] = (char *)NULL;
+		continue;
+	    }
+	    if (path) {
+		(void) free((FREE_P *)path);
+		path = (char *)NULL;
+	    }
+	    if (!(path = mkstrcat(Dstk[Dstkx], -1, "/", 1, (char *)NULL,
+				  -1, &pl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(Dstk[Dstkx], stderr, 1);
+		Exit(1);
+	    }
+	    (void) free((FREE_P *)Dstk[Dstkx]);
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Scan the directory.
+	 */
+	    for (dp = readdir(dfp); dp; dp = readdir(dfp)) {
+		if (!dp->d_ino || (dp->d_name[0] == '.'))
+		    continue;
+	    /*
+	     * Form the full path name and get its status.
+	     */
+		if (fp) {
+		    (void) free((FREE_P *)fp);
+		    fp = (char *)NULL;
+		}
+		if (!(fp = mkstrcat(path, (int)pl, dp->d_name, dp->d_namlen,
+			   (char *)NULL, -1, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr, "%s: no space for: ", Pn);
+		    safestrprt(path, stderr, 0);
+		    safestrprt(dp->d_name, stderr, 1);
+		    Exit(1);
+		}
+
+#if	defined(USE_STAT)
+		if (stat(fp, &sb) != 0)
+#else	/* !defined(USE_STAT) */
+		if (lstat(fp, &sb) != 0)
+#endif	/* defined(USE_STAT) */
+
+		{
+		    if (errno == ENOENT)	/* symbolic link to nowhere? */
+			continue;
+
+#if	defined(WARNDEVACCESS)
+		    if (!Fwarn) {
+			int errno_save = errno;
+
+			(void) fprintf(stderr, "%s: can't stat: ", Pn);
+			safestrprt(fp, stderr, 0);
+			(void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		    }
+#endif	/* defined(WARNDEVACCESS) */
+
+		    continue;
+		}
+	    /*
+	     * If it's a subdirectory, stack its name for later processing.
+	     */
+		if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+		    (void) stkdir(fp);
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFCHR) {
+
+		/*
+		 * Save character device information.
+		 */
+		    if (i >= Ndev) {
+			Ndev += DEVINCR;
+			if (!Devtp)
+			    Devtp = (struct l_dev *)malloc(
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			else
+			    Devtp = (struct l_dev *)realloc( (MALLOC_P *)Devtp,
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			if (!Devtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for character device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    Devtp[i].rdev = sb.st_rdev;
+		    Devtp[i].inode = (INODETYPE)sb.st_ino;
+		    if (!(Devtp[i].name = mkstrcpy(fp, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr, "%s: no space for: ", Pn);
+			safestrprt(fp, stderr, 1);
+			Exit(1);
+		    }
+		    Devtp[i].v = 0;
+		    i++;
+
+#if	AIXV>=4140
+		/*
+		 * Save information on AIX 4.1.4 and above clone devices.
+		 */
+		    if (CloneMaj >= 0 && CloneMaj == GET_MAJ_DEV(sb.st_rdev)) {
+			if (!(c = (struct clone *)malloc(
+				  (MALLOC_S)sizeof(struct clone))))
+			{
+			    (void) fprintf(stderr,
+				"%s: no space for clone device: ", Pn);
+			    safestrprt(fp, stderr, 1);
+			    exit(1);
+			}
+			if (!(c->cd.name = mkstrcpy(fp, (MALLOC_S)NULL))) {
+			    (void) fprintf(stderr,
+				"%s: no space for clone name: ", Pn);
+			    safestrprt(fp, stderr, 1);
+			    exit(1);
+			}
+			c->cd.inode = (INODETYPE)sb.st_ino;
+			c->cd.rdev = sb.st_rdev;
+			c->cd.v = 0;
+			c->next = Clone;
+			Clone = c;
+			if (ClonePtc < 0 && strcmp(path, "/dev/ptc") == 0)
+			    ClonePtc = GET_MIN_DEV(sb.st_rdev);
+		    }
+#endif	/* AIXV >=4140 */
+
+		}
+
+#if	defined(HASBLKDEV)
+		if ((sb.st_mode & S_IFMT) == S_IFBLK) {
+
+		/*
+		 * Save block device information in BDevtp[].
+		 */
+		    if (j >= BNdev) {
+			BNdev += DEVINCR;
+			if (!BDevtp)
+			    BDevtp = (struct l_dev *)malloc(
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			else
+			    BDevtp = (struct l_dev *)realloc(
+				     (MALLOC_P *)BDevtp,
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			if (!BDevtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for block device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    BDevtp[j].rdev = sb.st_rdev;
+		    BDevtp[j].inode = (INODETYPE)sb.st_ino;
+		    BDevtp[j].name = fp;
+		    fp = (char *)NULL;
+		    BDevtp[j].v = 0;
+		    j++;
+		}
+#endif	/* defined(HASBLKDEV) */
+
+	    }
+	    (void) closedir(dfp);
+	}
+/*
+ * Free any allocated space.
+ */
+	if (Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	    Dstkn = Dstkx = 0;
+	}
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+/*
+ * Reduce the BDevtp[] (optional) and Devtp[] tables to their minimum
+ * sizes; allocate and build sort pointer lists; and sort the tables by
+ * device number.
+ */
+
+#if	defined(HASBLKDEV)
+	if (BNdev) {
+	    if (BNdev > j) {
+	    BNdev = j;
+	    BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+		     (MALLOC_S)(sizeof(struct l_dev) * BNdev));
+	    }
+	    if (!(BSdev = (struct l_dev **)malloc(
+			  (MALLOC_S)(sizeof(struct l_dev *) * BNdev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for block device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (j = 0; j < BNdev; j++) {
+		BSdev[j] = &BDevtp[j];
+	    }
+	    (void) qsort((QSORT_P *)BSdev, (size_t)BNdev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    BNdev = rmdupdev(&BSdev, BNdev, "block");
+	} else {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: no block devices found\n", Pn);
+	}
+#endif	/* defined(HASBLKDEV) */
+
+	if (Ndev) {
+	    if (Ndev > i) {
+		Ndev = i;
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    }
+	    if (!(Sdev = (struct l_dev **)malloc(
+			 (MALLOC_S)(sizeof(struct l_dev *) * Ndev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for character device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (i = 0; i < Ndev; i++) {
+		Sdev[i] = &Devtp[i];
+	    }
+	    (void) qsort((QSORT_P *)Sdev, (size_t)Ndev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    Ndev = rmdupdev(&Sdev, Ndev, "char");
+	} else {
+	    (void) fprintf(stderr, "%s: no character devices found\n", Pn);
+	    Exit(1);
+	}
+
+#if	defined(HASDCACHE)
+/*
+ * Write device cache file, as required.
+ */
+	if (DCstate == 1 || (DCstate == 3 && dcrd))
+	    write_dcache();
+#endif	/* defined(HASDCACHE) */
+
+}
+
+
+#if	defined(HASDCACHE)
+/*
+ * rereaddev() - reread device names, modes and types
+ */
+
+void
+rereaddev()
+{
+	(void) clr_devtab();
+
+# if	defined(DCACHE_CLR)
+	(void) DCACHE_CLR();
+# endif	/* defined(DCACHE_CLR) */
+
+	readdev(1);
+	DCunsafe = 0;
+}
+#endif	/* defined(HASDCACHE) */
+
+
+/*
+ * rmdupdev() - remove duplicate (major/minor/inode) devices
+ */
+
+static int
+rmdupdev(dp, n, nm)
+	struct l_dev ***dp;	/* device table pointers address */
+	int n;			/* number of pointers */
+	char *nm;		/* device table name for error message */
+{
+
+#if	AIXV>=4140
+	struct clone *c, *cp;
+#endif	/* AIXV>=4140 */
+
+	int i, j, k;
+	struct l_dev **p;
+
+	for (i = j = 0, p = *dp; i < n ;) {
+	    for (k = i + 1; k < n; k++) {
+		if (p[i]->rdev != p[k]->rdev || p[i]->inode != p[k]->inode)
+		    break;
+
+#if	AIXV>=4140
+	    /*
+	     * See if we're deleting a duplicate clone device.  If so,
+	     * delete its clone table entry.
+	     */
+		for (c = Clone, cp = (struct clone *)NULL;
+		     c;
+		     cp = c, c = c->next)
+		{
+		    if (c->cd.rdev != p[k]->rdev
+		    ||  c->cd.inode != p[k]->inode
+		    ||  strcmp(c->cd.name, p[k]->name))
+			continue;
+		    if (!cp)
+			Clone = c->next;
+		    else
+			cp->next = c->next;
+		    if (c->cd.name)
+			(void) free((FREE_P *)c->cd.name);
+		    (void) free((FREE_P *)c);
+		    break;
+		}
+#endif	/* AIXV>=4140 */
+
+	    }
+	    if (i != j)
+		p[j] = p[i];
+	    j++;
+	    i = k;
+	}
+	if (n == j)
+	    return(n);
+	if (!(*dp = (struct l_dev **)realloc((MALLOC_P *)*dp,
+	    (MALLOC_S)(j * sizeof(struct l_dev *)))))
+	{
+	    (void) fprintf(stderr, "%s: can't realloc %s device pointers\n",
+		Pn, nm);
+	    Exit(1);
+	}
+	return(j);
+}
+
+
+#if	defined(HASDCACHE) && AIXV>=4140
+/*
+ * rw_clone_sect() - read/write the device cache file clone section
+ */
+
+int
+rw_clone_sect(m)
+	int m;				/* mode: 1 = read; 2 = write */
+{
+	char buf[MAXPATHLEN*2], *cp;
+	struct clone *c;
+	int i, len, n;
+
+	if (m == 1) {
+
+	/*
+	 * Read the clone section header and validate it.
+	 */
+	    if (!fgets(buf, sizeof(buf), DCfs)) {
+
+bad_clone_sect:
+
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: bad clone section header in %s: ",
+			Pn, DCpath[DCpathX]);
+		    safestrprt(buf, stderr, 1);
+		}
+		return(1);
+	    }
+	    (void) crc(buf, strlen(buf), &DCcksum);
+	    len = strlen("clone section: ");
+	    if (strncmp(buf, "clone section: ", len) != 0)
+		goto bad_clone_sect;
+	    if ((n = atoi(&buf[len])) < 0)
+		goto bad_clone_sect;
+	/*
+	 * Read the clone section lines and create the Clone list.
+	 */
+	    for (i = 0; i < n; i++) {
+		if (!fgets(buf, sizeof(buf), DCfs)) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad clone line in %s: ", Pn, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		(void) crc(buf, strlen(buf), &DCcksum);
+	    /*
+	     * Allocate a clone structure.
+	     */
+		if (!(c = (struct clone *)calloc(1, sizeof(struct clone)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for cached clone: ", Pn);
+		    safestrprt(buf, stderr, 1);
+		    Exit(1);
+		}
+	    /*
+	     * Enter the clone device number.
+	     */
+		if (!(cp = x2dev(buf, &c->cd.rdev)) || *cp++ != ' ') {
+
+bad_cached_clone:
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad cached clone device: ", Pn);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		CloneMaj = GET_MAJ_DEV(c->cd.rdev);
+	    /*
+	     * Enter the clone inode number.
+	     */
+		for (c->cd.inode = (INODETYPE)0; *cp != ' '; cp++) {
+		    if (*cp < '0' || *cp > '9')
+			goto bad_cached_clone;
+		    c->cd.inode = (INODETYPE)((c->cd.inode * 10) + (*cp - '0'));
+		}
+	    /*
+	     * Enter the clone path name.
+	     */
+		if ((len = strlen(++cp)) < 2 || *(cp + len - 1) != '\n') {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad cached clone path: ", Pn);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		*(cp + len - 1) = '\0';
+		if (!(c->cd.name = mkstrcpy(cp, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr,
+			"%s: no space for cached clone path: ", Pn);
+		    safestrprt(buf, stderr, 1);
+		    Exit(1);
+		}
+		c->cd.v = 0;
+		c->next = Clone;
+		Clone = c;
+		if (ClonePtc < 0 && strcmp(c->cd.name, "/dev/ptc") == 0)
+		    ClonePtc = GET_MIN_DEV(c->cd.rdev);
+	    }
+	    return(0);
+	} else if (m == 2) {
+
+	/*
+	 * Write the clone section header.
+	 */
+	    for (c = Clone, n = 0; c; c = c->next, n++)
+		;
+	    (void) snpf(buf, sizeof(buf), "clone section: %d\n", n);
+	    if (wr2DCfd(buf, &DCcksum))
+		return(1);
+	/*
+	 * Write the clone section lines.
+	 */
+	    for (c = Clone; c; c = c->next) {
+		(void) snpf(buf, sizeof(buf), "%x %ld %s\n",
+		    c->cd.rdev, (long)c->cd.inode, c->cd.name);
+		if (wr2DCfd(buf, &DCcksum))
+		    return(1);
+	    }
+	    return(0);
+	}
+/*
+ * A shouldn't-happen case: mode neither 1 nor 2.
+ */
+	(void) fprintf(stderr, "%s: internal rw_clone_sect error: %d\n",
+	    Pn, m);
+	Exit(1);
+}
+#endif	/* defined(HASDCACHE) && AIXV>=4140 */
+
+
+#if	defined(HASDCACHE)
+/*
+ * vfy_dev() - verify a device table entry (usually when DCunsafe == 1)
+ *
+ * Note: rereads entire device table when an entry can't be verified.
+ */
+
+int
+vfy_dev(dp)
+	struct l_dev *dp;		/* device table pointer */
+{
+	struct stat sb;
+
+	if (!DCunsafe || dp->v)
+	    return(1);
+
+#if	defined(USE_STAT)
+	if (stat(dp->name, &sb) != 0
+#else	/* !defined(USE_STAT) */
+	if (lstat(dp->name, &sb) != 0
+#endif	/* defined(USE_STAT) */
+
+	||  dp->rdev != sb.st_rdev
+	||  dp->inode != (INODETYPE)sb.st_ino) {
+	   (void) rereaddev();
+	   return(0);
+	}
+	dp->v = 1;
+	return(1);
+}
+#endif	/* defined(HASDCACHE) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dfile.c
new file mode 100644
index 0000000..74b30c8
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dfile.c
@@ -0,0 +1,600 @@
+/*
+ * dfile.c - AIX file processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.13 2005/08/08 19:46:38 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local structures
+ */
+
+struct hsfile {
+	struct sfile *s;		/* the Sfile table address */
+	struct hsfile *next;		/* the next hash bucket entry */
+};
+
+
+/*
+ * Local static variables
+ */
+
+static struct hsfile *HbyFdi =		/* hash by file buckets */
+	(struct hsfile *)NULL;
+static int HbyFdiCt = 0;		/* HbyFdi entry count */
+static struct hsfile *HbyFrd =		/* hash by file raw device buckets */
+	(struct hsfile *)NULL;
+static int HbyFrdCt = 0;		/* HbyFrd entry count */
+static struct hsfile *HbyFsd =		/* hash by file system buckets */
+	(struct hsfile *)NULL;
+static int HbyFsdCt = 0;		/* HbyFsd entry count */
+static struct hsfile *HbyMPC =		/* hash by MPC file buckets */
+	(struct hsfile *)NULL;
+static int HbyMPCCt = 0;		/* HbyMPC entry count */
+static struct hsfile *HbyNm =		/* hash by name buckets */
+	(struct hsfile *)NULL;
+static int HbyNmCt = 0;			/* HbyNm entry count */
+
+
+/*
+ * Local definitions
+ */
+
+#define	SFDIHASH	4094		/* Sfile hash by (device,inode) number
+					 * pair bucket count (power of 2!) */
+#define	SFFSHASH	128		/* Sfile hash by file system device
+					 * number bucket count (power of 2!) */
+#define SFHASHDEVINO(maj, min, ino, mod) ((int)(((int)((((int)(maj+1))*((int)((min+1))))+ino)*31415)&(mod-1)))
+					/* hash for Sfile by major device,
+					 * minor device, and inode, modulo m
+					 * (m must be a power of 2) */
+#define	SFMPCHASH	1024		/* Sfile hash by MPC device number */
+#define	SFNMHASH	4096		/* Sfile hash by name bucket count
+					   (power of 2!) */
+#define	SFRDHASH	1024		/* Sfile hash by raw device number
+					 * bucket count (power of 2!) */
+#define SFHASHRDEVI(maj, min, rmaj, rmin, ino, mod) ((int)(((int)((((int)(maj+1))*((int)((min+1))))+((int)(rmaj+1)*(int)(rmin+1))+ino)*31415)&(mod-1)))
+					/* hash for Sfile by major device,
+					 * minor device, major raw device,
+					 * minor raw device, and inode, modulo
+					 * mod (mod must be a power of 2) */
+
+
+/*
+ * hashSfile() - hash Sfile entries for use in is_file_named() searches
+ */
+
+void
+hashSfile()
+{
+	static int hs = 0;
+	int i;
+	struct sfile *s;
+	struct hsfile *sh, *sn;
+/*
+ * Do nothing if there are no file search arguments cached or if the
+ * hashes have already been constructed.
+ */
+	if (!Sfile || hs)
+	    return;
+/*
+ * Allocate hash buckets by (device,inode), file system device, MPC device,
+ * and file name.
+ */
+	if (!(HbyFdi = (struct hsfile *)calloc((MALLOC_S)SFDIHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d (dev,ino) hash buckets\n",
+		Pn, SFDIHASH);
+	    Exit(1);
+	}
+	if (!(HbyFrd = (struct hsfile *)calloc((MALLOC_S)SFRDHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d rdev hash buckets\n",
+		Pn, SFRDHASH);
+	    Exit(1);
+	}
+	if (!(HbyFsd = (struct hsfile *)calloc((MALLOC_S)SFFSHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d file sys hash buckets\n",
+		Pn, SFFSHASH);
+	    Exit(1);
+	}
+	if (!(HbyMPC = (struct hsfile *)calloc((MALLOC_S)SFMPCHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d MPC file hash buckets\n",
+		Pn, SFMPCHASH);
+	    Exit(1);
+	}
+	if (!(HbyNm = (struct hsfile *)calloc((MALLOC_S)SFNMHASH,
+					      sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d name hash buckets\n",
+		Pn, SFNMHASH);
+	    Exit(1);
+	}
+	hs++;
+/*
+ * Scan the Sfile chain, building file, file system, MPC file, and file
+ * name hash bucket chains.
+ */
+	for (s = Sfile; s; s = s->next) {
+	    for (i = 0; i < 4; i++) {
+		if (i == 0) {
+		    if (!s->aname)
+			continue;
+		    sh = &HbyNm[hashbyname(s->aname, SFNMHASH)];
+		    HbyNmCt++;
+		} else if (i == 1) {
+		    if (s->type) {
+			sh = &HbyFdi[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev),
+						  s->i,
+						  SFDIHASH)];
+			HbyFdiCt++;
+		    } else {
+			sh = &HbyFsd[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev),
+						  0,
+						  SFFSHASH)];
+			HbyFsdCt++;
+		    }
+		} else if (i == 2) {
+		    if (s->type && (s->ch < 0) && (s->mode == S_IFCHR))
+		    {
+			sh = &HbyMPC[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev),
+						  0,
+						  SFMPCHASH)];
+			HbyMPCCt++;
+		    } else
+			continue;
+		} else if (i == 3) {
+		    if (s->type
+		    &&  (((s->mode == S_IFCHR) && (s->ch < 0))
+		    ||   ((s->mode == S_IFBLK))))
+		    {
+			sh = &HbyFrd[SFHASHRDEVI(GET_MAJ_DEV(s->dev),
+						 GET_MIN_DEV(s->dev),
+						 GET_MAJ_DEV(s->rdev),
+						 GET_MIN_DEV(s->rdev),
+						 s->i,
+						 SFRDHASH)];
+			HbyFrdCt++;
+		    } else
+			continue;
+		}
+		if (!sh->s) {
+		    sh->s = s;
+		    sh->next = (struct hsfile *)NULL;
+		    continue;
+		} else {
+		    if (!(sn = (struct hsfile *)malloc(
+				(MALLOC_S)sizeof(struct hsfile))))
+		    {
+			(void) fprintf(stderr,
+			    "%s: can't allocate hsfile bucket for: %s\n",
+			    Pn, s->aname);
+			Exit(1);
+		    }
+		    sn->s = s;
+		    sn->next = sh->next;
+		    sh->next = sn;
+		}
+	    }
+	}
+}
+
+
+/*
+ * is_file_named() - is file named?
+ */
+
+int
+is_file_named(p, ty, ch, ic)
+	char *p;			/* path name; NULL = search by device
+					 * and inode (from *Lf) */
+	enum vtype ty;			/* vnode type */
+	chan_t ch;			/* gnode channel */
+	int ic;				/* is clone file (4.1.4 and above) */
+{
+	int dmaj, dmin, maj, min, rmaj, rmin;
+	static int dsplit = 0;
+	char *ep;
+	int f = 0;
+	struct sfile *s;
+	struct hsfile *sh;
+	size_t sz;
+/*
+ * Split the device numbers into their major and minor numbers.
+ *
+ * THis is necessitated by 64 bit AIX architectures, which store two different
+ * types of device numbers in 64 bit dev_t's.  The two types can't be compared
+ * directly, but must be compared by extracting their major and minor numbers
+ * and comparing them.
+ */
+	readdev(0);
+	if (!dsplit) {
+	    dmaj = GET_MAJ_DEV(DevDev);
+	    dmin = GET_MIN_DEV(DevDev);
+	    dsplit = 1;
+	}
+	if (Lf->dev_def) {
+	    maj = GET_MAJ_DEV(Lf->dev);
+	    min = GET_MIN_DEV(Lf->dev);
+	}
+	if (Lf->rdev_def) {
+	   rmaj = GET_MAJ_DEV(Lf->rdev);
+	   rmin = GET_MIN_DEV(Lf->rdev);
+	}
+
+#if	AIXV>=4140
+/*
+ * Check for a clone match.
+ */
+	if (ic
+	&&  HbyFdiCt
+	&&  CloneMaj >= 0
+	&&  (Lf->dev_def && (maj = dmaj) && (min == dmin))
+	&&  Lf->rdev_def
+	&&  (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh=&HbyFdi[SFHASHDEVINO(CloneMaj, rmaj, Lf->inode, SFDIHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s)
+		&&  (GET_MAJ_DEV(s->rdev) == CloneMaj)
+		&&  (GET_MIN_DEV(s->rdev) == rmaj)
+		&&  (s->i == Lf->inode))
+		{
+		    f = 3;
+		    break;
+		}
+	    }
+	}
+#endif	/* AIXV>=4140 */
+
+/*
+ * Check for a path name match, as requested.
+ */
+	if (!f && p && HbyNmCt) {
+	    for (sh = &HbyNm[hashbyname(p, SFNMHASH)]; sh; sh = sh->next) {
+		if ((s = sh->s) && strcmp(p, s->aname) == 0) {
+		    f = 2;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a regular AIX multiplexed file, matching the channel if
+ * it was supplied by the caller.
+ */
+	if (!f && HbyMPCCt && ty == VMPC
+	&&  (Lf->dev_def && (maj == dmaj) && (min == dmin))
+	&&  Lf->rdev_def)
+	{
+	    for (sh = &HbyMPC[SFHASHDEVINO(rmaj, rmin, 0, SFMPCHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s)
+		&&  (GET_MAJ_DEV(s->dev) == rmaj)
+		&&  (GET_MIN_DEV(s->dev) == rmin)
+		&&  (s->ch < 0 || ch == s->ch)) {
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a regular file.
+ */
+	if (!f && HbyFdiCt && Lf->dev_def
+	&&  (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh = &HbyFdi[SFHASHDEVINO(maj, min, Lf->inode, SFDIHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s)
+		&&  (maj == GET_MAJ_DEV(s->dev))
+		&&  (min == GET_MIN_DEV(s->dev))
+		&&  (Lf->inode == s->i))
+		{
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a file system.
+ */
+	if (!f && HbyFsdCt && Lf->dev_def) {
+	    for (sh = &HbyFsd[SFHASHDEVINO(maj, min, 0, SFFSHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s)
+		&&  (maj == GET_MAJ_DEV(s->dev))
+		&&  (min == GET_MIN_DEV(s->dev))
+		) {
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a character or block device file.
+ */
+	if (!f && HbyFrdCt
+	&&  ((ty == VCHR) || (ty == VBLK))
+	&&  (Lf->dev_def && (maj == dmaj) && (min == dmin))
+	&&  Lf->rdev_def
+	&& (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh = &HbyFrd[SFHASHRDEVI(maj, min, rmaj, rmin,
+					  Lf->inode, SFRDHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s)
+		&&  (GET_MAJ_DEV(s->rdev) == rmaj)
+		&&  (GET_MIN_DEV(s->rdev) == rmin)
+		&&  (((ty == VCHR) && (s->mode == S_IFCHR) && (s->ch < 0))
+		||   ((ty == VBLK) && (s->mode == S_IFBLK))))
+		{
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Convert the name if a match occurred.
+ */
+	if (f) {
+	    if (f == 2) {
+		(void) snpf(Namech, Namechl, "%s", p);
+
+#if	AIXV>=4140
+	    } else if (f == 3 && ClonePtc >= 0 && (maj == ClonePtc)) {
+		(void) snpf(Namech, Namechl, "%s/%d", s->name, min);
+
+#endif	/* AIXV>=4140 */
+
+	    } else if (s->type) {
+
+	    /*
+	     * If the search argument isn't a file system, propagate it
+	     * to Namech[]; otherwise, let printname() compose the name.
+	     */
+		(void) snpf(Namech, Namechl, "%s", s->name);
+		if (ty == VMPC && s->ch < 0) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, "/%d", ch);
+		}
+		if (s->devnm) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, " (%s)", s->devnm);
+		}
+	    }
+	    s->f = 1;
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * print_dev() - print device
+ */
+
+char *
+print_dev(lf, dev)
+	struct lfile *lf;		/* file whose device to be printed */
+	dev_t *dev;			/* pointer to device to be printed */
+
+{
+	static char buf[128];
+	int maj = GET_MAJ_DEV(*dev);
+	int min = GET_MIN_DEV(*dev);
+
+#if	AIXV>=3200
+	if (*dev & SDEV_REMOTE) {
+	    (void) snpf(buf, sizeof(buf), "NFS,%d", (min & ~SDEV_REMOTE));
+	    return(buf);
+	}
+#endif	/* AIXV>=3200 */
+
+	(void) snpf(buf, sizeof(buf), "%d,%d", maj, min);
+	return(buf);
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(vn)
+	struct vnode *vn;		/* vnode */
+{
+	struct gfs g;
+	void *mp;
+	char *s1, *s2;
+	uint ul;
+	struct vfs v;
+	struct vmount *vm;
+	struct l_vfs *vp;
+
+
+	if (!vn->v_vfsp)
+	    return((struct l_vfs *)NULL);
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if ((KA_T)vn->v_vfsp == vp->addr)
+		return(vp);
+	}
+	if (!(vp = (struct l_vfs *)malloc((MALLOC_S)sizeof(struct l_vfs)))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->dir = (char *)NULL;
+	vp->fsname = (char *)NULL;
+/*
+ * Read the vfs structure.
+ */
+	if (kread((KA_T)vn->v_vfsp, (char *)&v, sizeof(v))) {
+
+vfs_exit:
+	    (void) free((FREE_P *)vp);
+	    return((struct l_vfs *)NULL);
+	}
+/*
+ * Locate AIX mount information.
+ */
+	if (!v.vfs_gfs || kread((KA_T)v.vfs_gfs, (char *)&g, sizeof(g)))
+	    goto vfs_exit;
+	if (!v.vfs_mdata
+	||  kread((KA_T)((char *)v.vfs_mdata
+		  + offsetof(struct vmount, vmt_length)),
+		  (char *)&ul, sizeof(ul)))
+	    goto vfs_exit;
+	if (!(mp = (void *)malloc((MALLOC_S)ul))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for mount data\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	if (kread((KA_T)v.vfs_mdata, (char *)mp, (int)ul)) {
+	    (void) free((FREE_P *)mp);
+	    goto vfs_exit;
+	}
+	vm = (struct vmount *)mp;
+	vp->vmt_flags = vm->vmt_flags;
+	vp->vmt_gfstype = vm->vmt_gfstype;
+
+#if	AIXV>=3200
+	if ((vp->vmt_flags & MNT_REMOTE)
+
+# if	defined(HAS_SANFS) && defined(MNT_SANFS)
+	&& (vp->vmt_gfstype != MNT_SANFS)
+# endif	/* defined(HAS_SANFS) && defined(MNT_SANFS) */
+
+	) {
+	    vp->dev = 0x80000000 | vm->vmt_vfsnumber;
+# if	AIXA>=1
+	    vp->dev |= 0x8000000000000000;
+# endif	/* AIXA>=1 */
+	} else
+#endif	/* AIXV>=3200 */
+
+#if	defined(HAS_AFS)
+	    if (vm->vmt_gfstype == MNT_AFS)
+		vp->dev = AFSDEV;
+	    else
+#endif	/* defined(HAS_AFS) */
+
+#if	AIXA>1
+	if (vm->vmt_gfstype == MNT_PROCFS) {
+
+	/*
+	 * !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!
+	 *
+	 * The following *hack* is required to make the vmount structure's
+	 * device number match what stat(2) errnoneously returns in ia64
+	 * AIX >= 5.
+	 *
+	 * REMOVE THIS CODE WHEN STAT(2) IS FIXED!!!
+	 */
+		vp->dev = (dev_t)(vm->vmt_fsid.fsid_dev & 0x7fffffffffffffff);
+	/*
+	 * !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!
+	 */
+
+	}
+	else
+#endif	/* AIXA>1 */
+
+		vp->dev = (dev_t)vm->vmt_fsid.fsid_dev;
+	if ((s1 = vmt2dataptr(vm, VMT_STUB))) {
+	    if (!(vp->dir = mkstrcpy(s1, (MALLOC_S *)NULL))) {
+
+readvfs_aix1:
+		(void) fprintf(stderr, "%s: PID %d, readvfs, no space\n",
+		    Pn, Lp->pid);
+		Exit(1);
+	    }
+	} else
+	    vp->dir = (char *)NULL;
+	s1 = vmt2dataptr(vm, VMT_HOST);
+	if (!(s2 = vmt2dataptr(vm, VMT_OBJECT)) || *s1 == '\0')
+	    s2 = g.gfs_name;
+	if (!s1 && !s2)
+	    vp->fsname = (char *)NULL;
+	else {
+	    if (vm->vmt_flags & MNT_REMOTE) {
+		if (!(vp->fsname = mkstrcat(s1 ? s1 : "",
+					    -1,
+					   (s1 && *s1) ? ":" : "",
+					   -1, s2, -1,
+					   (MALLOC_S *)NULL)))
+		    goto readvfs_aix1;
+	    } else {
+		if (!(vp->fsname = mkstrcpy(s2, (MALLOC_S *)NULL)))
+		    goto readvfs_aix1;
+	    }
+	}
+	(void) free((FREE_P *)mp);
+	vp->next = Lvfs;
+	vp->addr = (KA_T)vn->v_vfsp;
+
+#if	defined(HAS_AFS)
+	if (!AFSVfsp && vm->vmt_gfstype == MNT_AFS)
+	    AFSVfsp = (KA_T)vn->v_vfsp;
+#endif	/* defined(HAS_AFS) */
+
+	Lvfs = vp;
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/aix/dlsof.h
new file mode 100644
index 0000000..287b4c5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dlsof.h
@@ -0,0 +1,442 @@
+/*
+ * dlsof.h - AIX 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.32 2006/03/27 23:09:21 abe Exp $
+ */
+
+
+#if	!defined(AIX_LSOF_H)
+#define	AIX_LSOF_H	1
+
+/*
+ * AIXA stands for AIX architecure.  It is given these values in the
+ * aix stanza of the lsof Configure script:
+ *
+ *     0	The AIX version is < 5, or the AIX architecture is power and
+ *		the kernel bit size is 32.
+ *
+ *     1	The AIX version is >= 5, the AIX architecture is Power, and
+ *		the kernel bit size is 64.
+ *
+ *     2	The AIX version is > 5 and the architecture is IA64.
+ */
+
+# if	AIXA>1
+#include <nlist.h>
+# endif	/* AIXA>1 */
+
+#include <stdlib.h>
+#include <string.h>
+#include <dirent.h>
+#include <setjmp.h>
+#include <unistd.h>
+
+# if	!defined(_KERNEL)
+#define _KERNEL	1
+# endif	/* !defined(_KERNEL) */
+
+#include <sys/vnode.h>
+#include <sys/file.h>
+#include <procinfo.h>		/* <procinfo.h> #includes <sys/user.h> */
+#define p_pid	pi_pid
+#define	p_pgid	pi_pgrp
+#define	p_ppid	pi_ppid
+
+# if	AIXV<4300
+#define p_stat	pi_stat
+# else	/* AIXV>=4300 */
+#define	p_stat	pi_state
+#include <sys/systemcfg.h>
+# endif	/* AIXV<4300 */
+
+#define p_uid	pi_uid
+#undef	sleep
+#undef	_KERNEL
+
+# if	AIXA>1
+#define	_NET_NET_MALLOC		/* to keep <sys/mbuf.h> from #include'ing
+				 * <sys/ppda.h>, which is missing from
+				 * ia64 AIX 5L */
+# endif	/* AIXA>1 */
+
+#include <sys/mbuf.h>
+#include <sys/mntctl.h>
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+
+# if	AIXV>=4140
+#include <sys/stream.h>
+# endif	/* AIXV>=4140 */
+
+#include <sys/sysmacros.h>
+#include <sys/un.h>
+#include <sys/unpcb.h>
+
+# if	defined(HASKERNIDCK) && AIXV>=5000
+#include <sys/utsname.h>
+# endif	/* defined(HASKERNIDCK) && AIXV>=5000 */
+
+#include <netinet/in.h>
+#include <net/route.h>
+#include <net/raw_cb.h>
+
+# if	AIXV>=4100
+#include <netinet/ip.h>
+# endif	/* AIXV>=4100 */
+
+#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/vattr.h>
+#include <sys/statfs.h>
+
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+
+# if	defined(HAS_AFS)
+#define	__XDR_INCLUDE__
+# endif	/* defined(HAS_AFS) */
+
+#include <sys/vfs.h>
+#include <sys/vmount.h>
+
+# if	defined(HAS_SANFS) && !defined(MNT_SANFS)
+#define	MNT_SANFS	20
+# endif	/* defined(HAS_SANFS) && !defined(MNT_SANFS) */
+
+# if	AIXV>=4100
+#  if	AIXV>=4110
+#undef	u
+#undef	u_comm
+#undef	u_cdir
+#undef	u_rdir
+#undef	u_maxofile
+#undef	u_ufd
+#undef	u_loader
+#  endif	/* AIXV>=4110 */
+
+#define	u_comm		U_comm
+#define	u_cdir		U_cdir
+#define	u_rdir		U_rdir
+#define	u_maxofile	U_maxofile
+#define	u_ufd		U_ufd
+#define	u_loader	U_loader
+# endif	/* AIXV>=4100 */
+
+#  if	AIXV>=3200
+#include <sys/specnode.h>
+#  endif	/* AIXV>=3200 */
+
+/*
+ * AIX doesn't supply cdrnode.h.
+ */
+
+struct cdrnode {
+	caddr_t		f1[4];
+	struct gnode	f2;
+	dev_t		f3;
+	ino_t		cn_inumber;	/* inode number */
+	caddr_t		f4;
+	cnt_t		f5[2];
+	u_short		f6;
+	uint		f7[2];
+	uchar		f8[3];
+	off_t		cn_size;	/* size of file in bytes */
+};
+
+# if	defined(HAS_AFS)
+
+/*
+ *  Avoid typdef conflicts in <afs/stds.h>.
+ */
+
+#  if	defined(HASINT16TYPE)
+#define	int16	AFS_int16
+#  endif	/* defined(HASINT16TYPE */
+#  if	defined(HASUINT16TYPE)
+#define	u_int16	AFS_u_int16
+#  endif	/* defined(HASUINT16TYPE */
+#  if	defined(HASINT32TYPE)
+#define int32	AFS_int32
+#  endif	/* defined(HASINT32TYPE) */
+
+#include <afs/stds.h>
+#include <afs/param.h>
+#include <afs/afsint.h>
+#include <afs/vldbint.h>
+# endif	/* defined(HAS_AFS) */
+
+
+/*
+ * Miscellaneous definitions.
+ */
+
+# if	defined(HAS_AFS)
+#define	AFSAPATHDEF	"/usr/vice/etc/dkload/???"
+#define	AFSDEV		1	/* AFS "fake" device number */
+
+#  if	!defined(MNT_AFS)
+#define	MNT_AFS		AFS_MOUNT_AFS
+#  endif	/* !defined(MNT_AFS) */
+# endif	/* defined(HAS_AFS) */
+
+#define	COMP_P		const void
+#define DEVINCR		1024	/* device table malloc() increment */
+
+# if	AIXV<4200
+typedef	off_t		KA_T;
+# else	/* AIXV>=4200 */
+#  if	AIXA<1
+typedef	unsigned int	KA_T;
+#  else	/* AIXA>=1 */
+typedef u_longlong_t	KA_T;
+#define	GET_MAJ_DEV(d)	(ISDEVNO64(d) ? major64(d) : major(d & ~SDEV_REMOTE))
+#define	GET_MIN_DEV(d)	(ISDEVNO64(d) ? (minor64(d) & ~SDEV_REMOTE) : minor(d))
+#define	KA_T_FMT_X	"%#llx"
+#  endif	/* AIXA<1 */
+# endif	/* AIXV<4200 */
+
+#define KMEM		"/dev/kmem"
+
+# if	defined(HASSTAT64)
+#define	fstat		fstat64
+#define	lstat		lstat64
+#define	stat		stat64
+# endif	/* defined(HASSTAT64) */
+
+#define MALLOC_P	char
+#define FREE_P		MALLOC_P
+#define MALLOC_S	size_t
+#define	MAXSYSCMDL	MAXCOMLEN	/* max system command name length */
+#define	N_UNIX		"/unix"
+#define QSORT_P		void
+#define	READLEN_T	size_t
+#define STRNCPY_L	size_t
+
+# if	AIXV>=4200
+#define	SZOFFTYPE	unsigned long long
+				/* size and offset type definition */
+#define	SZOFFPSPEC	"ll"	/* SZOFFTYPE print specification modifier */
+# endif	/* AIXV>=4200 */
+
+#define U_SIZE		sizeof(struct user)
+
+
+/*
+ * Name list (Nl[]) indexes
+ */
+
+#define	X_UADDR		0
+#define	X_NL_NUM	1
+
+
+/*
+ * Definition for ckfa.c
+ */
+
+#define	CKFA_MPXCHAN	1
+
+
+/*
+ * Definitions for dvch.c
+ */
+
+# if	AIXV>=4140
+#define	DCACHE_CLONE	rw_clone_sect	/* clone function for read_dcache */
+#define	DCACHE_CLR	clr_sect	/* function to clear clone and
+					 * pseudo caches when reading the
+					 * device cache file fails */
+# endif	/* AIXV>=4140 */
+
+
+/*
+ * Definitions for enter_dir()
+ */
+
+#define	DIRTYPE	dirent
+#define	HASDNAMLEN	1
+
+
+# if	defined(HAS_AFS)
+/*
+ * AFS name list (AFSnl[]) indexes
+ */
+
+#define	X_AFS_FID	0
+#define	X_AFS_VOL	1
+#define	X_AFSNL_NUM	2
+# endif	/* defined(HAS_AFS) */
+
+
+# if	AIXV>=4140
+/*
+ * Local clone information
+ */
+
+struct clone {
+	struct l_dev cd;		/* device, inode, name, verify status */
+	struct clone *next;		/* next entry */
+};
+extern struct clone *Clone;
+extern int CloneMaj;
+extern int ClonePtc;
+#endif	/* AIXV>=4140 */
+
+
+/*
+ * Local inode information
+ */
+
+struct l_ino {
+	dev_t dev;			/* device */
+	long nlink;			/* link count */
+	INODETYPE number;		/* inode number */
+	SZOFFTYPE size;			/* file size */
+	unsigned char dev_def;		/* link count is defined */
+	unsigned char nlink_def;	/* link count is defined */
+	unsigned char number_def;	/* number is defined */
+	unsigned char size_def;		/* size is defined */
+};
+
+
+/*
+ * Local vfs information
+ */
+
+struct l_vfs {
+	KA_T addr;			/* kernel address */
+	dev_t dev;			/* device */
+	char *dir;			/* mounted directory */
+	char *fsname;			/* file system name */
+	int vmt_flags;			/* vmount flags */
+	int vmt_gfstype;		/* vmount gfs type */
+	struct l_vfs *next;		/* forward link */
+};
+extern struct l_vfs *Lvfs;
+
+
+/*
+ * Local mount information
+ */
+
+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 */
+	u_short mode;			/* directory st_mode */
+	u_short fs_mode;		/* file system st_mode */
+
+# if	defined(HASFSTYPE)
+	int fstype;			/* fs type */
+# endif	/* defined(HASFSTYPE) */
+
+        struct mounts *next;    	/* forward link */
+};
+extern struct mounts *Mtab;
+
+
+/*
+ * Search file information
+ */
+
+struct sfile {
+	char *aname;			/* file name argument */
+	char *name;			/* file name (after readlink()) */
+	char *devnm;			/* device name (optional) */
+	dev_t dev;			/* device */
+	dev_t rdev;			/* raw device */
+	chan_t ch;			/* channel (last path component,
+					 * (if numeric) */
+	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 */
+};
+
+
+/*
+ * Miscellaneous external definitions
+ */
+
+# if	defined(HAS_AFS)
+extern struct nlist AFSnl[];	/* AFS kernel symbol name list table */
+
+#  if	defined(HASAOPT)
+extern char *AFSApath;		/* alternate AFS name list path (from -a) */
+#  endif	/* defined(HASAOPT) */
+
+extern KA_T AFSVfsp;		/* AFS struct vfs kernel pointer */
+# endif	/* defined(HAS_AFS) */
+
+extern int Kd;
+extern int Km;
+extern struct nlist Nl[];
+
+# if	defined(TCPSTATES) && AIXV<=3250
+/*
+ * For AIX 3.2.5 and below, there is no header file with the  definition
+ * of tcpstates[], needed by ptti.c's print_tcptpi() function.
+ */
+
+static char *tcpstates[] = {
+	"CLOSED",       "LISTEN",       "SYN_SENT",     "SYN_RCVD",
+	"ESTABLISHED",  "CLOSE_WAIT",   "FIN_WAIT_1",   "CLOSING",
+	"LAST_ACK",     "FIN_WAIT_2",   "TIME_WAIT"
+};
+# endif	/* defined(TCPSTATES) && AIXV<=3250 */
+
+
+# if	AIXA>1
+/*
+ * This AIX 5 or above ia64 hack prevents the loader from linking lsof's
+ * kread() in preference to the kread() that read() uses.  The very existence
+ * of a system kread() is an unwarrranted invasion of user name space!
+ */
+
+#define	kread	lsof_kread		/* avoid conflict with the kread()
+					 * in libc.so */
+# endif	/* AIXA>1 */
+
+#endif	/* AIX_LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dmnt.c
new file mode 100644
index 0000000..ef1d61c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dmnt.c
@@ -0,0 +1,302 @@
+/*
+ * dmnt.c - AIX mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.13 2005/08/08 19:46:38 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dir, *fs, *h, *ln, *ty;
+	char *dn = (char *)NULL;
+	struct mounts *mtp;
+	int nm;
+	struct stat sb;
+	MALLOC_S sz;
+	struct vmount *v;
+	struct vmount *vt = (struct vmount *)NULL;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Read the table of vmount structures.
+ */
+	for (sz = sizeof(struct vmount);;) {
+	    if (!(vt = (struct vmount *)malloc(sz))) {
+		(void) fprintf(stderr, "%s: no space for vmount table\n", Pn);
+		return(0);
+	    }
+	    nm = mntctl(MCTL_QUERY, sz, (unsigned char *)vt);
+	    if (nm > 0) {
+		if (vt->vmt_revision != VMT_REVISION) {
+		    (void) fprintf(stderr,
+			"%s: stale file system, rev %d != %d\n",
+			Pn, vt->vmt_revision, VMT_REVISION);
+		    return(0);
+		}
+		break;
+	    }
+	    if (nm == 0) {
+		sz = (unsigned)vt->vmt_revision;
+		(void) free((FREE_P *)vt);
+	    } else {
+		(void) fprintf(stderr, "%s: mntctl error: %s\n",
+		    Pn, strerror(errno));
+		return(0);
+	    }
+	}
+/*
+ * Scan the vmount structures and build Lmi.
+ */
+	for (v = vt; nm--; v = (struct vmount *)((char *)v + v->vmt_length)) {
+	    dir = (char *)vmt2dataptr(v, VMT_STUB);
+	    fs = (char *)vmt2dataptr(v, VMT_OBJECT);
+	    h = (char *)vmt2dataptr(v, VMT_HOST);
+            if (statsafely(dir, &sb)) {
+		if (!Fwarn) {
+
+		/*
+		 * Issue stat() failure warning.
+		 */
+		    switch(v->vmt_gfstype) {
+
+#if	defined(HAS_AFS)
+		    case MNT_AFS:
+			ty = "afs";
+			break;
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(MNT_AIX) && defined(MNT_J2) && MNT_AIX==MNT_J2
+		    case MNT_AIX:
+			ty = "jfs2";
+			break;
+#else	/* !defined(MNT_AIX) || !defined(MNT_J2) || MNT_AIX!=MNT_J2 */
+# if	defined(MNT_AIX)
+		    case MNT_AIX:
+			ty = "oaix";
+			break;
+# endif	/* defined(MNT_AIX) */
+# if	defined(MNT_J2)
+		    case MNT_J2:
+			ty = "jfs2";
+			break;
+# endif	/* defined(MNT_J2) */
+#endif	/* defined(MNT_AIX) && defined(MNT_H2) && MNT_AIX==MNT_J2 */
+
+		    case MNT_CDROM:
+			ty = "cdrom";
+			break;
+		    case MNT_JFS:
+			ty = "jfs";
+			break;
+		    case MNT_NFS:
+			ty = "nfs";
+			break;
+
+#if	defined(MNT_NFS3)
+		    case MNT_NFS3:
+			ty = "nfs3";
+			break;
+#endif	/* defined(MNT_NFS3) */
+
+#if	defined(HASPROCFS)
+		    case MNT_PROCFS:
+			ty = HASPROCFS;
+			break;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(MNT_SANFS)
+		    case MNT_SANFS:
+			ty = "sanfs";
+			break;
+#endif	/* defined(MNT_SANFS) */
+
+		    default:
+			ty = "unknown";
+		    }
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't stat() %s file system %s\n",
+			Pn, ty, dir);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+	    /*
+	     * Assemble alternate device number and mode flags.
+	     */
+		(void) bzero((char *)&sb, sizeof(sb));
+		if (v->vmt_flags & MNT_REMOTE) {
+
+#if	AIXA<2
+		    sb.st_dev = (dev_t)(SDEV_REMOTE | v->vmt_vfsnumber);
+#else	/* AIXA>=2 */
+		    sb.st_dev = (dev_t)(SDEV_REMOTE | (SDEV_REMOTE << 32)
+			      |         v->vmt_vfsnumber);
+#endif	/* AIXA<2 */
+
+		} else {
+
+#if	defined(HAS_AFS)
+		    if (v->vmt_gfstype == MNT_AFS)
+			sb.st_dev = AFSDEV;
+		    else
+#endif	/* defined(HAS_AFS) */
+
+#if	AIXA>=2 && defined(HASPROCFS)
+		    if (v->vmt_gfstype == MNT_PROCFS) {
+
+		    /*
+		     * !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!
+		     *
+		     * The following *hack* is required to make the vmount
+		     * structure's device number match what stat(2)
+		     * errnoneously returns on ia64 AIX 5L.
+ 		     *
+		     * REMOVE THIS CODE WHEN STAT(2) IS FIXED!!!
+		     */
+			sb.st_dev = (dev_t)(v->vmt_fsid.val[0]
+				  &         0x7fffffffffffffff);
+		    /*
+		     * !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!   !!!DEBUG!!!
+ 		     */
+
+		    }
+		    else
+#endif	/* AIXA>=2 && defined(HASPROCFS) */
+
+			sb.st_dev = (dev_t)v->vmt_fsid.val[0];
+		}
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"      assuming \"dev=%#lx\" from mount table\n",
+			sb.st_dev);
+		sb.st_mode = S_IFDIR | 0777;
+	    }
+	/*
+	 * Allocate space for the directory (mounted on) and resolve
+	 * any symbolic links.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(dir, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at %s (%s)\n",
+		    Pn, fs, dir);
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Allocate a local mounts structure and fill the directory information.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(
+			(MALLOC_S)sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+	    mtp->dev = sb.st_dev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	    mtp->rdev = sb.st_rdev;
+
+#if	defined(HASFSTYPE)
+	    mtp->fstype = sb.st_vfstype;
+#endif	/* defined(HASFSTYPE) */
+
+	    mtp->next = Lmi;
+	/*
+	 * Form the file system (mounted-on) device name.  Resolve any
+	 * symbolic links.  Allocate space for the result and store it in
+	 * the local mounts structure.
+	 */
+	    if (h && (v->vmt_flags & MNT_REMOTE)) {
+		if (!(dn = mkstrcat(h, -1, *h ? ":" : "", 1, fs, -1,
+				    (MALLOC_S *)NULL)))
+		    goto no_space_for_mount;
+	    } else {
+		if (!(dn = mkstrcpy(fs, (MALLOC_S *)NULL)))
+		    goto no_space_for_mount;
+	    }
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat the file system (mounted-on) device name to get its modes.
+	 * Set the modes to zero if the stat fails.  Add file system
+	 * (mounted-on) device information to the local mountsstructure.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+        }
+/*
+ * Clean up and return local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	if (vt)
+	    (void) free((FREE_P *)vt);
+	Lmist = 1;
+	return(Lmi);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dnode.c
new file mode 100644
index 0000000..10a07bb
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dnode.c
@@ -0,0 +1,1307 @@
+/*
+ * dnode.c - AIX node reading functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.25 2008/10/21 16:14:18 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if	AIXV<5000
+#define	FL_NEXT	next
+#else	/* AIXV>=5000 */
+#define	FL_NEXT	fl_next
+# if	!defined(ISVDEV)
+#define ISVDEV(t) (((t)==VBLK)||((t)==VCHR)||((t)==VFIFO)||((t)==VMPC))
+# endif	/* !defined(ISVDEV) */
+#endif	/* AIXV<5000 */
+
+
+# if	defined(HAS_NFS)
+#  if	AIXV<4210
+#include <nfs/rnode.h>
+#  else	/* AIXV>=4210 */
+#   if	AIXA<2
+/*
+ * Private rnode struct definitions for AIX 4.2.1 and above
+ *
+ * The rnode struct IBM ships in <nfs/rnode.h> doesn't match the one
+ * the kernel uses.  The kernel's rnode struct definition comes from
+ * <oncplus/nfs/rnode.h>, a header file IBM does not ship with AIX.
+ *
+ * The rnode64 struct is for AIX above 4.3.3 whose "width" is 64.
+ * (See dnode.c for the method used to determine width.)
+ */
+
+struct rnode {
+	caddr_t	r_d1[11];		/* dummies; links? */
+	struct vnode r_vnode;		/* vnode for remote file */
+	struct gnode r_gnode;		/* gnode for remote file */
+	caddr_t r_d2[29];		/* dummies; rnode elements? */
+	off_t r_size;			/* client's view of file size (long)*/
+	struct vattr r_attr;		/* cached vnode attributes */
+};
+
+#    if	AIXV>4330
+struct rnode64 {
+
+#     if AIXV<5200
+	caddr_t	r_d1[11];		/* dummies; links? */
+#     else /* AIXV>=5200 */
+#      if	AIXV<5300
+	caddr_t	r_d1[12];		/* dummies; links? */
+#      else	/* AIXV>=5300 */
+	caddr_t r_d1[7];		/* dummies; links? */
+#      endif	/* AIXV<5300 */
+#     endif /* AIXV<5200 */
+
+	struct vnode r_vnode;		/* vnode for remote file */
+	struct gnode r_gnode;		/* gnode for remote file */
+
+#     if	AIXV<5300
+	caddr_t r_d2[15];		/* dummies; rnode elements? */
+#     else	/* AIXV>=5300 */
+	caddr_t r_d2[11];		/* dummies; rnode elements? */
+#     endif	/* AIXV<5300 */
+
+	off_t r_size;			/* client's view of file size (long)*/
+	struct vattr r_attr;		/* cached vnode attributes */
+};
+#    endif	/* AIXV>4330 */
+#   else	/* AIXA>=2 */
+struct rnode {
+	KA_T d1[7];			/* dummies */
+	struct vnode r_vnode;		/* vnode for remote file */
+	struct gnode r_gnode;		/* gnode for remote file */
+	KA_T d2[19];			/* dummies */
+	off_t r_size;			/* client's view of file size (long)*/
+	struct vattr r_attr;		/* cached vnode attributes */
+};
+#   endif	/* AIXA<2 */
+#  endif	/* AIXV<4210 */
+# endif	/* defined(HAS_NFS) */
+
+
+/*
+ * isglocked() - is a gnode locked
+ */
+
+char
+isglocked(ga)
+	struct gnode *ga;		/* local gnode address */
+{
+
+	struct filock *cfp, f, *ffp;
+	int l;
+
+	if (!(ffp = ga->gn_filocks))
+	    return(' ');
+	cfp = ffp;
+
+#if	AIXV>=4140
+	do {
+#endif	/* AIXV>=4140 */
+
+	    if (kread((KA_T)cfp, (char *)&f, sizeof(f)))
+		return(' ');
+
+#if	AIXV>=4140
+	    if (f.set.l_sysid || f.set.l_pid != (pid_t)Lp->pid)
+		continue;
+#endif	/* AIXV>=4140 */
+
+	    if (f.set.l_whence == 0 && f.set.l_start == 0
+
+#if	AIXV>=4200
+	    &&  f.set.l_end == 0x7fffffffffffffffLL
+#else	/* AIXV<4200 */
+	    &&  f.set.l_end == 0x7fffffff
+#endif	/* AIXV>=4200 */
+
+	    )
+		l = 1;
+	    else
+		l = 0;
+	    switch (f.set.l_type & (F_RDLCK | F_WRLCK)) {
+
+	    case F_RDLCK:
+		return((l) ? 'R' : 'r');
+	    case F_WRLCK:
+		return((l) ? 'W' : 'w');
+	    case (F_RDLCK + F_WRLCK):
+		return('u');
+	    }
+	    return(' ');
+
+#if	AIXV>=4140
+	} while ((cfp = f.FL_NEXT) && cfp != ffp);
+	return(' ');
+#endif	/* AIXV>=4140 */
+
+}
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	struct cdrnode c;
+	dev_t dev, rdev;
+	int devs = 0;
+	struct gnode g;
+	struct l_ino i;
+	int ic = 0;
+	int ins = 0;
+	struct vfs *la = NULL;
+	int rdevs = 0;
+	size_t sz;
+	char tbuf[32], *ty;
+	enum vtype type;
+	struct l_vfs *vfs;
+	static struct vnode *v = (struct vnode *)NULL;
+
+#if	AIXV>=3200
+	struct devnode dn;
+	struct gnode pg;
+	struct specnode sn;
+	struct fifonode f;
+#endif	/* AIXV>=3200 */
+
+#if	defined(HAS_AFS)
+	static int afs = 0;		/* AFS test status: -1 = no AFS
+					 *		     0 = not tested
+					 *		     1 = AFS present */
+	struct afsnode an;
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HAS_NFS)
+	struct vattr nfs_attr;
+	int nfss = 0;
+	static struct rnode r;
+	static char *rp = (char *)&r;
+	static int rsz = sizeof(r);
+
+# if	AIXV>4330 && AIXA<2
+	static struct rnode64 r64;
+# endif	/* AIXV>4330 && AIXA<2 */
+
+# if	AIXA<2
+	static int width = -1;
+# else	/* AIXA>=2 */
+	static width = 64;
+# endif	/* AIXA<2 */
+#endif	/* defined(HAS_NFS) */
+
+#if	defined(HAS_SANFS)
+	struct sanfs_node {	/* DEBUG */
+
+	/*
+	 * This is a DEBUG version of the SANFS node structure.  When IBM makes
+	 * the SANFS header files available in /usr/include, this definition
+	 * will be removed.
+	 */
+	    u_long san_d1[20];	/* DEBUG */
+	    struct gnode san_gnode;	/* DEBUG */
+	    u_long san_d2[128];	/* DEBUG */
+	} san;
+	int sans = 0;
+#endif	/* defined(HAS_SANFS) */
+
+#if	AIXV>=4140
+	struct clone *cl;
+	KA_T ka;
+	struct module_info mi;
+	int ml, nx;
+	char mn[32];
+	struct queue q;
+	struct qinit qi;
+	KA_T qp, xp;
+	int ql;
+	struct sth_s {			/* stream head */
+	    KA_T *dummy;		/* dummy */
+	    KA_T *sth_wq;		/* write queue */
+	} sh;
+	struct xticb {			/* XTI control block */
+	    int d1;
+	    long d2;
+	    int d3;
+	    struct socket *xti_so;	/* socket pointer */
+	} xt;
+#endif	/* AIXV>=4140 */
+
+
+/*
+ * Read the vnode.
+ */
+	if (!va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	if (!v) {
+
+	/*
+	 * Allocate space for the vnode or AFS vcache structure.
+	 */
+
+#if	defined(HAS_AFS)
+	    v = alloc_vcache();
+#else	/* !defined(HAS_AFS) */
+	    v = (struct vnode *)malloc((MALLOC_S)sizeof(struct vnode));
+#endif	/* defined(HAS_AFS) */
+
+	    if (!v) {
+		(void) fprintf(stderr, "%s: can't allocate %s space\n", Pn,
+
+#if	defined(HAS_AFS)
+			       "vcache"
+#else	/* !defined(HAS_AFS) */
+			       "vnode"
+#endif	/* defined(HAS_AFS) */
+
+			      );
+		Exit(1);
+	    }
+	}
+/*
+ * Read the vnode.
+ */
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASFSTRUCT)
+	Lf->fsv |= FSV_NI;
+	Lf->fna = va;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Read the gnode.
+ */
+	if (!v->v_gnode || readgnode((KA_T)v->v_gnode, &g)) {
+	    if (Selinet) {
+		Lf->sf = SELEXCLF;
+		return;
+	    }
+	    (void) snpf(Namech, Namechl, "vnode at %s has no gnode\n",
+		print_kptr(va, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	AIXV>=3200
+
+/*
+ * Under AIX 3.2 and above, if the vnode type is ISVDEV, then there is a
+ * special node and a fifonode or devnode.  Behind them are the "real"
+ * gnode, inode and vnode.
+ */
+	if (ISVDEV(g.gn_type)) {
+	    switch (g.gn_type) {
+	    case VBLK:
+		Ntype = N_BLK;
+		break;
+	    case VCHR:
+		Ntype = N_CHR;
+		break;
+	    case VFIFO:
+		Ntype = N_FIFO;
+		break;
+	    case VMPC:
+		Ntype = N_MPC;
+		break;
+	    default:
+		(void) snpf(Namech, Namechl, "vnode at %s: unknown ISVDEV(%#x)",
+		    print_kptr(va, (char *)NULL, 0), g.gn_type);
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Read the special node.
+	 */
+	    if (!g.gn_data || kread((KA_T)g.gn_data, (char *)&sn, sizeof(sn))) {
+		if (Selinet) {
+		    Lf->sf = SELEXCLF;
+		    return;
+		}
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read specnode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)g.gn_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	   }
+	/*
+	 * Read the PFS gnode and its inode and vnode.
+	 */
+	    if (sn.sn_pfsgnode) {
+		if (Selinet) {
+		    Lf->sf = SELEXCLF;
+		    return;
+		}
+		if (readgnode((KA_T)sn.sn_pfsgnode, &g)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read pfsgnode (%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)sn.sn_pfsgnode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		if (!g.gn_data || readlino(&g, &i)) {
+		    (void) snpf(Namech, Namechl,
+			"pfsgnode at %s: can't read inode (%s)",
+			print_kptr((KA_T)sn.sn_pfsgnode, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)g.gn_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		ins = 1;
+		if (!g.gn_vnode || readvnode((KA_T)g.gn_vnode, v)) {
+		    (void) snpf(Namech, Namechl,
+			"pfsgnode at %s: can't read vnode (%s)",
+			print_kptr((KA_T)sn.sn_pfsgnode, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)g.gn_vnode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    } else {
+		(void) zeromem((char *)&i, sizeof(i));
+
+#if	AIXV>=4140
+	    /*
+	     * See if this is a clone device, connected to a stream.
+	     *
+	     *     the clone major device number must be known;
+	     *     the specnode must have a devnode pointer;
+	     *     and the devnode must have a stream head pointer.
+	     */
+		if (CloneMaj >= 0
+		&&  sn.sn_devnode
+		&&  kread((KA_T)sn.sn_devnode, (char *)&dn, sizeof(dn)) == 0
+		&&  (ka = (KA_T)dn.dv_pdata))
+		{
+
+# if	defined(HASDCACHE)
+
+process_clone_again:
+
+# endif	/* defined(HASDCACHE) */
+
+		    for (cl = Clone; cl; cl = cl->next) {
+			if (GET_MAJ_DEV(g.gn_rdev) == GET_MIN_DEV(cl->cd.rdev))
+			{
+
+# if	defined(HASDCACHE)
+			    if (DCunsafe && !cl->cd.v && !vfy_dev(&cl->cd))
+				goto process_clone_again;
+# endif	/* defined(HASDCACHE) */
+
+			/*
+			 * Identify this file as a clone.  Save the clone
+			 * device inode number as the file's inode number.
+			 */
+			    ic = 1;
+			    Lf->inode = cl->cd.inode;
+			    Lf->inp_ty = 1;
+			    if (ClonePtc >= 0
+			    &&  GET_MAJ_DEV(g.gn_rdev) == ClonePtc) {
+				if (Selinet) {
+				    Lf->sf = SELEXCLF;
+				    return;
+				}
+			    /*
+			     * If this is a /dev/ptc stream, enter the device
+			     * name and the channel.
+			     */
+			        (void) snpf(Namech, Namechl, "%s/%d",
+				    cl->cd.name, (int)GET_MIN_DEV(g.gn_rdev));
+				break;
+			    }
+			/*
+			 * If this isn't a /dev/ptc stream, collect the names
+			 * of the modules on the stream.  Ignore the stream
+			 * head and look for an "xtiso" module.  Limit the
+			 * module depth to 25.
+			 */
+			    (void) snpf(Namech, Namechl, "STR:%s", cl->cd.name);
+			    nx = (int) strlen(Namech);
+			    if (!kread(ka, (char *)&sh, sizeof(sh)))
+				qp = (KA_T)sh.sth_wq;
+			    else
+				qp = (KA_T)NULL;
+			    for (mn[sizeof(mn) - 1] = '\0', ql = 0;
+				 qp && (ql < 25);
+				 ql++, qp = (KA_T)q.q_next)
+			    {
+
+			    /*
+			     * Read the queue structure.  If it can't be read,
+			     * end module name collection.
+			     *
+			     * The queue structure should lead to a qinfo
+			     * structure, and the qinfo structure should lead
+			     * to a module_info structure, where the module
+			     * name should be found.  If there's no queue
+			     * structure.
+			     *
+			     * If the qinfo or module_info structures can't be
+			     * read, skip to the next queue structure.
+			     */
+				if (kread(qp, (char *)&q, sizeof(q)))
+				    break;
+				if (!(ka = (KA_T)q.q_qinfo)
+				||  kread(ka, (char *)&qi, sizeof(qi)))
+				    continue;
+				if (!(ka = (KA_T)qi.qi_minfo)
+				||  kread(ka, (char *)&mi, sizeof(mi)))
+				    continue;
+				if (!(ka = (KA_T)mi.mi_idname)
+				||  kread(ka, mn, sizeof(mn) - 1)
+				||  !(ml = (int) strlen(mn))
+				||  !strcmp(mn, "sth"))
+				    continue;
+				if (!strcmp(mn, "xtiso")
+				&&  (xp = (KA_T)q.q_ptr)
+				&&  !kread(xp, (char *)&xt, sizeof(xt))
+				&&  (ka = (KA_T)xt.xti_so)) {
+
+				/*
+				 * The xtiso module's private queue pointer
+				 * leads to an xticb with a non-NULL socket
+				 * pointer.  Process the stream as a socket.
+				 */
+				    Namech[0] = '\0';
+				    Lf->inp_ty = 0;
+				    (void) process_socket(ka);
+				    return;
+				}
+			    /*
+			     * Save the module name in Mamech[] as a "->"
+			     * prefixed chain, beginning with "STR:<device>".
+			     */
+				if ((nx + ml + 2) > (Namechl - 1))
+				    continue;
+				(void) snpf(&Namech[nx], Namechl, "->%s", mn);
+				nx += (ml + 2);
+			    }
+			    break;
+			}
+		    }
+		}
+#endif	/* AIXV>=4140 */
+
+		if (Selinet) {
+		    Lf->sf = SELEXCLF;
+		    return;
+		}
+	    }
+	/*
+	 * If it's a FIFO, read its fifonode.
+	 */
+	    if (Ntype == N_FIFO) {
+		if (!sn.sn_fifonode ||readfifonode((KA_T)sn.sn_fifonode, &f)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read fifonode (%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)sn.sn_fifonode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	/*
+	 * Otherwise, read the devnode and its gnode.
+	 */
+	    } else {
+		if (!sn.sn_devnode
+		|| kread((KA_T)sn.sn_devnode,(char *)&dn,sizeof(dn))) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read devnode (%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)sn.sn_devnode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		g = dn.dv_gnode;
+	    }
+	}
+#endif	/* AIXV>=3200 */
+
+/*
+ * Read the AIX virtual file system structure.
+ */
+	if (Ntype != N_AFS && g.gn_rdev == NODEVICE) {
+	    vfs = (struct l_vfs *)NULL;
+	    enter_dev_ch(print_kptr(va, (char *)NULL, 0));
+	} else {
+	    if (!(vfs = readvfs(v))) {
+		(void) snpf(Namech, Namechl, "can't read vfs for %s at %s",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_vfsp, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	}
+/*
+ * Set special node types: NFS, PROC or SANFS.
+ */
+
+#if	defined(MNT_REMOTE)
+	if (vfs && vfs->vmt_flags & MNT_REMOTE) {
+	    switch(vfs->vmt_gfstype) {
+
+# if	defined(HAS_NFS)
+	    case MNT_NFS:
+
+#  if	defined(MNT_NFS3)
+	    case MNT_NFS3:
+#  endif	/* defined(MNT_NFS3) */
+
+#  if	defined(MNT_NFS4)
+	    case MNT_NFS4:
+#  endif	/* defined(MNT_NFS4) */
+
+#  if	defined(HAS_AFS)
+		if (!AFSVfsp || (KA_T)v->v_vfsp != AFSVfsp)
+#  endif	/* defined(HAS_AFS) && defined(HAS_NFS) */
+
+		    Ntype = N_NFS;
+# endif	/* defined(HAS_NFS) */
+		break;
+
+# if	defined(HAS_SANFS) && defined(MNT_SANFS)
+	    case MNT_SANFS:
+		Ntype = N_SANFS;
+		break;
+# endif	/* defined(HAS_SANFS) && defined(MNT_SANFS) */
+
+	    }
+	}
+#endif	/* defined(MNT_REMOTE) */
+
+#if	defined(HASPROCFS)
+	if (vfs && (vfs->vmt_gfstype == MNT_PROCFS))
+	    Ntype = N_PROC;
+#endif	/* defined(HASPROCFS) */
+
+/*
+ * Get the lock status.
+ */
+	Lf->lock = isglocked(&g);
+	switch (Ntype) {
+
+#if	defined(HAS_NFS)
+/*
+ * Read an NFS rnode.
+ */
+	case N_NFS:
+
+# if	AIXA<2
+	    if (width == -1) {
+
+	    /*
+	     * Establish the architecture's bit width and set NFS rnode
+	     * access parameters accordingly.
+	     */
+
+#  if	AIXV<=4330
+		width = 32;
+#  else	/* AIXV>4330 */
+		if (__KERNEL_64()) {
+		    width = 64;
+		    rp = (char *)&r64;
+		    rsz = sizeof(r64);
+		} else if (__KERNEL_32()) {
+		    width = 32;
+		} else {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: unknown kernel bit size\n", Pn);
+		    width = -2;
+		}
+#  endif	/* AIXV<-4330 */
+
+	    }
+# endif	/* AIXA<2 */
+
+	    if (width > 0) {
+		if (!g.gn_data || kread((KA_T)g.gn_data, rp, rsz)) {
+		    (void) snpf(Namech, Namechl,
+			"remote gnode at %s has no rnode",
+			print_kptr((KA_T)v->v_gnode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+
+# if	AIXV<=4330 || AIXA>=2
+		nfs_attr = r.r_attr;
+		nfss = 1;
+# else	/* AIXV>4330 && AIXA<2 */
+		switch (width) {
+		case 32:
+		    nfs_attr = r.r_attr;
+		    nfss = 1;
+		    break;
+		case 64:
+		    nfs_attr = r64.r_attr;
+		    nfss = 1;
+		    break;
+		}
+# endif	/* AIXV<=4330 || AIXA>=2 */
+
+	    }
+	    break;
+#endif	/* defined(HAS_NFS) */
+
+#if	defined(HAS_SANFS)
+/*
+ * Read SANFS node and associated structures.
+ */
+	case N_SANFS:
+	    if (!g.gn_data
+	    ||  kread((KA_T)g.gn_data, &san, sizeof(san))
+	    ) {
+		(void) snpf(Namech, Namechl, "gnode at %s has no SANFS node",
+		    print_kptr((KA_T)v->v_gnode, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * DEBUG: this code is insufficient.  It can't be completed until IBM
+	 * makes the SANFS header files available in /usr/include.  There are
+	 * apparently two node structures following the SANFS node and file
+	 * attributes (size, etc.) are in the second structure.
+	 */
+	    sans = 1;
+	    break;
+#endif	/* defined(HAS_SANFS) */
+
+/*
+ * Read N_REGLR nodes.
+ */
+	case N_REGLR:
+	    if (vfs && vfs->vmt_gfstype == MNT_CDROM) {
+
+	    /*
+	     * Read a CD-ROM cdrnode.
+	     */
+		if (!g.gn_data || readcdrnode((KA_T)g.gn_data, &c)) {
+		    (void) snpf(Namech, Namechl, "gnode at %s has no cdrnode",
+			print_kptr((KA_T)v->v_gnode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		(void) zeromem((char *)&i, sizeof(i));
+		i.number = (INODETYPE)c.cn_inumber;
+		i.size = (off_t)c.cn_size;
+		i.number_def = i.size_def = 1;
+	    /*
+	     * Otherwise, read the inode.
+	     */
+
+	    } else if (g.gn_data) {
+		if (readlino(&g, &i)) {
+		    (void) snpf(Namech, Namechl,
+			"gnode at %s can't read inode: %s",
+			print_kptr((KA_T)v->v_gnode, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)g.gn_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		ins = 1;
+	    }
+
+#if	defined(HAS_AFS)
+	    else {
+
+	    /*
+	     * See if this is an AFS node.
+	     */
+		if (AFSVfsp && (KA_T)v->v_vfsp == AFSVfsp)
+		    Ntype = N_AFS;
+		else if (v->v_vfsp) {
+		    switch (afs) {
+		    case -1:
+			break;
+		    case 0:
+			if (!hasAFS(v)) {
+			    afs = 1;
+			    break;
+			}
+			afs = 1;
+			Ntype = N_AFS;
+			break;
+		    case 1:
+			if ((KA_T)v->v_vfsp == AFSVfsp)
+			    Ntype = N_AFS;
+		     }
+		}
+	    /*
+	     * If this is an AFS node, read the afsnode.
+	     */
+		if (Ntype == N_AFS) {
+		    if (readafsnode(va, v, &an))
+			return;
+		} else {
+		    (void) snpf(Namech, Namechl, "gnode at %s has no inode",
+			print_kptr((KA_T)v->v_gnode, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    }
+#else	/* !defined(HAS_AFS) */
+
+	    else {
+		(void) snpf(Namech, Namechl, "gnode at %s has no inode",
+		    print_kptr((KA_T)v->v_gnode, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+#endif	/* defined(HAS_AFS) */
+
+	}
+/*
+ * Get device and type for printing.
+ */
+
+#if	defined(HAS_NFS)
+	if (Ntype == N_NFS) {
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	} else
+#endif	/* defined(HAS_NFS) */
+
+#if	defined(HAS_AFS)
+	if (Ntype == N_AFS) {
+	    dev = an.dev;
+	    devs = 1;
+	} else
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HASPROCFS)
+	if (Ntype == N_PROC) {
+
+/* WARNING!!!   WARNING!!!   The following hack should be removed ASAP!!! */
+	    dev = vfs ? (vfs->dev & 0x7fffffffffffffff) : 0;
+/* WARNING!!!   WARNING!!!   The above hack should be removed ASAP!!! */
+
+	    devs = 1;
+	}
+	else
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HAS_SANFS)
+	if ((Ntype == N_SANFS) && vfs) {
+	    dev = vfs->dev;
+	    devs = 1;
+	}
+	else
+#endif	/* defined(HAS_SANFS) */
+
+	{
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    rdev = g.gn_rdev;
+	    rdevs = 1;
+	}
+
+#if	AIXV>=3200
+	if (Ntype == N_MPC)
+	    type = VMPC;
+	else
+#endif	/* AIXV>=3200 */
+
+	    type = g.gn_type;
+/*
+ * Obtain the inode number.
+ */
+	switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (an.ino_st) {
+		Lf->inode = (INODETYPE)an.inode;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HAS_NFS)
+	case N_NFS:
+	    if (nfss) {
+		Lf->inode = (INODETYPE)nfs_attr.va_serialno;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_NFS) */
+
+#if	defined(HAS_SANFS)
+	case N_SANFS:
+	    if (sans) {
+	    
+	    /*
+	     * DEBUG: this code is insufficient.  It can't be completed until
+	     * IBM makes the SANFS header files available in /usr/include.
+	     */
+		/* Lf->inode = ???	DEBUG */
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_SANFS) */
+
+# if	AIXV>=3200
+	case N_BLK:
+	case N_CHR:
+	case N_FIFO:
+	case N_MPC:
+# endif	/* AIXV>=3200 */
+
+	case N_REGLR:
+	    if (ins) {
+		Lf->inode = (INODETYPE)i.number;
+		Lf->inp_ty = i.number_def;
+	    }
+	}
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->sz = (SZOFFTYPE)an.size;
+		Lf->sz_def = 1;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+#if	AIXV>=3200
+	    case N_FIFO:
+		Lf->sz = (SZOFFTYPE)f.ff_size;
+		Lf->sz_def = 1;
+		break;
+#endif	/* AIXV>=3200 */
+
+#if	defined(HAS_NFS)
+	    case N_NFS:
+		if (nfss) {
+		    Lf->sz = (SZOFFTYPE)nfs_attr.va_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+#endif	/* defined(HAS_NFS) */
+
+#if	defined(HAS_SANFS)
+	    case N_SANFS:
+		if (sans) {
+
+		/*
+	 	 * DEBUG: this code is insufficient.  It can't be completed
+		 * until IBM makes the SANFS header files available in
+		 * /usr/include.
+		 */
+		    /* Lf->sz = (SZOFFTYPE)???	DEBUG */
+		    Lf->sz_def = 1;
+		}
+		break;
+#endif	/* defined(HAS_SANFS) */
+
+#if	 AIXV>=3200
+	    case N_BLK:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_CHR:
+	    case N_MPC:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+#endif	/* AIXV>=3200 */
+
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    if (ins) {
+			Lf->sz = (SZOFFTYPE)i.size;
+			Lf->sz_def = i.size_def;
+		    }
+		} else if (((type == VBLK) || (type == VCHR) || (type == VMPC))
+		       &&  !Fsize)
+		    Lf->off_def = 1;
+		break;
+	    }
+	}
+/*
+ * Record link count.
+ */
+	if (Fnlink) {
+	    switch(Ntype) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->nlink = an.nlink;
+		Lf->nlink_def = an.nlink_st;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HAS_NFS)
+	    case N_NFS:
+		if (nfss) {
+		    Lf->nlink = (long)nfs_attr.va_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* defined(HAS_NFS) */
+
+#if	defined(HAS_SANFS)
+	    case N_SANFS:
+		if (sans) {
+
+		/*
+	 	 * DEBUG: this code is insufficient.  It can't be completed
+		 * until IBM makes the SANFS header files available in
+		 * /usr/include.
+		 */
+		    /* Lf->nlink = (long)???	DEBUG */
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* defined(HAS_SANFS) */
+
+#if	AIXV>=3200
+	    case N_BLK:
+	    case N_CHR:
+	    case N_FIFO:
+	    case N_MPC:
+#endif	/* AIXV>=3200 */
+
+	    case N_REGLR:
+		if (ins) {
+		    Lf->nlink = (long)i.nlink;
+		    Lf->nlink_def = i.nlink_def;
+		}
+		break;
+	    }
+	    if (Nlink && Lf->nlink_def && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+
+#if	defined(HAS_NFS)
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+#endif	/* defined(HAS_NFS) */
+
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    Lf->fsdir = vfs->dir;
+	    Lf->fsdev = vfs->fsname;
+	}
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type.
+ */
+	switch (type) {
+
+	case VNON:
+	    ty ="VNON";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+	case VREG:
+	case VDIR:
+	    ty = (type == VREG) ? "VREG" : "VDIR";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+#endif
+
+	case VBAD:
+	    ty = "VBAD";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+	case VFIFO:
+	    if (!Lf->dev_ch || Lf->dev_ch[0] == '\0') {
+		Lf->dev = dev;
+		Lf->dev_def = devs;
+		Lf->rdev = rdev;
+		Lf->rdev_def = rdevs;
+	    }
+	    ty = "FIFO";
+	    break;
+	case VMPC:
+	    Lf->rdev = g.gn_rdev;
+	    Lf->rdev_def = 1;
+	    if (vfs) {
+		Lf->dev = vfs->dev;
+		Lf->dev_def = 1;
+	    }
+	    Lf->ch = g.gn_chan;
+
+#if	AIXV<3200
+	    Lf->inp_ty = 0;
+#endif	/* AIXV<3200 */
+
+	    Ntype = N_CHR;
+	    ty = "VMPC";
+	    break;
+	default:
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named(NULL, type, g.gn_chan, ic))
+	    Lf->sf |= SELNM;
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+#if	defined(HASPRIVFILETYPE)
+/*
+ * process_shmt() -- process shared memory transport file
+ */
+
+void
+process_shmt(sa)
+	KA_T sa;			/* shared memory transport node struct
+					 * address ??? */
+{
+	struct shmtnode {		/* shared memory transport node
+					 * struct ??? */
+
+	    struct shmtnode *peer;	/* peer shmtnode struct */
+	    caddr_t d1[2];		/* dummy to fill space */
+	    int sz;			/* buffer size */
+	    caddr_t d2[3];		/* dyummy to fill space */
+	    int free;			/* free bytes in buffer */
+	    caddr_t d3[17];		/* dummy to fill space */
+	    pid_t pid;			/* process ID */
+	} mn, pn;
+/*
+ * Ignore this file if only Internet files are selected.
+ */
+	if (Selinet) {
+	    Lf->sf |= SELEXCLF;
+	    return;
+	}
+/*
+ * Set type to " SMT" and put shmtnode structure address in device column.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), " SMT");
+	if (!sa || kread((KA_T)sa, (char *)&mn, sizeof(mn))) {
+	    (void) snpf(Namech, Namechl, "can't read shmtnode: %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+/*
+ * If offset display has been requested or if buffer size less free bytes is
+ * negative, enable offset display.  Otherwise set the  file size as buffer
+ * size less free bytes.
+ */
+	if (Foffset || mn.free > mn.sz)
+	    Lf->off_def = 1;
+	else {
+	    Lf->sz = (SZOFFTYPE)(mn.sz - mn.free);
+	    Lf->sz_def = 1;
+	}
+/*
+ * If there is a peer, read its shmtnode structure.
+ */
+	if (!mn.peer)
+	    (void) snpf(Namech, Namechl, "->(unknown)");
+	else {
+	    if (kread((KA_T)mn.peer, (char *)&pn, sizeof(pn)))
+		(void) snpf(Namech, Namechl, "can't read peer shmtnode: %s",
+		    print_kptr((KA_T)mn.peer, (char *)NULL, 0));
+	    else {
+		if (pn.pid)
+		    (void) snpf(Namech, Namechl, "->%s (PID %d)",
+			print_kptr((KA_T)mn.peer, (char *)NULL, 0), pn.pid);
+		else
+		    (void) snpf(Namech, Namechl, "->%s",
+			print_kptr((KA_T)mn.peer, (char *)NULL, 0));
+	    }
+	}
+	enter_nm(Namech);
+}
+#endif	/* AIXV>=4200 */
+
+
+/*
+ * readlino() -- read local inode
+ */
+
+int
+readlino(ga, li)
+	struct gnode *ga;			/* gnode address */
+	struct l_ino *li;			/* local inode receiver */
+{
+	struct inode i;				/* "regular" inode */
+
+#if	defined(HAS_JFS2)
+	static struct vnodeops *j2va = (struct vnodeops *)NULL;
+						/* j2_vnops address */
+	static int j2vas = 0;			/* j2nl[] status */
+#endif	/* defined(HAS_JFS2) */
+
+	zeromem((char *)li, sizeof(struct l_ino));
+	if (!ga || !ga->gn_data)
+	    return(0);
+
+#if	defined(HAS_JFS2)
+	if (!j2vas) {
+
+	/*
+	 * Get the j2_vnops address once.
+	 */
+	    struct nlist j2nl[] = {
+		{ "j2_vnops"	},
+		{ (char *)NULL	}
+	    };
+
+	    if (nlist(N_UNIX, j2nl) == 0)
+		j2va = (struct vnodeops *)j2nl[0].n_value;
+	    if (!j2va && !Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't identify jfs2 files\n", Pn);
+	    }
+	    j2vas = 1;
+	}
+/*
+ * If this system has jfs2, see if this gnode's operation structure pointer
+ * references j2_vnops.
+ */
+	if (ga->gn_ops && j2va && (ga->gn_ops == j2va))
+	    return(readj2lino(ga, li));
+#endif	/* defined(HAS_JFS2) */
+
+/*
+ * Read a "standard" inode.
+ */
+	if (readinode((KA_T)ga->gn_data, &i))
+	    return(1);
+	li->dev = i.i_dev;
+	li->nlink = i.i_nlink;
+	li->number = (INODETYPE)i.i_number;
+	li->size = i.i_size;
+	li->dev_def = li->nlink_def = li->number_def = li->size_def = 1;
+	return(0);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dnode1.c
new file mode 100644
index 0000000..e0f781f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dnode1.c
@@ -0,0 +1,313 @@
+/*
+ * dnode1.c - AIX AFS support
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.10 2005/08/08 19:46:38 abe Exp $";
+#endif
+
+
+#if	defined(HAS_AFS)
+#include "lsof.h"
+
+
+/*
+ * This is an emulation of the afs_rwlock_t definition that appears in
+ * the AFS sources in afs/lock.h.
+ */
+
+struct afs_lock {
+
+#  if	HAS_AFS<304
+	unsigned long d1[4];
+#  else	/* HAS_AFS>=304 */
+	unsigned char d1[2];
+	unsigned short d2[3];
+	struct timeval d3;
+	unsigned int d4[3];
+#  endif	/* HAS_AFS<304 */
+
+};
+typedef struct afs_lock afs_lock_t;
+typedef struct afs_lock afs_rwlock_t;
+
+#define	KERNEL
+#include <afs/afs.h>
+#undef	KERNEL
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct volume *getvolume,(struct VenusFid *f, int *vols));
+_PROTOTYPE(static int is_rootFid,(struct vcache *vc, int *rfid));
+
+
+/*
+ * alloc_vcache() - allocate space for vcache structure
+ */
+
+struct vnode *
+alloc_vcache()
+{
+	return((struct vnode *)malloc((MALLOC_S)sizeof(struct vcache)));
+}
+
+
+/*
+ * getvolume() - get volume structure
+ */
+
+static struct volume *
+getvolume(f, vols)
+	struct VenusFid *f;		/* file ID pointer */
+	int *vols;			/* afs_volumes status return */
+{
+	int i;
+	static KA_T ka = 0;
+	KA_T kh;
+	static struct volume v;
+	struct volume *vp;
+	static int w = 0;
+
+	if (!ka) {
+	    if ((ka = (KA_T)AFSnl[X_AFS_VOL].n_value) == (KA_T)0) {
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: no kernel address for: %s\n",
+			Pn, AFSnl[X_AFS_VOL]._n._n_name);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		*vols = 0;
+		return((struct volume *)NULL);
+	    }
+	}
+	*vols = 1;
+	i = (NVOLS - 1) & f->Fid.Volume;
+	kh = (KA_T)((char *)ka + (i * sizeof(struct volume *)));
+	if (kread(kh, (char *)&vp, sizeof(vp)))
+	    return((struct volume *)NULL);
+	while (vp) {
+	    if (kread((KA_T)vp, (char *)&v, sizeof(v)))
+		return((struct volume *)NULL);
+	    if (v.volume == f->Fid.Volume && v.cell == f->Cell)
+		return(&v);
+	    vp = v.next;
+	}
+	return((struct volume *)NULL);
+}
+
+
+/*
+ * hasAFS() - test for AFS presence via vfs structure
+ */
+
+int
+hasAFS(vp)
+	struct vnode *vp;		/* vnode pointer */
+{
+	struct vmount vm;
+	struct vfs v;
+/*
+ * If this vnode has a v_data pointer, then it probably isn't an AFS vnode;
+ * return FALSE.
+ *
+ * If the vfs struct address of /afs is known and this vnode's v_vfsp matches
+ * it, return TRUE.
+ *
+ * Read this vnode's vfs structure and its mount data.  If the gfs type isn't
+ * AFS, return FALSE.  If it is, save the vnode's v_vfsp as AFSVfsp and return
+ * TRUE.
+ */
+	if (AFSVfsp && !vp->v_data && (KA_T)vp->v_vfsp == AFSVfsp)
+	    return(1);
+	if (vp->v_data || !vp->v_vfsp)
+	    return(0);
+	if (kread((KA_T)vp->v_vfsp, (char *)&v, sizeof(v)))
+	    return(0);
+	if (!v.vfs_mdata
+	||  kread((KA_T)v.vfs_mdata, (char *)&vm, sizeof(vm)))
+	    return(0);
+	if (vm.vmt_gfstype != MNT_AFS)
+	    return(0);
+	AFSVfsp = (KA_T)vp->v_vfsp;
+	return(1);
+}
+
+
+/*
+ * is_rootFid() - is the file ID the root file ID
+ *
+ * return: 0	= is not root file ID
+ *	   1	= is root file ID
+ *	   rfid = 0 if root file ID structure address not available
+ *		  1 if root file ID structure address available
+ */
+
+static int
+is_rootFid(vc, rfid)
+	struct vcache *vc;		/* vcache entry */
+	int *rfid;			/* root file ID pointer status return */
+{
+	int err;
+	static int f = 0;		/* rootFID structure status:
+					 *     -1 = unavailable
+					 *	0 = not yet accessed
+					 *	1 = available */
+	static struct VenusFid r;
+	static int w = 0;
+
+	switch (f) {
+	case -1:
+	    if (vc->v.v_flag & V_ROOT) {
+		*rfid = 1;
+		return(1);
+	    }
+	    *rfid = 0;
+	    return(0);
+	case 0:
+	    if (!AFSnl[X_AFS_FID].n_value) {
+		err = 1;
+
+rfid_unavailable:
+
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: %s: %s\n", Pn,
+			err ? "no kernel address" : "can't read from kernel",
+			AFSnl[X_AFS_VOL]._n._n_name);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		f = -1;
+		if (vc->v.v_flag & V_ROOT) {
+		    *rfid = 1;
+		    return(1);
+		}
+		*rfid = 0;
+		return(0);
+	    }
+	    if (kread((KA_T)AFSnl[X_AFS_FID].n_value, (char *)&r, sizeof(r))) {
+		err = 0;
+		goto rfid_unavailable;
+	    }
+	    f = 1;
+	    /* fall through */
+	case 1:
+	    *rfid = 1;
+	    if (vc->fid.Fid.Unique == r.Fid.Unique
+	    &&  vc->fid.Fid.Vnode == r.Fid.Vnode
+	    &&  vc->fid.Fid.Volume == r.Fid.Volume
+	    &&  vc->fid.Cell == r.Cell)
+		return(1);
+	}
+	*rfid = 0;
+	return(0);
+}
+
+
+/*
+ * readafsnode() - read AFS node
+ */
+
+int
+readafsnode(va, v, an)
+	KA_T va;			/* kernel vnode address */
+	struct vnode *v;		/* vnode buffer pointer */
+	struct afsnode *an;		/* afsnode recipient */
+{
+	char *cp, tbuf[32];
+	KA_T ka;
+	int len, rfid, vols;
+	struct vcache *vc;
+	struct volume *vp;
+
+	cp = ((char *)v + sizeof(struct vnode));
+	ka = (KA_T)((char *)va + sizeof(struct vnode));
+	len = sizeof(struct vcache) - sizeof(struct vnode);
+	if (kread(ka, cp, len)) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %s: can't read vcache remainder from %s",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr(ka, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(1);
+	}
+	vc = (struct vcache *)v;
+	an->dev = AFSDEV;
+	an->size = (unsigned long)vc->m.Length;
+	an->nlink = (long)vc->m.LinkCount;
+	an->nlink_st  = 1;
+/*
+ * Manufacture the "inode" number.
+ */
+	if (vc->mvstat == 2) {
+	    if ((vp = getvolume(&vc->fid, &vols))) {
+		an->inode = (INODETYPE)((vp->mtpoint.Fid.Vnode
+			  +		(vp->mtpoint.Fid.Volume << 16))
+			  & 0x7fffffff);
+		if (an->inode == (INODETYPE)0) {
+		    if (is_rootFid(vc, &rfid))
+			an->ino_st = 1;
+		    else if (rfid) {
+			an->inode = (INODETYPE)2;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		} else
+		    an->ino_st = 1;
+	    } else {
+		if (vols) {
+		    an->inode = (INODETYPE)2;
+		    an->ino_st = 1;
+		} else {
+		    if (v->v_flag & V_ROOT) {
+			an->inode = (INODETYPE)0;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		}
+	    }
+	} else {
+	    an->inode = (INODETYPE)((vc->fid.Fid.Vnode
+		      +		    (vc->fid.Fid.Volume << 16))
+		      & 0x7fffffff);
+	    an->ino_st = 1;
+	}
+	return(0);
+}
+#endif	/* defined(HAS_AFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dnode2.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dnode2.c
new file mode 100644
index 0000000..f7a8ce9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dnode2.c
@@ -0,0 +1,81 @@
+/*
+ * dnode2.c - AIX jfs2 support
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2003 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2003 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode2.c,v 1.4 2005/08/08 19:46:38 abe Exp $";
+#endif
+
+
+#if	defined(HAS_JFS2)
+#define	_H_JFS_INO				/* prevent <jfs_ino.h> */
+#define	_H_JFS_INODE				/* prevent <jfs_inode.h> */
+#define	PROTO_H					/* prevent "proto.h" and
+						 * "dproto.h" until struct
+						 * inode is available from
+						 * <j2/j2_inode.h> */
+#define	DPROTO_H
+#include "lsof.h"
+#define	_KERNEL
+#include <j2/j2_inode.h>
+#undef	PROTO_H					/* enable "proto.h" */
+#undef	DPROTO_H				/* enable "dproto.h" */
+#include "proto.h"
+#include "dproto.h"
+
+int
+readj2lino(ga, li)
+	struct gnode *ga;			/* gnode address */
+	struct l_ino *li;			/* local inode receiver */
+{
+	struct inode i;				/* jfs2 inode */
+/*
+ * Read the jfs2 inode and fill in the local inode receiver.
+ *
+ * Note: the caller is responsible for initializing *li to zeroes.
+ */
+	if (!ga
+	||  !ga->gn_data
+	||  kread((KA_T)ga->gn_data, (char *)&i, sizeof(i)))
+	    return(1);
+	li->dev = i.i_dev;
+	li->nlink = i.i_nlink;
+	li->number = (INODETYPE)i.i_number;
+	li->size = i.i_size;
+	li->dev_def = li->nlink_def = li->number_def = li->size_def = 1;
+	return(0);
+} 
+#endif	/* defined(HAS_JFS2) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dproc.c
new file mode 100644
index 0000000..c951717
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dproc.c
@@ -0,0 +1,1481 @@
+/*
+ * dproc.c - AIX process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.26 2008/10/21 16:14:18 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+_PROTOTYPE(static void get_kernel_access,(void));
+
+#if	AIXA<2
+_PROTOTYPE(static struct le *getle,(KA_T a, KA_T sid, char **err));
+#endif	/* AIXA<2 */
+
+#if	AIXV>=4110
+_PROTOTYPE(static void getlenm,(struct le *le, KA_T sid));
+#endif	/* AIXV>=4110 */
+
+_PROTOTYPE(static int kreadx,(KA_T addr, char *buf, int len, KA_T sid));
+
+#if	AIXA<2
+_PROTOTYPE(static void process_text,(KA_T sid));
+#else	/* AIXA>=2 */
+_PROTOTYPE(static void getsoinfo,(void));
+_PROTOTYPE(static void process_text,(pid_t pid));
+#endif	/* AIXA<2 */
+
+#if	defined(SIGDANGER)
+# if	defined(HASINTSIGNAL)
+_PROTOTYPE(static int lowpgsp,(int sig));
+# else	/* !defined(HASINTSIGNAL) */
+_PROTOTYPE(static void lowpgsp,(int sig));
+# endif	/* defined(HASINTSIGNAL) */
+#endif	/* defined(SIGDANGER) */
+
+
+/*
+ * Local definitions
+ */
+
+#if	AIXV<4300
+#define	PROCINFO	procinfo
+#else	/* AIXV>=4300 */
+#define	PROCINFO_INCR	256
+# if	AIXA<1
+#define	FDSINFO		fdsinfo
+#define	GETPROCS	getprocs
+#define	PROCINFO	procsinfo
+# else	/* AIXA>=1 */
+#define	FDSINFO		fdsinfo64
+#define	GETPROCS	getprocs64
+#define	PROCINFO	procentry64
+
+#  if	AIXA>1
+/*
+ * AIX 5 and greater ia64 loader definitions
+ */
+
+#include <sys/ldr.h>
+
+#define	SOHASHBUCKS	128		/* SoHash[] bucket count
+					 * MUST BE A POWER OF 2!!! */
+#define	SOHASH(d, n)	((((int)(((GET_MIN_DEV(d) & 0x7fffffff) * SOHASHBUCKS) \
+			         + n) * 31415) >> 7) & (SOHASHBUCKS - 1))
+
+typedef struct so_hash {
+	dev_t dev;			/* device (st_dev) */
+	int nlink;			/* link count (st_nlink) */
+	char *nm;			/* name (mi_name) */
+	INODETYPE node;			/* node number (st_ino) */
+	struct so_hash *next;		/* next entry in hash bucket */
+	SZOFFTYPE sz;			/* size (st_size) */
+} so_hash_t;
+
+so_hash_t **SoHash = (so_hash_t **)NULL;
+#  endif	/* AIXA>1 */
+# endif	/* AIXA<1 */
+#endif	/* AIXV<4300 */
+
+#define	PROCSIZE	sizeof(struct PROCINFO)
+
+/*
+ * Create the FDSINFOSIZE definition for allocating FDSINFO space.  (This
+ * isn't as straightforward as it might seem, because someone made a bad
+ * decision to change the struct fdsinfo* family at AIX 5.2.)
+ */
+
+#define	FDSINFOSIZE	sizeof(struct FDSINFO)	/* (If we're lucky.) */
+
+#if	defined(OPEN_SHRT_MAX)
+# if	OPEN_SHRT_MAX<OPEN_MAX
+#undef	FDSINFOSIZE				/* (We weren't lucky.) */
+#define	FDSELEMSIZE	(sizeof(struct FDSINFO)/OPEN_SHRT_MAX)
+#define	FDSINFOSIZE	(OPEN_MAX * FDSELEMSIZE)
+# endif	/* OPEN_SHRT_MAX<OPEN_MAX */
+#endif	/* defined(OPEN_SHRT_MAX) */
+
+
+#if	AIXV>=4110
+/*
+ * Loader access definitions for AIX 4.1.1 and above.
+ */
+
+#define	LIBNMLN		40			/* maximum library table name
+						 * length */
+
+#define	LIBMASK		0xf0000000		/* library table mask */
+#define	LIBNMCOMP	0xd0000000		/* library table name has
+						 * multiple components */
+# if	AIXA<1
+#define	RDXMASK		0x0fffffff		/* kreadx() address mask */
+# else	/* AIXA>=1 */
+#define	RDXMASK		0x0fffffffffffffff	/* kreadx() address mask */
+#define	URDXMASK	0x0fffffff00000000	/* upper part of RDXMASK */
+# endif	/* AIXA<1 */
+#endif	/* AIXV>=4110 */
+
+
+/*
+ * Loader structure definitions.  (AIX doesn't supply ld_data.h.)
+ */
+
+struct le {				/* loader entry */
+
+	struct le *next;		/* next entry pointer */
+
+#if	AIXV<4300
+	ushort dummy1;
+	ushort dummy2;
+	uint dummy3;
+	struct file *fp;		/* file table entry pointer */
+
+# if	AIXV>=4110
+	int ft;				/* file type indicator */
+	unsigned dummy4;
+	char *dummy5;
+	unsigned dummy6;
+	char *dummy7[3];
+	char *nm;			/* name */
+# endif	/* AIXV>=4110 */
+#else	/* AIXV>=4300 */
+# if	AIXA<2
+	uint flags;
+	struct file *fp;		/* file table entry pointer */
+	char *nm;			/* name */
+# else	/* AIXA>=2 */
+	KA_T d1[2];
+	KA_T nm;			/* name */
+	KA_T d2[10];
+	struct file *fp;		/* file table entry pointer */
+# endif	/* AIXA<2 */
+#endif	/* AIXV<4300 */
+
+};
+
+
+#if	AIXV>=4300
+/*
+ * The elements of interest from the AIX >= 4.3 loader anchor structure.
+ */
+struct la {			/* loader anchor */
+
+# if	AIXA<2
+    struct le *list;
+    struct le *exec;
+# else	/* AIXA>=2 */
+    KA_T exec;
+    KA_T list;
+# endif	/* AIXA<2 */
+};
+#endif	/* AIXV>=4300 */
+
+
+/*
+ * Local static values
+ */
+
+static int Np = 0;			/* number of processes */
+static struct PROCINFO *P = (struct PROCINFO *)NULL;
+					/* the process table */
+static struct user *Up;			/* user structure */
+
+#if	AIXV>=4110
+# if	AIXA<2
+static KA_T Soff;			/* shared library VM offset */
+int Soff_stat = 0;			/* Soff-available status */
+# endif	/* AIXA<2 */
+static KA_T Uo;				/* user area VM offset */
+#endif	/* AIXV>=4110 */
+
+
+/*
+ * ckkv() - check kernel version
+ */
+
+void
+ckkv(d, er, ev, ea)
+	char *d;			/* dialect */
+	char *er;			/* expected release */
+	char *ev;			/* expected version */
+	char *ea;			/* expected architecture */
+{
+
+#if	defined(HASKERNIDCK)
+# if	AIXV<5000
+
+/*
+ * Use oslevel below AIX 5.
+ */
+	int br, p[2], pid;
+	char buf[128], *cp;
+	struct stat sb;
+
+	if (Fwarn)
+	    return;
+/*
+ * Make sure we can execute OSLEVEL.  If OSLEVEL doesn't exist and the AIX
+ * version is below 4.1, return quietly.
+ */
+
+#define	OSLEVEL		"oslevel"
+#define	OSLEVELPATH	"/usr/bin/oslevel"
+	
+	if (stat(OSLEVELPATH, &sb)) {
+
+#  if	AIXV<4100
+	    if (errno == ENOENT)
+		return;
+#  endif	/* AIXV<4100 */
+
+	    (void) fprintf(stderr, "%s: can't execute %s: %s\n",
+		Pn, OSLEVELPATH, strerror(errno));
+	    Exit(1);
+	}
+	if ((sb.st_mode & (S_IROTH | S_IXOTH)) != (S_IROTH | S_IXOTH)) {
+	    (void) fprintf(stderr, "%s: can't execute %s, modes: %o\n",
+		Pn, OSLEVELPATH, sb.st_mode);
+	    Exit(1);
+	}
+/*
+ * Open a pipe for receiving the version number from OSLEVEL.  Fork a
+ * child to run OSLEVEL.  Retrieve the OSLEVEL output.
+ */
+	if (pipe(p)) {
+	    (void) fprintf(stderr, "%s: can't create pipe to: %s\n",
+		Pn, OSLEVELPATH);
+	    Exit(1);
+	}
+	if ((pid = fork()) == 0) {
+	    (void) close(1);
+	    (void) close(2);
+	    (void) close(p[0]);
+	    dup2(p[1], 1);
+	    dup2(p[1], 2);
+	    (void) close(p[1]);
+	    execl(OSLEVELPATH, OSLEVEL, NULL);
+	    _exit(0);
+	}
+	if (pid < 0) {
+	    (void) fprintf(stderr, "%s: can't fork a child for %s: %s\n",
+		Pn, OSLEVELPATH, strerror(errno));
+	    Exit(1);
+	}
+	(void) close(p[1]);
+	br = read(p[0], buf, sizeof(buf) - 1);
+	(void) close(p[0]);
+	(void) wait(NULL);
+/*
+ * Warn if the actual and expected versions don't match.
+ */
+	if (br > 0) {
+	    buf[br] = '\0';
+	    if ((cp = strrchr(buf, '\n')))
+		*cp = '\0';
+	} else
+	    (void) snpf(buf, sizeof(buf), "UNKNOWN");
+# else	/* AIXV>=5000 */
+
+/*
+ * Use uname() for AIX 5 and above.
+ */
+	char buf[64];
+	struct utsname u;
+
+	(void) memset((void *)&u, 0, sizeof(u));
+	(void) uname(&u);
+	(void) snpf(buf, sizeof(buf) - 1, "%s.%s.0.0", u.version, u.release);
+	buf[sizeof(buf) - 1] = '\0';
+# endif	/* AIXV<5000 */
+	if (!ev || strcmp(buf, ev))
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s version %s; this is %s.\n",
+		Pn, d, ev ? ev : "UNKNOWN", buf);
+#endif	/* defined(HASKERNIDCK) */
+
+}
+
+
+/*
+ * gather_proc_info() - gather process information
+ */
+
+void
+gather_proc_info()
+{
+	short cckreg;			/* conditional status of regular file
+					 * checking:
+					 *     0 = unconditionally check
+					 *     1 = conditionally check */
+	short ckscko;			/* socket file only checking status:
+					 *     0 = none
+					 *     1 = check only socket files,
+					 *	   including TCP and UDP
+					 *	   streams with eXPORT data,
+					 *	   where supported */
+	KA_T cdir, fp, pdir, rdir;
+	char *cmd;
+	int hl, i, nf, np;
+	struct PROCINFO *p;
+	short pss, sf;
+	struct user us;
+
+#if	AIXV>=4300
+	static struct FDSINFO *fds = (struct FDSINFO *)NULL;
+	MALLOC_S msz;
+# if	AIXA==1
+	pid32_t pid;		/* Since we're operating with types defined
+				 * under _KERNEL (see machine.), but
+				 * getprocs64() expects application types
+				 * (where pid_t is 32 bits), the pid variable
+				 * must be cast in an application-compatible
+				 * manner.
+				 */
+# else	/* AIXA!=1 */
+	pid_t pid;
+# endif	/* AIXA==1 */
+# if	AIXV==4330
+	static int trx = 0;
+	unsigned int mxof;
+	static int uo = 0;
+# endif	/* AIXV==4330 */
+#endif	/* AIXV>=4300 */
+
+/*
+ * Define socket and regular file conditional processing flags.
+ *
+ * If only socket files have been selected, or socket files have been
+ * selected, ANDed with other selection options, enable the skipping of
+ * regular files.
+ *
+ * If socket files and some process options have been selected, enable
+ * conditional skipping of regular file; i.e., regular files will be skipped
+ * unless they belong to a process selected by one of the specified options.
+ */
+	if (Selflags & SELNW) {
+
+	/*
+	 * Some network files selection options have been specified.
+	 */
+	    if (Fand || !(Selflags & ~SELNW)) {
+
+	    /*
+	     * Selection ANDing or only network file options have been
+	     * specified, so set unconditional skipping of regular files
+	     * and socket file only checking.
+	     */
+		cckreg = 0;
+		ckscko = 1;
+	    } else {
+
+	    /*
+	     * If ORed file selection options have been specified, or no
+	     * ORed process selection options have been specified, enable
+	     * unconditional file checking and clear socket file only
+	     * checking.
+	     *
+	     * If only ORed process selection options have been specified,
+	     * enable conditional file skipping and socket file only checking.
+	     */
+		if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+		    cckreg = ckscko = 0;
+		else
+		    cckreg = ckscko = 1;
+	    }
+	} else {
+
+	/*
+	 * No network file selection options were specified.  Enable
+	 * unconditional file checking and clear socket file only checking.
+	 */
+	    cckreg = ckscko = 0;
+	}
+/*
+ * Read the process table.
+ */
+
+#if	AIXV<4300
+	if (!P) {
+	    if (!(P = (struct PROCINFO *)malloc((MALLOC_S)PROCSIZE))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for 1 proc\n", Pn);
+		Exit(1);
+	    }
+	    Np = 1;
+	}
+	while (((np = getproc(P, Np, PROCSIZE)) == -1) && errno == ENOSPC) {
+	    Np = P->p_pid + 10;
+	    if (!(P = (struct PROCINFO *)realloc((MALLOC_P *)P,
+					 (size_t)(Np * PROCSIZE))))
+	    {
+		(void) fprintf(stderr, "%s: no space for %d procinfo's\n",
+		    Pn, Np);
+		Exit(1);
+	    }
+	}
+#else	/* AIXV>=4300 */
+	if (!P) {
+	    msz = (MALLOC_S)(PROCSIZE * PROCINFO_INCR);
+	    if (!(P = (struct PROCINFO *)malloc(msz))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for %d procs\n",
+		    Pn, PROCINFO_INCR);
+		Exit(1);
+	    }
+	    Np = PROCINFO_INCR;
+	}
+	np = pid = 0;
+	p = P;
+	while ((i = GETPROCS(p, PROCSIZE, (struct FDSINFO *)NULL, 0, &pid,
+			     PROCINFO_INCR))
+	== PROCINFO_INCR) {
+	    np += PROCINFO_INCR;
+	    if (np >= Np) {
+	        msz = (MALLOC_S)(PROCSIZE * (Np + PROCINFO_INCR));
+		if (!(P = (struct PROCINFO *)realloc((MALLOC_P *)P, msz))) {
+		    (void) fprintf(stderr,
+			"%s: no more space for proc storage\n", Pn);
+		    Exit(1);
+		}
+		Np += PROCINFO_INCR;
+	    }
+	    p = (struct PROCINFO *)((char *)P + (np * PROCSIZE));
+	}
+	if (i > 0)
+	    np += i;
+#endif	/* AIXV<4300 */
+
+/*
+ * Loop through processes.
+ */
+	for (p = P, Up = &us; np > 0; np--, p++) {
+	    if (p->p_stat == 0 || p->p_stat == SZOMB)
+		continue;
+	    if (is_proc_excl(p->p_pid, (int)p->p_pgid, (UID_ARG)p->p_uid,
+			     &pss, &sf))
+		continue;
+
+#if	AIXV<4300
+	/*
+	 * Get user structure for AIX < 4.3.
+	 *
+	 * If AIX version is below 4.1.1, use getuser().
+	 *
+	 * If AIX version is 4.1.1 or above: if readx() is disabled (no -X
+	 * option, use  getuser(); if readx() is enabled (-X), use readx().
+	 */
+
+# if	AIXV>=4110
+	    if (Fxopt
+	    &&  kreadx(Uo, (char *)Up, U_SIZE, (KA_T)p->pi_adspace) == 0)
+		i = 1;
+	    else
+		i = 0;
+	    if (i == 0) {
+		if (getuser(p, PROCSIZE, Up, U_SIZE) != 0)
+		    continue;
+	    }
+	    hl = i;
+# else	/* AIXV<4110 */
+	    if (getuser(p, PROCSIZE, Up, U_SIZE) != 0)
+		continue;
+	    hl = 1;
+# endif	/* AIXV>=4110 */
+	/*
+	 * Save directory vnode addresses, command name address, and open file
+	 * count from user structure.
+	 *
+	 * Skip processes excluded by the user structure command name.
+	 */
+	    cdir = (KA_T)Up->u_cdir;
+
+# if	AIXV<4100
+	    pdir = (KA_T)Up->u_pdir;
+# endif	/* AIXV<4100 */
+
+	    rdir = (KA_T)Up->u_rdir;
+	    cmd = Up->u_comm;
+	    nf = Up->u_maxofile;
+	    if (is_cmd_excl(cmd, &pss, &sf))
+		continue;
+	    if (cckreg) {
+
+	    /*
+	     * If conditional checking of regular files is enabled, enable
+	     * socket file only checking, based on the process' selection
+	     * status.
+	     */
+		ckscko = (sf & SELPROC) ? 0 : 1;
+	    }
+	    
+#else	/* AIXV>=4300 */
+	/*
+	 * For AIX 4.3 and above, skip processes excluded by the procsinfo
+	 * command name.  Use getprocs() to get the file descriptors for
+	 * included processes.
+	 *
+	 * If readx is enabled (-X), use it to get the loader_anchor structure.
+	 */
+	    if (is_cmd_excl(p->pi_comm, &pss, &sf))
+		continue;
+	    if (cckreg) {
+
+	    /*
+	     * If conditional checking of regular files is enabled, enable
+	     * socket file only checking, based on the process' selection
+	     * status.
+	     */
+		ckscko = (sf & SELPROC) ? 0 : 1;
+	    }
+	    if (!fds) {
+		if (!(fds = (struct FDSINFO *)malloc((MALLOC_S)FDSINFOSIZE)))
+		{
+		    (void) fprintf(stderr,
+			"%s: can't allocate fdsinfo struct for PID %d\n",
+			Pn, pid);
+		    Exit(1);
+		}
+	    }
+	    pid = p->p_pid;
+	    if (GETPROCS((struct PROCINFO *)NULL, PROCSIZE, fds, FDSINFOSIZE,
+			  &pid, 1)
+	    != 1)
+		continue;
+	    hl = 0;
+
+# if	AIXV==4330
+	/*
+	 * Handle readx() for AIX 4.3.3 specially, because 4.3.3 was released
+	 * with two different user struct definitions in <sys/user.h> and
+	 * their form affects using readx() to get the loader table pointers
+	 * from U_loader of the user structure (when -X is specified).
+	 */
+	    if (Fxopt) {
+		for (;;) {
+
+		/*
+		 * Read the AIX 4.3.3 U_loader pointers.
+		 */
+		    if (kreadx((KA_T)((char *)Uo
+				      + offsetof(struct user, U_loader) + uo),
+			       (char *)&Up->U_loader, sizeof(struct la),
+			       (KA_T)p->pi_adspace))
+			break;
+		    if (trx) {
+			hl = 1;
+			break;
+		    }
+		/*
+		 * Until the correct size of the U_loader offset in lo has been
+		 * established, read U_maxofile and match it to pi_maxofile
+		 * from the PROCINFO structure.  Try the offsets 0, 48, and
+		 * -48.  Note: these offsets are heuristic attempts to adjust
+		 * to differences in the user struct as observed on two systems
+		 * whose <sys/user.h> header files differed.  U_maxofile 
+		 * follows U_loader by the same number of elements in both
+		 * user structs, so the U_loader offset should be the same as
+		 * the U_maxofile offset.
+		 */
+		    if (!kreadx((KA_T)((char *)Uo
+				      + offsetof(struct user,U_maxofile) + uo),
+			        (char *)&mxof, sizeof(mxof),
+				(KA_T)p->pi_adspace)
+		    && (mxof == p->pi_maxofile))
+		    {
+			hl = trx = 1;
+			break;
+		    }
+		    if (uo == 0)
+			uo = 48;
+		    else if (uo == 48)
+			uo = -48;
+		    else {
+			Fxopt = hl = 0;
+			trx = 1;
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"%s: WARNING: user struct mismatch;", Pn);
+			    (void) fprintf(stderr, " -X option disabled.\n");
+			}
+			break;
+		    }
+		}
+	    }
+# else	/* AIXV!=4330 */
+	    if (Fxopt
+	    &&  kreadx((KA_T)((char *)Uo + offsetof(struct user, U_loader)),
+		       (char *)&Up->U_loader, sizeof(struct la),
+		       (KA_T)p->pi_adspace)
+	    == 0)
+		hl = 1;
+# endif	/* AIXV==4330 */
+
+	/*
+	 * Save directory vnode addresses, command name, and open file count
+	 * from procinfo structure.
+	 */
+	    cdir = (KA_T)p->pi_cdir;
+	    pdir = (KA_T)NULL;
+	    rdir = (KA_T)p->pi_rdir;
+	    cmd = p->pi_comm;
+	    nf = p->pi_maxofile;
+#endif	/* AIXV<4300 */
+
+	/*
+	 * Allocate a local process structure and start filling it.
+	 */
+	    alloc_lproc(p->p_pid, (int)p->p_pgid, (int)p->p_ppid,
+		(UID_ARG)p->p_uid, cmd, (int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (!ckscko && cdir) {
+		alloc_lfile(CWD, -1);
+		process_node(cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (!ckscko && rdir) {
+		alloc_lfile(RTD, -1);
+		process_node(rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+
+#if	AIXV<4100
+	/*
+	 * Save parent directory information.
+	 */
+	    if (!ckscko && pdir) {
+		alloc_lfile("  pd", -1);
+		process_node(pdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+#endif	/* AIXV<4100 */
+
+	/*
+	 * Save information on text files.
+	 */
+	    if (!ckscko && hl) {
+
+#if	AIXA<2
+# if	AIXA<1
+		process_text((KA_T)p->pi_adspace);
+# else	/* AIXA==1 */
+		{
+		    int ck = 1;
+		    KA_T sid = (KA_T)p->pi_adspace;
+
+		    if ((Up->U_loader[0] & URDXMASK)
+		    ||  (Up->U_loader[1] & URDXMASK))
+		    {
+
+		    /*
+		     * If the upper part of either loader map address is
+		     * non-zero and this is not the lsof process, skip the
+		     * processing of text files.  If this is the lsof process,
+		     * set the segment address to zero, forcing text file
+		     * information to come from kmem rather than mem.
+		     */
+			if (Mypid == p->p_pid)
+			    sid = (KA_T)0;
+			else
+			    ck = 0;
+		    }
+		    if (ck)
+			process_text(sid);
+		}
+# endif	/* AIXA<1 */
+#else	/* AIXA>=2 */
+		process_text(p->p_pid);
+#endif	/* AIXA<2 */
+
+	    }
+	/*
+	 * Save information on file descriptors.
+	 */
+	    for (i = 0; i < nf; i++) {
+
+#if	AIXV<4300
+		fp = (KA_T)Up->u_ufd[i].fp;
+#else	/* AIXV>=4300 */
+		fp = (KA_T)fds->pi_ufd[i].fp;
+#endif	/* AIXV<4300 */
+
+		if (fp) {
+		    alloc_lfile((char *)NULL, i);
+		    process_file(fp);
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG)
+
+# if	AIXV<4300
+			    Lf->pof = (long)(Up->u_ufd[i].flags & 0x7f);
+#else	/* AIXV>=4300 */
+			    Lf->pof = (long)(fds->pi_ufd[i].flags & 0x7f);
+#endif	/* AIXV<4300 */
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+	int oe = 0;
+
+#if	defined(AIX_KERNBITS)
+	int kb;
+	char *kbb, *kbr;
+/*
+ * Check the kernel bit size against the size for which this executable was
+ * configured.
+ */
+	if (__KERNEL_32()) {
+	    kb = 32;
+	    kbr = "32";
+	} else if (__KERNEL_64()) {
+	    kb = 64;
+	    kbr = "64";
+	} else {
+	    kb = 0;
+	    kbr = "unknown";
+	}
+	if ((AIX_KERNBITS == 0) || !kb || (kb != AIX_KERNBITS)) {
+	    if (AIX_KERNBITS == 32)
+		kbb = "32";
+	    else if (AIX_KERNBITS == 64)
+		kbb = "64";
+	    else
+		kbb = "unknown";
+	    (void) fprintf(stderr,
+		"%s: FATAL: compiled for a kernel of %s bit size.\n", Pn, kbb);
+	    (void) fprintf(stderr,
+		"      The bit size of this kernel is %s.\n", kbr);
+	    Exit(1);
+	}
+#endif	/* defined(AIX_KERNBITS) */
+
+/*
+ * Access /dev/mem.
+ */
+	if ((Km = open("/dev/mem", O_RDONLY, 0)) < 0) {
+	    (void) fprintf(stderr, "%s: can't open /dev/mem: %s\n",
+		Pn, strerror(errno));
+	    oe++;
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Access kernel memory file.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0) {
+	    (void) fprintf(stderr, "%s: can't open %s: %s\n", Pn,
+		Memory ? Memory : KMEM, strerror(errno));
+	    oe++;
+	}
+	if (oe)
+	    Exit(1);
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Get kernel symbols.
+ */
+	if (knlist(Nl, X_NL_NUM, sizeof(struct nlist)) || !Nl[X_UADDR].n_value)
+	{
+	    (void) fprintf(stderr, "%s: can't get kernel's %s address\n",
+		Pn, Nl[X_UADDR].n_name);
+	    Exit(1);
+	}
+
+#if	defined(HAS_AFS)
+	(void) knlist(AFSnl, X_AFSNL_NUM, sizeof(struct nlist));
+#endif	/* defined(HAS_AFS) */
+
+#if	AIXV>=4110
+/*
+ * Get user area and shared library VM offsets for AIX 4.1.1 and above.
+ */
+	if (Fxopt) {
+	    struct ublock *ub;
+
+# if	AIXA<2
+	    struct nlist ll[] = {
+		{ "library_anchor"	},
+
+#  if	AIXV>=4330
+		{ "library_le_handle"	},
+#  else	/* AIXV<4330 */
+		{ "library_data_handle"	},
+#  endif	/* AIXV>=4330 */
+
+		{ (char *)NULL		}
+	    };
+
+	    if (nlist(N_UNIX, ll) == 0
+	    &&  ll[0].n_value != (long)0 && ll[1].n_value != (long)0
+	    &&  kreadx((KA_T)(ll[1].n_value & RDXMASK), (char *)&Soff,
+			sizeof(Soff), (KA_T)0)
+	    == 0)
+		Soff_stat++;
+# endif	/* AIXA<2 */
+
+	    ub = (struct ublock *)Nl[X_UADDR].n_value;
+	    Uo = (KA_T)((KA_T)&ub->ub_user & RDXMASK);
+	}
+#endif	/* AIXV>=4110 */
+
+/*
+ * Check the kernel version number.
+ */
+	(void) ckkv("AIX", (char *)NULL, LSOF_VSTR, (char *)NULL);
+
+#if	defined(SIGDANGER)
+/*
+ * If SIGDANGER is defined, enable its handler.
+ */
+	(void) signal(SIGDANGER, lowpgsp);
+#endif	/* defined(SIGDANGER) */
+
+}
+
+
+#if	AIXA<2
+/*
+ * getle() - get loader entry structure
+ */
+
+static struct le *
+getle(a, sid, err)
+	KA_T a;				/* loader entry kernel address */
+	KA_T sid;			/* user structure segment ID */
+	char **err;			/* error message (if return is NULL) */
+{
+	static struct le le;
+
+#if	AIXV<4110
+	if (a < Nl[X_UADDR].n_value) {
+	    *err = "address too small";
+	    return((struct le *)NULL);
+	}
+	if (((char *)a + sizeof(le)) <= ((char *)Nl[X_UADDR].n_value + U_SIZE))
+	    return((struct le *)((char *)Up + a - Nl[X_UADDR].n_value));
+#endif	/* AIXV<4110 */
+
+	if (!Fxopt) {
+	    *err = "readx() disabled for Stale Segment ID bug (see -X)";
+	    return((struct le *)NULL);
+	}
+
+#if	AIXV>=4110
+	if (!sid) {
+	    if (!kread(a, (char *)&le, sizeof(le)))
+		return(&le);
+	} else {
+	    if (!kreadx((KA_T)(a & RDXMASK),(char *)&le,sizeof(le),(KA_T)sid))
+		return(&le);
+	}
+#else	/* AIXV<4110 */
+	if (!kreadx((KA_T)a, (char *)&le, sizeof(le), (KA_T)sid))
+	    return(&le);
+#endif	/* AIXV>=4110 */
+
+getle_err:
+
+	*err = "can't readx()";
+	return((struct le *)NULL);
+}
+#endif	/* AIXA<2 */
+
+
+#if	AIXV>=4110
+/*
+ * getlenm() - get loader entry file name for AIX >= 4.1.1
+ */
+
+static void
+getlenm(le, sid)
+	struct le *le;			/* loader entry structure */
+	KA_T sid;			/* segment ID */
+{
+	char buf[LIBNMLN];
+	int i;
+
+# if	AIXV<4300
+	if ((le->ft & LIBMASK) != LIBNMCOMP)
+	    return;
+#else	/* AIXV>=4300 */
+# if	AIXA<2
+	if (!sid) {
+	     if (kread((KA_T)le->nm, buf, LIBNMLN))
+		return;
+	} else {
+	    if (!Soff_stat || !le->nm
+	    ||  kreadx((KA_T)le->nm & (KA_T)RDXMASK, buf, LIBNMLN, (KA_T)Soff))
+		return;
+	}
+	buf[LIBNMLN - 1] = '\0';
+	i = strlen(buf);
+	if (i < (LIBNMLN - 3) && buf[i+1])
+	    enter_nm(&buf[i+1]);
+	else if (buf[0])
+	    enter_nm(buf);
+# else	/* AIXA>=2 */
+	if (!le->nm || kread(le->nm, buf, sizeof(buf)))
+	    return;
+	buf[LIBNMLN - 1] = '\0';
+	if (!strlen(buf))
+	    return;
+	enter_nm(buf);
+# endif	/* AIXA<2 */
+#endif	/* AIXV<4300 */
+
+}
+#endif	/* AIXV>=4110 */
+
+
+#if	AIXA>1
+/*
+ * getsoinfo() - get *.so information for ia64 AIX >= 5
+ */
+
+static void
+getsoinfo()
+{
+	char buf[65536];
+	uint bufsz = (uint) sizeof(buf);
+	int ct, h;
+	char *ln = (char *)NULL;
+	char *rn = (char *)NULL;
+	LDR_Mod_info_t *lp;
+	struct stat sb;
+	so_hash_t *sp;
+/*
+ * See if loader information is needed.  Warn if this process has insufficient
+ * permission to acquire it from all processes.
+ */
+	if (!Fxopt)
+	    return;
+	if ((Myuid != 0) && !Setuidroot && !Fwarn) {
+	    (void) fprintf(stderr,
+		"%s: WARNING: insufficient permission to access all", Pn);
+	    (void) fprintf(stderr, " /%s/object sub-\n", HASPROCFS);
+	    (void) fprintf(stderr,
+		    "      directories; some loader information may", Pn);
+	    (void) fprintf(stderr, " be unavailable.\n");
+	}
+/*
+ * Get the loader module table.  Allocate hash space for it.
+ */
+	if ((ct = ldr_get_modules(SOL_GLOBAL, (void *)buf, &bufsz)) < 1)
+	    return;
+	if (!(SoHash = (so_hash_t **)calloc((MALLOC_S)SOHASHBUCKS,
+					    sizeof(so_hash_t *))))
+	{
+	    (void) fprintf(stderr, "%s: no space for *.so hash buckets\n", Pn);
+	    Exit(1);
+	}
+/*
+ * Cache the loader module information, complete with stat(2) results.
+ */
+	for (lp = (LDR_Mod_info_t *)buf; ct; ct--, lp++) {
+
+	/*
+	 * Release previous name space allocations.
+	 */
+	    if (ln) {
+		(void) free((MALLOC_P *)ln);
+		ln = (char *)NULL;
+	    }
+	    if (rn) {
+		(void) free((MALLOC_P *)rn);
+		rn = (char *)NULL;
+	    }
+	/*
+	 * Make a copy of the loader module name.
+	 */
+	    if (!(rn = mkstrcpy(lp->mi_name, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr, "%s: no space for name: %s\n", Pn,
+		    lp->mi_name);
+		Exit(1);
+	    }
+	/*
+	 * Resolve symbolic links.
+	 */
+	    ln = Readlink(rn);
+	    if (ln == rn)
+		rn = (char *)NULL;
+	/*
+	 * Get stat(2) information.
+	 */
+	    if (statsafely(ln, &sb)) {
+		if (!Fwarn)
+		    (void) fprintf(stderr, "%s: WARNING: can't stat: %s\n",
+			Pn, ln);
+		    continue;
+	    }
+	/*
+	 * Allocate and fill a loader information hash structure.
+	 */
+	    if (!(sp = (so_hash_t *)malloc((MALLOC_S)sizeof(so_hash_t)))) {
+		(void) fprintf(stderr, "%s: no space for *.so hash entry: %s\n",
+		    Pn, ln);
+		Exit(1);
+	    }
+	    sp->dev = sb.st_dev;
+	    sp->nlink = (int)sb.st_nlink;
+	    sp->nm = ln;
+	    ln = (char *)NULL;
+	    sp->node = (INODETYPE)sb.st_ino;
+	    sp->sz = (SZOFFTYPE)sb.st_size;
+	/*
+	 * Link the structure to the appropriate hash bucket.
+	 */
+	    h = SOHASH(sb.st_dev, (INODETYPE)sb.st_ino);
+	    if (SoHash[h])
+		sp->next = SoHash[h];
+	    else
+		sp->next = (so_hash_t *)NULL;
+	    SoHash[h] = sp;
+	}
+/*
+ * Free any unused name space that was allocated.
+ */
+	if (ln)
+	    (void) free((MALLOC_P *)ln);
+	if (rn)
+	    (void) free((MALLOC_P *)rn);
+}
+#endif	/* AIXA>1 */
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+
+#if	AIXA>1
+	(void) getsoinfo();
+#endif	/* AIXA>1 */
+
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+#if	AIXV<4200
+	if (lseek(Kd, (off_t)addr, L_SET) == (off_t)-1)
+#else	/* AIXV>=4200 */
+	if (lseek64(Kd, (off64_t)addr, L_SET) == (off64_t)-1)
+#endif	/* AIXV<4200 */
+
+	    return(1);
+	br = read(Kd, buf, len);
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * kreadx() - read kernel segmented memory
+ */
+
+int
+kreadx(addr, buf, len, sid)
+	KA_T addr;			/* kernel address */
+	char *buf;			/* destination buffer */
+	int len;			/* length */
+	KA_T sid;			/* segment ID */
+{
+	int br;
+
+#if	AIXV<4200
+	if (lseek(Km, addr, L_SET) == (off_t)-1)
+#else	/* AIXV>=4200 */
+	if (lseek64(Km, (off64_t)addr, L_SET) == (off64_t)-1)
+#endif	/* AIXV<4200 */
+
+	    return(1);
+	br = readx(Km, buf, len, sid);
+	return (br == len ? 0 : 1);
+}
+
+
+#if	defined(SIGDANGER)
+/*
+ * lowpgsp() - hangle a SIGDANGER signal about low paging space
+*/
+
+# if	defined(HASINTSIGNAL)
+static int
+# else	/* !defined(HASINTSIGNAL) */
+static void
+# endif	/* defined(HASINTSIGNAL) */
+
+lowpgsp(sig)
+	int sig;
+{
+	(void) fprintf(stderr, "%s: FATAL: system paging space is low.\n", Pn);
+	Exit(1);
+}
+#endif	/* defined(SIGDANGER) */
+
+
+#if	AIXA<2
+/*
+ * process_text() - process text file information for non-ia64 AIX
+ */
+
+static void
+process_text(sid)
+	KA_T sid;			/* user area segment ID */
+{
+	char *err, fd[8];
+	static struct file **f = (struct file **)NULL;
+	int i, j, n;
+	struct le *le;
+	KA_T ll;
+	MALLOC_S msz;
+	static MALLOC_S nf = 0;
+	struct file *xf = (struct file *)NULL;
+
+#if	AIXV>=4300
+	struct la *la = (struct la *)&Up->U_loader;
+#endif	/* AIXV>=4300 */
+
+/*
+ * Display information on the exec'd entry.
+ */
+
+#if	AIXV<4300
+	if ((ll = (KA_T)Up->u_loader[1]))
+#else	/* AIXV>=4300 */
+	if ((ll = (KA_T)la->exec))
+#endif	/* AIXV<4300 */
+
+	{
+	    alloc_lfile(" txt", -1);
+	    if ((le = getle(ll, sid, &err))) {
+		if ((xf = le->fp)) {
+		    process_file((KA_T)xf);
+		    if (Lf->sf) {
+
+#if	AIXV>=4110 && AIXV<4300
+			if (!Lf->nm || !Lf->nm[0])
+			    getlenm(le, sid);
+#endif	/* AIXV>=4110 && AIXV<4300 */
+
+			link_lfile();
+		    }
+		}
+	    } else {
+		(void) snpf(Namech, Namechl, "text entry at %s: %s",
+		    print_kptr((KA_T)ll, (char *)NULL, 0), err);
+		enter_nm(Namech);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	}
+/*
+ * Display the loader list.
+ */
+	for (i = n = 0,
+
+#if	AIXV<4300
+	     ll = (KA_T)Up->u_loader[0];
+#else	/* AIXV>=4300 */
+	     ll = (KA_T)la->list;
+#endif	/* AIXV<4300 */
+
+	     ll;
+	     ll = (KA_T)le->next)
+	{
+	    (void) snpf(fd, sizeof(fd), " L%02d", i);
+	    alloc_lfile(fd, -1);
+	    if (!(le = getle(ll, sid, &err))) {
+		(void) snpf(Namech, Namechl, "loader entry at %s: %s",
+		    print_kptr((KA_T)ll, (char *)NULL, 0), err);
+		enter_nm(Namech);
+		if (Lf->sf)
+		    link_lfile();
+		return;
+	    }
+	/*
+	 * Skip entries with no file pointers, the exec'd file, and entries
+	 * that have already been processed.
+	 */
+	    if (!le->fp || (le->fp == xf))
+		continue;
+	    for (j = 0; j < n; j++) {
+		if (f[j] == le->fp)
+		    break;
+	    }
+	    if (j < n)
+		continue;
+	    if (n >= nf) {
+
+	    /*
+	     * Allocate file structure address cache space.
+	     */
+		nf += 10;
+		msz = (MALLOC_S)(nf * sizeof(struct file *));
+		if (f)
+		    f = (struct file **)realloc((MALLOC_P *)f, msz);
+		else
+		    f = (struct file **)malloc(msz);
+		if (!f) {
+		    (void) fprintf(stderr,
+			"%s: no space for text file pointers\n", Pn);
+		    Exit(1);
+		}
+	    }
+	    f[n++] = le->fp;
+	/*
+	 * Save the loader entry.
+	 */
+	    process_file((KA_T)le->fp);
+	    if (Lf->sf) {
+
+#if	AIXV>=4110
+		if (!Lf->nm || !Lf->nm[0])
+		    getlenm(le, sid);
+#endif	/* AIXV>=4110 */
+
+		link_lfile();
+		i++;
+	    }
+	}
+}
+#else	/* AIXA>=2 */
+/*
+ * process_text() - process text file information for ia64 AIX >= 5
+ */
+
+static void
+process_text(pid)
+	pid_t pid;			/* process PID */
+{
+	char buf[MAXPATHLEN+1], fd[8], *nm, *pp;
+	size_t bufl = sizeof(buf);
+	DIR *dfp;
+	struct dirent *dp;
+	int i;
+	struct la *la = (struct la *)&Up->U_loader;
+	struct le le;
+	struct lfile *lf;
+	struct stat sb;
+	so_hash_t *sp;
+	size_t sz;
+	dev_t xdev;
+	INODETYPE xnode;
+	int xs = 0;
+/*
+ * Display information on the exec'd entry.
+ */
+	if (la->exec && !kread((KA_T)la->exec, (char *)&le, sizeof(le))
+	&&  le.fp) {
+	    alloc_lfile(" txt", -1);
+	    process_file((KA_T)le.fp);
+	    if (Lf->dev_def && (Lf->inp_ty == 1)) {
+		xdev = Lf->dev;
+		xnode = Lf->inode;
+		xs = 1;
+	    }
+	    if (Lf->sf) {
+		if (!Lf->nm || !Lf->nm[0])
+		    getlenm(&le, (KA_T)0);
+		link_lfile();
+	    }
+	}
+/*
+ * Collect devices and names for the entries in /HASPROCFS/PID/object -- the
+ * AIX 5 loader list equivalent.  When things fail in this processing -- most
+ * likely for insufficient permissions -- be silent; a warning was issued by
+ * getsoinfo().
+ */
+	(void) snpf(buf, bufl, "/%s/%ld/object", HASPROCFS, (long)pid);
+	if (!(dfp = opendir(buf)))
+	    return;
+	if ((sz = strlen(buf)) >= bufl)
+	   return;
+	buf[sz++] = '/';
+	pp = &buf[sz];
+	sz = bufl - sz;
+/*
+ * Read the entries in the /HASPROCFS/PID/object subdirectory.
+ */
+	for (dp = readdir(dfp), i = 0; dp; dp = readdir(dfp)) {
+
+	/*
+	 * Skip '.', "..", entries with no node number, and entries whose
+	 * names are too long.
+	 */
+	    if (!dp->d_ino || (dp->d_name[0] == '.'))
+		continue;
+	    if ((dp->d_namlen + 1) >= sz)
+		continue;
+	    (void) strncpy(pp, dp->d_name, dp->d_namlen);
+	    pp[dp->d_namlen] = '\0';
+	/*
+	 * Get stat(2) information.
+	 */
+	    if (statsafely(buf, &sb))
+		continue;
+	/*
+	 * Ignore the exec'd and non-regular files.
+	 */
+	    if (xs && (xdev == sb.st_dev) && (xnode == (INODETYPE)sb.st_ino))
+		continue;
+	    if (!S_ISREG(sb.st_mode))
+		continue;
+	/*
+	 * Allocate space for a file entry.  Set its basic characteristics.
+	 */
+	    (void) snpf(fd, sizeof(fd), "L%02d", i++);
+	    alloc_lfile(fd, -1);
+	    Lf->dev_def = Lf->inp_ty = Lf->nlink_def = Lf->sz_def = 1;
+	    Lf->dev = sb.st_dev;
+	    Lf->inode = (INODETYPE)sb.st_ino;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "VREG");
+	/*
+	 * Look for a match on device and node numbers in the *.so cache.
+	 */
+	    for (sp = SoHash[SOHASH(sb.st_dev, (INODETYPE)sb.st_ino)];
+		 sp;
+		 sp = sp->next)
+	    {
+		if ((sp->dev == sb.st_dev)
+		&&  (sp->node == (INODETYPE)sb.st_ino))
+		{
+
+		/*
+		 * A match was found; use its name, link count, and size.
+		 */
+		    nm = sp->nm;
+		    Lf->nlink = sp->nlink;
+		    Lf->sz = sp->sz;
+		    break;
+		}
+	    }
+	    if (!sp) {
+
+	    /*
+	     * No match was found; use the /HASPROCFS/object name, its link
+	     * count, and its size.
+	     */
+		nm = pp;
+		Lf->nlink_def = sb.st_nlink;
+		Lf->sz = sb.st_size;
+	    }
+	/*
+	 * Do selection tests: NFS; link count; file name; and file system.
+	 */
+
+# if	defined(HAS_NFS)
+	    if (Fnfs && (GET_MIN_DEV(Lf->dev_def) & SDEV_REMOTE))
+		Lf->sf |= SELNFS;
+# endif	/* defined(HAS_NFS) */
+
+	    if (Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	    if (Sfile && is_file_named(NULL, VREG, 0, 0))
+		Lf->sf |= SELNM;
+	    if (Lf->sf) {
+
+	    /*
+	     * If the file was selected, enter its name and link it to the
+	     * other files of the process.
+	     */
+		enter_nm(nm);
+		link_lfile();
+	    }
+	}
+	(void) closedir(dfp);
+}
+#endif	/* AIXA<2 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/aix/dproto.h
new file mode 100644
index 0000000..a844342
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dproto.h
@@ -0,0 +1,68 @@
+/*
+ * dproto.h - AIX function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.4 2004/03/10 23:49:13 abe Exp $
+ */
+
+
+#if	!defined(DPROTO_H)
+#define	DPROTO_H
+
+# if     defined(HAS_AFS)
+_PROTOTYPE(extern struct vnode *alloc_vcache,(void));
+_PROTOTYPE(extern int hasAFS,(struct vnode *vp));
+_PROTOTYPE(extern int readafsnode,(KA_T va, struct vnode *v, struct afsnode *an));
+# endif  /* defined(HAS_AFS) */
+
+# if	defined(HAS_JFS2)
+_PROTOTYPE(extern int readj2lino,(struct gnode *ga, struct l_ino *li));
+# endif	/* defined(HAS_JFS2) */
+
+_PROTOTYPE(extern int getchan,(char *p));
+_PROTOTYPE(extern int is_file_named,(char *p, enum vtype ty, chan_t ch, int ic));
+_PROTOTYPE(extern char isglocked,(struct gnode *ga));
+_PROTOTYPE(extern int readlino,(struct gnode *ga, struct l_ino *li));
+_PROTOTYPE(extern struct l_vfs *readvfs,(struct vnode *vn));
+
+# if	AIXV>=4200
+_PROTOTYPE(extern void process_shmt,(KA_T sa));
+# endif	/* AIV>=4200 */
+
+# if	defined(HASDCACHE) && AIXV>=4140
+_PROTOTYPE(extern void clr_sect,(void));
+_PROTOTYPE(extern int rw_clone_sect,(int m));
+# endif	/* defined(HASDCACHE) && AIXV>=4140 */
+
+#endif	/* !defined(DPROTO_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dsock.c
new file mode 100644
index 0000000..bd1756d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dsock.c
@@ -0,0 +1,443 @@
+/*
+ * dsock.c - AIX socket processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.24 2008/10/21 16:14:18 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * We include <sys/domain.h> here instead of "dlsof.h" for gcc's benefit.
+ * Its loader can't handle the multiple CONST u_char arrays declared in
+ * <net/net_globals.h> -- e.g., etherbroadcastaddr[].  (<sys/domain.h>
+ * #include's <net/net_globals.h>.)
+ */
+
+#include <net/netopt.h>
+#include <sys/domain.h>
+
+
+/*
+ * process_socket() - process socket file
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	struct domain d;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam;
+	int fp, lp, uo;
+	struct gnode g;
+	struct l_ino i;
+	struct inpcb inp;
+	int is = 0;
+	unsigned char *la = (unsigned char *)NULL;
+	struct protosw p;
+	struct socket s;
+	struct tcpcb t;
+	int ts = 0;
+	int tsn, tsnx;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = (struct sockaddr_un *)NULL;
+	struct sockaddr_un un;
+	struct vnode v;
+	struct mbuf mb;
+/*
+ * Set socket file variables.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read socket and protocol switch structures.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread(sa, (char *) &s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket struct from %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_type) {
+	    enter_nm("no socket type");
+	    return;
+	}
+	if (!s.so_proto
+	||  kread((KA_T)s.so_proto, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "can't read protocol switch from %s",
+		print_kptr((KA_T)s.so_proto, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Save size information.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rq = s.so_rcv.sb_cc;
+	Lf->lts.sq = s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.ltm = (unsigned int)s.so_linger;
+	Lf->lts.opt = (unsigned int)s.so_options;
+	Lf->lts.pqlen = (unsigned int)s.so_q0len;
+	Lf->lts.qlen = (unsigned int)s.so_qlen;
+	Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+	Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = (unsigned int)s.so_state;
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	if (!p.pr_domain
+	||  kread((KA_T)p.pr_domain, (char *)&d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	switch ((fam = d.dom_family)) {
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+
+#if	defined(HASIPv6)
+	case AF_INET6:
+#endif	/* defined(HASIPv6) */
+
+	/*
+	 * Read protocol control block.
+	 */
+	    if (!s.so_pcb
+	    ||  kread((KA_T) s.so_pcb, (char *) &inp, sizeof(inp))) {
+		if (!s.so_pcb) {
+		    (void) snpf(Namech, Namechl, "no PCB%s%s",
+			(s.so_state & SS_CANTSENDMORE) ? ", CANTSENDMORE" : "",
+			(s.so_state & SS_CANTRCVMORE)  ? ", CANTRCVMORE"  : "");
+		} else {
+		    (void) snpf(Namech, Namechl, "can't read inpcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		}
+		enter_nm(Namech);
+		return;
+	    }
+	    if (p.pr_protocol == IPPROTO_TCP) {
+
+	    /*
+	     * If this is a TCP socket, read its control block.
+	     */
+		if (inp.inp_ppcb
+	        &&  !kread((KA_T)inp.inp_ppcb, (char *)&t, sizeof(t)))
+		{
+		    ts = 1;
+		    tsn = (int)t.t_state;
+		    tsnx = tsn + TcpStOff;
+		}
+	    }
+	    if (ts
+	    &&  (TcpStIn || TcpStXn)
+	    &&  (tsnx >= 0) && (tsnx < TcpNstates)
+	    ) {
+
+	    /*
+	     * Check TCP state name inclusion and exclusions.
+	     */
+		if (TcpStXn) {
+		    if (TcpStX[tsnx]) {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+		if (TcpStIn) {
+		    if (TcpStI[tsnx])
+			TcpStI[tsnx] = 2;
+		    else {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    if (Fnet) {
+
+	    /*
+	     * Set SELNET flag for the file, as requested.
+	     */
+		if (!FnetTy
+		||  ((FnetTy == 4) && (fam == AF_INET))
+
+#if	defined(HASIPv6)
+		||  ((FnetTy == 6) && (fam == AF_INET6))
+#endif	/* defined(HASIPv6) */
+		)
+
+		    Lf->sf |= SELNET;
+	    }
+	    printiproto(p.pr_protocol);
+
+#if	defined(HASIPv6)
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+			fam == AF_INET ? "IPv4" : "IPv6");
+#else	/* !defined(HASIPv6) */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+	/*
+	 * Save Internet socket information.
+	 */
+	    enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
+							: s.so_pcb),
+				    (char *)NULL, 0));
+
+#if	defined(HASIPv6)
+	/*
+	 * If this is an IPv6 (AF_INET6) socket and IPv4 compatibility
+	 * mode is enabled, use the IPv4 address, change the family
+	 * indicator from AF_INET6 to AF_INET.  Otherwise, use the IPv6
+	 * address.  Don't ignore empty addresses.
+	 */
+	    if (fam == AF_INET6) {
+		if (inp.inp_flags & INP_COMPATV4) {
+		    fam = AF_INET;
+		    la = (unsigned char *)&inp.inp_laddr;
+		} else
+		    la = (unsigned char *)&inp.inp_laddr6;
+	    } else
+#endif	/* defined(HASIPv6) */
+
+		la = (unsigned char *)&inp.inp_laddr;
+	    lp = (int)ntohs(inp.inp_lport);
+	    if (fam == AF_INET
+	    &&  (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport != 0)) {
+		fa =  (unsigned char *)&inp.inp_faddr;
+		fp = (int)ntohs(inp.inp_fport);
+	    }
+
+#if	defined(HASIPv6)
+	    else if (fam == AF_INET6) {
+
+	    /*
+	     * If this is an IPv6 (AF_INET6) socket and IPv4 compatibility
+	     * mode is enabled, use the IPv4 address, change the family
+	     * indicator from AF_INET6 to AF_INET.  Otherwise, use the IPv6
+	     * address.  Ignore empty addresses.
+	     */
+		if (inp.inp_flags & INP_COMPATV4) {
+		    fam = AF_INET;
+		    if (inp.inp_faddr.s_addr != INADDR_ANY
+		    || inp.inp_fport != 0)
+		    {
+			fa = (unsigned char *)&inp.inp_faddr;
+			fp = (int)ntohs(inp.inp_fport);
+		    }
+		} else {
+		    if (!IN6_IS_ADDR_UNSPECIFIED(&inp.inp_faddr6)) {
+			fa = (unsigned char *)&inp.inp_faddr6;
+			fp = (int)ntohs(inp.inp_fport);
+		    }
+		}
+	    }
+#endif	/* defined(HASIPv6) */
+
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, fam);
+	    if (ts) {
+		Lf->lts.type = 0;
+		Lf->lts.state.i = tsn;
+
+#if	defined(HASSOOPT)
+		Lf->lts.kai = (unsigned int)t.t_timer[TCPT_KEEP];
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+		Lf->lts.mss = (unsigned long)t.t_maxseg;
+		Lf->lts.msss = (unsigned char)1;
+		Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	    }
+	    break;
+/*
+ * Process a ROUTE domain socket.
+ */
+	case AF_ROUTE:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "rte");
+	    if (s.so_pcb)
+		enter_dev_ch(print_kptr((KA_T)(s.so_pcb), (char *)NULL, 0));
+	    else
+		(void) snpf(Namech, Namechl, "no protocol control block");
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    break;
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    if (kread((KA_T) s.so_pcb, (char *)&unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+	    if (unp.unp_addr) {
+		if (kread((KA_T) unp.unp_addr, (char *)&mb, sizeof(mb))) {
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+
+#if	AIXV>=3200
+		uo = (int)(mb.m_hdr.mh_data - (caddr_t)unp.unp_addr);
+		if ((uo + sizeof(struct sockaddr)) <= sizeof(mb))
+		    ua = (struct sockaddr_un *)((char *)&mb + uo);
+		else {
+		    if (mb.m_hdr.mh_data
+		    &&  !kread((KA_T)mb.m_hdr.mh_data, (char *)&un, sizeof(un))
+		    ) {
+			ua = &un;
+		    }
+		}
+#else	/* AIXV<3200 */
+		ua = (struct sockaddr_un *)(((char *)&mb) + mb.m_off);
+#endif	/* AIXV>=3200 */
+
+	    }
+	    if (!ua) {
+		ua = &un;
+		(void) bzero((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *)&uc, sizeof(uc)))
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			else
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)uc.unp_socket,(char *)NULL,0));
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	/*
+	 * Read any associated vnode and then read its gnode and inode.
+	 */
+	    g.gn_type = VSOCK;
+	    if (unp.unp_vnode
+	    &&  !readvnode((KA_T)unp.unp_vnode, &v)) {
+		if (v.v_gnode
+		&&  !readgnode((KA_T)v.v_gnode, &g)) {
+		    Lf->lock = isglocked(&g);
+		    if (g.gn_type == VSOCK && g.gn_data
+		    && !readlino(&g, &i))
+			is = 1;
+		}
+	    }
+	/*
+	 * Print Unix socket information.
+	 */
+	    if (is) {
+		Lf->dev = i.dev;
+		Lf->dev_def = i.dev_def;
+		if (Lf->dev_ch) {
+		    (void) free((FREE_P *)Lf->dev_ch);
+		    Lf->dev_ch = (char *)NULL;
+		}
+		Lf->inode = (INODETYPE)i.number;
+		Lf->inp_ty = i.number_def;
+	    }
+	    if (ua->sun_path[0]) {
+		if (mb.m_len > sizeof(struct sockaddr_un))
+		    mb.m_len = sizeof(struct sockaddr_un);
+		*((char *)ua + mb.m_len - 1) = '\0';
+		if (Sfile && is_file_named(ua->sun_path, VSOCK, 0, 0))
+		    Lf->sf |= SELNM;
+		if (!Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/aix/dstore.c
new file mode 100644
index 0000000..c4e3ed9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/dstore.c
@@ -0,0 +1,405 @@
+/*
+ * dstore.c - AIX global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.12 2004/12/30 18:40:59 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Global storage definitions
+ */
+
+#if	defined(HAS_AFS)
+struct nlist AFSnl[] = {
+	{ "afs_rootFid",	0, 0, 0, 0, 0 },
+	{ "afs_volumes",	0, 0, 0, 0, 0 },
+};
+
+# if    defined(HASAOPT)
+char *AFSApath = (char *)NULL;		/* alternate AFS name list path
+					 * (from -a) */
+# endif /* defined(HASAOPT) */
+
+KA_T AFSVfsp = (KA_T)NULL;		/* AFS vfs struct kernel address */
+#endif	/* defined(HAS_AFS) */
+
+# if	AIXV>=4140
+struct clone *Clone = (struct clone *)NULL;
+					/* local clone information */
+int CloneMaj = -1;			/* clone major device number */
+int ClonePtc = -1;			/* /dev/ptc minor device number */
+# endif	/* AIXV>=4140 */
+
+int Kd = -1;				/* /dev/kmem file descriptor */
+struct l_vfs *Lvfs = NULL;		/* local vfs structure table */
+int Km = -1;				/* /dev/mem file descriptor */
+
+struct nlist Nl[] = {
+
+#if	AIXV<4100
+	{ "u",			 0, 0, 0, 0, 0 },
+#else	/* AIXV>=4100 */
+	{ "__ublock",		 0, 0, 0, 0, 0 },
+#endif	/* AIXV<4100 */
+
+};
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+
+# if	defined(FREAD)
+	{ (long)FREAD,		FF_READ		},
+# else	/* !defined(FREAD) */
+#  if	defined(_FREAD)
+	{ (long)_FREAD,		FF_READ		},
+#  endif	/* defined(_FREAD) */
+# endif	/* defined(FREAD) */
+
+# if	defined(FWRITE)
+	{ (long)FWRITE,		FF_WRITE	},
+# else	/* !defined(FWRITE) */
+#  if	defined(_FWRITE)
+	{ (long)_FWRITE,	FF_WRITE	},
+#  endif	/* defined(_FWRITE) */
+# endif	/* defined(FWRITE) */
+
+# if	defined(FNONBLOCK)
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+# else	/* !defined(FNONBLOCK) */
+#  if	defined(_FNONBLOCK)
+	{ (long)_FNONBLOCK,	FF_NBLOCK	},
+#  endif	/* defined(_FNONBLOCK) */
+# endif	/* defined(FNONBLOCK) */
+
+# if	defined(FAPPEND)
+	{ (long)FAPPEND,	FF_APPEND	},
+# else	/* !defined(FAPPEND) */
+#  if	defined(_FAPPEND)
+	{ (long)_FAPPEND,	FF_APPEND	},
+#  endif	/* defined(_FAPPEND) */
+# endif	/* defined(FAPPEND) */
+
+# if	defined(FSYNC)
+	{ (long)FSYNC,		FF_SYNC		},
+# else	/* !defined(FSYNC) */
+#  if	defined(_FSYNC)
+	{ (long)_FSYNC,		FF_SYNC		},
+#  endif	/* defined(_FSYNC) */
+# endif	/* defined(FSYNC) */
+
+# if	defined(FEXEC)
+	{ (long)FEXEC,		FF_EXEC		},
+# else	/* !defined(FEXEC) */
+#  if	defined(_FEXEC)
+	{ (long)_FEXEC,		FF_EXEC		},
+#  endif	/* defined(_FEXEC) */
+# endif	/* defined(FEXEC) */
+
+# if	defined(FCREAT)
+	{ (long)FCREAT,		FF_CREAT	},
+# else	/* !defined(FCREAT) */
+#  if	defined(_FCREAT)
+	{ (long)_FCREAT,	FF_CREAT	},
+#  endif	/* defined(_FCREAT) */
+# endif	/* defined(FCREAT) */
+
+# if	defined(FTRUNC)
+	{ (long)FTRUNC,		FF_TRUNC	},
+# else	/* !defined(FTRUNC) */
+#  if	defined(_FTRUNC)
+	{ (long)_FTRUNC,	FF_TRUNC	},
+#  endif	/* defined(_FTRUNC) */
+# endif	/* defined(FTRUNC) */
+
+# if	defined(FEXCL)
+	{ (long)FEXCL,		FF_EXCL		},
+# else	/* !defined(FEXCL) */
+#  if	defined(_FEXCL)
+	{ (long)_EXCL,		FF_EXCL		},
+#  endif	/* defined(_FEXCL) */
+# endif	/* defined(FEXCL) */
+
+# if	defined(FNOCTTY)
+	{ (long)FNOCTTY,	FF_NOCTTY	},
+# else	/* !defined(FNOCTTY) */
+#  if	defined(_FNOCTTY)
+	{ (long)_FNOCTTY,	FF_NOCTTY	},
+#  endif	/* defined(_FNOCTTY) */
+# endif	/* defined(FNOCTTY) */
+
+# if	defined(FRSHARE)
+	{ (long)FRSHARE,	FF_RSHARE	},
+# else	/* !defined(FRSHARE) */
+#  if	defined(_FRSHARE)
+	{ (long)_FRSHARE,	FF_RSHARE	},
+#  endif	/* defined(_FRSHARE) */
+# endif	/* defined(FRSHARE) */
+
+# if	defined(FDEFER)
+	{ (long)FDEFER,		FF_DEFER	},
+# else	/* !defined(FDEFER) */
+#  if	defined(_FDEFER)
+	{ (long)_FDEFER,	FF_DEFER	},
+#  endif	/* defined(_FDEFER) */
+# endif	/* defined(FDEFER) */
+
+# if	defined(FDELAY)
+	{ (long)FDELAY,		FF_DELAY	},
+# else	/* !defined(FDELAY) */
+#  if	defined(_FDELAY)
+	{ (long)_FDELAY,	FF_DELAY	},
+#  endif	/* defined(_FDELAY) */
+# endif	/* defined(FDELAY) */
+
+# if	defined(FNDELAY)
+	{ (long)FNDELAY,	FF_NDELAY	},
+# else	/* !defined(FNDELAY) */
+#  if	defined(_FNDELAY)
+	{ (long)_FNDELAY,	FF_NDELAY	},
+#  endif	/* defined(_FNDELAY) */
+# endif	/* defined(FNDELAY) */
+
+# if	defined(FNSHARE)
+	{ (long)FNSHARE,	FF_NSHARE	},
+# else	/* !defined(FNSHARE) */
+#  if	defined(_FNSHARE)
+	{ (long)_FNSHARE,	FF_NSHARE	},
+#  endif	/* defined(_FNSHARE) */
+# endif	/* defined(FNSHARE) */
+
+# if	defined(FASYNC)
+	{ (long)FASYNC,		FF_ASYNC	},
+# else	/* !defined(FASYNC) */
+#  if	defined(_FASYNC)
+	{ (long)_FASYNC,	FF_ASYNC	},
+#  endif	/* defined(_FASYNC) */
+# endif	/* defined(FASYNC) */
+
+# if	defined(FAIO)
+	{ (long)FAIO,		FF_AIO		},
+# else	/* !defined(FAIO) */
+#  if	defined(_FAIO)
+	{ (long)_FAIO,		FF_AIO		},
+#  endif	/* defined(_FAIO) */
+# endif	/* defined(FAIO) */
+
+# if	defined(FCIO)
+	{ (long)FCIO,		FF_CIO		},
+# else	/* !defined(FCIO) */
+#  if	defined(_FCIO)
+	{ (long)_FCIO,		FF_CIO		},
+#  endif	/* defined(_FCIO) */
+# endif	/* defined(FCIO) */
+
+# if	defined(FMOUNT)
+	{ (long)FMOUNT,		FF_MOUNT	},
+# else	/* !defined(FMOUNT) */
+#  if	defined(_FMOUNT)
+	{ (long)_FMOUNT,	FF_MOUNT	},
+#  endif	/* defined(_FMOUNT) */
+# endif	/* defined(FMOUNT) */
+
+# if	defined(FSYNCALL)
+	{ (long)FSYNCALL,	FF_SYNC		},
+# else	/* !defined(FSYNCALL) */
+#  if	defined(_FSYNCALL)
+	{ (long)_FSYNCALL,	FF_SYNC		},
+#  endif	/* defined(_FSYNCALL) */
+# endif	/* defined(FSYNCALL) */
+
+# if	defined(FNOCACHE)
+	{ (long)FNOCACHE,	FF_NOCACHE	},
+# else	/* defined(FNOCACHE) */
+#  if	defined(_FNOCACHE)
+	{ (long)_FNOCACHE,	FF_NOCACHE	},
+#  endif	/* defined(_FNOCACHE) */
+# endif	/* defined(FNOCACHE) */
+
+# if	defined(FREADSYNC)
+	{ (long)FREADSYNC,	FF_RSYNC	},
+# else	/* !defined(FREADSYNC) */
+#  if	defined(_FREADSYNC)
+	{ (long)_FREADSYNC,	FF_RSYNC	},
+#  endif	/* defined(_FREADSYNC) */
+# endif	/* defined(FREADSYNC) */
+
+# if	defined(FDATASYNC)
+	{ (long)FDATASYNC,	FF_DSYNC	},
+# else	/* !defined(FDATASYNC) */
+#  if	defined(_FDATASYNC)
+	{ (long)_FDATASYNC,	FF_DSYNC	},
+#  endif	/* defined(_FDATASYNC) */
+# endif	/* defined(FDATASYNC) */
+
+# if	defined(FDEFERIND)
+	{ (long)FDEFERIND,	FF_DEFERIND	},
+# else	/* !defined(FDEFERIND) */
+#  if	defined(_FDEFERIND)
+	{ (long)_FDEFERIND,	FF_DEFERIND	},
+#  endif	/* defined(_FDEFERIND) */
+# endif	/* defined(FDEFERIND) */
+
+# if	defined(FDATAFLUSH)
+	{ (long)FDATAFLUSH,	FF_DATAFLUSH	},
+# else	/* !defined(FDATAFLUSH) */
+#  if	defined(_FDATAFLUSH)
+	{ (long)_FDATAFLUSH,	FF_DATAFLUSH	},
+#  endif	/* defined(_FDATAFLUSH) */
+# endif	/* defined(FDATAFLUSH) */
+
+# if	defined(FCLREAD)
+	{ (long)FCLREAD,	FF_CLREAD	},
+# else	/* !defined(FCLREAD) */
+#  if	defined(_FCLREAD)
+	{ (long)_FCLREAD,	FF_CLREAD	},
+#  endif	/* defined(_FCLREAD) */
+# endif	/* defined(FCLREAD) */
+
+# if	defined(FLARGEFILE)
+	{ (long)FLARGEFILE,	FF_LARGEFILE	},
+# else	/* !defined(FLARGEFILE) */
+#  if	defined(_FLARGEFILE)
+	{ (long)_FLARGEFILE,	FF_LARGEFILE	},
+#  endif	/* defined(_FLARGEFILE) */
+# endif	/* defined(FLARGEFILE) */
+
+# if	defined(FDIRECT)
+	{ (long)FDIRECT,	FF_DIRECT	},
+# else	/* !defined(FDIRECT) */
+#  if	defined(_FDIRECT)
+	{ (long)_FDIRECT,	FF_DIRECT	},
+#  endif	/* defined(_FDIRECT) */
+# endif	/* defined(FDIRECT) */
+
+# if	defined(FSNAPSHOT)
+	{ (long)FSNAPSHOT,	FF_SNAP		},
+# else	/* !defined(FSNAPSHOT) */
+#  if	defined(_FSNAPSHOT)
+	{ (long)_FSNAPSHOT,	FF_SNAP		},
+#  endif	/* defined(_FSNAPSHOT) */
+# endif	/* defined(FAIO) */
+
+# if	defined(FDOCLONE)
+	{ (long)FDOCLONE,	FF_DOCLONE	},
+# else	/* !defined(FDOCLONE) */
+#  if	defined(_FDOCLONE)
+	{ (long)_FDOCLONE,	FF_DOCLONE	},
+#  endif	/* defined(_FDOCLONE) */
+# endif	/* defined(FDOCLONE) */
+
+# if	defined(FKERNEL)
+	{ (long)FKERNEL,	FF_KERNEL	},
+# else	/* !defined(FKERNEL) */
+#  if	defined(_FKERNEL)
+	{ (long)_FKERNEL,	FF_KERNEL	},
+#  endif	/* defined(_FKERNEL) */
+# endif	/* defined(FKERNEL) */
+
+# if	defined(FMSYNC)
+	{ (long)FMSYNC,		FF_MSYNC	},
+# else	/* !defined(FMSYNC) */
+#  if	defined(_FMSYNC)
+	{ (long)_FMSYNC,	FF_MSYNC	},
+#  endif	/* defined(_FMSYNC) */
+# endif	/* defined(FMSYNC) */
+
+# if	defined(GCFDEFER)
+	{ (long)GCFDEFER,	FF_GCFDEFER	},
+# endif	/* defined(GCFDEFER) */
+
+# if	defined(GCFMARK)
+	{ (long)GCFMARK,	FF_GCFMARK	},
+# endif	/* defined(GCFMARK) */
+
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,	POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+# if	defined(UF_FDLOCK)
+	{ (long)UF_FDLOCK,	POF_FDLOCK	},
+# endif	/* defined(UF_FDLOCK) */
+
+# if	defined(UF_AUD_READ)
+	{ (long)UF_AUD_READ,	POF_BNRD	},
+# endif	/* defined(UF_AUD_READ) */
+
+# if	defined(UF_AUD_WRITE)
+	{ (long)UF_AUD_WRITE,	POF_BNWR	},
+# endif	/* defined(UF_AUD_WRITE) */
+
+# if	defined(UF_FSHMAT)
+	{ (long)UF_FSHMAT,	POF_FSHMAT	},
+# endif	/* defined(UF_FSHMAT) */
+
+# if	defined(UF_CLOSING)
+	{ (long)UF_CLOSING,	POF_CLOSING	},
+# endif	/* defined(UF_CLOSING) */
+
+# if	defined(UF_ALLOCATED)
+	{ (long)UF_ALLOCATED,	POF_ALLOCATED	},
+# endif	/* defined(UF_ALLOCATED) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
+
+#if	AIXV>=4110
+struct ublock __ublock;			/* dummy so we can define _KERNEL
+					 * for <sys/user.h> */
+
+# if	AIXA>2
+void aix_dstore_dummy_function() {}		/* for ia64 idebug */
+# endif	/* AIXA>2 */
+#endif	/* AIXV>=4110 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/aix/machine.h b/lsof_4.85/lsof_4.85_src/dialects/aix/machine.h
new file mode 100644
index 0000000..d8f4a46
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/aix/machine.h
@@ -0,0 +1,691 @@
+/*
+ * machine.h - AIX definitions 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: machine.h,v 1.43 2010/07/29 16:02:44 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+# if	AIXV<=3250
+/*
+ * The AIX 3.2.5 and below <netdb.h> requires that _SUN be defined to
+ * be able to get the rpcent structure definition.
+ */
+
+#define	_SUN
+#include <netdb.h>
+#undef	_SUN
+# endif	/* AIXV<=3250 */
+
+
+# if	AIXV>=4200
+/*
+ * AIX 4.2 requires that <sys/mstsave.h> be #include'd early.  It needs
+ * <sys/types.h> and _KERNEL.
+ *
+ * AIX 4.3 requires that _KERNEL be defined before the #include of
+ * <sys/types.h>
+ *
+ * For gcc's sake, some redefinitions after including <sys/types.h> insure
+ * the off64_t and offset_t types are aligned on an 8 byte boundary.
+ */
+ 
+#  if	AIXV>=4300
+#define	_KERNEL	1
+#  endif	/* AIXV>=4300 */
+
+#include <sys/types.h>
+
+#   if	AIXA>0
+#include <sys/resource.h>
+#   endif	/* AIXA>0 */
+
+# if	defined(__GNUC__)
+typedef	long long	aligned_off64_t __attribute__ ((aligned (8)));
+typedef	long long	aligned_offset_t  __attribute__ ((aligned (8)));
+#define	off64_t		aligned_off64_t
+#define	offset_t	aligned_offset_t
+# endif	/* defined(__GNUC__) */
+
+#  if	AIXV<4300
+#define	_KERNEL	1
+#  endif	/* AIXV<4300 */
+
+#include <sys/mstsave.h>
+#undef	_KERNEL
+# endif	/* AIXV>=4200 */
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+# if	AIXV>=4200
+#define	CAN_USE_CLNT_CREATE	1
+# endif	/* AIXV>=4200 */
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+#define	HASCDRNODE	1
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+# if	AIXV>=3200
+#define	HASFIFONODE	1
+# endif	/* AIXV>=3200 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+/* #define	HASFSINO	1 */
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+#define	HASGNODE	1
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+#define	HASINODE	1
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+/* #define	HASKOPT	1 */
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+/* #define	HASNCACHE	1	*/
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.  (AIX lsof doesn't use nlist, it uses knlist.)
+ */
+
+/* #define	HASNLIST	1 */
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+#define	HASPRINTDEV	print_dev
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+# if	AIXV>=4140
+#define	HASPRIVFILETYPE	process_shmt
+#define	PRIVFILETYPE	15
+# endif	/* AIXV>=4140 */
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+# if	AIXA<1
+/* #define	HASPROCFS	"proc?" */
+/* #define	HASFSTYPE	1 */
+/* #define	HASPINODEN	1 */
+# else	/* AIXA>=1 */
+#define	HASPROCFS	"proc"
+#define	HASFSTYPE	2
+#define	HASPINODEN	1
+# endif	/* AIXA<1 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ *
+ * Note: while AIX has rnodes, they are processed privately, so this
+ *	 definition should be disabled.
+ */
+
+/* #define	HASRNODE	1 */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1	*/
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	AIXV>=4320
+#define	HASWIDECHAR	1
+# endif	/* AIXV>=4320 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTCPUDPSTATE is defined for dialects that have TCP and UDP state
+ * support -- i.e., for the "-stcp|udp:state" option and its associated
+ * speed improvements.
+ */
+
+#define	HASTCPUDPSTATE	1
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file
+ * system node, the vnode.  BSD derivatives usually do; System V derivatives
+ * prior to R4 usually don't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ *
+ * AIX uses the X option to disable the use of the readx() kernel function
+ * on request.
+ *
+ * If you want to disable the use of readx() permanently, leave HASXOPT
+ * undefined and set HASXOPT_VALUE to 0.  To enable readx() permanently,
+ * leave HASXOPT undefined and set HASXOPT_VALUE to 1.
+ *
+ * Define HASXOPT_ROOT if you want to restrict the use of the X option to
+ * processes whose real UID is root.
+ */
+
+#define	HASXOPT		"use readx() *RISKY*"
+/* #define	HASXOPT_ROOT	1 */
+#define	HASXOPT_VALUE	0
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+# if	AIXV>=4200
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"		/* INODETYPE printf specification
+					 * modifier */
+# endif	/* AIXV>=4200 */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	uid_t
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+/* #define	USE_LIB_CKKV			1	   ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+/* #define	USE_LIB_IS_FILE_NAMED		1	   isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+/* #define	USE_LIB_PRINTDEVNAME		1	   pdvn.c */
+#define	USE_LIB_PROCESS_FILE			1	/* prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+/* #define	USE_LIB_READDEV			1	   rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)		bzero(a, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/get-hdr-loc.sh b/lsof_4.85/lsof_4.85_src/dialects/darwin/get-hdr-loc.sh
new file mode 100755
index 0000000..c0d9880
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/get-hdr-loc.sh
@@ -0,0 +1,119 @@
+#!/bin/sh
+#
+# get-hdr-loc.sh -- get Darwin XNU kernel header file location
+#
+# Interactively requests the specification of the path to the host's Darwin
+# XNU kernel header files.  Checks that path and returns it to the caller.
+#
+# Usage: file1 file2 ... fileN
+#
+# Where: file1	first header file needed
+#	 file2	second header file needed
+#	 ...
+#	 fileN	last header file needed
+#
+# Exit:
+#
+#	Exit code: 0 if path found; path returned on STDOUT
+#
+#		   1 if path not found: error message returned
+#					on STDOUT
+#
+#set -x	# for DEBUGging
+
+# Check argument count.  There must be at least one argument.
+
+if test $# -lt 1	# {
+then
+  echo "insufficient arguments: $#"
+  exit 1
+fi	# }
+lst=$*
+
+# Request the path to the Darwin XNU kernel header files.
+
+trap 'stty echo; echo interrupted; exit 1' 1 2 3 15
+FOREVER=1
+while test $FOREVER -ge 1	# {
+do
+  if test $FOREVER -eq 1	# {
+  then
+    echo "---------------------------------------------------------------" 1>&2
+    echo "" 1>&2
+    echo "Lsof cannot find some Darwin XNU kernel header files it needs." 1>&2
+    echo "They should have already been downloaded from:" 1>&2
+    echo "" 1>&2
+    echo "    http://www.opensource.apple.com/darwinsource/index.html" 1>&2
+    echo "" 1>&2
+    echo "and then installed.  (See 00FAQ for download and installation" 1>&2
+    echo "instructions.)" 1>&2
+    echo "" 1>&2
+    echo "Please specify the path to the place where they were installed." 1>&2
+    echo "" 1>&2
+    echo "---------------------------------------------------------------" 1>&2
+  fi	# }
+
+  END=0
+  while test $END = 0	# {
+  do
+    echo "" 1>&2
+    echo -n "What is the path? " 1>&2
+    read HP EXCESS
+    HP=`echo echo $HP | /bin/csh -fs`
+    if test $? -eq 0	# {
+    then
+      if test "X$HP" = "X"	# {
+      then
+        echo "" 1>&2
+        echo "+================================+" 1>&2
+        echo "| Please enter a non-empty path. |" 1>&2
+        echo "+================================+" 1>&2
+        echo "" 1>&2
+      else
+        END=1
+      fi	# }
+    else
+      echo "" 1>&2
+      echo "+============================+" 1>&2
+      echo "| Please enter a legal path. |" 1>&2
+      echo "+============================+" 1>&2
+      echo "" 1>&2
+    fi	# }
+  done	# }
+  
+  # See if the header files are available in the specified path.
+
+  MH=""
+  for i in $lst	# {
+  do
+    if test ! -f ${HP}/bsd/$i -a ! -f ${HP}/osfmk/$i    # {
+    then
+      if test "X$MH" = "X"	# {
+      then
+        MH=$i
+      else
+        MH="$MH $i"
+      fi	# }
+    fi	# }
+  done	# }
+  if test "X$MH" = "X"	# {
+  then
+
+    # All header files are available, so return the path and exit cleanly.
+
+    echo $HP
+    exit 0
+  else
+    echo "" 1>&2
+    echo "ERROR: not all header files are in:" 1>&2
+    echo "" 1>&2
+    echo "       ${HP}" 1>&2
+    echo "" 1>&2
+    echo " These are missing:" 1>&2
+    echo "" 1>&2
+    echo "     $MH" 1>&2
+    FOREVER=2
+  fi	# }
+done	# }
+echo "unknown error"
+exit 1
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/Makefile b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/Makefile
new file mode 100644
index 0000000..47ebfee
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/Makefile
@@ -0,0 +1,171 @@
+
+# Darwin /dev/kmem-based lsof Makefile
+#
+# $Id: Makefile,v 1.8 2008/10/21 16:15:34 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DSTROOT}/usr/sbin
+
+DOC=	${DSTROOT}/usr/share/man/man8
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=	${RC_CFLAGS}
+CDEFS=	${CDEF} ${CFGF}
+INCL=	${DINC}
+override CFLAGS= ${CDEFS} ${INCL} ${DEBUG}
+
+GRP= 
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    ddev.c dfile.c dmnt.c dnode.c dnode1.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c util.c
+
+OBJ=	ddev.o dfile.o dmnt.o dnode.o dnode1.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install-strip: all FRC
+	mkdir -p ${BIN}
+	install -c -s -m 2755 -g kmem ${PROG} ${BIN}
+	mkdir -p ${DOC}
+	install -c -m 444 ${MAN} ${DOC}
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof for Darwin below 8'
+	@echo 'should be installed setgid to the group that has permission'
+	@echo 'to read /dev/kmem, often kmem or sys.  Lsof for Darwin 8 and'
+	@echo 'above should be installed setuid-root.  Your install rule'
+	@echo 'actions for Darwin below 8 might look something like this:'
+	@echo ''
+	@echo '    install -m 2xxx -g $${GRP} $${PROG} $${BIN}'
+	@echo '    install -m 444 $${MAN} $${DOC}'
+	@echo ''
+	@echo 'Your install rule actions for Darwin 8 and above might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '    install -m 4xxx -o root $${PROG} $${BIN}'
+	@echo '    install -m 444 $${MAN} $${DOC}'
+	@echo ''
+	@echo 'You will have to complete the xxx modes, the GRP value, and'
+	@echo 'the skeletons for the BIN and DOC strings, given at the'
+	@echo 'beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo '    GRP= kmem'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define  LSOF_CINFO      "${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+ddev.o:		${HDR} ddev.c
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/Mksrc
new file mode 100755
index 0000000..e576427
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make Darwin /dev/kmem-based lsof source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.5 2006/03/27 23:24:50 abe Exp $
+
+
+D=dialects/darwin/kmem
+L="dlsof.h ddev.c dfile.c dmnt.c dnode.c dnode1.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/ddev.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/ddev.c
new file mode 100644
index 0000000..fc6ce28
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/ddev.c
@@ -0,0 +1,479 @@
+/*
+ * ddev.c - Darwin device support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ddev.c,v 1.5 2006/03/27 23:24:50 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if	defined(DVCH_DEVPATH)
+#define	DDEV_DEVPATH	DVCH_DEVPATH
+#else	/* !defined(DVCH_DEVPATH) */
+#define	DDEV_DEVPATH	"/dev"
+#endif	/* defined(DVCH_DEVPATH) */
+
+#if	defined(USE_STAT)
+#define	STATFN	stat
+#else	/* !defined(USE_STAT) */
+#define	STATFN	lstat
+#endif	/* defined(USE_STAT) */
+
+
+/*
+ * Local static variables.
+ */
+
+static dev_t *ADev = (dev_t *) NULL;	/* device numbers besides DevDev found
+					 * inside DDEV_DEVPATH */
+static int ADevA = 0;			/* entries allocated to ADev[] */
+static int ADevU = 0;			/* entries used in ADev[] */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int rmdupdev,(struct l_dev ***dp, int n, char *nm));
+_PROTOTYPE(static void saveADev,(struct stat *s));
+
+
+#if	defined(HASSPECDEVD)
+/*
+ * HASSPECDEVD() -- process stat(2) result to see if the device number is
+ *		    inside DDEV_DEVPATH "/"
+ *
+ * exit: s->st_dev changed to DevDev, as required
+ */
+
+void
+HASSPECDEVD(p, s)
+	char *p;			/* file path */
+	struct stat *s;			/* stat(2) result for file */
+{
+	int i;
+
+	switch (s->st_mode & S_IFMT) {
+	case S_IFCHR:
+	case S_IFBLK:
+	    if (s->st_dev == DevDev)
+		return;
+	    (void) readdev(0);
+	    if (!ADev)
+		return;
+	    for (i = 0; i < ADevU; i++) {
+		if (s->st_dev == ADev[i]) {
+		    s->st_dev = DevDev;
+		    return;
+		}
+	    }
+	}
+}
+#endif	/* defined(HASSPECDEVD) */
+
+
+/*
+ * readdev() - read device names, modes and types
+ */
+
+void
+readdev(skip)
+	int skip;			/* skip device cache read if 1 --
+					 * ignored since device cache not
+					 * used */
+{
+	DIR *dfp;
+	int dnamlen;
+	struct dirent *dp;
+	char *fp = (char *)NULL;
+	char *path = (char *)NULL;
+	int i = 0;
+	int j = 0;
+	MALLOC_S pl, sz;
+	struct stat sb;
+/*
+ * Read device names but once.
+ */
+	if (Sdev)
+	    return;
+/*
+ * Prepare to scan DDEV_DEVPATH.
+ */
+	Dstkn = Dstkx = 0;
+	Dstk = (char **)NULL;
+	(void) stkdir(DDEV_DEVPATH);
+/*
+ * Unstack the next directory.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dfp = OpenDir(Dstk[Dstkx]))) {
+
+# if	defined(WARNDEVACCESS)
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		    safestrprt(Dstk[Dstkx], stderr, 1);
+		}
+# endif	/* defined(WARNDEVACCESS) */
+
+		(void) free((FREE_P *)Dstk[Dstkx]);
+		Dstk[Dstkx] = (char *)NULL;
+		continue;
+	    }
+	    if (path) {
+		(void) free((FREE_P *)path);
+		path = (char *)NULL;
+	    }
+	    if (!(path = mkstrcat(Dstk[Dstkx], -1, "/", 1, (char *)NULL, -1,
+				  &pl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(Dstk[Dstkx], stderr, 1);
+		Exit(1);
+	    }
+	    (void) free((FREE_P *)Dstk[Dstkx]);
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Scan the directory.
+	 */
+	    for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+		if (dp->d_ino == 0 || dp->d_name[0] == '.')
+		    continue;
+	    /*
+	     * Form the full path name and get its status.
+	     */
+		dnamlen = (int)dp->d_namlen;
+		if (fp) {
+		    (void) free((FREE_P *)fp);
+		    fp = (char *)NULL;
+		}
+		if (!(fp = mkstrcat(path, pl, dp->d_name, dnamlen,
+				    (char *)NULL, -1, (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr, "%s: no space for: ", Pn);
+		    safestrprt(path, stderr, 0);
+		    safestrprtn(dp->d_name, dnamlen, stderr, 1);
+		    Exit(1);
+		}
+		if (STATFN(fp, &sb) != 0) {
+		    if (errno == ENOENT)	/* a sym link to nowhere? */
+			continue;
+
+# if	defined(WARNDEVACCESS)
+		    if (!Fwarn) {
+			int errno_save = errno;
+
+			(void) fprintf(stderr, "%s: can't stat ", Pn);
+			safestrprt(fp, stderr, 0);
+			(void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		    }
+# endif	/* defined(WARNDEVACCESS) */
+
+		    continue;
+		}
+	    /*
+	     * If it's a subdirectory, stack its name for later
+	     * processing.
+	     */
+		if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+
+		/*
+		 * Skip /dev/fd.
+		 */
+		    if (strcmp(fp, "/dev/fd"))
+			(void) stkdir(fp);
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFLNK) {
+
+		/*
+		 * Ignore symbolic links.
+		 */
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFCHR) {
+
+		/*
+		 * Save character device information in Devtp[].
+		 */
+		    if (i >= Ndev) {
+			Ndev += DEVINCR;
+			if (!Devtp)
+			    Devtp = (struct l_dev *)malloc(
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			else
+			    Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			if (!Devtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for character device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    Devtp[i].rdev = sb.st_rdev;
+		    Devtp[i].inode = (INODETYPE)sb.st_ino;
+		    if (!(Devtp[i].name = mkstrcpy(fp, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr,
+			    "%s: no space for device name: ", Pn);
+			safestrprt(fp, stderr, 1);
+			Exit(1);
+		    }
+		    Devtp[i].v = 0;
+		    i++;
+		}
+
+# if	defined(HASBLKDEV)
+		if ((sb.st_mode & S_IFMT) == S_IFBLK) {
+
+		/*
+		 * Save block device information in BDevtp[].
+		 */
+		    if (j >= BNdev) {
+			BNdev += DEVINCR;
+			if (!BDevtp)
+			    BDevtp = (struct l_dev *)malloc(
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			else
+			    BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			if (!BDevtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for block device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    BDevtp[j].name = fp;
+		    fp = (char *)NULL;
+		    BDevtp[j].inode = (INODETYPE)sb.st_ino;
+		    BDevtp[j].rdev = sb.st_rdev;
+		    BDevtp[j].v = 0;
+		    j++;
+		}
+# endif	/* defined(HASBLKDEV) */
+
+	    /*
+	     * Save a possible new st_dev number within DDEV_DEVPATH.
+	     */
+		if (sb.st_dev != DevDev)
+		    (void) saveADev(&sb);
+	    }
+	    (void) CloseDir(dfp);
+	}
+/*
+ * Free any unneeded space that was allocated.
+ */
+	if (ADev && (ADevU < ADevA)) {
+
+	/*
+	 * Reduce space allocated to additional DDEV_DEVPATH device numbers.
+	 */
+	    if (!ADevU) {
+
+	    /*
+	     * If no space was used, free the entire allocation.
+	     */
+		(void) free((FREE_P *)ADev);
+		ADev = (dev_t *)NULL;
+		ADevA = 0;
+	    } else {
+
+	    /*
+	     * Reduce the allocation to what was used.
+	     */
+		sz = (MALLOC_S)(ADevU * sizeof(dev_t));
+		if (!(ADev = (dev_t *)realloc((MALLOC_P *)ADev, sz))) {
+		    (void) fprintf(stderr, "%s: can't reduce ADev[]\n", Pn);
+		    Exit(1);
+		}
+	    }
+	}
+	if (!Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	}
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+
+# if	defined(HASBLKDEV)
+/*
+ * Reduce the BDevtp[] (optional) and Devtp[] tables to their minimum
+ * sizes; allocate and build sort pointer lists; and sort the tables by
+ * device number.
+ */
+	if (BNdev) {
+	    if (BNdev > j) {
+		BNdev = j;
+		BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+			 (MALLOC_S)(sizeof(struct l_dev) * BNdev));
+	    }
+	    if (!(BSdev = (struct l_dev **)malloc(
+			  (MALLOC_S)(sizeof(struct l_dev *) * BNdev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for block device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (j = 0; j < BNdev; j++) {
+		BSdev[j] = &BDevtp[j];
+	    }
+	    (void) qsort((QSORT_P *)BSdev, (size_t)BNdev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    BNdev = rmdupdev(&BSdev, BNdev, "block");
+	}
+	
+#  if	!defined(NOWARNBLKDEV)
+	else {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: no block devices found\n", Pn);
+	}
+#  endif	/* !defined(NOWARNBLKDEV) */
+# endif	/* defined(HASBLKDEV) */
+
+	if (Ndev) {
+	    if (Ndev > i) {
+		Ndev = i;
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    }
+	    if (!(Sdev = (struct l_dev **)malloc(
+			 (MALLOC_S)(sizeof(struct l_dev *) * Ndev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for character device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (i = 0; i < Ndev; i++) {
+		Sdev[i] = &Devtp[i];
+	    }
+	    (void) qsort((QSORT_P *)Sdev, (size_t)Ndev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    Ndev = rmdupdev(&Sdev, Ndev, "char");
+	} else {
+	    (void) fprintf(stderr, "%s: no character devices found\n", Pn);
+	    Exit(1);
+	}
+}
+
+
+/*
+ * rmdupdev() - remove duplicate (major/minor/inode) devices
+ */
+
+static int
+rmdupdev(dp, n, nm)
+	struct l_dev ***dp;	/* device table pointers address */
+	int n;			/* number of pointers */
+	char *nm;		/* device table name for error message */
+{
+	int i, j, k;
+	struct l_dev **p;
+
+	for (i = j = 0, p = *dp; i < n ;) {
+	    for (k = i + 1; k < n; k++) {
+		if (p[i]->rdev != p[k]->rdev || p[i]->inode != p[k]->inode)
+		    break;
+	    }
+	    if (i != j)
+		p[j] = p[i];
+	    j++;
+	    i = k;
+	}
+	if (n == j)
+	    return(n);
+	if (!(*dp = (struct l_dev **)realloc((MALLOC_P *)*dp,
+		    (MALLOC_S)(j * sizeof(struct l_dev *)))))
+	{
+	    (void) fprintf(stderr, "%s: can't realloc %s device pointers\n",
+		Pn, nm);
+	    Exit(1);
+	}
+	return(j);
+}
+
+
+/*
+ * saveADev() - save additional device number appearing inside DDEV_DEVPATH
+ */
+
+static void
+saveADev(s)
+	struct stat *s;			/* stat(2) buffer for file */
+{
+	int i;
+	MALLOC_S sz;
+/*
+ * Process VCHR files.
+ *
+ * Optionally process VBLK files.
+ */
+
+#if	defined(HASBLKDEV)
+	if (((s->st_mode & S_IFMT) != S_IFBLK)
+	&&  ((s->st_mode & S_IFMT) != S_IFCHR))
+#else	/* !defined(HASBLKDEV) */
+	if ((s->st_mode & S_IFCHR) != S_IFCHR)
+#endif	/* defined(HASBLKDEV) */
+
+		return;
+/*
+ * See if this is a new VBLK or VCHR st_dev value for ADev[].
+ */
+	for (i = 0; i < ADevU; i++) {
+	    if (s->st_dev == ADev[i])
+		return;
+	}
+/*
+ * This is a new device number to add to ADev[].
+ */
+	if (ADevU >= ADevA) {
+	    ADevA += 16;
+	    sz = (MALLOC_S)(ADevA * sizeof(dev_t));
+	    if (ADev)
+		ADev = (dev_t *)realloc((MALLOC_P *)ADev, sz);
+	    else
+		ADev = (dev_t *)malloc(sz);
+	    if (!ADev) {
+		(void) fprintf(stderr, "%s: no space for ADev[]\n", Pn);
+		Exit(1);
+	    }
+	}
+	ADev[ADevU++] = s->st_dev;
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dfile.c
new file mode 100644
index 0000000..e1b23a7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dfile.c
@@ -0,0 +1,390 @@
+/*
+ * dfile.c - Darwin file processing functions for /dev/kmem-based lsof
+ */
+
+
+/*
+ * Copyright 2005 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id$";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if	DARWINV>=800
+#define	file		fileglob
+#define	f_flag		fg_flag
+#define	f_type		fg_type
+#define	f_count		fg_count
+#define	f_ops		fg_ops
+#define	f_offset	fg_offset
+#define	f_data		fg_data
+#endif	/* DARWINV>=800 */
+
+#if	defined(HASPSXSEM)
+#define	PSEMNAMLEN	31		/* from kern/posix_sem.c */
+#endif	/* defined(HASPSXSEM) */
+
+#if	defined(HASPSXSHM)
+#define	PSHMNAMLEN	31		/* from kern/posix_shm.c */
+#endif	/* defined(HASPSXSHM) */
+
+
+/*
+ * Local structure definitions
+ */
+
+#if	defined(HASPSXSEM)
+struct pseminfo {			/* from kern/posix_sem.c */
+    unsigned int psem_flags;
+    unsigned int psem_usecount;
+    mode_t psem_mode;
+    uid_t psem_uid;
+    gid_t psem_gid;
+    char psem_name[PSEMNAMLEN + 1];
+    void *psem_semobject;
+    struct proc *sem_proc;
+};
+
+struct psemnode {
+    struct pseminfo *pinfo;
+};
+#endif	/* defined(HASPSXSEM) */
+
+#if	defined(HASPSXSHM)		/* from kern/posix_shm.c */
+struct pshminfo {
+    unsigned int pshm_flags;
+    unsigned int pshm_usecount;
+    off_t pshm_length;
+    mode_t pshm_mode;
+    uid_t pshm_uid;
+    gid_t pshm_gid;       
+    char pshm_name[PSHMNAMLEN + 1];
+    void *pshm_memobject;
+};
+
+struct pshmnode {
+    off_t mapp_addr;
+
+# if	DARWINV<800
+    size_t map_size;
+# else	/* DARWINV>=800 */
+    user_size_t map_size;
+# endif	/* DARWINV>=800 */
+
+    struct pshminfo *pinfo;
+};
+#endif	/* defined(HASPSXSHM) */
+
+
+#if	DARWINV>=800
+/*
+ * print_v_path() - print vnode's path
+ */
+
+int
+print_v_path(lf)
+	struct lfile *lf;
+{
+	if (lf->V_path) {
+	    safestrprt(lf->V_path, stdout, 0);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* DARWINV>=800 */
+
+
+#if	defined(HASKQUEUE)
+/*
+ * process_kqueue() -- process kqueue file
+ */
+
+void
+process_kqueue(ka)
+	KA_T ka;			/* kqueue file structure address */
+{
+	struct kqueue kq;		/* kqueue structure */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "KQUEUE");
+	enter_dev_ch(print_kptr(ka, (char *)NULL, 0));
+	if (!ka || kread(ka, (char *)&kq, sizeof(kq)))
+	    return;
+	(void) snpf(Namech, Namechl, "count=%d, state=%#x", kq.kq_count,
+	    kq.kq_state);
+	enter_nm(Namech);
+}
+#endif	/* defined(HASKQUEUE) */
+
+
+#if	DARWINV>=800
+/*
+ * process_pipe() - process a file structure whose type is DTYPE_PIPE
+ */
+
+void
+process_pipe(pa)
+	KA_T pa;			/* pipe structure address */
+{
+	(void) snpf(Lf->type, sizeof(Lf->type), "PIPE");
+	enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+	Namech[0] = '\0';
+}
+#endif	/* DARWINV>=800 */
+
+
+#if	defined(HASPSXSEM)
+/*
+ * process_psxsem() -- process POSIX semaphore file
+ */
+
+void
+process_psxsem(pa)
+	KA_T pa;			/* psxsem file structure address */
+{
+	struct pseminfo pi;
+ 	struct psemnode pn;
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "PSXSEM");
+	enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+	if (!Fsize)
+	    Lf->off_def = 1;
+	if (pa && !kread(pa, (char *)&pn, sizeof(pn))) {
+	    if (pn.pinfo && !kread((KA_T)pn.pinfo, (char *)&pi, sizeof(pi))) {
+		if (pi.psem_name[0]) {
+		    pi.psem_name[PSEMNAMLEN] = '\0';
+		    (void) snpf(Namech, Namechl, "%s", pi.psem_name);
+		    enter_nm(Namech);
+		}
+	    }
+	}
+}
+#endif	/* defined(HASPSXSEM) */
+
+
+#if	defined(HASPSXSHM)
+/*
+ * process_psxshm() -- process POSIX shared memory file
+ */
+
+void
+process_psxshm(pa)
+	KA_T pa;			/* psxshm file structure address */
+{
+	struct pshminfo pi;
+	struct pshmnode pn;
+	int pns = 0;
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "PSXSHM");
+	enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+	if (pa && !kread(pa, (char *)&pn, sizeof(pn))) {
+	    pns = 1;
+	    if (pn.pinfo && !kread((KA_T)pn.pinfo, (char *)&pi, sizeof(pi))) {
+		if (pi.pshm_name[0]) {
+		    pi.pshm_name[PSEMNAMLEN] = '\0';
+		    (void) snpf(Namech, Namechl, "%s", pi.pshm_name);
+		    enter_nm(Namech);
+		} else if (pi.pshm_memobject) {
+		    (void) snpf(Namech, Namechl, "obj=%s",
+			print_kptr((KA_T)pi.pshm_memobject, (char *)NULL, 0));
+		    enter_nm(Namech);
+		}
+	    }
+	}
+	if (Foffset)
+	    Lf->off_def = 1;
+	else if (pns) {
+	    Lf->sz = (SZOFFTYPE)pn.map_size;
+	    Lf->sz_def = 1;
+	}
+}
+#endif	/* defined(HASPSXSHM) */
+
+
+/*
+ * process_file() - process file
+ */
+
+/*
+ * The caller may define:
+ *
+ *	FILEPTR	as the name of the location to store a pointer
+ *			to the current file struct -- e.g.,
+ *
+ *			struct file *foobar;
+ *			#define FILEPTR	foobar
+ */
+
+void
+process_file(fp)
+	KA_T fp;			/* kernel file structure address */
+{
+
+#if	DARWINV<800
+	struct file f;
+#else	/* DARWINV>=800 */
+	struct fileglob f;
+	struct fileproc fileproc;
+#endif	/* DARWINV>=800 */
+
+	int flag;
+
+#if	defined(FILEPTR)
+/*
+ * Save file structure address for process_node().
+ */
+	FILEPTR = &f;
+#endif	/* defined(FILEPTR) */
+
+/*
+ * Read file structure.
+ */
+
+#if	DARWINV<800
+	if (kread((KA_T)fp, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read file struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+#else	/* DARWINV>=800 */
+	if (kread((KA_T)fp, (char *)&fileproc, sizeof(fileproc))) {
+	    (void) snpf(Namech, Namechl, "can't read fileproc struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (kread((KA_T)fileproc.f_fglob, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read fileglob struct from %s",
+		print_kptr((KA_T)fileproc.f_fglob, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+#endif	/* DARWINV>=800 */
+
+	Lf->off = (SZOFFTYPE)f.f_offset;
+	if (f.f_count) {
+
+	/*
+	 * Construct access code.
+	 */
+	    if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+		Lf->access = 'r';
+	    else if (flag == FWRITE)
+		Lf->access = 'w';
+	    else if (flag == (FREAD | FWRITE))
+		Lf->access = 'u';
+
+#if	defined(HASFSTRUCT)
+	/*
+	 * Save file structure values.
+	 */
+	    if (Fsv & FSV_CT) {
+		Lf->fct = (long)f.f_count;
+		Lf->fsv |= FSV_CT;
+	    }
+	    if (Fsv & FSV_FA) {
+		Lf->fsa = fp;
+		Lf->fsv |= FSV_FA;
+	    }
+	    if (Fsv & FSV_FG) {
+		Lf->ffg = (long)f.f_flag;
+		Lf->fsv |= FSV_FG;
+	    }
+	    if (Fsv & FSV_NI) {
+		Lf->fna = (KA_T)f.f_data;
+		Lf->fsv |= FSV_NI;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Process structure by its type.
+	 */
+	    switch (f.f_type) {
+
+
+#if	defined(DTYPE_PIPE)
+	    case DTYPE_PIPE:
+# if	defined(HASPIPEFN)
+		if (!Selinet)
+		    HASPIPEFN((KA_T)f.f_data);
+# endif	/* defined(HASPIPEFN) */
+		return;
+#endif	/* defined(DTYPE_PIPE) */
+
+	    case DTYPE_VNODE:
+		if (!Selinet)
+		    process_node((KA_T)f.f_data);
+		return;
+	    case DTYPE_SOCKET:
+		process_socket((KA_T)f.f_data);
+		return;
+
+#if	defined(HASKQUEUE)
+	    case DTYPE_KQUEUE:
+		process_kqueue((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASKQUEUE) */
+
+#if	defined(HASPSXSEM)
+	    case DTYPE_PSXSEM:
+		process_psxsem((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASPSXSEM) */
+
+#if	defined(HASPSXSHM)
+	    case DTYPE_PSXSHM:
+		process_psxshm((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASPSXSHM) */
+
+#if	defined(HASPRIVFILETYPE)
+	    case PRIVFILETYPE:
+		HASPRIVFILETYPE((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASPRIVFILETYPE) */
+
+	    default:
+		if (f.f_type || f.f_ops) {
+		    (void) snpf(Namech, Namechl,
+			"%s file struct, ty=%#x, op=%p",
+			print_kptr(fp, (char *)NULL, 0), f.f_type, f.f_ops);
+		    enter_nm(Namech);
+		    return;
+		}
+	    }
+	}
+	enter_nm("no more information");
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dlsof.h
new file mode 100644
index 0000000..f5e50eb
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dlsof.h
@@ -0,0 +1,337 @@
+/*
+ * 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 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dmnt.c
new file mode 100644
index 0000000..7ba9453
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dmnt.c
@@ -0,0 +1,229 @@
+/*
+ * dmnt.c - Darwin mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.4 2005/11/01 20:24:51 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local static information
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	struct statfs *mb = (struct statfs *)NULL;
+	struct mounts *mtp;
+	int n;
+	struct stat sb;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Access mount information.
+ */
+	if ((n = getmntinfo(&mb, MNT_NOWAIT)) <= 0) {
+	    (void) fprintf(stderr, "%s: no mount information\n", Pn);
+	    return(0);
+	}
+/*
+ * Read mount information.
+ */
+	for (; n; n--, mb++) {
+
+	    if (!mb->f_type)
+		continue;
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntonname, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mb->f_mntonname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mb->f_mntfromname, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't stat() ", Pn);
+
+		    safestrprt(mb->f_fstypename, stderr, 0);
+
+		    (void) fprintf(stderr, " file system ");
+		    safestrprt(mb->f_mntonname, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		(void) bzero((char *)&sb, sizeof(sb));
+		sb.st_dev = (dev_t)mb->f_fsid.val[0];
+		sb.st_mode = S_IFDIR | 0777;
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      assuming \"dev=%x\" from mount table\n",
+			sb.st_dev);
+		}
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link.
+	 */
+	    if (!(dn = mkstrcpy(mb->f_mntfromname, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	}
+/*
+ * Clean up and return the local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(vm)
+	KA_T vm;			/* kernel mount address from vnode */
+{
+	struct mount m;
+	struct l_vfs *vp;
+/*
+ * Search for match on existing entry.
+ */
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if (vm == vp->addr)
+		return(vp);
+	}
+/*
+ * Read the (new) mount structure, allocate a local entry, and fill it.
+ */
+	if (kread((KA_T)vm, (char *)&m, sizeof(m)) != 0)
+	    return((struct l_vfs *)NULL);
+	if (!(vp = (struct l_vfs *)malloc(sizeof(struct l_vfs)))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	if (!(vp->dir = mkstrcpy(m.m_stat.f_mntonname, (MALLOC_S *)NULL))
+	||  !(vp->fsname = mkstrcpy(m.m_stat.f_mntfromname, (MALLOC_S *)NULL)))
+	{
+	    (void) fprintf(stderr, "%s: PID %d, no space for mount names\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->addr = vm;
+	vp->fsid = m.m_stat.f_fsid;
+	{
+	    int len;
+
+	    if ((len = strlen(m.m_stat.f_fstypename))) {
+		if (len > (MFSNAMELEN - 1))
+		    len = MFSNAMELEN - 1;
+		if (!(vp->typnm = mkstrcat(m.m_stat.f_fstypename, len,
+				  (char *)NULL, -1, (char *)NULL, -1,
+				  (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr,
+			"%s: no space for fs type name: ", Pn);
+		    safestrprt(m.m_stat.f_fstypename, stderr, 1);
+		    Exit(1);
+		}
+	    } else
+		vp->typnm = "";
+	}
+	vp->next = Lvfs;
+	Lvfs = vp;
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dnode.c
new file mode 100644
index 0000000..d634c62
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dnode.c
@@ -0,0 +1,1038 @@
+/*
+ * dnode.c - Darwin node functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.11 2006/03/27 23:24:50 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+#if	DARWINV<600
+_PROTOTYPE(static int lkup_dev_tty,(dev_t *dr, dev_t *rdr, INODETYPE *ir));
+#endif	/* DARWINV<600 */
+
+#if	DARWINV>=800
+_PROTOTYPE(static char *getvpath,(KA_T va, struct vnode *rv));
+_PROTOTYPE(static int readvname,(KA_T addr, char *buf, int buflen));
+#endif	/* DARWINV>=800 */
+
+
+#if	DARWINV>=800
+/*
+ * getvpath() - get vnode path
+ *		adapted from build_path() (.../bsd/vfs/vfs_subr.c)
+ */
+
+static char *
+getvpath(va, rv)
+	KA_T va;			/* kernel address of the rightmost
+					 * vnode in the path */
+	struct vnode *rv;		/* pointer to rightmost vnode */
+{
+	char *ap;
+	static char *bp = (char *)NULL;
+	static size_t bl = (size_t)(MAXPATHLEN + MAXPATHLEN + 1);
+	static char *cb = (char *)NULL;
+	static size_t cbl = (size_t)0;
+	static int ce = 0;
+	struct mount mb;
+	int pl, vnl;
+	char *pp, vn[MAXPATHLEN+1];
+	struct vnode vb;
+	KA_T vas = va;
+/*
+ * Initialize the path assembly.
+ */
+	if (!bp) {
+	    if (!(bp = (char *)malloc((MALLOC_S)bl))) {
+		(void) fprintf(stderr, "%s: no space (%d) for path assembly\n",
+		    Pn, (int)bl);
+		Exit(1);
+	    }
+	}
+	pp = bp + bl - 1;
+	*pp = '\0';
+	pl = 0;
+/*
+ * Process the starting vnode.
+ */
+	if (!va)
+	    return(0);
+	if ((rv->v_flag & VROOT) && rv->v_mount) {
+
+	/*
+	 * This is the root of a file system and it has a mount structure.
+	 * Read the mount structure.
+	 */
+	    if (kread((KA_T)rv->v_mount, (char *)&mb, sizeof(mb)))
+		return(0);
+	    if (mb.mnt_flag & MNT_ROOTFS) {
+
+	    /*
+	     * This is the root file system, so the path is "/".
+	     */
+		pp--;
+		*pp = '/';
+		pl = 1;
+		goto getvpath_alloc;
+	    } else {
+
+	    /*
+	     * Get the covered vnode's pointer and read it.  Use it to
+	     * form the path.
+	     */
+		if ((va = (KA_T)mb.mnt_vnodecovered)) {
+		    if (readvnode(va, &vb))
+			return(0);
+		}
+	    }
+	} else {
+
+	/*
+	 * Use the supplied vnode.
+	 */
+	    vb = *rv;
+	}
+/*
+ * Accumulate the path from the vnode chain.
+ */
+	while (va && ((KA_T)vb.v_parent != va)) {
+	    if (!vb.v_name) {
+
+	    /*
+	     * If there is no name pointer or parent, the assembly is complete.
+	     */
+		if (vb.v_parent) {
+
+		/*
+		 * It is an error if there is a parent but no name.
+		 */
+		    return((char *)NULL);
+		}
+		break;
+	    }
+	/*
+	 * Read the name and add it to the assembly.
+	 */
+	    if ((vnl = readvname((KA_T)vb.v_name, vn, sizeof(vn))) <= 0)
+		return((char *)NULL);
+	    if ((vnl + 1 + pl + 1) > bl)
+		return((char *)NULL);
+	    memmove((void *)(pp - vnl), (void *)vn, vnl);
+	    pp -= (vnl + 1);
+	    *pp = '/';
+	    pl += vnl + 1;
+	    if ((va == vas) && (vb.v_flag & VROOT)) {
+
+	    /*
+	     * This is the starting vnode and it is a root vnode.  Read its
+	     * mount structure.
+	     */
+		if (vb.v_mount) {
+		    if (kread((KA_T)vb.v_mount, (char *)&mb, sizeof(mb)))
+			return((char *)NULL);
+		    if (mb.mnt_vnodecovered) {
+
+		    /*
+		     * If there's a covered vnode, read it and use it's parent
+		     * vnode pointer.
+		     */
+			if ((va = (KA_T)mb.mnt_vnodecovered)) {
+			    if (readvnode(va, &vb))
+				return((char *)NULL);
+			    va = (KA_T)vb.v_parent;
+			}
+		    } else
+			va = (KA_T)NULL;
+		} else
+		    va = (KA_T)NULL;
+	    } else
+		va = (KA_T)vb.v_parent;
+	/*
+	 * If there's a parent vnode, read it.
+	 */
+	    if (va) {
+		if (readvnode(va, &vb))
+		    return((char *)NULL);
+		if ((vb.v_flag & VROOT) && vb.v_mount) {
+
+		/*
+		 * The mount point has been reached.  Read the mount structure
+		 * and use its covered vnode pointer.
+		 */
+		    if (kread((KA_T)vb.v_mount, (char *)&mb, sizeof(mb)))
+			return((char *)NULL);
+		    if ((va = (KA_T)mb.mnt_vnodecovered)) {
+			if (readvnode(va, &vb))
+			    return((char *)NULL);
+		    }
+		}
+	    }
+	}
+/*
+ * As a special case the following code attempts to trim a path that is
+ * larger than MAXPATHLEN by seeing if the lsof process CWD can be removed
+ * from the start of the path to make it MAXPATHLEN characters or less.
+ */
+	if (pl > MAXPATHLEN) {
+
+	/*
+	 * Get the cwd.  If that can't be done, return an error.
+	 */
+	    if (ce)
+		return((char *)NULL);
+	    if (!cb) {
+		if (!(cb = (char *)malloc((MALLOC_S)(MAXPATHLEN + 1)))) {
+		    (void) fprintf(stderr, "%s: no space (%d) for CWD\n",
+			Pn, (int)bl);
+		    Exit(1);
+		}
+		if (!getcwd(cb, (size_t)(MAXPATHLEN + 1))) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr, "%s: WARNING: can't get CWD\n",
+			    Pn);
+		    }
+		    ce = 1;
+		    return((char *)NULL);
+		}
+		cb[MAXPATHLEN - 1] = '\0';
+		if (!(cbl = (size_t)strlen(cb))) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr, "%s: WARNING: CWD is NULL\n",
+			    Pn);
+		    }
+		    ce = 1;
+		    return((char *)NULL);
+		}
+	    }
+	/*
+	 * See if trimming the CWD shortens the path to MAXPATHLEN or less.
+	 */
+	    if ((pl <= cbl) || strncmp(cb, pp, cbl))
+		return((char *)NULL);
+	    pp += cbl;
+	    pl -= cbl;
+	    if (cb[cbl - 1] == '/') {
+
+	    /*
+	     * The CWD ends in a '/', so the path must not begin with one.  If
+	     * it does, no trimming can be done.
+	     */
+		if (*pp == '/')
+		    return((char *)NULL);
+	    } else {
+
+	    /*
+	     * The CWD doesn't end in a '/', so the path must begin with one.
+	     * If it doesn't, no trimming can be done.
+	     */
+		if (*pp != '/')
+		    return((char *)NULL);
+	    /*
+	     * Skip all leading path '/' characters.  Some characters must
+	     * remain.
+	     */
+		while ((pl > 0) && (*pp == '/')) {
+		    pp++;
+		    pl--;
+		}
+		if (!pl)
+		    return((char *)NULL);
+	    }
+	}
+/*
+ * Allocate space for the assembled path, including terminator, and return its
+ * pointer.
+ */
+
+getvpath_alloc:
+
+	if (!(ap = (char *)malloc(pl + 1))) {
+	    (void) fprintf(stderr, "%s: no getvpath space (%d)\n",
+		Pn, pl + 1);
+	    Exit(1);
+	}
+	(void) memmove(ap, pp, pl + 1);
+	return(ap);
+}
+#endif	/* DARWINV>=800 */
+
+
+#if	DARWINV<600
+/*
+ * lkup_dev_tty() - look up /dev/tty
+ */
+
+static int
+lkup_dev_tty(dr, rdr, ir)
+	dev_t *dr;			/* place to return device number */
+	dev_t *rdr;			/* place to return raw device number */
+	INODETYPE *ir;			/* place to return inode number */
+{
+	int i;
+
+	readdev(0);
+	for (i = 0; i < Ndev; i++) {
+	    if (strcmp(Devtp[i].name, "/dev/tty") == 0) {
+		*dr = DevDev;
+		*rdr = Devtp[i].rdev;
+		*ir = (INODETYPE)Devtp[i].inode;
+		return(1);
+	    }
+	}
+	return(-1);
+}
+#endif	/* DARWINV<600 */
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	dev_t dev = (dev_t)0;
+	dev_t rdev = (dev_t)0;
+	unsigned char devs = 0;
+	unsigned char rdevs = 0;
+
+#if	DARWINV<800
+	struct devnode *d = (struct devnode *)NULL;
+	struct devnode db;
+	unsigned char lt;
+	char dev_ch[32];
+
+# if	defined(HASFDESCFS)
+	struct fdescnode *f = (struct fdescnode *)NULL;
+	struct fdescnode fb;
+# endif	/* defined(HASFDESCFS) */
+
+	static INODETYPE fi;
+	static dev_t fdev, frdev;
+	static int fs = 0;
+	struct inode *i = (struct inode *)NULL;
+	struct inode ib;
+	struct lockf lf, *lff, *lfp;
+	struct nfsnode *n = (struct nfsnode *)NULL;
+	struct nfsnode nb;
+#else	/* DARWINV>=800 */
+	struct stat sb;
+	char *vn;
+#endif	/* DARWINV<800 */
+
+	char *ty;
+	enum vtype type;
+	struct vnode *v, vb;
+	struct l_vfs *vfs;
+
+#if	DARWINV<600
+	struct hfsnode *h = (struct hfsnode *)NULL;
+	struct hfsnode hb;
+	struct hfsfilemeta *hm = (struct hfsfilemeta *)NULL;
+	struct hfsfilemeta hmb;
+#else	/* DARWINV>=600 */
+# if	DARWINV<800
+	struct cnode *h = (struct cnode *)NULL;
+	struct cnode hb;
+	struct filefork *hf = (struct filefork *)NULL;
+	struct filefork hfb;
+# endif	/* DARWINV<800 */
+#endif	/* DARWINV<600 */
+
+#if	defined(HAS9660FS)
+	dev_t iso_dev;
+	int iso_dev_def = 0;
+	INODETYPE iso_ino;
+	long iso_links;
+	int iso_stat = 0;
+	SZOFFTYPE iso_sz;
+#endif	/* defined(HAS9660FS) */
+
+/*
+ * Read the vnode.
+ */
+	if ( ! va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	v = &vb;
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+	type = v->v_type;
+
+#if	defined(HASNCACHE)
+	Lf->na = va;
+# if	defined(HASNCVPID)
+	Lf->id = v->v_id;
+# endif	/* defined(HASNCVPID) */
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = va;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Get the vnode type.
+ */
+	if (!v->v_mount)
+	    vfs = (struct l_vfs *)NULL;
+	else {
+	    vfs = readvfs((KA_T)v->v_mount);
+	    if (vfs) {
+		if (strcasecmp(vfs->typnm, "nfs") == 0)
+		    Ntype = N_NFS;
+
+#if	DARWINV<130
+		else if (strcasecmp(vfs->typnm, "afpfs") == 0)
+		    Ntype = N_AFPFS;
+#endif	/* DARWINV<130 */
+
+	    }
+	}
+	if (Ntype == N_REGLR) {
+	    switch (v->v_type) {
+	    case VFIFO:
+		Ntype = N_FIFO;
+		break;
+	    default:
+		break;
+	    }
+	}
+
+#if	DARWINV<800
+/*
+ * Define the specific node pointer.
+ */
+	switch (v->v_tag) {
+
+# if	DARWINV>120
+	case VT_AFP:
+ 	    break;
+# endif	/* DARWINV>120 */
+
+# if	DARWINV>120
+	case VT_CDDA:
+	    break;
+# endif	/* DARWINV>120 */
+
+# if	DARWINV>120
+	case VT_CIFS:
+	    break;
+# endif	/* DARWINV>120 */
+
+	case VT_DEVFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&db, sizeof(db))) {
+		(void) snpf(Namech, Namechl, "no devfs node: %#x", v->v_data);
+		enter_nm(Namech);
+		return;
+	    }
+	    d = &db;
+	    break;
+
+# if	defined(HASFDESCFS)
+	case VT_FDESC:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&fb, sizeof(fb))) {
+		(void) snpf(Namech, Namechl, "no fdesc node: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    f = &fb;
+	    break;
+# endif	/* defined(HASFDESCFS) */
+
+	case VT_HFS:
+
+# if	DARWINV<130
+	    if (Ntype != N_AFPFS) {
+# endif	/* DARWINV<130 */
+
+		if (!v->v_data
+		||  kread((KA_T)v->v_data, (char *)&hb, sizeof(hb))) {
+		    (void) snpf(Namech, Namechl, "no hfs node: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		h = &hb;
+
+# if	DARWINV<600
+		if (!h->h_meta
+		||  kread((KA_T)h->h_meta, (char *)&hmb, sizeof(hmb))) {
+		    (void) snpf(Namech, Namechl, "no hfs node metadata: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		hm = &hmb;
+# else	/* DARWINV>=600 */
+		if (v->v_type == VDIR)
+		    break;
+		if (h->c_rsrc_vp == v)
+		    hf = h->c_rsrcfork;
+		else
+		    hf = h->c_datafork;
+		if (!hf
+		||  kread((KA_T)hf, (char *)&hfb, sizeof(hfb))) {
+		    (void) snpf(Namech, Namechl, "no hfs node fork: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		hf = &hfb;
+# endif	/* DARWINV<600 */
+
+# if	DARWINV<130
+	    }
+# endif	/* DARWINV<130 */
+
+	    break;
+
+# if	defined(HAS9660FS)
+	case VT_ISOFS:
+	    if (read_iso_node(v, &iso_dev, &iso_dev_def, &iso_ino, &iso_links,
+			      &iso_sz))
+	    {
+		(void) snpf(Namech, Namechl, "no iso node: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    iso_stat = 1;
+	    break;
+# endif	/* defined(HAS9660FS) */
+
+	case VT_NFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&nb, sizeof(nb))) {
+		(void) snpf(Namech, Namechl, "no nfs node: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    n = &nb;
+	    break;
+
+# if	DARWINV>120
+	case VT_UDF:
+	    break;
+# endif	/* DARWINV>120 */
+
+	case VT_UFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&ib, sizeof(ib))) {
+		(void) snpf(Namech, Namechl, "no ufs node: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    i = &ib;
+	    if ((lff = i->i_lockf)) {
+
+	    /*
+	     * Determine the lock state.
+	     */
+		lfp = lff;
+		do {
+		    if (kread((KA_T)lfp, (char *)&lf, sizeof(lf)))
+			break;
+		    lt = 0;
+		    switch (lf.lf_flags & (F_FLOCK|F_POSIX)) {
+		    case F_FLOCK:
+			if (Cfp && (struct file *)lf.lf_id == Cfp)
+			    lt = 1;
+			break;
+		    case F_POSIX:
+			if ((KA_T)lf.lf_id == Kpa)
+			    lt = 1;
+			break;
+		    }
+		    if (!lt)
+			continue;
+		    if (lf.lf_start == (off_t)0
+		    &&  lf.lf_end == 0xffffffffffffffffLL)
+			lt = 1;
+		    else
+			lt = 0;
+		    if (lf.lf_type == F_RDLCK)
+			Lf->lock = lt ? 'R' : 'r';
+		    else if (lf.lf_type == F_WRLCK)
+			Lf->lock = lt ? 'W' : 'w';
+		    else if (lf.lf_type == (F_RDLCK | F_WRLCK))
+			Lf->lock = 'u';
+		    break;
+		} while ((lfp = lf.lf_next) && lfp != lff);
+	    }
+	    break;
+
+# if	DARWINV>120
+	case VT_WEBDAV:
+   	    break;
+# endif	/* DARWINV>120 */
+
+	default:
+	    if (v->v_type == VBAD || v->v_type == VNON)
+		break;
+	    (void) snpf(Namech, Namechl, "unknown file system type: %d",
+		v->v_tag);
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Get device and type for printing.
+ */
+	if (n) {
+	    dev = n->n_vattr.va_fsid;
+	    devs = 1;
+	} else if (i) {
+	    dev = i->i_dev;
+	    devs = 1;
+	    if ((type == VCHR) || (type == VBLK)) {
+		rdev = i->i_rdev ;
+		rdevs = 1;
+	    }
+	}
+
+# if	defined(HASFDESCFS)
+	else if (f) {
+	    if (f->fd_link
+	    &&  !kread((KA_T)f->fd_link, Namech, Namechl -1))
+		Namech[Namechl - 1] = '\0';
+
+#  if	DARWINV<600
+	    else if (f->fd_type == Fctty) {
+		if (fs == 0)
+		    fs = lkup_dev_tty(&fdev, &frdev, &fi);
+		if (fs == 1) {
+		    dev = fdev;
+		    rdev = frdev;
+		    devs = Lf->inp_ty = rdevs = 1;
+		    Lf->inode = fi;
+		}
+	    }
+	}
+#  endif	/* DARWINV<600 */
+# endif	/* defined(HASFDESCFS) */
+
+	else if (h) {
+
+# if	DARWINV<600
+	    dev = hm->h_dev;
+# else	/* DARWINV>=600 */
+	    dev = h->c_dev;
+# endif	/* DARWINV<600 */
+
+	    devs = 1;
+	    if ((type == VCHR) || (type == VBLK)) {
+
+# if	DARWINV<600
+		rdev = hm->h_rdev;
+# else	/* DARWINV>=600 */
+		rdev = h->c_rdev;
+# endif	/* DARWINV<600 */
+
+		rdevs = 1;
+	    }
+	} else if (d) {
+	    dev = DevDev;
+	    devs = 1;
+	    rdev = d->dn_typeinfo.dev;
+	    rdevs = 1;
+	}
+
+# if	defined(HAS9660FS)
+	else if (iso_stat && iso_dev_def) {
+	    dev = iso_dev;
+	    devs = Lf->inp_ty = 1;
+	}
+# endif	/* defined(HAS9660FS) */
+
+
+/*
+ * Obtain the inode number.
+ */
+	if (i) {
+	    Lf->inode = (INODETYPE)i->i_number;
+	    Lf->inp_ty = 1;
+	} else if (n) {
+	    Lf->inode = (INODETYPE)n->n_vattr.va_fileid;
+	    Lf->inp_ty = 1;
+	} else if (h) {
+
+# if	DARWINV<600
+	    Lf->inode = (INODETYPE)hm->h_nodeID;
+# else	/* DARWINV>=600 */
+	    Lf->inode = (INODETYPE)h->c_fileid;
+# endif	/* DARWINV<600 */
+
+	    Lf->inp_ty = 1;
+	}
+
+# if	defined(HAS9660FS)
+	else if (iso_stat) {
+	    Lf->inode = iso_ino;
+	    Lf->inp_ty = 1;
+	}
+# endif	/* defined(HAS9660FS) */
+
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+	    case N_FIFO:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_NFS:
+		if (n) {
+		    Lf->sz = (SZOFFTYPE)n->n_vattr.va_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+
+# if	DARWINV<130
+	    case N_AFPFS:
+		break;
+# endif	/* DARWINV<130 */
+
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    if (i) {
+			Lf->sz = (SZOFFTYPE)i->i_size;
+			Lf->sz_def = 1;
+		    } else if (h) {
+
+# if	DARWINV<600
+			Lf->sz = (type == VDIR) ? (SZOFFTYPE)hm->h_size
+						: (SZOFFTYPE)h->fcbEOF;
+# else	/* DARWINV>=600 */
+			if (type == VDIR)
+			    Lf->sz = (SZOFFTYPE)h->c_nlink * 128;
+			else
+			    Lf->sz = (SZOFFTYPE)hf->ff_size;
+# endif	/* DARWINV<600 */
+
+			Lf->sz_def = 1;
+		    }
+
+# if	defined(HAS9660FS)
+		    else if (iso_stat) {
+			Lf->sz = (SZOFFTYPE)iso_sz;
+			Lf->sz_def = 1;
+		    }
+# endif	/* defined(HAS9660FS) */
+
+		}
+		else if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		    break;
+	    }
+	}
+/*
+ * Record the link count.
+ */
+	if (Fnlink) {
+	    switch(Ntype) {
+	    case N_NFS:
+		if (n) {
+		    Lf->nlink = (long)n->n_vattr.va_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+
+# if	DARWINV<130
+	    case N_AFPFS:
+		break;
+# endif	/* DARWINV<130 */
+
+	    case N_REGLR:
+		if (i) {
+		    Lf->nlink = (long)i->i_nlink;
+		    Lf->nlink_def = 1;
+		} else if (h) {
+
+# if	DARWINV<600
+		    Lf->nlink = (long)hm->h_nlink;
+# else	/* DARWINV>=600 */
+		    Lf->nlink = (long)h->c_nlink;
+# endif	/* DARWINV<600 */
+
+		    Lf->nlink_def = 1;
+		}
+
+# if	defined(HAS9660FS)
+		else if (iso_stat) {
+		    Lf->nlink = iso_links;
+		    Lf->nlink_def = 1;
+		}
+# endif	/* defined(HAS9660FS) */
+
+		break;
+	    }
+	    if (Lf->nlink_def && Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+#else	/* DARWINV>=800 */
+
+/*
+ * Process a vnode for Darwin >= 8.0.
+ */
+	if ((vn = getvpath(va, v))) {
+
+	/*
+	 * If the vnode yields a path, get the file's information by doing
+	 * a "safe" stat(2) of the path.
+	 */
+	    if (!statsafely(vn, &sb)) {
+
+	    /*
+	     * Save file size or offset.
+	     */
+		if (Foffset) {
+		    Lf->off_def = 1;
+		} else {
+		    switch (Ntype) {
+		    case N_FIFO:
+			if (!Fsize)
+			    Lf->off_def = 1;
+			break;
+		    case N_NFS:
+		    case N_REGLR:
+			if (type == VREG || type == VDIR) {
+			    Lf->sz = sb.st_size;
+			    Lf->sz_def = 1;
+			} else if ((type == VCHR || type == VBLK) && !Fsize)
+			    Lf->off_def = 1;
+			break;
+		    }
+		}
+	    /*
+	     * Save node number.
+	     */
+		Lf->inode = (INODETYPE)sb.st_ino;
+		Lf->inp_ty = 1; 
+	    /*
+	     * Optionally save link count.
+	     */
+		if (Fnlink) {
+		    Lf->nlink = sb.st_nlink;
+		    Lf->nlink_def = 1;
+		}
+	    /*
+	     * Save device number and path.
+	     */
+		switch (v->v_tag) {
+		case VT_DEVFS:
+		    if (vn)
+			(void) free((FREE_P *)vn);
+		    dev = DevDev;
+		    devs = 1;
+		    break;
+		default :
+		    Lf->V_path = vn;
+		    dev = sb.st_dev;
+		    devs = 1;
+		    break;
+		}
+	    /*
+	     * Save character and block device number.
+	     */
+		if ((type == VCHR) || (type == VBLK)) {
+		    rdev = sb.st_rdev;
+		    rdevs = 1;
+		}
+	    } else {
+
+	    /*
+	     * Indicate a stat(2) failure in Namech[].
+	     */
+		(void) snpf(Namech, Namechl, "stat(%s): %s", vn,
+		    strerror(errno));
+		(void) free((FREE_P *)vn);
+	    }
+	/*
+	 * Record an NFS file.
+	 */
+	    if (vfs && !strcmp(vfs->typnm, "nfs"))
+		Ntype = N_NFS;
+	}
+#endif	/* DARWINV>=800 */
+
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    Lf->fsdir = vfs->dir;
+	    Lf->fsdev = vfs->fsname;
+	}
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	Lf->dev = dev;
+	Lf->dev_def = devs;
+	Lf->rdev = rdev;
+	Lf->rdev_def = rdevs;
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	    ty = "VREG";
+	    break;
+	case VDIR:
+	    ty = "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif	/* defined(VSOCK) */
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    ty = "FIFO";
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+/*
+ * Handle some special cases:
+ *
+ * 	ioctl(fd, TIOCNOTTY) files;
+ *	memory node files;
+ *	/proc files.
+ */
+	if (type == VBAD)
+	    (void) snpf(Namech, Namechl, "(revoked)");
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named((char *)NULL,
+				   ((type == VCHR) || (type == VBLK) ? 1
+								     : 0)))
+	    Lf->sf |= SELNM;
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+#if	DARWINV>=800
+/*
+ * readvname() - read vnode's path name
+ */
+
+static int
+readvname(addr, buf, buflen)
+	KA_T addr;			/* kernel v_path address */
+	char *buf;			/* receiving buffer */
+	int buflen;			/* sizeof(buf) */
+{
+	int n, rl;
+/*
+ * Read the name 32 characters at a time, until a NUL character
+ * has been read or the buffer has been filled.
+ */
+	for (n = 0; n < buflen; addr += 32, n += 32) {
+	    rl = buflen - n;
+	    if (rl > 32)
+		rl = 32;
+	    if (kread(addr, &buf[n], rl))
+		return(0);
+	    buf[n + rl] = '\0';
+	    if ((rl = (int)strlen(&buf[n])) < 32) {
+		return(n + rl);
+	    }
+	}
+	return(0);
+}
+#endif	/* DARWINV>=800 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dnode1.c
new file mode 100644
index 0000000..20a76c1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dnode1.c
@@ -0,0 +1,107 @@
+/*
+ * dnode1.c - Darwin node functions for /dev/kmem-based lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.3 2005/11/01 20:24:51 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+#if	defined(HAS9660FS)
+
+/*
+ * Do a little preparation for #include'ing cd9660_node.h, then #include it.
+ */
+
+#undef	i_size;
+#undef	doff_t
+#undef	IN_ACCESS
+
+struct vop_abortop_args	 { int dummy; };
+struct vop_access_args	 { int dummy; };
+struct vop_blkatoff_args { int dummy; };
+struct vop_bmap_args	 { int dummy; };
+struct vop_close_args	 { int dummy; };
+struct vop_getattr_args	 { int dummy; };
+struct vop_inactive_args { int dummy; };
+struct vop_ioctl_args	 { int dummy; };
+struct vop_islocked_args { int dummy; };
+struct vop_lock_args	 { int dummy; };
+struct vop_lookup_args	 { int dummy; };
+struct vop_mmap_args	 { int dummy; };
+struct vop_open_args	 { int dummy; };
+struct vop_pathconf_args { int dummy; };
+struct vop_print_args	 { int dummy; };
+struct vop_read_args	 { int dummy; };
+struct vop_readdir_args	 { int dummy; };
+struct vop_readlink_args { int dummy; };
+struct vop_reclaim_args	 { int dummy; };
+struct vop_seek_args	 { int dummy; };
+struct vop_select_args	 { int dummy; };
+struct vop_strategy_args { int dummy; };
+struct vop_unlock_args	 { int dummy; };
+
+#include <isofs/cd9660/cd9660_node.h>
+
+/*
+ * read_iso_node() -- read CD 9660 iso_node
+ */
+
+int
+read_iso_node(v, d, dd, ino, nl, sz)
+	struct vnode *v;		/* containing vnode */
+	dev_t *d;			/* returned device number */
+	int *dd;			/* returned device-defined flag */
+	INODETYPE *ino;			/* returned inode number */
+	long *nl;			/* returned number of links */
+	SZOFFTYPE *sz;			/* returned size */
+{
+
+	struct iso_node i;
+
+	if (!v->v_data
+	||  kread((KA_T)v->v_data, (char *)&i, sizeof(i)))
+	    return(1);
+
+	*d = i.i_dev;
+	*dd = 1;
+	*ino = (INODETYPE)i.i_number;
+	*nl = (long)i.inode.iso_links;
+	*sz = (SZOFFTYPE)i.i_size;
+
+	return(0);
+}
+#endif	/* defined(HAS9660FS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dproc.c
new file mode 100644
index 0000000..6fb0dd6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dproc.c
@@ -0,0 +1,763 @@
+/*
+ * dproc.c - Darwin process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.8 2005/11/01 20:24:51 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+#include <mach/mach_traps.h>
+#include <mach/mach_init.h>
+#include <mach/message.h>
+#include <mach/vm_map.h>
+
+
+/*
+ * Local definitions
+ */
+
+#define	NPHASH	1024				/* Phash bucket count --
+						 * MUST BE A POWER OF 2!!! */
+#define PHASH(a)	(((int)((a * 31415) >> 3)) & (NPHASH - 1))
+#define PINCRSZ		256			/* Proc[] size inrement */
+
+
+/*
+ * Local structures
+ */
+
+struct phash {
+    KA_T ka;					/* kernel proc struct address */
+    struct proc *la;				/* local proc struct address */
+    struct phash *next;				/* next phash entry */
+};
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static pid_t get_parent_pid,(KA_T kpa));
+_PROTOTYPE(static int read_procs,());
+_PROTOTYPE(static void process_map,(pid_t pid));
+_PROTOTYPE(static void enter_vn_text,(KA_T va, int *n));
+
+#if	DARWINV>=700
+_PROTOTYPE(static char *getcmdnm,(pid_t pid));
+#endif	/* DARWINV>=700 */
+
+_PROTOTYPE(static void get_kernel_access,(void));
+
+
+/*
+ * Local static values
+ */
+
+static KA_T Akp = (KA_T)NULL;		/* kernel allproc chain address */
+static int Np = 0;			/* PA[] and Proc[] entry count */
+static int Npa = 0;			/* Proc[] structure allocation count */
+static MALLOC_S Nv = 0;			/* allocated Vp[] entries */
+static KA_T *Pa = (KA_T *)NULL;		/* Proc[] addresses */
+struct phash **Phash = (struct phash **)NULL;
+					/* kernel proc address hash pointers */
+static struct proc *Proc = (struct proc *)NULL;
+					/* local copy of prc struct chain */
+static KA_T *Vp = NULL;			/* vnode address cache */
+
+
+/*
+ * enter_vn_text() - enter a vnode text reference
+ */
+
+static void
+enter_vn_text(va, n)
+	KA_T va;			/* vnode address */
+	int *n;				/* Vp[] entries in use */
+{
+	int i;
+/*
+ * Ignore the request if the vnode has already been entered.
+ */
+	for (i = 0; i < *n; i++) {
+	    if (va == Vp[i])
+		return;
+	}
+/*
+ * Save the text file information.
+ */
+	alloc_lfile(" txt", -1);
+	Cfp = (struct file *)NULL;
+	process_node(va);
+	if (Lf->sf)
+	    link_lfile();
+	if (i >= Nv) {
+
+	/*
+	 * Allocate space for remembering the vnode.
+	 */
+	    Nv += 10;
+	    if (!Vp)
+		Vp=(KA_T *)malloc((MALLOC_S)(sizeof(struct vnode *)*10));
+	    else
+		Vp=(KA_T *)realloc((MALLOC_P *)Vp,(MALLOC_S)(Nv*sizeof(KA_T)));
+	    if (!Vp) {
+		(void) fprintf(stderr, "%s: no txt ptr space, PID %d\n",
+		    Pn, Lp->pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Remember the vnode.
+ */
+	Vp[*n] = va;
+	(*n)++;
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	char *cmd;
+	struct filedesc fd;
+	int i, nf;
+	MALLOC_S nb;
+	static struct file **ofb = NULL;
+	static int ofbb = 0;
+	struct proc *p;
+	int pgid;
+	int ppid = 0;
+	static char *pof = (char *)NULL;
+	static int pofb = 0;
+	short pss, sf;
+	int px;
+	uid_t uid;
+
+#if	DARWINV<800
+	struct pcred pc;
+#else	/* DARWINV>=800 */
+	struct ucred uc;
+#endif	/* DARWINV<800 */
+
+/*
+ * Read the process table.
+ */
+	if (read_procs()) {
+	    (void) fprintf(stderr, "%s: can't read process table\n", Pn);
+	    Exit(1);
+	}
+/*
+ * Examine proc structures and their associated information.
+ */
+	for (p = Proc, px = 0; px < Np; p++, px++)
+	{
+
+#if	DARWINV<800
+	    if (!p->p_cred || kread((KA_T)p->p_cred, (char *)&pc, sizeof(pc)))
+		continue;
+	    pgid = pc.p_rgid;
+	    uid = pc.p_ruid;
+#else	/* DARWINV>=800 */
+	    if (!p->p_ucred || kread((KA_T)p->p_ucred, (char *)&uc, sizeof(uc)))
+		continue;
+	    pgid = uc.cr_rgid;
+	    uid = uc.cr_uid;
+#endif	/* DARWINV<800 */
+
+#if	defined(HASPPID)
+	    ppid = get_parent_pid((KA_T)p->p_pptr);
+#endif	/* defined(HASPPID) */
+
+	/*
+	 * Get the command name.
+	 */
+
+#if	DARWINV<700
+	    cmd = p->P_COMM;
+#else	/* DARWINV>=700 */
+	   if (!strcmp(p->p_comm, "LaunchCFMApp")) {
+		if (!(cmd = getcmdnm(p->p_pid)))
+		    cmd = p->p_comm;
+	   } else
+		cmd = p->p_comm;
+#endif	/* DARWINV<700 */
+
+	/*
+	 * See if process is excluded.
+	 *
+	 * Read file structure pointers.
+	 */
+	    if (is_proc_excl(p->p_pid, pgid, (UID_ARG)uid, &pss, &sf))
+		continue;
+	    if (!p->p_fd ||  kread((KA_T)p->p_fd, (char *)&fd, sizeof(fd)))
+		continue;
+	    if (!fd.fd_refcnt || fd.fd_lastfile > fd.fd_nfiles)
+		continue;
+	/*
+	 * Allocate a local process structure.
+	 *
+	 * Set kernel's proc structure address.
+	 */
+	    if (is_cmd_excl(cmd, &pss, &sf))
+		continue;
+	    alloc_lproc(p->p_pid, pgid, ppid, (UID_ARG)uid, cmd, (int)pss,
+			(int)sf);
+	    Plf = (struct lfile *)NULL;
+	    Kpa = Pa[px];
+	/*
+	 * Save current working directory information.
+	 */
+	    if (fd.fd_cdir) {
+		alloc_lfile(CWD, -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)fd.fd_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (fd.fd_rdir) {
+		alloc_lfile(RTD, -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)fd.fd_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Process the VM map.
+	 */
+	    process_map(p->p_pid);
+	/*
+	 * Read open file structure pointers.
+	 */
+	    if (!fd.fd_ofiles || (nf = fd.fd_nfiles) <= 0)
+		continue;
+	    nb = (MALLOC_S)(sizeof(struct file *) * nf);
+	    if (nb > ofbb) {
+		if (!ofb)
+		    ofb = (struct file **)malloc(nb);
+		else
+		    ofb = (struct file **)realloc((MALLOC_P *)ofb, nb);
+		if (!ofb) {
+		    (void) fprintf(stderr, "%s: PID %d, no file * space\n",
+			Pn, p->p_pid);
+		    Exit(1);
+		}
+		ofbb = nb;
+	    }
+	    if (kread((KA_T)fd.fd_ofiles, (char *)ofb, nb))
+		continue;
+
+	    nb = (MALLOC_S)(sizeof(char) * nf);
+	    if (nb > pofb) {
+		if (!pof)
+		    pof = (char *)malloc(nb);
+		else
+		    pof = (char *)realloc((MALLOC_P *)pof, nb);
+		if (!pof) {
+		    (void) fprintf(stderr, "%s: PID %d, no file flag space\n",
+			Pn, p->p_pid);
+		    Exit(1);
+		}
+		pofb = nb;
+	    }
+	    if (!fd.fd_ofileflags || kread((KA_T)fd.fd_ofileflags, pof, nb))
+		zeromem(pof, nb);
+
+	/*
+	 * Save information on file descriptors.
+	 */
+	    for (i = 0; i < nf; i++) {
+		if (ofb[i] && !(pof[i] & UF_RESERVED)) {
+		    alloc_lfile(NULL, i);
+		    process_file((KA_T)(Cfp = ofb[i]));
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG)
+			    Lf->pof = (long)pof[i];
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+#if	DARWINV>=700
+static char *
+getcmdnm(pid)
+	pid_t pid;			/* process ID */
+{
+	static int am;
+	static char *ap = (char *)NULL;
+	char *cp, *ep, *sp;
+	int mib[3];
+	size_t sz;
+
+	if (!ap) {
+
+	/*
+	 * Allocate space for the maximum argument size.
+	 */
+	    mib[0] = CTL_KERN;
+	    mib[1] = KERN_ARGMAX;
+	    sz = sizeof(am);
+	    if (sysctl(mib, 2, &am, &sz, NULL, 0) == -1) {
+		(void) fprintf(stderr, "%s: can't get arg max, PID %d\n",
+		    Pn, pid);
+		Exit(1);
+	    }
+	    if (!(ap = (char *)malloc((MALLOC_S)am))) {
+		(void) fprintf(stderr, "%s: no arg ptr (%d) space, PID %d\n",
+		    Pn, am, pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Get the arguments for the process.
+ */
+	mib[0] = CTL_KERN;
+	mib[1] = KERN_PROCARGS;
+	mib[2] = pid;
+	sz = (size_t)am;
+	if (sysctl(mib, 3, ap, &sz, NULL, 0) == -1)
+	    return((char *)NULL);
+/*
+ * Skip to the first NUL character, which should end the saved exec path.
+ */
+	for (cp = ap; *cp && (cp < (ap + sz)); cp++) {
+	    ;
+	}
+	if (cp >= (ap + sz))
+	    return((char *)NULL);
+/*
+ * Skip trailing NULs, which should find the beginning of the command.
+ */
+	while (!*cp && (cp < (ap + sz))) {
+	    cp++;
+	}
+	if (cp >= (ap + sz))
+	    return((char *)NULL);
+/*
+ * Make sure that the command is NUL-terminated.
+ */
+	for (sp = cp; *cp && (cp < (ap + sz)); cp++) {
+	    ;
+	}
+	if (cp >= (ap + sz))
+	    return((char *)NULL);
+	ep = cp;
+/*
+ * Locate the start of the command's base name and return it.
+ */
+	for (ep = cp, cp--; cp >= sp; cp--) {
+	    if (*cp == '/') {
+		return(cp + 1);
+	    }
+	}
+	return(sp);
+}
+#endif	/* DARWINV>=700 */
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+
+/*
+ * Check kernel version.
+ */
+	(void) ckkv("Darwin", LSOF_VSTR, (char *)NULL, (char *)NULL);
+/*
+ * Set name list file path.
+ */
+	if (!Nmlst)
+	    Nmlst = N_UNIX;
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory and the name list files are readable.
+ */
+	if ((Memory && !is_readable(Memory, 1))
+	||  (Nmlst && !is_readable(Nmlst, 1)))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open kernel memory access.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0)
+	{
+	    (void) fprintf(stderr, "%s: open(%s): %s\n", Pn,
+	        Memory ? Memory : KMEM,
+		strerror(errno));
+	    Exit(1);
+	}
+	(void) build_Nl(Drive_Nl);
+	if (nlist(Nmlst, Nl) < 0) {
+	    (void) fprintf(stderr, "%s: can't read namelist from %s\n",
+		Pn, Nmlst);
+	    Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#endif	/* defined(WILLDROPGID) */
+
+}
+
+
+/*
+ * get_parent_pid() - get parent process PID
+ */
+
+static pid_t
+get_parent_pid(kpa)
+	KA_T kpa;			/* kernel parent process address */
+{
+	struct phash *ph;
+
+	if (kpa) {
+	    for (ph = Phash[PHASH(kpa)]; ph; ph = ph->next) {
+		if (ph->ka == kpa)
+		    return((pid_t)ph->la->p_pid);
+	    }
+	}
+	return((pid_t)0);
+}
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	if ((off_t)addr & (off_t)0x3) {
+
+	/*
+	 * No read is possible if the address is not aligned on a word
+	 * boundary.
+	 */
+	    return(1);
+	}
+	if (lseek(Kd, (off_t)addr, SEEK_SET) == (off_t)-1)
+	    return(1);
+	br = read(Kd, buf, len);
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * prcess_map() - process VM map
+ */
+
+static void
+process_map(pid)
+	pid_t pid;			/* process id */
+{
+	vm_address_t address = 0;
+	mach_msg_type_number_t count;
+	vm_region_extended_info_data_t e_info;
+	int n = 0;
+	mach_port_t object_name;
+	vm_size_t size = 0;
+	vm_map_t task;
+	vm_region_top_info_data_t t_info;
+
+	struct vm_object {		/* should come from <vm/vm_object.h> */
+
+#if	DARWINV<800
+	    KA_T		Dummy1[15];
+#else	/* DARWINV>=800 */
+	    KA_T		Dummy1[14];
+#endif	/* DARWINV>=800 */
+
+	    memory_object_t	pager;
+	} vmo;
+
+	struct vnode_pager {		/* from <osfmk/vm/bsd_vm.c> */
+	    KA_T		Dummy1[4];
+	    struct vnode	*vnode;
+	} vp;
+
+/*
+ * Get the task port associated with the process
+ */
+	if (task_for_pid((mach_port_name_t)mach_task_self(), pid,
+			 (mach_port_name_t *)&task)
+	!= KERN_SUCCESS) {
+	    return;
+	}
+/*
+ * Go through the task's address space, looking for blocks of memory
+ * backed by an external pager (i.e, a "vnode")
+ */
+	for (address = 0;; address += size) {
+	    count = VM_REGION_EXTENDED_INFO_COUNT;
+	    if (vm_region(task, &address, &size, VM_REGION_EXTENDED_INFO,
+			  (vm_region_info_t)&e_info, &count, &object_name)
+	    != KERN_SUCCESS) {
+		break;
+	    }
+	    if (!e_info.external_pager)
+		continue;
+	    count = VM_REGION_TOP_INFO_COUNT;
+	    if (vm_region(task, &address, &size, VM_REGION_TOP_INFO,
+			  (vm_region_info_t)&t_info, &count, &object_name)
+	    != KERN_SUCCESS) {
+		break;
+	    }
+	/*
+	 * The returned "obj_id" is the "vm_object_t" address.
+	 */
+	    if (!t_info.obj_id)
+		continue;
+	    if (kread(t_info.obj_id, (char *)&vmo, sizeof(vmo)))
+		break;
+	/*
+	 * If the "pager" is backed by a vnode then the "vm_object_t"
+	 * "memory_object_t" address is actually a "struct vnode_pager *".
+	 */
+	    if (!vmo.pager)
+		continue;
+	    if (kread((KA_T)vmo.pager, (char *)&vp, sizeof(vp)))
+		break;
+	    (void) enter_vn_text((KA_T)vp.vnode, &n);
+	}
+	return;
+}
+
+
+/*
+ * read_procs() - read proc structures
+ */
+
+static int
+read_procs()
+{
+	int h, i, np, pe;
+	KA_T kp, kpn;
+	MALLOC_S msz;
+	struct proc *p;
+	struct phash *ph, *phn;
+ 
+	if (!Akp) {
+
+	/*
+	 * Get kernel allproc structure pointer once.
+	 */
+	    if (get_Nl_value("aproc", Drive_Nl, &Akp) < 0 || !Akp) {
+		(void) fprintf(stderr, "%s: can't get proc table address\n",
+		    Pn);
+		Exit(1);
+	    }
+	}
+/*
+ * Get the current number of processes and calculate PA and Proc[] allocation
+ * sizes large enough to handle it.
+ */
+	if (get_Nl_value("nproc", Drive_Nl, &kp) < 0 || !kp) {
+	    (void) fprintf(stderr, "%s: can't get nproc address\n", Pn);
+	    Exit(1);
+	}
+	if (kread(kp, (char *)&np, sizeof(np))) {
+	    (void) fprintf(stderr, "%s: can't read process count from %s\n",
+		Pn, print_kptr(kp, (char *)NULL, 0));
+	    Exit(1);
+	}
+	for (np += np, pe = PINCRSZ; pe < np; pe += PINCRSZ)
+	    ;
+/*
+ * Allocate or reallocate the Pa[] and Proc[] tables.
+ */
+	msz = (MALLOC_S)(pe * sizeof(struct proc));
+	if (!Proc)
+	    Proc = (struct proc *)malloc(msz);
+	else if (pe > Npa)
+	    Proc = (struct proc *)realloc((MALLOC_P *)Proc, msz);
+	if (!Proc) {
+	    (void) fprintf(stderr, "%s: no space for proc table\n", Pn);
+	    Exit(1);
+	}
+	msz = (MALLOC_S)(pe * sizeof(KA_T));
+	if (!Pa)
+	    Pa = (KA_T *)malloc(msz);
+	else if (pe > Npa)
+	    Pa = (KA_T *)realloc((MALLOC_P *)Pa, msz);
+	if (!Pa) {
+	    (void) fprintf(stderr, "%s: no space for proc addr table\n", Pn);
+	    Exit(1);
+	}
+	Npa = pe;
+/*
+ * Allocate or reset the Phash[] table.
+ */
+	if (!Phash) {
+	    Phash = (struct phash **)calloc(NPHASH, sizeof(struct phash *));
+	} else {
+	    for (h = 0; h < NPHASH; h++) {
+		for (ph = Phash[h]; ph; ph = phn) {
+		    phn = ph->next;
+		    (void) free((MALLOC_P *)ph);
+		}
+		Phash[h] = (struct phash *)NULL;
+	    }
+	}
+	if (!Phash) {
+	    (void) fprintf(stderr, "%s: no space for proc address hash\n", Pn);
+	    Exit(1);
+	}
+/*
+ * Read the proc structures on the kernel's chain.
+ */
+	for (i = Np = 0, kp = Akp, p = Proc, pe += pe;
+	     kp && i < pe;
+	     i++, kp = kpn)
+	{
+	    if (kread(kp, (char *)p, sizeof(struct proc)))
+		break;
+	    kpn = (KA_T)(((KA_T)p->p_list.le_next == Akp) ? NULL
+							  : p->p_list.le_next);
+	    if (p->p_stat == 0 || p->p_stat == SZOMB)
+		continue;
+	/*
+	 * Cache the proc structure's addresses.
+	 */
+	    h = PHASH(kp);
+	    if (!(ph = (struct phash *)malloc((MALLOC_S)sizeof(struct phash))))
+	    {
+		(void) fprintf(stderr, "%s: no space for phash struct\n", Pn);
+		Exit(1);
+	    }
+	    ph->ka = kp;
+	    ph->la = p;
+	    ph->next = Phash[h];
+	    Phash[h] = ph;
+	    p++;
+	    Pa[Np++] = kp;
+	    if (Np >= Npa) {
+
+	    /*
+	     * Enlarge Pa[] and Proc[].
+	     */
+		msz = (int)((Npa + PINCRSZ) * sizeof(struct proc));
+		if (!(Proc = (struct proc *)realloc((MALLOC_P *)Proc, msz))) {
+		    (void) fprintf(stderr, "%s: no additional proc space\n",
+			Pn);
+		    Exit(1);
+		}
+		msz = (int)((Npa + PINCRSZ) * sizeof(KA_T));
+		if (!(Pa = (KA_T *)realloc((MALLOC_P *)Pa, msz))) {
+		    (void) fprintf(stderr,
+			"%s: no additional proc addr space\n", Pn);
+		    Exit(1);
+		}
+		Npa += PINCRSZ;
+	    }
+	}
+/*
+ * If too many processes were read, the chain following probably failed;
+ * report that and exit.
+ */
+	if (i >= pe) {
+	    (void) fprintf(stderr, "%s: can't follow kernel proc chain\n", Pn);
+	    Exit(1);
+	}
+/*
+ * If not in repeat mode, reduce Pa[] and Proc[] to their minimums.
+ */
+	if (Np < Npa && !RptTm) {
+	    msz = (MALLOC_S)(Np * sizeof(struct proc));
+	    if (!(Proc = (struct proc *)realloc((MALLOC_P *)Proc, msz))) {
+		(void) fprintf(stderr, "%s: can't reduce proc table\n", Pn);
+		Exit(1);
+	    }
+	    msz = (MALLOC_S)(Np * sizeof(KA_T));
+	    if (!(Pa = (KA_T *)realloc((MALLOC_P *)Pa, msz))) {
+		(void) fprintf(stderr, "%s: can't reduce proc addr table\n",
+		    Pn);
+		Exit(1);
+	    }
+	    Npa = Np;
+	}
+/*
+ * Return 0 if any processes were loaded; 1 if none were.
+ */
+	return((Np > 0) ? 0 : 1);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dproto.h
new file mode 100644
index 0000000..15ddb64
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dproto.h
@@ -0,0 +1,62 @@
+/*
+ * dproto.h - Darwin function prototypes for /dev/kmem-based lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.4 2005/11/01 20:24:51 abe Exp $
+ */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern struct l_vfs *readvfs,(KA_T vm));
+
+#if	defined(HASKQUEUE)
+_PROTOTYPE(extern void process_kqueue,(KA_T ka));
+#endif	/* defined(HASKQUEUE) */
+
+#if	defined(HASPIPEFN)
+_PROTOTYPE(extern void process_pipe,(KA_T pa));
+#endif	/* defined(HASPIPEFN) */
+
+#if	defined(HASPSXSEM)
+_PROTOTYPE(extern void process_psxsem,(KA_T pa));
+#endif	/* defined(HASPSXSEM) */
+
+#if	defined(HASPSXSHM)
+_PROTOTYPE(extern void process_psxshm,(KA_T pa));
+#endif	/* defined(HASPSXSHM) */
+
+#if	defined(HAS9660FS)
+_PROTOTYPE(extern int read_iso_node,(struct vnode *v, dev_t *d, int *dd, INODETYPE *ino, long *nl, SZOFFTYPE *sz));
+#endif	/* defined(HAS9660FS) */
+
+_PROTOTYPE(extern void process_socket,(KA_T sa));
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dsock.c
new file mode 100644
index 0000000..a5a993b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dsock.c
@@ -0,0 +1,478 @@
+/*
+ * dsock.c - Darwin socket processing functions for /dev/kmem-based lsof
+ */
+
+/*
+ * Special Darwin socket info: Justin Walker, 000927
+ */
+
+/*
+ * 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.11 2005/11/01 20:24:51 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HASIPv6)
+/*
+ * IPv6_2_IPv4()  -- macro to define the address of an IPv4 address contained
+ *                 in an IPv6 address
+ */
+
+#define	IPv6_2_IPv4(v6)	(((uint8_t *)((struct in6_addr *)v6)->s6_addr)+12)
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	struct domain d;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam, lp;
+	int fp = 0;
+	struct inpcb inp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct protosw p;
+	struct socket s;
+	struct tcpcb t;
+	KA_T ta = (KA_T)NULL;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = NULL;
+	struct sockaddr_un un;
+	int unl;
+
+#if	defined(HASIPv6)
+	struct in6pcb in6p;
+#endif	/* defined(HASIPv6) */
+
+#if	defined(AF_SYSTEM)
+	struct kern_event_pcb kev_cb;
+#endif	/* defined(AF_SYSTEM) */
+
+#if	defined(AF_NDRV)
+	char buf[IFNAMSIZ];
+	struct ndrv_cb ndrv_cb;
+	struct ifnet ifnet;
+#endif	/* defined(AF_NDRV) */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read the socket, protocol, and domain structures.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread(sa, (char *)&s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket struct from %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_type) {
+	    enter_nm("no socket type");
+	    return;
+	}
+	if (!s.so_proto
+	||  kread((KA_T)s.so_proto, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "can't read protocol switch from %s",
+		print_kptr((KA_T)s.so_proto, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!p.pr_domain
+	||  kread((KA_T)p.pr_domain, (char *)&d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Save size information.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rq = s.so_rcv.sb_cc;
+	Lf->lts.sq = s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.ltm = (unsigned int)(s.so_linger & 0xffff);
+	Lf->lts.opt = (unsigned int)(s.so_options & 0xffff);
+	Lf->lts.pqlen = (unsigned int)s.so_incqlen;
+	Lf->lts.qlen = (unsigned int)s.so_qlen;
+	Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+	Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = (unsigned int)s.so_state;
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	switch ((fam = d.dom_family)) {
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+
+#if	defined(HASIPv6)
+	case AF_INET6:
+#endif	/* defined(HASIPv6) */
+
+	    if (Fnet) {
+		if (!FnetTy
+		||  ((FnetTy == 4) && (fam == AF_INET))
+
+#if	defined(HASIPv6)
+		||  ((FnetTy == 6) && (fam == AF_INET6))
+#endif	/* defined(HASIPv6) */
+
+		)
+		    Lf->sf |= SELNET;
+	    }
+	    printiproto(p.pr_protocol);
+
+#if	defined(HASIPv6)
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+		(fam == AF_INET) ? "IPv4" : "IPv6");
+#else	/* !defined(HASIPv6) */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+#if	defined(HASIPv6)
+	    if (fam == AF_INET6) {
+
+	    /*
+	     * Read IPv6 protocol control block.
+	     */
+		if (!s.so_pcb
+		||  kread((KA_T)s.so_pcb, (char *)&in6p, sizeof(in6p)))
+		{
+		    (void) snpf(Namech, Namechl, "can't read in6pcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+	        }
+	    /*
+	     * Save IPv6 address information.
+	     */
+		enter_dev_ch(print_kptr((KA_T)(in6p.in6p_ppcb ? in6p.in6p_ppcb
+							      : s.so_pcb),
+					       (char *)NULL, 0));
+		if (p.pr_protocol == IPPROTO_TCP)
+		    ta = (KA_T)in6p.in6p_ppcb;
+		la = (unsigned char *)&in6p.in6p_laddr;
+		lp = (int)ntohs(in6p.in6p_lport);
+		if (!IN6_IS_ADDR_UNSPECIFIED(&in6p.in6p_faddr)
+		||  in6p.in6p_fport)
+		{
+		    fa = (unsigned char *)&in6p.in6p_faddr;
+		    fp = (int)ntohs(in6p.in6p_fport);
+		}
+	    } else
+#endif	/* defined(HASIPv6) */
+
+	    {
+
+	    /*
+	     * Read IPv4 protocol control block.
+	     */
+		if (!s.so_pcb
+		||  kread((KA_T)s.so_pcb, (char *)&inp, sizeof(inp))) {
+		    if (!s.so_pcb) {
+			(void) snpf(Namech, Namechl, "no PCB%s%s",
+			    (s.so_state & SS_CANTSENDMORE) ? ", CANTSENDMORE"
+						           : "",
+			    (s.so_state & SS_CANTRCVMORE) ? ", CANTRCVMORE"
+						          : "");
+		    } else {
+			(void) snpf(Namech, Namechl, "can't read inpcb at %s",
+			    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    }
+		    enter_nm(Namech);
+		    return;
+		}
+	    /*
+	     * Print Internet socket information.
+	     */
+		enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
+							    : s.so_pcb),
+					(char *)NULL, 0));
+	    /*
+	     * Save IPv4 address information.
+	     */
+		if (p.pr_protocol == IPPROTO_TCP)
+		    ta = (KA_T)inp.inp_ppcb;
+		la = (unsigned char *)&inp.inp_laddr;
+		lp = (int)ntohs(inp.inp_lport);
+		if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport) {
+		    fa = (unsigned char *)&inp.inp_faddr;
+		    fp = (int)ntohs(inp.inp_fport);
+		}
+	    }
+
+#if	defined(HASIPv6)
+	    if ((fam == AF_INET6)
+	    &&  ((la && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la))
+	    ||  ((fa && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)fa))))) {
+
+	    /*
+	     * Adjust for IPv4 addresses mapped in IPv6 addresses.
+	     */
+		if (la)
+		    la = (unsigned char *)IPv6_2_IPv4(la);
+		if (fa)
+		    fa = (unsigned char *)IPv6_2_IPv4(fa);
+		fam = AF_INET;
+	    }
+#endif	/* defined(HASIPv6) */
+
+	/*
+	 * Enter local and remote addresses by address family.
+	 */
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, fam);
+	    if (ta && !kread(ta, (char *)&t, sizeof(t))) {
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)t.t_state;
+
+#if	defined(HASSOOPT)
+		Lf->lts.kai = (unsigned int)t.t_timer[TCPT_KEEP];
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+		Lf->lts.mss = (unsigned long)t.t_maxseg;
+		Lf->lts.msss = (unsigned char)1;
+		Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	    }
+	    break;
+
+#if	defined(AF_NDRV)
+/*
+ * Process an NDRV domain socket.
+ */
+	case AF_NDRV:
+	{
+	    (void) snpf(Lf->type, sizeof(Lf->type), "ndrv");
+	/*
+	 * Read protocol control block.
+	 */
+	    if (!s.so_pcb
+	    ||  kread((KA_T)s.so_pcb, (char *)&ndrv_cb, sizeof(ndrv_cb))) {
+		(void) snpf(Namech, Namechl, "can't read ndrv_cb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Print NDRV socket information.
+	 */
+	    enter_dev_ch(print_kptr((KA_T)(s.so_pcb), (char *)NULL, 0));
+	/*
+	 * Print device name, if bound
+	 */
+	    if (!ndrv_cb.nd_if
+	    ||  kread((KA_T)ndrv_cb.nd_if, (char *)&ifnet, sizeof(ifnet))) {
+		(void) snpf(Namech, Namechl, "can't read ifnet at %s",
+			    print_kptr((KA_T)ndrv_cb.nd_if, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    if (!ifnet.if_name
+	    ||  kread((KA_T)ifnet.if_name, buf, sizeof(buf))) {
+		(void) snpf(Namech, Namechl, "can't read ifnet.if_name at %s",
+			    print_kptr((KA_T)ifnet.if_name, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    (void) snpf(Namech, Namechl, "-> %s%d", buf, ifnet.if_unit);
+	}
+	break;
+#endif	/* defined(AF_NDRV) */
+
+#if	defined(pseudo_AF_KEY)
+/*
+ * Process an [internal] key-management function socket
+ */
+	case pseudo_AF_KEY:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "key");
+	    break;
+#endif	/* defined(pseudo_AF_KEY) */
+
+#if	defined(AF_SYSTEM)
+/*
+ * Process a SYSTEM domain socket
+ */
+	case AF_SYSTEM:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "systm");
+	/*
+	 * Read protocol control block.
+	 */
+	    if (!s.so_pcb
+	    ||  kread((KA_T)s.so_pcb, (char *)&kev_cb, sizeof(kev_cb))) {
+		(void) snpf(Namech, Namechl, "can't read kev_cb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Print SYSTEM socket information.
+	 */
+	    enter_dev_ch(print_kptr((KA_T)(s.so_pcb), (char *)NULL, 0));
+	    (void) snpf(Namech, Namechl, "[%lx:%lx:%lx]",
+			kev_cb.vendor_code_filter,
+			kev_cb.class_filter, kev_cb.subclass_filter);
+	    break;
+#endif	/* defined(AF_SYSTEM) */
+
+#if	defined(AF_PPP)
+/*
+ * Process a PPP domain socket
+ */
+	case AF_PPP:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "ppp");
+	    break;
+#endif	/* defined(AF_PPP) */
+
+/*
+ * Process a ROUTE domain socket.
+ */
+	case AF_ROUTE:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "rte");
+	    if (s.so_pcb)
+		enter_dev_ch(print_kptr((KA_T)(s.so_pcb), (char *)NULL, 0));
+	    else
+		(void) snpf(Namech, Namechl, "no protocol control block");
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    break;
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    if (!s.so_pcb
+	    ||  kread((KA_T)s.so_pcb, (char *)&unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+	    if (unp.unp_addr) {
+		if (kread((KA_T)unp.unp_addr, (char *)&un, sizeof(un))) {
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+		ua = &un;
+	    }
+	    if (!ua) {
+		ua = &un;
+		(void) bzero((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *)&uc, sizeof(uc)))
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			else
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)uc.unp_socket,(char *)NULL,0));
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	    if (ua->sun_path[0]) {
+		unl = ua->sun_len - offsetof(struct sockaddr_un, sun_path);
+		if ((unl < 0) || (unl >= sizeof(ua->sun_path)))
+		    unl = sizeof(ua->sun_path) - 1;
+		ua->sun_path[unl] = '\0';
+		if (ua->sun_path[0] && Sfile && is_file_named(ua->sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (ua->sun_path[0] && !Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dstore.c
new file mode 100644
index 0000000..06a91f7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/dstore.c
@@ -0,0 +1,105 @@
+/*
+ * dstore.c - Darwin global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.5 2005/11/01 20:24:51 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+struct file *Cfp;			/* curent file's file struct pointer */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+
+	{ "aproc",	"_allproc"	},
+	{ "nproc",	"_nprocs"	},
+	{ X_NCACHE,	"_nchashtbl"	},
+	{ X_NCSIZE,	"_nchash"	},
+	{ "",		""		},
+	{ NULL,		NULL		}
+};
+
+int Kd = -1;				/* KMEM descriptor */
+KA_T Kpa;				/* kernel proc struct address */
+struct l_vfs *Lvfs = NULL;		/* local vfs structure table */
+
+int Np = 0;				/* number of kernel processes */
+
+struct kinfo_proc *P = NULL;		/* local process table copy */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FASYNC,		FF_ASYNC	},
+	{ (long)FFSYNC,		FF_FSYNC	},
+	{ (long)FMARK,		FF_MARK		},
+	{ (long)FDEFER,		FF_DEFER	},
+	{ (long)FHASLOCK,	FF_HASLOCK	},
+	{ (long)O_NOCTTY,	FF_NOCTTY	},
+	{ (long)O_EVTONLY,	FF_EVTONLY	},
+	{ (long)0,		NULL 		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,	POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/machine.h b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/machine.h
new file mode 100644
index 0000000..ebb2490
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/kmem/machine.h
@@ -0,0 +1,647 @@
+/*
+ * machine.h - Darwin definitions 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: machine.h,v 1.16 2010/07/29 16:03:04 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+# if	DARWINV>=800
+#include "/usr/include/string.h"
+# endif	/* DARWINV>=800 */
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+/* #define	HASDCACHE	1	*/
+/* #define	HASENVDC	"LSOFDEVCACHE"	*/
+/* #define	HASPERSDC	"%h/%p.lsof_%L"	*/
+/* #define	HASPERSDCPATH	"LSOFPERSDCPATH"	*/
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+/* #define	HASFSINO	1 */
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+# if	DARWINV<800
+#define	HASINODE	1
+# endif	/* DARWINV<800 */
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+# if	DARWINV>=800
+#define	HASLFILEADD char *V_path;
+#define CLRLFILEADD(lf)	if (lf->V_path) { \
+			    (void) free((FREE_P *)lf->V_path); \
+			    lf->V_path = (char *)NULL; \
+			}
+#define SETLFILEADD Lf->V_path = (char *)NULL;
+# endif	/* DARWINV>=800 */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+# if	DARWINV<800
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+# else	/* DARWINV>=800 */
+/* #define	HASNCACHE	1   */
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+# endif	/* DARWINV<800 */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+# if	DARWINV<800
+/* #define	HASPIPEFN	process_pipe? */
+# else	/* DARWINV>=800 */
+#define	HASPIPEFN	process_pipe
+# endif	/* DARWINV<800 */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev?	*/
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+# if	DARWINV<800
+/* #define	HASPRIVNMCACHE	<function name>	*/
+# else	/* DARWINV>=800 */
+#define	HASPRIVNMCACHE	print_v_path
+# endif	/* DARWINV<800 */
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+# if	defined(HASPROCFS)
+#undef	HASPROCFS
+#define	HASPROCFS	"proc"
+# endif	/* defined(HASPROCFS) */
+
+/* #define		HASPROCFS	"proc?" */
+/* #define		HASFSTYPE	1 */
+
+#define	HASPINODEN	1
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1 */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	DARWINV>=700
+#define	HASWIDECHAR	1
+# endif	/* DARWINV>=700 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+#define	HASSPECDEVD	process_dev_stat
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior
+ * to R4 usually don't.
+ * doesn't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+# if	DARWINV>=800
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"		 /* INODETYPE printf specification
+					 * modifier */
+# endif	/* DARWINV>=800 */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+/* #define	USE_LIB_READDEV			1	   rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+
+#if	DARWINV<800
+#define	USE_LIB_RNMH				1	/* rnmh.c */
+#else	/* DARWINV>800 */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+#endif	/* DARWINV<800 */
+
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	/* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	memset(a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/Makefile b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/Makefile
new file mode 100644
index 0000000..bda2623
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/Makefile
@@ -0,0 +1,171 @@
+
+# Darwin libproc-based lsof Makefile
+#
+# $Id: Makefile,v 1.7 2009/03/25 19:21:37 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DSTROOT}/usr/sbin
+
+DOC=	${DSTROOT}/usr/share/man/man8
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=	${RC_CFLAGS}
+CDEFS=	${CDEF} ${CFGF}
+INCL=	${DINC}
+override CFLAGS= ${CDEFS} ${INCL} ${DEBUG}
+
+GRP=    wheel
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    ddev.c dfile.c dmnt.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c util.c
+
+OBJ=	ddev.o dfile.o dmnt.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install-strip: all FRC
+	@if [ -n "${SYMROOT}" ]; then \
+	  mkdir -p ${SYMROOT}; \
+	  cp -p ${PROG} ${SYMROOT}/${PROG}; \
+	fi
+	mkdir -p ${BIN}
+	install -c -s -m 755 -g ${GRP} ${PROG} ${BIN}
+	mkdir -p ${DOC}
+	install -c -m 444 ${MAN} ${DOC}
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof for Darwin below 8'
+	@echo 'should be installed setgid to the group that has permission'
+	@echo 'to read /dev/kmem, often kmem or sys.  Lsof for Darwin 8 and'
+	@echo 'above should be installed setuid-root.  Your install rule'
+	@echo 'actions for Darwin below 8 might look something like this:'
+	@echo ''
+	@echo '    install -m 2xxx -g $${GRP} $${PROG} $${BIN}'
+	@echo '    install -m 444 $${MAN} $${DOC}'
+	@echo ''
+	@echo 'Your install rule actions for Darwin 8 and above might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '    install -m 4xxx -o root $${PROG} $${BIN}'
+	@echo '    install -m 444 $${MAN} $${DOC}'
+	@echo ''
+	@echo 'You will have to complete the xxx modes, the GRP value, and'
+	@echo 'the skeletons for the BIN and DOC strings, given at the'
+	@echo 'beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo '    GRP= kmem'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define  LSOF_CINFO      "${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+ddev.o:		${HDR} ddev.c
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/Mksrc
new file mode 100755
index 0000000..870d6ca
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc -- make Darwin libproc-based lsof source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.5 2005/11/06 12:50:09 abe Exp $
+
+
+D=dialects/darwin/libproc
+L="dlsof.h ddev.c dfile.c dmnt.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/ddev.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/ddev.c
new file mode 100644
index 0000000..2240501
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/ddev.c
@@ -0,0 +1,549 @@
+/*
+ * ddev.c -- Darwin device support functions for libproc-based lsof
+ */
+
+
+/*
+ * Portions Copyright 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by Allan Nathanson, Apple Computer, 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 Computer, 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
+ *    Computer, 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005 Apple Computer, Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ddev.c,v 1.2 2006/03/27 23:23:13 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if	defined(DVCH_DEVPATH)
+#define	DDEV_DEVPATH	DVCH_DEVPATH
+#else	/* !defined(DVCH_DEVPATH) */
+#define	DDEV_DEVPATH	"/dev"
+#endif	/* defined(DVCH_DEVPATH) */
+
+#define	LIKE_BLK_SPEC	"like block special"
+#define	LIKE_CHR_SPEC	"like character special"
+
+#if	defined(USE_STAT)
+#define	STATFN	stat
+#else	/* !defined(USE_STAT) */
+#define	STATFN	lstat
+#endif	/* defined(USE_STAT) */
+
+
+/*
+ * Local static variables.
+ */
+
+static dev_t *ADev = (dev_t *) NULL;	/* device numbers besides DevDev found
+					 * inside DDEV_DEVPATH */
+static int ADevA = 0;			/* entries allocated to ADev[] */
+static int ADevU = 0;			/* entries used in ADev[] */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int rmdupdev,(struct l_dev ***dp, int n, char *nm));
+_PROTOTYPE(static void saveADev,(struct stat *s));
+
+
+#if	defined(HASSPECDEVD)
+/*
+ * HASSPECDEVD() -- process stat(2) result to see if the device number is
+ *		    inside DDEV_DEVPATH "/"
+ *
+ * exit: s->st_dev changed to DevDev, as required
+ */
+
+void
+HASSPECDEVD(p, s)
+	char *p;			/* file path */
+	struct stat *s;			/* stat(2) result for file */
+{
+	int i;
+
+	switch (s->st_mode & S_IFMT) {
+	case S_IFCHR:
+	case S_IFBLK:
+	    if (s->st_dev == DevDev)
+		return;
+	    (void) readdev(0);
+	    if (!ADev)
+		return;
+	    for (i = 0; i < ADevU; i++) {
+		if (s->st_dev == ADev[i]) {
+		    s->st_dev = DevDev;
+		    return;
+		}
+	    }
+	}
+}
+#endif	/* defined(HASSPECDEVD) */
+
+
+/*
+ * printdevname() -- print character device name
+ */
+
+int
+printdevname(dev, rdev, f, nty)
+	dev_t	*dev;		/* device */
+	dev_t	*rdev;		/* raw device */
+	int	f;		/* 1 = follow with '\n' */
+	int	nty;		/* node type: N_BLK or N_chr */
+{
+	char *cp, *ttl;
+	struct l_dev *dp;
+	int i, len;
+/*
+ * See if the device node resides in DDEV_DEVPATH.  If it does, return zero
+ * to indicate the vnode path is to be used for the NAME column.
+ */
+	if (*dev == DevDev)
+	    return(0);
+	readdev(0);
+	for (i = 0; i < ADevU; i++) {
+	    if (*dev == ADev[i])
+		return(0);
+	}
+/*
+ * This device is not in DDEV_DEVPATH.
+ *
+ * See if it has a DDEV_DEVPATH analogue by searching the device table for a
+ * match without inode number and dev.
+ */
+
+#if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(&DevDev, rdev, 0, 1);
+	else
+#endif	/* defined(HASBLKDEV) */
+
+	    dp = lkupdev(&DevDev, rdev, 0, 1);
+	if (dp) {
+
+	/*
+	 * A match was found.  Record it as a name column addition.
+	 */
+	    ttl = (nty == N_BLK) ? LIKE_BLK_SPEC : LIKE_CHR_SPEC;
+	    len = (int)(1 + strlen(ttl) + 1 + strlen(dp->name) + 1);
+	    if (!(cp = (char *)malloc((MALLOC_S)(len + 1)))) {
+		(void) fprintf(stderr, "%s: no nma space for: (%s %s)\n",
+		    Pn, ttl, dp->name);
+		Exit(1);
+	    }
+	    (void) snpf(cp, len + 1, "(%s %s)", ttl, dp->name);
+	    (void) add_nma(cp, len);
+	    (void) free((MALLOC_P *)cp);
+	}
+/*
+ * Return zero to indicate the vnode path is to be used for the NAME column.
+ */
+	return(0);
+}
+
+
+/*
+ * readdev() -- read device names, modes and types
+ */
+
+void
+readdev(skip)
+	int skip;			/* skip device cache read if 1 --
+					 * ignored since device cache not
+					 * used */
+{
+	DIR *dfp;
+	int dnamlen;
+	struct dirent *dp;
+	char *fp = (char *)NULL;
+	char *path = (char *)NULL;
+	int i = 0;
+	int j = 0;
+	MALLOC_S pl, sz;
+	struct stat sb;
+/*
+ * Read device names but once.
+ */
+	if (Sdev)
+	    return;
+/*
+ * Prepare to scan DDEV_DEVPATH.
+ */
+	Dstkn = Dstkx = 0;
+	Dstk = (char **)NULL;
+	(void) stkdir(DDEV_DEVPATH);
+/*
+ * Unstack the next directory.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dfp = OpenDir(Dstk[Dstkx]))) {
+
+# if	defined(WARNDEVACCESS)
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		    safestrprt(Dstk[Dstkx], stderr, 1);
+		}
+# endif	/* defined(WARNDEVACCESS) */
+
+		(void) free((FREE_P *)Dstk[Dstkx]);
+		Dstk[Dstkx] = (char *)NULL;
+		continue;
+	    }
+	    if (path) {
+		(void) free((FREE_P *)path);
+		path = (char *)NULL;
+	    }
+	    if (!(path = mkstrcat(Dstk[Dstkx], -1, "/", 1, (char *)NULL, -1,
+				  &pl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(Dstk[Dstkx], stderr, 1);
+		Exit(1);
+	    }
+	    (void) free((FREE_P *)Dstk[Dstkx]);
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Scan the directory.
+	 */
+	    for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+		if (dp->d_ino == 0 || dp->d_name[0] == '.')
+		    continue;
+	    /*
+	     * Form the full path name and get its status.
+	     */
+		dnamlen = (int)dp->d_namlen;
+		if (fp) {
+		    (void) free((FREE_P *)fp);
+		    fp = (char *)NULL;
+		}
+		if (!(fp = mkstrcat(path, pl, dp->d_name, dnamlen,
+				    (char *)NULL, -1, (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr, "%s: no space for: ", Pn);
+		    safestrprt(path, stderr, 0);
+		    safestrprtn(dp->d_name, dnamlen, stderr, 1);
+		    Exit(1);
+		}
+		if (STATFN(fp, &sb) != 0) {
+		    if (errno == ENOENT)	/* a sym link to nowhere? */
+			continue;
+
+# if	defined(WARNDEVACCESS)
+		    if (!Fwarn) {
+			int errno_save = errno;
+
+			(void) fprintf(stderr, "%s: can't stat ", Pn);
+			safestrprt(fp, stderr, 0);
+			(void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		    }
+# endif	/* defined(WARNDEVACCESS) */
+
+		    continue;
+		}
+	    /*
+	     * If it's a subdirectory, stack its name for later
+	     * processing.
+	     */
+		if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+
+		/*
+		 * Skip /dev/fd.
+		 */
+		    if (strcmp(fp, "/dev/fd"))
+			(void) stkdir(fp);
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFLNK) {
+
+		/*
+		 * Ignore symbolic links.
+		 */
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFCHR) {
+
+		/*
+		 * Save character device information in Devtp[].
+		 */
+		    if (i >= Ndev) {
+			Ndev += DEVINCR;
+			if (!Devtp)
+			    Devtp = (struct l_dev *)malloc(
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			else
+			    Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			if (!Devtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for character device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    Devtp[i].rdev = sb.st_rdev;
+		    Devtp[i].inode = (INODETYPE)sb.st_ino;
+		    if (!(Devtp[i].name = mkstrcpy(fp, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr,
+			    "%s: no space for device name: ", Pn);
+			safestrprt(fp, stderr, 1);
+			Exit(1);
+		    }
+		    Devtp[i].v = 0;
+		    i++;
+		}
+
+# if	defined(HASBLKDEV)
+		if ((sb.st_mode & S_IFMT) == S_IFBLK) {
+
+		/*
+		 * Save block device information in BDevtp[].
+		 */
+		    if (j >= BNdev) {
+			BNdev += DEVINCR;
+			if (!BDevtp)
+			    BDevtp = (struct l_dev *)malloc(
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			else
+			    BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			if (!BDevtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for block device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    BDevtp[j].name = fp;
+		    fp = (char *)NULL;
+		    BDevtp[j].inode = (INODETYPE)sb.st_ino;
+		    BDevtp[j].rdev = sb.st_rdev;
+		    BDevtp[j].v = 0;
+		    j++;
+		}
+# endif	/* defined(HASBLKDEV) */
+
+	    /*
+	     * Save a possible new st_dev number within DDEV_DEVPATH.
+	     */
+		if (sb.st_dev != DevDev)
+		    (void) saveADev(&sb);
+	    }
+	    (void) CloseDir(dfp);
+	}
+/*
+ * Free any unneeded space that was allocated.
+ */
+	if (ADev && (ADevU < ADevA)) {
+
+	/*
+	 * Reduce space allocated to additional DDEV_DEVPATH device numbers.
+	 */
+	    if (!ADevU) {
+
+	    /*
+	     * If no space was used, free the entire allocation.
+	     */
+		(void) free((FREE_P *)ADev);
+		ADev = (dev_t *)NULL;
+		ADevA = 0;
+	    } else {
+
+	    /*
+	     * Reduce the allocation to what was used.
+	     */
+		sz = (MALLOC_S)(ADevU * sizeof(dev_t));
+		if (!(ADev = (dev_t *)realloc((MALLOC_P *)ADev, sz))) {
+		    (void) fprintf(stderr, "%s: can't reduce ADev[]\n", Pn);
+		    Exit(1);
+		}
+	    }
+	}
+	if (!Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	}
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+
+# if	defined(HASBLKDEV)
+/*
+ * Reduce the BDevtp[] (optional) and Devtp[] tables to their minimum
+ * sizes; allocate and build sort pointer lists; and sort the tables by
+ * device number.
+ */
+	if (BNdev) {
+	    if (BNdev > j) {
+		BNdev = j;
+		BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+			 (MALLOC_S)(sizeof(struct l_dev) * BNdev));
+	    }
+	    if (!(BSdev = (struct l_dev **)malloc(
+			  (MALLOC_S)(sizeof(struct l_dev *) * BNdev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for block device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (j = 0; j < BNdev; j++) {
+		BSdev[j] = &BDevtp[j];
+	    }
+	    (void) qsort((QSORT_P *)BSdev, (size_t)BNdev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    BNdev = rmdupdev(&BSdev, BNdev, "block");
+	}
+	
+#  if	!defined(NOWARNBLKDEV)
+	else {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: no block devices found\n", Pn);
+	}
+#  endif	/* !defined(NOWARNBLKDEV) */
+# endif	/* defined(HASBLKDEV) */
+
+	if (Ndev) {
+	    if (Ndev > i) {
+		Ndev = i;
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    }
+	    if (!(Sdev = (struct l_dev **)malloc(
+			 (MALLOC_S)(sizeof(struct l_dev *) * Ndev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for character device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (i = 0; i < Ndev; i++) {
+		Sdev[i] = &Devtp[i];
+	    }
+	    (void) qsort((QSORT_P *)Sdev, (size_t)Ndev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    Ndev = rmdupdev(&Sdev, Ndev, "char");
+	} else {
+	    (void) fprintf(stderr, "%s: no character devices found\n", Pn);
+	    Exit(1);
+	}
+}
+
+
+/*
+ * rmdupdev() - remove duplicate (major/minor/inode) devices
+ */
+
+static int
+rmdupdev(dp, n, nm)
+	struct l_dev ***dp;	/* device table pointers address */
+	int n;			/* number of pointers */
+	char *nm;		/* device table name for error message */
+{
+	int i, j, k;
+	struct l_dev **p;
+
+	for (i = j = 0, p = *dp; i < n ;) {
+	    for (k = i + 1; k < n; k++) {
+		if (p[i]->rdev != p[k]->rdev || p[i]->inode != p[k]->inode)
+		    break;
+	    }
+	    if (i != j)
+		p[j] = p[i];
+	    j++;
+	    i = k;
+	}
+	if (n == j)
+	    return(n);
+	if (!(*dp = (struct l_dev **)realloc((MALLOC_P *)*dp,
+		    (MALLOC_S)(j * sizeof(struct l_dev *)))))
+	{
+	    (void) fprintf(stderr, "%s: can't realloc %s device pointers\n",
+		Pn, nm);
+	    Exit(1);
+	}
+	return(j);
+}
+
+
+/*
+ * saveADev() - save additional device number appearing inside DDEV_DEVPATH
+ */
+
+static void
+saveADev(s)
+	struct stat *s;			/* stat(2) buffer for file */
+{
+	int i;
+	MALLOC_S sz;
+/*
+ * Process VCHR files.
+ *
+ * Optionally process VBLK files.
+ */
+
+#if	defined(HASBLKDEV)
+	if (((s->st_mode & S_IFMT) != S_IFBLK)
+	&&  ((s->st_mode & S_IFMT) != S_IFCHR))
+#else	/* !defined(HASBLKDEV) */
+	if ((s->st_mode & S_IFCHR) != S_IFCHR)
+#endif	/* defined(HASBLKDEV) */
+
+		return;
+/*
+ * See if this is a new VBLK or VCHR st_dev value for ADev[].
+ */
+	for (i = 0; i < ADevU; i++) {
+	    if (s->st_dev == ADev[i])
+		return;
+	}
+/*
+ * This is a new device number to add to ADev[].
+ */
+	if (ADevU >= ADevA) {
+	    ADevA += 16;
+	    sz = (MALLOC_S)(ADevA * sizeof(dev_t));
+	    if (ADev)
+		ADev = (dev_t *)realloc((MALLOC_P *)ADev, sz);
+	    else
+		ADev = (dev_t *)malloc(sz);
+	    if (!ADev) {
+		(void) fprintf(stderr, "%s: no space for ADev[]\n", Pn);
+		Exit(1);
+	    }
+	}
+	ADev[ADevU++] = s->st_dev;
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dfile.c
new file mode 100644
index 0000000..b3c9da6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dfile.c
@@ -0,0 +1,579 @@
+/*
+ * dfile.c -- Darwin file processing functions 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005-2007 Apple Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.7 2011/08/07 22:52:30 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * enter_file_info() -- enter file information
+ */
+
+void
+enter_file_info(pfi)
+	struct proc_fileinfo *pfi;	/* pointer to process file info */
+{
+	int f;
+/*
+ * Construct access code
+ */
+	f = pfi->fi_openflags & (FREAD | FWRITE);
+	if (f == FREAD)
+	    Lf->access = 'r';
+	else if (f == FWRITE)
+	    Lf->access = 'w';
+	else if (f == (FREAD | FWRITE))
+	    Lf->access = 'u';
+/*
+ * Save the offset / size
+ */
+	Lf->off = (SZOFFTYPE)pfi->fi_offset;
+	if (Foffset)
+	    Lf->off_def = 1;
+/*
+ * Save file structure information as requested.
+ */
+	if (Fsv & FSV_FG) {
+	    Lf->ffg = (long)pfi->fi_openflags;
+	    Lf->fsv |= FSV_FG;
+	}
+}
+
+
+/*
+ * enter_vnode_info() -- enter vnode information
+ */
+
+void
+enter_vnode_info(vip)
+	struct vnode_info_path *vip;	/* pointer to vnode info with path */
+{
+	char buf[32], *cp;
+	dev_t dev = 0;
+	int devs = 0;
+	struct mounts *mp;
+/*
+ * Derive file type.
+ */
+	switch ((int)(vip->vip_vi.vi_stat.vst_mode & S_IFMT)) {
+	case S_IFIFO:
+	    cp = "FIFO";
+	    Ntype = N_FIFO;
+	    break;
+	case S_IFCHR:
+	    cp = "CHR";
+	    Ntype = N_CHR;
+	    break;
+	case S_IFDIR:
+	    cp = "DIR";
+	    Ntype = N_REGLR;
+	    break;
+	case S_IFBLK:
+	    cp = "BLK";
+	    Ntype = N_BLK;
+	    break;
+	case S_IFREG:
+	    cp = "REG";
+	    Ntype = N_REGLR;
+	    break;
+	default:
+	    (void) snpf(buf, sizeof(buf), "%04o",
+		(((vip->vip_vi.vi_stat.vst_mode & S_IFMT) >> 12) & 0xfff));
+	    cp = buf;
+	    Ntype = N_REGLR;
+	}
+	if (!Lf->type[0])
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", cp);
+	Lf->ntype = Ntype;
+/*
+ * Save device number and path
+ */
+	switch (Ntype) {
+	case N_FIFO:
+	    break;
+	case N_CHR:
+	case N_BLK:
+	    Lf->rdev = vip->vip_vi.vi_stat.vst_rdev;
+	    Lf->rdev_def = 1;
+	    /* fall through */
+	default:
+	    Lf->dev = dev = vip->vip_vi.vi_stat.vst_dev;
+	    Lf->dev_def = devs = 1;
+	}
+/*
+ * Save path name.
+ */
+	vip->vip_path[sizeof(vip->vip_path) - 1] = '\0';
+	if (vip->vip_path[0] != '\0') {
+	    Lf->V_path = mkstrcpy(vip->vip_path, (MALLOC_S *)NULL);
+	}
+/*
+ * Save node number.
+ */
+	Lf->inode = (INODETYPE)vip->vip_vi.vi_stat.vst_ino;
+	Lf->inp_ty = 1;
+/*
+ * Save link count, as requested.
+ */
+	if (Fnlink) {
+	    Lf->nlink = vip->vip_vi.vi_stat.vst_nlink;
+	    Lf->nlink_def = 1;
+	    if (Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * If a device number is defined, locate file system and save its identity.
+ */
+	if (devs) {
+	    for (mp = readmnt(); mp; mp = mp->next) {
+		if (dev == mp->dev) {
+		    Lf->fsdir = mp->dir;
+		    Lf->fsdev = mp->fsname;
+		    if (mp->is_nfs && Fnfs)
+			Lf->sf |= SELNFS;
+		    break;
+		}
+	    }
+	}
+/*
+ * Save the file size.
+ */
+	switch (Ntype) {
+	case N_CHR:
+	case N_FIFO:
+	    Lf->off_def = 1;
+	    break;
+	default:
+	    Lf->sz = (SZOFFTYPE)vip->vip_vi.vi_stat.vst_size;
+	    Lf->sz_def = 1;
+	}
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named(NULL,
+				   ((Ntype == N_CHR) || (Ntype == N_BLK) ? 1
+									 : 0)))
+	{
+	    Lf->sf |= SELNM;
+	}
+/*
+ * Enter name characters.
+ */
+	if (!Lf->nm && Namech[0])
+	    enter_nm(Namech);
+}
+
+
+/*
+ * err2nm() -- convert errno to a message in Namech
+ */
+
+void
+err2nm(pfx)
+	char *pfx;			/* Namech message prefix */
+{
+	char *sfx;
+
+	switch (errno) {
+	case EBADF:
+
+	/*
+	 * The file descriptor is no longer available.
+	 */
+	    sfx = "FD unavailable";
+	    break;
+	case ESRCH:
+
+	/*
+	 * The process is no longer available.
+	 */
+	    sfx = "process unavailable";
+	    break;
+	default:
+
+	/*
+	 * All other errors are reported with strerror() information.
+	 */
+	    sfx = strerror(errno);
+	}
+	(void) snpf(Namech, Namechl, "%s: %s", pfx, sfx);
+	enter_nm(Namech);
+}
+
+
+/*
+ * print_nm() -- print Name column
+ */
+void
+print_nm(lf)
+	struct lfile *lf;
+{
+	printname(0);
+	putchar('\n');
+}
+
+
+/*
+ * print_v_path() -- print vnode's path
+ */
+
+int
+print_v_path(lf)
+	struct lfile *lf;
+{
+	if (lf->V_path) {
+	    safestrprt(lf->V_path, stdout, 0);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * process_atalk() -- process an Apple Talk file
+ */
+
+void
+process_atalk(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	(void) snpf(Lf->type, sizeof(Lf->type), "ATALK");
+	return;
+}
+
+
+/*
+ * process_fsevents() -- process a file system events file
+ */
+
+void
+process_fsevents(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	(void) snpf(Lf->type, sizeof(Lf->type), "FSEVENTS");
+}
+
+
+/*
+ * process_kqueue() -- process a kernel queue file
+ */
+
+void
+process_kqueue(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	struct kqueue_fdinfo kq;
+	int nb;
+/*
+ * Get the kernel queue file information.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), "KQUEUE");
+	nb = proc_pidfdinfo(pid, fd, PROC_PIDFDKQUEUEINFO, &kq, sizeof(kq));
+	if (nb <= 0) {
+	    (void) err2nm("kqueue");
+	    return;
+	} else if (nb < sizeof(kq)) {
+	    (void) fprintf(stderr,
+		"%s: PID %d, FD %d; proc_pidfdinfo(PROC_PIDFDKQUEUEINFO);\n",
+		Pn, pid, fd);
+	    (void) fprintf(stderr,
+		"      too few bytes; expected %ld, got %d\n",
+		sizeof(kq), nb);
+	    Exit(1);
+	}
+/*
+ * Enter the kernel queue file information.
+ */
+	enter_file_info(&kq.pfi);
+/*
+ * Enter queue counts as NAME column information.
+ */
+	(void) snpf(Namech, Namechl,
+	    "count=%" SZOFFPSPEC "u, state=%#x",
+	    (SZOFFTYPE)kq.kqueueinfo.kq_stat.vst_size,
+	    kq.kqueueinfo.kq_state);
+	enter_nm(Namech);
+}
+
+
+/*
+ * process_pipe() -- process pipe file
+ */
+
+static void
+process_pipe_common(pi)
+	struct pipe_fdinfo *pi;
+{
+	char dev_ch[32], *ep;
+        size_t sz;
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "PIPE");
+/*
+ * Enter the pipe handle as the device.
+ */
+	(void) snpf(dev_ch, sizeof(dev_ch), "%s",
+	    print_kptr((KA_T)pi->pipeinfo.pipe_handle, (char *)NULL, 0));
+	enter_dev_ch(dev_ch);
+/*
+ * Enable offset or size reporting.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    Lf->sz = (SZOFFTYPE)pi->pipeinfo.pipe_stat.vst_blksize;
+	    Lf->sz_def = 1;
+	}
+/*
+ * If there is a peer handle, enter it in as NAME column information.
+ */
+	if (pi->pipeinfo.pipe_peerhandle) {
+	    (void) snpf(Namech, Namechl, "->%s",
+		print_kptr((KA_T)pi->pipeinfo.pipe_peerhandle, (char *)NULL, 0));
+	    enter_nm(Namech);
+	} else
+	    Namech[0] = '\0';
+/*
+ * If the pipe has a count, add it to the NAME column.
+ */
+	if (pi->pipeinfo.pipe_stat.vst_size) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", cnt=%" SZOFFPSPEC "u",
+		(SZOFFTYPE)pi->pipeinfo.pipe_stat.vst_size);
+	}
+}
+	
+	
+void
+process_pipe(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	int nb;
+	struct pipe_fdinfo pi;
+/*
+ * Get pipe file information.
+ */
+	nb = proc_pidfdinfo(pid, fd, PROC_PIDFDPIPEINFO, &pi, sizeof(pi));
+	if (nb <= 0) {
+	    (void) err2nm("pipe");
+	    return;
+	} else if (nb < sizeof(pi)) {
+	    (void) fprintf(stderr,
+		"%s: PID %d, FD %d; proc_pidfdinfo(PROC_PIDFDPIPEINFO);\n",
+		Pn, pid, fd);
+	    (void) fprintf(stderr,
+		"      too few bytes; expected %ld, got %d\n",
+	       sizeof(pi), nb);
+	    Exit(1);
+	}
+
+	process_pipe_common(&pi);
+}
+
+
+/*
+ * process_psem() -- process a POSIX semaphore file
+ */
+
+void
+process_psem(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	int nb;
+	struct psem_fdinfo ps;
+/*
+ * Get the sempaphore file information.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), "PSXSEM");
+	nb = proc_pidfdinfo(pid, fd, PROC_PIDFDPSEMINFO, &ps, sizeof(ps));
+	if (nb <= 0) {
+	    (void) err2nm("semaphore");
+	    return;
+	} else if (nb < sizeof(ps)) {
+	    (void) fprintf(stderr,
+		"%s: PID %d, FD %d; proc_pidfdinfo(PROC_PIDFDPSEMINFO);\n",
+		Pn, pid, fd);
+	    (void) fprintf(stderr,
+		"      too few bytes; expected %ld, got %d\n",
+		sizeof(ps), nb);
+	    Exit(1);
+	}
+/*
+ * Enter the semaphore file information.
+ */
+	enter_file_info(&ps.pfi);
+/*
+ * If there is a semaphore file name, enter it.
+ */
+	if (ps.pseminfo.psem_name[0]) {
+	    ps.pseminfo.psem_name[sizeof(ps.pseminfo.psem_name) - 1] = '\0';
+	    (void) snpf(Namech, Namechl, "%s", ps.pseminfo.psem_name);
+	    enter_nm(Namech);
+	}
+/*
+ * Unless file size has been specifically requested, enable the printing of
+ * file offset.
+ */
+	if (!Fsize)
+	    Lf->off_def = 1;
+}
+
+
+/*
+ * process_pshm() -- process POSIX shared memory file
+ */
+
+static void
+process_pshm_common(ps)
+	struct pshm_fdinfo *ps;
+{
+	(void) snpf(Lf->type, sizeof(Lf->type), "PSXSHM");
+/*
+ * Enter the POSIX shared memory file information.
+ */
+	enter_file_info(&ps->pfi);
+/*
+ * If the POSIX shared memory file has a path name, enter it; otherwise, if it
+ * has a mapping address, enter that.
+ */
+	if (ps->pshminfo.pshm_name[0]) {
+	    ps->pshminfo.pshm_name[sizeof(ps->pshminfo.pshm_name) - 1] = '\0';
+	    (void) snpf(Namech, Namechl, "%s", ps->pshminfo.pshm_name);
+	    enter_nm(Namech);
+	} else if (ps->pshminfo.pshm_mappaddr) {
+	    (void) snpf(Namech, Namechl, "obj=%s",
+		print_kptr((KA_T)ps->pshminfo.pshm_mappaddr, (char *)NULL, 0));
+	    enter_nm(Namech);
+	}
+/*
+ * Enable offset or size reporting.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    Lf->sz = (SZOFFTYPE)ps->pshminfo.pshm_stat.vst_size;
+	    Lf->sz_def = 1;
+	}
+}
+
+
+void
+process_pshm(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	int nb;
+	struct pshm_fdinfo ps;
+/*
+ * Get the POSIX shared memory file information.
+ */
+	nb = proc_pidfdinfo(pid, fd, PROC_PIDFDPSHMINFO, &ps, sizeof(ps));
+	if (nb <= 0) {
+	    (void) err2nm("POSIX shared memory");
+	    return;
+	} else if (nb < sizeof(ps)) {
+	    (void) fprintf(stderr,
+		"%s: PID %d, FD %d; proc_pidfdinfo(PROC_PIDFDPSHMINFO);\n",
+		Pn, pid, fd);
+	    (void) fprintf(stderr,
+		"      too few bytes; expected %ld, got %d\n",
+		sizeof(ps), nb);
+	    Exit(1);
+	}
+
+	process_pshm_common(&ps);
+}
+
+
+/*
+ * process_vnode() -- process a vnode file
+ */
+
+static void
+process_vnode_common(vi)
+	struct vnode_fdinfowithpath *vi;
+{
+/*
+ * Enter the file and vnode information.
+ */
+	enter_file_info(&vi->pfi);
+	enter_vnode_info(&vi->pvip);
+}
+
+
+void
+process_vnode(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	int nb;
+	struct vnode_fdinfowithpath vi;
+
+	nb = proc_pidfdinfo(pid, fd, PROC_PIDFDVNODEPATHINFO, &vi, sizeof(vi));
+	if (nb <= 0) {
+	    if (errno == ENOENT) {
+
+	    /*
+	     * The file descriptor's vnode may have been revoked.  This is a
+	     * bit of a hack, since an ENOENT error might not always mean the
+	     * descriptor's vnode has been revoked.  As the libproc API
+	     * matures, this code may need to be revisited.
+	     */
+		enter_nm("(revoked)");
+	    } else
+		(void) err2nm("vnode");
+	    return;
+	} else if (nb < sizeof(vi)) {
+	    (void) fprintf(stderr,
+		"%s: PID %d, FD %d: proc_pidfdinfo(PROC_PIDFDVNODEPATHINFO);\n",
+		Pn, pid, fd);
+	    (void) fprintf(stderr,
+		"      too few bytes; expected %ld, got %d\n",
+		sizeof(vi), nb);
+	    Exit(1);
+	}
+
+	process_vnode_common(&vi);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dlsof.h
new file mode 100644
index 0000000..9138143
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dlsof.h
@@ -0,0 +1,135 @@
+/*
+ * 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 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dmnt.c
new file mode 100644
index 0000000..436fd5a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dmnt.c
@@ -0,0 +1,183 @@
+/*
+ * dmnt.c -- Darwin mount support functions for libproc-based lsof
+ */
+
+
+/*
+ * Portions Copyright 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by Allan Nathanson, Apple Computer, 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 Computer, 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
+ *    Computer, 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005  Apple Computer, Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.5 2011/08/07 22:52:30 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local static information
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+/*
+ * readmnt() -- read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	struct statfs *mb = (struct statfs *)NULL;
+	struct mounts *mtp;
+	int n;
+	struct stat sb;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Access mount information.
+ */
+	if ((n = getmntinfo(&mb, MNT_NOWAIT)) <= 0) {
+	    (void) fprintf(stderr, "%s: no mount information\n", Pn);
+	    return(0);
+	}
+/*
+ * Read mount information.
+ */
+	for (; n; n--, mb++) {
+
+	    if (!mb->f_type)
+		continue;
+	/*
+	 * Avoid file systems that are not appropriate paths to
+	 * user data (e.g., automount maps, triggers).
+	 */
+	    if (mb->f_flags & MNT_AUTOMOUNTED) {
+		if (!strncmp(mb->f_mntfromname, "map ", 4)
+		||  !strcmp(mb->f_mntfromname, "trigger"))
+		    continue;
+	    }
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntonname, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mb->f_mntonname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mb->f_mntfromname, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't stat() ", Pn);
+
+		    safestrprt(mb->f_fstypename, stderr, 0);
+
+		    (void) fprintf(stderr, " file system ");
+		    safestrprt(mb->f_mntonname, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		(void) bzero((char *)&sb, sizeof(sb));
+		sb.st_dev = (dev_t)mb->f_fsid.val[0];
+		sb.st_mode = S_IFDIR | 0777;
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      assuming \"dev=%x\" from mount table\n",
+			sb.st_dev);
+		}
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	    mtp->is_nfs = strcasecmp(mb->f_fstypename, "nfs") ? 0 : 1;
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link.
+	 */
+	    if (!(dn = mkstrcpy(mb->f_mntfromname, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	}
+/*
+ * Clean up and return the local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dproc.c
new file mode 100644
index 0000000..8e66bad
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dproc.c
@@ -0,0 +1,705 @@
+/*
+ * dproc.c -- Darwin process access functions 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.
+ *    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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005-2007 Apple Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.7 2011/08/07 22:52:30 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	PIDS_INCR	(sizeof(int) * 32)	/* PID space increment */
+#define	VIPS_INCR	16			/* Vips space increment */
+
+#if	DARWINV>=900
+#define	THREADS_INCR	(sizeof(uint64_t) * 32)	/* Threads space increment */
+#endif	/* DARWINV>=900 */
+
+
+/*
+ * Local static variables
+ */
+
+static struct proc_fdinfo *Fds = (struct proc_fdinfo *)NULL;
+						/* FD buffer */
+static int NbPids = 0;				/* bytes allocated to Pids */
+static int NbFds = 0;				/* bytes allocated to FDs */
+static int *Pids = (int *)NULL;			/* PID buffer */
+
+#if	DARWINV>=900
+static int NbThreads = 0;			/* Threads bytes allocated */
+static uint64_t *Threads = (uint64_t *)NULL;	/* Thread buffer */
+#endif	/* DARWINV>=900 */
+
+
+/*
+ * Local structure definitions
+ */
+
+static struct vips_info {
+	dev_t	dev;
+	ino_t	ino;
+} *Vips	= (struct vips_info *)NULL;		/* recorded vnodes */
+static int NbVips = 0;				/* bytes allocated to Vips */
+static int NVips = 0;				/* entries allocated to Vips */
+
+
+/*
+ * Local function prototypes
+ */
+_PROTOTYPE(static void enter_vn_text,(struct vnode_info_path *vip, int *n));
+_PROTOTYPE(static void process_fds,(int pid, uint32_t n, int ckscko));
+_PROTOTYPE(static void process_text,(int pid));
+
+#if	DARWINV>=900
+_PROTOTYPE(static void process_threads,(int pid, uint32_t n));
+#endif	/* DARWINV>=900 */
+
+
+/*
+ * enter_vn_text() -- enter vnode information text reference
+ */
+
+static void
+enter_vn_text(vip, n)
+	struct vnode_info_path *vip;	/* vnode info */
+	int *n;				/* number of vips[] entries in use */
+{
+	int i;
+/*
+ * Ignore the request if the vnode information has already been entered.
+ */
+	for (i = 0; i < *n; i++) {
+	    if ((vip->vip_vi.vi_stat.vst_dev == Vips[i].dev)
+	    &&  (vip->vip_vi.vi_stat.vst_ino == Vips[i].ino))
+	    {
+		return;
+	    }
+	}
+/*
+ * Save the text file information.
+ */
+	alloc_lfile(" txt", -1);
+	Cfp = (struct file *)NULL;
+	(void) enter_vnode_info(vip);
+	if (Lf->sf)
+	    link_lfile();
+/*
+ * Record the entry of the vnode information.
+ */
+	if (i >= NVips) {
+
+	/*
+	 * Allocate space for recording the vnode information.
+	 */
+	    NVips += VIPS_INCR;
+	    NbVips += (int)(VIPS_INCR * sizeof(struct vips_info));
+	    if (!Vips)
+		Vips = (struct vips_info *)malloc((MALLOC_S)NbVips);
+	    else
+		Vips = (struct vips_info *)realloc((MALLOC_P *)Vips,
+						   (MALLOC_S)NbVips);
+	    if (!Vips) {
+		(void) fprintf(stderr, "%s: PID %d: no text recording space\n",
+		    Pn, Lp->pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Record the vnode information.
+ */
+	Vips[*n].dev = vip->vip_vi.vi_stat.vst_dev;
+	Vips[*n].ino = vip->vip_vi.vi_stat.vst_ino;
+	(*n)++;
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	short cckreg;			/* conditional status of regular file
+					 * checking:
+					 *     0 = unconditionally check
+					 *     1 = conditionally check */
+	short ckscko;			/* socket file only checking status:
+					 *     0 = none
+					 *     1 = check only socket files,
+					 *	   including TCP and UDP
+					 *	   streams with eXPORT data,
+					 *	   where supported */
+	int cre, cres, ef, i, nb, np, pid;
+	short pss, sf;
+	struct proc_taskallinfo tai;
+	struct proc_vnodepathinfo vpi;
+/*
+ * Define socket and regular file conditional processing flags.
+ *
+ * If only socket files have been selected, or socket files have been
+ * selected, ANDed with other selection options, enable the skipping of
+ * regular files.
+ *
+ * If socket files and some process options have been selected, enable
+ * conditional skipping of regular file; i.e., regular files will be skipped
+ * unless they belong to a process selected by one of the specified options.
+ */
+	if (Selflags & SELNW) {
+
+	/*
+	 * Some network files selection options have been specified.
+	 */
+	    if (Fand || !(Selflags & ~SELNW)) {
+
+	    /*
+	     * Selection ANDing or only network file options have been
+	     * specified, so set unconditional skipping of regular files
+	     * and socket file only checking.
+	     */
+		cckreg = 0;
+		ckscko = 1;
+	    } else {
+
+	    /*
+	     * If ORed file selection options have been specified, or no
+	     * ORed process selection options have been specified, enable
+	     * unconditional file checking and clear socket file only
+	     * checking.
+	     *
+	     * If only ORed process selection options have been specified,
+	     * enable conditional file skipping and socket file only checking.
+	     */
+		if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+		    cckreg = ckscko = 0;
+		else
+		    cckreg = ckscko = 1;
+	    }
+	} else {
+
+	/*
+	 * No network file selection options were specified.  Enable
+	 * unconditional file checking and clear socket file only checking.
+	 */
+	    cckreg = ckscko = 0;
+	}
+/*
+ * Determine how many bytes are needed to contain the PIDs on the system;
+ * make sure sufficient buffer space is allocated to hold them (and a few
+ * extra); then read the list of PIDs.
+ */
+	if ((nb = proc_listpids(PROC_ALL_PIDS, 0, NULL, 0)) <= 0) {
+	    (void) fprintf(stderr, "%s: can't get PID byte count: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	}
+	if (nb > NbPids) {
+	    while (nb > NbPids) {
+		NbPids += PIDS_INCR;
+	    }
+	    if (!Pids)
+		Pids = (int *)malloc((MALLOC_S)NbPids);
+	    else
+		Pids = (int *)realloc((MALLOC_P *)Pids, (MALLOC_S)NbPids);
+	    if (!Pids) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for %d PIDs\n", Pn,
+		    (int)(NbPids / sizeof(int *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Get the list of PIDs.
+ */
+	for (ef = 0; !ef;) {
+	    if ((nb = proc_listpids(PROC_ALL_PIDS, 0, Pids, NbPids)) <= 0) {
+		(void) fprintf(stderr, "%s: can't get list of PIDs: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+
+	    if ((nb + sizeof(int)) < NbPids) {
+
+	    /*
+	     * There is room in the buffer for at least one more PID.
+	     */
+		np = nb / sizeof(int);
+		ef = 1;
+	    } else {
+
+	    /*
+	     * The PID buffer must be enlarged.
+	     */
+		NbPids += PIDS_INCR;
+		Pids = (int *)realloc((MALLOC_P *)Pids, (MALLOC_S)NbPids);
+		if (!Pids) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate space for %d PIDs\n", Pn,
+			(int)(NbPids / sizeof(int *)));
+		    Exit(1);
+		}
+	    }
+	}
+/*
+ * Loop through the identified processes.
+ */
+	for (i = 0; i < np; i++) {
+	    if (!(pid = Pids[i]))
+		continue;
+	    nb = proc_pidinfo(pid, PROC_PIDTASKALLINFO, 0, &tai, sizeof(tai));
+	    if (nb <= 0) {
+		if ((errno == EPERM) || (errno == ESRCH))
+		    continue;
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: PID %d information error: %s\n",
+			Pn, pid, strerror(errno));
+		}
+		continue;
+	    } else if (nb < sizeof(tai)) {
+		(void) fprintf(stderr,
+		    "%s: PID %d: proc_pidinfo(PROC_PIDTASKALLINFO);\n",
+		    Pn, pid);
+		(void) fprintf(stderr,
+		    "      too few bytes; expected %ld, got %d\n",
+		    sizeof(tai), nb);
+		Exit(1);
+	    }
+	/*
+	 * Check for process or command exclusion.
+	 */
+	    if (is_proc_excl((int)pid, (int)tai.pbsd.pbi_rgid,
+			     (UID_ARG)tai.pbsd.pbi_uid, &pss, &sf))
+	    {
+		continue;
+	    }
+	    tai.pbsd.pbi_comm[sizeof(tai.pbsd.pbi_comm) - 1] = '\0';
+	    if (is_cmd_excl(tai.pbsd.pbi_comm, &pss, &sf))
+		continue;
+	    if (tai.pbsd.pbi_name[0]) {
+		tai.pbsd.pbi_name[sizeof(tai.pbsd.pbi_name) - 1] = '\0';
+		if (is_cmd_excl(tai.pbsd.pbi_name, &pss, &sf))
+		    continue;
+	    }
+	    if (cckreg) {
+
+	    /*
+	     * If conditional checking of regular files is enabled, enable
+	     * socket file only checking, based on the process' selection
+	     * status.
+	     */
+		ckscko = (sf & SELPROC) ? 0 : 1;
+	    }
+	/*
+	 * Get root and current directory information.
+	 */
+	    if (!ckscko) {
+		nb = proc_pidinfo(pid, PROC_PIDVNODEPATHINFO, 0, &vpi,
+		     sizeof(vpi));
+		if (nb <= 0) {
+		    cre = errno;
+		    cres = 1;
+		} else if (nb < sizeof(vpi)) {
+		    (void) fprintf(stderr,
+			"%s: PID %d: proc_pidinfo(PROC_PIDVNODEPATHINFO);\n",
+			Pn, pid);
+		    (void) fprintf(stderr,
+			"      too few bytes; expected %ld, got %d\n",
+			sizeof(vpi), nb);
+		    Exit(1);
+		} else
+		    cres = 0;
+	    }
+	/*
+	 * Allocate local process space.
+	 */
+	    alloc_lproc((int)pid, (int)tai.pbsd.pbi_rgid,
+		(int)tai.pbsd.pbi_ppid, (UID_ARG)tai.pbsd.pbi_uid,
+		(tai.pbsd.pbi_name[0] != '\0') ? tai.pbsd.pbi_name
+					       : tai.pbsd.pbi_comm,
+		(int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (!ckscko) {
+		if (cres || vpi.pvi_cdir.vip_path[0]) {
+		    alloc_lfile(CWD, -1);
+		    Cfp = (struct file *)NULL;
+		    if (cres) {
+
+		    /*
+		     * If the CWD|RTD information access error is ESRCH,
+		     * ignore it; otherwise report the error's message in the
+		     * CWD's NAME  column.
+		     */
+			if (cre != ESRCH) {
+			    (void) snpf(Namech, Namechl, "%s|%s info error: %s",
+				CWD + 1, RTD + 1, strerror(cre));
+			    Namech[Namechl - 1] = '\0';
+			    enter_nm(Namech);
+			    if (Lf->sf)
+				link_lfile();
+			}
+		    } else {
+			(void) enter_vnode_info(&vpi.pvi_cdir);
+			if (Lf->sf)
+			    link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (!ckscko) {
+		if (!cres && vpi.pvi_rdir.vip_path[0]) {
+		    alloc_lfile(RTD, -1);
+		    Cfp = (struct file *)NULL;
+		    (void) enter_vnode_info(&vpi.pvi_rdir);
+		    if (Lf->sf)
+			link_lfile();
+		}
+	    }
+
+#if	DARWINV>=900
+	/*
+	 * Check for per-thread current working directories
+	 */
+	    if (!ckscko) {
+		if (tai.pbsd.pbi_flags & PROC_FLAG_THCWD) {
+	    	    (void) process_threads(pid, tai.ptinfo.pti_threadnum);
+		}
+	    }
+#endif	/* DARWINV>=900 */
+
+	/*
+	 * Print text file information.
+	 */
+	    if (!ckscko)
+		(void) process_text(pid);
+	/*
+	 * Loop through the file descriptors.
+	 */
+	    (void) process_fds(pid, tai.pbsd.pbi_nfiles, ckscko);
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * initialize() -- perform all initialization
+ */
+
+void
+initialize()
+{
+}
+
+
+/*
+ * process_fds() -- process file descriptors
+ */
+
+static void
+process_fds(pid, n, ckscko)
+	int pid;			/* PID of interest */
+	uint32_t n;			/* max FDs */
+	int ckscko;			/* check socket files only */
+{
+	int i, isock, nb, nf;
+	struct proc_fdinfo *fdp;
+/*
+ * Make sure an FD buffer has been allocated.
+ */
+	if (!Fds) {
+	    NbFds = sizeof(struct proc_fdinfo) * n;
+	    Fds = (struct proc_fdinfo *)malloc((MALLOC_S)NbFds);
+	} else if (NbFds < sizeof(struct proc_fdinfo) * n) {
+
+	/*
+	 * More proc_fdinfo space is required.  Allocate it.
+	 */
+	    NbFds = sizeof(struct proc_fdinfo) * n;
+	    Fds = (struct proc_fdinfo *)realloc((MALLOC_P *)Fds,
+						(MALLOC_S)NbFds);
+	}
+	if (!Fds) {
+	    (void) fprintf(stderr,
+		"%s: PID %d: can't allocate space for %d FDs\n",
+		Pn, pid, (int)(NbFds / sizeof(struct proc_fdinfo)));
+	    Exit(1);
+	}
+/*
+ * Get FD information for the process.
+ */
+	nb = proc_pidinfo(pid, PROC_PIDLISTFDS, 0, Fds, NbFds);
+	if (nb <= 0) {
+	    if (errno == ESRCH) {
+
+	    /*
+	     * Quit if no FD information is available for the process.
+	     */
+		return;
+	    }
+	/*
+	 * Make a dummy file entry with an error message in its NAME column.
+	 */
+	    alloc_lfile(" err", -1);
+	    (void) snpf(Namech, Namechl, "FD info error: %s", strerror(errno));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    if (Lf->sf)
+		link_lfile();
+	    return;
+	}
+	nf = (int)(nb / sizeof(struct proc_fdinfo));
+/*
+ * Loop through the file descriptors.
+ */
+	for (i = 0; i < nf; i++) {
+	    fdp = &Fds[i];
+	    alloc_lfile(NULL, (int)fdp->proc_fd);
+	/*
+	 * Process the file by its type.
+	 */
+	    isock = 0;
+	    switch (fdp->proc_fdtype) {
+	    case PROX_FDTYPE_ATALK:
+		if (!ckscko)
+		    (void) process_atalk(pid, fdp->proc_fd);
+		break;
+	    case PROX_FDTYPE_FSEVENTS:
+		if (!ckscko)
+		    (void) process_fsevents(pid, fdp->proc_fd);
+		break;
+	    case PROX_FDTYPE_KQUEUE:
+		if (!ckscko)
+		    (void) process_kqueue(pid, fdp->proc_fd);
+		break;
+	    case PROX_FDTYPE_PIPE:
+		if (!ckscko)
+		    (void) process_pipe(pid, fdp->proc_fd);
+		break;
+	    case PROX_FDTYPE_PSEM:
+		if (!ckscko)
+		    (void) process_psem(pid, fdp->proc_fd);
+		break;
+	    case PROX_FDTYPE_SOCKET:
+		(void) process_socket(pid, fdp->proc_fd);
+		isock = 1;
+		break;
+	    case PROX_FDTYPE_PSHM:
+		(void) process_pshm(pid, fdp->proc_fd);
+		break;
+	    case PROX_FDTYPE_VNODE:
+		(void) process_vnode(pid, fdp->proc_fd);
+		break;
+	    default:
+		(void) snpf(Namech, Namechl - 1, "unknown file type: %d",
+		    fdp->proc_fdtype);
+		Namech[Namechl - 1] = '\0';
+		(void) enter_nm(Namech);
+		break;
+	    }
+	    if (Lf->sf) {
+		if (!ckscko || isock)
+		    link_lfile();
+	    }
+	}
+}
+
+
+/*
+ * process_text() -- process text information
+ */
+
+static void
+process_text(pid)
+	int pid;			/* PID */
+{
+	uint64_t a;
+	int i, n, nb;
+	struct proc_regionwithpathinfo rwpi;
+
+	for (a = (uint64_t)0, i = n = 0; i < 10000; i++) {
+	    nb = proc_pidinfo(pid, PROC_PIDREGIONPATHINFO, a, &rwpi,
+			      sizeof(rwpi));
+	    if (nb <= 0) {
+		if ((errno == ESRCH) || (errno == EINVAL)) {
+
+		/*
+		 * Quit if no more text information is available for the
+		 * process.
+		 */
+		    return;
+		}
+	    /*
+	     * Warn about all other errors via a NAME column message.
+	     */
+		alloc_lfile(" txt", -1);
+		Cfp = (struct file *)NULL;
+		(void) snpf(Namech, Namechl,
+		    "region info error: %s", strerror(errno));
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		if (Lf->sf)
+		    link_lfile();
+		return;
+	    } else if (nb < sizeof(rwpi)) {
+		(void) fprintf(stderr,
+		    "%s: PID %d: proc_pidinfo(PROC_PIDREGIONPATHINFO);\n",
+		    Pn, pid);
+		(void) fprintf(stderr,
+		    "      too few bytes; expected %ld, got %d\n",
+		    sizeof(rwpi), nb);
+		Exit(1);
+	    }
+	    if (rwpi.prp_vip.vip_path[0])
+		enter_vn_text(&rwpi.prp_vip, &n);
+	    a = rwpi.prp_prinfo.pri_address + rwpi.prp_prinfo.pri_size;
+	}
+}
+
+
+#if	DARWINV>=900
+/*
+ * process_threads() -- process thread information
+ */
+
+#define TWD		" twd"          /* per-thread current working directory
+					 * fd name */
+	
+static void
+process_threads(pid, n)
+	int pid;			/* PID */
+	uint32_t n;			/* number of threads */
+{
+	int i, nb, nt;
+/*
+ * Make sure a thread buffer has been allocated.
+ */
+	n += 10;
+	if (n > NbThreads) {
+	    while (n > NbThreads) {
+		NbThreads += THREADS_INCR;
+	    }
+	    if (!Threads)
+		Threads = (uint64_t *)malloc((MALLOC_S)NbThreads);
+	    else
+		Threads = (uint64_t *)realloc((MALLOC_P *)Threads,
+					      (MALLOC_S)NbThreads);
+	    if (!Threads) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for %d Threads\n", Pn,
+		    (int)(NbThreads / sizeof(int *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Get thread information for the process.
+ */
+	nb = proc_pidinfo(pid, PROC_PIDLISTTHREADS, 0, Threads, NbThreads);
+	if (nb <= 0) {
+	    if (errno == ESRCH) {
+
+	    /*
+	     * Quit if no thread information is available for the
+	     * process.
+	     */
+		return;
+	    }
+	}
+	nt = (int)(nb / sizeof(uint64_t));
+/*
+ * Loop through the threads.
+ */
+	for (i = 0; i < nt; i++) {
+	    uint64_t t;
+	    struct proc_threadwithpathinfo tpi;
+
+	    t = Threads[i];
+	    nb = proc_pidinfo(pid, PROC_PIDTHREADPATHINFO, t, &tpi,
+			      sizeof(tpi));
+	    if (nb <= 0) {
+		if ((errno == ESRCH) || (errno == EINVAL)) {
+
+		/*
+		 * Quit if no more thread information is available for the
+		 * process.
+		 */
+		    return;
+		}
+	    /*
+	     * Warn about all other errors via a NAME column message.
+	     */
+		alloc_lfile(TWD, -1);
+		Cfp = (struct file *)NULL;
+		(void) snpf(Namech, Namechl,
+		    "thread info error: %s", strerror(errno));
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		if (Lf->sf)
+		    link_lfile();
+		return;
+	    } else if (nb < sizeof(tpi)) {
+		(void) fprintf(stderr,
+		    "%s: PID %d: proc_pidinfo(PROC_PIDTHREADPATHINFO);\n",
+		    Pn, pid);
+		(void) fprintf(stderr,
+		    "      too few bytes; expected %ld, got %d\n",
+		    sizeof(tpi), nb);
+		Exit(1);
+	    }
+	    if (tpi.pvip.vip_path[0]) {
+		alloc_lfile(TWD, -1);
+		Cfp = (struct file *)NULL;
+		(void) enter_vnode_info(&tpi.pvip);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	}
+}
+#endif	/* DARWINV>=900 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dproto.h
new file mode 100644
index 0000000..495b8b4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dproto.h
@@ -0,0 +1,55 @@
+/*
+ * dproto.h -- Darwin function prototypes for libproc-based lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * Portions Copyright 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by Allan Nathanson, Apple Computer, 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 Computer, 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
+ *    Computer, 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: dproto.h,v 1.5 2006/03/27 23:23:13 abe Exp $
+ */
+
+_PROTOTYPE(extern void enter_file_info,(struct proc_fileinfo *pfi));
+_PROTOTYPE(extern void enter_vnode_info,(struct vnode_info_path *vip));
+_PROTOTYPE(extern void err2nm,(char *pfx));
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern void process_atalk,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_fsevents,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_kqueue,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_pipe,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_psem,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_pshm,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_socket,(int pid, int32_t fd));
+_PROTOTYPE(extern void process_vnode,(int pid, int32_t fd));
+
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dsock.c
new file mode 100644
index 0000000..0e8736d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dsock.c
@@ -0,0 +1,419 @@
+/*
+ * dsock.c -- Darwin socket processing functions for libproc-based lsof
+ */
+
+
+/*
+ * Portions Copyright 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by Allan Nathanson, Apple Computer, 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 Computer, 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
+ *    Computer, 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005 Apple Computer, Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.6 2011/08/07 22:52:30 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * IPv6_2_IPv4()  -- macro to define the address of an IPv4 address contained
+ *                 in an IPv6 address
+ */
+
+#define	IPv6_2_IPv4(v6)	(((uint8_t *)((struct in6_addr *)v6)->s6_addr)+12)
+
+
+/*
+ * process_socket() -- process socket file
+ */
+
+static void
+process_socket_common(si)
+	struct socket_fdinfo *si;
+{
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam, fp, lp, unl;
+	unsigned char *la = (unsigned char *)NULL;
+
+/*
+ * Enter basic socket values.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Enter basic file information.
+ */
+	enter_file_info(&si->pfi);
+/*
+ * Enable size or offset display.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)si->psi.soi_rcv.sbi_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)si->psi.soi_snd.sbi_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(si->psi.soi_rcv.sbi_cc
+		       +	     si->psi.soi_snd.sbi_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+/*
+ * Enter send and receive queue sizes.
+ */
+	Lf->lts.rq = si->psi.soi_rcv.sbi_cc;
+	Lf->lts.sq = si->psi.soi_snd.sbi_cc;
+	Lf->lts.rqs = Lf->lts.sqs = (unsigned char)1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+/*
+ * Enter socket options.
+ */
+	Lf->lts.ltm = (unsigned int)(si->psi.soi_linger & 0xffff);
+	Lf->lts.opt = (unsigned int)(si->psi.soi_options & 0xffff);
+	Lf->lts.pqlen = (unsigned int)si->psi.soi_incqlen;
+	Lf->lts.qlen = (unsigned int)si->psi.soi_qlen;
+	Lf->lts.qlim = (unsigned int)si->psi.soi_qlimit;
+	Lf->lts.rbsz = (unsigned long)si->psi.soi_rcv.sbi_mbmax;
+	Lf->lts.sbsz = (unsigned long)si->psi.soi_snd.sbi_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+/*
+ * Enter socket state.
+ */
+	Lf->lts.ss = (unsigned int)si->psi.soi_state;
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by its associated domain family.
+ */
+	switch ((fam = si->psi.soi_family)) {
+	case AF_INET:
+	case AF_INET6:
+
+	/*
+	 * Process IPv[46] sockets.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+			(fam == AF_INET) ? "IPv4" : "IPv6");
+	    if ((si->psi.soi_kind != SOCKINFO_IN) &&
+		(si->psi.soi_kind != SOCKINFO_TCP))
+	    {
+		break;
+	    }
+	/*
+	 * Process TCP state inclusions and exclusions, as required.
+	 */
+	    if ((si->psi.soi_kind == SOCKINFO_TCP) && (TcpStXn || TcpStIn)) {
+		int tsnx = (int)si->psi.soi_proto.pri_tcp.tcpsi_state
+			 + TcpStOff;
+
+		if ((tsnx >= 0) && (tsnx < TcpNstates)) {
+		    if (TcpStXn) {
+			if (TcpStX[tsnx]) {
+			    Lf->sf |= SELEXCLF;
+			    return;
+			}
+		    }
+		    if (TcpStIn) {
+			if (TcpStI[tsnx])
+			    TcpStI[tsnx] = 2;
+			else {
+			    Lf->sf |= SELEXCLF;
+			    return;
+			}
+		    }
+		}
+	    }
+	/*
+	 * Process an Internet domain socket.
+	 */
+	    if (Fnet) {
+		if (!FnetTy
+		||  ((FnetTy == 4) && (fam == AF_INET))
+		||  ((FnetTy == 6) && (fam == AF_INET6))
+		)
+		    Lf->sf |= SELNET;
+	    }
+	    printiproto(si->psi.soi_protocol);
+	    if ((si->psi.soi_kind == SOCKINFO_TCP)
+	    &&  si->psi.soi_proto.pri_tcp.tcpsi_tp)
+	    {
+		enter_dev_ch(print_kptr((KA_T)si->psi.soi_proto.pri_tcp.tcpsi_tp,
+					(char *)NULL, 0));
+	    } else
+		enter_dev_ch(print_kptr((KA_T)si->psi.soi_pcb, (char *)NULL, 0));
+	    if (fam == AF_INET) {
+
+	    /*
+	     * Enter IPv4 address information.
+	     */
+		if (si->psi.soi_kind == SOCKINFO_TCP) {
+
+		/*
+		 * Enter information for a TCP socket.
+		 */
+		    la = (unsigned char *)&si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_46.i46a_addr4;
+		    lp = (int)ntohs(si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_lport);
+		    fa = (unsigned char *)&si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_faddr.ina_46.i46a_addr4;
+		    fp = (int)ntohs(si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_fport);
+		} else {
+
+		/*
+		 * Enter information for a non-TCP socket.
+		 */
+		    la = (unsigned char *)&si->psi.soi_proto.pri_in.insi_laddr.ina_46.i46a_addr4;
+		    lp = (int)ntohs(si->psi.soi_proto.pri_in.insi_lport);
+		    fa = (unsigned char *)&si->psi.soi_proto.pri_in.insi_faddr.ina_46.i46a_addr4;
+		    fp = (int)ntohs(si->psi.soi_proto.pri_in.insi_fport);
+		}
+		if ((fa && (*fa == INADDR_ANY)) && !fp) {
+		    fa = (unsigned char *)NULL;
+		    fp = 0;
+		}
+	    } else {
+
+	    /*
+	     * Enter IPv6 address information
+	     */
+		int v4mapped = 0;
+
+		if (si->psi.soi_kind == SOCKINFO_TCP)
+		{
+
+		/*
+		 * Enter TCP socket information.
+		 */
+		    la = (unsigned char *)&si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_laddr.ina_6;
+		    lp = (int)ntohs(si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_lport);
+		    fa = (unsigned char *)&si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_faddr.ina_6;
+		    fp = (int)ntohs(si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_fport);
+		    if ((si->psi.soi_proto.pri_tcp.tcpsi_ini.insi_vflag & INI_IPV4) != 0)
+			v4mapped = 1;
+		} else {
+
+		/*
+		 * Enter non-TCP socket information.
+		 */
+		    la = (unsigned char *)&si->psi.soi_proto.pri_in.insi_laddr.ina_6;
+		    lp = (int)ntohs(si->psi.soi_proto.pri_in.insi_lport);
+		    fa = (unsigned char *)&si->psi.soi_proto.pri_in.insi_faddr.ina_6;
+		    fp = (int)ntohs(si->psi.soi_proto.pri_in.insi_fport);
+		    if ((si->psi.soi_proto.pri_in.insi_vflag & INI_IPV4) != 0)
+			v4mapped = 1;
+		}
+		if (IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *)fa) && !fp) {
+		    fa = (unsigned char *)NULL;
+		    fp = 0;
+		}
+		if (v4mapped) {
+
+		/*
+		 * Adjust IPv4 addresses mapped in IPv6 addresses.
+		 */
+		    fam = AF_INET;
+		    if (la)
+			la = (unsigned char *)IPv6_2_IPv4(la);
+		    if (fa)
+			fa = (unsigned char *)IPv6_2_IPv4(fa);
+		}
+	    }
+	/*
+	 * Enter local and remote addresses by address family.
+	 */
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, fam);
+	    if (si->psi.soi_kind == SOCKINFO_TCP) {
+
+	    /*
+	     * Enter a TCP socket definition and its state.
+	     */
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)si->psi.soi_proto.pri_tcp.tcpsi_state;
+	    /*
+	     * Enter TCP options.
+	     */
+
+#if	defined(HASSOOPT)
+		Lf->lts.kai = (unsigned int)si->psi.soi_proto.pri_tcp.tcpsi_timer[TCPT_KEEP];
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+		Lf->lts.mss = (unsigned long)si->psi.soi_proto.pri_tcp.tcpsi_mss;
+		Lf->lts.msss = (unsigned char)1;
+		Lf->lts.topt = (unsigned int)si->psi.soi_proto.pri_tcp.tcpsi_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	    }
+	    break;
+	case AF_UNIX:
+
+	/*
+	 * Process a UNIX domain socket.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	    if (si->psi.soi_kind != SOCKINFO_UN)
+		break;
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    enter_dev_ch(print_kptr((KA_T)si->psi.soi_pcb, (char *)NULL, 0));
+	/*
+	 * Enter information on a UNIX domain socket that has no address bound
+	 * to it, although it may be connected to another UNIX domain socket
+	 * as a pipe.
+	 */
+	    if (si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_family != AF_UNIX)
+	    {
+		if (si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_family
+		==  AF_UNSPEC)
+		{
+		    if (si->psi.soi_proto.pri_un.unsi_conn_pcb) {
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)si->psi.soi_proto.pri_un.unsi_conn_pcb, (char *)NULL, 0));
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_family);
+		break;
+	    }
+	    if (si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path[0]) {
+		unl = si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_len - offsetof(struct sockaddr_un, sun_path);
+		if ((unl < 0) || (unl >= sizeof(si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path)))
+		    unl = sizeof(si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path) - 1;
+		si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path[unl] = '\0';
+		if (si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path[0]
+		&&  Sfile
+		&&  is_file_named(si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path[0]
+		&&  !Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", si->psi.soi_proto.pri_un.unsi_addr.ua_sun.sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+	case AF_ROUTE:
+
+	/*
+	 * Process a ROUTE domain socket.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "rte");
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    break;
+	case AF_NDRV:
+
+	/*
+	 * Process an NDRV domain socket.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "ndrv");
+	    if (si->psi.soi_kind != SOCKINFO_NDRV)
+		break;
+	    enter_dev_ch(print_kptr((KA_T)si->psi.soi_pcb, (char *)NULL, 0));
+	    si->psi.soi_proto.pri_ndrv.ndrvsi_if_name[sizeof(si->psi.soi_proto.pri_ndrv.ndrvsi_if_name) - 1] = '\0';
+	    (void) snpf(Namech, Namechl, "-> %s%d",
+			si->psi.soi_proto.pri_ndrv.ndrvsi_if_name,
+			si->psi.soi_proto.pri_ndrv.ndrvsi_if_unit);
+	    break;
+	case pseudo_AF_KEY:
+
+	/*
+	 * Process an [internal] key-management function socket.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "key");
+	    enter_dev_ch(print_kptr((KA_T)si->psi.soi_pcb, (char *)NULL, 0));
+	    break;
+	case AF_SYSTEM:
+
+	/*
+	 * Process a SYSTEM domain socket.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "systm");
+	    if (si->psi.soi_kind != SOCKINFO_KERN_EVENT)
+		break;
+	    enter_dev_ch(print_kptr((KA_T)si->psi.soi_pcb, (char *)NULL, 0));
+	    (void) snpf(Namech, Namechl, "[%x:%x:%x]",
+			si->psi.soi_proto.pri_kern_event.kesi_vendor_code_filter,
+			si->psi.soi_proto.pri_kern_event.kesi_class_filter,
+			si->psi.soi_proto.pri_kern_event.kesi_subclass_filter);
+	    break;
+	case AF_PPP:
+
+	/*
+	 * Process a PPP domain socket.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "ppp");
+	    enter_dev_ch(print_kptr((KA_T)si->psi.soi_pcb, (char *)NULL, 0));
+	    break;
+	default:
+	    printunkaf(fam, 1);
+	}
+/*
+ * If there are NAME column characters, enter them.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+void
+process_socket(pid, fd)
+	int pid;			/* PID */
+	int32_t fd;			/* FD */
+{
+	int nb;
+	struct socket_fdinfo si;
+/*
+ * Get socket information.
+ */
+	nb = proc_pidfdinfo(pid, fd, PROC_PIDFDSOCKETINFO, &si, sizeof(si));
+	if (nb <= 0) {
+	    (void) err2nm("socket");
+	    return;
+	} else if (nb < sizeof(si)) {
+	    (void) fprintf(stderr,
+		"%s: PID %d, FD %d: proc_pidfdinfo(PROC_PIDFDSOCKETINFO);\n",
+		Pn, pid, fd);
+	    (void) fprintf(stderr,
+		"      too few bytes; expected %ld, got %d\n",
+		sizeof(si), nb);
+	    Exit(1);
+	}
+
+	process_socket_common(&si);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dstore.c
new file mode 100644
index 0000000..b538881
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/dstore.c
@@ -0,0 +1,91 @@
+/*
+ * dstore.c -- Darwin global storage for libproc-based lsof
+ */
+
+
+/*
+ * Portions Copyright 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by Allan Nathanson, Apple Computer, 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 Computer, 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
+ *    Computer, 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2005 Apple Computer, Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.4 2008/10/21 16:15:16 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FASYNC,		FF_ASYNC	},
+	{ (long)FFSYNC,		FF_FSYNC	},
+
+# if	defined(FHASLOCK)
+	{ (long)FHASLOCK,	FF_HASLOCK	},
+# endif	/* defined(FHASLOCK) */
+
+	{ (long)O_NOCTTY,	FF_NOCTTY	},
+	{ (long)O_EVTONLY,	FF_EVTONLY	},
+	{ (long)0,		NULL 		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_CLOSING)
+	{ (long)UF_CLOSING,	POF_CLOSING	},
+# endif	/* defined(UF_CLOSING) */
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_RESERVED)
+	{ (long)UF_RESERVED,	POF_RESERVED	},
+# endif	/* defined(UF_RESERVED) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/machine.h b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/machine.h
new file mode 100644
index 0000000..203bbf6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/darwin/libproc/machine.h
@@ -0,0 +1,622 @@
+/*
+ * machine.h -- Darwin definitions for libproc-based lsof
+ */
+
+
+/*
+ * Portions Copyright 2005 Apple Computer, Inc.  All rights reserved.
+ *
+ * Copyright 2005 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by Allan Nathanson, Apple Computer, 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 Computer, 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
+ *    Computer, 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: machine.h,v 1.8 2011/08/07 22:52:30 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+#include "/usr/include/string.h"
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+/* #define	HASDCACHE	1			*/
+/* #define	HASENVDC	"LSOFDEVCACHE"		*/
+/* #define	HASPERSDC	"%h/%p.lsof_%L"		*/
+/* #define	HASPERSDCPATH	"LSOFPERSDCPATH"	*/
+/* #define	HASSYSDC	"/your/choice/of/path"	*/
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+#define	HASNOFSADDR	1	/* has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+#define	HASNOFSNADDR	1	/* has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+/* #define	HASINODE	1 */
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+/* #define	HASKOPT	1	*/
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+#define	HASLFILEADD char *V_path;
+#define CLRLFILEADD(lf)	if (lf->V_path) { \
+			    (void) free((FREE_P *)lf->V_path); \
+			    lf->V_path = (char *)NULL; \
+			}
+#define SETLFILEADD Lf->V_path = (char *)NULL;
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+/* #define	HASMOPT	1	*/
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+/* #define	HASNCACHE	1   */
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+/* #define	HASNLIST	1	*/
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe?	*/
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev	*/
+/* #define	HASPRINTINO	print_ino?	*/
+#define	HASPRINTNM	print_nm
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+#define	HASPRIVNMCACHE	print_v_path
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+/* #define	HASPROCFS	"proc?"	*/
+/* #define	HASFSTYPE	1	*/
+/* #define	HASPINODEN	1	*/
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1	*/
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1	*/
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+#define	HASWIDECHAR	1
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1	*/
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+#define	HASSPECDEVD	process_dev_stat
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTCPUDPSTATE is defined for dialects that have TCP and UDP state
+ * support -- i.e., for the "-stcp|udp:state" option and its associated
+ * speed improvements.
+ */
+
+#define	HASTCPUDPSTATE	1
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior to
+ * R4 usually don't.
+ */
+
+/* #define	HASVNODE	1	*/
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"		/* INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+/* #define	USE_LIB_PRINTDEVNAME		1	   pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+/* #define	USE_LIB_READDEV			1	   rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf		/* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+/* #define	WARNDEVACCESS	1	*/
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	memset(a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/Makefile b/lsof_4.85/lsof_4.85_src/dialects/du/Makefile
new file mode 100644
index 0000000..3da0c04
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/Makefile
@@ -0,0 +1,156 @@
+
+# DU Makefile
+#
+# $Id: Makefile,v 1.13 2008/04/15 13:29:11 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    ddev.c dfile.c dmnt.c dnode.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.c
+
+OBJ=	ddev.o dfile.o dmnt.o dnode.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}:${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the mem group.  Your install rule actions might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '   installbsd -c -s -m 2755 -g $${GRP} $${PROG} $${BIN}/$${PROG}'
+	@echo '   installbsd -c -m 444 $${MAN} $${DOC}/$${MAN}'
+	@echo ''
+	@echo 'You will have to complete the skeletons for the BIN, DOC, and'
+	@echo 'GRP strings given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '   BIN= $${DESTDIR}/usr/local/etc'
+	@echo '   DOC= $${DESTDIR}/usr/man/man8'
+	@echo '   GRP= mem'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+ddev.o:		${HDR} ddev.c
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/du/Mksrc
new file mode 100755
index 0000000..05ee4b1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make DEC OSF/1, Digital UNIX, Tru64 UNIX source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.3 99/04/15 06:40:21 abe Exp $
+
+
+D=dialects/du
+L="ddev.c dfile.c dlsof.h dmnt.c dnode.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/ddev.c b/lsof_4.85/lsof_4.85_src/dialects/du/ddev.c
new file mode 100644
index 0000000..bbc4c9c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/ddev.c
@@ -0,0 +1,759 @@
+/*
+ * ddev.c - DEC OSF/1, Digital UNIX, Tru64 UNIX device support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ddev.c,v 1.17 2005/08/12 15:35:14 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local static values
+ */
+
+#if	defined(USELOCALREADDIR)
+static struct stat Dirsb;
+#endif	/* defined(USELOCALREADDIR) */
+
+
+/*
+ * Local definitions
+ */
+
+#define	LIKE_BLK_SPEC	"like block special"
+#define	LIKE_CHR_SPEC	"like character special"
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int rmdupdev,(struct l_dev ***dp, int n, char *nm));
+
+
+#if	defined(HASDCACHE)
+/*
+ * clr_sect() - clear cached clone and pseudo sections
+ */
+
+void
+clr_sect()
+{
+	struct clone *c, *c1;
+
+	if (Clone) {
+	    for (c = Clone; c; c = c1) {
+		c1 = c->next;
+		(void) free((FREE_P *)c);
+	    }
+	    Clone = (struct clone *)NULL;
+	}
+}
+#endif	/* defined(HASDCACHE) */
+
+
+/*
+ * printdevname() - print block and character device names
+ */
+
+int
+printdevname(dev, rdev, f, nty)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+	int f;				/* 1 = follow with '\n' */
+	int nty;			/* node type: N_BLK or N_CHR */
+{
+	struct clone *c;
+	struct l_dev *dp;
+
+	readdev(0);
+/*
+ * Search for clone.
+ */
+
+#if     defined(HASDCACHE)
+
+printdevname_again:
+
+#endif  /* defined(HASDCACHE) */
+
+	if ((nty == N_CHR) && Clone && HAVECLONEMAJ && (*dev == DevDev)
+	&&  (GET_MAJ_DEV(*rdev) == CLONEMAJ))
+	{
+	    for (c = Clone; c; c = c->next) {
+		if (Devtp[c->dx].rdev == *rdev) {
+
+#if     defined(HASDCACHE)
+		    if (DCunsafe && !Devtp[c->dx].v && !vfy_dev(&Devtp[c->dx]))
+			goto printdevname_again;
+#endif  /* defined(HASDCACHE) */
+
+		    safestrprt(Devtp[c->dx].name, stdout, f);
+		    return(1);
+		}
+	    }
+	}
+/*
+ * Search device table for a full match.
+ */
+
+#if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(dev, rdev, 1, 0);
+	else
+#endif	/* defined(HASBLKDEV) */
+
+	dp = lkupdev(dev, rdev, 1, 0);
+	if (dp) {
+	    safestrprt(dp->name, stdout, f);
+	    return(1);
+	}
+/*
+ * Search device table for a match without inode number and dev.
+ */
+
+#if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(&DevDev, rdev, 0, 0);
+	else
+#endif	/* defined(HASBLKDEV) */
+
+	dp = lkupdev(&DevDev, rdev, 0, 0);
+	if (dp) {
+
+	/*
+	 * A raw device match was found.  Record it as a name column addition.
+	 */
+	    char *cp, *ttl;
+	    int len;
+
+	    ttl = (nty == N_BLK) ? LIKE_BLK_SPEC : LIKE_CHR_SPEC;
+	    len = (int)(1 + strlen(ttl) + 1 + strlen(dp->name) + 1);
+	    if (!(cp = (char *)malloc((MALLOC_S)(len + 1)))) {
+		(void) fprintf(stderr, "%s: no nma space for: (%s %s)\n",
+		    Pn, ttl, dp->name);
+		Exit(1);
+	    }
+	    (void) snpf(cp, len + 1, "(%s %s)", ttl, dp->name);
+	    (void) add_nma(cp, len);
+	    (void) free((FREE_P *)cp);
+	    return(0);
+	}
+
+#if     defined(HASDCACHE)
+/*
+ * If the device cache is "unsafe" and we haven't found any match, reload
+ * the device cache.
+ */
+	if (DCunsafe) {
+	    (void) rereaddev();
+	    goto printdevname_again;
+	}
+#endif  /* defined(HASDCACHE) */
+
+	return(0);
+}
+
+
+/*
+ * readdev() - read names, modes and device types of everything in /dev
+ */
+
+void
+readdev(skip)
+	int skip;			/* skip device cache read if 1 */
+{
+#if	defined(HASDCACHE)
+	int dcrd;
+#endif	/* defined(HASDCACHE) */
+
+	struct clone *c;
+	DIR *dfp;
+	struct DIRTYPE *dp;
+	char *fp = (char *)NULL;
+	int i = 0;
+
+#if	defined(HASBLKDEV)
+	int j = 0;
+#endif	/* defined(HASBLKDEV) */
+
+	MALLOC_S nl;
+	char *path = (char *)NULL;
+	MALLOC_S pl;
+	struct stat sb;
+
+	if (Sdev)
+	    return;
+
+#if	defined(HASDCACHE)
+/*
+ * Read device cache, as directed.
+ */
+	if (!skip) {
+	    if (DCstate == 2 || DCstate == 3) {
+		if ((dcrd = read_dcache()) == 0)
+		    return;
+	    }
+	} else
+	    dcrd = 1;
+#endif	/* defined(HASDCACHE) */
+
+	Dstk = (char **)NULL;
+	Dstkn = Dstkx = 0;
+	(void) stkdir("/dev");
+/*
+ * Unstack the next /dev or /dev/<subdirectory> directory.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dfp = OpenDir(Dstk[Dstkx]))) {
+
+#if	defined(WARNDEVACCESS)
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		    safestrprt(Dstk[Dstkx], stderr, 1);
+		}
+#endif	/* defined(WARNDEVACCESS) */
+
+		(void) free((FREE_P *)Dstk[Dstkx]);
+		Dstk[Dstkx] = (char *)NULL;
+		continue;
+	    }
+	    if (path) {
+		(void) free((FREE_P *)path);
+		path = (char *)NULL;
+	    }
+	    if (!(path = mkstrcat(Dstk[Dstkx], -1, "/", 1, (char *)NULL, -1,
+				  &pl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(Dstk[Dstkx], stderr, 1);
+		Exit(1);
+	    }
+	    (void) free((FREE_P *)Dstk[Dstkx]);
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Scan the directory.
+	 */
+	    for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+		if (dp->d_ino == 0 || dp->d_name[0] == '.')
+		    continue;
+	    /*
+	     * Form the full path name and get its status.
+	     */
+		if (fp) {
+		    (void) free((FREE_P *)fp);
+		    fp = (char *)NULL;
+		}
+		if (!(fp = mkstrcat(path, (int)pl, dp->d_name, dp->d_namlen,
+			   (char *)NULL, -1, (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr, "%s: no space for: ", Pn);
+		    safestrprt(path, stderr, 0);
+		    safestrprt(dp->d_name, stderr, 1);
+		    Exit(1);
+		}
+
+#if	defined(USE_STAT)
+		if (stat(fp, &sb) != 0)
+#else	/* !defined(USE_STAT) */
+		if (lstat(fp, &sb) != 0)
+#endif	/* defined(USE_STAT) */
+
+		{
+		    if (errno == ENOENT)	/* symbolic link to nowhere? */
+			continue;
+
+#if	defined(WARNDEVACCESS)
+		    if (!Fwarn) {
+			int errno_save = errno;
+
+			(void) fprintf(stderr, "%s: can't stat ", Pn);
+			safestrprt(fp, stderr, 0);
+			(void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		    }
+#endif	/* defined(WARNDEVACCESS) */
+
+		    continue;
+		}
+	    /*
+	     * If it's a subdirectory, stack its name for later processing.
+	     */
+		if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+		    (void) stkdir(fp);
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFCHR) {
+
+		/*
+		 * Save character device information in Devtp[].
+		 */
+		    if (i >= Ndev) {
+			Ndev += DEVINCR;
+			if (!Devtp)
+			    Devtp = (struct l_dev *)malloc(
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			else
+			    Devtp = (struct l_dev *)realloc(
+				    (MALLOC_P *)Devtp,
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			if (!Devtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for character device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    Devtp[i].inode = (INODETYPE)sb.st_ino;
+		    if (!(Devtp[i].name = mkstrcpy(fp, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr, "%s: no space for: ", Pn);
+			safestrprt(fp, stderr, 1);
+			Exit(1);
+		    }
+		    Devtp[i].rdev = sb.st_rdev;
+		    Devtp[i].v = 0;
+		/*
+		 * Save clone device location.
+		 */
+		    if (HAVECLONEMAJ
+		    &&   GET_MAJ_DEV(Devtp[i].rdev) == CLONEMAJ)
+		    {
+			if (!(c = (struct clone *)malloc(sizeof(struct clone))))
+			{
+			    (void) fprintf(stderr,
+				"%s: no space for clone device: ", Pn);
+			    safestrprt(fp, stderr, 1);
+			    Exit(1);
+			}
+			c->dx = i;
+			c->next = Clone;
+			Clone = c;
+		    }
+		    i++;
+		}
+
+#if	defined(HASBLKDEV)
+		if ((sb.st_mode & S_IFMT) == S_IFBLK) {
+
+		/*
+		 * Save block device information in BDevtp[].
+		 */
+		    if (j >= BNdev) {
+			BNdev += DEVINCR;
+			if (!BDevtp)
+			    BDevtp = (struct l_dev *)malloc(
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			else
+			    BDevtp = (struct l_dev *)realloc(
+				     (MALLOC_P *)BDevtp,
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			if (!BDevtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for block device\n", Pn);
+				Exit(1);
+			}
+		    }
+		    BDevtp[j].inode = (INODETYPE)sb.st_ino;
+		    BDevtp[j].name = fp;
+		    fp = (char *)NULL;
+		    BDevtp[j].rdev = sb.st_rdev;
+		    BDevtp[j].v = 0;
+		    j++;
+		}
+#endif	/* defined(HASBLKDEV) */
+
+	    }
+	    (void) CloseDir(dfp);
+	}
+/*
+ * Free any allocated space.
+ */
+	if (Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	    Dstkn = Dstkx = 0;
+	}
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+/*
+ * Reduce the BDevtp[] (optional) and Devtp[] tables to their minimum
+ * sizes; allocate and build sort pointer lists; and sort the tables by
+ * device number.
+ */
+
+#if	defined(HASBLKDEV)
+	if (BNdev) {
+	    if (BNdev > j) {
+		BNdev = j;
+		BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+			 (MALLOC_S)(sizeof(struct l_dev) * BNdev));
+	    }
+	    if (!(BSdev = (struct l_dev **)malloc(
+		 (MALLOC_S)(sizeof(struct l_dev *) * BNdev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for block device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (j = 0; j < BNdev; j++) {
+		BSdev[j] = &BDevtp[j];
+	    }
+	    (void) qsort((QSORT_P *)BSdev, (size_t)BNdev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    BNdev = rmdupdev(&BSdev, BNdev, "block");
+	}
+
+# if	!defined(NOWARNBLKDEV)
+	else {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: no block devices found\n", Pn);
+	}
+# endif	/* !defined(NOWARNBLKDEV) */
+#endif	/* defined(HASBLKDEV) */
+
+	if (Ndev) {
+	    if (Ndev > i) {
+		Ndev = i;
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    }
+	    if (!(Sdev = (struct l_dev **)malloc(
+		 (MALLOC_S)(sizeof(struct l_dev *) * Ndev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for character device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (i = 0; i < Ndev; i++) {
+		Sdev[i] = &Devtp[i];
+	    }
+	    (void) qsort((QSORT_P *)Sdev, (size_t)Ndev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    Ndev = rmdupdev(&Sdev, Ndev, "char");
+	} else {
+	    (void) fprintf(stderr, "%s: no character devices found\n", Pn);
+	    Exit(1);
+	}
+
+#if	defined(HASDCACHE)
+/*
+ * Write device cache file, as required.
+ */
+	if (DCstate == 1 || (DCstate == 3 && dcrd))
+	    write_dcache();
+#endif	/* defined(HASDCACHE) */
+
+}
+
+
+#if	defined(USELOCALREADDIR)
+/*
+ * Copyright (c) 1983, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+/*
+ * This is a hacked version of NetBSD's readdir() function written to work
+ * around an apparent bug in the Digital UNIX 3.0 getdirentries() system call
+ * and/or their "/dev/fd" filesystem.  The problem is that when applied to
+ * "/dev/fs", getdirentries() returns the wrong size, which can cause readdir()
+ * to run off the end of it's internal buffer and return bogus file names.
+ * 
+ * The changes from the original NetBSD file are:
+ *
+ * - uses of the field dd_flags in the DIR structure have been removed since
+ *   Digital UNIX doesn't have this field (it seems to be mostly used for
+ *   dealing with whiteout's in NetBSD's union filesystem).
+ *
+ * - uses of the dd_len field were replaced with dd_bufsiz, since this appears
+ *   to be where the Digital UNIX opendir() call stashes the size of the buffer
+ *   it mallocs.  Why does Digital UNIX have both?  No idea -- as far as I
+ *   could tell  dd_len was always 0.
+ *
+ * - code within "#ifdef BROKEN_GETDIRENTRIES ... #endif" has been added to
+ *   workaround the bug.  Note: this code uses the (apparently) unused field,
+ *   dd_len, in the Digital UNIX DIR structure.  This is pretty nasty, but
+ *   then, this  whole routine *is* just a hack to get around a (hopefully)
+ *   temporary  problem in Digital UNIX.
+ *
+ * This routine has only been tested on a couple of Digital UNIX 3.0 systems.
+ * I make no guarantees that it will work for you...!
+ *
+ * Duncan McEwan (duncan@comp.vuw.ac.nz)
+ */
+
+/*
+ * Additional changes by Vic Abell <abe@cc.purdue.edu>:
+ *
+ * - The BROKEN_GETDIRENTRIES symbol was deleted.  Use of this function
+ *   is controlled in the lsof distribution by the HASLOCALREADDIR
+ *   definition.
+ */
+
+
+/*
+ * CloseDir() - close directory
+ */
+
+int
+CloseDir(dirp)
+	register DIR *dirp;
+{
+	return(closedir(dirp));
+}
+
+
+/*
+ * OpenDir() - open directory
+ */
+
+DIR *
+OpenDir(dir)
+	char *dir;
+{
+	DIR *dirp;
+
+	if ((dirp = opendir(dir))) {
+
+	/*
+	 * Get a stat(2) buffer for the directory.
+	 *
+	 * Warn if the stat(2) buffer operation fails, close the directory,
+	 * and respond that the open failed.
+	 */
+	    if (statsafely(dir, &Dirsb)) {
+		int en = errno;
+
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't statsafely(", Pn);
+		    safestrprt(dir, stderr, 0);
+		    (void) fprintf(stderr, "): %s\n", strerror(en));
+		}
+		(void) CloseDir(dirp);
+		dirp = (DIR *)NULL;
+	 	errno = en;
+	    }
+	}
+	return(dirp);
+}
+
+
+/*
+ * ReadDir() - read next directory entry
+ */
+
+extern struct DIRTYPE *
+ReadDir(dirp)
+	register DIR *dirp;
+{
+	register struct DIRTYPE *dp;
+
+/*
+ * Loop through the directory.
+ */
+	for (;;) {
+	    if (dirp->dd_loc >= dirp->dd_size) {
+		dirp->dd_loc = 0;
+	    }
+	    if (dirp->dd_loc == 0) {
+	    	dirp->dd_size = getdirentries(dirp->dd_fd,
+			        dirp->dd_buf, dirp->dd_bufsiz, &dirp->dd_seek);
+
+		if (dirp->dd_size <= 0)
+		    return((struct DIRTYPE *)NULL);
+	    /*
+	     * If the size returned by getdirentries() exceeds what it
+	     * should be (as determined by a stat(2) of the directory),
+	     * set it to the proper value.  This is an adjustment for an
+	     * apparent bug in the Digital UNIX 3.[02] getdirentries()
+	     * function, when applied to a /dev/fd mount point.
+	     *
+	     * This check was conceived by Duncan McEwan and modified by
+	     * Vic Abell.
+	     */
+		if (dirp->dd_size > (long)Dirsb.st_size)
+		    dirp->dd_size = (long)Dirsb.st_size;
+		Dirsb.st_size -= (off_t)dirp->dd_size;
+	    }
+	    dp = (struct DIRTYPE *)(dirp->dd_buf + dirp->dd_loc);
+	    if ((long)dp & 03)		/* bogus pointer check */
+		return((struct DIRTYPE *)NULL);
+	    if (dp->d_reclen <= 0
+	    ||  dp->d_reclen > dirp->dd_bufsiz + 1 - dirp->dd_loc)
+		return((struct DIRTYPE *)NULL);
+	    dirp->dd_loc += dp->d_reclen;
+	    if (dp->d_ino == 0)
+		continue;
+	    return (dp);
+	}
+}
+#endif	/* defined(USELOCALREADDIR) */
+
+
+#if	defined(HASDCACHE)
+/*
+ * rereaddev() - reread device names, modes and types
+ */
+
+void
+rereaddev()
+{
+	(void) clr_devtab();
+
+# if	defined(DCACHE_CLR)
+	(void) DCACHE_CLR();
+# endif	/* defined(DCACHE_CLR) */
+
+	readdev(1);
+	DCunsafe = 0;
+}
+#endif	/* defined(HASDCACHE) */
+
+
+/*
+ * rmdupdev() - remove duplicate (major/minor/inode) devices
+ */
+
+static int
+rmdupdev(dp, n, nm)
+	struct l_dev ***dp;	/* device table pointers address */
+	int n;			/* number of pointers */
+	char *nm;		/* device table name for error message */
+{
+	struct clone *c, *cp;
+	int i, j, k;
+	struct l_dev **p;
+
+	for (i = j = 0, p = *dp; i < n ;) {
+	    for (k = i + 1; k < n; k++) {
+		if (p[i]->rdev != p[k]->rdev || p[i]->inode != p[k]->inode)
+		    break;
+	    /*
+	     * See if we're deleting a duplicate clone device.  If so,
+	     * delete its clone table entry.
+	     */
+		for (c = Clone, cp = (struct clone *)NULL;
+		     c;
+		     cp = c, c = c->next)
+		{
+		    if (&Devtp[c->dx] != p[k])
+			continue;
+		    if (!cp)
+			Clone = c->next;
+		    else
+			cp->next = c->next;
+		    (void) free((FREE_P *)c);
+		    break;
+		}
+	    }
+	    if (i != j)
+		p[j] = p[i];
+	    j++;
+	    i = k;
+	}
+	if (n == j)
+	    return(n);
+	if (!(*dp = (struct l_dev **)realloc((MALLOC_P *)*dp,
+	    (MALLOC_S)(j * sizeof(struct l_dev *)))))
+	{
+	    (void) fprintf(stderr, "%s: can't realloc %s device pointers\n",
+		Pn, nm);
+	    Exit(1);
+	}
+	return(j);
+}
+
+
+#if	defined(HASDCACHE)
+/*
+ * vfy_dev() - verify a device table entry (usually when DCunsafe == 1)
+ *
+ * Note: rereads entire device table when an entry can't be verified.
+ */
+
+int
+vfy_dev(dp)
+	struct l_dev *dp;		/* device table pointer */
+{
+	struct stat sb;
+
+	if (!DCunsafe || dp->v)
+	    return(1);
+
+#if	defined(USE_STAT)
+	if (stat(dp->name, &sb) != 0
+#else	/* !defined(USE_STAT) */
+	if (lstat(dp->name, &sb) != 0
+#endif	/* defined(USE_STAT) */
+
+	||  dp->rdev != sb.st_rdev
+	||  dp->inode != (INODETYPE)sb.st_ino) {
+	   (void) rereaddev();
+	   return(0);
+	}
+	dp->v = 1;
+	return(1);
+}
+#endif	/* defined(HASDCACHE) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/du/dfile.c
new file mode 100644
index 0000000..f96a455
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dfile.c
@@ -0,0 +1,118 @@
+/*
+ * dfile.c - DEC OSF/1, Digital UNIX, Tru64 UNIX file processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.12 2001/08/14 12:40:12 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HASIPv6)
+/*
+ * gethostbyname2() -- an RFC2133-compatible get-host-by-name-two function
+ *		       to get AF_INET and AF_INET6 addresses from host names,
+ *		       using the RFC2553-compatible getipnodebyname() function
+ */
+
+extern struct hostent *
+gethostbyname2(nm, prot)
+	char *nm;			/* host name */
+	int prot;			/* protocol -- AF_INET or AF_INET6 */
+{
+	int err;
+	static struct hostent *hep = (struct hostent *)NULL;
+
+	if (hep)
+	    (void) freehostent(hep);
+	hep = getipnodebyname(nm, prot, 0, &err);
+	return(hep);
+}
+#endif	/* defined(HASIPv6) */
+
+
+#if	defined(HASPRIVNMCACHE)
+/*
+ * print_advfs_path() - print an ADVFS file path
+ *
+ * return: 1 if path printed
+ *
+ * This code was provided by Dean Brock <brock@cs.unca.edu>.
+ *
+ * This function is called by the name HASPRIVNMCACHE from printname().
+ */
+
+int
+print_advfs_path(lf)
+	struct lfile *lf;		/* file whose name is to be printed */
+{
+	char buf[MAXPATHLEN+1];
+	mlBfTagT t2pb;
+/*
+ * Print any non-NULL path returned by tag_to_path() for ADVFS files that
+ * have sequence and inode numbers.
+ */
+	if (!lf->advfs_seq_stat || lf->inp_ty != 1 || !lf->fsdir || !*lf->fsdir)
+	    return(0);
+	t2pb.ml_ino = (int)lf->inode;
+	t2pb.ml_seq = lf->advfs_seq;
+	if (tag_to_path(lf->fsdir, t2pb, MAXPATHLEN, buf) || !*buf)
+	    return(0);
+	buf[MAXPATHLEN] = '\0';
+	safestrprt((buf[0] == '/' && buf[1] == '/') ? &buf[1] : buf, stdout, 0);
+	return(1);
+}
+#endif	/* defined(HASPRIVNMCACHE) */
+
+
+/*
+ * print_dev() - print device
+ */
+
+char *
+print_dev(lf, dev)
+	struct lfile *lf;		/* file whose device is to be printed */
+	dev_t *dev;			/* device to be printed */
+{
+	static char buf[128];
+
+	if (GET_MIN_DEV(*dev) > 9999999)
+	    (void) snpf(buf, sizeof(buf), "%d,%#x", GET_MAJ_DEV(*dev),
+			GET_MIN_DEV(*dev));
+	else
+	    (void) snpf(buf, sizeof(buf), "%d,%d", GET_MAJ_DEV(*dev),
+			GET_MIN_DEV(*dev));
+	return(buf);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/du/dlsof.h
new file mode 100644
index 0000000..98fbb27
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dlsof.h
@@ -0,0 +1,400 @@
+/*
+ * dlsof.h - DEC OSF/1, Digital UNIX, Tru64 UNIX 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.27 2006/03/27 20:40:59 abe Exp $
+ */
+
+
+#if	!defined(DU_LSOF_H)
+#define	DU_LSOF_H	1
+
+#include <fcntl.h>
+#include <fstab.h>
+
+# if	DUV<30000 || DUV>=50000
+#include <sys/mount.h>
+# endif	/* DUV<30000 || DUV>=50000 */
+
+#include <dirent.h>
+#include <nlist.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <string.h>
+#include <unistd.h>
+#include <cdfs/cdfsnode.h>
+#include <machine/hal_sysinfo.h>
+#include <rpc/types.h>
+#include <sys/mbuf.h>
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/table.h>
+#include <sys/un.h>
+#include <sys/unpcb.h>
+#include <sys/domain.h>
+#include <netinet/in.h>
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+#include <net/route.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.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 <net/raw_cb.h>
+#undef	queue
+#undef	queue_t
+#define	queue	___queue
+#define	queue_t	___queue_t
+#include <sys/stream.h>
+#undef	___queue
+#undef	___queue_t
+#define	___queue queue
+#define	___queue_t queue_t
+
+# if	DUV<30000
+#include <nfs/nfs.h>
+#define	KERNEL_FILE
+#include <sys/file.h>
+# endif	/* DUV<30000 */
+
+#include <ufs/inode.h>
+
+#  if	DUV>=50100
+#include <sys/systm.h>
+#define	_SYS_USER_H_
+#include <machine/pcb.h>
+#undef	_SYS_USER_H_
+#  endif	/* DUV>=50100 */
+
+/*
+ * The following header files need _KERNEL and KERNEL defined.  Some
+ * ugly #undef preparation is necessary.
+ */
+
+#define _KERNEL	1
+#define KERNEL	1
+#undef	MACRO_END
+#undef	PIPSIZ
+#undef	i_forw
+#undef	i_gen
+#undef	i_gid
+#undef	i_lock
+#undef	i_mode
+#undef	i_nlink
+#undef	i_rdev
+#undef	i_size
+#undef	i_uid
+
+# if	DUV>=30000
+#undef	m_data
+#undef	m_next
+#include <sys/file.h>
+#include <sys/fifonode.h>
+#  if	DUV<50000
+#include <sys/mount.h>
+#  endif	/* DUV<50000 */
+# endif	/* DUV>=30000 */
+
+#undef	calloc
+#define	calloc	___calloc
+#undef	exit
+#define	exit	___exit
+#define	pmap	___pmap
+#undef	pt_entry_t
+#define	pt_entry_t ___pt_entry_t
+#undef	timer_t
+#define	timer_t	___timer_t
+
+# if	DUV>=50000
+#include "du5_sys_malloc.h"
+#undef	_SYS_WAIT_H_			/* allow <sys/user.h> to
+					 * #include <sys/wait.h> while
+					 * _KERNEL is defined */
+# endif	/* DUV>=50000 */
+
+# if	DUV<40000
+#include <kern/task.h>
+#undef	___calloc
+#define	___calloc calloc
+#undef	___exit
+#define	___exit	exit
+#undef	___pt_entry_t
+#undef	___timer_t
+# endif	/* DUV<40000 */
+
+#include <s5fs/s5param.h>
+#include <s5fs/s5inode.h>
+#include <sys/procfs.h>
+#include <sys/proc.h>
+
+# if	DUV>=40000
+#undef	___calloc
+#define	___calloc calloc
+#undef	___exit
+#define	___exit	exit
+# endif	/* DUV>=40000 */
+
+#include <sys/user.h>
+#undef	u_comm
+#define	u_comm	uu_comm
+#include <sys/flock.h>
+
+# if	DUV>=30000
+#undef	u
+#endif	/* DUV>=30000 */
+
+#include <sys/specdev.h>
+#include <sys/vnode.h>
+
+# if	DUV>=30000
+#define	quotactl	__quotactl
+#include <nfs/nfs.h>
+#undef	quotactl
+# endif	/* DUV>=30000 */
+
+#include <nfs/rnode.h>
+#include <ufs/mfsnode.h>
+#include <vm/vm_anon.h>
+#include <vm/u_mape_seg.h>
+
+# if	DUV>=40000
+#include <vm/vm_ubc.h>
+# else	/* DUV<40000 */
+#include <vm/vm_vp.h>
+# endif	/* DUV>=40000 */
+
+
+# if	!defined(HASSPECNODE)
+/*
+ * The spec_node is not defined in a distributed header file, but in
+ * a kernel source file.
+ */
+
+struct spec_node {
+	struct vnode *sn_vnode;
+	struct vattr sn_vattr;
+};
+# endif	/* !defined(HASSPECNODE) */
+
+
+# if	ADVFSV<500
+/*
+ * This is an educated guess at an ADVFS/MSFS node for AdvFS versions below 5.
+ *
+ * Information that became available to me for AdvFS 5.0 and higher indicates
+ * multiple adjacent structures are involved.  Those definitions may be found
+ * in dnode.c inside an ADVFSV #if|#endif block.
+ */
+
+struct advfsnode {
+
+#  if	ADVFSV<200
+	unsigned long d1[19];
+#  else	/* ADVFSV>=200 */
+#   if	ADVFSV<300
+	unsigned long d1[20];
+#   else	/* ADVFSV>=300 */
+#    if	ADVFSV<400
+	unsigned long d1[21];
+#    else	/* ADVFSV>=400 */
+	unsigned long d1[17];
+#    endif	/* ADVFSV>=400 */
+#   endif	/* ADVFSV<300 */
+#  endif	/* ADVFSV<200 */
+
+	ino_t a_number;
+	int a_seq;
+	unsigned long d3;
+	int d4;
+	dev_t a_rdev;
+	unsigned long a_size;
+
+#  if	ADVFSV>=400
+	unsigned long d5[5];
+	int d6;
+	int a_nlink;
+#  endif	/* ADVFSV>=400 */
+
+};
+# endif	/* ADVFSV<500 */
+
+
+# if	defined(HASTAGTOPATH)
+/*
+ * Define the structure used for passing inode and sequence numbers to the
+ * ADVFS 4.0 and greater tag_to_path() -lmsfs function.
+ *
+ * This structure definition was provided by Dean Brock <brock@cs.unca.edu>.
+ */
+	typedef struct {
+	    int ml_ino;
+	    int ml_seq;
+	} mlBfTagT;
+# endif	/* defined(HASTAGTOPATH) */
+
+
+# if	DUV<50000
+#define	COMP_P		void
+typedef	unsigned long	KA_T;
+# else	/* DUV>=50000 */
+#define	COMP_P		const void
+typedef	off_t		KA_T;
+#endif	/* DUV<50000 */
+
+#define DEVINCR		1024		/* device table malloc() increment */
+#define	DIRTYPE		dirent
+#define	KMEM		"/dev/kmem"
+#define MALLOC_P	char
+#define FREE_P		MALLOC_P
+#define MALLOC_S	size_t
+#define MAXSYSCMDL	MAXCOMLEN	/* max system command name length */
+#define	PNSIZ		5		/* /proc PID name component length */
+#define PR_INOBIAS	64		/* /proc inode number bias */
+#define PR_ROOTINO	2		/* /proc root inode number */
+#define	PROCMIN		3		/* processes that make a "good" scan */
+#define	PROCTRYLM	5		/* times to try to read proc table */
+#define QSORT_P		char
+#define	READLEN_T	int
+#define STRNCPY_L	int
+#define	U_SIZE		sizeof(struct user)
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+extern int CloneMaj;
+extern struct file *Fileptr;
+#define	FILEPTR	Fileptr			/* for process_file() in lib/prfp.c */
+extern int	HaveCloneMaj;
+extern int Kd;
+
+struct l_vfs {
+	KA_T addr;			/* kernel address */
+	fsid_t fsid;			/* file system ID */
+	short type;			/* type of file system */
+	char *dir;			/* mounted directory */
+	char *fsname;			/* file system name */
+
+# if	defined(HASFSINO)
+	INODETYPE fs_ino;			/* file system inode number */
+# endif	/* defined(HASFSINO) */
+
+	dev_t dev;			/* device number */
+	dev_t rdev;			/* raw device number */
+	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 */
+	fsid_t fsid;			/* directory file system ID */
+};
+extern struct mounts *Mtab;
+
+#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 */
+
+};
+
+# if	DUV>=30000
+extern KA_T *Pa;			/* kernel proc structure addresses */
+# endif	/* DUV>=30000 */
+
+extern struct proc *Ps;			/* local proc structures */
+extern int Psn;				/* entries in Pa[] and Ps[] */
+
+extern int Vnmxp;
+
+
+/*
+ * Definitions for dvch.c, isfn.c, and rdev.c
+ */
+
+#define	CLONEMAJ	CloneMaj	/* clone major variable name */
+#define	DCACHE_CLR	clr_sect	/* function to clear clone cache
+					 * when reading the device cache
+					 * file fails */
+#define	HASDNAMLEN	1		/* DIRTYPE has d_namlen element */
+#define	HAS_STD_CLONE	1		/* has standard clone structure */
+#define	HAVECLONEMAJ	HaveCloneMaj	/* clone major variable status name */
+
+
+/*
+ * Definitions for rnam.c
+ */
+
+# if     defined(HASNCACHE) && DUV<50100
+#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(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) && DUV<50100 */
+
+#endif	/* !DU_LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/du/dmnt.c
new file mode 100644
index 0000000..962f7b2
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dmnt.c
@@ -0,0 +1,320 @@
+/*
+ * dmnt.c - DEC OSF/1, Digital UNIX, Tru64 UNIX mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.11 2005/08/08 19:56:44 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#undef	KERNEL
+#include <sys/fs_types.h>		/* this defines char *mnt_names[] */
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	struct statfs *mb;
+	struct mounts *mtp;
+	int n;
+	int procfs = 0;
+	struct stat sb;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Access mount information.
+ */
+	if ((n = getmntinfo(&mb, MNT_NOWAIT)) <= 0) {
+	    (void) fprintf(stderr, "%s: no mount information\n", Pn);
+	    return(0);
+	}
+/*
+ * Read mount information.
+ */
+	for (; n; n--, mb++) {
+	    if (mb->f_type == MOUNT_NONE || mb->f_type >= MOUNT_MAXTYPE)
+		continue;
+	/*
+	 * Avoid file systems under automounter control if they're not
+	 * currently mounted.
+	 */
+	    if (mb->f_type == MOUNT_NFS) {
+
+	    /*
+	     * The mount-from name of some unmounted file systems under
+	     * automounter control end with ``:(pid<n>):'' -- where <n>
+	     * is the PID of the automounter process.
+	     */
+		if ((ln = strchr(mb->f_mntfromname, ':'))) {
+		    if (strncmp(ln+1, "(pid", 4) == 0 && isdigit(*(ln+5))) {
+			for (ln += 6; *ln && isdigit(*ln); ln++) {
+			    ;
+			}
+			if (*ln == ')' && *(ln+1) == '\0')
+			    continue;
+		    }
+		}
+	    /*
+	     * Another automounter mount-from name form is "amd:<n>" --
+	     * where <n> is the PID of the automounter process.
+	     */
+		if (strncmp(mb->f_mntfromname, "amd:", 4) == 0
+		&&  isdigit(mb->f_mntfromname[4])) {
+		    ln = &mb->f_mntfromname[5];
+		    while (*ln && isdigit(*ln)) {
+			ln++;
+		    }
+		    if (!*ln || (*ln == ':' && *(ln+1) == '\0'))
+			continue;
+		}
+	    }
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntonname, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mb->f_mntonname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mb->f_mntfromname, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+		        "      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't stat() %s file system: ",
+			Pn, mnt_names[mb->f_type]);
+		    safestrprt(mb->f_mntonname, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		if (mb->f_type != MOUNT_PROCFS
+
+#if	!defined(ADVFSV) || ADVFSV<400
+		&&  mb->f_type != MOUNT_MSFS
+#endif	/* !defined(ADVFSV) || ADVFSV<400 */
+
+		) {
+		    memset((char *)&sb, 0, sizeof(sb));
+		    sb.st_dev = (dev_t)mb->f_fsid.val[0];
+		    sb.st_mode = S_IFDIR | 0777;
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "      assuming dev=%x from mount table\n",
+			    sb.st_dev);
+		    }
+		} else
+		    continue;
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+	    mtp->dev = sb.st_dev;
+	    mtp->fsid = mb->f_fsid;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	    mtp->next = Lmi;
+	    mtp->rdev = sb.st_rdev;
+	/*
+	 * Interpolate a possible file system (mounted-on) device path.
+	 */
+	    if (!(dn = mkstrcpy(mb->f_mntfromname, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat the file system (mounted-on) name and add file sysem
+	 * information to the local mount table.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	    if (mb->f_type == MOUNT_PROCFS) {
+
+	    /*
+	     * Save information on exactly one procfs file system.
+	     */
+		if (procfs)
+		    Mtprocfs = (struct mounts *)NULL;
+		else {
+		    procfs = 1;
+		    Mtprocfs = mtp;
+		}
+	    }
+	}
+/*
+ * Clean up and return the local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(vm)
+	KA_T vm;		/* mount address in vnode */
+{
+	struct mount m;
+	struct l_vfs *vp;
+	fsid_t f;
+	struct mounts *mp;
+
+#if	DUV>=40000
+	int bl;
+	char fb[MAX_MNT_PATHLEN+1];
+	char ob[MAX_MNT_PATHLEN+1];
+#endif	/* DUV>=40000 */
+
+/*
+ * Search for match on existing entry.
+ */
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if (vm == vp->addr)
+		return(vp);
+	}
+/*
+ * Read the (new) mount structure, allocate a local entry, and fill it.
+ */
+	if (kread((KA_T)vm, (char *)&m, sizeof(m)) != 0)
+	    return((struct l_vfs *)NULL);
+	if (!(vp = (struct l_vfs *)malloc(sizeof(struct l_vfs)))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+
+#if	DUV<40000
+	if (!(vp->dir = mkstrcpy(m.m_stat.f_mntonname, (MALLOC_S *)NULL))
+	||  !(vp->fsname = mkstrcpy(m.m_stat.f_mntfromname, (MALLOC_S *)NULL)))
+#else	/* DUV>=40000 */
+	bl = sizeof(ob) - 1;
+	if (!m.m_stat.f_mntonname
+	||  kread((KA_T)m.m_stat.f_mntonname, ob, bl))
+	    bl = 0;
+	ob[bl] = '\0';
+	bl = sizeof(fb) - 1;
+	if (!m.m_stat.f_mntfromname
+	||  kread((KA_T)m.m_stat.f_mntfromname, fb, bl))
+	    bl = 0;
+	fb[bl] = '\0';
+	if (!(vp->dir = mkstrcpy(ob, (MALLOC_S *)NULL))
+	||  !(vp->fsname = mkstrcpy(fb, (MALLOC_S *)NULL)))
+#endif	/* DUV<40000 */
+
+	{
+	    (void) fprintf(stderr, "%s: PID %d, no space for mount names\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->addr = vm;
+	vp->fsid = m.m_stat.f_fsid;
+	vp->type = m.m_stat.f_type;
+
+#if	defined(HASFSINO)
+	vp->fs_ino = 0;
+#endif	/* defined(HASFSINO) */
+
+	vp->next = Lvfs;
+	Lvfs = vp;
+/*
+ * Derive the device and raw device numbers from a search for the
+ * file system ID in the local mount table.
+ */
+	vp->dev = vp->rdev = 0;
+	for (f = vp->fsid, mp = readmnt(); mp; mp = mp->next) {
+	    if (f.val[0] == mp->fsid.val[0]
+	    &&  f.val[1] == mp->fsid.val[1])
+	    {
+		vp->dev = mp->dev;
+		vp->rdev = mp->rdev;
+
+#if	defined(HASFSINO)
+		vp->fs_ino = mp->inode;
+#endif	/* defined(HASFSINO) */
+
+		break;
+	    }
+	}
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/du/dnode.c
new file mode 100644
index 0000000..19a8827
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dnode.c
@@ -0,0 +1,992 @@
+/*
+ * dnode.c - DEC OSF/1, Digital UNIX, Tru64 UNIX node functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.23 2006/03/27 20:40:59 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if	ADVFSV>=500
+/*
+ * AdvFS (MSFS) definitions for AdvFS version 5.0 and above.
+ */
+
+struct fs_stat {			/* file system stat(2) info structure
+					 * for AdvFS 5.0 and above */
+	unsigned int num;		/* node number */
+	unsigned int d1;
+	mode_t d2;
+	uid_t d3;
+	gid_t d4;
+	dev_t rdev;			/* character or block device number */
+	off_t size;			/* file size */
+
+# if	defined(__arch32__)
+	unsigned int d5;
+# endif	/* defined(__arch32__) */
+
+	time_t d6;
+	int d7;
+	time_t d8;
+	int d9;
+	time_t d10;
+	int d11;
+	unsigned int d12[5];
+	unsigned short nlink;		/* link count */
+};
+
+struct fsContext {			/* file system context for AdvFS 5.0
+					 * and above */
+	short d1[2];
+	unsigned int d2[2];
+	long d3;
+	int d4[2];
+	lock_data_t d5;
+	long d6;
+	simple_lock_data_t d7;
+	unsigned int d8[2];
+	long d9;
+	struct fs_stat st;		/* file stats */
+};
+
+struct advfsnode {			/* AdvFS (MSFS) node definition for
+					 * AdvFS 5.0 and above */
+	unsigned long d1;
+	struct fsContext *a_con;	/* context pointer */
+};
+#endif	/* ADVFSV>=500 */
+
+#if	DUV>=50000
+typedef struct cnode {			/* CFS node structure definition for
+					 * Tru64 UNIX 5.0 and above */
+        udecl_simple_lock_data(, d1)
+	unsigned int d2;
+	time_t d3;
+	unsigned long d4[3];
+
+# if	DUV<50100
+	int d5[2];
+	off_t d6;
+# endif	/* DUV<50100 */
+
+	unsigned long d7;
+        vattr_t          c_attr;        /* 96:Cached vnode attributes */
+} cnode_t;
+#endif	/* DUV>=50000 */
+
+struct l_lock {				/* local lock info */
+	struct eflock set;		/* lock data */
+	struct l_lock *next;
+};
+
+struct l_flinfo {			/* local file lock info */
+	struct vnode *vp;		/* identity of locked vnode */
+	struct l_lock *lp;		/* lock information */
+	struct l_flinfo *next;
+};
+
+#define	L_FLINFO_HSZ	256		/* local file lock information hash
+					 * table size (must be a power of 2) */
+#define L_FLINFO_HASH(va)	(((int)((long)(va) * 31415L) >> 5) & (L_FLINFO_HSZ - 1))
+
+
+/*
+ * Local static variables
+ */
+
+static struct l_flinfo **Flinfo = (struct l_flinfo **)NULL;
+					/* local file lock hash buckets */
+static int FlinfoSt = 0;		/* Flinfo[] load status */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static char isvlocked,(struct vnode *vp));
+_PROTOTYPE(static int load_flinfo,(void));
+_PROTOTYPE(static int readvnode,(KA_T va, struct vnode *v));
+_PROTOTYPE(static void get_proc_sz,(struct procnode *pn));
+
+
+/*
+ * clr_flinfo() - clear local file lock table information
+ */
+
+void
+clr_flinfo()
+{
+	struct l_lock *lf, *lfn;
+	int i;
+	struct l_flinfo *fi, *fin;
+
+	if (!Flinfo && !FlinfoSt)
+	    return;
+	for (i = 0; i < L_FLINFO_HSZ; i++) {
+	    if (!(fi = Flinfo[i]))
+		continue;
+	    do {
+		if ((lf = fi->lp)) {
+		    do {
+			lfn = lf->next;
+			(void) free((FREE_P *)lf);
+		    } while ((lf = lfn));
+		}
+		fin = fi->next;
+		(void) free((FREE_P *)fi);
+	    } while ((fi = fin));
+	    Flinfo[i] = (struct l_flinfo *)NULL;
+	}
+	FlinfoSt = 0;
+}
+
+
+/*
+ * get_proc_sz() - get size of /proc file system file
+ */
+
+static void
+get_proc_sz(pn)
+	struct procnode *pn;		/* pointer to procnode */
+{
+	struct vm_map m;
+	struct proc *p;
+	KA_T pa;
+	int px;
+	struct task t;
+/*
+ * Search for procnode's process by PID.
+ */
+	for (p = Ps, px = 0; px < Psn; p++, px++) {
+		if (p->p_pid == pn->prc_pid)
+			break;
+	}
+	if (px >= Psn)
+		return;
+/*
+ * Get the task structure address, then read the task structure.  Set
+ * the procnode's file size from the memory map information in the task
+ * structure.
+ */
+
+# if	DUV<30000
+	if (!(pa = (KA_T)p->task))
+		return;
+# else	/* DUV>=30000 */
+	if (!(pa = Pa[px]))
+		return;
+	pa = (KA_T)((char *)pa - sizeof(t));
+# endif	/* DUV<30000 */
+
+	if (kread(pa, (char *)&t, sizeof(t)))
+		return;
+	if (!t.map || kread((KA_T)t.map, (char *)&m, sizeof(m)))
+		return;
+	Lf->sz = (SZOFFTYPE)m.vm_size;
+	Lf->sz_def = 1;
+}
+
+
+/*
+ * isvlocked() - is vnode locked?
+ */
+
+static char
+isvlocked(vp)
+	struct vnode *vp;		/* vnode's kernel address */
+{
+	struct l_flinfo *fp;
+	int i, l;
+	struct l_lock *lp;
+
+	if (!Flinfo || !FlinfoSt) {
+	    if (!load_flinfo())
+		return(' ');
+	}
+/*
+ * Hash the vnode address and see if there's a local file lock information
+ * structure for it.
+ */
+	i = L_FLINFO_HASH(vp);
+	for (fp = Flinfo[i]; fp; fp = fp->next) {
+	    if (fp->vp == vp)
+		break;
+	}
+	if (!fp)
+	    return(' ');
+/*
+ * Search the vnode's lock list for one held by this process.
+ */
+	for (lp = fp->lp; lp; lp = lp->next) {
+	    if (lp->set.l_rsys || lp->set.l_pid != (pid_t)Lp->pid)
+		continue;
+	    if (lp->set.l_whence == 0 && lp->set.l_start == 0
+	    &&  ((lp->set.l_len == 0x8000000000000000)
+	    ||   (lp->set.l_len == 0x7fffffffffffffff)))
+		l = 1;
+	    else
+		l = 0;
+	    if (lp->set.l_type == F_WRLCK)
+		return(l ? 'W' : 'w');
+	    else if (lp->set.l_type == F_RDLCK)
+		return(l ? 'R' : 'r');
+	    return(' ');
+	}
+	return(' ');
+}
+
+
+/*
+ * load_flinfo() - load local file lock information
+ */
+
+static int
+load_flinfo()
+{
+	struct flino fi;
+	struct filock fl;
+	KA_T fif, fip, flf, flp;
+	int i;
+	struct l_flinfo *lfi;
+	struct l_lock *ll;
+	KA_T v;
+
+	if (Flinfo && FlinfoSt)
+	    return(1);
+/*
+ * Get kernel fids chain pointer.
+ */
+	if (get_Nl_value("fids", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&fip, sizeof(fip)))
+	    return(0);
+/*
+ * Define local hash buckets, if necessary.
+ */
+	if (!Flinfo) {
+	    if (!(Flinfo = (struct l_flinfo **)calloc(sizeof(struct flinfo *),
+						      L_FLINFO_HSZ)))
+	    {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte local lock hash buckets\n",
+		    Pn, L_FLINFO_HSZ * sizeof(struct l_flinfo *));
+		Exit(1);
+	    }
+	}
+/*
+ * Follow the fids chain.
+ */
+	if (!(fif = fip))
+	    return(1);
+    /*
+     * Follow the filock chain for this fid entry.
+     * Duplicate it via the lock file lock information hash buckets.
+     */
+	do {
+	    if (kread(fip, (char *)&fi, sizeof(fi)))
+		return(0);
+	    if (!(flf = (KA_T)fi.fl_flck))
+		continue;
+	/*
+	 * Allocate a local file lock information structure for this fid.
+	 */
+	    if (!(lfi = (struct l_flinfo *)malloc(sizeof(struct l_flinfo)))) {
+		(void) fprintf(stderr,
+		    "%s: no space for local vnode lock info struct\n", Pn);
+		Exit(1);
+	    }
+	    lfi->vp = fi.vp;
+	    lfi->lp = (struct l_lock *)NULL;
+	    lfi->next = (struct l_flinfo *)NULL;
+	/*
+	 * Follow the flino's filock chain, duplicating it locally.
+	 */
+	    flp = flf;
+	    do {
+		if (kread(flp, (char *)&fl, sizeof(fl)))
+		    break;
+	    /*
+	     * Allocate a local lock information structure and link it
+	     * to the chain for its vnode.
+	     */
+		if (!(ll = (struct l_lock *)malloc(sizeof(struct l_lock)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for local lock struct\n", Pn);
+		    Exit(1);
+		}
+		ll->next = lfi->lp;
+		lfi->lp = ll;
+		ll->set = fl.set;
+	    } while ((flp = (KA_T)fl.next) && flp != flf);
+	/*
+	 * Link the file lock information structure to its hash bucket.
+	 */
+	    i = L_FLINFO_HASH(lfi->vp);
+	    lfi->next = Flinfo[i];
+	    Flinfo[i] = lfi;
+	} while ((fip = (KA_T)fi.next) && fip != fif);
+	FlinfoSt = 1;
+	return(1);
+}
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	struct advfsnode *a = (struct advfsnode *)NULL;
+	struct cdnode *c = (struct cdnode *)NULL;
+	dev_t dev, rdev;
+	unsigned char devs = 0;
+	unsigned char rdevs = 0;
+	struct inode *i = (struct inode *)NULL;
+	struct mfsnode *m = (struct mfsnode *)NULL;
+	struct procnode *p = (struct procnode *)NULL;
+	struct procfsid *pfi;
+	struct rnode *r = (struct rnode *)NULL;
+	struct spec_node *s = (struct spec_node *)NULL;
+	struct spec_node sn;
+	struct s5inode *s5 = (struct s5inode *)NULL;
+	char *ty;
+	enum vtype type;
+	unsigned long ul;
+	static struct vnode *v = (struct vnode *)NULL;
+	struct l_vfs *vfs;
+
+#if	DUV>=30000
+	struct fifonode *f = (struct fifonode *)NULL;
+	struct fifonode fn;
+	static struct vnode *fv = (struct vnode *)NULL;
+#endif	/* DUV>=30000 */
+
+#if	DUV>=50000
+	cnode_t *cn = (cnode_t *)NULL;
+	struct fsContext fsc;
+	int fscs = 0;
+#endif	/* DUV>=50000 */
+
+/*
+ * Read the vnode.
+ */
+	if (!va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	if (!v) {
+
+	/*
+	 * Allocate space for the Digital UNIX vnode.
+	 */
+	    if (!(v = (struct vnode *)malloc(sizeof(struct vnode)-1+Vnmxp))) {
+		(void) fprintf(stderr, "%s: no space for vnode buffer\n", Pn);
+		Exit(1);
+	    }
+
+#if	DUV>=30000
+	    if (!(fv = (struct vnode *)malloc(sizeof(struct vnode)-1+Vnmxp))) {
+		(void) fprintf(stderr, "%s: no space for fvnode buffer\n", Pn);
+		Exit(1);
+	    }
+#endif	/* DUV>=30000 */
+
+	}
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASNCACHE)
+	Lf->na = va;
+# if	defined(HASNCVPID)
+	Lf->id = (unsigned long)v->v_id;
+# endif	/* defined(HASNCVPID) */
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fsv |= FSV_NI;
+	Lf->fna = va;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Get the mount structure and determine the vnode type.
+ */
+	if (!v->v_mount)
+	    vfs = (struct l_vfs *)NULL;
+	else
+	    vfs = readvfs((KA_T)v->v_mount);
+	if (vfs) {
+	    switch (vfs->type) {
+	    case MOUNT_NFS:
+
+#if	defined(MOUNT_NFS3)
+	    case MOUNT_NFS3:
+#endif	/* defined(MOUNT_NFS3) */
+
+		Ntype = N_NFS;
+		break;
+	    }
+	    if (Ntype == N_REGLR) {
+		switch (v->v_type) {
+		case VFIFO:
+		    Ntype = N_FIFO;
+		    break;
+		}
+	    }
+	}
+/*
+ * Determine the lock type.
+ */
+	if (FILEPTR && (FILEPTR->f_flag & FSHLOCK))
+	    Lf->lock = 'R';
+	else if (FILEPTR && (FILEPTR->f_flag & FEXLOCK))
+	    Lf->lock = 'W';
+	else
+	    Lf->lock = isvlocked((struct vnode *)va);
+/*
+ * Define the specific Digital UNIX node pointer.
+ */
+
+#if	DUV>=30000
+	if (Ntype == N_FIFO) {
+	    if (v->v_fifonode
+	    &&  !kread((KA_T)v->v_fifonode, (char *)&fn, sizeof(fn)))
+		f = &fn;
+	}
+#endif	/* DUV>=30000 */
+
+	switch (v->v_tag) {
+	case VT_CDFS:
+	    c = (struct cdnode *)v->v_data;
+	    break;
+
+#if	DUV>=50000
+	case VT_CFS:
+	    cn = (cnode_t *)v->v_data;
+	    break;
+#endif	/* DUV>=50000 */
+
+	case VT_MFS:
+	    m = (struct mfsnode *)v->v_data;
+	    break;
+	case VT_NFS:
+	    r = (struct rnode *)v->v_data;
+	    break;
+	case VT_NON:
+
+#if     DUV<20000
+	    if (v->v_specinfo
+	    &&  !kread((KA_T)v->v_specinfo, (char *)&sn, sizeof(sn)))
+		s = &sn;
+	    else
+#else	/* DUV>=20000 */
+# if	DUV>=30000
+	    if (!f)
+# endif	/* DUV>=30000 */
+#endif  /* DUV<20000 */
+
+		s = (struct spec_node *)v->v_data;
+	    break;
+	case VT_PRFS:
+	    p = (struct procnode *)v->v_data;
+	    break;
+	case VT_S5FS:
+	    s5 = (struct s5inode *)v->v_data;
+	    break;
+	case VT_MSFS:
+	    a = (struct advfsnode *)v->v_data;
+
+#if	ADVFSV>=500
+	    if (a->a_con
+	    &&  !kread((KA_T)a->a_con, (char *)&fsc, sizeof(fsc)))
+		fscs = 1;
+#endif	/* ADVFSV>=500 */
+
+	    break;
+	case VT_UFS:
+	    i = (struct inode *)v->v_data;
+	    break;
+	default:
+	    (void) snpf(Namech, Namechl, "unknown node type, v_tag=%d",
+		v->v_tag);
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Get device and type for printing.
+ */
+	type = v->v_type;
+	if (a) {
+	    if (vfs && vfs->dev) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    if ((type == VCHR) || (type == VBLK)) {
+
+#if	ADVFSV>=500
+		if (fscs) {
+		    rdev = fsc.st.rdev;
+		    rdevs = 1;
+		}
+#else	/* ADVFSV<500 */
+		rdev = a->a_rdev;
+		rdevs = 1;
+#endif	/* ADVFSV>=500 */
+
+	    }
+	} else if (c) {
+	    dev = c->cd_dev;
+	    devs = 1;
+	}
+
+#if	DUV>=50000
+	else if (cn) {
+	    if (vfs && vfs->dev) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    if ((type == VCHR) || (type == VBLK)) {
+		if (cn->c_attr.va_mask & AT_RDEV) {
+		    rdev = cn->c_attr.va_rdev;
+		    rdevs = 1;
+		}
+	    }
+	}
+#endif	/* DUV>=50000 */
+
+	else if (i) {
+	    if (i->i_dev) {
+		dev = i->i_dev;
+		devs = 1;
+	    } else if (vfs && vfs->dev) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    if ((type == VCHR) || (type == VBLK)) {
+		rdev = i->i_din.di_db[0];
+		rdevs = 1;
+	    }
+	} else if (r) {
+	    dev = r->r_attr.va_fsid;
+	    devs = 1;
+	    if ((type == VCHR) || (type == VBLK)) {
+		rdev = r->r_attr.va_rdev;
+		rdevs = 1;
+	    }
+	} else if (s) {
+	    if (vfs && vfs->dev)
+		dev = vfs->dev;
+	    else
+		dev = DevDev;
+	    devs = 1;
+	    rdev = s->sn_vattr.va_rdev;
+	    rdevs = 1;
+	    if (!lkupdev(&dev, &rdev, 0, 0) && HaveCloneMaj)
+		rdev = makedev(CloneMaj, GET_MAJ_DEV(rdev));
+	} else if (s5) {
+	    dev = s5->i_dev;
+	    devs = 1;
+	} else if (f) {
+	    if (vfs && vfs->dev) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	}
+/*
+ * Obtain the inode number.
+ */
+	if (a) {
+
+#if	ADVFSV>=500
+	    if (fscs) {
+		Lf->inode = (INODETYPE)fsc.st.num;
+		Lf->inp_ty = 1;
+	    }
+#else	/* ADVFSV<500 */
+	    Lf->inode = (INODETYPE)a->a_number;
+	    Lf->inp_ty = 1;
+#endif	/* ADVFSV>=500 */
+
+
+#if	defined(HASTAGTOPATH)
+	/*
+	 * Record the Digital UNIX 4.0 or greater, ADVFS 4.0 or greater
+	 * ADVFS sequence number for later use with tag_to_path().
+	 */
+	    Lf->advfs_seq = a->a_seq;
+	    Lf->advfs_seq_stat = 1;
+#endif	/* defined(HASTAGTOPATH) */
+
+	} else if (c) {
+	    Lf->inode = (INODETYPE)c->cd_number;
+	    Lf->inp_ty = 1;
+	}
+
+#if	DUV>=50000
+	else if (cn) {
+	    if (cn->c_attr.va_mask & AT_NODEID) {
+		Lf->inode = (INODETYPE)cn->c_attr.va_fileid;
+		Lf->inp_ty = 1;
+	    }
+	}
+#endif	/* DUV>=50000 */
+
+	else if (i) {
+	    Lf->inode = (INODETYPE)i->i_number;
+	    Lf->inp_ty = 1;
+	} else if (p) {
+	    Lf->inode = (INODETYPE)((type == VDIR) ? PR_ROOTINO
+					: p->prc_pid + PR_INOBIAS);
+	    Lf->inp_ty = 1;
+	} else if (r) {
+	    Lf->inode = (INODETYPE)r->r_attr.va_fileid;
+	    Lf->inp_ty = 1;
+	} else if (s5) {
+	    Lf->inode = (INODETYPE)s5->i_number;
+	    Lf->inp_ty = 1;
+	}
+
+#if	DUV>=30000
+	else if (f) {
+	    Lf->inode = (INODETYPE)f->fn_fileid;
+	    Lf->inp_ty = 1;
+	}
+#endif	/* DUV>=30000 */
+
+/*
+ * Obtain the file size.
+ */
+	if (Foffset) {
+	    Lf->off_def = 1;
+
+#if	DUV>=30000
+	    if (Ntype == N_FIFO && f)
+		Lf->off = (unsigned long)
+		    (Lf->access == 'r') ? f->fn_rptr : f->fn_wptr;
+#endif	/* DUV>=30000 */
+
+	} else {
+	    switch (Ntype) {
+	    case N_FIFO:
+
+#if	DUV>=30000
+		if (f) {
+		    Lf->sz = (SZOFFTYPE)f->fn_size;
+		    Lf->sz_def = 1;
+		} else if (!Fsize)
+		    Lf->off_def = 1;
+#else	/* DUV<30000 */
+		if (!Fsize)
+		    Lf->off_def = 1;
+#endif	/* DUV>=30000 */
+
+		break;
+	    case N_NFS:
+		if (r) {
+		    Lf->sz = (SZOFFTYPE)r->r_attr.va_qsize;
+		    Lf->sz_def = 1;
+		}
+		break;
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    if (a) {
+
+#if	ADVFSV>=500
+			if (fscs) {
+			    Lf->sz = (SZOFFTYPE)fsc.st.size;
+			    Lf->sz_def = 1;
+			}
+#else	/* ADVFSV<500 */
+			Lf->sz = (SZOFFTYPE)a->a_size;
+			Lf->sz_def = 1;
+#endif	/* ADVFSV>=500 */
+
+		    } else if (c) {
+			Lf->sz = (SZOFFTYPE)c->cd_size;
+			Lf->sz_def = 1;
+		    }
+
+#if	DUV>=50000
+		    else if (cn) {
+			if (cn->c_attr.va_mask & AT_SIZE) {
+			    Lf->sz = (SZOFFTYPE)cn->c_attr.va_qsize;
+			    Lf->sz_def = 1;
+			}
+		    }
+#endif	/* DUV>=50000 */
+
+		    else if (i) {
+			Lf->sz = (SZOFFTYPE)i->i_din.di_qsize;
+			Lf->sz_def = 1;
+		    } else if (m) {
+			Lf->sz = (SZOFFTYPE)m->mfs_size;
+			Lf->sz_def = 1;
+		    } else if (p) {
+			if (type != VDIR)
+				get_proc_sz(p);
+		    } else if (s5) {
+			Lf->sz = (SZOFFTYPE)s5->i_size;
+			Lf->sz_def = 1;
+		    }
+		} else if ((type == VBLK) || (type == VCHR) && !Fsize)
+		    Lf->off_def = 1;
+	    }
+	}
+	if (Fnlink) {
+	    switch(Ntype) {
+	    case N_FIFO:			/* no link count */
+		break;
+	    case N_NFS:
+		Lf->nlink = (long)r->r_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+	    case N_REGLR:
+
+#  if	ADVFSV>=400
+		if (a) {
+
+#if	ADVFSV>=500
+		    if (fscs) {
+			Lf->nlink = (long)fsc.st.nlink;
+			Lf->nlink_def = 1;
+		    }
+#else	/* ADVFSV<500 */
+		    Lf->nlink = (long)a->a_nlink;
+		    Lf->nlink_def = 1;
+#endif	/* ADVFSV>=500 */
+
+		    break;
+		}
+#  endif	/* ADVFSV>=400 */
+
+		if (c) {
+		    Lf->nlink = (long)c->cd_nlink;
+		    Lf->nlink_def = 1;
+		}
+
+#if	DUV>=50000
+		else if (cn) {
+		    if (cn->c_attr.va_mask & AT_NLINK) {
+			Lf->nlink = (long)cn->c_attr.va_nlink;
+			Lf->nlink_def = 1;
+		    }
+		}
+#endif	/* DUV>=50000 */
+
+		else if (i) {
+		    Lf->nlink = (long)i->i_din.di_nlink;
+		    Lf->nlink_def = 1;
+		} else if (s5) {
+		    Lf->nlink = (long)s5->i_nlink;
+		    Lf->nlink_def = 1;
+		}
+	    }
+	    if (Nlink && Lf->nlink_def && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	Lf->dev = dev;
+	Lf->dev_def = devs;
+	Lf->rdev = rdev;
+	Lf->rdev_def = rdevs;
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	case VDIR:
+	    ty = (type == VREG) ? "VREG" : "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif	/* defined(VSOCK) */
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    ty = "FIFO";
+
+#if	DUV>=30000
+	    if ((!devs || !dev) && f) {
+		vfs = (struct l_vfs *)NULL;
+		devs = Lf->dev_def = 0;
+		ul = (unsigned long)v->v_fifonode;
+		enter_dev_ch(print_kptr((KA_T)(ul&0xffffffff),(char *)NULL,0));
+	    }
+#endif	/* DUV>=30000 */
+
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    if (vfs->dir && *vfs->dir)
+		Lf->fsdir = vfs->dir;
+	    if (vfs->fsname && *vfs->fsname)
+		Lf->fsdev = vfs->fsname;
+
+#if	defined(HASFSINO)
+	    if (vfs->fs_ino)
+		Lf->fs_ino = vfs->fs_ino;
+#endif	/* defined(HASFSINO) */
+
+	}
+/*
+ * Handle some special cases:
+ *
+ * 	ioctl(fd, TIOCNOTTY) files;
+ *	FIFOs (Digital UNIX V3.0 and higher);
+ *	memory node files;
+ *	/proc files.
+ */
+
+	if (type == VBAD)
+	    (void) snpf(Namech, Namechl, "(revoked)");
+	if (m) {
+	    devs = Lf->dev_def = Lf->rdev_def = rdevs = 0;
+	    (void) snpf(Namech, Namechl, "%#x", m->mfs_baseoff);
+	    (void) enter_dev_ch("memory");
+	} else if (p) {
+	    devs = Lf->dev_def = Lf->rdev_def = rdevs = 0;
+	    if (type != VDIR)
+		(void) snpf(Namech, Namechl, "/proc/%d", p->prc_pid);
+	    else
+		(void) snpf(Namech, Namechl, "/proc");
+	}
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+	if (p) {
+	    if (Procsrch) {
+		Procfind = 1;
+		Lf->sf |= SELNM;
+	    } else {
+		for (pfi = Procfsid; pfi; pfi = pfi->next) {
+		    if ((pfi->pid && pfi->pid == p->prc_pid)
+
+#if	defined(HASPINODEN)
+		    ||  (Lf->inp_ty == 1 && pfi->inode == Lf->inode)
+#endif	/* defined(HASPINODEN) */
+
+		    ) {
+			    pfi->f = 1;
+			    Lf->sf |= SELNM;
+			    break;
+		    }
+		}
+	    }
+	} else {
+	    if (Sfile && is_file_named((char *)NULL, (type == VCHR) ? 1 : 0))
+		Lf->sf |= SELNM;
+	}
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+/*
+ * readvnode() - read vnode
+ */
+
+static int
+readvnode(va, v)
+	KA_T va;			/* vnode kernel space address */
+	struct vnode *v;		/* vnode buffer pointer */
+{
+
+	if (kread((KA_T)va, (char *)v, sizeof(struct vnode) - 1 + Vnmxp)) {
+	    (void) snpf(Namech, Namechl, "can't read vnode at %s",
+		print_kptr(va, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/du/dproc.c
new file mode 100644
index 0000000..2b141c0
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dproc.c
@@ -0,0 +1,1606 @@
+/*
+ * dproc.c - DEC OSF/1, Digital UNIX, Tru64 UNIX process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.23 2005/08/08 19:56:44 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+#if	DUV>=50000
+# if	DUV>=50100 && defined(HASNCACHE)
+#include <stddef.h>
+#include <sys/namei.h>
+#define	_KERNEL	1
+#include <kern/processor.h>
+#include <nfs/nfs_clnt.h>
+#undef	_KERNEL
+#include <cdfs/cdfsmount.h>
+#include <dvdfs/dvdfsmount.h>
+#include <ufs/ufsmount.h>
+# endif	/* DUV>=50100 && defined(HASNCACHE) */
+_PROTOTYPE(static KA_T vpo2vp,(struct vm_ubc_object *vpo));
+#endif	/* DUV>=50000 */
+
+_PROTOTYPE(static void enter_vn_text,(KA_T va, int *n));
+_PROTOTYPE(static void get_kernel_access,(void));
+
+#if	DUV<30000
+_PROTOTYPE(static void process_text,(KA_T tp, KA_T utp));
+#else	/* DUV>=30000 */
+_PROTOTYPE(static void process_text,(KA_T tp));
+#endif	/* DUV<30000 */
+
+_PROTOTYPE(static void read_proc,(void));
+
+
+/*
+ * Local defintions
+ */
+
+#define	PAPSINCR	1024		/* Pa and Ps table increment */
+#define	PAPSINIT	512		/* Pa and Ps table initial size */
+
+
+/*
+ * Local static values
+ */
+
+#if     DUV<30000
+static KA_T Kp;				/* kernel proc[] address */
+#endif  /* DUV<30000 */
+
+static int Np = 0;			/* number of processes */
+static MALLOC_S Nv = 0;			/* allocateed Vp[] entries */
+
+#if	DUV>=30000
+static KA_T Pidtab;			/* kernel pidtab[] address */
+#endif	/* DUV>=30000 */
+
+static KA_T *Vp = NULL;			/* vnode address cache */
+
+
+/*
+ * enter_vn_text() - enter a vnode text reference
+ */
+
+static void
+enter_vn_text(va, n)
+	KA_T va;			/* vnode address */
+	int *n;				/* number of vnodes in vp[] */
+{
+	int i;
+
+/*
+ * Ignore the request if the vnode has already been printed.
+ */
+	for (i = 0; i < *n; i++) {
+	    if (va == Vp[i])
+		return;
+	}
+/*
+ * Print the vnode.
+ */
+	alloc_lfile(" txt", -1);
+	FILEPTR = (struct file *)NULL;
+	process_node(va);
+	if (Lf->sf)
+	    link_lfile();
+	if (i >= Nv) {
+
+	/*
+	 * Allocate space for remembering the vnode.
+	 */
+	    Nv += 10;
+	    if (!Vp)
+		Vp=(KA_T *)malloc((MALLOC_S)(sizeof(KA_T) * 10));
+	    else
+		Vp=(KA_T *)realloc((MALLOC_P *)Vp,(MALLOC_S)(Nv*sizeof(KA_T)));
+	    if (!Vp) {
+		(void) fprintf(stderr, "%s: no txt ptr space, PID %d\n",
+		    Pn, Lp->pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Remember the vnode.
+ */
+	Vp[*n] = va;
+	(*n)++;
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	MALLOC_S b;
+	struct file *fp;
+	int i, j;
+	struct pgrp pg;
+	int pgid, px;
+	struct proc *p;
+	short pss, sf;
+	struct ucred pcred;
+	uid_t uid;
+	struct utask ut, *utp;
+
+#if	DUV>=30000
+	struct pid_entry pe;
+#endif	/* DUV>=30000 */
+
+#if	DUV<50000
+	static int nufb = 0;
+	static struct file **ufb = (struct file **)NULL;
+#else	/* DUV>=50000 */
+	int k, l;
+	KA_T ka;
+	struct ufile_entry *ofb[U_FE_OF_ALLOC_SIZE];
+	struct ufile_entry ufe[U_FE_ALLOC_SIZE];
+	struct ufile_entry ufeo[U_FE_OF_ALLOC_SIZE];
+#endif	/* DUV<50000 */
+
+#if	defined(HASFSTRUCT) && DUV>=40000
+	static char *pof = (char *)NULL;
+	static int pofb = 0;
+	long pv;
+#endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+/*
+ * Clear file lock information.
+ */
+	(void) clr_flinfo();
+/*
+ * Read process table entries.
+ */
+	read_proc();
+/*
+ * Examine proc structures and their associated information.
+ */
+	for (p = Ps, px = 0, utp = &ut; px < Psn; p++, px++) {
+	    if (p->p_stat == 0 || p->p_stat == SZOMB)
+		continue;
+	    if (Fpgid) {
+		if (!p->p_pgrp
+		||  kread((KA_T)p->p_pgrp, (char *)&pg, sizeof(pg)))
+		    continue;
+		pgid = pg.pg_id;
+	    } else
+		pgid = 0;
+	    if (p->p_rcred == NULL
+	    ||  kread((KA_T)p->p_rcred, (char *)&pcred, sizeof(pcred)))
+		continue;
+	    uid = (uid_t)pcred.cr_uid;
+	    if (is_proc_excl(p->p_pid, pgid, (UID_ARG)uid, &pss, &sf))
+		continue;
+
+#if	DUV<30000
+	    if (!p->utask
+	    ||  kread((KA_T)p->utask, (char *)&ut, sizeof(ut)))
+#else	/* DUV>=30000 */
+	    if (kread((KA_T)((char *)Pa[px] + sizeof(struct proc)),
+		(char *)&ut, sizeof(ut)))
+#endif	/* DUV<30000 */
+
+		continue;
+	/*
+	 * Allocate a local process structure.
+	 */
+	    if (is_cmd_excl(utp->u_comm, &pss, &sf))
+		continue;
+	    alloc_lproc((int)p->p_pid, pgid, (int)p->p_ppid, (UID_ARG)uid,
+		utp->u_comm, (int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (utp->uu_utnd.utnd_cdir) {
+		alloc_lfile(CWD, -1);
+		FILEPTR = (struct file *)NULL;
+		process_node((KA_T)utp->uu_utnd.utnd_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (utp->uu_utnd.utnd_rdir) {
+		alloc_lfile(RTD, -1);
+		FILEPTR = (struct file *)NULL;
+		process_node((KA_T)utp->uu_utnd.utnd_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Print information on the text file.
+	 */
+
+#if	DUV<30000
+	    if (p->task)
+		process_text((KA_T)p->task, (KA_T)p->utask);
+#else	/* DUV>=30000 */
+		process_text((KA_T)((char *)Pa[px] - sizeof(struct task)));
+#endif	/* DUV<30000 */
+
+	/*
+	 * Save information on file descriptors.
+	 */
+
+#if	DUV<50000
+	    for (i = j = 0; i <= utp->uu_file_state.uf_lastfile; i++) {
+		if (i < NOFILE_IN_U) {
+		    fp = utp->uu_file_state.uf_ofile[i];
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+		    if (Fsv & FSV_FG)
+			pv = (long)utp->uu_file_state.uf_pofile[i];
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+		} else {
+		    if (!j) {
+			b = (MALLOC_S)(utp->uu_file_state.uf_of_count
+			  *	       sizeof(struct file *));
+			if (b > nufb) {
+			    if (!ufb)
+				ufb = (struct file **)malloc(b);
+			    else
+				ufb = (struct file **)realloc((MALLOC_P *)ufb,
+							      b);
+			    if (!ufb) {
+				(void) fprintf(stderr,
+				    "%s: PID %d, no file * space\n",
+				    Pn, Lp->pid);
+				Exit(1);
+			    }
+			    nufb = b;
+			}
+			if (kread((KA_T)utp->uu_file_state.uf_ofile_of,
+			    (char *)ufb, b))
+				break;
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+			if (Fsv & FSV_FG) {
+			    b = (MALLOC_S)(utp->uu_file_state.uf_of_count
+			      *		   sizeof(char));
+			    if (b > pofb) {
+				if (!pof)
+				    pof = (char *)malloc(b);
+				else
+				    pof = (char *)realloc((MALLOC_P *)pof, b);
+				if (!pof) {
+				    (void) fprintf(stderr,
+					"%s: PID %d: no file flags space\n",
+					Pn, Lp->pid);
+				    Exit(1);
+				}
+				pofb = b;
+			    }
+			    if (kread((KA_T)utp->uu_file_state.uf_pofile_of,
+				      pof, b))
+				zeromem(pof, b);
+			}
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+		    }
+		    fp = ufb[j];
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+		    if (Fsv & FSV_FG)
+			pv = pof[j];
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+		    j++;
+		}
+		if (fp && (ulong)fp != 0xffffffffffffffff) {
+		    alloc_lfile(NULL, i);
+		    process_file((KA_T)fp);
+		    if (Lf->sf) {
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+			if (Fsv & FSV_FG) {
+			    if ((Lf->pof = pv))
+				Lf->fsv |= FSV_FG;
+			}
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+			link_lfile();
+		    }
+		}
+	    }
+#else	/* DUV>=50000 */
+	    for (i = j = k = 0; i <= utp->uu_file_state.uf_lastfile; i++) {
+		if (i < NOFILE_IN_U) {
+		    if (!k) {
+			l = i/U_FE_ALLOC_SIZE;
+		        if (!(ka = (KA_T)utp->uu_file_state.uf_entry[l])) {
+			    i += U_FE_ALLOC_SIZE - 1;
+			    continue;
+		        }
+		    }
+		} else {
+		    if (!j) {
+			ka = (KA_T)utp->uu_file_state.uf_of_entry;
+			if (!ka || kread(ka, (char *)&ofb, sizeof(ofb)))
+			    break;
+			k = 0;
+		    }
+		    if (!k) {
+			l = j/U_FE_OF_ALLOC_SIZE;
+			if (!(ka = (KA_T)ofb[l])) {
+			    j += U_FE_OF_ALLOC_SIZE;
+			    i += U_FE_OF_ALLOC_SIZE - 1;
+			    continue;
+			}
+			if (kread(ka, (char *)&ufeo, sizeof(ufeo)))
+			    break;
+		    }
+		    fp = ufeo[k].ufe_ofile;
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+		    if (Fsv & FSV_FG)
+			pv = ufeo[k].ufe_oflags;
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+		    if (++k >= U_FE_OF_ALLOC_SIZE)
+			k = 0;
+		    j++;
+		}
+		if (!j) {
+		    if (!k) {
+			if (kread(ka, (char *)&ufe, sizeof(ufe)))
+			    break;
+		    }
+		    fp = ufe[k].ufe_ofile;
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+		    if (Fsv & FSV_FG)
+			pv = ufe[k].ufe_oflags;
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+		    if (++k >= U_FE_ALLOC_SIZE)
+			k = 0;
+		}
+		if (fp && (ulong)fp != 0xffffffffffffffff) {
+		    alloc_lfile(NULL, i);
+		    process_file((KA_T)fp);
+		    if (Lf->sf) {
+
+# if	defined(HASFSTRUCT) && DUV>=40000
+			if (Fsv & FSV_FG) {
+			    if ((Lf->pof = pv))
+				Lf->fsv |= FSV_FG;
+			}
+# endif	/* defined(HASFSTRUCT) && DUV>=40000 */
+
+			link_lfile();
+		    }
+		}
+	    }
+#endif	/* DUV>=50000 */
+
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+	dev_t dev;
+	int rv;
+	KA_T v;
+/*
+ * Check kernel version.
+ */
+	(void) ckkv("DU", LSOF_VSTR, (char *)NULL, (char *)NULL);
+/*
+ * Set name list file path.
+ */
+
+#if	DUV<40000
+	if (!Nmlst) {
+	    if (!(Nmlst = get_nlist_path(1))) {
+		(void) fprintf(stderr, "%s: can't get kernel name list path\n",
+		    Pn);
+		Exit(1);
+	    }
+	}
+#endif	/* DUV<40000 */
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open kernel memory access.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0) {
+	    (void) fprintf(stderr, "%s: can't open %s: %s\n", Pn,
+		Memory ? Memory : KMEM, sys_errlist[errno]);
+	    Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the name list file is readable.
+ */
+	if (Nmlst && !is_readable(Nmlst, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Access kernel symbols.
+ */
+	(void) build_Nl(Drive_Nl);
+
+#if	DUV>=40000
+	if (!Nmlst)
+	    rv = knlist(Nl);
+	else
+#endif	/* DUV>=40000 */
+	
+            rv = nlist(Nmlst, Nl);
+	if (rv == -1) {
+	    (void) fprintf(stderr,
+		"%s: can't read kernel name list from %s: %s\n",
+		Pn, Nmlst ? Nmlst : "knlist(3)", strerror(errno));
+	    Exit(1);
+	}
+
+#if	DUV<30000
+	if (get_Nl_value("proc", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Kp, sizeof(Kp))
+	||  get_Nl_value("nproc", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Np, sizeof(Np)))
+#else	/* DUV>=30000 */
+	if (get_Nl_value("npid", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Np, sizeof(Np))
+	||  get_Nl_value("pidt", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Pidtab, sizeof(Pidtab)))
+#endif	/* DUV<30000 */
+
+	{
+	    (void) fprintf(stderr, "%s: can't read proc table info\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("vnmaxp", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Vnmxp, sizeof(Vnmxp))) {
+	    (void) fprintf(stderr, "%s: can't determine vnode length\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("cldev", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&dev, sizeof(dev))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr, "%s: can't read clone device number\n",
+		    Pn);
+	    HaveCloneMaj = 0;
+	} else {
+	    CloneMaj = GET_MAJ_DEV(dev);
+	    HaveCloneMaj = 1;
+	}
+}
+
+
+/*
+ * get_nlist_path() - get kernel name list path
+ */
+
+char *
+get_nlist_path(ap)
+	int ap;				/* on success, return an allocated path
+					 * string pointer if 1; return a
+					 * constant character pointer if 0;
+					 * return NULL if failure */
+{
+	char *ba, buf[MAXPATHLEN+2], *ps;
+	int len, rv;
+/*
+ * Get bootfile name.
+ */
+	len = 0;
+	if ((rv = getsysinfo(GSI_BOOTEDFILE, &buf[1], sizeof(buf) - 1, &len,
+			     (char *)NULL))
+	!= 1)
+	{
+	    if (rv < 0) {
+		(void) fprintf(stderr, "%s: can't get booted file name: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+	    return((char *)NULL);
+	}
+/*
+ * Check for a non-NULL path.
+ */
+	buf[sizeof(buf) - 2] = '\0';
+	len = strlen(&buf[1]);
+	if (len < 1)
+	    return((char *)NULL);
+/*
+ * If no path return is requested by the value of ap, return a NULL string
+ * pointer.
+ */
+	if (!ap)
+	    return("");
+/*
+ * Make sure the path has a leading '/'.
+ */
+	if (buf[1] != '/') {
+	    buf[0] = '/';
+	    ba = buf;
+	    len++;
+	} else
+	   ba = &buf[1];
+/*
+ * Allocate permanent space for the path, copy it to the space, and return
+ * a pointer to the space.
+ */
+	len++;
+	if (!(ps = (char *)malloc(len))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes for boot file path: %s\n",
+		Pn, len, ba);
+	    Exit(1);
+	}
+	(void) snpf(ps, len, "%s", ba);
+	return(ps);
+}
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	if (lseek(Kd, addr, L_SET) == (off_t)-1L)
+	    return(-1);
+	br = read(Kd, buf, len);
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * process_text() - print text information
+ */
+static void
+
+#if	DUV<30000
+process_text(tp, utp)
+#else	/* DUV>=30000 */
+process_text(tp)
+#endif	/* DUV<30000 */
+
+	KA_T tp;			/* kernel task structure */
+
+#if	DUV<30000
+	KA_T utp;			/* user task structure address for
+					 * the task */
+#endif	/* DUV<30000 */
+
+{
+	int i;
+	KA_T ka, kb;
+	int n = 0;
+	struct task t;
+	struct vm_anon_object vmao;
+	struct vm_map_entry vmme;
+	struct vm_map vmm;
+	struct vm_object vmo;
+	struct vm_seg vms;
+
+#if	DUV<40000
+	struct vm_vp_object vpo;
+#else	/* DUV>=40000 */
+	struct vm_ubc_object vpo;
+#endif	/* DUV<40000 */
+
+/*
+ * Read task structure from kernel.
+ */
+	if (kread(tp, (char *)&t, sizeof(t))
+
+#if	DUV<30000
+	||  (KA_T)t.u_address != utp
+#endif	/* DUV<30000 */
+
+	)
+	    return;
+/*
+ * Print information about the text vnode referenced in the procfs
+ * structure inside the task structure.
+ */
+	if (t.procfs.pr_exvp)
+	    enter_vn_text((KA_T)t.procfs.pr_exvp, &n);
+/*
+ * Read the vm_map structure.  Search its vm_map_entry structure list.
+ */
+	if (!t.map
+	||  kread((KA_T)t.map, (char *)&vmm, sizeof(vmm)))
+	    return;
+	if (!vmm.vm_is_mainmap)
+	    return;
+
+#if	defined(VM_SKIPLIST)
+	for (i = 0, ka = (KA_T)vmm.vm_links.vml_sl_next[0];
+	     i < vmm.vm_nentries && ka != (KA_T)t.map;
+	     i++, ka = (KA_T)vmme.vme_links.vml_sl_next[0])
+#else	/* !defined(VM_SKIPLIST) */
+	for (i = 0, ka = (KA_T)vmm.vm_links.next;
+	     i < vmm.vm_nentries && ka != (KA_T)t.map;
+	     i++, ka = (KA_T)vmme.vme_links.next)
+#endif	/* defined(VM_SKIPLIST) */
+
+	{
+
+	/*
+	 * Read the next vm_map_entry structure and its object.
+	 */
+	    if (kread(ka, (char *)&vmme, sizeof(vmme)))
+		return;
+	    if (!(kb = (KA_T)vmme.vme_uobject.vm_object)
+	    ||  kread(kb, (char *)&vmo, sizeof(vmo)))
+		continue;
+	/*
+	 * Process by object type.
+	 */
+	    switch (vmo.ob_type) {
+	    case OT_ANON:
+
+	    /*
+	     * If an anonymous object is backed by an OT_UBC or OT_VP object,
+	     * read its vm_ubc_object or vm_vp_object to find a vnode pointer.
+	     */
+		if (kread(kb, (char *)&vmao, sizeof(vmao)))
+		    break;
+		if (!vmao.ao_bobject
+		||  kread((KA_T)vmao.ao_bobject, (char *)&vmo, sizeof(vmo)))
+		    break;
+
+#if	DUV<40000
+		if (vmo.ob_type != OT_VP
+		||  kread((KA_T)vmao.ao_bobject, (char *)&vpo, sizeof(vpo)))
+		    break;
+		enter_vn_text((KA_T)vpo.vo_vp, &n);
+#else	/* DUV>=40000 */
+		if (vmo.ob_type != OT_UBC
+		||  kread((KA_T)vmao.ao_bobject, (char *)&vpo, sizeof(vpo)))
+		    break;
+# if	DUV>=50000
+		enter_vn_text(vpo2vp(&vpo), &n);
+# else	/* DUV<50000 */
+		enter_vn_text((KA_T)vpo.vu_vfp.vp, &n);
+#endif	/* DUV>=50000 */
+#endif	/* DUV<40000 */
+		break;
+	    /*
+	     * If this is a segment object, read the segment map, and search
+	     * for backing objects whose object type is OT_UBC or OT_VP.
+	     */
+
+	    case OT_SEG:
+		for (kb=(KA_T)vmme.vme_seg; kb; kb=(KA_T)vms.seg_vnext) {
+		    if (kread(kb, (char *)&vms, sizeof(vms)))
+			break;
+		    if (!vms.seg_vop
+		    ||  kread((KA_T)vms.seg_vop, (char *)&vmo, sizeof(vmo)))
+			continue;
+
+#if	DUV<40000
+		    if (vmo.ob_type != OT_VP)
+#else	/* DUV>=40000 */
+		    if (vmo.ob_type != OT_UBC)
+#endif	/* DUV<40000 */
+
+			continue;
+		    if (kread((KA_T)vms.seg_vop, (char *)&vpo, sizeof(vpo)))
+			break;
+
+#if	DUV<40000
+		    enter_vn_text((KA_T)vpo.vo_vp, &n);
+#else	/* DUV>=40000 */
+# if	DUV>=50000
+		    enter_vn_text(vpo2vp(&vpo), &n);
+# else	/* DUV<50000 */
+		    enter_vn_text((KA_T)vpo.vu_vfp.vp, &n);
+#endif	/* DUV<40000 */
+#endif	/* DUV>=50000 */
+
+		}
+	    }
+	}
+}
+
+
+/*
+ * read_proc() - read process table entries
+ */
+
+static void
+read_proc()
+{
+	static int ap = 0;
+	MALLOC_S len;
+	struct proc *p;
+	KA_T pa;
+	int px, try;
+
+#if     DUV>=30000
+	struct pid_entry pe;
+#endif  /* DUV>=30000 */
+
+	if (!Ps) {
+
+	/*
+	 * Allocate local proc table space.
+	 */
+	    if (Np < 1) {
+		(void) fprintf(stderr, "%s: proc table has no entries\n", Pn);
+		Exit(1);
+	    }
+	    len = (MALLOC_S)(PAPSINIT * sizeof(struct proc));
+	    if (!(Ps = (struct proc *)malloc(len))) {
+		(void) fprintf(stderr, "%s: no proc table space (%d bytes)\n",
+		    Pn, len);
+		Exit(1);
+	    }
+
+#if	DUV>=30000
+	/*
+	 * Allocate kernel proc address table space.
+	 */
+	    len = (MALLOC_S)(PAPSINIT * sizeof(KA_T));
+	    if (!(Pa = (KA_T *)malloc(len))) {
+		(void) fprintf(stderr,
+		    "%s: no proc address table space (%d bytes)\n", Pn, len);
+		Exit(1);
+	    }
+#endif	/* DUV>=30000 */
+
+	    ap = PAPSINIT;
+	}
+/*
+ * Try to read the proc structure table PROCTRYLM times.
+ * The operation must yield PROCMIN structures.
+ */
+	for (try = 0; try < PROCTRYLM; try++) {
+	    for (p = Ps, Psn = px = 0; px < Np; px++) {
+
+	    /*
+	     * Insure Ps and Psa space.
+	     */
+		if (Psn >= ap) {
+		    ap += PAPSINCR;
+		    len = (MALLOC_S)(ap * sizeof(struct proc));
+		    if (!(Ps = (struct proc *)realloc((MALLOC_P *)Ps, len))) {
+			(void) fprintf(stderr,
+			    "%s: no more proc table space (%d bytes)\n",
+			    Pn, len);
+			Exit(1);
+		    }
+		    p = &Ps[Psn];
+
+#if	DUV>=30000
+		    len = (MALLOC_S)(ap * sizeof(KA_T));
+		    if (!(Pa = (KA_T *)realloc((MALLOC_P *)Pa, len))) {
+			(void) fprintf(stderr,
+			    "%s: no more proc address table space (%d bytes)\n",
+			    Pn, len);
+			Exit(1);
+		    }
+#endif	/* DUV>=30000 */
+
+		}
+
+#if     DUV<30000
+		pa = Kp + (KA_T)(px * sizeof(struct proc));
+		if (kread(pa, (char *)p, sizeof(struct proc)))
+		    continue;
+#else   /* DUV>=30000 */
+		pa = Pidtab + (KA_T)(px * sizeof(struct pid_entry));
+		if (kread(pa, (char *)&pe, sizeof(struct pid_entry)))
+		    continue;
+		if ((pa = (KA_T)pe.pe_proc) == NULL
+		||  kread(pa, (char *)p, sizeof(struct proc)))
+		    continue;
+		if (pe.pe_pid != p->p_pid)
+		    continue;
+		Pa[Psn] = pa;
+#endif  /* DUV<30000 */
+
+		Psn++;
+		p++;
+	    }
+	/*
+	 * Check the results of the scan.
+	 */
+	    if (Psn >= PROCMIN)
+		break;
+	}
+/*
+ * Quit if not enough proc structures could be accumulated.
+ */
+	if (try >= PROCTRYLM) {
+	    (void) fprintf(stderr, "%s: can't read proc table\n", Pn);
+	    Exit(1);
+	}
+	if (Psn < Np && !RptTm) {
+
+	/*
+	 * Reduce the local proc structure tables to their minimum if
+	 * not in repeat mode.
+	 */
+	    ap = Psn;
+	    len = (MALLOC_S)(Psn * sizeof(struct proc));
+	    if (!(Ps = (struct proc *)realloc((MALLOC_P *)Ps, len))) {
+		(void) fprintf(stderr,
+		    "%s: can't reduce proc table to %d bytes\n",
+		    Pn, len);
+		Exit(1);
+	    }
+
+#if	DUV>=30000
+	    len = (MALLOC_S)(Psn * sizeof(KA_T));
+	    if (!(Pa = (KA_T *)realloc((MALLOC_P *)Pa, len))) {
+		(void) fprintf(stderr,
+		    "%s: can't reduce proc address table to %d bytes\n",
+		    Pn, len);
+		Exit(1);
+	    }
+#endif	/* DUV>=30000 */
+
+	}
+}
+
+
+#if	DUV>=50000
+/*
+ * vfp2vp() -- convert VM object's vu_vfp to a vnode pointer
+ */
+
+static KA_T
+vpo2vp(vpo)
+	struct vm_ubc_object *vpo;	/* pointer to local vm_ubc_object */
+{
+	struct advfsbfs {		/* This structure is referenced in
+					 * vm_ubc.h (as msfsbfs), but never
+					 * defined in a distributed header
+					 * file, so we make a hack definition
+					 * here. */
+	    unsigned long d1[18];	/* dummies */
+	    struct vnode *vp;		/* vnode */
+	} bfa;
+	static int ft = 1;
+	KA_T ka;
+	static KA_T ops = (KA_T)0;
+/*
+ * If this is the first time, get the msfs (AdvFS) UBC operation switch
+ * address.
+ */
+	if (ft) {
+	    ft = 0;
+
+#if	defined(ADVFSV)
+	    if (get_Nl_value("msfsubc", Drive_Nl, &ops) < 0)
+#endif	/* defined(ADVFSV) */
+
+		ops = (KA_T)0;
+
+	}
+	ka = (KA_T)vpo->vu_vfp.vp;
+	if (!ops || ((KA_T)vpo->vu_ops != ops))
+	    return(ka);
+	if (!ka || kread(ka, (char *)&bfa, sizeof(bfa)))
+	    return(ka);
+	return((KA_T)bfa.vp);
+} 
+#endif	/* DUV>=50000 */
+
+
+#if	DUV>=50100 && defined(HASNCACHE)
+/*
+ * Kernel name cache functions and associate definiitions for Tru64 UNIX
+ * 5.1 and above.
+ */
+
+
+/*
+ * Definitions
+ */
+
+
+/*
+ * Structures
+ */
+
+struct l_nch {
+	struct namecache *nc;		/* namecache entry */
+	struct l_nch *nxt;		/* next hashed entry */
+};
+
+
+/*
+ * Static variables
+ */
+
+static int Hmsk = 0;			/* Nchash[] mask -- (size - 1), where
+					 * size is a power of two */
+static int Nc;				/* number of cached namecache structs */
+static struct l_nch **Nchash = (struct l_nch **)NULL;
+					/* hash pointers buckets */
+static int Ncfirst = 1;			/* first-call status */
+
+/*
+ * Definitions
+ */
+
+#define ncachehash(i)		(((int)(i*31415)>>3)&Hmsk)
+
+
+/*
+ * Prototypes
+ */
+
+_PROTOTYPE(static struct l_nch *ncache_addr,(unsigned long id));
+_PROTOTYPE(static int ncache_ckrootid,(KA_T na, unsigned long id));
+_PROTOTYPE(static int ncache_isroot,(KA_T na, char *cp));
+
+
+/*
+ * ncache_addr() -- look up a node's local ncache address
+ */
+
+static struct l_nch *
+ncache_addr(id)
+	unsigned long id;		/* node's capability ID */
+{
+	register struct l_nch *hp;
+
+	for (hp = Nchash[ncachehash(id)]; hp; hp = hp->nxt) {
+	    if ((hp->nc)->nc_vpid == id)
+		return(hp);
+	}
+	return((struct l_nch *)NULL);
+}
+
+
+/*
+ * ncache_ckrootid() - check for a root node ID
+ */
+
+static int
+ncache_ckrootid(na, id)
+	KA_T na;			/* vnode address */
+	unsigned long id;		/* root ID to check */
+{
+
+#if	defined(ADVFSV)
+	struct advfsmount {		/* This structure should be defined in
+					 * a distributed header file, but it
+					 * isn't, so we make a hack definition
+					 * here. */
+	    u_long d1[10];		/* dummies */
+	    struct vnode *am_rootvp;	/* root vnode pointer */
+	} am;
+	static KA_T aops = (KA_T)0;
+#endif	/* defined(ADVFSV) */
+
+	struct cdfsmount cm;
+	static KA_T cops = (KA_T)0;
+	struct dvdfsmount dm;
+	static KA_T dops = (KA_T)0;
+	static KA_T fops = (KA_T)0;
+	static KA_T frvp = (KA_T)0;
+	static int ft = 1;
+	register int i;
+	static unsigned long *ic = (unsigned long *)NULL;
+	MALLOC_S len;
+	struct mount m;
+	static int nia = 0;
+	static int niu = 0;
+	struct mntinfo nm;
+	static KA_T nops = (KA_T)0;
+	static KA_T n3ops = (KA_T)0;
+	KA_T rv;
+	struct ufsmount um;
+	static KA_T uops = (KA_T)0;
+	struct vnode v;
+/*
+ * Check the cache.
+ */
+	if (ic && niu) {
+	    for (i = 0; i < niu; i++) {
+		if (id == ic[i])
+		    return(1);
+	    }
+	}
+/*
+ * Read the vnode and the associated mount structure.
+ */
+	if (!na || kread(na, (char *)&v, sizeof(v)))
+	    return(0);
+	if (!v.v_mount || kread((KA_T)v.v_mount, (char *)&m, sizeof(m)))
+	    return(0);
+/*
+ * If this is the first time this function has been used, get the necessary
+ * kernel addresses.
+ */
+	if (ft) {
+	    ft = 0;
+
+#if	defined(ADVFSV)
+	    if (get_Nl_value("advfsvfs", (struct drive_Nl *)NULL, &aops) < 0)
+		aops = (KA_T)0;
+#endif	/* defined(ADVFSV) */
+
+	    if (get_Nl_value("cdfsvfs", (struct drive_Nl *)NULL, &cops) < 0)
+		cops = (KA_T)0;
+	    if (get_Nl_value("dvdfsvfs", (struct drive_Nl *)NULL, &dops) < 0)
+		dops = (KA_T)0;
+	    if (get_Nl_value("fdfsvfs", (struct drive_Nl *)NULL, &fops) < 0)
+		fops = (KA_T)0;
+	    if (get_Nl_value("fsfsrvp", (struct drive_Nl *)NULL, &frvp) < 0)
+		frvp = (KA_T)0;
+	    if (get_Nl_value("nfsvfs", (struct drive_Nl *)NULL, &nops) < 0)
+		nops = (KA_T)0;
+	    if (get_Nl_value("nfs3vfs", (struct drive_Nl *)NULL, &n3ops) < 0)
+		n3ops = (KA_T)0;
+	    if (get_Nl_value("ufsvfs", (struct drive_Nl *)NULL, &uops) < 0)
+		uops = (KA_T)0;
+	}
+/*
+ * See if we know how to find the root vnode pointer for this file system
+ * type.
+ */
+
+#if	defined(ADVFSV)
+	if (aops && (aops == (KA_T)m.m_op)) {
+
+	/*
+	 * Set AdvFS (MSFS) root vnode address.
+	 */
+	    if (!m.m_info || kread((KA_T)m.m_info, (char *)&am, sizeof(am)))
+		return(0);
+	    rv = (KA_T)am.am_rootvp;
+	} else
+#endif	/* defined(ADVFSV) */
+
+	if (cops && (cops == (KA_T)m.m_op)) {
+
+	/*
+	 * Set CDFS root vnode address.
+	 */
+	    if (!m.m_info || kread((KA_T)m.m_info, (char *)&cm, sizeof(cm)))
+		return(0);
+	    rv = (KA_T)cm.um_rootvp;
+	} else if (dops && (dops == (KA_T)m.m_op)) {
+
+	/*
+	 * Set DVDFS root vnode address.
+	 */
+	    if (!m.m_info || kread((KA_T)m.m_info, (char *)&dm, sizeof(dm)))
+		return(0);
+	    rv = (KA_T)dm.dm_rootvp;
+	} else if (fops && (fops == (KA_T)m.m_op)) {
+
+	/*
+	 * Set FDFS root vnode address.
+	 */
+	    rv = frvp;
+	} else if ((nops && (nops == (KA_T)m.m_op))
+	       ||  (n3ops && (n3ops == (KA_T)m.m_op)))
+	{
+
+	/*
+	 * Set NFS[3] root vnode address.
+	 */
+	    if (!m.m_info || kread((KA_T)m.m_info, (char *)&nm, sizeof(nm)))
+		return(0);
+	    rv = (KA_T)nm.mi_rootvp;
+	} else if (uops && (uops == (KA_T)m.m_op)) {
+
+	/*
+	 * Set UFS root vnode address.
+	 */
+	    if (!m.m_info || kread((KA_T)m.m_info, (char *)&um, sizeof(um)))
+		return(0);
+	    rv = (KA_T)um.um_rootvp;
+	} else
+	    return(0);
+/*
+ * Read the root vnode.
+ */
+	if (!rv || kread(rv, (char *)&v, sizeof(v)))
+	    return(0);
+	if (id != v.v_id)
+	    return(0);
+/*
+ * A new root vnode has been located.  Cache it.
+ */
+	if (niu >= nia) {
+	    if (!nia) {
+		len = (MALLOC_S)(10 * sizeof(unsigned long));
+		ic = (unsigned long *)malloc(len);
+	    } else {
+		len = (MALLOC_S)((nia + 10) * sizeof(unsigned long));
+		ic = (unsigned long *)realloc((MALLOC_P *)ic, len);
+	    }
+	    if (!ic) {
+		(void) fprintf(stderr,
+		    "%s: no space for root node VPID table\n", Pn);
+		Exit(1);
+	    }
+	    nia += 10;
+	}
+	ic[niu++] = id;
+	return(1);
+}
+
+
+/*
+ * ncache_isroot() - is head of name cache path a file system root?
+ */
+
+static int
+ncache_isroot(na, cp)
+	KA_T na;				/* vnode address */
+	char *cp;				/* partial path */
+{
+	char buf[MAXPATHLEN];
+	int i;
+	MALLOC_S len;
+	struct mounts *mtp;
+	static KA_T *nc = (KA_T *)NULL;
+	static int nca = 0;
+	static int ncn = 0;
+	struct stat sb;
+	struct vnode v;
+
+	if (!na)
+	    return(0);
+/*
+ * Search the root capability node address cache.
+ */
+	for (i = 0; i < ncn; i++) {
+	    if (na == nc[i])
+		return(1);
+	}
+/*
+ * Read the vnode and see if it's a VDIR node with the VROOT flag set.  If
+ * it is, then the path is complete.
+ *
+ * If it isn't, and if the file has an inode number, search the mount table
+ * and see if the file system's inode number is known.  If it is, form the
+ * possible full path, safely stat() it, and see if it's inode number matches
+ * the one we have for this file.  If it does, then the path is complete.
+ */
+	if (kread((KA_T)na, (char *)&v, sizeof(v))
+	||  v.v_type != VDIR || !(v.v_flag & VROOT)) {
+
+	/*
+	 * The vnode tests failed.  Try the inode tests.
+	 */
+	    if (Lf->inp_ty != 1 || !Lf->inode
+	    ||  !Lf->fsdir || (len = strlen(Lf->fsdir)) < 1)
+		return(0);
+	    if ((len + 1 + strlen(cp) + 1) > sizeof(buf))
+		return(0);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (strcmp(Lf->fsdir, mtp->dir) == 0)
+		    break;
+	    }
+	    if (!mtp)
+		return(0);
+	    (void) strcpy(buf, Lf->fsdir);
+	    if (buf[len - 1] != '/')
+		buf[len++] = '/';
+	    (void) strcpy(&buf[len], cp);
+	    if (statsafely(buf, &sb) != 0
+	    ||  (INODETYPE)sb.st_ino != Lf->inode)
+		return(0);
+	}
+/*
+ * Add the capability ID to the root capability ID cache.
+ */
+	if (ncn >= nca) {
+	    if (!nca) {
+		len = (MALLOC_S)(10 * sizeof(KA_T));
+		nc = (KA_T *)malloc(len);
+	    } else {
+		len = (MALLOC_S)((nca + 10) * sizeof(KA_T));
+		nc = (KA_T *)realloc((MALLOC_P *)nc, len);
+	    }
+	    if (!nc) {
+		(void) fprintf(stderr,
+		    "%s: no space for root node address table\n", Pn);
+		Exit(1);
+	    }
+	    nca += 10;
+	}
+	nc[ncn++] = na;
+	return(1);
+}
+
+
+/*
+ * ncache_load() - load the kernel's name cache
+ */
+
+void
+ncache_load()
+{
+	register int h, i, n;
+	KA_T ka, ncp;
+	int len;
+	register struct l_nch *lp;
+	struct l_nch *lpnxt;
+	static struct namecache *nc = (struct namecache *)NULL;
+	static int ncl = 0;
+	static int nchsz = 0;
+	static int ncpc = 0;
+	static int ncpus = 0;
+	register struct namecache *np;
+	static KA_T *pp = (KA_T *)NULL;
+
+	if (!Fncache)
+	    return;
+	if (Ncfirst) {
+
+	/*
+	 * Do startup (first-time) functions.
+	 */
+	    Ncfirst = 0;
+	/*
+	 * Get CPU count.
+	 */
+	    ka = (KA_T)0;
+	    if (get_Nl_value("ncpus", (struct drive_Nl *)NULL, &ka) < 0
+	    ||  !ka
+	    ||  kread(ka, (char *)&ncpus, sizeof(ncpus)))
+	    {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read processor count: %s\n",
+			Pn, print_kptr(ka, (char *)NULL, 0));
+		ncl = nchsz = ncpc = ncpus = 0;
+		return;
+	    }
+	    if (ncpus < 1) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: processor count: %d\n", Pn, ncpus);
+		ncl = nchsz = ncpc = ncpus = 0;
+		return;
+	    }
+	/*
+	 * Get the per-processor table address.
+	 */
+	    ka = (KA_T)0;
+	    if (get_Nl_value("procptr", (struct drive_Nl *)NULL, &ka) < 0
+	    ||  !ka
+	    ||  kread(ka, (char *)&ka, sizeof(ka))
+	    ||  !ka)
+	    {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: per processor table address: %s\n",
+			Pn, print_kptr(ka, (char *)NULL, 0));
+		ncl = nchsz = ncpc = ncpus = 0;
+		return;
+	    }
+	/*
+	 * Allocate space for the processor structure addresses and read them.
+	 */
+	    len = (int)(ncpus * sizeof(KA_T));
+	    if (!(pp = (KA_T *)malloc((MALLOC_S)len))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for processor addresses\n",
+			Pn, len);
+		Exit(1);
+	    }
+	    if (kread(ka, (char *)pp, len)) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read processor addresses: %s\n",
+			Pn, print_kptr(ka, (char *)NULL, 0));
+		ncl = nchsz = ncpc = ncpus = 0;
+		return;
+	    }
+	    for (i = 0; i < ncpus; i++) {
+		if (pp[i])
+		    pp[i] = (KA_T)((char *)pp[i]
+			  +	   offsetof(struct processor, namecache));
+	    }
+	/*
+	 * Get the per-processor nchash size.
+	 */
+	    ka = (KA_T)0;
+	    if (get_Nl_value("nchsz", (struct drive_Nl *)NULL, &ka) < 0
+	    ||  !ka
+	    ||  kread((KA_T)ka, (char *)&nchsz, sizeof(nchsz)))
+	    {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: processor nchash count address: %s\n",
+			Pn, print_kptr(ka, (char *)NULL, 0));
+		ncl = nchsz = ncpc = ncpus = 0;
+		return;
+	    }
+	    if (nchsz < 1) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: bad per processor nchash count: %d\n",
+			Pn, nchsz);
+		nchsz = ncpus = 1;
+		return;
+	    }
+	/*
+	 * Allocate space for nchsz * NCHSIZE * ncpus namecache structures.
+	 */
+	    ncpc = (int)(nchsz * NCHSIZE);
+	    ncl = (int)(ncpc * sizeof(struct namecache));
+	    len = (int)(ncl * ncpus);
+	    if (!(nc = (struct namecache *)malloc((MALLOC_S)len))) {
+		(void) fprintf(stderr,
+		    "%s: no space for %d namecache entries (%d bytes)\n",
+		    Pn, ncpc * ncpus, len);
+		Exit(1);
+	    }
+	} else {
+
+	/*
+	 * Do setup for repeat calls.
+	 */
+	    if (Nchash) {
+		for (i = 0; i <= Hmsk; i++) {
+		    for (lp = Nchash[i]; lp; lp = lpnxt) {
+			lpnxt = lp->nxt;
+			(void) free((MALLOC_P *)lp);
+		    }
+		}
+		(void) free((MALLOC_P *)Nchash);
+		Nchash = (struct l_nch **)NULL;
+		Nc = 0;
+	    }
+	}
+/*
+ * Loop through the processors, reading the processor structure pointer
+ * for the processor, then its name cache.  Build a local name cache
+ * table of struct namecache entries for all processors.
+ */
+	for (i = n = 0; i < ncpus; i++) {
+	    if (!pp[i])
+		continue;
+	    if (kread(pp[i], (char *)&ncp, sizeof(ncp)) || !ncp)
+		continue;
+	    if (kread(ncp, (char *)&nc[n], ncl))
+		continue;
+	    n += ncpc;
+	}
+/*
+ * Compute a hash table size and allocate it.
+ */
+	if (!n)
+	    return;
+	for (i = 1; i < n; i <<= 1)
+	    ;
+	i += i;
+	Hmsk = i - 1;
+	if (!(Nchash = (struct l_nch **)calloc(i, sizeof(struct l_nch *)))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: no space for %d byte name cache hash buckets\n",
+		    Pn, (int)(i * sizeof(struct l_nch *)));
+	    Exit(1);
+	}
+/*
+ * Assign hash pointers to the accumulated namecache entries.
+ */
+	for (i = Nc = 0; i < n; i++) {
+	    if (!nc[i].nc_vpid)
+		continue;
+	    if (((len = nc[i].nc_nlen) < 1) || (len > NCHNAMLEN))
+		continue;
+	    if (len < 3 && nc[i].nc_name[0] == '.') {
+		if ((len == 1) || ((len == 2) && (nc[i].nc_name[1] == '.')))
+		    continue;
+	    }
+	    h = ncachehash(nc[i].nc_vpid);
+	/*
+	 * Look for an existing hash entry.  Choose among duplicates the one
+	 * with the largest nc_dvpid.
+	 */
+	    for (lp = Nchash[h]; lp; lp = lp->nxt) {
+		if ((np = lp->nc) && (np->nc_vpid == nc[i].nc_vpid)) {
+		    if (nc[i].nc_dvpid > np->nc_dvpid)
+			lp->nc = &nc[i];
+		    break;
+		}
+	    }
+	    if (lp)
+		continue;
+	/*
+	 * Allocate and fill a new local name cache entry.
+	 */
+	    if (!(lp = (struct l_nch *)malloc(sizeof(struct l_nch)))) {
+		(void) fprintf(stderr, "%s: can't allocate l_nch entry\n", Pn);
+		Exit(1);
+	    }
+	    lp->nc = &nc[i];
+	    lp->nxt = Nchash[h];
+	    Nchash[h] = lp;
+	    Nc++;
+	}
+}
+
+
+/*
+ * ncache_lookup() - look up a node's name in the kernel's name cache
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	struct l_nch *lc;
+	struct mounts *mtp;
+	struct namecache *nc;
+	int nl, rlen;
+
+	*cp = '\0';
+	*fp = 0;
+
+# if	defined(HASFSINO)
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller to print the file system mount point name only.
+ */
+	if (Lf->inp_ty == 1 && Lf->fs_ino && Lf->inode == Lf->fs_ino)
+	    return(cp);
+# endif	/* defined(HASFSINO) */
+
+/*
+ * Look up the name cache entry for the node address.
+ */
+	if (Nc == 0 || !(lc = ncache_addr(Lf->id)) || !(nc = lc->nc)) {
+
+	/*
+	 * If the node has no cache entry, see if it's the mount
+	 * point of a known file system.
+	 */
+	    if (!Lf->fsdir || !Lf->dev_def || Lf->inp_ty != 1)
+		return((char *)NULL);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if ((Lf->dev == mtp->dev)
+		&&  (mtp->inode == Lf->inode)
+		&&  (strcmp(mtp->dir, Lf->fsdir) == 0))
+		    return(cp);
+	    }
+	    return((char *)NULL);
+	}
+/*
+ * Start the path assembly.
+ */
+	if ((nl = nc->nc_nlen) > (blen - 1))
+	    return((char *)NULL);
+	cp = buf + blen - nl - 1;
+	rlen = blen - nl - 1;
+	(void) strncpy(cp, nc->nc_name, nl);
+	cp[nl] = '\0';
+/*
+ * Look up the name cache entries that are parents of the node address.
+ * Quit when:
+ *
+ *	there's no parent;
+ *	the name length is too large to fit in the receiving buffer.
+ */
+	for (;;) {
+	    if (!nc->nc_dvpid) {
+		if (ncache_isroot((KA_T)nc->nc_vp, cp))
+		    *fp = 1;
+		break;
+	    }
+	    if (!(lc = ncache_addr(nc->nc_dvpid))) {
+		if (ncache_ckrootid((KA_T)nc->nc_vp, nc->nc_dvpid))
+		    *fp = 1;
+		break;
+	    }
+	    if (!(nc = lc->nc))
+		break;
+	    if (((nl = nc->nc_nlen) + 1) > rlen)
+		break;
+	    *(cp - 1) = '/';
+	    cp--;
+	    rlen--;
+	    (void) strncpy(cp - nl, nc->nc_name, nl);
+	    cp -= nl;
+	    rlen -= nl;
+	}
+	return(cp);
+}
+#endif	/* DUV>=50100 && defined(HASNCACHE) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/du/dproto.h
new file mode 100644
index 0000000..ebc1d8d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dproto.h
@@ -0,0 +1,61 @@
+/*
+ * dproto.h - DEC OSF/1, Digital UNIX, Tru64 UNIX function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.8 99/06/22 08:15:18 abe Exp $
+ */
+
+
+_PROTOTYPE(extern void clr_flinfo,(void));
+_PROTOTYPE(extern char *get_nlist_path,(int ap));
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern struct l_vfs *readvfs,(KA_T vm));
+
+#if     defined(HASDCACHE)
+_PROTOTYPE(extern void clr_sect,(void));
+#endif  /* defined(HASDCACHE) */
+
+#if	defined(HASIPv6)
+_PROTOTYPE(extern struct hostent *gethostbyname2,(char *nm, int prot));
+#endif	/* defined(HASIPv6) */
+
+#if	defined(HASPRIVNMCACHE)
+_PROTOTYPE(extern int tag_to_path,(char *fs, mlBfTagT t2pb, int nl, char *nlb));
+#endif	/* defined(HASPRIVNMCACHE) */
+
+#if	defined(USELOCALREADDIR)
+_PROTOTYPE(extern int CloseDir,(DIR *dirp));
+_PROTOTYPE(extern DIR *OpenDir,(char *dir));
+_PROTOTYPE(extern struct DIRTYPE *ReadDir,(DIR *dirp));
+#endif	/* defined(USELOCALREADDIR) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/du/dsock.c
new file mode 100644
index 0000000..94f4589
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dsock.c
@@ -0,0 +1,325 @@
+/*
+ * dsock.c - DEC OSF/1, Digital UNIX, Tru64 UNIX socket processing functions
+ *	     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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.19 2005/08/08 19:56:44 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	struct domain d;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam;
+	int fp, lp;
+	struct inpcb inp;
+	KA_T ka;
+	unsigned char *la = (unsigned char *)NULL;
+	struct mbuf mb;
+	struct protosw p;
+	struct socket s;
+	struct tcpcb t;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = NULL;
+	struct sockaddr_un un;
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read the socket, protocol, and domain structures.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread(sa, (char *) &s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket struct from %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_type) {
+	    enter_nm("no socket type");
+	    return;
+	}
+	if (!s.so_proto
+	||  kread((KA_T)s.so_proto, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "can't read protocol switch from %s",
+		print_kptr((KA_T)s.so_proto, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!p.pr_domain
+	||  kread((KA_T)p.pr_domain, (char *)&d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Save size information.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rq = s.so_rcv.sb_cc;
+	Lf->lts.sq = s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.ltm = (unsigned int)s.so_linger;
+	Lf->lts.opt = (unsigned int)s.so_options;
+	Lf->lts.pqlen = (unsigned int)s.so_q0len;
+	Lf->lts.qlen = (unsigned int)s.so_qlen;
+	Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+	Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = (unsigned int)s.so_state;
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	switch ((fam = d.dom_family)) {
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+
+#if	defined(HASIPv6)
+	case AF_INET6:
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+		(fam == AF_INET) ? "IPv4" : "IPv6");
+#else	/* !defined(HASIPv6) */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+	    if (Fnet) {
+		if (!FnetTy
+		||  ((FnetTy == 4) && (fam == AF_INET))
+
+#if	defined(HASIPv6)
+		||  ((FnetTy == 6) && (fam == AF_INET6))
+#endif	/* defined(HASIPv6) */
+		)
+
+		    Lf->sf |= SELNET;
+	    }
+	    printiproto(p.pr_protocol);
+	/*
+	 * Read protocol control block.
+	 */
+	    if (!s.so_pcb
+	    ||  kread((KA_T)s.so_pcb, (char *)&inp, sizeof(inp))) {
+		(void) snpf(Namech, Namechl, "can't read inpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Print Internet socket information.
+	 */
+	    ka = (KA_T)(inp.inp_ppcb ? inp.inp_ppcb : s.so_pcb);
+	    enter_dev_ch(print_kptr((ka & 0xffffffff), (char *)NULL, 0));
+
+#if	defined(HASIPv6)
+	    if ((fam == AF_INET && IN6_IS_ADDR_UNSPECIFIED(&inp.inp_laddr))
+	    ||   IN6_IS_ADDR_V4MAPPED(&inp.inp_laddr)) {
+		la = (unsigned char *)&IN6_EXTRACT_V4ADDR(&inp.inp_laddr);
+		fam = AF_INET;
+	    } else {
+		la = (unsigned char *)&inp.inp_laddr;
+		fam = AF_INET6;
+	    }
+#else	/* !defined(HASIPv6) */
+	    la = (unsigned char *)&inp.inp_laddr;
+#endif	/* defined(HASIPv6) */
+
+	    lp = (int)ntohs(inp.inp_lport);
+
+#if	defined(HASIPv6)
+	    if (fam == AF_INET) {
+		if (inp.inp_fport
+		||  IN6_EXTRACT_V4ADDR(&inp.inp_faddr) != INADDR_ANY)
+		{
+		    fa = (unsigned char *)&IN6_EXTRACT_V4ADDR(&inp.inp_faddr);
+		    fp = (int)ntohs(inp.inp_fport);
+		}
+	    } else {
+		if (inp.inp_fport || !IN6_IS_ADDR_UNSPECIFIED(&inp.inp_faddr))
+		{
+		    fa = (unsigned char *)&inp.inp_faddr;
+		    fp = (int)ntohs(inp.inp_fport);
+		}
+	    }
+#else	/* !defined(HASIPv6) */
+	    if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport != 0) {
+		fa = (unsigned char *)&inp.inp_faddr;
+		fp = (int)ntohs(inp.inp_fport);
+	    }
+#endif	/* defined(HASIPv6) */
+
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, fam);
+	    if (p.pr_protocol == IPPROTO_TCP && inp.inp_ppcb
+	    &&  !kread((KA_T)inp.inp_ppcb, (char *)&t, sizeof(t))) {
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)t.t_state;
+
+#if	defined(HASSOOPT)
+		Lf->lts.kai = (unsigned int)t.t_timer[TCPT_KEEP];
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+		Lf->lts.mss = (unsigned long)t.t_maxseg;
+		Lf->lts.msss = (unsigned char)1;
+		Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	    }
+	    break;
+/*
+ * Process a ROUTE domain socket.
+ */
+	case AF_ROUTE:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "rte");
+	    if (s.so_pcb) {
+		ka = (KA_T)(s.so_pcb);
+		enter_dev_ch(print_kptr((ka & 0xffffffff), (char *)NULL, 0));
+	    } else
+		(void) snpf(Namech, Namechl, "no protocol control block");
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    break;
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+	    enter_dev_ch(print_kptr((sa & 0xffffffff), (char *)NULL, 0));
+	    if (kread((KA_T) s.so_pcb, (char *) &unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+	    if (unp.unp_addr) {
+		if (kread((KA_T) unp.unp_addr, (char *) &mb, sizeof(mb))) {
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+		ua = (struct sockaddr_un *)((char *)&mb
+		   +  (mb.m_hdr.mh_data - (caddr_t)unp.unp_addr));
+		ua->sun_family = AF_UNIX;
+	    }
+	    if (!ua) {
+		ua = &un;
+		(void) zeromem((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *)&uc, sizeof(uc)))
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			else {
+			    ka = (KA_T)uc.unp_socket;
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((ka & 0xffffffff), (char *)NULL, 0));
+			}
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	    if (ua->sun_path[0]) {
+		if (mb.m_len >= sizeof(struct sockaddr_un))
+		    mb.m_len = sizeof(struct sockaddr_un) - 1;
+		*((char *)ua + mb.m_len) = '\0';
+		if (Sfile && is_file_named(ua->sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (!Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/du/dstore.c
new file mode 100644
index 0000000..7edea3b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/dstore.c
@@ -0,0 +1,162 @@
+/*
+ * dstore.c - DEC OSF/1, Digital UNIX, Tru64 UNIX global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.10 2000/08/09 20:06:50 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+int CloneMaj;				/* clone major device number */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+        { "cldev",	"clonedev"		},
+        { "fids",	"fids"			},
+	{ "msfsubc",	"msfs_ubcops"		},
+
+#if	DUV>=50100
+	{ "advfsvfs",	"msfs_vfsops"		},
+	{ "cdfsvfs",	"cdfs_vfsops"		},
+	{ "dvdfsvfs",	"dvdfs_vfsops"		},
+	{ "fdfsvfs",	"fdfs_vfsops"		},
+	{ "fsfsrvp",	"fdfs_root_directory"	},
+	{ "nchsz",	"nchsz"			},
+	{ "ncpus",	"ncpus"			},
+	{ "nfsvfs",	"nfs_vfsops"		},
+	{ "nfs3vfs",	"nfs3_vfsops"		},
+	{ "procptr",	"processor_ptr"		},
+	{ "ufsvfs",	"ufs_vfsops"		},
+#else	/* DUV<50100 */
+	{ X_NCACHE,	"namecache"		},
+	{ X_NCSIZE,	"nchsize"		},
+#endif	/* DUV>=50100 */
+
+        { "vnmaxp",	"vn_maxprivate"		},
+
+#if	DUV<30000
+        { "proc",	"proc"			},
+        { "nproc",	"nproc"			},
+#else	/* DUV>=30000 */
+        { "npid",	"npid"			},
+        { "pidt",	"pidtab"		},
+#endif	/* DUV<30000 */
+
+	{ "",		"",			},
+	{ NULL,		NULL,			}
+};
+
+struct file *Fileptr;			/* for process_file() in lib/prfp.c */
+int HaveCloneMaj = 0;			/* status of CloneMaj */
+int Kd = -1;
+struct l_vfs *Lvfs = NULL;
+
+# if    DUV>=30000
+KA_T *Pa = NULL;			/* kernel proc structure addresses */
+# endif /* DUV>=30000 */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FASYNC,		FF_ASYNC	},
+	{ (long)FMARK,		FF_MARK		},
+	{ (long)FDEFER,		FF_DEFER	},
+	{ (long)FSHLOCK,	FF_SHLOCK	},
+	{ (long)FEXLOCK,	FF_EXLOCK	},
+
+# if	defined(FKERNEL)
+	{ (long)FKERNEL,	FF_KERNEL	},
+# endif	/* defined(FKERNEL) */
+
+# if	defined(FKERNEL)
+	{ (long)FVTEXT,		FF_VTEXT	},
+# endif	/* defined(FVTEXT) */
+
+# if	defined(FSYNC)
+	{ (long)FSYNC,		FF_SYNC		},
+# endif	/* defined(FSYNC) */
+
+# if	defined(FDSYNC)
+	{ (long)FDSYNC,		FF_DSYNC	},
+# endif	/* defined(FDSYNC) */
+
+# if	defined(FRSYNC)
+	{ (long)FRSYNC,		FF_RSYNC	},
+# endif	/* defined(FRSYNC) */
+
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,		POF_CLOEXEC	},
+# else	/* !defined(UF_EXCLOSE) */
+	{ (long)1,			POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,		POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+# if	defined(UF_RESERVED_WAIT)
+	{ (long)UF_RESERVED_WAIT,	POF_RSVWT	},
+# endif	/* defined(UF_RESERVED_WAIT) */
+
+	{ (long)0,			NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
+
+struct proc *Ps = NULL;			/* local proc structures */
+int Psn = 0;				/* entries in Paddr[] and Ps[] */
+int Vnmxp;				/* vnode's max private area length */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/du/machine.h b/lsof_4.85/lsof_4.85_src/dialects/du/machine.h
new file mode 100644
index 0000000..a7f92ac
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/du/machine.h
@@ -0,0 +1,647 @@
+/*
+ * machine.h - DEC OSF/1, Digital UNIX, Tru64 UNIX definitions 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: machine.h,v 1.42 2010/07/29 16:02:47 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+
+#define	_KERNEL	1
+#include <sys/signal.h>
+
+#if	DUV>=50000
+#include <sys/resource.h>
+#include <sys/time.h>
+#endif	/* DUV>=50000 */
+
+#undef	_KERNEL
+
+#include <sys/param.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#if	DUV>=40000
+#define	CAN_USE_CLNT_CREATE	1
+#endif	/* DUV>=40000 */
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ *
+ * NOWARNBLKDEV suppresses warnings about no block devices for Tru64 UNIX 5.0
+ * and above.
+ */
+
+#define	HASBLKDEV	1
+
+#if	DUV>=50000
+#define	NOWARNBLKDEV	1
+#endif	/* DUV>=50000 */
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+#define	HASINODE	1
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+#if	defined(HASTAGTOPATH)
+#define HASLFILEADD int advfs_seq; unsigned char advfs_seq_stat;
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+#define SETLFILEADD Lf->advfs_seq_stat = 0;
+#endif	/* defined(HASTAGTOPATH) */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+   kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+#define	HASPRINTDEV	print_dev
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+#if	defined(HASTAGTOPATH)
+#define	HASPRIVNMCACHE	print_advfs_path
+#endif	/* defined(HASTAGTOPATH) */
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+#define	HASPROCFS	"proc"
+/* #define	HASFSTYPE	1 */
+#define	HASPINODEN	1
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1 */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	DUV>=40000
+#define	HASWIDECHAR	1
+# endif	/* DUV>=40000 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior to
+ * R4 usually don't.
+ *
+ * Even though Digital UNIX has vnodes, we don't define HASVNODE, because
+ * private vnode processing is required.  (See the readvnode() function
+ * in dnode.c.)
+ */
+
+/* #define	HASVNODE	1 */
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+/* #define	INODETYPE	unsigned long long */
+					/* inode number internal storage type */
+/* #define	INODEPSPEC	"ll"	 * INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	uid_t
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+/* #define	USE_LIB_PRINTDEVNAME		1	   pdvn.c */
+#define	USE_LIB_PROCESS_FILE			1	/* prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+/* #define	USE_LIB_READDEV			1	   rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+
+# if	DUV<50100
+#define	USE_LIB_RNAM				1	/* rnam.c */
+# else	/* DUV>=50100 */
+/* Tru64 UNIX 5.1 and above have private name cache functions -- see
+ * ./dproc.c */
+# endif	/* DUV<50100 */
+
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+
+# if	DUV<50000
+#define	USE_LIB_SNPF				1	/* snpf.c */
+# else	/* DUV>=50000 */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+# endif	/* DUV<50000 */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	bzero(a, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/Makefile b/lsof_4.85/lsof_4.85_src/dialects/freebsd/Makefile
new file mode 100644
index 0000000..632bc06
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/Makefile
@@ -0,0 +1,162 @@
+
+# FreeBSD Makefile remainder
+#
+# $Id: Makefile,v 1.12 2009/03/25 19:23:06 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h dzfs.h
+
+SRC=    dmnt.c dnode.c dnode1.c dnode2.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.c
+
+OBJ=	dmnt.o dnode.o dnode1.o dnode2.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the kmem group.  Your install rule actions might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '    install -cs -m 2755 -g $${GRP} $${PROG} $${BIN}/$${PROG}'
+	@echo '    install -c -m 444 $${MAN} $${DOC}/$${MAN}'
+	@echo ''
+	@echo 'You will have to complete the skeletons for the BIN, DOC, and'
+	@echo 'GRP strings given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/local/man/man8'
+	@echo '    GRP= kmem'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dnode2.o:	dzfs.h dnode2.c
+		@if [ -f ./Makefile.zfs ]; then \
+		    ${MAKE} -f Makefile.zfs dnode2.o; \
+		else \
+		    echo "${CC} ${CFLAGS} -c dnode2.c"; \
+		    ${CC} ${CFLAGS} -c dnode2.c; \
+		fi;
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/Makefile.zfs b/lsof_4.85/lsof_4.85_src/dialects/freebsd/Makefile.zfs
new file mode 100644
index 0000000..bc473e9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/Makefile.zfs
@@ -0,0 +1,17 @@
+
+# Makefile.zfs -- FreeBSD Makefile remainder for ZFS modules
+#
+# $Id: Makefile.zfs,v 1.3 2011/08/07 22:51:28 abe Exp $
+
+CFLAGS+=-D_SOLARIS_C_SOURCE
+CFLAGS+=${DEBUG}
+CFLAGS+=-I${OPENSOLARIS}/compat/opensolaris
+CFLAGS+=-I${OPENSOLARIS}/contrib/opensolaris/uts/common/fs/zfs
+CFLAGS+=-I${OPENSOLARIS}/contrib/opensolaris/uts/common/zmod
+CFLAGS+=-I${OPENSOLARIS}/contrib/opensolaris/uts/common
+CFLAGS+=-I${OPENSOLARIS}/contrib/opensolaris/common/zfs
+CFLAGS+=-I${OPENSOLARIS}/contrib/opensolaris/common
+CFLAGS+=-I${.CURDIR}/usr/src/include
+CFLAGS+=-I`pwd`
+
+dnode2.o:	dzfs.h dnode2.c
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/freebsd/Mksrc
new file mode 100755
index 0000000..c0745ae
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/Mksrc
@@ -0,0 +1,29 @@
+#!/bin/sh
+#
+# Mksrc - make FreeBSD source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.5 2008/04/15 13:31:47 abe Exp $
+
+
+D=dialects/freebsd
+L="dlsof.h dmnt.c dnode.c dnode1.c dnode2.c dproc.c dproto.h dsock.c dstore.c dzfs.h machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
+
+# For ZFS
+
+rm -f vnode_if.h
+touch vnode_if.h
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dlsof.h
new file mode 100644
index 0000000..2b87ed5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dlsof.h
@@ -0,0 +1,629 @@
+/*
+ * 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) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dmnt.c
new file mode 100644
index 0000000..2caa694
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dmnt.c
@@ -0,0 +1,462 @@
+/*
+ * dmnt.c - FreeBSD mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.16 2009/03/25 19:23:06 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local static information
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+#undef	HAS_MNT_NAMES
+
+#if	FREEBSDV<2000
+static char *mnt_names[] = { "none", "ufs", "nfs", "mfs", "pc", "iso9600",
+			     "procfs", "devfs" };
+#define	HAS_MNT_NAMES	1
+#else	/* FREEBSDV>=2000 */
+# if	defined(MOUNT_NONE)
+static char *mnt_names[] = INITMOUNTNAMES;
+#define	HAS_MNT_NAMES	1
+# endif	/* defined(MOUNT_NONE)) */
+#endif	/* FREEBSDV<2000 */
+
+
+#if	FREEBSDV>=5000 && defined(HAS_NO_SI_UDEV)
+/*
+ * Dev2Udev() -- convert a kernel device number to a user device number
+ */
+
+dev_t
+Dev2Udev(c)
+
+# if	defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
+	KA_T c;
+# else	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+	struct cdev *c;
+# endif	/* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
+
+{
+
+# if	!defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
+	char *cp;
+	char *dn = (char *)NULL;
+	char *ln = (char *)NULL;
+	struct statfs *mb;
+	int n, sr;
+	static u_int s;
+	struct stat sb;
+	static int ss = 0;
+# endif	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+
+# if	defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
+	KA_T ca;
+	struct cdev_priv cp;
+
+	if (!c)
+	    return(NODEV);
+
+#  if	defined(HAS_CDEV2PRIV)
+	ca = (KA_T)cdev2priv(c);
+#  else	/* !defined(HAS_CDEV2PRIV) */
+	ca = (KA_T)member2struct(cdev_priv, cdp_c, c);
+#  endif	/* defined(HAS_CDEV2PRIV) */
+
+	if (kread((KA_T)ca, (char *)&cp, sizeof(cp)))
+	    return(NODEV);
+	return((dev_t)cp.cdp_inode);
+# else	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+#  if	defined(HAS_SI_PRIV)
+/*
+ * If the cdev structure has a private sub-structure, read it.
+ */
+	struct cdev_priv sp;
+
+	if (!c->si_priv || kread((KA_T)c->si_priv, (char *)&sp, sizeof(sp)))
+	    return(0);
+#  endif	/* defined(HAS_SI_PRIV) */
+
+	if (ss) {
+
+#  if	defined(HAS_SI_PRIV)
+	    return(sp.cdp_inode ^ s);
+#  else	/* !defined(HAS_SI_PRIV) */
+	    return(c->si_inode ^ s);
+#  endif	/* defined(HAS_SI_PRIV) */
+
+	}
+
+/*
+ * Determine the random udev seed from stat(2) operations on "/" and
+ * its device.
+ */
+	if ((n = getmntinfo(&mb, MNT_NOWAIT)) <= 0) {
+	    (void) fprintf(stderr, "%s: no mount information\n", Pn);
+	    Exit(1);
+	}
+	for (; n; n--, mb++) {
+
+# if	defined(MOUNT_NONE)
+	    if (mb->f_type == MOUNT_NONE || mb->f_type >= MOUNT_MAXTYPE)
+# else	/* !defined(MOUNT_NONE) */
+	    if (!mb->f_type)
+# endif	/* defined(MOUNT_NONE) */
+
+		continue;
+	/*
+	 * Get the real directory name.  Ignore all but the root directory;
+	 * safely stat("/").
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntonname, (MALLOC_S *)NULL))) {
+
+Dev2Udev_no_space:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mb->f_mntonname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mb->f_mntfromname, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    ln = (char *)NULL;
+	    if (strcmp(dn, "/"))
+		continue;
+	    if (statsafely(dn, &sb))
+		continue;
+	/*
+	 * Get the real device name and safely stat(2) it.
+	 */
+	    (void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntfromname, (MALLOC_S *)NULL)))
+		goto Dev2Udev_no_space;
+	    ln = Readlink(dn);
+	    if ((sr = statsafely(ln, &sb))) {
+
+	    /*
+	     * If the device stat(2) failed, see if the device name indicates
+	     * an NFS mount, a cd9660 device, or a ZFS mount.  If any condition
+	     * is true, set the user device number seed to zero.
+	     */
+		if (((cp = strrchr(ln, ':')) && (*(cp + 1) == '/'))
+		||  !strcasecmp(mb->f_fstypename, "cd9660")
+		||  !strcasecmp(mb->f_fstypename, "zfs")
+		) {
+		    ss = 1;
+		    s = (u_int)0;
+		}
+	    }
+	    if (ln != dn)
+		(void) free((FREE_P *)ln);
+	    ln = (char *)NULL;
+	    (void) free((FREE_P *)dn);
+	    dn = (char *)NULL;
+	    if (sr && !ss)
+		continue;
+	    if (!ss) {
+		ss = 1;
+		s = (u_int)sb.st_ino ^ (u_int)sb.st_rdev;
+	    }
+	    break;
+	}
+/*
+ * Free string copies, as required.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	if (ln)
+	    (void) free((FREE_P *)ln);
+/*
+ * If the device seed is known, return its application to the cdev structure's
+ * inode.
+ */
+	if (ss) {
+
+#  if	defined(HAS_SI_PRIV)
+	    return(sp.cdp_inode ^ s);
+#  else	/* !defined(HAS_SI_PRIV) */
+	    return(c->si_inode ^ s);
+#  endif	/* defined(HAS_SI_PRIV) */
+
+	}
+	(void) fprintf(stderr, "%s: can't determine user device random seed.\n",	    Pn);
+	Exit(1);
+
+# endif	/* !defined(HAS_CONF_MINOR) */
+
+}
+#endif	/* FREEBSDV>=5000 && defined(HAS_NO_SI_UDEV) */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	struct statfs *mb;
+	struct mounts *mtp;
+	int n;
+	struct stat sb;
+
+#if	defined(HASPROCFS)
+	unsigned char procfs = 0;
+#endif	/* defined(HASPROCFS) */
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Access mount information.
+ */
+	if ((n = getmntinfo(&mb, MNT_NOWAIT)) <= 0) {
+	    (void) fprintf(stderr, "%s: no mount information\n", Pn);
+	    return(0);
+	}
+/*
+ * Read mount information.
+ */
+	for (; n; n--, mb++) {
+
+#if	defined(MOUNT_NONE)
+	    if (mb->f_type == MOUNT_NONE || mb->f_type >= MOUNT_MAXTYPE)
+#else	/* !defined(MOUNT_NONE) */
+	    if (!mb->f_type)
+#endif	/* defined(MOUNT_NONE) */
+
+		continue;
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntonname, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mb->f_mntonname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mb->f_mntfromname, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't stat() ", Pn);
+
+#if	defined(HAS_MNT_NAMES)
+		    safestrprt(mnt_names[mb->f_type], stderr, 0);
+#else	/* !defined(HAS_MNT_NAMES) */
+		    safestrprt(mb->f_fstypename, stderr, 0);
+#endif	/* defined(HAS_MNT_NAMES) */
+
+		    (void) fprintf(stderr, " file system ");
+		    safestrprt(mb->f_mntonname, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		(void) bzero((char *)&sb, sizeof(sb));
+		sb.st_dev = (dev_t)mb->f_fsid.val[0];
+		sb.st_mode = S_IFDIR | 0777;
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      assuming \"dev=%x\" from mount table\n",
+			sb.st_dev);
+		}
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+
+#if	defined(HASPROCFS)
+
+#if	defined(MOUNT_NONE)
+	    if (mb->f_type == MOUNT_PROCFS)
+#else	/* !defined(MOUNT_NONE) */
+	    if (strcasecmp(mb->f_fstypename, "procfs") == 0)
+#endif	/* defined(MOUNT_NONE) */
+
+	    {
+
+	    /*
+	     * Save information on exactly one procfs file system.
+	     */
+		if (procfs)
+		    Mtprocfs = (struct mounts *)NULL;
+		else {
+		    procfs = 1;
+		    Mtprocfs = mtp;
+		}
+	    }
+#endif	/* defined(HASPROCFS) */
+
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link.
+	 */
+	    if (!(dn = mkstrcpy(mb->f_mntfromname, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	}
+/*
+ * Clean up and return the local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(vm)
+	KA_T vm;			/* kernel mount address from vnode */
+{
+	struct mount m;
+	struct l_vfs *vp;
+/*
+ * Search for match on existing entry.
+ */
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if (vm == vp->addr)
+		return(vp);
+	}
+/*
+ * Read the (new) mount structure, allocate a local entry, and fill it.
+ */
+	if (kread((KA_T)vm, (char *)&m, sizeof(m)) != 0)
+	    return((struct l_vfs *)NULL);
+	if (!(vp = (struct l_vfs *)malloc(sizeof(struct l_vfs)))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	if (!(vp->dir = mkstrcpy(m.m_stat.f_mntonname, (MALLOC_S *)NULL))
+	||  !(vp->fsname = mkstrcpy(m.m_stat.f_mntfromname, (MALLOC_S *)NULL)))
+	{
+	    (void) fprintf(stderr, "%s: PID %d, no space for mount names\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->addr = vm;
+	vp->fsid = m.m_stat.f_fsid;
+
+#if	defined(MOUNT_NONE)
+	vp->type = m.m_stat.f_type;
+#else	/* !defined(MOUNT_NONE) */
+	{
+	    int len;
+
+	    if ((len = strlen(m.m_stat.f_fstypename))) {
+		if (len > (MFSNAMELEN - 1))
+		    len = MFSNAMELEN - 1;
+		if (!(vp->typnm = mkstrcat(m.m_stat.f_fstypename, len,
+				  (char *)NULL, -1, (char *)NULL, -1,
+				  (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr,
+			"%s: no space for fs type name: ", Pn);
+		    safestrprt(m.m_stat.f_fstypename, stderr, 1);
+		    Exit(1);
+		}
+	    } else
+		vp->typnm = "";
+	}
+#endif	/* defined(MOUNT_NONE) */
+
+	vp->next = Lvfs;
+	Lvfs = vp;
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode.c
new file mode 100644
index 0000000..71c217b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode.c
@@ -0,0 +1,1495 @@
+/*
+ * dnode.c - FreeBSD node functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.41 2011/08/07 22:51:28 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	defined(HAS_LOCKF_ENTRY)
+#include "./lockf_owner.h"
+#endif	/* defined(HAS_LOCKF_ENTRY) */
+
+#if	defined(HAS_ZFS)
+#include "dzfs.h"
+#endif	/* defined(HAS_ZFS) */
+
+
+#if	defined(HASFDESCFS) && HASFDESCFS==1
+_PROTOTYPE(static int lkup_dev_tty,(dev_t *dr, INODETYPE *ir));
+#endif	/* defined(HASFDESCFS) && HASFDESCFS==1 */
+
+_PROTOTYPE(static void get_lock_state,(KA_T f));
+
+
+/*
+ * get_lock_state() -- get the lock state
+ */
+
+static void
+get_lock_state(f)
+	KA_T f;				/* inode's lock pointer */
+{
+	struct lockf lf;		/* lockf structure */
+	int lt;				/* lock type */
+
+#if	defined(HAS_LOCKF_ENTRY)
+	struct lockf_entry le;		/* lock_entry structure */
+	KA_T lef, lep;			/* lock_entry pointers */
+	struct lock_owner lo;		/* lock owner structure */
+
+	if (!f || kread(f, (char *)&lf, sizeof(lf)))
+	    return;
+	if (!(lef = (KA_T)lf.ls_active.lh_first))
+	    return;
+	lep = lef;
+	do {
+	   if (kread(lep, (char *)&le, sizeof(le)))
+		return;
+	    if (!le.lf_owner
+	    ||  kread((KA_T)le.lf_owner, (char *)&lo, sizeof(lo)))
+		continue;
+	    if (lo.lo_pid == (pid_t)Lp->pid) {
+		if (le.lf_start == (off_t)0
+		&&  le.lf_end == 0x7fffffffffffffffLL)
+		    lt = 1;
+		else
+		    lt = 0;
+		if (le.lf_type == F_RDLCK)
+		    Lf->lock = lt ? 'R' : 'r';
+		else if (le.lf_type == F_WRLCK)
+		    Lf->lock = lt ? 'W' : 'w';
+		else if (le.lf_type == (F_RDLCK | F_WRLCK))
+		    Lf->lock = 'u';
+		return;
+	    }
+	} while ((lep = (KA_T)le.lf_link.le_next) && (lep != lef));
+#else	/* !defined(HAS_LOCKF_ENTRY) */
+
+	unsigned char l;		/* lock status */
+	KA_T lfp;			/* lockf structure pointer */
+
+	if ((lfp = f)) {
+
+	/*
+	 * Determine the lock state.
+	 */
+	    do {
+		if (kread(lfp, (char *)&lf, sizeof(lf)))
+		    break;
+		l = 0;
+		switch (lf.lf_flags & (F_FLOCK|F_POSIX)) {
+		case F_FLOCK:
+		    if (Cfp && (struct file *)lf.lf_id == Cfp)
+			l = 1;
+		    break;
+		case F_POSIX:
+
+# if	defined(P_ADDR)
+		    if ((KA_T)lf.lf_id == Kpa)
+			l = 1;
+# endif	/* defined(P_ADDR) */
+
+		    break;
+		}
+		if (!l)
+		    continue;
+		if (lf.lf_start == (off_t)0
+		&&  lf.lf_end == 0xffffffffffffffffLL)
+		    lt = 1;
+		else
+		    lt = 0;
+		if (lf.lf_type == F_RDLCK)
+		    Lf->lock = lt ? 'R' : 'r';
+		else if (lf.lf_type == F_WRLCK)
+		    Lf->lock = lt ? 'W' : 'w';
+		else if (lf.lf_type == (F_RDLCK | F_WRLCK))
+		    Lf->lock = 'u';
+		break;
+	    } while ((lfp = (KA_T)lf.lf_next) && (lfp != f));
+   	}
+#endif	/* defined(HAS_LOCKF_ENTRY) */
+
+}
+
+
+#if	FREEBSDV>=2000
+# if	defined(HASPROCFS)
+_PROTOTYPE(static void getmemsz,(pid_t pid));
+
+
+/*
+ * getmemsz() - get memory size of a /proc/<n>/mem entry
+ */
+
+static void
+getmemsz(pid)
+	pid_t pid;
+{
+	int n;
+	struct kinfo_proc *p;
+	struct vmspace vm;
+
+	for (n = 0, p = P; n < Np; n++, p++) {
+	    if (p->P_PID == pid) {
+		if (!p->P_VMSPACE
+		||  kread((KA_T)p->P_VMSPACE, (char *)&vm, sizeof(vm)))
+		    return;
+		Lf->sz = (SZOFFTYPE)ctob(vm.vm_tsize+vm.vm_dsize+vm.vm_ssize);
+		Lf->sz_def = 1;
+		return;
+	    }
+	}
+}
+# endif	/* defined(HASPROCFS) */
+#endif	/* FREEBSDV>=2000 */
+
+
+#if	defined(HASFDESCFS) && HASFDESCFS==1
+/*
+ * lkup_dev_tty() - look up /dev/tty
+ */
+
+static int
+lkup_dev_tty(dr, ir)
+	dev_t *dr;			/* place to return device number */
+	INODETYPE *ir;			/* place to return inode number */
+{
+	int i;
+
+	readdev(0);
+
+# if	defined(HASDCACHE)
+
+lkup_dev_tty_again:
+
+# endif	/* defined(HASDCACHE) */
+
+	for (i = 0; i < Ndev; i++) {
+	    if (strcmp(Devtp[i].name, "/dev/tty") == 0) {
+
+# if	defined(HASDCACHE)
+		if (DCunsafe && !Devtp[i].v && !vfy_dev(&Devtp[i]))
+		    goto lkup_dev_tty_again;
+# endif	/* defined(HASDCACHE) */
+
+		*dr = Devtp[i].rdev;
+		*ir = Devtp[i].inode;
+		return(1);
+	    }
+	}
+
+# if	defined(HASDCACHE)
+	if (DCunsafe) {
+	    (void) rereaddev();
+	    goto lkup_dev_tty_again;
+	}
+# endif	/* defined(HASDCACHE) */
+
+	return(-1);
+}
+#endif	/* defined(HASFDESCFS) && HASFDESCFS==1 */
+
+
+#if	defined(HASKQUEUE)
+/*
+ * process_kqueue() -- process kqueue file
+ *
+ * Strictly speaking this function should appear in dfile.c, because it is
+ * a file processing function.  However, the Net and Open BSD sources don't
+ * require a dfile.c, so this is the next best location for the function.
+ */
+
+void
+process_kqueue(ka)
+	KA_T ka;			/* kqueue file structure address */
+{
+	struct kqueue kq;		/* kqueue structure */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "KQUEUE");
+	enter_dev_ch(print_kptr(ka, (char *)NULL, 0));
+	if (!ka || kread(ka, (char *)&kq, sizeof(kq)))
+	    return;
+	(void) snpf(Namech, Namechl, "count=%d, state=%#x", kq.kq_count,
+	    kq.kq_state);
+	enter_nm(Namech);
+}
+#endif	/* defined(HASKQUEUE) */
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	dev_t dev, rdev;
+	unsigned char devs;
+	unsigned char rdevs;
+	char dev_ch[32], *ep;
+	struct inode *i;
+	struct nfsnode *n;
+	size_t sz;
+	char *ty;
+	enum vtype type;
+	struct vnode *v, vb;
+	struct l_vfs *vfs;
+
+#if	FREEBSDV>=2000
+	struct inode ib;
+	struct nfsnode nb;
+# if	FREEBSDV>=4000
+#  if	FREEBSDV<5000
+	struct specinfo si;
+#  else	/* FREEBSDV>=5000 */
+#   if	!defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
+	struct cdev si;
+#   endif	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+#  endif	/* FREEBSDV<5000 */
+# endif	/* FREEBSDV>=4000 */
+#endif	/* FREEBSDV>=2000 */
+
+#if	FREEBSDV<5000
+	struct mfsnode *m;
+# if	FREEBSDV>=2000
+	struct mfsnode mb;
+# endif	/* FREEBSDV>=2000 */
+#endif	/* FREEBSDV<5000 */
+
+#if	defined(HAS9660FS)
+	dev_t iso_dev;
+	int iso_dev_def, iso_stat;
+	INODETYPE iso_ino;
+	long iso_links;
+	SZOFFTYPE iso_sz;
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASFDESCFS)
+	struct fdescnode *f;
+
+# if	HASFDESCFS==1
+	static dev_t f_tty_dev;
+	static INODETYPE f_tty_ino;
+	static int f_tty_s = 0;
+# endif	/* HASFDESCFS==1 */
+
+# if	FREEBSDV>=2000
+	struct fdescnode fb;
+# endif	/* FREEBSDV>=2000 */
+
+#endif	/* defined(HASFDESCFS) */
+
+#if	FREEBSDV>=5000
+# if	defined(HAS_UFS1_2)
+	int ufst;
+	struct ufsmount um;
+	struct ufs1_dinode d1;
+	struct ufs2_dinode d2;
+# endif	/* !defined(HAS_UFS1_2) */
+
+# if	!defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
+	struct cdev cd;
+# endif	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+
+	int cds;
+	struct devfs_dirent de;
+	struct devfs_dirent *d;
+	char vtbuf[32];
+	char *vtbp;
+	enum vtagtype { VT_DEVFS, VT_FDESC, VT_ISOFS, VT_PSEUDOFS, VT_NFS,
+			VT_NULL, VT_UFS, VT_ZFS, VT_UNKNOWN
+		      };
+#endif	/* FREEBSDV>=5000 */
+
+#if	defined(HASNULLFS)
+# if	!defined(HASPRINTDEV)
+	char dbuf[32];
+# endif	/* !defined(HASPRINTDEV) */
+	char *dp, *np, tbuf[1024];
+	struct null_node nu;
+	int sc = 0;
+#endif	/* defined(HASNULLFS) */
+
+#if	defined(HASPROCFS)
+	struct pfsnode *p;
+	struct procfsid *pfi;
+	static int pgsz = -1;
+	struct vmspace vm;
+
+# if	FREEBSDV>=2000
+	struct pfsnode pb;
+# endif	/* FREEBSDV>=2000 */
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPSEUDOFS) 
+	struct pfs_node pn;
+	struct pfs_node *pnp;
+#endif	/* defined(HASPSEUDOFS) */
+
+#if	defined(HAS_ZFS)
+	zfs_info_t *z = (zfs_info_t *)NULL;
+	zfs_info_t zi;
+	char *zm = (char *)NULL;
+#else	/* !defined(HAS_ZFS) */
+	static unsigned char zw = 0;
+#endif	/* HAS_VFS */
+
+	enum vtagtype vtag;			/* placed here to use the
+						 * artificial vtagtype
+						 * definition required for
+						 * FREEBSDV>=5000 */
+
+#if	defined(HASNULLFS)
+
+process_overlaid_node:
+
+	if (++sc > 1024) {
+	    (void) snpf(Namech, Namechl, "too many overlaid nodes");
+	    enter_nm(Namech);
+	    return;
+	}
+#endif	/* defined(HASNULLFS) */
+
+/*
+ * Initialize miscellaneous variables.  This is done so that processing an
+ * overlaid node will be a fresh start.
+ */
+	devs = rdevs = 0;
+	i = (struct inode *)NULL;
+	n = (struct nfsnode *)NULL;
+	Namech[0] = '\0';
+
+#if	defined(HAS9660FS)
+	iso_dev_def = iso_stat = 0;
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASFDESCFS)
+	f = (struct fdescnode *)NULL;
+#endif	/* defined(HASFDESCFS) */
+
+#if	FREEBSDV<5000
+	m = (struct mfsnode *)NULL;
+#else	/* FREEBSDV>=5000 */
+	cds = 0;
+	d = (struct devfs_dirent *)NULL;
+# if	defined(HAS_UFS1_2)
+	ufst = 0;
+# endif	/* !defined(HAS_UFS1_2) */
+#endif	/* FREEBSDV<5000 */
+
+#if	defined(HASPROCFS)
+	p = (struct pfsnode *)NULL;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPSEUDOFS) 
+	pnp = (struct pfs_node *)NULL;
+#endif	/* defined(HASPSEUDOFS) */
+
+#if	defined(HAS_ZFS)
+	z = (zfs_info_t *)NULL;
+	zm = (char *)NULL;
+#endif	/* defined(HAS_ZFS) */
+
+/*
+ * Read the vnode.
+ */
+	if ( ! va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	v = &vb;
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASNCACHE)
+	Lf->na = va;
+# if	defined(HASNCVPID)
+	Lf->id = v->v_id;
+# endif	/* defined(HASNCVPID) */
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = va;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Get the vnode type.
+ */
+	if (!v->v_mount)
+	    vfs = (struct l_vfs *)NULL;
+	else {
+	    vfs = readvfs((KA_T)v->v_mount);
+	    if (vfs) {
+
+#if	defined(MOUNT_NONE)
+		switch (vfs->type) {
+		case MOUNT_NFS:
+		    Ntype = N_NFS;
+		    break;
+
+# if	defined(HASPROCFS)
+		case MOUNT_PROCFS:
+		    Ntype = N_PROC;
+		    break;
+# endif	/* defined(HASPROCFS) */
+		}
+#else	/* !defined(MOUNT_NONE) */
+		if (strcasecmp(vfs->typnm, "nfs") == 0)
+		    Ntype = N_NFS;
+
+# if	defined(HASPROCFS)
+		else if (strcasecmp(vfs->typnm, "procfs") == 0)
+		    Ntype = N_PROC;
+# endif	/* defined(HASPROCFS) */
+
+# if	defined(HASPSEUDOFS)
+		else if (strcasecmp(vfs->typnm, "pseudofs") == 0)
+		    Ntype = N_PSEU;
+# endif	/* defined(HASPSEUDOFS) */
+#endif	/* defined(MOUNT_NONE) */
+
+	    }
+	}
+	if (Ntype == N_REGLR) {
+	    switch (v->v_type) {
+	    case VFIFO:
+		Ntype = N_FIFO;
+		break;
+	    default:
+		break;
+	    }
+	}
+
+#if	FREEBSDV>=5000
+/*
+ * For FreeBSD 5 and above VCHR and VBLK vnodes get the v_rdev structure.
+ */
+	if (((v->v_type == VCHR) || (v->v_type == VBLK))
+	&&  v->v_rdev
+
+# if	!defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
+	&&  !kread((KA_T)v->v_rdev, (char *)&cd, sizeof(cd))
+# endif	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+
+	) {
+	    cds = 1;
+	}
+#endif	/* FREEBSDV>=5000 */
+
+/*
+ * Define the specific node pointer.
+ */
+
+#if	FREEBSDV>=5000
+/*
+ * Get the pseudo vnode tag type for FreeBSD >= 5.
+ */
+	vtag = VT_UNKNOWN;
+	if (v->v_tag && !kread((KA_T)v->v_tag, (char *)&vtbuf, sizeof(vtbuf)))
+	{
+	    vtbuf[sizeof(vtbuf) - 1] = '\0';
+	    vtbp = vtbuf;
+	    if (!strcmp(vtbuf, "ufs"))
+		vtag = VT_UFS;
+	    else if (!strcmp(vtbuf, "zfs")) {
+
+#if	!defined(HAS_ZFS)
+		if (!Fwarn && !zw) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: no ZFS support has been defined.\n",
+			Pn);
+		    (void) fprintf(stderr,
+			"      See 00FAQ for more information.\n");
+		    zw = 1;
+		}
+#else	/* defined(HAS_ZFS) */
+		vtag = VT_ZFS;
+#endif	/* !defined(HAS_ZFS) */
+
+	    } else if (!strcmp(vtbuf, "devfs"))
+		vtag = VT_DEVFS;
+	    else if (!strcmp(vtbuf, "nfs"))
+		vtag = VT_NFS;
+	    else if (!strcmp(vtbuf, "isofs"))
+		vtag = VT_ISOFS;
+	    else if (!strcmp(vtbuf, "pseudofs"))
+		vtag = VT_PSEUDOFS;
+	    else if (!strcmp(vtbuf, "null"))
+		vtag = VT_NULL;
+	    else if (!strcmp(vtbuf, "fdesc"))
+		vtag = VT_FDESC;
+	} else
+	    vtbp = "(unknown)";
+#else	/* FREEBSDV<5000 */
+	vtag = v->v_tag;
+#endif	/* FREEBSDV>=5000 */
+
+	switch (vtag) {
+
+#if	FREEBSDV>=5000
+	case VT_DEVFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&de, sizeof(de)))
+	    {
+		(void) snpf(Namech, Namechl, "no devfs node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    d = &de;
+	    if (v->v_type == VDIR) {
+		if (!d->de_dir
+		||  kread((KA_T)d->de_dir, (char *)&de, sizeof(de))) {
+		    (void) snpf(Namech, Namechl, "no devfs dir node: %s",
+			print_kptr((KA_T)d->de_dir, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    }
+	    break;
+#endif	/* FREEBSDV>=5000 */
+
+#if	defined(HASFDESCFS)
+	case VT_FDESC:
+
+# if	FREEBSDV<2000
+	    f = (struct fdescnode *)v->v_data;
+# else	/* FREEBSDV>=2000 */
+	    if (kread((KA_T)v->v_data, (char *)&fb, sizeof(fb)) != 0) {
+		(void) snpf(Namech, Namechl, "can't read fdescnode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    f = &fb;
+	    break;
+# endif	/* FREEBSDV<2000 */
+#endif	/* defined(HASFDESCFS) */
+
+#if	defined(HAS9660FS)
+	case VT_ISOFS:
+	    if (read_iso_node(v, &iso_dev, &iso_dev_def, &iso_ino, &iso_links,
+			      &iso_sz))
+	    {
+		(void) snpf(Namech, Namechl, "no iso node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    iso_stat = 1;
+	    break;
+#endif	/* defined(HAS9660FS) */
+
+#if	FREEBSDV<5000
+	case VT_MFS:
+
+# if	FREEBSDV<2000
+	    m = (struct mfsnode *)v->v_data;
+# else	/* FREEBSDV>=2000 */
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&mb, sizeof(mb))) {
+		(void) snpf(Namech, Namechl, "no mfs node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    m = &mb;
+# endif	/* FREEBSDV<2000 */
+#endif	/* FREEBSDV<5000 */
+
+	    break;
+	case VT_NFS:
+
+#if	FREEBSDV<2000
+	    n = (struct nfsnode *)v->v_data;
+#else	/* FREEBSDV>=2000 */
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&nb, sizeof(nb))) {
+		(void) snpf(Namech, Namechl, "no nfs node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    n = &nb;
+#endif	/* FREEBSDV<2000 */
+
+	    break;
+
+#if	defined(HASNULLFS)
+	case VT_NULL:
+	    if (sc == 1) {
+
+	    /*
+	     * If this is the first null_node, enter a name addition containing
+	     * the mounted-on directory, the file system name, and the device
+	     * number.
+	     */
+		if (vfs && (vfs->dir || vfs->fsname || vfs->fsid.val[0])) {
+		    if (vfs->fsid.val[0]) {
+
+#if	defined(HASPRINTDEV)
+			dp = HASPRINTDEV(Lf, &dev);
+#else	/* !defined(HASPRINTDEV) */
+			(void) snpf(dbuf, sizeof(dbuf) - 1, "%d,%d",
+			    GET_MAJ_DEV(dev), GET_MIN_DEV(dev));
+			dbuf[sizeof(dbuf) - 1] = '\0';
+			dp = dbuf;
+#endif	/* defined(HASPRINTDEV) */
+
+		    } else
+			dp = (char *)NULL;
+		    (void) snpf(tbuf, sizeof(tbuf) - 1,
+			"(nullfs%s%s%s%s%s%s%s)",
+			(vfs && vfs->fsname) ? " " : "",
+			(vfs && vfs->fsname) ? vfs->fsname : "",
+			(vfs && vfs->dir) ? " on " : "",
+			(vfs && vfs->dir) ? vfs->dir : "",
+			(dp && vfs && vfs->dir) ? " (" : "",
+			(dp && vfs && vfs->dir) ? dp : "",
+			(dp && vfs && vfs->dir) ? ")" : "");
+		    tbuf[sizeof(tbuf) - 1] = '\0';
+		    np = tbuf;
+		} else
+		    np = "(nullfs)";
+		(void) add_nma(np, (int)strlen(np));
+	    }
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&nu, sizeof(nu))) {
+		(void) snpf(Namech, Namechl, "can't read null_node at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    if (!nu.null_lowervp) {
+		(void) snpf(Namech, Namechl, "null_node overlays nothing");
+		enter_nm(Namech);
+		return;
+	    }
+	    va = (KA_T)nu.null_lowervp;
+	    goto process_overlaid_node;
+#endif	/* defined(HASNULLFS) */
+
+#if	defined(HASPROCFS)
+	case VT_PROCFS:
+
+# if	FREEBSDV<2000
+	    p = (struct pfsnode *)v->v_data;
+# else	/* FREEBSDV>=2000 */
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&pb, sizeof(pb))) {
+		(void) snpf(Namech, Namechl, "no pfs node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    p = &pb;
+# endif	/* FREEBSDV<2000 */
+
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPSEUDOFS)
+	case VT_PSEUDOFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&pn, sizeof(pn))) {
+		(void) snpf(Namech, Namechl, "no pfs_node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    pnp = &pn;
+	    break;
+#endif	/* defined(HASPSEUDOFS) */
+
+	case VT_UFS:
+
+#if	FREEBSDV<2000
+	    i = (struct inode *)v->v_data;
+#else	/* FREEBSDV>=2000 */
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&ib, sizeof(ib))) {
+		(void) snpf(Namech, Namechl, "no ufs node: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    i = &ib;
+
+# if	defined(HAS_UFS1_2)
+	    if (i->i_ump && !kread((KA_T)i->i_ump, (char *)&um, sizeof(um))) {
+		if (um.um_fstype == UFS1) {
+		    if (i->i_din1
+		    &&  !kread((KA_T)i->i_din1, (char *)&d1, sizeof(d1)))
+			ufst = 1;
+		} else {
+		    if (i->i_din2
+		    &&  !kread((KA_T)i->i_din2, (char *)&d2, sizeof(d2)))
+			ufst = 2;
+		}
+	    }
+# endif	/* defined(HAS_UFS1_2) */
+#endif	/* FREEBSDV<2000 */
+
+#if	defined(HAS_V_LOCKF)
+	    if (v->v_lockf)
+		(void) get_lock_state((KA_T)v->v_lockf);
+#else	/* !defined(HAS_V_LOCKF) */
+	    if (i->i_lockf)
+		(void) get_lock_state((KA_T)i->i_lockf);
+#endif	/* defined(HAS_V_LOCKF) */
+
+	    break;
+
+#if	defined(HAS_ZFS)
+	case VT_ZFS:
+	    if (!v->v_data
+	    ||  (zm = readzfsnode((KA_T)v->v_data, &zi,
+				  ((v->v_vflag & VV_ROOT) ? 1 : 0)))
+	    ) {
+		(void) snpf(Namech, Namechl, "%s: %s", zm,
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    z = &zi;
+
+#if	defined(HAS_V_LOCKF)
+	    if (v->v_lockf)
+		(void) get_lock_state((KA_T)v->v_lockf);
+#else	/* !defined(HAS_V_LOCKF) */
+	    if (z->lockf)
+		(void) get_lock_state((KA_T)z->lockf);
+#endif	/* defined(HAS_V_LOCKF) */
+
+	    break;
+#endif	/* defined(HAS_ZFS) */
+
+	default:
+	    if (v->v_type == VBAD || v->v_type == VNON)
+		break;
+
+#if	FREEBSDV<5000
+	    (void) snpf(Namech,Namechl,"unknown file system type: %d",v->v_tag);
+#else	/* FREEBSDV>=5000 */
+	    (void) snpf(Namech, Namechl, "unknown file system type: %s", vtbp);
+#endif	/* FREEBSDV<5000 */
+
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Get device and type for printing.
+ */
+	type = v->v_type;
+	if (n) {
+	    dev = n->n_vattr.va_fsid;
+	    devs = 1;
+	    if ((type == VCHR) || (type == VBLK)) {
+		rdev = n->n_vattr.va_rdev;
+		rdevs = 1;
+	    }
+	} else if (i) {
+
+#if	FREEBSDV>=4000
+	    if (i->i_dev
+
+# if	!defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
+	    &&  !kread((KA_T)i->i_dev, (char *)&si, sizeof(si))
+# endif	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+
+	    ) {
+
+# if	defined(HAS_NO_SI_UDEV)
+#  if	defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
+		dev = Dev2Udev((KA_T)i->i_dev);
+#  else	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+		dev = Dev2Udev(&si);
+#  endif	/* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
+# else	/* !defined(HAS_NO_SI_UDEV) */
+		dev = si.si_udev;
+# endif	/* defined(HAS_NO_SI_UDEV) */
+
+		devs = 1;
+	    }
+#else	/* FREEBSDV<4000 */
+	    dev = i->i_dev;
+	    devs = 1;
+#endif	/* FREEBSDV>=4000 */
+
+	    if ((type == VCHR) || (type == VBLK)) {
+
+#if	FREEBSDV>=5000
+# if	defined(HAS_UFS1_2)
+		if (ufst == 1) {
+		    rdev = d1.di_rdev;
+		    rdevs = 1;
+		} else if (ufst == 2) {
+		    rdev = d2.di_rdev;
+		    rdevs = 1;
+		} else
+# endif	/* defined(HAS_UFS1_2) */
+
+		if (cds) {
+
+# if	defined(HAS_NO_SI_UDEV)
+#  if	defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
+		    rdev = Dev2Udev((KA_T)v->v_rdev);
+#  else	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+		    rdev = Dev2Udev(&cd);
+#  endif	/* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
+# else	/* !defined(HAS_NO_SI_UDEV) */
+		    rdev = cd.si_udev;
+# endif	/* defined(HAS_NO_SI_UDEV) */
+
+		    rdevs = 1;
+		}
+#else	/* FREEBSDV<5000 */
+		rdev = i->i_rdev;
+		rdevs = 1;
+#endif	/* FREEBSDV>=5000 */
+
+	    }
+	}
+
+#if	defined(HAS_ZFS)
+	else if (z) {
+
+	/*
+	 * Record information returned by readzfsnode().
+	 */
+	    if (vfs) {
+		dev = vfs->fsid.val[0];
+		devs = 1;
+	    }
+	    if ((type == VCHR) || (type == VBLK)) {
+		if (z->rdev_def) {
+		    rdev = z->rdev;
+		    rdevs = 1;
+		}
+	    }
+	}
+#endif	/* defined(HAS_ZFS) */
+
+#if	defined(HASFDESCFS) && (defined(HASFDLINK) || HASFDESCFS==1)
+	else if (f) {
+
+# if	defined(HASFDLINK)
+	    if (f->fd_link
+	    &&  kread((KA_T)f->fd_link, Namech, Namechl - 1) == 0)
+		Namech[Namechl - 1] = '\0';
+
+#  if	HASFDESCFS==1
+	    else
+#  endif	/* HASFDESFS==1 */
+# endif	/* defined(HASFDLINK) */
+
+# if	HASFDESCFS==1
+		if (f->fd_type == Fctty) {
+		    if (f_tty_s == 0)
+			f_tty_s = lkup_dev_tty(&f_tty_dev, &f_tty_ino);
+		    if (f_tty_s == 1) {
+			dev = f_tty_dev;
+			Lf->inode = f_tty_ino;
+			devs = Lf->inp_ty = 1;
+		    }
+		}
+# endif	/* HASFDESFS==1 */
+
+	}
+#endif	/* defined(HASFDESCFS) && (defined(HASFDLINK) || HASFDESCFS==1) */
+
+#if	defined(HAS9660FS)
+	else if (iso_stat && iso_dev_def) {
+	    dev = iso_dev;
+	    devs = Lf->inp_ty = 1;
+	}
+#endif	/* defined(HAS9660FS) */
+
+#if	FREEBSDV>=5000
+	else if (d) {
+	    if (vfs) {
+		dev = vfs->fsid.val[0];
+		devs = 1;
+	    } else {
+		dev = DevDev;
+		devs = 1;
+	    }
+	    if ((type == VCHR)) {
+
+# if	defined(HAS_UFS1_2)
+		if (ufst == 1) {
+		    rdev = d1.di_rdev;
+		    rdevs = 1;
+		} else if (ufst == 2) {
+		    rdev = d2.di_rdev;
+		    rdevs = 1;
+		} else
+# endif	/* defined(HAS_UFS1_2) */
+
+		if (cds) {
+
+# if	defined(HAS_NO_SI_UDEV)
+#  if	defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
+		    rdev = Dev2Udev((KA_T)v->v_rdev);
+#  else	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+		    rdev = Dev2Udev(&cd);
+#  endif	/* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
+# else	/* !defined(HAS_NO_SI_UDEV) */
+		    rdev = cd.si_udev;
+# endif	/* defined(HAS_NO_SI_UDEV) */
+
+		    rdevs = 1;
+		}
+	    }
+	}
+#endif	/* FREEBSDV>=5000 */
+
+#if	defined(HASPSEUDOFS)
+	else if (pnp) {
+	    if (vfs) {
+		dev = vfs->fsid.val[0];
+		devs = 1;
+	    }
+	}
+#endif	/* defined(HASPSEUDOFS) */
+
+/*
+ * Obtain the inode number.
+ */
+	if (i) {
+	    Lf->inode = (INODETYPE)i->i_number;
+	    Lf->inp_ty = 1;
+	}
+
+#if	defined(HAS_ZFS)
+	else if (z) {
+	    if (z->ino_def) {
+		Lf->inode = z->ino;
+		Lf->inp_ty = 1;
+	    }
+	}
+#endif	/* defined(HAS_ZFS) */
+
+	else if (n) {
+	    Lf->inode = (INODETYPE)n->n_vattr.va_fileid;
+	    Lf->inp_ty = 1;
+	}
+
+#if	defined(HAS9660FS)
+	else if (iso_stat) {
+	    Lf->inode = iso_ino;
+	    Lf->inp_ty = 1;
+	}
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASPROCFS)
+# if	FREEBSDV>=2000
+	else if (p) {
+	    Lf->inode = (INODETYPE)p->pfs_fileno;
+	    Lf->inp_ty = 1;
+	}
+# endif	/* FREEBSDV>=2000 */
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPSEUDOFS)
+	else if (pnp) {
+	    Lf->inode = (INODETYPE)pnp->pn_fileno;
+	    Lf->inp_ty = 1;
+	}
+#endif	/* defined(HASPSEUDOFS) */
+
+#if	FREEBSDV>=5000
+	else if (d) {
+	    Lf->inode = (INODETYPE)d->de_inode;
+	    Lf->inp_ty = 1;
+	}
+#endif	/* FREEBSDV>=5000 */
+
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+	    case N_FIFO:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_NFS:
+		if (n) {
+		    Lf->sz = (SZOFFTYPE)n->n_vattr.va_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+
+#if	defined(HASPROCFS)
+	    case N_PROC:
+
+# if	FREEBSDV<2000
+		if (type == VDIR || !p || !p->pfs_vs
+		||  kread((KA_T)p->pfs_vs, (char *)&vm, sizeof(vm)))
+		    break;
+		if (pgsz < 0)
+		    pgsz = getpagesize();
+		Lf->sz = (SZOFFTYPE)((pgsz * vm.vm_tsize)
+		       +         (pgsz * vm.vm_dsize)
+		       +         (pgsz * vm.vm_ssize));
+		Lf->sz_def = 1;
+		break;
+# else	/* FREEBSDV>=2000 */
+		if (p) {
+		    switch(p->pfs_type) {
+		    case Proot:
+		    case Pproc:
+			Lf->sz = (SZOFFTYPE)DEV_BSIZE;
+			Lf->sz_def = 1;
+			break;
+		    case Pmem:
+			(void) getmemsz(p->pfs_pid);
+			break;
+		    case Pregs:
+			Lf->sz = (SZOFFTYPE)sizeof(struct reg);
+			Lf->sz_def = 1;
+			break;
+		    case Pfpregs:
+			Lf->sz = (SZOFFTYPE)sizeof(struct fpreg);
+			Lf->sz_def = 1;
+			break;
+		    }
+		}
+# endif	/* FREEBSDV<2000 */
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPSEUDOFS)
+	    case N_PSEU:
+		Lf->sz = 0;
+		Lf->sz_def = 1;
+		break;
+#endif	/* defined(PSEUDOFS) */
+
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    if (i) {
+
+#if	defined(HAS_UFS1_2)
+			if (ufst == 1)
+			    Lf->sz = (SZOFFTYPE)d1.di_size;
+			else if (ufst == 2)
+			    Lf->sz = (SZOFFTYPE)d2.di_size;
+			else
+#endif	/* defined(HAS_UFS1_2) */
+
+			Lf->sz = (SZOFFTYPE)i->i_size;
+			Lf->sz_def = 1;
+		    }
+
+
+#if     defined(HAS_ZFS)
+		    else if (z) {
+			if (z->sz_def) {
+			    Lf->sz = z->sz;
+			    Lf->sz_def = 1;
+			}
+		    }
+#endif  /* defined(HAS_ZFS) */
+
+#if	FREEBSDV<5000
+		    else if (m) {
+			Lf->sz = (SZOFFTYPE)m->mfs_size;
+			Lf->sz_def = 1;
+		    }
+#endif	/* FREEBSDV<5000 */
+
+#if	defined(HAS9660FS)
+		    else if (iso_stat) {
+			Lf->sz = (SZOFFTYPE)iso_sz;
+			Lf->sz_def = 1;
+		    }
+#endif	/* defined(HAS9660FS) */
+
+		}
+		else if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		    break;
+	    }
+	}
+/*
+ * Record the link count.
+ */
+	if (Fnlink) {
+	    switch(Ntype) {
+	    case N_NFS:
+		if (n) {
+		    Lf->nlink = (long)n->n_vattr.va_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+	    case N_REGLR:
+		if (i) {
+
+#if	defined(HASEFFNLINK)
+		    Lf->nlink = (long)i->HASEFFNLINK;
+#else	/* !defined(HASEFFNLINK) */
+		    Lf->nlink = (long)i->i_nlink;
+#endif	/* defined(HASEFFNLINK) */
+
+		    Lf->nlink_def = 1;
+		}
+
+#if	defined(HAS_ZFS)
+		else if (z) {
+		    if (z->nl_def) {
+			Lf->nlink = z->nl;
+			Lf->nlink_def = 1;
+		    }
+		}
+#endif	/* defined(HAS_ZFS) */
+
+#if	defined(HAS9660FS)
+		else if (iso_stat) {
+		    Lf->nlink = iso_links;
+		    Lf->nlink_def = 1;
+		}
+#endif	/* defined(HAS9660FS) */
+
+#if	FREEBSDV>=5000
+		else if (d) {
+		    Lf->nlink = d->de_links;
+		    Lf->nlink_def = 1;
+		}
+#endif	/* FREEBSDV>=5000 */
+
+		break;
+
+#if	defined(HASPSEUODOFS)
+	    case N_PSEU:
+		if (pnp) {
+		    Lf->nlink = 1L;
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* defined(HASPSEUODOFS) */
+
+	    }
+	    if (Lf->nlink_def && Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    Lf->fsdir = vfs->dir;
+	    Lf->fsdev = vfs->fsname;
+	}
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	Lf->dev = dev;
+	Lf->dev_def = devs;
+	Lf->rdev = rdev;
+	Lf->rdev_def = rdevs;
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	case VDIR:
+	    ty = (type == VREG) ? "VREG" : "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif	/* defined(VSOCK) */
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    ty = "FIFO";
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+/*
+ * Handle some special cases:
+ *
+ * 	ioctl(fd, TIOCNOTTY) files;
+ *	memory node files;
+ *	/proc files.
+ */
+
+	if (type == VBAD)
+	    (void) snpf(Namech, Namechl, "(revoked)");
+
+#if	FREEBSDV<5000
+	else if (m) {
+	    Lf->dev_def = Lf->rdev_def = 0;
+	    (void) snpf(Namech, Namechl, "%#x", m->mfs_baseoff);
+	    (void) snpf(dev_ch, sizeof(dev_ch), "    memory");
+	    enter_dev_ch(dev_ch);
+	}
+#endif	/* FREEBSDV<5000 */
+
+
+#if	defined(HASPROCFS)
+	else if (p) {
+	    Lf->dev_def = Lf->rdev_def = 0;
+
+# if	FREEBSDV<2000
+	    if (type == VDIR)
+		(void) snpf(Namech, Namechl, "/%s", HASPROCFS);
+	    else
+		(void) snpf(Namech, Namechl, "/%s/%0*d", HASPROCFS, PNSIZ,
+		    p->pfs_pid);
+	    enter_nm(Namech);
+# else	/* FREEBSDV>=2000 */
+	    ty = (char *)NULL;
+	    (void) snpf(Namech, Namechl, "/%s", HASPROCFS);
+	    switch (p->pfs_type) {
+	    case Proot:
+		ty = "PDIR";
+		break;
+	    case Pproc:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d", p->pfs_pid);
+		ty = "PDIR";
+		break;
+	    case Pfile:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/file", p->pfs_pid);
+		ty = "PFIL";
+		break;
+	    case Pmem:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/mem", p->pfs_pid);
+		ty = "PMEM";
+		break;
+	    case Pregs:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/regs", p->pfs_pid);
+		ty = "PREG";
+		break;
+	    case Pfpregs:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/fpregs", p->pfs_pid);
+		ty = "PFPR";
+		break;
+	    case Pctl:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/ctl", p->pfs_pid);
+		ty = "PCTL";
+		break;
+	    case Pstatus:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/status", p->pfs_pid);
+		ty = "PSTA";
+		break;
+	    case Pnote:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/note", p->pfs_pid);
+		ty = "PNTF";
+		break;
+	    case Pnotepg:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/notepg", p->pfs_pid);
+		ty = "PGID";
+		break;
+
+#  if	FREEBSDV>=3000
+	    case Pmap:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/map", p->pfs_pid);
+		ty = "PMAP";
+		break;
+	    case Ptype:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/etype", p->pfs_pid);
+		ty = "PETY";
+		break;
+#  endif	/* FREEBSDV>=3000 */
+
+	    }
+	    if (ty)
+		(void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	    enter_nm(Namech);
+
+# endif	/* FREEBSDV<2000 */
+	}
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+
+#if	defined(HASPROCFS)
+	if (Ntype == N_PROC) {
+	    if (Procsrch) {
+		Procfind = 1;
+		Lf->sf |= SELNM;
+	    } else {
+		for (pfi = Procfsid; pfi; pfi = pfi->next) {
+		    if ((pfi->pid && pfi->pid == p->pfs_pid)
+
+# if	defined(HASPINODEN)
+		    ||  (Lf->inp_ty == 1 && Lf->inode == pfi->inode)
+# else	/* !defined(HASPINODEN) */
+				if (pfi->pid == p->pfs_pid)
+# endif	/* defined(HASPINODEN) */
+
+		    ) {
+			pfi->f = 1;
+			if (!Namech[0])
+			    (void) snpf(Namech, Namechl, "%s", pfi->nm);
+			Lf->sf |= SELNM;
+			break;
+		    }
+		}
+	    }
+	} else
+#endif	/* defined(HASPROCFS) */
+
+	{
+	    if (Sfile && is_file_named((char *)NULL,
+				       ((type == VCHR) || (type == VBLK)) ? 1
+									  : 0))
+		Lf->sf |= SELNM;
+	}
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+#if	FREEBSDV>=2020
+/*
+ * process_pipe() - process a file structure whose type is DTYPE_PIPE
+ */
+
+void
+process_pipe(pa)
+	KA_T pa;			/* pipe structure address */
+{
+	char dev_ch[32], *ep;
+	struct pipe p;
+	size_t sz;
+
+	if (!pa || kread(pa, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl,
+		"can't read DTYPE_PIPE pipe struct: %s",
+		print_kptr((KA_T)pa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	(void) snpf(Lf->type, sizeof(Lf->type), "PIPE");
+	(void) snpf(dev_ch, sizeof(dev_ch), "%s",
+	    print_kptr(pa, (char *)NULL, 0));
+	enter_dev_ch(dev_ch);
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    Lf->sz = (SZOFFTYPE)p.pipe_buffer.size;
+	    Lf->sz_def = 1;
+	}
+	if (p.pipe_peer)
+	    (void) snpf(Namech, Namechl, "->%s",
+		print_kptr((KA_T)p.pipe_peer, (char *)NULL, 0));
+	else
+	    Namech[0] = '\0';
+	if (p.pipe_buffer.cnt) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", cnt=%d", p.pipe_buffer.cnt);
+	}
+	if (p.pipe_buffer.in) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", in=%d", p.pipe_buffer.in);
+	}
+	if (p.pipe_buffer.out) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", out=%d", p.pipe_buffer.out);
+	}
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+#endif	/* FREEBSDV>=2020 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode1.c
new file mode 100644
index 0000000..a5fa225
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode1.c
@@ -0,0 +1,144 @@
+/*
+ * dnode1.c - FreeBSD node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.10 2008/10/21 16:16:06 abe Exp abe $";
+#endif
+
+
+#include "lsof.h"
+
+#if	defined(HAS9660FS)
+
+/*
+ * Do a little preparation for #include'ing cd9660_node.h, then #include it.
+ */
+
+#undef	i_size
+#undef	doff_t
+#undef	IN_ACCESS
+
+#  if	FREEBSDV>=4000 && defined(__alpha__)
+#define	dev_t	void *
+#  endif	/* FREEBSDV>=4000 && defined(__alpha__) */
+
+#include "cd9660_node.h"
+
+# if	defined(HAS_NO_ISO_DEV)
+#define	_KERNEL
+#include <isofs/cd9660/iso.h>
+#undef	_KERNEL
+# endif	/* defined(HAS_NO_ISO_DEV) */
+
+#  if	FREEBSDV>=4000 && defined(__alpha__)
+#undef	dev_t
+#  endif	/* FREEBSDV>=4000 && defined(__alpha__) */
+
+
+/*
+ * read_iso_node() -- read CD 9660 iso_node
+ */
+
+int
+read_iso_node(v, d, dd, ino, nl, sz)
+	struct vnode *v;		/* containing vnode */
+	dev_t *d;			/* returned device number */
+	int *dd;			/* returned device-defined flag */
+	INODETYPE *ino;			/* returned inode number */
+	long *nl;			/* returned number of links */
+	SZOFFTYPE *sz;			/* returned size */
+{
+
+# if	FREEBSDV<2000
+	struct iso_node *ip;
+# else	/* FREEBSDV>=2000 */
+	struct iso_node i;
+# endif	/* FREEBSDV<2000 */
+
+# if	FREEBSDV>=4000
+#  if	FREEBSDV<5000
+	struct specinfo udev;
+#  else	/* FREEBSDV>=5000 */
+	struct cdev udev;
+#   if	defined(HAS_NO_ISO_DEV)
+	struct iso_mnt im;
+#   endif	/* defined(HAS_NO_ISO_DEV) */
+#  endif	/* FREEBSDV<5000 */
+# endif	/* FREEBSDV>=4000 */
+
+# if	FREEBSDV<2000
+	ip = (struct iso_node *)v->v_data;
+	*d = ip->i_dev;
+	*dd = 1;
+	*ino = (INODETYPE)ip->i_number;
+	*nl = (long)ip->inode.iso_links;
+	*sz = (SZOFFTYPE)ip->i_size;
+# else	/* FREEBSDV>=2000 */
+	if (!v->v_data
+	||  kread((KA_T)v->v_data, (char *)&i, sizeof(i)))
+	    return(1);
+
+# if	FREEBSDV>=4000
+#  if	defined(HAS_NO_ISO_DEV)
+	if (i.i_mnt && !kread((KA_T)i.i_mnt, (char *)&im, sizeof(im))
+	&&  im.im_dev && !kread((KA_T)im.im_dev, (char *)&udev, sizeof(udev)))
+#  else	/* !defined(HAS_NO_ISO_DEV) */
+	if (i.i_dev && !kread((KA_T)i.i_dev, (char *)&udev, sizeof(udev)))
+#  endif	/* defined(HAS_NO_ISO_DEV) */
+
+	{
+
+# if	defined(HAS_NO_SI_UDEV)
+	    *d = Dev2Udev(&udev);
+# else	/* !defined(HAS_NO_SI_UDEV) */
+	    *d = udev.si_udev;
+# endif	/* defined(HAS_NO_SI_UDEV) */
+
+	    *dd = 1;
+	}
+# else	/* FREEBSDV<4000 */
+	*d = i.i_dev;
+	*dd = 1;
+# endif	/* FREEBSDV>=4000 */
+
+	*ino = (INODETYPE)i.i_number;
+	*nl = (long)i.inode.iso_links;
+	*sz = (SZOFFTYPE)i.i_size;
+# endif	/* FREEBSDV<2000 */
+
+	return(0);
+}
+#endif	/* defined(HAS9660FS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode2.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode2.c
new file mode 100644
index 0000000..55c3918
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dnode2.c
@@ -0,0 +1,128 @@
+/*
+ * dnode2.c - FreeBSD ZFS node functions for lsof
+ *
+ * This module must be separate to permit use of the OpenSolaris ZFS header
+ * files.
+ */
+
+
+/*
+ * Copyright 2008 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2008 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode2.c,v 1.3 2011/08/07 22:51:28 abe Exp $";
+#endif
+
+
+#if	defined(HAS_ZFS)
+
+#define _KERNEL
+#include <sys/zfs_znode.h>
+#undef	_KERNEL
+
+#include "dzfs.h"
+
+
+/*
+ * readzfsnode() -- read the ZFS node
+ */
+
+char *
+readzfsnode(za, zi, vr)
+	KA_T za;			/* ZFS node address */
+	zfs_info_t *zi;			/* return ZFS info structure pointer */
+	int vr;				/* vnode's (v_flag & VROOT) */
+{
+	struct znode zn;		/* ZFS node */
+
+# if	defined(HAS_Z_PHYS)
+	znode_phys_t zp;		/* ZFS physical node */
+# else	/* !defined(HAS_Z_PHYS) */
+	KA_T ka;			/* temporary kernel address */
+	zfsvfs_t zv;			/* znode's zfsvfs structure */
+# endif	/* defined(HAS_Z_PHYS) */
+
+	memset((void *)zi, 0, sizeof(zfs_info_t));
+	if (!za
+	||  kread(za, (char *)&zn, sizeof(zn))
+	) {
+	    if (!za)
+		return("No ZFS node address");
+	    return("Can't read znode");
+	}
+/*
+ * Return items contained in the znode.
+ */
+	zi->ino = (INODETYPE)zn.z_id;
+	zi->ino_def = 1;
+
+# if	!defined(HAS_V_LOCKF)
+	zi->lockf = (KA_T)zn.z_lockf;
+# endif	/* !defined(HAS_V_LOCKF) */
+
+# if	defined(HAS_Z_PHYS)
+/*
+ * If the physical znode exists in this ZFS implementation, read it.
+ */
+	if (!zn.z_phys
+	||  kread((KA_T)zn.z_phys, (char *)&zp, sizeof(zp))
+	) {
+	    if (!zn.z_phys)
+		return("No physical znode address");
+	    return("Can't read physical znode");
+	}
+/*
+ * Return items contained in the physical znode.
+ */
+	zi->nl = (long)zp.zp_links;
+	zi->rdev = zp.zp_rdev;
+	zi->sz = (SZOFFTYPE)zp.zp_size;
+	zi->nl_def = zi->rdev_def = zi->sz_def = 1;
+# else	/* !defined(HAS_Z_PHYS) */
+/*
+ * If this implementation has no physical znode, return items now contained
+ * in the znode.
+ */
+	zi->nl = (long)zn.z_links;
+	if (vr && (ka = (KA_T)zn.z_zfsvfs)) {
+	    if (!kread(ka, (char *)&zv, sizeof(zv))) {
+		if ((zn.z_id == zv.z_root)
+		&&  (zv.z_ctldir != NULL)
+		&&  (zv.z_show_ctldir)
+		) {
+		    zi->nl++;
+		}
+	    }
+	}
+	zi->sz = (SZOFFTYPE)zn.z_size;
+	zi->nl_def = zi->sz_def = 1;
+# endif	/* defined(HAS_Z_PHYS) */
+
+	return((char *)NULL);
+}
+#endif	/* defined(HAS_ZFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dproc.c
new file mode 100644
index 0000000..eb32fb9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dproc.c
@@ -0,0 +1,654 @@
+/*
+ * dproc.c - FreeBSD process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.16 2008/10/21 16:16:06 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+_PROTOTYPE(static void enter_vn_text,(KA_T va, int *n));
+_PROTOTYPE(static void get_kernel_access,(void));
+_PROTOTYPE(static void process_text,(KA_T vm));
+
+
+/*
+ * Local static values
+ */
+
+static MALLOC_S Nv = 0;			/* allocated Vp[] entries */
+static KA_T *Vp = NULL;			/* vnode address cache */
+
+
+/*
+ * enter_vn_text() - enter a vnode text reference
+ */
+
+static void
+enter_vn_text(va, n)
+	KA_T va;			/* vnode address */
+	int *n;				/* Vp[] entries in use */
+{
+	int i;
+/*
+ * Ignore the request if the vnode has already been entered.
+ */
+	for (i = 0; i < *n; i++) {
+	    if (va == Vp[i])
+		return;
+	}
+/*
+ * Save the text file information.
+ */
+	alloc_lfile(" txt", -1);
+	Cfp = (struct file *)NULL;
+	process_node(va);
+	if (Lf->sf)
+	    link_lfile();
+	if (i >= Nv) {
+
+	/*
+	 * Allocate space for remembering the vnode.
+	 */
+	    Nv += 10;
+	    if (!Vp)
+		Vp=(KA_T *)malloc((MALLOC_S)(sizeof(struct vnode *)*10));
+	    else
+		Vp=(KA_T *)realloc((MALLOC_P *)Vp,(MALLOC_S)(Nv*sizeof(KA_T)));
+	    if (!Vp) {
+		(void) fprintf(stderr, "%s: no txt ptr space, PID %d\n",
+		    Pn, Lp->pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Remember the vnode.
+ */
+	Vp[*n] = va;
+	(*n)++;
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	short cckreg;			/* conditional status of regular file
+					 * checking:
+					 *     0 = unconditionally check
+					 *     1 = conditionally check */
+	short ckscko;			/* socket file only checking status:
+					 *     0 = none
+					 *     1 = check only socket files,
+					 *	   including TCP and UDP
+					 *	   streams with eXPORT data,
+					 *	   where supported */
+	struct filedesc fd;
+	int i, nf;
+	MALLOC_S nb;
+	static struct file **ofb = NULL;
+	static int ofbb = 0;
+	int pgid, pid;
+	int ppid = 0;
+	short pss, sf;
+	int px;
+	uid_t uid;
+
+#if	FREEBSDV<2000
+	struct proc *p;
+	struct pcred pc;
+	struct pgrp pg;
+#else	/* FREEBSDV>=2000 */
+	struct kinfo_proc *p;
+#endif	/* FREEBSDV<2000 */
+
+#if	defined(HASFSTRUCT)
+	static char *pof = (char *)NULL;
+	static int pofb = 0;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Define socket and regular file conditional processing flags.
+ *
+ * If only socket files have been selected, or socket files have been
+ * selected, ANDed with other selection options, enable the skipping of
+ * regular files.
+ *
+ * If socket files and some process options have been selected, enable
+ * conditional skipping of regular file; i.e., regular files will be skipped
+ * unless they belong to a process selected by one of the specified options.
+ */
+	if (Selflags & SELNW) {
+
+	/*
+	 * Some network files selection options have been specified.
+	 */
+	    if (Fand || !(Selflags & ~SELNW)) {
+
+	    /*
+	     * Selection ANDing or only network file options have been
+	     * specified, so set unconditional skipping of regular files
+	     * and socket file only checking.
+	     */
+		cckreg = 0;
+		ckscko = 1;
+	    } else {
+
+	    /*
+	     * If ORed file selection options have been specified, or no
+	     * ORed process selection options have been specified, enable
+	     * unconditional file checking and clear socket file only
+	     * checking.
+	     *
+	     * If only ORed process selection options have been specified,
+	     * enable conditional file skipping and socket file only checking.
+	     */
+		if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+		    cckreg = ckscko = 0;
+		else
+		    cckreg = ckscko = 1;
+	    }
+	} else {
+
+	/*
+	 * No network file selection options were specified.  Enable
+	 * unconditional file checking and clear socket file only checking.
+	 */
+	    cckreg = ckscko = 0;
+	}
+/*
+ * Read the process table.
+ */
+
+#if	FREEBSDV<2000
+	if ((Np = kvm_getprocs(KINFO_PROC_ALL, 0)) < 0)
+#else	/* FREEBSDV>=2000 */
+	if ((P = kvm_getprocs(Kd, KERN_PROC_ALL, 0, &Np)) == NULL)
+#endif	/* FREEBSDV<2000 */
+
+	{
+	    (void) fprintf(stderr, "%s: can't read process table: %s\n",
+		Pn,
+
+#if	FREEBSDV<2000
+		kvm_geterr()
+#else	/* FREEBSDV>=2000 */
+		kvm_geterr(Kd)
+#endif	/* FREEBSDV<2000 */
+
+	    );
+	    Exit(1);
+	}
+/*
+ * Examine proc structures and their associated information.
+ */
+
+#if	FREEBSDV<2000
+	for (px = 0; px < Np; px++)
+#else	/* FREEBSDV>=2000 */
+	for (p = P, px = 0; px < Np; p++, px++)
+#endif	/* FREEBSDV<2000 */
+
+	{
+
+#if	FREEBSDV<2000
+	/*
+	 * Read process information, process group structure (if
+	 * necessary), and User ID (if necessary).
+	 */
+	    if (!(p = kvm_nextproc()))
+		continue;
+	    if (p->P_STAT == 0 || p->P_STAT == SZOMB)
+		continue;
+	    pg.pg_id = 0;
+	    if (Fpgid && p->P_PGID) {
+		if (kread((KA_T)p->P_PGID, (char *)&pg, sizeof(pg)))
+		    continue;
+	    }
+	    pgid = pg.pg_id;
+	    if (!p->p_cred
+	    ||  kread((KA_T)p->p_cred, (char *)&pc, sizeof(pc)))
+		continue;
+	    uid = pc.p_ruid;
+#else	/* FREEBSDV>=2000 */
+	    if (p->P_STAT == 0 || p->P_STAT == SZOMB)
+		continue;
+	    pgid = p->P_PGID;
+# if	FREEBSDV<5000
+	    uid = p->kp_eproc.e_ucred.cr_uid;
+# else	/* FREEBSDV>=5000 */
+	    uid = p->ki_uid;
+# endif	/* FREEBSDV<5000 */
+#endif	/* FREEBSDV<2000 */
+
+#if	defined(HASPPID)
+	    ppid = p->P_PPID;
+#endif	/* defined(HASPPID) */
+
+	/*
+	 * See if process is excluded.
+	 *
+	 * Read file structure pointers.
+	 */
+	    if (is_proc_excl(p->P_PID, pgid, (UID_ARG)uid, &pss, &sf))
+		continue;
+	    if (!p->P_FD
+	    ||  kread((KA_T)p->P_FD, (char *)&fd, sizeof(fd)))
+		continue;
+	    if (!fd.fd_refcnt || fd.fd_lastfile > fd.fd_nfiles)
+		continue;
+	/*
+	 * Allocate a local process structure.
+	 */
+	    if (is_cmd_excl(p->P_COMM, &pss, &sf))
+		continue;
+	    if (cckreg) {
+
+	    /*
+	     * If conditional checking of regular files is enabled, enable
+	     * socket file only checking, based on the process' selection
+	     * status.
+	     */
+		ckscko = (sf & SELPROC) ? 0 : 1;
+	    }
+	    alloc_lproc(p->P_PID, pgid, ppid, (UID_ARG)uid, p->P_COMM,
+		(int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+
+#if	defined(P_ADDR)
+	/*
+	 * Save the kernel proc struct address, if P_ADDR is defined.
+	 */
+	    Kpa = (KA_T)p->P_ADDR;
+#endif	/* defined(P_ADDR) */
+
+	/*
+	 * Save current working directory information.
+	 */
+	    if (!ckscko && fd.fd_cdir) {
+		alloc_lfile(CWD, -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)fd.fd_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (!ckscko && fd.fd_rdir) {
+		alloc_lfile(RTD, -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)fd.fd_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+
+#if	FREEBSDV>=5000
+	/*
+	 * Save jail directory information.
+	 */
+	    if (!ckscko && fd.fd_jdir) {
+		alloc_lfile("jld", -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)fd.fd_jdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+#endif	/* FREEBSDV>=5000 */
+
+	/*
+	 * Save information on the text file.
+	 */
+	    if (!ckscko && p->P_VMSPACE)
+		process_text((KA_T)p->P_VMSPACE);
+	/*
+	 * Read open file structure pointers.
+	 */
+	    if (!fd.fd_ofiles || (nf = fd.fd_nfiles) <= 0)
+		continue;
+	    nb = (MALLOC_S)(sizeof(struct file *) * nf);
+	    if (nb > ofbb) {
+		if (!ofb)
+		    ofb = (struct file **)malloc(nb);
+		else
+		    ofb = (struct file **)realloc((MALLOC_P *)ofb, nb);
+		if (!ofb) {
+		    (void) fprintf(stderr, "%s: PID %d, no file * space\n",
+			Pn, p->P_PID);
+		    Exit(1);
+		}
+		ofbb = nb;
+	    }
+	    if (kread((KA_T)fd.fd_ofiles, (char *)ofb, nb))
+		continue;
+
+#if	defined(HASFSTRUCT)
+	    if (Fsv & FSV_FG) {
+		nb = (MALLOC_S)(sizeof(char) * nf);
+		if (nb > pofb) {
+		    if (!pof)
+			pof = (char *)malloc(nb);
+		    else
+			pof = (char *)realloc((MALLOC_P *)pof, nb);
+		    if (!pof) {
+			(void) fprintf(stderr,
+			    "%s: PID %d, no file flag space\n", Pn, p->P_PID);
+			Exit(1);
+		    }
+		    pofb = nb;
+		}
+		if (!fd.fd_ofileflags || kread((KA_T)fd.fd_ofileflags, pof, nb))
+		    zeromem(pof, nb);
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Save information on file descriptors.
+	 */
+	    for (i = 0; i < nf; i++) {
+		if (ofb[i]) {
+		    alloc_lfile(NULL, i);
+		    process_file((KA_T)(Cfp = ofb[i]));
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG)
+			    Lf->pof = (long)pof[i];
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+
+/*
+ * Check kernel version.
+ */
+	(void) ckkv("FreeBSD", LSOF_VSTR, (char *)NULL, (char *)NULL);
+/*
+ * Set name list file path.
+ */
+	if (!Nmlst)
+
+#if	defined(N_UNIX)
+	    Nmlst = N_UNIX;
+#else	/* !defined(N_UNIX) */
+	{
+	    if (!(Nmlst = get_nlist_path(1))) {
+		(void) fprintf(stderr,
+		    "%s: can't get kernel name list path\n", Pn);
+		Exit(1);
+	    }
+	}
+#endif	/* defined(N_UNIX) */
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory and the name list files are readable.
+ */
+	if ((Memory && !is_readable(Memory, 1))
+	||  (Nmlst && !is_readable(Nmlst, 1)))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open kernel memory access.
+ */
+
+#if	FREEBSDV<2000
+	if (kvm_openfiles(Nmlst, Memory, NULL) == -1)
+#else	/* FREEBSDV>=2000 */
+	if ((Kd = kvm_open(Nmlst, Memory, NULL, O_RDONLY, NULL)) == NULL)
+#endif	/* FREEBSDV<2000 */
+
+	{
+	    (void) fprintf(stderr,
+		"%s: kvm_open%s(execfile=%s, corefile=%s): %s\n",
+		Pn,
+
+#if	FREEBSDV<2000
+		"files",
+#else	/* FREEBSDV>=2000 */
+		"",
+#endif	/* FREEBSDV<2000 */
+
+		Nmlst ? Nmlst : "default",
+		Memory ? Memory :
+
+#if	defined(_PATH_MEM)
+				  _PATH_MEM,
+#else	/* !defined(_PATH_MEM) */
+				  "default",
+#endif	/* defined(_PATH_MEM) */
+
+		strerror(errno));
+	    Exit(1);
+	}
+	(void) build_Nl(Drive_Nl);
+	if (kvm_nlist(Kd, Nl) < 0) {
+	    (void) fprintf(stderr, "%s: can't read namelist from %s\n",
+		Pn, Nmlst);
+	    Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#endif	/* defined(WILLDROPGID) */
+
+}
+
+
+#if	!defined(N_UNIX)
+/*
+ * get_nlist_path() - get kernel name list path
+ */
+
+char *
+get_nlist_path(ap)
+	int ap;				/* on success, return an allocated path
+					 * string pointer if 1; return a
+					 * constant character pointer if 0;
+					 * return NULL if failure */
+{
+	const char *bf;
+	static char *bfc;
+	MALLOC_S bfl;
+/*
+ * Get bootfile name.
+ */
+	if ((bf = getbootfile())) {
+	    if (!ap)
+		return("");
+	    bfl = (MALLOC_S)(strlen(bf) + 1);
+	    if (!(bfc = (char *)malloc(bfl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for boot file path: %s\n",
+		    Pn, bfl, bf);
+		Exit(1);
+	    }
+	    (void) snpf(bfc, bfl, "%s", bf);
+	    return(bfc);
+	}
+	return((char *)NULL);
+}
+#endif	/* !defined(N_UNIX) */
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+#if	FREEBSDV<2000
+	br = kvm_read((void *)addr, (void *)buf, len);
+#else	/* FREEBSDV>=2000 */
+	br = kvm_read(Kd, (u_long)addr, buf, len);
+#endif	/* FREEBSDV<2000 */
+
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * process_text() - process text information
+ */
+void
+process_text(vm)
+	KA_T vm;				/* vm space pointer */
+{
+	int i, j;
+	KA_T ka;
+	int n = 0;
+	struct vm_map_entry vmme, *e;
+	struct vm_object vmo;
+	struct vmspace vmsp;
+
+#if	FREEBSDV<2020
+	struct pager_struct pg;
+#endif	/* FREEBSDV<2020 */
+
+/*
+ * Read the vmspace structure for the process.
+ */
+	if (kread(vm, (char *)&vmsp, sizeof(vmsp)))
+	    return;
+/*
+ * Read the vm_map structure.  Search its vm_map_entry structure list.
+ */
+	for (i = 0; i < vmsp.vm_map.nentries; i++) {
+
+	/*
+	 * Read the next vm_map_entry.
+	 */
+	    if (i == 0)
+		e = &vmsp.vm_map.header;
+	    else {
+		if (!(ka = (KA_T)e->next))
+		    return;
+		e = &vmme;
+		if (kread(ka, (char *)e, sizeof(vmme)))
+		    return;
+	    }
+
+#if	defined(MAP_ENTRY_IS_A_MAP)
+	    if (e->eflags & (MAP_ENTRY_IS_A_MAP|MAP_ENTRY_IS_SUB_MAP))
+#else	/* !defined(MAP_ENTRY_IS_A_MAP) */
+	    if (e->is_a_map || e->is_sub_map)
+#endif	/* defined(MAP_ENTRY_IS_A_MAP) */
+
+		continue;
+	/*
+	 * Read the map entry's object and the object's shadow.
+	 * Look for: a PG_VNODE pager handle (FreeBSD < 2.2);
+	 * an OBJT_VNODE object type (FreeBSD >= 2.2).
+	 */
+	    for (j = 0, ka = (KA_T)e->object.vm_object;
+		 j < 2 && ka;
+		 j++,
+
+#if	FREEBSDV<2020
+		 ka = (KA_T)vmo.shadow
+#else	/* FREEBSDV>=2020 */
+		 ka = (KA_T)vmo.backing_object
+#endif	/* FREEBSDV<2020 */
+		 )
+	    {
+		if (kread(ka, (char *)&vmo, sizeof(vmo)))
+		    break;
+
+#if	FREEBSDV<2020
+		if ((ka = (KA_T)vmo.pager) == NULL
+		||  kread(ka, (char *)&pg, sizeof(pg)))
+		    continue;
+		if (pg.pg_handle == NULL || pg.pg_type != PG_VNODE)
+		    continue;
+		(void) (enter_vn_text((KA_T)pg.pg_handle, &n));
+#else	/* FREEBSDV>=2020 */
+		if (vmo.type != OBJT_VNODE
+		||  vmo.handle == (void *)NULL)
+		    continue;
+		(void) (enter_vn_text((KA_T)vmo.handle, &n));
+#endif	/* FREEBSDV<2020 */
+
+	    }
+	}
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dproto.h
new file mode 100644
index 0000000..cc23cf7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dproto.h
@@ -0,0 +1,66 @@
+/*
+ * dproto.h - FreeBSD function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.14 2009/03/25 19:23:06 abe Exp $
+ */
+
+
+#if	FREEBSDV>=5000 && defined(HAS_NO_SI_UDEV)
+# if	defined(HAS_CONF_MINOR)|| defined(HAS_CDEV2PRIV)
+_PROTOTYPE(extern dev_t Dev2Udev,(KA_T c));
+# else	/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+_PROTOTYPE(extern dev_t Dev2Udev,(struct cdev *c));
+# endif	/* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
+#endif	/* FREEBSDV>=5000 && defined(HAS_NO_SI_UDEV) */
+
+#if	!defined(N_UNIX)
+_PROTOTYPE(extern char *get_nlist_path,(int ap));
+#endif	/* !defined(N_UNIX) */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern void process_socket,(KA_T sa));
+_PROTOTYPE(extern struct l_vfs *readvfs,(KA_T vm));
+
+#if	defined(HASKQUEUE)
+_PROTOTYPE(extern void process_kqueue,(KA_T ka));
+#endif	/* defined(HASKQUEUE) */
+
+#if	FREEBSDV>=2020
+_PROTOTYPE(extern void process_pipe,(KA_T pa));
+#endif	/* FREEBSDV>=2020 */
+
+#if	defined(HAS9660FS)
+_PROTOTYPE(extern int read_iso_node,(struct vnode *v, dev_t *d, int *dd, INODETYPE *ino, long *nl, SZOFFTYPE *sz));
+#endif	/* defined(HAS9660FS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dsock.c
new file mode 100644
index 0000000..c4dc1c4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dsock.c
@@ -0,0 +1,535 @@
+/*
+ * dsock.c - FreeBSD socket processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.28 2009/03/25 19:23:06 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HASIPv6)
+
+/*
+ * IPv6_2_IPv4()  -- macro to define the address of an IPv4 address contained
+ *		     in an IPv6 address
+ */
+
+#define IPv6_2_IPv4(v6)	(((uint8_t *)((struct in6_addr *)v6)->s6_addr)+12)
+
+# if	defined(HAS_NO_6PORT)
+/*
+ * If the in_pcb structure no longer has the KAME accommodations of
+ * in6p_[fl]port, redefine them to inp_[fl]port.
+ */
+
+#define	in6p_fport	inp_fport
+#define	in6p_lport	inp_lport
+# endif	/* defined(HAS_NO_6PORT) */
+
+# if	defined(HAS_NO_6PPCB)
+/*
+ * If the in_pcb structure no longer has the KAME accommodation of in6p_pcb,
+ * redefine it to inp_ppcb.
+ */
+
+#define	in6p_ppcb	inp_ppcb
+# endif	/* defined(HAS_NO_6PPCB) */
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int ckstate,(KA_T ta, struct tcpcb *t, int fam));
+
+
+/*
+ * ckstate() -- read TCP control block and check TCP state for inclusion
+ *		or exclusion
+ * return: -1 == no TCP CB available
+ *	    0 == TCP DB available; continue processing file
+ *	    1 == stop processing file
+ */
+
+static int
+ckstate(ta, t, fam)
+	KA_T ta;			/* TCP control block address */
+	struct tcpcb *t;		/* TCP control block receptor */
+	int fam;			/* protocol family */
+{
+	int tsnx;
+/*
+ * Read TCP control block.
+ */
+	if (kread(ta, (char *)t, sizeof(struct tcpcb)))
+	    return(-1);
+	if (TcpStXn || TcpStIn) {
+
+	/*
+	 * If there are TCP state inclusions or exclusions, check them.
+	 */
+	    tsnx = (int)t->t_state + TcpStOff;
+	    if (TcpStXn) {
+		if (TcpStX[tsnx]) {
+		    Lf->sf &= ~SELNET;
+		    Lf->sf |= SELEXCLF;
+		    return(1);
+		}
+	    }
+	    if (TcpStIn) {
+		if (TcpStI[tsnx]) {
+		    TcpStI[tsnx] = 2;
+		    Lf->sf |= SELNET;
+		} else {
+		    Lf->sf &= ~SELNET;
+		    Lf->sf |= SELEXCLF;
+		    return(1);
+		}
+	    }
+	}
+	if (!(Lf->sf & SELNET) && !TcpStIn) {
+
+	/*
+	 * See if this TCP file should be selected.
+	 */
+	    if (Fnet) {
+		if (!FnetTy
+		||  (FnetTy == 4) && (fam == AF_INET)
+
+#if	defined(HASIPv6)
+		||  (FnetTy == 6) && (fam == AF_INET6)
+#endif 	/* defined(HASIPv6) */
+
+		) {
+		    Lf->sf |= SELNET;
+		}
+	    }
+	}
+	return(0);
+}
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	struct domain d;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam;
+	int fp, lp;
+	struct inpcb inp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct protosw p;
+	struct socket s;
+	struct tcpcb t;
+	int ts = -1;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = NULL;
+	struct sockaddr_un un;
+
+#if	FREEBSDV<4050
+	struct mbuf mb;
+#else	/* FREEBSDV>=4050 */
+	int unl;
+#endif	/* FREEBSDV<4050 */
+
+#if	defined(HASIPv6) && !defined(HASINRIAIPv6)
+	struct in6pcb in6p;
+#endif	/* defined(HASIPv6) && !defined(HASINRIAIPv6) */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read the socket, protocol, and domain structures.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread(sa, (char *) &s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket struct from %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_type) {
+	    enter_nm("no socket type");
+	    return;
+	}
+	if (!s.so_proto
+	||  kread((KA_T)s.so_proto, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "can't read protocol switch from %s",
+		print_kptr((KA_T)s.so_proto, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!p.pr_domain
+	||  kread((KA_T)p.pr_domain, (char *)&d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Save size information.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rq = s.so_rcv.sb_cc;
+	Lf->lts.sq = s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.ltm = (unsigned int)s.so_linger;
+	Lf->lts.opt = (unsigned int)s.so_options;
+	Lf->lts.pqlen = (unsigned int)s.so_incqlen;
+	Lf->lts.qlen = (unsigned int)s.so_qlen;
+	Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+	Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = (unsigned int)s.so_state;
+# if	defined(HASSBSTATE)
+	Lf->lts.sbs_rcv = s.so_rcv.sb_state;
+	Lf->lts.sbs_snd = s.so_snd.sb_state;
+# endif	/* defined(HASSBSTATE) */
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	switch ((fam = d.dom_family)) {
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+
+#if	defined(HASIPv6)
+	case AF_INET6:
+#endif	/* defined(HASIPv6) */
+
+	    if (Fnet) {
+		if (!FnetTy
+		||  ((FnetTy == 4) && (fam == AF_INET))
+
+#if	defined(HASIPv6)
+		||  ((FnetTy == 6) && (fam == AF_INET6))
+#endif	/* defined(HASIPv6) */
+
+		) {
+		    if (!TcpStIn && !UdpStIn)
+			Lf->sf |= SELNET;
+		}
+	    }
+	    printiproto(p.pr_protocol);
+
+#if	defined(HASIPv6)
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+		(fam == AF_INET) ? "IPv4" : "IPv6");
+#else	/* !defined(HASIPv6) */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+#if	defined(HASIPv6) && !defined(HASINRIAIPv6)
+	    if (fam == AF_INET6) {
+
+	    /*
+	     * Read IPv6 protocol control block.
+	     */
+		if (!s.so_pcb
+		||  kread((KA_T)s.so_pcb, (char *)&in6p, sizeof(in6p))) {
+		    (void) snpf(Namech, Namechl, "can't read in6pcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    /*
+	     * Save IPv6 address information.
+	     */
+		if (p.pr_protocol == IPPROTO_TCP) {
+		    if (in6p.in6p_ppcb) {
+			if ((ts = ckstate((KA_T)in6p.in6p_ppcb, &t, fam)) == 1)
+			    return;
+		    }
+		}
+		enter_dev_ch(print_kptr((KA_T)(in6p.in6p_ppcb ? in6p.in6p_ppcb
+							      : s.so_pcb),
+					       (char *)NULL, 0));
+	        la = (unsigned char *)&in6p.in6p_laddr;
+	        lp = (int)ntohs(in6p.in6p_lport);
+		if (!IN6_IS_ADDR_UNSPECIFIED(&in6p.in6p_faddr)
+		||  in6p.in6p_fport)
+		{
+		    fa = (unsigned char *)&in6p.in6p_faddr;
+		    fp = (int)ntohs(in6p.in6p_fport);
+		}
+	    } else
+#endif	/* defined(HASIPv6) && !defined(HASINRIAIPv6) */
+
+	    {
+
+	    /*
+	     * Read Ipv4 or IPv6 (INRIA) protocol control block.
+	     */
+		if (!s.so_pcb
+		||  kread((KA_T) s.so_pcb, (char *) &inp, sizeof(inp))) {
+		    if (!s.so_pcb) {
+			(void) snpf(Namech, Namechl, "no PCB%s%s",
+
+#if	defined(HASSBSTATE)
+			    (s.so_snd.sb_state & SBS_CANTSENDMORE) ?
+#else	/* !defined(HASSBSTATE) */
+			    (s.so_state & SS_CANTSENDMORE) ?
+#endif	/* defined(HASSBSTATE) */ 
+
+				", CANTSENDMORE" : "",
+#if	defined(HASSBSTATE)
+			    (s.so_rcv.sb_state & SBS_CANTRCVMORE) ?
+#else	/* !defined(HASSBSTATE) */
+			    (s.so_state & SS_CANTRCVMORE) ?
+#endif	/* defined(HASSBSTATE) */
+
+				", CANTRCVMORE" : "");
+		    } else {
+			(void) snpf(Namech, Namechl, "can't read inpcb at %s",
+			    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    }
+		    enter_nm(Namech);
+		    return;
+		}
+		if (p.pr_protocol == IPPROTO_TCP) {
+		    if (inp.inp_ppcb) {
+			if ((ts = ckstate((KA_T)inp.inp_ppcb, &t, fam)) == 1)
+			    return;
+		    }
+		}
+		enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
+							    : s.so_pcb),
+					       (char *)NULL, 0));
+		lp = (int)ntohs(inp.inp_lport);
+		if (fam == AF_INET) {
+
+		/*
+		 * Save IPv4 address information.
+		 */
+		    la = (unsigned char *)&inp.inp_laddr;
+		    if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport) {
+			fa = (unsigned char *)&inp.inp_faddr;
+			fp = (int)ntohs(inp.inp_fport);
+		    }
+		}
+		
+#if	defined(HASIPv6) && defined(HASINRIAIPv6)
+		else {
+		    la = (unsigned char *)&inp.inp_laddr6;
+		    if (!IN6_IS_ADDR_UNSPECIFIED(&inp.inp_faddr6)
+		    ||  inp.inp_fport)
+		    {
+			fa = (unsigned char *)&inp.inp_faddr6;
+			fp = (int)ntohs(inp.inp_fport);
+		    }
+		}
+#endif	/* defined(HASIPv6) && defined(HASINRIAIPv6) */
+
+	    }
+
+
+#if	defined(HASIPv6)
+	    if ((fam == AF_INET6)
+	    &&  ((la && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la))
+	    ||  ((fa && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)fa))))) {
+
+	    /*
+	     * Adjust for IPv4 addresses mapped in IPv6 addresses.
+	     */
+		if (la)
+		    la = (unsigned char *)IPv6_2_IPv4(la);
+		if (fa)
+		    fa = (unsigned char *)IPv6_2_IPv4(fa);
+		fam = AF_INET;
+	    }
+#endif	/* defined(HASIPv6) */
+
+	/*
+ 	 * Enter local and remote addresses by address family.
+ 	 */
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, fam);
+	    if (ts == 0) {
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)t.t_state;
+
+#if	defined(HASTCPOPT)
+		Lf->lts.mss = (unsigned long)t.t_maxseg;
+		Lf->lts.msss = (unsigned char)1;
+		Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	    }
+	    break;
+/*
+ * Process a ROUTE domain socket.
+ */
+	case AF_ROUTE:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "rte");
+	    if (s.so_pcb)
+		enter_dev_ch(print_kptr((KA_T)(s.so_pcb), (char *)NULL, 0));
+	    else
+		(void) snpf(Namech, Namechl, "no protocol control block");
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    break;
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    if (kread((KA_T) s.so_pcb, (char *) &unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+	    if (unp.unp_addr) {
+
+#if	FREEBSDV<4050
+		if (kread((KA_T)unp.unp_addr, (char *)&mb, sizeof(mb)))
+#else	/* FREEBSDV>=4050 */
+		if (kread((KA_T)unp.unp_addr, (char *)&un, sizeof(un)))
+#endif	/* FREEBSDV<4050 */
+
+		{
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+
+#if	FREEBSDV<4050
+		if (mb.m_hdr.mh_len == sizeof(struct sockaddr_un))
+		    ua = (struct sockaddr_un *) ((char *) &mb
+		       + (mb.m_hdr.mh_data - (caddr_t) unp.unp_addr));
+#else	/* FREEBSDV>=4050 */
+		ua = &un;
+#endif	/* FREEBSDV<4050 */
+
+	    }
+	    if (!ua) {
+		ua = &un;
+		(void) bzero((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *)&uc, sizeof(uc)))
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			else
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)uc.unp_socket,(char *)NULL,0));
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	    if (ua->sun_path[0]) {
+
+#if	FREEBSDV<4050
+		if (mb.m_len >= sizeof(struct sockaddr_un))
+		    mb.m_len = sizeof(struct sockaddr_un) - 1;
+		*((char *)ua + mb.m_len) = '\0';
+#else	/* FREEBSDV>=4050 */
+# if	FREEBSDV>4060
+		unl = ua->sun_len - offsetof(struct sockaddr_un, sun_path);
+# else	/* FREEBSDV<4060 */
+		unl = sizeof(ua->sun_path) - 1;
+# endif	/* FREEBSDV>4060 */ 
+		if ((unl < 0) || (unl >= sizeof(ua->sun_path)))
+		    unl = sizeof(ua->sun_path) - 1;
+		ua->sun_path[unl] = '\0';
+#endif	/* FREEBSDV<4050 */
+
+		if (ua->sun_path[0] && Sfile && is_file_named(ua->sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (ua->sun_path[0] && !Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dstore.c
new file mode 100644
index 0000000..99239bd
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dstore.c
@@ -0,0 +1,131 @@
+/*
+ * dstore.c - FreeBSD global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.8 2008/04/15 13:31:47 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+struct file *Cfp;			/* curent file's file struct pointer */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+
+#if	FREEBSDV<2005
+	{ X_NCACHE,	"_nchhead"	},
+#else	/* FREEBSDV>=2005 */
+# if	FREEBSDV<2010
+	{ X_NCACHE,	"_nclruhead"	},
+# else	/* FREEBSDV>=2010 */
+	{ X_NCACHE,	"_nchashtbl"	},
+# endif	/* FREEBSDV<2010 */
+#endif	/* FREEBSDV<2005 */
+
+#if	FREEBSDV<2010
+	{ X_NCSIZE,	"_numcache"	},
+#else	/* FREEBSDV>=2010 */
+	{ X_NCSIZE,	"_nchash"	},
+#endif	/* FREEBSDV<2010 */
+
+	{ "",		""		},
+	{ NULL,		NULL		}
+};
+
+#if	FREEBSDV>=2000
+kvm_t *Kd = NULL;			/* kvm descriptor */
+#endif	/* FREEBSDV>=2000 */
+
+#if	defined(P_ADDR)
+KA_T Kpa;				/* kernel proc struct address */
+#endif	/* defined(P_ADDR) */
+
+struct l_vfs *Lvfs = NULL;		/* local vfs structure table */
+
+int Np = 0;				/* number of kernel processes */
+
+#if	FREEBSDV>=2000
+struct kinfo_proc *P = NULL;		/* local process table copy */
+#endif	/* FREEBSDV>=2000 */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FASYNC,		FF_ASYNC	},
+	{ (long)FFSYNC,		FF_FSYNC	},
+
+# if	defined(FMARK)
+	{ (long)FMARK,		FF_MARK		},
+# endif	/* defined(FMARK) */
+
+# if	defined(FDEFER)
+	{ (long)FDEFER,		FF_DEFER	},
+# endif	/* defined(FDEFER) */
+
+	{ (long)FHASLOCK,	FF_HASLOCK	},
+	{ (long)O_NOCTTY,	FF_NOCTTY	},
+	{ (long)0,		NULL 		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,	POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/dzfs.h b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dzfs.h
new file mode 100644
index 0000000..6ffe7de
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/dzfs.h
@@ -0,0 +1,112 @@
+/*
+ * dzfs.h - FreeBSD header file for ZFS
+ */
+
+
+/*
+ * Copyright 2008 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: dzfs.h,v 1.3 2011/08/07 22:51:28 abe Exp $
+ */
+
+
+#if	!defined(FREEBSD_ZFS_H)
+#define	FREEBSD_ZFS_H	1
+# if	defined(HAS_ZFS)
+
+
+/*
+ * The _PROTOTYPE macro provides strict ANSI C prototypes if __STDC__
+ * is defined, and old-style K&R prototypes otherwise.
+ *
+ * (With thanks to Andy Tanenbaum)
+ */
+
+# if	defined(__STDC__)
+#define	_PROTOTYPE(function, params)	function params
+# else	/* !defined(__STDC__) */
+#define	_PROTOTYPE(function, params)	function()
+# endif /* defined(__STDC__) */
+
+
+/*
+ * The following define keeps gcc>=2.7 from complaining about the failure
+ * of the Exit() function to return.
+ *
+ * Paul Eggert supplied it.
+ */
+
+# if	defined(__GNUC__) && !(__GNUC__<2 || (__GNUC__==2 && __GNUC_MINOR__<7))
+#define	exiting	__attribute__((__noreturn__))
+# else	/* !gcc || gcc<2.7 */
+#define	exiting
+# endif	/* gcc && gcc>=2.7 */
+
+# if	!defined(INODETYPE)
+#define	INODETYPE	unsigned long long
+# endif	/* !defined(INODETYPE) */
+
+# if	!defined(FREEBSD_KA_T)
+#  if	FREEBSDV<2000
+typedef	off_t		KA_T;
+#  else	/* FREEBSDV>=2000 */
+typedef	u_long		KA_T;
+#  endif	/* FREEBSDV<2000 */
+#define	FREEBSD_KA_T	1		/* for dlsof.h */
+# endif	/* !defined(FREEBSD_KA_T) */
+
+# if	!defined(READLEN_T)
+#define	READLEN_T	int
+# endif	/* !defined(READLEN_T) */
+
+# if	!defined(SZOFFTYPE)
+#define	SZOFFTYPE	unsigned long long
+# endif	/* !defined(SZOFFTYPE) */
+
+
+/*
+ * Structure for passing znode info
+ */
+
+typedef struct zfs_info {
+	INODETYPE ino;			/* inode number */
+	KA_T lockf;			/* znode's z_lockf pointer */
+	long nl;			/* number of links */
+	dev_t rdev;			/* "raw" device number */
+	SZOFFTYPE sz;			/* size */
+	unsigned char ino_def;		/* ino defined status */
+	unsigned char nl_def;		/* nl defined status */
+	unsigned char rdev_def;		/* rdev defined status */
+	unsigned char sz_def;		/* sz defined status */
+} zfs_info_t;
+
+_PROTOTYPE(extern int kread,(KA_T addr, char *buf, READLEN_T len));
+_PROTOTYPE(extern char *readzfsnode,(KA_T va, zfs_info_t *zi, int vr));
+
+# endif	/* defined(HAS_ZFS) */
+#endif	/* defined(FREEBSD_DZFS_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/include/procfs/pfsnode.h b/lsof_4.85/lsof_4.85_src/dialects/freebsd/include/procfs/pfsnode.h
new file mode 100644
index 0000000..6979e49
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/include/procfs/pfsnode.h
@@ -0,0 +1,217 @@
+/*
+ * Copyright (c) 1993 Paul Kranenburg
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by Paul Kranenburg.
+ * 4. The name of the author may not be used to endorse or promote products
+ *    derived from this software withough specific prior written permission
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ *	$Id: pfsnode.h,v 1.1 1993/12/12 12:26:39 davidg Exp $
+ */
+
+/*
+ * This structure defines the control data for the proc file system.
+ */
+
+struct pfsnode {
+	struct	pfsnode	*pfs_next;	/* next on list */
+	struct	vnode	*pfs_vnode;	/* vnode associated with this pfsnode */
+	pid_t	pfs_pid;		/* associated process */
+	u_short	pfs_mode;		/* mode bits for stat() */
+	uid_t	pfs_uid;		/* process' owner */
+	gid_t	pfs_gid;		/* process' group */
+	u_long	pfs_vflags;		/* chflags() flags */
+	u_long	pfs_flags;		/* open flags */
+	struct	vmspace	*pfs_vs;
+};
+
+struct pfsnode	*pfshead;
+
+/*
+ * Format of a directory entry in /proc
+ */
+struct pfsdent {
+	unsigned long	d_fileno;
+	unsigned short	d_reclen;
+	unsigned short	d_namlen;
+	char		d_nam[8];
+};
+#define PFSDENTSIZE	(sizeof(struct direct) - MAXNAMELEN + 8)
+
+#ifndef DIRBLKSIZ
+#define DIRBLKSIZ	DEV_BSIZE
+#endif
+
+#ifdef DEBUG
+int pfs_debug;
+#endif
+
+/*
+ * Convert between pfsnode pointers and vnode pointers
+ */
+#define VTOPFS(vp)	((struct pfsnode *)(vp)->v_data)
+#define PFSTOV(pfsp)	((pfsp)->pfs_vnode)
+
+/*
+ * Prototypes for PFS operations on vnodes.
+ */
+int	pfs_badop();
+int	pfs_doio();
+int	pfs_lookup __P(( \
+		struct vnode *vp, \
+		struct nameidata *ndp, \
+		struct proc *p));
+#define pfs_create ((int (*) __P(( \
+		struct nameidata *ndp, \
+		struct vattr *vap, \
+		struct proc *p))) pfs_badop)
+#define pfs_mknod ((int (*) __P(( \
+		struct nameidata *ndp, \
+		struct vattr *vap, \
+		struct ucred *cred, \
+		struct proc *p))) pfs_badop)
+int	pfs_open __P((
+		struct vnode *vp,
+		int mode,
+		struct ucred *cred,
+		struct proc *p));
+int	pfs_close __P((
+		struct vnode *vp,
+		int fflag,
+		struct ucred *cred,
+		struct proc *p));
+int	pfs_access __P((
+		struct vnode *vp,
+		int mode,
+		struct ucred *cred,
+		struct proc *p));
+int	pfs_getattr __P((
+		struct vnode *vp,
+		struct vattr *vap,
+		struct ucred *cred,
+		struct proc *p));
+int	pfs_setattr __P((
+		struct vnode *vp,
+		struct vattr *vap,
+		struct ucred *cred,
+		struct proc *p));
+#define	pfs_read ((int (*)  __P(( \
+		struct vnode *vp, \
+		struct uio *uio, \
+		int ioflag, \
+		struct ucred *cred))) pfs_doio)
+#define	pfs_write ((int (*) __P(( \
+		struct vnode *vp, \
+		struct uio *uio, \
+		int ioflag, \
+		struct ucred *cred))) pfs_doio)
+int	pfs_ioctl __P((
+		struct vnode *vp,
+		int command,
+		caddr_t data,
+		int fflag,
+		struct ucred *cred,
+		struct proc *p));
+#define pfs_select ((int (*) __P(( \
+		struct vnode *vp, \
+		int which, \
+		int fflags, \
+		struct ucred *cred, \
+		struct proc *p))) pfs_badop)
+#define pfs_mmap ((int (*) __P(( \
+		struct vnode *vp, \
+		int fflags, \
+		struct ucred *cred, \
+		struct proc *p))) pfs_badop)
+#define pfs_fsync ((int (*) __P(( \
+		struct vnode *vp, \
+		int fflags, \
+		struct ucred *cred, \
+		int waitfor, \
+		struct proc *p))) pfs_badop)
+#define pfs_seek ((int (*) __P(( \
+		struct vnode *vp, \
+		off_t oldoff, \
+		off_t newoff, \
+		struct ucred *cred))) pfs_badop)
+#define pfs_remove ((int (*) __P(( \
+		struct nameidata *ndp, \
+		struct proc *p))) pfs_badop)
+#define pfs_link ((int (*) __P(( \
+		struct vnode *vp, \
+		struct nameidata *ndp, \
+		struct proc *p))) pfs_badop)
+#define pfs_rename ((int (*) __P(( \
+		struct nameidata *fndp, \
+		struct nameidata *tdnp, \
+		struct proc *p))) pfs_badop)
+#define pfs_mkdir ((int (*) __P(( \
+		struct nameidata *ndp, \
+		struct vattr *vap, \
+		struct proc *p))) pfs_badop)
+#define pfs_rmdir ((int (*) __P(( \
+		struct nameidata *ndp, \
+		struct proc *p))) pfs_badop)
+#define pfs_symlink ((int (*) __P(( \
+		struct nameidata *ndp, \
+		struct vattr *vap, \
+		char *target, \
+		struct proc *p))) pfs_badop)
+int	pfs_readdir __P((
+		struct vnode *vp,
+		struct uio *uio,
+		struct ucred *cred,
+		int *eofflagp));
+#define pfs_readlink ((int (*) __P(( \
+		struct vnode *vp, \
+		struct uio *uio, \
+		struct ucred *cred))) pfs_badop)
+#define pfs_abortop ((int (*) __P(( \
+		struct nameidata *ndp))) pfs_badop)
+int	pfs_inactive __P((
+		struct vnode *vp,
+		struct proc *p));
+int	pfs_reclaim __P((
+		struct vnode *vp));
+#define pfs_lock ((int (*) __P(( \
+		struct vnode *vp))) nullop)
+#define pfs_unlock ((int (*) __P(( \
+		struct vnode *vp))) nullop)
+int	pfs_bmap __P((
+		struct vnode *vp,
+		daddr_t bn,
+		struct vnode **vpp,
+		daddr_t *bnp));
+int	pfs_strategy __P((
+		struct buf *bp));
+void	pfs_print __P((
+		struct vnode *vp));
+#define pfs_islocked ((int (*) __P(( \
+		struct vnode *vp))) nullop)
+#define pfs_advlock ((int (*) __P(( \
+		struct vnode *vp, \
+		caddr_t id, \
+		int op, \
+		struct flock *fl, \
+		int flags))) pfs_badop)
diff --git a/lsof_4.85/lsof_4.85_src/dialects/freebsd/machine.h b/lsof_4.85/lsof_4.85_src/dialects/freebsd/machine.h
new file mode 100644
index 0000000..3089ef7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/freebsd/machine.h
@@ -0,0 +1,662 @@
+/*
+ * machine.h - FreeBSD definitions 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: machine.h,v 1.38 2010/07/29 16:04:28 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+#include <sys/types.h>
+
+# if	defined(HAS_CONF_MINOR)
+#undef	minor
+# endif	/* defined(HAS_CONF_MINOR) */
+
+#if	defined(HASCPUMASK_T)
+/*
+ * In FreeBSD >= 5.2 when the cpumask_t typedef is present, it may be defined
+ * in <sys/types.h> only if _KERNEL is predefined.  However, predefining
+ * _KERNEL before #include'ing <sys/types.h> causes redefinition errors for
+ * boolean_t and vm_page_t when <vm/vm.h> is #include'd with _KERNEL
+ * predefined.  Since lsof must have _KERNEL predefined when <vm/vm.h> is
+ * #include'd, the expedient choice is made to duplicate the cpumask_t typedef
+ * here.
+ *
+ * Note: the Configure script defines HASCPUMASK_T if <sys/types.h> and
+ * <machine/_types.h> both have cpumask_t references and if the reference in
+ * <sys/types.h> is valid only when _KERNEL is defined.
+ */
+
+typedef	__cpumask_t	cpumask_t;
+#endif	/* defined(HASCPUMASK_T) */
+
+#include <sys/param.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+# if	FREEBSDV<4000
+#define	HASBLKDEV	1
+# endif	/* FREEBSDV<4000 */
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+/* #define	HASFSINO	1 */
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+#define	HASINODE	1
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+# if	FREEBSDV>=2020
+#define	HASPIPEFN	process_pipe
+# endif	/* FREEBSDV>=2020 */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+# if	FREEBSDV>=2000
+#define	HASPPID		1
+# endif	/* FREEBSDV>=2000 */
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev?	*/
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.  For FreeBSD 2.0 and
+ * above the Configure script defines HASPROCFS when it can find
+ * /usr/src/sys/miscfs/procfs/procfs.h; below 2.0, Configure always defines
+ * HASPROCFS.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+# if	defined(HASPROCFS)
+#undef	HASPROCFS
+#define	HASPROCFS	"proc"
+# endif	/* defined(HASPROCFS) */
+
+/* #define		HASPROCFS	"proc?" */
+/* #define		HASFSTYPE	1 */
+
+# if	FREEBSDV>=2000
+#define	HASPINODEN	1
+# endif	/* FREEBSDV>=2000 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1 */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	FREEBSDV>=5200
+#define	HASWIDECHAR	1
+# endif	/* FREEBSDV>=5020 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTCPUDPSTATE is defined for dialects that have TCP and UDP state
+ * support -- i.e., for the "-stcp|udp:state" option and its associated
+ * speed improvements.
+ */
+
+#define	HASTCPUDPSTATE	1
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior
+ * to R4 usually don't.
+ * doesn't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"	 	/* INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+#define	USE_LIB_PROCESS_FILE			1	/* prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+#define	USE_LIB_READDEV				1	/* rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+
+# if	FREEBSDV<2010
+#define	USE_LIB_RNAM				1	/* rnam.c */
+# else	/* FREEBSDV>=2010 */
+#define	USE_LIB_RNMH				1	/* rnmh.c */
+# endif	/* FREEBSDV<2010 */
+
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	memset(a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/Makefile b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/Makefile
new file mode 100644
index 0000000..e71696b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/Makefile
@@ -0,0 +1,161 @@
+
+# HP-UX /dev/kmem-based Makefile
+#
+# $Id: Makefile,v 1.15 2008/04/15 13:29:43 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    dfile.c dmnt.c dnode.c dnode1.c dnode2.c dproc.c dsock.c \
+	dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c util.c
+
+OBJ=	dfile.o dmnt.o dnode.o dnode1.o dnode2.o dproc.o dsock.o \
+	dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can read /dev/kmem.  Normally that is'
+	@echo 'the sys group.  Your install rule actions might look something'
+	@echo 'like this:'
+	@echo ''
+	@echo '    install -i -g $${GRP} $${PROG} $${BIN}'
+	@echo '    chmod 2755 $${BIN}/$${PROG}'
+	@echo '    install -i $${MAN} $${DOC}'
+	@echo '    chmod 444 $${DOC}/$${MAN}'
+	@echo ''
+	@echo 'You will have to complete the skeletons for the BIN, DOC, and'
+	@echo 'GRP strings given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo '    GRP= sys'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_CINFO	"${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dnode2.o:	${HDR} dnode2.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/Mksrc
new file mode 100755
index 0000000..f94d164
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make /dev/kmem-based HP-UX source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.3 99/04/27 15:54:00 abe Exp $
+
+
+D=dialects/hpux/kmem
+L="dfile.c dlsof.h dmnt.c dnode.c dnode1.c dnode2.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dfile.c
new file mode 100644
index 0000000..f6c866b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dfile.c
@@ -0,0 +1,266 @@
+/*
+ * dfile.c - /dev/kmem-based HP-UX file processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.14 2001/08/14 13:27:16 abe Exp $";
+#endif
+
+#if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define _TIME_T
+typedef int time_t;
+/*
+ * CAUTION!!! CAUTION!!! CAUTION!!! CAUTION!!! CAUTION!!! CAUTION!!!
+ *
+ * Do NOT:
+ *
+ *	#define INO_T
+ *	typedef int ino_t;
+ *
+ * in this source file for HP-UX >= 10.30.  Doing so will cause the kernel's
+ * ino_t type to be erroneously used instead of the application's.
+ *
+ * CAUTION!!! CAUTION!!! CAUTION!!! CAUTION!!! CAUTION!!! CAUTION!!!
+ */
+#endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+#include "lsof.h"
+
+
+/*
+ * get_max_fd() - get maximum file descriptor plus one
+ */
+
+int
+get_max_fd()
+{
+	struct rlimit r;
+
+	if (getrlimit(RLIMIT_NOFILE, &r))
+	    return(-1);
+	return(r.rlim_cur);
+}
+
+
+/*
+ * print_dev() - print device
+ */
+
+char *
+print_dev(lf, dev)
+	struct lfile *lf;		/* file whose device is to be printed */
+	dev_t *dev;			/* device to be printed */
+{
+	static char buf[128];
+
+	(void) snpf(buf, sizeof(buf), "%d,%#x", GET_MAJ_DEV(*dev),
+		    GET_MIN_DEV(*dev));
+	return(buf);
+}
+
+
+/*
+ * process_file() - process file
+ */
+
+void
+process_file(fp)
+	KA_T fp;			/* kernel file structure address */
+{
+	struct file f;
+	int flag;
+
+	if (kread((KA_T)fp, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read file struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	Lf->off = (SZOFFTYPE)f.f_offset;
+
+	if (f.f_count) {
+
+#if	defined(HASFSTRUCT)
+	/*
+	 * Save file structure values.
+	 */
+	    if (Fsv & FSV_CT) {
+		Lf->fct = (long)f.f_count;
+		Lf->fsv |= FSV_CT;
+	    }
+	    if (Fsv & FSV_FA) {
+		Lf->fsa = fp;
+		Lf->fsv |= FSV_FA;
+	    }
+	    if (Fsv & FSV_FG) {
+		Lf->ffg = (long)f.f_flag;
+		Lf->fsv |= FSV_FG;
+	    }
+	    if (Fsv & FSV_NI) {
+		Lf->fna = (KA_T)f.f_data;
+		Lf->fsv |= FSV_NI;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Construct access code.
+	 */
+	    if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+		Lf->access = 'r';
+	    else if (flag == FWRITE)
+		Lf->access = 'w';
+	    else if (flag == (FREAD | FWRITE))
+		Lf->access = 'u';
+	/*
+	 * Process structure by its type.
+	 */
+	    switch (f.f_type) {
+
+#if	defined(DTYPE_LLA)
+	    case DTYPE_LLA:
+		process_lla((KA_T)f.f_data);
+		return;
+#endif	/* DTYPE_LLA */
+
+	    case DTYPE_VNODE:
+		process_node((KA_T)f.f_data);
+		return;
+	    case DTYPE_SOCKET:
+		process_socket((KA_T)f.f_data);
+		return;
+	    default:
+		if (!f.f_type || (f.f_ops && (KA_T)f.f_ops != Vnfops)) {
+		    (void) snpf(Namech, Namechl,
+			"%s file struct, ty=%#x, op=%#x",
+			print_kptr(fp, (char *)NULL, 0), f.f_type, f.f_ops);
+		    enter_nm(Namech);
+		    return;
+		}
+	    }
+	}
+	enter_nm("no more information");
+}
+
+
+#if	HPUXV>=1030
+/*
+ * read_mi() - read stream's module information
+ *
+ * Note: this function is included in this module, because ino_t is not
+ *	 redfined to the kernel's type, but is left at the application's type.
+ *	 See the CAUTION statement inside the HPUXKERNBITS>=64 #if/#endif
+ *	 block at the beginning of this file.
+ */
+
+int
+read_mi(sh, ip, pcb, pn)
+	KA_T sh;			/* stream head address */
+	KA_T *ip;			/* returned IP q_ptr */
+	KA_T *pcb;			/* returned TCP or UDP q_ptr */
+	char **pn;			/* returned protocol name */
+{
+	struct l_dev *dp;
+	char *ep = Namech;
+	struct sth_s hd;
+	int i;
+	size_t len, ml;
+	char mn[32];
+	KA_T ka, qa;
+	struct module_info mi;
+	struct queue q;
+	struct qinit qi;
+	size_t sz = Namechl;
+
+	if (!sh
+	||  kread(sh, (char *)&hd, sizeof(hd))) {
+	    (void) snpf(Namech, Namechl, "can't read stream head: %s",
+		print_kptr(sh, (char *)NULL, 0));
+	    return(1);
+	}
+	if (!Lf->rdev_def)
+	    dp = (struct l_dev *)NULL;
+	else
+	    dp = lkupdev(&DevDev, &Lf->rdev, 1, 0);
+	if (dp)
+	    (void) snpf(ep, sz, "%s", dp->name);
+	else
+	    *ep = '\0';
+/*
+ * Follow the stream head to each of its queue structures, retrieving the
+ * module names for each queue's q_info->qi_minfo->mi_idname chain of
+ * structures.  Separate each additional name from the previous one with
+ * "->".
+ *
+ * Ignore failures to read all but queue structure chain entries.
+ *
+ * Ignore module names that end in "head".
+ *
+ * Save the q_ptr value for "tcp" and "udp" modules.
+ */
+	ml = sizeof(mn) - 1;
+	mn[ml] = '\0';
+	*ip = *pcb = (KA_T)NULL;
+	qa = (KA_T)hd.sth_wq;
+	for (i = 0; i < 20; i++, qa = (KA_T)q.q_next) {
+	    if (!qa || kread(qa, (char *)&q, sizeof(q)))
+		break;
+	    if (!(ka = (KA_T)q.q_qinfo) || kread(ka, (char *)&qi, sizeof(qi)))
+		continue;
+	    if (!(ka = (KA_T)qi.qi_minfo) || kread(ka, (char *)&mi, sizeof(mi)))
+		continue;
+	    if (!(ka = (KA_T)mi.mi_idname) || kread(ka, mn, ml))
+		continue;
+	    if ((len = strlen(mn)) < 1)
+		continue;
+	    if (len >= 3 && !strcmp(&mn[len - 3], "sth"))
+		continue;
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%s%s", (ep == Namech) ? "" : "->", mn);
+	    if (!q.q_ptr)
+		continue;
+	    if (!*ip && !strcmp(mn, "ip")) {
+		*ip = (KA_T)q.q_ptr;
+		continue;
+	    }
+	    if (!*pcb && !strcmp(mn, "tcpm")) {
+		*pcb = (KA_T)q.q_ptr;
+		*pn = "TCP";
+		continue;
+	    }
+	    if (!*pcb && !strcmp(mn, "udpm")) {
+		*pcb = (KA_T)q.q_ptr;
+		*pn = "UDP";
+	    }
+	}
+	return(0);
+}
+#endif	/* HPUXV>=1030 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dlsof.h
new file mode 100644
index 0000000..984074b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dlsof.h
@@ -0,0 +1,441 @@
+/*
+ * dlsof.h - /dev/kmem-based HP-UX 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.19 2007/04/24 16:25:30 abe Exp $
+ */
+
+
+#if	!defined(HPUX_LSOF_H)
+#define	HPUX_LSOF_H	1
+
+# if	HPUXV>=1030
+#include <fcntl.h>
+# endif	/* HPUXV>=1030 */
+
+#include <stdlib.h>
+#include <dirent.h>
+#include <mntent.h>
+#include <setjmp.h>
+#include <string.h>
+#include <nlist.h>
+#include <unistd.h>
+
+# if	HPUXV<1020
+#include <sys/vnode.h>
+# endif	/* HPUXV<1020 */
+
+# if	HPUXV>=1030
+/*
+ * Include header files for HP-UX 10.30 and up that have been
+ * manufactured with q4 and hand edited.
+ */
+
+#include "lla.h"
+#include "proc.h"
+#include "rnode.h"
+#include "nfs_clnt.h"
+#include "vnode.h"
+# endif	/* HPUXV>=1030 */
+
+#include <sys/domain.h>
+
+# if	HPUXV>=1020
+#define	_INCLUDE_STRUCT_FILE
+# endif	/* HPUXV>=1020 */
+
+# if	HPUXV>=1030
+struct uio {		/* to satisfy function prototypes in <sys/file.h> */
+	int dummy;
+};
+# endif	/* HPUXV>=1030 */
+
+#include <sys/file.h>
+
+# if	HPUXV>=1020
+#undef	_INCLUDE_STRUCT_FILE
+# endif	/* HPUXV>=1020 */
+
+# if	HPUXV>=1030
+#include <sys/stream.h>
+#include "sth.h"
+# endif	/* HPUXV>=1030 */
+
+#include <sys/mbuf.h>
+
+# if	HPUXV>=800
+#undef	_PROTOTYPES
+#include <sys/pstat.h>
+# endif	/* HPUXV>=800 */
+
+#include <sys/resource.h>
+
+# if	HPUXV<1010
+#include <sys/proc.h>
+# endif	/* HPUXV<1010 */
+
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <netinet/in.h>
+#include <net/route.h>
+
+# if	HPUXV<1030
+#include <net/raw_cb.h>
+#include <netinet/in_pcb.h>
+# endif	/* HPUXV<1030 */
+
+#include <netinet/ip_var.h>
+#include <netinet/tcp.h>
+#include <netinet/tcpip.h>
+
+# if	HPUXV<1030
+#include <netinet/tcp_fsm.h>
+#include <netinet/tcp_timer.h>
+#include <netinet/tcp_var.h>
+# else	/* HPUXV>=1030 */
+#include <sys/tihdr.h>
+/*
+ * Include header files for HP-UX 10.30 and up that have been
+ * manufactured with q4 and hand editing.
+ */
+
+#include "ipc_s.h"
+#include "tcp_s.h"
+#include "udp_s.h"
+# endif	/* HPUXV<1030 */
+
+# if	HPUXV>=1030
+#undef	TCP_NODELAY
+#undef	TCP_MAXSEG
+# endif	/* HPUXV>=1030 */
+
+#include <rpc/types.h>
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+
+# if	HPUXV>=1030
+#include <rpc/clnt_soc.h>
+# endif	/* HPUXV>=1030 */
+
+# if	HPUXV>=1000
+#include <rpc/xdr.h>
+#include <rpc/auth.h>
+#include <rpc/clnt.h>
+#include <sys/cdfsdir.h>
+#include <sys/cdfs.h>
+#include <sys/cdnode.h>
+# endif	/* HPUXV>=1000 */
+
+#include <nfs/nfs.h>
+
+/*
+ * Structure for Atria's MVFS node (ancestry: lsof 3.61 or older)
+ */
+
+struct mvfsnode {
+	unsigned long d1[6];
+	unsigned long m_ino;			/* node number */
+};
+
+# if	HPUXV<1030
+#include <nfs/nfs_clnt.h>
+#  if	defined(HASRNODE3)
+/*
+ * This rnode structure definition should come from <nfs/rnode.h>, but HP-UX
+ * patched the kernel structures of NFS3 at PHNE_18173, PHNE_19426, PHNE_19937,
+ * and PHNE_20091 and didn't supply an updated <nfs/rnode.h>.
+ *
+ * This definition of rnode was derived via /usr/contrib/binq4.
+ */
+
+struct rnode {
+	struct rnode *r_next;
+	struct vnode r_vnode;
+	u_int r_fh3;
+	fhandle_t r_fh;
+	u_short r_flags;
+	short r_error;
+	daddr_t r_lastr;
+	k_off_t r_size;
+	k_off_t r_cachedsize;
+	struct ucred *r_rcred;
+	struct ucred *r_wcred;
+	struct ucred *r_unlcred;
+	int *r_unlname;
+	struct vnode *r_unldvp;
+	struct nfsfattr r_nfsattr;
+};
+#  else	/* !defined(HASRNODE3) */
+#include <nfs/rnode.h>
+#  endif	/* defined(HASRNODE3) */
+# endif	/* HPUXV<1030 */
+
+#include <nfs/snode.h>
+
+# if	HPUXV>=1000
+#define	_KERNEL
+#include <nfs/fifonode.h>
+#undef	_KERNEL
+# endif	/* HPUXV>=1000 */
+
+# if	defined(DTYPE_LLA) && HPUXV<1030
+#define	_KERNEL	1
+#include <sio/lla.h>
+#undef	_KERNEL
+# endif	/* defined(DTYPE_LLA) && HPUXV<1030 */
+
+#include <sys/un.h>
+#include <sys/unpcb.h>
+#include <sys/vfs.h>
+#include <sys/vmmac.h>
+#include <sys/user.h>
+
+/*
+ * The hpux_mount.h header file is manufactured from <sys/mount.h> by the
+ * Configure script to get the mount structure without needing to define
+ * _KERNEL when including <sys/mount.h>.  Defining _KERNEL causes unresolvable
+ * header file complications.
+ */
+
+#include "hpux_mount.h"
+
+# if	HPUXV>=800
+/*
+ * These definitions are from <sys/vfs.h>, defined under the _KERNEL symbol.
+ * Unfortunately, defining _KERNEL causes <sys/vfs.h> to include other
+ * header files not in <sys>.
+ */
+#define MOUNT_UFS 0
+#define MOUNT_NFS 1
+#define MOUNT_CDFS 2
+# endif	/* HPUXV>=800 */
+
+# if	defined(HAS_CONST)
+#define	COMP_P		const void
+# else	/* !defined(HAS_CONST) */
+#define	COMP_P		void
+# endif	/* defined(HAS_CONST) */
+
+# if	HPUXV>=800
+#define	CURDIR	p->p_cdir
+#define	ROOTDIR	p->p_rdir
+# else	/* HPUXV<800 */
+#define CURDIR	u->u_cdir
+#define	ROOTDIR	u->u_rdir
+# endif	/* HPUXV>=800 */
+
+#define DEVINCR		1024	/* device table malloc() increment */
+
+# if	HPUXV<1030
+/*
+ * KA_T is defined in dialects/hpux/kmem/hpux11/kernbits.h for HP-UX 10.30
+ * and above.
+ */
+typedef	off_t		KA_T;
+# endif	/* HPUXV<1030 */
+
+#define	KMEM		"/dev/kmem"
+#define MALLOC_P	void
+#define FREE_P		void
+#define MALLOC_S	unsigned
+#define MOUNTED		MNT_MNTTAB
+
+# if	HPUXV<1000
+#define N_UNIX		"/hp-ux"
+# else	/* HPUXV>=1000 */
+#define N_UNIX		"/stand/vmunix"
+# endif	/* HPUXV<1000 */
+
+#define QSORT_P		void
+#define	READLEN_T	int
+#define STRNCPY_L	size_t
+
+# if	HPUXV>=1000
+#define	SZOFFTYPE	unsigned long long
+				/* type for size and offset */
+#define	SZOFFPSPEC	"ll"	/* SZOFFTYPE printf specification modifier */
+# endif	/* HPUXV>=1000 */
+
+#define SWAP		"/dev/swap"
+
+# if	HPUXV<800
+#define unp_addr	unp_locaddr
+/*
+ * HP-UX <8 SWAP must be read in DEV_BSIZE chunks.
+ */
+#define U_SIZE		(((DEV_BSIZE+sizeof(struct user))/DEV_BSIZE)*DEV_BSIZE)
+# endif	/* HPUXV<800 */
+
+# if	HPUXV>=800
+#define	U_SIZE		sizeof(struct user)
+# endif	/* HPUXV>=800 */
+
+# if	HPUXV>=1030
+#define	XDR_PMAPLIST	(xdrproc_t)xdr_pmaplist
+#define	XDR_VOID	(xdrproc_t)xdr_void
+# endif	/* HPUXV>=1030 */
+
+
+# if	defined(HAS_AFS)
+/*
+ * AFS definitions
+ */
+
+#define	AFSAPATHDEF	"/usr/adm/afs/kload"
+#define	AFSDEV		1		/* AFS "fake" device number */
+
+#  if	defined(HASAOPT)
+extern char *AFSApath;			/* alternate AFS name list path
+					 * (from -A) */
+#  endif	/* defined(HASAOPT) */
+
+extern struct vfs *AFSVfsp;		/* AFS struct vfs kernel pointer */
+# endif	/* defined(HAS_AFS) */
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+extern int CloneMaj;
+extern int HaveCloneMaj;
+extern int Kd;
+extern KA_T Kpa;
+
+# if	HPUXV>=1010
+extern KA_T Ktp;
+#endif	/* HPUXV>=1010 */
+
+struct l_vfs {
+	KA_T addr;			/* kernel address */
+	dev_t dev;			/* device */
+	char *dir;			/* mounted directory */
+	char *fsname;			/* file system name */
+
+# if	defined(HASFSINO)
+	INODETYPE fs_ino;		/* file system inode number */
+# endif	/* defined(HASFSINO) */
+
+	struct l_vfs *next;		/* forward link */
+};
+extern struct l_vfs *Lvfs;
+
+# if	HPUXV<800
+extern int Mem;
+# endif	/* HPUXV<800 */
+
+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
+
+# if	HPUXV<800 && defined(hp9000s800)
+extern int npids;
+extern struct proc *proc;
+# endif	/* HPUXV<800 && defined(hp9000s800) */
+
+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	HPUXV<800
+extern int Swap;
+# endif	/* HPUXV<800 */
+
+# if	HPUXV<800 && defined(hp9000s800)
+extern struct user *ubase;
+# endif	/* HPUXV<800 && defined(hp9000s800) */
+
+# if	HPUXV<800 && defined(hp9000s300)
+extern struct pte *Usrptmap;
+extern struct pte *usrpt;
+# endif	/* HPUXV<800 && defined(hp9000s300) */
+
+extern KA_T Vnfops;
+
+
+/*
+ * Definitions for dvch.c, isfn.c, and rdev.c
+ */
+
+#define	CLONEMAJ	CloneMaj	/* clone major variable name */
+#define	DIRTYPE		dirent		/* directory structure type */
+#define HASDNAMLEN	1		/* DIRTYPE has d_namlen element */
+#define	HAS_STD_CLONE	1		/* uses standard clone structure */
+#define	HAVECLONEMAJ	HaveCloneMaj	/* clone major status variable name */
+#define	MAXSYSCMDL	(PST_CLEN - 1)
+
+
+/*
+ * Definition for rmnt.c
+ */
+
+#define MNTSKIP \
+	{ if (strcmp(mp->mnt_type, MNTTYPE_IGNORE) == 0) \
+		continue; }
+
+/*
+ * Definitions for rnch.c
+ */
+
+# if     defined(HASNCACHE)
+#include <sys/dnlc.h>
+#  if	HPUXV<1000
+#define	ADDR_NCACHE	1
+#  endif	/* HPUXV<1000 */
+# endif  /* defined(HASNCACHE) */
+
+#endif	/* HPUX_LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dmnt.c
new file mode 100644
index 0000000..d02acd4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dmnt.c
@@ -0,0 +1,252 @@
+/*
+ * dmnt.c - /dev/kmem-based HP-UX mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.8 2005/08/08 19:50:23 abe Exp $";
+#endif
+
+#if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define	_TIME_T
+typedef	int	time_t;
+#endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+#include "lsof.h"
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+
+
+/*
+ * completevfs() - complete local vfs structure
+ */
+void
+
+#if	HPUXV>=800
+completevfs(vfs, dev, v)
+	struct l_vfs *vfs;		/* local vfs structure pointer */
+	dev_t *dev;			/* device */
+	struct vfs *v;			/* kernel vfs structure */
+#else	/* HPUXV<800 */
+completevfs(vfs, dev)
+	struct l_vfs *vfs;		/* local vfs structure pointer */
+	dev_t *dev;			/* device */
+#endif	/* HPUXV>=800 */
+
+{
+	struct mounts *mp;
+/*
+ * If only Internet socket files are selected, don't bother completing the
+ * local vfs structure.
+ */
+	if (Selinet)
+	    return;
+
+#if	HPUXV>=800
+/*
+ * On HP-UX 8 and above, first search the local mount table for a match on
+ * the file system name from the vfs structure.
+ */
+	if (v) {
+	    for (mp = readmnt(); mp; mp = mp->next) {
+		if (strcmp(mp->fsname, v->vfs_name) == 0) {
+		    vfs->dev = mp->dev;
+		    vfs->dir = mp->dir;
+		    vfs->fsname = mp->fsname;
+
+# if	defined(HASFSINO)
+		    vfs->fs_ino = mp->inode;
+# endif	/* defined(HASFSINO) */
+
+		    return;
+		}
+	    }
+	}
+#endif	/* HPUXV>=800 */
+
+/*
+ * Search for a match on device number.
+ */
+	for (mp = readmnt(); mp; mp = mp->next) {
+	    if (mp->dev == *dev) {
+		vfs->dev = mp->dev;
+		vfs->dir = mp->dir;
+		vfs->fsname = mp->fsname;
+
+#if	defined(HASFSINO)
+		vfs->fs_ino = mp->inode;
+#endif	/* defined(HASFSINO) */
+
+		return;
+	    }
+	}
+
+#if	HPUXV>=800
+/*
+ * If the file system name and device number searches fail, use the
+ * vfs structure name, if there is one.  Determine the device number
+ * with statsafely().
+ */
+	if (v && v->vfs_name[0]) {
+		
+	    struct stat sb;
+
+	    if (!(vfs->dir = mkstrcpy(v->vfs_name, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr, "%s: no space for vfs name: ", Pn);
+		safestrprt(v->vfs_name, stderr, 1);
+		Exit(1);
+	    }
+	    if (statsafely(v->vfs_name, &sb) == 0)
+		vfs->dev = sb.st_dev;
+	    else
+		vfs->dev = (dev_t)0;
+
+# if	defined(HASFSINO)
+	    vfs->fs_ino = (INODETYPE)0;
+# endif	/* defined(HASFSINO) */
+
+	}
+#endif	/* HPUXV>=800 */
+
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(lv)
+	struct vnode *lv;		/* local vnode */
+{
+	struct mount m;
+	struct mntinfo mi;
+	int ms;
+	dev_t td;
+	struct vfs v;
+	struct l_vfs *vp;
+
+	if (!lv->v_vfsp)
+	    return((struct l_vfs *)NULL);
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if ((KA_T)lv->v_vfsp == vp->addr)
+		return(vp);
+	}
+	if ((vp = (struct l_vfs *)malloc(sizeof(struct l_vfs))) == NULL) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->dev = 0;
+	vp->dir = (char *)NULL;
+	vp->fsname = (char *)NULL;
+
+#if	defined(HASFSINO)
+	vp->fs_ino = 0;
+#endif	/* defined(HASFSINO) */
+
+	if (lv->v_vfsp && kread((KA_T)lv->v_vfsp, (char *)&v, sizeof(v))) {
+	    (void) free((FREE_P *)vp);
+	    return((struct l_vfs *)NULL);
+	}
+/*
+ * Complete the mount information.
+ */
+	if (Ntype == N_NFS) {
+
+	/*
+	 * The device number for an NFS file is found by following the vfs
+	 * private data pointer to an mntinfo structure.
+	 */
+	    if (v.vfs_data
+	    &&  kread((KA_T)v.vfs_data, (char *)&mi, sizeof(mi)) == 0) {
+
+#if	HPUXV<1020
+		td = (dev_t)makedev(255, (int)mi.mi_mntno);
+#else	/* HPUXV>=1020 */
+		td = mi.mi_mntno;
+#endif	/* HPUXV<1020 */
+
+#if	HPUXV>=800
+		(void) completevfs(vp, &td, (struct vfs *)NULL);
+#else	/* HPUXV<800 */
+		(void) completevfs(vp, &td);
+#endif	/* HPUXV>=800 */
+
+	    }
+	} else {
+	    if (v.vfs_data) {
+		if (kread((KA_T)v.vfs_data, (char *)&m, sizeof(m)) == 0)
+		    ms = 1;
+		else
+		    ms = 0;
+	    }
+
+#if	defined(HAS_AFS)
+	/*
+	 * Fake the device number for an AFS device.
+	 */
+	    else if (Ntype == N_AFS) {
+		m.m_dev = AFSDEV;
+		ms = 1;
+	    }
+#endif	/* defined(HAS_AFS) */
+
+	    else
+		ms = 0;
+	    if (ms)
+
+#if	HPUXV>=800
+# if	HPUXV<1000
+		(void) completevfs(vp, (dev_t *)&m.m_dev, &v);
+# else	/* HPUXV>=1000 */
+		(void) completevfs(vp, v.vfs_dev ? (dev_t *)&v.vfs_dev 
+						 : (dev_t *)&m.m_dev,
+				   &v);
+# endif	/* HPUXV<1000 */
+#else	/* HPUXV<800 */
+		(void) completevfs(vp, (dev_t *)&m.m_dev);
+#endif	/* HPUXV>=800 */
+
+	}
+/*
+ * Complete local vfs structure and link to the others.
+ */
+	vp->next = Lvfs;
+	vp->addr = (KA_T)lv->v_vfsp;
+	Lvfs = vp;
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode.c
new file mode 100644
index 0000000..132b41a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode.c
@@ -0,0 +1,1097 @@
+/*
+ * dnode.c - /dev/kmem-based HP-UX node functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.21 2007/04/24 16:25:30 abe Exp $";
+#endif
+
+#if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define _INO_T
+typedef int ino_t;
+#define _TIME_T
+typedef int time_t;
+#endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+#include "lsof.h"
+#include <sys/inode.h>
+
+#if	HPUXV>=900
+_PROTOTYPE(static void enter_nma,(char *b));
+_PROTOTYPE(static int islocked,(KA_T lp));
+#endif	/* HPUXV>=900 */
+
+_PROTOTYPE(static int getnodety,(struct vnode *v));
+_PROTOTYPE(static int readinode,(KA_T ia, struct inode *i));
+_PROTOTYPE(static int read_nmn,(KA_T na, KA_T ia, struct mvfsnode *m));
+
+
+#if	HPUXV>=900
+/*
+ * enter_nma() - enter NAME column addition
+ */
+
+static void
+enter_nma(b)
+	char *b;			/* addition buffer */
+{
+	if (Lf->nma)
+	    return;
+	if (strlen(b) < 1)
+	    return;
+	Lf->nma = mkstrcpy(b, (MALLOC_S *)NULL);
+}
+
+
+/*
+ * islocked() - is node locked?
+ */
+
+static int
+islocked(lp)
+	KA_T lp;			/* local locklist struct pointer */
+{
+	static int ety = -1;
+	static unsigned int ei = 0;
+	static SZOFFTYPE el = 0;
+	int l;
+	struct locklist ll;
+	KA_T llf, llp;
+
+	if (!(llf = (KA_T)lp))
+	    return((int)' ');
+	llp = llf;
+/*
+ * Compute the end test value the first time through.
+ */
+
+	if (ety == -1) {
+
+# if	HPUXV<1020
+	    ety = 0;
+	    ei = 0x7fffffff;
+# else	/* HPUXV>=1020 */
+	    if (sizeof(ll.ll_end) == 4) {
+		ety = 0;
+		ei = 0x80000000;
+	    } else {
+		ety = 1;
+		el = 0x10000000000ll;
+	    }
+# endif	/* HPUXV<1020 */
+
+	}
+
+/*
+ * Search the locklist chain for this process.
+ */
+	do {
+	    if (kread(llp, (char *)&ll, sizeof(ll)))
+		return((int)' ');
+
+#if	!defined(L_REMOTE)
+#define	L_REMOTE	0x1		/* from HP-UX 9.01 */
+#endif	/* !defined(L_REMOTE) */
+
+# if	HPUXV<1010
+	    if (ll.ll_flags & L_REMOTE || ll.ll_proc != (KA_T)Kpa)
+# else	/* HPUXV>=1010 */
+	    if (ll.ll_flags & L_REMOTE || (KA_T)ll.ll_kthreadp != Ktp)
+# endif	/* HPUXV<1010 */
+
+		continue;
+	    l = 0;
+	    if (ll.ll_start == 0) {
+		switch (ety) {
+		case 0:
+		    if (ll.ll_end == ei)
+			l = 1;
+		break;
+		case 1:
+		    if (ll.ll_end == el)
+			l = 1;
+		break;
+		}
+	    }
+	    if (ll.ll_type == F_WRLCK)
+		return((int)(l ? 'W' : 'w'));
+	    else if (ll.ll_type == F_RDLCK)
+		return((int)(l ? 'R' : 'r'));
+	    return((int)' ');
+	}
+
+# if	HPUXV<1010
+	while ((llp = (KA_T)ll.ll_link) && llp != llf);
+# else	/* HPUXV>=1010 */
+	while ((llp = (KA_T)ll.ll_fwd) && llp != llf);
+# endif	/* HPUXV<1010 */
+
+	return((int)' ');
+}
+#endif	/* HPUXV>=900 */
+
+
+/*
+ * getnodety() - get node type
+ */
+
+static int
+getnodety(v)
+	struct vnode *v;		/* local vnode copy */
+{
+
+#if	defined(HAS_AFS)
+	static int afs = 0;		/* AFS test status: -1 = no AFS
+					 *		     0 = not tested
+					 *		     1 = AFS present */
+	struct afsnode an;
+#endif	/* defined(HAS_AFS) */
+
+	static int ft = 1;
+	static KA_T avops;
+	static KA_T cvops;
+	static KA_T fvops;
+	static KA_T mvops;
+	static KA_T nvops;
+	static KA_T nvops3;
+	static KA_T nv3ops;
+	static KA_T pvops;
+	static KA_T svops;
+	static KA_T uvops;
+	static KA_T vvops;
+/*
+ * Do first-time only operations.
+ */
+	if (ft) {
+	    if (get_Nl_value("avops", Drive_Nl, &avops) < 0)
+		avops = (unsigned long)0;
+	    if (get_Nl_value("cvops", Drive_Nl, &cvops) < 0)
+		cvops = (unsigned long)0;
+	    if (get_Nl_value("fvops", Drive_Nl, &fvops) < 0)
+		fvops = (unsigned long)0;
+	    if (get_Nl_value("mvops", Drive_Nl, &mvops) < 0)
+		mvops = (unsigned long)0;
+	    if (get_Nl_value("nvops", Drive_Nl, &nvops) < 0)
+		nvops = (unsigned long)0;
+	    if (get_Nl_value("nvops3", Drive_Nl, &nvops3) < 0)
+		nvops3 = (unsigned long)0;
+	    if (get_Nl_value("nv3ops", Drive_Nl, &nv3ops) < 0)
+		nv3ops = (unsigned long)0;
+	    if (get_Nl_value("pvops", Drive_Nl, &pvops) < 0)
+		pvops = (unsigned long)0;
+	    if (get_Nl_value("svops", Drive_Nl, &svops) < 0)
+		svops = (unsigned long)0;
+	    if (get_Nl_value("uvops", Drive_Nl, &uvops) < 0)
+		uvops = (unsigned long)0;
+	    if (get_Nl_value("vvops", Drive_Nl, &vvops) < 0)
+		vvops = (unsigned long)0;
+	    ft = 0;
+	}
+/*
+ * Determine the vnode type.
+ */
+	if (uvops && uvops == (unsigned long)v->v_op)
+	    return(N_REGLR);
+	else if (nvops && nvops == (unsigned long)v->v_op)
+	    return(N_NFS);
+	else if (nvops3 && nvops3 == (unsigned long)v->v_op)
+	    return(N_NFS);
+	else if (nv3ops && nv3ops == (unsigned long)v->v_op)
+	    return(N_NFS);
+	else if (mvops && mvops == (unsigned long)v->v_op)
+	    return(N_MVFS);
+
+#if	defined(HASVXFS)
+	else if (vvops && vvops == (unsigned long)v->v_op)
+	    return(N_VXFS);
+#endif	/* defined(HASVXFS) */
+
+#if	HPUXV>=1000
+	else if (cvops && cvops == (unsigned long)v->v_op)
+	    return(N_CDFS);
+	else if (fvops && fvops == (unsigned long)v->v_op)
+	    return(N_FIFO);
+	else if (pvops && pvops == (unsigned long)v->v_op)
+	    return(N_PIPE);
+	else if (svops && svops == (unsigned long)v->v_op)
+	    return(N_SPEC);
+#else	/* HPUXV<1000 */
+	else if (v->v_type == VFIFO)
+	    return(N_FIFO);
+#endif	/* HPUXV<1000 */
+
+#if	defined(HAS_AFS)
+	/*
+	 * Caution: this AFS test should be the last one.
+	 */
+	
+	else if (avops) {
+	    if (avops == (unsigned long)v->v_op)
+		return(N_AFS);
+	    else {
+
+unknown_v_op:
+		(void) snpf(Namech, Namechl,
+		    "unknown file system type; v_op: %s",
+		    print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+		enter_nm(Namech);
+		return(-1);
+	    }
+	} else if (v->v_data || !v->v_vfsp)
+	    goto unknown_v_op;
+	else {
+	    switch (afs) {
+	    case -1:
+		goto unknown_v_op;
+	    case 0:
+		if (!hasAFS(v)) {
+		    afs = -1;
+		    goto unknown_v_op;
+		}
+		afs = 1;
+		return(N_AFS);
+		break;
+	    case 1:
+		if (v->v_vfsp == AFSVfsp)
+		    return(N_AFS);
+		else
+		    goto unknown_v_op;
+	    }
+	}
+#else	/* !defined(HAS_AFS) */
+	else {
+	    (void) snpf(Namech, Namechl,
+		"unknown file system type; v_op: %s",
+		print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(-1);
+	}
+#endif	/* defined(HAS_AFS) */
+
+}
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+
+{
+
+#if	defined(HAS_AFS)
+	struct afsnode an;
+#endif	/* defined(HAS_AFS) */
+
+	dev_t dev, rdev;
+	int devs = 0;
+	struct inode i;
+	int ins = 0;
+	struct mvfsnode m;
+	struct rnode r;
+	int rdevs = 0;
+	int rns = 0;
+	char tbuf[32], *ty;
+	enum vtype type;
+	static struct vnode *v = (struct vnode *)NULL;
+	struct l_vfs *vfs;
+	int vty;
+
+#if	HPUXV>=900
+	char fb[128];
+	int fns = 0;
+	int rp, sz, wp;
+	struct vnode rv;
+	struct snode s;
+#endif	/* HPUXV>=900 */
+
+#if	HPUXV>=1000
+	struct cdnode c;
+	struct fifonode f;
+	struct vattr vat;
+	int vats = 0;
+#endif	/* HPUXV>=1000 */
+
+/*
+ * Read the vnode.
+ */
+	if ( ! va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	if (!v) {
+
+	/*
+	 * Allocate space for the vnode or AFS vcache structure.
+	 */
+
+#if	defined(HAS_AFS)
+	    v = alloc_vcache();
+#else	/* !defined(HAS_AFS) */
+	    v = (struct vnode *)malloc(sizeof(struct vnode));
+#endif	/* defined(HAS_AFS) */
+
+	    if (!v) {
+		(void) fprintf(stderr, "%s: can't allocate %s space\n", Pn,
+
+#if	defined(HAS_AFS)
+		    "vcache"
+#else	/* !defined(HAS_AFS) */
+		    "vnode"
+#endif	/* defined(HAS_AFS) */
+
+		);
+		Exit(1);
+	    }
+	}
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASNCACHE)
+	Lf->na = va;
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = va;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Get the primary vnode type.
+ */
+	vty = getnodety(v);
+	if (vty == -1)
+	    return;
+	Ntype = vty;
+/*
+ * Determine lock type.
+ */
+
+#if	HPUXV<900
+	if (v->v_shlockc || v->v_exlockc) {
+	    if (v->v_shlockc && v->v_exlockc)
+		Lf->lock = 'u';
+	    else if (v->v_shlockc)
+		Lf->lock = 'R';
+	    else
+		Lf->lock = 'W';
+	}
+#else	/* HPUXV>900 */
+# if	HPUXV>=1000
+	Lf->lock = (char)islocked((KA_T)v->v_locklist);
+# endif	/* HPUXV>=1000 */
+#endif	/* HPUXV<900 */
+
+/*
+ * Establish the local virtual file system structure.
+ */
+	if (!v->v_vfsp)
+	    vfs = (struct l_vfs *)NULL;
+	else if (!(vfs = readvfs(v))) {
+	    (void) snpf(Namech, Namechl, "can't read vfs for %s at %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)v->v_vfsp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Read the cdnode, fifonode, inode, rnode, snode, or vache struct.
+ */
+	switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (readafsnode(va, v, &an))
+		return;
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HASVXFS)
+	case N_VXFS:
+	    if (!v->v_data || read_vxnode(v, vfs, &dev, &devs, &rdev, &rdevs)) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read vx_inode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    break;
+#endif	/* defined(HASVXFS) */
+
+#if	HPUXV>=1000
+	case N_CDFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&c, sizeof(c))) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read cdnode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    break;
+	case N_FIFO:
+	case N_PIPE:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&f, sizeof(f))) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read fifonode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    fns = 1;
+	    if (f.fn_vap
+	    &&  kread((KA_T)f.fn_vap, (char *)&vat, sizeof(vat)) == 0)
+		vats = 1;
+	    break;
+#endif	/* HPUXV>=1000 */
+
+	case N_MVFS:
+	    if (read_nmn(va, (KA_T)v->v_data, &m))
+		return;
+	    break;
+	case N_NFS:
+	    if (!v->v_data || readrnode((KA_T)v->v_data, &r)) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read rnode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)), 
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    rns = 1;
+	    break;
+
+#if	HPUXV>=1000
+	case N_SPEC:
+	    if ((v->v_type == VBLK) || (v->v_type == VCHR)) {
+		if (!v->v_data || readsnode((KA_T)v->v_data, &s)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read snode(%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		if (!s.s_realvp
+		||  readvnode((KA_T)s.s_realvp, &rv)) {
+		    (void) snpf(Namech, Namechl,
+			"snode at %s: can't read real vnode (%s)",
+			print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)s.s_realvp, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+
+#if	defined(HASVXFS)
+		if (getnodety(&rv) == N_VXFS) {
+		    if (!rv.v_data
+		    ||  read_vxnode(&rv, vfs, &dev, &devs, &rdev, &rdevs)) {
+			(void) snpf(Namech, Namechl,
+			    "vnode at %s: can't read vx_inode (%s)",
+			    print_kptr(va, tbuf, sizeof(tbuf)),
+			    print_kptr((KA_T)rv.v_data, (char *)NULL, 0));
+			enter_nm(Namech);
+			return;
+		    }
+		    Ntype = N_VXFS;
+		    break;
+		}
+#endif	/* defined(HASVXFS) */
+
+		if (!rv.v_data || readinode((KA_T)rv.v_data, &i)) {
+		    (void) snpf(Namech, Namechl,
+			"snode at %s: can't read inode (%s)",
+			print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)rv.v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		ins = 1;
+		break;
+	    }
+	    if (!v->v_data || readinode((KA_T)v->v_data, &i)) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read inode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    ins = 1;
+	    break;
+#endif	/* HPUXV>=1000 */
+
+#if	HPUXV>=900 && HPUXV<1000
+	case N_FIFO:
+	    if (v->v_fstype == VNFS_FIFO) {
+		if (!v->v_data || readsnode((KA_T)v->v_data, &s)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read snode (%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		if (!s.s_realvp || readvnode((KA_T)s.s_realvp, &rv)) {
+		    (void) snpf(Namech, Namechl,
+			"snode at %s: can't read real vnode (%s)",
+			print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)s.s_realvp, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		if (!rv.v_data || readrnode((KA_T)rv.v_data, &r)) {
+		    (void) snpf(Namech, Namechl,
+			"snode at %s: can't read real rnode (%s)",
+			print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)s.s_realvp, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		rns = 1;
+		break;
+	    }
+	    /* fall through */
+#endif	/* HPUXV>=900 && HPUXV<1000 */
+
+	case N_REGLR:
+	default:
+	    if (!v->v_data || readinode((KA_T)v->v_data, &i)) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read inode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    ins = 1;
+
+#if	HPUXV>=900 && HPUXV<1000
+	    if (v->v_type == VFIFO)
+		Ntype = N_FIFO;
+#endif	/* HPUXV>=900 && HPUXV<1000 */
+
+	}
+
+#if	HPUXV>=900 && HPUXV<1000
+	Lf->lock = (char)islocked((KA_T)i.i_locklist);
+#endif	/* HPUXV>=900 && HPUXV<1000 */
+
+/*
+ * Get device and type for printing.
+ */
+	switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    dev = an.dev;
+	    devs = 1;
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+	case N_MVFS:
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    break;
+	case N_NFS:
+	    dev = vfs ? vfs->dev : 0;
+	    devs = 1;
+	    break;
+
+#if	HPUXV>=1000
+	case N_CDFS:
+	    dev = c.cd_dev;
+	    devs = 1;
+	    break;
+	case N_FIFO:
+	case N_PIPE:
+	    if (vfs && vfs->fsname) {
+		dev = vfs->dev;
+		devs = 1;
+	    } else if (vats && (dev_t)vat.va_fsid != NODEV) {
+		dev = (dev_t)vat.va_fsid;
+		devs = 1;
+	    } else
+		enter_dev_ch(print_kptr(va, (char *)NULL, 0));
+	    break;
+#endif	/* _HPUX>=1000 */
+
+#if	defined(HASVXFS)
+	case N_VXFS:
+	    /* obtained via read_vxnode */
+	    break;
+#endif	/* defined(HASVXFS) */
+
+	case N_SPEC:
+	default:
+
+#if	HPUXV>=800
+	    if (vfs && vfs->fsname) {
+		dev = vfs->dev;
+		devs = 1;
+	    } else if (ins) {
+		dev = i.i_dev;
+		devs = 1;
+	    }
+	    if ((v->v_type == VBLK) || (v->v_type == VCHR)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    }
+#else	/* HPUXV<800 */
+	    if (ins) {
+		dev = i.i_dev;
+		devs = 1;
+	    }
+	    if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    }
+#endif	/* HPUXV>=800 */
+
+	}
+	type = v->v_type;
+/*
+ * Obtain the inode number.
+ */
+	switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (an.ino_st) {
+		Lf->inode = (INODETYPE)an.inode;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+	case N_MVFS:
+	    Lf->inode = (INODETYPE)m.m_ino;
+	    Lf->inp_ty = 1;
+	    break;
+	case N_NFS:
+
+#if	HPUXV<1030
+	    Lf->inode = (INODETYPE)r.r_nfsattr.na_nodeid;
+#else	/* HPUXV>=1030 */
+	    Lf->inode = (INODETYPE)r.r_attr.va_nodeid;
+#endif	/* HPUXV<1030 */
+
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	HPUXV>=1000
+	case N_CDFS:
+	    Lf->inode = (INODETYPE)c.cd_num;
+	    Lf->inp_ty = 1;
+	    break;
+	case N_FIFO:
+	case N_PIPE:
+	    if (vats) {
+		Lf->inode = (INODETYPE)vat.va_nodeid;
+		Lf->inp_ty = 1;
+	    } else {
+		Lf->inode = (INODETYPE)v->v_nodeid;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* HPUXV>=1000 */
+
+#if	defined(HASVXFS)
+	case N_VXFS:
+	    /* set in read_vxnode() */
+	    break;
+#endif	/* defined(HASVXFS) */
+
+#if	HPUXV<1000
+	case N_FIFO:
+
+# if	HPUXV>=900
+	    if (rns) {
+		Lf->inode = (INODETYPE)r.r_nfsattr.na_nodeid;
+		Lf->inp_ty = 1;
+		break;
+	    }
+# endif	/* HPUXV>=900 */
+	    /* fall through */
+
+#endif	/* HPUXV<1000 */
+
+	case N_BLK:
+	case N_REGLR:
+	case N_SPEC:
+	    if (ins) {
+		Lf->inode = (INODETYPE)i.i_number;
+		Lf->inp_ty = 1;
+	    }
+	}
+
+#if	HPUXV>=1030
+/*
+ * Check for an HP-UX 10.30 and above stream.
+ */
+	if (v->v_stream) {
+	    KA_T ip, pcb;
+	    char *pn = (char *)NULL;
+
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    if (read_mi((KA_T)v->v_stream, &ip, &pcb, &pn))
+		return;
+	    if (ip && pcb) {
+		process_stream_sock(ip, pcb, pn, type);
+		return;
+	    }
+	    Lf->is_stream = 1;
+	}
+#endif	/* HPUXV>=1030 */
+
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->sz = (SZOFFTYPE)an.size;
+		Lf->sz_def = 1;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+#if	HPUXV>=1000
+	    case N_CDFS:
+		Lf->sz = (SZOFFTYPE)c.cd_cdc.cdc_size;
+		Lf->sz_def = 1;
+		break;
+	    case N_PIPE:
+		if (vats) {
+		    Lf->sz = (SZOFFTYPE)vat.va_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+#endif	/* HPUXV>=1000 */
+
+#if	HPUXV>=900
+	    case N_FIFO:
+
+# if	HPUXV<1000
+		if (ins) {
+		    rp = i.i_frptr;
+		    sz = (int)i.i_fifosize;
+		    wp = i.i_fwptr;
+		} else if (rns)
+		    Lf->sz = (SZOFFTYPE)r.r_nfsattr.na_size;
+# else	/* HPUXV>=1000 */
+		if (fns) {
+		    rp = f.fn_rptr;
+		    sz = f.fn_size;
+		    wp = f.fn_wptr;
+		}
+# endif	/* HPUXV<1000 */
+
+		if (Fsize || (Lf->access != 'r' && Lf->access != 'w')) {
+		    if (fns || ins) {
+			(void) snpf(fb, sizeof(fb), "rd=%#x; wr=%#x", rp, wp);
+			(void) enter_nma(fb);
+		    }
+		    if (fns || ins || rns) {
+			Lf->sz = (SZOFFTYPE)sz;
+			Lf->sz_def = 1;
+		    }
+		    break;
+		}
+		if (fns || ins) {
+		    Lf->off = (unsigned long)((Lf->access == 'r') ? rp
+								  : wp);
+		    (void) snpf(fb, sizeof(fb), "%s=%#x",
+			(Lf->access == 'r') ? "rd" : "wr",
+			(Lf->access == 'r') ?  rp  :  wp);
+		    (void) enter_nma(fb);
+		}
+		Lf->off_def = 1;
+		break;
+#endif	/* HPUXV>=900 */
+
+	    case N_MVFS:
+		/* The location of the file size isn't known. */
+		break;
+	    case N_NFS:
+
+#if	HPUXV<1030
+		Lf->sz = (SZOFFTYPE)r.r_nfsattr.na_size;
+#else	/* HPUXV>=1030 */
+		Lf->sz = (SZOFFTYPE)r.r_attr.va_size;
+#endif	/* HPUXV<1030 */
+
+		Lf->sz_def = 1;
+		break;
+
+#if	defined(HASVXFS)
+	    case N_VXFS:
+		/* set in read_vxnode() */
+		break;
+#endif	/* defined(HASVXFS) */
+
+	    case N_SPEC:
+	    case N_REGLR:
+		if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		else if (ins) {
+		    Lf->sz = (SZOFFTYPE)i.i_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+	    }
+	}
+/*
+ * Record link count.
+ */
+	if (Fnlink) {
+	    switch(Ntype) {
+
+# if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->nlink = an.nlink;
+		Lf->nlink_def = an.nlink_st;
+		break;
+# endif	/* defined(HAS_AFS) */
+
+	    case N_MVFS:
+		/* The location of the link count isn't known. */
+		break;
+	    case N_NFS:
+
+#if	HPUXV<1030
+		Lf->nlink = r.r_nfsattr.na_nlink;
+#else	/* HPUXV>=1030 */
+		Lf->nlink = r.r_attr.va_nlink;
+#endif	/* HPUXV<1030 */
+
+		Lf->nlink_def = 1;
+		break;
+
+# if	HPUXV>=1000
+	    case N_CDFS:		/* no link count? */
+		break;
+# endif	/* HPUXV>=1000 */
+
+	    case N_FIFO:
+	    case N_PIPE:
+
+# if	HPUXV>=1000
+		if (vats) {
+		    Lf->nlink = (long)vat.va_nlink;
+		    Lf->nlink_def = 1;
+		}
+# endif	/* HPUXV>=1000 */
+
+		break;
+
+# if	defined(HASVXFS)
+	    case N_VXFS:
+		/* set in read_vxnode() */
+		break;
+# endif	/* defined(HASVXFS) */
+
+	    case N_SPEC:
+	    default:
+		if (ins) {
+		    Lf->nlink = (long)i.i_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+	    }
+	    if (Nlink && Lf->nlink_def && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    Lf->fsdir = vfs->dir;
+	    Lf->fsdev = vfs->fsname;
+
+#if	defined(HASFSINO)
+	    Lf->fs_ino = vfs->fs_ino;
+#endif	/* defined(HASFSINO) */
+
+	}
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	Lf->dev = dev;
+	Lf->dev_def = devs;
+	Lf->rdev = rdev;
+	Lf->rdev_def = rdevs;
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	case VDIR:
+	    ty = (type == VREG) ? "VREG" : "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif	/* defined(VSOCK) */
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    switch (Ntype) {
+
+#if	HPUXV>=1000
+	    case N_FIFO:
+		ty = "FIFO";
+		break;
+	    case N_PIPE:
+		ty = "PIPE";
+		break;
+#endif	/* HPUXV>=1000 */
+
+	    default:
+		ty = "FIFO";
+	    }
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named((char *)NULL,
+				   ((type == VCHR) || (type == VBLK) ? 1 : 0)))
+	    Lf->sf |= SELNM;
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+
+/*
+ * readinode() - read inode
+ */
+
+static int
+readinode(ia, i)
+	KA_T ia;			/* inode kernel address */
+	struct inode *i;		/* inode buffer */
+{
+	if (kread((KA_T)ia, (char *)i, sizeof(struct inode))) {
+	    (void) snpf(Namech, Namechl, "can't read inode at %s",
+		print_kptr(ia, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nmn() - read node's mvfsnode
+ */
+
+static int
+read_nmn(na, ma, m)
+	KA_T na;                        /* containing node's address */
+	KA_T ma;                        /* kernel mvfsnode address */
+	struct mvfsnode *m;             /* mvfsnode receiver */
+{
+	char tbuf[32];
+
+	if (!ma || kread((KA_T)ma, (char *)m, sizeof(struct mvfsnode))) {
+	    (void) snpf(Namech, Namechl, "node at %s: can't read mvfsnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ma, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode1.c
new file mode 100644
index 0000000..d6af239
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode1.c
@@ -0,0 +1,157 @@
+/*
+ * dnode1.c - /dev/kmem-based HP-UX node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.11 2005/08/08 19:50:23 abe Exp $";
+#endif
+
+
+#if	defined(HASVXFS)
+
+# if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define _INO_T
+typedef int ino_t;
+#define _TIME_T
+typedef int time_t;
+# endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+#include "lsof.h"
+
+
+/*
+ * HP-UX versions below 10.20:
+ *
+ *    The pool_id_t type does not seem to be defined in the header  files
+ *    distributed by HP.  However, <sys/fs/vx_hpux.h> requires  it when
+ *    _KERNEL is defined.  So we fake the pool_id_t definition.
+ *
+ *    <sys/fs/vx_hpux.h> also requires sv_sema_t.  It's defined in
+ *    <sys/sem_alpha.h> when _KERNEL is defined, but some other header file has
+ *    already included <sys/sem_alpha.h> with _KERNEL undefined.  So we fake the
+ *    sv_sema_t definition.
+ *
+ * HP-UX version 10.20 and above:
+ *
+ *    The pool_id_t type is used by other header files for other purposes.
+ *    Redefine it for VXFS.  Delete some other conflicting definitions.
+ *    Don't #define _KERNEL.  Include a different set of VXFS header files.
+ */
+
+
+# if	HPUXV>=1020
+#undef	te_offset
+#undef	i_size
+#undef	di_size
+#define	pool_id_t	vx_pool_id_t
+
+#  if	HPUXV>=1030
+#define	ulong	vx_ulong		/* avoid <sys/stream.h> conflict */
+#  endif	/* HPUXV>=1030 */
+
+#include <sys/fs/vx_hpux.h>
+#include <sys/fs/vx_port.h>
+#include <sys/fs/vx_inode.h>
+
+#  if	HPUXV>=1030
+#undef	ulong
+#  endif	/* HPUXV>=1030 */
+
+# else	/* HPUXV<1020 */
+
+#define	pool_id_t	caddr_t
+#define	sv_sema_t	caddr_t
+#define	_KERNEL
+#include <sys/fs/vx_hpux.h>
+#include <sys/fs/vx_inode.h>
+#undef	_KERNEL
+# endif	/* HPUXV>=1020 */
+
+
+/*
+ * read_vxnode() - read Veritas file system inode information
+ */
+
+int
+read_vxnode(v, vfs, dev, devs, rdev, rdevs)
+	struct vnode *v;		/* local containing vnode */
+	struct l_vfs *vfs;		/* local vfs structure */
+	dev_t *dev;			/* device number receiver */
+	int *devs;			/* device status receiver */
+	dev_t *rdev;			/* raw device number receiver */
+	int *rdevs;			/* raw device status receiver */
+{
+	struct vx_inode i;
+
+	if (!v->v_data || kread((KA_T)v->v_data, (char *)&i, sizeof(i)))
+	    return(1);
+/*
+ * Return device numbers.
+ */
+	if (vfs && vfs->fsname)
+	    *dev = vfs->dev;
+	else
+	    *dev = i.i_dev;
+	*devs = 1;
+	if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+	    *rdev = v->v_rdev;
+	    *rdevs = 1;
+	}
+/*
+ * Record inode number.
+ */
+	Lf->inode = (INODETYPE)i.i_number;
+	Lf->inp_ty = 1;
+/*
+ * Record size.
+ */
+	if (Foffset || ((v->v_type == VCHR || v->v_type == VBLK) && !Fsize))
+	    Lf->off_def = 1;
+	else {
+	    Lf->sz = (SZOFFTYPE)i.i_size;
+	    Lf->sz_def = 1;
+	}
+/*
+ * Record link count.
+ */
+	if (Fnlink) {
+	    Lf->nlink = (long)i.i_nlink;
+	    Lf->nlink_def = 1;
+	    if (Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+	return(0);
+}
+#endif	/* defined(HASVXFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode2.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode2.c
new file mode 100644
index 0000000..3429831
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dnode2.c
@@ -0,0 +1,371 @@
+/*
+ * dnode2.c - /dev/kmem-based HP-UX AFS support
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode2.c,v 1.7 2005/08/08 19:50:23 abe Exp $";
+#endif
+
+#if	defined(HAS_AFS)
+
+# if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define _INO_T
+typedef int ino_t;
+#define _TIME_T
+typedef int time_t;
+# endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+#include "lsof.h"
+#include <afs/stds.h>
+#include <afs/param.h>
+#undef	__dontcare__
+#include <afs/afsint.h>
+#include <afs/vldbint.h>
+
+
+/*
+ * This is an emulation of the afs_rwlock_t definition that appears in
+ * the AFS sources in afs/lock.h.
+ */
+
+struct afs_lock {
+
+# if	HAS_AFS<304
+    unsigned long d1[1];
+# else	/* HAS_AFS>=304 */
+    unsigned long d1[6];
+# endif	/* HAS_AFS<304 */
+
+};
+typedef struct afs_lock afs_lock_t;
+typedef struct afs_lock afs_rwlock_t;
+
+#define	KERNEL
+#include <afs/afs.h>
+#undef	KERNEL
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct volume *getvolume,(struct VenusFid *f, int *vols));
+_PROTOTYPE(static int is_rootFid,(struct vcache *vc, int *rfid));
+
+
+/*
+ * alloc_vcache() - allocate space for vcache structure
+ */
+
+struct vnode *
+alloc_vcache()
+{
+	return((struct vnode *)malloc(sizeof(struct vcache)));
+}
+
+
+/*
+ * ckAFSsym() - check for missing X_AFS_* symbols in AFS name list file
+ */
+
+void
+ckAFSsym(nl)
+	struct nlist *nl;		/* copy of Nl[] when empty */
+{
+	char *path = AFSAPATHDEF;
+	int i;
+
+# if	defined(HASAOPT)
+	if (AFSApath)
+		path = AFSApath;
+# endif	/* defined(HASAOPT) */
+
+/*
+ * See if the alternate AFS name list file can be read.
+ */
+	if (!is_readable(path, 0)) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't access AFS name list file: %s\n",
+		    Pn, path);
+	    return;
+	}
+
+/*
+ * Read the AFS modload symbols and compare its non-zero values with
+ * the non-zero values in Nl[].  Quit if there is any mis-match.
+ */
+	if (nlist(path, nl) < 0)
+	    return;
+	for (i = 0; Nl[i].n_name && Nl[i].n_name[0]; i++) {
+	    if (!nl[i].n_value || !Nl[i].n_value)
+		continue;
+	    if (nl[i].n_value != Nl[i].n_value)
+		return;
+	}
+/*
+ * If any X_AFS_* symbol that doesn't have a value in Nl[] has one from
+ * the AFS modload file, copy its modload value to Nl[].
+ */
+	if (((i = get_Nl_value("arFid", Drive_Nl, NULL)) >= 0)
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+	if (((i = get_Nl_value("avops", Drive_Nl, NULL)) >= 0)
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+	if (((i = get_Nl_value("avol", Drive_Nl, NULL)) >= 0)
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+}
+
+
+/*
+ * getvolume() - get volume structure
+ */
+
+static struct volume *
+getvolume(f, vols)
+	struct VenusFid *f;		/* file ID pointer */
+	int *vols;			/* afs_volumes status return */
+{
+	int i;
+	static KA_T ka = 0;
+	KA_T kh;
+	static struct volume v;
+	struct volume *vp;
+	static int w = 0;
+
+	if (!ka) {
+	    if (get_Nl_value("avol", Drive_Nl, (unsigned long *)&ka) < 0
+	    ||  !ka) {
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: no afs_volumes kernel address\n", Pn);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		*vols = 0;
+		return((struct volume *)NULL);
+	    }
+	}
+	*vols = 1;
+	i = (NVOLS - 1) & f->Fid.Volume;
+	kh = (KA_T)((char *)ka + (i * sizeof(struct volume *)));
+	if (kread(kh, (char *)&vp, sizeof(vp)))
+	    return((struct volume *)NULL);
+	while (vp) {
+	    if (kread((KA_T)vp, (char *)&v, sizeof(v)))
+		return((struct volume *)NULL);
+	    if (v.volume == f->Fid.Volume && v.cell == f->Cell)
+		return(&v);
+	    vp = v.next;
+	}
+	return((struct volume *)NULL);
+}
+
+
+/*
+ * hasAFS() - test for AFS presence via vfs structure
+ */
+
+int
+hasAFS(vp)
+	struct vnode *vp;		/* vnode pointer */
+{
+	struct vfs v;
+/*
+ * If this vnode has a v_data pointer, then it probably isn't an AFS vnode;
+ * return FALSE.
+ *
+ * If the vfs struct address of /afs is known and this vnode's v_vfsp matches
+ * it, return TRUE.
+ *
+ * Read this vnode's vfs structure and its mount structure.  See if the file
+ * system name is AFS.  If it isn't, return FALSE.  If it is, save the vnode's
+ * v_vfsp as AFSVfsp and return TRUE.
+ */
+	if (AFSVfsp && !vp->v_data && vp->v_vfsp == AFSVfsp)
+	    return(1);
+	if (vp->v_data
+	||  !vp->v_vfsp
+	||  kread((KA_T)vp->v_vfsp, (char *)&v, sizeof(v))
+	||  v.vfs_data
+	||  strcmp(v.vfs_name, "AFS") != 0)
+	    return(0);
+	AFSVfsp = vp->v_vfsp;
+	return(1);
+}
+
+
+/*
+ * is_rootFid() - is the file ID the root file ID
+ *
+ * return: 0	= is not root file ID
+ *	   1	= is root file ID
+ *	   rfid = 0 if root file ID structure address not available
+ *		  1 if root file ID structure address available
+ */
+
+static int
+is_rootFid(vc, rfid)
+	struct vcache *vc;		/* vcache structure */
+	int *rfid;			/* root file ID pointer status return */
+{
+	char *err;
+	static int f = 0;		/* rootFID structure status:
+					 *     -1 = unavailable
+					 *	0 = not yet accessed
+					 *	1 = available */
+	static struct VenusFid r;
+	unsigned long v;
+	static int w = 0;
+
+	switch (f) {
+	case -1:
+	    if (vc->v.v_flag & VROOT) {
+		*rfid = 1;
+		return(1);
+	    }
+	    *rfid = 0;
+	    return(0);
+	case 0:
+	    if (get_Nl_value("arFid", Drive_Nl, &v) < 0 || !v) {
+		err = "no kernel address";
+
+rfid_unavailable:
+
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: AFS root Fid: %s\n", Pn, err);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		f = -1;
+		if (vc->v.v_flag & VROOT) {
+		    *rfid = 1;
+		    return(1);
+		}
+		*rfid = 0;
+		return(0);
+	    }
+	    if (kread((KA_T)v, (char *)&r, sizeof(r))) {
+		err = "can't read from kernel";
+		goto rfid_unavailable;
+	    }
+	    f = 1;
+	    /* fall through */
+	case 1:
+	    *rfid = 1;
+	    if (vc->fid.Fid.Unique == r.Fid.Unique
+	    &&  vc->fid.Fid.Vnode == r.Fid.Vnode
+	    &&  vc->fid.Fid.Volume == r.Fid.Volume
+	    &&  vc->fid.Cell == r.Cell)
+		return(1);
+	}
+	*rfid = 0;
+	return(0);
+}
+
+
+/*
+ * readafsnode() - read AFS node
+ */
+
+int
+readafsnode(va, v, an)
+	KA_T va;			/* kernel vnode address */
+	struct vnode *v;		/* vnode buffer pointer */
+	struct afsnode *an;		/* afsnode recipient */
+{
+	char *cp, tbuf[32];
+	KA_T ka;
+	int len, rfid, vols;
+	struct vcache *vc;
+	struct volume *vp;
+
+	cp = ((char *)v + sizeof(struct vnode));
+	ka = (KA_T)((char *)va + sizeof(struct vnode));
+	len = sizeof(struct vcache) - sizeof(struct vnode);
+	if (kread(ka, cp, len)) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %s: can't read vcache remainder from %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)ka, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(1);
+	}
+	vc = (struct vcache *)v;
+	an->dev = AFSDEV;
+	an->size = (unsigned long)vc->m.Length;
+	an->nlink = (long)vc->m.LinkCount;
+	an->nlink_st = 1;
+/*
+ * Manufacture the "inode" number.
+ */
+	if (vc->mvstat == 2) {
+	    if ((vp = getvolume(&vc->fid, &vols))) {
+		an->inode = (INODETYPE)(vp->mtpoint.Fid.Vnode +
+					(vp->mtpoint.Fid.Volume << 16));
+		if (an->inode == (INODETYPE)0) {
+		    if (is_rootFid(vc, &rfid))
+			an->ino_st = 1;
+		    else if (rfid) {
+			an->inode = (INODETYPE)2;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		} else
+		    an->ino_st = 1;
+	    } else {
+		if (vols) {
+		    an->inode = (INODETYPE)2;
+		    an->ino_st = 1;
+		} else {
+		    if (v->v_flag & VROOT) {
+			an->inode = (INODETYPE)0;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		}
+	    }
+	} else {
+	    an->inode = (INODETYPE)((vc->fid.Fid.Vnode
+		      +		    (vc->fid.Fid.Volume << 16))
+		      & 0x7fffffff);
+	    an->ino_st = 1;
+	}
+	return(0);
+}
+#endif	/* defined(HAS_AFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dproc.c
new file mode 100644
index 0000000..62ad048
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dproc.c
@@ -0,0 +1,842 @@
+/*
+ * dproc.c - /dev/kmem-based HP-UX process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.18 2008/10/08 13:24:36 abe Exp $";
+#endif
+
+#if	defined(HPUXKERNBITS)
+# if	HPUXKERNBITS>=64
+#define _INO_T
+typedef int ino_t;
+#define _TIME_T
+typedef int time_t;
+# else	/* HPUXKERNBITS<64 */
+#define	_RLIM_T
+#  if !defined(__STDC_32_MODE__)
+typedef unsigned long long rlim_t;
+#  else	/* defined(__STDC_32_MODE__) */
+typedef	unsigned long rlim_t;
+#  endif	/* !defined(__STDC_32_MODE__) */
+# endif	/* HPUXKERNBITS>=64 */
+#endif	/* defined(HPUXKERNBITS) */
+
+#include "lsof.h"
+
+#if     defined(HASNCACHE)
+#include <sys/dnlc.h>
+#endif  /* defined(HASNCACHE) */
+
+
+#if	HPUXV>=1010
+/*
+ * HP doesn't include a definition for the proc structure in HP-UX 10.10
+ * or above in an attempt to force use of pstat(2).  Unfortunately, pstat(2)
+ * doesn't return the information lsof needs.  Hence, this private proc
+ * structure definition.
+ */
+
+#include <sys/vas.h>
+
+#define	SZOMB	3
+
+# if	HPUXV<1020
+struct proc {
+	caddr_t d1[2];			/* dummy to occupy space */
+	caddr_t p_firstthreadp;		/* thread pointer */
+	caddr_t d2[4];			/* dummy to occupy space */
+	int p_stat;			/* process status */
+	caddr_t d3[9];			/* dummy to occupy space */
+	uid_t p_uid;			/* UID */
+	caddr_t d4[2];			/* dummy to occupy space */
+	gid_t p_pgid;			/* process group ID */
+	pid_t p_pid;			/* PID */
+	pid_t p_ppid;			/* parent PID */
+	caddr_t d5[9];			/* dummy to occupy space */
+	vas_t *p_vas;			/* virtual address space */
+	caddr_t d6[16];			/* dummy to occupy space */
+	int p_maxof;			/* max open files allowed */
+	struct vnode *p_cdir;		/* current directory */
+	struct vnode *p_rdir;		/* root directory */
+	struct ofile_t **p_ofilep;	/* file descriptor chunks */
+	caddr_t d7[43];			/* dummy to occupy space */
+};
+# endif	/* HPUXV<1020 */
+
+# if	HPUXV>=1020 && HPUXV<1030
+struct proc {
+	caddr_t d1[2];			/* dummy to occupy space */
+	caddr_t p_firstthreadp;		/* thread pointer */
+	caddr_t d2[6];			/* dummy to occupy space */
+	int p_stat;			/* process status */
+	caddr_t d3[14];			/* dummy to occupy space */
+	uid_t p_uid;			/* real UID */
+	uid_t p_suid;			/* effective UID */
+	caddr_t d4;			/* dummy to occupy space */
+	gid_t p_pgid;			/* process group ID */
+	pid_t p_pid;			/* PID */
+	pid_t p_ppid;			/* parent PID */
+	caddr_t d5[9];			/* dummy to occupy space */
+	vas_t *p_vas;			/* virtual address space */
+	caddr_t d6[16];			/* dummy to occupy space */
+	int p_maxof;			/* max open files allowed */
+	struct vnode *p_cdir;		/* current directory */
+	struct vnode *p_rdir;		/* root directory */
+	struct ofile_t **p_ofilep;	/* file descriptor chunks */
+	caddr_t d7[84];			/* dummy to occupy space */
+};
+# endif	/* HPUXV>=1020 && HPUXV<1030 */
+#endif	/* HPUXV<1010 */
+
+
+/*
+ * Local static values
+ */
+
+static KA_T Kp;				/* kernel's process table address */
+static int Np;				/* number of kernel processes */
+
+#if	HPUXV>=800
+static MALLOC_S Nva = 0;		/* number of entries allocated to
+					 * vnode address cache */
+static KA_T *Vp = (KA_T *)NULL;		/* vnode address cache */
+#endif	/* HPUXV>=800 */
+
+
+_PROTOTYPE(static void get_kernel_access,(void));
+
+#if	HPUXV>=800
+_PROTOTYPE(static void process_text,(KA_T vasp));
+#endif	/* HPUXV>=800 */
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	KA_T fp;
+	int err, i, j;
+
+#if	HPUXV>=1020 && HPUXV<1100
+	struct ofile_t {
+	    struct ofa {
+		KA_T ofile;
+		int d1;
+		int pofile;
+	    } ofa[SFDCHUNK];
+	};
+	struct ofa *ofap;
+	int ofasz = (int)sizeof(struct ofa);
+	struct ofile_t oft;
+	char *oftp = (char *)&oft;
+	int oftsz = (int)sizeof(struct ofile_t);
+#else	/* HPUXV<1020 || HPUXV>=1100 */
+# if	HPUXV>=1100
+	struct ofa {
+	    KA_T ofile;
+	    int d1;
+	    short d2;
+	    char d3;
+	    char pofile;
+	};
+	struct ofa *ofap;
+	int ofasz = (int)sizeof(struct ofa);
+	char *oftp = (char *)NULL;
+	int oftsz = (int)(sizeof(struct ofa) * SFDCHUNK);
+	KA_T v;
+# endif	/* HPUXV>=1100 */
+#endif	/* HPUXV>=1020 && HPUXV<1100 */
+
+#if	HPUXV>=800
+	char *c, *s;
+	KA_T pfp, ofp;
+
+#if	HPUXV<1020
+	struct ofile_t oft;
+	char *oftp = (char *)&oft;
+	int oftsz = (int)sizeof(struct ofile_t);
+#endif	/* HPUXV<1020 */
+
+	struct pst_status ps;
+
+# if	HPUXV<1010
+	struct user us;
+# else	/* HPUXV>=1010 */
+	struct user {
+		char u_comm[PST_CLEN];
+	} us;
+# endif	/* HPUXV<1010 */
+#else	/* HPUXV<800 */
+	int k;
+	long sw;
+	char us[U_SIZE];	/* must read HP-UX SWAP in DEV_BSIZE chunks */
+
+# if	defined(hp9000s300)
+	struct pte pte1, pte2;
+	KA_T pte_off, pte_addr;
+# endif	/* defined(hp9000s300) */
+#endif	/* HPUXV>=800 */
+
+	struct proc *p;
+	struct proc pbuf;
+	short pss, sf;
+	int px;
+	struct user *u;
+
+#if	defined(HASFSTRUCT)
+# if	HPUXV>=1020 || (HPUXV>=900 && HPUXV<1000)
+#define	USESPOFILE	1
+	long pof;
+# endif	/* HPUXV>=1020 || (HPUXV>=900 && HPUXV<1000) */
+#endif	/* defined(HASFSTRUCT) */
+
+#if	HPUXV>=1100
+/*
+ * Define FD chunk size and pointer for HP-UX >= 11.
+ */
+	if (!oftp) {
+	    if ((get_Nl_value("chunksz", Drive_Nl, &v) >= 0) && v) {
+		if (kread(v, (char *)&oftsz, sizeof(oftsz))) {
+		    (void) fprintf(stderr, "%s: can't get FD chunk size\n",
+			Pn);
+		    Exit(1);
+		}
+		if (!oftsz) {
+		    (void) fprintf(stderr, "%s: bad FD chunk size: %d\n",
+			Pn, oftsz);
+		    Exit(1);
+		}
+	    }
+	    ofasz = (int)(oftsz / SFDCHUNK);
+	    if (oftsz != (ofasz * SFDCHUNK)) {
+		(void) fprintf(stderr,
+		    "%s: FD chunk size (%d) not exact multiple of %d\n",
+		    Pn, oftsz, SFDCHUNK);
+		Exit(1);
+	    }
+	    if (!(oftp = (char *)malloc((MALLOC_S)oftsz))) {
+		(void) fprintf(stderr, "%s: no space for %d FD bytes\n",
+		    Pn, oftsz);
+		Exit(1);
+	    }
+	}
+#endif	/* HPUXV>=1100 */
+
+/*
+ * Examine proc structures and their associated information.
+ */
+
+#if	HPUXV>=800
+	u = &us;
+	(void) zeromem((char *)u, U_SIZE);
+	for (p = &pbuf, px = 0; px < Np; px++)
+#else	/* HPUXV<800 */
+	for (p = &pbuf, px = 0, u = (struct user *)us; px < Np; px++)
+#endif	/* HPUXV>=800 */
+
+	{
+	    Kpa = Kp + (KA_T)(px * sizeof(struct proc));
+	    if (kread(Kpa, (char *)&pbuf, sizeof(pbuf)))
+		continue;
+	    if (p->p_stat == 0 || p->p_stat == SZOMB)
+		continue;
+	/*
+	 * See if process is excluded.
+	 */
+	    if (is_proc_excl(p->p_pid, (int)p->p_pgid, (UID_ARG)p->p_uid,
+			     &pss, &sf))
+		continue;
+
+#if	HPUXV>=1010
+	/*
+	 * Save the kernel thread pointer.
+	 */
+	    Ktp = (KA_T)p->p_firstthreadp;
+#endif	/* HPUXV>=1010 */
+
+	/*
+	 * Read the user area.
+	 */
+
+#if	HPUXV>=800
+	/*
+	 * Use the pstat() syscall to read process status.
+	 */
+
+	    if (pstat(PSTAT_PROC, &ps, sizeof(ps), 0, p->p_pid) != 1) {
+	 	if (!Fwarn)
+		    (void) fprintf(stderr, "%s: can't pstat process %d: %s\n",
+			Pn, p->p_pid, strerror(errno));
+		continue;
+	    }
+	/*
+	 * Use the pst_cmd command buffer.
+	 */
+	    c = ps.pst_cmd;
+	    ps.pst_cmd[PST_CLEN - 1] = '\0';	/* paranoia */
+	/*
+	 * Skip to the last component of the first path name.  Also skip any
+	 * leading `-', signifying a login shell.  Copy the result to u_comm[].
+	 */
+	    if (*c == '-')
+		c++;
+	    for (s = c; *c && (*c != ' '); c++) {
+		if (*c == '/')
+		    s = c + 1;
+	    }
+	    for (i = 0; i < MAXCOMLEN; i++) {
+		if (*s == '\0' || *s == ' ' || *s == '/')
+		    break;
+		u->u_comm[i] = *s++;
+	    }
+	    u->u_comm[i] = '\0';
+#else	/* HPUXV<800 */
+	/*
+	 * Read the user area from the swap file or memory.
+	 */
+	    if ((p->p_flag & SLOAD) == 0) {
+
+	    /*
+	     * If the process is not loaded, read the user area from the swap
+	     * file.
+	     */
+		if (Swap < 0)
+		    continue;
+		sw = (long)p->p_swaddr;
+
+# if	defined(hp9000s800)
+	    sw += (long)ctod(btoc(STACKSIZE * NBPG));
+# endif	/* defined(hp9000s800) */
+
+		if (lseek(Swap, (off_t)dtob(sw), L_SET) == (off_t)-1
+		||  read(Swap, u, U_SIZE) != U_SIZE)
+		    continue;
+	    } else {
+
+	    /*
+	     * Read the user area via the page table.
+	     */
+
+# if	defined(hp9000s300)
+		pte_off = (KA_T) &Usrptmap[btokmx(p->p_p0br) + p->p_szpt - 1];
+		if (kread(pte_off, (char *)&pte1, sizeof(pte1)))
+		    continue;
+		pte_addr = (KA_T)(ctob(pte1.pg_pfnum + 1)
+			 - ((UPAGES + FLOAT) * sizeof(pte2)));
+		if (mread(pte_addr, (char *)&pte2, sizeof(pte2)))
+		    continue;
+		if (mread((KA_T)ctob(pte2.pg_pfnum), (char *)u,
+			  sizeof(struct user)))
+		    continue;
+# endif	/* defined(hp9000s300) */
+
+# if	defined(hp9000s800)
+	        if (kread((KA_T)uvadd((struct proc *)Kpa), (char *)u,
+			  sizeof(struct user)))
+		    continue;
+	    }
+# endif	/* defined(hp9000s800) */
+#endif	/* HPUXV>=800 */
+
+	/*
+	 * Allocate a local process structure.
+	 */
+	    if (is_cmd_excl(u->u_comm, &pss, &sf))
+		continue;
+	    alloc_lproc(p->p_pid, (int)p->p_pgid, (int)p->p_ppid,
+			(UID_ARG)p->p_uid, u->u_comm, (int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (CURDIR) {
+		alloc_lfile(CWD, -1);
+		process_node((KA_T)CURDIR);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (ROOTDIR) {
+		alloc_lfile(RTD, -1);
+		process_node((KA_T)ROOTDIR);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+
+#if	HPUXV>=800
+	/*
+	 * Print information on the text file.
+	 */
+	    if (p->p_vas)
+		process_text((KA_T)p->p_vas);
+#endif	/* HPUXV>=800 */
+
+	/*
+	 * Loop through user's files.
+	 */
+
+#if	HPUXV>=800
+	    for (i = 0, j = SFDCHUNK, pfp = (KA_T)p->p_ofilep;
+		 i < p->p_maxof;
+		 i++)
+#else	/* HPUXV<800 */
+	    for (i = j = k = 0;; i++)
+#endif	/* HPUXV>=800 */
+
+	    {
+
+#if	HPUXV>=800
+		if (j >= SFDCHUNK) {
+		    if (!pfp || kread((KA_T)pfp, (char *)&ofp, sizeof(ofp))
+		    ||  !ofp || kread((KA_T)ofp, oftp, oftsz))
+			break;
+		    j = 0;
+		    pfp += sizeof(KA_T);
+
+# if	HPUXV>=1020
+		    ofap = (struct ofa *)oftp;
+# endif	/* HPUXV>=1020 */
+
+		}
+		j++;
+
+# if	HPUXV>=1020
+#  if	defined(USESPOFILE)
+		pof = (long)ofap->pofile;
+#  endif	/* defined(USESPOFILE) */
+
+		fp = (KA_T)ofap->ofile;
+		ofap = (struct ofa *)((char *)ofap + ofasz);
+		if (fp)
+# else	/* HPUXV<1020 */
+#  if	defined(USESPOFILE)
+		pof = (long)oft.pofile[j - 1];
+#  endif	/* defined(USESPOFILE) */
+
+		if ((fp = (KA_T)oft.ofile[j - 1]))
+# endif	/* HPUXV>=1020 */
+#else	/* HPUXV<800 */
+		if (j >= SFDCHUNK) {
+
+		/*
+		 * Get next file pointer "chunk".
+		 */
+		    while (++k < NFDCHUNKS && !u->u_ofilep[k])
+			;
+		    if (k >= NFDCHUNKS)
+			break;
+		    if (kread((KA_T)u->u_ofilep[k], (char *)&u->u_ofile,
+			      sizeof(struct ofile_t)))
+		    {
+			break;
+		    }
+		    j = 0;
+		}
+		j++;
+		if ((fp = (KA_T)u->u_ofile.ofile[j - 1]))
+#endif	/* HPUXV>=800 */
+
+		/*
+		 * Process the file pointer.
+		 */
+
+		{
+		    alloc_lfile(NULL, i);
+		    process_file(fp);
+		    if (Lf->sf) {
+
+#if	defined(USESPOFILE)
+			if (Fsv & FSV_FG)
+			    Lf->pof = pof;
+#endif	/* defined(USESPOFILE) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - access the required information in the kernel
+ */
+
+static void
+get_kernel_access()
+{
+	KA_T v;
+/*
+ * Check the kernel version.
+ */
+	(void) ckkv("HP-UX", LSOF_VSTR, (char *)NULL, (char *)NULL);
+
+#if	HPUXV>=1030
+/*
+ * See if build and run bit sizes match.  Exit if they don't.
+ */
+	{
+	    long rv;
+
+	    if ((rv = sysconf(_SC_KERNEL_BITS)) < 0) {
+		(void) fprintf(stderr,
+		    "%s: sysconf(_SC_KERNEL_BITS) returns: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+	    if (rv != (long)HPUXKERNBITS) {
+		(void) fprintf(stderr,
+		    "%s: FATAL: %s was built for a %d bit kernel, but this\n",
+		    Pn, Pn, HPUXKERNBITS);
+		(void) fprintf(stderr, "      is a %ld bit kernel.\n", rv);
+		Exit(1);
+	    }
+	}
+#endif	/* HPUXV>=1030 */
+
+#if	defined(HAS_AFS)
+	struct NLIST_TYPE *nl = (struct NLIST_TYPE *)NULL;
+#endif	/* defined(HAS_AFS) */
+
+#if	HPUXV<800
+/*
+ * Open access to /dev/mem and SWAP.
+ */
+	if ((Mem = open("/dev/mem", O_RDONLY, 0)) < 0) {
+	    (void) fprintf(stderr, "%s: can't open /dev/mem: %s\n",
+		Pn, strerror(errno));
+	    err = 1;
+	}
+	if (!Memory || strcmp(Memory, KMEM) == 0) {
+	    if ((Swap = open(SWAP, O_RDONLY, 0)) < 0) {
+		(void) fprintf(stderr, "%s: %s: %s\n",
+		    Pn, SWAP, strerror(errno));
+		err = 1;
+	    }
+	}
+#endif	/* HPUXV<800 */
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open kernel memory access.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0) {
+	    int errno_save = errno;
+
+	    (void) fprintf(stderr, "%s: can't open ", Pn);
+	    safestrprt(Memory ? Memory : KMEM, stderr, 0);
+	    (void) fprintf(stderr, ": %s\n", strerror(errno_save));
+	    Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the name list file is readable.
+ */
+	if (Nmlst && !is_readable(Nmlst, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+	(void) build_Nl(Drive_Nl);
+
+#if	defined(HAS_AFS)
+	if (!Nmlst) {
+
+	/*
+	 * If AFS is defined and we're getting kernel symbol values from
+	 * from N_UNIX, make a copy of Nl[] for possible use with the AFS
+	 * module name list file.
+	 */
+	    if (!(nl = (struct NLIST_TYPE *)malloc(Nll))) {
+		(void) fprintf(stderr,
+		    "%s: no space (%d) for Nl[] copy\n", Pn, Nll);
+		Exit(1);
+	    }
+	    (void) memcpy((void *)nl, (void *)Nl, (size_t)Nll);
+	}
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Access kernel symbols.
+ */
+	if (NLIST_TYPE(Nmlst ? Nmlst : N_UNIX, Nl) < 0) {
+	    (void) fprintf(stderr, "%s: can't read namelist from: ", Pn);
+	    safestrprt(Nmlst ? Nmlst : N_UNIX, stderr, 1);
+            Exit(1);
+	}
+	if (get_Nl_value("proc", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&Kp, sizeof(Kp))
+	||  get_Nl_value("nproc", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&Np, sizeof(Np))
+	||  !Kp || Np < 1) {
+	    (void) fprintf(stderr, "%s: can't read proc table info\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("vfops", Drive_Nl, (KA_T *)&Vnfops) < 0)
+	    Vnfops = (KA_T)NULL;
+
+#if	HPUXV<800 && defined(hp9000s300)
+	if (get_Nl_value("upmap", Drive_Nl, (unsigned long *)&Usrptmap) < 0) {
+	    (void) fprintf(stderr, "%s: can't get kernel's Usrptmap\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("upt", Drive_Nl, (unsigned long *)&usrpt) < 0) {
+	    (void) fprintf(stderr, "%s: can't get kernel's usrpt\n", Pn);
+	    Exit(1);
+	}
+#endif	/* HPUXV<800 && defined(hp9000s300) */
+
+#if	HPUXV<800 && defined(hp9000s800)
+	proc = (struct proc *)Kp;
+	if (get_Nl_value("ubase", Drive_Nl, (unsigned long *)&ubase) < 0) {
+	    (void) fprintf(stderr, "%s: can't get kernel's ubase\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("npids", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&npids, sizeof(npids))) {
+	    (void) fprintf(stderr, "%s: can't get kernel's npids\n", Pn);
+	    Exit(1);
+	}
+#endif	/* HPUXV<800 && defined(hp9000s800) */
+
+#if	HPUXV>=1030
+	if (get_Nl_value("clmaj", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&CloneMaj, sizeof(CloneMaj)))
+	    HaveCloneMaj = 0;
+	else
+	    HaveCloneMaj = 1;
+#endif	/* HPUXV>=1030 */
+
+#if	defined(HAS_AFS)
+	if (nl) {
+
+	/*
+	 * If AFS is defined and we're getting kernel symbol values from
+	 * N_UNIX, and if any X_AFS_* symbols isn't there, see if it is in the
+	 * the AFS module name list file.  Make sure that other symbols that
+	 * appear in both name list files have the same values.
+	 */
+	    if ((get_Nl_value("arFid", Drive_Nl, &v) >= 0 && !v)
+	    ||  (get_Nl_value("avops", Drive_Nl, &v) >= 0 && !v)
+	    ||  (get_Nl_value("avol", Drive_Nl, &v) >= 0 && !v))
+		(void) ckAFSsym(nl);
+	    (void) free((FREE_P *)nl);
+	}
+#endif	/* defined(HAS_AFS) */
+
+}
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	if (lseek(Kd, (off_t)addr, L_SET) == (off_t)-1L)
+	    return(-1);
+	br = read(Kd, buf, len);
+	return((br == len) ? 0 : 1);
+}
+
+
+#if	HPUXV<800
+/*
+ * mread() -- read from /dev/mem
+ */
+
+static int
+mread(addr, buf, len)
+	KA_T addr;			/* /dev/mem address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	if (lseek(Mem, addr, L_SET) == (off_t)-1L)
+	    return(1);
+	br = read(Mem, buf, len);
+	return((br == len) ? 0 : 1);
+}
+#endif	/* HPUXV<800 */
+
+
+#if	HPUXV>=800
+/*
+ * process_text() - process text access information
+ */
+
+static void
+process_text(vasp)
+	KA_T vasp;			/* kernel's virtual address space
+					 * pointer */
+{
+	char fd[FDLEN];
+	int i, j, lm;
+	MALLOC_S len;
+	struct pregion p;
+	KA_T prp;
+	struct region r;
+	struct vas v;
+	KA_T va;
+/*
+ * Read virtual address space pointer.
+ */
+	if (kread(vasp, (char *)&v, sizeof(v)))
+	    return;
+/*
+ * Follow the virtual address space pregion structure chain.
+ */
+	for (i = lm = 0, prp = (KA_T)v.va_next;
+	     prp != vasp;
+	     prp = (KA_T)p.p_next, lm++)
+	{
+
+	/*
+	 * Avoid infinite loop.
+	 */
+	    if (lm > 1000) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: too many virtual address regions for PID %d\n",
+			Pn, Lp->pid);
+		return;
+	    }
+	/*
+	 * Read the pregion and region.
+	 */
+	    if (kread(prp, (char *)&p, sizeof(p)))
+		return;
+	    if (kread((KA_T)p.p_reg, (char *)&r, sizeof(r)))
+		return;
+	/*
+	 * Skip file entries with no file pointers.
+	 */
+	    if (!(va = (KA_T)r.r_fstore))
+		continue;
+	/*
+	 * Skip entries whose vnodes have already been displayed.
+	 *
+	 *  Record new, unique vnode pointers.
+	 */
+	    for (j = 0; j < i; j++) {
+		if (Vp[j] == va)
+		    break;
+	    }
+	    if (j < i)
+		continue;
+	    if (i >= Nva) {
+		Nva += 10;
+		len = (MALLOC_S)(Nva * sizeof(KA_T));
+		if (!Vp)
+		    Vp = (KA_T *)malloc(len);
+		else
+		    Vp = (KA_T *)realloc((MALLOC_P *)Vp, len);
+		if (!Vp) {
+		    (void) fprintf(stderr,
+			"%s: no more space for text vnode pointers\n", Pn);
+		    Exit(1);
+		}
+	    }
+	    Vp[i++] = va;
+	/*
+	 * Allocate local file structure.
+	 */
+	    switch (p.p_type) {
+	    case PT_DATA:
+	    case PT_TEXT:
+		alloc_lfile(" txt", -1);
+		break;
+	    case PT_MMAP:
+		alloc_lfile(" mem", -1);
+		break;
+	    default:
+		(void) snpf(fd, sizeof(fd), "R%02d", p.p_type);
+		alloc_lfile(fd, -1);
+	    }
+	/*
+	 * Save vnode information.
+	 */
+	    process_node(va);
+	    if (Lf->sf)
+		link_lfile();
+	}
+}
+#endif	/* HPUXV>=800 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dproto.h
new file mode 100644
index 0000000..097ea23
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dproto.h
@@ -0,0 +1,69 @@
+/*
+ * dproto.h - /dev/kmem-based HP-UX function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.7 2000/12/04 14:26:14 abe Exp $
+ */
+
+
+#if	HPUXV>=800
+_PROTOTYPE(extern void completevfs,(struct l_vfs *vfs, dev_t *dev, struct vfs *v));
+#else
+_PROTOTYPE(extern void completevfs,(struct l_vfs *vfs, dev_t *dev));
+#endif	/* HPUXV>=800 */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern int get_max_fd,(void));
+
+#if	defined(DTYPE_LLA)
+_PROTOTYPE(extern void process_lla,(KA_T la));
+#endif
+
+_PROTOTYPE(extern struct l_vfs *readvfs,(struct vnode *lv));
+
+#if	HPUXV>=1030
+_PROTOTYPE(extern void process_stream_sock,(KA_T ip, KA_T pcb, char *pn, enum vtype vt));
+_PROTOTYPE(extern int read_mi,(KA_T sh, KA_T *ip, KA_T *pcb, char **pn));
+#endif	/* HPUXV>=1030 */
+
+#if     defined(HAS_AFS)
+_PROTOTYPE(extern struct vnode *alloc_vcache,(void));
+_PROTOTYPE(extern void ckAFSsym,(struct nlist *nl));
+_PROTOTYPE(extern int hasAFS,(struct vnode *vp));
+_PROTOTYPE(extern int readafsnode,(KA_T va, struct vnode *v, struct afsnode *an));
+#endif  /* defined(HAS_AFS) */
+
+#if	defined(HASVXFS)
+_PROTOTYPE(extern int read_vxnode,(struct vnode *v, struct l_vfs *vfs, dev_t *dev, int *devs, dev_t *rdev, int *rdevs));
+#endif	/* defined(HASVXFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dsock.c
new file mode 100644
index 0000000..fc54f83
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dsock.c
@@ -0,0 +1,1170 @@
+/*
+ * dsock.c - /dev/kmem-based HP-UX socket processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.20 2005/08/08 19:50:23 abe Exp $";
+#endif
+
+#if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define _INO_T
+typedef int ino_t;
+#define _TIME_T
+typedef int time_t;
+#endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+#include "lsof.h"
+
+#if     HPUXV>=800 && defined(HPUX_CCITT)
+#include <x25/x25addrstr.h>
+#include <x25/x25stat.h>
+#include <x25/x25str.h>
+#include <x25/x25config.h>
+#include <x25/x25L3.h>
+#endif	/* HPUXV>=800 && defined(HPUX_CCITT) */
+
+
+/*
+ * Local definitions
+ */
+
+#if	defined(HASTCPOPT)
+#define	TF_NODELAY	0x1		/* TCP_NODELAY (Nagle algorithm) */
+#endif	/* defined(HASTCPOPT) */
+
+
+#if	HPUXV>=1030
+/*
+ * print_tcptpi() - print TCP/TPI info
+ */
+
+void
+print_tcptpi(nl)
+	int nl;				/* 1 == '\n' required */
+{
+	char *cp = (char *)NULL;
+	char  sbuf[128];
+	int i, t;
+	int ps = 0;
+	unsigned int u;
+
+	if (Ftcptpi & TCPTPI_STATE) {
+	    switch ((t = Lf->lts.type)) {
+	    case 0:				/* TCP */
+		switch ((i = Lf->lts.state.i)) {
+		case TCPS_CLOSED:
+		    cp = "CLOSED";
+		    break;
+		case TCPS_IDLE:
+		    cp = "IDLE";
+		    break;
+		case TCPS_BOUND:
+		    cp = "BOUND";
+		    break;
+		case TCPS_LISTEN:
+		    cp = "LISTEN";
+		    break;
+		case TCPS_SYN_SENT:
+		    cp = "SYN_SENT";
+		    break;
+		case TCPS_SYN_RCVD:
+		    cp = "SYN_RCVD";
+		    break;
+		case TCPS_ESTABLISHED:
+		    cp = "ESTABLISHED";
+		    break;
+		case TCPS_CLOSE_WAIT:
+		    cp = "CLOSE_WAIT";
+		    break;
+		case TCPS_FIN_WAIT_1:
+		    cp = "FIN_WAIT_1";
+		    break;
+		case TCPS_CLOSING:
+		    cp = "CLOSING";
+		    break;
+		case TCPS_LAST_ACK:
+		    cp = "LAST_ACK";
+		    break;
+		case TCPS_FIN_WAIT_2:
+		    cp = "FIN_WAIT_2";
+		    break;
+		case TCPS_TIME_WAIT:
+		    cp = "TIME_WAIT";
+		    break;
+		default:
+		    (void) snpf(sbuf, sizeof(sbuf), "UknownState_%d", i);
+		    cp = sbuf;
+		}
+		break;
+	    case 1:				/* TPI */
+		switch ((u = Lf->lts.state.ui)) {
+		case TS_UNINIT:
+		    cp = "Uninitialized";
+		    break;
+		case TS_UNBND:
+		    cp = "Unbound";
+		    break;
+		case TS_WACK_BREQ:
+		    cp = "Wait_BIND_REQ_Ack";
+		    break;
+		case TS_WACK_UREQ:
+		    cp = "Wait_UNBIND_REQ_Ack";
+		    break;
+		case TS_IDLE:
+		    cp = "Idle";
+		    break;
+		case TS_WACK_OPTREQ:
+		    cp = "Wait_OPT_REQ_Ack";
+		    break;
+		case TS_WACK_CREQ:
+		    cp = "Wait_CONN_REQ_Ack";
+		    break;
+		case TS_WCON_CREQ:
+		    cp = "Wait_CONN_REQ_Confirm";
+		    break;
+		case TS_WRES_CIND:
+		    cp = "Wait_CONN_IND_Response";
+		    break;
+		case TS_WACK_CRES:
+		    cp = "Wait_CONN_RES_Ack";
+		    break;
+		case TS_DATA_XFER:
+		    cp = "Wait_Data_Xfr";
+		    break;
+		case TS_WIND_ORDREL:
+		    cp = "Wait_Read_Release";
+		    break;
+		case TS_WREQ_ORDREL:
+		    cp = "Wait_Write_Release";
+		    break;
+		case TS_WACK_DREQ6:
+		case TS_WACK_DREQ7:
+		case TS_WACK_DREQ9:
+		case TS_WACK_DREQ10:
+		case TS_WACK_DREQ11:
+		    cp = "Wait_DISCON_REQ_Ack";
+		    break;
+		case TS_WACK_ORDREL:
+		    cp = "Internal";
+		    break;
+		default:
+		    (void) snpf(sbuf, sizeof(sbuf), "UNKNOWN_TPI_STATE_%u", u);
+		    cp = sbuf;
+		}
+	    }
+	    if (Ffield)
+		(void) printf("%cST=%s%c", LSOF_FID_TCPTPI, cp, Terminator);
+	    else {
+		putchar('(');
+		(void) fputs(cp, stdout);
+	    }
+	    ps++;
+	}
+
+# if	defined(HASTCPTPIQ)
+	if (Ftcptpi & TCPTPI_QUEUES) {
+	    if (Lf->lts.rqs) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QR=%lu", Lf->lts.rq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.sqs) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QS=%lu", Lf->lts.sq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+# endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int opt;
+
+	    if ((opt = Lf->lts.opt)
+	    ||  Lf->lts.qlens || Lf->lts.qlims || Lf->lts.rbszs || Lf->lts.sbsz
+	    ) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSO", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(SO_BROADCAST)
+		if (opt & SO_BROADCAST) {
+		    (void) printf("%cBROADCAST", sep);
+		    opt &= ~SO_BROADCAST;
+		    sep = ',';
+		}
+# endif	/* defined(SO_BROADCAST) */
+
+# if	defined(SO_DEBUG)
+		if (opt & SO_DEBUG) {
+		    (void) printf("%cDEBUG", sep);
+		    opt &= ~ SO_DEBUG;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DEBUG) */
+
+# if	defined(SO_DONTROUTE)
+		if (opt & SO_DONTROUTE) {
+		    (void) printf("%cDONTROUTE", sep);
+		    opt &= ~SO_DONTROUTE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DONTROUTE) */
+
+# if	defined(SO_KEEPALIVE)
+		if (opt & SO_KEEPALIVE) {
+		    (void) printf("%cKEEPALIVE", sep);
+		    if (Lf->lts.kai)
+			(void) printf("=%d", Lf->lts.kai);
+		    opt &= ~SO_KEEPALIVE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_KEEPALIVE) */
+
+# if	defined(SO_LINGER)
+		if (opt & SO_LINGER) {
+		    (void) printf("%cLINGER", sep);
+		    if (Lf->lts.ltm)
+			(void) printf("=%d", Lf->lts.ltm);
+		    opt &= ~SO_LINGER;
+		    sep = ',';
+		}
+# endif	/* defined(SO_LINGER) */
+
+# if	defined(SO_OOBINLINE)
+		if (opt & SO_OOBINLINE) {
+		    (void) printf("%cOOBINLINE", sep);
+		    opt &= ~SO_OOBINLINE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_OOBINLINE) */
+
+		if (Lf->lts.qlens) {
+		    (void) printf("%cQLEN=%u", sep, Lf->lts.qlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlims) {
+		    (void) printf("%cQLIM=%u", sep, Lf->lts.qlim);
+		    sep = ',';
+		}
+
+# if	defined(SO_REUSEADDR)
+		if (opt & SO_REUSEADDR) {
+		    (void) printf("%cREUSEADDR", sep);
+		    opt &= ~SO_REUSEADDR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEADDR) */
+
+# if	defined(SO_REUSEPORT)
+		if (opt & SO_REUSEPORT) {
+		    (void) printf("%cREUSEPORT", sep);
+		    opt &= ~SO_REUSEPORT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEPORT) */
+
+# if	defined(SO_USELOOPBACK)
+		if (opt & SO_USELOOPBACK) {
+		    (void) printf("%cUSELOOPBACK", sep);
+		    opt &= ~SO_USELOOPBACK;
+		    sep = ',';
+		}
+# endif	/* defined(SO_USELOOPBACK) */
+
+		if (opt)
+		    (void) printf("%cUNKNOWN=%#x", sep, opt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int topt;
+
+	    if ((topt = Lf->lts.topt) || Lf->lts.msss) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cTF", sep);
+		ps++;
+		sep = '=';
+
+		if (Lf->lts.msss) {
+		    (void) printf("%cMSS=%lu", sep, Lf->lts.mss);
+		    sep = ',';
+		}
+
+#  if	defined(TF_NODELAY)
+		if (topt & TF_NODELAY) {
+		    (void) printf("%cNODELAY", sep);
+		    topt &= ~TF_NODELAY;
+		    sep = ',';
+		}
+#  endif	/* defined(TF_NODELAY) */
+
+		if (topt)
+		    (void) printf("%cUNKNOWN=%#x", sep, topt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+# endif	/* defined(HASTCPOPT) */
+
+# if	defined(HASTCPTPIW)
+	if (Ftcptpi & TCPTPI_WINDOWS) {
+	    if (Lf->lts.rws) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WR=%lu", Lf->lts.rw);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.wws) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WW=%lu", Lf->lts.ww);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+# endif	/* defined(HASTCPTPIW) */
+
+	if (Ftcptpi && !Ffield && ps)
+	    putchar(')');
+	if (nl)
+	    putchar('\n');
+}
+#endif	/* HPUXV>=1030 */
+
+
+#if	defined(DTYPE_LLA)
+/*
+ * process_lla() - process link level access socket file
+ */
+
+void
+process_lla(la)
+	KA_T la;			/* link level CB address in kernel */
+{
+	char *ep;
+	struct lla_cb lcb;
+	size_t sz;
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "lla");
+	Lf->inp_ty = 2;
+	enter_dev_ch(print_kptr(la, (char *)NULL, 0));
+/*
+ * Read link level access control block.
+ */
+	if (!la || kread((KA_T)la, (char *)&lcb, sizeof(lcb))) {
+	    (void) snpf(Namech, Namechl, "can't read LLA CB (%s)",
+		print_kptr(la, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Determine access mode.
+ */
+	if ((lcb.lla_flags & LLA_FWRITE | LLA_FREAD) == LLA_FWRITE)
+	    Lf->access = 'w';
+	else if ((lcb.lla_flags & LLA_FWRITE | LLA_FREAD) == LLA_FREAD)
+	    Lf->access = 'r';
+	else if (lcb.lla_flags & LLA_FWRITE | LLA_FREAD)
+	    Lf->access = 'u';
+/*
+ * Determine the open mode, if possible.
+ */
+	if (lcb.lla_flags & LLA_IS_ETHER)
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "Ether");
+	else if (lcb.lla_flags & (LLA_IS_8025|LLA_IS_SNAP8025|LLA_IS_FA8025)) {
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "802.5");
+	    if (lcb.lla_flags & LLA_IS_SNAP8025)
+		(void) snpf(Namech, Namechl, "SNAP");
+	    else if (lcb.lla_flags & LLA_IS_FA8025)
+		(void) snpf(Namech, Namechl, "function address");
+	}
+/*
+ * Add any significant flags.
+ */
+	if (lcb.lla_flags & ~(LLA_FWRITE | LLA_FREAD)) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%s(flags = %#x)",
+		(ep == Namech) ? "" : " ",
+		lcb.lla_flags);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+#endif	/* DTYPE_LLA */
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	unsigned char *fa = (unsigned char *)NULL;
+	char *ep, tbuf[32];
+	int fam;
+	int fp, mbl, lp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct protosw p;
+	struct socket s;
+	size_t sz;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = (struct sockaddr_un *)NULL;
+	struct sockaddr_un un;
+
+#if	HPUXV>=800
+	struct domain d;
+
+# if	defined(HPUX_CCITT)
+	int i;
+	struct x25pcb xp;
+	struct x25pcb_extension xpe;
+# endif	/* defined(HPUX_CCITT) */
+
+# if	HPUXV<1030
+	struct mbuf mb;
+	struct inpcb inp;
+	struct rawcb raw;
+	struct tcpcb t;
+# else	/* HPUXV>=1030 */
+	struct datab db;
+	static char *dbf = (char *)NULL;
+	static int dbl = 0;
+	struct msgb mb;
+	struct sockbuf rb, sb;
+# endif	/* HPUXV<1030 */
+#endif	/* HPUXV>=800 */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read socket structure.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread((KA_T) sa, (char *) &s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket struct from %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Read protocol switch and domain structure (HP-UX 8 and above).
+ */
+	if (!s.so_type) {
+	    (void) snpf(Namech, Namechl, "no socket type");
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_proto
+	||  kread((KA_T) s.so_proto, (char *) &p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "no protocol switch");
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	HPUXV>=800
+	if (kread((KA_T) p.pr_domain, (char *) &d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+#endif	/* HPUXV>=800 */
+
+#if	HPUXV<1030
+/*
+ * Save size information for HP-UX < 10.30.
+ */
+ 	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+# if	defined(HASTCPTPIQ)
+	Lf->lts.rq = s.so_rcv.sb_cc;
+	Lf->lts.sq = s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+# endif	/* defined(HASTCPTPIQ) */
+#endif	/* HPUXV<1030 */
+
+/*
+ * Process socket by the associated domain family.
+ */
+
+#if	HPUXV>=800
+	switch ((fam = d.dom_family))
+#else	/* HPUXV<800 */
+	switch ((fam = p.pr_family))
+#endif	/* HPUXV>=800 */
+
+	{
+
+#if	HPUXV>=800 && HPUXV<1030 && defined(HPUX_CCITT)
+/*
+ * Process an HP-UX [89].x CCITT X25 domain socket.
+ */
+	case AF_CCITT:
+	    if (Fnet)
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "x.25");
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL,
+		"CCITT");
+	/*
+	 * Get the X25 PCB and its extension.
+	 */
+	    if (!s.so_pcb
+	    ||  kread((KA_T)s.so_pcb, (char *)&xp, sizeof(xp))) {
+		(void) snpf(Namech, Namechl, "can't read x.25 pcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    enter_dev_ch(print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+	    if (!xp.x25pcb_extend
+	    ||  kread((KA_T)xp.x25pcb_extend, (char *)&xpe, sizeof(xpe))) {
+		(void) snpf(Namech, Namechl,
+		    "can't read x.25 pcb (%s) extension at %s",
+		    print_kptr((KA_T)s.so_pcb, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)xp.x25pcb_extend, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Format local address.
+	 */
+	    for (i = 0; i < xpe.x25pcbx_local_addr.x25hostlen/2; i++) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "%02x", xpe.x25pcbx_local_addr.x25_host[i]);
+	    }
+	    if (i*2 != xpe.x25pcbx_local_addr.x25hostlen) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "%01x",
+		    xpe.x25pcbx_local_addr.x25_host[i] >> 4);
+	    }
+	/*
+	 * Display the virtual connection number, if it's defined.
+	 */
+	    if (xp.x25pcb_vcn >= 0) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, ":%d", xp.x25pcb_vcn + 1);
+	    }
+	/*
+	 * Format peer address, if there is one.
+	 */
+	    if (xpe.x25pcbx_peer_addr.x25hostlen > 0) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "->");
+		for (i = 0; i < xpe.x25pcbx_peer_addr.x25hostlen/2; i++) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, "%02x",
+			xpe.x25pcbx_peer_addr.x25_host[i]);
+		}
+		if (i*2 != xpe.x25pcbx_peer_addr.x25hostlen) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, "%01x",
+			xpe.x25pcbx_peer_addr.x25_host[i] >> 4);
+		}
+	    }
+	    enter_nm(Namech);
+	    break;
+#endif	/* HPUXV>=800 && HPUXV<1030 && defined(HPUX_CCITT) */
+
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+	    if (Fnet)
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+	    printiproto(p.pr_protocol);
+
+#if	HPUXV>=1030
+	/*
+	 * Handle HP-UX 10.30 and above socket streams.
+	 */
+	    if (s.so_sth) {
+
+		KA_T ip, pcb;
+		char *pn = (char *)NULL;
+	    /*
+	     * Read module information.
+	     */
+		if (read_mi((KA_T)s.so_sth, &ip, &pcb, &pn))
+		    return;
+		if (ip && pcb) {
+
+		/*
+		 * If IP and TCP or UDP modules are present, process as a
+		 * stream socket.
+		 */
+		    process_stream_sock(ip, pcb, pn, VNON);
+		    return;
+		}
+	    /*
+	     * If an IP module's PCB address is present, print it as the
+	     * device characters.
+	     */
+
+		if (ip && !Lf->dev_def)
+		    enter_dev_ch(print_kptr(ip, (char *)NULL, 0));
+		if (!strlen(Namech)) {
+
+		/*
+		 * If there are no NAME field characters, enter an error
+		 * message.
+		 */
+		    if (!ip) {
+			(void) snpf(Namech, Namechl,
+			    "no IP module for stream socket");
+		    } else {
+			(void) snpf(Namech, Namechl,
+			    "no TCP/UDP module for stream socket");
+		    }
+		}
+		enter_nm(Namech);
+		return;
+	    }
+#else	/* HPUXV<1030 */
+
+	/*
+	 * Read protocol control block.
+	 */
+	    if (!s.so_pcb) {
+		enter_nm("no protocol control block");
+		return;
+	    }
+	    if (s.so_type == SOCK_RAW) {
+
+	    /*
+	     * Print raw socket information.
+	     */
+		if (kread((KA_T)s.so_pcb, (char *)&raw, sizeof(raw))
+		||  (struct socket *)sa != (struct socket *)raw.rcb_socket) {
+		    (void) snpf(Namech, Namechl, "can't read rawcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		enter_dev_ch(print_kptr((KA_T)(raw.rcb_pcb ? raw.rcb_pcb
+							   : s.so_pcb),
+					(char *)NULL, 0));
+		if (raw.rcb_laddr.sa_family == AF_INET)
+		    la = (unsigned char *)&raw.rcb_laddr.sa_data[2];
+		else if (raw.rcb_laddr.sa_family)
+		    printrawaddr(&raw.rcb_laddr);
+		if (raw.rcb_faddr.sa_family == AF_INET)
+		    fa = (unsigned char *)&raw.rcb_faddr.sa_data[2];
+		else if (raw.rcb_faddr.sa_family) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, "->");
+		    printrawaddr(&raw.rcb_faddr);
+		}
+		if (fa || la)
+		    (void) ent_inaddr(la, -1, fa, -1, AF_INET);
+	    } else {
+
+	    /*
+	     * Print Internet socket information.
+	     */
+		if (kread((KA_T)s.so_pcb, (char *)&inp, sizeof(inp))) {
+		    (void) snpf(Namech, Namechl, "can't read inpcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
+							    : s.so_pcb),
+					(char *)NULL, 0));
+		la = (unsigned char *)&inp.inp_laddr;
+		lp = (int)ntohs(inp.inp_lport);
+		if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport != 0) {
+		    fa = (unsigned char *)&inp.inp_faddr;
+		    fp = (int)ntohs(inp.inp_fport);
+		}
+		if (fa || la)
+		    (void) ent_inaddr(la, lp, fa, fp, AF_INET);
+		if (p.pr_protocol == IPPROTO_TCP && inp.inp_ppcb
+		&&  kread((KA_T)inp.inp_ppcb, (char *)&t, sizeof(t)) == 0) {
+		    Lf->lts.type = 0;
+		    Lf->lts.state.i = (int)t.t_state;
+		}
+	    }
+	    break;
+#endif	/* HPUXV>=1030 */
+
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+
+#if	HPUXV>=1030
+/*
+ * Save size information for HP-UX 10.30 and above.
+ */
+ 	    if (Fsize) {
+		if (!s.so_rcv
+		||  kread((KA_T)s.so_rcv, (char *)&rb, sizeof(rb)))
+		    rb.sb_cc = 0;
+		if (!s.so_snd
+		||  kread((KA_T)s.so_snd, (char *)&sb, sizeof(sb)))
+		    sb.sb_cc = 0;
+		if (Lf->access == 'r')
+		    Lf->sz = (SZOFFTYPE)rb.sb_cc;
+		else if (Lf->access == 'w')
+		    Lf->sz = (SZOFFTYPE)sb.sb_cc;
+		else
+		    Lf->sz = (SZOFFTYPE)(rb.sb_cc + sb.sb_cc);
+		Lf->sz_def = 1;
+	    } else
+		Lf->off_def = 1;
+#endif	/* HPUXV>=1030 */
+
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    if (kread((KA_T) s.so_pcb, (char *) &unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+
+#if	HPUXV<1030
+	/*
+	 * Read UNIX domain socket address information for HP-UX below 10.30.
+	 */
+	    if (unp.unp_addr) {
+		if (kread((KA_T) unp.unp_addr, (char *) &mb, sizeof(mb))) {
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+		ua = (struct sockaddr_un *)(((char *)&mb) + mb.m_off);
+		mbl = mb.m_len;
+	    }
+#else	/* HPUXV>=1030 */
+	/*
+	 * Obtain UNIX domain socket address information for HP-UX 10.30 and
+	 * above.
+	 */
+	    if (unp.unp_ino) {
+		Lf->inode = (INODETYPE)unp.unp_ino;
+		Lf->inp_ty = 1;
+	    }
+	    ua = (struct sockaddr_un *)NULL;
+	    mbl = 0;
+	    if (unp.unp_addr
+	    &&  kread((KA_T)unp.unp_addr, (char *)&mb, sizeof(mb)) == 0
+	    &&  mb.b_datap
+	    &&  kread((KA_T)mb.b_datap, (char *)&db, sizeof(db)) == 0) {
+		if (db.db_base) {
+		    if (dbl < (db.db_size + 1)) {
+			dbl = db.db_size + 1;
+			if (dbf)
+			    dbf = (char *)realloc((MALLOC_P *)dbf,
+						  (MALLOC_S) dbl);
+			else
+			    dbf = (char *)malloc((MALLOC_S)dbl);
+			if (!dbf) {
+			    (void) fprintf(stderr,
+				"%s: no space (%d) for UNIX socket address\n",
+				Pn, dbl);
+			    Exit(1);
+			}
+		    }
+		    if (kread((KA_T)db.db_base, dbf, db.db_size) == 0) {
+			mbl = db.db_size;
+			dbf[mbl] = '\0';
+			ua = (struct sockaddr_un *)dbf;
+		    }
+		}
+	    }
+#endif	/* HPUXV>=1030 */
+
+	    if (!ua) {
+		ua = &un;
+		(void) bzero((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *) &uc, sizeof(uc)))
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			else
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)uc.unp_socket,(char *)NULL,0));
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	    if (ua->sun_path[0]) {
+		if (mbl >= sizeof(struct sockaddr_un))
+		    mbl = sizeof(struct sockaddr_un) - 1;
+		*((char *)ua + mbl) = '\0';
+		if (Sfile && is_file_named(ua->sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (!Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+		break;
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+#if	HPUXV>=1030
+/*
+ * process_stream_sock() - process stream socket
+ */
+
+void
+process_stream_sock(ip, pcb, pn, vt)
+	KA_T ip;			/* IP module's q_ptr */
+	KA_T pcb;			/* protocol's q_ptr */
+	char *pn;			/* protocol name */
+	enum vtype vt;			/* vnode type */
+{
+	unsigned char *fa = (unsigned char *)NULL;
+	char *ep;
+	int fp, lp, rq, sq;
+	struct ipc_s ic;
+	unsigned char *la = (unsigned char *)NULL;
+	size_t sz;
+	u_short pt;
+	struct tcp_s tc;
+	tcph_t th;
+	struct udp_s ud;
+/*
+ * Set file type and protocol.  If AF_INET selection is in effect, set its flag.
+ */
+	if (Fnet)
+	    Lf->sf |= SELNET;
+	(void) snpf(Lf->type, sizeof(Lf->type), "inet");
+	if (pn) {
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), pn);
+	    Lf->inp_ty = 2;
+	} else if (Sfile && (vt != VNON) && Lf->dev_def && (Lf->inp_ty == 1)) {
+
+	/*
+	 * If the protocol name isn't known and this stream socket's vnode type
+	 * isn't VNON, the stream socket will be handled mostly as a stream.
+	 * Thus, a named file check is appropriate.
+	 */
+	    if (is_file_named((char *)NULL, (vt == VCHR) ? 1 : 0))
+		Lf->sf |= SELNM;
+	}
+/*
+ * Get IP structure.
+ */
+	*Namech = '\0';
+	if (!ip || kread(ip, (char *)&ic, sizeof(ic))) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%scan't read IP control structure from %s",
+		sz ? " " : "", print_kptr(ip, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!Lf->dev_def)
+	    enter_dev_ch(print_kptr(ip, (char *)NULL, 0));
+/*
+ * Check for protocol control block address.  Enter if non-NULL and clear
+ * device definition flag.
+ */
+	if (!pcb) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%ssocket stream has no TCP or UDP module",
+		sz ? " " : "");
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Select processing by protocol name.
+ */
+	if (pn && !strcmp(pn, "TCP")) {
+
+	/*
+	 * Process TCP socket.
+	 */
+	    if (kread(pcb, (char *)&tc, sizeof(tc))) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "%scan't read TCP PCB from %s",
+		    sz ? " " : "", print_kptr(pcb, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Save TCP address.
+	 */
+	    la = (unsigned char *)&ic.ipc_tcp_laddr;
+	    pt = (u_short)ic.ipc_tcp_lport;
+	    if (((struct in_addr *)la)->s_addr == INADDR_ANY && pt == 0) {
+
+	    /*
+	     * If the ipc_s structure has no local address, use the local
+	     * address in its tcp_iph structure, and the port number in its
+	     * tcph structure.
+	     */
+		la = (unsigned char *)&tc.tcp_u.tcp_u_iph.iph_src[0];
+		if (tc.tcp_hdr_len && tc.tcp_tcph
+		&&  kread((KA_T)tc.tcp_tcph, (char *)&th, sizeof(th))
+		== 0)
+		    pt = (u_short)th.th_lport;
+	    }
+	    lp = (int)ntohs(pt);
+	    if ((int)ic.ipc_tcp_faddr != INADDR_ANY
+	    || (u_short)ic.ipc_tcp_fport != 0)
+	    {
+		fa = (unsigned char *)&ic.ipc_tcp_faddr;
+		fp = (int)ntohs((u_short)ic.ipc_tcp_fport);
+	    }
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, AF_INET);
+	/*
+	 * Save TCP state and size information.
+	 */
+	    Lf->lts.type = 0;
+	    Lf->lts.state.i = (int)tc.tcp_state;
+
+# if	defined(HASTCPTPIQ) || defined(HASTCPTPIW)
+#  if	defined(HASTCPTPIW)
+	    Lf->lts.rw = (int)tc.tcp_rwnd;
+	    Lf->lts.ww = (int)tc.tcp_swnd;
+	    Lf->lts.rws = Lf->lts.wws = 1;
+#  endif	/* defined(HASTCPTPIW) */
+
+	    if ((rq = (int)tc.tcp_rnxt - (int)tc.tcp_rack - 1) < 0)
+		rq = 0;
+	    if ((sq = (int)tc.tcp_snxt - (int)tc.tcp_suna - 1) < 0)
+		sq  = 0;
+
+#  if	defined(HASTCPTPIQ)
+	    Lf->lts.rq = (unsigned long)rq;
+	    Lf->lts.sq = (unsigned long)sq;
+	    Lf->lts.rqs = Lf->lts.sqs = 1;
+#  endif	/* defined(HASTCPTPIQ) */
+
+	    if (Fsize) {
+		if (Lf->access == 'r')
+		    Lf->sz = (SZOFFTYPE)rq;
+		else if (Lf->access == 'w')
+		    Lf->sz = (SZOFFTYPE)sq;
+		else
+		    Lf->sz = (SZOFFTYPE)(rq + sq);
+		Lf->sz_def = 1;
+	    } else
+		Lf->off_def = 1;
+
+# else	/* !defined(HASTCPTPIQ) && !defined(HASTCPTPIW) */
+	    if (!Fsize)
+	        Lf->off_def = 1;
+# endif	/* defined(HASTCPTPIQ) || defined(HASTCPTPIW) */
+
+# if	defined(HASTCPOPT)
+	    if (Ftcptpi & TCPTPI_FLAGS) {
+
+	    /*
+	     * Save TCP options and values..
+	     */
+		if (tc.tcp_naglim == (uint)1)
+		    Lf->lts.topt |= TF_NODELAY;
+		Lf->lts.mss = (unsigned long)tc.tcp_mss;
+		Lf->lts.msss = (unsigned char)1;
+	    }
+# endif	/* defined(HASTCPOPT) */
+
+# if	defined(HASSOOPT)
+	    if (Ftcptpi & TCPTPI_FLAGS) {
+
+	    /*
+	     * Save socket options.
+	     */
+		if (tc.tcp_broadcast)
+		    Lf->lts.opt |= SO_BROADCAST;
+		if (tc.tcp_so_debug)
+		    Lf->lts.opt |= SO_DEBUG;
+		if (tc.tcp_dontroute)
+		    Lf->lts.opt |= SO_DONTROUTE;
+		if (tc.tcp_keepalive_intrvl
+		&&  (tc.tcp_keepalive_intrvl != 7200000)
+		) {
+		    Lf->lts.opt |= SO_KEEPALIVE;
+		    Lf->lts.kai = (unsigned int)tc.tcp_keepalive_intrvl;
+		}
+		if (tc.tcp_lingering) {
+		    Lf->lts.opt |= SO_LINGER;
+		    Lf->lts.ltm = (unsigned int)tc.tcp_linger;
+		}
+		if (tc.tcp_oobinline)
+		    Lf->lts.opt |= SO_OOBINLINE;
+		if (tc.tcp_reuseaddr)
+		    Lf->lts.opt |= SO_REUSEADDR;
+		if (tc.tcp_reuseport)
+		    Lf->lts.opt |= SO_REUSEPORT;
+		if (tc.tcp_useloopback)
+		    Lf->lts.opt |= SO_USELOOPBACK;
+		Lf->lts.qlen = (unsigned int)tc.tcp_conn_ind_cnt;
+		Lf->lts.qlim = (unsigned int)tc.tcp_conn_ind_max;
+		if (Lf->lts.qlen || Lf->lts.qlim)
+		    Lf->lts.qlens = Lf->lts.qlims = (unsigned char)1;
+	    }
+# endif	/* defined(HASSOOPT) */
+
+	    Namech[0] = '\0';
+	    return;
+	} else if (pn && !strcmp(pn, "UDP")) {
+
+	/*
+	 * Process UDP socket.
+	 */
+	    if (kread(pcb, (char *)&ud, sizeof(ud))) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "%scan't read UDP PCB from %s",
+		    sz ? " " : "", print_kptr(pcb, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Save UDP address and TPI state.
+	 */
+	    la = (unsigned char *)&ic.ipc_udp_addr;
+	    pt = (u_short)ic.ipc_udp_port;
+	    if (((struct in_addr *)la)->s_addr == INADDR_ANY && pt == 0) {
+
+	    /*
+	     * If the ipc_s structure has no local address, use the one in the
+	     * udp_s structure.
+	     */
+		pt = (u_short)ud.udp_port[0];
+	    }
+	    (void) ent_inaddr(la, (int)ntohs(pt), (unsigned char *)NULL,
+		-1, AF_INET);
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    Lf->lts.type = 1;
+	    Lf->lts.state.ui = (unsigned int)ud.udp_state;
+	    Namech[0] = '\0';
+	    return;
+	} else {
+
+	/*
+	 * Record an unknown protocol.
+	 */
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%sunknown stream protocol: %s",
+		sz ? " " : "", pn ? pn : "NUll");
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+#endif	/* HPUXV>=1030 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dstore.c
new file mode 100644
index 0000000..bbf18f1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/dstore.c
@@ -0,0 +1,241 @@
+/*
+ * dstore.c - /dev/kmem-based HP-UX global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.12 2007/04/24 16:25:30 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Global storage definitions
+ */
+
+#if	defined(HAS_AFS)
+
+# if    defined(HASAOPT)
+char *AFSApath = (char *)NULL;		/* alternate AFS name list path
+					 * (from -A) */
+# endif /* defined(HASAOPT) */
+
+struct vfs *AFSVfsp = (struct vfs *)NULL;
+					/* AFS vfs struct kernel address */
+#endif	/* defined(HAS_AFS) */
+
+int CloneMaj;				/* clone major device number */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+
+# if	defined(hp9000s300) || defined(__hp9000s300)
+	{ "arFid",	"_afs_rootFid"		},
+	{ "avops",	"_afs_vnodeops"		},
+	{ "avol",	"_afs_volumes"		},
+	{ X_NCACHE,	"_ncache"		},
+	{ X_NCSIZE,	"_ncsize"		},
+	{ "proc",	"_proc"			},
+	{ "nvops",	"_nfs_vnodeops"		},
+	{ "nvops3",	"_nfs_vnodeops3"	},
+	{ "nv3ops",	"_nfs3_vnodeops"	},
+	{ "nproc",	"_nproc"		},
+	{ "uvops",	"_ufs_vnodeops"		},
+	{ "vfops",	"_vnodefops"		},
+
+#  if	HPUXV<800
+	{ "upmap",	"_Usrptmap"		},
+	{ "upt",	"_usrpt"		},
+#  endif	/* HPUXV<800 */
+# endif	/* defined(hp9000s300) || defined(__hp9000s300) */
+
+# if	defined(hp9000s800) || defined(__hp9000s800)
+	{ "arFid",	"afs_rootFid"		},
+	{ "avops",	"afs_vnodeops"		},
+	{ "avol",	"afs_volumes"		},
+	{ X_NCACHE,	"ncache"		},
+	{ X_NCSIZE,	"ncsize"		},
+	{ "proc",	"proc"			},
+	{ "nvops",	"nfs_vnodeops"		},
+	{ "nvops3",	"nfs_vnodeops3"		},
+	{ "nv3ops",	"nfs3_vnodeops"		},
+	{ "nproc",	"nproc"			},
+	{ "uvops",	"ufs_vnodeops"		},
+	{ "vfops",	"vnodefops"		},
+
+#  if	HPUXV<800
+	{ "ubase",	"ubase"			},
+	{ "npids",	"npids"			},
+#  else	/* HPUXV>=800 */
+#   if	HPUXV>=1000
+#    if	HPUXV>=1030
+	{ "clmaj",	"clonemajor"		},
+#    endif	/* HPUXV>=1030 */
+	{ "cvops",	"cdfs_vnodeops"		},
+	{ "fvops",	"fifo_vnodeops"		},
+	{ "pvops",	"pipe_vnodeops"		},
+	{ "svops",	"spec_vnodeops"		},
+	{ "vvops",	"vx_vnodeops"		},
+#   endif	/* HPUXV>=1000 */
+#  endif	/* HPUXV<800 */
+# endif	/* defined(hp9000s800) || defined(__hp9000s800) */
+
+	{ "mvops",	"mvfs_vnodeops"		},
+
+# if	HPUXV>=1100
+	{ "chunksz",	"sizeof_fd_chunk_t"	},
+# endif	/* HPUXV>=1100 */
+
+	{ "",		""			},
+	{ NULL,		NULL			}
+};
+
+
+int HaveCloneMaj = 0;			/* CloneMaj status */
+int Kd = -1;				/* /dev/kmem file descriptor */
+KA_T Kpa;				/* kernel proc structure address */
+
+#if	HPUXV>=1010
+KA_T Ktp;				/* kernel thread pointer from proc
+					 * struct */
+#endif	/* HPUXV>=1010 */
+
+struct l_vfs *Lvfs = NULL;		/* local vfs structure table */
+
+#if	HPUXV<800
+int Mem = -1;			/* /dev/mem file descriptor */
+#endif	/* HPUXV<800 */
+
+#if	HPUXV<800 && defined(hp9000s800)
+int npids;			/* number of PIDs (for uvadd()) */
+struct proc *proc;		/* process table address (for uvadd()) */
+#endif	/* HPUXV<800 && defined(hp9000s300) */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FMARK,		FF_MARK		},
+	{ (long)FDEFER,		FF_DEFER	},
+	{ (long)FNBLOCK,	FF_NBLOCK	},
+	{ (long)FNOCTTY,	FF_NOCTTY	},
+
+# if	defined(FSYNC)
+	{ (long)FSYNC,		FF_SYNC		},
+# else	/* !defined(FSYNC) */
+#  if	defined(O_SYNC)
+	{ (long)O_SYNC,		FF_SYNC		},
+#  endif	/* defined(O_SYNC) */
+# endif	/* defined(FSYNC) */
+
+# if	defined(FCOPYAVOID)
+	{ (long)FCOPYAVOID,	FF_COPYAVOID	},
+# endif	/* defined(FCOPYAVOID) */
+
+# if	defined(FPOSIX_AIO)
+	{ (long)FPOSIX_AIO,	FF_POSIX_AIO	},
+# endif	/* defined(FPOSIX_AIO) */
+
+# if	defined(FLARGEFILE)
+	{ (long)FLARGEFILE,	FF_LARGEFILE	},
+# else	/* !defined(FLARGEFILE) */
+#  if	HPUXV>=1100
+	{ (long)0x800,		FF_LARGEFILE	},
+#  endif	/* HPUXV>=1100 */
+# endif	/* defined(FLARGEFILE) */
+
+	{ (long)0x100,		FF_KERNEL	},
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+# if	HPUXV>=1020
+#define	UF_EXCLOSE	0x1
+#define	UF_MAPPED	0x2
+#define	UF_FDLOCK	0x4
+#define	UF_INUSE	0x8
+# endif	/* HPUXV>=1020 */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,		POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,		POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+# if	defined(UF_FDLOCK)
+	{ (long)UF_FDLOCK,		POF_FDLOCK	},
+# endif	/* defined(UF_FDLOCK) */
+
+# if	defined(UF_INUSE)
+	{ (long)UF_INUSE,		POF_INUSE	},
+# endif	/* defined(UF_INUSE) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
+
+#if	HPUXV<800
+int Swap = -1;			/* swap device file descriptor */
+#endif	/* HPUXV<800 */
+
+#if	HPUXV<800 && defined(hp9000s800)
+struct user *ubase;		/* user area base (for uvadd()) */
+#endif	/* HPUXV<800 && defined(hp9000s800) */
+
+#if	HPUXV<800 && defined(hp9000s300)
+struct user *ubase;		/* user area base (for uvadd()) */
+struct pte *Usrptmap;		/* user page table map pointer */
+struct pte *usrpt;		/* user page table pointer
+				 * (for bktomx from vmmac.h) */
+#endif	/* HPUXV<800 && defined(hp9000s300) */
+
+KA_T Vnfops;			/* vnodefops switch address */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/ipc_s.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/ipc_s.h
new file mode 100644
index 0000000..4945c98
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/ipc_s.h
@@ -0,0 +1,98 @@
+/*
+ * ipc_s.h for HP-UX 10.30 and above
+ *
+ * This header file defines the ipc_s structure for lsof.  The ipc_s structure
+ * is the streams equivalent of a Berkeley-style inpcb (Internet Protocol
+ * Control Block).  The ipc_s holds the TCP/IP address for a stream.
+ *
+ * The original HP-UX 11 distribution has a flat ipc_s structure, with hash
+ * links to other ipc_s structures, and direct links to the the read and write
+ * sections of the stream.
+ *
+ * After patch bundle B11.00.43 the ipc_s structure definition requires
+ * two other Q4-derived structures, mirg_s and ipis_s.  The ipis_s structure
+ * contains the hash and stream links formerly contained in ipc_s.
+ *
+ * V. Abell <abe@purdue.edu>
+ * February, 1998
+ *
+ * Patch bundle update supplied by: Kevin Vajk <kvajk@cup.hp.com>
+ *				    February, 1999
+ */
+
+#if	!defined(LSOF_IPC_S_H)
+#define	LSOF_IPC_S_H
+
+#include "kernbits.h"
+#include <sys/types.h>
+
+typedef struct mirg_s {
+	uint mirg_gen;
+} mirg_t;
+
+# if	defined(HAS_IPC_S_PATCH)
+typedef struct ipis_s {
+	union {
+	    KA_T u_ipc_hash_next;
+	    KA_T u_ill_hash_next;
+	    KA_T u_ipis_hash_next;
+	} ipis_hash_next_u;
+	union {
+	    KA_T u_ipc_ptphn;
+	    KA_T u_ill_ptphn;
+	    KA_T u_ipis_ptphn;
+	} ipis_ptphn_u;
+	KA_T ipis_readers_next;
+	KA_T ipis_readers_ptpn;
+	KA_T ipis_ptr_hash_next;
+	KA_T ipis_ptr_ptphn;
+	KA_T ipis_rq;
+	KA_T ipis_wq;
+	mirg_t ipis_mirg;
+#  if	HAS_IPC_S_PATCH==2
+	uint ipis_msgsqueued;
+#  endif	/* HAS_IPC_S_PATCH==2 */
+} ipis_t;
+# endif	/* defined(HAS_IPC_S_PATCH) */
+
+typedef struct ipc_s {
+
+# if	defined(HAS_IPC_S_PATCH)
+	ipis_t ipc_ipis;
+# else	/* !defined(HAS_IPC_S_PATCH) */
+	KA_T ipc_hash_next;			/* hash link -- ipc_s
+						 * structures are hashed in
+						 * ipc_tcp_conn[] and
+						 * ipc_udp_conn[] */
+	mirg_t ipc_mirg;
+	KA_T ipc_readers_next;
+	KA_T ipc_readers_ptpn;
+	KA_T ipc_ptphn;
+	KA_T ipc_rq;				/* stream's read queue */
+	KA_T ipc_wq;				/* stream's write queue */
+# endif	/* defined(HAS_IPC_S_PATCH) */
+
+	int ipc_ioctl_pended;
+	union {
+	    struct {
+		uint32_t ipcu_lcl_addr;		/* local IP address */
+		uint32_t ipcu_rem_addr;		/* remote IP address */
+		uint16_t ipcu_rem_port;		/* remote port */
+		uint16_t ipcu_lcl_port;		/* local port */
+	    } ipcu_addrs;
+	    uint16_t ipcu_tcp_addr[6];
+	} ipc_ipcu;
+/*
+ * The rest of the q4 elements are ignored.
+ */
+
+} ipc_s_t;
+
+#define	ipc_udp_port	ipc_ipcu.ipcu_addrs.ipcu_lcl_port
+#define	ipc_udp_addr	ipc_ipcu.ipcu_addrs.ipcu_lcl_addr
+#define	ipc_tcp_lport	ipc_ipcu.ipcu_addrs.ipcu_lcl_port
+#define	ipc_tcp_laddr	ipc_ipcu.ipcu_addrs.ipcu_lcl_addr
+#define	ipc_tcp_fport	ipc_ipcu.ipcu_addrs.ipcu_rem_port
+#define	ipc_tcp_faddr	ipc_ipcu.ipcu_addrs.ipcu_rem_addr
+
+#endif	/* !defined(LSOF_IPC_S_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/kernbits.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/kernbits.h
new file mode 100644
index 0000000..a0fd166
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/kernbits.h
@@ -0,0 +1,22 @@
+/*
+ * kernbits.h for HP-UX 10.30 and above
+ *
+ * This header file defines the basic kernel word size type for lsof, using
+ * the Configure-generated -DHPUXKERNBITS=<32|64> definition.
+ *
+ * V. Abell
+ * February, 1998
+ */
+
+#if	!defined(LSOF_KERNBITS_H)
+#define	LSOF_KERNBITS_H
+
+# if	!defined(HPUXKERNBITS) || HPUXKERNBITS<64
+typedef	uint32_t	KA_T;
+#define	KA_T_FMT_X	"%#lx"
+# else	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+typedef	uint64_t	KA_T;
+#define	KA_T_FMT_X	"%#llx"
+# endif	/* !defined(HPUXKERNBITS) || HPUXKERNBITS<64 */
+
+#endif	/* !defined(LSOF_KERNBITS_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/lla.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/lla.h
new file mode 100644
index 0000000..36ec882
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/lla.h
@@ -0,0 +1,91 @@
+/*
+ * lla.h for HP-UX 10.30 and above
+ *
+ * This header file defines the lla_cb structure for lsof.  Lsof uses it to
+ * to read the Link Level Access (LLA) control block.  Link level access means
+ * access to the network link layer access protocol -- e.g., Ethernet 802.5.
+ *
+ * V. Abell <abe@purdue.edu>
+ * February, 1998
+ */
+
+#if	!defined(LSOF_LLA_H)
+#define	LSOF_LLA_H
+
+#include "kernbits.h"
+#include <sys/types.h>
+
+#define	LLA_IS_ETHER	0x1
+#define	LLA_FWRITE	0x100
+#define	LLA_FREAD	0x200
+#define	LLA_IS_8025	0x800
+#define	LLA_IS_SNAP8025	0x1000
+#define	LLA_IS_FA8025	0x4000
+
+typedef struct lla_hdr {
+	union {
+	    struct {
+		u_char destaddr[6];
+		u_char sourceaddr[6];
+		u_short length;
+		u_char dsap;
+		u_char ssap;
+		u_char ctrl;
+		u_char pad[3];
+		u_short dxsap;
+		u_short sxsap;
+	    } ieee;
+	    struct {
+		u_char destaddr[6];
+		u_char sourceaddr[6];
+		u_short log_type;
+		u_short dxsap;
+		u_short sxsap;
+	    } ether;
+	    struct {
+		u_char access_ctl;
+		u_char frame_ctl;
+		u_char destaddr[6];
+		u_char sourceaddr[6];
+		u_char rif_plus[26];
+		u_char dsap;
+		u_char ssap;
+		u_char ctrl;
+		u_char orgid[3];
+		u_short etype;
+	    } snap8025;
+	    struct {
+		u_char access_ctl;
+		u_char frame_ctl;
+		u_char destaddr[6];
+		u_char sourceaddr[6];
+		u_char rif_plus[26];
+		u_char dsap;
+		u_char ssap;
+		u_char ctrl;
+	    } ieee8025;
+	} proto;
+} lla_hdr_t;
+
+typedef struct lla_cb {
+	KA_T so_pcb;
+	KA_T pktheader;
+	KA_T head_packet;
+	KA_T last_packet;
+	KA_T lla_ifp;
+	u_int lan_signal_mask;
+	u_int lan_signal_pid;
+	int lan_pkt_size;
+	int lla_timeo;
+	KA_T lla_rsel;
+	struct lla_hdr packet_header;
+	short lla_msgsqd;
+	short lla_maxmsgs;
+	u_short lla_flags;		/* flags, including type  -- i.e.,
+					 * the LLA_* symbols defined above */
+	short hdr_size;
+	int func_addr;
+	KA_T lla_lock;
+} lla_cb_t;
+
+#endif
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/nfs_clnt.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/nfs_clnt.h
new file mode 100644
index 0000000..6b2df97
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/nfs_clnt.h
@@ -0,0 +1,76 @@
+/*
+ * nfs_clnt.h for HP-UX 10.30 and above
+ *
+ * This header file defines the mntinfo structure for lsof.  Lsof uses it to
+ * obtain the device number of an NFS mount point.
+ *
+ * V. Abell
+ * February, 1998
+ */
+
+#if	!defined(LSOF_NFS_CLNT_H)
+#define	LSOF_NFS_CLNT_H
+
+#include "kernbits.h"
+#include "rnode.h"
+#include <rpc/types.h>
+#undef	TCP_NODELAY
+#undef	TCP_MAXSEG
+#include <rpc/rpc.h>
+#include <rpc/clnt.h>
+#include <sys/xti.h>
+#undef	TCP_NODELAY
+#undef	TCP_MAXSEG
+
+typedef struct kcondvar {     
+	uint32_t _dummy1[6];  
+} kcondvar_t; 
+
+typedef struct mntinfo {
+	kmutex_t mi_lock;
+	KA_T mi_knetconfig;
+	struct netbuf mi_addr;
+	struct netbuf mi_syncaddr;
+	KA_T mi_rootvp;
+	uint32_t mi_flags;
+	int32_t mi_tsize;
+	int32_t mi_stsize;
+	int32_t mi_timeo;
+	int32_t mi_retrans;
+	char mi_hostname[32];
+	KA_T mi_netname;
+	int mi_netnamelen;
+	int mi_authflavor;
+	int32_t mi_acregmin;
+	int32_t mi_acregmax;
+	int32_t mi_acdirmin;
+	int32_t mi_acdirmax;
+	struct rpc_timers mi_timers[4];
+	int32_t mi_curread;
+	int32_t mi_curwrite;
+	KA_T mi_async_reqs;
+	KA_T mi_async_tail;
+	kcondvar_t mi_async_reqs_cv;
+	uint16_t mi_threads;
+	uint16_t mi_max_threads;
+	kcondvar_t mi_async_cv;
+	uint32_t mi_async_count;
+	kmutex_t mi_async_lock;
+	KA_T mi_pathconf;
+	u_long mi_prog;
+	u_long mi_vers;
+	KA_T mi_rfsnames;
+	KA_T mi_reqs;
+	KA_T mi_call_type;
+	KA_T mi_timer_type;
+	clock_t mi_printftime;
+	KA_T mi_aclnames;
+	KA_T mi_aclreqs;
+	KA_T mi_acl_call_type;
+	KA_T mi_acl_timer_type;
+	char mi_fsmnt[512];
+	uint64_t mi_maxfilesize;
+	dev_t mi_mntno;			/* mounted device number */
+} mntinfo_t;
+
+#endif	/* !defined(LSOF_NFS_CLNT_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/proc.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/proc.h
new file mode 100644
index 0000000..e922bd4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/proc.h
@@ -0,0 +1,245 @@
+/*
+ * proc.h for Hp-UX 10.30 and above
+ *
+ * This header file defines the proc structure for lsof.  Lsof uses it to
+ * get process information, including PGID, PID, PPID, UID, CWD, and open
+ * file pointers.
+ *
+ * V. Abell <abe@purdue.edu>
+ * February, 1998
+ */
+
+#if	!defined(LSOF_PROC_H)
+#define	LSOF_PROC_H
+
+#include "kernbits.h"
+#include <sys/types.h>
+#include <sys/resource.h>
+#include <sys/user.h>
+
+struct pprof {
+	KA_T pr_base;
+	u_long pr_size;
+	u_long pr_off;
+	u_int pr_scale;
+};
+
+typedef enum proc_flag {
+	SLOAD = 0x1,
+	SSYS = 0x2,
+	SDONTTRC = 0x4,
+	STRC = 0x8,
+	SWTED_PARENT = 0x10,
+	SDEACTSELF = 0x20,
+	SPVFORK = 0x40,
+	SWEXIT = 0x80,
+	SPGID_EXIT_ADJUSTED = 0x100,
+	SVFORK = 0x200,
+	SWANTS_ALLCPU = 0x400,
+	SSERIAL = 0x800,
+	SDEACT = 0x1000,
+	SWAITIO = 0x2000,
+	SWTED_DEBUGGER = 0x4000,
+	SWCONT = 0x8000,
+	SDBG_CREATING = 0x10000,
+	SDBG_WAITING = 0x20000,
+	SDBG_ACTIVE = 0x40000,
+	SDBG_LIMBO = 0x80000,
+	SDBG_ATTACHING = 0x100000,
+	SDBG_EXITING = 0x200000,
+	SDBG_KILLED = 0x400000,
+	SDBG_INEXEC = 0x800000,
+	SDBG_TRACESELF = 0x1000000,
+	SDBG_STOPPED = 0x2000000,
+	SDBG_EXITREQ = 0x4000000,
+	SREAPING = 0x10000000
+} proc_flag_t;
+
+typedef enum proc_flag2 {
+	S2CLDSTOP = 0x1,
+	S2EXEC = 0x2,
+	SGRAPHICS = 0x4,
+	SADOPTIVE = 0x8,
+	SADOPTIVE_WAIT = 0x10,
+	SPMT = 0x40,
+	S2SENDDILSIG = 0x100,
+	SLKDONE = 0x200,
+	SISNFSLM = 0x400,
+	S2POSIX_NO_TRUNC = 0x800,
+	S2SYSCALL_BYPID = 0x1000,
+	S2ADOPTEE = 0x2000,
+	SCRITICAL = 0x4000,
+	SMULTITHREADED = 0x8000,
+	S2NOCLDWAIT = 0x10000,
+	S_USE_THRD_CACHE = 0x20000,
+	S2PASS_VIOREF = 0x40000,
+	S2VIOREF_NPROC = 0x80000,
+	SUSRMULTITHREADED = 0x100000
+} proc_flag2_t;
+
+typedef enum proc_state {
+	SUNUSED = 0,
+	SWAIT = 0x1,
+	SIDL = 0x2,
+	SZOMB = 0x3,
+	SSTOP = 0x4,
+	SINUSE = 0x5
+} proc_state_t;
+
+typedef enum proc_sync_flag {
+	P_OP_PENDING_READER = 0x1,
+	P_OP_PENDING_WRITER = 0x2
+} proc_sync_flag_t;
+
+typedef enum proc_sync_reason {
+	P_OP_NONE = 0,
+	P_OP_THREAD_MGMT = 0x1,
+	P_OP_EXIT = 0x2,
+	P_OP_EXEC = 0x3,
+	P_OP_SUSPEND = 0x4,
+	P_OP_CONTINUE = 0x5,
+	P_OP_SIGTRAP = 0x6,
+	P_OP_FORK = 0x7,
+	P_OP_VFORK = 0x8,
+	P_OP_CORE = 0x9,
+	KT_OP_SUSPEND = 0xa,
+	KT_OP_RESUME = 0xb,
+	KT_OP_CREATE = 0xc,
+	KT_OP_TERMINATE = 0xd,
+	KT_OP_LWPEXIT = 0xe,
+	KT_OP_ABORT_SYSCALL = 0xf
+} proc_sync_reason_t;
+
+typedef struct proc {
+	short p_fandx;
+	short p_pandx;
+	int p_created_threads;
+	KA_T p_firstthreadp;		/* thread pointer (for locks) */
+	KA_T p_lastthreadp;
+	proc_flag_t p_flag;
+	KA_T thread_lock;
+	KA_T p_lock;
+	KA_T p_detached_zombie;
+	KA_T p_fss;
+	proc_state_t p_stat;		/* process state */
+	char p_nice;
+	u_short p_pri;
+	int p_livethreads;
+	int p_cached_threads_count;
+	int p_cached_threads_max;
+	KA_T p_cached_threads;
+	KA_T p_cache_next;
+	KA_T p_cache_prev;
+	ksigset_t p_sig;
+	ksigset_t p_ksi_avail;
+	ksigset_t p_ksifl_alloced;
+	KA_T p_ksiactive;
+	KA_T p_ksifree;
+	KA_T p_sigcountp;
+	KA_T p_sigwaiters;
+	int p_cursig;
+	proc_flag2_t p_flag2;
+	int p_coreflags;
+	uid_t p_uid;			/* user ID (UID) of process owner */
+	uid_t p_suid;
+	KA_T p_pgid_p;
+	gid_t p_pgid;
+	pid_t p_pid;			/* process ID (PID) */
+	pid_t p_ppid;			/* parent process ID (PPID) */
+	size_t p_maxrss;
+	short p_idhash;
+	short p_ridhash;
+	short p_pgidhx;
+	short p_rpgidhx;
+	short p_uidhx;
+	short p_ruidhx;
+	KA_T p_pptr;
+	KA_T p_cptr;
+	KA_T p_osptr;
+	KA_T p_ysptr;
+	KA_T p_dptr;
+	KA_T p_vas;			/* pointer to VM for process */
+	short p_memresv;
+	short p_swpresv;
+	short p_sysmemresv;
+	short p_sysswpresv;
+	u_short p_xstat;
+	time_t p_deactime;
+	short p_ndx;
+	sid_t p_sid;
+	short p_sidhx;
+	short p_rsidhx;
+	short p_idwrite;
+	KA_T p_semundo;
+	KA_T p_dbipcp;
+	u_char p_cookie;
+	u_char p_reglocks;
+	int p_no_swap_count;
+	dev_t p_ttyd;
+	KA_T p_ttyp;
+	KA_T p_nextdeact;
+	time_t p_start;
+	KA_T p_shadproc;
+	KA_T p_bor_lock;
+	int p_maxof;			/* maximum open files */
+	KA_T p_cdir;			/* pointer to CWD vnode */
+	KA_T p_rdir;			/* pointer to root directory vnode */
+	KA_T p_ofilep;			/* pointer to ofile_t chain */
+	KA_T p_vforkbuf;
+	u_int p_schedpolicy;
+	u_short p_pindx;
+	KA_T p_krusagep;
+	KA_T p_timers;
+	KA_T p_clic;
+	proc_sync_reason_t p_sync_reason;
+	void (*p_wide_action_hdlr)();
+	proc_sync_flag_t p_sync_flag;
+	ushort p_sync_readers;
+	ushort p_sync_writers;
+	u_int p_sync_thread_cnt;
+	int p_suspended_threads;
+	int p_captr;
+	union {
+	    struct {
+		u_int zombies_exist:1,
+		      recalc_privgrps:1,
+		      unused:30;
+	    } bits;
+		u_int all;
+	} p_pl_flags;
+	u_int p_seqnum;
+	spu_t p_spu_group;
+	u_char p_spu_mandatory;
+	KA_T p_cred;
+	caddr_t p_ki_bitmap;
+	KA_T p_aioqp;
+	KA_T p_shared;
+	KA_T p_nseminfop;
+	KA_T p_mqpinfop;
+	KA_T p_dbgctltp;
+	KA_T p_dbgp;
+	KA_T p_trcp;
+	KA_T p_p2p;
+	KA_T p_gang;
+	u_int p_pmon_timer_mask;
+	u_int p_pmon_inherit;
+	u_long p_pmon_state_flag;
+	u_long p_pmon_state_value;
+	KA_T p_cnx_features;
+	char p_comm[15];
+	aid_t p_aid;
+	short p_audproc;
+	short p_audsusp;
+	gid_t p_sgid;
+	u_int p_priv[2];
+	int p_highestfd;
+	short p_cmask;
+	time_t p_ticks;
+	short p_acflag;
+	struct rlimit p_rlimit[11];
+	KA_T p_auditperproc;
+	struct pprof p_prof;
+	char p_spare[48];
+} proc_t;
+
+#endif	/* !defined(LSOF_PROC_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/rnode.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/rnode.h
new file mode 100644
index 0000000..f61ec8a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/rnode.h
@@ -0,0 +1,94 @@
+/*
+ * rnode.h for HP-UX 10.30 and above
+ *
+ * This header file defines the rnode structure for lsof.  Lsof uses it to get
+ * infomation about remote (NFS) nodes -- e.g., node number and size.
+ *
+ * V. Abell <abe@purdue.edu>
+ * February, 1998
+ */
+
+#if	!defined(LSOF_RNODE_H)
+#define	LSOF_RNODE_H
+
+#include "kernbits.h"
+
+#define	_KERNEL
+#include <sys/spinlock.h>
+#undef	_KERNEL
+
+#include "vnode.h"
+
+typedef struct krwlock {
+	lock_t *interlock;
+	u_int delay;
+	int read_count;
+	char want_write;
+	char want_upgrade;
+	char waiting;
+	char no_swap;
+} krwlock_t;
+
+typedef struct kmutex {
+	lock_t *spin_lockp;
+	int lockp_type;
+} kmutex_t;
+
+typedef struct nfs_fhandle {
+	int fh_len;
+	char fh_buf[64];
+} nfs_fhandle_t;
+
+typedef struct rnode {
+	KA_T r_freef;
+	KA_T r_freeb;
+	KA_T r_hash;
+	vnode_t r_vnode;	/* the vnode that contains this rnode */
+	krwlock_t r_rwlock;
+	kmutex_t r_statelock;
+	nfs_fhandle_t r_fh;
+	uint16_t r_flags;
+	int16_t r_error;
+	KA_T r_rcred;
+	KA_T r_wcred;
+	KA_T r_unlcred;
+	KA_T r_unlname;
+	KA_T r_unldvp;
+	int64_t r_size;		/* This should be an off_t, but there's an
+				 * unresolvable conflict between the kernel
+				 * and application off_t sizes. */
+	struct vattr r_attr;	/* the vnode attributes -- e.g., node number,
+				 * size, etc.  (See ./vnode.h.) */
+
+/*
+ * These q4 elements are ignored.
+
+	time_t r_attrtime;
+	time_t r_mtime;
+	int32_t r_mapcnt;
+	uint32_t r_count;
+	int32_t r_seq;
+	int *r_acc;
+	int *r_dir;
+	int *r_direof;
+	symlink_cache r_symlink;
+	u_char r_verf;
+	commit_t r_commit;
+	recover_t r_recover;
+	uint32_t r_truncaddr;
+	uint32_t r_iocnt;
+	kcondvar_t r_trunccv;
+	kmutex_t r_serialize;
+	u_char r_cookieverf;
+	int *r_lmpl;
+	daddr_t r_lastr;
+	kcondvar_t r_cv;
+	int *r_owner;
+	short r_ownercount;
+
+ * Those q4 elements were ignored.
+ */
+
+} rnode_t;
+
+#endif	/* !defined(LSOF_RNODE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/sth.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/sth.h
new file mode 100644
index 0000000..a47d07d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/sth.h
@@ -0,0 +1,84 @@
+/*
+ * sth_h for HP-UX 10.30 and above
+ *
+ * This header file defines the stream head structure, sth_t, for lsof.  Lsof
+ * uses the stream head structure to obtain the stream's read and write queue
+ * structure pointers.
+ *
+ * V. Abell
+ * February, 1998
+ */
+
+#if	!defined(LSOF_STH_H)
+#define	LSOF_STH_H
+
+#include "kernbits.h"
+#include <sys/types.h>
+
+typedef struct streams_queue {
+	KA_T q_qinfo;			/* queue info pointer */
+	KA_T q_first;
+	KA_T q_last;
+	KA_T q_next;
+	KA_T q_link;
+	KA_T q_ptr;			/* queue private data pointer */
+	ulong q_count;
+	ulong q_flag;
+	int q_minpsz;
+	int q_maxpsz;
+	ulong q_hiwat;
+	ulong q_lowat;
+	KA_T q_bandp;
+	u_char q_nband;
+	u_char q_pad1[3];
+	KA_T q_other;
+	KA_T queue_sth;
+} streams_queue_t;
+
+typedef struct sth_s {
+	streams_queue_t *sth_rq;	/* pointer to stream's read queue
+					 * structure chain */
+	streams_queue_t *sth_wq;	/* pointer to stream's write queue
+					 * structure chain */
+/*
+ * These q4 elements are ignored.
+
+	dev_t sth_dev;
+	ulong sth_read_mode;
+	ulong sth_write_mode;
+	int sth_close_wait_timeout;
+	u_char sth_read_error;
+	u_char sth_write_error;
+	short sth_prim_ack;
+	short sth_prim_nak;
+	short sth_ext_flags;
+	ulong sth_flags;
+	int sth_ioc_id;
+	KA_T sth_ioc_mp;
+	OSRQ sth_ioctl_osrq;
+	OSRQ sth_read_osrq;
+	OSRQ sth_write_osrq;
+	ulong sth_wroff;
+	int sth_muxid;
+	KA_T sth_mux_link;
+	KA_T sth_mux_top;
+	gid_t sth_pgid;
+	KA_T sth_session;
+	KA_T sth_next;
+	POLLQ sth_pollq;
+	SIGSQ sth_sigsq;
+	KA_T sth_ttyp;
+	int sth_push_cnt;
+	OSR sth_osr;
+	KA_T sth_pipestatp;
+	KA_T sth_ext_flags_lock;
+	uint qlen;
+	struct sth_func_reg sth_f_reg;
+	spu_t sth_bindspu;
+
+* Those q4 elements were ignored.
+*/
+
+} sth_s_t;
+
+#endif	/* !defined(LSOF_STH_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/tcp_s.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/tcp_s.h
new file mode 100644
index 0000000..41f21f6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/tcp_s.h
@@ -0,0 +1,227 @@
+/*
+ * tcp_s.h for HP-UX 10.30 and above
+ *
+ * This header file defines the TCP connection structure, tpc_s, for lsof.
+ * Lsof gets the parameters of a TCP connection from tcp_s.  Lsof locates a
+ * tcp_s structure by scanning the queue structure chain of a TCP stream,
+ * looking for a queue structure whose module name begins with TCP; that queue
+ * structure's private data pointer, q_ptr, addresses its associated tcp_s
+ * structure.
+ *
+ * V. Abell
+ * February, 1998
+ */
+
+#if	!defined(LSOF_TCP_S_H)
+#define	LSOF_TCP_S_H
+
+#include "kernbits.h"
+#include <sys/types.h>
+
+#define TCPS_CLOSED             -6
+#define TCPS_IDLE               -5
+#define TCPS_BOUND              -4
+#define TCPS_LISTEN             -3
+#define TCPS_SYN_SENT           -2
+#define TCPS_SYN_RCVD           -1
+#define TCPS_ESTABLISHED         0
+#define TCPS_CLOSE_WAIT          1
+#define TCPS_FIN_WAIT_1          2
+#define TCPS_CLOSING             3
+#define TCPS_LAST_ACK            4
+#define TCPS_FIN_WAIT_2          5
+#define TCPS_TIME_WAIT           6
+
+typedef struct iph_s {			/* IP header */
+	u_char iph_version_and_hdr_length;
+	u_char iph_type_of_service;
+	u_char iph_length[2];
+	u_char iph_ident[2];
+	u_char iph_fragment_offset_and_flags[2];
+	u_char iph_ttl;
+	u_char iph_protocol;
+	u_char iph_hdr_checksum[2];
+	u_char iph_src[4];		/* source IP address */
+	u_char iph_dst[4];		/* destination IP address */
+} iph_t;
+
+typedef struct ipha_s {
+	u_char ipha_version_and_hdr_length;
+	u_char ipha_type_of_service;
+	uint16_t ipha_length;
+	uint16_t ipha_ident;
+	uint16_t ipha_fragment_offset_and_flags;
+	u_char ipha_ttl;
+	u_char ipha_protocol;
+	uint16_t ipha_hdr_checksum;
+	uint32_t ipha_src;
+	uint32_t ipha_dst;
+} ipha_t;
+
+typedef struct tcphdr_s {
+	uint16_t th_lport;		/* local port */
+	uint16_t th_fport;		/* foreign port */
+	u_char th_seq[4];
+	u_char th_ack[4];
+	u_char th_offset_and_rsrvd[1];
+	u_char th_flags[1];
+	u_char th_win[2];
+	u_char th_sum[2];
+	u_char th_urp[2];
+} tcph_t;
+
+typedef struct tcpsb {
+	uint32_t tcpsb_start;
+	uint32_t tcpsb_end;
+} tcpsb_t;
+
+typedef struct tcp_s {
+	int tcp_state;			/* connection state */
+	KA_T tcp_rq;
+	KA_T tcp_wq;
+	KA_T tcp_xmit_head;
+	KA_T tcp_xmit_last;
+	uint tcp_unsent;
+	KA_T tcp_xmit_tail;
+	uint tcp_xmit_tail_unsent;
+	uint32_t tcp_snxt;		/* send: next sequence number */
+	uint32_t tcp_suna;		/* send: unacknowledged sequence nr */
+	uint tcp_swnd;			/* send: window size */
+	uint tcp_swnd_shift;
+	uint tcp_cwnd;
+	u_long tcp_ibsegs;
+	u_long tcp_obsegs;
+	uint tcp_mss;
+	uint tcp_naglim;
+	int tcp_hdr_len;		/* TCP header length */
+	int tcp_wroff_extra;
+	KA_T tcp_tcph;			/* pointer to TCP header structure */
+	int tcp_tcp_hdr_len;
+	uint tcp_valid_bits;
+	int tcp_xmit_hiwater;
+	KA_T tcp_flow_mp;
+	int tcp_ms_we_have_waited;
+	KA_T tcp_timer_mp;
+	uint tcp_timer_interval;
+	uint32_t
+	    tcp_urp_old : 1,
+	    tcp_urp_sig_sent : 1,
+	    tcp_hard_binding : 1,
+	    tcp_hard_bound : 1,
+	    tcp_priv_stream : 1,
+	    tcp_fin_acked : 1,
+	    tcp_fin_rcvd : 1,
+	    tcp_fin_sent : 1,
+	    tcp_ordrel_done : 1,
+	    tcp_flow_stopped : 1,
+	    tcp_detached : 1,
+	    tcp_bind_pending : 1,
+	    tcp_unbind_pending : 1,
+	    tcp_use_ts_opts : 1,
+	    tcp_reader_active : 1,
+	    tcp_lingering : 1,			/* SO_LINGER */
+	    tcp_no_bind : 1,
+	    tcp_sack_permitted : 1,
+	    tcp_rexmitting : 1,
+	    tcp_fast_rexmitting : 1,
+	    tcp_ooofin_seen : 1,
+	    tcp_smooth_rtt : 1,
+	    tcp_main_flags_fill : 10;
+	uint32_t
+	    tcp_so_debug : 1,			/* SO_DEBUG */
+	    tcp_dontroute : 1,			/* SO_DONTROUTE */
+	    tcp_broadcast : 1,			/* SO_BROADCAST */
+	    tcp_useloopback : 1,		/* SO_USELOOPBACK */
+	    tcp_reuseaddr : 1,			/* SO_REUSEADDR */
+	    tcp_reuseport : 1,			/* SO_REUSEPORT */
+	    tcp_oobinline : 1,			/* SO_OOBONLINE */
+	    tcp_xmit_hiwater_set : 1,
+	    tcp_xmit_lowater_set : 1,
+	    tcp_recv_hiwater_set : 1,
+	    tcp_no_window_shift : 1,
+	    tcp_window_shift_set : 1,
+	    tcp_keepalive_kills : 1,
+	    tcp_option_flags_fill : 19;
+	uint tcp_dupack_cnt;
+	uint32_t tcp_smax;
+	uint32_t tcp_rnxt;
+	uint tcp_rwnd;			/* read: window size */
+	uint tcp_rwnd_shift;
+	uint tcp_rwnd_max;
+	int tcp_credit;
+	int tcp_credit_init;
+	KA_T tcp_reass_head;
+	KA_T tcp_reass_tail;
+	KA_T tcp_rcv_head;
+	KA_T tcp_rcv_tail;
+	uint tcp_rcv_cnt;
+	uint tcp_rcv_threshold;
+	uint tcp_cwnd_ssthresh;
+	uint tcp_cwnd_bytes_acked;
+	uint tcp_cwnd_max;
+	uint tcp_cwnd_init;
+	int tcp_rto;
+	int tcp_rtt_sa;
+	int tcp_rtt_sd;
+	uint tcp_swl1;
+	uint tcp_swl2;
+	uint32_t tcp_rack;		/* read: acknowledged sequent number */
+	uint tcp_rack_cnt;
+	uint tcp_rack_cur_max;
+	uint tcp_rack_abs_max;
+	KA_T tcp_ts_ptr;
+	uint32_t tcp_ts_updated;
+	uint tcp_max_swnd;
+	uint tcp_sack_cnt;
+	tcpsb_t tcp_sack_blocks[4];
+	KA_T tcp_listener;
+	int tcp_xmit_lowater;
+	uint32_t tcp_irs;
+	uint32_t tcp_iss;
+	uint32_t tcp_fss;
+	uint32_t tcp_urg;
+	uint32_t tcp_ooofin_seq;
+	int tcp_ip_hdr_len;
+	int tcp_first_timer_threshold;
+	int tcp_second_timer_threshold;
+	uint32_t tcp_zero_win_suna;
+	int tcp_first_ctimer_threshold;
+	int tcp_second_ctimer_threshold;
+	int tcp_linger;				/* SO_LINGER interval */
+	KA_T tcp_urp_mp;
+	KA_T tcp_eager_next;
+	KA_T tcp_eager_prev;
+	KA_T tcp_eager_data;
+	KA_T tcp_conn_ind_mp;
+	uint tcp_conn_ind_cnt;
+	uint tcp_conn_ind_max;
+	uint tcp_conn_ind_seqnum;
+	KA_T tcp_conn_ind_list;
+	KA_T tcp_pre_conn_ind_list;
+	int tcp_keepalive_intrvl;		/* SO_KEEPALIVE interval */
+	int tcp_keepalive_detached_intrvl;
+	KA_T tcp_keepalive_mp;
+	int tcp_client_errno;
+	union {
+	    iph_t tcp_u_iph;			/* IP header */
+	    ipha_t tcp_u_ipha;
+	    char tcp_u_buf[128];
+	    double tcp_u_aligner;
+	} tcp_u;
+	uint32_t tcp_sum;
+	uint32_t tcp_remote;
+	uint32_t tcp_bound_source;
+	uint tcp_last_sent_len;
+	KA_T tcp_cookie;
+	KA_T tcp_hnext_port;
+	KA_T tcp_ptphn_port;
+	KA_T tcp_hnext_listener;
+	KA_T tcp_ptphn_listener;
+	KA_T tcp_hnext_established;
+	KA_T tcp_ptphn_established;
+	uint tcp_mirg;
+	KA_T tcp_readers_next;
+	KA_T tcp_readers_ptpn;
+} tcp_s_t;
+
+#endif	/* !defined(LSOF_TCP_S_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/udp_s.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/udp_s.h
new file mode 100644
index 0000000..111c8db
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/udp_s.h
@@ -0,0 +1,79 @@
+/*
+ * udp_s.h for HP-UX 10.30 and above
+ *
+ * This header file defines the UDP connection structure, udp_s, for lsof.
+ * Lsof gets the parameters of a UDP connection from tcp_s.  Lsof locates a
+ * tcp_s structure by scanning the queue structure chain of a UDP stream,
+ * looking for a queue structure whose module name begins with UDP; that queue
+ * structure's private data pointer, q_ptr, addresses its associated tcp_s
+ * structure.
+ *
+ * V. Abell
+ * February, 1998
+ */
+
+#if	!defined(LSOF_UDP_S_H)
+#define	LSOF_UDP_S_H
+
+#include "kernbits.h"
+
+typedef struct udp_s {
+	int udp_state;			/* connection state */
+	KA_T udp_hash_next;
+	KA_T udp_ptphn;
+	uint16_t udp_checksum;
+	uint16_t udp_port[2];		/* source and destination ports */
+	uint32_t udp_src;		/* source IP address */
+	uint32_t udp_dst;		/* destination IP address */
+
+/*
+ * These q4 elements are ignored.
+
+	uint udp_hdr_length;
+	int udp_wroff_xtra;
+	uint udp_family;
+	uint udp_ip_snd_options_len;
+	KA_T udp_ip_snd_options;
+	int udp_linger;
+	union {
+	    uchar udpu1_multicast_ttl;
+	    u32 udpu1_pad;
+	} udp_u1;
+	NET32 udp_multicast_if_addr;
+	KA_T udp_udph;
+	uint udp_priv_stream;
+	uint udp_calc_checksum;
+	uint udp_debug;
+	uint udp_dontroute;
+	uint udp_broadcast;
+	uint udp_useloopback;
+	uint udp_reuseaddr;
+	uint udp_reuseport;
+	uint udp_multicast_loop;
+	uint udp_rx_icmp;
+	uint udp_rx_icmp_set;
+	uint udp_distribute;
+	uint udp_link_status;
+	uint udp_copyavoid;
+	uint udp_pad_to_bit_31;
+	union {
+	    uint udpu2_wants_opts;
+	   struct udpu2_flags_s udpu2_flags;
+	} udp_u2;
+	union {
+	    char udpu3_iphc[72];
+	    iph_t udpu3_iph;
+	    u32 udpu3_ipharr[6];
+	    uble udpu3_aligner;
+	} udp_u3;
+	u8 udp_pad2[2];
+	u8 udp_type_of_service;
+	u8 udp_ttl;
+	u8 udp_bound_ip[4];
+
+ * Those q4 elements were ignored.
+ */
+
+} udp_s_t;
+
+#endif	/* !defined(LSOF_UDP_S_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/vnode.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/vnode.h
new file mode 100644
index 0000000..5a386a1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/hpux11/vnode.h
@@ -0,0 +1,131 @@
+/*
+ * vnode.h for HP-UX 10.30 and above
+ *
+ * This header file defines the locklist, vnode and vattr structures for lsof
+ * in a manner that can be compiled at the application level.
+ *
+ * V. Abell <abe@purdue.edu>
+ * February, 1998
+ */
+
+#if	!defined(LSOF_VNODE_H)
+#define	LSOF_VNODE_H
+#define	_SYS_VNODE_INCLUDED	/* prevent inclusion of <sys/vnode.h> */
+
+#include "kernbits.h"
+#include <sys/types.h>
+#include <sys/sem_beta.h>
+#include <sys/time.h>
+
+#define	VROOT		0x01
+
+typedef struct locklist {		/* lock list */
+	KA_T ll_link;
+	short ll_count;
+	short ll_flags;			/* flags */
+	KA_T ll_proc;			/* proc structure address (unused) */
+	KA_T ll_kthreadp;		/* thread structure address */
+
+	/* ll_start and ll_end should be typed off_t, but there's an
+	 * unresolvable conflict between the size of the kernel's off_t
+	 * and the 32 and 64 bit application off_t sizes.
+	 */
+
+	int64_t ll_start;		/* lock start */
+	int64_t ll_end;			/* lock end */
+	short ll_type;			/* lock type -- e.g., F_RDLCK or
+					 * F_WRLCK */
+	KA_T ll_vp;
+	KA_T ll_waitq;
+	KA_T ll_fwd;			/* forward link */
+	KA_T ll_rev;
+	KA_T ll_sib_fwd;
+	KA_T ll_sib_rev;
+} locklist_t;
+
+enum vtype {
+	VNON = 0,
+	VREG = 0x1,
+	VDIR = 0x2,
+	VBLK = 0x3,
+	VCHR = 0x4,
+	VLNK = 0x5,
+	VSOCK = 0x6,
+	VBAD = 0x7,
+	VFIFO = 0x8,
+	VFNWK = 0x9,
+	VEMPTYDIR = 0xa
+};
+
+enum vfstype {
+	VDUMMY = 0,
+	VNFS = 0x1,
+	VUFS = 0x2,
+	VDEV_VN = 0x3,
+	VNFS_SPEC = 0x4,
+	VNFS_BDEV = 0x5,
+	VNFS_FIFO = 0x6,
+	VCDFS = 0x7,
+	VVXFS = 0x8,
+	VDFS = 0x9,
+	VEFS = 0xa,
+	VLOFS = 0xb
+};
+
+typedef struct vnode {
+	u_short v_flag;			/* flags -- e.g., VROOT */
+	u_short v_shlockc;		/* shared lock count */
+	u_short v_exlockc;		/* exclusive lock count */
+	u_short v_tcount;
+	int v_count;
+	KA_T v_vfsmountedhere;
+	KA_T v_op;			/* operations switch */
+	KA_T v_socket;
+	KA_T v_stream;			/* associated stream */
+	KA_T v_vfsp;			/* pointer to virtual file system
+					 * structure */
+	enum vtype v_type;		/* vnode type */
+	dev_t v_rdev;			/* device -- for VCHR and VBLK
+					 * vnodes */
+	caddr_t v_data;			/* private data -- i.e., pointer to
+					 * successor node structure */
+	enum vfstype v_fstype;
+	KA_T v_vas;
+	vm_sema_t v_lock;
+	KA_T v_cleanblkhd;
+	KA_T v_dirtyblkhd;
+	int v_writecount;
+	KA_T v_locklist;		/* locklist structure chain pointer */
+	int v_scount;
+	int32_t v_nodeid;
+	KA_T v_ncachedhd;
+	KA_T v_ncachevhd;
+	KA_T v_pfdathd;
+	u_int v_last_fsync;
+} vnode_t;
+
+typedef struct vattr {
+	enum vtype va_type;
+	u_short va_mode;
+	short va_nlink;
+	uid_t va_uid;
+	gid_t va_gid;
+	int32_t va_fsid;
+	int32_t va_nodeid;		/* node ID number (e.g., inode
+					 * number) */
+	off64_t va_size;		/* file size */
+	int32_t va_blocksize;
+	struct timeval va_atime;
+	struct timeval va_mtime;
+	struct timeval va_ctime;
+	dev_t va_rdev;
+	blkcnt64_t va_blocks;
+	dev_t va_realdev;
+	u_short va_basemode;
+	u_short va_acl;
+	u_short va_sysVacl;
+	u_short va_dummy;
+	short va_fstype;
+} vattr_t;
+
+#endif	/* !defined(LSOF_VNODE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/machine.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/machine.h
new file mode 100644
index 0000000..f98934d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/kmem/machine.h
@@ -0,0 +1,671 @@
+/*
+ * machine.h - /dev/kmem-based HP-UX definitions 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: machine.h,v 1.42 2010/07/29 16:03:09 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+/*
+ * Do HP-UX 11 64 bit preparation.
+ */
+
+#if	defined(HPUXKERNBITS) && HPUXKERNBITS>=64
+#define	NLIST_TYPE	nlist64
+#endif	/* defined(HPUXKERNBITS) && HPUXKERNBITS>=64 */
+
+
+# if	HPUXV>=1030
+#include <sys/types.h>
+#include "kernbits.h"
+# else	/* HPUXV<1030 */
+#  if	HPUXV>=1020
+/*
+ * Since we need kernel structures from the HP-UX 10.20 <sys/vnode.h>, and
+ * since defining _KERNEL before #include'ing it causes a conflict between
+ * its FILE enum and the FILE struct definition in <stdio.h>, redefine FILE,
+ * #include <stdio.h>, revoke the FILE redefinition, define _KERNEL,
+ * #include <sys/vnode.h>, revoke the _KERNEL definition, and restore the
+ * FILE redefinition.
+ */
+
+#  if	defined(__GNUC__)
+/*
+ * Do gcc preparation.
+ */
+
+#   if	!defined(__STDC_EXT__)
+#define	__STDC_EXT__
+#   endif	/* !defined(__STDC_EXT__) */
+#include <sys/_inttypes.h>
+#  endif	/* defined(__GNUC__) */
+
+#define	FILE	STDIO_FILE
+#include <stdio.h>
+#undef	FILE
+#define	_KERNEL	1
+#include <sys/vnode.h>
+#define	FILE	STDIO_FILE
+#undef	_KERNEL
+#  endif	/* HPUXV>=1020 */
+# endif	/* HPUXV>=1030 */
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#if	HPUXV>=1020
+#define	CAN_USE_CLNT_CREATE	1
+#endif	/* HPUXV>=1020 */
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+#define	GET_MAX_FD	get_max_fd
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+#define	HASAOPT		1
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+/* #define	HASINODE	1 */
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+#define	HASPRINTDEV	print_dev
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+/* #define	HASPROCFS	"proc?" */
+/* #define	HASFSTYPE	1 */
+/* #define	HASPINODEN	1 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+#define	HASRNODE	1
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1	*/
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	HPUXV>=1100
+#define	HASWIDECHAR	1
+#endif	/* HPUXV>=1100 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+# if	HPUXV>=900
+#define	HASSNODE	1
+# endif	/* HPUXV>=900 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#if	HPUXV>=1030
+# if	HPUXV>=1100
+#define	HASSOOPT	1	 /* has socket option information */
+# endif	/* HPUXV>=1100 */
+/* #define	HASSOSTATE	1	has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+#endif	/* HPUXV>=1030 */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+# if	HPUXV>=1030
+#define	HASTCPTPIW	1
+# endif	/* HPUXV>=1030 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior to
+ * R4 usually don't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+# if	HPUXV>=1000
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"		/* INODETYPE printf specification
+					 * modifier */
+# endif	/* HPUXV>=1000 */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	uid_t
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+
+# if	HPUXV<1030
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+# else	/* HPUXV>=1030 */
+/* #define	USE_LIB_PRINT_TCPTPI		1	   ptti.c */
+# endif	/* HPUXV<1030 */
+
+#define	USE_LIB_READDEV				1	/* rdev.c */
+#define	USE_LIB_READMNT				1	/* rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+#define	USE_LIB_RNCH				1	/* rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+
+# if	HPUXV<1030
+#define	USE_LIB_SNPF				1	/* snpf.c */
+# else	/* HPUXV>=1030 */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+# endif	/* HPUXV<1030 */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+/* #define	WARNDEVACCESS	1 */
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)		bzero(a, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/Makefile b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/Makefile
new file mode 100644
index 0000000..a5fea79
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/Makefile
@@ -0,0 +1,150 @@
+
+# HP-UX PSTAT-based Makefile
+#
+# $Id: Makefile,v 1.6 2008/05/09 12:51:46 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    dfile.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c util.c
+
+OBJ=	dfile.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setuid to root if you wish any lsof user to be able to examine'
+	@echo 'all open files.  Your install rule actions might look something'
+	@echo 'like this:'
+	@echo ''
+	@echo '    install -m 4xxx -o root -g <group> $${PROG} $${BIN}'
+	@echo '    install -m 444 $${MAN} $${DOC}'
+	@echo ''
+	@echo 'You will have to complete the 4xxx modes, the <group> value,'
+	@echo 'and the skeletons for the BIN and DOC strings, given at the'
+	@echo 'beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo '    GRP= sys'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_CINFO	"${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dfile.o:	${HDR} dfile.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/Mksrc
new file mode 100755
index 0000000..0840e1a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make pstat-based HP-UX source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.1 99/05/25 13:04:50 abe Exp $
+
+
+D=dialects/hpux/pstat
+L="dfile.c dlsof.h dfile.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dfile.c
new file mode 100644
index 0000000..b68ffdf
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dfile.c
@@ -0,0 +1,806 @@
+/*
+ * dfile.c -- pstat-based HP-UX file functions for lsof
+ */
+
+
+/*
+ * Copyright 1999 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1999 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HASNCACHE)
+/*
+ * Local definitions
+ */
+
+#define DNLCINCR	2048		/* DNLC read increment */
+
+#define	NFSIDH		256		/* file system ID hash count
+					 * -- MUST BE A POWER OF TWO!!! */
+#define	NFSID		sizeof(struct psfsid)
+					/* size of psfsid structure */
+#define	NL_NC		sizeof(struct l_nc)
+					/* size of l_nc structure */
+#define	NPSTM		sizeof(struct pst_mpathnode)
+					/* size of pst_mpathnode */
+
+
+/*
+ * Local structure definitions
+ */
+
+struct l_nc {				/* local name cache */
+	struct psfileid id;		/* node's PSTAT ID */
+	struct psfileid par;		/* parent's PSTAT ID */
+	struct l_nc *pl;		/* local parent name cache entry --
+					 * NULL if not found or not yet
+					 * accessed (see pls) */
+	int pls;			/* status of pl: 0 = not accessed
+					 *		 1 = accessed */
+	int nl;				/* name length */
+	char *nm;			/* name */
+	struct l_nc *next;		/* next hash bucket link */
+};
+
+struct l_fic {				/* file system ID cache */
+	struct psfsid fsid;		/* file system ID */
+	int nc;				/* files cached for file system */
+	struct l_fic *next;		/* next hash bucket link */
+};
+
+
+/*
+ * Local static variables
+ */
+
+static int Nceh;			/* number of Nchash entries allocated */
+static struct l_nc **Nchash = (struct l_nc **)NULL;
+					/* the name cache hash buckets */
+static int Ncmask;			/* power of two mask for the name
+					 * cache -- sized from Nc */
+static int Ndnlc;			/* number of DNLC entries via
+					 * pst_dynamic.psd_dnlc_size */
+static struct l_fic **Ncfsid = (struct l_fic **)NULL;
+					/* the file system hash buckets */
+static struct pst_fid Nzpf;		/* zeroed pst_fid (for memcmp()) */
+static struct psfileid Nzps;		/* zeroed psfilid (for memcmp()) */
+static int Nzpfs = 0;			/* Nzpf status: 1 = zeroed */
+static int Nzpss = 0;			/* Nzps status: 1 = zeroed */
+
+
+/*
+ * Local macros
+ */
+
+#define	HASHFSID(i)	(Ncfsid + \
+	(((int)(((((struct psfsid *)i)->psfs_id * 31415) << 3)&0xfffffff) \
+	+ (int)((((((struct psfsid *)i)->psfs_type * 31415) << 5)&0xfffffff))) \
+	& (NFSIDH - 1)))
+#define	HASHPSFILEID(p)	(Nchash + \
+	(((int)(((int)((((struct psfileid *)p)->psf_fsid.psfs_id * 31415) << 3)\
+		& 0xfffffff) \
+	+ (int)(((((struct psfileid *)p)->psf_fsid.psfs_type * 31415) << 5) \
+		& 0xfffffff) \
+	+ (int)(((((struct psfileid *)p)->psf_fileid * 31415) << 7) \
+		& 0xfffffff))) \
+	& Ncmask))
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct l_nc *ncache_addr,(struct psfileid *ps));
+_PROTOTYPE(static void ncache_free,(void));
+_PROTOTYPE(static int ncache_isroot,(struct psfileid *ps));
+_PROTOTYPE(static void ncache_size,(void));
+#endif	/* defined(HASNCACHE) */
+
+
+#if	defined(HASIPv6)
+/*
+ * gethostbyname2() -- an RFC2133-compatible get-host-by-name-two function
+ *                     to get AF_INET and AF_INET6 addresses from host names,
+ *                     using the gethostbyname() and RFC2553-compatible
+ *		       getipnodebyname() functions
+ */
+
+extern struct hostent *
+gethostbyname2(nm, prot)
+	char *nm; 			/* host name */
+	int prot;			/* protocol -- AF_INET or AF_INET6 */
+{
+	int err;
+
+	if (prot == AF_INET) {
+
+	/*
+	 * This shouldn't be necessary if /etc/nsswitch.conf is correct, but
+	 * it's a good fail-safe in case /etc/nsswitch.conf is missing or
+	 * incorrect.
+	 */
+	    return(gethostbyname(nm));
+	}
+	return(getipnodebyname(nm, prot, 0, &err));
+}
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * get_max_fd() -- get maximum file descriptor plus one
+ */
+
+int
+get_max_fd()
+{
+	struct rlimit r;
+
+	if (getrlimit(RLIMIT_NOFILE, &r))
+	    return(-1);
+	return(r.rlim_cur);
+}
+
+
+#if	defined(HASNCACHE)
+
+
+/*
+ * ncache_addr() -- get ncache entry address
+ */
+
+static struct l_nc *
+ncache_addr(ps)
+	struct psfileid *ps;		/* parent's psfileid */
+{
+	struct l_nc **hp, *lc;
+
+	for (hp = HASHPSFILEID(ps), lc = *hp; lc; lc = lc->next) {
+	    if (!memcmp((void *)ps, (void *)&lc->id, sizeof(struct psfileid)))
+		return(lc);
+	}
+	return((struct l_nc *)NULL);
+}
+
+
+/*
+ * ncache_alloc() -- allocate name cache space
+ */
+
+static void
+ncache_alloc()
+{
+	if (Nchash || Ncfsid)
+	    ncache_free();
+	(void) ncache_size();
+	if (!(Nchash = (struct l_nc **)calloc(Nceh, sizeof(struct l_nc *))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d local name cache entries\n", Pn, Nceh);
+	    Exit(1);
+	}
+	if (Ncfsid)
+	    return;
+	if (!(Ncfsid = (struct l_fic **)calloc(NFSIDH, sizeof(struct l_fic *))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d local file system cache entries\n",
+		Pn, NFSIDH);
+	    Exit(1);
+	}
+}
+
+
+/*
+ * ncache_free() -- free previous ncache allocations
+ */
+
+static void
+ncache_free()
+{
+	int i;
+	struct l_fic **fh, *fp, *fx;
+	struct l_nc **nh, *np, *nx;
+
+	if (Ncfsid) {
+
+	/*
+	 * Free file system ID hash bucket contents.
+	 */
+	    for (fh = Ncfsid, i = 0; i < NFSIDH; fh++, i++) {
+		for (fp = *fh; fp; fp = fx) {
+		    fx = fp->next;
+		    (void) free((MALLOC_P *)fp);
+		}
+		Ncfsid[i] = (struct l_fic *)NULL;
+	    }
+	}
+	if (Nchash) {
+
+	/*
+	 * Free name cache.
+	 */
+	    for (i = 0, nh = Nchash; i < Nceh; i++, nh++) {
+		for (np = *nh; np; np = nx) {
+		    nx = np->next;
+		    if (np->nm)
+			(void) free((MALLOC_P *)np->nm);
+		    (void) free((MALLOC_P *)np);
+		}
+	    }
+	    (void) free((MALLOC_P *)Nchash);
+	    Nchash = (struct l_nc **)NULL;
+	}
+}
+
+
+/*
+ * ncache_isroot() -- does psfileid represent the root of a file system?
+ */
+
+static int
+ncache_isroot(ps)
+	struct psfileid *ps;		/* psfileid */
+{
+	if (!ps->psf_fsid.psfs_id && !ps->psf_fsid.psfs_type
+	&&  ps->psf_fileid == -1)
+	    return(1);
+
+# if	defined(HASFSINO)
+	if (!Lf->fs_ino || (Lf->inp_ty != 1) || !Lf->dev_def)
+	    return(0);
+	if ((Lf->dev == (dev_t)ps->psf_fsid.psfs_id)
+	&&  (Lf->fs_ino == (unsigned long)ps->psf_fileid))
+	    return(1);
+# endif	/* defined(HASFSINO) */
+
+	return(0);
+}
+
+
+/*
+ * ncache_load() -- load name cache
+ */
+
+void
+ncache_load()
+{
+	if (!Fncache)
+	    return;
+	(void) ncache_alloc();
+	if (!Nzpfs) {
+	    (void)memset((void *)&Nzpf, 0, sizeof(Nzpf));
+	    Nzpfs = 1;
+	}
+	if (!Nzpss) {
+	    (void)memset((void *)&Nzps, 0, sizeof(Nzps));
+	    Nzpss = 1;
+	}
+}
+
+
+/*
+ * ncache_loadfs() -- load the name cache for a file system
+ */
+
+struct l_fic *
+ncache_loadfs(fsid, fh)
+	struct psfsid *fsid;		/* ID of file system to add */
+	struct l_fic **fh;		/* Ncfsid hash bucket */
+{
+	char *cp;
+	struct l_fic *f;
+	int i, nl, nr;
+	struct pst_mpathnode mp[DNLCINCR];
+	struct l_nc **nh, *nn, *nt, *ntp;
+	int x = 0;
+/*
+ * Allocate a new file system pointer structure and link it to its bucket.
+ */
+	if (!(f = (struct l_fic *)malloc(sizeof(struct l_fic)))) {
+	    (void) fprintf(stderr, "%s: no fsid structure space\n", Pn);
+	    Exit(1);
+	}
+	f->fsid = *fsid;
+	f->nc = 0;
+	f->next = *fh;
+	*fh = f;
+	while ((nr = pstat_getmpathname(&mp[0], NPSTM, DNLCINCR, x, fsid)) > 0)
+	{
+	    x = mp[nr - 1].psr_idx + 1;
+	    for (i = 0; i < nr; i++) {
+
+	    /*
+	     * Ignore NUL names, ".", and "..".
+	     */
+		if (!(nl = (int)strlen(mp[i].psr_name)))
+		    continue;
+		if ((nl < 3) && (mp[i].psr_name[0] == '.')) {
+		    if ((nl == 1) || (mp[i].psr_name[1] == '.'))
+			continue;
+		}
+	    /*
+	     * Allocate name and name cache structure space.
+	     */
+		if (!(cp = (char *)malloc((MALLOC_S)(nl + 1)))) {
+		    (void) fprintf(stderr,
+			"%s: no name entry space (%d) for:%s\n",
+			Pn, nl + 1, mp[i].psr_name);
+		    Exit(1);
+		}
+		if (!(nn = (struct l_nc *)malloc(sizeof(struct l_nc)))) {
+		    (void) fprintf(stderr,
+			"%s: no name cache entry space (%d) for: %s\n",
+			Pn, (int)sizeof(struct l_nc), mp[i].psr_name);
+		    Exit(1);
+		}
+	    /*
+	     * Fill in name cache entry, complete with name and name length.
+	     */
+		(void) snpf(cp, nl + 1, "%s", mp[i].psr_name);
+		nn->id = mp[i].psr_file;
+		nn->par = mp[i].psr_parent;
+		nn->nm = cp;
+		nn->nl = nl;
+		nn->pl = nn->next = (struct l_nc *)NULL;
+		nn->pls = 0;
+		nh = HASHPSFILEID(&mp[i].psr_file);
+	    /*
+	     * Skip to the end of the hash bucket chain, looking for
+	     * duplicates along the way.
+	     */
+		for (nt = *nh, ntp = (struct l_nc *)NULL;
+		     nt;
+		     ntp = nt, nt = nt->next)
+		{
+		    if (memcmp((void *)&nt->id, (void *)&nn->id, NL_NC) == 0)
+			break;
+		}
+		if (nt) {
+
+		/*
+		 * Remove a duplicate.
+		 */
+		    if (ntp)
+			ntp = nt->next;
+		    else
+			*nh = nt->next;
+		    (void) free((MALLOC_P *)nt->nm);
+		    (void) free((MALLOC_P *)nt);
+		    (void) free((MALLOC_P *)nn->nm);
+		    (void) free((MALLOC_P *)nn);
+		} else {
+
+		/*
+		 * Link a new entry.
+		 */
+		    if (ntp)
+			ntp->next = nn;
+		    else
+			*nh = nn;
+		    f->nc++;
+		}
+	    }
+	    if (nr < DNLCINCR)
+		break;
+	}
+	return(f);
+}
+
+
+/*
+ * ncache_lookup() -- look up a node's name in the kernel's name cache
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	int ef;
+	struct l_fic **fh, *fs;
+	struct l_nc *lc;
+	int nl, rlen;
+	char *pc;
+
+	*cp = '\0';
+	*fp = 0;
+
+# if	defined(HASFSINO)
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller that the already-printed system mount point name is sufficient.
+ */
+	if (Lf->inp_ty == 1 && Lf->fs_ino && Lf->inode == Lf->fs_ino)
+	    return(cp);
+# endif	/* defined(HASFSINO) */
+
+/*
+ * See if cache has been loaded for this pfsid.  Don't try to load if cache
+ * loading has been inhibited with -C, or unless the real or effective UID of
+ * this process is root.
+ */
+	if ((!Myuid || Setuidroot) && Fncache) {
+	    for (fh = HASHFSID(&Lf->psfid.psf_fsid), fs = *fh;
+		 fs;
+		 fs = fs->next)
+	    {
+		if (memcmp((void *)&fs->fsid, (void *)&Lf->psfid.psf_fsid,
+			    NFSID)
+		== 0)
+		    break;
+	    }
+	    if (!fs)
+		fs = ncache_loadfs(&Lf->psfid.psf_fsid, fh);
+	} else
+	    fs = (struct l_fic *)NULL;
+/*
+ * Search the cache for an entry whose psfileid matches.
+ */
+	if (!fs || !fs->nc || !(lc = ncache_addr(&Lf->psfid))) {
+
+	/*
+	 * If the node has no cache entry, see if it's the root of the file
+	 * system.
+	 */
+
+# if	defined(HASFSINO)
+	    if (Lf->fs_ino && (Lf->inp_ty == 1) && (Lf->fs_ino == Lf->inode))
+		return(cp);
+# endif	/* defined(HASFSINO) */
+
+	/*
+	 * If the file system's cache couldn't be loaded -- e.g., this lsof
+	 * process lacks permission to load it or cache lookup is inhibited
+	 * with -C -- but the UID of the file's process matches the UID of the
+	 * lsof process, see if it's possible to read the single path name for
+	 * this particular file.  (The file must have a non-zero opaque ID.)
+	 */
+	    if (!fs) {
+		if (Fncache
+		&&  (Myuid == Lp->uid)
+		&&  memcmp((void *)&Lf->opfid, (void *)&Nzpf, sizeof(Nzpf))
+		&&  (nl = pstat_getpathname(buf, (blen - 1), &Lf->opfid)) > 0)
+		{
+		    buf[nl] = '\0';
+		    if (*buf == '/')
+			*fp = 1;
+		    return(buf);
+		}
+	    }
+	    return((char *)NULL);
+	}
+	if (ncache_isroot(&lc->id)) {
+
+	/*
+	 * If the node is the root of the file system, return a response
+	 * that will cause the root directory to be displayed.
+	 */
+	    return(cp);
+	}
+/*
+ * Start the path assembly.
+ */
+	if ((nl = lc->nl) > (blen - 1))
+	    return((char *)NULL);
+	cp = buf + blen - nl - 1;
+	rlen = blen - nl - 1;
+	(void) snpf(cp, nl + 1, "%s", lc->nm);
+/*
+ * Look up the name cache entries that are parents of the node address.
+ * Quit when:
+ *
+ *	there's no parent;
+ *	the file system root is reached;
+ *	the name length is too large to fit in the receiving buffer.
+ */
+	for (ef = 0; !ef;) {
+	    if (!lc->pl) {
+		if (!lc->pls) {
+
+		/*
+		 * If there is a parent, look up its Ncache address;
+		 * otherwise quit on an incomplete path assembly.
+		 */
+		    if (memcmp((void *)&lc->par, (void *)&Nzps, sizeof(Nzps))) {
+			lc->pl = ncache_addr(&lc->par);
+			lc->pls = 1;
+		    } else
+			break;
+		}
+	    }
+	    if (ncache_isroot(&lc->par)) {
+
+	    /*
+	     * If the parent entry is the file system root, enter the file
+	     * system root directory, and indicate that the assembly should
+	     * stop after this entry.
+	     */
+		if (!(pc = Lf->fsdir))
+		    break;
+		nl = (int)strlen(pc);
+		ef = 1;
+	    } else {
+
+	    /*
+	     * Use the parent link if it exists; otherwise exit on an
+	     * incomplete path assembly.
+	     */
+	        if (!(lc = lc->pl))
+		    break;
+		pc = lc->nm;
+		nl = lc->nl;
+	    }
+	/*
+	 * Prefix the next path component.  Intersperse a '/' if the
+	 * component doesn't end in one.
+	 */
+	    if (!nl)
+		break;
+	    if (pc[nl - 1] != '/') {
+		if (1 > rlen)
+		    break;
+		*(cp - 1) = '/';
+		cp--;
+		rlen--;
+	    }
+	    if (nl > rlen)
+		break;
+	    (void) strncpy((cp - nl), pc, nl);
+	    cp -= nl;
+	    rlen -= nl;
+	    if (ef) {
+
+	    /*
+	     * If the file system root directory was just prefixed, return
+	     * a full-path indication.
+	     */
+		*fp = 1;
+		break;
+	    }
+	}
+	return(cp);
+}
+
+
+/*
+ * ncache_size() -- get DNLC size
+ */
+
+static void
+ncache_size()
+{
+	struct pst_dynamic pd;
+
+	if (pstat_getdynamic(&pd, sizeof(pd), 1, 0) != 1) {
+	    (void) fprintf(stderr, "%s: can't get dynamic status\n", Pn);
+	    Exit(1);
+	}
+	Ndnlc = (int)pd.psd_dnlc_size;
+	for (Nceh = 1; Nceh < (Ndnlc + Ndnlc); Nceh <<= 1)
+		;
+	Ncmask = Nceh - 1;
+}
+#endif	/* defined(HASNCACHE) */
+
+
+/*
+ * print_dev() -- print device
+ */
+
+char *
+print_dev(lf, dev)
+	struct lfile *lf;		/* file whose device is to be printed */
+	dev_t *dev;			/* device to be printed */
+{
+	static char buf[128];
+
+	(void) snpf(buf, sizeof(buf), "%d,%#x", GET_MAJ_DEV(*dev),
+		    GET_MIN_DEV(*dev));
+	return(buf);
+}
+
+
+/*
+ * process_finfo() -- process file information
+ */
+
+void
+process_finfo(pd, opfid, psfid, na)
+	struct pst_filedetails *pd;	/* file details */
+	struct pst_fid *opfid;		/* opaque file ID for this file */
+	struct psfileid *psfid;		/* PSTAT file ID for this file */
+	KA_T na;			/* node address */
+{
+	char *cp, buf[32];
+	dev_t dev;
+	int devs = 0;
+	int32_t lk;
+	struct mounts *mp;
+/*
+ * Save file IDs for later use in name lookup.
+ */
+	Lf->opfid = *opfid;
+	Lf->psfid = *psfid;
+
+#if	defined(HASFSTRUCT)
+/*
+ * Save node ID.
+ */
+	if (na && (Fsv & FSV_NI)) {
+	    Lf->fna = na;
+	    Lf->fsv |= FSV_NI;
+	}
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Construct lock code.
+ */
+	if ((lk = pd->psfd_lckflag) & PS_FPARTRDLCK)
+	    Lf->lock = 'r';
+	else if (lk & PS_FPARTWRLCK)
+	    Lf->lock = 'w';
+	else if (lk & PS_FFULLRDLCK)
+	    Lf->lock = 'R';
+	else if (lk & PS_FFULLWRLCK)
+	    Lf->lock = 'W';
+	else
+	    Lf->lock = ' ';
+/*
+ * Derive type from modes.
+ */
+	switch ((int)(pd->psfd_mode & PS_IFMT)) {
+	case PS_IFREG:
+	    cp = "REG";
+	    Ntype = N_REGLR;
+	    break;
+	case PS_IFBLK:
+	    cp = "BLK";
+	    Ntype = N_BLK;
+	    break;
+	case PS_IFDIR:
+	    cp = "DIR";
+	    Ntype = N_REGLR;
+	    break;
+	case PS_IFCHR:
+	    cp = "CHR";
+	    Ntype = N_CHR;
+	    break;
+	case PS_IFIFO:
+	    cp = "FIFO";
+	    Ntype = N_FIFO;
+	    break;
+	default:
+	    (void) snpf(buf, sizeof(buf), "%04o",
+		(unsigned int)(((pd->psfd_mode & PS_IFMT) >> 12) & 0xfff));
+	    cp = buf;
+	    Ntype = N_REGLR;
+	}
+	if (!Lf->type[0])
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", cp);
+	Lf->ntype = Ntype;
+/*
+ * Save device number.
+ */
+	switch (Ntype) {
+	case N_FIFO:
+	    (void) enter_dev_ch(print_kptr(na, (char *)NULL, 0));
+	    break;
+	default:
+	    dev = Lf->dev = (dev_t)pd->psfd_dev;
+	    devs = Lf->dev_def = 1;
+	    if ((Ntype == N_CHR) || (Ntype == N_BLK)) {
+		Lf->rdev = (dev_t)pd->psfd_rdev;
+		Lf->rdev_def = 1;
+	    }
+	}
+/*
+ * Save node number.
+ */
+	Lf->inode = (INODETYPE)pd->psfd_ino;
+	Lf->inp_ty = 1;
+/*
+ * Save link count.
+ */
+	if (Fnlink) {
+
+	/*
+	 * Ignore a zero link count only if the file is a FIFO.
+	 */
+	    if ((Lf->nlink = (long)pd->psfd_nlink) || (Ntype != N_FIFO))
+		Lf->nlink_def = 1;
+	    if (Lf->nlink_def && Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Save file system identity.
+ */
+	if (devs) {
+	    for (mp = readmnt(); mp; mp = mp->next) {
+		if (dev == mp->dev) {
+		    Lf->fsdir = mp->dir;
+		    Lf->fsdev = mp->fsname;
+
+#if	defined(HASFSINO)
+		    Lf->fs_ino = (unsigned long)mp->inode;
+#endif	/* defined(HASFSINO) */
+
+		    break;
+		}
+	    }
+	} else
+	    mp = (struct mounts *)NULL;
+/*
+ * If no offset has been activated and no size saved, activate the offset or
+ * save the size.
+ */
+	if (!Lf->off_def && !Lf->sz_def) {
+	    if (Foffset)
+		Lf->off_def = 1;
+	    else {
+		switch (Ntype) {
+		case N_CHR:
+		case N_FIFO:
+		    Lf->off_def = 1;
+		    break;
+		default:
+		    Lf->sz = (SZOFFTYPE)pd->psfd_size;
+		    Lf->sz_def = 1;
+		}
+	    }
+	}
+/*
+ * See if this is an NFS file.
+ */
+	if (Fnfs) {
+	    if (HasNFS < 0)
+		(void) scanmnttab();
+	    if (HasNFS && mp && mp->is_nfs)
+		Lf->sf |= SELNFS;
+	}
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named(NULL,
+				   ((Ntype == N_CHR) || (Ntype == N_BLK) ? 1
+									 : 0)))
+	    Lf->sf |= SELNM;
+/*
+ * Enter name characters.
+ */
+	if (!Lf->nm && Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dlsof.h
new file mode 100644
index 0000000..dff34e5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dlsof.h
@@ -0,0 +1,206 @@
+/*
+ * dlsof.h - pstat-based HP-UX header file for lsof
+ */
+
+
+/*
+ * Copyright 1999 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.8 2008/10/21 16:17:50 abe Exp $
+ */
+
+
+#if	!defined(HPUX_LSOF_H)
+#define	HPUX_LSOF_H	1
+
+#include <stddef.h>
+#include <stdlib.h>
+#include <dirent.h>
+#include <mntent.h>
+#include <setjmp.h>
+#include <string.h>
+#include <unistd.h>
+
+#include <arpa/inet.h>
+#include <netinet/in.h>
+
+# if	defined(HASIPv6)
+#include <netinet/in6.h>
+# endif	/* defined(HASIPv6) */
+
+#include <rpc/types.h>
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+
+#include <sys/fstyp.h>
+#include <sys/mount.h>
+#include <sys/param.h>
+#include <sys/pstat.h>
+
+# if	defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS==64 && defined(_APP32_64BIT_OFF_T)
+#define	TMP_APP32_64BIT_OFF_T	_APP32_64BIT_OFF_T
+#undef	_APP32_64BIT_OFF_T
+# endif
+
+# if	!defined(__LP64__) && defined(_LARGEFILE64_SOURCE) && HPUXV>=1123
+/*
+ * Make sure a 32 bit lsof for HPUX>=1123 uses [l]stat64 when
+ * _LARGEFILE64_SOURCE is defined.
+ */
+
+#define	stat	stat64
+#define	lstat	lstat64
+# endif	/* !defined(__LP64__) && defined(_LARGEFILE64_SOURCE) && HPUXV>=1123 */
+
+#include <sys/socket.h>
+
+# if	defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS==64 && defined(_APP32_64BIT_OFF_T)
+#define	_APP32_64BIT_OFF_T	TMP_APP32_64BIT_OFF_T
+#undef	TMP_APP32_64BIT_OFF_T
+# endif
+ 
+#include <sys/tihdr.h>
+#include <sys/un.h>
+
+
+/*
+ * This definition is needed for the common function prototype definitions
+ * in "proto.h".  The /proc-based lsof also uses it to make sure its
+ * manufactured node ID number has 64 bits.
+ */
+
+typedef	unsigned long long	KA_T;
+#define	KA_T_FMT_X		"%#llx"
+
+
+/*
+ * Local definitions
+ */
+
+# if	defined(HAS_CONST)
+#define	COMP_P		const void
+# else	/* !defined(HAS_CONST) */
+#define	COMP_P		void
+# endif	/* defined(HAS_CONST) */
+
+#define DEVINCR		1024	/* device table malloc() increment */
+#define MALLOC_P	void
+#define FREE_P		void
+#define MALLOC_S	unsigned
+#define MOUNTED		MNT_MNTTAB
+#define QSORT_P		void
+#define	READLEN_T	int
+#define STRNCPY_L	size_t
+#define	SZOFFTYPE	unsigned long long
+#define	SZOFFPSPEC	"ll"	/* SZOFFTYPE printf specification modifier */
+#define	XDR_PMAPLIST	(xdrproc_t)xdr_pmaplist
+#define	XDR_VOID	(xdrproc_t)xdr_void
+
+
+/* 
+ * Local macros
+ */
+
+#define	IS_PSFILEID(p)	((p)->psf_fsid.psfs_id || (p)->psf_fsid.psfs_type)
+					/* is psfiled active? */
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+extern _T_LONG_T CloneMaj;		/* clone major device number */
+extern int HaveCloneMaj;		/* clone major status */
+
+struct mounts {
+	char *dir;              	/* directory (mounted on) */
+	char *fsname;           	/* file system
+					 * (symbolic links unresolved) */
+	char *fsnmres;           	/* file system
+					 * (symbolic links resolved) */
+	char *mnt_fstype;		/* file system type -- e.g.,
+					 * MNTTYPE_NFS */
+	int stat_fstype;		/* st_fstype */
+	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 */
+	u_char is_nfs;			/* file system type is MNTTYPE_NFS or
+					 * MNTTYPE_NFS3 */
+	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 */
+};
+
+extern char **Fsinfo;
+extern int Fsinfomax;
+extern int HasNFS;
+
+
+/*
+ * Definitions for dvch.c, isfn.c, and rdev.c
+ */
+
+#define	CLONEMAJ	CloneMaj	/* clone major variable name */
+#define	DIRTYPE	dirent
+#define HASDNAMLEN	1		/* DIRTYPE has d_namlen element */
+#define	HAS_STD_CLONE	1		/* uses standard clone structure */
+#define	HAVECLONEMAJ	HaveCloneMaj	/* clone major status variable name */
+#define	MAXSYSCMDL	(PST_UCOMMLEN - 1)
+					/* max system command name length */
+
+
+/*
+ * Definition for rmnt.c
+ */
+
+#define MNTSKIP \
+	{ if (strcmp(mp->mnt_type, MNTTYPE_IGNORE) == 0) \
+		continue; }
+#define	RMNT_FSTYPE		mnt_type
+#define	MOUNTS_FSTYPE		mnt_fstype
+
+# if	defined(HASFSTYPE) && HASFSTYPE==2
+#define	RMNT_STAT_FSTYPE	st_fstype
+#define	MOUNTS_STAT_FSTYPE	stat_fstype
+# endif	/* defined(HASFSTYPE) && HASFSTYPE==2 */
+
+#endif	/* HPUX_LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dproc.c
new file mode 100644
index 0000000..fb0c8e4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dproc.c
@@ -0,0 +1,904 @@
+/*
+ * dproc.c -- pstat-based HP-UX process access functions for lsof
+ */
+
+
+/*
+ * Copyright 1999 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1999 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	FDS_ALLOC_INCR	256		/* fds[] allocation increment */
+#define	FDS_ALLOC_INIT	64		/* initial fds[] allocation */
+#define	FINFOINCR	128		/* pst_fileinfo2 table allocation
+					 * increment */
+#define INCLMEM(s, m)	((size_t)(offsetof(struct s, m) \
+			+	  sizeof(((struct s *)0)->m)))
+					/* size of struct s, including
+					 * member m */
+#define	PSTATINCR	512		/* pst_status table allocation
+					 * increment */
+#define	TXTVMINCR	64		/* text and vm info table table
+					 * allocation increment */
+#define	VMREGINCR	64		/* VM region table table allocation
+					 * increment */
+
+
+/*
+ * Local structures
+ */
+
+struct pstatck {
+	size_t moff;			/* offset of size member in pst_static
+					 * -- from offsetof(...member) */
+	size_t msz;			/* structure's pst_static member
+					 * inclusion size -- from INCLMEM(s, m)
+					 * macro */
+	size_t ssz;			/* structure size -- from
+					 * sizeof(struct) */
+	char *sn;			/* structure name */
+} PstatCk[] = {
+	{ (size_t)offsetof(struct pst_static, pst_status_size),
+	  (size_t)INCLMEM(pst_static, pst_status_size),
+	  sizeof(struct pst_status),
+	  "pst_status" },
+	{ (size_t)offsetof(struct pst_static, pst_vminfo_size),
+	  (size_t)INCLMEM(pst_static, pst_vminfo_size),
+	  sizeof(struct pst_vminfo),
+	  "pst_vminfo" },
+	{ (size_t)offsetof(struct pst_static, pst_filedetails_size),
+	  (size_t)INCLMEM(pst_static, pst_filedetails_size),
+	  sizeof(struct pst_filedetails),
+	  "pst_filedetails" },
+	{ (size_t)offsetof(struct pst_static, pst_socket_size),
+	  (size_t)INCLMEM(pst_static, pst_socket_size),
+	  sizeof(struct pst_socket),
+	  "pst_socket" },
+	{ (size_t)offsetof(struct pst_static, pst_stream_size),
+	  (size_t)INCLMEM(pst_static, pst_stream_size),
+	  sizeof(struct pst_stream),
+	  "pst_stream" },
+	{ (size_t)offsetof(struct pst_static, pst_mpathnode_size),
+	  (size_t)INCLMEM(pst_static, pst_mpathnode_size),
+	  sizeof(struct pst_mpathnode),
+	  "pst_mpathnode" },
+	{ (size_t)offsetof(struct pst_static, pst_fileinfo2_size),
+	  (size_t)INCLMEM(pst_static, pst_fileinfo2_size),
+	  sizeof(struct pst_fileinfo2),
+	  "pst_fileinfo2" },
+};
+#define	NPSTATCK	(sizeof(PstatCk) /sizeof(struct pstatck))
+
+
+/*
+ * Local static variables
+ */
+
+static int HvRtPsfid = -1;		/* "/" psfileid status:
+					 *     -1: not yet tested;
+					 *	0: tested and unknown;
+					 *	1: tested and known */
+static struct psfileid RtPsfid;		/* "/" psfileid */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void get_kernel_access,(void));
+_PROTOTYPE(static void process_text,(struct pst_status *p));
+_PROTOTYPE(static struct pst_fileinfo2 *read_files,(struct pst_status *p,
+						    int *n));
+_PROTOTYPE(static struct pst_status *read_proc,(int *n));
+_PROTOTYPE(static struct pst_vm_status *read_vmreg,(struct pst_status *p,
+						    int *n));
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	short cckreg;			/* conditional status of regular file
+					 * checking:
+					 *     0 = unconditionally check
+					 *     1 = conditionally check */
+	short ckscko;			/* socket file only checking status:
+					 *     0 = none
+					 *     1 = check only socket files,
+					 *	   including TCP and UDP
+					 *	   streams with eXPORT data,
+					 *	   where supported */
+	int cwds, fd, *fds, fdsa, i, j, l, nf, np, rtds;
+	struct pst_fileinfo2 *f;
+	long flag;
+	KA_T ka, na;
+	MALLOC_S nb;
+	struct pst_status *p;
+	struct pst_filedetails pd;
+	struct pst_socket *s;
+	short pss, sf;
+/*
+ * Compute current working and root directory statuses and the statuses of
+ * the first FDS_ALLOC_INIT FDs.
+ */
+	if (Fand && Fdl) {
+	    cwds = (ck_fd_status(CWD, -1) != 2) ? 0 : 1;
+	    rtds = (ck_fd_status(RTD, -1) != 2) ? 0 : 1;
+	    nb = (MALLOC_S)(sizeof(int) * FDS_ALLOC_INIT);
+	    if (!(fds = (int *)malloc(nb))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d FD status entries\n", Pn,
+		    FDS_ALLOC_INIT);
+		Exit(1);
+	    }
+	    for (fdsa = 0; fdsa < FDS_ALLOC_INIT; fdsa++) {
+		if (Fand && Fdl)
+		    fds[fdsa] = (ck_fd_status(NULL, fdsa) == 2) ? 1 : 0;
+		else
+		    fds[fdsa] = 1;
+	    }
+	} else {
+	    cwds = rtds = 1;
+	    fdsa = 0;
+	    fds = (int *)NULL;
+	}
+/*
+ * If only socket files have been selected, or socket files have been selected
+ * ANDed with other selection options, enable the skipping of regular files.
+ *
+ * If socket files and some process options have been selected, enable
+ * conditional skipping of regular file; i.e., regular files will be skipped
+ * unless they belong to a process selected by one of the specified options.
+ */
+	if (Selflags & SELNW) {
+
+	/*
+	 * Some network files selection options have been specified.
+	 */
+	    if (Fand || !(Selflags & ~SELNW)) {
+
+	    /*
+	     * Selection ANDing or only network file options have been
+	     * specified, so set unconditional skipping of regular files
+	     * and socket file only checking.
+	     */
+		cckreg = 0;
+		ckscko = 1;
+	    } else {
+
+	    /*
+	     * If ORed file selection options have been specified, or no ORed
+	     * process selection options have been specified, enable
+	     * unconditional file checking and clear socket file only checking.
+	     *
+	     * If only ORed process selection options have been specified,
+	     * enable conditional file skipping and socket file only checking.
+	     */
+		if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+		    cckreg = ckscko = 0;
+		else
+		    cckreg = ckscko = 1;
+	    }
+	} else {
+
+	/*
+	 * No network file selection options were specified.  Enable
+	 * unconditional file checking and clear socket file only checking.
+	 */
+	    cckreg = ckscko = 0;
+	}
+/*
+ * Examine proc structures and their associated information.
+ */
+	for (i = 0, p = read_proc(&np); i < np; i++, p++) {
+	    if (!p->pst_stat || p->pst_stat == PS_ZOMBIE)
+		continue;
+	    if (is_proc_excl((int)p->pst_pid, (int)p->pst_pgrp,
+			     (UID_ARG)p->pst_uid, &pss, &sf))
+		continue;
+	/*
+	 * Make sure the command name is NUL-terminated.
+	 */
+	    p->pst_ucomm[PST_UCOMMLEN - 1] = '\0';
+	    if (is_cmd_excl(p->pst_ucomm, &pss, &sf))
+		continue;
+	    if (cckreg) {
+
+	    /*
+	     * If conditional checking of regular files is enabled, enable
+	     * socket file only checking, based on the process' selection
+	     * status.
+	     */
+		ckscko = (sf & SELPROC) ? 0 : 1;
+	    }
+	    alloc_lproc((int)p->pst_pid, (int)p->pst_pgrp, (int)p->pst_ppid,
+			(UID_ARG)p->pst_uid, p->pst_ucomm, (int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (!ckscko && cwds
+	    &&  IS_PSFILEID(&p->pst_cdir) && (p->pst_cdir.psf_fileid > 0)
+	    ) {
+		alloc_lfile(CWD, -1);
+		if ((na = read_det(&p->pst_fid_cdir, p->pst_hi_fileid_cdir,
+				   p->pst_lo_fileid_cdir,
+				   p->pst_hi_nodeid_cdir,
+				   p->pst_lo_nodeid_cdir, &pd)))
+		    (void) process_finfo(&pd, &p->pst_fid_cdir,
+					 &p->pst_cdir, na);
+		else {
+		    (void) snpf(Namech, Namechl,
+			"can't read %s pst_filedetails%s%s", CWD,
+			errno ? ": " : "", errno ? strerror(errno) : "");
+		    enter_nm(Namech);
+		}
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (!ckscko && rtds
+	    &&  IS_PSFILEID(&p->pst_rdir) && (p->pst_rdir.psf_fileid > 0)
+	    ) {
+		if (HvRtPsfid < 0)
+		    (void) scanmnttab();
+	 	if (!HvRtPsfid
+		||  memcmp((void *)&RtPsfid, (void *)&p->pst_rdir,
+			       sizeof(RtPsfid)))
+		{
+		    alloc_lfile(RTD, -1);
+		    if ((na = read_det(&p->pst_fid_rdir,
+				       p->pst_hi_fileid_rdir,
+				       p->pst_lo_fileid_rdir,
+				       p->pst_hi_nodeid_rdir,
+				       p->pst_lo_nodeid_rdir, &pd)))
+			(void) process_finfo(&pd, &p->pst_fid_rdir,
+					     &p->pst_rdir, na);
+		    else {
+			(void) snpf(Namech, Namechl,
+			    "can't read %s pst_filedetails%s%s", RTD,
+			    errno ? ": " : "",
+			    errno ? strerror(errno) : "");
+			enter_nm(Namech);
+		    }
+		    if (Lf->sf)
+			link_lfile();
+		}
+	    }
+	/*
+	 * Print information on the text files.
+	 */
+	    if (!ckscko)
+		(void) process_text(p);
+	/*
+	 * Loop through user's files.
+	 */
+	    for (j = 0, f = read_files(p, &nf); j < nf; j++, f++) {
+		fd = (int)f->psf_fd;
+	    /*
+	     * Check FD status and allocate local file space, as required.
+	     */
+		if (Fand && Fdl && fds) {
+
+		/*
+		 * Check and update the FD status array.
+		 */
+		    if (fd >= fdsa) {
+			for (l = fdsa; l <= fd; l += FDS_ALLOC_INCR)
+			    ;
+			nb = (MALLOC_S)(l * sizeof(int));
+			if (!(fds = (int *)realloc((MALLOC_P *)fds, nb))) {
+			    (void) fprintf(stderr,
+				"%s: can't reallocate %d FD status entries\n",
+				Pn, l);
+			    Exit(1);
+			}
+			while (fdsa < l) {
+			    fds[fdsa] = (ck_fd_status(NULL, fdsa) == 2) ? 1 : 0;
+			    fdsa++;
+			}
+		    }
+		    if (!fds[fd])
+			continue;
+		}
+		alloc_lfile(NULL, (int)f->psf_fd);
+	    /*
+	     * Construct access code.
+	     */
+		if ((flag = (long)(f->psf_flag & ~PS_FEXCLOS))
+		== (long)PS_FRDONLY)
+		    Lf->access = 'r';
+		else if (flag == (long)PS_FWRONLY)
+		    Lf->access = 'w';
+		else
+		    Lf->access = 'u';
+
+#if	defined(HASFSTRUCT)
+	    /*
+	     * Save file structure values.
+	     */
+		if (Fsv & FSV_CT) {
+		    Lf->fct = (long)f->psf_count;
+		    Lf->fsv |= FSV_CT;
+		}
+		if (Fsv & FSV_FA) {
+		    ka = (((KA_T)(f->psf_hi_fileid & 0xffffffff) << 32)
+		       |  (KA_T)(f->psf_lo_fileid & 0xffffffff));
+		    if ((Lf->fsa = ka))
+			Lf->fsv |= FSV_FA;
+		}
+		if (Fsv & FSV_FG) {
+		    Lf->ffg = flag;
+		    Lf->fsv |= FSV_FG;
+		}
+		Lf->pof = (long)(f->psf_flag & PS_FEXCLOS);
+#endif	/* defined(HASFSTRUCT) */
+
+	    /*
+	     * Save file offset.  _PSTAT64 should alwaus be defined, but just
+	     * to be safe, check for it.
+	     */
+
+#if	defined(_PSTAT64)
+		Lf->off = (SZOFFTYPE)f->_PSF_OFFSET64;
+#else	/* !defined(_PSTAT64) */
+		Lf->off = (SZOFFTYPE)f->psf_offset;
+#endif	/* defined(_PSTAT64) */
+
+	    /*
+	     * Process the file by its type.
+	     */
+		switch (f->psf_ftype) {
+		case PS_TYPE_VNODE:
+		    if (ckscko || Selinet)
+			break;
+		    if ((na = read_det(&f->psf_fid, f->psf_hi_fileid,
+				       f->psf_lo_fileid, f->psf_hi_nodeid,
+				       f->psf_lo_nodeid, &pd)))
+			(void) process_finfo(&pd, &f->psf_fid, &f->psf_id, na);
+		    else {
+			(void) snpf(Namech, Namechl,
+			    "can't read pst_filedetails%s%s",
+			    errno ? ": " : "",
+			    errno ? strerror(errno) : "");
+			enter_nm(Namech);
+		    }
+		    break;
+		case PS_TYPE_SOCKET:
+		    switch (f->psf_subtype) {
+		    case PS_SUBTYPE_SOCK:
+			(void) process_socket(f, (struct pst_socket *)NULL);
+			break;
+		    case PS_SUBTYPE_SOCKSTR:
+			if ((s = read_sock(f)))
+			    (void) process_socket(f, s);
+			else
+			    (void) process_stream(f, (int)ckscko);
+			break;
+		    default:
+			(void) snpf(Namech, Namechl,
+			    "unknown socket sub-type: %d", (int)f->psf_subtype);
+			enter_nm(Namech);
+		    }
+		    break;
+		case PS_TYPE_STREAMS:
+		    (void) process_stream(f, (int)ckscko);
+		    break;
+		case PS_TYPE_UNKNOWN:
+		    (void) snpf(Lf->type, sizeof(Lf->type), "UNKN");
+		    (void) enter_nm("no more information");
+		    break;
+		case PS_TYPE_UNSP:
+		    (void) snpf(Lf->type, sizeof(Lf->type), "UNSP");
+		    (void) enter_nm("no more information");
+		    break;
+		case PS_TYPE_LLA:
+		    (void) snpf(Lf->type, sizeof(Lf->type), "LLA");
+		    (void) enter_nm("no more information");
+		    break;
+		}
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() -- access the required information in the kernel
+ */
+
+static void
+get_kernel_access()
+{
+	int err = 0;
+	int i;
+	struct pst_static pst;
+	_T_LONG_T *szp;
+/*
+ * Check the kernel version.
+ */
+	(void) ckkv("HP-UX", LSOF_VSTR, (char *)NULL, (char *)NULL);
+/*
+ * Check PSTAT support.  First make sure we can read pst_static up through
+ * its pst_static_size member.  If not, quit.  If we can, read the full
+ * pst_static structure.
+ */
+	if (pstat_getstatic(&pst, (size_t)INCLMEM(pst_static, pst_static_size),
+			    1, 0) != 1)
+	{
+	    (void) fprintf(stderr,
+		"%s: FATAL: can't determine PSTAT static size: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	}
+	if (pstat_getstatic(&pst, (size_t)pst.pst_static_size, 1, 0) != 1) {
+	    (void) fprintf(stderr,
+		"%s: FATAL: can't read %ld bytes of pst_static\n",
+		Pn, (long)pst.pst_static_size);
+	    Exit(1);
+	}
+/*
+ * Check all the pst_static members defined in PstatCk[].
+ */
+	for (i = 0; i < NPSTATCK; i++) {
+	    if (pst.pst_static_size < PstatCk[i].msz) {
+		(void) fprintf(stderr,
+		    "%s: FATAL: pst_static doesn't contain %s_size\n",
+		    Pn, PstatCk[i].sn);
+		err = 1;
+		continue;
+	    }
+	    szp = (_T_LONG_T *)(((char *)&pst) + PstatCk[i].moff);
+	    if (*szp < PstatCk[i].ssz) {
+		(void) fprintf(stderr,
+		    "%s: FATAL: %s_size should be: %llu; is %llu\n",
+		    Pn, PstatCk[i].sn, (unsigned long long)PstatCk[i].ssz,
+		    (unsigned long long)*szp);
+		err = 1;
+	    }
+	}
+/*
+ * Save the clone major device number, if pst_static is big enough to hold it.
+ */
+	if (pst.pst_static_size >= (size_t)INCLMEM(pst_static, clonemajor)) {
+	    CloneMaj = pst.clonemajor;
+	    HaveCloneMaj = 1;
+	}
+	if (!err)
+	    return;
+	Exit(1);
+}
+
+
+/*
+ * initialize() -- perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * process_text() -- process text access information
+ */
+
+static void
+process_text(p)
+	struct pst_status *p;		/* pst_status for process */
+{
+	int i, j, nr, ntvu;
+	int meme = 0;
+	static int mems = -1;
+	KA_T na;
+	MALLOC_S nb;
+	static int ntva;
+	struct pst_vm_status *rp;
+	static int txts = -1;
+	struct txtvm {
+	    char *fd;
+	    struct pst_fid opfid;
+	    struct psfileid psfid;
+	    KA_T na;
+	    struct pst_filedetails pd;
+	};
+	static struct txtvm *tv = (struct txtvm *)NULL;
+/*
+ * Get and remember "mem" and "txt" FD statuses.
+ */
+	if (mems < 0) {
+	    if (Fand && Fdl)
+		mems = (ck_fd_status("mem", -1) == 2) ? 1 : 0;
+	    else
+		mems = 1;
+	}
+	if (txts < 0) {
+	    if (Fand && Fdl)
+		txts = (ck_fd_status("txt", -1) == 2) ? 1 : 0;
+	    else
+		txts = 1;
+	}
+	if (!mems && !txts)
+	    return;
+/*
+ * Pre-allocate sufficient tv[] space for text file.
+ */
+	if (!tv) {
+	    ntva = TXTVMINCR;
+	    nb = (MALLOC_S)(ntva * sizeof(struct txtvm));
+	    if (!(tv = (struct txtvm *)malloc(nb))) {
+
+no_txtvm_space:
+
+		(void) fprintf(stderr,
+		    "%s: no memory for text and VM info array; PID: %d\n",
+		    Pn, (int)p->pst_pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Enter text file in tv[], if possible.
+ */
+	if (txts && IS_PSFILEID(&p->pst_text) && (p->pst_text.psf_fileid > 0))
+	{
+	    if ((na = read_det(&p->pst_fid_text, p->pst_hi_fileid_text,
+			       p->pst_lo_fileid_text, p->pst_hi_nodeid_text,
+			       p->pst_lo_nodeid_text, &tv[0].pd)))
+	    {
+		tv[0].fd = "txt";
+		tv[0].na = na;
+		tv[0].opfid = p->pst_fid_text;
+		tv[0].psfid = p->pst_text;
+		ntvu = 1;
+	    } else {
+		alloc_lfile("txt", -1);
+		(void) snpf(Namech, Namechl,
+		    "can't read txt pst_filedetails%s%s",
+		    errno ? ": " : "", errno ? strerror(errno) : "");
+		enter_nm(Namech);
+		if (Lf->sf)
+		    link_lfile();
+		ntvu = 0;
+	    }
+	} else
+	    ntvu = 0;
+/*
+ * Get unique VM regions.
+ */
+	if (mems) {
+	    for (i = 0, rp = read_vmreg(p, &nr); (i < nr); i++, rp++) {
+
+	    /*
+	     * Skip duplicate regions.
+	     */
+		for (j = 0; j < ntvu; j++) {
+		    if (memcmp((void *)&rp->pst_id, (void *)&tv[j].psfid,
+			       sizeof(struct psfileid))
+		    == 0)
+			break;
+		}
+		if (j < ntvu)
+		    continue;
+	    /*
+	     * Make sure there's tv[] space for this region.
+	     */
+		if (ntvu >= ntva) {
+		    ntva += TXTVMINCR;
+		    nb = (MALLOC_S)(ntva * sizeof(struct txtvm));
+		    if (!(tv = (struct txtvm *)realloc((MALLOC_P *)tv, nb)))
+			goto no_txtvm_space;
+		}
+	    /*
+	     * See if we can read the file details for this region.
+	     */
+		if ((na = read_det(&rp->pst_fid, rp->pst_hi_fileid,
+				   rp->pst_lo_fileid, rp->pst_hi_nodeid,
+				   rp->pst_lo_nodeid, &tv[ntvu].pd)))
+		{
+		    tv[ntvu].fd = "mem";
+		    tv[ntvu].na = na;
+		    tv[ntvu].opfid = rp->pst_fid;
+		    tv[ntvu].psfid = rp->pst_id;
+		    ntvu++;
+		} else if (!meme) {
+		    alloc_lfile("mem", -1);
+		    (void) snpf(Namech, Namechl,
+			"can't read mem pst_filedetails%s%s",
+			errno ? ": " : "", errno ? strerror(errno) : "");
+		    enter_nm(Namech);
+		    if (Lf->sf)
+			link_lfile();
+		    meme = 1;
+		}
+	    }
+	}
+/*
+ * Process information for unique regions.
+ */
+	for (i = 0; i < ntvu; i++) {
+	    alloc_lfile(tv[i].fd, -1);
+	    (void) process_finfo(&tv[i].pd, &tv[i].opfid, &tv[i].psfid,
+				 tv[i].na);
+	    if (Lf->sf)
+		link_lfile();
+	}
+}
+ 
+
+/*
+ * read_det() -- read the pst_filedetails structure
+ */
+
+KA_T
+read_det(ki, hf, lf, hn, ln, pd)
+	struct pst_fid *ki;		/* kernel file ID */
+	uint32_t hf;			/* high file ID bits */
+	uint32_t lf;			/* low file ID bits */
+	uint32_t hn;			/* high node ID bits */
+	uint32_t ln;			/* low node ID bits */
+	struct pst_filedetails *pd;	/* details receiver */
+{
+	KA_T na;
+
+	errno = 0;
+	na = (KA_T)(((KA_T)(hn & 0xffffffff) << 32) | (KA_T)(ln & 0xffffffff));
+	if (pstat_getfiledetails(pd, sizeof(struct pst_filedetails), ki) <= 0
+	||  hf != pd->psfd_hi_fileid || lf != pd->psfd_lo_fileid
+	||  hn != pd->psfd_hi_nodeid || ln != pd->psfd_lo_nodeid)
+	    return((KA_T)0);
+	return(na);
+}
+
+
+/*
+ * read_files() -- read the file descriptor information for a process
+ */
+
+static struct pst_fileinfo2 *
+read_files(p, n)
+	struct pst_status *p;		/* pst_status for the process */
+	int *n;				/* returned fi[] entry count */
+{
+	size_t ec;
+	static struct pst_fileinfo2 *fi = (struct pst_fileinfo2 *)NULL;
+	MALLOC_S nb;
+	int nf = 0;
+	static int nfa = 0;
+	int rc;
+	static size_t sz = sizeof(struct pst_fileinfo2);
+/*
+ * Read the pst_fileinfo2 information for all files of the process
+ * into fi[].
+ */
+	do {
+	    if (nf >= nfa) {
+
+	    /*
+	     * Increase the size of fi[].
+	     */
+		nfa += FINFOINCR;
+		nb = (MALLOC_S)(nfa * sizeof(struct pst_fileinfo2));
+		if (!fi)
+		    fi = (struct pst_fileinfo2 *)malloc(nb);
+		else
+		    fi = (struct pst_fileinfo2 *)realloc((MALLOC_P *)fi, nb);
+		if (!fi) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for pst_filinfo\n",
+			Pn, nb);
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Read the next block of pst_fileinfo2 structures.
+	 */
+	    ec = (size_t)(nfa - nf);
+	    if ((rc = pstat_getfile2(fi + nf, sz, ec, nf, p->pst_pid)) > 0) {
+		nf += rc;
+		if (rc < (int)ec)
+		    rc = 0;
+	    }
+	} while (rc > 0);
+	*n = nf;
+	return(fi);
+}
+
+
+/*
+ * read_proc() -- read process table status information
+ */
+
+static struct pst_status *
+read_proc(n)
+	int *n;				/* returned ps[] entry count */
+{
+	size_t el;
+	int i = 0;
+	MALLOC_S nb;
+	int np = 0;
+	static int npa = 0;
+	static struct pst_status *ps = (struct pst_status *)NULL;
+	int rc;
+	size_t sz = sizeof(struct pst_status);
+/*
+ * Read the pst_status information for all processes into ps[].
+ */
+	do {
+	    if (np >= npa) {
+
+	    /*
+	     * Increase the size of ps[].
+	     */
+		npa += PSTATINCR;
+		nb = (MALLOC_S)(npa * sizeof(struct pst_status));
+		if (!ps)
+		    ps = (struct pst_status *)malloc(nb);
+		else
+		    ps = (struct pst_status *)realloc((MALLOC_P *)ps, nb);
+		if (!ps) {
+
+ps_alloc_error:
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for pst_status table\n",
+			Pn, nb);
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Read the next block of pst_status structures.
+	 */
+	    el = (size_t)(npa - np);
+	    if ((rc = pstat_getproc(ps + np, sz, el, i)) > 0) {
+		np += rc;
+		i = (ps + np - 1)->pst_idx + 1;
+		if (rc < el)
+		    rc = 0;
+	    }
+	} while (rc > 0);
+/*
+ * Reduce ps[] to a minimum, unless repeat mode is in effect.
+ */
+	if (!RptTm && ps && np && (np < npa)) {
+	    nb = (MALLOC_S)(np * sizeof(struct pst_status));
+	    if (!(ps = (struct pst_status *)realloc((MALLOC_P *)ps, nb)))
+		goto ps_alloc_error;
+	}
+	*n = np;
+	return(ps);
+}
+
+
+/*
+ * read_vmreg() -- read info about the VM regions of a process
+ */
+
+static struct pst_vm_status *
+read_vmreg(p, n)
+	struct pst_status *p;		/* pst_status for process */
+	int *n;				/* returned region count */
+{
+	size_t ec = (size_t)p->pst_pid;
+	MALLOC_S nb;
+	int nr, rx;
+	static int nra = 0;
+	struct pst_vm_status *rp;
+	static struct pst_vm_status *reg = (struct pst_vm_status *)NULL;
+	size_t sz = sizeof(struct pst_vm_status);
+/*
+ * Read all VM region information for the process.
+ */
+	for (nr = rx = 0;; rx++) {
+	    if (nr >= nra) {
+
+	    /*
+	     * Increase the region table size.
+	     */
+		nra += VMREGINCR;
+		nb = (MALLOC_S)(nra * sizeof(struct pst_vm_status));
+		if (!reg)
+		    reg = (struct pst_vm_status *)malloc(nb);
+		else
+		    reg = (struct pst_vm_status *)realloc((MALLOC_P *)reg, nb);
+		if (!reg) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for pst_vm_status\n",
+			Pn, nb);
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Read the pst_vm_status structure for the next region.
+	 */
+	    rp = reg + nr;
+	    if (pstat_getprocvm(rp, sz, ec, rx) != 1)
+		break;
+	    if (IS_PSFILEID(&rp->pst_id) && (rp->pst_id.psf_fileid > 0))
+		nr++;
+	}
+	*n = nr;
+	return(reg);
+}
+
+
+/*
+ * scanmnttab() -- scan mount table
+ */
+
+extern void
+scanmnttab()
+{
+	struct mounts *mp;
+/*
+ * Scan the mount table to identify NFS file systems and form the psfileid
+ * for "/".
+ *
+ * This function allows the mount table scan to be deferred until its
+ * information is needed.
+ */
+	if ((HvRtPsfid >= 0) && (HasNFS >= 0))
+	    return;
+	(void) memset((void *)&RtPsfid, 0, sizeof(RtPsfid));
+	for (HasNFS = HvRtPsfid = 0, mp = readmnt(); mp; mp = mp->next) {
+	    if (mp->MOUNTS_FSTYPE
+	    &&  (strcmp(mp->MOUNTS_FSTYPE, MNTTYPE_NFS) == 0
+	    ||   strcmp(mp->MOUNTS_FSTYPE, MNTTYPE_NFS3) == 0)) {
+		HasNFS = 1;
+		mp->is_nfs = 1;
+	    } else
+		mp->is_nfs = 0;
+	    if (!HvRtPsfid && !strcmp(mp->dir, "/")) {
+		HvRtPsfid = 1;
+		RtPsfid.psf_fsid.psfs_id = mp->dev;
+		RtPsfid.psf_fsid.psfs_type = mp->MOUNTS_STAT_FSTYPE;
+		RtPsfid.psf_fileid = mp->inode;
+	    }
+	}
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dproto.h
new file mode 100644
index 0000000..66e61ac
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dproto.h
@@ -0,0 +1,59 @@
+/*
+ * dproto.h - pstat-based HP-UX function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * Copyright 1999 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: dproto.h,v 1.5 2008/10/21 16:17:50 abe Exp $
+ */
+
+
+_PROTOTYPE(extern int get_max_fd,(void));
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern void process_finfo,(struct pst_filedetails *pd, struct pst_fid *opfid, struct psfileid *psfid, KA_T na));
+_PROTOTYPE(extern void process_socket,(struct pst_fileinfo2 *f,
+				       struct pst_socket *s));
+_PROTOTYPE(extern void process_stream,(struct pst_fileinfo2 *f, int ckscko));
+_PROTOTYPE(extern KA_T read_det,(struct pst_fid *ki, uint32_t hf, uint32_t lf,
+				 uint32_t hn, uint32_t ln,
+				 struct pst_filedetails *pd));
+_PROTOTYPE(extern struct pst_socket *read_sock,(struct pst_fileinfo2 *f));
+
+#if	defined(HASIPv6)
+_PROTOTYPE(extern struct hostent *gethostbyname2,(char *nm, int proto));
+#endif	/* defined(HASIPv6) */
+
+#if	defined(HASVXFS)
+_PROTOTYPE(extern int read_vxnode,(struct vnode *v, struct l_vfs *vfs, dev_t *dev));
+#endif	/* defined(HASVXFS) */
+
+_PROTOTYPE(extern void scanmnttab,(void));
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dsock.c
new file mode 100644
index 0000000..461ba58
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dsock.c
@@ -0,0 +1,1647 @@
+/*
+ * dsock.c -- pstat-based HP-UX socket and stream processing functions for lsof
+ */
+
+
+/*
+ * Copyright 1999 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1999 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+#if	defined(PS_STR_XPORT_DATA)
+_PROTOTYPE(static void make_sock,(struct pst_fileinfo2 *f,
+				  struct pst_stream *sh,
+				  struct pst_socket *s));
+#endif	/* defined(PS_STR_XPORT_DATA) */
+
+_PROTOTYPE(static void printpsproto,(uint32_t p));
+
+
+/*
+ * Local macros
+ */
+
+#if	defined(HASIPv6)
+
+/*
+ * IPv6_2_IPv4()  -- macro to define the address of an IPv4 address contained
+ *		     in an IPv6 address
+ */
+
+#define IPv6_2_IPv4(v6)	(((uint8_t *)((struct in6_addr *)v6)->s6_addr)+12)
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * build_IPstates() -- build the TCP and UDP state tables
+ */
+
+void
+build_IPstates()
+{
+	if (!TcpSt) {
+	    (void) enter_IPstate("TCP", "CLOSED", PS_TCPS_CLOSED);
+	    (void) enter_IPstate("TCP", "IDLE", PS_TCPS_IDLE);
+	    (void) enter_IPstate("TCP", "BOUND", PS_TCPS_BOUND);
+	    (void) enter_IPstate("TCP", "LISTEN", PS_TCPS_LISTEN);
+	    (void) enter_IPstate("TCP", "SYN_SENT", PS_TCPS_SYN_SENT);
+	    (void) enter_IPstate("TCP", "SYN_RCVD", PS_TCPS_SYN_RCVD);
+	    (void) enter_IPstate("TCP", "ESTABLISHED", PS_TCPS_ESTABLISHED);
+	    (void) enter_IPstate("TCP", "CLOSE_WAIT", PS_TCPS_CLOSE_WAIT);
+	    (void) enter_IPstate("TCP", "FIN_WAIT_1", PS_TCPS_FIN_WAIT_1);
+	    (void) enter_IPstate("TCP", "CLOSING", PS_TCPS_CLOSING);
+	    (void) enter_IPstate("TCP", "LAST_ACK", PS_TCPS_LAST_ACK);
+	    (void) enter_IPstate("TCP", "FIN_WAIT_2", PS_TCPS_FIN_WAIT_2);
+	    (void) enter_IPstate("TCP", "TIME_WAIT", PS_TCPS_TIME_WAIT);
+	    (void) enter_IPstate("TCP", (char *)NULL, 0);
+	}
+	if (!UdpSt) {
+	    (void) enter_IPstate("UDP", "Uninitialized", PS_TS_UNINIT);
+	    (void) enter_IPstate("UDP", "Unbound", PS_TS_UNBND);
+	    (void) enter_IPstate("UDP", "Wait_BIND_REQ_Ack", PS_TS_WACK_BREQ);
+	    (void) enter_IPstate("UDP", "Wait_UNBIND_REQ_Ack", PS_TS_WACK_UREQ);
+	    (void) enter_IPstate("UDP", "Idle", PS_TS_IDLE);
+	    (void) enter_IPstate("UDP", "Wait_OPT_REQ_Ack", PS_TS_WACK_OPTREQ);
+	    (void) enter_IPstate("UDP", "Wait_CONN_REQ_Ack", PS_TS_WACK_CREQ);
+	    (void) enter_IPstate("UDP", "Wait_CONN_REQ_Confirm",
+		PS_TS_WCON_CREQ);
+	    (void) enter_IPstate("UDP", "Wait_CONN_IND_Response",
+		PS_TS_WRES_CIND);
+	    (void) enter_IPstate("UDP", "Wait_CONN_RES_Ack", PS_TS_WACK_CRES);
+	    (void) enter_IPstate("UDP", "Wait_Data_Xfr", PS_TS_DATA_XFER);
+	    (void) enter_IPstate("UDP", "Wait_Read_Release", PS_TS_WIND_ORDREL);
+	    (void) enter_IPstate("UDP", "Wait_Write_Release",
+		PS_TS_WREQ_ORDREL);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack",
+		PS_TS_WACK_DREQ6);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack",
+		PS_TS_WACK_DREQ7);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack",
+		PS_TS_WACK_DREQ9);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack",
+		PS_TS_WACK_DREQ10);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack",
+		PS_TS_WACK_DREQ11);
+	    (void) enter_IPstate("UDP", "Internal", PS_TS_WACK_ORDREL);
+	    (void) enter_IPstate("UDP", (char *)NULL, 0);
+	}
+}
+
+
+#if	defined(PS_STR_XPORT_DATA)
+/*
+ * make_sock() -- make a socket from the eXPORT data in a stream's head
+ */
+
+static void
+make_sock(f, sh, s)
+	struct pst_fileinfo2 *f;		/* pst_fileinfo2 */
+	struct pst_stream *sh;			/* stream head */
+	struct pst_socket *s;			/* constructed socket */
+{
+	size_t sz;
+/*
+ * Zero the destination pst_socket structure  and propagate its file and node
+ * IDs from the stream head.  Also propagate the linger time. 
+ */
+	(void)memset((void *)s, 0, sizeof(struct pst_socket));
+	s->pst_hi_fileid = sh->val.head.pst_hi_fileid;
+	s->pst_lo_fileid = sh->val.head.pst_lo_fileid;
+	s->pst_hi_nodeid = sh->val.head.pst_hi_nodeid;
+	s->pst_lo_nodeid = sh->val.head.pst_lo_nodeid;
+	s->pst_linger = sh->pst_str_xport_linger;
+/*
+ * Convert stream family to socket family and stream protocol to socket
+ * protocol.
+ *
+ * This could be avoided if PSTAT were to use a common set of family and
+ * protocol symbols.
+ */
+	switch (sh->pst_str_xport_family) {
+	    case PS_STR_XPORT_AFINET:
+		s->pst_family = PS_AF_INET;
+		break;
+	    case PS_STR_XPORT_AFINET6:
+		s->pst_family = PS_AF_INET6;
+		break;
+	    default:
+		s->pst_family = sh->pst_str_xport_family;
+	}
+	switch (sh->pst_str_xport_protocol) {
+	    case PS_STR_XPORT_TCP_PROTO:
+		s->pst_protocol = PS_PROTO_TCP;
+		break;
+	    case PS_STR_XPORT_UDP_PROTO:
+		s->pst_protocol = PS_PROTO_UDP;
+		break;
+	    default:
+		s->pst_protocol = sh->pst_str_xport_protocol;
+	}
+/*
+ * Copy stream size information.
+ */
+	s->pst_qlimit = sh->pst_str_xport_qlimit;
+	s->pst_qlen = sh->pst_str_xport_qlen;
+	s->pst_idata = sh->pst_str_xport_idata;
+	s->pst_ibufsz = sh->pst_str_xport_ibufsz;
+	s->pst_rwnd = sh->pst_str_xport_rwnd;
+	s->pst_swnd = sh->pst_str_xport_swnd;
+	s->pst_odata = sh->pst_str_xport_odata;
+	s->pst_obufsz = sh->pst_str_xport_obufsz;
+/*
+ * Propagate protocol state from stream symbol values to socket ones.
+ *
+ * This could be avoided if PSTAT were to use a common set of protocol
+ * state symbols.
+ */
+	if (s->pst_protocol == PS_PROTO_TCP) {
+	    switch (sh->pst_str_xport_pstate) {
+
+#if	defined(PS_STR_XPORT_TCPS_CLOSED) && defined(PS_TCPS_CLOSED) \
+	&& (PS_STR_XPORT_TCPS_CLOSED != PS_TCPS_CLOSED)
+	    case PS_STR_XPORT_TCPS_CLOSED:
+		s->pst_pstate = PS_TCPS_CLOSED;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_IDLE) && defined(PS_TCPS_IDLE) \
+	&& (PS_STR_XPORT_TCPS_IDLE != PS_TCPS_IDLE)
+	    case PS_STR_XPORT_TCPS_IDLE:
+		s->pst_pstate = PS_TCPS_IDLE;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_BOUND) && defined(PS_TCPS_BOUND) \
+	&& (PS_STR_XPORT_TCPS_BOUND != PS_TCPS_BOUND)
+	    case PS_STR_XPORT_TCPS_BOUND:
+		s->pst_pstate = PS_TCPS_BOUND;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_LISTEN) && defined(PS_TCPS_LISTEN) \
+	&& (PS_STR_XPORT_TCPS_LISTEN != PS_TCPS_LISTEN)
+	    case PS_STR_XPORT_TCPS_LISTEN:
+		s->pst_pstate = PS_TCPS_LISTEN;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_SYN_SENT) && defined(PS_TCPS_SYN_SENT) \
+	&& (PS_STR_XPORT_TCPS_SYN_SENT != PS_TCPS_SYN_SENT)
+	    case PS_STR_XPORT_TCPS_SYN_SENT:
+		s->pst_pstate = PS_TCPS_SYN_SENT;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_SYN_RCVD) && defined(PS_TCPS_SYN_RCVD) \
+	&& (PS_STR_XPORT_TCPS_SYN_RCVD != PS_TCPS_SYN_RCVD)
+	    case PS_STR_XPORT_TCPS_SYN_RCVD:
+		s->pst_pstate = PS_TCPS_SYN_RCVD;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_ESTABLISHED) && defined(PS_TCPS_ESTABLISHED) \
+	&& (PS_STR_XPORT_TCPS_ESTABLISHED != PS_TCPS_ESTABLISHED)
+	    case PS_STR_XPORT_TCPS_ESTABLISHED:
+		s->pst_pstate = PS_TCPS_ESTABLISHED;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_CLOSE_WAIT) && defined(PS_TCPS_CLOSE_WAIT) \
+	&& (PS_STR_XPORT_TCPS_CLOSE_WAIT != PS_TCPS_CLOSE_WAIT)
+	    case PS_STR_XPORT_TCPS_CLOSE_WAIT:
+		s->pst_pstate = PS_TCPS_CLOSE_WAIT;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_FIN_WAIT_1) && defined(PS_TCPS_FIN_WAIT_1) \
+	&& (PS_STR_XPORT_TCPS_FIN_WAIT_1 != PS_TCPS_FIN_WAIT_1)
+	    case PS_STR_XPORT_TCPS_FIN_WAIT_1:
+		s->pst_pstate = PS_TCPS_FIN_WAIT_1;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_CLOSING) && defined(PS_TCPS_CLOSING) \
+	&& (PS_STR_XPORT_TCPS_CLOSING != PS_TCPS_CLOSING)
+	    case PS_STR_XPORT_TCPS_CLOSING:
+		s->pst_pstate = PS_TCPS_CLOSING;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_LAST_ACK) && defined(PS_TCPS_LAST_ACK) \
+	&& (PS_STR_XPORT_TCPS_LAST_ACK != PS_TCPS_LAST_ACK)
+	    case PS_STR_XPORT_TCPS_LAST_ACK:
+		s->pst_pstate = PS_TCPS_LAST_ACK;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_FIN_WAIT_2) && defined(PS_TCPS_FIN_WAIT_2) \
+	&& (PS_STR_XPORT_TCPS_FIN_WAIT_2 != PS_TCPS_FIN_WAIT_2)
+	    case PS_STR_XPORT_TCPS_FIN_WAIT_2:
+		s->pst_pstate = PS_TCPS_FIN_WAIT_2;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TCPS_TIME_WAIT) && defined(PS_TCPS_TIME_WAIT) \
+	&& (PS_STR_XPORT_TCPS_TIME_WAIT != PS_TCPS_TIME_WAIT)
+	    case PS_STR_XPORT_TCPS_TIME_WAIT:
+		s->pst_pstate = PS_TCPS_TIME_WAIT;
+		break;
+#endif
+
+	    default:
+		s->pst_pstate = sh->pst_str_xport_pstate;
+	    }
+	} else if (s->pst_protocol == PS_PROTO_UDP) {
+	    switch (sh->pst_str_xport_pstate) {
+
+#if	defined(PS_STR_XPORT_TS_UNINIT) && defined(PS_TS_UNINIT) \
+	&& (PS_STR_XPORT_TS_UNINIT != PS_TS_UNINIT)
+	    case PS_STR_XPORT_TS_UNINIT:
+		s->pst_pstate = PS_TS_UNINIT;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_UNBND) && defined(PS_TS_UNBND) \
+	&& (PS_STR_XPORT_TS_UNBND != PS_TS_UNBND)
+	    case PS_STR_XPORT_TS_UNBND:
+		s->pst_pstate = PS_TS_UNBND;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_BREQ) && defined(PS_TS_WACK_BREQ) \
+	&& (PS_STR_XPORT_TS_WACK_BREQ != PS_TS_WACK_BREQ)
+	    case PS_STR_XPORT_TS_WACK_BREQ:
+		s->pst_pstate = PS_TS_WACK_BREQ;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_UREQ) && defined(PS_TS_WACK_UREQ) \
+	&& (PS_STR_XPORT_TS_WACK_UREQ != PS_TS_WACK_UREQ)
+	    case PS_STR_XPORT_TS_WACK_UREQ:
+		s->pst_pstate = PS_TS_WACK_UREQ;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_IDLE) && defined(PS_TS_IDLE) \
+	&& (PS_STR_XPORT_TS_IDLE != PS_TS_IDLE)
+	    case PS_STR_XPORT_TS_IDLE:
+		s->pst_pstate = PS_TS_IDLE;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_OPTREQ) && defined(PS_TS_WACK_OPTREQ) \
+	&& (PS_STR_XPORT_TS_WACK_OPTREQ != PS_TS_WACK_OPTREQ)
+	    case PS_STR_XPORT_TS_WACK_OPTREQ:
+		s->pst_pstate = PS_TS_WACK_OPTREQ;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_CREQ) && defined(PS_TS_WACK_CREQ) \
+	&& (PS_STR_XPORT_TS_WACK_CREQ != PS_TS_WACK_CREQ)
+	    case PS_STR_XPORT_TS_WACK_CREQ:
+		s->pst_pstate = PS_TS_WACK_CREQ;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WCON_CREQ) && defined(PS_TS_WCON_CREQ) \
+	&& (PS_STR_XPORT_TS_WCON_CREQ != PS_TS_WCON_CREQ)
+	    case PS_STR_XPORT_TS_WCON_CREQ:
+		s->pst_pstate = PS_TS_WCON_CREQ;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WRES_CIND) && defined(PS_TS_WRES_CIND) \
+	&& (PS_STR_XPORT_TS_WRES_CIND != PS_TS_WRES_CIND)
+	    case PS_STR_XPORT_TS_WRES_CIND:
+		s->pst_pstate = PS_TS_WRES_CIND;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_CRES) && defined(PS_TS_WACK_CRES) \
+	&& (PS_STR_XPORT_TS_WACK_CRES != PS_TS_WACK_CRES)
+	    case PS_STR_XPORT_TS_WACK_CRES:
+		s->pst_pstate = PS_TS_WACK_CRES;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_DATA_XFER) && defined(PS_TS_DATA_XFER) \
+	&& (PS_STR_XPORT_TS_DATA_XFER != PS_TS_DATA_XFER)
+	    case PS_STR_XPORT_TS_DATA_XFER:
+		s->pst_pstate = PS_TS_DATA_XFER;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WIND_ORDREL) && defined(PS_TS_WIND_ORDREL) \
+	&& (PS_STR_XPORT_TS_WIND_ORDREL != PS_TS_WIND_ORDREL)
+	    case PS_STR_XPORT_TS_WIND_ORDREL:
+		s->pst_pstate = PS_TS_WIND_ORDREL;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WREQ_ORDREL) && defined(PS_TS_WREQ_ORDREL) \
+	&& (PS_STR_XPORT_TS_WREQ_ORDREL != PS_TS_WREQ_ORDREL)
+	    case PS_STR_XPORT_TS_WREQ_ORDREL:
+		s->pst_pstate = PS_TS_WREQ_ORDREL;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_DREQ6) && defined(PS_TS_WACK_DREQ6) \
+	&& (PS_STR_XPORT_TS_WACK_DREQ6 != PS_TS_WACK_DREQ6)
+	    case PS_STR_XPORT_TS_WACK_DREQ6:
+		s->pst_pstate = PS_TS_WACK_DREQ6;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_DREQ7) && defined(PS_TS_WACK_DREQ7) \
+	&& (PS_STR_XPORT_TS_WACK_DREQ7 != PS_TS_WACK_DREQ7)
+	    case PS_STR_XPORT_TS_WACK_DREQ7:
+		s->pst_pstate = PS_TS_WACK_DREQ7;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_DREQ9) && defined(PS_TS_WACK_DREQ9) \
+	&& (PS_STR_XPORT_TS_WACK_DREQ9 != PS_TS_WACK_DREQ9)
+	    case PS_STR_XPORT_TS_WACK_DREQ9:
+		s->pst_pstate = PS_TS_WACK_DREQ9;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_DREQ10) && defined(PS_TS_WACK_DREQ10) \
+	&& (PS_STR_XPORT_TS_WACK_DREQ10 != PS_TS_WACK_DREQ10)
+	    case PS_STR_XPORT_TS_WACK_DREQ10:
+		s->pst_pstate = PS_TS_WACK_DREQ10;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_DREQ11) && defined(PS_TS_WACK_DREQ11) \
+	&& (PS_STR_XPORT_TS_WACK_DREQ11 != PS_TS_WACK_DREQ11)
+	    case PS_STR_XPORT_TS_WACK_DREQ11:
+		s->pst_pstate = PS_TS_WACK_DREQ11;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_WACK_ORDREL) && defined(PS_TS_WACK_ORDREL) \
+	&& (PS_STR_XPORT_TS_WACK_ORDREL != PS_TS_WACK_ORDREL)
+	    case PS_STR_XPORT_TS_WACK_ORDREL:
+		s->pst_pstate = PS_TS_WACK_ORDREL;
+		break;
+#endif
+
+#if	defined(PS_STR_XPORT_TS_NOSTATES) && defined(PS_TS_NOSTATES) \
+	&& (PS_STR_XPORT_TS_NOSTATES != PS_TS_NOSTATES)
+	    case PS_STR_XPORT_TS_NOSTATES:
+		s->pst_pstate = PS_TS_NOSTATES;
+		break;
+#endif
+
+	    default:
+		s->pst_pstate = sh->pst_str_xport_pstate;
+	    }
+	} else
+	    s->pst_pstate = sh->pst_str_xport_pstate;
+/*
+ * Now propagate the bound and remote address information from pst_stream
+ * to the pst_socket structure.  Validate the copy lengths.
+ */
+	sz = (size_t)sh->pst_str_xport_boundaddr_len;
+	if (sz > sizeof(s->pst_boundaddr))
+	    sz = sizeof(s->pst_boundaddr);
+	if ((s->pst_boundaddr_len = sz)) {
+	    (void) memcpy((void *)s->pst_boundaddr,
+			  (const void *)sh->pst_str_xport_boundaddr, sz);
+	}
+	sz = (size_t)sh->pst_str_xport_remaddr_len;
+	if (sz > sizeof(s->pst_remaddr))
+	    sz = sizeof(s->pst_remaddr);
+	if ((s->pst_remaddr_len = sz)) {
+	    (void) memcpy((void *)s->pst_remaddr,
+			  (const void *)sh->pst_str_xport_remaddr, sz);
+	}
+}
+#endif	/* defined(PS_STR_XPORT_DATA) */
+
+
+/*
+ * printpsproto() -- print PSTAT protocol name
+ */
+
+static void
+printpsproto(p)
+	uint32_t p;			/* protocol number */
+{
+	int i;
+	static int m = -1;
+	char *s;
+
+	switch (p) {
+	case PS_PROTO_IP:
+	    s = "IP";
+	    break;
+	case PS_PROTO_ICMP:
+	    s = "ICMP";
+	    break;
+	case PS_PROTO_IGMP:
+	    s = "IGMP";
+	    break;
+	case PS_PROTO_GGP:
+	    s = "GGP";
+	    break;
+	case PS_PROTO_IPIP:
+	    s = "IPIP";
+	    break;
+	case PS_PROTO_TCP:
+	    s = "TCP";
+	    break;
+	case PS_PROTO_EGP:
+	    s = "EGP";
+	    break;
+	case PS_PROTO_IGP:
+	    s = "IGP";
+	    break;
+	case PS_PROTO_PUP:
+	    s = "PUP";
+	    break;
+	case PS_PROTO_UDP:
+	    s = "UDP";
+	    break;
+	case PS_PROTO_IDP:
+	    s = "IDP";
+	    break;
+	case PS_PROTO_XTP:
+	    s = "XTP";
+	    break;
+	case PS_PROTO_ESP:
+	    s = "ESP";
+	    break;
+	case PS_PROTO_AH:
+	    s = "AH";
+	    break;
+	case PS_PROTO_OSPF:
+	    s = "OSPF";
+	    break;
+	case PS_PROTO_IPENCAP:
+	    s = "IPENCAP";
+	    break;
+	case PS_PROTO_ENCAP:
+	    s = "ENCAP";
+	    break;
+	case PS_PROTO_PXP:
+	    s = "PXP";
+	    break;
+	case PS_PROTO_RAW:
+	    s = "RAW";
+	    break;
+	default:
+	    s = (char *)NULL;
+	}
+	if (s)
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL-1, s);
+	else {
+	    if (m < 0) {
+		for (i = 0, m = 1; i < IPROTOL-2; i++)
+		    m *= 10;
+	    }
+	    if (m > p)
+		(void) snpf(Lf->iproto, sizeof(Lf->iproto), "%d?", p);
+	    else
+		(void) snpf(Lf->iproto, sizeof(Lf->iproto), "*%d?",
+		    p % (m/10));
+	}
+}
+
+
+/*
+ * print_tcptpi() -- print TCP/TPI info
+ */
+
+void
+print_tcptpi(nl)
+	int nl;				/* 1 == '\n' required */
+{
+	char *cp = (char *)NULL;
+	char  sbuf[128];
+	int i;
+	int ps = 0;
+	unsigned int u;
+
+	if (Ftcptpi & TCPTPI_STATE) {
+	    switch (Lf->lts.type) {
+	    case 0:				/* TCP */
+		if (!TcpSt)
+		    (void) build_IPstates();
+		if ((i = Lf->lts.state.i + TcpStOff) < 0 || i >= TcpNstates) {
+		    (void) snpf(sbuf, sizeof(sbuf), "UknownState_%d",
+			Lf->lts.state.i);
+		    cp = sbuf;
+		} else
+		    cp = TcpSt[i];
+		break;
+	    case 1:				/* UDP */
+		if (!UdpSt)
+		    (void) build_IPstates();
+		if ((u = Lf->lts.state.ui + UdpStOff) > UdpNstates) {
+		    (void) snpf(sbuf, sizeof(sbuf), "UNKNOWN_TPI_STATE_%u",
+			Lf->lts.state.ui);
+		    cp = sbuf;
+		} else
+		    cp = UdpSt[u];
+	    }
+	    if (cp) {
+		if (Ffield)
+		    (void) printf("%cST=%s%c", LSOF_FID_TCPTPI, cp, Terminator);
+		else {
+		    putchar('(');
+		    (void) fputs(cp, stdout);
+		}
+	    ps++;
+	    }
+	}
+
+#if	defined(HASTCPTPIQ)
+	if (Ftcptpi & TCPTPI_QUEUES) {
+	    if (Lf->lts.rqs) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QR=%lu", Lf->lts.rq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.sqs) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QS=%lu", Lf->lts.sq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int opt;
+
+	    if ((opt = Lf->lts.opt) || Lf->lts.qlens || Lf->lts.qlims) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSO", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(PS_SO_ACCEPTCONN)
+		if (opt & PS_SO_ACCEPTCONN) {
+		    (void) printf("%cACCEPTCONN", sep);
+		    opt &= ~PS_SO_ACCEPTCONN;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_ACCEPTCONN) */
+
+# if	defined(PS_SO_BROADCAST)
+		if (opt & PS_SO_BROADCAST) {
+		    (void) printf("%cBROADCAST", sep);
+		    opt &= ~PS_SO_BROADCAST;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_BROADCAST) */
+
+# if	defined(PS_SO_DEBUG)
+		if (opt & PS_SO_DEBUG) {
+		    (void) printf("%cDEBUG", sep);
+		    opt &= ~PS_SO_DEBUG;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_DEBUG) */
+
+# if	defined(PS_SO_DONTROUTE)
+		if (opt & PS_SO_DONTROUTE) {
+		    (void) printf("%cDONTROUTE", sep);
+		    opt &= ~PS_SO_DONTROUTE;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_DONTROUTE) */
+
+# if	defined(PS_SO_GETIFADDR)
+		if (opt & PS_SO_GETIFADDR) {
+		    (void) printf("%cGETIFADDR", sep);
+		    opt &= ~PS_SO_GETIFADDR;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_GETIFADDR) */
+
+# if	defined(PS_SO_INPCB_COPY)
+		if (opt & PS_SO_INPCB_COPY) {
+		    (void) printf("%cINPCB_COPY", sep);
+		    opt &= ~PS_SO_INPCB_COPY;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_INPCB_COPY) */
+
+# if	defined(PS_SO_KEEPALIVE)
+		if (opt & PS_SO_KEEPALIVE) {
+		    (void) printf("%cKEEPALIVE", sep);
+		    if (Lf->lts.kai)
+			(void) printf("=%d", Lf->lts.kai);
+		    opt &= ~PS_SO_KEEPALIVE;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_KEEPALIVE) */
+
+# if	defined(PS_SO_LINGER)
+		if (opt & PS_SO_LINGER) {
+		    (void) printf("%cLINGER", sep);
+		    if (Lf->lts.ltm)
+			(void) printf("=%d", Lf->lts.ltm);
+		    opt &= ~PS_SO_LINGER;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_LINGER) */
+
+# if	defined(PS_SO_OOBINLINE)
+		if (opt & PS_SO_OOBINLINE) {
+		    (void) printf("%cOOBINLINE", sep);
+		    opt &= ~PS_SO_OOBINLINE;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_OOBINLINE) */
+
+# if	defined(PS_SO_PMTU)
+		if (opt & PS_SO_PMTU) {
+		    (void) printf("%cPMTU", sep);
+		    opt &= ~PS_SO_PMTU;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_PMTU) */
+
+		if (Lf->lts.qlens) {
+		    (void) printf("%cQLEN=%u", sep, Lf->lts.qlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlims) {
+		    (void) printf("%cQLIM=%u", sep, Lf->lts.qlim);
+		    sep = ',';
+		}
+
+# if	defined(PS_SO_REUSEADDR)
+		if (opt & PS_SO_REUSEADDR) {
+		    (void) printf("%cREUSEADDR", sep);
+		    opt &= ~PS_SO_REUSEADDR;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_REUSEADDR) */
+
+# if	defined(PS_SO_REUSEPORT)
+		if (opt & PS_SO_REUSEPORT) {
+		    (void) printf("%cREUSEPORT", sep);
+		    opt &= ~PS_SO_REUSEPORT;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_REUSEPORT) */
+
+# if	defined(PS_SO_USELOOPBACK)
+		if (opt & PS_SO_USELOOPBACK) {
+		    (void) printf("%cUSELOOPBACK", sep);
+		    opt &= ~PS_SO_USELOOPBACK;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SO_USELOOPBACK) */
+
+		if (opt)
+		    (void) printf("%cUNKNOWN=%#x", sep, opt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int ss;
+
+	    if ((ss = Lf->lts.ss)) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSS", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(PS_SS_ASYNC)
+		if (ss & PS_SS_ASYNC) {
+		    (void) printf("%cASYNC", sep);
+		    ss &= ~PS_SS_ASYNC;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_ASYNC) */
+
+# if	defined(PS_SS_BOUND)
+		if (ss & PS_SS_BOUND) {
+		    (void) printf("%cBOUND", sep);
+		    ss &= ~PS_SS_BOUND;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_BOUND) */
+
+# if	defined(PS_SS_CANTRCVMORE)
+		if (ss & PS_SS_CANTRCVMORE) {
+		    (void) printf("%cCANTRCVMORE", sep);
+		    ss &= ~PS_SS_CANTRCVMORE;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_CANTRCVMORE) */
+
+# if	defined(PS_SS_CANTSENDMORE)
+		if (ss & PS_SS_CANTSENDMORE) {
+		    (void) printf("%cCANTSENDMORE", sep);
+		    ss &= ~PS_SS_CANTSENDMORE;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_CANTSENDMORE) */
+
+# if	defined(PS_SS_ISCONNECTED)
+		if (ss & PS_SS_ISCONNECTED) {
+		    (void) printf("%cISCONNECTED", sep);
+		    ss &= ~PS_SS_ISCONNECTED;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_ISCONNECTED) */
+
+# if	defined(PS_SS_ISCONNECTING)
+		if (ss & PS_SS_ISCONNECTING) {
+		    (void) printf("%cISCONNECTING", sep);
+		    ss &= ~PS_SS_ISCONNECTING;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_ISCONNECTING) */
+
+# if	defined(PS_SS_ISDISCONNECTI)
+		if (ss & PS_SS_ISDISCONNECTI) {
+		    (void) printf("%cISDISCONNECTI", sep);
+		    ss &= ~PS_SS_ISDISCONNECTI;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_ISDISCONNECTI) */
+
+# if	defined(PS_SS_INTERRUPTED)
+		if (ss & PS_SS_INTERRUPTED) {
+		    (void) printf("%cINTERRUPTED", sep);
+		    ss &= ~PS_SS_INTERRUPTED;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_INTERRUPTED) */
+
+# if	defined(PS_SS_NBIO)
+		if (ss & PS_SS_NBIO) {
+		    (void) printf("%cNBIO", sep);
+		    ss &= ~PS_SS_NBIO;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_NBIO) */
+
+# if	defined(PS_SS_NOFDREF)
+		if (ss & PS_SS_NOFDREF) {
+		    (void) printf("%cNOFDREF", sep);
+		    ss &= ~PS_SS_NOFDREF;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_NOFDREF) */
+
+# if	defined(PS_SS_NOUSER)
+		if (ss & PS_SS_NOUSER) {
+		    (void) printf("%cNOUSER", sep);
+		    ss &= ~PS_SS_NOUSER;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_NOUSER) */
+
+# if	defined(PS_SS_NOWAIT)
+		if (ss & PS_SS_NOWAIT) {
+		    (void) printf("%cNOWAIT", sep);
+		    ss &= ~PS_SS_NOWAIT;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_NOWAIT) */
+
+# if	defined(PS_SS_PRIV)
+		if (ss & PS_SS_PRIV) {
+		    (void) printf("%cPRIV", sep);
+		    ss &= ~PS_SS_PRIV;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_PRIV) */
+
+# if	defined(PS_SS_RCVATMARK)
+		if (ss & PS_SS_RCVATMARK) {
+		    (void) printf("%cRCVATMARK", sep);
+		    ss &= ~PS_SS_RCVATMARK;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_RCVATMARK) */
+
+# if	defined(PS_SS_XOPEN_EXT1)
+		if (ss & PS_SS_XOPEN_EXT1) {
+		    (void) printf("%cXOPEN_EXT1", sep);
+		    ss &= ~PS_SS_XOPEN_EXT1;
+		    sep = ',';
+		}
+# endif	/* defined(PS_SS_XOPEN_EXT1) */
+
+		if (ss)
+		    (void) printf("%cUNKNOWN=%#x", sep, ss);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOSTATE) */
+
+#if	defined(HASTCPTPIW)
+	if (Ftcptpi & TCPTPI_WINDOWS) {
+	    if (Lf->lts.rws) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WR=%lu", Lf->lts.rw);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.wws) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WW=%lu", Lf->lts.ww);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+#endif	/* defined(HASTCPTPIW) */
+
+	if (Ftcptpi && !Ffield && ps)
+	    putchar(')');
+	if (nl)
+	    putchar('\n');
+}
+
+
+/*
+ * process_socket() -- process socket
+ */
+
+void
+process_socket(f, s)
+	struct pst_fileinfo2 *f;		/* file information */
+	struct pst_socket *s;			/* optional socket information
+						 * NULL == none */
+{
+	int af, err, fp, lp, tx;
+	char buf[1024], tbuf[32];
+	unsigned char *fa = (unsigned char *)NULL;
+	unsigned char *la = (unsigned char *)NULL;
+	size_t len;
+	KA_T na, nau;
+	char *nma = (char *)NULL;
+	struct pst_filedetails pd;
+	struct sockaddr_in *sa;
+	int sx;
+
+#if	defined(HASIPv6)
+	struct sockaddr_in6 *sa6;
+#endif	/* defined(HASIPv6) */
+
+	struct sockaddr_un *ua;
+/*
+ * Read socket info, as required, so that the protocol state names can be
+ * tested as soon as possible.
+ */
+	if (!s) {
+	    if (!(s = read_sock(f))) {
+		(void) snpf(Namech, Namechl,
+		    "can't read pst_socket%s%s", errno ? ": " : "",
+		    errno ? strerror(errno) : "");
+		(void) enter_nm(Namech);
+		return;
+	    }
+	}
+/*
+ * Collect protocol details so the protocol state name might be tested,
+ * as requested by options.
+ */
+	switch (s->pst_family) {
+	case PS_AF_INET:
+	    af = 4;
+	    break;
+
+#if	defined(HASIPv6)
+	case PS_AF_INET6:
+	    af = 6;
+	    break;
+#endif	/* defined(HASIPv6) */
+
+	default:
+	    af = -1;
+	}
+	switch (s->pst_protocol) {
+	case PS_PROTO_TCP:
+	    sx = (int)s->pst_pstate + TcpStOff;
+	    tx = 0;
+	    break;
+	case PS_PROTO_UDP:
+	    sx = (unsigned int)s->pst_pstate + UdpStOff;
+	    tx = 1;
+	    break;
+	default:
+	    sx = tx = -1;
+	}
+/*
+ * Test the protocol state and name, setting the SELNET flag where possible.
+ */
+	switch (tx) {
+	case 0:					/* TCP */
+	    if (TcpStXn) {
+
+	    /*
+	     * Check for TCP state exclusion.
+	     */
+		if (sx >= 0 && sx < TcpNstates) {
+		    if (TcpStX[sx]) {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    if (TcpStIn) {
+		if (sx >= 0 && sx < TcpNstates) {
+		    if (TcpStI[sx])
+			TcpStI[sx] = 2;
+		    else {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    break;
+	case 1:					/* UDP */
+	    if (UdpStXn) {
+
+	    /*
+	     * Check for UDP state exclusion.
+	     */
+		if (sx >= 0 && sx < UdpNstates) {
+		    if (UdpStX[sx]) {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    if (UdpStIn) {
+		if (sx >= 0 && sx < UdpNstates) {
+		    if (UdpStI[sx])
+			UdpStI[sx] = 2;
+		    else {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    break;
+	}
+/*
+ * Set default type.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Generate and save node ID.
+ */
+	na = (KA_T)(((KA_T)(f->psf_hi_nodeid & 0xffffffff) << 32)
+	   |        (KA_T)(f->psf_lo_nodeid & 0xffffffff));
+
+#if	defined(HASFSTRUCT)
+	if (na && (Fsv & FSV_NI)) {
+	    if (na) {
+		Lf->fna = na;
+		Lf->fsv |= FSV_NI;
+	    }
+	}
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Save size information, as requested.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s->pst_idata;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s->pst_odata;
+	    else
+		Lf->sz = (SZOFFTYPE)(s->pst_idata + s->pst_odata);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+	
+#if     defined(HASTCPTPIQ)
+/*
+ * Enter queue sizes.
+ */
+	switch (s->pst_family) {
+	case PS_AF_INET:
+	case PS_AF_INET6:
+	    Lf->lts.rq = (unsigned long)s->pst_idata;
+	    Lf->lts.sq = (unsigned long)s->pst_odata;
+	    Lf->lts.rqs = Lf->lts.sqs = (unsigned char)1;
+	}
+#endif  /* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+/*
+ * Enter socket options.
+ */
+	Lf->lts.opt = (unsigned int)s->pst_options;
+	Lf->lts.ltm = (unsigned int)s->pst_linger;
+	Lf->lts.qlen = (unsigned int)s->pst_qlen;
+	Lf->lts.qlim = (unsigned int)s->pst_qlimit;
+	Lf->lts.qlens = Lf->lts.qlims = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+/*
+ * Enter socket state flags.
+ */
+	Lf->lts.ss = (unsigned int)s->pst_state;
+#endif	/* defined(HASSOSTATE) */
+
+#if	defined(HASTCPTPIW)
+/*
+ * Enter window sizes.
+ */
+	switch (s->pst_family) {
+	case PS_AF_INET:
+	case PS_AF_INET6:
+	    Lf->lts.rw = (unsigned long)s->pst_rwnd;
+	    Lf->lts.ww = (unsigned long)s->pst_swnd;
+	    Lf->lts.rws = Lf->lts.wws = (unsigned char)1;
+	}
+#endif	/* defined(HASTCPTPIW) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	switch (s->pst_family) {
+	case PS_AF_INET:
+	    if (Fnet && (!FnetTy || (FnetTy != 6)))
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+	    
+#if	defined(HASIPv6)
+		"IPv4"
+#else	/* !defined(HASIPv6) */
+		"inet"
+#endif	/* defined(HASIPv6) */
+
+	    );
+	    printpsproto(s->pst_protocol);
+	    enter_dev_ch(print_kptr(na, (char *)NULL, 0));
+	    switch (s->pst_protocol) {
+	    case PS_PROTO_TCP:
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)s->pst_pstate;
+		break;
+	    case PS_PROTO_UDP:
+		Lf->lts.type = 1;
+		Lf->lts.state.ui = (unsigned int)s->pst_pstate;
+	    }
+	/*
+	 * Enter local and remote addresses, being careful to generate
+	 * proper IPv4 address alignment by copying, since IPv4 addresses
+	 * may not be properly aligned in pst_boundaddr[] and pst_remaddr[].
+	 */
+	    if ((size_t)s->pst_boundaddr_len == sizeof(struct sockaddr_in)) {
+		sa = (struct sockaddr_in *)s->pst_boundaddr;
+		la = (unsigned char *)&sa->sin_addr;
+		lp = (int)htons(sa->sin_port);
+	    }
+	    if ((size_t)s->pst_remaddr_len == sizeof(struct sockaddr_in)) {
+		sa = (struct sockaddr_in *)s->pst_remaddr;
+		fp = (int)htons(sa->sin_port);
+		if ((sa->sin_addr.s_addr != INADDR_ANY) || fp)
+		    fa = (unsigned char *)&sa->sin_addr;
+	    }
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, AF_INET);
+	    break;
+
+#if	defined(HASIPv6)
+	case PS_AF_INET6:
+	    af = AF_INET6;
+	    if (Fnet && (!FnetTy || (FnetTy != 4)))
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "IPv6");
+	    printpsproto(s->pst_protocol);
+	    enter_dev_ch(print_kptr(na, (char *)NULL, 0));
+	    switch (s->pst_protocol) {
+	    case PS_PROTO_TCP:
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)s->pst_pstate;
+		break;
+	    case PS_PROTO_UDP:
+		Lf->lts.type = 1;
+		Lf->lts.state.ui = (unsigned int)s->pst_pstate;
+	    }
+	/*
+	 * Enter local and remote addresses, being careful to generate
+	 * proper IPv6 address alignment by copying, since IPv6 addresses
+	 * may not be properly aligned in pst_boundaddr[] and pst_remaddr[].
+	 */
+	    if ((size_t)s->pst_boundaddr_len == sizeof(struct sockaddr_in6)) {
+		sa6 = (struct sockaddr_in6 *)s->pst_boundaddr;
+		la = (unsigned char *)&sa6->sin6_addr;
+		lp = (int)htons(sa6->sin6_port);
+	    }
+	    if ((size_t)s->pst_remaddr_len == sizeof(struct sockaddr_in6)) {
+		sa6 = (struct sockaddr_in6 *)s->pst_remaddr;
+		if ((fp = (int)htons(sa6->sin6_port))
+		||  !IN6_IS_ADDR_UNSPECIFIED(&sa6->sin6_addr))
+		    fa = (unsigned char *)&sa6->sin6_addr;
+	    }
+	    if (la || fa) {
+		if ((la && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la))
+		||  (fa && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)fa)))
+		{
+		    if (la)
+			la = (unsigned char *)IPv6_2_IPv4(la);
+		    if (fa)
+			fa = (unsigned char *)IPv6_2_IPv4(fa);
+		    af = AF_INET;
+		}
+	    }
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, af);
+	    break;
+#endif	/* defined(HASIPv6) */
+
+	case PS_AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	    if (((len = (size_t)s->pst_boundaddr_len) > 0)
+	    &&  (len <= sizeof(struct sockaddr_un)))
+	    {
+		ua = (struct sockaddr_un *)s->pst_boundaddr;
+		if (ua->sun_path[0]) {
+
+		/*
+		 * The AF_UNIX socket has a bound address (file path).
+		 *
+		 * Save it.  If there is a low nodeid, put that in
+		 * parentheses after the name.  If there is a low peer
+		 * nodeid, put that in the parentheses, too.
+		 */
+		    s->pst_boundaddr[PS_ADDR_SZ - 1] = '\0';
+		    if (s->pst_lo_nodeid) {
+			(void) snpf(buf, sizeof(buf), "(%s%s%s)",
+			    print_kptr((KA_T)s->pst_lo_nodeid,
+				       tbuf, sizeof(tbuf)),
+			    s->pst_peer_lo_nodeid ? "->" : "",
+			    s->pst_peer_lo_nodeid ?
+			    		print_kptr((KA_T)s->pst_peer_lo_nodeid,
+						   (char *)NULL, 0)
+					: ""
+			);
+			len = strlen(buf) + 1;
+			if (!(nma = (char *)malloc((MALLOC_S)len))) {
+			    (void) fprintf(stderr,
+				"%s: no unix nma space(1): PID %ld, FD %s",
+				Pn, (long)Lp->pid, Lf->fd);
+			}
+			(void) snpf(nma, len, "%s", buf);
+			Lf->nma = nma;
+		    }
+		/*
+		 * Read the pst_filedetails for the bound address and process
+		 * them as for a regular file.  The already-entered file type,
+		 * file name, size or offset, and name appendix will be
+		 * preserved.
+		 */
+		    if ((nau = read_det(&f->psf_fid, f->psf_hi_fileid,
+					f->psf_lo_fileid, f->psf_hi_nodeid,
+					f->psf_lo_nodeid, &pd)))
+		    {
+			enter_nm(ua->sun_path);
+			(void) process_finfo(&pd, &f->psf_fid, &f->psf_id, nau);
+			return;
+		    } else {
+
+		    /*
+		     * Couldn't read file details.  Erase any name appendix.
+		     * Put the socket nodeid in the DEVICE column, put the
+		     * bound address (path) in the NAME column, and build
+		     * a new name appendix with the peer address.  Add an
+		     * error message if pstat_getfiledetails() set errno to
+		     * something other than ENOENT.
+		     */
+			if ((err = errno) == ENOENT)
+			    err = 0;
+			if (nma) {
+			    (void) free((MALLOC_P *)nma);
+			    Lf->nma = (char *)NULL;
+			}
+			if (s->pst_lo_nodeid) {
+	    		    enter_dev_ch(print_kptr((KA_T)s->pst_lo_nodeid,
+					 (char *)NULL, 0));
+			}
+			(void) snpf(Namech, Namechl, "%s", ua->sun_path);
+			if (err || s->pst_peer_lo_nodeid) {
+			    (void) snpf(buf, sizeof(buf),
+				"%s%s%s%s%s%s%s",
+				err ? "(Error: " : "",
+				err ? strerror(err) : "",
+				err ? ")" : "",
+				(err && s->pst_peer_lo_nodeid) ? " " : "",
+				s->pst_peer_lo_nodeid ? "(->" : "",
+				s->pst_peer_lo_nodeid ?
+					print_kptr((KA_T)s->pst_peer_lo_nodeid,
+						   (char *)NULL, 0)
+				:	"",
+				s->pst_peer_lo_nodeid ? ")" : ""
+			    );
+			    len = strlen(buf) + 1;
+			    if (!(nma = (char *)malloc((MALLOC_S)len))) {
+				(void) fprintf(stderr,
+				    "%s: no unix nma space(2): PID %ld, FD %s",
+				    Pn, (long)Lp->pid, Lf->fd);
+			    }
+			    (void) snpf(nma, len, "%s", buf);
+			    Lf->nma = nma;
+			}
+			if (Sfile && is_file_named(ua->sun_path, 0))
+			    Lf->sf |= SELNM;
+			break;
+		    }
+		}
+	    }
+	/*
+	 * If the UNIX socket has no bound address (file path), display the
+	 * low nodeid in the DEVICE column and the peer's low nodeid in the
+	 * NAME column.
+	 */
+	    if (s->pst_peer_lo_nodeid) {
+		(void) snpf(Namech, Namechl, "->%s",
+		    print_kptr((KA_T)s->pst_peer_lo_nodeid, (char *)NULL, 0));
+	    }
+	    if (s->pst_lo_nodeid)
+		enter_dev_ch(print_kptr((KA_T)s->pst_lo_nodeid,(char *)NULL,0));
+	    break;
+	default:
+	    (void) snpf(Namech, Namechl, "unsupported family: AF_%d",
+		s->pst_family);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+/*
+ * process_stream() -- process stream
+ */
+
+void
+process_stream(f, ckscko)
+	struct pst_fileinfo2 *f;		/* pst_fileinfo2 */
+	int ckscko;				/* socket file only checking
+						 * if 1 */
+{
+	struct clone *cl;
+	char *cp;
+	struct l_dev *dp = (struct l_dev *)NULL;
+	int hx, i, ncx, nsn, nsr;
+	size_t nb, nl;
+	KA_T na;
+	static int nsa = 0;
+	dev_t rdev;
+	static struct pst_stream *s = (struct pst_stream *)NULL;
+	struct pst_socket sck;
+	static size_t sz = sizeof(struct pst_stream);
+
+#if	!defined(PS_STR_XPORT_DATA)
+/*
+ * If socket file only checking is enabled and this HP-UX PSTAT instance
+ * doesn't support TCP or UDP stream eXPORT data, return without further
+ * action.
+ */
+	if (ckscko == 1)
+		return;
+#endif	/* !defined(PS_STR_XPORT_DATA) */
+
+/*
+ * Generate and save node ID.
+ */
+	na = (KA_T)(((KA_T)(f->psf_hi_nodeid & 0xffffffff) << 32)
+	   |		(KA_T)(f->psf_lo_nodeid & 0xffffffff));
+
+#if	defined(HASFSTRUCT)
+	if (na && (Fsv & FSV_NI)) {
+	    Lf->fna = na;
+	    Lf->fsv |= FSV_NI;
+	}
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Enter type.
+ */
+	switch (f->psf_ftype) {
+	case PS_TYPE_STREAMS:
+	    cp = "STR";
+	    break;
+	case PS_TYPE_SOCKET:
+	    if (f->psf_subtype == PS_SUBTYPE_SOCKSTR) {
+		cp = "STSO";
+		break;
+	    }
+	    /* fall through */
+	default:
+	    cp = "unkn";
+	}
+	(void) snpf(Lf->type, sizeof(Lf->type), "%s", cp);
+/*
+ * Allocate sufficient space for stream structures, then read them.
+ */
+	if ((nsn = f->psf_nstrentt) && (nsn >= nsa)) {
+	    nb = (size_t)(nsn * sizeof(struct pst_stream));
+	    if (s)
+		s = (struct pst_stream *)realloc((MALLOC_P *)s, nb);
+	    else
+		s = (struct pst_stream *)malloc(nb);
+	    if (!s) {
+		(void) fprintf(stderr,
+		    "%s: no space for %ld pst_stream bytes\n", Pn, (long)nb);
+		Exit(1);
+	    }
+	    nsa = nsn;
+	}
+	errno = 0;
+	if ((nsr = pstat_getstream(s, sz, (size_t)nsn, 0, &f->psf_fid)) < 1) {
+	    if (nsn) {
+		(void) snpf(Namech, Namechl,
+		    "can't read %d stream structures%s%s", nsn,
+		    errno ? ": " : "", errno ? strerror(errno) : "");
+		enter_nm(Namech);
+	    } else
+		enter_nm("no stream structures present");
+	    return;
+	}
+/*
+ * Find the stream head.
+ */
+	for (hx = 0; hx < nsn; hx++) {
+	    if (s[hx].type == PS_STR_HEAD)
+		break;
+	}
+	if (hx >= nsn) { 
+	    enter_nm("no stream head located");
+	    return;
+	}
+/*
+ * Make sure the stream head's fileid and nodeid match the ones in the
+ * pst_fileino2 structure.
+ */
+	if ((f->psf_hi_fileid != s[hx].val.head.pst_hi_fileid)
+	 |  (f->psf_lo_fileid != s[hx].val.head.pst_lo_fileid)
+	 |  (f->psf_hi_nodeid != s[hx].val.head.pst_hi_nodeid)
+	 |  (f->psf_lo_nodeid != s[hx].val.head.pst_lo_nodeid)) {
+	    enter_nm("no matching stream data available");
+	    return;
+	}
+
+#if	defined(PS_STR_XPORT_DATA)
+/*
+ * See if this stream has eXPORT data available and is a TCP or
+ * UDP stream.
+ */
+	if ((s[hx].pst_extn_flags & PS_STR_XPORT_DATA)
+	&&  ((s[hx].pst_str_xport_protocol == PS_STR_XPORT_TCP_PROTO)
+	||   (s[hx].pst_str_xport_protocol == PS_STR_XPORT_UDP_PROTO))
+	) {
+
+	/*
+	 * Make a socket from the eXPORT data and process it.
+	 */
+	    (void) make_sock(f, &s[hx], &sck);
+	    (void) process_socket(f, &sck);
+	    return;
+	} else if (ckscko || Selinet) {
+
+	/*
+	 * If socket file or Internet file only processing is enabled, return.
+	 */
+	    return;
+	}
+#endif	/* defined(PS_STR_XPORT_DATA) */
+
+/*
+ * Enter size from stream head's structure, if requested.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r') {
+		Lf->sz = (SZOFFTYPE)s[hx].val.head.pst_rbytes;
+		Lf->sz_def = 1;
+	    } else if (Lf->access == 'w') {
+		Lf->sz = (SZOFFTYPE)s[hx].val.head.pst_wbytes;
+		Lf->sz_def = 1;
+	    } else if (Lf->access == 'u') {
+		Lf->sz = (SZOFFTYPE)s[hx].val.head.pst_rbytes
+		       + (SZOFFTYPE)s[hx].val.head.pst_wbytes;
+		Lf->sz_def = 1;
+	    }
+	}
+/*
+ * Get the the device number from the stream head.
+ *
+ * If the stream is a clone:
+ *
+ *	if there's a clone list, search it for the device, based on the stream
+ *	    head's minor device number only;
+ *	if there's no clone list, search Devtp[], using a device number made
+ *	    from the stream head's major and minor device numbers;
+ *	set the printable clone device number to one whose major device number
+ *	    is the stream head's minor device number, and whose minor device
+ *	    number is the stream head's device sequence number.
+ *
+ * If the stream isn't a clone, make the device number from the stream head's
+ * major and minor numbers, and look up the non-clone device number in Devtp[].
+ */
+	if (!Sdev)
+	    readdev(0);
+	if (s[hx].val.head.pst_flag & PS_STR_ISACLONE) {
+	    if (HaveCloneMaj && (CloneMaj == s[hx].val.head.pst_dev_major)) {
+		for (cl = Clone; cl; cl = cl->next) {
+		    if (GET_MIN_DEV(Devtp[cl->dx].rdev)
+		    ==  s[hx].val.head.pst_dev_minor)
+		    {
+			dp = &Devtp[cl->dx];
+			break;
+		    }
+		}
+	    } else {
+		rdev = makedev(s[hx].val.head.pst_dev_major,
+			       s[hx].val.head.pst_dev_minor);
+		dp = lkupdev(&DevDev, &rdev, 0, 1);
+	    }
+	    rdev = makedev(s[hx].val.head.pst_dev_minor,
+			   s[hx].val.head.pst_dev_seq);
+	} else {
+	    rdev = makedev(s[hx].val.head.pst_dev_major,
+			   s[hx].val.head.pst_dev_minor);
+	    dp = lkupdev(&DevDev, &rdev, 0, 1);
+	}
+	Lf->dev = DevDev;
+	Lf->rdev = rdev;
+	Lf->dev_def = Lf->rdev_def = 1;
+/*
+ * If the device was located, enter the device name and save the node number.
+ *
+ * If the device wasn't located, save a positive file ID number from the
+ * pst_fileinfo as a node number.
+ */
+	if (dp) {
+	    (void) snpf(Namech, Namechl, "%s", dp->name);
+	    ncx = strlen(Namech);
+	    Lf->inode = (INODETYPE)dp->inode;
+	    Lf->inp_ty = 1;
+	} else {
+	    ncx = (size_t)0;
+	    if (f->psf_id.psf_fileid > 0) {
+		Lf->inode = (INODETYPE)f->psf_id.psf_fileid;
+		Lf->inp_ty = 1;
+	    }
+	}
+/*
+ * Enter stream module names.
+ */
+	for (i = 1; i < nsr; i++) {
+	    if (!(nl = strlen(s[i].val.module.pst_name)))
+		continue;
+	    if (ncx) {
+		if ((ncx + 2) > (Namechl - 1))
+		    break;
+		(void) snpf(&Namech[ncx], Namechl - ncx, "->");
+		ncx += 2;
+	    }
+	    if ((ncx + nl) > (Namechl - 1))
+		break;
+	    (void) snpf(Namech+ncx,Namechl-ncx,"%s",s[i].val.module.pst_name);
+	    ncx += nl;
+	}
+/*
+ * Set node type.
+ *
+ * Set offset defined if file size not requested or if no size was
+ * obtained from the stream head.
+ */
+	Lf->ntype = N_STREAM;
+	Lf->is_stream = 1;
+	if (!Fsize || (Fsize && !Lf->sz_def))
+	    Lf->off_def = 1;
+/*
+ * Test for specified file.
+ */
+	if ((f->psf_subtype == PS_SUBTYPE_CHARDEV)
+	||  (f->psf_subtype == PS_SUBTYPE_BLKDEV))
+	    i = 1;
+	else
+	    i = 0;
+	if (Sfile && is_file_named((char *)NULL, i))
+	    Lf->sf |= SELNM;
+/*
+ * Enter any name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+/*
+ * read_sock() -- read pst_socket info for file
+ */
+
+struct pst_socket *
+read_sock(f)
+	struct pst_fileinfo2 *f;		/* file information */
+{
+	static struct pst_socket s;
+
+	errno = 0;
+	if (f) {
+	    if (pstat_getsocket(&s, sizeof(s), &f->psf_fid) > 0
+	    &&  f->psf_hi_fileid == s.pst_hi_fileid
+	    &&  f->psf_lo_fileid == s.pst_lo_fileid
+	    &&  f->psf_hi_nodeid == s.pst_hi_nodeid
+	    &&  f->psf_lo_nodeid == s.pst_lo_nodeid)
+		return(&s);
+	}
+	return((struct pst_socket *)NULL);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dstore.c
new file mode 100644
index 0000000..d0a87f5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/dstore.c
@@ -0,0 +1,80 @@
+/*
+ * dstore.c - pstat-based HP-UX global storage for lsof
+ */
+
+
+/*
+ * Copyright 1999 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1999 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Global storage definitions
+ */
+
+_T_LONG_T CloneMaj;			/* clone major device number */
+int HasNFS = -1;			/* NFS-mounted file system status:
+					 *    -1: not yet tested;
+					 *     0: tested and none mounted;
+					 *     1: tested and some mounted */
+int HaveCloneMaj = 0;			/* CloneMaj status */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)PS_FRDONLY,	FF_READ		},
+	{ (long)PS_FWRONLY,	FF_WRITE	},
+	{ (long)PS_FAPPEND,	FF_APPEND	},
+	{ (long)PS_FNODELY,	FF_NDELAY	},
+	{ (long)PS_FNBLOCK,	FF_NBLOCK	},
+	{ (long)PS_FSYNC,	FF_SYNC		},
+	{ (long)PS_FDSYNC,	FF_DSYNC	},
+	{ (long)PS_FRSYNC,	FF_RSYNC	},
+	{ (long)PS_FLGFILE,	FF_LARGEFILE	},
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+	{ (long)PS_FEXCLOS,	POF_CLOEXEC	},
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/machine.h b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/machine.h
new file mode 100644
index 0000000..2555e80
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/hpux/pstat/machine.h
@@ -0,0 +1,648 @@
+/*
+ * machine.h - pstat-based HP-UX definitions for lsof
+ */
+
+
+/*
+ * Copyright 1999 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: machine.h,v 1.22 2010/07/29 16:03:12 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+# if	defined(__GNUC__)
+/*
+ * Do gcc preparation.
+ */
+
+#  if	!defined( __STDC_EXT__)
+#define	__STDC_EXT__
+#  endif	/* !defined( __STDC_EXT__) */
+
+#include <sys/_inttypes.h>
+
+#  if	HPUXV>=1123
+#undef	LSOF_XOPEN_SOURCE_EXTENDED
+#   if	defined(_XOPEN_SOURCE_EXTENDED)
+#define	LSOF_XOPEN_SOURCE_EXTENDED _XOPEN_SOURCE_EXTENDED
+#undef	_XOPEN_SOURCE_EXTENDED
+#   endif	/* defined(_XOPEN_SOURCE_EXTENDED) */
+#include <netdb.h>
+#   if	defined(LSOF_XOPEN_SOURCE_EXTENDED)
+#define	_XOPEN_SOURCE_EXTENDED LSOF_XOPEN_SOURCE_EXTENDED
+#undef	LSOF_XOPEN_SOURCE_EXTENDED
+#   endif	/* defined(_XOPEN_SOURCE_EXTENDED) */
+#  endif	/* HPUXV>=1123 */
+# endif	/* defined(__GNUC__) */
+
+
+/*
+ * Make sure a 32 bit lsof for HP-UX<1123 uses [l]stat64()
+ */
+
+#if	!defined(__LP64__) && HPUXV<1123
+#define	lstat		lstat64
+#define	stat		stat64
+#endif	/* !defined(__LP64__) && HPUXV<1123 */
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+#define	GET_MAX_FD	get_max_fd
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+/* #define	HASINODE	1 */
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+/* #define	HASKOPT	1 */
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+#define HASLFILEADD struct pst_fid opfid; \
+		    struct psfileid psfid;
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+#define SETLFILEADD memset((void *)&Lf->opfid, 0, sizeof(struct pst_fid)); \
+		    memset((void *)&Lf->psfid, 0, sizeof(struct psfileid));
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+/* #define	HASMOPT	1	*/
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	2
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+/* #define	HASNLIST	1	*/
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+#define	HASPRINTDEV	print_dev
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+#define	HASPRIVPRIPP	1
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+/* #define	HASPROCFS	"proc?" */
+#define	HASFSTYPE	2	/* see also dlsof.h */
+/* #define	HASPINODEN	1 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1	*/
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1	*/
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+#define	HASWIDECHAR	1
+#define	WIDECHARINCL	<wctype.h>
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1	*/
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+/* #define	HASTCPOPT	1	has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+#define	HASTCPTPIW	1
+
+
+/*
+ * HASTCPUDPSTATE is defined for dialects that have TCP and UDP state
+ * support -- i.e., for the "-stcp|udp:state" option and its associated
+ * speed improvements.
+ */
+
+#define	HASTCPUDPSTATE	1
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior to
+ * R4 usually don't.
+ */
+
+/* #define	HASVNODE	1	*/
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"		/* INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	uid_t
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+/* #define	USE_LIB_FIND_CH_INO		1	   fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+/* #define	USE_LIB_PRINT_TCPTPI		1	   ptti.c */
+/* #define	USE_LIB_PRINT_TCPTPI		1	   ptti.c */
+#define	USE_LIB_READDEV				1	/* rdev.c */
+#define	USE_LIB_READMNT				1	/* rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+/* #define	WARNDEVACCESS	1 */
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+/* #define	WILLDROPGID	1	*/
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)		memset((void *)a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/Makefile b/lsof_4.85/lsof_4.85_src/dialects/linux/Makefile
new file mode 100644
index 0000000..3611e33
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/Makefile
@@ -0,0 +1,144 @@
+
+# Linux /proc-based Makefile
+#
+# $Id: Makefile,v 1.11 2008/04/15 13:30:01 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}/usr/bin
+
+DOC=	${DESTDIR}/usr/share/man/man8
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+DEP=	${CFGD} ${CFGDN}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEP} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    dfile.c dmnt.c dnode.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.c
+
+OBJ=	dfile.o dmnt.o dnode.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${P} ${LIB} ${OBJ}
+	${CC} -o $@ ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h ${CFGDN}
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	mkdir -p ${BIN}
+	install ${PROG} ${BIN}
+	mkdir -p ${DOC}
+	install ${MAN} ${DOC}
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_CINFO	"${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/linux/Mksrc
new file mode 100755
index 0000000..8a1ffa1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/Mksrc
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Mksrc - make Linux source files for /proc-based lsof
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.2 2000/12/04 14:31:02 abe Exp $
+
+
+D=dialects/linux
+L="dfile.c dlsof.h dmnt.c dnode.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
+
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/linux/dfile.c
new file mode 100644
index 0000000..276cd35
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dfile.c
@@ -0,0 +1,64 @@
+/*
+ * dfile.c - Linux file processing functions for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.7 2002/02/26 15:20:15 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * printdevname() - print character device name
+ *
+ * Note: this function should not be needed in /proc-based lsof, but
+ *	 since it is called by printname() in print.c, an ersatz one
+ *	 is provided here.
+ */
+
+int
+printdevname(dev, rdev, f, nty)
+	dev_t *dev;			/* device */
+        dev_t *rdev;                    /* raw device */
+        int f;                          /* 1 = follow with '\n' */
+	int nty;			/* node type: N_BLK or N_chr */
+{
+	char buf[128];
+
+	(void) snpf(buf, sizeof(buf), "%s device: %d,%d",
+		    (nty == N_BLK) ? "BLK" : "CHR",
+		    (int)GET_MAJ_DEV(*rdev), (int)GET_MIN_DEV(*rdev));
+	safestrprt(buf, stdout, f);
+	return(1);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/linux/dlsof.h
new file mode 100644
index 0000000..a288cbe
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dlsof.h
@@ -0,0 +1,175 @@
+/*
+ * dlsof.h - Linux header file for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.21 2011/09/27 17:38:39 abe Exp $
+ */
+
+
+#if	!defined(LINUX_LSOF_H)
+#define	LINUX_LSOF_H	1
+
+#include <dirent.h>
+#define	DIRTYPE	dirent			/* for arg.c's enter_dir() */
+#define	__USE_GNU			/* to get all O_* symbols in fcntl.h */
+#include <fcntl.h>
+#include <malloc.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <string.h>
+#include <setjmp.h>
+#include <unistd.h>
+#include <netinet/in.h>
+
+# if	defined(GLIBCV) || defined(__UCLIBC__)
+#include <netinet/tcp.h>
+# else	/* !defined(GLIBCV) && !defined(__UCLIBC__) */
+#include <linux/tcp.h>
+# endif	/* defined(GLIBCV) || defined(__UCLIBC__) */
+
+# if	!defined(HASNORPC_H)
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+# endif	/* !defined(HASNORPC_H) */
+ 
+#if	defined(HASSELINUX)
+#include <selinux/selinux.h>
+#endif	/* defined(HASSELINUX) */
+
+#include <sys/sysmacros.h>
+#include <sys/socket.h>
+#include <arpa/inet.h>
+#include <linux/if_ether.h>
+#include <linux/netlink.h>
+
+
+/*
+ * This definition is needed for the common function prototype definitions
+ * in "proto.h", but isn't used in /proc-based lsof.
+ */
+
+typedef	unsigned long	KA_T;
+
+
+/*
+ * Local definitions
+ */
+
+#define	COMP_P		const void
+#define DEVINCR		1024	/* device table malloc() increment */
+#define	FSNAMEL		4
+#define MALLOC_P	void
+#define FREE_P		MALLOC_P
+#define MALLOC_S	size_t
+#define	MAXSYSCMDL	15	/* max system command name length
+				 *   This value should be obtained from a
+				 * header file #define, but no consistent one
+				 * exists.  Some versions of the Linux kernel
+				 * have a hard-coded "char comm[16]" command
+				 * name member of the task structured
+				 * definition in <linux/sched.h>, while others
+				 * have a "char comm[TASK_COMM_LEN]" member
+				 * with TASK_COMM_LEN #define'd to be 16.
+				 *   Hence, a universal, local definition of
+				 * 16 is #define'd here. */
+#define	PROCFS		"/proc"
+#define QSORT_P		void
+#define	READLEN_T	size_t
+
+/*
+ * Definitions that indicate what values are present in a stat(2) or lstat(2)
+ * buffer.
+ */
+
+#define	SB_DEV		0x01		/* st_dev */
+#define	SB_INO		0x02		/* st_ino */
+#define	SB_MODE		0x04		/* st_mode */
+#define	SB_NLINK	0x08		/* st_nlink */
+#define	SB_RDEV		0x10		/* st_rdev */
+#define	SB_SIZE		0x20		/* st_size */
+#define	SB_ALL		(SB_DEV | SB_INO | SB_MODE | SB_NLINK | SB_RDEV | \
+			 SB_SIZE)	/* all values */
+
+#define STRNCPY_L	size_t
+#define	STRNML		32
+
+# if	defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS==64
+#define	SZOFFTYPE	unsigned long long
+					/* size and offset internal storage
+					 * type */
+#define	SZOFFPSPEC	"ll"		/* SZOFFTYPE print specification
+					 * modifier */
+# endif	/* defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS==64 */
+
+#define	XDR_PMAPLIST	(xdrproc_t)xdr_pmaplist
+#define	XDR_VOID	(xdrproc_t)xdr_void
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+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 */
+	int ds;				/* directory status -- i.e., SB_*
+					 * values */
+	mode_t fs_mode;			/* file system st_mode */
+	int ty;				/* node type -- e.g., N_REGLR, N_NFS */
+        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 */
+	mode_t 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 */
+};
+
+extern int HasNFS;
+extern int OffType;
+
+#endif	/* LINUX_LSOF_H	*/
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/linux/dmnt.c
new file mode 100644
index 0000000..1d28dcd
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dmnt.c
@@ -0,0 +1,661 @@
+/*
+ * dmnt.c -- Linux mount support functions for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef	lint
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.18 2011/09/07 19:07:45 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#if	defined(HASMNTSUP)
+#define	HASHMNT	128			/* mount supplement hash bucket count
+					 * !!!MUST BE A POWER OF 2!!! */
+#endif	/* defined(HASMNTSUP) */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static char *cvtoe,(char *os));
+
+#if	defined(HASMNTSUP)
+_PROTOTYPE(static int getmntdev,(char *dn, struct stat *s, int *ss));
+_PROTOTYPE(static int hash_mnt,(char *dn));
+#endif	/* defined(HASMNTSUP) */
+
+
+/*
+ * Local structure definitions.
+ */
+
+#if	defined(HASMNTSUP)
+typedef struct mntsup {
+	char *dn;			/* directory name */
+	dev_t dev;			/* device number */
+	int ln;				/* line on which defined */
+	struct mntsup *next;		/* next entry */
+} mntsup_t;
+#endif	/* defined(HASMNTSUP) */
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+static mntsup_t **MSHash = (mntsup_t **)NULL;		/* mount supplement
+							 * hash buckets */
+
+
+/*
+ * cvtoe() -- convert octal-escaped characters in string
+ */
+
+static char *
+cvtoe(os)
+	char *os;			/* original string */
+{
+	int c, cl, cx, ol, ox, tx;
+	char *cs;
+	int tc;
+/*
+ * Allocate space for a copy of the string in which octal-escaped characters
+ * can be replaced by the octal value -- e.g., \040 with ' '.  Leave room for
+ * a '\0' terminator.
+ */
+	if (!(ol = (int)strlen(os)))
+	   return((char *)NULL);
+	if (!(cs = (char *)malloc(ol + 1))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes for octal-escaping.\n",
+		Pn, ol + 1);
+	    Exit(1);
+	}
+/*
+ * Copy the string, replacing octal-escaped characters as they are found.
+ */
+	for (cx = ox = 0, cl = ol; ox < ol; ox++) {
+	    if (((c = (int)os[ox]) == (int)'\\') && ((ox + 3) < ol)) {
+
+	    /*
+	     * The beginning of an octal-escaped character has been found.
+	     *
+	     * Convert the octal value to a character value.
+	     */
+		for (tc = 0, tx = 1; os[ox + tx] && (tx < 4); tx++) {
+		    if (((int)os[ox + tx] < (int)'0')
+		    ||  ((int)os[ox + tx] > (int)'7'))
+		    {
+
+		    /*
+		     * The escape isn't followed by octets, so ignore the
+		     * escape and just copy it.
+		     */
+			break;
+		    }
+		    tc <<= 3;
+		    tc += (int)(os[ox + tx] - '0');
+		}
+		if (tx == 4) {
+
+		/*
+		 * If three octets (plus the escape) were assembled, use their
+		 * character-forming result.
+		 *
+		 * Otherwise copy the escape and what follows it until another
+		 * escape is found.
+		 */
+		    ox += 3;
+		    c = (tc & 0xff);
+		}
+	    }
+	    if (cx >= cl) {
+
+	    /*
+	     * Expand the copy string, as required.  Leave room for a '\0'
+	     * terminator.
+	     */
+		cl += 64;		/* (Make an arbitrary increase.) */
+		if (!(cs = (char *)realloc(cs, cl + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't realloc %d bytes for octal-escaping.\n",
+			Pn, cl + 1);
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Copy the character.
+	 */
+	    cs[cx++] = (char)c;
+	}
+/*
+ * Terminate the copy and return its pointer.
+ */
+	cs[cx] = '\0';
+	return(cs);
+}
+
+
+#if	defined(HASMNTSUP)
+/*
+ * getmntdev() - get mount device from mount supplement
+ */
+
+static int
+getmntdev(dn, s, ss)
+	char *dn;			/* mount point directory name */
+	struct stat *s;			/* stat(2) buffer receptor */
+	int *ss;			/* stat(2) status result -- i.e., SB_*
+					 * values */
+{
+	static int err = 0;
+	int h;
+	mntsup_t *mp, *mpn;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+
+	if (err)
+	    return(0);
+	if (!MSHash) {
+
+	/*
+	 * No mount supplement hash buckets have been allocated, so read the
+	 * mount supplement file and create hash buckets for its entries.
+	 */
+	    char buf[(MAXPATHLEN*2) + 1], *dp, path[(MAXPATHLEN*2) + 1];
+	    dev_t dev;
+	    FILE *fs;
+	    int ln = 0;
+	    size_t sz;
+
+	    if ((MntSup != 2) || !MntSupP)
+		return(0);
+	    if (!is_readable(MntSupP, 1)) {
+
+	    /*
+	     * The mount supplement file isn't readable.
+	     */
+		err = 1;
+		return(0);
+	    }
+	    if (!(fs = open_proc_stream(MntSupP, "r", &vbuf, &vsz, 0))) {
+
+	    /*
+	     * The mount supplement file can't be opened for reading.
+	     */
+		if (!Fwarn)
+		    (void) fprintf(stderr, "%s: can't open(%s): %s\n",
+			Pn, MntSupP, strerror(errno));
+		err = 1;
+		return(0);
+	    }
+	    buf[sizeof(buf) - 1] = '\0';
+	/*
+	 * Read the mount supplement file.
+	 */
+	    while (fgets(buf, sizeof(buf) - 1, fs)) {
+		ln++;
+		if ((dp = strchr(buf, '\n')))
+		    *dp = '\0';
+		if (buf[0] != '/') {
+
+		/*
+		 * The mount supplement line doesn't begin with the absolute
+		 * path character '/'.
+		 */
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: %s line %d: no path: \"%s\"\n",
+			    Pn, MntSupP, ln, buf);
+		    err = 1;
+		    continue;
+		}
+		if (!(dp = strchr(buf, ' ')) || strncmp(dp + 1, "0x", 2)) {
+
+		/*
+		 * The path on the mount supplement line isn't followed by
+		 * " 0x".
+		 */
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: %s line %d: no device: \"%s\"\n",
+			    Pn, MntSupP, ln, buf);
+		    err = 1;
+		    continue;
+		}
+		sz = (size_t)(dp - buf);
+		(void) strncpy(path, buf, sz);
+		path[sz] = '\0';
+	    /*
+	     * Assemble the hexadecimal device number of the mount supplement
+	     * line.
+	     */
+		for (dev = 0, dp += 3; *dp; dp++) {
+		    if (!isxdigit((int)*dp))
+			break;
+		    if (isdigit((int)*dp))
+			dev = (dev << 4) + (int)*dp - (int)'0';
+		    else
+			dev = (dev << 4) + (int)tolower(*dp) - (int)'a' + 10;
+		}
+		if (*dp) {
+
+		/*
+		 * The device number couldn't be assembled.
+		 */
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: %s line %d: illegal device: \"%s\"\n",
+			    Pn, MntSupP, ln, buf);
+		    err = 1;
+		    continue;
+		}
+	    /*
+	     * Search the mount supplement hash buckets.  (Allocate them as
+	     * required.)
+	     */
+		if (!MSHash) {
+		    if (!(MSHash = (mntsup_t **)calloc(HASHMNT,
+						       sizeof(mntsup_t *)))
+		    ) {
+			(void) fprintf(stderr,
+			    "%s: no space for mount supplement hash buckets\n",
+			    Pn);
+			Exit(1);
+		    }
+		}
+		h = hash_mnt(path);
+		for (mp = MSHash[h]; mp; mp = mp->next) {
+		    if (!strcmp(mp->dn, path))
+			break;
+		}
+		if (mp) {
+
+		/*
+		 * A path match was located.  If the device number is the
+		 * same, skip this mount supplement line.  Otherwise, issue
+		 * a warning.
+		 */
+		    if (mp->dev != dev) {
+			(void) fprintf(stderr,
+			    "%s: %s line %d path duplicate of %d: \"%s\"\n",
+			    Pn, MntSupP, ln, mp->ln, buf);
+			err = 1;
+		    }
+		    continue;
+		}
+	    /*
+	     * Allocate and fill a new mount supplement hash entry.
+	     */
+		if (!(mpn = (mntsup_t *)malloc(sizeof(mntsup_t)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for mount supplement entry: %d \"%s\"\n",
+			Pn, ln, buf);
+		    Exit(1);
+		}
+		if (!(mpn->dn = (char *)malloc(sz + 1))) {
+		    (void) fprintf(stderr,
+			"%s: no space for mount supplement path: %d \"%s\"\n",
+			Pn, ln, buf);
+		    Exit(1);
+		}
+		(void) strcpy(mpn->dn, path);
+		mpn->dev = dev;
+		mpn->ln = ln;
+		mpn->next = MSHash[h];
+		MSHash[h] = mpn;
+	    }
+	    if (ferror(fs)) {
+		if (!Fwarn)
+		    (void) fprintf(stderr, "%s: error reading %s\n",
+			Pn, MntSupP);
+		err = 1;
+	    }
+	    (void) fclose(fs);
+	    if (err) {
+		if (MSHash) {
+		    for (h = 0; h < HASHMNT; h++) {
+			for (mp = MSHash[h]; mp; mp = mpn) {
+			    mpn = mp->next;
+			    if (mp->dn)
+				(void) free((MALLOC_P *)mp->dn);
+			    (void) free((MALLOC_P *)mp);
+			}
+		    }
+		    (void) free((MALLOC_P *)MSHash);
+		    MSHash = (mntsup_t **)NULL;
+		}
+		return(0);
+	    }
+	}
+/*
+ * If no errors have been detected reading the mount supplement file, search
+ * its hash biuckets for the supplied directory path.
+ */
+	if (err)
+	    return(0);
+	h = hash_mnt(dn);
+	for (mp = MSHash[h]; mp; mp = mp->next) {
+	    if (!strcmp(dn, mp->dn)) {
+		memset((void *)s, 0, sizeof(struct stat));
+		s->st_dev = mp->dev;
+		*ss |= SB_DEV;
+		return(1);
+	    }
+	}
+	return(0);
+}
+
+
+/*
+ * hash_mnt() - hash mount point
+ */
+
+static int
+hash_mnt(dn)
+	char *dn;			/* mount point directory name */
+{
+	register int i, h;
+	size_t l;
+
+	if (!(l = strlen(dn)))
+	    return(0);
+	if (l == 1)
+	    return((int)*dn & (HASHMNT - 1));
+	for (i = h = 0; i < (int)(l - 1); i++) {
+	    h ^= ((int)dn[i] * (int)dn[i+1]) << ((i*3)%13);
+	}
+	return(h & (HASHMNT - 1));
+}
+#endif	/* defined(HASMNTSUP) */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char buf[MAXPATHLEN], *cp, **fp;
+	char *dn = (char *)NULL;
+	int ds;
+	char *fp0 = (char *)NULL;
+	char *fp1 = (char *)NULL;
+	int fr, ignrdl, ignstat;
+	char *ln;
+	struct mounts *mp;
+	FILE *ms;
+	int nfs;
+	struct stat sb;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Open access to /proc/mounts, assigning a page size buffer to its stream.
+ */
+	(void) snpf(buf, sizeof(buf), "%s/mounts", PROCFS);
+	ms = open_proc_stream(buf, "r", &vbuf, &vsz, 1);
+/*
+ * Read mount table entries.
+ */
+	while (fgets(buf, sizeof(buf), ms)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < 3
+	    ||  !fp[0] || !fp[1] || !fp[2])
+		continue;
+	/*
+	 * Convert octal-escaped characters in the device name and mounted-on
+	 * path name.
+	 */
+	    if (fp0) {
+		(void) free((FREE_P *)fp0);
+		fp0 = (char *)NULL;
+	    }
+	    if (fp1) {
+		(void) free((FREE_P *)fp1);
+		fp1 = (char *)NULL;
+	    }
+	    if (!(fp0 = cvtoe(fp[0])) || !(fp1 = cvtoe(fp[1])))
+		continue;
+	/*
+	 * Ignore an entry with a colon in the device name, followed by
+	 * "(pid*" -- it's probably an automounter entry.
+	 *
+	 * Ignore autofs, pipefs, and sockfs entries.
+	 */
+	    if ((cp = strchr(fp0, ':')) && !strncasecmp(++cp, "(pid", 4))
+		continue;
+	    if (!strcasecmp(fp[2], "autofs") || !strcasecmp(fp[2], "pipefs")
+	    ||  !strcasecmp(fp[2], "sockfs"))
+		continue;
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    dn = fp1;
+	    fp1 = (char *)NULL;
+
+#if	defined(HASEOPT)
+	if (Efsysl) {
+
+	/*
+	 * If there is an -e file system list, check it to decide if a stat()
+	 * and Readlink() on this one should be performed.
+	 */
+	    efsys_list_t *ep;
+
+	    for (ignrdl = ignstat = 0, ep = Efsysl; ep; ep = ep->next) {
+		if (!strcmp(dn, ep->path)) {
+		    ignrdl = ep->rdlnk;
+		    ignstat = 1;
+		    break;
+		}
+	    }
+	} else
+
+#endif	/* defined(HASEOPT */
+
+	    ignrdl = ignstat = 0;
+
+	/*
+	 * Avoid Readlink() when requested.
+	 */
+	    if (!ignrdl) {
+		if (!(ln = Readlink(dn))) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		    }
+			continue;
+		}
+		if (ln != dn) {
+		    (void) free((FREE_P *)dn);
+		    dn = ln;
+		}
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Detect an NFS mount point.
+	 */
+	    if (!(nfs = strcasecmp(fp[2], "nfs")) && !HasNFS)
+		HasNFS = 1;
+	/*
+	 * Skip duplicate directories.
+	 */
+	    for (mp = Lmi; mp; mp = mp->next) {
+		if (!strcmp(dn, mp->dir))
+		    break;
+	    }
+	    if (mp)
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (ignstat)
+		fr = 1;
+	    else {
+		if ((fr = statsafely(dn, &sb))) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr, "%s: WARNING: can't stat() ",
+			    Pn);
+			safestrprt(fp[2], stderr, 0);
+			(void) fprintf(stderr, " file system ");
+			safestrprt(dn, stderr, 1);
+			(void) fprintf(stderr,
+			    "      Output information may be incomplete.\n");
+		    }
+		} else
+		    ds = SB_ALL;
+	    }
+
+#if	defined(HASMNTSUP)
+	    if (fr) {
+
+	    /*
+	     * If the stat() failed or wasn't called, check the mount
+	     * supplement table, if possible.
+	     */
+		if ((MntSup == 2) && MntSupP) {
+		    ds = 0;
+		    if (getmntdev(dn, &sb, &ds) || !(ds & SB_DEV)) {
+			(void) fprintf(stderr,
+			    "%s: assuming dev=%#lx for %s from %s\n",
+			    Pn, (long)sb.st_dev, dn, MntSupP);
+			}
+		} else {
+		    if (!ignstat)
+			continue;
+		   ds = 0;		/* No stat() was allowed. */
+		}
+	    }
+#else	/* !defined(HASMNTSUP) */
+	    if (fr) {
+		if (!ignstat)
+		    continue;
+		ds = 0;			/* No stat() was allowed. */
+	    }
+#endif	/* defined(HASMNTSUP) */
+
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mp = (struct mounts *)malloc(sizeof(struct mounts)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate mounts struct for: ", Pn);
+		safestrprt(dn, stderr, 1);
+		Exit(1);
+	    }
+	    mp->dir = dn;
+	    dn = (char *)NULL;
+	    mp->next = Lmi;
+	    mp->dev = ((mp->ds = ds) & SB_DEV) ? sb.st_dev : 0;
+	    mp->rdev = (ds & SB_RDEV) ? sb.st_rdev : 0;
+	    mp->inode = (INODETYPE)((ds & SB_INO) ? sb.st_ino : 0);
+	    mp->mode = (ds & SB_MODE) ? sb.st_mode : 0;
+	    if (!nfs) {
+		mp->ty = N_NFS;
+		if (HasNFS < 2)
+		    HasNFS = 2;
+	    } else
+		mp->ty = N_REGLR;
+
+#if	defined(HASMNTSUP)
+	/*
+	 * If support for the mount supplement file is defined and if the
+	 * +m option was supplied, print mount supplement information.
+	 */
+	    if (MntSup == 1) {
+		if (mp->dev)
+		    (void) printf("%s %#lx\n", mp->dir, (long)mp->dev);
+		else
+		    (void) printf("%s 0x0\n", mp->dir);
+	    }
+#endif	/* defined(HASMNTSUP) */
+
+	/*
+	 * Save mounted-on directory name.
+	 */
+	    dn = fp0;
+	    fp0 = (char *)NULL;
+	    mp->fsname = dn;
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link.
+	 *
+	 * Avoid Readlink() when requested.
+	 */
+	    if (ignrdl || (*dn != '/')) {
+		if (!(ln = mkstrcpy(dn, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate space for: ", Pn);
+		    safestrprt(dn, stderr, 1);
+		    Exit(1);
+		}
+		ignstat = 1;
+	    } else
+		ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (ignstat || !ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mp->fsnmres = ln;
+	    mp->fs_mode = sb.st_mode;
+	    Lmi = mp;
+	}
+/*
+ * Clean up and return the local mount info table address.
+ */
+	(void) fclose(ms);
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	if (fp0)
+	    (void) free((FREE_P *)fp0);
+	if (fp1)
+	    (void) free((FREE_P *)fp1);
+	Lmist = 1;
+	return(Lmi);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/linux/dnode.c
new file mode 100644
index 0000000..6b1bb51
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dnode.c
@@ -0,0 +1,538 @@
+/*
+ * dnode.c - Linux node functions for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.21 2011/08/07 22:53:13 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	OFFSET_MAX	((off_t)0x7fffffff)	/* this is defined in
+						 * .../src/fs/locks.c and not
+						 * in a header file */
+#define	PIDBUCKS	64			/* PID hash buckets */
+#define	HASHPID(pid)	(((int)((pid * 31415) >> 3)) & (PIDBUCKS - 1))
+
+
+/*
+ * Local structure definitions
+ */
+
+struct llock {
+	int pid;
+	dev_t dev;
+	INODETYPE inode;
+	char type;
+	struct llock *next;
+};
+
+
+/*
+ * Local definitions
+ */
+
+struct llock **LckH = (struct llock **)NULL; /* PID-hashed locks */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void check_lock,(void));
+
+
+/*
+ * check_lock() - check lock for file *Lf, process *Lp
+ */
+
+static void
+check_lock()
+{
+	int h;
+	struct llock *lp;
+
+	h = HASHPID(Lp->pid);
+	for (lp = LckH[h]; lp; lp = lp->next) {
+	    if (Lp->pid == lp->pid
+	    &&  Lf->dev == lp->dev
+	    &&  Lf->inode == lp->inode)
+	    {
+		Lf->lock = lp->type;
+		return;
+	    }
+	}
+}
+
+
+/*
+ * get_fields() - separate a line into fields
+ */
+
+int
+get_fields(ln, sep, fr, eb, en)
+	char *ln;			/* input line */
+	char *sep;			/* separator list */
+	char ***fr;			/* field pointer return address */
+	int *eb;			/* indexes of fields where blank or an
+					 * entry from the separator list may be
+					 * embedded and are not separators
+					 * (may be NULL) */
+	int en;				/* number of entries in eb[] (may be
+					 * zero) */
+{
+	char *bp, *cp, *sp;
+	int i, j, n;
+	MALLOC_S len;
+	static char **fp = (char **)NULL;
+	static int nfpa = 0;
+
+	for (cp = ln, n = 0; cp && *cp;) {
+	    for (bp = cp; *bp && (*bp == ' ' || *bp == '\t'); bp++);
+		;
+	    if (!*bp || *bp == '\n')
+		break;
+	    for (cp = bp; *cp; cp++) {
+		if (*cp == '\n') {
+		    *cp = '\0';
+		    break;
+		}
+		if (*cp == '\t')	/* TAB is always a separator */
+		    break;
+		if (*cp == ' ')  {
+
+		/*
+		 * See if this field may have an embedded space.
+		 */
+		    if (!eb || !en)
+			break;
+		    else {
+			for (i = j = 0; i < en; i++) {
+			    if (eb[i] == n) {
+				j = 1;
+				break;
+			    }
+			}
+			if (!j)
+			    break;
+		    }
+		}
+		if (sep) {
+
+		/*
+		 * See if the character is in the separator list.
+		 */
+		    for (sp = sep; *sp; sp++) {
+			if (*sp == *cp)
+			    break;
+		    }
+		    if (*sp) {
+
+		    /*
+		     * See if this field may have an embedded separator.
+		     */
+			if (!eb || !en)
+			    break;
+			else {
+			    for (i = j = 0; i < en; i++) {
+				if (eb[i] == n) {
+				    j = 1;
+				    break;
+				}
+			    }
+			    if (!j)
+				break;
+			}
+		    }
+		}
+	    }
+	    if (*cp)
+		*cp++ = '\0';
+	    if (n >= nfpa) {
+		nfpa += 32;
+		len = (MALLOC_S)(nfpa * sizeof(char *));
+		if (fp)
+		    fp = (char **)realloc((MALLOC_P *)fp, len);
+		else
+		    fp = (char **)malloc(len);
+		if (!fp) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for field pointers.\n",
+			Pn, (int)len);
+		    Exit(1);
+		}
+	    }
+	    fp[n++] = bp;
+	}
+	*fr = fp;
+	return(n);
+}
+
+
+/*
+ * get_locks() - get lock information from /proc/locks
+ */
+
+void
+get_locks(p)
+	char *p;				/* /proc lock path */
+{
+	unsigned long bp, ep;
+	char buf[MAXPATHLEN], *ec, **fp;
+	dev_t dev;
+	int ex, i, h, mode, pid;
+	INODETYPE inode;
+	struct llock *lp, *np;
+	FILE *ls;
+	long maj, min;
+	char type;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Destroy previous lock information.
+ */
+	if (LckH) {
+	    for (i = 0; i < PIDBUCKS; i++) {
+		for (lp = LckH[i]; lp; lp = np) {
+		    np = lp->next;
+		    (void) free((FREE_P *)lp);
+		}
+		LckH[i] = (struct llock *)NULL;
+	    }
+	} else {
+
+	/*
+	 * If first time, allocate the lock PID hash buckets.
+	 */
+	    LckH = (struct llock **)calloc((MALLOC_S)PIDBUCKS,
+					   sizeof(struct llock *));
+	    if (!LckH) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d lock hash bytes\n",
+		    Pn, (int)(sizeof(struct llock *) * PIDBUCKS));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc lock file, assign a page size buffer to its stream,
+ * and read it.
+ */
+	if (!(ls = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf), ls)) {
+	    if (get_fields(buf, ":", &fp, (int *)NULL, 0) < 10)
+		continue;
+	    if (!fp[1] || strcmp(fp[1], "->") == 0)
+		continue;
+	/*
+	 * Get lock type.
+	 */
+	    if (!fp[3])
+		continue;
+	    if (*fp[3] == 'R')
+		mode = 0;
+	    else if (*fp[3] == 'W')
+		mode = 1;
+	    else
+		continue;
+	/*
+	 * Get PID.
+	 */
+	    if (!fp[4] || !*fp[4])
+		continue;
+	    pid = atoi(fp[4]);
+	/*
+	 * Get device number.
+	 */
+	    ec = (char *)NULL;
+	    if (!fp[5] || !*fp[5]
+	    ||  (maj = strtol(fp[5], &ec, 16)) == LONG_MIN || maj == LONG_MAX
+	    ||  !ec || *ec)
+		continue;
+	    ec = (char *)NULL;
+	    if (!fp[6] || !*fp[6]
+	    ||  (min = strtol(fp[6], &ec, 16)) == LONG_MIN || min == LONG_MAX
+	    ||  !ec || *ec)
+		continue;
+	    dev = (dev_t)makedev((int)maj, (int)min);
+	/*
+	 * Get inode number.
+	 */
+	    ec = (char *)NULL;
+	    if (!fp[7] || !*fp[7]
+	    ||  (inode = strtoull(fp[7], &ec, 0)) == ULONG_MAX
+	    ||  !ec || *ec)
+		continue;
+	/*
+	 * Get lock extent.  Convert it and the lock type to a lock character.
+	 */
+	    if (!fp[8] || !*fp[8] || !fp[9] || !*fp[9])
+		continue;
+	    ec = (char *)NULL;
+	    if ((bp = strtoul(fp[8], &ec, 0)) == ULONG_MAX || !ec || *ec)
+		continue;
+	    if (!strcmp(fp[9], "EOF"))		/* for Linux 2.4.x */
+		ep = OFFSET_MAX;
+	    else {
+		ec = (char *)NULL;
+		if ((ep = strtoul(fp[9], &ec, 0)) == ULONG_MAX || !ec || *ec)
+		    continue;
+	    }
+	    ex = ((off_t)bp == (off_t)0 && (off_t)ep == OFFSET_MAX) ? 1 : 0;
+	    if (mode)
+		type = ex ? 'W' : 'w';
+	    else
+		type = ex ? 'R' : 'r';
+	/*
+	 * Look for this lock via the hash buckets.
+	 */
+	    h = HASHPID(pid);
+	    for (lp = LckH[h]; lp; lp = lp->next) {
+		if (lp->pid == pid
+		&&  lp->dev == dev
+		&&  lp->inode == inode
+		&&  lp->type == type)
+		    break;
+	    }
+	    if (lp)
+		continue;
+	/*
+	 * Allocate a new llock structure and link it to the PID hash bucket.
+	 */
+	    if (!(lp = (struct llock *)malloc(sizeof(struct llock)))) {
+		(void) snpf(buf, sizeof(buf), InodeFmt_d, inode);
+		(void) fprintf(stderr,
+		    "%s: can't allocate llock: PID %d; dev %x; inode %s\n",
+		    Pn, pid, (int)dev, buf);
+		Exit(1);
+	    }
+	    lp->pid = pid;
+	    lp->dev = dev;
+	    lp->inode = inode;
+	    lp->type = type;
+	    lp->next = LckH[h];
+	    LckH[h] = lp;
+	}
+	(void) fclose(ls);
+}
+
+
+/*
+ * process_proc_node() - process file node
+ */
+
+void
+process_proc_node(p, s, ss, l, ls)
+	char *p;			/* node's readlink() path */
+	struct stat *s;			/* stat() result for path */
+	int ss;				/* *s status -- i.e., SB_* values */
+	struct stat *l;			/* lstat() result for FD (NULL for
+					 * others) */
+	int ls;				/* *l status -- i.e., SB_* values */
+{
+	mode_t access;
+	mode_t type = 0;
+	char *cp;
+	struct mounts *mp = (struct mounts *)NULL;
+	size_t sz;
+	char *tn;
+/*
+ * Set the access mode, if possible.
+ */
+	if (l && (ls & SB_MODE) && ((l->st_mode & S_IFMT) == S_IFLNK)) {
+	    if ((access = l->st_mode & (S_IRUSR | S_IWUSR)) == S_IRUSR)
+		Lf->access = 'r';
+	    else if (access == S_IWUSR)
+		Lf->access = 'w';
+	    else
+		Lf->access = 'u';
+	}
+/*
+ * Determine node type.
+ */
+	if (ss & SB_MODE) {
+	    type = s->st_mode & S_IFMT;
+	    switch (type) {
+	    case S_IFBLK:
+		Ntype = N_BLK;
+		break;
+	    case S_IFCHR:
+		Ntype = N_CHR;
+		break;
+	    case S_IFIFO:
+		Ntype = N_FIFO;
+		break;
+	    case S_IFSOCK:
+		process_proc_sock(p, s, ss, l, ls);
+		return;
+	    }
+	}
+	if (Selinet)
+	    return;
+/*
+ * Save the device.  If it is an NFS device, change the node type to N_NFS.
+ */
+	if (ss & SB_DEV) {
+	    Lf->dev = s->st_dev;
+	    Lf->dev_def = 1;
+	}
+	if ((Ntype == N_CHR || Ntype == N_BLK)) {
+	    if (ss & SB_RDEV) {
+		Lf->rdev = s->st_rdev;
+		Lf->rdev_def = 1;
+	    }
+	}
+	if (Ntype == N_REGLR && (HasNFS == 2)) {
+	    for (mp = readmnt(); mp; mp = mp->next) {
+		if ((mp->ty == N_NFS)
+		&&  (mp->ds & SB_DEV) && (Lf->dev == mp->dev)
+		) {
+		    Ntype = N_NFS;
+		    break;
+		}
+	    }
+	}
+/*
+ * Save the inode number.
+ */
+	if (ss & SB_INO) {
+	    Lf->inode = (INODETYPE)s->st_ino;
+	    Lf->inp_ty = 1;
+	}
+/*
+ * Check for a lock.
+ */
+	if (Lf->dev_def && (Lf->inp_ty == 1))
+	    (void) check_lock();
+/*
+ * Save the file size.
+ */
+	switch (Ntype) {
+	case N_BLK:
+	case N_CHR:
+	case N_FIFO:
+	    if (!Fsize && l && (ls & SB_SIZE) && OffType) {
+		Lf->off = (SZOFFTYPE)l->st_size;
+		Lf->off_def = 1;
+	    }
+	    break;
+	default:
+	    if (Foffset) {
+		if (l && (ls & SB_SIZE) && OffType) {
+		    Lf->off = (SZOFFTYPE)l->st_size;
+		    Lf->off_def = 1;
+		}
+	    } else if (!Foffset || Fsize) {
+		if (ss & SB_SIZE) {
+		    Lf->sz = (SZOFFTYPE)s->st_size;
+		    Lf->sz_def = 1;
+		}
+	    }
+	}
+/*
+ * Record the link count.
+ */
+	if (Fnlink && (ss & SB_NLINK)) {
+	    Lf->nlink = (long)s->st_nlink;
+	    Lf->nlink_def = 1;
+	    if (Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Format the type name.
+ */
+	if (ss & SB_MODE) {
+	    switch (type) {
+	    case S_IFBLK:
+		tn = "BLK";
+		break;
+	    case S_IFCHR:
+		tn = "CHR";
+		break;
+	    case S_IFDIR:
+		tn = "DIR";
+		break;
+	    case S_IFIFO:
+		tn = "FIFO";
+		break;
+	    case S_IFREG:
+		tn = "REG";
+		break;
+	    case S_IFLNK:
+		tn = "LINK";
+		break;
+	    case S_ISVTX:
+		tn = "VTXT";
+		break;
+	    default:
+		(void) snpf(Lf->type, sizeof(Lf->type), "%04o",
+		    ((type >> 12) & 0xf));
+		tn = (char *)NULL;
+	    }
+	} else
+	    tn = "unknown";
+	if (tn)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", tn);
+	Lf->ntype = Ntype;
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Test for specified file.
+ */
+	if (Sfile
+	&& is_file_named((char *)NULL,
+			 ((type == S_IFCHR) || (type == S_IFBLK)) ? 1 : 0))
+	    Lf->sf |= SELNM;
+/*
+ * If no NAME information has been stored, store the path.
+ *
+ * Store the remote host and mount point for an NFS file.
+ */
+	if (!Namech[0]) {
+	    (void) snpf(Namech, Namechl, "%s", p);
+	    if ((Ntype == N_NFS) && mp && mp->fsname) {
+		cp = endnm(&sz);
+		(void) snpf(cp, sz, " (%s)", mp->fsname);
+	    }
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/linux/dproc.c
new file mode 100644
index 0000000..ed7b02d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dproc.c
@@ -0,0 +1,1552 @@
+/*
+ * dproc.c - Linux process access functions for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.25 2011/09/07 19:07:45 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	FDINFO_FLAGS		1	/* fdinfo flags available */
+#define	FDINFO_POS		2	/* fdinfo position available */
+#define FDINFO_ALL		(FDINFO_FLAGS | FDINFO_POS)
+#define	LSTAT_TEST_FILE		"/"
+#define LSTAT_TEST_SEEK		1
+
+#if	!defined(ULLONG_MAX)
+#define	ULLONG_MAX		18446744073709551615ULL
+#endif	/* !defined(ULLONG_MAX) */
+
+
+/*
+ * Local structures
+ */
+
+struct l_fdinfo {
+	int flags;			/* flags: line value */
+	off_t pos;			/* pos: line value */
+};
+
+
+/*
+ * Local variables
+ */
+
+static short Cckreg;			/* conditional status of regular file
+					 * checking:
+					 *     0 = unconditionally check
+					 *     1 = conditionally check */
+static short Ckscko;			/* socket file only checking status:
+					 *     0 = none
+					 *     1 = check only socket files */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int get_fdinfo,(char *p, struct l_fdinfo *fi));
+_PROTOTYPE(static int getlinksrc,(char *ln, char *src, int srcl));
+_PROTOTYPE(static int isefsys,(char *path, char *type, int l,
+			       efsys_list_t **rep, struct lfile **lfr));
+_PROTOTYPE(static int nm2id,(char *nm, int *id, int *idl));
+_PROTOTYPE(static int read_id_stat,(int ty, char *p, int id, char **cmd,
+				    int *ppid, int *pgid));
+_PROTOTYPE(static void process_proc_map,(char *p, struct stat *s, int ss));
+_PROTOTYPE(static int process_id,(char *idp, int idpl, char *cmd, UID_ARG uid,
+				  int pid, int ppid, int pgid, int tid));
+_PROTOTYPE(static int statEx,(char *p, struct stat *s, int *ss));
+ 
+
+#if	defined(HASSELINUX)
+_PROTOTYPE(static int cmp_cntx_eq,(char *pcntx, char *ucntx));
+
+
+#include <fnmatch.h>
+
+
+/*
+ * cmp_cntx_eq -- compare program and user security contexts
+ */
+
+static int
+cmp_cntx_eq(pcntx, ucntx)
+	char *pcntx;			       /* program context */
+	char *ucntx;			       /* user supplied context */
+{
+	return !fnmatch(ucntx, pcntx, 0);
+}
+
+
+/*
+ * enter_cntx_arg() - enter name ecurity context argument
+ */
+
+int
+enter_cntx_arg(cntx)
+	char *cntx;			       /* context */
+{
+	cntxlist_t *cntxp;
+/*
+ * Search the argument list for a duplicate.
+ */
+	for (cntxp = CntxArg; cntxp; cntxp = cntxp->next) {
+	    if (!strcmp(cntxp->cntx, cntx)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: duplicate context: %s\n",
+			Pn, cntx);
+		}
+		return(1);
+	    }
+	}
+/*
+ * Create and link a new context argument list entry.
+ */
+	if (!(cntxp = (cntxlist_t *)malloc((MALLOC_S)sizeof(cntxlist_t)))) {
+	    (void) fprintf(stderr, "%s: no space for context: %s\n", Pn, cntx);
+	    Exit(1);
+	}
+	cntxp->f = 0;
+	cntxp->cntx = cntx;
+	cntxp->next = CntxArg;
+	CntxArg = cntxp;
+	return(0);
+}
+#endif	/* defined(HASSELINUX) */
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	char *cmd, *tcmd;
+	struct dirent *dp;
+	unsigned char ht, pidts;
+	int n, nl, pgid, pid, ppid, rv, tid, tpgid, tppid, tx;
+	static char *path = (char *)NULL;
+	static int pathl = 0;
+	static char *pidpath = (char *)NULL;
+	static MALLOC_S pidpathl = 0;
+	static MALLOC_S pidx = 0;
+	static DIR *ps = (DIR *)NULL;
+	struct stat sb;
+	static char *taskpath = (char *)NULL;
+	static int taskpathl = 0;
+	static char *tidpath = (char *)NULL;
+	static int tidpathl = 0;
+	DIR *ts;
+	UID_ARG uid;
+
+/*
+ * Do one-time setup.
+ */
+	if (!pidpath) {
+	    pidx = strlen(PROCFS) + 1;
+	    pidpathl = pidx + 64 + 1;	/* 64 is growth room */
+	    if (!(pidpath = (char *)malloc(pidpathl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for \"%s/\"<pid>\n",
+		    Pn, (int)pidpathl, PROCFS);
+		Exit(1);
+	    }
+	    (void) snpf(pidpath, pidpathl, "%s/", PROCFS);
+	}
+/*
+ * Get lock and net information.
+ */
+	(void) make_proc_path(pidpath, pidx, &path, &pathl, "locks");
+	(void) get_locks(path);
+	(void) make_proc_path(pidpath, pidx, &path, &pathl, "net/");
+	(void) set_net_paths(path, strlen(path));
+/*
+ * If only socket files have been selected, or socket files have been selected
+ * ANDed with other selection options, enable the skipping of regular files.
+ *
+ * If socket files and some process options have been selected, enable
+ * conditional skipping of regular file; i.e., regular files will be skipped
+ * unless they belong to a process selected by one of the specified options.
+ */
+	if (Selflags & SELNW) {
+
+	/*
+	 * Some network files selection options have been specified.
+	 */
+	    if (Fand || !(Selflags & ~SELNW)) {
+
+	    /*
+	     * Selection ANDing or only network file options have been
+	     * specified, so set unconditional skipping of regular files
+	     * and socket file only checking.
+	     */
+		Cckreg = 0;
+		Ckscko = 1;
+	    } else {
+
+	    /*
+	     * If ORed file selection options have been specified, or no ORed
+	     * process selection options have been specified, enable
+	     * unconditional file checking and clear socket file only checking.
+	     *
+	     * If only ORed process selection options have been specified,
+	     * enable conditional file skipping and socket file only checking.
+	     */
+		if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+		    Cckreg = Ckscko = 0;
+		else
+		    Cckreg = Ckscko = 1;
+	    }
+	} else {
+
+	/*
+	 * No network file selection options were specified.  Enable
+	 * unconditional file checking and clear socket file only checking.
+	 */
+	    Cckreg = Ckscko = 0;
+	}
+/*
+ * Read /proc, looking for PID directories.  Open each one and
+ * gather its process and file information.
+ */
+	if (!ps) {
+	    if (!(ps = opendir(PROCFS))) {
+		(void) fprintf(stderr, "%s: can't open %s\n", Pn, PROCFS);
+		Exit(1);
+	    }
+	} else
+	    (void) rewinddir(ps);
+	while ((dp = readdir(ps))) {
+	    if (nm2id(dp->d_name, &pid, &n))
+		continue;
+	/*
+	 * Build path to PID's directory.
+	 */
+	    if ((pidx + n + 1 + 1) > pidpathl) {
+		pidpathl = pidx + n + 1 + 1 + 64;
+		if (!(pidpath = (char *)realloc((MALLOC_P *)pidpath, pidpathl)))
+		{
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for \"%s/%s/\"\n",
+			Pn, (int)pidpathl, PROCFS, dp->d_name);
+		    Exit(1);
+		}
+	    }
+	    (void) snpf(pidpath + pidx, pidpathl - pidx, "%s/", dp->d_name);
+	    n += (pidx + 1);
+	/*
+	 * Process the PID's stat info.
+	 */
+	    if (stat(pidpath, &sb))
+		continue;
+	    uid = (UID_ARG)sb.st_uid;
+	    ht = pidts = 0;
+
+#if	defined(HASTASKS)
+	/*
+	 * If task reporting is selected, check the tasks of the process first,
+	 * so that the "-p<PID> -aK" options work properly.
+	 */
+	    if ((Selflags & SELTASK)) {
+		(void) make_proc_path(pidpath, n, &taskpath, &taskpathl,
+				      "task");
+		tx = n + 4;
+		if ((ts = opendir(taskpath))) {
+
+		/*
+		 * Process the PID's tasks.  Record the open files of those
+		 * whose TIDs do not match the PID and which are themselves
+		 * not zombies.
+		 */
+		    while ((dp = readdir(ts))) {
+
+		    /*
+		     * Get the task ID.  Skip the task if its ID matches the
+		     * process PID.
+		     */
+			if (nm2id(dp->d_name, &tid, &nl))
+			    continue;
+			if  (tid == pid) {
+			    pidts = 1;
+			    continue;
+			}
+		    /*
+		     * Form the path for the TID.
+		     */
+			if ((tx + 1 + nl + 1 + 4) > tidpathl) {
+			    tidpathl = tx + 1 + n + 1 + 4 + 64;
+			    if (tidpath)
+				tidpath = (char *)realloc((MALLOC_P *)tidpath,
+							  tidpathl);
+			    else
+				tidpath = (char *)malloc((MALLOC_S)tidpathl);
+			    if (!tidpath) {
+				(void) fprintf(stderr,
+				    "%s: can't allocate %d task bytes", Pn,
+				    tidpathl);
+				(void) fprintf(stderr, " for \"%s/%s/stat\"\n",
+				    taskpath, dp->d_name);
+				Exit(1);
+			    }
+			}
+			(void) snpf(tidpath, tidpathl, "%s/%s/stat", taskpath,
+			    dp->d_name);
+		    /*
+		     * Check the task state.
+		     */
+			rv = read_id_stat(1, tidpath, tid, &tcmd, &tppid,
+					  &tpgid);
+			if ((rv < 0) || (rv == 1))
+			    continue;
+		    /*
+		     * Attempt to record the task.
+		     */
+			if (!process_id(tidpath, (tx + 1 + nl+ 1), tcmd, uid,
+					pid, tppid, tpgid, tid))
+			{
+			    ht = 1;
+			}
+		    }
+		    (void) closedir(ts);
+		}
+	    }
+#endif	/* defined(HASTASKS) */
+
+	/*
+	 * If the main process is a task and task selection has been specified
+	 * along with option ANDing, enter the main process temporarily as a
+	 * task,  so that the "-aK" option set lists the main process along
+	 * with its tasks.
+	 */
+	    (void) make_proc_path(pidpath, n, &path, &pathl, "stat");
+	    if (((rv = read_id_stat(0, path, pid, &cmd, &ppid, &pgid)) >= 0) 
+	    &&   (rv != 1))
+	    {
+		tid = (Fand && ht && pidts && (Selflags & SELTASK)) ? pid : 0;
+		if ((!process_id(pidpath, n, cmd, uid, pid, ppid, pgid, tid))
+		&&  tid)
+		{
+		    Lp->tid = 0;
+		}
+	    }
+	}
+}
+
+
+/*
+ * get_fdinfo() - get values from /proc/<PID>fdinfo/FD
+ */
+
+static int
+get_fdinfo(p, fi)
+	char *p;			/* path to fdinfo file */
+	struct l_fdinfo *fi;		/* pointer to local fdinfo values
+					 * return structure */
+{
+	char buf[MAXPATHLEN + 1], *ep, **fp;
+	FILE *fs;
+	int rv = 0;
+	unsigned long ul;
+	unsigned long long ull;
+/*
+ * Signal no values returned (0) if no fdinfo pointer was provided or if the
+ * fdinfo path can't be opened.
+ */
+	if (!fi)
+	    return(0);
+	if (!p || !*p || !(fs = fopen(p, "r")))
+	    return(0);
+/*
+ * Read the fdinfo file.
+ */
+	while (fgets(buf, sizeof(buf), fs)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < 2)
+		continue;
+	    if (!fp[0] || !*fp[0] || !fp[1] || !*fp[1])
+		continue;
+	    if (!strcmp(fp[0], "flags:")) {
+
+	    /*
+	     * Process a "flags:" line.
+	     */
+		ep = (char *)NULL;
+		if ((ul = strtoul(fp[1], &ep, 0)) == ULONG_MAX
+		||  !ep || *ep)
+		    continue;
+		fi->flags = (unsigned int)ul;
+		if ((rv |= FDINFO_FLAGS) == FDINFO_ALL)
+		    break;
+	    } else if (!strcmp(fp[0], "pos:")) {
+
+	    /*
+	     * Process a "pos:" line.
+	     */
+		ep = (char *)NULL;
+		if ((ull = strtoull(fp[1], &ep, 0)) == ULLONG_MAX
+		||  !ep || *ep)
+		    continue;
+		fi->pos = (off_t)ull;
+		if ((rv |= FDINFO_POS) == FDINFO_ALL)
+		    break;
+	    }
+	}
+	fclose(fs);
+/*
+ * Signal via the return value what information was obtained. (0 == none)
+ */
+	return(rv);
+}
+
+
+/*
+ * getlinksrc() - get the source path name for the /proc/<PID>/fd/<FD> link
+ */
+
+
+static int
+getlinksrc(ln, src, srcl)
+	char *ln;			/* link path */
+	char *src;			/* link source path return address */
+	int srcl;			/* length of src[] */
+{
+	char *cp;
+	int ll;
+
+	if ((ll = readlink(ln, src, srcl - 1)) < 1
+	||  ll >= srcl)
+	    return(-1);
+	src[ll] = '\0';
+	if (*src == '/')
+	    return(ll);
+	if ((cp = strchr(src, ':'))) {
+	    *cp = '\0';
+	    ll = strlen(src);
+	}
+	return(ll);
+}
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	int fd;
+	struct l_fdinfo fi;
+	char path[MAXPATHLEN];
+	struct stat sb;
+/*
+ * Test for -i and -X option conflict.
+ */
+	if (Fxopt && (Fnet || Nwad)) {
+	    (void) fprintf(stderr, "%s: -i is useless when -X is specified.\n",
+		Pn);
+	    usage(1, 0, 0);
+	}
+/*
+ * Open LSTAT_TEST_FILE and seek to byte LSTAT_TEST_SEEK, then lstat the
+ * /proc/<PID>/fd/<FD> for LSTAT_TEST_FILE to see what position is reported.
+ * If the result is LSTAT_TEST_SEEK, enable offset reporting.
+ *
+ * If the result isn't LSTAT_TEST_SEEK, next check the fdinfo file for the
+ * open LSTAT_TEST_FILE file descriptor.  If it exists and contains a "pos:"
+ * value, and if the value is LSTAT_TEST_SEEK, enable offset reporting.
+ */
+	if ((fd = open(LSTAT_TEST_FILE, O_RDONLY)) >= 0) {
+	    if (lseek(fd, (off_t)LSTAT_TEST_SEEK, SEEK_SET)
+	    == (off_t)LSTAT_TEST_SEEK) {
+		(void) snpf(path, sizeof(path), "%s/%d/fd/%d", PROCFS, Mypid,
+			    fd);
+		if (!lstat(path, &sb)) {
+		    if (sb.st_size == (off_t)LSTAT_TEST_SEEK)
+			OffType = 1;
+		}
+	    }
+	    if (!OffType) {
+		(void) snpf(path, sizeof(path), "%s/%d/fdinfo/%d", PROCFS,
+			    Mypid, fd);
+		if (get_fdinfo(path, &fi) & FDINFO_POS) {
+		    if (fi.pos == (off_t)LSTAT_TEST_SEEK)
+			OffType = 2;
+		}
+	    }
+	    (void) close(fd);
+	}
+	if (!OffType) {
+	    if (Foffset && !Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't report offset; disregarding -o.\n",
+		    Pn);
+	    Foffset = 0;
+	    Fsize = 1;
+	}
+	if (Fsv && (OffType != 2)) {
+	    if (!Fwarn && FsvByf)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't report file flags; disregarding +f.\n",
+		    Pn);
+	    Fsv = 0;
+	}
+/*
+ * Make sure the local mount info table is loaded if doing anything other
+ * than just Internet lookups.  (HasNFS is defined during the loading of the
+ * local mount table.)
+ */
+	if (Selinet == 0)
+	    (void) readmnt();
+}
+
+
+/*
+ * make_proc_path() - make a path in a /proc directory
+ *
+ * entry:
+ *	pp = pointer to /proc prefix
+ *	lp = length of prefix
+ *	np = pointer to malloc'd buffer to receive new file's path
+ *	nl = length of new file path buffer
+ *	sf = new path's suffix
+ *
+ * return: length of new path
+ *	np = updated with new path
+ *	nl = updated with new path length
+ */
+
+int
+make_proc_path(pp, pl, np, nl, sf)
+	char *pp;			/* path prefix -- e.g., /proc/<pid>/ */
+	int pl;				/* strlen(pp) */
+	char **np;			/* malloc'd receiving buffer */
+	int *nl;			/* strlen(*np) */
+	char *sf;			/* suffix of new path */
+{
+	char *cp;
+	MALLOC_S rl, sl;
+
+	sl = strlen(sf);
+	if ((rl = pl + sl + 1) > *nl) {
+	    if ((cp = *np))
+		cp = (char *)realloc((MALLOC_P *)cp, rl);
+	    else
+		cp = (char *)malloc(rl);
+	    if (!cp) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for %s%s\n",
+		    Pn, (int)rl, pp, sf);
+		Exit(1);
+	    }
+	    *nl = rl;
+	    *np = cp;
+	}
+	(void) snpf(*np, *nl, "%s", pp);
+	(void) snpf(*np + pl, *nl - pl, "%s", sf);
+	return(rl - 1);
+}
+
+
+/*
+ * isefsys() -- is path on a file system exempted with -e
+ *
+ * Note: alloc_lfile() must have been called in advance.
+ */
+
+static int
+isefsys(path, type, l, rep, lfr)
+	char *path;			/* path to file */
+	char *type;			/* unknown file type */
+	int l;				/* link request: 0 = report
+					 *               1 = link */
+	efsys_list_t **rep;		/* returned Efsysl pointer, if not
+					 * NULL */
+	struct lfile **lfr;		/* allocated struct lfile pointer */
+{
+	efsys_list_t *ep;
+	int ds, len;
+	struct mounts *mp;
+	char nmabuf[MAXPATHLEN + 1];
+
+	len = (int) strlen(path);
+	for (ep = Efsysl; ep; ep = ep->next) {
+
+	/*
+	 * Look for a matching exempt file system path at the beginning of
+	 * the file path.
+	 */
+	    if (ep->pathl > len)
+		continue;
+	    if (strncmp(ep->path, path, ep->pathl))
+		continue;
+	/*
+	 * If only reporting, return information as requested.
+	 */
+	    if (!l) {
+		if (rep)
+		    *rep = ep;
+		return(0);
+	    }
+	/*
+	 * Process an exempt file.
+	 */
+	    ds = 0;
+	    if ((mp = ep->mp)) {
+		if (mp->ds & SB_DEV) {
+		    Lf->dev = mp->dev;
+		    ds = Lf->dev_def = 1;
+		}
+		if (mp->ds & SB_RDEV) {
+		    Lf->rdev = mp->rdev;
+		    ds = Lf->rdev_def = 1;
+		}
+	    }
+	    if (!ds)
+		(void) enter_dev_ch("UNKNOWN");
+	    Lf->ntype = N_UNKN;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s",
+			(type ? type : "UNKN"));
+	    (void) enter_nm(path);
+	    (void) snpf(nmabuf, sizeof(nmabuf), "(%ce %s)",
+		ep->rdlnk ? '+' : '-', ep->path);
+	    nmabuf[sizeof(nmabuf) - 1] = '\0';
+	    (void) add_nma(nmabuf, strlen(nmabuf));
+	    if (Lf->sf) {
+		if (lfr)
+		    *lfr = Lf;
+		link_lfile();
+	    } else if (lfr)
+		*lfr = (struct lfile *)NULL;
+	    return(0);
+	}
+	return(1);
+}
+
+
+/*
+ * nm2id() - convert a name to an integer ID
+ */
+
+static int
+nm2id(nm, id, idl)
+	char *nm;			/* pointer to name */
+	int *id;			/* pointer to ID receiver */
+	int *idl;			/* pointer to ID length receiver */
+{
+	register int tid, tidl;
+
+	for (*id = *idl = tid = tidl = 0; *nm; nm++) {
+
+#if	defined(__STDC__)	/* { */
+	    if (!isdigit((unsigned char)*nm))
+#else	/* !defined(__STDC__)	   } { */
+	    if (!isascii(*nm) || !isdigit((unsigned char)*cp))
+#endif	/* defined(__STDC__)	   } */
+
+		{
+		    return(1);
+		}
+		tid = tid * 10 + (int)(*nm - '0');
+		tidl++;
+	}
+	*id = tid;
+	*idl = tidl;
+	return(0);
+}
+
+
+/*
+ * open_proc_stream() -- open a /proc stream
+ */
+
+FILE *
+open_proc_stream(p, m, buf, sz, act)
+	char *p;			/* pointer to path to open */
+	char *m;			/* pointer to mode -- e.g., "r" */
+	char **buf;			/* pointer tp setvbuf() address
+					 * (NULL if none) */
+	size_t *sz;			/* setvbuf() size (0 if none or if
+					 * getpagesize() desired */
+	int act;			/* fopen() failure action:
+					 *     0 : return (FILE *)NULL
+					 *   <>0 : fprintf() an error message
+					 *         and Exit(1)
+					 */
+{
+	FILE *fs;			/* opened stream */
+	static size_t psz = (size_t)0;	/* page size */
+	size_t tsz;			/* temporary size */
+/*
+ * Open the stream.
+ */
+	if (!(fs = fopen(p, m))) {
+	    if (!act)
+		return((FILE *)NULL);
+	    (void) fprintf(stderr, "%s: can't fopen(%s, \"%s\"): %s\n",
+		Pn, p, m, strerror(errno));
+	    Exit(1);
+	}
+/*
+ * Return the stream if no buffer change is required.
+ */
+	if (!buf)
+	    return(fs);
+/*
+ * Determine the buffer size required.
+ */
+	if (!(tsz = *sz)) {
+	    if (!psz)
+		psz = getpagesize();
+	    tsz = psz;
+	}
+/*
+ * Allocate a buffer for the stream, as required.
+ */
+	if (!*buf) {
+	    if (!(*buf = (char *)malloc((MALLOC_S)tsz))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for %s stream buffer\n",
+		    Pn, (int)tsz, p);
+		Exit(1);
+	    }
+	    *sz = tsz;
+	}
+/*
+ * Assign the buffer to the stream.
+ */
+	if (setvbuf(fs, *buf, _IOFBF, tsz)) {
+	    (void) fprintf(stderr, "%s: setvbuf(%s)=%d failure: %s\n",
+		Pn, p, (int)tsz, strerror(errno));
+	    Exit(1);
+	}
+	return(fs);
+}
+
+
+/*
+ * process_id - process ID: PID or LWP
+ *
+ * return:  0 == ID processed
+ *          1 == ID not processed
+ */
+
+static int
+process_id(idp, idpl, cmd, uid, pid, ppid, pgid, tid)
+	char *idp;			/* pointer to ID's path */
+	int idpl;			/* pointer to ID's path length */
+	char *cmd;			/* pointer to ID's command */
+	UID_ARG uid;			/* ID's UID */
+	int pid;			/* ID's PID */
+	int ppid;			/* parent PID */
+	int pgid;			/* parent GID */
+	int tid;			/* task ID, if non-zero */
+{
+	int av;
+	static char *dpath = (char *)NULL;
+	static int dpathl = 0;
+	short efs, enls, enss, lnk, oty, pn, pss, sf, tsf;
+	int fd, i, ls, n, ss, sv;
+	struct l_fdinfo fi;
+	DIR *fdp;
+	struct dirent *fp;
+	static char *ipath = (char *)NULL;
+	static int ipathl = 0;
+	int j = 0;
+	struct lfile *lfr;
+	struct stat lsb, sb;
+	char nmabuf[MAXPATHLEN + 1], pbuf[MAXPATHLEN + 1];
+	static char *path = (char *)NULL;
+	static int pathl = 0;
+	static char *pathi = (char *)NULL;
+	static int pathil = 0;
+	int txts = 0;
+
+#if	defined(HASSELINUX)
+	cntxlist_t *cntxp;
+#endif	/* defined(HASSELINUX) */
+
+/*
+ * See if process is excluded.
+ */
+	if (is_proc_excl(pid, pgid, uid, &pss, &sf, tid)
+	||  is_cmd_excl(cmd, &pss, &sf))
+	    return(1);
+	if (Cckreg) {
+
+	/*
+	 * If conditional checking of regular files is enabled, enable
+	 * socket file only checking, based on the process' selection
+	 * status.
+	 */
+	    Ckscko = (sf & SELPROC) ? 0 : 1;
+	}
+	alloc_lproc(pid, pgid, ppid, uid, cmd, (int)pss, (int)sf);
+	Lp->tid = tid;
+	Plf = (struct lfile *)NULL;
+/*
+ * Process the ID's current working directory info.
+ */
+	if (!Ckscko) {
+	    (void) make_proc_path(idp, idpl, &path, &pathl, "cwd");
+	    alloc_lfile(CWD, -1);
+	    efs = 0;
+	    if (getlinksrc(path, pbuf, sizeof(pbuf)) < 1) {
+		if (!Fwarn) {
+		    (void) memset((void *)&sb, 0, sizeof(sb));
+		    lnk = ss = 0;
+		    (void) snpf(nmabuf, sizeof(nmabuf), "(readlink: %s)",
+			strerror(errno));
+		    nmabuf[sizeof(nmabuf) - 1] = '\0';
+		    (void) add_nma(nmabuf, strlen(nmabuf));
+		    pn = 1;
+		} else
+		    pn = 0;
+	    } else {
+		lnk = pn = 1;
+		if (Efsysl && !isefsys(pbuf, "UNKNcwd", 1, NULL, &lfr)) {
+		    efs = 1;
+		    pn = 0;
+		} else {
+		    ss = SB_ALL;
+		    if (HasNFS) {
+			if ((sv = statsafely(path, &sb)))
+			sv = statEx(pbuf, &sb, &ss);
+		    } else
+			sv = stat(path, &sb);
+		    if (sv) {
+			ss = 0;
+			if (!Fwarn) {
+			    (void) snpf(nmabuf, sizeof(nmabuf), "(stat: %s)",
+				strerror(errno));
+			    nmabuf[sizeof(nmabuf) - 1] = '\0';
+			    (void) add_nma(nmabuf, strlen(nmabuf));
+			}
+		    }
+		}
+	    }
+	    if (pn) {
+		(void) process_proc_node(lnk ? pbuf : path,
+					 &sb, ss,
+					 (struct stat *)NULL, 0);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	}
+/*
+ * Process the ID's root directory info.
+ */
+	if (!Ckscko) {
+	    (void) make_proc_path(idp, idpl, &path, &pathl, "root");
+	    alloc_lfile(RTD, -1);
+	    if (getlinksrc(path, pbuf, sizeof(pbuf)) < 1) {
+		if (!Fwarn) {
+		    (void) memset((void *)&sb, 0, sizeof(sb));
+		    lnk = ss = 0;
+		    (void) snpf(nmabuf, sizeof(nmabuf), "(readlink: %s)",
+			strerror(errno));
+		    nmabuf[sizeof(nmabuf) - 1] = '\0';
+		    (void) add_nma(nmabuf, strlen(nmabuf));
+		    pn = 1;
+		} else
+		    pn = 0;
+	    } else {
+		lnk = pn = 1;
+		if (Efsysl && !isefsys(pbuf, "UNKNrtd", 1, NULL, NULL))
+		    pn = 0;
+		else {
+		    ss = SB_ALL;
+		    if (HasNFS) {
+			if ((sv = statsafely(path, &sb)))
+			    sv = statEx(pbuf, &sb, &ss);
+		    } else
+			sv = stat(path, &sb);
+		    if (sv) {
+			ss = 0;
+			if (!Fwarn) {
+			    (void) snpf(nmabuf, sizeof(nmabuf), "(stat: %s)",
+				strerror(errno));
+			    nmabuf[sizeof(nmabuf) - 1] = '\0';
+			    (void) add_nma(nmabuf, strlen(nmabuf));
+			}
+		    }
+		}
+	    }
+	    if (pn) {
+		(void) process_proc_node(lnk ? pbuf : path,
+					 &sb, ss,
+					 (struct stat *)NULL, 0);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	}
+/*
+ * Process the ID's execution info.
+ */
+	if (!Ckscko) {
+	    txts = 0;
+	    (void) make_proc_path(idp, idpl, &path, &pathl, "exe");
+	    alloc_lfile("txt", -1);
+	    if (getlinksrc(path, pbuf, sizeof(pbuf)) < 1) {
+		(void) memset((void *)&sb, 0, sizeof(sb));
+		lnk = ss = 0;
+		if (!Fwarn) {
+		    if ((errno != ENOENT) || uid) {
+			(void) snpf(nmabuf, sizeof(nmabuf), "(readlink: %s)",
+			    strerror(errno));
+			nmabuf[sizeof(nmabuf) - 1] = '\0';
+			(void) add_nma(nmabuf, strlen(nmabuf));
+		    }
+		    pn = 1;
+		} else
+		    pn = 0;
+	    } else {
+		lnk = pn = 1;
+		if (Efsysl && !isefsys(pbuf, "UNKNtxt", 1, NULL, NULL))
+		    pn = 0;
+		else {
+		    ss = SB_ALL;
+		    if (HasNFS) {
+			if ((sv = statsafely(path, &sb))) {
+			    sv = statEx(pbuf, &sb,  &ss);
+			    if (!sv && (ss & SB_DEV) && (ss & SB_INO))
+				txts = 1;
+			}
+		    } else
+			sv = stat(path, &sb);
+		    if (sv) {
+			ss = 0;
+			if (!Fwarn) {
+			    (void) snpf(nmabuf, sizeof(nmabuf), "(stat: %s)",
+				strerror(errno));
+			    nmabuf[sizeof(nmabuf) - 1] = '\0';
+			    (void) add_nma(nmabuf, strlen(nmabuf));
+			}
+		    } else
+			txts = 1;
+		}
+	    }
+	    if (pn) {
+		(void) process_proc_node(lnk ? pbuf : path,
+					 &sb, ss,
+					 (struct stat *)NULL, 0);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	}
+/*
+ * Process the ID's memory map info.
+ */
+	if (!Ckscko) {
+	    (void) make_proc_path(idp, idpl, &path, &pathl, "maps");
+	    (void) process_proc_map(path, txts ? &sb : (struct stat *)NULL,
+				    txts ? ss : 0);
+	}
+
+#if	defined(HASSELINUX)
+/*
+ * Process the PID's SELinux context.
+ */
+	if (Fcntx) {
+
+	/*
+	 * If the -Z (cntx) option was specified, match the valid contexts.
+	 */
+	    errno = 0;
+	    if (getpidcon(pid, &Lp->cntx) == -1) {
+		Lp->cntx = (char *)NULL;
+		if (!Fwarn) {
+		    (void) snpf(nmabuf, sizeof(nmabuf),
+			"(getpidcon: %s)", strerror(errno));
+		    if (!(Lp->cntx = strdup(nmabuf))) {
+			(void) fprintf(stderr,
+			    "%s: no context error space: PID %ld",
+			    Pn, (long)Lp->pid);
+			Exit(1);
+		    }
+		}
+	    } else if (CntxArg) {
+
+	    /*
+	     * See if context includes the process.
+	     */
+		for (cntxp = CntxArg; cntxp; cntxp = cntxp->next) {
+		    if (cmp_cntx_eq(Lp->cntx, cntxp->cntx)) {
+			cntxp->f = 1;
+			Lp->pss |= PS_PRI;
+			Lp->sf |= SELCNTX;
+			break;
+		    }
+		}
+	    }
+	}
+#endif	/* defined(HASSELINUX) */
+
+/*
+ * Process the ID's file descriptor directory.
+ */
+	if ((i = make_proc_path(idp, idpl, &dpath, &dpathl, "fd/")) < 3)
+	    return(0);
+	dpath[i - 1] = '\0';
+	if ((OffType == 2)
+	&&  ((j = make_proc_path(idp, idpl, &ipath, &ipathl, "fdinfo/")) >= 7))
+	    oty = 1;
+	else
+	    oty = 0;
+	if (!(fdp = opendir(dpath))) {
+	    if (!Fwarn) {
+		(void) snpf(nmabuf, sizeof(nmabuf), "%s (opendir: %s)",
+		    dpath, strerror(errno));
+		alloc_lfile("NOFD", -1);
+		nmabuf[sizeof(nmabuf) - 1] = '\0';
+		(void) add_nma(nmabuf, strlen(nmabuf));
+		link_lfile();
+	    }
+	    return(0);
+	}
+	dpath[i - 1] = '/';
+	while ((fp = readdir(fdp))) {
+	    if (nm2id(fp->d_name, &fd, &n))
+		continue;
+	    (void) make_proc_path(dpath, i, &path, &pathl, fp->d_name);
+	    (void) alloc_lfile((char *)NULL, fd);
+	    if (getlinksrc(path, pbuf, sizeof(pbuf)) < 1) {
+		(void) memset((void *)&sb, 0, sizeof(sb));
+		lnk = ss = 0;
+		if (!Fwarn) {
+		    (void) snpf(nmabuf, sizeof(nmabuf), "(readlink: %s)",
+			strerror(errno));
+		    nmabuf[sizeof(nmabuf) - 1] = '\0';
+		    (void) add_nma(nmabuf, strlen(nmabuf));
+		    pn = 1;
+		} else
+		    pn = 0;
+	    } else {
+		lnk = 1;
+		if (Efsysl && !isefsys(pbuf, "UNKNfd", 1, NULL, &lfr)) {
+		    efs = 1;
+		    pn = 0;
+		} else {
+		    if (HasNFS) {
+			if (lstatsafely(path, &lsb)) {
+			    (void) statEx(pbuf, &lsb, &ls);
+			    enls = errno;
+			} else {
+			    enls = 0;
+			    ls = SB_ALL;
+			}
+			if (statsafely(path, &sb)) {
+			    (void) statEx(pbuf, &sb, &ss);
+			    enss = errno;
+			} else {
+			    enss = 0;
+			    ss = SB_ALL;
+			}
+		    } else {
+			ls = lstat(path, &lsb) ? 0 : SB_ALL;
+			enls = errno;
+			ss = stat(path, &sb) ? 0 : SB_ALL;
+			enss = errno;
+		    }
+		    if (!ls && !Fwarn) {
+			(void) snpf(nmabuf, sizeof(nmabuf), "lstat: %s)",
+			    strerror(enls));
+			nmabuf[sizeof(nmabuf) - 1] = '\0';
+			(void) add_nma(nmabuf, strlen(nmabuf));
+		    }
+		    if (!ss && !Fwarn) {
+			(void) snpf(nmabuf, sizeof(nmabuf), "(stat: %s)",
+			    strerror(enss));
+			nmabuf[sizeof(nmabuf) - 1] = '\0';
+			(void) add_nma(nmabuf, strlen(nmabuf));
+		    }
+		    if (Ckscko) {
+			if ((ss & SB_MODE)
+			&&  ((sb.st_mode & S_IFMT) == S_IFSOCK))
+			{
+			    pn = 1;
+			} else
+			    pn = 0;
+		    } else
+			pn = 1;
+		}
+	    }
+	    if (pn || (efs && lfr && oty)) {
+		if (oty) {
+		    (void) make_proc_path(ipath, j, &pathi, &pathil,
+					  fp->d_name);
+		    if ((av = get_fdinfo(pathi, &fi)) & FDINFO_POS) {
+			if (efs) {
+			    if (Foffset) {
+				lfr->off = (SZOFFTYPE)fi.pos;
+				lfr->off_def = 1;
+			    }
+			} else {
+			    ls |= SB_SIZE;
+			    lsb.st_size = fi.pos;
+			}
+		    } else
+			ls &= ~SB_SIZE;
+
+#if	!defined(HASNOFSFLAGS)
+		    if ((av & FDINFO_FLAGS) && (Fsv & FSV_FG)) {
+			if (efs) {
+			    lfr->ffg = (long)fi.flags;
+			    lfr->fsv |= FSV_FG;
+			} else {
+			    Lf->ffg = (long)fi.flags;
+			    Lf->fsv |= FSV_FG;
+			}
+		     }
+# endif	/* !defined(HASNOFSFLAGS) */
+
+		}
+		if (pn) {
+		    process_proc_node(lnk ? pbuf : path, &sb, ss, &lsb, ls);
+		    if (Lf->sf)
+			link_lfile();
+		}
+	    }
+	}
+	(void) closedir(fdp);
+	return(0);
+}
+
+
+/*
+ * process_proc_map() - process the memory map of a process
+ */
+
+static void
+process_proc_map(p, s, ss)
+	char *p;			/* path to process maps file */
+	struct stat *s;			/* executing text file state buffer */
+	int ss;				/* *s status -- i.e., SB_* values */
+{
+	char buf[MAXPATHLEN + 1], *ep, fmtbuf[32], **fp, nmabuf[MAXPATHLEN + 1];
+	dev_t dev;
+	int ds, efs, en, i, mss, nf, sv;
+	int eb = 6;
+	INODETYPE inode;
+	MALLOC_S len;
+	long maj, min;
+	struct mounts *mp;
+	FILE *ms;
+	int ns = 0;
+	struct stat sb;
+	struct saved_map {
+	    dev_t dev;
+	    INODETYPE inode;
+	};
+	static struct saved_map *sm = (struct saved_map *)NULL;
+	efsys_list_t *rep;
+	static int sma = 0;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Open the /proc/<pid>/maps file, assign a page size buffer to its stream,
+ * and read it/
+ */
+	if (!(ms = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf), ms)) {
+	    if ((nf = get_fields(buf, ":", &fp, &eb, 1)) < 7)
+		continue;			/* not enough fields */
+	    if (!fp[6] || !*fp[6])
+		continue;			/* no path name */
+	/*
+	 * See if the path ends in " (deleted)".  If it does, strip the
+	 * " (deleted)" characters and remember that they were there.
+	 */
+	    if (((ds = (int)strlen(fp[6])) > 10)
+	    &&  !strcmp(fp[6] + ds - 10, " (deleted)"))
+	    {
+		*(fp[6] + ds - 10) = '\0';
+	    } else
+		ds = 0;
+	/*
+	 * Assemble the major and minor device numbers.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[3] || !*fp[3]
+	    ||  (maj = strtol(fp[3], &ep, 16)) == LONG_MIN || maj == LONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[4] || !*fp[4]
+	    ||  (min = strtol(fp[4], &ep, 16)) == LONG_MIN || min == LONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	/*
+	 * Assemble the device and inode numbers.  If they are both zero, skip
+	 * the entry.
+	 */
+	    dev = (dev_t)makedev((int)maj, (int)min);
+	    if (!fp[5] || !*fp[5])
+		continue;
+	    ep = (char *)NULL;
+	    if ((inode = strtoull(fp[5], &ep, 0)) == ULLONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    if (!dev && !inode)
+		continue;
+	/*
+	 * See if the device + inode pair match that of the executable.
+	 * If they do, skip this map entry.
+	 */
+	    if (s && (ss & SB_DEV) && (ss & SB_INO)
+	    &&  (dev == s->st_dev) && (inode == (INODETYPE)s->st_ino))
+		continue;
+	/*
+	 * See if this device + inode pair has already been processed as
+	 * a map entry.
+	 */
+	    for (i = 0; i < ns; i++) {
+		if (dev == sm[i].dev && inode == sm[i].inode)
+		    break;
+	    }
+	    if (i < ns)
+		continue;
+	/*
+	 * Record the processing of this map entry's device and inode pair.
+	 */
+	    if (ns >= sma) {
+		sma += 10;
+		len = (MALLOC_S)(sma * sizeof(struct saved_map));
+		if (sm)
+		    sm = (struct saved_map *)realloc(sm, len);
+		else
+		    sm = (struct saved_map *)malloc(len);
+		if (!sm) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for saved maps, PID %d\n",
+			Pn, (int)len, Lp->pid);
+		    Exit(1);
+		}
+	    }
+	    sm[ns].dev = dev;
+	    sm[ns++].inode = inode;
+	/*
+	 * Allocate space for the mapped file, then get stat(2) information
+	 * for it.  Skip the stat(2) operation if this is on an exempt file
+	 * system.
+	 */
+	    alloc_lfile("mem", -1);
+	    if (Efsysl && !isefsys(fp[6], (char *)NULL, 0, &rep, NULL))
+		efs = sv = 1;
+	    else
+		efs = 0;
+	    if (!efs) {
+		if (HasNFS)
+		    sv = statsafely(fp[6], &sb);
+		else
+		    sv = stat(fp[6], &sb);
+	    }
+	    if (sv || efs) {
+		en = errno;
+	    /*
+	     * Applying stat(2) to the file was not possible (file is on an
+	     * exempt file system) or stat(2) failed, so manufacture a partial
+	     * stat(2) reply from the process' maps file entry.
+	     *
+	     * If the file has been deleted, reset its type to "DEL"; otherwise
+	     * generate a stat() error name addition.
+	     */
+		(void) memset((void *)&sb, 0, sizeof(sb));
+		sb.st_dev = dev;
+		sb.st_ino = (ino_t)inode;
+		sb.st_mode = S_IFREG;
+		mss = SB_DEV | SB_INO | SB_MODE;
+		if (ds)
+		    alloc_lfile("DEL", -1);
+		else if (!efs) {
+		    (void) snpf(nmabuf, sizeof(nmabuf), "(stat: %s)",
+			strerror(en));
+		    nmabuf[sizeof(nmabuf) - 1] = '\0';
+		    (void) add_nma(nmabuf, strlen(nmabuf));
+		}
+	    } else if ((sb.st_dev != dev) || ((INODETYPE)sb.st_ino != inode)) {
+
+	    /*
+	     * The stat(2) device and inode numbers don't match those obtained
+	     * from the process' maps file.
+	     *
+	     * If the file has been deleted, reset its type to "DEL"; otherwise
+	     * generate inconsistency name additions.
+	     *
+	     * Manufacture a partial stat(2) reply from the maps file
+	     * information.
+	     */
+		if (ds)
+		    alloc_lfile("DEL", -1);
+		else if (!Fwarn) {
+		    char *sep;
+
+		    if (sb.st_dev != dev) {
+			(void) snpf(nmabuf, sizeof(nmabuf),
+			    "(path dev=%d,%d%s",
+			    GET_MAJ_DEV(sb.st_dev), GET_MIN_DEV(sb.st_dev),
+			    ((INODETYPE)sb.st_ino == inode) ? ")" : ",");
+			nmabuf[sizeof(nmabuf) - 1] = '\0';
+			(void) add_nma(nmabuf, strlen(nmabuf));
+			sep = "";
+		    } else
+			sep = "(path ";
+		    if ((INODETYPE)sb.st_ino != inode) {
+			(void) snpf(fmtbuf, sizeof(fmtbuf), "%%sinode=%s)",
+			    InodeFmt_d);
+			(void) snpf(nmabuf, sizeof(nmabuf), fmtbuf,
+			    sep, (INODETYPE)sb.st_ino);
+			nmabuf[sizeof(nmabuf) - 1] = '\0';
+			(void) add_nma(nmabuf, strlen(nmabuf));
+		    }
+		}
+		(void) memset((void *)&sb, 0, sizeof(sb));
+		sb.st_dev = dev;
+		sb.st_ino = (ino_t)inode;
+		sb.st_mode = S_IFREG;
+		mss = SB_DEV | SB_INO | SB_MODE;
+	    } else
+		mss = SB_ALL;
+	/*
+	 * Record the file's information.
+	 */
+	    if (!efs)
+		process_proc_node(fp[6], &sb, mss, (struct stat *)NULL, 0);
+	    else {
+
+	    /*
+	     * If this file is on an exempt file system, complete the lfile
+	     * structure, but change its type and add the exemption note to
+	     * the NAME column.
+	     */
+		Lf->dev = sb.st_dev;
+		Lf->inode = (ino_t)sb.st_ino;
+		Lf->dev_def = Lf->inp_ty = 1;
+		(void) enter_nm(fp[6]);
+		(void) snpf(Lf->type, sizeof(Lf->type), "%s",
+			    (ds ? "UNKNdel" : "UNKNmem"));
+		(void) snpf(nmabuf, sizeof(nmabuf), "(%ce %s)",
+		    rep->rdlnk ? '+' : '-', rep->path);
+		nmabuf[sizeof(nmabuf) - 1] = '\0';
+		(void) add_nma(nmabuf, strlen(nmabuf));
+	    }
+	    if (Lf->sf)
+		link_lfile();
+	}
+	(void) fclose(ms);
+}
+
+
+/*
+ * read_id_stat() - read ID (PID or LWP ID) status
+ *
+ * return: -1 == ID is unavailable
+ *          0 == ID OK
+ *          1 == ID is a zombie
+ *	    2 == ID is a thread
+ */
+
+static int
+read_id_stat(ty, p, id, cmd, ppid, pgid)
+	int ty;				/* type: 0 == PID, 1 == LWP */
+	char *p;			/* path to status file */
+	int id;				/* ID: PID or LWP */
+	char **cmd;			/* malloc'd command name */
+	int *ppid;			/* returned parent PID for PID type */
+	int *pgid;			/* returned process group ID for PID
+					 * type */
+{
+	char buf[MAXPATHLEN], *cp, *cp1, **fp;
+	static char *cbf = (char *)NULL;
+	static MALLOC_S cbfa = 0;
+	FILE *fs;
+	MALLOC_S len;
+	int nf;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Open the stat file path, assign a page size buffer to its stream,
+ * and read the file's first line.
+ */
+	if (!(fs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return(-1);
+	cp = fgets(buf, sizeof(buf), fs);
+	(void) fclose(fs);
+	if (!cp)
+	    return(-1);
+/*
+ * Separate the line into fields on white space separators.  Expect five fields
+ * for a PID type and three for an LWP type.
+ */
+	if ((nf = get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0))
+	<  (ty ? 5 : 3))
+	{
+	    return(-1);
+	}
+/*
+ * Convert the first field to an integer; its conversion must match the
+ * ID argument.
+ */
+	if (!fp[0] || (atoi(fp[0]) != id))
+	    return(-1);
+/*
+ * Get the command name from the second field.  Strip a starting '(' and
+ * an ending ')'.  Allocate space to hold the result and return the space
+ * pointer.
+ */
+	if (!(cp = fp[1]))
+	    return(-1);
+	if (cp && *cp == '(')
+	    cp++;
+	if ((cp1 = strrchr(cp, ')')))
+	    *cp1 = '\0';
+	if ((len = strlen(cp) + 1) > cbfa) {
+	     cbfa = len;
+	     if (cbf)
+		cbf = (char *)realloc((MALLOC_P *)cbf, cbfa);
+	     else
+		cbf = (char *)malloc(cbfa);
+	     if (!cbf) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for command \"%s\"\n",
+		    Pn, (int)cbfa, cp);
+		Exit(1);
+	     }
+	}
+	(void) snpf(cbf, len, "%s", cp);
+	*cmd = cbf;
+/*
+ * Convert and return parent process (fourth field) and process group (fifth
+ * field) IDs.
+ */
+	if (fp[3] && *fp[3])
+	    *ppid = atoi(fp[3]);
+	else
+	    return(-1);
+	if (fp[4] && *fp[4])
+	    *pgid = atoi(fp[4]);
+	else
+	    return(-1);
+/*
+ * Check the state in the third field.  If it is 'Z', return that indication.
+ */
+	if (fp[2] && !strcmp(fp[2], "Z"))
+	    return(1);
+	else if (fp[2] && !strcmp(fp[2], "T"))
+	    return(2);
+	return(0);
+}
+
+
+/*
+ * statEx() - extended stat() to get device numbers when a "safe" stat has
+ *	      failed and the system has an NFS mount
+ *
+ * Note: this function was suggested by Paul Szabo as a way to get device
+ *       numbers for NFS files when an NFS mount point has the root_squash
+ *       option set.  In that case, even if lsof is setuid(root), the identity
+ *	 of its requests to stat() NFS files lose root permission and may fail.
+ *
+ *	 This function should be used only when links have been successfully
+ *	 resolved in the /proc path by getlinksrc().
+ */
+
+static int
+statEx(p, s, ss)
+	char *p;			/* file path */
+	struct stat *s;			/* stat() result -- NULL if none
+					 * wanted */
+	int *ss;			/* stat() status --  SB_* values */
+{
+	static size_t ca = 0;
+	static char *cb = NULL;
+	char *cp;
+	int ensv = ENOENT;
+	struct stat sb;
+	int st = 0;
+	size_t sz;
+/*
+ * Make a copy of the path.
+ */
+	sz = strlen(p);
+	if ((sz + 1) > ca) {
+	    if (cb)
+		cb = (char *)realloc((MALLOC_P *)cb, sz + 1);
+	    else
+		cb = (char *)malloc(sz + 1);
+	    if (!cb) {
+		(void) fprintf(stderr,
+		    "%s: PID %ld: no statEx path space: %s\n",
+		    Pn, (long)Lp->pid, p);
+		Exit(1);
+	    }
+	    ca = sz + 1;
+	}
+	(void) strcpy(cb, p);
+/*
+ * Trim trailing leaves from the end of the path one at a time and do a safe
+ * stat() on each trimmed result.  Stop when a safe stat() succeeds or doesn't
+ * fail because of EACCES or EPERM.
+ */
+	for (cp = strrchr(cb, '/'); cp && (cp != cb);) {
+	    *cp = '\0';
+	    if (!statsafely(cb, &sb)) {
+		st = 1;
+		break;
+	    }
+	    ensv = errno;
+	    if ((ensv != EACCES) && (ensv != EPERM))
+		break;
+	    cp = strrchr(cb, '/');
+	}
+/*
+ * If a stat() on a trimmed result succeeded, form partial results containing
+ * only the device and raw device numbers.
+ */
+	memset((void *)s, 0, sizeof(struct stat));
+	if (st) {
+	    errno = 0;
+	    s->st_dev = sb.st_dev;
+	    s->st_rdev = sb.st_rdev;
+	    *ss = SB_DEV | SB_RDEV;
+	    return(0);
+	}
+	errno = ensv;
+	*ss = 0;
+	return(1);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/linux/dproto.h
new file mode 100644
index 0000000..0b86a8a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dproto.h
@@ -0,0 +1,51 @@
+/*
+ * dproto.h - Linux function prototypes for /proc-based lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * Copyright 1997 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: dproto.h,v 1.7 2008/04/15 13:32:26 abe Exp $
+ */
+
+
+#if	defined(HASSELINUX)
+_PROTOTYPE(extern int enter_cntx_arg,(char *cnxt));
+#endif	/* defined(HASSELINUX) */
+
+_PROTOTYPE(extern int get_fields,(char *ln, char *sep, char ***fr, int *eb, int en));
+_PROTOTYPE(extern void get_locks,(char *p));
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern int make_proc_path,(char *pp, int lp, char **np, int *npl, char *sf));
+_PROTOTYPE(extern FILE *open_proc_stream,(char *p, char *mode, char **buf, size_t *sz, int act));
+_PROTOTYPE(extern void process_proc_node,(char *p, struct stat *s, int ss, struct stat *l, int ls));
+_PROTOTYPE(extern void process_proc_sock,(char *p, struct stat *s, int ss, struct stat *l, int ls));
+_PROTOTYPE(extern void set_net_paths,(char *p, int pl));
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/linux/dsock.c
new file mode 100644
index 0000000..2b5be44
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dsock.c
@@ -0,0 +1,3174 @@
+/*
+ * dsock.c - Linux socket processing functions for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.37 2011/09/27 17:38:39 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	INOBUCKS	128		/* inode hash bucket count -- must be
+					 * a power of two */
+#define INOHASH(ino)	((int)((ino * 31415) >> 3) & (INOBUCKS - 1))
+#define TCPUDPHASH(ino)	((int)((ino * 31415) >> 3) & (TcpUdp_bucks - 1))
+#define TCPUDP6HASH(ino) ((int)((ino * 31415) >> 3) & (TcpUdp6_bucks - 1))
+
+
+/*
+ * Local structures
+ */
+
+struct ax25sin {			/* AX25 socket information */
+	char *da;			/* destination address */
+	char *dev_ch;			/* device characters */
+	char *sa;			/* source address */
+	INODETYPE inode;
+	unsigned long sq, rq;		/* send and receive queue values */
+	unsigned char sqs, rqs;		/* send and receive queue states */
+	int state;
+	struct ax25sin *next;
+};
+
+struct ipxsin {				/* IPX socket information */
+	INODETYPE inode;
+	char *la;			/* local address */
+	char *ra;			/* remote address */
+	int state;
+	unsigned long txq, rxq;		/* transmit and receive queue values */
+	struct ipxsin *next;
+};
+
+struct nlksin {				/* Netlink socket information */
+	INODETYPE inode;		/* node number */
+	unsigned int pr;		/* protocol */
+	struct nlksin *next;
+};
+
+struct packin {				/* packet information */
+	INODETYPE inode;
+	int ty;				/* socket type */
+	int pr;				/* protocol */
+	struct packin *next;
+};
+
+struct rawsin {				/* raw socket information */
+	INODETYPE inode;
+	char *la;			/* local address */
+	char *ra;			/* remote address */
+	char *sp;			/* state characters */
+	MALLOC_S lal;			/* strlen(la) */
+	MALLOC_S ral;			/* strlen(ra) */
+	MALLOC_S spl;			/* strlen(sp) */
+	struct rawsin *next;
+};
+
+struct tcp_udp {			/* IPv4 TCP and UDP socket
+					 * information */
+	INODETYPE inode;
+	unsigned long faddr, laddr;	/* foreign & local IPv6 addresses */
+	int fport, lport;		/* foreign & local ports */
+	unsigned long txq, rxq;		/* transmit & receive queue values */
+	int proto;			/* 0 = TCP, 1 = UDP, 2 = UDPLITE */
+	int state;			/* protocol state */
+	struct tcp_udp *next;
+};
+
+#if	defined(HASIPv6)
+struct tcp_udp6 {			/* IPv6 TCP and UDP socket
+					 * information */
+	INODETYPE inode;
+	struct in6_addr faddr, laddr;	/* foreign and local IPv6 addresses */
+	int fport, lport;		/* foreign & local ports */
+	unsigned long txq, rxq;		/* transmit & receive queue values */
+	int proto;			/* 0 = TCP, 1 = UDP, 2 = UDPLITE */
+	int state;			/* protocol state */
+	struct tcp_udp6 *next;
+};
+#endif	/* defined(HASIPv6) */
+
+struct uxsin {				/* UNIX socket information */
+	INODETYPE inode;		/* node number */
+	char *pcb;			/* protocol control block */
+	char *path;			/* file path */
+	unsigned char sb_def;		/* stat(2) buffer definitions */
+	dev_t sb_dev;			/* stat(2) buffer device */
+	INODETYPE sb_ino;		/* stat(2) buffer node number */
+	dev_t sb_rdev;			/* stat(2) raw device number */
+	struct uxsin *next;
+};
+
+
+/*
+ * Local static values
+ */
+
+static char *AX25path = (char *)NULL;	/* path to AX25 /proc information */
+static struct ax25sin **AX25sin = (struct ax25sin **)NULL;
+					/* AX25 socket info, hashed by inode */
+static char *ax25st[] = {
+	"LISTENING",			/* 0 */
+	"SABM SENT",			/* 1 */
+	"DISC SENT",			/* 2 */
+	"ESTABLISHED",			/* 3 */
+	"RECOVERY"			/* 4 */
+};
+#define NAX25ST	(sizeof(ax25st) / sizeof(char *))
+static char *Ipxpath = (char *)NULL;	/* path to IPX /proc information */
+static struct ipxsin **Ipxsin = (struct ipxsin **)NULL;
+					/* IPX socket info, hashed by inode */
+static char *Nlkpath = (char *)NULL;	/* path to Netlink /proc information */
+static struct nlksin **Nlksin = (struct nlksin **)NULL;
+					/* Netlink socket info, hashed by
+					 * inode */
+static struct packin **Packin = (struct packin **)NULL;
+					/* packet info, hashed by inode */
+static char *Packpath = (char *)NULL;	/* path to packer /proc information */
+static char *Rawpath = (char *)NULL;	/* path to raw socket /proc
+					 * information */
+static struct rawsin **Rawsin = (struct rawsin **)NULL;
+					/* raw socket info, hashed by inode */
+static char *SockStatPath = (char *)NULL;
+					/* path to /proc/net socket status */
+static char *TCPpath = (char *)NULL;	/* path to TCP /proc information */
+static struct tcp_udp **TcpUdp = (struct tcp_udp **)NULL;
+					/* IPv4 TCP & UDP info, hashed by
+					 * inode */
+static int TcpUdp_bucks = 0;		/* dynamically sized hash bucket
+					 * count for TCP and UDP -- will
+					 * be a power of two */
+
+#if	defined(HASIPv6)
+static char *Raw6path = (char *)NULL;	/* path to raw IPv6 /proc information */
+static struct rawsin **Rawsin6 = (struct rawsin **)NULL;
+					/* IPv6 raw socket info, hashed by
+					 * inode */
+static char *SockStatPath6 = (char *)NULL;
+					/* path to /proc/net IPv6 socket
+					 * status */
+static char *TCP6path = (char *)NULL;	/* path to IPv6 TCP /proc information */
+static struct tcp_udp6 **TcpUdp6 = (struct tcp_udp6 **)NULL;
+					/* IPv6 TCP & UDP info, hashed by
+					 * inode */
+static int TcpUdp6_bucks = 0;		/* dynamically sized hash bucket
+					 * count for IPv6 TCP and UDP -- will
+					 * be a power of two */
+static char *UDP6path = (char *)NULL;	/* path to IPv6 UDP /proc information */
+static char *UDPLITE6path = (char *)NULL;
+					/* path to IPv6 UDPLITE /proc
+					 * information */
+#endif	/* defined(HASIPv6) */
+
+static char *UDPpath = (char *)NULL;	/* path to UDP /proc information */
+static char *UDPLITEpath = (char *)NULL;
+					/* path to UDPLITE /proc information */
+static char *UNIXpath = (char *)NULL;	/* path to UNIX /proc information */
+static struct uxsin **Uxsin = (struct uxsin **)NULL;
+					/* UNIX socket info, hashed by inode */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct ax25sin *check_ax25,(INODETYPE i));
+_PROTOTYPE(static struct ipxsin *check_ipx,(INODETYPE i));
+_PROTOTYPE(static struct nlksin *check_netlink,(INODETYPE i));
+_PROTOTYPE(static struct packin *check_pack,(INODETYPE i));
+_PROTOTYPE(static struct rawsin *check_raw,(INODETYPE i));
+_PROTOTYPE(static struct tcp_udp *check_tcpudp,(INODETYPE i, char **p));
+_PROTOTYPE(static struct uxsin *check_unix,(INODETYPE i));
+_PROTOTYPE(static void get_ax25,(char *p));
+_PROTOTYPE(static void get_ipx,(char *p));
+_PROTOTYPE(static void get_netlink,(char *p));
+_PROTOTYPE(static void get_pack,(char *p));
+_PROTOTYPE(static void get_raw,(char *p));
+_PROTOTYPE(static void get_tcpudp,(char *p, int pr, int clr));
+_PROTOTYPE(static void get_unix,(char *p));
+_PROTOTYPE(static void print_ax25info,(struct ax25sin *ap));
+_PROTOTYPE(static void print_ipxinfo,(struct ipxsin *ip));
+
+#if	defined(HASIPv6)
+_PROTOTYPE(static struct rawsin *check_raw6,(INODETYPE i));
+_PROTOTYPE(static struct tcp_udp6 *check_tcpudp6,(INODETYPE i, char **p));
+_PROTOTYPE(static void get_raw6,(char *p));
+_PROTOTYPE(static void get_tcpudp6,(char *p, int pr, int clr));
+_PROTOTYPE(static int net6a2in6,(char *as, struct in6_addr *ad));
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * build_IPstates() -- build the TCP and UDP state tables
+ */
+
+void
+build_IPstates()
+{
+	if (!TcpSt) {
+	    (void) enter_IPstate("TCP", "ESTABLISHED", TCP_ESTABLISHED);
+	    (void) enter_IPstate("TCP", "SYN_SENT", TCP_SYN_SENT);
+	    (void) enter_IPstate("TCP", "SYN_RECV", TCP_SYN_RECV);
+	    (void) enter_IPstate("TCP", "FIN_WAIT1", TCP_FIN_WAIT1);
+	    (void) enter_IPstate("TCP", "FIN_WAIT2", TCP_FIN_WAIT2);
+	    (void) enter_IPstate("TCP", "TIME_WAIT", TCP_TIME_WAIT);
+	    (void) enter_IPstate("TCP", "CLOSE", TCP_CLOSE);
+	    (void) enter_IPstate("TCP", "CLOSE_WAIT", TCP_CLOSE_WAIT);
+	    (void) enter_IPstate("TCP", "LAST_ACK", TCP_LAST_ACK);
+	    (void) enter_IPstate("TCP", "LISTEN", TCP_LISTEN);
+	    (void) enter_IPstate("TCP", "CLOSING", TCP_CLOSING);
+	    (void) enter_IPstate("TCP", "CLOSED", 0);
+	    (void) enter_IPstate("TCP", (char *)NULL, 0);
+	}
+}
+
+
+/*
+ * check_ax25() - check for AX25 socket file
+ */
+
+static struct ax25sin *
+check_ax25(i)
+	INODETYPE i;			/* socket file's inode number */
+{
+	struct ax25sin *ap;
+	int h;
+
+	h = INOHASH(i);
+	for (ap = AX25sin[h]; ap; ap = ap->next) {
+	    if (i == ap->inode)
+		return(ap);
+	}
+	return((struct ax25sin *)NULL);
+}
+
+
+/*
+ * check_ipx() - check for IPX socket file
+ */
+
+static struct ipxsin *
+check_ipx(i)
+	INODETYPE i;			/* socket file's inode number */
+{
+	int h;
+	struct ipxsin *ip;
+
+	h = INOHASH(i);
+	for (ip = Ipxsin[h]; ip; ip = ip->next) {
+	    if (i == ip->inode)
+		return(ip);
+	}
+	return((struct ipxsin *)NULL);
+}
+
+
+/*
+ * check_netlink() - check for Netlink socket file
+ */
+
+static struct nlksin *
+check_netlink(i)
+	INODETYPE i;			/* socket file's inode number */
+{
+	int h;
+	struct nlksin *lp;
+
+	h = INOHASH(i);
+	for (lp = Nlksin[h]; lp; lp = lp->next) {
+	    if (i == lp->inode)
+		return(lp);
+	}
+	return((struct nlksin *)NULL);
+}
+
+
+/*
+ * check_pack() - check for packet file
+ */
+
+static struct packin *
+check_pack(i)
+	INODETYPE i;			/* packet file's inode number */
+{
+	int h;
+	struct packin *pp;
+
+	h = INOHASH(i);
+	for (pp = Packin[h]; pp; pp = pp->next) {
+	    if (i == pp->inode)
+		return(pp);
+	}
+	return((struct packin *)NULL);
+}
+
+
+
+/*
+ * check_raw() - check for raw socket file
+ */
+
+static struct rawsin *
+check_raw(i)
+	INODETYPE i;			/* socket file's inode number */
+{
+	int h;
+	struct rawsin *rp;
+
+	h = INOHASH(i);
+	for (rp = Rawsin[h]; rp; rp = rp->next) {
+	    if (i == rp->inode)
+		return(rp);
+	}
+	return((struct rawsin *)NULL);
+}
+
+
+/*
+ * check_tcpudp() - check for IPv4 TCP or UDP socket file
+ */
+
+static struct tcp_udp *
+check_tcpudp(i, p)
+	INODETYPE i;			/* socket file's inode number */
+	char **p;			/* protocol return */
+{
+	int h;
+	struct tcp_udp *tp;
+
+	h = TCPUDPHASH(i);
+	for (tp = TcpUdp[h]; tp; tp = tp->next) {
+	    if (i == tp->inode) {
+		switch (tp->proto) {
+		case 0:
+		    *p = "TCP";
+		    break;
+		case 1:
+		    *p = "UDP";
+		    break;
+		case 2:
+		    *p = "UDPLITE";
+		    break;
+		default:
+		   *p = "unknown";
+		}
+		return(tp);
+	    }
+	}
+	return((struct tcp_udp *)NULL);
+}
+
+
+#if	defined(HASIPv6)
+/*
+ * check_raw6() - check for raw IPv6 socket file
+ */
+
+static struct rawsin *
+check_raw6(i)
+	INODETYPE i;			/* socket file's inode number */
+{
+	int h;
+	struct rawsin *rp;
+
+	h = INOHASH(i);
+	for (rp = Rawsin6[h]; rp; rp = rp->next) {
+	    if (i == rp->inode)
+		return(rp);
+	}
+	return((struct rawsin *)NULL);
+}
+
+
+/*
+ * check_tcpudp6() - check for IPv6 TCP or UDP socket file
+ */
+
+static struct tcp_udp6 *
+check_tcpudp6(i, p)
+	INODETYPE i;			/* socket file's inode number */
+	char **p;			/* protocol return */
+{
+	int h;
+	struct tcp_udp6 *tp6;
+
+	h = TCPUDP6HASH(i);
+	for (tp6 = TcpUdp6[h]; tp6; tp6 = tp6->next) {
+	    if (i == tp6->inode) {
+		switch (tp6->proto) {
+		case 0:
+		    *p = "TCP";
+		    break;
+		case 1:
+		    *p = "UDP";
+		    break;
+		case 2:
+		    *p = "UDPLITE";
+		    break;
+		default:
+		   *p = "unknown";
+		}
+		return(tp6);
+	    }
+	}
+	return((struct tcp_udp6 *)NULL);
+}
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * check_unix() - check for UNIX domain socket
+ */
+
+static struct uxsin *
+check_unix(i)
+	INODETYPE i;			/* socket file's inode number */
+{
+	int h;
+	struct uxsin *up;
+
+	h = INOHASH(i);
+	for (up = Uxsin[h]; up; up = up->next) {
+	    if (i == up->inode)
+		return(up);
+	}
+	return((struct uxsin *)NULL);
+}
+
+
+/*
+ * get_ax25() - get /proc/net/ax25 info
+ */
+
+static void
+get_ax25(p)
+	char *p;			/* /proc/net/ipx path */
+{
+	struct ax25sin *ap, *np;
+	FILE *as;
+	char buf[MAXPATHLEN], *da, *dev_ch, *ep, **fp, *sa;
+	int h, nf;
+	INODETYPE inode;
+	unsigned long rq, sq, state;
+	MALLOC_S len;
+	unsigned char rqs, sqs;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (AX25sin) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (ap = AX25sin[h]; ap; ap = np) {
+		    np = ap->next;
+		    if (ap->da)
+			(void) free((FREE_P *)ap->da);
+		    if (ap->dev_ch)
+			(void) free((FREE_P *)ap->dev_ch);
+		    if (ap->sa)
+			(void) free((FREE_P *)ap->sa);
+		    (void) free((FREE_P *)ap);
+		}
+		AX25sin[h] = (struct ax25sin *)NULL;
+	    }
+	} else {
+	    AX25sin = (struct ax25sin **)calloc(INOBUCKS,
+					      sizeof(struct ax25sin *));
+	    if (!AX25sin) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d AX25 hash pointer bytes\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct ax25sin *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net/ax25 file, assign a page size buffer to the stream,
+ * and read it.  Store AX25 socket info in the AX25sin[] hash buckets.
+ */
+	if (!(as = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, as)) {
+	    if ((nf = get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0)) < 24)
+		continue;
+	/*
+	 * /proc/net/ax25 has no title line, a very poor deficiency in its
+	 * implementation.
+	 *
+	 * The ax25_get_info() function in kern module .../net/ax25/af_ax25.c
+	 * says the format of the lines in the file is:
+	 *
+	 *     magic dev src_addr dest_addr,digi1,digi2,.. st vs vr va t1 t1 \
+	 *     t2  t2 t3 t3 idle idle n2 n2 rtt window paclen Snd-Q Rcv-Q \
+	 *     inode
+	 *
+	 * The code in this function is forced to assume that format is in
+	 * effect..
+	 */
+
+	/*
+	 * Assemble the inode number and see if it has already been recorded.
+	 * If it has, skip this line.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[23] || !*fp[23]
+	    ||  (inode = strtoull(fp[23], &ep, 0)) == ULONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    h = INOHASH((INODETYPE)inode);
+	    for (ap = AX25sin[h]; ap; ap = ap->next) {
+		if (inode == ap->inode)
+		    break;
+	    }
+	    if (ap)
+		continue;
+	/*
+	 * Assemble the send and receive queue values and the state.
+	 */
+	    rq = sq = (unsigned long)0;
+	    rqs = sqs = (unsigned char)0;
+	    ep = (char *)NULL;
+	    if (!fp[21] || !*fp[21]
+	    ||  (sq = strtoul(fp[21], &ep, 0)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    sqs = (unsigned char)1;
+	    ep = (char *)NULL;
+	    if (!fp[22] || !*fp[22]
+	    ||  (rq = strtoul(fp[22], &ep, 0)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    rqs = (unsigned char)1;
+	    ep = (char *)NULL;
+	    if (!fp[4] || !*fp[4]
+	    ||  (state = strtoul(fp[4], &ep, 0)) == ULONG_MAX || !ep || *ep)
+		continue;
+	/*
+	 * Allocate space for the destination address.
+	 */
+	    if (!fp[3] || !*fp[3])
+		da = (char *)NULL;
+	    else if ((len = strlen(fp[3]))) {
+		if (!(da = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+		      "%s: can't allocate %d destination AX25 addr bytes: %s\n",
+		      Pn, (int)(len + 1), fp[3]);
+		    Exit(1);
+		}
+		(void) snpf(da, len + 1, "%s", fp[3]);
+	    } else
+		da = (char *)NULL;
+	/*
+	 * Allocate space for the source address.
+	 */
+	    if (!fp[2] || !*fp[2])
+		sa = (char *)NULL;
+	    else if ((len = strlen(fp[2]))) {
+		if (!(sa = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d source AX25 address bytes: %s\n",
+			Pn, (int)(len + 1), fp[2]);
+		    Exit(1);
+		}
+		(void) snpf(sa, len + 1, "%s", fp[2]);
+	    } else
+		sa = (char *)NULL;
+	/*
+	 * Allocate space for the device characters.
+	 */
+	    if (!fp[1] || !*fp[1])
+		dev_ch = (char *)NULL;
+	    else if ((len = strlen(fp[1]))) {
+		if (!(dev_ch = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+		      "%s: can't allocate %d destination AX25 dev bytes: %s\n",
+		      Pn, (int)(len + 1), fp[1]);
+		    Exit(1);
+		}
+		(void) snpf(dev_ch, len + 1, "%s", fp[1]);
+	    } else
+		dev_ch = (char *)NULL;
+	/*
+	 * Allocate space for an ax25sin entry, fill it, and link it to its
+	 * hash bucket.
+	 */
+	    if (!(ap = (struct ax25sin *)malloc(sizeof(struct ax25sin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte ax25sin structure\n",
+		    Pn, (int)sizeof(struct ax25sin));
+		Exit(1);
+	    }
+	    ap->da = da;
+	    ap->dev_ch = dev_ch;
+	    ap->inode = inode;
+	    ap->rq = rq;
+	    ap->rqs = rqs;
+	    ap->sa = sa;
+	    ap->sq = sq;
+	    ap->sqs = sqs;
+	    ap->state = (int)state;
+	    ap->next = AX25sin[h];
+	    AX25sin[h] = ap;
+	}
+	(void) fclose(as);
+}
+
+
+/*
+ * get_ipx() - get /proc/net/ipx info
+ */
+
+static void
+get_ipx(p)
+	char *p;			/* /proc/net/ipx path */
+{
+	char buf[MAXPATHLEN], *ep, **fp, *la, *ra;
+	int fl = 1;
+	int h;
+	INODETYPE inode;
+	unsigned long rxq, state, txq;
+	struct ipxsin *ip, *np;
+	MALLOC_S len;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+	FILE *xs;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (Ipxsin) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (ip = Ipxsin[h]; ip; ip = np) {
+		    np = ip->next;
+		    if (ip->la)
+			(void) free((FREE_P *)ip->la);
+		    if (ip->ra)
+			(void) free((FREE_P *)ip->ra);
+		    (void) free((FREE_P *)ip);
+		}
+		Ipxsin[h] = (struct ipxsin *)NULL;
+	    }
+	} else {
+	    Ipxsin = (struct ipxsin **)calloc(INOBUCKS,
+					      sizeof(struct ipxsin *));
+	    if (!Ipxsin) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d IPX hash pointer bytes\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct ipxsin *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net/ipx file, assign a page size buffer to the stream,
+ * and read it.  Store IPX socket info in the Ipxsin[] hash buckets.
+ */
+	if (!(xs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, xs)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < 7)
+		continue;
+	    if (fl) {
+
+	    /*
+	     * Check the column labels in the first line.
+	     */
+		if (!fp[0] || strcmp(fp[0], "Local_Address")
+		||  !fp[1] || strcmp(fp[1], "Remote_Address")
+		||  !fp[2] || strcmp(fp[2], "Tx_Queue")
+		||  !fp[3] || strcmp(fp[3], "Rx_Queue")
+		||  !fp[4] || strcmp(fp[4], "State")
+		||  !fp[5] || strcmp(fp[5], "Uid")
+		||  !fp[6] || strcmp(fp[6], "Inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		fl = 0;
+		continue;
+	    }
+	/*
+	 * Assemble the inode number and see if the inode is already
+	 * recorded.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[6] || !*fp[6]
+	    ||  (inode = strtoull(fp[6], &ep, 0)) == ULONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    h = INOHASH(inode);
+	    for (ip = Ipxsin[h]; ip; ip = ip->next) {
+		if (inode == ip->inode)
+		    break;
+	    }
+	    if (ip)
+		continue;
+	/*
+	 * Assemble the transmit and receive queue values and the state.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[2] || !*fp[2]
+	    ||  (txq = strtoul(fp[2], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[3] || !*fp[3]
+	    ||  (rxq = strtoul(fp[3], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[4] || !*fp[4]
+	    ||  (state = strtoul(fp[4], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	/*
+	 * Allocate space for the local address, unless it is "Not_Connected".
+	 */
+	    if (!fp[0] || !*fp[0] || strcmp(fp[0], "Not_Connected") == 0)
+		la = (char *)NULL;
+	    else if ((len = strlen(fp[0]))) {
+		if (!(la = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d local IPX address bytes: %s\n",
+			Pn, (int)(len + 1), fp[0]);
+		    Exit(1);
+		}
+		(void) snpf(la, len + 1, "%s", fp[0]);
+	    } else
+		la = (char *)NULL;
+	/*
+	 * Allocate space for the remote address, unless it is "Not_Connected".
+	 */
+	    if (!fp[1] || !*fp[1] || strcmp(fp[1], "Not_Connected") == 0)
+		ra = (char *)NULL;
+	    else if ((len = strlen(fp[1]))) {
+		if (!(ra = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d remote IPX address bytes: %s\n",
+			Pn, (int)(len + 1), fp[1]);
+		    Exit(1);
+		}
+		(void) snpf(ra, len + 1, "%s", fp[1]);
+	    } else
+		ra = (char *)NULL;
+	/*
+	 * Allocate space for an ipxsin entry, fill it, and link it to its
+	 * hash bucket.
+	 */
+	    if (!(ip = (struct ipxsin *)malloc(sizeof(struct ipxsin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte ipxsin structure\n",
+		    Pn, (int)sizeof(struct ipxsin));
+		Exit(1);
+	    }
+	    ip->inode = inode;
+	    ip->la = la;
+	    ip->ra = ra;
+	    ip->txq = txq;
+	    ip->rxq = rxq;
+	    ip->state = (int)state;
+	    ip->next = Ipxsin[h];
+	    Ipxsin[h] = ip;
+	}
+	(void) fclose(xs);
+}
+
+ 
+/*
+ * get_netlink() - get /proc/net/netlink info
+ */
+
+static void
+get_netlink(p)
+	char *p;			/* /proc/net/netlink path */
+{
+	char buf[MAXPATHLEN], *ep, **fp;
+	int fr = 1;
+	int h, l, pr;
+	INODETYPE inode;
+	struct nlksin *np, *lp;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;	
+	FILE *xs;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (Nlksin) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (lp = Nlksin[h]; lp; lp = np) {
+		    np = lp->next;
+		    (void) free((FREE_P *)lp);
+		}
+		Nlksin[h] = (struct nlksin *)NULL;
+	    }
+	} else {
+	    Nlksin = (struct nlksin **)calloc(INOBUCKS,sizeof(struct nlksin *));
+	    if (!Nlksin) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d netlink hash pointer bytes\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct nlksin *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net/netlink file, assign a page size buffer to its stream,
+ * and read the file.  Store Netlink info in the Nlksin[] hash buckets.
+ */
+	if (!(xs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, xs)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < 10)
+		continue;
+	    if (fr) {
+
+	    /*
+	     * Check the column labels in the first line.
+	     */
+		if (!fp[1] || strcmp(fp[1], "Eth")
+		||  !fp[9] || strcmp(fp[9], "Inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		fr = 0;
+		continue;
+	    }
+	/*
+	 * Assemble the inode number and see if the inode is already
+	 * recorded.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[9] || !*fp[9]
+	    ||  (inode = strtoull(fp[9], &ep, 0)) == ULONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    h = INOHASH(inode);
+	    for (lp = Nlksin[h]; lp; lp = lp->next) {
+		if (inode == lp->inode)
+		    break;
+	    }
+	    if (lp)
+		continue;
+	/*
+	 * Save the protocol from the Eth column.
+	 */
+	    if (!fp[1] || !*fp[1] || (strlen(fp[1])) < 1)
+		continue;
+	    pr = atoi(fp[1]);
+	/*
+	 * Allocate space for a nlksin entry, fill it, and link it to its
+	 * hash bucket.
+	 */
+	    if (!(lp = (struct nlksin *)malloc(sizeof(struct nlksin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte Netlink structure\n",
+		    Pn, (int)sizeof(struct nlksin));
+		Exit(1);
+	    }
+	    lp->inode = inode;
+	    lp->pr = pr;
+	    lp->next = Nlksin[h];
+	    Nlksin[h] = lp;
+	}
+	(void) fclose(xs);
+}
+
+
+/*
+ * get_pack() - get /proc/net/packet info
+ */
+
+static void
+get_pack(p)
+	char *p;			/* /proc/net/raw path */
+{
+	char buf[MAXPATHLEN], *ep, **fp;
+	int fl = 1;
+	int h, ty;
+	INODETYPE inode;
+	struct packin *np, *pp;
+	unsigned long pr;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+	FILE *xs;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (Packin) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (pp = Packin[h]; pp; pp = np) {
+		    np = pp->next;
+		    (void) free((FREE_P *)pp);
+		}
+		Packin[h] = (struct packin *)NULL;
+	    }
+	} else {
+	    Packin = (struct packin **)calloc(INOBUCKS,
+					      sizeof(struct packin *));
+	    if (!Packin) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d packet hash pointer bytes\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct packin *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net/packet file, assign a page size buffer to its stream,
+ * and read the file.  Store packet info in the Packin[] hash buckets.
+ */
+	if (!(xs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, xs)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < 9)
+		continue;
+	    if (fl) {
+
+	    /*
+	     * Check the column labels in the first line.
+	     */
+		if (!fp[2]  || strcmp(fp[2], "Type")
+		||  !fp[3]  || strcmp(fp[3], "Proto")
+		||  !fp[8] || strcmp(fp[8], "Inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		fl = 0;
+		continue;
+	    }
+	/*
+	 * Assemble the inode number and see if the inode is already
+	 * recorded.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[8] || !*fp[8]
+	    ||  (inode = strtoull(fp[8], &ep, 0)) == ULONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    h = INOHASH(inode);
+	    for (pp = Packin[h]; pp; pp = pp->next) {
+		if (inode == pp->inode)
+		    break;
+	    }
+	    if (pp)
+		continue;
+	/*
+	 * Save the socket type and protocol.
+	 */
+	    if (!fp[2] || !*fp[2] || (strlen(fp[2])) < 1)
+		continue;
+	    ty = atoi(fp[2]);
+	    ep = (char *)NULL;
+	    if (!fp[3] || !*fp[3] || (strlen(fp[3]) < 1)
+	    ||  ((pr = strtoul(fp[3], &ep, 16)) == ULONG_MAX) || !ep || *ep)
+		continue;
+	/*
+	 * Allocate space for a packin entry, fill it, and link it to its
+	 * hash bucket.
+	 */
+	    if (!(pp = (struct packin *)malloc(sizeof(struct packin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte packet structure\n",
+		    Pn, (int)sizeof(struct packin));
+		Exit(1);
+	    }
+	    pp->inode = inode;
+	    pp->pr = (int)pr;
+	    pp->ty = ty;
+	    pp->next = Packin[h];
+	    Packin[h] = pp;
+	}
+	(void) fclose(xs);
+}
+
+
+/*
+ * get_raw() - get /proc/net/raw info
+ */
+
+static void
+get_raw(p)
+	char *p;			/* /proc/net/raw path */
+{
+	char buf[MAXPATHLEN], *ep, **fp, *la, *ra, *sp;
+	int h;
+	INODETYPE inode;
+	int nf = 12;
+	struct rawsin *np, *rp;
+	MALLOC_S lal, ral, spl;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+	FILE *xs;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (Rawsin) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (rp = Rawsin[h]; rp; rp = np) {
+		    np = rp->next;
+		    if (rp->la)
+			(void) free((FREE_P *)rp->la);
+		    if (rp->ra)
+			(void) free((FREE_P *)rp->ra);
+		    (void) free((FREE_P *)rp);
+		}
+		Rawsin[h] = (struct rawsin *)NULL;
+	    }
+	} else {
+	    Rawsin = (struct rawsin **)calloc(INOBUCKS,
+					      sizeof(struct rawsin *));
+	    if (!Rawsin) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d raw hash pointer bytes\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct rawsin *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net/raw file, assign a page size buffer to its stream,
+ * and read the file.  Store raw socket info in the Rawsin[] hash buckets.
+ */
+	if (!(xs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, xs)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < nf)
+		continue;
+	    if (nf == 12) {
+
+	    /*
+	     * Check the column labels in the first line.
+	     */
+		if (!fp[1]  || strcmp(fp[1],  "local_address")
+		||  !fp[2]  || strcmp(fp[2],  "rem_address")
+		||  !fp[3]  || strcmp(fp[3],  "st")
+		||  !fp[11] || strcmp(fp[11], "inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		nf = 10;
+		continue;
+	    }
+	/*
+	 * Assemble the inode number and see if the inode is already
+	 * recorded.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[9] || !*fp[9]
+	    ||  (inode = strtoull(fp[9], &ep, 0)) == ULONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    h = INOHASH(inode);
+	    for (rp = Rawsin[h]; rp; rp = rp->next) {
+		if (inode == rp->inode)
+		    break;
+	    }
+	    if (rp)
+		continue;
+	/*
+	 * Save the local address, remote address, and state.
+	 */
+	    if (!fp[1] || !*fp[1] || (lal = strlen(fp[1])) < 1) {
+		la = (char *)NULL;
+		lal = (MALLOC_S)0;
+	    } else {
+		if (!(la = (char *)malloc(lal + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d local raw address bytes: %s\n",
+			Pn, (int)(lal + 1), fp[1]);
+		    Exit(1);
+		}
+		(void) snpf(la, lal + 1, "%s", fp[1]);
+	    }
+	    if (!fp[2] || !*fp[2] || (ral = strlen(fp[2])) < 1) {
+		ra = (char *)NULL;
+		ral = (MALLOC_S)0;
+	    } else {
+		if (!(ra = (char *)malloc(ral + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d remote raw address bytes: %s\n",
+			Pn, (int)(ral + 1), fp[2]);
+		    Exit(1);
+		}
+		(void) snpf(ra, ral + 1, "%s", fp[2]);
+	    }
+	    if (!fp[3] || !*fp[3] || (spl = strlen(fp[3])) < 1) {
+		sp = (char *)NULL;
+		spl = (MALLOC_S)0;
+	    } else {
+		if (!(sp = (char *)malloc(spl + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d remote raw state bytes: %s\n",
+			Pn, (int)(spl + 1), fp[2]);
+		    Exit(1);
+		}
+		(void) snpf(sp, spl + 1, "%s", fp[3]);
+	    }
+	/*
+	 * Allocate space for an rawsin entry, fill it, and link it to its
+	 * hash bucket.
+	 */
+	    if (!(rp = (struct rawsin *)malloc(sizeof(struct rawsin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte rawsin structure\n",
+		    Pn, (int)sizeof(struct rawsin));
+		Exit(1);
+	    }
+	    rp->inode = inode;
+	    rp->la = la;
+	    rp->lal = lal;
+	    rp->ra = ra;
+	    rp->ral = ral;
+	    rp->sp = sp;
+	    rp->spl = spl;
+	    rp->next = Rawsin[h];
+	    Rawsin[h] = rp;
+	}
+	(void) fclose(xs);
+}
+
+
+/*
+ * get_tcpudp() - get IPv4 TCP, UDP or UDPLITE net info
+ */
+
+static void
+get_tcpudp(p, pr, clr)
+	char *p;			/* /proc/net/{tcp,udp} path */
+	int pr;				/* protocol: 0 = TCP, 1 = UDP,
+					 *           2 = UDPLITE */
+	int clr;			/* 1 == clear the table */
+{
+	char buf[MAXPATHLEN], *ep, **fp;
+	unsigned long faddr, fport, laddr, lport, rxq, state, txq;
+	FILE *fs;
+	int h, nf;
+	INODETYPE inode;
+	struct tcp_udp *np, *tp;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Delete previous table contents.
+ */
+	if (TcpUdp) {
+	    if (clr) {
+		for (h = 0; h < TcpUdp_bucks; h++) {
+		    for (tp = TcpUdp[h]; tp; tp = np) {
+			np = tp->next;
+			(void) free((FREE_P *)tp);
+		    }
+		    TcpUdp[h] = (struct tcp_udp *)NULL;
+		}
+	    }
+/*
+ * If no hash buckets have been allocated, do so now.
+ */
+	} else {
+	
+	/*
+	 * Open the /proc/net/sockstat file and establish the hash bucket
+	 * count from its "sockets: used" line.
+	 */
+	    TcpUdp_bucks = INOBUCKS;
+	    if ((fs = fopen(SockStatPath, "r"))) {
+		while(fgets(buf, sizeof(buf) - 1, fs)) {
+		    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) != 3)
+			continue;
+		    if (!fp[0] || strcmp(fp[0], "sockets:")
+		    ||  !fp[1] || strcmp(fp[1], "used")
+		    ||  !fp[2] || !*fp[2])
+			continue;
+    		    if ((h = atoi(fp[2])) < 1)
+			h = INOBUCKS;
+		    while (TcpUdp_bucks < h)
+			TcpUdp_bucks *= 2;
+		    break;
+		}
+		(void) fclose(fs);
+	    }
+	    if (!(TcpUdp = (struct tcp_udp **)calloc(TcpUdp_bucks,
+						     sizeof(struct tcp_udp *))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for TCP&UDP hash buckets\n",
+		    Pn, (int)(TcpUdp_bucks * sizeof(struct tcp_udp *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net file, assign a page size buffer to the stream, and
+ * read it.
+ */ 
+	if (!(fs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	nf = 12;
+	while(fgets(buf, sizeof(buf) - 1, fs)) {
+	    if (get_fields(buf,
+			   (nf == 12) ? (char *)NULL : ":",
+			   &fp, (int *)NULL, 0)
+	    < nf)
+		continue;
+	    if (nf == 12) {
+		if (!fp[1]  || strcmp(fp[1],  "local_address")
+		||  !fp[2]  || strcmp(fp[2],  "rem_address")
+		||  !fp[3]  || strcmp(fp[3],  "st")
+		||  !fp[4]  || strcmp(fp[4],  "tx_queue")
+		||  !fp[5]  || strcmp(fp[5],  "rx_queue")
+		||  !fp[11] || strcmp(fp[11], "inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		nf = 14;
+		continue;
+	    }
+	/*
+	 * Get the local and remote addresses.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[1] || !*fp[1]
+	    ||  (laddr = strtoul(fp[1], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[2] || !*fp[2]
+	    ||  (lport = strtoul(fp[2], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[3] || !*fp[3]
+	    ||  (faddr = strtoul(fp[3], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[4] || !*fp[4]
+	    ||  (fport = strtoul(fp[4], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	/*
+	 * Get the state and queue sizes.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[5] || !*fp[5]
+	    ||  (state = strtoul(fp[5], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[6] || !*fp[6]
+	    ||  (txq = strtoul(fp[6], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[7] || !*fp[7]
+	    ||  (rxq = strtoul(fp[7], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	/*
+	 * Get the inode and use it for hashing and searching.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[13] || !*fp[13]
+	    ||  (inode = strtoull(fp[13], &ep, 0)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    h = TCPUDPHASH(inode);
+	    for (tp = TcpUdp[h]; tp; tp = tp->next) {
+		if (tp->inode == inode)
+		    break;
+	    }
+	    if (tp)
+		continue;
+	/*
+	 * Create a new entry and link it to its hash bucket.
+	 */
+	    if (!(tp = (struct tcp_udp *)malloc(sizeof(struct tcp_udp)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for tcp_udp struct\n",
+		    Pn, (int)sizeof(struct tcp_udp));
+		Exit(1);
+	    }
+	    tp->inode = inode;
+	    tp->faddr = faddr;
+	    tp->fport = (int)(fport & 0xffff);
+	    tp->laddr = laddr;
+	    tp->lport = (int)(lport & 0xffff);
+	    tp->txq = txq;
+	    tp->rxq = rxq;
+	    tp->proto = pr;
+	    tp->state = (int)state;
+	    tp->next = TcpUdp[h];
+	    TcpUdp[h] = tp;
+	}
+	(void) fclose(fs);
+}
+
+
+#if	defined(HASIPv6)
+/*
+ * get_raw6() - get /proc/net/raw6 info
+ */
+
+static void
+get_raw6(p)
+	char *p;			/* /proc/net/raw path */
+{
+	char buf[MAXPATHLEN], *ep, **fp, *la, *ra, *sp;
+	int h;
+	INODETYPE inode;
+	int nf = 12;
+	struct rawsin *np, *rp;
+	MALLOC_S lal, ral, spl;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+	FILE *xs;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (Rawsin6) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (rp = Rawsin6[h]; rp; rp = np) {
+		    np = rp->next;
+		    if (rp->la)
+			(void) free((FREE_P *)rp->la);
+		    if (rp->ra)
+			(void) free((FREE_P *)rp->ra);
+		    (void) free((FREE_P *)rp);
+		}
+		Rawsin6[h] = (struct rawsin *)NULL;
+	    }
+	} else {
+	    Rawsin6 = (struct rawsin **)calloc(INOBUCKS,
+					       sizeof(struct rawsin *));
+	    if (!Rawsin6) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d raw6 hash pointer bytes\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct rawsin *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net/raw6 file, assign a page size buffer to the stream,
+ * and read it.  Store raw6 socket info in the Rawsin6[] hash buckets.
+ */
+	if (!(xs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, xs)) {
+	    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) < nf)
+		continue;
+	    if (nf == 12) {
+
+	    /*
+	     * Check the column labels in the first line.
+	     */
+		if (!fp[1]  || strcmp(fp[1],  "local_address")
+		||  !fp[2]  || strcmp(fp[2],  "remote_address")
+		||  !fp[3]  || strcmp(fp[3],  "st")
+		||  !fp[11] || strcmp(fp[11], "inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		nf = 10;
+		continue;
+	    }
+	/*
+	 * Assemble the inode number and see if the inode is already
+	 * recorded.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[9] || !*fp[9]
+	    ||  (inode = strtoull(fp[9], &ep, 0)) == ULONG_MAX
+	    ||  !ep || *ep)
+		continue;
+	    h = INOHASH(inode);
+	    for (rp = Rawsin6[h]; rp; rp = rp->next) {
+		if (inode == rp->inode)
+		    break;
+	    }
+	    if (rp)
+		continue;
+	/*
+	 * Save the local address, remote address, and state.
+	 */
+	    if (!fp[1] || !*fp[1] || (lal = strlen(fp[1])) < 1) {
+		la = (char *)NULL;
+		lal = (MALLOC_S)0;
+	    } else {
+		if (!(la = (char *)malloc(lal + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d local raw6 address bytes: %s\n",
+			Pn, (int)(lal + 1), fp[1]);
+		    Exit(1);
+		}
+		(void) snpf(la, lal + 1, "%s", fp[1]);
+	    }
+	    if (!fp[2] || !*fp[2] || (ral = strlen(fp[2])) < 1) {
+		ra = (char *)NULL;
+		ral = (MALLOC_S)0;
+	    } else {
+		if (!(ra = (char *)malloc(ral + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d remote raw6 address bytes: %s\n",
+			Pn, (int)(ral + 1), fp[2]);
+		    Exit(1);
+		}
+		(void) snpf(ra, ral + 1, "%s", fp[2]);
+	    }
+	    if (!fp[3] || !*fp[3] || (spl = strlen(fp[3])) < 1) {
+		sp = (char *)NULL;
+		spl = (MALLOC_S)0;
+	    } else {
+		if (!(sp = (char *)malloc(spl + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d remote raw6 state bytes: %s\n",
+			Pn, (int)(spl + 1), fp[2]);
+		    Exit(1);
+		}
+		(void) snpf(sp, spl + 1, "%s", fp[3]);
+	    }
+	/*
+	 * Allocate space for an rawsin entry, fill it, and link it to its
+	 * hash bucket.
+	 */
+	    if (!(rp = (struct rawsin *)malloc(sizeof(struct rawsin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d byte rawsin structure for IPv6\n",
+		    Pn, (int)sizeof(struct rawsin));
+		Exit(1);
+	    }
+	    rp->inode = inode;
+	    rp->la = la;
+	    rp->lal = lal;
+	    rp->ra = ra;
+	    rp->ral = ral;
+	    rp->sp = sp;
+	    rp->spl = spl;
+	    rp->next = Rawsin6[h];
+	    Rawsin6[h] = rp;
+	}
+	(void) fclose(xs);
+}
+
+
+/*
+ * get_tcpudp6() - get IPv6 TCP, UDP or UDPLITE net info
+ */
+
+static void
+get_tcpudp6(p, pr, clr)
+	char *p;			/* /proc/net/{tcp,udp} path */
+	int pr;				/* protocol: 0 = TCP, 1 = UDP */
+	int clr;			/* 1 == clear the table */
+{
+	char buf[MAXPATHLEN], *ep, **fp;
+	struct in6_addr faddr, laddr;
+	unsigned long fport, lport, rxq, state, txq;
+	FILE *fs;
+	int h, i, nf;
+	INODETYPE inode;
+	struct tcp_udp6 *np6, *tp6;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Delete previous table contents.  Allocate a table for the first time.
+ */
+	if (TcpUdp6) {
+	    if (clr) {
+		for (h = 0; h < TcpUdp6_bucks; h++) {
+		    for (tp6 = TcpUdp6[h]; tp6; tp6 = np6) {
+			np6 = tp6->next;
+			(void) free((FREE_P *)tp6);
+		    }
+		    TcpUdp6[h] = (struct tcp_udp6 *)NULL;
+		}
+	    }
+	} else {
+	
+	/*
+	 * Open the /proc/net/sockstat6 file and establish the hash bucket
+	 * count from its "TCP6: inuse" and "UDP6: inuse" lines.
+	 */
+	    TcpUdp6_bucks = INOBUCKS;
+	    h = i = nf = 0;
+	    if ((fs = fopen(SockStatPath6, "r"))) {
+		while(fgets(buf, sizeof(buf) - 1, fs)) {
+		    if (get_fields(buf, (char *)NULL, &fp, (int *)NULL, 0) != 3)
+			continue;
+		    if (!fp[0]
+		    ||  !fp[1] || strcmp(fp[1], "inuse")
+		    ||  !fp[2] || !*fp[2])
+			continue;
+		    if (!strcmp(fp[0], "TCP6:")) {
+			nf |= 1;
+    			if ((h = atoi(fp[2])) < 1)
+			    h = INOBUCKS;
+			i += h;
+		    } else if (!strcmp(fp[0], "UDP6:")) {
+			nf |= 2;
+    			if ((h = atoi(fp[2])) < 1)
+			    h = INOBUCKS;
+			i += h;
+		    } else
+			continue;
+		    if (nf == 3) {
+			while (TcpUdp6_bucks < i)
+			    TcpUdp6_bucks *= 2;
+			break;
+		    }
+		}
+		(void) fclose(fs);
+	    }
+	    if (!(TcpUdp6 = (struct tcp_udp6 **)calloc(TcpUdp6_bucks,
+						sizeof(struct tcp_udp6 *))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for TCP6&UDP6 hash buckets\n",
+		    Pn, (int)(TcpUdp6_bucks * sizeof(struct tcp_udp6 *)));
+		Exit(1);
+	    }
+	}
+/*
+ * Open the /proc/net file, assign a page size buffer to the stream,
+ * and read it.
+ */
+	if (!(fs = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	nf = 12;
+	while(fgets(buf, sizeof(buf) - 1, fs)) {
+	    if (get_fields(buf,
+			   (nf == 12) ? (char *)NULL : ":",
+			   &fp, (int *)NULL, 0)
+	    < nf)
+		continue;
+	    if (nf == 12) {
+		if (!fp[1]  || strcmp(fp[1],  "local_address")
+		||  !fp[2]  || strcmp(fp[2],  "remote_address")
+		||  !fp[3]  || strcmp(fp[3],  "st")
+		||  !fp[4]  || strcmp(fp[4],  "tx_queue")
+		||  !fp[5]  || strcmp(fp[5],  "rx_queue")
+		||  !fp[11] || strcmp(fp[11], "inode"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		nf = 14;
+		continue;
+	    }
+	/*
+	 * Get the local and remote addresses.
+	 */
+	    if (!fp[1] || !*fp[1] || net6a2in6(fp[1], &laddr))
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[2] || !*fp[2]
+	    ||  (lport = strtoul(fp[2], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    if (!fp[3] || !*fp[3] || net6a2in6(fp[3], &faddr))
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[4] || !*fp[4]
+	    ||  (fport = strtoul(fp[4], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	/*
+	 * Get the state and queue sizes.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[5] || !*fp[5]
+	    ||  (state = strtoul(fp[5], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[6] || !*fp[6]
+	    ||  (txq = strtoul(fp[6], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    ep = (char *)NULL;
+	    if (!fp[7] || !*fp[7]
+	    ||  (rxq = strtoul(fp[7], &ep, 16)) == ULONG_MAX || !ep || *ep)
+		continue;
+	/*
+	 * Get the inode and use it for hashing and searching.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[13] || !*fp[13]
+	    ||  (inode = strtoull(fp[13], &ep, 0)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    h = TCPUDP6HASH(inode);
+	    for (tp6 = TcpUdp6[h]; tp6; tp6 = tp6->next) {
+		if (tp6->inode == inode)
+		    break;
+	    }
+	    if (tp6)
+		continue;
+	/*
+	 * Create a new entry and link it to its hash bucket.
+	 */
+	    if (!(tp6 = (struct tcp_udp6 *)malloc(sizeof(struct tcp_udp6)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for tcp_udp6 struct\n",
+		    Pn, (int)sizeof(struct tcp_udp6));
+		Exit(1);
+	    }
+	    tp6->inode = inode;
+	    tp6->faddr = faddr;
+	    tp6->fport = (int)(fport & 0xffff);
+	    tp6->laddr = laddr;
+	    tp6->lport = (int)(lport & 0xffff);
+	    tp6->txq = txq;
+	    tp6->rxq = rxq;
+	    tp6->proto = pr;
+	    tp6->state = (int)state;
+	    tp6->next = TcpUdp6[h];
+	    TcpUdp6[h] = tp6;
+	}
+	(void) fclose(fs);
+}
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * get_unix() - get UNIX net info
+ */
+
+static void
+get_unix(p)
+	char *p;			/* /proc/net/unix path */
+{
+	char buf[MAXPATHLEN], *ep, **fp, *path, *pcb;
+	int fl = 1;
+	int h, nf;
+	INODETYPE inode;
+	MALLOC_S len;
+	struct uxsin *np, *up;
+	FILE *us;
+	static char *vbuf = (char *)NULL;
+	static size_t vsz = (size_t)0;
+/*
+ * Do second time cleanup or first time setup.
+ */
+	if (Uxsin) {
+	    for (h = 0; h < INOBUCKS; h++) {
+		for (up = Uxsin[h]; up; up = np) {
+		    np = up->next;
+		    if (up->path)
+			(void) free((FREE_P *)up->path);
+		    if (up->pcb)
+			(void) free((FREE_P *)up->pcb);
+		    (void) free((FREE_P *)up);
+		}
+		Uxsin[h] = (struct uxsin *)NULL;
+	    }
+	} else {
+	    Uxsin = (struct uxsin **)calloc(INOBUCKS, sizeof(struct uxsin *));
+	    if (!Uxsin) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for Unix socket info\n",
+		    Pn, (int)(INOBUCKS * sizeof(struct uxsin *)));
+	    }
+	}
+/*
+ * Open the /proc/net/unix file, assign a page size buffer to the stream,
+ * read the file's contents, and add them to the Uxsin hash buckets.
+ */
+	if (!(us = open_proc_stream(p, "r", &vbuf, &vsz, 0)))
+	    return;
+	while (fgets(buf, sizeof(buf) - 1, us)) {
+	    if ((nf = get_fields(buf, ":", &fp, (int *)NULL, 0)) < 7)
+		continue;
+	    if (fl) {
+
+	    /*
+	     * Check the first line for header words.
+	     */
+		if (!fp[0] || strcmp(fp[0], "Num")
+		||  !fp[1] || strcmp(fp[1], "RefCount")
+		||  !fp[2] || strcmp(fp[2], "Protocol")
+		||  !fp[3] || strcmp(fp[3], "Flags")
+		||  !fp[4] || strcmp(fp[4], "Type")
+		||  !fp[5] || strcmp(fp[5], "St")
+		||  !fp[6] || strcmp(fp[6], "Inode")
+		||  nf < 8
+		||  !fp[7] || strcmp(fp[7], "Path"))
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: unsupported format: %s\n",
+			    Pn, p);
+		    }
+		    break;
+		}
+		fl = 0;
+		continue;
+	    }
+	/*
+	 * Assemble PCB address, inode number, and path name.  If this
+	 * inode is already represented in Uxsin, skip it.
+	 */
+	    ep = (char *)NULL;
+	    if (!fp[6] || !*fp[6]
+	    ||  (inode = strtoull(fp[6], &ep, 0)) == ULONG_MAX || !ep || *ep)
+		continue;
+	    h = INOHASH(inode);
+	    for (up = Uxsin[h]; up; up = up->next) {
+		if (inode == up->inode)
+		    break;
+	    }
+	    if (up)
+		continue;
+	    if (!fp[0] || !*fp[0])
+		pcb = (char *)NULL;
+	    else {
+		len = strlen(fp[0]) + 2;
+		if (!(pcb = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for UNIX PCB: %s\n",
+			Pn, (int)(len + 1), fp[0]);
+		    Exit(1);
+		}
+		(void) snpf(pcb, len + 1, "0x%s", fp[0]);
+	    }
+	    if (nf >= 8 && fp[7] && *fp[7] && (len = strlen(fp[7]))) {
+		if (!(path = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for UNIX path \"%s\"\n",
+			Pn, (int)(len + 1), fp[7]);
+		    Exit(1);
+		}
+		(void) snpf(path, len + 1, "%s", fp[7]);
+	    } else
+		path = (char *)NULL;
+	/*
+	 * Allocate and fill a Unix socket info structure; link it to its
+	 * hash bucket.
+	 */
+	    if (!(up = (struct uxsin *)malloc(sizeof(struct uxsin)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for uxsin struct\n",
+		    Pn, (int)sizeof(struct uxsin));
+		Exit(1);
+	    }
+	    up->inode = inode;
+	    up->pcb = pcb;
+	    up->sb_def = 0;
+	    if ((up->path = path) && (*path == '/')) {
+
+	    /*
+	     * If an absolute path (i.e., one that begins with a '/') exists
+	     * for the line, attempt to stat(2) it and save the device and
+	     * node numbers reported in the stat buffer.
+	     */
+		struct stat sb;
+		int sr;
+
+		if (HasNFS)
+		    sr = statsafely(path, &sb);
+		else
+		    sr = stat(path, &sb);
+		if (sr && ((sb.st_mode & S_IFMT) == S_IFSOCK)) {
+		    up->sb_def = 1;
+		    up->sb_dev = sb.st_dev;
+		    up->sb_ino = (INODETYPE)sb.st_ino;
+		    up->sb_rdev = sb.st_rdev;
+		}
+	    }
+	    up->next = Uxsin[h];
+	    Uxsin[h] = up;
+	}
+	(void) fclose(us);
+}
+
+
+#if	defined(HASIPv6)
+/*
+ * net6a2in6() - convert ASCII IPv6 address in /proc/net/{tcp,udp} form to
+ *		 an in6_addr
+ */
+
+static int
+net6a2in6(as, ad)
+	char *as;			/* address source */
+	struct in6_addr *ad;		/* address destination */
+{
+	char buf[9], *ep;
+	int i;
+	size_t len;
+/*
+ * Assemble four uint32_t's from 4 X 8 hex digits into s6_addr32[].
+ */
+	for (i = 0, len = strlen(as);
+	     (i < 4) && (len >= 8);
+	     as += 8, i++, len -= 8)
+	{
+	    (void) strncpy(buf, as, 8);
+	    buf[8] = '\0';
+	    ep = (char *)NULL;
+	    if ((ad->s6_addr32[i] = (uint32_t)strtoul(buf, &ep, 16))
+	    ==  (uint32_t)UINT32_MAX || !ep || *ep)
+		break;
+	}
+	return((*as || (i != 4) || len) ? 1 : 0);
+}
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * print_ax25info() - print AX25 socket info
+ */
+
+static void
+print_ax25info(ap)
+	struct ax25sin *ap;		/* AX25 socket info */
+{
+	char *cp, pbuf[1024];
+	int ds;
+	MALLOC_S pl = (MALLOC_S)0;
+
+	if (Lf->nma)
+	    return;
+	if (ap->sa) {
+	    ds = (ap->da && strcmp(ap->da, "*")) ? 1 : 0;
+	    (void) snpf(&pbuf[pl], sizeof(pbuf) - pl, "%s%s%s ", ap->sa,
+		ds ? "->" : "",
+		ds ? ap->da : "");
+	    pl = strlen(pbuf);
+	}
+	if (ap->sqs) {
+	    (void) snpf(&pbuf[pl], sizeof(pbuf) - pl, "(Sq=%lu ", ap->sq);
+	    pl = strlen(pbuf);
+	    cp = "";
+	} else 
+	    cp = "(";
+	if (ap->rqs) {
+	    (void) snpf(&pbuf[pl], sizeof(pbuf) - pl, "%sRq=%lu ", cp, ap->rq);
+	    pl = strlen(pbuf);
+	    cp = "";
+	}
+	(void) snpf(&pbuf[pl], sizeof(pbuf) - pl, "%sState=%d", cp, ap->state);
+	pl = strlen(pbuf);
+	if ((ap->state >= 0) && (ap->state < NAX25ST))
+	    cp = ax25st[ap->state];
+	else
+	    cp = NULL;
+	(void) snpf(&pbuf[pl], sizeof(pbuf) - pl, "%s%s)",
+	    cp ? ", " : "",
+	    cp ? cp : "");
+	pl = strlen(pbuf);
+	if (!(cp = (char *)malloc(pl + 1))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes for AX25 sock state, PID: %d\n",
+		Pn, (int)(pl + 1), Lp->pid);
+	    Exit(1);
+	}
+	(void) snpf(cp, pl + 1, "%s", pbuf);
+	Lf->nma = cp;
+}
+
+
+/*
+ * print_ipxinfo() - print IPX socket info
+ */
+
+static void
+print_ipxinfo(ip)
+	struct ipxsin *ip;		/* IPX socket info */
+{
+	char *cp, pbuf[256];
+	MALLOC_S pl;
+
+	if (Lf->nma)
+	    return;
+	(void) snpf(pbuf, sizeof(pbuf), "(Tx=%lx Rx=%lx State=%02x)",
+	    ip->txq, ip->rxq, ip->state);
+	pl = strlen(pbuf);
+	if (!(cp = (char *)malloc(pl + 1))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes for IPX sock state, PID: %d\n",
+		Pn, (int)(pl + 1), Lp->pid);
+	    Exit(1);
+	}
+	(void) snpf(cp, pl + 1, "%s", pbuf);
+	Lf->nma = cp;
+}
+
+
+/*
+ * print_tcptpi() - print TCP/TPI state
+ */
+
+void
+print_tcptpi(nl)
+	int nl;				/* 1 == '\n' required */
+{
+	char buf[128];
+	char *cp = (char *)NULL;
+	int ps = 0;
+	int s;
+
+	if ((Ftcptpi & TCPTPI_STATE) && Lf->lts.type == 0) {
+	    if (!TcpSt)
+		(void) build_IPstates();
+	    if ((s = Lf->lts.state.i + TcpStOff) < 0 || s >= TcpNstates) {
+		(void) snpf(buf, sizeof(buf), "UNKNOWN_TCP_STATE_%d",
+		    Lf->lts.state.i);
+		cp = buf;
+    	    } else
+		cp = TcpSt[s];
+	    if (cp) {
+		if (Ffield)
+		    (void) printf("%cST=%s%c", LSOF_FID_TCPTPI, cp, Terminator);
+		else {
+		    putchar('(');
+		    (void) fputs(cp, stdout);
+		}
+		ps++;
+	    }
+	}
+
+# if	defined(HASTCPTPIQ)
+	if (Ftcptpi & TCPTPI_QUEUES) {
+	    if (Lf->lts.rqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QR=%lu", Lf->lts.rq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.sqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QS=%lu", Lf->lts.sq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+# endif	/* defined(HASTCPTPIQ) */
+
+# if	defined(HASTCPTPIW)
+	if (Ftcptpi & TCPTPI_WINDOWS) {
+	    if (Lf->lts.rws) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WR=%lu", Lf->lts.rw);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.wws) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WW=%lu", Lf->lts.ww);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+# endif	/* defined(HASTCPTPIW) */
+
+	if (!Ffield && ps)
+	    putchar(')');
+	if (nl)
+	    putchar('\n');
+}
+
+
+/*
+ * process_proc_sock() - process /proc-based socket
+ */
+
+void
+process_proc_sock(p, s, ss, l, lss)
+	char *p;			/* node's readlink() path */
+	struct stat *s;			/* stat() result for path */
+	int ss;				/* *s status -- i.e, SB_* values */
+	struct stat *l;			/* lstat() result for FD (NULL for
+					 * others) */
+	int lss;			/* *l status -- i.e, SB_* values */
+{
+	struct ax25sin *ap;
+	char *cp, *path, tbuf[64];
+	unsigned char *fa, *la;
+	struct in_addr fs, ls;
+	struct ipxsin *ip;
+	int i, len, nl;
+	struct nlksin *np;
+	struct packin *pp;
+	char *pr;
+	struct rawsin *rp;
+	struct tcp_udp *tp;
+	struct uxsin *up;
+
+#if	defined(HASIPv6)
+	int af;
+	struct tcp_udp6 *tp6;
+#endif	/* defined(HASIPv6) */
+
+/*
+ * Enter offset, if possible.
+ */
+	if (Foffset || !Fsize) {
+	    if (l && (lss & SB_SIZE) && OffType) {
+		Lf->off = (SZOFFTYPE)l->st_size;
+		Lf->off_def = 1;
+	    }
+	}
+/*
+ * Check for socket's inode presence in the protocol info caches.
+ */
+	if (AX25path) {
+	    (void) get_ax25(AX25path);
+	    (void) free((FREE_P *)AX25path);
+	    AX25path = (char *)NULL;
+	}
+	if ((ss & SB_INO)
+	&&  (ap = check_ax25((INODETYPE)s->st_ino))
+	) {
+	
+	/*
+	 * The inode is connected to an AX25 /proc record.
+	 *
+	 * Set the type to "ax25"; save the device name; save the inode number;
+	 * save the destination and source addresses; save the send and receive
+	 * queue sizes; and save the connection state.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "ax25");
+	    if (ap->dev_ch)
+		(void) enter_dev_ch(ap->dev_ch);
+	    Lf->inode = ap->inode;
+	    Lf->inp_ty = 1;
+	    print_ax25info(ap);
+	    return;
+	}
+	if (Ipxpath) {
+	    (void) get_ipx(Ipxpath);
+	    (void) free((FREE_P *)Ipxpath);
+	    Ipxpath = (char *)NULL;
+	}
+	if ((ss & SB_INO)
+	&&  (ip = check_ipx((INODETYPE)s->st_ino))
+	) {
+
+	/*
+	 * The inode is connected to an IPX /proc record.
+	 *
+	 * Set the type to "ipx"; enter the inode and device numbers; store
+	 * the addresses, queue sizes, and state in the NAME column.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "ipx");
+	    if (ss & SB_INO) {
+		Lf->inode = (INODETYPE)s->st_ino;
+		Lf->inp_ty = 1;
+	    }
+	    if (ss & SB_DEV) {
+		Lf->dev = s->st_dev;
+		Lf->dev_def = 1;
+	    }
+	    cp = Namech;
+	    nl = Namechl;
+	    *cp = '\0';
+	    if (ip->la && nl) {
+
+	    /*
+	     * Store the local IPX address.
+	     */
+		len = strlen(ip->la);
+		if (len > nl)
+		    len = nl;
+		(void) strncpy(cp, ip->la, len);
+		cp += len;
+		*cp = '\0';
+		nl -= len;
+	    }
+	    if (ip->ra && nl) {
+
+	    /*
+	     * Store the remote IPX address, prefixed with "->".
+	     */
+		if (nl > 2) {
+		    (void) snpf(cp, nl, "->");
+		    cp += 2;
+		    nl -= 2;
+		}
+		if (nl) {
+		    (void) snpf(cp, nl, "%s", ip->ra);
+		    cp += len;
+		    nl -= len;
+		}
+	    }
+	    (void) print_ipxinfo(ip);
+	    if (Namech[0])
+		enter_nm(Namech);
+	    return;
+	}
+	if (Rawpath) {
+	    (void) get_raw(Rawpath);
+	    (void) free((FREE_P *)Rawpath);
+	    Rawpath = (char *)NULL;
+	}
+	if ((ss & SB_INO)
+	&&  (rp = check_raw((INODETYPE)s->st_ino))
+	) {
+
+	/*
+	 * The inode is connected to a raw /proc record.
+	 *
+	 * Set the type to "raw"; enter the inode number; store the local
+	 * address, remote address, and state in the NAME column.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "raw");
+	    if (ss & SB_INO) {
+		Lf->inode = (INODETYPE)s->st_ino;
+		Lf->inp_ty = 1;
+	    }
+	    cp = Namech;
+	    nl = Namechl - 2;
+	    *cp = '\0';
+	    if (rp->la && rp->lal) {
+
+	    /*
+	     * Store the local raw address.
+	     */
+		if (nl > rp->lal) {
+		    (void) snpf(cp, nl, "%s", rp->la);
+		    cp += rp->lal;
+		    *cp = '\0';
+		    nl -= rp->lal;
+		}
+	    }
+	    if (rp->ra && rp->ral) {
+
+	    /*
+	     * Store the remote raw address, prefixed with "->".
+	     */
+		if (nl > (rp->ral + 2)) {
+		    (void) snpf(cp, nl, "->%s", rp->ra);
+		    cp += (rp->ral + 2);
+		    nl -= (rp->ral + 2);
+		}
+	    }
+	    if (rp->sp && rp->spl) {
+
+	    /*
+	     * Store the state, optionally prefixed by a space, in the
+	     * form "st=x...x".
+	     */
+	    
+		if (nl > (len = ((cp == Namech) ? 0 : 1) + 3 + rp->spl)) {
+		    (void) snpf(cp, nl, "%sst=%s",
+			(cp == Namech) ? "" : " ", rp->sp);
+		    cp += len;
+		    *cp = '\0';
+		    nl -= len;
+		}
+	    }
+	    if (Namech[0])
+		enter_nm(Namech);
+	    return;
+	}
+	if (Nlkpath) {
+	    (void) get_netlink(Nlkpath);
+	    (void) free((FREE_P *) Nlkpath);
+	    Nlkpath = (char *)NULL;
+	}
+	if ((ss & SB_INO)
+	    &&  (np = check_netlink((INODETYPE)s->st_ino))
+	) {
+	    /*
+	     * The inode is connected to a Netlink /proc record.
+	     *
+	     * Set the type to "netlink" and store the protocol in the NAME
+	     * column.  Save the inode number.
+	     */
+
+	    (void) snpf(Lf->type, sizeof(Lf->type), "netlink");
+	    switch (np->pr) {
+
+#if	defined(NETLINK_ROUTE)
+	    case NETLINK_ROUTE:
+		cp = "ROUTE";
+		break;
+#endif	/* defined(NETLINK_ROUTE) */
+
+#if	defined(NETLINK_UNUSED)
+	    case NETLINK_UNUSED:
+		cp = "UNUSED";
+		break;
+#endif	/* defined(NETLINK_UNUSED) */
+
+#if	defined(NETLINK_USERSOCK)
+	    case NETLINK_USERSOCK:
+		cp = "USERSOCK";
+		break;
+#endif	/* defined(NETLINK_USERSOCK) */
+
+#if	defined(NETLINK_FIREWALL)
+	    case NETLINK_FIREWALL:
+		cp = "FIREWALL";
+		break;
+#endif	/* defined(NETLINK_FIREWALL) */
+
+#if	defined(NETLINK_INET_DIAG)
+	    case NETLINK_INET_DIAG:
+		cp = "INET_DIAG";
+		break;
+#endif	/* defined(NETLINK_INET_DIAG) */
+
+#if	defined(NETLINK_NFLOG)
+	    case NETLINK_NFLOG:
+		cp = "NFLOG";
+		break;
+#endif	/* defined(NETLINK_NFLOG) */
+
+#if	defined(NETLINK_XFRM)
+	    case NETLINK_XFRM:
+		cp = "XFRM";
+		break;
+#endif	/* defined(NETLINK_XFRM) */
+
+#if	defined(NETLINK_SELINUX)
+	    case NETLINK_SELINUX:
+		cp = "SELINUX";
+		break;
+#endif	/* defined(NETLINK_SELINUX) */
+
+#if	defined(NETLINK_ISCSI)
+	    case NETLINK_ISCSI:
+		cp = "ISCSI";
+		break;
+#endif	/* defined(NETLINK_ISCSI) */
+
+#if	defined(NETLINK_AUDIT)
+	    case NETLINK_AUDIT:
+		cp = "AUDIT";
+		break;
+#endif	/* defined(NETLINK_AUDIT) */
+
+#if	defined(NETLINK_FIB_LOOKUP)
+	    case NETLINK_FIB_LOOKUP:
+		cp = "FIB_LOOKUP";
+		break;
+#endif	/* defined(NETLINK_FIB_LOOKUP) */
+
+#if	defined(NETLINK_CONNECTOR)
+	    case NETLINK_CONNECTOR:
+		cp = "CONNECTOR";
+		break;
+#endif	/* defined(NETLINK_CONNECTOR) */
+
+#if	defined(NETLINK_NETFILTER)
+	    case NETLINK_NETFILTER:
+		cp = "NETFILTER";
+		break;
+#endif	/* defined(NETLINK_NETFILTER) */
+
+#if	defined(NETLINK_IP6_FW)
+	    case NETLINK_IP6_FW:
+		cp = "IP6_FW";
+		break;
+#endif	/* defined(NETLINK_IP6_FW) */
+
+#if	defined(NETLINK_DNRTMSG)
+	    case NETLINK_DNRTMSG:
+		cp = "DNRTMSG";
+		break;
+#endif	/* defined(NETLINK_DNRTMSG) */
+
+#if	defined(NETLINK_KOBJECT_UEVENT)
+	    case NETLINK_KOBJECT_UEVENT:
+		cp = "KOBJECT_UEVENT";
+		break;
+#endif	/* defined(NETLINK_KOBJECT_UEVENT) */
+
+#if	defined(NETLINK_GENERIC)
+	    case NETLINK_GENERIC:
+		cp = "GENERIC";
+		break;
+#endif	/* defined(NETLINK_GENERIC) */
+
+#if	defined(NETLINK_SCSITRANSPORT)
+	    case NETLINK_SCSITRANSPORT:
+		cp = "SCSITRANSPORT";
+		break;
+#endif	/* defined(NETLINK_SCSITRANSPORT) */
+
+#if	defined(NETLINK_ECRYPTFS)
+	    case NETLINK_ECRYPTFS:
+		cp = "ECRYPTFS";
+		break;
+#endif	/* defined(NETLINK_ECRYPTFS) */
+
+	    default:
+		snpf(Namech, Namechl, "unknown protocol: %d", np->pr);
+		cp = (char *)NULL;
+	    }
+	    if (cp)
+		(void) snpf(Namech, Namechl, "%s", cp);
+	    Lf->inode = (INODETYPE)s->st_ino;
+	    Lf->inp_ty = 1;
+	    if (Namech[0])
+		enter_nm(Namech);
+	    return;
+	}
+	if (Packpath) {
+	    (void) get_pack(Packpath);
+	    (void) free((FREE_P *)Packpath);
+	    Packpath = (char *)NULL;
+	}
+	if ((ss & SB_INO)
+	&&  (pp = check_pack((INODETYPE)s->st_ino))
+	) {
+
+	/*
+	 * The inode is connected to a packet /proc record.
+	 *
+	 * Set the type to "pack" and store the socket type in the NAME
+	 * column.  Put the protocol name in the NODE column and the inode
+	 * number in the DEVICE column.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "pack");
+	    switch(pp->ty) {
+
+#if	defined(SOCK_STREAM)
+	    case SOCK_STREAM:
+		cp = "STREAM";
+		break;
+#endif	/* defined(SOCK_STREAM) */
+
+#if	defined(SOCK_DGRAM)
+	    case SOCK_DGRAM:
+		cp = "DGRAM";
+		break;
+#endif	/* defined(SOCK_DGRAM) */
+
+#if	defined(SOCK_RAW)
+	    case SOCK_RAW:
+		cp = "RAW";
+		break;
+#endif	/* defined(SOCK_RAW) */
+
+#if	defined(SOCK_RDM)
+	    case SOCK_RDM:
+		cp = "RDM";
+		break;
+#endif	/* defined(SOCK_RDM) */
+
+#if	defined(SOCK_SEQPACKET)
+	    case SOCK_SEQPACKET:
+		cp = "SEQPACKET";
+		break;
+#endif	/* defined(SOCK_SEQPACKET) */
+
+#if	defined(SOCK_PACKET)
+	    case SOCK_PACKET:
+		cp = "PACKET";
+		break;
+#endif	/* defined(SOCK_PACKET) */
+
+	    default:
+		snpf(Namech, Namechl, "unknown type: %d", pp->ty);
+		cp = (char *)NULL;
+	    }
+	    if (cp)
+		(void) snpf(Namech, Namechl, "type=SOCK_%s", cp);
+	    switch (pp->pr) {
+
+#if	defined(ETH_P_LOOP)
+	    case ETH_P_LOOP:
+		cp = "LOOP";
+		break;
+#endif	/* defined(ETH_P_LOOP) */
+
+#if	defined(ETH_P_PUP)
+	    case ETH_P_PUP:
+		cp = "PUP";
+		break;
+#endif	/* defined(ETH_P_PUP) */
+
+#if	defined(ETH_P_PUPAT)
+	    case ETH_P_PUPAT:
+		cp = "PUPAT";
+		break;
+#endif	/* defined(ETH_P_PUPAT) */
+
+#if	defined(ETH_P_IP)
+	    case ETH_P_IP:
+		cp = "IP";
+		break;
+#endif	/* defined(ETH_P_IP) */
+
+#if	defined(ETH_P_X25)
+	    case ETH_P_X25:
+		cp = "X25";
+		break;
+#endif	/* defined(ETH_P_X25) */
+
+#if	defined(ETH_P_ARP)
+	    case ETH_P_ARP:
+		cp = "ARP";
+		break;
+#endif	/* defined(ETH_P_ARP) */
+
+#if	defined(ETH_P_BPQ)
+	    case ETH_P_BPQ:
+		cp = "BPQ";
+		break;
+#endif	/* defined(ETH_P_BPQ) */
+
+#if	defined(ETH_P_IEEEPUP)
+	    case ETH_P_IEEEPUP:
+		cp = "I3EPUP";
+		break;
+#endif	/* defined(ETH_P_IEEEPUP) */
+
+#if	defined(ETH_P_IEEEPUPAT)
+	    case ETH_P_IEEEPUPAT:
+		cp = "I3EPUPA";
+		break;
+#endif	/* defined(ETH_P_IEEEPUPAT) */
+
+#if	defined(ETH_P_DEC)
+	    case ETH_P_DEC:
+		cp = "DEC";
+		break;
+#endif	/* defined(ETH_P_DEC) */
+
+#if	defined(ETH_P_DNA_DL)
+	    case ETH_P_DNA_DL:
+		cp = "DNA_DL";
+		break;
+#endif	/* defined(ETH_P_DNA_DL) */
+
+#if	defined(ETH_P_DNA_RC)
+	    case ETH_P_DNA_RC:
+		cp = "DNA_RC";
+		break;
+#endif	/* defined(ETH_P_DNA_RC) */
+
+#if	defined(ETH_P_DNA_RT)
+	    case ETH_P_DNA_RT:
+		cp = "DNA_RT";
+		break;
+#endif	/* defined(ETH_P_DNA_RT) */
+
+#if	defined(ETH_P_LAT)
+	    case ETH_P_LAT:
+		cp = "LAT";
+		break;
+#endif	/* defined(ETH_P_LAT) */
+
+#if	defined(ETH_P_DIAG)
+	    case ETH_P_DIAG:
+		cp = "DIAG";
+		break;
+#endif	/* defined(ETH_P_DIAG) */
+
+#if	defined(ETH_P_CUST)
+	    case ETH_P_CUST:
+		cp = "CUST";
+		break;
+#endif	/* defined(ETH_P_CUST) */
+
+#if	defined(ETH_P_SCA)
+	    case ETH_P_SCA:
+		cp = "SCA";
+		break;
+#endif	/* defined(ETH_P_SCA) */
+
+#if	defined(ETH_P_RARP)
+	    case ETH_P_RARP:
+		cp = "RARP";
+		break;
+#endif	/* defined(ETH_P_RARP) */
+
+#if	defined(ETH_P_ATALK)
+	    case ETH_P_ATALK:
+		cp = "ATALK";
+		break;
+#endif	/* defined(ETH_P_ATALK) */
+
+#if	defined(ETH_P_AARP)
+	    case ETH_P_AARP:
+		cp = "AARP";
+		break;
+#endif	/* defined(ETH_P_AARP) */
+
+#if	defined(ETH_P_8021Q)
+	    case ETH_P_8021Q:
+		cp = "8021Q";
+		break;
+#endif	/* defined(ETH_P_8021Q) */
+
+#if	defined(ETH_P_IPX)
+	    case ETH_P_IPX:
+		cp = "IPX";
+		break;
+#endif	/* defined(ETH_P_IPX) */
+
+#if	defined(ETH_P_IPV6)
+	    case ETH_P_IPV6:
+		cp = "IPV6";
+		break;
+#endif	/* defined(ETH_P_IPV6) */
+
+#if	defined(ETH_P_SLOW)
+	    case ETH_P_SLOW:
+		cp = "SLOW";
+		break;
+#endif	/* defined(ETH_P_SLOW) */
+	
+#if	defined(ETH_P_WCCP)
+	    case ETH_P_WCCP:
+		cp = "WCCP";
+		break;
+#endif	/* defined(ETH_P_WCCP) */
+
+#if	defined(ETH_P_PPP_DISC)
+	    case ETH_P_PPP_DISC:
+		cp = "PPP_DIS";
+		break;
+#endif	/* defined(ETH_P_PPP_DISC) */
+
+#if	defined(ETH_P_PPP_SES)
+	    case ETH_P_PPP_SES:
+		cp = "PPP_SES";
+		break;
+#endif	/* defined(ETH_P_PPP_SES) */
+
+#if	defined(ETH_P_MPLS_UC)
+	    case ETH_P_MPLS_UC:
+		cp = "MPLS_UC";
+		break;
+#endif	/* defined(ETH_P_MPLS_UC) */
+
+#if	defined(ETH_P_ATMMPOA)
+	    case ETH_P_ATMMPOA:
+		cp = "ATMMPOA";
+		break;
+#endif	/* defined(ETH_P_ATMMPOA) */
+
+#if	defined(ETH_P_MPLS_MC)
+	    case ETH_P_MPLS_MC:
+		cp = "MPLS_MC";
+		break;
+#endif	/* defined(ETH_P_MPLS_MC) */
+
+#if	defined(ETH_P_ATMFATE)
+	    case ETH_P_ATMFATE:
+		cp = "ATMFATE";
+		break;
+#endif	/* defined(ETH_P_ATMFATE) */
+
+#if	defined(ETH_P_AOE)
+	    case ETH_P_AOE:
+		cp = "AOE";
+		break;
+#endif	/* defined(ETH_P_AOE) */
+
+#if	defined(ETH_P_TIPC)
+	    case ETH_P_TIPC:
+		cp = "TIPC";
+		break;
+#endif	/* defined(ETH_P_TIPC) */
+
+#if	defined(ETH_P_802_3)
+	    case ETH_P_802_3:
+		cp = "802.3";
+		break;
+#endif	/* defined(ETH_P_802_3) */
+
+#if	defined(ETH_P_AX25)
+	    case ETH_P_AX25:
+		cp = "AX25";
+		break;
+#endif	/* defined(ETH_P_AX25) */
+
+#if	defined(ETH_P_ALL)
+	    case ETH_P_ALL:
+		cp = "ALL";
+		break;
+#endif	/* defined(ETH_P_ALL) */
+
+#if	defined(ETH_P_802_2)
+	    case ETH_P_802_2:
+		cp = "802.2";
+		break;
+#endif	/* defined(ETH_P_802_2) */
+
+#if	defined(ETH_P_SNAP)
+	    case ETH_P_SNAP:
+		cp = "SNAP";
+		break;
+#endif	/* defined(ETH_P_SNAP) */
+
+#if	defined(ETH_P_DDCMP)
+	    case ETH_P_DDCMP:
+		cp = "DDCMP";
+		break;
+#endif	/* defined(ETH_P_DDCMP) */
+
+#if	defined(ETH_P_WAN_PPP)
+	    case ETH_P_WAN_PPP:
+		cp = "WAN_PPP";
+		break;
+#endif	/* defined(ETH_P_WAN_PPP) */
+
+#if	defined(ETH_P_PPP_MP)
+	    case ETH_P_PPP_MP:
+		cp = "PPP MP";
+		break;
+#endif	/* defined(ETH_P_PPP_MP) */
+
+#if	defined(ETH_P_LOCALTALK)
+	    case ETH_P_LOCALTALK:
+		cp = "LCLTALK";
+		break;
+#endif	/* defined(ETH_P_LOCALTALK) */
+
+#if	defined(ETH_P_PPPTALK)
+	    case ETH_P_PPPTALK:
+		cp = "PPPTALK";
+		break;
+#endif	/* defined(ETH_P_PPPTALK) */
+
+#if	defined(ETH_P_TR_802_2)
+	    case ETH_P_TR_802_2:
+		cp = "802.2";
+		break;
+#endif	/* defined(ETH_P_TR_802_2) */
+
+#if	defined(ETH_P_MOBITEX)
+	    case ETH_P_MOBITEX:
+		cp = "MOBITEX";
+		break;
+#endif	/* defined(ETH_P_MOBITEX) */
+
+#if	defined(ETH_P_CONTROL)
+	    case ETH_P_CONTROL:
+		cp = "CONTROL";
+		break;
+#endif	/* defined(ETH_P_CONTROL) */
+
+#if	defined(ETH_P_IRDA)
+	    case ETH_P_IRDA:
+		cp = "IRDA";
+		break;
+#endif	/* defined(ETH_P_IRDA) */
+
+#if	defined(ETH_P_ECONET)
+	    case ETH_P_ECONET:
+		cp = "ECONET";
+		break;
+#endif	/* defined(ETH_P_ECONET) */
+
+#if	defined(ETH_P_HDLC)
+	    case ETH_P_HDLC:
+		cp = "HDLC";
+		break;
+#endif	/* defined(ETH_P_HDLC) */
+
+#if	defined(ETH_P_ARCNET)
+	    case ETH_P_ARCNET:
+		cp = "ARCNET";
+		break;
+#endif	/* defined(ETH_P_ARCNET) */
+
+	    default:
+		snpf(tbuf, sizeof(tbuf) - 1, "%d", pp->pr);
+		tbuf[sizeof(tbuf) - 1] = '\0';
+		cp = tbuf;
+	    }
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL-1, cp);
+	    Lf->inp_ty = 2;
+	    if (ss & SB_INO) {
+		(void) snpf(tbuf, sizeof(tbuf), InodeFmt_d,
+		    (INODETYPE)s->st_ino);
+		tbuf[sizeof(tbuf) - 1] = '\0';
+		enter_dev_ch(tbuf);
+	    }
+	    if (Namech[0])
+		enter_nm(Namech);
+	    return;
+	}
+	if (UNIXpath) {
+	    (void) get_unix(UNIXpath);
+	    (void) free((FREE_P *)UNIXpath);
+	    UNIXpath = (char *)NULL;
+	}
+	if ((ss & SB_INO)
+	&&  (up = check_unix((INODETYPE)s->st_ino))
+	) {
+
+	/*
+	 * The inode is connected to a UNIX /proc record.
+	 *
+	 * Set the type to "unix"; enter the PCB address in the DEVICE column;
+	 * enter the inode number; and save the optional path.
+	 */
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	    if (up->pcb)
+		enter_dev_ch(up->pcb);
+	    if (ss & SB_INO) {
+		Lf->inode = (INODETYPE)s->st_ino;
+		Lf->inp_ty = 1;
+	    }
+	    path = up->path ? up->path : p;
+	    (void) enter_nm(path);
+	    if (Sfile) {
+	    
+	    /*
+	     * See if this UNIX domain socket was specified as a search
+	     * argument.
+	     *
+	     * Search first by device and node numbers, if that is possible;
+	     * then search by name.
+	     */
+		unsigned char f = 0;		/* file-found flag */
+
+		if (up->sb_def) {
+
+		/*
+		 * If the UNIX socket information includes stat(2) results, do
+		 * a device and node number search.
+		 *
+		 * Note: that requires the saving, temporary modification and
+		 *	 restoration of some *Lf values.
+		 */
+		    unsigned char sv_dev_def;	/* saved dev_def */
+		    unsigned char sv_inp_ty;	/* saved inp_ty */
+		    unsigned char sv_rdev_def;	/* saved rdev_def */
+		    dev_t sv_dev;		/* saved dev */
+		    INODETYPE sv_inode;		/* saved inode */
+		    dev_t sv_rdev;		/* saved rdev */
+
+		    sv_dev_def = Lf->dev_def;
+		    sv_dev = Lf->dev;
+		    sv_inode = Lf->inode;
+		    sv_inp_ty = Lf->inp_ty;
+		    sv_rdev_def = Lf->rdev_def;
+		    sv_rdev = Lf->rdev;
+		    Lf->dev_def = Lf->inp_ty = Lf->rdev_def = 1;
+		    Lf->dev = up->sb_dev;
+		    Lf->inode = up->sb_ino;
+		    Lf->rdev = up->sb_rdev;
+		    if (is_file_named((char *)NULL, 0)) {
+			f = 1;
+			Lf->sf |= SELNM;
+		    }
+		    Lf->dev_def = sv_dev_def;
+		    Lf->dev = sv_dev;
+		    Lf->inode = sv_inode;
+		    Lf->inp_ty = sv_inp_ty;
+		    Lf->rdev_def = sv_rdev_def;
+		    Lf->rdev = sv_rdev;
+		}
+		if (!f && (ss & SB_MODE)) {
+
+		/*
+		 * If the file has not yet been found and the stat buffer has
+		 * st_mode, search for the file by full path.
+		 */
+		    if (is_file_named(path,
+			((s->st_mode & S_IFMT) == S_IFCHR)) ? 1 : 0)
+		    {
+			Lf->sf |= SELNM;
+		    }
+		}
+	    }
+	    return;
+	}
+
+#if	defined(HASIPv6)
+	if (Raw6path) {
+	    if (!Fxopt)
+		(void) get_raw6(Raw6path);
+	    (void) free((FREE_P *)Raw6path);
+	    Raw6path = (char *)NULL;
+	}
+	if (!Fxopt && (ss & SB_INO)
+	&&  (rp = check_raw6((INODETYPE)s->st_ino))
+	) {
+
+	/*
+	 * The inode is connected to a raw IPv6 /proc record.
+	 *
+	 * Set the type to "raw6"; enter the inode number; store the local
+	 * address, remote address, and state in the NAME column.
+	 */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "raw6");
+	    if (ss & SB_INO) {
+		Lf->inode = (INODETYPE)s->st_ino;
+		Lf->inp_ty = 1;
+	    }
+	    cp = Namech;
+	    nl = MAXPATHLEN - 2;
+	    if (rp->la && rp->lal) {
+
+	    /*
+	     * Store the local raw IPv6 address.
+	     */
+		if (nl > rp->lal) {
+		    (void) snpf(cp, nl, "%s", rp->la);
+		    cp += rp->lal;
+		    *cp = '\0';
+		    nl -= rp->lal;
+		}
+	    }
+	    if (rp->ra && rp->ral) {
+
+	    /*
+	     * Store the remote raw address, prefixed with "->".
+	     */
+		if (nl > (rp->ral + 2)) {
+		    (void) snpf(cp, nl, "->%s", rp->ra);
+		    cp += (rp->ral + 2);
+		    nl -= (rp->ral + 2);
+		}
+	    }
+	    if (rp->sp && rp->spl) {
+
+	    /*
+	     * Store the state, optionally prefixed by a space, in the
+	     * form "st=x...x".
+	     */
+	    
+		if (nl > (len = ((cp == Namech) ? 0 : 1) + 3 + rp->spl)) {
+		    (void) snpf(cp, nl, "%sst=%s",
+			(cp == Namech) ? "" : " ", rp->sp);
+		    cp += len;
+		    *cp = '\0';
+		    nl -= len;
+		}
+	    }
+	    if (Namech[0])
+		enter_nm(Namech);
+	    return;
+	}
+	if (TCP6path) {
+	    if (!Fxopt)
+		(void) get_tcpudp6(TCP6path, 0, 1);
+	    (void) free((FREE_P *)TCP6path);
+	    TCP6path = (char *)NULL;
+	}
+	if (UDP6path) {
+	    if (!Fxopt)
+		(void) get_tcpudp6(UDP6path, 1, 0);
+	    (void) free((FREE_P *)UDP6path);
+	    UDP6path = (char *)NULL;
+	}
+	if (UDPLITE6path) {
+	    if (!Fxopt)
+		(void) get_tcpudp6(UDPLITE6path, 2, 0);
+	    (void) free((FREE_P *)UDPLITE6path);
+	    UDPLITE6path = (char *)NULL;
+	}
+	if (!Fxopt && (ss & SB_INO)
+	&&  (tp6 = check_tcpudp6((INODETYPE)s->st_ino, &pr))
+	) {
+
+	/*
+	 * The inode is connected to an IPv6 TCP or UDP /proc record.
+	 *
+	 * Set the type to "IPv6"; enter the protocol; put the inode number
+	 * in the DEVICE column in lieu of the PCB address; save the local
+	 * and foreign IPv6 addresses; save the type and protocol; and
+	 * (optionally) save the queue sizes.
+	 */
+	    i = tp6->state + TcpStOff;
+	    if (TcpStXn) {
+
+	    /*
+	     * Check for state exclusion.
+	     */
+		if (i >= 0 && i < TcpNstates) {
+		    if (TcpStX[i]) {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    if (TcpStIn) {
+
+	    /*
+	     * Check for state inclusion.
+	     */
+		if (i >= 0 && i < TcpNstates) {
+		    if (TcpStI[i])
+			TcpStI[i] = 2;
+		    else {
+			Lf->sf |= SELEXCLF;
+			return;
+		   }
+		}
+	    }
+	    if (Fnet && (FnetTy != 4))
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "IPv6");
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL-1, pr);
+	    Lf->inp_ty = 2;
+	    if (ss && SB_INO) {
+		(void) snpf(tbuf, sizeof(tbuf), InodeFmt_d,
+		    (INODETYPE)s->st_ino);
+		tbuf[sizeof(tbuf) - 1] = '\0';
+		enter_dev_ch(tbuf);
+	    }
+	    af = AF_INET6;
+	    if (!IN6_IS_ADDR_UNSPECIFIED(&tp6->faddr) || tp6->fport)
+		fa = (unsigned char *)&tp6->faddr;
+	    else
+		fa = (unsigned char *)NULL;
+	    if (!IN6_IS_ADDR_UNSPECIFIED(&tp6->laddr) || tp6->lport)
+		la = (unsigned char *)&tp6->laddr;
+	    else
+		la = (unsigned char *)NULL;
+	    if ((fa && IN6_IS_ADDR_V4MAPPED(&tp6->faddr))
+	    ||  (la && IN6_IS_ADDR_V4MAPPED(&tp6->laddr))) {
+		af = AF_INET;
+		if (fa)
+		    fa += 12;
+		if (la)
+		    la += 12;
+	    }
+	    ent_inaddr(la, tp6->lport, fa, tp6->fport, af);
+	    Lf->lts.type = tp6->proto;
+	    Lf->lts.state.i = tp6->state;
+
+#if     defined(HASTCPTPIQ)
+	    Lf->lts.rq = tp6->rxq;
+	    Lf->lts.sq = tp6->txq;
+	    Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif  /* defined(HASTCPTPIQ) */
+
+	    return;
+	}
+#endif	/* defined(HASIPv6) */
+
+	if (TCPpath) {
+	    if (!Fxopt)
+		(void) get_tcpudp(TCPpath, 0, 1);
+	    (void) free((FREE_P *)TCPpath);
+	    TCPpath = (char *)NULL;
+	}
+	if (UDPpath) {
+	    if (!Fxopt)
+		(void) get_tcpudp(UDPpath, 1, 0);
+	    (void) free((FREE_P *)UDPpath);
+	    UDPpath = (char *)NULL;
+	}
+	if (UDPLITEpath) {
+	    if (!Fxopt)
+		(void) get_tcpudp(UDPLITEpath, 2, 0);
+	    (void) free((FREE_P *)UDPLITEpath);
+	    UDPLITEpath = (char *)NULL;
+	}
+	if (!Fxopt && (ss & SB_INO)
+	&&  (tp = check_tcpudp((INODETYPE)s->st_ino, &pr))
+	) {
+
+	/*
+	 * The inode is connected to an IPv4 TCP or UDP /proc record.
+	 *
+	 * Set the type to "inet" or "IPv4"; enter the protocol; put the
+	 * inode number in the DEVICE column in lieu of the PCB address;
+	 * save the local and foreign IPv4 addresses; save the type and
+	 * protocol; and (optionally) save the queue sizes.
+	 */
+	    i = tp->state + TcpStOff;
+	    if (TcpStXn) {
+
+	    /*
+	     * Check for state exclusion.
+	     */
+		if (i >= 0 && i < TcpNstates) {
+		    if (TcpStX[i]) {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    if (TcpStIn) {
+
+	    /*
+	     * Check for state inclusion.
+	     */
+		if (i >= 0 && i < TcpNstates) {
+		    if (TcpStI[i])
+			TcpStI[i] = 2;
+		    else {
+			Lf->sf |= SELEXCLF;
+			return;
+		    }
+		}
+	    }
+	    if (Fnet && (FnetTy != 6))
+		Lf->sf |= SELNET;
+
+#if	defined(HASIPv6)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "IPv4");
+#else	/* !defined(HASIPv6) */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL-1, pr);
+	    Lf->inp_ty = 2;
+	    if (ss & SB_INO) {
+		(void) snpf(tbuf, sizeof(tbuf), InodeFmt_d,
+		    (INODETYPE)s->st_ino);
+		tbuf[sizeof(tbuf) - 1] = '\0';
+		enter_dev_ch(tbuf);
+	    }
+	    if (tp->faddr || tp->fport) {
+		fs.s_addr = tp->faddr;
+		fa = (unsigned char *)&fs;
+	    } else
+		fa = (unsigned char *)NULL;
+	    if (tp->laddr || tp->lport) {
+		ls.s_addr = tp->laddr;
+		la = (unsigned char *)&ls;
+	    } else
+		la = (unsigned char *)NULL;
+	    ent_inaddr(la, tp->lport, fa, tp->fport, AF_INET);
+	    Lf->lts.type = tp->proto;
+	    Lf->lts.state.i = tp->state;
+
+#if     defined(HASTCPTPIQ)
+	    Lf->lts.rq = tp->rxq;
+	    Lf->lts.sq = tp->txq;
+	    Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif  /* defined(HASTCPTPIQ) */
+
+	    return;
+	}
+/*
+ * The socket's protocol can't be identified.
+ */
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	if (ss & SB_INO) {
+	    Lf->inode = (INODETYPE)s->st_ino;
+	    Lf->inp_ty = 1;
+	}
+	if (ss & SB_DEV) {
+	    Lf->dev = s->st_dev;
+	    Lf->dev_def = 1;
+	}
+	enter_nm(Fxopt ? "can't identify protocol (-X specified)"
+		       : "can't identify protocol");
+}
+
+
+/*
+ * set_net_paths() - set /proc/net paths
+ */
+
+void
+set_net_paths(p, pl)
+	char *p;			/* path to /proc/net/ */
+	int pl;				/* strlen(p) */
+{
+	int pathl;
+
+	pathl = 0;
+	(void) make_proc_path(p, pl, &AX25path, &pathl, "ax25");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &Ipxpath, &pathl, "ipx");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &Nlkpath, &pathl, "netlink");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &Packpath, &pathl, "packet");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &Rawpath, &pathl, "raw");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &SockStatPath, &pathl, "sockstat");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &TCPpath, &pathl, "tcp");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &UDPpath, &pathl, "udp");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &UDPLITEpath, &pathl, "udplite");
+
+#if	defined(HASIPv6)
+	pathl = 0;
+	(void) make_proc_path(p, pl, &Raw6path, &pathl, "raw6");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &SockStatPath6, &pathl, "sockstat6");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &TCP6path, &pathl, "tcp6");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &UDP6path, &pathl, "udp6");
+	pathl = 0;
+	(void) make_proc_path(p, pl, &UDPLITE6path, &pathl, "udplite6");
+#endif	/* defined(HASIPv6) */
+
+	pathl = 0;
+	(void) make_proc_path(p, pl, &UNIXpath, &pathl, "unix");
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/linux/dstore.c
new file mode 100644
index 0000000..80e2826
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/dstore.c
@@ -0,0 +1,114 @@
+/*
+ * dstore.c - Linux global storage for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.4 2011/09/07 19:07:45 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+int HasNFS = 0;				/* NFS mount point status:
+					 *     1 == there is an NFS mount point,
+					 *          but its device number is
+					 *          unknown
+					 *     2 == there is an NFS mount point
+					 *          and its device number is
+					 *          known
+					 */
+int OffType = 0;			/* offset type:
+					 *     0 == unknown
+					 *     1 == lstat's st_size
+					 *     2 == from /proc/<PID>/fdinfo */
+
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)O_WRONLY,	FF_WRITE	},
+	{ (long)O_RDWR,		FF_RDWR		},
+	{ (long)O_CREAT,	FF_CREAT	},
+	{ (long)O_EXCL,		FF_EXCL		},
+	{ (long)O_NOCTTY,	FF_NOCTTY	},
+	{ (long)O_TRUNC,	FF_TRUNC	},
+	{ (long)O_APPEND,	FF_APPEND	},
+	{ (long)O_NDELAY,	FF_NDELAY	},
+	{ (long)O_SYNC,		FF_SYNC		},
+	{ (long)O_ASYNC,	FF_ASYNC	},
+
+#if	defined(O_DIRECT)
+	{ (long)O_DIRECT,	FF_DIRECT	},
+#endif	/* defined(O_DIRECT) */
+
+#if	defined(O_DIRECTORY)
+	{ (long)O_DIRECTORY,	FF_DIRECTORY	},
+#endif	/* defined(O_DIRECTORY) */
+
+#if	defined(O_NOFOLLOW)
+	{ (long)O_NOFOLLOW,	FF_NOFOLNK	},
+#endif	/* defined(O_NOFOLLOW) */
+
+#if	defined(O_NOATIME)
+	{ (long)O_NOATIME,	FF_NOATM	},
+#endif	/* defined(O_NOATIME) */
+
+#if	defined(O_DSYNC)
+	{ (long)O_DSYNC,	FF_DSYNC	},
+#endif	/* defined(O_DSYNC) */
+
+#if	defined(O_RSYNC)
+	{ (long)O_RSYNC,	FF_RSYNC	},
+#endif	/* defined(O_RSYNC) */
+
+#if	defined(O_LARGEFILE)
+# if	O_LARGEFILE==0
+	{ (long)0100000,	FF_LARGEFILE	},
+# else	/* O_LARGEFILE!=0 */
+	{ (long)O_LARGEFILE,	FF_LARGEFILE	},
+# endif	/* O_LARGEFILE==0 */
+#else	/* !defined(O_LARGEFILE) */
+	{ (long)0100000,	FF_LARGEFILE	},
+#endif	/* defined(O_LARGEFILE) */
+
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+	{ (long)0,		NULL		}
+};
diff --git a/lsof_4.85/lsof_4.85_src/dialects/linux/machine.h b/lsof_4.85/lsof_4.85_src/dialects/linux/machine.h
new file mode 100644
index 0000000..b9fb4e7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/linux/machine.h
@@ -0,0 +1,644 @@
+/*
+ * machine.h - Linux definitions for /proc-based lsof
+ */
+
+
+/*
+ * Copyright 1997 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: machine.h,v 1.35 2011/09/07 19:07:45 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+/* #define	HASBLKDEV	1 */
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * CAUTION!!!  Do not enable HASDCACHE for /proc-based Linux lsof.  The source
+ *	       code cannot support it.
+ *
+ * The presence of NEVER_HASDCACHE in this comment prevents the Customize
+ * script from offering to change HASDCACHE.
+ *
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ *
+ * CAUTION!!!  Do not enable HASDCACHE for /proc-based Linux lsof.  The source
+ *	       code cannot support it.
+ */
+
+/* #define	HASDCACHE	1  !!!DON'T ENABLE!!! -- see above comment */
+/* #define	HASENVDC	"LSOFDEVCACHE" */
+/* #define	HASPERSDC	"%h/%p.lsof_%L" */
+/* #define	HASPERSDCPATH	"LSOFPERSDCPATH" */
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASEOPT is defined for dialects that support the -e option
+ */
+
+#define	HASEOPT	1
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+/* #define	HASFSINO	1 */
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+#define	HASNOFSADDR	1	/* has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+#define	HASNOFSCOUNT	1	/* has no file structure count */
+#define	HASNOFSNADDR	1	/* has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+/* #define	HASINODE	1 */
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+/* #define	HASKERNIDCK	1	*/
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+/* #define	HASKOPT	1 */
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASLWP is defined for dialects that have LWP support inside processes.
+ */
+
+#define	HASLWP	1
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+#define	HASMNTSUP	1
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+/* #define	HASMOPT	1 */
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+/* #define	HASNCACHE	1 */
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+/* #define	HASNLIST	1 */
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev?	*/
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+/* #define	HASPROCFS	"proc?" */
+/* #define	HASFSTYPE	1 */
+/* #define	HASPINODEN	1 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1 */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+#define	HASWIDECHAR	1
+#define	WIDECHARINCL	<wctype.h>
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+/* #define	HASSOOPT	1	has socket option information */
+/* #define	HASSOSTATE	1	has socket state information */
+/* #define	HASTCPOPT	1	has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+#define	HASTASKS	1
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTCPUDPSTATE is defined for dialects that have TCP and UDP state
+ * support -- i.e., for the "-stcp|udp:state" option and its associated
+ * speed improvements.
+ */
+
+#define	HASTCPUDPSTATE	1
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior to
+ * R4 usually don't.
+ * doesn't.
+ */
+
+/* #define	HASVNODE	1 */
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+#define	HASXOPT		"skip TCP&UDP* files"
+#define	HASXOPT_VALUE	0
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"	 	/* INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	u_int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+/* #define	USE_LIB_CKKV			1	   ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+/* #define	USE_LIB_FIND_CH_INO		1	   fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+/* #define	USE_LIB_LKUPDEV			1	   lkud.c */
+/* #define	USE_LIB_PRINTDEVNAME		1	   pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+/* #define	USE_LIB_PRINT_TCPTPI		1	   ptti.c */
+/* #define	USE_LIB_READDEV			1	   rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ *
+ * CAUTION!!!  Don't enable the WARNDEVACCESS definiton for /proc-based Linux
+ *	       lsof; it doesn't process /dev at all.
+ *
+ * The presence of NEVER_WARNDEVACCESS in this comment prevents the Customize
+ * script from offering to change WARNDEVACCESS.
+ */
+
+/* #define	WARNDEVACCESS	1  DON'T ENABLE!!! -- see above comment */
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+/* #define	WILLDROPGID	1 */
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	bzero(a, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/Makefile b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/Makefile
new file mode 100644
index 0000000..29f88a6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/Makefile
@@ -0,0 +1,159 @@
+
+# N+OBSD Makefile
+#
+# $Id: Makefile,v 1.12 2008/04/15 13:30:14 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    dmnt.c dnode.c dnode1.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.c
+
+OBJ=	dmnt.o dnode.o dnode1.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.8
+MANLCL=	lsof.0
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${MANLCL}: ${MAN}
+	rm -f ${MANLCL}
+	nroff -mandoc -Tlp ${MAN} > ${MANLCL}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core *.core errs lint.out tags *.o
+	rm -f machine.h.old new_machine.h version.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all ${MANLCL} FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the kmem group.  Your install rule actions might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '    install -cs -m 2755 -g $${GRP} $${PROG} $${BIN}/$${PROG}'
+	@echo '    install -c -m 444 $${MANLCL} $${DOC}/$${MANLCL}'
+	@echo ''
+	@echo 'You will have to complete the skeletons for the BIN, DOC, and'
+	@echo 'GRP strings given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/local/man/man8'
+	@echo '    GRP= kmem'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/Mksrc
new file mode 100755
index 0000000..a6a19b5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make NetBSD and OpenBSD source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.5 99/04/15 06:40:37 abe Exp $
+
+
+D=dialects/n+obsd
+L="dlsof.h dmnt.c dnode.c dnode1.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dlsof.h
new file mode 100644
index 0000000..2aa2169
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dlsof.h
@@ -0,0 +1,584 @@
+/*
+ * 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 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dmnt.c
new file mode 100644
index 0000000..51aa4b0
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dmnt.c
@@ -0,0 +1,256 @@
+/*
+ * dmnt.c - NetBSD and OpenBSD mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.12 2005/08/08 19:53:24 abe Exp $";
+#endif
+
+
+#if     defined(NETBSDV) && defined(HASSTATVFS)
+/*
+ * NetBSD needs the statvfs structure to be defined without the 
+ * pre-definition of _KERNEL.
+ */
+  
+#include <sys/statvfs.h>
+#endif  /* defined(NETBSDV) && defined(HASSTATVFS) */
+
+#include "lsof.h"
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	struct mounts *mtp;
+	int n;
+	struct stat sb;
+
+#if	defined(HASPROCFS)
+	unsigned char procfs = 0;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASSTATVFS)
+	struct statvfs *mb = (struct statvfs *)NULL;
+#else	/* !defined(HASSTATVFS) */
+	struct statfs *mb = (struct statfs *)NULL;
+#endif	/* defined(HASSTATVFS) */
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Access mount information.
+ */
+	if ((n = getmntinfo(&mb, MNT_NOWAIT)) <= 0) {
+	    (void) fprintf(stderr, "%s: no mount information\n", Pn);
+	    return(0);
+	}
+/*
+ * Read mount information.
+ */
+	for (; n; n--, mb++) {
+	    if (mb->f_fstypename[0] == '\0')
+		continue;
+	    mb->f_fstypename[MFSNAMELEN - 1] = '\0';
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mb->f_mntonname, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mb->f_mntonname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mb->f_mntfromname, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if ((ln = Readlink(dn)) == NULL) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't stat() ", Pn);
+		    safestrprt(mb->f_fstypename, stderr, 0);
+		    (void) fprintf(stderr, " file system ");
+		    safestrprt(mb->f_mntonname, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		(void) bzero((char *)&sb, sizeof(sb));
+
+#if	defined(HASSTATVFS)
+		sb.st_dev = (dev_t)mb->f_fsid;
+#else	/* !defined(HASSTATVFS) */
+		sb.st_dev = (dev_t)mb->f_fsid.val[0];
+#endif	/* defined(HASSTATVFS) */
+
+		sb.st_mode = S_IFDIR | 0777;
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      assuming \"dev=%x\" from mount table\n",
+			sb.st_dev);
+		}
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+
+#if	defined(HASPROCFS)
+	    if (strcmp(mb->f_fstypename, MOUNT_PROCFS) == 0) {
+
+	    /*
+	     * Save information on exactly one procfs file system.
+	     */
+		if (procfs)
+		    Mtprocfs = (struct mounts *)NULL;
+		else {
+		    procfs = 1;
+		    Mtprocfs = mtp;
+		}
+	    }
+#endif	/* defined(HASPROCFS) */
+
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link.
+	 */
+	    if (!(dn = mkstrcpy(mb->f_mntfromname, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	}
+/*
+ * Clean up and return local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(vm)
+	KA_T vm;			/* kernel mount address from vnode */
+{
+	struct mount m;
+	struct l_vfs *vp;
+/*
+ * Search for match on existing entry.
+ */
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if (vm == vp->addr)
+		return(vp);
+	}
+/*
+ * Read the (new) mount structure, allocate a local entry, and fill it.
+ */
+	if (kread(vm, (char *)&m, sizeof(m)) != 0)
+	    return((struct l_vfs *)NULL);
+	if (!(vp = (struct l_vfs *)malloc(sizeof(struct l_vfs)))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	if (!(vp->dir = mkstrcpy(m.m_stat.f_mntonname, (MALLOC_S *)NULL))
+	||  !(vp->fsname = mkstrcpy(m.m_stat.f_mntfromname, (MALLOC_S *)NULL)))
+	{
+	    (void) fprintf(stderr, "%s: PID %d, no space for mount names\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->addr = vm;
+
+#if	defined(HASSTATVFS)
+	vp->fsid = m.m_stat.f_fsidx;
+#else	/* !defined(HASSTATVFS) */
+	vp->fsid = m.m_stat.f_fsid;
+#endif	/* defined(HASSTATVFS) */
+
+	(void) snpf(vp->type, sizeof(vp->type), "%s", m.m_stat.f_fstypename);
+	vp->next = Lvfs;
+	Lvfs = vp;
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dnode.c
new file mode 100644
index 0000000..79d7795
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dnode.c
@@ -0,0 +1,1459 @@
+/*
+ * dnode.c - NetBSD and OpenBSD node functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.38 2007/04/24 16:22:02 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HAS_DINODE_U)
+#define	DINODE_U	dinode_u
+#else	/* !defined(HAS_DINODE_U) */
+#define	DINODE_U	i_din
+#endif	/* defined(HAS_DINODE_U) */
+
+#if	defined(HASFDESCFS) && HASFDESCFS==1
+_PROTOTYPE(static int lkup_dev_tty,(dev_t *dr, INODETYPE *ir));
+#endif	/* defined(HASFDESCFS) && HASFDESCFS==1 */
+
+#if	defined(HAS_UM_UFS)
+#define	UFS1	UM_UFS1
+#define	UFS2	UM_UFS2
+#endif	/* defined(HAS_UM_UFS) */
+
+#if	defined(HASPROCFS)
+_PROTOTYPE(static void getmemsz,(pid_t pid));
+
+# if	!defined(PGSHIFT)
+#define	PGSHIFT	pgshift
+# endif	/* !defined(PGSHIFT) */
+
+
+/*
+ * getmemsz() - get memory size of a /proc/<n>/mem entry
+ */
+
+static void
+getmemsz(pid)
+	pid_t pid;
+{
+	int n;
+	struct vmspace vm;
+
+#if	defined(HASKVMGETPROC2)
+	struct kinfo_proc2 *p;
+#else	/* !defined(HASKVMGETPROC2) */
+	struct kinfo_proc *p;
+#endif	/* defined(HASKVMGETPROC2) */
+
+	for (n = 0, p = P; n < Np; n++, p++) {
+	    if (p->P_PID == pid) {
+		if (!p->P_VMSPACE
+		||  kread((KA_T)p->P_VMSPACE, (char *)&vm, sizeof(vm)))
+		    return;
+# if	defined(OPENBSDV)
+		Lf->sz = (SZOFFTYPE)((vm.vm_tsize + vm.vm_dsize
+		       + vm.vm_ssize) * sysconf(_SC_PAGESIZE));
+# else	/* !defined(OPENBSDV */
+		Lf->sz = (SZOFFTYPE)ctob(vm.vm_tsize + vm.vm_dsize
+						     + vm.vm_ssize);
+# endif	/* defined(OPENBSDV) */
+
+		Lf->sz_def = 1;
+		return;
+	    }
+	}
+}
+#undef	PGSHIFT
+#endif	/* defined(HASPROCFS) */
+
+
+#if	defined(HASFDESCFS) && HASFDESCFS==1
+/*
+ * lkup_dev_tty() - look up /dev/tty
+ */
+
+static int
+lkup_dev_tty(dr, ir)
+	dev_t *dr;			/* place to return device number */
+	INODETYPE *ir;			/* place to return inode number */
+{
+	int i;
+
+	readdev(0);
+
+# if	defined(HASDCACHE)
+
+lkup_dev_tty_again:
+
+# endif	/* defined(HASDCACHE) */
+
+	for (i = 0; i < Ndev; i++) {
+	    if (strcmp(Devtp[i].name, "/dev/tty") == 0) {
+
+# if	defined(HASDCACHE)
+		if (DCunsafe && !Devtp[i].v && !vfy_dev(&Devtp[i]))
+		    goto lkup_dev_tty_again;
+# endif	/* defined(HASDCACHE) */
+
+		*dr = Devtp[i].rdev;
+		*ir = Devtp[i].inode;
+		return(1);
+	    }
+	}
+
+# if	defined(HASDCACHE)
+	if (DCunsafe) {
+	    (void) rereaddev();
+	    goto lkup_dev_tty_again;
+	}
+# endif	/* defined(HASDCACHE) */
+
+	return(-1);
+}
+#endif	/* defined(HASFDESCFS) && HASFDESCFS==1 */
+
+
+#if	defined(HASKQUEUE)
+/*
+ * process_kqueue() -- process kqueue file
+ *
+ * Strictly speaking this function should appear in dfile.c, because it is
+ * a file processing function.  However, the Net and Open BSD sources don't
+ * require a dfile.c, so this is the next best location for the function.
+ */
+
+void
+process_kqueue(ka)
+	KA_T ka;			/* kqueue file structure address */
+{
+
+# if	defined(OPENBSDV)
+	struct kqueue kq;		/* kqueue structure */
+# endif	/* defined(OPENBSDV) */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "KQUEUE");
+	enter_dev_ch(print_kptr(ka, (char *)NULL, 0));
+
+# if	defined(OPENBSDV)
+	if (!ka || kread(ka, (char *)&kq, sizeof(kq)))
+	    return;
+	(void) snpf(Namech, Namechl, "count=%d, state=%#x", kq.kq_count,
+	    kq.kq_state);
+	enter_nm(Namech);
+# endif	/* defined(OPENBSDV) */
+
+}
+#endif	/* defined(HASKQUEUE) */
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	dev_t dev, rdev;
+	unsigned char devs;
+	unsigned char lt;
+	unsigned char ns;
+	unsigned char rdevs;
+	char *ep, *ty;
+	struct lockf lf, *lff, *lfp;
+	struct inode i;
+	struct mfsnode m;
+	struct nfsnode n;
+	enum nodetype {NONODE, CDFSNODE, DOSNODE, EXT2NODE, FDESCNODE, INODE,
+		KERNFSNODE, MFSNODE, NFSNODE, PFSNODE, PTYFSNODE} nty;
+	enum vtype type;
+	struct vnode *v, vb;
+	struct l_vfs *vfs;
+
+#if	defined(HAS9660FS)
+	dev_t iso_dev;
+	INODETYPE iso_ino;
+	long iso_nlink;
+	int iso_stat;
+	SZOFFTYPE iso_sz;
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASFDESCFS)
+	struct fdescnode f;
+
+# if	HASFDESCFS==1
+	static dev_t f_tty_dev;
+	static INODETYPE f_tty_ino;
+	static int f_tty_s = 0;
+# endif	/* HASFDESCFS==1 */
+
+#endif	/* defined(HASFDESCFS) */
+
+#if	defined(HASEXT2FS)
+# if	defined(HASI_E2FS_PTR)
+	struct ext2fs_dinode ed;
+# endif	/* defined(HASI_E2FS_PTR) */
+	struct ext2fs_dinode *edp = (struct ext2fs_dinode *)NULL;
+#endif	/* defined(HASEXT2FS) */
+
+#if	defined(HASI_FFS1)
+	unsigned char ffs = 0;
+	unsigned char u1s = 0;
+	unsigned char u2s = 0;
+	struct ufs1_dinode u1;
+	struct ufs2_dinode u2;
+	struct ufsmount um;
+#endif	/* defined(HASI_FFS1) */
+
+#if	defined(HASKERNFS)
+	struct kernfs_node kn;
+	struct stat ksb;
+	int ksbs;
+	struct kern_target kt;
+	int ktnl;
+	char ktnm[MAXPATHLEN+1];
+#endif	/* defined(HASKERNFS) */
+
+#if	defined(HASMSDOSFS)
+	struct denode d;
+	u_long dpb;
+	INODETYPE nn;
+	struct msdosfsmount pm;
+#endif	/* defined(HASMSDOSFS) */
+
+#if	defined(HASNFSVATTRP)
+	struct vattr nv;
+#define	NVATTR	nv
+#else	/* !defined(HASNFSVATTRP) */
+#define	NVATTR	n.n_vattr
+#endif	/* defined(HASNFSVATTRP) */
+
+#if	defined(HASNULLFS)
+	struct null_node nu;
+	int sc = 0;
+	struct l_vfs *nvfs = (struct l_vfs *)NULL;
+#endif	/* defined(HASNULLFS) */
+
+#if	defined(HASPROCFS)
+	struct pfsnode p;
+	struct procfsid *pfi;
+	size_t sz;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPTYFS)
+	struct ptyfsnode pt;
+	struct specinfo si;
+#endif	/* defined(HASPTYFS) */
+
+#if	defined(HASNULLFS)
+
+process_overlaid_node:
+
+	if (++sc > 1024) {
+	    (void) snpf(Namech, Namechl, "too many overlaid nodes");
+	    enter_nm(Namech);
+	    return;
+	}
+#endif	/* defined(HASNULLFS) */
+
+/*
+ * Initialize miscellaneous variables.  This is done so that processing an
+ * overlaid node will be a fresh start.
+ */
+	devs = rdevs = 0;
+	nty = NONODE;
+	Namech[0] = '\0';
+
+#if	defined(HAS9660FS)
+	iso_stat = 0;
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASKERNFS)
+	ksbs = 0;
+#endif	/* defined(HASKERNFS) */
+
+#if	defined(HASEXT2FS)
+	edp = (struct ext2fs_dinode *)NULL;
+#endif	/* defined(HASEXT2FS) */
+
+#if	defined(HASI_FFS1)
+	ffs = u1s = u2s = 0;
+#endif	/* defined(HASI_FFS1) */
+
+/*
+ * Read the vnode.
+ */
+	if (!va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	v = &vb;
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASNCACHE)
+	Lf->na = va;
+# if	defined(HASNCVPID)
+	Lf->id = v->v_id;
+# endif	/* defined(HASNCVPID) */
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = va;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Get the vnode type.
+ */
+	if (!v->v_mount)
+	    vfs = (struct l_vfs *)NULL;
+	else {
+	    vfs = readvfs((KA_T)v->v_mount);
+	    if (vfs) {
+		if (strcmp(vfs->type, MOUNT_NFS) == 0)
+		    Ntype = N_NFS;
+
+#if	defined(HASKERNFS)
+		else if (strcmp(vfs->type, MOUNT_KERNFS) == 0)
+		    Ntype = N_KERN;
+#endif	/* defined(HASKERNFS) */
+
+#if	defined(HASPROCFS)
+		else if (strcmp(vfs->type, MOUNT_PROCFS) == 0)
+		    Ntype = N_PROC;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HAS9660FS)
+		else if (strcmp(vfs->type, MOUNT_CD9660) == 0)
+		    Ntype = N_CDFS;
+#endif	/* defined(HAS9660FS) */
+
+	    }
+	}
+	if (Ntype == N_REGLR) {
+	    switch (v->v_type) {
+	    case VFIFO:
+		Ntype = N_FIFO;
+		break;
+	    }
+	}
+/*
+ * Read the successor node.
+ */
+	switch (v->v_tag) {
+
+#if	defined(HAS9660FS)
+	case VT_ISOFS:
+	    if (read_iso_node(v, &iso_dev, &iso_ino, &iso_nlink, &iso_sz))
+	    {
+		(void) snpf(Namech, Namechl, "can't read iso_node at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    iso_stat = 1;
+	    nty = CDFSNODE;
+	    break;
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASFDESCFS)
+	case VT_FDESC:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&f, sizeof(f))) {
+		(void) snpf(Namech, Namechl, "can't read fdescnode at: %x",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    nty = FDESCNODE;
+	    break;
+#endif	/* defined(HASFDESCFS) */
+
+#if	defined(HASKERNFS)
+	case VT_KERNFS:
+	
+	/*
+	 * Read the kernfs_node.
+	 */
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&kn, sizeof(kn))) {
+		if (v->v_type != VDIR || !(v->v_flag && VROOT)) {
+		    (void) snpf(Namech, Namechl,
+			"can't read kernfs_node at: %s",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		} else
+		    kn.kf_kt = (struct kern_target *)NULL;
+	    }
+	/*
+	 * Generate the /kern file name by reading the kern_target to which
+	 * the kernfs_node points.
+	 */
+	    if (kn.kf_kt
+	    &&  kread((KA_T)kn.kf_kt, (char *)&kt, sizeof(kt)) == 0
+	    &&  (ktnl = (int)kt.kt_namlen) > 0
+	    &&  kt.kt_name)
+	    {
+		if (ktnl > (sizeof(ktnm) - 1))
+		    ktnl = sizeof(ktnm) - 1;
+		if (!kread((KA_T)kt.kt_name, ktnm, ktnl)) {
+		    ktnm[ktnl] = 0;
+		    ktnl = strlen(ktnm);
+		    if (ktnl > (MAXPATHLEN - strlen(_PATH_KERNFS) - 2)) {
+			ktnl = MAXPATHLEN - strlen(_PATH_KERNFS) - 2;
+			ktnm[ktnl] = '\0';
+		    }
+		    (void) snpf(Namech, Namechl, "%s/%s", _PATH_KERNFS, ktnm);
+		}
+	    }
+	/*
+	 * If this is the /kern root directory, its name, inode number and
+	 * size are fixed; otherwise, safely stat() the file to get the
+	 * inode number and size.
+	 */
+	    if (v->v_type == VDIR && (v->v_flag & VROOT)) {
+		(void) snpf(Namech, Namechl, "%s", _PATH_KERNFS);
+		ksb.st_ino = (ino_t)2;
+		ksb.st_size = DEV_BSIZE;
+		ksbs = 1;
+	    } else if (Namech[0] && statsafely(Namech, &ksb) == 0)
+		ksbs = 1;
+	    nty = KERNFSNODE;
+	    break;
+#endif	/* defined(HASKERNFS) */
+
+	case VT_MFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&m, sizeof(m))) {
+		(void) snpf(Namech, Namechl, "can't read mfsnode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    nty = MFSNODE;
+	    break;
+
+#if	defined(HASMSDOSFS)
+	case VT_MSDOSFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&d, sizeof(d))) {
+		(void) snpf(Namech, Namechl, "can't read denode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    nty = DOSNODE;
+	    break;
+#endif	/* defined(HASMSDOSFS) */
+
+	case VT_NFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&n, sizeof(n))) {
+		(void) snpf(Namech, Namechl, "can't read nfsnode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+
+#if	defined(HASNFSVATTRP)
+	    if (!n.n_vattr
+	    ||  kread((KA_T)n.n_vattr, (char *)&nv, sizeof(nv))) {
+		(void) snpf(Namech, Namechl, "can't read n_vattr at: %x",
+		    print_kptr((KA_T)n.n_vattr, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+#endif	/* defined(HASNFSVATTRP) */
+
+	    nty = NFSNODE;
+	    break;
+
+#if	defined(HASNULLFS)
+	case VT_NULL:
+	    if ((sc == 1) && vfs)
+		nvfs = vfs;
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&nu, sizeof(nu))) {
+		(void) snpf(Namech, Namechl, "can't read null_node at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    if (!nu.null_lowervp) {
+		(void) snpf(Namech, Namechl, "null_node overlays nothing");
+		enter_nm(Namech);
+		return;
+	    }
+	    va = (KA_T)nu.null_lowervp;
+	    goto process_overlaid_node;
+#endif	/* defined(HASNULLFS) */
+
+#if	defined(HASPROCFS)
+	case VT_PROCFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&p, sizeof(p))) {
+		(void) snpf(Namech, Namechl, "can't read pfsnode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    nty = PFSNODE;
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+#if    defined(HASPTYFS)
+	case VT_PTYFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&pt, sizeof(pt))) {
+		(void) snpf(Namech, Namechl, "can't read ptyfsnode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    nty = PTYFSNODE;
+	    break;
+#endif	/* defined(HASPTYFS) */
+
+#if	defined(HASEXT2FS)
+	case VT_EXT2FS:
+#endif	/* defined(HASEXT2FS) */
+
+#if	defined(HASLFS)
+	case VT_LFS:
+#endif	/* defined(HASLFS) */
+
+	case VT_UFS:
+	    if (!v->v_data
+	    ||  kread((KA_T)v->v_data, (char *)&i, sizeof(i))) {
+		(void) snpf(Namech, Namechl, "can't read inode at: %s",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+
+#if	defined(HASEXT2FS)
+	    if (v->v_tag == VT_EXT2FS) {
+		nty = EXT2NODE;
+
+# if	defined(HASI_E2FS_PTR)
+		if (i.DINODE_U.e2fs_din
+		&&  !kread((KA_T)i.DINODE_U.e2fs_din, (char *)&ed, sizeof(ed)))
+		    edp = &ed;
+# else	/* !defined(HASI_E2FS_PTR) */
+#  if	HASEXT2FS<2
+		edp = &i.DINODE_U.e2fs_din;
+#  else	/* HASEXT2FS>=2 */
+		edp = &i.i_e2din;
+#  endif	/* HASEXT2FS>=2 */
+# endif	/* defined(HASI_E2FS_PTR) */
+
+	    } else
+#endif	/* defined(HASEXT2FS) */
+
+	    {
+		nty = INODE;
+
+#if	defined(HASI_FFS1)
+		/*
+		 * If there are multiple FFS's, read the relevant structures.
+		 */
+		    if (i.i_ump
+		    &&  !kread((KA_T)i.i_ump, (char *)&um, sizeof(um))) {
+			if (um.um_fstype == UFS1) {
+			    ffs = 1;
+			    if (i.DINODE_U.ffs1_din
+			    &&  !kread((KA_T)i.DINODE_U.ffs1_din, (char *)&u1,
+				       sizeof(u1)))
+			    {
+				u1s = 1;
+			    }
+			} else if (um.um_fstype == UFS2) {
+			    ffs = 2;
+			    if (i.DINODE_U.ffs2_din
+			    &&  !kread((KA_T)i.DINODE_U.ffs2_din, (char *)&u2,
+				       sizeof(u2)))
+			    {
+				u2s = 1;
+			    }
+			}
+		    }
+#endif	/* defined(HASI_FFS1) */
+
+	    }
+
+	    if ((lff = i.i_lockf)) {
+
+	    /*
+	     * Determine the lock state.
+	     */
+		lfp = lff;
+		do {
+		    if (kread((KA_T)lfp, (char *)&lf, sizeof(lf)))
+			break;
+		    lt = 0;
+		    switch(lf.lf_flags & (F_FLOCK|F_POSIX)) {
+		    case F_FLOCK:
+			if (Cfp && (struct file *)lf.lf_id == Cfp)
+			    lt = 1;
+			break;
+		    case F_POSIX:
+			if ((KA_T)lf.lf_id == Kpa)
+			    lt = 1;
+
+#if	defined(HAS_LWP_H) && !defined(HAS_LF_LWP)
+			else {
+
+			    struct lwp lw;
+
+			    if (!kread((KA_T)lf.lf_id, (char *)&lw, sizeof(lw))
+			    &&  (KA_T)lw.l_proc == Kpa)
+				lt = 1;
+			}
+#endif	/* defined(HAS_LWP_H) && !defined(HAS_LF_LWP) */
+
+			break;
+		    }
+		    if (!lt)
+			continue;
+		    if (lf.lf_start == (off_t)0
+		    &&  lf.lf_end == 0xffffffffffffffffLL)
+			lt = 1;
+		    else
+			lt = 0;
+		    if (lf.lf_type == F_RDLCK)
+			Lf->lock = lt ? 'R' : 'r';
+		    else if (lf.lf_type == F_WRLCK)
+			Lf->lock = lt ? 'W' : 'w';
+		    else if (lf.lf_type == (F_RDLCK | F_WRLCK))
+			Lf->lock = 'u';
+		    break;
+		} while ((lfp = lf.lf_next) && lfp != lff);
+	    }
+	    break;
+	default:
+	    if (v->v_type == VBAD || v->v_type == VNON)
+		break;
+	    (void) snpf(Namech, Namechl, "unknown file system type: %d",
+		v->v_tag);
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Get device and type for printing.
+ */
+	type = v->v_type;
+	switch (nty) {
+
+
+#if	defined(HASMSDOSFS)
+	case DOSNODE:
+	    dev = d.de_dev;
+	    devs = 1;
+	    break;
+#endif	/* defined(HASMSDOSFS) */
+
+#if	defined(HASFDESCFS)
+	case FDESCNODE:
+
+# if	defined(HASFDLINK)
+	    if (f.fd_link
+	    &&  !kread((KA_T)f.fd_link, Namech, Namechl - 1)) {
+		Namech[Namechl - 1] = '\0';
+		break;
+	    }
+# endif	/* defined(HASFDLINK) */
+
+# if	HASFDESCFS==1
+	    if (f.fd_type == Fctty) {
+		if (f_tty_s == 0)
+		    f_tty_s = lkup_dev_tty(&f_tty_dev, &f_tty_ino);
+		if (f_tty_s == 1) {
+		    dev = DevDev;
+		    rdev = f_tty_dev;
+		    Lf->inode = f_tty_ino;
+		    devs = Lf->inp_ty = rdevs = 1;
+		}
+	    }
+	    break;
+# endif	/* HASFDESCFS==1 */
+#endif	/* defined(HASFDESCFS) */
+
+#if	defined(HASEXT2FS)
+	case EXT2NODE:
+
+	    dev = i.i_dev;
+	    devs = 1;
+	    if ((type == VCHR) || (type == VBLK)) {
+
+# if	defined(HASI_E2FS_PTR)
+		if (edp) {
+		    rdev = edp->e2di_rdev;
+		    rdevs = 1;
+		}
+# else	/* !defined(HASI_E2FS_PTR) */
+#  if	HASEXT2FS<2
+		rdev = i.DINODE_U.e2fs_din.e2di_rdev;
+#  else	/* HASEXT2FS>=2 */
+		rdev = i.i_e2din.e2di_rdev;
+#  endif	/* HASEXT2FS>=2 */
+		rdevs = 1;
+# endif	/* defined(HASI_E2FS_PTR) */
+
+	    }
+	    break;
+#endif	/* defined(HASEXT2FS) */
+
+	case INODE:
+	    dev = i.i_dev;
+	    devs = 1;
+	    if ((type == VCHR) || (type == VBLK)) {
+
+#if	defined(HASI_FFS)
+		rdev = i.i_ffs_rdev;
+		rdevs = 1;
+#else	/* !defined(HASI_FFS) */
+# if	defined(HASI_FFS1)
+		if (ffs == 1) {
+		    if (u1s) {
+			rdev = u1.di_rdev;
+			rdevs = 1;
+		    }
+		} else if (ffs == 2) {
+		    if (u2s) {
+			rdev = u2.di_rdev;
+			rdevs = 1;
+		    }
+		}
+# else	/* !defined(HASI_FFS1) */
+		rdev = i.i_rdev;
+		rdevs = 1;
+# endif	/* defined(HASI_FFS1) */
+#endif	/* defined(HASI_FFS) */
+
+	    }
+	    break;
+
+#if	defined(HASKERNFS)
+	case KERNFSNODE:
+	    if (vfs) {
+
+# if	defined(HASSTATVFS)
+		dev = (dev_t)vfs->fsid.__fsid_val[0];
+# else	/* !defined(HASSTATVFS) */
+		dev = (dev_t)vfs->fsid.val[0];
+# endif	/* defined(HASSTATVFS) */
+
+		devs = 1;
+	    }
+	    break;
+#endif	/* defined(HASKERNFS) */
+
+#if	defined(HAS9660FS)
+	case CDFSNODE:
+	    if (iso_stat) {
+		dev = iso_dev;
+		devs = 1;
+	    }
+	    break;
+#endif	/* defined(HAS9660FS) */
+
+	case NFSNODE:
+	    dev = NVATTR.va_fsid;
+	    devs = 1;
+	    break;
+
+#if	defined(HASPTYFS)
+	case PTYFSNODE:
+	    if (v->v_un.vu_specinfo
+	    &&  !kread((KA_T)v->v_un.vu_specinfo, (char *)&si, sizeof(si))) {
+		rdev = si.si_rdev;
+		rdevs = 1;
+	    }
+	    if (vfs) {
+
+# if	defined(HASSTATVFS)
+		dev = (dev_t)vfs->fsid.__fsid_val[0];
+# else	/* !defined(HASSTATVFS) */
+		dev = (dev_t)vfs->fsid.val[0];
+# endif	/* defined(HASSTATVFS) */
+
+		devs = 1;
+	    }
+	    break;
+#endif	/* defined(HASPTYFS) */
+
+	}
+/*
+ * Obtain the inode number.
+ */
+	switch (nty) {
+
+#if	defined(HASMSDOSFS)
+	case DOSNODE:
+	    if (d.de_pmp && !kread((KA_T)d.de_pmp, (char *)&pm, sizeof(pm))) {
+		dpb = (u_long)(pm.pm_BytesPerSec / sizeof(struct direntry));
+		if (d.de_Attributes & ATTR_DIRECTORY) {
+		    if (d.de_StartCluster == MSDOSFSROOT)
+			nn = (INODETYPE)1;
+		    else
+			nn = (INODETYPE)(cntobn(&pm, d.de_StartCluster) * dpb);
+		} else {
+		    if (d.de_dirclust == MSDOSFSROOT)
+			nn = (INODETYPE)(roottobn(&pm, 0) * dpb);
+		    else
+			nn = (INODETYPE)(cntobn(&pm, d.de_dirclust) * dpb);
+		    nn += (INODETYPE)(d.de_diroffset / sizeof(struct direntry));
+		}
+		Lf->inode = nn;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HASMSDOSFS) */
+
+#if	defined(HASEXT2FS)
+	case EXT2NODE:
+#endif	/* defined(HASEXT2FS) */
+
+	case INODE:
+	    Lf->inode = (INODETYPE)i.i_number;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	defined(HASKERNFS)
+	case KERNFSNODE:
+	    if (ksbs) {
+		Lf->inode = (INODETYPE)ksb.st_ino;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HASKERNFS) */
+
+#if	defined(HAS9660FS)
+	case CDFSNODE:
+	    if (iso_stat) {
+		Lf->inode = iso_ino;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS9660FS) */
+
+	case NFSNODE:
+	    Lf->inode = (INODETYPE)NVATTR.va_fileid;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	defined(HASPROCFS)
+	case PFSNODE:
+	    Lf->inode = (INODETYPE)p.pfs_fileno;
+	    Lf->inp_ty = 1;
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPTYFS)
+	case PTYFSNODE:
+	    if (pt.ptyfs_type == PTYFSptc) {
+		if (pt.ptyfs_fileno > 0x3fffffff)
+		    Lf->inode = (INODETYPE)(pt.ptyfs_fileno & 0x3fffffff);
+		else
+		    Lf->inode = (INODETYPE)(pt.ptyfs_fileno - 1);
+	    } else
+		Lf->inode = (INODETYPE)pt.ptyfs_fileno;
+	    Lf->inp_ty = 1;
+	    break;
+#endif	/* defined(HASPTYFS) */
+
+	}
+
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+
+#if	defined(HAS9660FS)
+	    case N_CDFS:
+		if (iso_stat) {
+		    Lf->sz = (SZOFFTYPE)iso_sz;
+		    Lf->sz_def = 1;
+		}
+		break;
+#endif	/* defined(HAS9660FS) */
+
+	    case N_FIFO:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+
+#if	defined(HASKERNFS)
+	    case N_KERN:
+		if (ksbs) {
+		    Lf->sz = (SZOFFTYPE)ksb.st_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+#endif	/* defined(HASKERNFS) */
+
+	    case N_NFS:
+		if (nty == NFSNODE) {
+		    Lf->sz = (SZOFFTYPE)NVATTR.va_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+
+#if	defined(HASPROCFS)
+	    case N_PROC:
+		if (nty == PFSNODE) {
+		    switch (p.pfs_type) {
+		    case Proot:
+		    case Pproc:
+			Lf->sz = (SZOFFTYPE)DEV_BSIZE;
+			Lf->sz_def = 1;
+			break;
+		    case Pcurproc:
+			Lf->sz = (SZOFFTYPE)DEV_BSIZE;
+			Lf->sz_def = 1;
+			break;
+		    case Pmem:
+			(void) getmemsz(p.pfs_pid);
+			break;
+		    case Pregs:
+			Lf->sz = (SZOFFTYPE)sizeof(struct reg);
+			Lf->sz_def = 1;
+			break;
+
+# if	defined(FP_QSIZE)
+		    case Pfpregs:
+			Lf->sz = (SZOFFTYPE)sizeof(struct fpreg);
+			Lf->sz_def = 1;
+			break;
+# endif	/* defined(FP_QSIZE) */
+
+		    }
+		}
+		break;
+#endif	/* defined(HASPROCFS) */
+
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    switch (nty) {
+		    case INODE:
+
+#if	defined(HASI_FFS)
+			
+			Lf->sz = (SZOFFTYPE)i.i_ffs_size;
+			Lf->sz_def = 1;
+			break;
+#else	/* !defined(HASI_FFS) */
+# if	defined(HASI_FFS1)
+
+			if (ffs == 1) {
+			    if (u1s) {
+				Lf->sz = (SZOFFTYPE)u1.di_size;
+				Lf->sz_def = 1;
+			    }
+			} else if (ffs == 2) {
+			    if (u2s) {
+				Lf->sz = (SZOFFTYPE)u2.di_size;
+				Lf->sz_def = 1;
+			    }
+			}
+			break;
+# else	/* !defined(HASI_FFS1) */
+			Lf->sz = (SZOFFTYPE)i.i_size;
+			Lf->sz_def = 1;
+# endif	/* defined(HASI_FFS1) */
+#endif	/* defined(HASI_FFS) */
+
+			break;
+
+
+#if	defined(HASMSDOSFS)
+		    case DOSNODE:
+			Lf->sz = (SZOFFTYPE)d.de_FileSize;
+			Lf->sz_def = 1;
+			break;
+#endif	/* defined(HASMSDOSFS) */
+
+		    case MFSNODE:
+			Lf->sz = (SZOFFTYPE)m.mfs_size;
+			Lf->sz_def = 1;
+			break;
+
+#if	defined(HASEXT2FS)
+		    case EXT2NODE:
+# if	defined(HASI_E2FS_PTR)
+			if (edp) {
+			    Lf->sz = (SZOFFTYPE)edp->e2di_size;
+			    Lf->sz_def = 1;
+			}
+# else	/* !defined(HASI_E2FS_PTR) */
+			Lf->sz = (SZOFFTYPE)i.i_e2fs_size;
+			Lf->sz_def = 1;
+# endif	/* defined(HASI_E2FS_PTR) */
+			break;
+#endif	/* defined(HASEXT2FS) */
+
+		    }
+		} else if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		break;
+	    }
+	}
+/*
+ * Record the link count.
+ */
+	if (Fnlink) {
+	    switch(Ntype) {
+
+#if	defined(HAS9660FS)
+	    case N_CDFS:
+		if (iso_stat) {
+		    Lf->nlink = iso_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* defined(HAS9660FS) */
+
+#if	defined(HASKERNFS)
+	    case N_KERN:
+		if (ksbs) {
+		    Lf->nlink = (long)ksb.st_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* defined(HASKERNFS) */
+
+	    case N_NFS:
+		if (nty == NFSNODE) {
+		    Lf->nlink = (long)NVATTR.va_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+	    case N_REGLR:
+		switch (nty) {
+		case INODE:
+
+#if	defined(HASEFFNLINK)
+		    Lf->nlink = (long)i.HASEFFNLINK;
+#else	/* !defined(HASEFFNLINK) */
+# if	defined(HASI_FFS)
+		    Lf->nlink = (long)i.i_ffs_nlink;
+# else	/* !defined(HASI_FFS) */
+#  if	defined(HASI_FFS1)
+		    if (ffs == 1) {
+			if (u1s)
+			    Lf->nlink = (long)u1.di_nlink;
+		    } else if (ffs == 2) {
+			if (u2s)
+			    Lf->nlink = (long)u2.di_nlink;
+		    }
+#  else	/* !defined(HASI_FFS1) */
+
+		    Lf->nlink = (long)i.i_nlink;
+#  endif	/* defined(HASI_FFS1) */
+# endif	/* defined(HASI_FFS) */
+#endif	/* defined(HASEFFNLINK) */
+
+		    Lf->nlink_def = 1;
+		    break;
+
+#if	defined(HASMSDOSFS)
+		case DOSNODE:
+		    Lf->nlink = (long)d.de_refcnt;
+		    Lf->nlink_def = 1;
+		    break;
+#endif	/* defined(HASMSDOSFS) */
+
+#if	defined(HASEXT2FS)
+		case EXT2NODE:
+# if	defined(HASI_E2FS_PTR)
+		    if (edp) {
+			Lf->nlink = (long)edp->e2di_nlink;
+			Lf->nlink_def = 1;
+		    }
+# else	/* !defined(HASI_E2FS_PTR) */
+		    Lf->nlink = (long)i.i_e2fs_nlink;
+		    Lf->nlink_def = 1;
+# endif	/* defined(HASI_E2FS_PTR) */
+
+		    break;
+	
+#endif	/* defined(HASEXT2FS) */
+		
+		}
+		break;
+	    }
+	    if (Lf->nlink_def && Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+
+#if	defined(HASNULLFS)
+/*
+ * If there is a saved nullfs vfs pointer, propagate its device number.
+ */
+	if (nvfs) {
+
+# if	defined(HASSTATVFS)
+	    dev = nvfs->fsid.__fsid_val[0];
+# else	/* !defined(HASSTATVFS) */
+	    dev = nvfs->fsid.val[0];
+# endif	/* defined(HASSTATVFS) */
+
+	    devs = 1;
+	}
+#endif	/* defined(HASNULLFS) */
+
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    Lf->fsdir = vfs->dir;
+	    Lf->fsdev = vfs->fsname;
+	}
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	Lf->dev = dev;
+	Lf->dev_def = devs;
+	Lf->rdev = rdev;
+	Lf->rdev_def = rdevs;
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	    ty = "VREG";
+	    break;
+	case VDIR:
+	    ty = "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif	/* defined(VSOCK) */
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    ty = "FIFO";
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+/*
+ * Handle some special cases:
+ *
+ * 	ioctl(fd, TIOCNOTTY) files;
+ *	/kern files
+ *	memory node files;
+ *	/proc files;
+ *	ptyfs files.
+ */
+
+	if (type == VBAD)
+	    (void) snpf(Namech, Namechl, "(revoked)");
+	else if (nty == MFSNODE) {
+	    Lf->dev_def = Lf->rdev_def = 0;
+	    (void) snpf(Namech, Namechl, "%#x", m.mfs_baseoff);
+	    enter_dev_ch("memory");
+	}
+
+#if	defined(HASPROCFS)
+	else if (nty == PFSNODE) {
+	    Lf->dev_def= Lf->rdev_def = 0;
+	    ty = NULL;
+	    (void) snpf(Namech, Namechl, "/%s", HASPROCFS);
+	    switch (p.pfs_type) {
+	    case Proot:
+		ty = "PDIR";
+		break;
+	    case Pcurproc:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/curproc");
+		ty = "PCUR";
+		break;
+	    case Pproc:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d", p.pfs_pid);
+		ty = "PDIR";
+		break;
+	    case Pfile:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/file", p.pfs_pid);
+		ty = "PFIL";
+		break;
+	    case Pmem:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/mem", p.pfs_pid);
+		ty = "PMEM";
+		break;
+	    case Pregs:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/regs", p.pfs_pid);
+		ty = "PREG";
+		break;
+	    case Pfpregs:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/fpregs", p.pfs_pid);
+		ty = "PFPR";
+		break;
+	    case Pctl:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/ctl", p.pfs_pid);
+		ty = "PCTL";
+		break;
+	    case Pstatus:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/status", p.pfs_pid);
+		ty = "PSTA";
+		break;
+	    case Pnote:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/note", p.pfs_pid);
+		ty = "PNTF";
+		break;
+	    case Pnotepg:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/notepg", p.pfs_pid);
+		ty = "PGID";
+		break;
+
+# if	defined(Pfd)
+	    case Pfd:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/fd", p.pfs_pid);
+		ty = "PFD";
+		break;
+# endif	/* defined(Pfd) */
+
+# if	defined(Pmap)
+	    case Pmap:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/map", p.pfs_pid);
+		ty = "PMAP";
+		break;
+# endif	/* defined(Pmap) */
+
+# if	defined(Pmaps)
+	    case Pmaps:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%d/maps", p.pfs_pid);
+		ty = "PMPS";
+		break;
+# endif	/* defined(Pmaps) */
+
+	    }
+	    if (ty)
+		(void) snpf(Lf->type, sizeof(Lf->type), ty);
+	}
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HASPTYFS)
+	else if (nty == PTYFSNODE) {
+	    (void) snpf(Namech, Namechl, "%s", Lf->fsdir);
+	    Lf->nlink = 1;
+	    Lf->nlink_def = 1;
+	    switch (pt.ptyfs_type) {
+	    case PTYFSpts:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%lu", (unsigned long)pt.ptyfs_pty);
+		break;
+	    case PTYFSptc:
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "/%lu (master)",
+		    (unsigned long)pt.ptyfs_pty);
+		break;
+	    case PTYFSroot:
+		Lf->sz = 512;
+		Lf->sz_def = 1;
+		break;
+	    }
+	    if (ty)
+		(void) snpf(Lf->type, sizeof(Lf->type), ty);
+	}
+#endif	/* defined(HASPTYFS) */
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+
+#if	defined(HASPROCFS)
+	if (Ntype == N_PROC) {
+	    if (Procsrch) {
+		Procfind = 1;
+		Lf->sf |= SELNM;
+	    } else if (nty == PFSNODE) {
+		for (pfi = Procfsid; pfi; pfi = pfi->next) {
+		    if ((pfi->pid && pfi->pid == p.pfs_pid)
+		    
+# if	defined(HASPINODEN)
+		    ||  ((Lf->inp_ty == 1) && (pfi->inode == Lf->inode))
+# endif	/* defined(HASPINODEN) */
+
+		    ) {
+			pfi->f = 1;
+			if (Namech[0] && pfi->nm)
+			    (void) snpf(Namech, Namechl, "%s", pfi->nm);
+			Lf->sf |= SELNM;
+			break;
+		    }
+		}
+	    }
+	} else
+#endif	/* defined(HASPROCFS) */
+
+	{
+	    if (Namech[0]) {
+		enter_nm(Namech);
+		ns = 1;
+	    } else
+		ns = 0;
+	    if (Sfile && is_file_named((char *)NULL,
+				       ((type == VCHR) || (type == VBLK)) ? 1
+									  : 0))
+	    {
+		Lf->sf |= SELNM;
+	    }
+	    if (ns)
+		Namech[0] = '\0';
+	}
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+#if	defined(HAS_SYS_PIPEH)
+/*
+ * process_pipe() - process a file structure whose type is DTYPE_PIPE
+ */
+
+void
+process_pipe(pa)
+	KA_T pa;			/* pipe structure kernel address */
+{
+	char *ep;
+	struct pipe p;
+	size_t sz;
+
+	if (!pa || kread((KA_T)pa, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl,
+		"can't read DTYPE_PIPE pipe struct: %#s",
+		print_kptr(pa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	(void) snpf(Lf->type, sizeof(Lf->type), "PIPE");
+	enter_dev_ch(print_kptr(pa, (char *)NULL, 0));
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    Lf->sz = (SZOFFTYPE)p.pipe_buffer.size;
+	    Lf->sz_def = 1;
+	}
+	if (p.pipe_peer)
+	    (void) snpf(Namech, Namechl, "->%s",
+		print_kptr((KA_T)p.pipe_peer, (char *)NULL, 0));
+	else
+	    Namech[0] = '\0';
+	if (p.pipe_buffer.cnt) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", cnt=%d", p.pipe_buffer.cnt);
+	}
+	if (p.pipe_buffer.in) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", in=%d", p.pipe_buffer.in);
+	}
+	if (p.pipe_buffer.out) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, ", out=%d", p.pipe_buffer.out);
+	}
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+#endif	/* defined(HAS_SYS_PIPEH) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dnode1.c
new file mode 100644
index 0000000..55a1c30
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dnode1.c
@@ -0,0 +1,95 @@
+/*
+ * dnode1.c - NetBSD and OpenBSD node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.8 2005/08/08 19:53:24 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	defined(HAS9660FS)
+/*
+ * Undo some conflicting node header file definitions.
+ */
+
+#undef	doff_t
+#undef	i_dev
+#undef	i_devvp
+#undef	i_number
+#undef	IN_ACCESS
+#undef	IN_LOCKED
+#undef	i_size
+#undef	IN_WANTED
+
+
+/*
+ * At last, #include the desired header files.
+ */
+
+# if	HAS9660FS==1
+#include <isofs/cd9660/iso.h>
+#include <isofs/cd9660/cd9660_node.h>
+# else	/* HAS9660FS!=1 */
+#include <fs/cd9660/iso.h>
+#include <fs/cd9660/cd9660_node.h>
+# endif	/* HAS9660FS==1 */
+
+
+/*
+ * read_iso_node() -- read CD 9660 iso_node
+ */
+
+int
+read_iso_node(v, d, ino, nl, sz)
+	struct vnode *v;		/* containing vnode */
+	dev_t *d;			/* returned device number */
+	INODETYPE *ino;			/* returned inode number */
+	long *nl;			/* returned link count */
+	SZOFFTYPE *sz;			/* returned size */
+{
+	struct iso_node i;
+
+	if (!v->v_data
+	||  kread((KA_T)v->v_data, (char *)&i, sizeof(i)))
+	    return(1);
+	*d = i.i_dev;
+	*ino = (INODETYPE)i.i_number;
+	*nl = i.inode.iso_links;
+	*sz = (SZOFFTYPE)i.i_size;
+	return(0);
+}
+#endif	/* defined(HAS9660FS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dproc.c
new file mode 100644
index 0000000..2cf532b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dproc.c
@@ -0,0 +1,584 @@
+/*
+ * dproc.c - NetBSD and OpenBSD process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.17 2005/05/11 12:53:54 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+_PROTOTYPE(static void enter_vn_text,(KA_T va, int *n));
+_PROTOTYPE(static void get_kernel_access,(void));
+_PROTOTYPE(static void process_text,(KA_T vm));
+
+
+/*
+ * Local static values
+ */
+
+static MALLOC_S Nv = 0;			/* allocated Vp[] entries */
+static KA_T *Vp = NULL;			/* vnode address cache */
+
+
+/*
+ * ckkv - check kernel version
+ */
+
+void
+ckkv(d, er, ev, ea)
+	char *d;			/* dialect */
+	char *er;			/* expected release */
+	char *ev;			/* expected version */
+	char *ea;			/* expected architecture */
+{
+
+#if	defined(HASKERNIDCK)
+	size_t l;
+	int m[2];
+	char v[64];
+
+	if (Fwarn)
+	    return;
+/*
+ * Read kernel version.
+ */
+	m[0] = CTL_KERN;
+	m[1] = KERN_OSRELEASE;
+	l = sizeof(v);
+	if (sysctl(m, 2, v, &l, NULL, 0) < 0) {
+	    (void) fprintf(stderr, "%s: CTL_KERN, KERN_OSRELEASE: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	}
+/*
+ * Warn if the actual and expected releases don't match.
+ */
+	if (!er || strcmp(v, er))
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s release %s; this is %s.\n",
+		Pn, d, er ? er : "UNKNOWN", v);
+#endif	/* defined(HASKERNIDCK) */
+
+}
+
+
+/*
+ * enter_vn_text() - enter a vnode text reference
+ */
+
+static void
+enter_vn_text(va, n)
+	KA_T va;			/* vnode address */
+	int *n;				/* Vp[] entries in use */
+{
+	int i;
+/*
+ * Ignore the request if the vnode has already been entered.
+ */
+	for (i = 0; i < *n; i++) {
+	    if (va == Vp[i])
+		return;
+	}
+/*
+ * Save the text file information.
+ */
+	alloc_lfile(" txt", -1);
+	Cfp = (struct file *)NULL;
+	process_node((KA_T)va);
+	if (Lf->sf)
+	    link_lfile();
+	if (i >= Nv) {
+
+	/*
+	 * Allocate space for remembering the vnode.
+	 */
+	    Nv += 10;
+	    if (!Vp)
+		Vp=(KA_T *)malloc((MALLOC_S)(sizeof(struct vnode *) * 10));
+	    else
+		Vp=(KA_T *)realloc((MALLOC_P *)Vp,(MALLOC_S)(Nv*sizeof(KA_T)));
+	    if (!Vp) {
+		(void) fprintf(stderr, "%s: no txt ptr space, PID %d\n",
+		    Pn, Lp->pid);
+		Exit(1);
+	    }
+	}
+/*
+ * Remember the vnode.
+ */
+	Vp[*n] = va;
+	(*n)++;
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	struct filedesc fd;
+	int i, nf;
+	MALLOC_S nb;
+	static struct file **ofb = NULL;
+	static int ofbb = 0;
+	short pss, sf;
+	int px;
+	uid_t uid;
+
+#if	defined(HASCWDINFO)
+	struct cwdinfo cw;
+#define	CDIR	cw.cwdi_cdir
+#define	RDIR	cw.cwdi_rdir
+#else	/* !defined(HASCWDINFO) */
+#define	CDIR	fd.fd_cdir
+#define	RDIR	fd.fd_rdir
+#endif	/* defined(HASCWDINFO) */
+
+#if	defined(HASFSTRUCT)
+	static char *pof = (char *)NULL;
+	static int pofb = 0;
+#endif	/* defined(HASFSTRUCT) */
+
+#if	defined(HASKVMGETPROC2)
+	struct kinfo_proc2 *p;
+#define	KVMPROCSZ2	sizeof(struct kinfo_proc2)
+#else	/* !defined(HASKVMGETPROC2) */
+	struct kinfo_proc *p;
+#endif	/* defined(HASKVMGETPROC2) */
+
+/*
+ * Read the process table.
+ */
+
+#if	defined(HASKVMGETPROC2)
+	P = kvm_getproc2(Kd, KERN_PROC_ALL, 0, KVMPROCSZ2, &Np);
+#else	/* !defined(HASKVMGETPROC2) */
+	P = kvm_getprocs(Kd, KERN_PROC_ALL, 0, &Np);
+#endif	/* defined(HASKVMGETPROC2) &/
+
+	if (!P) {
+	    (void) fprintf(stderr, "%s: can't read process table: %s\n",
+		Pn, kvm_geterr(Kd));
+	    Exit(1);
+	}
+/*
+ * Examine proc structures and their associated information.
+ */
+
+	for (p = P, px = 0; px < Np; px++, p++) {
+	    if (p->P_STAT == 0 || p->P_STAT == SZOMB)
+		continue;
+	/*
+	 * Read process information, process group structure (if
+	 * necessary), and User ID (if necessary).
+	 *
+	 * See if process is excluded.
+	 *
+	 * Read file structure pointers.
+	 */
+	    uid = p->P_UID;
+	    if (is_proc_excl((int)p->P_PID, (int)p->P_PGID, (UID_ARG)uid,
+		&pss, &sf))
+	    {
+		continue;
+	    }
+	    if (!p->P_FD
+	    ||  kread((KA_T)p->P_FD, (char *)&fd, sizeof(fd)))
+		continue;
+	    if (!fd.fd_refcnt || fd.fd_lastfile > fd.fd_nfiles)
+		continue;
+
+#if	defined(HASCWDINFO)
+	    if (!p->P_CWDI
+	    ||  kread((KA_T)p->P_CWDI, (char *)&cw, sizeof(cw)))
+		CDIR = RDIR = (struct vnode *)NULL;
+#endif	/* defined(HASCWDINFO) */
+
+	/*
+	 * Allocate a local process structure.
+	 */
+	    if (is_cmd_excl(p->P_COMM, &pss, &sf))
+		continue;
+	    alloc_lproc((int)p->P_PID, (int)p->P_PGID, (int)p->P_PPID,
+		(UID_ARG)uid, p->P_COMM, (int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	    Kpa = (KA_T)p->P_ADDR;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (CDIR) {
+		alloc_lfile(CWD, -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)CDIR);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (RDIR) {
+		alloc_lfile(RTD, -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)RDIR);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+
+#if	defined(OPENBSDV) && OPENBSDV>=3020
+	/*
+	 * Save trace node information.
+	 */
+	    if (p->P_TRACEP) {
+		alloc_lfile("tr", -1);
+		Cfp = (struct file *)NULL;
+		process_node((KA_T)p->P_TRACEP);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+#endif	/* defined(OPENBSDV) && OPENBSDV>=3020 */
+
+	/*
+	 * Save information on the text file.
+	 */
+	    if (p->P_VMSPACE)
+		process_text((KA_T)p->P_VMSPACE);
+	/*
+	 * Read open file structure pointers.
+	 */
+	    if (!fd.fd_ofiles || (nf = fd.fd_nfiles) <= 0)
+		continue;
+	    nb = (MALLOC_S)(sizeof(struct file *) * nf);
+	    if (nb > ofbb) {
+		if (!ofb)
+		    ofb = (struct file **)malloc(nb);
+		else
+		    ofb = (struct file **)realloc((MALLOC_P *)ofb, nb);
+		if (!ofb) {
+		    (void) fprintf(stderr, "%s: PID %d, no file * space\n",
+			Pn, p->P_PID);
+		    Exit(1);
+		}
+		ofbb = nb;
+	    }
+	    if (kread((KA_T)fd.fd_ofiles, (char *)ofb, nb))
+		continue;
+
+#if	defined(HASFSTRUCT)
+	    if (Fsv & FSV_FG) {
+		nb = (MALLOC_S)(sizeof(char) * nf);
+		if (nb > pofb) {
+		    if (!pof)
+			pof = (char *)malloc(nb);
+		    else
+			pof = (char *)realloc((MALLOC_P *)pof, nb);
+		    if (!pof) {
+			(void) fprintf(stderr,
+			    "%s: PID %d, no file flag space\n", Pn, p->P_PID);
+		        Exit(1);
+		    }
+		    pofb = nb;
+		}
+		if (!fd.fd_ofileflags || kread((KA_T)fd.fd_ofileflags, pof, nb))
+		    zeromem(pof, nb);
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Save information on file descriptors.
+	 */
+	    for (i = 0; i < nf; i++) {
+		if (ofb[i]) {
+		    alloc_lfile(NULL, i);
+		    process_file((KA_T)(Cfp = ofb[i]));
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG)
+			    Lf->pof = (long)pof[i];
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+	KA_T v;
+/*
+ * Check kernel version.
+ */
+	(void) ckkv(
+
+#if	defined(NETBSDV)
+		    "NetBSD",
+#else	/* !defined(NETBSDV) */
+# if	defined(OPENBSDV)
+		    "OpenBSD",
+# endif	/* defined(OPENBSDV) */
+#endif	/* defined(NETBSDV) */
+
+		    LSOF_VSTR, (char *)NULL, (char *)NULL);
+/*
+ * Set name list file path.
+ */
+	if (!Nmlst)
+
+#if	defined(N_UNIX)
+	    Nmlst = N_UNIX;
+#else	/* !defined(N_UNIX) */
+	{
+	    if (!(Nmlst = get_nlist_path(1))) {
+		(void) fprintf(stderr,
+		    "%s: can't get kernel name list path\n", Pn);
+		Exit(1);
+	    }
+	}
+#endif	/* defined(N_UNIX) */
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory and name list files are readable.
+ */
+	if ((Memory && !is_readable(Memory, 1))
+	||  (Nmlst && !is_readable(Nmlst, 1)))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open kernel memory access.
+ */
+	if ((Kd = kvm_openfiles(Nmlst, Memory, NULL, O_RDONLY, NULL)) == NULL) {
+	    (void) fprintf(stderr,
+		"%s: kvm_openfiles(execfile=%s, corefile=%s): %s\n",
+		Pn, Nmlst,
+		Memory ? Memory :
+
+#if	defined(_PATH_MEM)
+				  _PATH_MEM,
+#else	/* !defined(_PATH_MEM) */
+				  "default",
+#endif	/* defined(_PATH_MEM) */
+
+		strerror(errno));
+	    Exit(1);
+	}
+	(void) build_Nl(Drive_Nl);
+	if (kvm_nlist(Kd, Nl) < 0) {
+	    (void) fprintf(stderr, "%s: can't read namelist from %s\n",
+		Pn, Nmlst);
+	    Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Read the kernel's page shift amount, if possible.
+ */
+	if (get_Nl_value("pgshift", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&pgshift, sizeof(pgshift)))
+	    pgshift = 0;
+}
+
+
+#if	!defined(N_UNIX)
+/*
+ * get_nlist_path() - get kernel name list path
+ */
+
+char *
+get_nlist_path(ap)
+	int ap;				/* on success, return an allocated path
+					 * string pointer if 1; return a
+					 * constant character pointer if 0;
+					 * return NULL if failure */
+{
+	const char *bf;
+	static char *bfc;
+	MALLOC_S bfl;
+/*
+ * Get bootfile name.
+ */
+	if ((bf = getbootfile())) {
+	    if (!ap)
+		return("");
+	    bfl = (MALLOC_S)(strlen(bf) + 1);
+	    if (!(bfc = (char *)malloc(bfl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for boot file path: %s\n",
+		    Pn, bfl, bf);
+		Exit(1);
+	    }
+	    (void) snpf(bfc, bfl, "%s", bf);
+	    return(bfc);
+	}
+	return((char *)NULL);
+}
+#endif	/* !defined(N_UNIX) */
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	br = kvm_read(Kd, (u_long)addr, buf, len);
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * process_text() - process text information
+ */
+void
+process_text(vm)
+	KA_T vm;				/* kernel vm space pointer */
+{
+	int i, j;
+	KA_T ka;
+	int n = 0;
+	struct vm_map_entry vmme, *e;
+	struct vmspace vmsp;
+
+#if	!defined(UVM)
+	struct pager_struct pg;
+	struct vm_object vmo;
+#endif	/* !defined(UVM) */
+
+/*
+ * Read the vmspace structure for the process.
+ */
+	if (kread(vm, (char *)&vmsp, sizeof(vmsp)))
+	    return;
+/*
+ * Read the vm_map structure.  Search its vm_map_entry structure list.
+ */
+
+#if	!defined(UVM)
+	if (!vmsp.vm_map.is_main_map)
+	    return;
+#endif	/* !defined(UVM) */
+
+	for (i = 0; i < vmsp.vm_map.nentries; i++) {
+
+	/*
+	 * Read the next vm_map_entry.
+	 */
+	    if (!i)
+		e = &vmsp.vm_map.header;
+	    else {
+		if (!(ka = (KA_T)e->next))
+		    return;
+		e = &vmme;
+		if (kread(ka, (char *)e, sizeof(vmme)))
+		    return;
+	    }
+
+#if	defined(UVM)
+	/*
+	 * Process the uvm_obj pointer of a UVM map entry with a UVM_ET_OBJ
+	 * type as a vnode pointer.
+	 */
+	    if ((e->etype > UVM_ET_OBJ) && e->object.uvm_obj)
+		(void) enter_vn_text((KA_T)e->object.uvm_obj, &n);
+#else	/* !defined(UVM) */
+	/*
+	 * Read the map entry's object and the object's shadow.
+	 * Look for a PG_VNODE pager handle.
+	 */
+	    if (e->is_a_map || e->is_sub_map)
+		continue;
+	    for (j = 0, ka = (KA_T)e->object.vm_object;
+		 j < 2 && ka;
+		 j++, ka = (KA_T)vmo.shadow)
+	    {
+		if (kread(ka, (char *)&vmo, sizeof(vmo)))
+		    break;
+		if (!(ka = (KA_T)vmo.pager)
+		||   kread(ka, (char *)&pg, sizeof(pg)))
+		    continue;
+		if (!pg.pg_handle || pg.pg_type != PG_VNODE)
+		    continue;
+		(void) enter_vn_text((KA_T)pg.pg_handle, &n);
+	    }
+#endif	/* defined(UVM) */
+
+	}
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dproto.h
new file mode 100644
index 0000000..d94627f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dproto.h
@@ -0,0 +1,55 @@
+/*
+ * dproto.h - NetBSD and OpenBSD function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.11 2005/08/08 19:53:24 abe Exp $
+ */
+
+
+#if	!defined(N_UNIX)
+_PROTOTYPE(extern char *get_nlist_path,(int ap));
+#endif	/* !defined(N_UNIX) */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern struct l_vfs *readvfs,(KA_T vm));
+
+#if	defined(HAS_SYS_PIPE_H)
+_PROTOTYPE(extern void process_pipe,(KA_T pa));
+#endif	/* defined(HAS_SYS_PIPEH) */
+
+#if	defined(HAS9660FS)
+_PROTOTYPE(extern int read_iso_node,(struct vnode *v, dev_t *d, INODETYPE *ino, long *nl, SZOFFTYPE *sz));
+#endif	/* defined(HAS9660FS) */
+
+_PROTOTYPE(extern void process_socket,(KA_T sa));
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dsock.c
new file mode 100644
index 0000000..0e10971
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dsock.c
@@ -0,0 +1,425 @@
+/*
+ * dsock.c - NetBSD and OpenBSD socket processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.25 2005/08/08 19:53:24 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	defined(HASIPv6)
+
+/*
+ * IPv6_2_IPv4()  -- macro to define the address of an IPv4 address contained
+ *		     in an IPv6 address
+ */
+
+#define IPv6_2_IPv4(v6)	(((uint8_t *)((struct in6_addr *)v6)->s6_addr)+12)
+#endif	/* defined(HASIPv6) */
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	struct domain d;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam;
+	int fp, lp;
+	struct inpcb inp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct protosw p;
+	struct socket s;
+	struct tcpcb t;
+	KA_T ta = (KA_T)NULL;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = NULL;
+	struct sockaddr_un un;
+
+#if	defined(HASIPv6) && defined(NETBSDV) && !defined(HASINRIAIPv6)
+	struct in6pcb in6p;
+#endif	/* defined(HASIPv6) && defined(NETBSDV) && !defined(HASINRIAIPv6) */
+
+#define	UNPADDR_IN_MBUF
+
+#if	defined(NETBSDV)
+# if	NETBSDV>=1004000
+#undef	UNPADDR_IN_MBUF
+# endif	/* NETBSDV>=1004000 */
+#endif	/* defined(NETBSDV) */
+
+#if	defined(UNPADDR_IN_MBUF)
+	struct mbuf mb;
+#endif	/* defined(UNPADDR_IN_MBUF) */
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read the socket, protocol, and domain structures.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread(sa, (char *) &s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket struct from %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_type) {
+	    enter_nm("no socket type");
+	    return;
+	}
+	if (!s.so_proto
+	||  kread((KA_T)s.so_proto, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "can't read protocol switch from %s",
+		print_kptr((KA_T)s.so_proto, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!p.pr_domain
+	||  kread((KA_T)p.pr_domain, (char *)&d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Save size information.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rq = s.so_rcv.sb_cc;
+	Lf->lts.sq = s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.ltm = (unsigned int)s.so_linger;
+	Lf->lts.opt = (unsigned int)s.so_options;
+	Lf->lts.pqlen = (unsigned int)s.so_q0len;
+	Lf->lts.qlen = (unsigned int)s.so_qlen;
+	Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+	Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = (unsigned int)s.so_state;
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	switch ((fam = d.dom_family)) {
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+
+#if	defined(HASIPv6)
+	case AF_INET6:
+#endif	/* defined(HASIPv6) */
+
+	    if (Fnet) {
+		if (!FnetTy
+		||  ((FnetTy == 4) && (fam == AF_INET))
+
+#if	defined(HASIPv6)
+		||  ((FnetTy == 6) && (fam == AF_INET6))
+#endif	/* defined(HASIPv6) */
+		)
+
+		    Lf->sf |= SELNET;
+	    }
+	    printiproto(p.pr_protocol);
+
+#if	defined(HASIPv6)
+	    (void) snpf(Lf->type, sizeof(Lf->type),
+		(fam == AF_INET) ? "IPv4" : "IPv6");
+#else	/* !defined(HASIPv6) */
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+#if	defined(HASIPv6) && defined(NETBSDV) && !defined(HASINRIAIPv6)
+	    if (fam == AF_INET6) {
+
+	    /*
+	     * Read IPv6 protocol control block.
+	     */
+		if (!s.so_pcb
+		||  kread((KA_T)s.so_pcb, (char *)&in6p, sizeof(in6p))) {
+		    (void) snpf(Namech, Namechl, "can't read in6pcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    /*
+	     * Save IPv6 address information.
+	     */
+		enter_dev_ch(print_kptr((KA_T)(in6p.in6p_ppcb ? in6p.in6p_ppcb
+							      : s.so_pcb),
+					       (char *)NULL, 0));
+		if (p.pr_protocol == IPPROTO_TCP)
+		    ta = (KA_T)in6p.in6p_ppcb;
+	        la = (unsigned char *)&in6p.in6p_laddr;
+	        lp = (int)ntohs(in6p.in6p_lport);
+		if (!IN6_IS_ADDR_UNSPECIFIED(&in6p.in6p_faddr)
+		||  in6p.in6p_fport)
+		{
+		    fa = (unsigned char *)&in6p.in6p_faddr;
+		    fp = (int)ntohs(in6p.in6p_fport);
+		}
+	    } else
+#endif	/* defined(HASIPv6) && defined(NETBSDV) && !defined(HASINRIAIPv6) */
+
+	    {
+
+	    /*
+	     * Read IPv4 or IPv6 (OpenBSD) protocol control block.
+	     */
+		if (!s.so_pcb
+		||  kread((KA_T)s.so_pcb, (char *)&inp, sizeof(inp))) {
+		    if (!s.so_pcb) {
+			(void) snpf(Namech, Namechl, "no PCB%s%s",
+			    (s.so_state & SS_CANTSENDMORE) ? ", CANTSENDMORE"
+							   : "",
+			    (s.so_state & SS_CANTRCVMORE) ? ", CANTRCVMORE"
+							  : "");
+		    } else {
+			(void) snpf(Namech, Namechl, "can't read inpcb at %s",
+			    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    }
+		    enter_nm(Namech);
+		    return;
+		}
+		enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
+							    : s.so_pcb),
+					       (char *)NULL, 0));
+		if (p.pr_protocol == IPPROTO_TCP)
+		    ta = (KA_T)inp.inp_ppcb;
+		lp = (int)ntohs(inp.inp_lport);
+		if (fam == AF_INET) {
+
+		/*
+		 * Save IPv4 address information.
+		 */
+		    la = (unsigned char *)&inp.inp_laddr;
+		    if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport) {
+			fa = (unsigned char *)&inp.inp_faddr;
+			fp = (int)ntohs(inp.inp_fport);
+		    }
+		}
+
+#if	defined(HASIPv6) && (defined(OPENBSDV) || defined(HASINRIAIPv6))
+		else {
+		    la = (unsigned char *)&inp.inp_laddr6;
+		    if (!IN6_IS_ADDR_UNSPECIFIED(&inp.inp_faddr6)
+		    ||  inp.inp_fport)
+		    {
+			fa = (unsigned char *)&inp.inp_faddr6;
+			fp = (int)ntohs(inp.inp_fport);
+		    }
+		}
+#endif	/* defined(HASIPv6) && (defined(OPENBSDV) || defined(HASINRIAIPv6)) */
+
+	    }
+
+#if	defined(HASIPv6)
+	    if ((fam == AF_INET6)
+	    &&  ((la && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la))
+	    ||  ((fa && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)fa))))) {
+
+	    /*
+	     * Adjust for IPv4 addresses mapped in IPv6 addresses.
+	     */
+		if (la)
+		    la = (unsigned char *)IPv6_2_IPv4(la);
+		if (fa)
+		    fa = (unsigned char *)IPv6_2_IPv4(fa);
+		fam = AF_INET;
+	    }
+#endif	/* defined(HASIPv6) */
+
+	/*
+	 * Enter local and remote addresses by address family.
+	 */
+	    if (fa || la)
+		(void) ent_inaddr(la, lp, fa, fp, fam);
+	/*
+	 * If the protocol is TCP, and its address is available, read the
+	 * TCP protocol control block and save its state.
+	 */
+	    if (ta && !kread(ta, (char *)&t, sizeof(t))) {
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)t.t_state;
+
+#if	defined(HASTCPOPT)
+# if	defined(OPENBSDV)
+		Lf->lts.mss = (unsigned long)t.t_maxseg;
+# else	/* !defined(OPENSDV) */
+		Lf->lts.mss = (unsigned long)t.t_ourmss;
+# endif	/* defined(OPENSDV) */
+
+		Lf->lts.msss = (unsigned char)1;
+		Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	    }
+	    break;
+/*
+ * Process a ROUTE domain socket.
+ */
+	case AF_ROUTE:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "rte");
+	    if (s.so_pcb)
+		enter_dev_ch(print_kptr((KA_T)(s.so_pcb), (char *)NULL, 0));
+	    else
+		(void) snpf(Namech, Namechl, "no protocol control block");
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    break;
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    if (kread((KA_T) s.so_pcb, (char *) &unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+	    if (unp.unp_addr) {
+
+#if	defined(UNPADDR_IN_MBUF)
+		if (kread((KA_T)unp.unp_addr, (char *)&mb, sizeof(mb)))
+#else	/* !defined(UNPADDR_IN_MBUF) */
+		if (kread((KA_T)unp.unp_addr, (char *)&un, sizeof(un)))
+#endif	/* defined(UNPADDR_IN_MBUF) */
+
+		{
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+
+#if	defined(UNPADDR_IN_MBUF)
+		if (mb.m_hdr.mh_len == sizeof(struct sockaddr_un))
+		    ua = (struct sockaddr_un *) ((char *) &mb
+		       + (mb.m_hdr.mh_data - (caddr_t) unp.unp_addr));
+#else	/* !defined(UNPADDR_IN_MBUF) */
+		ua = &un;
+#endif	/* defined(UNPADDR_IN_MBUF) */
+
+	    }
+	    if (!ua) {
+		ua = &un;
+		(void) bzero((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *)&uc, sizeof(uc)))
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			else
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)uc.unp_socket,(char *)NULL,0));
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	    if (ua->sun_path[0]) {
+
+#if	defined(UNPADDR_IN_MBUF)
+		if (mb.m_len >= sizeof(struct sockaddr_un))
+		    mb.m_len = sizeof(struct sockaddr_un) - 1;
+		*((char *)ua + mb.m_len) = '\0';
+#else	/* !defined(UNPADDR_IN_MBUF) */
+		ua->sun_path[sizeof(ua->sun_path) - 1] = '\0';
+#endif	/* defined(UNPADDR_IN_MBUF) */
+
+		if (Sfile && is_file_named(ua->sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (!Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dstore.c
new file mode 100644
index 0000000..3205c79
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/dstore.c
@@ -0,0 +1,132 @@
+/*
+ * dstore.c - NetBSD and OpenBSD global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.9 2004/12/30 18:42:24 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+struct file *Cfp;		/* current file's file struct pointer */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+
+#if	(defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000)
+	{ X_NCACHE,	"_nchashtbl",	},
+	{ X_NCSIZE,	"_nchash"	},
+#else	/* (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) */
+# if	defined(NetBSD1_0) && NetBSD<1994101
+	{ X_NCACHE,	"_nchhead",	},
+# else	/* !defined(NetBSD1_0) || NetBSD>=1994101 */
+	{ X_NCACHE,	"_nclruhead"	},
+# endif	/* defined(NetBSD1_0) && NetBSD<1994101 */
+
+	{ X_NCSIZE,	"_numcache"	},
+#endif	/* (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) */
+
+	{ "pgshift",	"_pgshift"	},
+	{ "",		""		},
+	{ NULL,		NULL		}
+};
+
+kvm_t *Kd;			/* kvm descriptor */
+KA_T Kpa;			/* kernel proc struct address */
+
+struct l_vfs *Lvfs = NULL;	/* local vfs structure table */
+
+int Np = 0;			/* number of kernel processes */
+
+#if	defined(HASKVMGETPROC2)
+struct kinfo_proc2 *P = NULL;	/* local process table copy */
+#else	/* !defined(HASKVMGETPROC2) */
+struct kinfo_proc *P = NULL;	/* local process table copy */
+#endif	/* defined(HASKVMGETPROC2) */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FASYNC,		FF_ASYNC	},
+
+# if	defined(FDSYNC)
+	{ (long)FDSYNC,		FF_DSYNC	},
+# endif	/* defined*FDSYNC) */
+
+	{ (long)FFSYNC,		FF_FSYNC	},
+
+# if	defined(FRSYNC)
+	{ (long)FRSYNC,		FF_RSYNC	},
+# endif	/* defined(FRSYNC( */
+
+	{ (long)FMARK,		FF_MARK		},
+	{ (long)FDEFER,		FF_DEFER	},
+	{ (long)FHASLOCK,	FF_HASLOCK	},
+	{ (long)O_NOCTTY,	FF_NOCTTY	},
+	{ (long)0,		NULL 		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,	POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
+
+int pgshift = 0;		/* kernel's page shift */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+obsd/machine.h b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/machine.h
new file mode 100644
index 0000000..20e2ce9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+obsd/machine.h
@@ -0,0 +1,623 @@
+/*
+ * machine.h - NetBSD and OpenBSD definitions 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: machine.h,v 1.39 2010/07/29 16:02:52 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+/* #define	HASFSINO	1 */
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+#define	HASINODE	1
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+# if	defined(HAS_SYS_PIPEH)
+#define	HASPIPEFN	process_pipe
+# endif	/* defined(HAS_SYS_PIPEH) */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev?	*/
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.  For FreeBSD, NetBSD,
+ * and OpenBSD the lsof Configure script defines HASPROCFS, based on the
+ * presence of /usr/src/sys/miscfs/procfs/procfs.h header file.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+# if	defined(HASPROCFS)
+#undef	HASPROCFS
+#define	HASPROCFS	"proc"
+# endif	/* defined(HASPROCFS) */
+
+/* #define HASPROCFS	"proc?" */
+/* #define		HASFSTYPE	1 */
+#define	HASPINODEN	1
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+/* #define	HASRNODE	1 */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	defined(NETBSDV) && NETBSDV>=1006000
+#define	HASWIDECHAR	1
+# endif	/* defined(NETBSDV) && NETBSDV>=1006000 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior
+ * to R4 usually don't.
+ * doesn't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"	 	/* INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+/* #define	USE_LIB_CKKV			1	   ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+#define	USE_LIB_PROCESS_FILE			1	/* prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+#define	USE_LIB_READDEV				1	/* rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+
+# if	(defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000)
+#define	USE_LIB_RNMH				1	/* rnmh.c */
+# else	/* (defined(OPENBSDV) && OPENBSDV<2010) && (defined(NETBSDV) && NETBSDV<1002000) */
+#define	USE_LIB_RNAM				1	/* rnam.c */
+# endif	/* (defined(OPENBSDV) && OPENBSDV>=2010) || (defined(NETBSDV) && NETBSDV>=1002000) */
+
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+/* #define	WARNDEVACCESS	1 */
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	memset(a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/Makefile b/lsof_4.85/lsof_4.85_src/dialects/n+os/Makefile
new file mode 100644
index 0000000..8049a88
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/Makefile
@@ -0,0 +1,169 @@
+
+# N+OS Makefile
+#
+# $Id: Makefile,v 1.14 2008/04/15 13:30:27 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+# Use the RC_CFLAGS environment variable to define architecture types.
+# To create a "fat" executable, supporting more than one architecture,
+# set RC_CFLAGS before executing make -- e.g., to build a "fat" executable
+# for m68k, i486, hppa, and SPARC, using /bin/sh:
+#
+#	$ cd <lsof_source_directory>
+#	$ ./Configure ns
+#	$ RC_CFLAGS="-arch m68k -arch i486 -arch hppa -arch sparc"
+#	$ export RC_CFLAGS
+#	$ make
+
+CDEF=	${RC_CFLAGS}
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    dnode.c denode1.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.c
+
+OBJ=	dnode.o dnode1.o  dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the kmem group.  Your install rule actions might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '    install -cs -m 2755 -g $${GRP} $${PROG} $${BIN}/$${PROG}'
+	@echo '    install -c -m 444 $${MAN} $${DOC}/$${MAN}'
+	@echo ''
+	@echo 'You will have to complete the skeletons for the BIN, DOC, and'
+	@echo 'GRP strings given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo '    GRP= kmem'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`hostname`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`hostinfo | head -2 | tail -1`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+ddev.o:		${HDR} ddev.c
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/n+os/Mksrc
new file mode 100755
index 0000000..9abc4be
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/Mksrc
@@ -0,0 +1,24 @@
+#!/bin/sh
+#
+# Mksrc - make NEXTSTEP and OPENSTEP source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable is supplied:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.6 2001/08/09 11:44:07 abe Exp $
+
+
+D=dialects/n+os
+L="dlsof.h dnode.c dnode1.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/n+os/dlsof.h
new file mode 100644
index 0000000..afd5d9d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dlsof.h
@@ -0,0 +1,272 @@
+/*
+ * dlsof.h - NEXTSTEP and OPENSTEP 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.14 2006/03/28 22:08:17 abe Exp $
+ */
+
+
+#if	!defined(LSOF_NEXT_H)
+#define	LSOF_NEXT_H	1
+
+#include <c.h>
+#include <stdlib.h>
+#include <string.h>
+#include <mntent.h>
+#include <nlist.h>
+#include <signal.h>
+#include <setjmp.h>
+
+# if	!defined(NCPUS)
+#define NCPUS	1
+# endif
+
+#include <mach/mach.h>
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+#include <rpc/xdr.h>
+#include <nfs/nfs.h>
+#include <nfs/nfs_clnt.h>
+#include <sys/vnode.h>
+#include <sys/wait.h>
+#include <nfs/rnode.h>
+#include <sys/dir.h>
+#include <sys/domain.h>
+
+# if	!defined(KERNEL)
+#define KERNEL
+# endif
+
+#include <sys/file.h>
+#undef  KERNEL
+#include <sys/mbuf.h>
+#include <ufs/mount.h>
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/stat.h>
+#include <sys/ucred.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <net/route.h>
+#include <net/raw_cb.h>
+#include <netinet/in_pcb.h>
+#include <netinet/tcp.h>
+#include <netinet/tcp_fsm.h>
+#include <netinet/tcp_timer.h>
+#include <netinet/tcp_var.h>
+#include <sys/un.h>
+#include <sys/unpcb.h>
+
+# if	!defined(SHOW_UTT)
+#define SHOW_UTT
+# endif
+
+/*
+ * Define simple_lock_t size.
+ */
+
+# if	STEPV>=40 && defined(m68k)
+#define SIMPLE_LOCK_SIZE 0
+# elif	defined(hppa) /* && (STEPV<40 || !defined(m68k)) */
+#define SIMPLE_LOCK_SIZE 4
+# else	/* (STEPV<40 || !defined(m68k)) && !defined(hppa) */
+#define SIMPLE_LOCK_SIZE 1
+# endif	/* STEPV>=40 && defined(m68k) */
+
+# if	!defined(SIMPLE_LOCK_SIZE)
+#define	SIMPLE_LOCK_SIZE	1
+# endif	/* !defined(SIMPLE_LOCK_SIZE) */
+
+# if	STEPV>=40
+/*
+ * Define lock_data_t that was removed from OPENSTEP 4.x's <kernserv/lock.h>.
+ */
+
+typedef struct lock {
+        char            *thread;
+        unsigned int    read_count:16,
+                        want_upgrade:1,
+                        want_write:1,
+                        waiting:1,
+                        can_sleep:1,
+                        recursion_depth:12;
+
+#  if	SIMPLE_LOCK_SIZE>0
+	caddr_t		interlock[SIMPLE_LOCK_SIZE];
+#  endif	/* SIMPLE_LOCK_SIZE>0 */
+
+} lock_data_t;
+# endif	/* STEPV>=40 */
+
+#include <sys/user.h>
+#define u_comm	uu_comm
+#define u_cdir	uu_cdir
+#define u_rdir	uu_rdir
+#undef	SHOW_UTT
+#include <sys/proc.h>
+#include <sys/vfs.h>
+#include <ufs/inode.h>
+
+typedef	int	pid_t;
+
+
+/*
+ * The following substitution compensates for the snode.h that NeXT does
+ * not supply in NEXTSTEP 2.0 and above.  The value of interest is s_realvp.
+ */
+
+struct snode {
+	struct	snode *s_next;		/* must be first */
+	struct	vnode s_vnode;		/* vnode associated with this snode */
+	struct	vnode *s_realvp;	/* vnode for the fs entry (if any) */
+};
+
+
+/*
+ * Miscellaneous definitions.
+ */
+
+#define	COMP_P		const void
+#define DEVINCR		1024		/* device table malloc() increment */
+typedef	off_t		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 */
+#define	PROCDFLT	256	/* default size of local proc table */
+#define	PROCMIN		5	/* processes that make a "good" scan */
+#define PROCSIZE	sizeof(struct proc)
+#define	PROCTRYLM	5	/* times to try to read proc table */
+#define QSORT_P		void
+#define	READLEN_T	int
+#define STRNCPY_L	int
+#define U_SIZE		sizeof(struct user)
+
+#  if	!defined(VMUNIX)
+#define VMUNIX		"/mach"
+#  endif
+
+#define	N_UNIX		VMUNIX
+
+
+# if	defined(HAS_AFS)
+/*
+ * AFS definitions
+ */
+
+#define	AFSAPATHDEF	"/usr/vice/etc/afs_loadable"
+#define	AFSDEV		1		/* AFS "fake" device number */
+
+#  if	defined(HASAOPT)
+extern char *AFSApath;			/* alternate AFS name list path
+					 * (from -A) */
+#  endif	/* defined(HASAOPT) */
+
+extern struct vfs *AFSVfsp;		/* AFS struct vfs kernel pointer */
+# endif	/* defined(HAS_AFS) */
+
+
+/*
+ * Local mount information
+ */
+
+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 inode number */
+	u_short mode;			/* directory st_mode */
+	u_short fs_mode;		/* file system st_mode */
+	struct mounts *next;    	/* forward link */
+};
+
+
+/*
+ * Defines for kernel name list
+ */
+
+#define	NL_NAME		n_un.n_name
+
+
+/*
+ * For kernel name cache processing
+ */
+
+# if	defined(HASNCACHE)
+#include <sys/dnlc.h>
+#define	X_NCACHE	"nch"
+#define	X_NCSIZE	"ncsz"
+# endif	/* defined(HASNCACHE) */
+
+
+/*
+ * Defines for library readdev() function
+ */
+
+#define	DIRTYPE		direct
+#define	HASDNAMLEN	1
+
+
+/*
+ * Search file information
+ */
+
+struct sfile {
+	char *aname;			/* file name argument */
+	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 */
+};
+
+
+/*
+ * Miscellaneous external definitions
+ */
+
+extern struct file *Fileptr;
+#define	FILEPTR	Fileptr			/* for process_file() in lib/prfp.c */
+extern int Kd;
+
+#endif	/* LSOF_NEXT_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/n+os/dnode.c
new file mode 100644
index 0000000..6747942
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dnode.c
@@ -0,0 +1,711 @@
+/*
+ * dnode.c - NEXTSTEP and OPENSTEP node functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.17 2006/03/28 22:08:17 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+#if	STEPV>=31
+/*
+ * Local definitions
+ */
+
+struct l_lockf {			/* local lock info */
+	short type;			/* lock type */
+	off_t start, end;		/* lock start and end */
+	pid_t pid;			/* owning process ID */
+	struct l_lockf *next;
+};
+
+struct l_svn {				/* shadow vnode */
+	KA_T vp;			/* associated vnode */
+	struct l_lockf *lp;		/* local lock chain */
+	struct l_svn *next;
+};
+
+struct posix_proc {
+	pid_t p_pid;
+};
+#define	POSIX_KERN	1
+#include <ufs/lockf.h>
+
+#define SVNHASH(n)	(((int)((long)(n) * 31415l) >> 5) & (LF_SVNODE_HSZ - 1))
+
+
+/*
+ * Local static variables
+ */
+
+static struct l_svn **Svnc = (struct l_svn **)NULL;
+					/* local shadow vnode cache */
+static int SvncSt = 0;			/* Svnc[] load status */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static char isvlocked,(KA_T vp));
+_PROTOTYPE(static int load_svnc,(void));
+
+
+/*
+ * clr_svnc() - clear shadow vnode cache
+ */
+
+void
+clr_svnc()
+{
+	struct l_lockf *lf, *lfn;
+	int i;
+	struct l_svn *sv, *svn;
+
+	if (!Svnc || !SvncSt)
+	    return;
+	for (i = 0; i < LF_SVNODE_HSZ; i++) {
+	    if (!(sv = Svnc[i]))
+		continue;
+	    do {
+		if ((lf = sv->lp)) {
+		    do {
+			lfn = lf->next;
+			(void) free((FREE_P *)lf);
+		    } while ((lf = lfn));
+		}
+		svn = sv->next;
+		(void) free((FREE_P *)sv);
+	    } while ((sv = svn));
+	    Svnc[i] = (struct l_svn *)NULL;
+	}
+	SvncSt = 0;
+}
+
+
+/*
+ * isvlocked() - is vnode locked?
+ */
+
+static char
+isvlocked(vp)
+	KA_T vp;			/* vnode's kernel address */
+{
+	int i;
+	struct l_lockf *lp;
+	struct l_svn *sv;
+
+	if (!Svnc || !SvncSt) {
+	    if (!load_svnc())
+		return(' ');
+	}
+/*
+ * Hash the vnode address and see if there's a shadow (lock) vnode structure
+ * assigned to it.
+ */
+	i = SVNHASH(vp);
+	for (sv = Svnc[i]; sv; sv = sv->next) {
+	    if ((KA_T)sv->vp == vp)
+		break;
+	}
+	if (!sv)
+	    return(' ');
+/*
+ * Search the lock owners represented by the shadow vnode's lock chain
+ * for this process.
+ */
+	for (lp = sv->lp; lp; lp = lp->next) {
+	    if (lp->pid == (pid_t)Lp->pid) {
+		if (lp->start == 0 && lp->end == 0x7fffffff)
+		    i = 1;
+		else
+		    i = 0;
+		if (lp->type == F_RDLCK)
+		    return(i ? 'R' : 'r');
+		else if (lp->type == F_WRLCK)
+		    return(i ? 'W' : 'w');
+		return(' ');
+	    }
+	}
+	return(' ');
+}
+
+
+/*
+ * load_svnc() - load the shadow vnode cache
+ */
+
+int
+load_svnc()
+{
+	int i, j;
+	static KA_T kp = (KA_T)NULL;
+	struct lockf lf, *lp;
+	struct l_lockf *lsf;
+	struct l_svn *lsv;
+	struct posix_proc p;
+	struct lf_svnode *sn, *sp[LF_SVNODE_HSZ], sv;
+
+	if (Svnc && SvncSt)
+	    return(1);
+/*
+ * Get the shadow vnode hash table address from the kernel.
+ */
+	if (!kp) {
+	    if (get_Nl_value("lfsvh", Drive_Nl, &kp) < 0 || !kp)
+		return(0);
+	}
+/*
+ * Define local hash buckets, if necessary.
+ */
+	if (!Svnc) {
+	    if (!(Svnc = (struct l_svn **)calloc(sizeof(struct l_svn *),
+						LF_SVNODE_HSZ)))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for %d local shadow vnode hash buckets\n",
+		    Pn, LF_SVNODE_HSZ);
+		Exit(1);
+	    }
+	}
+/*
+ * Search the hash buckets of the shadow vnode table.
+ */
+	if (kread(kp, (char *)&sp, sizeof(sp)))
+	    return(0);
+	for (i = 0; i < LF_SVNODE_HSZ; i++) {
+	    if (!(sn = sp[i]))
+		continue;
+	    do {
+
+	    /*
+	     * Duplicate the chain of shadow vnodes in the bucket.
+	     */
+		if (kread((KA_T)sn, (char *)&sv, sizeof(sv))
+		||  !sv.lf_vnodep
+		||  !sv.lf_lockfp)
+		    break;
+	    /*
+	     * Allocate and initialize a local shadow vnode structure.
+	     */
+		if (!(lsv = (struct l_svn *)malloc(sizeof(struct l_svn)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for local shadow vnode -- PID: %ld\n",
+			Pn, Lp->pid);
+		    Exit(1);
+		}
+		lsv->vp = (KA_T)sv.lf_vnodep;
+		lsv->lp = (struct l_lockf *)NULL;
+		lsv->next = (struct l_svn *)NULL;
+		lp = sv.lf_lockfp;
+		do {
+
+		/*
+		 * Duplicate the lock chain for this shadow vnode.
+		 */
+		    if (kread((KA_T)lp, (char *)&lf, sizeof(lf)))
+			break;
+		    if (!lf.lf_posix_procp
+		    ||  kread((KA_T)lf.lf_posix_procp, (char *)&p, sizeof(p))
+		    ||  !p.p_pid)
+			continue;
+		    if (!(lsf=(struct l_lockf *)malloc(sizeof(struct l_lockf))))
+		    {
+			(void) fprintf(stderr,
+			    "%s: no space for local lock struct -- PID: %ld\n",
+			    Pn, Lp->pid);
+			Exit(1);
+		    }
+		    lsf->type = lf.lf_type;
+		    lsf->start = lf.lf_start;
+		    lsf->end = lf.lf_end;
+		    lsf->pid = (pid_t)p.p_pid;
+		    lsf->next = lsv->lp;
+		    lsv->lp = lsf;
+		} while ((lp = lf.lf_next));
+	    /*
+	     * Link the shadow vnode to its local hash bucket.
+	     */
+		j = SVNHASH(lsv->vp);
+		lsv->next = Svnc[j];
+		Svnc[j] = lsv;
+	    } while ((sn = sv.lf_next));
+	}
+	SvncSt = 1;
+	return(1);
+}
+#endif	/* STEPV>=31 */
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	dev_t dev, rdev;
+	int devs = 0;
+	static int ft = 1;
+	static KA_T fvops = (KA_T)0;
+	struct inode i;
+	int ins = 0;
+	static KA_T nvops = (KA_T)0;
+	struct rnode r;
+	int rdevs = 0;
+	struct vnode rv;
+	struct snode s;
+	static KA_T svops = (KA_T)0;
+	char tbuf[32], *ty;
+	static KA_T uvops = (KA_T)0;
+	enum vtype type;
+	static struct vnode *v = (struct vnode *)NULL;
+
+#if	defined(HAS_AFS)
+	static int afs = 0;		/* AFS test status: -1 = no AFS
+					 *		     0 = not tested
+					 *		     1 = AFS present */
+	struct afsnode an;
+	static KA_T avops = (KA_T)0;
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Read the vnode.
+ */
+	if (!va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+/*
+ * Read the vnode.
+ */
+	if (!v) {
+
+	/*
+	 * Allocate space for the vnode or AFS vcache structure.
+	 */
+
+#if	defined(HAS_AFS)
+	    v = alloc_vcache();
+#else	/* !defined(HAS_AFS) */
+	    v = (struct vnode *)malloc(sizeof(struct vnode));
+#endif	/* defined(HAS_AFS) */
+
+	    if (!v) {
+		(void) fprintf(stderr, "%s: can't allocate %s space\n", Pn,
+
+#if	defined(HAS_AFS)
+			       "vcache"
+#else	/* !defined(HAS_AFS) */
+			       "vnode"
+#endif	/* defined(HAS_AFS) */
+
+			      );
+		Exit(1);
+	    }
+	}
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+# if	defined(HASNCACHE)
+	Lf->na = va;
+# endif	/* defined(HASNCACHE) */
+
+# if	defined(HASFSTRUCT)
+	Lf->fna = va;
+	Lf->fsv |= FSV_NI;
+# endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Get vnode operations addresses, as required.
+ */
+	if (ft) {
+
+#if	defined(HAS_AFS)
+	    (void) get_Nl_value("avops", Drive_Nl, &avops);
+#endif	/* defined(HAS_AFS) */
+
+	    (void) get_Nl_value("fvops", Drive_Nl, &fvops);
+	    (void) get_Nl_value("nvops", Drive_Nl, &nvops);
+	    (void) get_Nl_value("svops", Drive_Nl, &svops);
+	    (void) get_Nl_value("uvops", Drive_Nl, &uvops);
+	    ft = 0;
+	}
+/*
+ * Determine the vnode type.
+ */
+	if ((uvops && (KA_T)v->v_op == uvops)
+	||  (svops && (KA_T)v->v_op == svops))
+	    Ntype = N_REGLR;
+	else if (nvops && (KA_T)v->v_op == nvops)
+	    Ntype = N_NFS;
+	else if (fvops && (KA_T)v->v_op == fvops)
+	    Ntype = N_FIFO;
+
+#if	defined(HAS_AFS)
+	/*
+	 * Caution: this AFS test should be the last one.
+	 */
+	
+	else if (avops) {
+	    if ((KA_T)v->v_op == avops)
+		Ntype = N_AFS;
+	    else {
+
+unknown_v_op:
+		(void) snpf(Namech, Namechl,
+		    "unknown file system type; v_op: %s",
+			print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	} else if (v->v_data || !v->v_vfsp)
+	    goto unknown_v_op;
+	else {
+	    switch (afs) {
+	    case -1:
+		goto unknown_v_op;
+	    case 0:
+		if (!hasAFS(v)) {
+		    afs = -1;
+		    goto unknown_v_op;
+		}
+		afs = 1;
+		Ntype = N_AFS;
+		AFSVfsp = (KA_T)v->v_vfsp;
+		break;
+	    case 1:
+		if ((KA_T)v->v_vfsp == AFSVfsp)
+		    Ntype = N_AFS;
+		else
+		    goto unknown_v_op;
+	    }
+	}
+#else	/* !defined(HAS_AFS) */
+	else {
+	    (void) snpf(Namech, Namechl, "unknown file system type; v_op: %s",
+		print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Determine the lock type.
+ */
+	if (v->v_shlockc || v->v_exlockc) {
+	    if (FILEPTR && (FILEPTR->f_flag & FSHLOCK))
+		Lf->lock = 'R';
+	    else if (FILEPTR && (FILEPTR->f_flag & FEXLOCK))
+		Lf->lock = 'W';
+	    else
+
+#if	STEPV>=31
+		Lf->lock = isvlocked(va);
+#else	/* STEPV<31 */
+		Lf->lock = ' ';
+#endif	/* STEPV>=31 */
+
+	}
+/*
+ * Read the inode, rnode, snode, or vcache struct.
+ */
+	switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (readafsnode(va, v, &an))
+		return;
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+	case N_NFS:
+	    if (!v->v_data || readrnode((KA_T)v->v_data, &r)) {
+		(void) snpf(Namech, Namechl,
+		    "vnode at %s: can't read rnode (%s)",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    break;
+	case N_REGLR:
+	default:
+
+	/*
+	 * VBLK, VCHR and VFIFO vnodes point to an snode.  The snode's s_realvp
+	 * usually points to a real vnode, which points to an inode.
+	 */
+	    if (v->v_type == VBLK || v->v_type == VCHR || v->v_type == VFIFO) {
+		if (!v->v_data || readsnode((KA_T)v->v_data, &s)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read snode(%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		if (s.s_realvp) {
+		    if (readvnode((KA_T)s.s_realvp, &rv)) {
+			(void) snpf(Namech, Namechl,
+			    "snode at %s: can't read real vnode (%s)",
+			    print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+			    print_kptr((KA_T)s.s_realvp, (char *)NULL, 0));
+			enter_nm(Namech);
+			return;
+		    }
+		    if (!rv.v_data || readinode((KA_T)rv.v_data, &i)) {
+			(void) snpf(Namech, Namechl,
+			    "snode at %s: can't read inode (%s)",
+			    print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+			    print_kptr((KA_T)rv.v_data, (char *)NULL, 0));
+			enter_nm(Namech);
+			return;
+		    }
+		    ins = 1;
+		}
+		break;
+	    } else {
+		if (!v->v_data || readinode((KA_T)v->v_data, &i)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode at %s: can't read inode (%s)",
+			print_kptr(va, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		ins = 1;
+	    }
+	}
+/*
+ * Get device and type for printing.
+ */
+	switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    dev = an.dev;
+	    devs = 1;
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+	case N_NFS:
+	    dev = r.r_attr.va_fsid;
+	    devs = 1;
+	    if (dev & 0x8000)
+		dev |= 0xff00;
+	    break;
+	case N_FIFO:
+	case N_REGLR:
+	    if (ins) {
+		dev = i.i_dev;
+		devs = 1;
+	    }
+	    if ((v->v_type == VBLK) || (v->v_type == VCHR)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    }
+	}
+	type = v->v_type;
+/*
+ * Obtain the inode number.
+ */
+	switch(Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (an.ino_st) {
+		Lf->inode = (INODETYPE)an.inode;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+	case N_NFS:
+	    Lf->inode = (INODETYPE)r.r_attr.va_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+	case N_FIFO:
+	case N_REGLR:
+	    if (ins) {
+		Lf->inode = (INODETYPE)i.i_number;
+		Lf->inp_ty = 1;
+	    }
+	}
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->sz = (SZOFFTYPE)an.size;
+		Lf->sz_def = 1;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+	    case N_NFS:
+		Lf->sz = (SZOFFTYPE)r.r_attr.va_size;
+		Lf->sz_def = 1;
+		break;
+	    case N_FIFO:
+		Lf->off_def = 1;
+		break;
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    if (ins) {
+			Lf->sz = (SZOFFTYPE)i.i_size;
+			Lf->sz_def = 1;
+		    }
+		}
+		else if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		break;
+	    }
+	}
+/*
+ * Record the link count.
+ */
+	if (Fnlink) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->nlink = an.nlink;
+		Lf->nlink_def = an.nlink_st;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+	    switch (Ntype) {
+	    case N_NFS:
+		Lf->nlink = (long)r.r_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+	    case N_REGLR:
+		if (ins) {
+		    Lf->nlink = (long)i.i_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+	    }
+	    if (Lf->nlink_def && Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Defer file system info lookup until printname().
+ */
+	Lf->lmi_srch = 1;
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type.
+ */
+	Lf->dev = dev;
+	Lf->dev_def = devs;
+	Lf->rdev = rdev;
+	Lf->rdev_def = rdevs;
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	case VDIR:
+	    ty = (type == VREG) ? "VREG" : "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    ty = "FIFO";
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), ty);
+	Lf->ntype = Ntype;
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (Lf->ntype == N_BLK))
+	    find_bl_ino();
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (Lf->ntype == N_CHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named((char *)NULL,
+				   ((type == VCHR) || (type == VBLK)) ? 1 : 0))
+	    Lf->sf |= SELNM;
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/n+os/dnode1.c
new file mode 100644
index 0000000..a18c482
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dnode1.c
@@ -0,0 +1,401 @@
+/*
+ * dnode1.h - NEXTSTEP and OPENSTEP AFS support
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.7 2005/08/08 19:54:03 abe Exp $";
+#endif
+
+
+#if	defined(HAS_AFS)
+#include "lsof.h"
+
+#include <rpc/xdr.h>
+#define __XDR_INCLUDE__
+
+#include <afs/stds.h>
+#include <afs/param.h>
+#include <afs/afsint.h>
+#include <afs/vldbint.h>
+
+
+/*
+ * This is an emulation of the afs_rwlock_t definition that appears in
+ * the AFS sources in afs/lock.h.
+ */
+
+struct afs_lock {
+
+# if    HAS_AFS<304
+    unsigned char d1[4];
+# else  /* HAS_AFS>=304 */
+    unsigned char d1[6];
+# endif /* HAS_AFS<304 */
+
+};
+typedef struct afs_lock afs_lock_t;
+typedef struct afs_lock afs_rwlock_t;
+
+
+/*
+ * This is an emulation of the afs_bozoLock_t definition that appears in
+ * the AFS sources in afs/lock.h.
+ */
+
+struct afs_bozoLock {
+    short d1;
+    char d2[2];
+    char *d3;
+};
+typedef struct afs_bozoLock afs_bozoLock_t;
+
+#define	KERNEL
+#include <afs/afs.h>
+#undef	KERNEL
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct volume *getvolume,(struct VenusFid *f, int *vols));
+_PROTOTYPE(static int is_rootFid,(struct vcache *vc, int *rfid));
+
+
+/*
+ * alloc_vcache() - allocate space for vcache structure
+ */
+
+struct vnode *
+alloc_vcache()
+{
+	return((struct vnode *)malloc(sizeof(struct vcache)));
+}
+
+
+/*
+ * ckAFSsym() - check for missing X_AFS_* symbols in AFS name list file
+ */
+
+void
+ckAFSsym(nl)
+	struct nlist *nl;		/* copy of Nl[] when empty */
+{
+	char *path = AFSAPATHDEF;
+	int i;
+
+# if	defined(HASAOPT)
+	if (AFSApath)
+	    path = AFSApath;
+# endif	/* defined(HASAOPT) */
+
+/*
+ * See if the alternate AFS name list file can be read.
+ */
+	if (!is_readable(path, 0)) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't access AFS name list file: %s\n",
+		    Pn, path);
+	    return;
+	}
+/*
+ * Read the AFS modload symbols and compare its non-zero values with
+ * the non-zero values in Nl[].  Quit if there is any mis-match.
+ */
+	if (nlist(path, nl) < 0)
+	    return;
+	for (i = 0; Nl[i].n_un.n_name && Nl[i].n_un.n_name[0]; i++) {
+	    if (!nl[i].n_value || !Nl[i].n_value)
+		continue;
+	    if (nl[i].n_value != Nl[i].n_value)
+		return;
+	}
+/*
+ * If any AFS kernel name list symbol that doesn't have a value in Nl[] has
+ * one from the AFS modload file, copy its modload value to Nl[].
+ */
+	if ((i = get_Nl_value("arFid", Drive_Nl, NULL)) >= 0
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+	if ((i = get_Nl_value("avops", Drive_Nl, NULL)) >= 0
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+	if ((i = get_Nl_value("avol",  Drive_Nl, NULL)) >= 0
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+}
+
+
+/*
+ * getvolume() - get volume structure
+ */
+
+static struct volume *
+getvolume(f, vols)
+	struct VenusFid *f;		/* file ID pointer */
+	int *vols;			/* afs_volumes status return */
+{
+	int i;
+	static KA_T ka = 0;
+	KA_T kh;
+	static struct volume v;
+	struct volume *vp;
+	static int w = 0;
+
+	if (!ka) {
+	    if (get_Nl_value("avol", Drive_Nl, (unsigned long *)&ka) < 0 || !ka)
+	    {
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: no kernel address for afs_volumes\n", Pn);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		*vols = 0;
+		return((struct volume *)NULL);
+	    }
+	}
+	*vols = 1;
+	i = (NVOLS - 1) & f->Fid.Volume;
+	kh = (KA_T)((char *)ka + (i * sizeof(struct volume *)));
+	if (kread(kh, (char *)&vp, sizeof(vp)))
+	    return((struct volume *)NULL);
+	while (vp) {
+	    if (kread((KA_T)vp, (char *)&v, sizeof(v)))
+		return((struct volume *)NULL);
+	    if (v.volume == f->Fid.Volume && v.cell == f->Cell)
+		return(&v);
+	    vp = v.next;
+	}
+	return((struct volume *)NULL);
+}
+
+
+/*
+ * hasAFS() - test for AFS presence via vfs structure
+ */
+
+int
+hasAFS(vp)
+	struct vnode *vp;		/* vnode pointer */
+{
+	struct mounts *mp;
+	int n;
+	struct vfs v;
+/*
+ * If this vnode has a v_data pointer, then it probably isn't an AFS vnode;
+ * return FALSE.
+ *
+ * If the vfs struct address of /afs is known and this vnode's v_vfsp matches
+ * it, return TRUE.
+ *
+ * Read this vnode's vfs structure and see if it's device (fsid.val[0]) is
+ * AFSDEV.  If it is, record the AFS vfs struct address and return TRUE.
+ */
+	if (AFSVfsp && !vp->v_data && vp->v_vfsp == AFSVfsp)
+	    return(1);
+	if (vp->v_data
+	||  !vp->v_vfsp
+	||  kread((KA_T)vp->v_vfsp, (char *)&v, sizeof(v))
+	||  v.vfs_data)
+	    return(0);
+	if (v.vfs_fsid.val[0] == AFSDEV) {
+	    AFSVfsp = vp->v_vfsp;
+	    return(1);
+	}
+/*
+ * Search the local mount table for /afs devices or a match on device number.
+ * Count /afs devices and skip a device number test for them.  A match on
+ * device number for non-AFS devices produces a FALSE return.
+ */
+	for (mp = readmnt(), n = 0; mp; mp = mp->next) {
+	    if (mp->dev == AFSDEV
+	    &&  mp->dir && strcmp(mp->dir, "/afs") == 0
+	    &&  mp->fsname && strcmp(mp->fsname, "AFS") == 0)
+		n++;
+	    else if (mp->dev == (dev_t)v.vfs_fsid.val[0])
+		return(0);
+	}
+/*
+ * If there is exactly one /afs device, assume its vfs struct address is
+ * the one for this vnode, record it, and return TRUE.
+ */
+	if (n == 1) {
+	    AFSVfsp = vp->v_vfsp;
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * is_rootFid() - is the file ID the root file ID
+ *
+ * return: 0	= is not root file ID
+ *	   1	= is root file ID
+ *	   rfid = 0 if root file ID structure address not available
+ *		  1 if root file ID structure address available
+ */
+
+static int
+is_rootFid(vc, rfid)
+	struct vcache *vc;		/* vcache structure */
+	int *rfid;			/* root file ID pointer status return */
+{
+	unsigned long arFid;
+	char *err;
+	static int f = 0;		/* rootFid structure status:
+					 *     -1 = unavailable
+					 *	0 = not yet accessed
+					 *	1 = available */
+	static struct VenusFid r;
+	static int w = 0;
+
+	switch (f) {
+	case -1:
+	    if (vc->v.v_flag & VROOT) {
+		*rfid = 1;
+		return(1);
+	    }
+	    *rfid = 0;
+	    return(0);
+	case 0:
+	    if (get_Nl_value("arFid", Drive_Nl, &arFid) < 0 || !arFid) {
+		err = "no _afs_rootFid kernel address";
+
+rfid_unavailable:
+
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: AFS root Fid error: %s\n", Pn, err);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		f = -1;
+		if (vc->v.v_flag & VROOT) {
+		    *rfid = 1;
+		    return(1);
+		}
+		*rfid = 0;
+		return(0);
+	    }
+	    if (kread((KA_T)arFid, (char *)&r, sizeof(r))) {
+		err = "can't read _afs_rootFid from kernel";
+		goto rfid_unavailable;
+	    }
+	    f = 1;
+	    /* fall through */
+	case 1:
+	    *rfid = 1;
+	    if (vc->fid.Fid.Unique == r.Fid.Unique
+	    &&  vc->fid.Fid.Vnode == r.Fid.Vnode
+	    &&  vc->fid.Fid.Volume == r.Fid.Volume
+	    &&  vc->fid.Cell == r.Cell)
+		return(1);
+	}
+	*rfid = 0;
+	return(0);
+}
+
+
+/*
+ * readafsnode() - read AFS node
+ */
+
+int
+readafsnode(va, v, an)
+	caddr_t va;			/* kernel vnode address */
+	struct vnode *v;		/* vnode buffer pointer */
+	struct afsnode *an;		/* afsnode recipient */
+{
+	char *cp;
+	KA_T ka;
+	int len, rfid, vols;
+	struct vcache *vc;
+	struct volume *vp;
+
+	cp = ((char *)v + sizeof(struct vnode));
+	ka = (KA_T)((char *)va + sizeof(struct vnode));
+	len = sizeof(struct vcache) - sizeof(struct vnode);
+	if (kread(ka, cp, len)) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %#x: can't read vcache remainder from %#x", va, ka);
+	    enter_nm(Namech);
+	    return(1);
+	}
+	vc = (struct vcache *)v;
+	an->dev = AFSDEV;
+	an->size = (unsigned long)vc->m.Length;
+	an->nlink = (long)vc->m.LinkCount;
+	an->nlink_st = 1;
+/*
+ * Manufacture the "inode" number.
+ */
+	if (vc->mvstat == 2) {
+	    if ((vp = getvolume(&vc->fid, &vols))) {
+		an->inode = (INODETYPE)(vp->mtpoint.Fid.Vnode
+			  + (vp->mtpoint.Fid.Volume << 16));
+		if (an->inode == (INODETYPE)0) {
+		    if (is_rootFid(vc, &rfid))
+			an->ino_st = 1;
+		    else if (rfid) {
+			an->inode = (INODETYPE)2;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		} else
+		    an->ino_st = 1;
+	    } else {
+		if (vols) {
+		    an->inode = (INODETYPE)2;
+		    an->ino_st = 1;
+		} else {
+		    if (v->v_flag & VROOT) {
+			an->inode = (INODETYPE)0;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		}
+	    }
+	} else {
+	    an->inode = (INODETYPE)((vc->fid.Fid.Vnode
+		      +			(vc->fid.Fid.Volume << 16))
+		      & 0x7fffffff);
+	    an->ino_st = 1;
+	}
+	return(0);
+}
+#endif	/* defined(HAS_AFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/n+os/dproc.c
new file mode 100644
index 0000000..cb625b9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dproc.c
@@ -0,0 +1,767 @@
+/*
+ * dproc.c - NEXTSTEP and OPENSTEP process access functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.12 2001/08/09 11:44:07 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local static values
+ */
+
+static int Mxp = 0;			/* maximum number of processes */
+static int Np;				/* number of entries in P[] */
+static int Nv = 0;			/* allocated Vp[] entries */
+static struct proc *P = (struct proc *)NULL;
+					/* local proc structure table */
+static KA_T *Pa = (KA_T *)NULL;		/* kernel address for each P[] entry */
+static KA_T Kp;				/* kernel process table pointer */
+static KA_T *Vp = (KA_T *)NULL;		/* vnode address cache */
+
+
+_PROTOTYPE(static void get_kernel_access,(void));
+_PROTOTYPE(static void process_map,(caddr_t map));
+_PROTOTYPE(static void read_proc,(void));
+
+
+/*
+ * ckkv - check kernel version
+ */
+
+void
+ckkv(d, er, ev, ea)
+	char *d;			/* dialect */
+	char *er;			/* expected release */
+	char *ev;			/* expected version */
+	char *ea;			/* expected architecture */
+{
+
+#if	defined(HASKERNIDCK)
+	char m[128], *t;
+	kernel_version_t kv;
+	kern_return_t kr;
+	char *vt = (char *)NULL;
+
+	if (Fwarn)
+	    return;
+/*
+ * Read Mach kernel version.
+ */
+	if ((kr = host_kernel_version(host_self(), kv)) != KERN_SUCCESS) {
+	    (void) snpf(m, sizeof(m), "%s: can't get kernel version:", Pn);
+	    mach_error(m, kr);
+	    Exit(1);
+	}
+/*
+ * Skip blank-separated tokens until reaching "Mach".  The kernel version
+ * string follows.  Eliminate anything but decimal digits and periods from
+ * the kernel version string.
+ */
+	if ((t = strtok(kv, " "))) {
+	    do {
+		if (strcmp(t, "Mach") == 0)
+		    break;
+	    } while ((t = strtok((char *)NULL, " ")));
+	    if (t)
+		vt = strtok((char *)NULL, " ");
+	}
+	if (vt) {
+	    for (t = vt; *t; t++) {
+		if (*t == '.' || (*t >= '0' && *t <= '9'))
+		    continue;
+		*t = '\0';
+		break;
+	    }
+	}
+/*
+ * Warn if the actual and expected versions don't match.
+ */
+	if (!ev || !vt || strcmp(ev, vt))
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s version %s; this is %s\n",
+		Pn, d, ev ? ev : "UNKNOWN", vt ? vt : "UNKNOWN");
+#endif	/* defined(HASKERNIDCK) */
+
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	int i, nf, px;
+	MALLOC_S nb;
+	short pss, sf;
+	struct task {			/* (Should come from <kern/task.h>.) */
+		caddr_t d1[SIMPLE_LOCK_SIZE + 2];
+		caddr_t map;
+		caddr_t d2[SIMPLE_LOCK_SIZE + 9];
+		struct utask *u_address;
+		struct proc *proc;
+	} t;
+	struct utask *u;
+	static struct file **uf = (struct file **)NULL;
+	static MALLOC_S ufb = 0;
+	struct utask ut;
+
+#if	defined(HASFSTRUCT)
+	static char *pof = (char *)NULL;
+	static MALLOC_S pofb = 0;
+#endif	/* defined(HASFSTRUCT) */
+
+
+/*
+ * Clear previously loaded tables and read the process table.
+ */
+
+#if	STEPV>=31
+	(void) clr_svnc();
+#endif	/* STEPV>=31 */
+
+	(void) read_proc();
+/*
+ * Process proc structures pre-loaded in initialize().
+ */
+	for (px = 0, u = &ut; px < Np; px++) {
+	    if (is_proc_excl(P[px].p_pid, (int)P[px].p_pgrp,
+			     (UID_ARG)P[px].p_uid, &pss, &sf))
+		continue;
+	/*
+	 * Read the task associated with the process, and the user
+	 * area assocated with the task.
+	 */
+	    if (kread((KA_T)P[px].task, (char *)&t, sizeof(t)))
+		continue;
+	    if ((KA_T)t.proc != Pa[px])
+		continue;
+	    if (kread((KA_T)t.u_address, (char *)&ut, sizeof(ut)))
+		continue;
+	    if ((KA_T)ut.uu_procp != Pa[px])
+		continue;
+	/*
+	 * Allocate a local process structure and start filling it.
+	 */
+	    if (is_cmd_excl(u->u_comm, &pss, &sf))
+		continue;
+	    alloc_lproc(P[px].p_pid, (int)P[px].p_pgrp, (int)P[px].p_ppid,
+			(UID_ARG)P[px].p_uid, u->u_comm, (int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (u->u_cdir) {
+		alloc_lfile(CWD, -1);
+		FILEPTR = (struct file *)NULL;
+		process_node((KA_T)u->u_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (u->u_rdir) {
+		alloc_lfile(RTD, -1);
+		FILEPTR = (struct file *)NULL;
+		process_node((KA_T)u->u_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Print information on the text files of the virtual memory
+	 * address map.
+	 */
+	    if (t.map)
+		process_map(t.map);
+	/*
+	 * Save information on file descriptors.
+	 *
+	 * NEXTSTEP file pointers come from a structure whose pointer is
+	 * in the user task area.
+	 */
+	    nf = ut.uu_ofile_cnt;
+	    nb = (MALLOC_S)(sizeof(struct file *) * nf);
+	    if (nb > ufb) {
+		if (!uf)
+		    uf = (struct file **)malloc(nb);
+		else
+		    uf = (struct file **)realloc((MALLOC_P *)uf, nb);
+		if (!uf) {
+		    (void) fprintf(stderr, "%s: no uu_ofile space\n", Pn);
+		    Exit(1);
+		}
+		ufb = nb;
+	    }
+	    if (kread((KA_T)ut.uu_ofile, (char *)uf, nb))
+		continue;
+
+#if	defined(HASFSTRUCT)
+	    if (Fsv & FSV_FG) {
+		nb = (MALLOC_S)(sizeof(char) * nf);
+		if (nb > pofb) {
+		    if (!pof)
+			pof = (char *)malloc(nb);
+		    else
+			pof = (char *)realloc((MALLOC_P *)pof, nb);
+		    if (!pof) {
+			(void) fprintf(stderr, "%s: no uu_pofile space\n", Pn);
+			Exit(1);
+		    }
+		    pofb = nb;
+		}
+		if (kread((KA_T)ut.uu_pofile, (char *)pof, nb))
+		    zeromem(pof, nb);
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	    for (i = 0; i < nf; i++) {
+		if (uf[i]) {
+		    alloc_lfile((char *)NULL, i);
+		    process_file((KA_T)uf[i]);
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG)
+			    Lf->pof = (long)pof[i];
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - access the required information in the kernel
+ */
+
+static void
+get_kernel_access()
+{
+	int i;
+	KA_T lv;
+
+#if	defined(HAS_AFS)
+	struct nlist *nl = (struct nlist *)NULL;
+	unsigned long v[3];
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Check kernel version against compiled version.
+ */
+	ckkv("NEXTSTEP", (char *)NULL, LSOF_VSTR, (char *)NULL);
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+		(void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1))
+		Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Access the kernel memory file.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0) {
+		(void) fprintf(stderr, "%s: can't open %s: %s\n", Pn,
+			Memory ? Memory : KMEM, strerror(errno));
+		Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+		(void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the name list file is readable.  Build Nl.
+ */
+	if (Nmlst && !is_readable(Nmlst, 1))
+		Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+	(void) build_Nl(Drive_Nl);
+
+#if	defined(HAS_AFS)
+	if (!Nmlst) {
+
+	/*
+	 * If AFS is defined and we're getting kernel symbol values from
+	 * from N_UNIX, make a copy of Nl[] for possible use with the AFS
+	 * module name list file.
+	 */
+		if (!(nl = (struct nlist *)malloc(Nll))) {
+			(void) fprintf(stderr,
+				"%s: no space (%d) for Nl[] copy\n", Pn, Nll);
+			Exit(1);
+		}
+		(void) bcopy((char *)Nl, (char *)nl, Nll);
+	}
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Access the name list file.
+ */
+	if (nlist(Nmlst ? Nmlst : VMUNIX, Nl) < 0) {
+		(void) fprintf(stderr, "%s: can't read namelist from %s\n",
+			Pn, Nmlst ? Nmlst : VMUNIX);
+                Exit(1);
+	}
+	if (get_Nl_value("aproc", Drive_Nl, &lv) < 0 || !lv) {
+		(void) fprintf(stderr, "%s: can't get proc table address\n",
+			Pn);
+		Exit(1);
+	}
+
+#if	defined(HAS_AFS)
+	if (nl) {
+
+	/*
+	 * If AFS is defined and we're getting kernel symbol values from
+	 * N_UNIX, and if any X_AFS_* symbols isn't there, see if it is in the
+	 * the AFS module name list file.  Make sure that other symbols that
+	 * appear in both name list files have the same values.
+	 */
+		if (get_Nl_value("arFID", Drive_Nl, &v[0]) >= 0 
+		&&  get_Nl_value("avol",  Drive_Nl, &v[1]) >= 0
+		&&  get_Nl_value("avol",  Drive_Nl, &v[2]) >= 0
+		&&  (!vo[0] || !v[1] || !v[2]))
+			(void) ckAFSsym(nl);
+		(void) free((MALLOC_P *)nl);
+	}
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Establish a maximum process count estimate.
+ */
+	if (get_Nl_value("mxproc", Drive_Nl, &lv) < 0
+	||  kread((KA_T)lv, (char *)&Mxp, sizeof(Mxp))
+	||  Mxp < 1)
+		Mxp = PROCDFLT;
+}
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	if (lseek(Kd, (off_t)addr, L_SET) == (off_t)-1L)
+		return(-1);
+	br = read(Kd, buf, len);
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * process_map() - process vm map for vnode references
+ */
+
+static void
+process_map(map)
+	caddr_t map;
+{
+	int i, j, n, ne;
+
+#if	STEPV<40
+/*
+ * Structures for NeXTSTEP and OPENSTEP < 4.0.
+ */
+	struct vm_map_entry {	/* (Should come from <vm/vm_map.h>). */
+		struct vm_map_entry *prev;
+		struct vm_map_entry *next;
+		unsigned int start;
+		unsigned int end;
+		caddr_t object;
+		unsigned int offset;
+		unsigned int
+			is_a_map:1,
+			is_sub_map:1,
+			copy_on_write:1,
+			needs_copy:1;
+		int protection;
+		int max_protection;
+		int inheritance;
+		int wired_count;
+	} vme, *vmep;
+
+#define VME_NEXT(entry) entry.next
+
+	struct vm_map {		/* (Should come from <vm/vm_map.h>.) */
+		caddr_t d1[SIMPLE_LOCK_SIZE + 2];
+		struct vm_map_entry header;
+		int nentries;
+		caddr_t pmap;
+		unsigned int size;
+		boolean_t is_main_map;
+	} vmm;
+	struct vm_object {	/* (Should come from <vm/vm_object.h>.) */
+		caddr_t d1[SIMPLE_LOCK_SIZE + 4];
+		unsigned int size;
+		short ref_count, resident_page_count;
+		caddr_t copy;
+		caddr_t pager;
+		int pager_request, pager_name;
+		unsigned int paging_offset;
+		caddr_t shadow;
+	} vmo, vmso;
+#else	/* STEPV>=40 */
+/*
+ * Structures for OPENSTEP >= 4.0.
+ */
+	struct vm_map_links {   /* (Should come from <vm/vm_map.h>). */
+		struct vm_map_entry *prev;
+		struct vm_map_entry *next;
+		unsigned int start;
+		unsigned int end;
+	};
+	struct vm_map_entry {	/* (Should come from <vm/vm_map.h>). */
+		struct vm_map_links links;
+		caddr_t object;
+		unsigned int offset;
+		unsigned int
+			is_shared:1,
+			is_sub_map:1,
+			in_transition:1,
+			needs_wakeup:1,
+			behavior:2,
+			needs_copy:1,
+			protection:3,
+			max_protection:3,
+			inheritance:2,
+			pad1:1,
+			alias:8;
+		unsigned short wired_count;
+		unsigned short user_wired_count;
+	} vme, *vmep;
+
+#define VME_NEXT(entry) entry.links.next
+
+	struct vm_map_header {   /* (Should come from <vm/vm_map.h>.) */
+		struct vm_map_links links;
+		int nentries;
+		int entries_pageable;
+	};
+	struct vm_map {		     /* (Should come from <vm/vm_map.h>.) */
+		caddr_t d1[SIMPLE_LOCK_SIZE + 2];
+		struct vm_map_header hdr;
+		caddr_t pmap;
+		unsigned int size;
+		boolean_t is_main_map; /* Darwin header has this as ref_count,
+					* but we'll take some liberties ... */
+	} vmm;
+	struct vm_object {	     /* (Should come from <vm/vm_object.h>.) */
+		caddr_t d1[SIMPLE_LOCK_SIZE + 4];
+		unsigned int size;
+		short ref_count, resident_page_count;
+		caddr_t copy;
+		caddr_t shadow;
+		unsigned int shadow_offset;
+		caddr_t pager;
+		unsigned int paging_offset;
+		int pager_request;
+	} vmo, vmso;
+#endif	/* STEPV<40 */
+
+	struct vstruct {	/* (Should come from <vm/vnode_pager.h>.) */
+		boolean_t is_device;
+		caddr_t vs_pf;
+		caddr_t pfMapEntry;
+		unsigned int vs_swapfile:1;
+		short vs_count;
+		int vs_size;
+		caddr_t vs_vp;
+	} vmp;
+/*
+ * Read the vm map.
+ */
+	if (!map
+	||  kread((KA_T)map, (char *)&vmm, sizeof(vmm)))
+		return;
+	if (!vmm.is_main_map)
+		return;
+/*
+ * Look for non-map and non-sub-map vm map entries that have an object
+ * with a shadow whose pager pointer addresses a non-swap-file istruct
+ * that has a vnode pointer.  Process the unique vnodes found.
+ */ 
+#if	STEPV<40
+	vme = vmm.header;
+	ne = vmm.nentries;
+#else	/* STEPV>=40 */
+	if (!vmm.hdr.links.next
+	||  kread((KA_T)vmm.hdr.links.next, (char *)&vme, sizeof(vme)))
+	    return;
+	ne = vmm.hdr.nentries;
+#endif	/* STEPV<40 */
+
+	if (ne > 1000)
+	    ne = 1000;
+	for (i = n = 0; i < ne; i++) {
+	    if (i) {
+		if (!VME_NEXT(vme)
+		||  kread((KA_T)VME_NEXT(vme), (char *)&vme, sizeof(vme)))
+		    continue;
+	    }
+
+#if	STEPV<40
+	    if (vme.is_a_map || vme.is_sub_map)
+#else	/* STEPV>=40 */
+	    if (vme.is_sub_map)
+#endif	/* STEPV<40 */
+
+		continue;
+	    if (!vme.object
+	    ||  kread((KA_T)vme.object, (char *)&vmo, sizeof(vmo)))
+		continue;
+	    if (!vmo.shadow
+	    ||  kread((KA_T)vmo.shadow, (char *)&vmso, sizeof(vmso)))
+		continue;
+	    if (!vmso.pager
+	    ||  kread((KA_T)vmso.pager, (char *)&vmp, sizeof(vmp)))
+		continue;
+	    if (vmp.is_device || vmp.vs_swapfile || !vmp.vs_vp)
+		continue;
+	/*
+	 * See if the vnode has been processed before.
+	 */
+	    for (j = 0; j < n; j++) {
+		if ((KA_T)vmp.vs_vp == Vp[j])
+		    break;
+	    }
+	    if (j < n)
+		continue;
+	/*
+	 * Process a new vnode.
+	 */
+	    alloc_lfile("txt", -1);
+	    FILEPTR = (struct file *)NULL;
+	    process_node((KA_T)vmp.vs_vp);
+	    if (Lf->sf)
+		link_lfile();
+	/*
+	 * Allocate space for remembering the vnode.
+	 */
+	    if (!Vp) {
+		if (!(Vp = (KA_T *)malloc((MALLOC_S)
+					  (sizeof(struct vnode *) * 10))))
+		{
+		    (void) fprintf(stderr, "%s: no txt ptr space, PID %d\n",
+			Pn, Lp->pid);
+		    Exit(1);
+		}
+		Nv = 10;
+	    } else if (n >= Nv) {
+		Nv += 10;
+		if (!(Vp = (KA_T *)realloc((MALLOC_P *)Vp,
+			       (MALLOC_S)(Nv * sizeof(struct vnode *)))))
+		{
+		    (void) fprintf(stderr,
+			"%s: no more txt ptr space, PID %d\n", Pn, Lp->pid);
+		    Exit(1);
+		}
+	    }
+	    Vp[n++] = (KA_T)vmp.vs_vp;
+	}
+}
+
+
+/*
+ * read_proc() - read proc structures
+ */
+
+static void
+read_proc()
+{
+	static KA_T apav = (KA_T)0;
+	static int apax = -1;
+	int i, try;
+	static int sz = 0;
+	KA_T kp;
+	struct proc *p;
+/*
+ * Try PROCTRYLM times to read a valid proc table.
+ */
+	for (try = 0; try < PROCTRYLM; try++) {
+
+	/*
+	 * Read kernel's process list pointer.  This needs to be done each
+	 * time lsof rereads the process list.
+	 */
+	    if (apax < 0) {
+		if ((apax = get_Nl_value("aproc", Drive_Nl, &apav)) < 0) {
+		    (void) fprintf(stderr,
+			"%s: can't get process table address pointer\n", Pn);
+		    Exit(1);
+		}
+	    }
+	    if (kread((KA_T)apav, (char *)&Kp, sizeof(Kp))) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read %s from %#x\n",
+			Pn, Nl[apax].n_un.n_name, apav);
+		continue;
+	    }
+
+	/*
+	 * Pre-allocate proc structure space.
+	 */
+		if (sz == 0) {
+		    sz = Mxp;
+		    if (!(P = (struct proc *)malloc((MALLOC_S)
+				(sz * sizeof(struct proc)))))
+		    {
+			(void) fprintf(stderr, "%s: no proc table space\n",
+			    Pn);
+			Exit(1);
+		    }
+		    if (!(Pa = (KA_T *)malloc((MALLOC_S)(sz * sizeof(KA_T)))))
+		    {
+			(void) fprintf(stderr, "%s: no proc pointer space\n",
+			    Pn);
+			Exit(1);
+		    }
+		}
+	/*
+	 * Accumulate proc structures.
+	 */
+		for (kp = Kp, Np = 0; kp; ) {
+			if (kread(kp, (char *)&P[Np], sizeof(struct proc))) {
+				Np = 0;
+				break;
+			}
+			Pa[Np] = kp;
+			kp = (KA_T)P[Np].p_nxt;
+			if (P[Np].p_stat == 0 || P[Np].p_stat == SZOMB)
+				continue;
+			Np++;
+			if (Np >= sz) {
+
+			/*
+			 * Expand the local proc table.
+			 */
+				sz += PROCDFLT/2;
+				if (!(P = (struct proc *)realloc((MALLOC_P *)P,
+					(MALLOC_S)(sizeof(struct proc) * sz))))
+				{
+					(void) fprintf(stderr,
+						"%s: no more (%d) proc space\n",
+						Pn, sz);
+					Exit(1);
+				}
+				if (!(Pa = (KA_T *)realloc((MALLOC_P *)Pa,
+					(MALLOC_S)(sizeof(KA_T) * sz))))
+				{
+					(void) fprintf(stderr,
+					    "%s: no more (%d) proc ptr space\n",
+					    Pn, sz);
+					Exit(1);
+				}
+			}
+		}
+	/*
+	 * If not enough processes were saved in the local table, try again.
+	 */
+		if (Np >= PROCMIN)
+			break;
+	}
+/*
+ * Quit if no proc structures were stored in the local table.
+ */
+	if (try >= PROCTRYLM) {
+		(void) fprintf(stderr, "%s: can't read proc table\n", Pn);
+		Exit(1);
+	}
+	if (Np < sz && !RptTm) {
+
+	/*
+	 * Reduce the local proc structure table size to a minimum if
+	 * not in repeat mode.
+	 */
+		if (!(P = (struct proc *)realloc((MALLOC_P *)P,
+			 (MALLOC_S)(sizeof(struct proc) * Np))))
+		{
+			(void) fprintf(stderr,
+				"%s: can't reduce proc table to %d\n",
+				Pn, Np);
+			Exit(1);
+		}
+		if (!(Pa = (KA_T *)realloc((MALLOC_P *)Pa,
+			  (MALLOC_S)(sizeof(KA_T) * Np))))
+		{
+			(void) fprintf(stderr,
+				"%s: can't reduce proc ptrs to %d\n",
+				Pn, Np);
+			Exit(1);
+		}
+	}
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/n+os/dproto.h
new file mode 100644
index 0000000..19c1042
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dproto.h
@@ -0,0 +1,53 @@
+/*
+ * dproto.h - NEXTSTEP and OPENSTEP function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.6 2001/08/09 11:44:07 abe Exp $
+ */
+
+
+#if	STEPV>=31
+_PROTOTYPE(extern void clr_svnc,(void));
+#endif	/* STEPV>=31 */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+
+#if     defined(HAS_AFS)
+_PROTOTYPE(extern struct vnode *alloc_vcache,(void));
+_PROTOTYPE(extern void ckAFSsym,(struct nlist *nl));
+_PROTOTYPE(extern int hasAFS,(struct vnode *vp));
+_PROTOTYPE(extern void process_socket,(KA_T vp));
+_PROTOTYPE(extern int readafsnode,(caddr_t va, struct vnode *v, struct afsnode *
+an));
+#endif  /* defined(HAS_AFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/n+os/dsock.c
new file mode 100644
index 0000000..77d3b8a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dsock.c
@@ -0,0 +1,306 @@
+/*
+ * dsock.c - NEXTSTEP and OPENSTEP socket processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.17 2005/08/08 19:54:03 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(sa)
+	KA_T sa;			/* socket address in kernel */
+{
+	struct domain d;
+	char *ep;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam;
+	int fp, lp;
+	struct inpcb inp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct mbuf mb;
+	struct protosw p;
+	struct rawcb raw;
+	struct socket s;
+	size_t sz;
+	struct tcpcb t;
+	struct unpcb uc, unp;
+	struct sockaddr_un *ua = NULL;
+	struct sockaddr_un un;
+
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+	Lf->inp_ty = 2;
+/*
+ * Read socket structure.
+ */
+	if (!sa) {
+	    enter_nm("no socket address");
+	    return;
+	}
+	if (kread((KA_T) sa, (char *) &s, sizeof(s))) {
+	    (void) snpf(Namech,Namechl,"can't read socket struct from %#x",sa);
+	    enter_nm(Namech);
+	    return;
+	}
+	if (!s.so_type) {
+	     enter_nm("no socket type");
+	    return;
+	}
+/*
+ * Read protocol switch and domain structures.
+ */
+	if (!s.so_proto
+	||  kread((KA_T) s.so_proto, (char *) &p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl, "no protocol switch");
+	    enter_nm(Namech);
+	    return;
+	}
+	if (kread((KA_T) p.pr_domain, (char *) &d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read domain struct from %s",
+		print_kptr((KA_T)p.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Save size information.
+ */
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)s.so_rcv.sb_cc;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)s.so_snd.sb_cc;
+	    else
+		Lf->sz = (SZOFFTYPE)(s.so_rcv.sb_cc + s.so_snd.sb_cc);
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rq = (unsigned long)s.so_rcv.sb_cc;
+	Lf->lts.sq = (unsigned long)s.so_snd.sb_cc;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.ltm = (unsigned int)s.so_linger;
+	Lf->lts.opt = (unsigned int)s.so_options;
+	Lf->lts.pqlen = (unsigned int)s.so_q0len;
+	Lf->lts.qlen = (unsigned int)s.so_qlen;
+	Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+	Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+	Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+		       = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = (unsigned int)s.so_state;
+#endif	/* defined(HASSOSTATE) */
+
+/*
+ * Process socket by the associated domain family.
+ */
+	switch ((fam = d.dom_family)) {
+/*
+ * Process an Internet domain socket.
+ */
+	case AF_INET:
+	    if (Fnet)
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+	    printiproto(p.pr_protocol);
+	/*
+	 * Read protocol control block.
+	 */
+	    if (!s.so_pcb) {
+		(void) snpf(Namech, Namechl, "no PCB%s%s",
+		    (s.so_state & SS_CANTSENDMORE) ? ", CANTSENDMORE" : "",
+		    (s.so_state & SS_CANTRCVMORE)  ? ", CANTRCVMORE"  : "");
+		enter_nm(Namech);
+		return;
+	    }
+	    if (s.so_type == SOCK_RAW) {
+
+	    /*
+	     * Print raw socket information.
+	     */
+		if (kread((KA_T) s.so_pcb, (char *)&raw, sizeof(raw))
+		||  (struct socket *)sa != raw.rcb_socket) {
+		    (void) snpf(Namech, Namechl, "can't read rawcb at %s",
+			print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		enter_dev_ch(print_kptr((KA_T)(raw.rcb_pcb ? raw.rcb_pcb
+							   : s.so_pcb),
+						    (char *)NULL, 0));
+		if (raw.rcb_laddr.sa_family == AF_INET)
+		    la = (unsigned char *)&raw.rcb_laddr.sa_data[2];
+		else if (raw.rcb_laddr.sa_family)
+		    printrawaddr(&raw.rcb_laddr);
+		if (raw.rcb_faddr.sa_family == AF_INET)
+		    fa = (unsigned char *)&raw.rcb_faddr.sa_data[2];
+		else if (raw.rcb_faddr.sa_family) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, "->");
+		    printrawaddr(&raw.rcb_faddr);
+		}
+		if (fa || la)
+		    (void) ent_inaddr(la, -1, fa, -1, AF_INET);
+	    } else {
+
+	    /*
+	     * Print Internet socket information.
+	     */
+		if (kread((KA_T)s.so_pcb, (char *) &inp, sizeof(inp))
+		||  (struct socket *)sa != inp.inp_socket) {
+		    (void) snpf(Namech, Namechl, "can't read inpcb at %s",
+			 print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
+							    : s.so_pcb),
+					 (char *)NULL, 0));
+	    /*
+	     * If the protocol is TCP, try to read the TCP protocol
+	     * control block to record its state.
+	     */
+		if (p.pr_protocol == IPPROTO_TCP
+		&&  inp.inp_ppcb
+		&&  kread((KA_T)inp.inp_ppcb, (char *)&t, sizeof(t)) == 0) {
+		    Lf->lts.type = 0;
+		    Lf->lts.state.i = (int)t.t_state;
+
+#if	defined(HASTCPOPT)
+		    Lf->lts.mss = (unsigned long)t.t_maxseg;
+		    Lf->lts.msss = (unsigned char)1;
+		    Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+		}
+	    /*
+	     * Process the local and foreign addresses from the Internet
+	     * control block.
+	     */
+		la = (unsigned char *)&inp.inp_laddr;
+		lp = (int)ntohs(inp.inp_lport);
+		if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport != 0) {
+		    fa = (unsigned char *)&inp.inp_faddr;
+		    fp = (int)ntohs(inp.inp_fport);
+		}
+		if (fa || la)
+		    (void) ent_inaddr(la, lp, fa, fp, AF_INET);
+	    }
+	    break;
+/*
+ * Process a Unix domain socket.
+ */
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    if (kread((KA_T) s.so_pcb, (char *) &unp, sizeof(unp))) {
+		(void) snpf(Namech, Namechl, "can't read unpcb at %s",
+		    print_kptr((KA_T)s.so_pcb, (char *)NULL, 0));
+		break;
+	    }
+	    if ((struct socket *)sa != unp.unp_socket) {
+		(void) snpf(Namech, Namechl, "unp_socket (%s) mismatch",
+		    print_kptr((KA_T)unp.unp_socket, (char *)NULL, 0));
+		break;
+	    }
+	    if (unp.unp_addr) {
+		if (kread((KA_T) unp.unp_addr, (char *) &mb, sizeof(mb))) {
+		    (void) snpf(Namech, Namechl, "can't read unp_addr at %s",
+			print_kptr((KA_T)unp.unp_addr, (char *)NULL, 0));
+		    break;
+		}
+		ua = (struct sockaddr_un *)(((char *)&mb) + mb.m_off);
+	    }
+	    if (!ua) {
+		ua = &un;
+		(void) bzero((char *)ua, sizeof(un));
+		ua->sun_family = AF_UNSPEC;
+	    }
+	/*
+	 * Print information on Unix socket that has no address bound
+	 * to it, although it may be connected to another Unix domain
+	 * socket as a pipe.
+	 */
+	    if (ua->sun_family != AF_UNIX) {
+		if (ua->sun_family == AF_UNSPEC) {
+		    if (unp.unp_conn) {
+			if (kread((KA_T)unp.unp_conn, (char *) &uc, sizeof(uc)))
+			{
+			    (void) snpf(Namech, Namechl,
+				"can't read unp_conn at %s",
+				print_kptr((KA_T)unp.unp_conn,(char *)NULL,0));
+			} else {
+			    (void) snpf(Namech, Namechl, "->%s",
+				print_kptr((KA_T)uc.unp_socket,(char *)NULL,0));
+			}
+		    } else
+			(void) snpf(Namech, Namechl, "->(none)");
+		} else
+		    (void) snpf(Namech, Namechl, "unknown sun_family (%d)",
+			ua->sun_family);
+		break;
+	    }
+	    if (ua->sun_path[0]) {
+		if (mb.m_len >= sizeof(struct sockaddr_un))
+		    mb.m_len = sizeof(struct sockaddr_un) - 1;
+		*((char *)ua + mb.m_len) = '\0';
+		if (Sfile && is_file_named(ua->sun_path, 0))
+		    Lf->sf |= SELNM;
+		if (!Namech[0])
+		    (void) snpf(Namech, Namechl, "%s", ua->sun_path);
+	    } else
+		(void) snpf(Namech, Namechl, "no address");
+	    break;
+	default:
+	    printunkaf(fam, 1);
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/n+os/dstore.c
new file mode 100644
index 0000000..b250fde
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/dstore.c
@@ -0,0 +1,133 @@
+/*
+ * dstore.c - NEXTSTEP and OPENSTEP global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.10 2001/08/09 11:44:07 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Global storage definitions
+ */
+
+#if	defined(HAS_AFS)
+
+# if    defined(HASAOPT)
+char *AFSApath = (char *)NULL;		/* alternate AFS name list path
+					 * (from -a) */
+# endif /* defined(HASAOPT) */
+
+struct vfs *AFSVfsp = (struct vfs *)NULL;
+					/* AFS vfs struct kernel address */
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+        { "arFid",	 "_afs_rootFid"		},
+        { "avops",	 "_afs_vnodeops"	},
+        { "avol",	 "_afs_volumes"		},
+        { "aproc",	 "_allproc"		},
+        { "fvops",	"_fifo_vnodeops"	},
+        { "lfsvh",	"_lf_svnode_hash"	},
+        { "mxproc",	 "_max_proc"		},
+
+#if	defined(X_NCACHE)
+        { X_NCACHE,	 "_ncache"		},
+#endif	/* defined(X_NCACHE) */
+
+#if	defined(X_NCSIZE)
+        { X_NCSIZE,	 "_ncsize"		},
+#endif	/* defined(X_NCSIZE) */
+
+        { "nvops",	 "_nfs_vnodeops"	},
+        { "svops",	 "_spec_vnodeops"	},
+        { "uvops",	 "_ufs_vnodeops"	},
+	{ "",		"",			},
+        { NULL,		NULL			},
+};
+
+struct file *Fileptr;		/* for process_file() in lib/prfp.c */
+int Kd = -1;			/* /dev/kmem file descriptor */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FASYNC,		FF_ASYNC	},
+	{ (long)FMARK,		FF_MARK		},
+	{ (long)FDEFER,		FF_DEFER	},
+	{ (long)FSHLOCK,	FF_SHLOCK	},
+	{ (long)FEXLOCK,	FF_EXLOCK	},
+
+#if	defined(POSIX_KERN)
+	{ (long)FPOSIX_PIPE,	FF_POSIX_PIPE	},
+#endif	/* defined(POSIX_KERN) */
+
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(UF_MAPPED)
+	{ (long)UF_MAPPED,	POF_MAPPED	},
+# endif	/* defined(UF_MAPPED) */
+
+# if	defined(UF_FDLOCK)
+	{ (long)UF_FDLOCK,	POF_FDLOCK	},
+# endif	/* defined(UF_FDLOCK) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/n+os/machine.h b/lsof_4.85/lsof_4.85_src/dialects/n+os/machine.h
new file mode 100644
index 0000000..9119ab6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/n+os/machine.h
@@ -0,0 +1,615 @@
+/*
+ * machine.h - NEXTSTEP and OPENSTEP definitions 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: machine.h,v 1.37 2010/07/29 16:02:55 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#define	CAN_USE_CLNT_CREATE	1
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+/* #define	GET_MAX_FD	?	*/
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+#define	HASAOPT		1
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+#define	HASINODE	1
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev?	*/
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+/* #define	HASPROCFS	"proc?" */
+/* #define	HASFSTYPE	1 */
+/* #define	HASPINODEN	1 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+#define	HASRNODE	1
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1	*/
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+/* #define	HASWIDECHAR	1	*/
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+#define	HASSNODE	1
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+/* #define	HASSTREAMS	1 */
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file
+ * system node, the vnode.  BSD derivatives usually do; System V derivatives
+ * prior to R4 usually don't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+/* #define	INODETYPE	unsigned long long */
+					/* inode number internal storage type */
+/* #define	INODEPSPEC	"ll"	 * INODETYPE printf specification
+					 * modifier */
+
+
+# if	!defined(MACH)
+/*
+ * The definition of MACH for NEXTSTEP is required for proper header
+ * file configuration -- i. e., some header files have ``#ifdef MACH''
+ * statements that affect the size of kernel structures.
+ */
+
+#define MACH	1
+# endif
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+/* #define	USE_LIB_CKKV			1	   ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+#define	USE_LIB_PROCESS_FILE			1	/* prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+#define	USE_LIB_READDEV				1	/* rdev.c */
+#define	USE_LIB_READMNT				1	/* rmnt.c */
+#define	USE_LIB_REGEX				1	/* regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+#define	USE_LIB_RNCH				1	/* rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+#define	HAS_NO_LONG_LONG			1	/* disable snpf()'s
+							 * long long support */
+#define	USE_LIB_SNPF				1	/* snpf.c */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)		bzero(a, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/Makefile b/lsof_4.85/lsof_4.85_src/dialects/osr/Makefile
new file mode 100644
index 0000000..d9e1591
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/Makefile
@@ -0,0 +1,165 @@
+
+# OSR Makefile
+#
+# $Id: Makefile,v 1.12 2008/04/15 13:30:40 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+GRP=
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+MODE=	2755
+
+OWN=	bin
+
+SRC=    dfile.c dmnt.c dnode.c dproc.c dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c \
+	util.c
+
+OBJ=	dfile.o dmnt.o dnode.o dproc.o dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o \
+	util.o
+
+MAN=	lsof.man
+MANLCL=	lsof.LOCAL
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${MANLCL}: ${MAN}
+	rm -f ${MANLCL}
+	cp ${MAN} ${MANLCL}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h ${MANLCL}
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all ${MANLCL} FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the mem group.  Your install rule actions might look'
+	@echo 'something like this:'
+	@echo ''
+	@echo '    strip $${PROG}'
+	@echo '    mcs -d $${PROG}'
+	@echo '    /etc/install -o -m <modes> -u <owner> -g <group> -f $${BIN} $${PROG}'
+	@echo '    /etc/install -o -m 444 -f $${DOC} $${MANLCL}'
+	@echo ''
+	@echo 'You will have to set values for  <modes>, <owner> and <group>,'
+	@echo 'and complete the skeletons for the BIN and DOC strings given'
+	@echo 'at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/man8'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	  echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"'`uname -X`'"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/osr/Mksrc
new file mode 100755
index 0000000..535b69c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/Mksrc
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# Mksrc - make SCO OpenServer source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.4 99/06/22 08:21:19 abe Exp $
+
+
+D=dialects/osr
+F=dialects/common
+L="dfile.c dlsof.h dmnt.c dnode.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/osr/dfile.c
new file mode 100644
index 0000000..1e9933a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dfile.c
@@ -0,0 +1,161 @@
+/*
+ * dfile.c - SCO OpenServer file processing functions for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1995 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.11 2000/12/04 14:32:49 abe Exp abe $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * get_max_fd() - get maximum file descriptor plus one
+ */
+
+int
+get_max_fd()
+{
+
+#if	defined(F_GETHFDO) || defined(_SC_OPEN_MAX)
+	int nd;
+#endif	/* defined(F_GETHFDO) || defined(_SC_OPEN_MAX) */
+
+#if	defined(F_GETHFDO)
+	if ((nd = fcntl(-1, F_GETHFDO, 0)) >= 0)
+	    return(nd);
+#endif	/* defined(F_GETHFDO) */
+
+#if	defined(_SC_OPEN_MAX)
+	if ((nd = sysconf(_SC_OPEN_MAX)) >= 0)
+	    return(nd);
+#endif	/* defined(_SC_OPEN_MAX) */
+
+	return(getdtablesize());
+}
+
+
+/*
+ * print_dev() - print dev
+ */
+
+char *
+print_dev(lf, dev)
+	struct lfile *lf;		/* file whose device is to be printed */
+	dev_t *dev;			/* device to be printed */
+{
+	static char buf[128];
+
+	(void) snpf(buf, sizeof(buf), "%d,%d",
+	    lf->is_nfs ? ((~(*dev >> 8)) & 0xff) : emajor(*dev),
+	    eminor(*dev));
+	return(buf);
+}
+
+
+/*
+ * print_ino() - print inode
+ */
+
+char *
+print_ino(lf)
+	struct lfile *lf;		/* file whose device is to be printed */
+{
+	static char buf[128];
+
+	(void) snpf(buf, sizeof(buf), (lf->inode & 0x80000000) ? "%#x" : "%lu",
+	    lf->inode);
+	return(buf);
+}
+
+
+/*
+ * process_file() - process file
+ */
+
+void
+process_file(fp)
+	KA_T fp;		/* kernel file structure address */
+{
+	struct file f;
+	int flag;
+
+	if (kread(fp, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read file struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	Lf->off = (SZOFFTYPE)f.f_offset;
+
+	if (f.f_count) {
+
+	/*
+	 * Construct access code.
+	 */
+	    if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+		Lf->access = 'r';
+	    else if (flag == FWRITE)
+		Lf->access = 'w';
+	    else if (flag == (FREAD | FWRITE))
+		Lf->access = 'u';
+	/*
+	 * Process structure.
+	 */
+
+#if	defined(HASFSTRUCT)
+	/*
+	 * Save file structure values.
+	 */
+	    if (Fsv & FSV_CT) {
+		Lf->fct = (long)f.f_count;
+		Lf->fsv |= FSV_CT;
+	    }
+	    if (Fsv & FSV_FA) {
+		Lf->fsa = fp;
+		Lf->fsv |= FSV_FA;
+	    }
+	    if (Fsv & FSV_FG) {
+		Lf->ffg = (long)f.f_flag;
+		Lf->fsv |= FSV_FG;
+	    }
+	    if (Fsv & FSV_NI) {
+		Lf->fna = (KA_T)f.f_inode;
+		Lf->fsv |= FSV_NI;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	    process_node((KA_T)f.f_inode);
+	    return;
+	}
+	enter_nm("no more information");
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/osr/dlsof.h
new file mode 100644
index 0000000..ebca8f2
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dlsof.h
@@ -0,0 +1,255 @@
+/*
+ * dlsof.h - SCO OpenServer header file for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.14 2007/04/24 16:22:40 abe Exp $
+ */
+
+
+#if	!defined(OSR_LSOF_H)
+#define	OSR_LSOF_H	1
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <mnttab.h>
+#include <nlist.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <string.h>
+
+# if	OSRV>=500
+#include <strings.h>
+# endif	/* OSRV>=500 */
+
+#include <stdlib.h>
+#include <unistd.h>
+
+#include <sys/conf.h>
+#include <sys/file.h>
+#include <sys/flock.h>
+#include <sys/fstyp.h>
+#include <sys/immu.h>
+#include <sys/inode.h>
+#include <sys/region.h>
+#include <sys/proc.h>
+#include <sys/sysi86.h>
+
+/*
+ * This confusing sequence of redefinitions of xdevmap allows lsof to size
+ * its copy of the kernel's xdevmap[] table dynamically, based on the
+ * kernel's nxdevmaps value.
+ *
+ * The net result is that there is a dummy struct XDEVMAP[1], defined in
+ * dstore.c, that is never used.  The copy of the kernel's xdevmap[] table
+ * is stored in the space malloc()'d in dproc.c and addressed by Xdevmap.
+ * The last redefinition of xdevmap to Xdevmap causes the macros of
+ * <sys/sysmacros.h> to use Xdevmap.
+ *
+ * All this is done: 1) to avoid having to allocate a large amount of fixed
+ * space in advance to a copy of the kernel's xdevmap; and 2) to keep CC from
+ * complaining about the absence of a "struct xdevmap xdevmap[]," matching
+ * the "extern struct xdevmap xdevmap[]" declaration in <sys/sysmacros.h>,
+ * while still allowing lsof to use the equivalent of a "struct xdevmap *"
+ * construct instead, particularly with the kernel forms of the major() and
+ * minor() macros.
+ */
+
+#define	xdevmap	XDEVMAP
+#define	_INKERNEL
+#include <sys/sysmacros.h>
+#undef	_INKERNEL
+extern struct XDEVMAP *Xdevmap;
+#undef	xdevmap
+#define	xdevmap	Xdevmap
+
+#include <sys/stream.h>
+#include <sys/time.h>
+#include <sys/dir.h>
+#include <sys/user.h>
+#include <sys/var.h>
+
+# if	defined(HAS_NFS)
+#define	multiple_groups	1
+#include <sys/fs/nfs/types.h>
+#include <sys/fs/nfs/nfs.h>
+#include <sys/fs/nfs/ucred.h>
+#include <sys/fs/nfs/rnode.h>
+# endif	/* defined(HAS_NFS) */
+
+#include <sys/socket.h>
+#include <sys/net/domain.h>
+#undef	NOGROUP
+#include <rpc/rpc.h>
+#include <rpc/pmap_prot.h>
+
+# if	OSRV<500
+#include <sys/net/protosw.h>
+#include <sys/net/socketvar.h>
+# else	/* OSRV>=500 */
+#include <sys/protosw.h>
+#include <sys/socketvar.h>
+#include <sys/un.h>
+#include <sys/fs/hpps.h>
+# endif	/* OSRV<500 */
+
+#include <sys/netinet/in.h>
+#include <sys/net/route.h>
+#include <sys/netinet/in_pcb.h>
+#include <sys/netinet/ip_var.h>
+#include <sys/netinet/tcp.h>
+#include <sys/netinet/tcp_fsm.h>
+#include <sys/netinet/tcp_timer.h>
+#include <sys/netinet/tcp_var.h>
+#include <sys/netinet/udp.h>
+#include <sys/utsname.h>
+
+#define	INKERNEL
+#include <sys/netinet/udp_var.h>
+#undef	INKERNEL
+
+
+/*
+ * Adjust for the availability of symbolic links.
+ */
+
+# if	defined(HAS_STATLSTAT)
+#define	lstat	statlstat
+# else	/* !defined(HAS_STATLSTAT) */
+#define	lstat	stat
+#define	readlink(path, buf, len)	(-1)
+# endif	/* defined(HAS_STATLSTAT) */
+
+
+
+#define	COMP_P		const void
+#define DEVINCR		1024	/* device table malloc() increment */
+#define	DIRTYPE		dirent
+typedef	off_t		KA_T;
+#define	KMEM		"/dev/kmem"
+#define MALLOC_P	void
+#define	MNTTAB		"/etc/mnttab"
+#define FREE_P		MALLOC_P
+#define MALLOC_S	size_t
+
+# if	!defined(MAXPATHLEN)
+#define	MAXPATHLEN	1024
+# endif	/* !defined(MAXPATHLEN) */
+
+#define MAXSEGS		100	/* maximum text segments */
+#define	MAXSYSCMDL	(PSCOMSIZ - 1)	/* max system command name length */
+
+# if	OSRV<500
+#define	N_UNIX		"/unix"
+# endif	/* OSRV<500 */
+
+#define	PROCBFRD	16	/* count of proc structures buffered */
+#define	PROCSIZE	sizeof(struct proc)
+#define QSORT_P		void
+#define	READLEN_T	unsigned
+#define STRNCPY_L	size_t
+#define	STRNML		32
+#define U_SIZE		sizeof(struct user)
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+extern char **Cdevsw;
+extern int Cdevcnt;
+extern int CloneMajor;
+extern int EventMajor;
+extern char **Fsinfo;
+extern int Fsinfomax;
+extern int HaveCloneMajor;
+extern int HaveEventMajor;
+extern int HaveSockdev;
+extern int Hz;
+extern int Kd;
+extern KA_T Lbolt;
+
+extern int nxdevmaps;			/* maximum kernel xdevmap[] index */
+
+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 */
+
+# if	defined(HASFSTYPE)
+	char *fstype;			/* st_fstype */
+# endif
+
+};
+
+#define	NL_NAME		n_name		/* name element in struct nlist */
+
+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 */
+	mode_t 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 */
+};
+
+extern int Sockdev;
+extern KA_T Socktab;
+
+/*
+ * Definitions for dvch.c, isfn.c, and rdev.c
+ */
+
+#define	CLONEMAJ	CloneMajor	/* clone major variable name */
+
+# if	defined(HASDCACHE)
+#  if	OSRV<500
+#define	DVCH_CHOWN	1		/* no fchown() below release 5.0 */
+#  endif	/* OSRV<500 */
+# endif	/* defined(HASDCACHE) */
+
+#define	HAS_STD_CLONE	1		/* has standard clone structure */
+#define	HAVECLONEMAJ	HaveCloneMajor	/* clone major status variable name */
+
+#endif	/* OSR_LSOF_H	*/
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/osr/dmnt.c
new file mode 100644
index 0000000..47e33f4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dmnt.c
@@ -0,0 +1,219 @@
+/*
+ * dmnt.c - SCO OpenServer mount support functions for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1995 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.8 2005/08/08 19:54:32 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	int br, fd;
+	int bx = sizeof(struct mnttab);
+	char *cp;
+	char dvnm[MAXPATHLEN], fsnm[MAXPATHLEN];
+ 	MALLOC_S dvnml, fsnml;
+	MALLOC_S len;
+	char *ln = (char *)NULL;
+	struct mnttab m;
+	struct mounts *mtp;
+	struct stat sb;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Open access to the mount table.
+ */
+	if ((fd = open(MNTTAB, O_RDONLY, 0)) < 0) {
+	    (void) fprintf(stderr, "%s: can't open %s\n", Pn, MNTTAB);
+	    Exit(1);
+	}
+/*
+ * Read the first mount table entry.
+ */
+	br = read(fd, (char *)&m, bx);
+	dvnml = fsnml = 0;
+/*
+ * Process the next complete mount table entry.
+ */
+	while (br == bx) {
+	    if (!dvnml) {
+
+	    /*
+	     * Start the device and file system name assemblies.
+	     */
+		dvnml = strlen(m.mt_dev);
+		if (dvnml >= MAXPATHLEN)
+		    dvnml = MAXPATHLEN - 1;
+		(void) strncpy(dvnm, m.mt_dev, dvnml);
+		dvnm[dvnml] = '\0';
+		fsnml = strlen(m.mt_filsys);
+		if (fsnml >= MAXPATHLEN)
+		    fsnml = MAXPATHLEN - 1;
+		(void) strncpy(fsnm, m.mt_filsys, fsnml);
+		fsnm[fsnml] = '\0';
+	    }
+	    while ((br = read(fd, (char *)&m, bx)) == bx
+	    &&      strcmp(m.mt_filsys, "nothing") == 0
+	    &&	    strcmp(m.mt_dev,    "nowhere") == 0) {
+
+	    /*
+	     * Add the "nothing/nowhere" extensions to the assemblies.
+	     */
+		len = strlen(&m.mt_dev[8]);
+		if (len >= (MAXPATHLEN - dvnml))
+		    len = MAXPATHLEN - dvnml - 1;
+		if (len) {
+		    (void) strncpy(&dvnm[dvnml], &m.mt_dev[8], len);
+		    dvnml += len;
+		    dvnm[dvnml] = '\0';
+		}
+		len = strlen(&m.mt_filsys[8]);
+		if (len >= (MAXPATHLEN - fsnml))
+		    len = MAXPATHLEN - fsnml - 1;
+		if (len) {
+		    (void) strncpy(&fsnm[fsnml], &m.mt_filsys[8], len);
+		    fsnml += len;
+		    fsnm[fsnml] = '\0';
+		}
+	    }
+	/*
+	 * Skip automount place markers.
+	 */
+	    if ((cp = strrchr(dvnm, ':')) && strncmp(cp, ":(pid", 5) == 0) {
+		dvnml = fsnml = 0;
+		continue;
+	    }
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (ln) {
+		(void) free((FREE_P *)ln);
+		ln = (char *)NULL;
+	    }
+	    if (!(ln = Readlink(fsnm))) {
+		if (!Fwarn){
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		dvnml = fsnml = 0;
+		continue;
+	    }
+	    if (*ln != '/')
+		continue;
+	    if (ln == fsnm) {
+
+	    /*
+	     * Allocate space for a copy of the file system name.
+	     */
+		if (!(ln = mkstrcpy(fsnm, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		    (void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		    safestrprt(fsnm, stderr, 0);
+		    (void) fprintf(stderr, " (");
+		    safestrprt(dvnm, stderr, 0);
+		    (void) fprintf(stderr, ")\n");
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(ln, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't stat() file system: ", Pn);
+		    safestrprt(fsnm, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		dvnml = fsnml = 0;
+		continue;
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+	    mtp->dir = ln;
+	    ln = (char *)NULL;
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link
+	 */
+	    if (!(cp = mkstrcpy(dvnm, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = cp;
+	    ln = Readlink(cp);
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    ln = (char *)NULL;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	    dvnml = fsnml = 0;
+	}
+	(void) close(fd);
+/*
+ * Clean up and return the local mount information table address.
+ */
+	if (ln)
+	    (void) free((FREE_P *)ln);
+	Lmist = 1;
+	return(Lmi);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/osr/dnode.c
new file mode 100644
index 0000000..755c82f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dnode.c
@@ -0,0 +1,739 @@
+/*
+ * dnode.c - SCO OpenServer node functions for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1995 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.21 2006/03/28 22:09:23 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+_PROTOTYPE(static struct l_dev * finddev,(dev_t *dev, dev_t *rdev, int stream));
+
+
+/*
+ * finddev() - look up device by device number
+ */
+
+static struct l_dev *
+finddev(dev, rdev, stream)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+	int stream;			/* stream if 1 */
+{
+	struct clone *c;
+	struct l_dev *dp;
+/*
+ * Search device table for match.
+ */
+
+#if	defined(HASDCACHE)
+
+finddev_again:
+
+#endif	/* defined(HASDCACHE) */
+
+	if ((dp = lkupdev(dev, rdev, 0, 0)))
+	    return(dp);
+/*
+ * Search for clone.
+ */
+	if (stream && Clone) {
+	    for (c = Clone; c; c = c->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MIN_DEV(Devtp[c->dx].rdev)) {
+
+#if	defined(HASDCACHE)
+		    if (DCunsafe && !Devtp[c->dx].v && !vfy_dev(&Devtp[c->dx]))
+			goto finddev_again;
+#endif	/* defined(HASDCACHE) */
+
+		    return(&Devtp[c->dx]);
+		}
+	    }
+	}
+	return((struct l_dev *)NULL);
+}
+
+
+/*
+ * process_node() - process node
+ */
+
+void
+process_node(na)
+	KA_T na;			/* inode kernel space address */
+{
+	char *cp, tbuf[32];
+	short dl;
+	struct l_dev *dp;
+	unsigned char *fa = (unsigned char *)NULL;
+	struct filock fl;
+	KA_T flf, flp;
+	int fp, lp;
+	struct inode i;
+	short ity, udpsf, udpsl;
+	int j, k, l;
+	KA_T ka, qp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct mounts *lm;
+	struct module_info mi;
+	unsigned short *n;
+	KA_T p;
+	struct inpcb pcb;
+	int port;
+	int pt = -1;
+	struct queue q;
+	struct qinit qi;
+	struct stdata sd;
+	char *tn;
+	int type;
+	struct udpdev udp;
+	short udptm = 0;
+
+#if	defined(HAS_NFS)
+	struct rnode r;
+#endif	/* defined(HAS_NFS) */
+
+#if	OSRV>=500
+	short hpps = 0;
+	unsigned short *n1;
+	struct pipeinode pi;
+#endif	/* OSRV>=500 */
+
+/*
+ * Read the inode.
+ */
+	if ( ! na) {
+	    enter_nm("no inode address");
+	    return;
+	}
+	if (readinode(na, &i)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASNCACHE)
+	Lf->na = na;
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = na;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Identify the node type.
+ */
+	if (HaveSockdev && (i.i_ftype & IFMT) == IFCHR
+	&&  GET_MAJ_DEV(i.i_rdev) == Sockdev)
+	{
+
+	/*
+	 * Process a socket.
+	 */
+	    process_socket(&i);
+	    return;
+	}
+	if (Selinet)
+	    return;
+	ity = i.i_fstyp;
+	type = i.i_ftype & IFMT;
+	if (ity < 1 || ity > Fsinfomax || !Fsinfo[ity-1]) {
+
+#if	OSRV>=500
+	    if (ity) {
+#endif	/* OSRV>=500 */
+
+		(void) snpf(Namech,Namechl,"unknown fstyp (%d) in inode",ity);
+		enter_nm(Namech);
+		return;
+
+#if	OSRV>=500
+	    }
+#endif	/* OSRV>=500 */
+
+	}
+	if (ity && strcasecmp(Fsinfo[ity-1], "HS") == 0)
+	    Ntype = N_HSFS;
+
+#if	defined(HAS_NFS)
+	 else if (ity && strcasecmp(Fsinfo[ity-1], "NFS") == 0) {
+
+	/*
+	 * Get information on NFS file.
+	 */
+	    Ntype = N_NFS;
+	    Lf->is_nfs = 1;
+	    if (Fnfs)
+			Lf->sf |= SELNFS;
+	    if (!i.i_fsptr || readrnode((KA_T)i.i_fsptr, &r)) {
+		(void) snpf(Namech, Namechl, "can't read rnode (%s)",
+		    print_kptr((KA_T)i.i_fsptr, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+
+# if    defined(HASNCACHE)
+	    Lf->na = (KA_T)i.i_fsptr;
+# endif /* defined(HASNCACHE) */
+
+	}
+#endif	/* defined(HAS_NFS) */
+
+	else {
+
+	/*
+	 * Determine the node type from the inode file type.
+	 */
+	    switch (type) {
+	    case IFBLK:
+		Ntype = N_BLK;
+		break;
+	    case IFCHR:
+		Ntype = N_CHR;
+		break;
+	    case IFIFO:
+		Ntype = N_FIFO;
+		break;
+	    case IFMPB:
+	    case IFMPC:
+		Ntype = N_MPC;
+		break;
+	    case IFNAM:
+		Ntype = N_NM;
+		break;
+	    }
+	}
+/*
+ * Obtain lock information.
+ */
+	if ((flf = (KA_T)i.i_filocks)) {
+	    flp = flf;
+	    do {
+		if ((kread(flp, (char *)&fl, sizeof(fl))))
+		    break;
+		if (fl.set.l_pid != (pid_t)Lp->pid)
+		    continue;
+		if (fl.set.l_whence == (short)0 &&  fl.set.l_start == (off_t)0
+		&&  fl.set.l_len == 0x7fffffff)
+		    l = 1;
+		else
+		    l = 0;
+
+#if	OSRV<500
+		if (i.i_flag & IXLOCKED)
+#else	/* OSRV>=500 */
+		if (fl.flags & F_XOUT)
+#endif	/* OSRV<500 */
+
+		    Lf->lock = l ? 'X' : 'x';
+		else if (fl.set.l_type == F_RDLCK)
+		    Lf->lock = l ? 'R' : 'r';
+		else if (fl.set.l_type == F_WRLCK)
+		    Lf->lock = l ? 'W' : 'w';
+		else if (fl.set.l_type == (F_RDLCK | F_WRLCK))
+		    Lf->lock = 'u';
+		break;
+	    } while ((flp = (KA_T)fl.next) && flp != flf);
+	}
+
+#if	OSRV>=500
+/*
+ * See if a FIFO node is an HPPS node -- 3.2v5.0.0 and higher.
+ */
+	if (Ntype == N_FIFO && ity && strcasecmp(Fsinfo[ity-1], "HPPS") == 0)
+	{
+	    hpps = 1;
+	    if (i.i_fsptr) {
+		enter_dev_ch(print_kptr((KA_T)i.i_fsptr, (char )NULL, 0));
+		if (kread((KA_T)i.i_fsptr, (char *)&pi, sizeof(pi)) == 0)
+		    hpps = 2;
+	    }
+	}
+#endif	/* OSRV>=500 */
+
+/*
+ * Determine the device.
+ */
+	switch (Ntype) {
+	case N_BLK:
+	    Lf->dev = i.i_dev;
+	    Lf->rdev = i.i_rdev;
+	    Lf->dev_def = Lf->rdev_def = 1;
+	    break;
+	case N_FIFO:
+	case N_HSFS:
+	case N_NM:
+	case N_REGLR:
+
+#if	OSRV>=500
+	    if (hpps)
+		break;
+#endif	/* OSRV>=500 */
+
+	    Lf->dev = i.i_dev;
+	    Lf->dev_def = 1;
+	    break;
+	case N_CHR:
+	    Lf->dev = i.i_dev;
+	    Lf->rdev = i.i_rdev;
+	    Lf->dev_def = Lf->rdev_def = 1;
+	    if (i.i_sptr) {
+
+	    /*
+	     * Namech may be:
+	     *    /dev/* name if it exists for i.i_rdev;
+	     *    cdevsw[].d_name if it exists for GET_MAJ_DEV(i.i_rdev);
+	     *    "STR:" otherwise.
+	     */
+		(void) snpf(Namech, Namechl, "STR:");
+		Lf->is_stream = 1;
+		k = strlen(Namech);
+		cp = (char *)NULL;
+		if ((dp = finddev(&Lf->dev, &Lf->rdev, 1))) {
+		    (void) snpf(&Namech[k], Namechl - k, dp->name);
+		    k += strlen(dp->name);
+		    if ((cp = strrchr(dp->name, '/')))
+			cp++;
+		} else if ((j = GET_MAJ_DEV(i.i_rdev))
+			<  Cdevcnt && (cp = Cdevsw[j]))
+		{
+		    (void) snpf(Namech, Namechl, "%s", cp);
+		    k += strlen(cp);
+		}
+	    /*
+	     * Get the module names of all queue elements of the stream's
+	     * sd_wrq queue.  Skip module names that end in "head", 
+	     * match the last component of the /dev name, or match the
+	     * cdevsw[].d_name.
+	     */
+		p = (KA_T)NULL;
+		if (!kread((KA_T)i.i_sptr, (char *)&sd, sizeof(sd))) {
+		    dl = sizeof(tbuf) - 1;
+		    tbuf[dl] = '\0';
+		    qp = (KA_T)sd.sd_wrq;
+		    for (j = 0; qp && j < 20; j++, qp = (KA_T)q.q_next) {
+			if (kread(qp, (char *)&q, sizeof(q)))
+				break;
+			if (!(ka = (KA_T)q.q_qinfo)
+			||  kread(ka, (char *)&qi, sizeof(qi)))
+				continue;
+			if (!(ka = (KA_T)qi.qi_minfo)
+			||  kread(ka, (char *)&mi, sizeof(mi)))
+				continue;
+			if (!(ka = (KA_T)mi.mi_idname)
+			||  kread(ka, tbuf, dl))
+				continue;
+			if ((l = strlen(tbuf)) < 1)
+				continue;
+			if (l >= 4 && strcmp(&tbuf[l - 4], "head") == 0)
+				continue;
+			if (cp && strcmp(cp, tbuf) == 0) {
+				if (q.q_ptr && pt < 0) {
+
+				/*
+				 * If this is a TCP or UDP module and the
+				 * queue structure has a private pointer in
+				 * q_ptr, save it as a PCB address.
+				 */
+				    if (strcasecmp(cp, "tcp") == 0) {
+					pt = 0;
+					(void) snpf(Lf->iproto,
+					    sizeof(Lf->iproto), "TCP");
+				    } else if (strcasecmp(cp, "udp") == 0) {
+					pt = 1;
+					(void) snpf(Lf->iproto,
+					    sizeof(Lf->iproto), "UDP");
+				    }
+				    if (pt >= 0)
+					p = (KA_T)q.q_ptr;
+				    else
+					pt = -1;
+				}
+				continue;
+			    }
+			if (k) {
+				if ((k + 2) > (Namechl - 1))
+				    break;
+				(void) snpf(&Namech[k], Namechl - k, "->");
+				k += 2;
+			}
+			if ((k + l) > (Namechl - 1))
+				break;
+			(void) snpf(&Namech[k], Namechl - k, tbuf);
+			k += l;
+		    }
+		}
+		if (p && pt >= 0) {
+
+		/*
+		 * If the stream has a TCP or UDP module with a PCB pointer,
+		 * print any associated local and foreign Internet addresses.
+		 */
+		    if (kread(p, (char *)&pcb, sizeof(pcb)))
+			break;
+		    if (Fnet)
+			Lf->sf |= SELNET;
+		    if ((k + 1) > (Namechl - 1))
+			break;
+		    if (pt == 1 && pcb.inp_ppcb) {
+
+		    /*
+		     * If this is a UDP stream, get the udpdev structure at the
+		     * PCB's per-protocol address.  It may contain addresses.
+		     */
+			if (kread((KA_T)pcb.inp_ppcb, (char *)&udp, sizeof(udp))
+			== 0) {
+
+#if	OSRV>=500
+			    if (udp.ud_lsin.sin_addr.s_addr != INADDR_ANY
+			    ||  udp.ud_lsin.sin_port != 0)
+				udpsl = 1;
+			    else
+				udpsl = 0;
+#endif	/* OSRV>=500 */
+
+			    if (udp.ud_fsin.sin_addr.s_addr != INADDR_ANY
+			    ||  udp.ud_fsin.sin_port != 0)
+				udpsf = 1;
+			    else
+				udpsf = 0;
+			}
+		    } else
+			udpsf = udpsl = 0;
+		/*
+		 * Enter the local address from the PCB.  If there is none,
+		 * and if this is a 5.0.0 or greater UDP stream, and if it
+		 * has a local address set, use it.
+		 */
+		    la = (unsigned char *)&pcb.inp_laddr;
+		    lp = (int)ntohs(pcb.inp_lport);
+
+#if	OSRV>=500
+		    if (((struct in_addr *)la)->s_addr == INADDR_ANY
+		    &&  lp == 0 && udpsl) {
+			la = (unsigned char *)&udp.ud_lsin.sin_addr;
+			lp = (int)ntohs(udp.ud_lsin.sin_port);
+		    }
+
+#endif	/* OSRV>=500 */
+
+		/*
+		 * Enter the foreign address from the PCB.  If there is
+		 * none, and if this is a 5.0.0 or greater UDP stream, and
+		 * if it has a local address set, use it.
+		 */
+		    if (pcb.inp_faddr.s_addr!=INADDR_ANY || pcb.inp_fport!=0) {
+			fa = (unsigned char *)&pcb.inp_faddr;
+			fp = (int)ntohs(pcb.inp_fport);
+		    } else if (udpsf) {
+			fa = (unsigned char *)&udp.ud_fsin.sin_addr;
+			fp = (int)ntohs(udp.ud_fsin.sin_port);
+			udptm = 1;
+		    }
+		    if (fa || la) {
+			(void) ent_inaddr(la, lp, fa, fp, AF_INET);
+			 if (udptm && !Lf->nma)
+			     (void) udp_tm(udp.ud_ftime);
+		    }
+		    if (!i.i_number)
+			Lf->inp_ty = 2;
+		}
+	    } else {
+		if (ity) {
+		    if (strcasecmp(Fsinfo[ity-1], "COM") == 0)
+			Ntype = N_COM;
+		    else
+			Ntype = N_CHR;
+		} else {
+		    Ntype = N_CHR;
+		    if (!finddev(&i.i_dev, &i.i_rdev, 0)
+		    &&  HaveEventMajor
+		    &&  GET_MAJ_DEV(i.i_rdev) == EventMajor)
+			(void) snpf(Namech, Namechl,
+			    "clone %d:/dev/event", GET_MIN_DEV(i.i_rdev));
+		}
+	    }
+	    break;
+
+#if	defined(HAS_NFS)
+	case N_NFS:
+
+#if	OSRV<500
+	    Lf->dev = (dev_t)_makedev(~GET_MAJ_DEV(i.i_dev),
+				      GET_MIN_DEV(i.i_dev));
+	    Lf->rdev = (dev_t)_makedev(~GET_MAJ_DEV(i.i_rdev),
+				       GET_MIN_DEV(i.i_rdev));
+#else	/* OSRV>=500 */
+	    Lf->dev = i.i_dev;
+	    Lf->rdev = i.i_rdev;
+#endif	/* OSRV<500 */
+
+	    Lf->dev_def = Lf->rdev_def = 1;
+	    break;
+#endif	/* defined(HAS_NFS) */
+
+	}
+/*
+ * Determine the inode number.
+ */
+	switch (Ntype) {
+	case N_HSFS:
+
+#if	OSRV<500
+	/*
+	 * High Sierra inode numbers for versions below 5.0.0, as reported
+	 * by "ls -i" and stat(2), are the lower 16 bits of i_number.
+	 */
+	    if ((Lf->inode = (unsigned long)(i.i_number & 0xffff)))
+#else	/* OSRV>=500 */
+	    if ((Lf->inode = (unsigned long)i.i_number))
+#endif	/* OSRV<500 */
+
+		Lf->inp_ty = 1;
+	    break;
+
+#if	defined(HAS_NFS)
+	case N_NFS:
+
+#if	OSRV<500
+	    n = (unsigned short *)&r.r_fh.fh_pad[14];
+	    if ((Lf->inode = (unsigned long)ntohs(*n)))
+		Lf->inp_ty = 1;
+	    else if ((Lf->inode = (unsigned long)r.r_fh.fh_u.fh_fgen_u))
+#else	/* OSRV>=500 */
+		n = (unsigned short *)&r.r_fh.fh_u.fh_fid_u[4];
+	    n1 = (unsigned short *)&r.r_fh.fh_u.fh_fid_u[2];
+	    if ((Lf->inode = (unsigned long)*n))
+		Lf->inp_ty = 1;
+	    else if ((Lf->inode = (unsigned long)*n1))
+#endif	/* OSRV<500 */
+
+		Lf->inp_ty = 1;
+	    break;
+#endif	/* defined(HAS_NFS) */
+
+	case N_BLK:
+	case N_CHR:
+	case N_COM:
+	case N_FIFO:
+	case N_NM:
+	case N_REGLR:
+
+#if	OSRV>=500
+	/*
+	 * Inodes for some 5.0.x HPPS FIFOs have an i_number that is the same
+	 * as i_fsptr.  If it is, ignore it, because i_fsptr has already been
+	 * recorded for the DEVICE column.
+	 */
+	    if (hpps && i.i_fsptr && i.i_number
+	    && (unsigned long)i.i_fsptr == (unsigned long)i.i_number)
+		break;
+#endif	/* OSRV>=500 */
+
+	    if (i.i_number) {
+		Lf->inode = (unsigned long)i.i_number;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+	}
+/*
+ * Determine the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+	    case N_BLK:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_CHR:
+	    case N_COM:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_FIFO:
+
+#if	OSRV>=500
+		if (hpps == 2) {
+		    Lf->sz = (SZOFFTYPE)pi.count;
+		    Lf->sz_def = 1;
+		    break;
+		}
+#endif	/* OSRV>=500 */
+
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_HSFS:
+
+#if	defined(HAS_NFS)
+	    case N_NFS:
+		Lf->sz = (SZOFFTYPE)i.i_size;
+		Lf->sz_def = 1;
+		break;
+#endif	/* defined(HAS_NFS) */
+
+	    case N_REGLR:
+		if (type == IFREG || type == IFDIR) {
+		    Lf->sz = (SZOFFTYPE)i.i_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+	    }
+	}
+/*
+ * Record link count.
+ */
+	if (Fnlink) {
+	    Lf->nlink = (long)i.i_nlink;
+	    Lf->nlink_def = 1;
+	    if (Nlink && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Format the type name.
+ */
+	switch (type) {
+	case IFDIR:
+	    tn = "DIR";
+	    break;
+	case IFBLK:
+	    tn = "BLK";
+	    break;
+	case IFCHR:
+	    tn = "CHR";
+	    break;
+	case IFREG:
+	    tn = "REG";
+	    break;
+	case IFMPC:
+	    tn = "MPC";
+	    break;
+	case IFMPB:
+	    tn = "MPB";
+	    break;
+	case IFNAM:
+	    if (i.i_rdev == S_INSEM)
+		tn = "XSEM";
+	    else if (i.i_rdev == S_INSHD)
+		tn = "XSD";
+	    else {
+		tn = "XNAM";
+		(void) snpf(Namech, Namechl,
+		    "unknown Xenix special file type: %x", i.i_rdev);
+	    }
+	    break;
+	case IFIFO:
+	    tn = "FIFO";
+	    break;
+
+#if	defined(IFLNK)
+	case IFLNK:
+	    tn = "LINK";
+	    break;
+#endif	/* defined(IFLNK) */
+
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o",
+		((type >> 12) & 0xfff));
+	    tn = NULL;
+	}
+	if (tn)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", tn);
+/*
+ * Save the file system names.
+ */
+	switch (Ntype) {
+	case N_BLK:
+	case N_CHR:
+	case N_FIFO:
+	case N_HSFS:
+
+#if	defined(HAS_NFS)
+	case N_NFS:
+#endif	/* defined(HAS_NFS) */
+
+	case N_NM:
+	case N_REGLR:
+	    if (Lf->dev_def) {
+
+	    /*
+	     * Defer the local mount info table search until printname().
+	     */
+		Lf->lmi_srch = 1;
+	    }
+	    break;
+	}
+	Lf->ntype = Ntype;
+
+#if     defined(HASBLKDEV)
+/*
+ * If this is a IFBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == IFBLK))
+	    find_bl_ino();
+#endif  /* defined(HASBLKDEV) */
+
+/*
+ * If this is a IFCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == IFCHR))
+	    find_ch_ino();
+/*
+ * Test for specified file.
+ */
+	if (Sfile && is_file_named((char *)NULL,
+		((type == IFCHR) || (type == IFBLK) || (type == IFNAM)) ? 1
+									: 0))
+	    Lf->sf |= SELNM;
+
+#if	OSRV>=500
+/*
+ * If this is an HPPS node and no other name characters have been
+ * entered, enter HPPS as the name.
+ */
+	if (hpps && Namech[0] == '\0')
+	    (void) snpf(Namech, Namechl, "HPPS");
+#endif	/* OSRV>=500 */
+
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/osr/dproc.c
new file mode 100644
index 0000000..facdb42
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dproc.c
@@ -0,0 +1,2003 @@
+/*
+ * dproc.c - SCO OpenServer process access functions for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1995 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.18 2007/04/24 16:22:40 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local static values
+ */
+
+static KA_T Kp;				/* kernel process table address */
+static KA_T *Nc = (KA_T *)NULL;		/* node cache */
+static int Nn = 0;			/* number of Nc[] entries allocated */
+
+#if	OSRV<500
+static int Npp = 0;			/* number of pregions per process */
+static struct pregion *Pr = (struct pregion *)NULL;
+					/* pregion buffer */
+static int Prsz = 0;			/* size of Pr */
+#endif	/* OSRV<500 */
+
+
+static struct var Var;			/* kernel variables */
+
+
+_PROTOTYPE(static void get_cdevsw,(void));
+_PROTOTYPE(static void get_kernel_access,(void));
+
+#if	!defined(N_UNIX)
+_PROTOTYPE(static int is_boot,(char *p));
+#endif	/* !defined(N_UNIX) */
+
+_PROTOTYPE(static int open_kmem,(int nx));
+_PROTOTYPE(static void process_text,(KA_T prp));
+_PROTOTYPE(static void readfsinfo,(void));
+
+
+/*
+ * Ckkv - check kernel version
+ */
+
+static void
+Ckkv(d, er, ev, ea)
+	char *d;			/* dialect */
+	char *er;			/* expected release */
+	char *ev;			/* expected version */
+	char *ea;			/* expected architecture */
+{
+
+#if	defined(HASKERNIDCK)
+	struct scoutsname s;
+
+	if (Fwarn)
+	    return;
+/*
+ * Read OSR kernel information.
+ */
+	if (__scoinfo(&s, sizeof(s)) < 0) {
+	    (void) fprintf(stderr, "%s: can't get __scoinfo: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	}
+/*
+ * Warn if the actual and expected releases don't match.
+ */
+	if (!er || strcmp(er, s.release))
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s release %s; this is %s.\n",
+		Pn, d, er ? er : "UNKNOWN", s.release);
+#endif	/* defined(HASKERNIDCK) */
+
+}
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	int i, j, nf, pbc, px;
+	struct proc *p;
+	static char *pb = (char *)NULL;
+	int pid, pgrp;
+	short pss, sf;
+	static struct user *u;
+	static char *ua = (char *)NULL;
+	static MALLOC_S ual = 0;
+	unsigned int uid;
+
+#if	defined(HASFSTRUCT)
+	static MALLOC_S npofb = 0; 
+	char *pof;
+	static char *pofb = (char *)NULL;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Allocate user structure buffer.
+ */
+	if (!ua) {
+	    ual = (MALLOC_S)(MAXUSIZE * NBPC);
+	    if (!(ua = (char *)malloc(ual))) {
+		(void) fprintf(stderr,
+		    "%s: no space for %d byte user structure buffer\n",
+		    Pn, ual);
+		Exit(1);
+	    }
+	    u = (struct user *)ua;
+	}
+/*
+ * Allocate proc structure buffer.
+ */
+	if (!pb) {
+	    if (!(pb = (char *)malloc(sizeof(struct proc) * PROCBFRD))) {
+		(void) fprintf(stderr, "%s: no space for %d proc structures\n",
+		    Pn, PROCBFRD);
+		Exit(1);
+	    }
+	}
+/*
+ * Examine proc structures and their associated information.
+ */
+	for (pbc = px = 0; px < Var.v_proc; px++) {
+	    if (px >= pbc) {
+
+	    /*
+	     * Refill proc buffer.
+	     */
+		i = Var.v_proc - px;
+		if (i > PROCBFRD)
+		    i = PROCBFRD;
+		j = kread((KA_T)(Kp + (px * sizeof(struct proc))), pb,
+			sizeof(struct proc) * i);
+		pbc = px + i;
+		p = (struct proc *)pb;
+		if (j) {
+		    px += i;
+		    continue;
+		}
+	   } else
+		p++;
+	    if (p->p_stat == 0 || p->p_stat == SZOMB)
+		continue;
+	/*
+	 * Get Process ID, Process group ID, and User ID.
+	 */
+	    pid = (int)p->p_pid;
+	    pgrp = (int)p->p_pgrp;
+	    uid = (unsigned int)p->p_uid;
+	    if (is_proc_excl(pid, pgrp, (UID_ARG)uid, &pss, &sf))
+		continue;
+	/*
+	 * Get the user area associated with the process.
+	 */
+	    if (sysi86(RDUBLK, pid, ua, MAXUSIZE * NBPC) == -1)
+		continue;
+	/*
+	 * Allocate a local process structure.
+	 */
+	    if (is_cmd_excl(u->u_comm, &pss, &sf))
+		continue;
+	    alloc_lproc(pid, pgrp, (int)p->p_ppid, (UID_ARG)uid, u->u_comm,
+		(int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (u->u_cdir) {
+		alloc_lfile(CWD, -1);
+		process_node((KA_T)u->u_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (u->u_rdir) {
+		alloc_lfile(RTD, -1);
+		process_node((KA_T)u->u_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Print information on the text file.
+	 */
+	    if (p->p_region)
+		process_text((KA_T)p->p_region);
+	/*
+	 * Save information on file descriptors.
+	 */
+
+#if	OSRV<42
+	    nf = Var.v_nofiles;
+#else	/* OSRV>=42 */
+	    nf = u->u_nofiles ? u->u_nofiles : Var.v_nofiles;
+#endif	/* OSRV<42 */
+
+#if	defined(HASFSTRUCT)
+	    if (Fsv & FSV_FG) {
+
+	    /*
+	     * If u_pofile is in the u block, set its address.
+	     */
+		if (nf && u->u_pofile
+		&&  ((unsigned)u->u_pofile >= UVUBLK)
+		&&  ((MALLOC_S)((unsigned)u->u_pofile - UVUBLK + nf) <= ual))
+		{
+		     pof = ua + (unsigned)u->u_pofile - UVUBLK;
+		} else if (nf && u->u_pofile) {
+
+		/*
+		 * Allocate space for u_pofile and read it from kernel memory.
+		 */
+		    if (nf > npofb) {
+			if (!pofb)
+			    pofb = (char *)malloc((MALLOC_S)nf);
+			else
+			    pofb = (char *)realloc((MALLOC_P *)pofb,
+						   (MALLOC_S)nf);
+			if (!pofb) {
+			    (void) fprintf(stderr, "%s: no pofile space\n", Pn);
+			    Exit(1);
+			}
+			npofb = nf;
+		    }
+		    if (kread((KA_T)u->u_pofile, pofb, nf))
+			pof = (char *)NULL;
+		    else
+			pof = pofb;
+		} else
+		    pof = (char *)NULL;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	    for (i = 0; i < nf; i++) {
+		if (u->u_ofile[i]) {
+		    alloc_lfile((char *)NULL, i);
+		    process_file((KA_T)u->u_ofile[i]);
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG && pof)
+			    Lf->pof = (long)pof[i];
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_cdevsw() - get cdevsw[] names and record clone major device number
+ */
+
+void
+get_cdevsw()
+{
+	char buf[16];
+	struct cdevsw *c, *tmp;
+	int i, j, len;
+	struct stat sb;
+	KA_T v[2];
+/*
+ * Check cdevsw[] kernel addresses.
+ * Read cdevsw[] count from kernel's cdevcnt.
+ */
+	if (get_Nl_value("cdev",  Drive_Nl, &v[0]) < 0
+	||  get_Nl_value("ncdev", Drive_Nl, &v[1]) < 0
+	||  !v[0] || !v[1]
+	||  kread(v[1], (char *)&Cdevcnt, sizeof(Cdevcnt))
+	||  Cdevcnt < 1)
+	    return;
+/*
+ * Allocate cache space.
+ */
+	if (!(Cdevsw = (char **)malloc(Cdevcnt * sizeof(char *)))) {
+	    (void) fprintf(stderr, "%s: no space for %d cdevsw[] names\n",
+		Pn, Cdevcnt);
+	    Exit(1);
+	}
+/*
+ * Allocate temporary space for a copy of cdevsw[] and read it.
+ */
+	i = Cdevcnt * sizeof(struct cdevsw);
+	if (!(tmp = (struct cdevsw *)malloc(i))) {
+	    (void) fprintf(stderr, "%s: no space for %d cdevsw[] entries\n",
+		Pn, Cdevcnt);
+	    Exit(1);
+	}
+	if (kread((KA_T)v[0], (char *)tmp, i)) {
+	    (void) free((FREE_P *)Cdevsw);
+	    Cdevsw = (char **)NULL;
+	    Cdevcnt = 0;
+	    (void) free((FREE_P *)tmp);
+	    return;
+	}
+/*
+ * Cache the names from cdevsw[].d_name.
+ * Record the number of the "clone" device.
+ */
+	j = sizeof(buf) - 1;
+	buf[j] = '\0';
+	for (c = tmp, i = 0; i < Cdevcnt; c++, i++) {
+	    Cdevsw[i] = (char *)NULL;
+	    if (!c->d_name)
+		continue;
+	    if (kread((KA_T)c->d_name, buf, j)) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't read name for cdevsw[%d]: %#x\n",
+		    Pn, i, c->d_name);
+		continue;
+	    }
+	    if (!buf[0])
+		continue;
+	    len = strlen(buf) + 1;
+	    if (!(Cdevsw[i] = (char *)malloc(len))) {
+		(void) fprintf(stderr, "%s: no space for cdevsw[%d] name: %s\n",
+		   Pn, i, buf);
+		Exit(1);
+	    }
+	    (void) snpf(Cdevsw[i], len, "%s", buf);
+	    if (!HaveCloneMajor && strcmp(buf, "clone") == 0) {
+		CloneMajor = i;
+		HaveCloneMajor = 1;
+		continue;
+	    }
+	    if (!HaveEventMajor && strcmp(buf, "ev") == 0) {
+		if (stat("/dev/event", &sb) == 0
+		&&  GET_MAJ_DEV(sb.st_rdev) == i) {
+		    EventMajor = i;
+		    HaveEventMajor = 1;
+		}
+	    }
+	}
+	(void) free((FREE_P *)tmp);
+}
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+	time_t lbolt;
+	MALLOC_S len;
+	KA_T v;
+/*
+ * Check kernel version.
+ */
+	(void) Ckkv("OSR", LSOF_VSTR, (char *)NULL, (char *)NULL);
+/*
+ * See if the name list file is readable.
+ */
+	if (Nmlst && !is_readable(Nmlst, 1))
+	    Exit(1);
+/*
+ * Access kernel symbols.
+ */
+
+#if	defined(N_UNIX)
+	(void) build_Nl(Drive_Nl);
+	if (nlist(Nmlst ? Nmlst : N_UNIX, Nl) < 0)
+#else	/* !defined(N_UNIX) */
+	if (!get_nlist_path(0))
+#endif	/* defined(N_UNIX) */
+
+	{
+	    (void) fprintf(stderr, "%s: can't read kernel name list.\n", Pn);
+	    Exit(1);
+	}
+/*
+ * Open access to kernel memory.
+ */
+	(void) open_kmem(0);
+
+#if     defined(WILLDROPGID)
+/*
+ * Drop setgid permission.
+ */
+	(void) dropgid();
+#endif  /* defined(WILLDROPGID) */
+
+/*
+ * Check proc table pointer.
+ */
+	if (get_Nl_value("proc", Drive_Nl, &Kp) < 0 || !Kp) {
+	    (void) fprintf(stderr, "%s: no proc table pointer\n", Pn);
+	    Exit(1);
+	}
+
+#if	OSRV<500
+/*
+ * Read pregion information.
+ */
+	v = (KA_T)0;
+	if (get_Nl_value("pregpp", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Npp, sizeof(Npp))
+	||  Npp < 1) {
+	    (void) fprintf(stderr,
+		"%s: can't read pregion count (%d) from %s\n", Pn, Npp,
+		    print_kptr(v, (char *)NULL, 0));
+	    Exit(1);
+	}
+	Prsz = (MALLOC_S)(Npp * sizeof(struct pregion));
+	if (!(Pr = (struct pregion *)malloc(Prsz))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d pregions\n",
+		Pn, Npp);
+	    Exit(1);
+	}
+#endif	/* OSRV< 500 */
+
+/*
+ * Read system configuration information.
+ */
+	if (get_Nl_value("var", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&Var, sizeof(Var)))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't read system configuration info\n", Pn);
+	    Exit(1);
+	}
+/*
+ * Read system clock values -- Hz and lightning bolt timer.
+ */
+	v = (KA_T)0;
+	if (get_Nl_value("hz", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Hz, sizeof(Hz)))
+	{
+	    if (!Fwarn)
+		(void) fprintf(stderr, "%s: WARNING: can't read Hz from %s\n",
+		    Pn, print_kptr(v, (char *)NULL, 0));
+	    Hz = -1;
+	}
+	if (get_Nl_value("lbolt", Drive_Nl, &Lbolt) < 0 || !v
+	||  kread((KA_T)v, (char *)&lbolt, sizeof(lbolt)))
+	{
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		     "%s: WARNING: can't read lightning bolt timer from %s\n",
+		     Pn, print_kptr(v, (char *)NULL, 0));
+	    Lbolt = (KA_T)0;
+	}
+/*
+ * Get socket device number and socket table address.
+ */
+	if (get_Nl_value("sockd", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&Sockdev, sizeof(Sockdev)))
+	{
+	    (void) fprintf(stderr,
+		"%s: WARNING: can't identify socket device.\n", Pn);
+	    (void) fprintf(stderr,
+		"      Socket output may be incomplete.\n");
+	    return;
+	}
+	if (get_Nl_value("sockt", Drive_Nl, &Socktab) < 0 || !Socktab) {
+	    (void) fprintf(stderr,
+		"%s: WARNING: socket table address is NULL.\n", Pn);
+	    (void) fprintf(stderr,
+		"      Socket output may be incomplete.\n");
+	    return;
+	}
+
+#if	OSRV>=40
+/*
+ * Get extended device table parameters.  These are needed by the kernel
+ * versions of the major() and minor() device number macros; they also
+ * identify socket devices and assist in the conversion of socket device
+ * numbers to socket table addresses.
+ */
+	v = (KA_T)0;
+	if (get_Nl_value("nxdm", Drive_Nl, &v) < 0 || !v
+	||  kread(v, (char *)&nxdevmaps, sizeof(nxdevmaps))
+	||  nxdevmaps < 0)
+	{
+	    (void) fprintf(stderr,
+		"%s: bad extended device table size (%d) at %s.\n",
+		Pn, nxdevmaps, print_kptr(v, (char *)NULL, 0));
+	    Exit(1);
+	}
+	len = (MALLOC_S)((nxdevmaps + 1) * sizeof(struct XDEVMAP));
+	if (!(Xdevmap = (struct XDEVMAP *)malloc(len))) {
+	    (void) fprintf(stderr, "%s: no space for %d byte xdevmap table\n",
+		Pn, len);
+	    Exit(1);
+	}
+	v = (KA_T)0;
+	if (get_Nl_value("xdm", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)Xdevmap, len))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't read %d byte xdevmap table at #x\n", Pn, len, v);
+	    Exit(1);
+	}
+#endif	/* OSRV>=40 */
+
+	HaveSockdev = 1;
+}
+
+
+#if	!defined(N_UNIX)
+/*
+ * get_nlist_path() - get kernel nlist() path
+ *
+ * As a side effect on a successful return (non-NULL character pointer), the
+ * boot path's name list will have been loaded into Nl[].
+ */
+
+char *
+get_nlist_path(ap)
+	int ap;				/* on success, return an allocated path
+					 * string pointer if 1; return a
+					 * constant character pointer if 0;
+					 * return NULL if failure */
+{
+	FILE *bf;
+	char *bfp, b1[MAXPATHLEN+1], b2[MAXPATHLEN+1], *pp, *tp;
+	struct dirent *de;
+	char *dir[] = { "/", "/stand/", NULL };
+	DIR *dp;
+	int i;
+	MALLOC_S len;
+/*
+ * If a kernel name list file was specified, use it.
+ */
+	if (Nmlst) {
+	    if (is_boot(Nmlst))
+		return(Nmlst);
+	    return((char *)NULL);
+	}
+/*
+ * If it's possible to open /etc/ps/booted system, search it for a preferred
+ * boot path, defined by the value of a line that begins with "KERNEL=".
+ */
+	bfp = pp = (char *)NULL;
+	if ((bf = fopen("/etc/ps/booted.system", "r"))) {
+	    len = strlen("KERNEL=");
+	    while (fgets(b1, sizeof(b1), bf)) {
+		if (strncmp(b1, "KERNEL=", len) != 0)
+		    continue;
+		if ((tp = strrchr(&b1[len], '\n'))) {
+		    *tp = '\0';
+		    if (b1[len]) {
+			bfp = &b1[len];
+			if (is_boot(bfp)) {
+			    pp = bfp;
+			    (void) fclose(bf);
+			    goto get_nlist_return_path;
+			}
+			break;
+		    }
+		}
+	    }
+	    (void) fclose(bf);
+	}
+/*
+ * Look for possible unix* boot paths.
+ */
+	for (i = 0; dir[i]; i++) {
+	    if (!(dp = opendir(dir[i])))
+		continue;
+	    while ((de = readdir(dp))) {
+
+	    /*
+	     * Use the next entry that begins with "unix".
+	     */
+		if (strncmp("unix", de->d_name, 4) != 0)
+		    continue;
+	    /*
+	     * Construct a temporary copy of the path name,
+	     * If it matches the preferred boot name, skip it.
+	     */
+		len = strlen(dir[i]) + strlen(de->d_name) + 1;
+		if (len >= sizeof(b2))
+		    continue;
+		(void) snpf(b2, sizeof(b2), "%s%s", dir[i], de->d_name);
+		if (bfp && strcmp(b2, bfp) == 0)
+		    continue;
+	    /*
+	     * See if it's the booted kernel.
+	     */
+		if (is_boot(b2)) {
+		    (void) closedir(dp);
+		    pp = b2;
+
+get_nlist_return_path:
+
+		/*
+		 * A boot path has been located.  As requested return a
+		 * malloc'd pointer to it.
+		 */
+		    if (!ap)
+			return("");
+		    len = (MALLOC_S)(strlen(pp) + 1);
+		    if (!(tp = (char *)malloc(len))) {
+			(void) fprintf(stderr,
+			    "%s: can't allocate %d bytes for: %s\n",
+			    Pn, len , pp);
+			Exit(1);
+		    }
+		    (void) snpf(tp, len, "%s", pp);
+		    return(tp);
+		}
+	    }
+	    if (dp)
+		(void) closedir(dp);
+	}
+	return((char *)NULL);
+}
+#endif	/* !defined(N_UNIX) */
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+	get_cdevsw();
+	readfsinfo();
+	if (Fsv & FSV_NI)
+	    NiTtl = "INODE-ADDR";
+}
+
+
+#if	!defined(N_UNIX)
+/*
+ * is_boot() - does the specified path lead to a booted kernel
+ */
+
+is_boot(p)
+	char *p;			/* specified path */
+{
+	int i;
+	KA_T ka;
+	union {
+	    struct scoutsname s;
+	    unsigned char sc[sizeof(struct scoutsname)];
+	} s1, s2;
+/*
+ * Get the scoutsname structure via __scoinfo() to use as a reference against
+ * the one obtained via kread()'ing from the nlist(<possible_kernel>) address.
+ *  If __scoinfo() fails, return the default boot path.
+ */
+	if (__scoinfo(&s1.s, sizeof(s1.s)) < 0)
+	    return 0;
+/*
+ * Get the name list for this boot path.  Using the scoutsname address, read
+ * the scoutsname structure and compare it to the _s_scoinfo() one.  If the
+ * two match, this is the boot path.
+ */
+	if (Nl) {
+	    (void) free((FREE_P *)Nl);
+	    Nl = (struct NLIST_TYPE *)NULL;
+	}
+	(void) build_Nl(Drive_Nl);
+	if (nlist(p, Nl) < 0)
+	    return(0);
+	if (get_Nl_value("scouts", Drive_Nl, &ka) < 0 || !ka)
+	    return(0);
+	if (Kd < 0) {
+	    if (open_kmem(1))
+		return(0);
+	}
+	if (kread(ka, (char *)&s2.s, sizeof(s2.s)))
+	    return(0);
+	for (i = 0; i < sizeof(struct scoutsname); i++) {
+		if (s1.sc[i] != s2.sc[i])
+		    return(0);
+	}
+	return(1);
+}
+#endif	/* !defined(N_UNIX) */
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	int br;
+
+	if (lseek(Kd, (off_t)addr, SEEK_SET) == (off_t)-1L)
+		return(1);
+	if ((br = read(Kd, buf, len)) < 0)
+		return(1);
+	return(((READLEN_T)br == len) ? 0 : 1);
+}
+
+
+/*
+ * open_kmem() - open kernel memory access
+ */
+
+static int
+open_kmem(nx)
+	int nx;				/* no Exit(1) if 1 */
+{
+	if (Kd >= 0)
+	    return(0);
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1)) {
+	    if (nx)
+		return(1);
+	    Exit(1);
+	}
+/*
+ * Open kernel memory access.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0) {
+	    if (nx)
+		return(1);
+	    (void) fprintf(stderr, "%s: can't open %s: %s\n", Pn,
+		Memory ? Memory : KMEM, strerror(errno));
+	    Exit(1);
+	}
+	return(0);
+}
+
+
+/*
+ * process_text() - process text access information
+ */
+
+static void
+process_text(prp)
+	KA_T prp;			/* process region pointer */
+{
+	int i, j, k;
+	struct pregion *p;
+	struct region r;
+	KA_T na;
+	char *ty, tyb[8];
+
+#if	OSRV>=500
+	KA_T pc;
+	struct pregion ps;
+#endif	/* OSRV>=500 */
+
+/*
+ * Read and process the pregions.
+ */
+
+#if	OSRV<500
+	if (kread(prp, (char *)Pr, Prsz))
+	    return;
+	for (i = j = 0, p = Pr; i < Npp; i++, p++)
+#else	/* OSRV>=500 */
+	for (i = j = 0, p = &ps, pc = prp; pc; pc = (KA_T)p->p_next, i++)
+#endif	/* OSRV<500 */
+
+	{
+
+#if	OSRV>=500
+	/*
+	 * Avoid infinite loop.
+	 */
+	    if (i > 1000) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: too many virtual address regions for PID %d\n",
+			Pn, Lp->pid);
+		return;
+	    }
+	    if ((i && pc == prp)
+	    ||  kread((KA_T)pc, (char *)p, sizeof(ps)))
+		return;
+#endif	/* OSRV>=500 */
+
+	    if (!p->p_reg)
+		continue;
+	/*
+	 * Read the region.
+	 * Skip entries with no node pointers and duplicate node addresses.
+	 */
+	    if (kread((KA_T)p->p_reg, (char *)&r, sizeof(r)))
+		continue;
+	    if (!(na = (KA_T)r.r_iptr))
+		continue;
+	    for (k = 0; k < j; k++) {
+		if (Nc[k] == na)
+		    break;
+	    }
+	    if (k < j)
+		continue;
+	/*
+	 * Cache the node address for duplicate checking.
+	 */
+	    if (!Nc) {
+		if (!(Nc = (KA_T *)malloc((MALLOC_S)(sizeof(KA_T) * 10)))) {
+		    (void) fprintf(stderr, "%s: no txt ptr space, PID %d\n",
+			Pn, Lp->pid);
+		    Exit(1);
+		}
+		Nn = 10;
+	    } else if (j >= Nn) {
+		Nn += 10;
+		if (!(Nc = (KA_T *)realloc((MALLOC_P *)Nc,
+				   (MALLOC_S)(Nn * sizeof(KA_T)))))
+		{
+		    (void) fprintf(stderr,
+			"%s: no more txt ptr space, PID %d\n", Pn, Lp->pid);
+		    Exit(1);
+		}
+	    }
+	    Nc[j++] = na;
+	/*
+	 * Save text node and mapped region information.
+	 */
+	    switch (p->p_type) {
+ 	    case PT_DATA:		/* data and text of */
+ 	    case PT_TEXT:		/* executing binaries */
+ 		ty = " txt";
+ 		break;
+  	    case PT_LIBDAT:		/* shared library data and */
+  	    case PT_LIBTXT:		/* COFF format text */
+  		ty = " ltx";
+  		break;
+ 	    case PT_SHFIL:		/* memory mapped file */
+ 		ty = " mem";
+ 		break;
+ 	    case PT_V86:		/* virtual 8086 mode */
+ 		ty = " v86";
+		break;
+ 	    case PT_VM86:		/* MERGE386 vm86 region */
+ 		ty = " m86";
+ 		break;
+  	    default:		/* all others as a hex number */
+		(void) snpf(tyb, sizeof(tyb), " M%02x", p->p_type & 0xff);
+ 		ty = tyb;
+	    }
+	    if (ty) {
+		alloc_lfile(ty, -1);
+		process_node(na);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	}
+}
+
+
+/*
+ * readfsinfo() - read file system information
+ */
+
+static void
+readfsinfo()
+{
+	char buf[FSTYPSZ+1];
+	int i, len;
+
+	if ((Fsinfomax = sysfs(GETNFSTYP)) == -1) {
+	    (void) fprintf(stderr, "%s: sysfs(GETNFSTYP) error: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	} 
+	if (Fsinfomax == 0)
+	    return;
+	if (!(Fsinfo = (char **)malloc((MALLOC_S)(Fsinfomax * sizeof(char *)))))
+	{
+	    (void) fprintf(stderr, "%s: no space for sysfs info\n", Pn);
+	    Exit(1);
+	}
+	for (i = 1; i <= Fsinfomax; i++) {
+	    if (sysfs(GETFSTYP, i, buf) == -1) {
+		(void) fprintf(stderr, "%s: sysfs(GETFSTYP) error: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+	    buf[FSTYPSZ] = '\0';
+	    len = strlen(buf) + 1;
+	    if (!(Fsinfo[i-1] = (char *)malloc((MALLOC_S)len))) {
+		(void) fprintf(stderr,
+		    "%s: no space for file system entry %s\n", Pn, buf);
+		Exit(1);
+	    }
+	    (void) snpf(Fsinfo[i-1], len, "%s", buf);
+	}
+}
+
+
+#if	defined(HASNCACHE)
+
+/*
+ * Prepare for and #include the appropriate header files.
+ */
+
+# if	OSRV>=500
+#undef	IFIR
+#undef	IFIW
+#undef	IRCOLL
+#undef	IWCOLL
+# endif	/* OSRV>=500 */
+
+#include <sys/fs/s5inode.h>
+
+# if	defined(HAS_NFS)
+#include <sys/fs/nfs/dnlc.h>
+# endif	/* defined(HAS_NFS) */
+
+# if	OSRV>=500
+#  if	OSRV<504
+#include <sys/fs/dtdnlc.h>
+#undef	IFIR
+#undef	IFIW
+#undef	IRCOLL
+#undef	IWCOLL
+#define	_INKERNEL
+#include <sys/fs/htinode.h>
+#undef	_INKERNEL
+#  else	/* OSRV>=504 */
+#include <sys/fs/dnlc.h>
+#  endif	/* OSRV<504 */
+# endif	/* OSRV>=500 */
+
+
+/*
+ * Determine the maximum size of the cache name character array.
+ */
+
+# if	OSRV<504
+#define	MAXNSZ	DIRSIZ
+#  if	OSRV>=500 && DTNCMAX>MAXNSZ
+#undef	MAXNSZ
+#define	MAXNSZ	DTNCMAX
+#  endif	/* OSRV>=500 && DTNCMAX>MAXNSZ */
+# else	/* OSRV>=504 */
+#define	MAXNSZ	DNLC_NAMELEN
+# endif	/* OSRV<504 */
+
+# if	defined(HAS_NFS) && NC_NAMLEN>MAXNSZ
+#undef	MAXNSZ
+#define	MAXNSZ	NC_NAMLEN
+# endif	/* defined(HAS_NFS) && NC_NAMLEN>MAXNSZ */
+
+
+/*
+ * Define the local name cache structures.
+ */
+
+struct lnch {				/* local name cache structure */
+	union {
+	    struct ldev {		/* device-inode info */
+		dev_t dev;		/* device */
+		unsigned long inum;	/* inode number */
+		unsigned long pa_inum;	/* parent inode number */
+	    } ld;
+	    struct lnfs {		/* NFS info */
+		KA_T rp;		/* rnode address */
+		KA_T dp;		/* parent rnode address */
+	    } ln;
+	} u;
+	char nm[MAXNSZ+1];		/* name */
+	unsigned char nl;		/* name length */
+	unsigned char dup;		/* duplicate if 1 */
+	unsigned char type;		/* type: 0 = device-inode; 1 = NFS */
+	struct lnch *pa;		/* parent address */
+	struct lnch *next;		/* link to next same-type structure */
+};
+
+struct lnch_hh {			/* device-inode and NFS hash head */
+	struct lnch *hp[2];		/* [0] = device-inode; [1] = NFS*/
+};
+
+
+/*
+ * Local name cache (LNC) definitions, macros, and static values
+ */
+
+#define	LCHUNKSZ	256		/* local "chunk" size for reading the
+					 * kernel DNLC -- used for OSRV>=504 */
+static int LNC_asz = 0;			/* LNC cache allocated size */
+static int LNC_csz = 0;			/* LNC cache current size */
+#define	LNCHHLEN	64		/* hash head length (must be a
+					 * power of 2) */
+#define	LNCINCR		256		/* LNC size increment */
+#define	LNCINIT		1024		/* LNC initial size */
+
+#define DIN_hash(d, i)	&LNC_hh[((((int)(d + i)>>2)*31415)&(LNCHHLEN-1))]
+
+# if	defined(HAS_NFS)
+#define NFS_hash(r)	&LNC_hh[((((int)(r)>>2)*31415)&(LNCHHLEN-1))]
+# endif	/* defined(HAS_NFS) */
+
+static struct lnch_hh *LNC_hh = (struct lnch_hh *)NULL;
+					/* LNC hash head pointers */
+static struct lnch *LNC_nc = (struct lnch *)NULL;
+					/* the linear LNC */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct lnch *DIN_addr,(dev_t *d, unsigned long i));
+
+# if	OSRV>=500
+#  if	OSRV>=504
+_PROTOTYPE(static void DNLC_load,());
+#  else	/* OSRV<504 */
+_PROTOTYPE(static void DTFS_load,());
+_PROTOTYPE(static void HTFS_load,());
+#  endif	/* OSRV>=504 */
+# endif /* OSRV>=500 */
+
+_PROTOTYPE(static int LNC_enter,(struct lnch *le, char *nm, int nl, char *fs));
+_PROTOTYPE(static void LNC_nosp,(int len));
+
+# if	defined(HAS_NFS)
+_PROTOTYPE(static struct lnch *NFS_addr,(KA_T r));
+_PROTOTYPE(static void NFS_load,(void));
+_PROTOTYPE(static int NFS_root,(KA_T r));
+# endif /* defined(HAS_NFS) */
+
+# if	OSRV<504
+_PROTOTYPE(static void SYSV_load,());
+# endif	/* OSRV<504 */
+
+
+/*
+ * DIN_addr() - look up a node's local device-inode address
+ */
+
+static struct lnch *
+DIN_addr(d, i)
+	dev_t *d;			/* device number */
+	unsigned long i;		/* inode number */
+{
+	struct lnch_hh *hh = DIN_hash(*d, i);
+	struct lnch *lc = hh->hp[0];
+
+	while (lc) {
+	    if (lc->u.ld.dev == *d && lc->u.ld.inum == i)
+		return(lc);
+	    lc = lc->next;
+	}
+	return((struct lnch *)NULL);
+}
+
+
+# if	OSRV>=504
+/*
+ * DNLC_load() - load DNLC cache
+ */
+
+static void
+DNLC_load()
+{
+	int ccl;				/* current "chunk" length */
+	int ccs;				/* current "chunk" size */
+	int ccx;				/* current "chunk" index */
+	static int cha = 0;			/* "chunk" allocation size */
+	static int chl = 0;			/* "chunk" allocation length */
+	struct dnlc__cachent *cp;
+	static struct dnlc__cachent *dnlc = (struct dnlc__cachent *)NULL;
+	static int dnlce = 0;
+	int i, len;
+	static KA_T ka = (KA_T)0;
+	struct lnch lc;
+	char nm[DNLC_NAMELEN+1];
+	KA_T v;
+	char *wa;				/* "working" kernel DNLC
+						 * address */
+/*
+ * Do first-time setup, as required.
+ */
+	if (dnlce == 0) {
+
+	/*
+	 * Quit if the DNLC name cache address is unknown.
+	 */
+	    if (get_Nl_value("dnlc", Drive_Nl, &ka) < 0 || !ka)
+		return;
+	/*
+	 * Determine of the DNLC name cache address is that of an array or a
+	 * pointer to the array.
+	 */
+	    v = (KA_T)NULL;
+	    if (get_Nl_value("pdnlc", Drive_Nl, &v) >= 0 && v) {
+
+	    /*
+	     * If the DNLC name cache address is that of a pointer to an array,
+	     * get the array's address.  If that fails, return without comment
+	     * and without further action.
+	     */
+		if (kread(ka, (char *)&ka, sizeof(ka)))
+		    return;
+	    }
+	/*
+	 * Get the kernel's DNLC name cache size.
+	 */
+	    if (get_Nl_value("ndnlc", Drive_Nl, &v) < 0 || !v
+	    ||  kread(v, (char *)&dnlce, sizeof(dnlce))
+	    ||  dnlce < 1)
+		return;
+	/*
+	 * Allocate space for a copy of a portion ("chunk") of the kernel's
+	 * DNLC name cache.
+	 */
+	    cha = (dnlce <= LCHUNKSZ) ? dnlce : LCHUNKSZ;
+	    chl = sizeof(struct dnlc__cachent) * cha;
+	    if (!(dnlc = (struct dnlc__cachent *)malloc(chl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for DNLC chunk\n",
+		    Pn, chl);
+		cha = 0;
+		Exit(1);
+	    }
+	}
+/*
+ * Prepare to read the kernel's DNLC name cache.
+ */
+	if (!cha || !chl || !dnlc || !ka)
+	    return;
+/*
+ * Build a local copy of the kernel's DNLC name cache, reading the kernel data
+ * a "chunk" at a time.
+ */
+	nm[DNLC_NAMELEN] = '\0';
+	lc.type = 0;
+	for (ccl = ccs = i = 0, wa = (char *)ka; i < dnlce; i += ccs, wa += ccl)
+	{
+
+	/*
+	 * Read the next "chunk".
+	 */
+	    ccs = ((dnlce - i) < cha) ? (dnlce - i) : cha;
+	    ccl = sizeof(struct dnlc__cachent) * ccs;
+	    if (kread((KA_T)wa, (char *)dnlc, ccl))
+		break;
+	/*
+	 * Process the "chunk".
+	 */
+	    for (ccx = 0, cp = dnlc; ccx < ccs; cp++, ccx++) {
+		if (!cp->dev && !cp->newinum)
+		    continue;
+		(void) strncpy(nm, cp->name, DNLC_NAMELEN);
+		if ((len = strlen(nm)) < 1)
+		    continue;
+		if (len < 3 && nm[0] == '.') {
+		    if (len == 1 || (len == 2 && nm[1] == '.'))
+			continue;
+		}
+		lc.u.ld.dev = cp->dev;
+		lc.u.ld.inum = (unsigned long)cp->newinum;
+		lc.u.ld.pa_inum = (unsigned long)cp->inum;
+		if (LNC_enter(&lc, nm, len, "DNLC"))
+		    break;
+	    }
+	}
+/*
+ * If not repeating, free kernel DNLC name cache buffer space.
+ */
+	if (dnlc && !RptTm) {
+	    (void) free((MALLOC_P *)dnlc);
+	    dnlc = (struct dnlc__cachent *)NULL;
+	    dnlce = cha = chl = 0;
+	}
+}
+# endif	/* OSRV>=504 */
+
+
+# if	OSRV>=500 && OSRV<504
+/*
+ * DTFS_load() - load DTFS cache
+ */
+
+static void
+DTFS_load()
+{
+	struct dtcachent *cp;
+	static struct dtcachent *dtnc = (struct dtcachent *)NULL;
+	static int dtnce = 0;
+	int i, len;
+	static KA_T ka = (KA_T)NULL;
+	static int kcl = 0;
+	struct lnch lc;
+	char nm[DTNCMAX+1];
+	KA_T v;
+/*
+ * Do first-time setup, as required.
+ */
+	if (dtnce == 0) {
+
+	/*
+	 * Quit if the DTFS name cache address is unknown.
+	 */
+	    if (get_Nl_value("dtnc", Drive_Nl, &ka) < 0 || !ka)
+		return;
+	/*
+	 * Get the kernel's DTFS name cache size.
+	 */
+	    if (get_Nl_value("ndtnc", Drive_Nl, &v) < 0 || !v
+	    ||  kread(v, (char *)&dtnce, sizeof(dtnce))
+	    ||  dtnce < 1)
+		return;
+	/*
+	 * Allocate space for a copy of the kernel's DTFS name cache.
+	 */
+	    kcl = sizeof(struct dtcachent) * dtnce;
+	    if (!(dtnc = (struct dtcachent *)malloc(kcl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for DTFS name cache\n",
+		    Pn, kcl);
+		Exit(1);
+	    }
+	}
+/*
+ * Read the kernel's DTFS name cache.
+ */
+	if (!dtnc || !kcl || !ka || kread(ka, (char *)dtnc, kcl))
+	    return;
+/*
+ * Build a local copy of the kernel's DTFS name cache.
+ */
+	lc.type = 0;
+	nm[DTNCMAX] = '\0';
+	for (cp = dtnc, i = 0; i < dtnce; cp++, i++) {
+	    if (!cp->dn_dev && !cp->dn_newinum)
+		continue;
+	    (void) strncpy(nm, cp->dn_name, DTNCMAX);
+	    if ((len = strlen(nm)) < 1)
+		continue;
+	    if (len < 3 && cp->dn_name[0] == '.') {
+		if (len == 1 || (len == 2 && cp->dn_name[1] == '.'))
+		    continue;
+	    }
+	    lc.u.ld.dev = cp->dn_dev;
+	    lc.u.ld.inum = (unsigned long)cp->dn_newinum;
+	    lc.u.ld.pa_inum = (unsigned long)cp->dn_inum;
+	    if (LNC_enter(&lc, nm, len, "DTFS"))
+		break;
+	}
+/*
+ * If not repeating, free kernel DTFS name cache buffer space.
+ */
+	if (dtnc && !RptTm) {
+	    (void) free((MALLOC_P *)dtnc);
+	    dtnc = (struct dtcachent *)NULL;
+	    dtnce = kcl = 0;
+	}
+}
+
+
+/*
+ * HTFS_load() - load HTFS cache
+ */
+
+static void
+HTFS_load()
+{
+	struct htcachent *cp;
+	static struct htcachent *htnc = (struct htcachent *)NULL;
+	static int htnce = 0;
+	int i, len;
+	static KA_T ka = (KA_T)NULL;
+	static int kcl = 0;
+	struct lnch lc;
+	char nm[DIRSIZ+1];
+	KA_T v;
+/*
+ * Do first-time setup, as required.
+ */
+	if (htnce == 0) {
+
+	/*
+	 * Quit if the HTFS name cache address is unknown.
+	 */
+	    if (get_Nl_value("htnc", Drive_Nl, &ka) < 0 || !ka)
+		return;
+	/*
+	 * Get the kernel's HTFS name cache size.
+	 */
+	    if (get_Nl_value("nhtnc", Drive_Nl, &v) < 0 || !v
+	    ||  kread(v, (char *)&htnce, sizeof(htnce))
+	    ||  htnce < 1)
+		return;
+	/*
+	 * Allocate space for a copy of the kernel's HTFS name cache.
+	 */
+	    kcl = sizeof(struct htcachent) * htnce;
+	    if (!(htnc = (struct htcachent *)malloc(kcl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for HTFS name cache\n",
+		    Pn, kcl);
+		Exit(1);
+	    }
+	}
+/*
+ * Read the kernel's HTFS name cache.
+ */
+	if (!htnc || !kcl || !ka || kread(ka, (char *)htnc, kcl))
+	    return;
+/*
+ * Build a local copy of the kernel's HTFS name cache.
+ */
+	lc.type = 0;
+	nm[DIRSIZ] = '\0';
+	for (cp = htnc, i = 0; i < htnce; cp++, i++) {
+	    if (!cp->dev && !cp->newinum)
+		continue;
+	    (void) strncpy(nm, cp->name, DIRSIZ);
+	    if ((len = strlen(nm)) < 1)
+		continue;
+	    if (len < 3 && cp->name[0] == '.') {
+		if (len == 1 || (len == 2 && cp->name[1] == '.'))
+		    continue;
+	    }
+	    lc.u.ld.dev = (dev_t)cp->dev;
+	    lc.u.ld.inum = (unsigned long)cp->newinum;
+	    lc.u.ld.pa_inum = (unsigned long)cp->inum;
+	    if (LNC_enter(&lc, nm, len, "HTFS"))
+		break;
+	}
+/*
+ * If not repeating, free kernel HTFS name cache buffer space.
+ */
+	if (htnc && !RptTm) {
+	    (void) free((MALLOC_P *)htnc);
+	    htnc = (struct htcachent *)NULL;
+	    htnce = kcl = 0;
+	}
+}
+# endif	/* OSRV>=500 && OSRV<504 */
+
+
+/*
+ * LNC_enter() - make a local name cache entry
+ */
+
+static int
+LNC_enter(le, nm, nl, fs)
+	struct lnch *le;		/* skeleton local entry */
+	char *nm;			/* name */
+	int nl;				/* name length */
+	char *fs;			/* file system name */
+{
+	struct lnch *lc;
+	MALLOC_S len;
+
+	if (LNC_csz >= LNC_asz) {
+	    LNC_asz += LNCINCR;
+	    len = (MALLOC_S)(LNC_asz * sizeof(struct lnch));
+	    if (!(LNC_nc = (struct lnch *)realloc(LNC_nc, len))) {
+		(void) fprintf(stderr,
+		    "%s: no more space for %d byte local name cache: %s\n",
+		    Pn, len, fs);
+		Exit(1);
+	    }
+	}
+	lc = &LNC_nc[LNC_csz];
+	if ((lc->type = le->type) == 1) {
+
+	/*
+	 * Make an NFS entry.
+	 */
+	    lc->u.ln.rp = le->u.ln.rp;
+	    lc->u.ln.dp = le->u.ln.dp;
+	} else {
+	
+	/*
+	 * Make a device-inode entry.
+	 */
+	    lc->u.ld.dev = le->u.ld.dev;
+	    lc->u.ld.inum = le->u.ld.inum;
+	    lc->u.ld.pa_inum = le->u.ld.pa_inum;
+	}
+/*
+ * Enter the name and its size, clear the duplicate flag,
+ * and advance the linear cache entry count.
+ */
+	if (nl > MAXNSZ) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: length for \"%s\" too large: %d\n",
+		    Pn, nm, nl);
+	    nl = MAXNSZ;
+	}
+	(void) strncpy(lc->nm, nm, nl);
+	lc->nm[nl] = '\0';
+	lc->nl = (unsigned char)nl;
+	lc->dup = 0;
+	lc->next = lc->pa = (struct lnch *)NULL;
+	LNC_csz++;
+	return(0);
+}
+
+
+/*
+ * LNC_nosp() - notify that we're out of space for the local name cache
+ */
+
+static void
+LNC_nosp(len)
+	int len;			/* attempted length */
+{
+	if (!Fwarn)
+	    (void) fprintf(stderr,
+		"%s: no space for %d byte local name cache\n",
+		Pn, len);
+	Exit(1);
+}
+
+
+/*
+ * ncache_load() - load the kernel's NFS and DEV name caches
+ */
+
+void
+ncache_load()
+{
+	struct lnch_hh *hh;
+	struct lnch *hl, *hlp, *lc;
+	int f, i, len;
+
+	if (!Fncache)
+	    return;
+/*
+ * Initialize local name cache, as required.
+ */
+	if (LNC_asz == 0) {
+	    LNC_asz = LNCINIT;
+	    len = LNCINIT * sizeof(struct lnch);
+	    if (!(LNC_nc = (struct lnch *)malloc((MALLOC_S)len)))
+		(void) LNC_nosp(len);
+	}
+	LNC_csz = 0;
+
+# if	defined(HAS_NFS)
+/*
+ * Load NFS cache.
+ */
+	(void) NFS_load();
+# endif	/* defined(HAS_NFS) */
+
+# if	OSRV<504
+/*
+ * Load the device-inode SYSV file system cache.
+ */
+	(void) SYSV_load();
+
+#  if	OSRV>=500
+/*
+ * Load the device-inode DT and HT file system caches.
+ */
+	(void) DTFS_load();
+	(void) HTFS_load();
+#  endif	/* OSRV>=500 */
+# else	/* OSRV>=504 */
+/*
+ *  Load the device-inode combined file system cache.
+ */
+	 (void) DNLC_load();
+# endif	/* OSRV<504 */
+
+/*
+ * Reduce local name cache memory usage, as required.
+ */
+	if (LNC_csz < 1) {
+	    LNC_csz = 0;
+	    if (!RptTm) {
+		(void) free((FREE_P *)LNC_nc);
+		LNC_nc = (struct lnch *)NULL;
+	    }
+	    return;
+	}
+	if (LNC_csz < LNC_asz && !RptTm) {
+	    len = LNC_csz * sizeof(struct lnch);
+	    if (!(LNC_nc = (struct lnch *)realloc(LNC_nc, len)))
+		(void)LNC_nosp(len);
+	    LNC_asz = LNC_csz;
+	}
+/*
+ * Initialize hash head pointers.
+ */
+	if (!LNC_hh) {
+	    LNC_hh = (struct lnch_hh *)calloc(LNCHHLEN, sizeof(struct lnch_hh));
+	    if (!LNC_hh) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for name cache hash table\n",
+		    Pn, LNCHHLEN * sizeof(struct lnch_hh));
+		Exit(1);
+	    }
+	} else
+	    (void) zeromem((void *)LNC_hh, (LNCHHLEN * sizeof(struct lnch_hh)));
+/*
+ * Enter local name cache pointers in the hash table.  Look for entries with
+ * the same identifications that have different names.
+ */
+	for (i = 0, lc = LNC_nc; i < LNC_csz; i++, lc++) {
+
+# if	defined(HAS_NFS)
+	    if (lc->type)
+		hh = NFS_hash(lc->u.ln.rp);
+	    else
+# endif	/* defined(HAS_NFS) */
+
+		hh = DIN_hash(lc->u.ld.dev, lc->u.ld.inum);
+	    if (!(hl = hh->hp[lc->type])) {
+		hh->hp[lc->type] = lc;
+		continue;
+	    }
+	    for (f = 0, hlp = hl; hl; hlp = hl, hl = hl->next) {
+
+# if	defined(HAS_NFS)
+		if (lc->type == 1) {
+		    if (lc->u.ln.rp != hl->u.ln.rp)
+			continue;
+		} else
+# endif	/* defined(HAS_NFS) */
+
+		{
+		    if (lc->u.ld.dev != hl->u.ld.dev
+		    ||  lc->u.ld.inum != hl->u.ld.inum)
+			continue;
+		}
+		if (strcmp(lc->nm, hl->nm) == 0)
+		    f = 1;
+		else {
+		    f = 2;	/* same identifiers, different names */
+		    break;
+		}
+	    }
+	    if (!f)
+		hlp->next = lc;
+	    else if (f == 2) {
+
+	    /*
+	     * Since entries with the same identification but different names
+	     * were located, mark entries with the same identification as
+	     * duplicates.
+	     */
+		for (hl = hh->hp[lc->type]; hl; hl = hl->next) {
+
+# if	defined(HAS_NFS)
+		    if (lc->type == 1) {
+			if (lc->u.ln.rp == hl->u.ln.rp)
+			    hl->dup = 1;
+			continue;
+		    }
+# endif	/* defined(HAS_NFS) */
+
+		    if (hl->u.ld.dev == lc->u.ld.dev
+		    &&  hl->u.ld.inum == lc->u.ld.inum)
+			hl->dup = 1;
+		}
+	    }
+	}
+/*
+ * Make a final pass through the local name cache and convert parent
+ * identifications to local name cache pointers. Ignore duplicates.
+ */
+	for (i = 0, lc = LNC_nc; i < LNC_csz; i++, lc++) {
+	    if (lc->dup)
+		continue;
+
+# if	defined(HAS_NFS)
+	    if (lc->type == 1) {
+		if (lc->u.ln.dp)
+		    lc->pa = NFS_addr(lc->u.ln.dp);
+		continue;
+	    }
+# endif	/* defined(HAS_NFS) */
+
+	    if (lc->u.ld.dev && lc->u.ld.pa_inum)
+		lc->pa = DIN_addr(&lc->u.ld.dev, lc->u.ld.pa_inum);
+	}
+}
+
+
+/*
+ * ncache_lookup() - look up a node's name in the kernel's name caches
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	int nl, rlen;
+	struct lnch *lc;
+
+	*cp = '\0';
+	*fp = 0;
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller to print the file system mount point name only.
+ */
+	if (Lf->inp_ty == 1 && Lf->fs_ino && Lf->inode == Lf->fs_ino)
+	    return(cp);
+	if (!LNC_nc)
+	    return((char *)NULL);
+
+#if	defined(HAS_NFS)
+/*
+ * Look up the NFS name cache entry.
+ */
+	if (Lf->is_nfs) {
+	    if ((lc = NFS_addr(Lf->na)) && !lc->dup) {
+		if ((nl = (int)lc->nl) > (blen - 1))
+		    return(*cp ? cp : (char *)NULL);
+		cp = buf + blen - nl - 1;
+		rlen = blen - nl - 1;
+		(void) snpf(cp, nl + 1, "%s", lc->nm);
+	    /*
+	     * Look up the NFS name cache entries that are parents of the
+	     * rnode address.  Quit when:
+	     *
+	     *	there's no parent;
+	     *  the parent is a duplicate;
+	     *	the name is too large to fit in the receiving buffer.
+	     */
+		for (;;) {
+		    if (!lc->pa) {
+			if (NFS_root(lc->u.ln.dp))
+			    *fp = 1;
+			break;
+		    }
+		    lc = lc->pa;
+		    if (lc->dup)
+			break;
+		    if (((nl = (int)lc->nl) + 1) > rlen)
+			break;
+		    *(cp - 1) = '/';
+		    cp--;
+		    rlen--;
+		    (void) strncpy((cp - nl), lc->nm, nl);
+		    cp -= nl;
+		    rlen -= nl;
+	    	}
+		return(*cp ? cp : (char *)NULL);
+	    }
+	    return((char *)NULL);
+	}
+# endif	/* defined(HAS_NFS) */
+
+/*
+ * Look up the device-inode name cache entry.
+ */
+	if (Lf->dev_def && Lf->inp_ty == 1
+	&&  (lc = DIN_addr(&Lf->dev, Lf->inode)) && !lc->dup) {
+	    if ((nl = (int)lc->nl) > (blen - 1))
+		return(*cp ? cp : (char *)NULL);
+	    cp = buf + blen - nl - 1;
+	    rlen = blen - nl - 1;
+	    (void) snpf(cp, nl + 1, "%s", lc->nm);
+	/*
+	 * Look up the LNC name cache entries that are parents of the
+	 * device and inode number.  Quit when:
+	 *
+	 *	there's no parent;
+	 *	the parent is a duplicate cache entry;
+	 *	the name is too large to fit in the receiving buffer.
+	 */
+	    for (;;) {
+		if (!lc->pa) {
+		    if (lc->u.ld.pa_inum && Lf->fs_ino
+		    &&  lc->u.ld.pa_inum == Lf->fs_ino)
+			*fp = 1;
+		    break;
+		}
+		lc = lc->pa;
+		if (lc->dup)
+		    break;
+		if (lc->u.ld.inum && Lf->fs_ino
+		&&  lc->u.ld.inum == Lf->fs_ino) {
+		    *fp = 1;
+		    break;
+		}
+		if (((nl = (int)lc->nl) + 1) > rlen)
+		    break;
+		*(cp - 1) = '/';
+		cp--;
+		rlen--;
+		(void) strncpy((cp - nl), lc->nm, nl);
+		cp -= nl;
+		rlen -= nl;
+	    }
+	    return(*cp ? cp : (char *)NULL);
+	}
+	return((char *)NULL);
+}
+
+
+# if	defined(HAS_NFS)
+/*
+ * NFS_addr() - look up a node's local NFS_nc address
+ */
+
+static struct lnch *
+NFS_addr(r)
+	KA_T r;				/* rnode's address */
+{
+	struct lnch_hh *hh = NFS_hash(r);
+	struct lnch *lc = hh->hp[1];
+
+	while (lc) {
+	    if (lc->u.ln.rp == r)
+		return(lc);
+	    lc = lc->next;
+	}
+	return((struct lnch *)NULL);
+}
+
+
+/*
+ * NFS_load() -- load kernel's NFS name cache
+ */
+
+static void
+NFS_load()
+{
+	struct ncache *cp;
+	int i, len;
+	struct lnch lc;
+	static KA_T ka = (KA_T)NULL;
+	static int kcl = 0;
+	static struct ncache *nfnc = (struct ncache *)NULL;
+	static int nfnce = 0;
+	char nm[NC_NAMLEN+1];
+	KA_T v;
+/*
+ * Do first-time setup, as required.
+ */
+	if (nfnce == 0) {
+
+	/*
+	 * Quit if the NFS name cache address is unknown.
+	 */
+	    if (get_Nl_value("nfnc", Drive_Nl, &ka) < 0 || !ka)
+		return;
+	/*
+	 * Get the kernel's NFS name cache size.
+	 */
+	    if (get_Nl_value("nnfnc", Drive_Nl, &v) < 0 || !v
+	    ||  kread(v, (char *)&nfnce, sizeof(nfnce))
+	    ||  nfnce < 1)
+		return;
+	/*
+	 * Allocate space for a copy of the kernel's NFS name cache.
+	 */
+	    kcl = nfnce * sizeof(struct ncache);
+	    if (!(nfnc = (struct ncache *)malloc(kcl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for NFS name cache\n",
+		    Pn, kcl);
+		Exit(1);
+	    }
+	}
+/*
+ * Read the kernel's NFS name cache.
+ */
+	if (!nfnc || !kcl || !ka || kread(ka, (char *)nfnc, kcl))
+	    return;
+/*
+ * Build a local copy of the kernel's NFS name cache.
+ */
+	lc.type = 1;
+	for (cp = nfnc, i = 0; i < nfnce; cp++, i++) {
+	    if (!cp->rp)
+		continue;
+	    if ((len = cp->namlen) < 0 || len > NC_NAMLEN)
+		continue;
+	    (void) strncpy(nm, cp->name, len);
+	    nm[len] = '\0';
+	    if ((len = strlen(nm)) < 1)
+		continue;
+	    if (len < 3 && nm[0] == '.') {
+		if (len == 1 || (len == 2 && nm[1] == '.'))
+		    continue;
+	    }
+	    lc.u.ln.rp = (KA_T)cp->rp;
+	    lc.u.ln.dp = (KA_T)cp->dp;
+	    if (LNC_enter(&lc, nm, len, "NFS"))
+		break;
+	}
+/*
+ * If not repeating, free kernel NFS name cache buffer space.
+ */
+	if (nfnc && !RptTm) {
+	    (void) free((MALLOC_P *)nfnc);
+	    nfnc = (struct ncache *)NULL;
+	    kcl = nfnce = 0;
+	}
+}
+
+
+static int
+NFS_root(r)
+	KA_T r;			/* node's rnode address */
+{
+	int i;
+	MALLOC_S len;
+	static int rnc = 0;
+	static int rnca = 0;
+	static KA_T *rc = (KA_T *)NULL;
+	struct rnode rn;
+	unsigned short *n;
+	unsigned long nnum;
+
+# if	OSRV>=500
+	unsigned short *n1;
+# endif	/* OSRV>=500 */
+
+	if (!Lf->fs_ino || !r)
+	    return(0);
+/*
+ * Search NFS root rnode cache.
+ */
+	for (i = 0; i < rnc; i++) {
+	    if (rc[i] == r)
+		return(1);
+	}
+/*
+ * Read rnode and get the node number.
+ */
+	if (kread(r, (char *)&rn, sizeof(rn)))
+	    return(0);
+
+# if	OSRV<500
+	n = (unsigned short *)&rn.r_fh.fh_pad[14];
+	if (!(nnum = (unsigned long)ntohs(*n)))
+	    nnum = (unsigned long)rn.r_fh.fh_u.fh_fgen_u;
+# else	/* OSRV>=500 */
+	n = (unsigned short *)&rn.r_fh.fh_u.fh_fid_u[4];
+	n1 = (unsigned short *)&rn.r_fh.fh_u.fh_fid_u[2];
+	if (!(nnum = (unsigned long)*n))
+	    nnum = (unsigned long)*n1;
+# endif	/* OSRV<500 */
+
+	if (!nnum || nnum != Lf->fs_ino)
+	    return(0);
+/*
+ * Add the rnode address to the NFS root rnode cache.
+ */
+	if (rnc >= rnca) {
+	    if (rnca == 0) {
+		len = (MALLOC_S)(10 * sizeof(KA_T));
+		if ((rc = (KA_T *)malloc(len)))
+		    rnca = 10;
+	    } else {
+		len = (MALLOC_S)((rnca + 10) * sizeof(KA_T));
+		if ((rc = (KA_T *)realloc(rc, len)))
+		    rnca += 10;
+	    }
+	    if (!rc) {
+		(void) fprintf(stderr, "%s: no space for root rnode table\n",
+		    Pn);
+		Exit(1);
+	    }
+	}
+	rc[rnc++] = r;
+	return(1);
+}
+# endif	/* defined(HAS_NFS) */
+
+
+# if	OSRV<504
+/*
+ * SYSV_load() - load SYSV cache
+ */
+
+static void
+SYSV_load()
+{
+	struct s5cachent *cp;
+	int i, len;
+	static KA_T ka = (KA_T)NULL;
+	static int kcl = 0;
+	struct lnch lc;
+	char nm[DIRSIZ+1];
+	static struct s5cachent *s5nc = (struct s5cachent *)NULL;
+	static int s5nce = 0;
+	KA_T v;
+/*
+ * Do first-time setup, as required.
+ */
+	if (s5nce == 0) {
+	
+	/*
+	 * Quit if the SYSV name cache address is unknown.
+	 */
+	    if (get_Nl_value("s5nc", Drive_Nl, &ka) < 0 || !ka)
+		return;
+	/*
+	 * Get the kernel's SYSV name cache size.
+	 */
+
+#  if	OSRV<500
+	    s5nce = Var.v_s5cacheents;	
+#  else	/* OSRV>=500 */
+	    if (get_Nl_value("nsfnc", Drive_Nl, &v) < 0 || !v
+	    ||  kread(v, (char *)&s5nce, sizeof(s5nce)))
+		return;
+#  endif	/* OSRV<500 */
+
+	    if (s5nce < 1)
+		return;
+	/*
+	 * Allocate space for a copy of the kernel's SYSV name cache.
+	 */
+	    kcl = sizeof(struct s5cachent) * s5nce;
+	    if (!(s5nc = (struct s5cachent *)malloc(kcl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for SYSV name cache\n",
+		    Pn, kcl);
+		Exit(1);
+	    }
+	}
+/*
+ * Read the kernel's SYSV name cache.
+ */
+	if (!s5nc || !kcl || !ka || kread(ka, (char *)s5nc, kcl))
+	    return;
+/*
+ * Build a local copy of the kernel's SYSV name cache.
+ */
+	nm[DIRSIZ] = '\0';
+	lc.type = 0;
+	for (cp = s5nc, i = 0; i < s5nce; cp++, i++) {
+	    if (!cp->dev && !cp->newinum)
+		continue;
+	    (void) strncpy(nm, cp->name, DIRSIZ);
+	    if ((len = strlen(nm)) < 1)
+		continue;
+	    if (len < 3 && cp->name[0] == '.') {
+		if (len == 1 || (len == 2 && cp->name[1] == '.'))
+		    continue;
+	    }
+	    lc.u.ld.dev = (dev_t)cp->dev;
+	    lc.u.ld.inum = (unsigned long)cp->newinum;
+	    lc.u.ld.pa_inum = (unsigned long)cp->inum;
+	    if (LNC_enter(&lc, nm, len, "SYSV"))
+		break;
+	}
+/*
+ * If not repeating, free kernel SYSV name cache buffer space.
+ */
+	if (s5nc && !RptTm) {
+	    (void) free((MALLOC_P *)s5nc);
+	    s5nc = (struct s5cachent *)NULL;
+	    kcl = s5nce = 0;
+	}
+}
+# endif	/* OSRV<504 */
+#endif	/* defined(HASNCACHE) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/osr/dproto.h
new file mode 100644
index 0000000..77e029c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dproto.h
@@ -0,0 +1,62 @@
+/*
+ * dproto.h - SCO OpenServer function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * Copyright 1995 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: dproto.h,v 1.5 99/06/22 08:22:28 abe Exp $
+ */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern void process_socket,(struct inode *i));
+_PROTOTYPE(extern int get_max_fd,(void));
+
+#if	OSRV<500
+_PROTOTYPE(extern int endservent,(void));
+_PROTOTYPE(extern int setservent,(int));
+
+# if	defined(HASSTATLSTAT)
+_PROTOTYPE(extern int statlstat,(const char *, struct stat *));
+# endif	/* defined(HASTSTATLSTAT) */
+
+_PROTOTYPE(extern int strcasecmp,(char *, char *));
+_PROTOTYPE(extern int strncasecmp,(char *, char *, unsigned int));
+_PROTOTYPE(extern pid_t wait,());
+#endif	/* OSRV<500 */
+
+_PROTOTYPE(extern int sysi86,());
+_PROTOTYPE(extern int sysfs,());
+_PROTOTYPE(extern void udp_tm,(time_t tm));
+
+#if	!defined(N_UNIX)
+_PROTOTYPE(extern char *get_nlist_path,(int pd));
+#endif	/* !defined(N_UNIX) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/osr/dsock.c
new file mode 100644
index 0000000..80684d1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dsock.c
@@ -0,0 +1,422 @@
+/*
+ * dsock.c - SCO OpenServer socket processing functions for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1995 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.15 2004/03/10 23:52:12 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(i)
+	struct inode *i;		/* inode pointer */
+{
+	char *cp;
+	struct domain d;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fam, j, k;
+	int fp, lp;
+	unsigned char *la = (unsigned char *)NULL;
+	int p;
+	struct inpcb pcb;
+	short pcbs = 0;
+	short  udpsf, udpsl;
+	struct socket s;
+	KA_T sa, spa;
+	struct stdata sd;
+	struct queue sh;
+	short shs = 0;
+	struct tcpcb t;
+	short ts = 0;
+	struct udpdev udp;
+	short udptm = 0;
+
+#if	OSRV<500
+	struct sockaddr_in *si;
+#else	/* OSRV>=500 */
+	struct sockaddr_in si;
+	struct un_dev ud;
+#endif	/* OSRV<500 */
+	
+	(void) snpf(Lf->type, sizeof(Lf->type), "sock");
+/*
+ * Read socket.
+ */
+	if (!Socktab) {
+	    (void) enter_nm("No kernel socket table");
+	    return;
+	}
+	spa = Socktab + (GET_MIN_DEV(i->i_rdev) * sizeof(struct socket *));
+	if (kread(spa, (char *)&sa, sizeof(sa))) {
+	    (void) snpf(Namech, Namechl, "can't read socket pointer at %s",
+		print_kptr(spa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	}
+	if (kread(sa, (char *)&s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl, "can't read socket structure at %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Read domain structure.
+ */
+	if (!s.so_proto.pr_domain
+	||  kread((KA_T)s.so_proto.pr_domain, (char *)&d, sizeof(d))) {
+	    (void) snpf(Namech, Namechl, "can't read protocol domain from %s",
+		print_kptr((KA_T)s.so_proto.pr_domain, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Process by protocol domain.
+ */
+	switch ((fam = d.dom_family)) {
+	case AF_INET:
+	    if (Fnet)
+		Lf->sf |= SELNET;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+	    printiproto((int)s.so_proto.pr_protocol);
+	    Lf->inp_ty = 2;
+	/*
+	 * Get protocol control block address from stream head queue structure.
+	 */
+	    if (s.so_stp
+	    &&  !readstdata((KA_T)s.so_stp, &sd)
+	    &&  !readsthead((KA_T)sd.sd_wrq, &sh))
+		shs = 1;
+	    if (shs && sh.q_ptr) {
+		enter_dev_ch(print_kptr((KA_T)sh.q_ptr, (char *)NULL, 0));
+		if (kread((KA_T)sh.q_ptr, (char *)&pcb, sizeof(pcb)) == 0)
+		    pcbs = 1;
+	    }
+	/*
+	 * Print local and remote addresses.
+	 */
+	    if (pcbs) {
+		if (pcb.inp_ppcb && strcasecmp(Lf->iproto, "udp") == 0) {
+
+		/*
+		 * If this is a UDP socket file, get the udpdev structure
+		 * at the PCB's per-protocol control block address.  It
+		 * may contain a foreign address.
+		 */
+		    if (!kread((KA_T)pcb.inp_ppcb, (char *)&udp, sizeof(udp))) {
+
+#if	OSRV>=500
+			if (udp.ud_lsin.sin_addr.s_addr != INADDR_ANY
+			||  udp.ud_lsin.sin_port != 0)
+			    udpsl = 1;
+			else
+			    udpsl = 0;
+#endif	/* OSRV>=500 */
+
+			if (udp.ud_fsin.sin_addr.s_addr != INADDR_ANY
+			||  udp.ud_fsin.sin_port != 0)
+			    udpsf = 1;
+			else
+			    udpsf = 0;
+		    }
+		} else
+		    udpsf = udpsl = 0;
+	    /*
+	     * Print the local address from the PCB.  If there is none, and if
+	     * this is a 5.0.0 or greater UDP stream, and if it has a local
+	     * address set, use it.
+	     */
+		la = (unsigned char *)&pcb.inp_laddr;
+		lp = (int)ntohs(pcb.inp_lport);
+
+#if     OSRV>=500
+		if (((struct in_addr *)la)->s_addr == INADDR_ANY
+		&&  lp == 0 && udpsl) {
+		    la = (unsigned char *)&udp.ud_lsin.sin_addr;
+		    lp = (int)ntohs(udp.ud_lsin.sin_port);
+		}
+
+#endif  /* OSRV>=500 */
+
+	    /*
+	     * Use the PCB's foreign address if it is set.  If not, and if this
+	     * is a UDP socket file, use the udpdev structure's foreign address
+	     * if it's set.
+	     */
+		if (pcb.inp_faddr.s_addr != INADDR_ANY || pcb.inp_fport != 0) {
+		    fa = (unsigned char *)&pcb.inp_faddr;
+		    fp = (int)ntohs(pcb.inp_fport);
+		} else if (udpsf) {
+		    fa = (unsigned char *)&udp.ud_fsin.sin_addr;
+		    fp = (int)ntohs(udp.ud_fsin.sin_port);
+		    udptm = 1;
+		}
+		if (la || fa) {
+		    (void) ent_inaddr(la, lp, fa, fp, AF_INET);
+		    if (udptm && !Lf->nma)
+			(void)udp_tm(udp.ud_ftime);
+		}
+		if (pcb.inp_ppcb && strcasecmp(Lf->iproto, "tcp") == 0
+		&&  kread((KA_T)pcb.inp_ppcb, (char *)&t, sizeof(t)) == 0) {
+		    ts = 1;
+		/*
+		 * Save the TCP state from its control block.
+		 */
+		    Lf->lts.type = 0;
+		    Lf->lts.state.i = (int)t.t_state;
+		}
+	    } else {
+
+#if	OSRV<500
+		if ((si = (struct sockaddr_in *)&s.so_name)) {
+		    la = (unsigned char *)&si->sin_addr;
+		    lp = (int)ntohs(si->sin_port);
+		}
+		if ((si = (struct sockaddr_in *)&s.so_peer)) {
+		    if (si->sin_addr.s_addr != INADDR_ANY || si->sin_port != 0)
+		    {
+			fa = (unsigned char *)&si->sin_addr;
+			fp = (int)ntohs(si->sin_port);
+		    }
+		}
+#else	/* OSRV>=500 */
+		if (s.so_name
+		&&  !kread((KA_T)s.so_name, (char *)&si, sizeof(si))) {
+		    la = (unsigned char *)&si.sin_addr;
+		    lp = (int)ntohs(si.sin_port);
+		}
+		if (s.so_peer
+		&&  !kread((KA_T)s.so_peer, (char *)&si, sizeof(si))) {
+		    if (si.sin_addr.s_addr != INADDR_ANY || si.sin_port != 0) {
+			fa = (unsigned char *)&si.sin_addr;
+			fp = (int)ntohs(si.sin_port);
+		    }
+		}
+#endif	/* OSRV<500 */
+
+		if (la || fa)
+		    (void) ent_inaddr(la, lp, fa, fp, AF_INET);
+	    }
+	/*
+	 * Save options, sizes, states and values.
+	 */
+
+#if	defined(HASSOOPT)
+	    Lf->lts.ltm = (unsigned int)s.so_linger;
+	    Lf->lts.opt = (unsigned int)s.so_options;
+	    Lf->lts.qlen = (unsigned int)s.so_qlen;
+	    Lf->lts.qlim = (unsigned int)s.so_qlimit;
+	    Lf->lts.qlens = Lf->lts.qlims = (unsigned char)1;
+	    if (ts && t.t_timer[TCPT_KEEP]) {
+		Lf->lts.opt |= SO_KEEPALIVE;
+		Lf->lts.kai = (unsigned long)t.t_timer[TCPT_KEEP];
+	    }
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	    Lf->lts.ss = s.so_state;
+#endif	/* defined(HASSOSTATE) */
+
+
+	    if (ts) {
+
+#if	defined(HASTCPOPT)
+		Lf->lts.topt = (unsigned int)t.t_flags;
+		Lf->lts.mss = (unsigned long)t.t_maxseg;
+		Lf->lts.msss = (unsigned char)1;
+#endif	/* defined(HASTCPOPT) */
+
+#if	defined(HASTCPTPIQ)
+		Lf->lts.rq = (unsigned long)t.t_iqsize;
+		Lf->lts.sq = (unsigned long)t.t_qsize;
+		Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+		if (Fsize) {
+		    if (Lf->access == 'r')
+			Lf->sz = (SZOFFTYPE)t.t_iqsize;
+		    else if (Lf->access == 'w')
+			Lf->sz = (SZOFFTYPE)t.t_qsize;
+		    else
+			Lf->sz = (SZOFFTYPE)(t.t_iqsize + t.t_qsize);
+		    Lf->sz_def = 1;
+		} else
+		    Lf->off_def = 1;
+	    } else if (shs) {
+		if (Fsize) {
+		    Lf->sz = (SZOFFTYPE)sh.q_count;
+		    Lf->sz_def = 1;
+		} else
+		    Lf->off_def = 1;
+	    } else
+		Lf->off_def = 1;
+	    break;
+
+#if	OSRV>=500
+	case AF_UNIX:
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	/*
+	 * Read Unix protocol control block and the Unix address structure.
+	 */
+	    enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+	    Lf->off_def = 1;
+	    if (s.so_stp
+	    &&  !readstdata((KA_T)s.so_stp, &sd)
+	    &&  !readsthead((KA_T)sd.sd_wrq, &sh)) {
+		if (!sh.q_ptr
+		||  kread((KA_T)sh.q_ptr, (char *)&ud, sizeof(ud)))
+		{
+		    (void) snpf(Namech, Namechl, "can't read un_dev from %s",
+			print_kptr((KA_T)sh.q_ptr, (char *)NULL, 0));
+		    break;
+		}
+		if (ud.so_rq)
+		    enter_dev_ch(print_kptr((KA_T)ud.so_rq, (char *)NULL, 0));
+		if (ud.local_addr.sun_family == AF_UNIX) {
+		    Lf->inode = (unsigned long)ud.bnd_param.user_addr.inode_no;
+		    Lf->inp_ty = 1;
+		    ud.local_addr.sun_path[sizeof(ud.local_addr.sun_path) - 1]
+			= '\0';
+		    if (Sfile && is_file_named(ud.local_addr.sun_path, 0))
+			Lf->sf |= SELNM;
+		    if (!Namech[0])
+			(void) snpf(Namech,Namechl,"%s",ud.local_addr.sun_path);
+		} else if (ud.for_addr.sun_family == AF_UNIX) {
+		    Lf->inode = (unsigned long)ud.bnd_param.user_addr.inode_no;
+		    Lf->inp_ty = 1;
+		    ud.for_addr.sun_path[sizeof(ud.for_addr.sun_path) - 1]
+			= '\0';
+		    if (Sfile && is_file_named(ud.for_addr.sun_path, 0))
+			Lf->sf |= SELNM;
+		    else
+			(void) snpf(Namech,Namechl,"%s",ud.for_addr.sun_path);
+		} else if (ud.other_q)
+		    (void) snpf(Namech, Namechl, "->%s",
+			print_kptr((KA_T)ud.other_q, (char *)NULL, 0));
+	    } else
+		(void) snpf(Namech, Namechl, "can't get un_dev");
+	    break;
+#endif	/* OSRV>=500 */
+
+	default:
+	    printunkaf(fam, 1);
+	}
+	enter_nm(Namech);
+}
+
+
+/*
+ * udp_tm() - compute time since UDP packet was last sent
+ */
+
+void
+udp_tm(tm)
+	time_t tm;			/* time when packet was sent */
+{
+	static char buf[32], *cp;
+	time_t et, lbolt;
+	MALLOC_S len;
+	short hr, min, sec;
+/*
+ * Read the lightning bolt timer and compute the elapsed time.
+ * No elapsed time is returned if:
+ *	the global clock frequency variable, Hz, is negative;
+ *	the lightning bolt timer is unavailable;
+ *	the lightning bolt time is less than the UDP send time;
+ *	the elapsed time is zero.
+ */
+	if (!Lbolt)
+	    return;
+	if (Hz < 0 
+	||  kread((KA_T)Lbolt, (char *)&lbolt, sizeof(lbolt))
+	||  tm >= lbolt
+	||  (et = (time_t)((lbolt - tm) / Hz)) == 0)
+	    return;
+/*
+ * If the time is 100 hours or greater, return the elapsed time as seconds.
+ */
+	if (et >= (100 * 60 * 60)) {
+	    (void) snpf(buf, sizeof(buf), "%lds", et);
+	    cp = &buf[strlen(buf)];
+	} else {
+
+	/*
+	 * Convert seconds to hours, minutes and seconds.
+	 */
+	    hr = (short)(et / (60 * 60));
+	    et %= (60 * 60);
+	    min = (short)(et / 60);
+	    sec = (short)(et % 60);
+	    cp = buf;
+	/*
+ 	 * Format the elapsed time and attach single character suffixes to
+	 * represent the units:
+	 *
+	 *    `h' = hours
+	 *    `m' = minutes
+	 *    `s' = seconds
+ 	 */
+	    if (hr) {
+		(void) snpf(cp, sizeof(buf) - (cp - buf), "%dh", hr);
+		cp += 2 + ((hr > 9) ? 1 : 0);
+	    }
+	    if (min) {
+		(void) snpf(cp, sizeof(buf) - (cp - buf), "%dm", min);
+		cp += 2 + ((min > 9) ? 1 : 0);
+	    }
+	    if (sec) {
+		(void) snpf(cp, sizeof(buf) - (cp - buf), "%ds", sec);
+		cp += 2 + ((sec > 9) ? 1 : 0);
+	    }
+	}
+/*
+ * Add the `` ago'' trailer.  Return the string's address and length.
+ */
+	(void) snpf(cp, sizeof(buf) - (cp - buf), " ago");
+	len = (MALLOC_S)(strlen(buf) + 1);
+	if (len < 2)
+	    return;
+	if (!(cp = (char *)malloc(len))) {
+	    (void) fprintf(stderr, "%s: no space for %d character UDP time\n",
+		Pn, len);
+	    Exit(1);
+	}
+	(void) snpf(cp, len, "%s", buf);
+	Lf->nma = cp;
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/osr/dstore.c
new file mode 100644
index 0000000..c7a2636
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/dstore.c
@@ -0,0 +1,154 @@
+/*
+ * dstore.c - SCO OpenServer global storage for lsof
+ */
+
+
+/*
+ * Copyright 1995 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1995 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.9 2002/12/03 18:23:08 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+char **Cdevsw = NULL;		/* names from kernel's cdevsw[].d_name */
+int Cdevcnt = 0;		/* Cdevsw[] count */
+int CloneMajor;			/* clone major device */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+	{ "ncdev",	"cdevcnt"		},
+	{ "cdev",	"cdevsw"		},
+	{ "dnlc",	"dnlc__cache"		},  /* OSRV>=504 */
+	{ "ndnlc",	"dnlc__cacheents"	},  /* OSRV>=504 */
+	{ "pdnlc",	"dnlc__cache_is_ptr"	},  /* OSRV>=507 */
+	{ "dtnc",	"dtcache"		},  /* 500<=OSRV<504 */
+	{ "htnc",	"htcache"		},  /* 500<=OSRV<504 */
+	{ "hz",		"Hz"			},
+	{ "lbolt",	"lbolt"			},
+	{ "nfnc",	"ncache"		},  /* HAS_NFS */
+	{ "nnfnc",	"nc_size"		},  /* HAS_NFS */
+	{ "nxdm",	"nxdevmaps"		},  /* OSRV>=40 */
+	{ "pregpp",	"pregpp"		},  /* OSRV<500 */
+	{ "proc",	"proc"			},
+	{ "scouts",	"scoutsname"		},  /* OSRV>=500 */
+	{ "sockd",	"sockdev"		},
+	{ "sockt",	"socktab"		},
+	{ "s5nc",	"s5cache"		},  /* OSRV<504 */
+	{ "var",	"v"			},
+	{ "ndtnc",	"v_dtcacheents"		},  /* 500<=OSRV<504 */
+	{ "nhtnc",	"v_htcacheents"		},  /* 500<=OSRV<504 */
+	{ "ns5nc",	"v_s5cacheents"		},  /* 500<=OSRV<504 */
+	{ "xdm",	"xdevmap"		},  /* OSRV>=40 */
+	{ NULL,		NULL			}
+};
+
+int EventMajor;			/* event major device number */
+char **Fsinfo = NULL;		/* file system information */
+int Fsinfomax = 0;		/* maximum file system type */
+int HaveCloneMajor = 0;		/* have clone major device number = 1 */
+int HaveEventMajor = 0;		/* have event major device number */
+int HaveSockdev = 0;		/* socket device number status: 1 = available */
+int Hz = -1;			/* system clock frequency */
+int Kd = -1;			/* /dev/kmem file descriptor */
+KA_T Lbolt = (KA_T)0;		/* kernel's lbolt variable address */
+int Sockdev;			/* socket device number */
+KA_T Socktab = (KA_T)0;		/* address of socket pointer table */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FRCACH,		FF_RCACH	},
+	{ (long)FSTOPIO,	FF_STOPIO	},
+
+# if	defined(FASYNC)
+	{ (long)FASYNC,		FF_ASYNC	},
+# endif	/* defined(FASYNC`) */
+
+# if	defined(FNET)
+	{ (long)FNET,		FF_NET		},
+# endif	/* defined(FNET) */
+
+# if	defined(FSYNC)
+	{ (long)FSYNC,		FF_SYNC		},
+# endif	/* defined(FSYNC) */
+
+	{ (long)0,		NULL 		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+	{ (long)EXCLOSE,	POF_CLOEXEC	},
+
+# if	defined(AUD_READ)
+	{ (long)AUD_READ,	POF_BNRD	},
+# endif	/* defined(AUD_READ) */
+
+# if	defined(AUD_WRITE)
+	{ (long)AUD_WRITE,	POF_BNWR	},
+# endif	/* defined(AUDWRITE) */
+
+# if	defined(SEC_SIGHUPPED)
+	{ (long)SEC_SIGHUPPED,	POF_BNHUP	},
+# endif	/* defined(SEC_SIGHUPPED) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
+
+
+#if	OSRV>=40
+/*
+ * The following items are needed by the internal kernel major()
+ * and minor() macros for mapping extended minor numbers.
+ */
+
+int nxdevmaps = -1;		/* maximum kernel xdevmap[] index */
+struct XDEVMAP *Xdevmap;	/* dynamically allocated xdevmap[] */
+#endif	/* OSRV>=40 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/include/netdb.h b/lsof_4.85/lsof_4.85_src/dialects/osr/include/netdb.h
new file mode 100644
index 0000000..3d2e3d7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/include/netdb.h
@@ -0,0 +1,121 @@
+/*-
+ * Copyright (c) 1980, 1983, 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)netdb.h	5.15 (Berkeley) 4/3/91
+ */
+
+#ifndef _NETDB_H_
+#define _NETDB_H_
+
+#define	_PATH_HEQUIV	"/etc/hosts.equiv"
+#define	_PATH_HOSTS	"/etc/hosts"
+#define	_PATH_NETWORKS	"/etc/networks"
+#define	_PATH_PROTOCOLS	"/etc/protocols"
+#define	_PATH_SERVICES	"/etc/services"
+
+/*
+ * Structures returned by network data base library.  All addresses are
+ * supplied in host order, and returned in network order (suitable for
+ * use in system calls).
+ */
+struct	hostent {
+	char	*h_name;	/* official name of host */
+	char	**h_aliases;	/* alias list */
+	int	h_addrtype;	/* host address type */
+	int	h_length;	/* length of address */
+	char	**h_addr_list;	/* list of addresses from name server */
+#define	h_addr	h_addr_list[0]	/* address, for backward compatiblity */
+};
+
+/*
+ * Assumption here is that a network number
+ * fits in 32 bits -- probably a poor one.
+ */
+struct	netent {
+	char		*n_name;	/* official name of net */
+	char		**n_aliases;	/* alias list */
+	int		n_addrtype;	/* net address type */
+	unsigned long	n_net;		/* network # */
+};
+
+struct	servent {
+	char	*s_name;	/* official service name */
+	char	**s_aliases;	/* alias list */
+	int	s_port;		/* port # */
+	char	*s_proto;	/* protocol to use */
+};
+
+struct	protoent {
+	char	*p_name;	/* official protocol name */
+	char	**p_aliases;	/* alias list */
+	int	p_proto;	/* protocol # */
+};
+
+/*
+ * Error return codes from gethostbyname() and gethostbyaddr()
+ * (left in extern int h_errno).
+ */
+
+#define	HOST_NOT_FOUND	1 /* Authoritative Answer Host not found */
+#define	TRY_AGAIN	2 /* Non-Authoritive Host not found, or SERVERFAIL */
+#define	NO_RECOVERY	3 /* Non recoverable errors, FORMERR, REFUSED, NOTIMP */
+#define	NO_DATA		4 /* Valid name, no data record of requested type */
+#define	NO_ADDRESS	NO_DATA		/* no address, look for MX record */
+
+#include <sys/cdefs.h>
+
+__BEGIN_DECLS
+void		endhostent __P((void));
+void		endnetent __P((void));
+void		endprotoent __P((void));
+/* void		endservent __P((void));	*/
+struct hostent	*gethostbyaddr __P((const char *, int, int));
+struct hostent	*gethostbyname __P((char *));
+struct hostent *gethostent __P((void));
+struct netent	*getnetbyaddr __P((long, int)); /* u_long? */
+struct netent	*getnetbyname __P((const char *));
+struct netent	*getnetent __P((void));
+struct protoent	*getprotobyname __P((const char *));
+struct protoent	*getprotobynumber __P((int));
+struct protoent	*getprotoent __P((void));
+struct servent	*getservbyname __P((const char *, const char *));
+struct servent	*getservbyport __P((int, const char *));
+struct servent	*getservent __P((void));
+void		herror __P((const char *));
+void		sethostent __P((int));
+/* void		sethostfile __P((const char *)); */
+void		setnetent __P((int));
+void		setprotoent __P((int));
+/* void		setservent __P((int));	*/
+__END_DECLS
+
+#endif /* !_NETDB_H_ */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/include/sys/cdefs.h b/lsof_4.85/lsof_4.85_src/dialects/osr/include/sys/cdefs.h
new file mode 100644
index 0000000..c4157bc
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/include/sys/cdefs.h
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 1991, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *	This product includes software developed by the University of
+ *	California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *	@(#)cdefs.h	8.2 (Berkeley) 10/4/93
+ */
+
+#ifndef	_CDEFS_H_
+#define	_CDEFS_H_
+
+#if defined(__cplusplus)
+#define	__BEGIN_DECLS	extern "C" {
+#define	__END_DECLS	};
+#else
+#define	__BEGIN_DECLS
+#define	__END_DECLS
+#endif
+
+/*
+ * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
+ * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
+ * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
+ * in between its arguments.  __CONCAT can also concatenate double-quoted
+ * strings produced by the __STRING macro, but this only works with ANSI C.
+ */
+#if defined(__STDC__) || defined(__cplusplus)
+#define	__P(protos)	protos		/* full-blown ANSI C */
+#define	__CONCAT(x,y)	x ## y
+#define	__STRING(x)	#x
+
+#if !defined(__GNUC__) && !defined(__cplusplus)
+#define	inline
+#endif
+
+#else	/* !(__STDC__ || __cplusplus) */
+#define	__P(protos)	()		/* traditional C preprocessor */
+#define	__CONCAT(x,y)	x/**/y
+#define	__STRING(x)	"x"
+
+#ifdef __GNUC__
+#define	const		__const		/* GCC: ANSI C with -traditional */
+#define	inline		__inline
+#define	signed		__signed
+#define	volatile	__volatile
+
+#else	/* !__GNUC__ */
+#define	const				/* delete ANSI C keywords */
+#define	inline
+#define	signed
+#define	volatile
+#endif	/* !__GNUC__ */
+#endif	/* !(__STDC__ || __cplusplus) */
+
+/*
+ * GCC has extensions for declaring functions as `pure' (always returns
+ * the same value given the same inputs, i.e., has no external state and
+ * no side effects) and `dead' (nonreturning).  These mainly affect
+ * optimization and warnings.  Unfortunately, GCC complains if these are
+ * used under strict ANSI mode (`gcc -ansi -pedantic'), hence we need to
+ * define them only if compiling without this.
+ */
+#if defined(__GNUC__) && !defined(__STRICT_ANSI__)
+#define __dead __volatile
+#define __pure __const
+#else
+#define __dead
+#define __pure
+#endif
+
+#endif /* !_CDEFS_H_ */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/osr/machine.h b/lsof_4.85/lsof_4.85_src/dialects/osr/machine.h
new file mode 100644
index 0000000..d4f7cb6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/osr/machine.h
@@ -0,0 +1,614 @@
+/*
+ * machine.h - SCO OpenServer definitions for lsof
+ */
+
+
+/*
+ * Copyright 1995 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: machine.h,v 1.36 2010/07/29 16:02:57 abe Exp $
+ */
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#if	OSRV>=42
+#define	CAN_USE_CLNT_CREATE	1
+#endif	/* OSRV>=42 */
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+#define	GET_MAX_FD	get_max_fd
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1 */
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+/* #define	HASFIFONODE	1 */
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+#define	HASINODE	1
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those systems that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those systems that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+#define	HASPRINTDEV	print_dev
+#define	HASPRINTINO	print_ino
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+/* #define	HASPROCFS	"proc?" */
+/* #define	HASFSTYPE	1 */
+/* #define	HASPINODEN	1 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+# if	defined(HAS_NFS)
+#define	HASRNODE	1
+# endif	/* defined(HAS_NFS) */
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	OSRV>=506
+#define	HASWIDECHAR	1
+# endif	/* OSRV>=506 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+/* #define	HASSNODE	1 */
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those systems that support streams.
+ */
+
+#define	HASSTREAMS	1
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file
+ * system node, the vnode.  BSD derivatives usually do; System V derivatives
+ * prior to R4 usually don't.
+ */
+
+/* #define	HASVNODE	1 */
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+/* #define	INODETYPE	unsigned long long */
+					/* inode number internal storage type */
+/* #define	INODEPSPEC	"ll"	 * INODETYPE printf specification
+					 * modifier */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	int
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+/* #define	USE_LIB_CKKV			1	   ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+#define	USE_LIB_PRINT_TCPTPI			1	/* ptti.c */
+#define	USE_LIB_READDEV				1	/* rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+/* #define	USE_LIB_RNCH			1	   rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+
+# if	OSRV<500
+#define	USE_LIB_SNPF				1	/* snpf.c */
+# else	/* OSRV>=500 */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+# endif	/* OSRV<500 */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+/* #define	WARNDEVACCESS	1 */
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	memset(a, 0, l)
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/Makefile b/lsof_4.85/lsof_4.85_src/dialects/sun/Makefile
new file mode 100644
index 0000000..49dac14
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/Makefile
@@ -0,0 +1,160 @@
+
+# Sun Makefile
+#
+# $Id: Makefile,v 1.13 2008/04/15 13:30:50 abe Exp $
+
+PROG=	lsof
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    ddev.c dfile.c dmnt.c dnode.c dnode1.c dnode2.c dproc.c dsock.c \
+	dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c util.c
+
+OBJ=	ddev.o dfile.o dmnt.o dnode.o dnode1.o dnode2.o dproc.o dsock.o \
+	dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the kmem (SunOS) or sys (Solaris) group.  Your SunOS'
+	@echo 'install rule actions might look something like this:'
+	@echo ''
+	@echo '  install <options> -m 2755 -g kmem ${PROG} <bin_dest>'
+	@echo '  install <options> -m 444 ${MAN} <man_dest>'
+	@echo ''
+	@echo 'Your Solaris install rule actions might look something like
+	@echo 'this:'
+	@echo ''
+	@echo '  install -[cf] <bin_dest> <options> -m 2755 -g sys ${PROG}'
+	@echo '  install -[cf] <man_dest> <options> -m 444 ${MAN}'
+	@echo ''
+	@echo 'You may have to put additional values in <options>, as required'
+	@echo 'by the install application in your version of SunOS or Solaris.'
+	@echo 'You will have to set the appropriate destination for the lsof'
+	@echo 'executable in <bin_dest>; the appropriate destination for the'
+	@echo 'man page in <man_dest>.'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_CINFO	"${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+ddev.o:		${HDR} ddev.c
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dnode2.o:	${HDR} dnode2.c
+
+dproc.o:	${HDR} kernelbase.h dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/sun/Mksrc
new file mode 100755
index 0000000..4641bb5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/Mksrc
@@ -0,0 +1,57 @@
+#!/bin/sh
+#
+# Mksrc - make Solaris source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.4 2000/12/04 14:35:13 abe Exp $
+
+
+D=dialects/sun
+L="ddev.c dfile.c dlsof.h dmnt.c dnode.c dnode1.c dnode2.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
+
+# Assemble kernelbase.h for SunOS and Solaris < 2.5 (5.5)
+
+NM=kernelbase.h
+rm -f $NM
+if test "X$1" != "Xsolaris" -o $2 -lt 20500
+then
+  if test "X$1" = "Xsolaris"
+  then
+    A=`uname -m`
+    if test "$A" = "i86pc"
+    then
+      H=/usr/include/sys/machparam.h
+    else
+      H=/usr/src/uts/$A/sys/machparam.h
+    fi
+  else
+    H=/usr/include/machine/param.h
+  fi
+  echo "#if	!defined(KERNELSIZE)" > $NM
+  grep "^#define[ 	]*KERNELSIZE" $H >> $NM
+  echo "#endif" >> $NM
+  echo "#if	!defined(KERNELBASE)" >> $NM
+  grep "^#define[ 	]*KERNELBASE" $H >> $NM
+  echo "#endif" >> $NM
+else
+
+# To keep the dependency list for dproc.o simple in the Makefile,
+# create an empty kernelbase.h for Solaris 2.5 (5.5) and above.
+
+  touch $NM
+fi
+echo "$NM assembled."
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/ddev.c b/lsof_4.85/lsof_4.85_src/dialects/sun/ddev.c
new file mode 100644
index 0000000..83bd2ce
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/ddev.c
@@ -0,0 +1,1143 @@
+/*
+ * ddev.c - Solaris device support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ddev.c,v 1.20 2005/08/08 19:55:41 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+#define	LIKE_BLK_SPEC	"like block special"
+#define	LIKE_CHR_SPEC	"like character special"
+
+
+/*
+ * Local static values
+ */
+
+static int Devx = 0;			/* current Devtp[] index */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void make_devtp,(struct stat *s, char *p));
+_PROTOTYPE(static int rmdupdev,(struct l_dev ***dp, int n, int ty));
+
+
+/*
+ * make_devtp() - make Devtp[] entry
+ */
+
+static void
+make_devtp(s, p)
+	struct stat *s;			/* device lstat() buffer */
+	char *p;			/* device path name */
+{
+
+/*
+ * Make room for another Devtp[] entry.
+ */
+	if (Devx >= Ndev) {
+	    Ndev += DEVINCR;
+	    if (!Devtp)
+		Devtp = (struct l_dev *)malloc(
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    else
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    if (!Devtp) {
+		(void) fprintf(stderr, "%s: no space for character device\n",
+		    Pn);
+		Exit(1);
+	    }
+	}
+/*
+ * Store the device number, inode number, and name in the Devtp[] entry.
+ */
+	Devtp[Devx].inode = (INODETYPE)s->st_ino;
+	if (!(Devtp[Devx].name = mkstrcpy(p, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no space for /dev/", Pn);
+	    safestrprt(p, stderr, 1);
+	    Exit(1);
+	}
+	Devtp[Devx].rdev = s->st_rdev;
+	Devtp[Devx].v = 0;
+	Devx++;
+}
+
+
+/*
+ * printdevname() - print block or character device name
+ */
+
+int
+printdevname(dev, rdev, f, nty)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+	int f;				/* 1 = print trailing '\n' */
+	int nty;			/* node type: N_BLK or N_CHR */
+{
+	struct clone *c;
+	struct l_dev *dp;
+	struct pseudo *p;
+
+	readdev(0);
+/*
+ * Search device table for a full match.
+ */
+
+#if	defined(HASDCACHE)
+
+printchdevname_again:
+
+#endif	/* defined(HASDCACHE) */
+
+#if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(dev, rdev, 1, 0);
+	else
+#endif	/* defined(HASBLKDEV) */
+
+	dp = lkupdev(dev, rdev, 1, 0);
+	if (dp) {
+	    safestrprt(dp->name, stdout, f);
+	    return(1);
+	}
+/*
+ * Search device table for a match without inode number and dev.
+ */
+
+#if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(&DevDev, rdev, 0, 0);
+	else
+#endif	/* defined(HASBLKDEV) */
+
+	dp = lkupdev(&DevDev, rdev, 0, 0);
+	if (dp) {
+
+	/*
+	 * A match was found.  Record it as a name column addition.
+	 */
+	    char *cp, *ttl;
+	    int len;
+
+	    ttl = (nty == N_BLK) ? LIKE_BLK_SPEC : LIKE_CHR_SPEC;
+	    len = (int)(1 + strlen(ttl) + 1 + strlen(dp->name) + 1);
+	    if (!(cp = (char *)malloc((MALLOC_S)(len + 1)))) {
+		(void) fprintf(stderr, "%s: no nma space for: (%s %s)\n",
+		    Pn, ttl, dp->name);
+		Exit(1);
+	    }
+	    (void) snpf(cp, len + 1, "(%s %s)", ttl, dp->name);
+	    (void) add_nma(cp, len);
+	    (void) free((MALLOC_P *)cp);
+	    return(0);
+	}
+/*
+ * Search for clone parent.
+ */
+	if ((nty == N_CHR) && Lf->is_stream && Clone && (*dev == DevDev)) {
+	    for (c = Clone; c; c = c->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MIN_DEV(c->cd.rdev)) {
+
+#if	defined(HASDCACHE)
+		    if (DCunsafe && !c->cd.v && !vfy_dev(&c->cd))
+			goto printchdevname_again;
+#endif	/* defined(HASDCACHE) */
+
+		    safestrprt(c->cd.name, stdout, f);
+		    return(1);
+		}	
+	    }
+	}
+/*
+ * Search for pseudo device match on major device only.
+ */
+	if ((nty == N_CHR) && *dev == DevDev) {
+	    for (p = Pseudo; p; p = p->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MAJ_DEV(p->pd.rdev)) {
+
+# if	defined(HASDCACHE)
+		    if (DCunsafe && !p->pd.v && vfy_dev(&p->pd))
+			goto printchdevname_again;
+# endif	/* defined(HASDCACHE) */
+
+		    safestrprt(p->pd.name, stdout, f);
+		    return(1);
+		}
+	    }
+	}
+
+#if	defined(HASDCACHE)
+/*
+ * If the device cache is "unsafe" and we haven't found any match, reload
+ * the device cache.
+ */
+	if (DCunsafe) {
+	    (void) rereaddev();
+	    goto printchdevname_again;
+	}
+#endif	/* defined(HASDCACHE) */
+
+	return(0);
+}
+
+
+/*
+ * read_clone() - read Solaris clone device information
+ */
+
+void
+read_clone()
+{
+	struct clone *c;
+	char *cn;
+	DIR *dfp;
+	struct DIRTYPE *dp;
+	char *fp = (char *)NULL;
+	MALLOC_S fpl;
+	char *path;
+	MALLOC_S pl;
+	struct pseudo *p;
+	struct stat sb;
+	
+	if (Clone || Pseudo)
+	    return;
+/*
+ * Open the /DVCH_DEVPATH/pseudo directory.
+ */
+	if (!(path = mkstrcat(DVCH_DEVPATH, -1, "/", 1, "pseudo ", -1, &pl))) {
+	    (void) fprintf(stderr, "%s: no space for %s/pseudo\n",
+		DVCH_DEVPATH, Pn);
+	    Exit(1);
+	}
+	path[pl - 1] = '\0';
+	if (!(dfp = OpenDir(path))) {
+
+#if	defined(WARNDEVACCESS)
+	    if (!Fwarn) {
+		(void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		safestrprt(path, stderr, 1);
+	    }
+#endif	/* defined(WARNDEVACCESS) */
+
+	    (void) free((FREE_P *)path);
+	    return;
+	}
+	path[pl - 1] = '/';
+/*
+ * Scan the directory.
+ */
+	for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+	    if (dp->d_ino == 0 || dp->d_name[0] == '.')
+		continue;
+	/*
+	 * Form the full path name and stat() it.
+	 */
+	    if (fp) {
+		(void) free((FREE_P *)fp);
+		fp = (char *)NULL;
+	    }
+	    if (!(fp = mkstrcat(path, pl, dp->d_name, -1, (char *)NULL, -1,
+		       &fpl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(path, stderr, 0);
+		safestrprt(dp->d_name, stderr, 1);
+		Exit(1);
+	    }
+
+#if	defined(USE_STAT)
+	    if (stat(fp, &sb) != 0)
+#else	/* !defined(USE_STAT) */
+	    if (lstat(fp, &sb) != 0)
+#endif	/* defined(USE_STAT) */
+
+	    {
+		if (!Fwarn) {
+		    int errno_save = errno;
+
+		    (void) fprintf(stderr, "%s: can't stat: ", Pn);
+		    safestrprt(fp, stderr, 0);
+		    (void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		}
+		continue;
+	    }
+	/*
+	 * Skip subdirectories and all but character devices.
+	 */
+	    if ((sb.st_mode & S_IFMT) == S_IFDIR
+	    ||  (sb.st_mode & S_IFMT) != S_IFCHR)
+		continue;
+	/*
+	 * Make Devtp[] entry.
+	 */
+	    make_devtp(&sb, fp);
+	 /*
+	  * Create a clone structure entry for "clone*:" devices.
+	  *
+	  * Make special note of network clones -- tcp, and udp.
+	  */
+	    if (strncmp(&fp[pl], "clone", 5) == 0) {
+		if (!(cn = strrchr(&fp[pl], ':')))
+		    continue;
+	    /*
+	     * Allocate a clone structure.
+	     */
+		if (!(c = (struct clone *)malloc(sizeof(struct clone)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for network clone device: ", Pn);
+		    safestrprt(fp, stderr, 1);
+		    Exit(1);
+		}
+	    /*
+	     * Allocate space for the path name.
+	     */
+		if (!(c->cd.name = mkstrcpy(fp, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr, "%s: no space for clone name: ", Pn);
+		    safestrprt(fp, stderr, 1);
+		    Exit(1);
+		}
+	    /*
+	     * Save the inode and device numbers.  Clear the verify flag.
+	     */
+		c->cd.inode = (INODETYPE)sb.st_ino;
+		c->cd.rdev = sb.st_rdev;
+		c->cd.v = 0;
+	    /*
+	     * Make special note of a network clone device.
+	     */
+		if (!strcmp(++cn, "tcp") || !strcmp(cn, "udp"))
+		    c->n = cn - fp;
+		else
+		    c->n = 0;
+	    /*
+	     * Link the new clone entry to the rest.
+	     */
+		c->next = Clone;
+		Clone = c;
+		continue;
+	    }
+	/*
+	 * Save pseudo device information.
+	 */
+	    if (GET_MIN_DEV(sb.st_rdev) == 0) {
+
+	    /*
+	     * Allocate space for the pseduo device entry.
+	     */
+		if (!(p = (struct pseudo *) malloc(sizeof(struct pseudo)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for pseudo device: ", Pn);
+		    safestrprt(fp, stderr, 1);
+		    Exit(1);
+		}
+	    /*
+	     * Save the path name, and inode and device numbers.  Clear the
+	     * verify flag.  Link the entry to the pseudo chain.
+	     */
+		p->pd.inode = (INODETYPE)sb.st_ino;
+		p->pd.name = fp;
+		fp = (char *)NULL;
+		p->pd.rdev = sb.st_rdev;
+		p->pd.v = 0;
+		p->next = Pseudo;
+		Pseudo = p;
+	    }
+	}
+	(void) CloseDir(dfp);
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+}
+
+
+/*
+ * readdev() - read names, modes and device types of everything in /dev
+ *	       or /device (Solaris)
+ */
+
+void
+readdev(skip)
+	int skip;			/* skip device cache read if 1 */
+{
+
+#if	defined(HASDCACHE)
+	int dcrd = 0;
+#endif	/* defined(HASDCACHE) */
+
+	DIR *dfp;
+	struct DIRTYPE *dp;
+	char *fp = (char *)NULL;
+	MALLOC_S fpl;
+	int i;
+
+#if	defined(HASBLKDEV)
+	int j = 0;
+#endif	/* defined(HASBLKDEV) */
+
+	char *path = (char *)NULL;
+	char *ppath = (char *)NULL;
+	MALLOC_S pl;
+	struct stat sb;
+
+	if (Sdev)
+	    return;
+
+#if	defined(HASDCACHE)
+/*
+ * Read device cache, as directed.
+ */
+	if (!skip) {
+	    if (DCstate == 2 || DCstate == 3) {
+		if ((dcrd = read_dcache()) == 0)
+		    return;
+	    }
+	} else
+	    dcrd = 1;
+#endif	/* defined(HASDCACHE) */
+
+	if (!(ppath = mkstrcat(DVCH_DEVPATH, -1, "/", 1, "pseudo", -1,
+		      (MALLOC_S *)NULL)))
+	{
+	    (void) fprintf(stderr, "%s: no space for: %s/pseudo\n",
+		Pn, DVCH_DEVPATH);
+	    Exit(1);
+	}
+	read_clone();
+	Dstk = (char **)NULL;
+	Dstkn = Dstkx = 0;
+	(void) stkdir(DVCH_DEVPATH);
+/*
+ * Unstack the next directory.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dfp = OpenDir(Dstk[Dstkx]))) {
+
+#if	defined(WARNDEVACCESS)
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		    safestrprt(Dstk[Dstkx], stderr, 1);
+		}
+#endif	/* defined(WARNDEVACCESS) */
+
+		(void) free((FREE_P *)Dstk[Dstkx]);
+		Dstk[Dstkx] = (char *)NULL;
+		continue;
+	    }
+	/*
+	 * Create a directory name buffer with a trailing slash.
+	 */
+	    if (path) {
+		(void) free((FREE_P *)path);
+		path = (char *)NULL;
+	    }
+	    if (!(path = mkstrcat(Dstk[Dstkx], -1, "/", 1, (char *)NULL, -1,
+				  &pl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(Dstk[Dstkx], stderr, 1);
+		Exit(1);
+	    }
+	    (void) free((FREE_P *)Dstk[Dstkx]);
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Scan the directory.
+	 */
+	    for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+		if (dp->d_ino == 0 || dp->d_name[0] == '.')
+		    continue;
+	    /*
+	     * Form the full path name and get its status.
+	     */
+		if (fp) {
+		    (void) free((FREE_P *)fp);
+		    fp = (char *)NULL;
+		}
+		if (!(fp = mkstrcat(path, pl, dp->d_name, -1, (char *)NULL, -1,
+			   &fpl)))
+		{
+		    (void) fprintf(stderr, "%s: no space for: ", Pn);
+		    safestrprt(path, stderr, 0);
+		    safestrprt(dp->d_name, stderr, 1);
+		    Exit(1);
+		}
+
+#if	defined(USE_STAT)
+		if (stat(fp, &sb) != 0)
+#else	/* !defined(USE_STAT) */
+		if (lstat(fp, &sb) != 0)
+#endif	/* defined(USE_STAT) */
+
+		{
+		    if (errno == ENOENT)	/* symbolic link to nowhere? */
+			continue;
+
+#if	defined(WARNDEVACCESS)
+		    if (!Fwarn) {
+			int errno_save = errno;
+
+			(void) fprintf(stderr, "%s: can't stat ", Pn);
+			safestrprt(fp, stderr, 0);
+			(void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		    }
+#endif	/* defined(WARNDEVACCESS) */
+
+		    continue;
+		}
+	    /*
+	     * If it's a subdirectory, stack its name for later processing.
+	     */
+		if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+
+		/*
+		 * Skip Solaris /DVCH_DEV_PATH/pseudo sub-directory;
+		 * it has been examined in read_clone().
+		 */
+		    if (strcmp(fp, ppath) == 0)
+			continue;
+		    (void) stkdir(fp);
+			continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFCHR) {
+
+		/*
+		 * Make Devtp[] entry.
+		 */
+		    make_devtp(&sb, fp);
+		}
+
+#if	defined(HASBLKDEV)
+		if ((sb.st_mode & S_IFMT) == S_IFBLK) {
+
+		/*
+		 * Save block device information in BDevtp[].
+		 */
+		    if (j >= BNdev) {
+			BNdev += DEVINCR;
+			if (!BDevtp)
+			    BDevtp = (struct l_dev *)malloc(
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			else
+			    BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			if (!BDevtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for block device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    BDevtp[j].rdev = sb.st_rdev;
+		    BDevtp[j].inode = (INODETYPE)sb.st_ino;
+		    BDevtp[j].name = fp;
+		    fp = (char *)NULL;
+		    BDevtp[j].v = 0;
+		    j++;
+		}
+#endif	/* defined(HASBLKDEV) */
+
+	    }
+	    (void) CloseDir(dfp);
+	}
+/*
+ * Free any allocated space.
+ */
+	if (Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	    Dstkn = Dstkx = 0;
+	}
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+	if (ppath)
+	    (void) free((FREE_P *)ppath);
+/*
+ * Reduce the BDevtp[] (optional) and Devtp[] tables to their minimum
+ * sizes; allocate and build sort pointer lists; and sort the tables by
+ * device number.
+ */
+
+#if	defined(HASBLKDEV)
+	if (BNdev) {
+	    if (BNdev > j) {
+		BNdev = j;
+		BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+			 (MALLOC_S)(sizeof(struct l_dev) * BNdev));
+	    }
+	    if (!(BSdev = (struct l_dev **)malloc(
+			  (MALLOC_S)(sizeof(struct l_dev *) * BNdev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for block device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (j = 0; j < BNdev; j++) {
+		BSdev[j] = &BDevtp[j];
+	    }
+	    (void) qsort((QSORT_P *)BSdev, (size_t)BNdev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    BNdev = rmdupdev(&BSdev, BNdev, 0);
+	} else {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: no block devices found\n", Pn);
+	}
+#endif	/* defined(HASBLKDEV) */
+
+	if (Ndev) {
+	    if (Ndev > Devx) {
+		Ndev = Devx;
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    }
+	    if (!(Sdev = (struct l_dev **)malloc(
+			 (MALLOC_S)(sizeof(struct l_dev *) * Ndev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for character device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (i = 0; i < Ndev; i++) {
+		Sdev[i] = &Devtp[i];
+	    }
+	    (void) qsort((QSORT_P *)Sdev, (size_t)Ndev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    Ndev = rmdupdev(&Sdev, Ndev, 1);
+	} else {
+	    (void) fprintf(stderr, "%s: no character devices found\n", Pn);
+	    Exit(1);
+	}
+
+#if	defined(HASDCACHE)
+/*
+ * Write device cache file, as required.
+ */
+	if (DCstate == 1 || (DCstate == 3 && dcrd))
+		write_dcache();
+#endif	/* defined(HASDCACHE) */
+
+}
+
+
+/*
+ * clr_sect() - clear cached clone and pseudo sections
+ */
+
+void
+clr_sect()
+{
+	if (Clone) {
+	    struct clone *c, *c1;
+
+	    for (c = Clone; c; c = c1) {
+		c1 = c->next;
+		if (c->cd.name)
+		    (void) free((FREE_P *)c->cd.name);
+		(void) free((FREE_P *)c);
+	    }
+	    Clone = (struct clone *)NULL;
+	}
+	if (Pseudo) {
+	    struct pseudo *p, *p1;
+
+	    for (p = Pseudo; p; p = p1) {
+		p1 = p->next;
+		if (p->pd.name)
+		    (void) free((FREE_P *)p->pd.name);
+		(void) free((FREE_P *)p);
+	    }
+	    Pseudo = (struct pseudo *)NULL;
+	}
+}
+
+
+#if	defined(HASDCACHE)
+/*
+ * rw_clone_sect() - read/write the device cache file clone section
+ */
+
+int
+rw_clone_sect(m)
+	int m;				/* mode: 1 = read; 2 = write */
+{
+	char buf[MAXPATHLEN*2], *cp;
+	struct clone *c;
+	int i, len, n;
+
+	if (m == 1) {
+
+	/*
+	 * Read the clone section header and validate it.
+	 */
+	    if (!fgets(buf, sizeof(buf), DCfs)) {
+
+bad_clone_sect:
+
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: bad clone section header in %s: ",
+			Pn, DCpath[DCpathX]);
+		    safestrprt(buf, stderr, 1);
+		}
+		return(1);
+	    }
+	    (void) crc(buf, strlen(buf), &DCcksum);
+	    len = strlen("clone section: ");
+	    if (strncmp(buf, "clone section: ", len) != 0)
+		goto bad_clone_sect;
+	    if ((n = atoi(&buf[len])) < 0)
+		goto bad_clone_sect;
+	/*
+	 * Read the clone section lines and create the Clone list.
+	 */
+	    for (i = 0; i < n; i++) {
+		if (!fgets(buf, sizeof(buf), DCfs)) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad clone line in %s: ", Pn, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		(void) crc(buf, strlen(buf), &DCcksum);
+	    /*
+	     * Allocate a clone structure.
+	     */
+		if (!(c = (struct clone *)calloc(1, sizeof(struct clone)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for cached clone: ", Pn);
+		    safestrprt(buf, stderr, 1);
+		    Exit(1);
+		}
+	    /*
+	     * Enter the clone device number.
+	     *
+	     * New format clone lines (with an inode number) have a leading
+	     * space, so that older lsof versions, not expecting them, will
+	     * not use the new format lines.
+	     */
+		if (buf[0] != ' '
+		||  !(cp = x2dev(&buf[1], &c->cd.rdev)) || *cp++ != ' ')
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad cached clone device: ", Pn);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+	    /*
+	     * Enter the clone network value.
+	     */
+		for (c->n = 0; *cp != ' '; cp++) {
+		    if (*cp < '0' || *cp > '9') {
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"%s: bad cached clone network flag: ", Pn);
+			    safestrprt(buf, stderr, 1);
+			}
+			return(1);
+		    }
+		    c->n = (c->n * 10) + (int)(*cp - '0');
+		}
+	    /*
+	     * Enter the clone device inode number.
+	     */
+		for (c->cd.inode = (INODETYPE)0, ++cp; *cp != ' '; cp++) {
+		    if (*cp < '0' || *cp > '9') {
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"%s: bad cached clone inode number: ", Pn);
+			    safestrprt(buf, stderr, 1);
+			}
+			return(1);
+		    }
+		    c->cd.inode = (INODETYPE)((c->cd.inode * 10)
+				+ (int)(*cp - '0'));
+		}
+	    /*
+	     * Enter the clone path name.
+	     */
+		if ((len = strlen(++cp)) < 2 || *(cp + len - 1) != '\n') {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad cached clone path: ", Pn);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		*(cp + len - 1) = '\0';
+		if (!(c->cd.name = mkstrcpy(cp, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr,
+			"%s: no space for cached clone path: ", Pn);
+		    safestrprt(buf, stderr, 1);
+		    Exit(1);
+		}
+		c->cd.v = 0;
+		c->next = Clone;
+		Clone = c;
+	    }
+	    return(0);
+	} else if (m == 2) {
+
+	/*
+	 * Write the clone section header.
+	 */
+	    for (c = Clone, n = 0; c; c = c->next, n++)
+		;
+	    (void) snpf(buf, sizeof(buf), "clone section: %d\n", n);
+	    if (wr2DCfd(buf, &DCcksum))
+		return(1);
+	/*
+	 * Write the clone section lines.
+	 *
+	 *
+	 * New format clone lines (with an inode number) have a leading
+	 * space, so that older lsof versions, not expecting them, will
+	 * not use the new format lines.
+	 */
+	    for (c = Clone; c; c = c->next) {
+		(void) snpf(buf, sizeof(buf), " %lx %d %ld %s\n",
+		    (long)c->cd.rdev, c->n, (long)c->cd.inode, c->cd.name);
+		if (wr2DCfd(buf, &DCcksum))
+		    return(1);
+	    }
+	    return(0);
+	}
+/*
+ * A shouldn't-happen case: mode neither 1 nor 2.
+ */
+	(void) fprintf(stderr, "%s: internal rw_clone_sect error: %d\n",
+	    Pn, m);
+	Exit(1);
+	return(1);		/* to make code analyzers happy */
+}
+
+
+/*
+ * rereaddev() - reread device names, modes and types
+ */
+
+void
+rereaddev()
+{
+	(void) clr_devtab();
+	(void) clr_sect();
+	Devx = 0;
+
+# if	defined(DCACHE_CLR)
+	(void) DCACHE_CLR();
+# endif	/* defined(DCACHE_CLR) */
+
+	readdev(1);
+	DCunsafe = 0;
+}
+
+
+/*
+ * rw_pseudo_sect() - read/write the device cache pseudo section
+ */
+
+int
+rw_pseudo_sect(m)
+	int m;				/* mode: 1 = read; 2 = write */
+{
+	char buf[MAXPATHLEN*2], *cp;
+	struct pseudo *p;
+	int i, len, n;
+
+	if (m == 1) {
+
+	/*
+	 * Read the pseudo section header and validate it.
+	 */
+	    if (!fgets(buf, sizeof(buf), DCfs)) {
+
+bad_pseudo_sect:
+
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: bad pseudo section header in %s: ",
+			Pn, DCpath[DCpathX]);
+		    safestrprt(buf, stderr, 1);
+		}
+		return(1);
+	    }
+	    (void) crc(buf, strlen(buf), &DCcksum);
+	    len = strlen("pseudo section: ");
+	    if (strncmp(buf, "pseudo section: ", len) != 0)
+		goto bad_pseudo_sect;
+	    if ((n = atoi(&buf[len])) < 0)
+		goto bad_pseudo_sect;
+	/*
+	 * Read the pseudo section lines and create the Pseudo list.
+	 */
+	    for (i = 0; i < n; i++) {
+		if (!fgets(buf, sizeof(buf), DCfs)) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad pseudo line in %s: ", Pn, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		(void) crc(buf, strlen(buf), &DCcksum);
+	    /*
+	     * Allocate a pseudo structure.
+	     */
+		if (!(p = (struct pseudo *)calloc(1, sizeof(struct pseudo)))) {
+		    (void) fprintf(stderr,
+			"%s: no space for cached pseudo: ", Pn);
+		    safestrprt(buf, stderr, 1);
+		    Exit(1);
+		}
+	    /*
+	     * Enter the pseudo device number.
+	     *
+	     * New format pseudo lines (with an inode number) have a leading
+	     * space, so that older lsof versions, not expecting them, will
+	     * not use the new format lines.
+	     */
+		if (buf[0] != ' '
+		||  !(cp = x2dev(&buf[1], &p->pd.rdev)) || *cp++ != ' ')
+		{
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad cached pseudo device: ", Pn);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+	    /*
+	     * Enter the pseudo inode number.
+	     */
+		for (p->pd.inode = (INODETYPE)0; *cp != ' '; cp++) {
+		    if (*cp < '0' || *cp > '9') {
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"%s: bad cached pseudo inode number: ", Pn);
+			    safestrprt(buf, stderr, 1);
+			}
+			return(1);
+		    }
+		    p->pd.inode = (INODETYPE)((p->pd.inode * 10)
+				+ (int)(*cp - '0'));
+		}
+	    /*
+	     * Enter the pseudo path name.
+	     *
+	     *
+	     * New format clone lines (with an inode number) have a leading
+	     * space, so that older lsof versions, not expecting them, will
+	     * not use the new format lines.
+	     */
+		if ((len = strlen(++cp)) < 2 || *(cp + len - 1) != '\n') {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: bad cached pseudo path: ", Pn);
+			safestrprt(buf, stderr, 1);
+		    }
+		    return(1);
+		}
+		if (!(p->pd.name = (char *)malloc(len))) {
+		    (void) fprintf(stderr,
+			"%s: no space for cached pseudo path: ", Pn);
+		    safestrprt(buf, stderr, 1);
+		    Exit(1);
+		}
+		*(cp + len - 1) = '\0';
+		(void) snpf(p->pd.name, len, "%s", cp);
+		p->pd.v = 0;
+		p->next = Pseudo;
+		Pseudo = p;
+	    }
+	    return(0);
+	} else if (m == 2) {
+
+	/*
+	 * Write the pseudo section header.
+	 */
+	    for (p = Pseudo, n = 0; p; p = p->next, n++)
+		;
+	    (void) snpf(buf, sizeof(buf), "pseudo section: %d\n", n);
+	    if (wr2DCfd(buf, &DCcksum))
+		return(1);
+	/*
+	 * Write the pseudo section lines.
+	 *
+	 *
+	 * New format pseudo lines (with an inode number) have a leading
+	 * space, so that older lsof versions, not expecting them, will
+	 * not use the new format lines.
+	 */
+	    for (p = Pseudo; p; p = p->next) {
+		(void) snpf(buf, sizeof(buf), " %lx %ld %s\n", (long)p->pd.rdev,
+		    (long)p->pd.inode, p->pd.name);
+		if (wr2DCfd(buf, &DCcksum))
+		    return(1);
+	    }
+	    return(0);
+	}
+/*
+ * A shouldn't-happen case: mode neither 1 nor 2.
+ */
+	(void) fprintf(stderr, "%s: internal rw_pseudo_sect error: %d\n",
+	    Pn, m);
+	return(1);
+}
+
+
+/*
+ * vfy_dev() - verify a device table entry (usually when DCunsafe == 1)
+ *
+ * Note: rereads entire device table when an entry can't be verified.
+ */
+
+int
+vfy_dev(dp)
+	struct l_dev *dp;		/* device table pointer */
+{
+	struct stat sb;
+
+	if (!DCunsafe || dp->v)
+	    return(1);
+
+#if	defined(USE_STAT)
+	if (stat(dp->name, &sb) != 0
+#else	/* !defined(USE_STAT) */
+	if (lstat(dp->name, &sb) != 0
+#endif	/* defined(USE_STAT) */
+
+	||  dp->rdev != sb.st_rdev
+	||  dp->inode != (INODETYPE)sb.st_ino) {
+	   (void) rereaddev();
+	   return(0);
+	}
+	dp->v = 1;
+	return(1);
+}
+#endif	/* defined(HASDCACHE) */
+
+
+/*
+ * rmdupdev() - remove duplicate (major/minor/inode) devices
+ */
+
+static int
+rmdupdev(dp, n, ty)
+	struct l_dev ***dp;	/* device table pointers address */
+	int n;			/* number of pointers */
+	int ty;			/* type: 0 = block, 1 = char */
+{
+	struct clone *c, *cp;
+	struct l_dev **d;
+	int i, j, k;
+	struct pseudo *p, *pp;
+
+	for (i = j = 0, d = *dp; i < n ;) {
+	    for (k = i + 1; k < n; k++) {
+		if (d[i]->rdev != d[k]->rdev || d[i]->inode != d[k]->inode)
+		    break;
+		if (ty == 0)
+		    continue;
+	    /*
+	     * See if we're deleting a duplicate clone device.  If so,
+	     * delete its clone table entry.
+	     */
+		for (c = Clone, cp = (struct clone *)NULL;
+		     c;
+		     cp = c, c = c->next)
+		{
+		    if (c->cd.rdev != d[k]->rdev
+		    ||  c->cd.inode != d[k]->inode
+		    ||  strcmp(c->cd.name, d[k]->name))
+			continue;
+		    if (!cp)
+			Clone = c->next;
+		    else
+			cp->next = c->next;
+		    if (c->cd.name)
+			(void) free((FREE_P *)c->cd.name);
+		    (void) free((FREE_P *)c);
+		    break;
+		}
+	    /*
+	     * See if we're deleting a duplicate pseudo device.  If so,
+	     * delete its pseudo table entry.
+	     */
+		for (p = Pseudo, pp = (struct pseudo *)NULL;
+		     p;
+		     pp = p, p = p->next)
+		{
+		    if (p->pd.rdev != d[k]->rdev
+		    ||  p->pd.inode != d[k]->inode
+		    ||  strcmp(p->pd.name, d[k]->name))
+			continue;
+		    if (!pp)
+			Pseudo = p->next;
+		    else
+			pp->next = p->next;
+		    if (p->pd.name)
+			(void) free((FREE_P *)p->pd.name);
+		    (void) free((FREE_P *)p);
+		    break;
+		}
+	    }
+	    if (i != j)
+		d[j] = d[i];
+	    j++;
+	    i = k;
+	}
+	if (n == j)
+	    return(n);
+	if (!(*dp = (struct l_dev **)realloc((MALLOC_P *)*dp,
+		    (MALLOC_S)(j * sizeof(struct l_dev *)))))
+	{
+	    (void) fprintf(stderr, "%s: can't realloc %s device pointers\n",
+		Pn, ty ? "char" : "block");
+	    Exit(1);
+	}
+	return(j);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dfile.c
new file mode 100644
index 0000000..bb09306
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dfile.c
@@ -0,0 +1,669 @@
+/*
+ * dfile.c - Solaris file processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.21 2009/03/25 19:22:16 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local structures
+ */
+
+struct hsfile {
+	struct sfile *s;		/* the Sfile table address */
+	struct hsfile *next;		/* the next hash bucket entry */
+};
+
+
+/*
+ * Local static variables
+ */
+
+static struct hsfile *HbyCd =		/* hash by clone buckets */
+	(struct hsfile *)NULL;
+static int HbyCdCt = 0;			/* HbyCd entry count */
+static struct hsfile *HbyFdi =		/* hash by file buckets */
+	(struct hsfile *)NULL;
+static int HbyFdiCt = 0;		/* HbyFdi entry count */
+static struct hsfile *HbyFrd =		/* hash by file raw device buckets */
+	(struct hsfile *)NULL;
+static int HbyFrdCt = 0;		/* HbyFrd entry count */
+static struct hsfile *HbyFsd =		/* hash by file system buckets */
+	(struct hsfile *)NULL;
+static int HbyFsdCt = 0;		/* HbyFsd entry count */
+static struct hsfile *HbyNm =		/* hash by name buckets */
+	(struct hsfile *)NULL;
+static int HbyNmCt = 0;			/* HbyNm entry count */
+
+
+/*
+ * Local definitions
+ */
+
+#define	SFCDHASH	1024		/* Sfile hash by clone device */
+#define	SFDIHASH	4094		/* Sfile hash by (device,inode) number
+					 * pair bucket count (power of 2!) */
+#define	SFFSHASH	128		/* Sfile hash by file system device
+					 * number bucket count (power of 2!) */
+#define SFHASHDEVINO(maj, min, ino, mod) ((int)(((int)((((int)(maj+1))*((int)((min+1))))+ino)*31415)&(mod-1)))
+					/* hash for Sfile by major device,
+					 * minor device, and inode, modulo m
+					 * (m must be a power of 2) */
+#define	SFNMHASH	4096		/* Sfile hash by name bucket count
+					   (power of 2!) */
+#define	SFRDHASH	1024		/* Sfile hash by raw device number
+					 * bucket count (power of 2!) */
+#define SFHASHRDEVI(maj, min, rmaj, rmin, ino, mod) ((int)(((int)((((int)(maj+1))*((int)((min+1))))+((int)(rmaj+1)*(int)(rmin+1))+ino)*31415)&(mod-1)))
+					/* hash for Sfile by major device,
+					 * minor device, major raw device,
+					 * minor raw device, and inode, modulo
+					 * mod (mod must be a power of 2) */
+
+
+#if	solaris<20500
+/*
+ * get_max_fd() - get maximum file descriptor plus one
+ */
+
+int
+get_max_fd()
+{
+	struct rlimit r;
+
+	if (getrlimit(RLIMIT_NOFILE, &r))
+	    return(-1);
+	return(r.rlim_cur);
+}
+#endif	/* solaris<20500 */
+
+
+/*
+ * hashSfile() - hash Sfile entries for use in is_file_named() searches
+ */
+
+void
+hashSfile()
+{
+	int cmaj, hvc, i;
+	static int hs = 0;
+	struct sfile *s;
+	struct hsfile *sh, *sn;
+/*
+ * Do nothing if there are no file search arguments cached or if the
+ * hashes have already been constructed.
+ */
+	if (!Sfile || hs)
+	    return;
+/*
+ * Preset the clone major device for Solaris.
+ */
+	if (HaveCloneMaj) {
+	    cmaj = CloneMaj;
+	    hvc = 1;
+	} else
+	    hvc = 0;
+/*
+ * Allocate hash buckets by clone device, (device,inode), file system device,
+ * and file name.
+ */
+	if (hvc) {
+	    if (!(HbyCd = (struct hsfile *)calloc((MALLOC_S)SFCDHASH,
+						  sizeof(struct hsfile))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for %d clone hash buckets\n",
+		    Pn, SFCDHASH);
+		Exit(1);
+	    }
+	}
+	if (!(HbyFdi = (struct hsfile *)calloc((MALLOC_S)SFDIHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d (dev,ino) hash buckets\n",
+		Pn, SFDIHASH);
+	    Exit(1);
+	}
+	if (!(HbyFrd = (struct hsfile *)calloc((MALLOC_S)SFRDHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d rdev hash buckets\n",
+		Pn, SFRDHASH);
+	    Exit(1);
+	}
+	if (!(HbyFsd = (struct hsfile *)calloc((MALLOC_S)SFFSHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d file sys hash buckets\n",
+		Pn, SFFSHASH);
+	    Exit(1);
+	}
+	if (!(HbyNm = (struct hsfile *)calloc((MALLOC_S)SFNMHASH,
+					      sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d name hash buckets\n",
+		Pn, SFNMHASH);
+	    Exit(1);
+	}
+	hs++;
+/*
+ * Scan the Sfile chain, building file, file system, and file name hash
+ * bucket chains.
+ */
+	for (s = Sfile; s; s = s->next) {
+	    for (i = 0; i < 4; i++) {
+		if (i == 0) {
+		    if (!s->aname)
+			continue;
+		    sh = &HbyNm[hashbyname(s->aname, SFNMHASH)];
+		    HbyNmCt++;
+		} else if (i == 1) {
+		    if (s->type) {
+			sh = &HbyFdi[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev),
+						  s->i,
+						  SFDIHASH)];
+			HbyFdiCt++;
+		    } else {
+			sh = &HbyFsd[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev),
+						  0,
+						  SFFSHASH)];
+			HbyFsdCt++;
+		    }
+		} else if (i == 2) {
+		    if (s->type
+		    &&  ((s->mode == S_IFCHR) || (s->mode == S_IFBLK)))
+		    {
+			sh = &HbyFrd[SFHASHRDEVI(GET_MAJ_DEV(s->dev),
+						 GET_MIN_DEV(s->dev),
+						 GET_MAJ_DEV(s->rdev),
+						 GET_MIN_DEV(s->rdev),
+						 s->i,
+						 SFRDHASH)];
+			HbyFrdCt++;
+		    } else
+			continue;
+		} else {
+		    if (!hvc || (GET_MAJ_DEV(s->rdev) != cmaj))
+			continue;
+		    sh = &HbyCd[SFHASHDEVINO(0, GET_MIN_DEV(s->rdev), 0,
+					     SFCDHASH)];
+		    HbyCdCt++;
+		}
+		if (!sh->s) {
+		    sh->s = s;
+		    sh->next = (struct hsfile *)NULL;
+		    continue;
+		} else {
+		    if (!(sn = (struct hsfile *)malloc(
+				(MALLOC_S)sizeof(struct hsfile))))
+		    {
+			(void) fprintf(stderr,
+			    "%s: can't allocate hsfile bucket for: %s\n",
+			    Pn, s->aname);
+			Exit(1);
+		    }
+		    sn->s = s;
+		    sn->next = sh->next;
+		    sh->next = sn;
+		}
+	    }
+	}
+}
+
+
+/*
+ * is_file_named() - is this file named?
+ */
+
+int
+is_file_named(p, nt, vt, ps)
+	char *p;			/* path name; NULL = search by device
+					 * and inode (from *Lf) */
+	int nt;				/* node type -- e.g., N_* */
+	enum vtype vt;			/* vnode type */
+	int ps;				/* print status: 0 = don't copy name
+					 * to Namech */
+{
+	char *ep;
+	int f = 0;
+	struct sfile *s;
+	struct hsfile *sh;
+	size_t sz;
+/*
+ * Check for a path name match, as requested.
+ */
+	if (p && HbyNmCt) {
+	    for (sh = &HbyNm[hashbyname(p, SFNMHASH)]; sh; sh = sh->next) {
+		if ((s = sh->s) && strcmp(p, s->aname) == 0) {
+		    f = 2;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a Solaris clone file.
+ */
+	if (!f && HbyCdCt && nt == N_STREAM && Lf->dev_def && Lf->rdev_def
+	&&  (Lf->dev == DevDev))
+	{
+	    for (sh = &HbyCd[SFHASHDEVINO(0, GET_MAJ_DEV(Lf->rdev), 0,
+					  SFCDHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (GET_MAJ_DEV(Lf->rdev)
+				==  GET_MIN_DEV(s->rdev)))
+		{
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a regular file.
+ */
+	if (!f && HbyFdiCt && Lf->dev_def
+	&&  (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh = &HbyFdi[SFHASHDEVINO(GET_MAJ_DEV(Lf->dev),
+					   GET_MIN_DEV(Lf->dev),
+					   Lf->inode,
+					   SFDIHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (Lf->dev == s->dev)
+		&&  (Lf->inode == s->i)) {
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a file system match.
+ */
+	if (!f && HbyFsdCt && Lf->dev_def) {
+	    for (sh = &HbyFsd[SFHASHDEVINO(GET_MAJ_DEV(Lf->dev),
+					   GET_MIN_DEV(Lf->dev), 0, SFFSHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && Lf->dev == s->dev) {
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a character or block device match.
+ */
+	if (!f && HbyFrdCt
+	&&  ((vt = VCHR) || (vt = VBLK))
+	&&  Lf->dev_def && (Lf->dev == DevDev)
+	&&  Lf->rdev_def
+	&& (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh = &HbyFrd[SFHASHRDEVI(GET_MAJ_DEV(Lf->dev),
+					  GET_MIN_DEV(Lf->dev),
+					  GET_MAJ_DEV(Lf->rdev),
+					  GET_MIN_DEV(Lf->rdev),
+					  Lf->inode, SFRDHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (s->dev == Lf->dev)
+		&&  (s->rdev == Lf->rdev) && (s->i == Lf->inode))
+		{
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Convert the name if a match occurred.
+ */
+	if (f) {
+	    if (f == 2) {
+		if (ps)
+		    (void) snpf(Namech, Namechl, "%s", p);
+	    } else {
+		if (ps && s->type) {
+
+		/*
+		 * If the search argument isn't a file system, propagate it
+		 * to Namech[]; otherwise, let printname() compose the name.
+		 */
+		    (void) snpf(Namech, Namechl, "%s", s->name);
+		    if (s->devnm) {
+			ep = endnm(&sz);
+			(void) snpf(ep, sz, " (%s)", s->devnm);
+		    }
+		}
+	    }
+	    s->f = 1;
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	defined(HASPRINTDEV)
+/*
+ * print_dev() - print device
+ */
+
+char *
+print_dev(lf, dev)
+	struct lfile *lf;		/* file whose device is to be printed */
+	dev_t *dev;			/* device to be printed */
+{
+	static char buf[128];
+/*
+ * Avoid the Solaris major() and minor() functions from makedev(3C) to get
+ * printable major/minor numbers.
+ *
+ * We would like to use the L_MAXMAJ definition from <sys/sysmacros.h> all
+ * the time, but it's not always correct in all versions of Solaris.
+ */
+	(void) snpf(buf, sizeof(buf), "%d,%d", (int)((*dev >> L_BITSMINOR) &
+
+#if	solaris>=20501
+	    L_MAXMAJ
+#else	/* solaris<20501 */
+	    0x3fff
+#endif	/* solaris>=20501 */
+
+	    ), (int)(*dev & L_MAXMIN));
+	return(buf);
+}
+#endif	/* defined(HASPRINTDEV) */
+
+
+#if	defined(HAS_V_PATH)
+
+/*
+ * Local definitions
+ */
+
+#define	VPRDLEN	((MAXPATHLEN + 7)/8)	/* v_path read length increment */
+
+
+/*
+ * print_v_path() - print path name from vnode's v_path pointer
+ */
+
+extern int
+print_v_path(lf)
+	struct lfile *lf;		/* local file structure */
+{
+	char buf[MAXPATHLEN+1];
+	unsigned char del = 0;
+	unsigned char aperr = 0;
+
+# if	defined(HASMNTSTAT)
+	struct stat sb;
+# endif	/* defined(HASMNTSTAT) */
+
+# if	defined(HASVXFS) && defined(HASVXFSRNL)
+	if (lf->is_vxfs && (lf->inp_ty == 1) && lf->fsdir) {
+	    if (print_vxfs_rnl_path(lf))
+		return(1);
+	}
+# endif	/* defined(HASVXFS) && defined(HASVXFSRNL) */
+
+	(void) read_v_path((KA_T)lf->V_path, buf, (size_t)sizeof(buf));
+	if (buf[0]) {
+
+# if	defined(HASMNTSTAT)
+	    if (!lf->mnt_stat && lf->dev_def && (lf->inp_ty == 1)) {
+
+	    /*
+	     * No problem was detected in applying stat(2) to this mount point.
+	     * If the device and inode for the file are known, it is probably
+	     * safe and worthwhile to apply stat(2) to the v_path.
+	     */
+		if (!statsafely(buf, &sb)) {
+
+		/*
+		 * The stat(2) succeeded.  See if the device and inode match.
+		 * If they both don't match, ignore the v_path.
+		 */
+		    if ((lf->dev != sb.st_dev)
+		    ||  (lf->inode != (INODETYPE)sb.st_ino)
+		    ) {
+			return(0);
+		    }
+		} else {
+
+		/*
+		 * The stat(2) failed.
+		 *
+		 * If the error reply is ENOENT and the -X option hasn't been
+		 * specified, ignore the v_path.
+		 *
+		 * If the error reply is ENOENT, the -X option has been
+		 * specified and the file's link count is zero, report the
+		 * v_path with the "(deleted)" notation.
+		 *
+		 * If the error reply is EACCES or EPERM, report the v_path,
+		 * followed by "(?)", because lsof probably lacks permission
+		 * to apply stat(2) to v_path.
+		 */
+		    switch (errno) {
+		    case EACCES:
+		    case EPERM:
+			aperr = 1;
+			break;
+		    case ENOENT:
+
+# if	defined(HASXOPT)
+			if (Fxopt && lf->nlink_def && !lf->nlink) {
+			    del = 1;
+			    break;
+			}
+# endif	/* defined(HASXOPT) */
+
+			return(0);
+		    default:
+			return(0);
+		    }
+		}
+	    }
+# endif	/* defined(HASMNTSTAT) */
+
+	/*
+	 * Print the v_path.
+	 */
+	    safestrprt(buf, stdout, 0);
+	    if (del)
+		safestrprt(" (deleted)", stdout, 0);
+	    else if (aperr)
+		safestrprt(" (?)", stdout, 0);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_v_path() - read path name from vnode's v_path pointer
+ */
+
+extern void
+read_v_path(ka, rb, rbl)
+	KA_T ka;			/* kernel path address */
+	char *rb;			/* receiving buffer */
+	size_t rbl;			/* receiving buffer length */
+{
+	char *ba;
+	size_t rl, tl;
+
+	*rb = '\0';
+	if (!ka)
+	    return;
+	for (ba = rb, tl = 0;
+	     tl < (rbl - 1);
+	     ba += rl, ka += (KA_T)((char *)ka + rl), tl += rl
+	) {
+
+	/*
+	 * Read v_path VPRDLEN bytes at a time until the local buffer is full
+	 * or a NUL byte is reached.
+	 */
+	    if ((rl = rbl - 1 - tl) > VPRDLEN)
+		rl = VPRDLEN;
+	    else if (rl < 1) {
+		*(rb + rbl - 1) = '\0';
+		break;
+	    }
+	    if (!kread(ka, ba, rl)) {
+		*(ba + rl) = '\0';
+		if (strchr(ba, '\0') < (ba + rl))
+		    break;
+	    } else {
+
+	    /*
+	     * Can't read a full buffer load; try reducing the length one
+	     * byte at a time until it reaches zero.  Stop here, since it
+	     * has been established that no more bytes can be read.
+	     */
+		for (rl--; rl > 0; rl--) {
+		    if (!kread(ka, ba, rl)) {
+			*(ba + rl) = '\0';
+			break;
+		    }
+		}
+		if (rl <= 0)
+		    *ba = '\0';
+		break;
+	    }
+	}
+}
+#endif	/* defined(HAS_V_PATH) */
+
+
+/*
+ * process_file() - process file
+ */
+
+void
+process_file(fp)
+	KA_T fp;		/* kernel file structure address */
+{
+	struct file f;
+	int flag;
+
+#if	defined(FILEPTR)
+	FILEPTR = &f;
+#endif	/* defined(FILEPTR) */
+
+	if (kread(fp, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read file struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	Lf->off = (SZOFFTYPE)f.f_offset;
+
+	if (f.f_count) {
+
+	/*
+	 * Construct access code.
+	 */
+	    if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+		Lf->access = 'r';
+	    else if (flag == FWRITE)
+		Lf->access = 'w';
+	    else if (flag == (FREAD | FWRITE))
+		Lf->access = 'u';
+
+#if	defined(HASFSTRUCT)
+	/*
+	 * Save file structure values.
+	 */
+	    if (Fsv & FSV_CT) {
+		Lf->fct = (long)f.f_count;
+		Lf->fsv |= FSV_CT;
+	    }
+	    if (Fsv & FSV_FA) {
+		Lf->fsa = fp;
+		Lf->fsv |= FSV_FA;
+	    }
+	    if (Fsv & FSV_FG) {
+		Lf->ffg = (long)f.f_flag;
+		Lf->fsv |= FSV_FG;
+	    }
+	    if (Fsv & FSV_NI) {
+		Lf->fna = (KA_T)f.f_vnode;
+		Lf->fsv |= FSV_NI;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Solaris file structures contain a vnode pointer.  Process it.
+	 */
+	    process_node((KA_T)f.f_vnode);
+	    return;
+	}
+	enter_nm("no more information"); }
+
+
+#if	defined(HASIPv6)
+/*
+ * gethostbyname2() -- an RFC2133-compatible get-host-by-name-two function
+ *                     to get AF_INET and AF_INET6 addresses from host names,
+ *                     using the RFC2553-compatible getipnodebyname() function
+ */
+
+extern struct hostent *
+gethostbyname2(nm, prot)
+	const char *nm; 		/* host name */
+	int prot;			/* protocol -- AF_INET or AF_INET6 */
+{
+	int err;
+	static struct hostent *hep = (struct hostent *)NULL;
+
+	if (hep)
+	    (void) freehostent(hep);
+	return((hep = getipnodebyname(nm, prot, 0, &err)));
+}
+#endif	/* defined(HASIPv6) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/sun/dlsof.h
new file mode 100644
index 0000000..42c5513
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dlsof.h
@@ -0,0 +1,668 @@
+/*
+ * dlsof.h - Solaris 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.47 2011/09/07 19:16:00 abe Exp $
+ */
+
+
+#if	!defined(SOLARIS_LSOF_H)
+#define	SOLARIS_LSOF_H	1
+
+#include <fcntl.h>
+#include <sys/mntent.h>
+#include <sys/mnttab.h>
+
+# if	solaris<20600
+#define	_KMEMUSER	1
+# else	/* solaris>=20600 */
+#include <stddef.h>
+# endif	/* solaris<20600 */
+
+#include <stdlib.h>
+#include <dirent.h>
+
+# if	defined(HASZONES)
+#define	_KERNEL
+#include<sys/zone.h>
+#undef	_KERNEL
+# endif	/* defined(HASZONES) */
+
+#include <kvm.h>
+#include <nlist.h>
+#include <signal.h>
+#include <setjmp.h>
+#include <string.h>
+#include <unistd.h>
+#include <arpa/inet.h>
+#include <rpc/types.h>
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <sys/wait.h>
+
+# if	solaris>=110000
+#define	_KERNEL
+# endif	/* solaris>=110000 */
+
+#include <netinet/in.h>
+
+# if	solaris>=110000
+#undef	_KERNEL
+# endif	/* solaris>=110000 */
+
+
+# if	solaris>=70000
+#include <sys/conf.h>
+#include <sys/systeminfo.h>
+# endif	/* solaris>=70000 */
+
+#define	_KERNEL
+#define	MI_HRTIMING
+#include <inet/led.h>
+
+# if	solaris<20600
+#undef	staticf
+# endif	/* solaris<20600 */
+
+#include <inet/common.h>
+
+# if	solaris>=70000
+#include <sys/stropts.h>
+# endif	/* solaris>=70000 */
+
+# if	solaris<20600
+#include <inet/mi.h>
+# endif	/* solaris<20600 */
+
+# if	solaris>=80000
+#include <netinet/igmp.h>
+#include <netinet/ip6.h>
+# endif	/* solaris>=80000 */
+
+# if	defined(HAS_IPCLASSIFIER_H)
+#define	ffs		__kernel_ffs
+#define	inet_ntop	__inet_ntop
+#define	inet_pton	__inet_pton
+#define	longjmp		__kernel_longjmp
+#define	setjmp		__kernel_setjmp
+#  if	solaris>=110000
+#define	printf		__kernel_printf
+#define	snprintf	__kernel_snprintf
+#define	sprintf		__kernel_sprintf
+#define	swab		__kernel_swab
+#define	vprintf		__kernel_vprintf
+#define	vsprintf	__kernel_vsprintf
+#define	vsnprintf	__kernel_vsnprintf
+#  endif	/* solaris>=110000 */
+#include <inet/ipclassifier.h>
+#undef	ffs
+#undef	inet_ntop
+#undef	inet_pton
+#undef	longjmp
+#undef	setjmp
+#  if	solaris>=110000
+#undef	printf
+#undef	snprintf
+#undef	sprintf
+#undef	swab
+#undef	vprintf
+#undef	vsprintf
+#undef	vsnprintf
+#  endif	/* solaris>=110000 */
+# endif	/* defined(HAS_IPCLASSIFIER_H) */
+
+#include <inet/ip.h>
+#undef	_KERNEL
+#undef	MI_HRTIMING
+#define	exit		kernel_exit
+#define	rval_t		char
+#define	strsignal	kernel_strsignal
+#include <sys/strsubr.h>
+
+# if	defined(HAS_SOCKET_PROTO_H)
+#define	_KERNEL	1	/* DEBUG */
+# endif	/* HAS_SOCKET_PROTO_H */
+
+#include <sys/socketvar.h>
+
+# if	defined(HAS_SOCKET_PROTO_H)
+#undef	_KERNEL		/* DEBUG */
+# endif	/* HAS_SOCKET_PROTO_H */
+
+#undef	exit
+#undef	rval_t
+#undef	strsignal
+
+# if	solaris>=80000
+#define	_KERNEL	1
+# endif	/* solaris>=80000 */
+
+#include <inet/tcp.h>
+
+# if	solaris>=80000
+#undef	_KERNEL
+# endif	/* solaris>=80000 */
+
+#include <net/route.h>
+#include <netinet/in_pcb.h>
+#include <sys/stream.h>
+
+# if	solaris<20600
+#undef	MAX
+#undef	MIN
+# endif	/* solaris<20600 */
+
+#include <sys/sysmacros.h>
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/fs/hsfs_spec.h>
+#include <sys/fs/hsfs_node.h>
+#include <sys/fs/lofs_node.h>
+
+# if	solaris>=20600
+#define	_KERNEL
+# endif	/* solaris>=20600 */
+
+#include <sys/fs/namenode.h>
+
+# if	solaris>=20600
+#undef	_KERNEL
+# endif	/* solaris>=20600 */
+
+#include <sys/tihdr.h>
+
+# if	solaris>=20500
+#include <sys/tiuser.h>
+#include <rpc/auth.h>
+#include <rpc/clnt.h>
+#include <rpc/clnt_soc.h>
+#include <rpc/pmap_prot.h>
+#define	_KERNEL
+#include <sys/fs/autofs.h>
+
+#  if	solaris>=100000
+#define	printf		lsof_printf
+#define	snprintf	lsof_snprintf
+#define	sprintf		lsof_sprintf
+#define	swab		lsof_swab
+#define	vprintf		lsof_vprintf
+#define	vsnprintf	lsof_vsnprintf
+#define	vsprintf	lsof_vsprintf
+#include <sys/fs/dv_node.h>
+#undef	printf
+#undef	snprintf
+#undef	sprintf
+#undef	swab
+#undef	vprintf
+#undef	vsnprintf
+#undef	vsprintf
+#include <sys/contract_impl.h>
+#include <sys/ctfs_impl.h>
+#include <sys/port_impl.h>
+#  endif	/* solaris>=100000 */
+
+#include <sys/door.h>
+#undef	_KERNEL
+# endif	/* solaris>=20500 */
+
+#  if	!defined(_NETDB_H_)
+#include <rpc/rpcent.h>
+#  endif	/* !defined(_NETDB_H_) */
+
+#include <sys/t_lock.h>
+#include <sys/flock.h>
+
+# if	solaris>=20300
+#  if	solaris<20400
+/*
+ * The lock_descriptor structure definition is missing from Solaris 2.3.
+ */
+
+struct lock_descriptor {
+	struct lock_descriptor *prev;
+	struct lock_descriptor *next;
+	struct vnode *vnode;
+	struct owner {
+		pid_t pid;
+		long sysid;
+	} owner;
+	int flags;
+	short type;
+	off_t start;
+	off_t end;
+	struct lock_info {
+		struct active_lock_info {
+			struct lock_descriptor *ali_stack;
+		} li_active;
+		struct sleep_lock_info {
+			struct flock sli_flock;
+			/* Ignore the rest. */
+		} li_sleep;
+	} info;
+};
+#define	ACTIVE_LOCK	0x008		/* lock is active */
+#  else	/* solaris>=20400 */
+#include <sys/flock_impl.h>
+#  endif	/* solaris<20400 */
+# endif	/* solaris>=20300 */
+
+#include <sys/fstyp.h>
+#include <sys/dditypes.h>
+#include <sys/ddidmareq.h>
+#include <sys/ddi_impldefs.h>
+#include <sys/mkdev.h>
+#include <sys/fs/cachefs_fs.h>
+#include <sys/fs/fifonode.h>
+#include <sys/fs/pc_fs.h>
+#include <sys/fs/pc_dir.h>
+#include <sys/fs/pc_label.h>
+#include <sys/fs/pc_node.h>
+
+# if	solaris>=20600
+#undef	SLOCKED
+# endif	/* solaris>=20600 */
+
+#include <sys/fs/snode.h>
+#include <sys/fs/tmpnode.h>
+#include <nfs/nfs.h>
+
+# if	solaris>=100000
+#define	_KERNEL
+# endif	/* solaris >= 100000 */
+
+#include <nfs/rnode.h>
+
+#  if	solaris>=100000
+#include <nfs/mount.h>
+#include <nfs/nfs4.h>
+#include <nfs/rnode4.h>
+#  endif	/* solaris>=100000 */
+
+# if	solaris>=100000
+#undef	_KERNEL
+# endif	/* solaris >= 100000 */
+
+#include <sys/proc.h>
+#include <sys/user.h>
+
+# if	defined(HASPROCFS)
+#include <sys/proc/prdata.h>
+# endif	/* defined(HASPROCFS) */
+
+#include <sys/file.h>
+#include <vm/hat.h>
+#include <vm/as.h>
+#include <vm/seg.h>
+#include <vm/seg_dev.h>
+#include <vm/seg_map.h>
+#include <vm/seg_vn.h>
+#include <sys/tiuser.h>
+#include <sys/t_kuser.h>
+
+# if	solaris<100000
+#include <sys/sockmod.h>
+# endif	/* solaris<100000 */
+
+/*
+ * Structure for Atria's MVFS nodes
+ */
+
+struct mvfsnode {
+	unsigned long d1[6];
+	unsigned long m_ino;		/* node number */
+};
+
+extern int nlist();
+
+# if	defined(HAS_AFS) && !defined(AFSAPATHDEF)
+#define	AFSAPATHDEF	"/usr/vice/etc/modload/libafs"
+# endif	/* defined(HAS_AFS) && !defined(AFSAPATHDEF) */
+
+#define	ALLKMEM		"/dev/allkmem"
+#define	COMP_P		const void
+#define	CWDLEN		(MAXPATHLEN+1)
+#define DEVINCR		1024		/* device table malloc() increment */
+#define	DINAMEL		32
+#define	DIRTYPE		dirent
+
+# if	solaris>=100000
+#define	GET_MAJ_DEV(d)	((major_t)(d >> L_BITSMINOR & L_MAXMAJ))
+#define	GET_MIN_DEV(d)	((minor_t)(d & L_MAXMIN))
+# endif	/* solaris >= 100000 */
+
+# if	solaris>=70000
+typedef	uintptr_t	KA_T;
+# else	/* solaris<70000 */
+typedef	void *		KA_T;
+# endif	/* solaris>=70000 */
+
+# if	solaris>=70000
+#define	KA_T_FMT_X	"0x%p"
+# endif	/* solaris>=70000 */
+
+# if	solaris>=20501
+#define	KMEM		"/dev/mem"
+# else	/* solaris<20501 */
+#define	KMEM		"/dev/kmem"
+# endif	/* solaris>=20501 */
+
+#define MALLOC_P	char
+#define FREE_P		MALLOC_P
+#define MALLOC_S	unsigned
+
+# if	!defined(MAXEND)
+#define	MAXEND		0x7fffffff
+# endif	/* !defined(MAXEND) */
+
+#define MAXSEGS		100		/* maximum text segments */
+#define	MAXSYSCMDL	MAXCOMLEN	/* max system command name length */
+#define NETCLNML	8
+#define	N_UNIX		"/dev/ksyms"
+#define	PROCMIN		5		/* processes that make a "good" scan */
+
+#  if	defined(HASPROCFS)
+#define	PR_ROOTINO	2		/* root inode for proc file system */
+#  endif	/* defined(HASPROCFS) */
+
+#define	PROCDFLT	256		/* default size for local proc table --
+					 * MUST BE > 4!!!  */
+#define PROCSIZE	sizeof(struct proc)
+#define	PROCTRYLM	5		/* times to try to read proc table */
+#define QSORT_P		char
+#define	READLEN_T	int
+#define STRNCPY_L	int
+#define	STRNML		32		/* stream name length (maximum) */
+
+# if	solaris>=20501
+/*
+ * Enable large file support.
+ */
+
+#  if	solaris>=20600
+#define	fstat		fstat64
+#define	lstat		lstat64
+#define	stat		stat64
+#  endif	/* solaris>=20600 */
+
+#define	SZOFFTYPE	unsigned long long
+					/* size and offset internal storage
+					 * type */
+#define	SZOFFPSPEC	"ll"		/* SZOFFTYPE printf specification
+					 * modifier */
+# endif	/* solaris>=20501 */
+
+#define U_SIZE		sizeof(struct user)
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+# if	defined(HAS_AFS)
+
+#  if	defined(HASAOPT)
+extern char *AFSApath;			/* alternate AFS name list path
+					 * (from -a) */
+#  endif	/* defined(HASAOPT) */
+
+extern dev_t AFSdev;			/* AFS file system device number */
+extern int AFSdevStat;			/* AFS file system device number
+					 * status: 0 = unknown; 1 = known */
+extern int AFSfstype;			/* AFS file system type index */
+extern KA_T AFSVfsp;			/* AFS struct vfs kernel pointer */
+# endif	/* defined(HAS_AFS) */
+
+struct clone {
+	struct l_dev cd;		/* device, inode, name, and verify */
+	int n;				/* network flag */
+	struct clone *next;		/* forward link */
+};
+extern struct clone *Clone;
+
+extern	major_t	CloneMaj;
+
+# if	defined(HAS_LIBCTF)
+/*
+ * Definitions for using the CTF library, libctf.
+ */
+
+#include <libctf.h>
+
+#define CTF_MEMBER_UNDEF    ~0UL	/* undefined member type */
+					/* CTF_member_t element definition */
+
+/*
+ * Member structure definition, initialized by CTF_MEMBER() macro calls
+ */
+
+typedef struct CTF_member {
+    char *m_name;       		/* Member name. */
+    ulong_t m_offset;   		/* Member offset, initially in bits,
+					 * later bytes */
+} CTF_member_t;
+
+
+/*
+ * CTF request structure
+ */
+
+typedef struct CTF_request {
+    char *name;				/* structure name */
+    CTF_member_t *mem;			/* member table */
+} CTF_request_t;
+
+
+/*
+ * CTF macroes
+ */
+
+#define CTF_MEMBER(name)    { #name, CTF_MEMBER_UNDEF }
+#define CTF_MEMBER_READ(ka, s, members, member) \
+    kread((KA_T)(ka) + members[MX_ ## member].m_offset, \
+          (char *)&s->member, sizeof(s->member))
+# endif	/* defined(HAS_LIBCTF) */
+
+extern char **Fsinfo;
+extern int Fsinfomax;
+extern int HasALLKMEM;
+extern int HaveCloneMaj;
+extern kvm_t *Kd;
+
+struct l_ino {
+	unsigned char dev_def;		/* dev member is defined */
+	unsigned char ino_def;		/* ino member is defined */
+	unsigned char nl_def;		/* nl member is defined */
+	unsigned char rdev_def;		/* rdev member is defined */
+	unsigned char sz_def;		/* sz member is defined */
+	dev_t dev;			/* device */
+	long ino;			/* node number */
+	long nl;			/* link count */
+	dev_t rdev;			/* "raw" device */
+	SZOFFTYPE sz;			/* size */
+};
+
+struct l_vfs {
+	KA_T addr;			/* kernel address */
+	char *dir;			/* mounted directory */
+	char *fsname;			/* file system name */
+	dev_t dev;			/* device */
+
+# if	defined(HASFSINO)
+	INODETYPE fs_ino;		/* file system inode number */
+# endif	/* defined(HASFSINO) */
+
+# if	defined(HASMNTSTAT)
+	unsigned char mnt_stat;		/* mount point stat() status:
+					 *     0 = succeeded
+					 *     1 = failed */
+# endif	/* defined(HASMNTSTAT) */
+
+
+# if	solaris>=80000
+	nlink_t nlink;			/* directory link count */
+	off_t size;			/* directory size */
+# endif	/* solaris>=80000 */
+
+	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 */
+
+# if	defined(HASFSTYPE)
+	char *fstype;			/* file system type */
+# endif	/* defined(HASFSTYPE) */
+
+# if	solaris>=80000
+	nlink_t nlink;			/* directory st_nlink */
+	off_t size;			/* directory st_size */
+# endif	/* solaris>=80000 */
+
+# if	defined(HASMNTSTAT)
+	unsigned char stat;		/* mount point stat() status:
+					 *     0 = succeeded
+					 *     1 = failed */
+# endif	/* defined(HASMNTSTAT) */
+
+};
+
+struct pseudo {
+	struct l_dev pd;		/* device, inode, path, verify */
+	struct pseudo *next;		/* forward link */
+};
+extern struct pseudo *Pseudo;
+
+
+/*
+ * Solaris 11 sdev definitions
+ */
+
+#define	SDVOP_IP	0		/* Sdev[] devipnet_vnodeops index */
+#define	SDVOP_NET	1		/* Sdev[] devnet_vnodeops index */
+#define	SDVOP_PTS	2		/* Sdev[] devpts_vnodeops index */
+#define	SDVOP_VT	3		/* Sdev[] devvt_vnodeops index */
+#define	SDVOP_NUM	4		/* number of Sdev[] entries */
+
+
+struct sfile {
+	char *aname;			/* file name argument */
+	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 */
+};
+extern int Unof;			/* u_nofiles value */
+
+
+/*
+ * VxFS definitions
+ */
+
+#define	VXVOP_FCL	0		/* Vvops[] vx_fcl_vnodeops_p index */
+#define	VXVOP_FDD	1		/* Vvops[] fdd_vnops index */
+#define	VXVOP_FDDCH	2		/* Vvops[] fdd_chain_vnops index */
+#define	VXVOP_REG	3		/* Vvops[] vx_vnodeops index */
+#define	VXVOP_REG_P	4		/* Vvops[] vx_vnodeops_p index */
+#define	VXVOP_NUM	5		/* number of Vvops[] entries */
+
+
+/*
+ * Kernel name list definitions
+ */
+
+#define	NL_NAME		n_name
+#define	X_NCACHE	"ncache"
+#define	X_NCSIZE	"ncsize"
+
+
+/*
+ * Definitions for dvch.c
+ */
+
+# if	defined(HASDCACHE)
+#define	DCACHE_CLONE	rw_clone_sect	/* clone function for read_dcache */
+#define	DCACHE_CLR	clr_sect	/* function to clear clone and
+					 * pseudo caches when reading the
+					 * device cache file fails */
+#define	DCACHE_PSEUDO	rw_pseudo_sect	/* pseudo function for read_dcache */
+# endif	/* defined(HASDCACHE) */
+
+#define	DVCH_DEVPATH	"/devices"
+
+
+/*
+ * Definition for cvfs.c
+ */
+
+#define	CVFS_DEVSAVE 	1
+
+# if	solaris>=80000
+#define	CVFS_NLKSAVE	1
+#define	CVFS_SZSAVE	1
+# endif	/* solaris>=80000 */
+
+
+/*
+ * Definitions for rnch.c
+ */
+
+# if	defined(HASNCACHE)
+#include <sys/dnlc.h>
+
+#  if	!defined(NC_NAMLEN)
+#define	HASDNLCPTR	1
+#  endif	/* !defined(NC_NAMLEN) */
+
+#  if	solaris>=80000
+#define	NCACHE_NEGVN	"negative_cache_vnode"
+#  endif	/* solaris>=80000 */
+# endif	/* defined(HASNCACHE) */
+
+#endif	/* SOLARIS_LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dmnt.c
new file mode 100644
index 0000000..c9c023c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dmnt.c
@@ -0,0 +1,417 @@
+/*
+ * dmnt.c - Solaris mount support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.15 2005/08/29 10:24:25 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+_PROTOTYPE(static char *getmntdev,(char *o, int l, struct stat *s, char *f));
+
+
+/*
+ * getmntdev() - get mount entry's device number
+ */
+
+static char *
+getmntdev(o, l, s, f)
+	char *o;			/* start of device option */
+	int l;				/* length of device keyword (not
+					 * including `=') */
+	struct stat *s;			/* pointer to stat buffer to create */
+	char *f;			/* file system type */
+{
+	char *opte;
+
+	memset((char *)s, 0, sizeof(struct stat));
+	if (!(opte = x2dev(o + l + 1, &s->st_dev)))
+	    return((char *)NULL);
+
+#if	solaris>=70000 && L_BITSMAJOR!=L_BITSMAJOR32
+/*
+ * If this is a Solaris 7 system with a 64 bit kernel, convert the 32 bit
+ * device number to a 64 bit device number.
+ */
+	s->st_dev = (((s->st_dev >> L_BITSMINOR32) & L_MAXMAJ32) << L_BITSMINOR)
+		  | (s->st_dev & L_MAXMIN32);
+#endif	/* solaris>=70000 && L_BITSMAJOR!=L_BITSMAJOR32 */
+
+	s->st_mode = S_IFDIR | 0777;
+
+#if	defined(HASFSTYPE)
+	if (f) {
+	    (void) strncpy(s->st_fstype, f, sizeof(s->st_fstype));
+	    s->st_fstype[sizeof(s->st_fstype) - 1] = '\0';
+	}
+#endif	/* defined(HASFSTYPE) */
+
+	return(opte);
+}
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	int devl, ignore;
+	char *cp, *dir, *fs;
+	char *dn = (char *)NULL;
+	char *ln;
+	FILE *mfp;
+	struct mounts *mtp;
+	char *dopt, *dopte;
+	struct stat sb;
+	struct mnttab me;
+	struct mnttab *mp;
+
+#if	defined(HASPROCFS)
+	int procfs = 0;
+#endif	/* defined(HASPROCFS) */
+
+	unsigned char stat;
+	char *zopt;
+
+#if 	defined(HASZONES)
+	int zwarn = 0;
+#endif 	/* definesd(HASZONES) */
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+	devl = strlen(MNTOPT_DEV);
+/*
+ * Open access to the mount table and read mount table entries.
+ */
+	if (!(mfp = fopen(MNTTAB, "r"))) {
+            (void) fprintf(stderr, "%s: can't access %s\n", Pn, MNTTAB);
+            return(0);
+        }
+	for (mp = &me; getmntent(mfp, mp) == 0;) {
+
+	/*
+	 * Skip loop-back mounts, since they are aliases for legitimate file
+	 * systems and there is no way to determine that a vnode refers to a
+	 * loop-back alias.
+	 */
+	    if (strcmp(mp->mnt_fstype, MNTTYPE_LO) == 0)
+		continue;
+	/*
+	 * Save pointers to the directory and file system names for later use.
+	 *
+	 * Check the file system name.  If it doesn't begin with a `/'
+	 * but contains a `:' not followed by a '/', ignore this entry.
+	 */
+	    dir = mp->mnt_mountp;
+	    fs = mp->mnt_special;
+	    if (*fs != '/' && (cp = strchr(fs, ':')) && *(cp+1) != '/')
+		continue;
+	/*
+	 * Check for a "ignore" type (SunOS) or "ignore" option (Solaris).
+	 */
+	    if (hasmntopt(mp, MNTOPT_IGNORE))
+		ignore = 1;
+	    else
+		ignore = 0;
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(dir, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount ", Pn);
+		safestrprt(fs, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(dir, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 *
+	 * Avoid the stat() if the mount entry has an "ignore" option and
+	 * try to use the mount entry's device number instead.
+	 */
+	    dopt = hasmntopt(mp, MNTOPT_DEV);
+	    if (ignore) {
+		if (!dopt
+		||  !(dopte = getmntdev(dopt, devl, &sb,
+
+#if	defined(HASFSTYPE)
+				       mp->mnt_fstype
+#else	/* !defined(HASFSTYPE) */
+				       (char *)NULL
+#endif	/* defined(HASFSTYPE) */
+
+				      ))
+		)
+		    continue;
+		stat = 1;
+	    } else if (statsafely(dn, &sb)) {
+		if (dopt) {
+		    if (!(dopte = getmntdev(dopt, devl, &sb,
+
+#if	defined(HASFSTYPE)
+					   mp->mnt_fstype
+#else	/* !defined(HASFSTYPE) */
+					   (char *)NULL
+#endif	/* defined(HASFSTYPE) */
+
+					  ))
+		    )
+			dopt = (char *)NULL;
+		} else
+		    dopte = (char *)NULL;
+		if (!Fwarn) {
+
+#if	defined(HASZONES)
+		    if ((zopt = hasmntopt(mp, "zone")) && dopte)
+			zwarn++;
+#else	/* !defined(HASZONES) */
+		    zopt = (char *)NULL;
+#endif	/* defined(HASZONES) */
+
+		    if (!zopt || !dopte) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: can't stat() ", Pn);
+			safestrprt(mp->mnt_fstype, stderr, 0);
+			(void) fprintf(stderr, " file system ");
+			safestrprt(dir, stderr, 1);
+			(void) fprintf(stderr,
+			    "      Output information may be incomplete.\n");
+			if (dopte) {
+			    (void) fprintf(stderr,
+				"      assuming \"%.*s\" from %s\n",
+				(int)(dopte - dopt), dopt, MNTTAB);
+			}
+		   }
+		}
+		if (!dopt)
+		    continue;
+		stat = 1;
+	    } else
+		stat = 0;
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+
+#if	defined(HASFSTYPE)
+	    if (!(mtp->fstype = mkstrcpy(sb.st_fstype, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+#endif	/* defined(HASFSTYPE) */
+
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+
+#if	solaris>=80000
+	    mtp->nlink = sb.st_nlink;
+	    mtp->size = sb.st_size;
+#endif	/* solaris>=80000 */
+
+#if	defined(HASMNTSTAT)
+	    mtp->stat = stat;
+#endif	/* defined(HASMNTSTAT) */
+
+#if	defined(HASPROCFS)
+	    if (strcmp(sb.st_fstype, HASPROCFS) == 0) {
+
+	    /*
+	     * Save information on exactly one proc file system.
+	     */
+		if (procfs)
+		    Mtprocfs = (struct mounts *)NULL;
+		else {
+		    procfs = 1;
+		    Mtprocfs = mtp;
+		}
+	    }
+#endif	/* defined(HASPROCFS) */
+
+	/*
+	 * Interpolate a possible file system (mounted-on) device name link.
+	 */
+	    if (!(dn = mkstrcpy(fs, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mount table entry.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+
+#if	defined(HAS_AFS)
+	/*
+	 * If an AFS device number hasn't yet been defined, look for it.
+	 */
+	    if (!AFSdevStat
+	    &&  mtp->dir && strcmp(mtp->dir, "/afs") == 0
+	    &&  mtp->fsname && strcmp(mtp->fsname, "AFS") == 0) {
+		AFSdev = mtp->dev;
+		AFSdevStat = 1;
+	    }
+#endif	/* defined(HAS_AFS) && solaris>=20600 */
+
+        }
+	(void) fclose(mfp);
+
+#if	defined(HASZONES)
+/*
+ * If some zone file systems were encountered, issue a warning.
+ */
+	if (!Fwarn && zwarn) {
+	    (void) fprintf(stderr,
+		"%s: WARNING: can't stat() %d zone file system%s", Pn, zwarn,
+		    (zwarn == 1) ? "" : "s");
+	    (void) fprintf(stderr, "; using dev= option%s\n",
+		    (zwarn == 1) ? "" : "s");
+	}
+#endif	/* defined(HASZONES) */
+
+/*
+ * Clean up and return local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
+
+
+/*
+ * readvfs() - read vfs structure
+ */
+
+struct l_vfs *
+readvfs(ka, la, lv)
+	KA_T ka;			/* vfs structure kernel address, if
+					 * must be read from kernel */
+	struct vfs *la;			/* local vfs structure address, non-
+					 * NULL if already read from kernel */
+	struct vnode *lv;		/* local vnode */
+{
+	struct vfs *v, tv;
+	struct l_vfs *vp;
+
+	if (!ka && !la)
+	    return((struct l_vfs *)NULL);
+	for (vp = Lvfs; vp; vp = vp->next) {
+	    if (ka == vp->addr)
+		return(vp);
+	}
+	if (!(vp = (struct l_vfs *)malloc(sizeof(struct l_vfs)))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for vfs\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+	vp->dir = (char *)NULL;
+	vp->fsname = (char *)NULL;
+
+#if	defined(HASFSINO)
+	vp->fs_ino = 0;
+#endif	/* defined(HASFSINO) */
+
+/*
+ * Read vfs structure from kernel, if necessary.
+ */
+	if (la)
+	    v = la;
+	else {
+	    v = &tv;
+	    if (kread((KA_T)ka, (char *)v, sizeof(tv))) {
+		(void) free((FREE_P *)vp);
+		return((struct l_vfs *)NULL);
+	    }
+	}
+
+#if	defined(HAS_AFS)
+/*
+ * Fake the device number for an AFS device.
+ */
+	if (v->vfs_fstype == AFSfstype) {
+	    if (!AFSdevStat)
+		(void) readmnt();
+	    v->vfs_dev = AFSdevStat ? AFSdev : 0;
+	}
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Complete mount information.
+ */
+
+	(void) completevfs(vp, (dev_t *)&v->vfs_dev);
+	vp->next = Lvfs;
+	vp->addr = ka;
+	Lvfs = vp;
+	return(vp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dnode.c
new file mode 100644
index 0000000..e2b9776
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dnode.c
@@ -0,0 +1,5473 @@
+/*
+ * dnode.c - Solaris node reading functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.58 2011/08/07 22:53:42 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	solaris>=110000
+#include <sys/fs/sdev_impl.h>
+#endif	/* solaris>=110000 */
+
+#undef	fs_bsize
+#include <sys/fs/ufs_inode.h>
+
+
+#if	solaris>=110000 && defined(HAS_LIBCTF)
+/*
+ * Sockfs support for Solaris 11 via libctf
+ */
+
+
+/*
+ * Sockfs internal structure definitions
+ *
+ * The structure definitions may look like kernel structures, but they are
+ * not.  They have been defined to have member names that duplicate those
+ * used by the kernel that are of interest to lsof.  Member values are
+ * obtained via the CTF library, libctf.
+ *
+ * Robert Byrnes developed the CTF library access code and contributed it
+ * to lsof.
+ */
+
+struct soaddr {				/* sadly, CTF doesn't grok this
+					 * structure */
+	struct sockaddr *soa_sa;	/* address */
+	t_uscalar_t soa_len;		/* length in bytes */
+	t_uscalar_t soa_maxlen;		/* maximum length */
+};
+
+typedef struct sotpi_info {
+	dev_t sti_dev;			/* sonode device */
+	struct soaddr sti_laddr;	/* local address */
+	struct soaddr sti_faddr;	/* peer address */
+	struct so_ux_addr sti_ux_laddr;	/* bound local address */
+	struct so_ux_addr sti_ux_faddr;	/* bound peer address */
+	t_scalar_t sti_serv_type;	/* service type */
+} sotpi_info_t;
+
+
+/*
+ * CTF definitions for sockfs
+ */
+
+static	int	Sockfs_ctfs = 0;	/* CTF initialization status for
+					 * sockfs */
+
+#  if	defined(_LP64)
+#define	SOCKFS_MOD_FORMAT "/kernel/fs/%s/sockfs"
+#  else	/* !defined(_LP64) */
+#define	SOCKFS_MOD_FORMAT "/kernel/fs/sockfs"
+# endif	/* defined(_LP64) */
+
+					/* sockfs module pathname template to
+					 * which the kernel's instruction type
+					 * set is added for CTF access */
+
+
+/*
+ * Sockfs access definitions and structures
+ */
+
+#define	SOADDR_TYPE_NAME "soaddr"
+
+static	CTF_member_t soaddr_members[] = {
+    CTF_MEMBER(soa_sa),
+#define	MX_soa_sa			0
+
+    CTF_MEMBER(soa_len),
+#define	MX_soa_len			1
+
+    CTF_MEMBER(soa_maxlen),
+#define	MX_soa_maxlen			2
+
+    { NULL, 0 }
+};
+
+
+#define SOTPI_INFO_TYPE_NAME "sotpi_info_t"
+
+static	CTF_member_t sotpi_info_members[] = {
+    CTF_MEMBER(sti_dev),
+#define	MX_sti_dev			0
+
+    CTF_MEMBER(sti_laddr),
+#define	MX_sti_laddr			1
+
+    CTF_MEMBER(sti_faddr),
+#define	MX_sti_faddr			2
+
+    CTF_MEMBER(sti_ux_laddr),
+#define	MX_sti_ux_laddr			3
+
+    CTF_MEMBER(sti_ux_faddr),
+#define	MX_sti_ux_faddr			4
+
+    CTF_MEMBER(sti_serv_type),
+#define	MX_sti_serv_type		5
+
+    { NULL, 0 }
+};
+
+
+/*
+ * CTF sockfs request table
+ */
+
+static	CTF_request_t Sockfs_requests[] = {
+    { SOTPI_INFO_TYPE_NAME,	sotpi_info_members },
+    { NULL,			NULL }
+};
+
+
+/*
+ * Sockfs function prototypes
+ */
+
+_PROTOTYPE(static int read_nsti,(struct sonode *so, sotpi_info_t *stpi));
+#endif	/* solaris>=110000 && defined(HAS_LIBCTF) */
+
+
+#if	defined(HAS_ZFS) && defined(HAS_LIBCTF)
+/*
+ * ZFS support via libctf
+ */
+
+
+/*
+ * ZFS internal structure definitions
+ *
+ * The structure definitions may look like kernel structures, but they are
+ * not.  They have been defined to have member names that duplicate those
+ * used by the kernel that are of interest to lsof.  Member values are
+ * obtained via the CTF library, libctf.
+ *
+ * Robert Byrnes developed the CTF library access code and contributed it
+ * to lsof.
+ */
+
+typedef struct zfsvfs {
+	vfs_t	*z_vfs;			/* pointer to VFS */
+} zfsvfs_t;
+
+typedef struct znode_phys {
+	uint64_t	zp_size;	/* file size (ZFS below 5) */
+	uint64_t	zp_links;	/* links (ZFS below 5) */
+} znode_phys_t;
+
+typedef struct znode {
+	zfsvfs_t	*z_zfsvfs;	/* pointer to associated vfs */
+	vnode_t		*z_vnode;	/* pointer to associated vnode */
+	uint64_t	z_id;		/* node ID */
+	znode_phys_t	*z_phys;	/* pointer to persistent znode (ZFS
+					 * below 5) */
+	uint64_t	z_links;	/* links (ZFS 5 and above) */
+	uint64_t	z_size;		/* file size (ZFS 5 and above) */
+} znode_t;
+
+
+/*
+ * CTF definitions for ZFS
+ */
+
+static	int ZFS_ctfs = 0;		/* CTF initialization status for ZFS */
+
+#  if	defined(_LP64)
+#define ZFS_MOD_FORMAT   "/kernel/fs/%s/zfs"
+#  else	/* !defined(_LP64) */
+#define ZFS_MOD_FORMAT   "/kernel/fs/zfs"
+# endif	/* defined(_LP64) */
+
+					/* ZFS module pathname template to
+					 * which the kernel's instruction type
+					 * set is added for CTF access */
+
+/*
+ * ZFS access definitions and structures
+ */
+
+#define ZNODE_TYPE_NAME "znode_t"
+
+static	CTF_member_t znode_members[] = {
+    CTF_MEMBER(z_zfsvfs),
+#define	MX_z_zfsvfs		0
+
+    CTF_MEMBER(z_vnode),
+#define	MX_z_vnode		1
+
+    CTF_MEMBER(z_id),
+#define	MX_z_id			2
+
+    CTF_MEMBER(z_link_node),
+#define	MX_z_link_node		3
+
+    CTF_MEMBER(z_phys),
+#define	MX_z_phys		4
+
+    CTF_MEMBER(z_links),
+#define	MX_z_links		5
+
+    CTF_MEMBER(z_size),
+#define	MX_z_size		6
+
+    { NULL, 0 }
+};
+
+
+#define ZNODE_PHYS_TYPE_NAME    "znode_phys_t"
+
+static	CTF_member_t znode_phys_members[] = {
+    CTF_MEMBER(zp_size),
+#define	MX_zp_size		0
+
+    CTF_MEMBER(zp_links),
+#define	MX_zp_links		1
+
+     { NULL, 0 }
+};
+
+
+#define ZFSVFS_TYPE_NAME        "zfsvfs_t"
+
+static	CTF_member_t zfsvfs_members[] = {
+    CTF_MEMBER(z_vfs),
+#define	MX_z_vfs		0
+
+    { NULL, 0 }
+};
+
+
+/*
+ * CTF ZFS request table
+ */
+
+static	CTF_request_t ZFS_requests[] = {
+    { ZNODE_TYPE_NAME,		znode_members },
+    { ZNODE_PHYS_TYPE_NAME,	znode_phys_members },
+    { ZFSVFS_TYPE_NAME,		zfsvfs_members },
+    { NULL,			NULL }
+};
+
+
+/*
+ * Missing members exceptions -- i.e., CTF_getmem won't consider it
+ * an error if any of these members are undefined.
+ */
+
+typedef struct CTF_exception {
+    char *tynm;			/* type name */
+    char *memnm;		/* member name */
+} CTF_exception_t;
+
+static CTF_exception_t CTF_exceptions[] = {
+    { ZNODE_TYPE_NAME,		"z_phys"  },
+    { ZNODE_TYPE_NAME,		"z_links" },
+    { ZNODE_TYPE_NAME,		"z_size"  },
+    { NULL,			NULL	  }
+};
+    
+
+/*
+ * ZFS function prototypes
+ */
+
+_PROTOTYPE(static int read_nzn,(KA_T na, KA_T nza, znode_t *z));
+_PROTOTYPE(static int read_nznp,(KA_T nza, KA_T nzpa, znode_phys_t *zp));
+_PROTOTYPE(static int read_nzvfs,(KA_T nza, KA_T nzva, zfsvfs_t *zv));
+#endif	/* defined(HAS_ZFS) && defined(HAS_LIBCTF) */
+
+
+_PROTOTYPE(static struct l_dev *finddev,(dev_t *dev, dev_t *rdev, int flags));
+
+
+/*
+ * Finddev() "look-in " flags
+ */
+
+#define	LOOKDEV_TAB	0x01		/* look in device table */
+#define	LOOKDEV_CLONE	0x02		/* look in Clone table */
+#define	LOOKDEV_PSEUDO	0x04		/* look in Pseudo table */
+#define	LOOKDEV_ALL	(LOOKDEV_TAB | LOOKDEV_CLONE | LOOKDEV_PSEUDO)
+					/* look all places */
+
+
+/*
+ * SAM-FS definitions
+ */
+
+#define	SAMFS_NMA_MSG	"(limited SAM-FS info)"
+
+
+/*
+ * Voptab definitions
+ */
+
+typedef struct build_v_optab  {
+	char *dnm;			/* drive_NL name */
+	char *fsys;			/* file system type name */
+	int nty;			/* node type index (i.e., N_*) */
+} build_v_optab_t;
+
+static build_v_optab_t Build_v_optab[] = {
+	{ "auvops",	 "autofs",	N_AUTO		},
+	{ "avops",	 "afs",		N_AFS		},
+	{ "afsops",	 "afs",		N_AFS		},
+	{ "ctfsadir",	 NULL,		N_CTFSADIR	},
+	{ "ctfsbund",	 NULL,		N_CTFSBUND	},
+	{ "ctfscdir",	 NULL,		N_CTFSCDIR	},
+	{ "ctfsctl",	 NULL,		N_CTFSCTL	},
+	{ "ctfsevt",	 NULL,		N_CTFSEVT	},
+	{ "ctfslate",	 NULL,		N_CTFSLATE	},
+	{ "ctfsroot",	 NULL,		N_CTFSROOT	},
+	{ "ctfsstat",	 NULL,		N_CTFSSTAT	},
+	{ "ctfssym",	 NULL,		N_CTFSSYM	},
+	{ "ctfstdir",	 NULL,		N_CTFSTDIR	},
+	{ "ctfstmpl",	 NULL,		N_CTFSTMPL	},
+	{ "cvops",	 NULL,		N_CACHE		},
+	{ "devops",	 "devfs",	N_DEV		},
+	{ "doorops",	 NULL,		N_DOOR		},
+	{ "fdops",	 "fd",		N_FD		},
+	{ "fd_ops",	 "fd",		N_FD		},
+	{ "fvops",	 "fifofs",	N_FIFO		},
+	{ "hvops",	 "hsfs",	N_HSFS		},
+	{ "lvops",	 "lofs",	N_LOFS		},
+	{ "mntops",	 "mntfs",	N_MNT		},
+	{ "mvops",	 "mvfs",	N_MVFS		},
+	{ "n3vops",	 NULL,		N_NFS		},
+
+#if	solaris>=100000
+	{ "n4vops",	 NULL,		N_NFS4		},
+#else	/* solaris<100000 */
+	{ "n4vops",	 NULL,		N_NFS		},
+#endif	/* solaris>=100000 */
+
+	{ "nmvops",	 "namefs",	N_NM		},
+	{ "nvops",	 NULL,		N_NFS		},
+	{ "pdvops",	 "pcfs",	N_PCFS		},
+	{ "pfvops",	 "pcfs",	N_PCFS		},
+	{ "portvops",	 NULL,		N_PORT		},
+	{ "prvops",	 "proc",	N_PROC		},
+	{ "sam1vops",	 NULL,		N_SAMFS		},
+	{ "sam2vops",	 NULL,		N_SAMFS		},
+	{ "sam3vops",	 NULL,		N_SAMFS		},
+	{ "sam4vops",	 NULL,		N_SAMFS		},
+	{ "sckvops",	 "sockfs",	N_SOCK		},
+	{ "devipnetops", "sdevfs",	N_SDEV		},
+	{ "devnetops",	 "sdevfs",	N_SDEV		},
+	{ "devptsops",	 "sdevfs",	N_SDEV		},
+	{ "devvtops",	 "sdevfs",	N_SDEV		},
+	{ "socketvops",	 "sockfs",	N_SOCK		},
+	{ "sdevops",	 "sdevfs",	N_SDEV		},
+	{ "shvops",	 "sharedfs",	N_SHARED	},
+	{ "sncavops",	 "sockfs",	N_SOCK		},
+	{ "stpivops",	 "sockfs",	N_SOCK		},
+	{ "spvops",	 "specfs",	N_REGLR		},
+	{ "tvops",	 "tmpfs",	N_TMP		},
+	{ "uvops",	 "ufs",		N_REGLR		},
+	{ "vvfclops",	 "vxfs",	N_VXFS		},
+	{ "vvfops",	 "vxfs",	N_VXFS		},
+	{ "vvfcops",	 "vxfs",	N_VXFS		},
+	{ "vvops",	 "vxfs",	N_VXFS		},
+	{ "vvops_p",	 "vxfs",	N_VXFS		},
+	{ "zfsdops",	 "zfs",		N_ZFS		},
+	{ "zfseops",	 "zfs",		N_ZFS		},
+	{ "zfsfops",	 "zfs",		N_ZFS		},
+	{ "zfsshops",	 "zfs",		N_ZFS		},
+	{ "zfssymops",	 "zfs",		N_ZFS		},
+	{ "zfsxdops",	 "zfs",		N_ZFS		},
+	{ NULL,		NULL,		0		}	/* table end */
+};
+
+typedef	struct v_optab {
+	char *fsys;			/* file system type name */
+	int fx;				/* Fsinfo[] index (-1 if none) */
+	int nty;			/* node type index (i.e., N_*) */
+	KA_T v_op;			/* vnodeops address */
+	struct v_optab *next;		/* next entry */
+} v_optab_t;
+
+static v_optab_t **FxToVoptab = (v_optab_t **)NULL;
+					/* table to convert file system index
+					 * to Voptab address[] -- built by
+					 * build_Voptab() */
+static v_optab_t **Voptab = (v_optab_t **)NULL;
+					/* table to convert vnode v_op
+					 * addresses to file system name and
+					 * node type -- built by build_Voptab()
+					 * and addressed through the HASHVOP()
+					 * macro */
+
+#define	VOPHASHBINS	256		/* number of Voptab[] hash bins --
+					 * MUST BE A POWER OF TWO! */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void build_Voptab,(void));
+_PROTOTYPE(static char isvlocked,(struct vnode *va));
+_PROTOTYPE(static int readinode,(KA_T ia, struct inode *i));
+_PROTOTYPE(static void read_mi,(KA_T s, dev_t *dev, caddr_t so, int *so_st, KA_T *so_ad, struct l_dev **sdp));
+
+
+#if	solaris>=20500
+# if	solaris>=20600
+_PROTOTYPE(static int read_nan,(KA_T na, KA_T aa, struct fnnode *rn));
+_PROTOTYPE(static int read_nson,(KA_T na, KA_T sa, struct sonode *sn));
+_PROTOTYPE(static int read_nusa,(struct soaddr *so, struct sockaddr_un *ua));
+# else	/* solaris<20600 */
+_PROTOTYPE(static int read_nan,(KA_T na, KA_T aa, struct autonode *a));
+# endif	/* solaris>=20600 */
+_PROTOTYPE(static int idoorkeep,(struct door_node *d));
+_PROTOTYPE(static int read_ndn,(KA_T na, KA_T da, struct door_node *d));
+#endif	/* solaris>=20500 */
+
+#if	solaris>=110000
+_PROTOTYPE(static int read_nsdn,(KA_T na, KA_T sa, struct sdev_node *sdn, struct vattr *sdva));
+#endif	/* solaris>=110000 */
+
+_PROTOTYPE(static int read_nfn,(KA_T na, KA_T fa, struct fifonode *f));
+_PROTOTYPE(static int read_nhn,(KA_T na, KA_T ha, struct hsnode *h));
+_PROTOTYPE(static int read_nin,(KA_T na, KA_T ia, struct inode *i));
+_PROTOTYPE(static int read_nmn,(KA_T na, KA_T ia, struct mvfsnode *m));
+_PROTOTYPE(static int read_npn,(KA_T na, KA_T pa, struct pcnode *p));
+_PROTOTYPE(static int read_nrn,(KA_T na, KA_T ra, struct rnode *r));
+
+#if	solaris>=100000
+_PROTOTYPE(static int read_nctfsn,(int ty, KA_T na, KA_T ca, char *cn));
+_PROTOTYPE(static int read_nprtn,(KA_T na, KA_T ra, port_t *p));
+_PROTOTYPE(static int read_nrn4,(KA_T na, KA_T ra, struct rnode4 *r));
+#endif	/* solaris>=100000 */
+
+_PROTOTYPE(static int read_nsn,(KA_T na, KA_T sa, struct snode *s));
+_PROTOTYPE(static int read_ntn,(KA_T na, KA_T ta, struct tmpnode *t));
+_PROTOTYPE(static int read_nvn,(KA_T na, KA_T va, struct vnode *v));
+
+#if	defined(HASPROCFS)
+_PROTOTYPE(static int read_npi,(KA_T na, struct vnode *v, struct pid *pids));
+#endif	/* defined(HASPROCFS) */
+
+_PROTOTYPE(static char *ent_fa,(KA_T *a1, KA_T *a2, char *d, int *len));
+_PROTOTYPE(static int is_socket,(struct vnode *v));
+_PROTOTYPE(static int read_cni,(struct snode *s, struct vnode *rv,
+	struct vnode *v, struct snode *rs, struct dev_info *di, char *din,
+	int dinl));
+_PROTOTYPE(static int read_ncn,(KA_T na, KA_T ca, struct cnode *cn));
+_PROTOTYPE(static int read_nln,(KA_T na, KA_T la, struct lnode *ln));
+_PROTOTYPE(static int read_nnn,(KA_T na, KA_T nna, struct namenode *n));
+
+#if	solaris<100000
+_PROTOTYPE(static void savesockmod,(struct so_so *so, struct so_so *sop, int *so_st));
+#else	/* solaris>=100000 */
+_PROTOTYPE(static int read_ndvn,(KA_T na, KA_T da, struct dv_node *dv,
+				 dev_t *dev, unsigned char *devs));
+#endif	/* solaris<100000 */
+
+
+/*
+ * Local static values
+ */
+
+static KA_T Spvops = (KA_T)0;	/* specfs vnodeops address -- saved
+				 * by build_Voptab() */
+static KA_T Vvops[VXVOP_NUM];	/* addresses of:
+				 *   vx_fcl_dnodeops_p (VXVOP_FCL)
+				 *   fdd_vnops (VXVOP_FDD)
+				 *   fdd_chain_vnops (VXVOP_FDDCH),
+				 *   vx_vnodeops (VXVOP_REG)
+				 *   vx_vnodeops_p (VXVOP_REG_P)
+				 *   -- saved by build_Voptab() */
+
+/*
+ * Local macros
+ *
+ * GETVOPS() -- get direct or indirect *vnodeops address
+ *
+ * HASHVOP() -- hash the vnode's v_op address
+ */
+
+#if	defined(VOPNAME_OPEN) && solaris>=100000
+#define	GETVOPS(name, nl, ops) \
+    if (get_Nl_value(name, nl, &ops) < 0) \
+	ops = (KA_T)0; \
+    else if (kread(ops, (char *)&ops, sizeof(ops))) \
+	ops = (KA_T)0
+#else	/* !defined(VOPNAME_OPEN) || solaris<100000 */
+#define	GETVOPS(name, nl, ops) \
+    if (get_Nl_value(name, nl, &ops) < 0) \
+	ops = (KA_T)0
+#endif	/* defined(VOPNAME_OPEN) && solaris>=100000 */
+
+#define	HASHVOP(ka)	((int)((((ka &0x1fffffff) * 31415) >> 3) & \
+			       (VOPHASHBINS - 1)))
+
+
+/*
+ * build_Voptab() -- build Voptab[]
+ */
+
+static void
+build_Voptab()
+{
+	build_v_optab_t *bp;		/* Build_v_optab[] pointer */
+	int fx;				/* temporary file system type index */
+	int h;				/* hash index */
+	int i, j;			/* temporary indexes */
+	KA_T ka;			/* temporary kernel address */
+	v_optab_t *nv, *vp, *vpp;	/* Voptab[] working pointers */
+	int vv = 0;			/* number of Vvops[] addresses that
+					 * have been located */
+/*
+ * If Voptab[] is allocated, return; otherwise allocate space for Voptab[]
+ * and FxToVoptab[] amd fill them.
+ */
+	if (Voptab)
+	    return;
+/*
+ * During first call, allocate space for Voptab[] and FxToVoptab[].
+ */
+
+	if (!(Voptab = (v_optab_t **)calloc((MALLOC_S)VOPHASHBINS,
+					    sizeof(v_optab_t)))
+	) {
+	    (void) fprintf(stderr, "%s: no space for Voptab\n", Pn);
+	    Exit(1);
+	}
+	if (!(FxToVoptab = (v_optab_t **)calloc((MALLOC_S)Fsinfomax,
+						sizeof(v_optab_t *)))
+	) {
+	    (void) fprintf(stderr, "%s: no space for FxToVoptab\n", Pn);
+	    Exit(1);
+	}
+	for (i = 0; i < VXVOP_NUM; i++) {
+	    Vvops[i] = (KA_T)NULL;
+	}
+/*
+ * Use Build_v_optab[] to build Voptab[].
+ */
+	for (bp = Build_v_optab; bp->dnm; bp++) {
+
+	/*
+	 * Get the kernel address for the symbol.  Do nothing if it can't
+	 * be determined.
+	 */
+	    GETVOPS(bp->dnm, Drive_Nl, ka);
+	    if (!ka)
+		continue;
+	/*
+	 * Check the Voptab[] for the address.
+	 */
+	    h = HASHVOP(ka);
+	    for (vp = Voptab[h], vpp = (v_optab_t *)NULL; vp; vp = vp->next) {
+		if (vp->v_op == ka)
+		    break;
+		vpp = vp;
+	    }
+	    if (vp) {
+
+	    /*
+	     * Ignore duplicates.
+	     */
+		continue;
+	    }
+	/*
+	 * No Voptab[] entry was found, so allocate space for a new
+	 * v_optab_t structure, determine its file system type index,
+	 * fill it and link it to the Voptab[].
+	 */
+	    if (!(nv = (v_optab_t *)malloc((MALLOC_S)sizeof(v_optab_t)))) {
+		(void) fprintf(stderr, "%s: out of Voptab space at: %s\n",
+			Pn, bp->dnm);
+		Exit(1);
+	    }
+	    nv->fsys = bp->fsys;
+	    nv->fx = -1;
+	    nv->nty = bp->nty;
+	    nv->next = (v_optab_t *)NULL;
+	    nv->v_op = ka;
+	    if (bp->fsys) {
+		for (i = 0; i < Fsinfomax; i++) {
+		    if (!strcmp(bp->fsys, Fsinfo[i])) {
+			nv->fx = i;
+			break;
+		    }
+		}
+	    }
+	    if (!Voptab[h])
+		Voptab[h] = nv;
+	    else
+		vpp->next = nv;
+	/*
+	 * Handle special v_op addresses:
+	 *
+	 *   special vnode ops;
+	 *   VxFS ops.
+	 */
+	    if (!Spvops) {
+		if (!strcmp(bp->dnm, "spvops"))
+		    Spvops = ka;
+	    }
+	    for (i = 0; (i < VXVOP_NUM) && (vv < VXVOP_NUM); i++) {
+		if (Vvops[i])
+		    continue;
+		switch (i) {
+		case VXVOP_FCL:
+		    if (!strcmp(bp->dnm, "vvfclops")) {
+			Vvops[i] = ka;
+			vv++;
+		    }
+		    break;
+		case VXVOP_FDD:
+		    if (!strcmp(bp->dnm, "vvfops")) {
+			Vvops[i] = ka;
+			vv++;
+		    }
+		    break;
+		case VXVOP_FDDCH:
+		    if (!strcmp(bp->dnm, "vvfcops")) {
+			Vvops[i] = ka;
+			vv++;
+		    }
+		    break;
+		case VXVOP_REG:
+		    if (!strcmp(bp->dnm, "vvops")) {
+			Vvops[i] = ka;
+			vv++;
+		    }
+		    break;
+		case VXVOP_REG_P:
+		    if (!strcmp(bp->dnm, "vvops_p")) {
+			Vvops[i] = ka;
+			vv++;
+		    }
+		    break;
+		}
+	    }
+	}
+/*
+ * Link Voptab[] entries to FxToVoptab[] entries.
+ */
+	for (h = 0; h < VOPHASHBINS; h++) {
+	    for (vp = Voptab[h]; vp; vp = vp->next) {
+		if (!vp->fsys)
+		    continue;
+		if (((fx = vp->fx) >= 0) && (fx < Fsinfomax)) {
+		    if (!FxToVoptab[fx])
+			FxToVoptab[fx] = vp;
+		    continue;
+		}
+		for (i = 0; i < Fsinfomax; i++) {
+		    if (!strcmp(Fsinfo[i], vp->fsys)) {
+			vp->fx = i;
+			if (!FxToVoptab[i])
+			    FxToVoptab[i] = vp;
+			break;
+		    }
+		}
+	    }
+	}
+}
+
+
+#if	defined(HAS_LIBCTF)
+/*
+ * CTF_getmem() -- get CTF members
+ */
+
+int
+CTF_getmem(f, mod, ty, mem)
+    ctf_file_t *f;			/* CTF file handle */
+    const char *mod;			/* module name */
+    const char *ty;			/* type */
+    CTF_member_t *mem;			/* member table */
+{
+    int err;				/* error flag */
+    ctf_id_t id;			/* CTF ID */
+    CTF_member_t *mp;			/* member pointer */
+    CTF_exception_t *xp;		/* exception table pointer */
+    int xs;				/* exception status */
+/*
+ * Look up the type.
+ */
+    if ((id = ctf_lookup_by_name(f, ty)) == CTF_ERR) {
+	(void) fprintf(stderr, "%s: ctf_lookup_by_name: %s: %s: %s\n",
+	    Pn, mod, ty, ctf_errmsg(ctf_errno(f)));
+	return(1);
+    }
+/*
+ * Get member offsets.
+ */
+    if (ctf_member_iter(f, id, CTF_memCB, mem) == CTF_ERR) {
+	(void) fprintf(stderr, "%s: ctf_member_iter: %s: %s: %s\n",
+	    Pn, mod, ty, ctf_errmsg(ctf_errno(f)));
+	return(1);
+    }
+/*
+ * Examine members.
+ */
+    for (err = 0, mp = mem; mp->m_name; mp++) {
+	if (mp->m_offset == CTF_MEMBER_UNDEF) {
+
+	/*
+	 * Check for an undefined member exception.  Report an error if
+	 * no exception is found.
+	 */
+	    for (xp = CTF_exceptions, xs = 0; xp->tynm; xp++) {
+		if (!strcmp(xp->tynm, ty) && !strcmp(xp->memnm, mp->m_name)) {
+		    xs = 1;
+		    break;
+		}
+	    }
+	    if (!xs) {
+		(void) fprintf(stderr,
+		    "%s: getmembers: %s: %s: %s: struct member undefined\n",
+		    Pn, mod, ty, mp->m_name);
+	        err = 1;
+	    }
+	} else {
+
+	/*
+	 * Convert bit offsets to byte offsets.
+	 */
+	    if ((mp->m_offset % NBBY) != 0) {
+		(void) fprintf(stderr,
+		    "%s: getmembers: %s: %s: %s: struct member is bit field\n",
+		    Pn, mod, ty, mp->m_name);
+		err = 1;
+	    } else
+		mp->m_offset /= NBBY;
+        }
+    }
+    return(err);
+}
+
+
+/*
+ * CTF_init - initialize CTF library access
+ */
+
+void
+CTF_init(i, t, r)
+    int *i;				/* initialization status */
+    char *t;				/* kernel module template */
+    CTF_request_t *r;			/* CTF requests */
+{
+    int err;				/* error status */
+    ctf_file_t *f;			/* CTF file info handle */
+
+# if	defined(_LP64)
+    static char isa[256+1];		/* kernel instruction set name */
+    static int isas = 0;		/* isa[] status */
+# endif	/* defined(_LP64) */
+
+    char kernmod[MAXPATHLEN];    	/* kernel module pathname */
+    char *kmp;				/* kernel module path name pointer */
+    static char pfn[256+1];		/* system platform name */
+    static int pfns = 0;		/* pfn[] status: -1 = request failed
+					 *		  0 = none requested
+					 *		 >0 = available */
+    char pfxkernmod[MAXPATHLEN];	/* prefixed kernel module name */
+    struct stat sb;			/* stat(2) buffer */
+
+    if (*i)
+	return;
+
+# if	defined(_LP64)
+/*
+ * If CTF access hasn't been initialized and a 64 bit kernel is in use,
+ * determine the name of the kernel's instruction set, and construct the
+ * pathname of the kernel module, using the supplied template.
+ */
+    if (!isas) {
+	if (sysinfo(SI_ARCHITECTURE_K, isa, sizeof(isa) - 1) == -1) {
+	    (void) fprintf(stderr, "%s: sysinfo: %s\n", Pn, strerror(errno));
+	    Exit(1);
+	}
+	isas = 1;
+	isa[sizeof(isa) - 1] = '\0';
+    }
+    (void) snprintf(kernmod, sizeof(kernmod) - 1, t, isa);
+    kernmod[sizeof(kernmod) - 1] = '\0';
+# else	/* !defined(_LP64) */
+/*
+ * If CTF access hasn't been initialized and a 32 bit kernel is in use, the
+ * supplied template is the module path name.
+ */
+    (void) strncpy(kernmod, t, sizeof(kernmod) - 1);
+# endif	/* defined(_LP64) */
+
+    kernmod[sizeof(kernmod) - 1] = '\0';
+    kmp = kernmod;
+    if (statsafely(kmp, &sb)) {
+
+    /*
+     * The module at the specified path does not exist or is inaccessible.
+     *
+     * Get the platform name and construct a prefix from it for module path
+     * name and see if that exists and is accessible.
+     *
+     * If it is, let CTF_init() use it; otherwise let CTF_init() fail on
+     * the specified path.
+     */
+	if (pfns >= 0) {
+	    if (!pfns)
+		pfns = sysinfo(SI_MACHINE, pfn, sizeof(pfn) - 1);
+	    if (pfns > 0) {
+		pfn[sizeof(pfn) - 1] = '\0';
+		(void) snprintf(pfxkernmod, sizeof(pfxkernmod) - 1,
+		    "/platform/%s/%s", pfn,
+		    (kernmod[0] == '/') ? &kernmod[1] : kernmod);
+		pfxkernmod[sizeof(pfxkernmod) - 1] = '\0';
+		if (!stat(pfxkernmod, &sb))
+		    kmp = pfxkernmod;
+	    }
+	}
+    }
+/*
+ * Open the module file and read its CTF info.
+ */
+    if ((f = ctf_open(kmp, &err)) == NULL) {
+	(void) fprintf(stderr, "%s: ctf_open: %s: %s\n",
+	    Pn, kmp, ctf_errmsg(err));
+	Exit(1);
+    }
+    for (err = 0; r->name; r++) {
+	if (CTF_getmem(f, kmp, r->name, r->mem))
+	    err = 1;
+    }
+    (void) ctf_close(f);
+    if (err)
+	Exit(1);
+    *i = 1;
+}
+
+
+/*
+ * CTF_memCB() - Callback function for ctf_member_iter()
+ */
+
+int
+CTF_memCB(name, id, offset, arg)
+    const char *name;			/* structure member name */
+    ctf_id_t id;			/* CTF ID */
+    ulong_t offset;			/* member offset */
+    void *arg;				/* member table */
+{
+    CTF_member_t *mp;
+/*
+ * Check for members of interest and record their offsets.
+ */
+    for (mp = (CTF_member_t *)arg; mp->m_name; mp++) {
+        if (!strcmp(name, mp->m_name)) {
+            mp->m_offset = offset;
+            break;
+        }
+    }
+    return(0);
+}
+#endif	/* defined(HAS_LIBCTF) */
+
+
+/*
+ * ent_fa() - enter fattach addresses in NAME column addition
+ */
+
+static char *
+ent_fa(a1, a2, d, len)
+    KA_T *a1;				/* first fattach address (NULL OK) */
+    KA_T *a2;				/* second fattach address */
+    char *d;				/* direction ("->" or "<-") */
+    int *len;				/* returned description length */
+{
+    static char buf[1024];
+    size_t bufl = sizeof(buf);
+    char tbuf[32];
+/*
+ * Form the fattach description.
+ */
+    if (!a1)
+
+#if	solaris<20600
+        (void) snpf(buf, bufl, "(FA:%s%s)", d,
+	    print_kptr(*a2, (char *)NULL, 0));
+#else	/* solaris>=20600 */
+	(void) snpf(buf, bufl, "(FA:%s%s)", d,
+	    print_kptr(*a2, (char *)NULL, 0));
+#endif	/* solaris<20600 */
+
+    else
+
+#if	solaris<20600
+	(void) snpf(buf, bufl, "(FA:%s%s%s)",
+	    print_kptr(*a1, tbuf, sizeof(tbuf)), d,
+	    print_kptr(*a2, (char *)NULL, 0));
+#else	/* solaris>=20600 */
+	(void) snpf(buf, bufl, "(FA:%s%s%s)",
+	    print_kptr(*a1, tbuf, sizeof(tbuf)), d,
+	    print_kptr(*a2, (char *)NULL, 0));
+#endif	/* solaris<20600 */
+
+    *len = (int)strlen(buf);
+    return(buf);
+}
+
+
+/*
+ * is_socket() - is the stream a socket?
+ */
+
+static int
+is_socket(v)
+    struct vnode *v;			/* vnode pointer */
+{
+    char *cp, *ep, *pf;
+    int i, j, len, n, pfl;
+    major_t maj;
+    minor_t min;
+    static struct tcpudp {
+	int ds;
+	major_t maj;
+	minor_t min;
+	char *proto;
+    } tcpudp[] = {
+	{ 0, 0, 0, "tcp" },
+	{ 0, 0, 0, "udp" },
+
+#if	defined(HASIPv6)
+	{ 0, 0, 0, "tcp6" },
+	{ 0, 0, 0, "udp6" },
+#endif	/* defined(HASIPv6) */
+
+    };
+#define	NTCPUDP	(sizeof(tcpudp) / sizeof(struct tcpudp))
+
+    static int tcpudps = 0;
+
+    if (!v->v_stream)
+	return(0);
+    maj = (major_t) GET_MAJ_DEV(v->v_rdev);
+    min = (minor_t) GET_MIN_DEV(v->v_rdev);
+/*
+ * Fill in tcpudp[], as required.
+ */
+    if (!tcpudps) {
+
+#if	solaris<80000
+	pf = "/devices/pseudo/clone";
+#else	/* solaris>=80000 */
+	pf = "/devices/pseudo/";
+#endif	/* solaris<80000 */
+
+	for (i = n = 0, pfl = (int)strlen(pf); (i < Ndev) && (n < NTCPUDP); i++)
+	{
+	    if (strncmp(Devtp[i].name, pf, pfl)
+	    ||  !(ep = strrchr((cp = &Devtp[i].name[pfl]), ':'))
+	    ||  (strncmp(++ep, "tcp", 3) && strncmp(ep, "udp", 3)))
+		continue;
+
+#if	solaris<80000
+	    if (*(ep + 3))
+#else	/* solaris>=80000 */
+	    len = (*(ep + 3) == '6') ? 4 : 3;
+	    if (*(ep + len) || ((cp + len) >= ep) || strncmp(cp, ep, len))
+#endif	/* solaris<80000 */
+
+		continue;
+	    for (j = 0; j < NTCPUDP; j++) {
+		if (!tcpudp[j].ds && !strcmp(ep, tcpudp[j].proto)) {
+		    tcpudp[j].ds = 1;
+		    tcpudp[j].maj = (major_t) GET_MAJ_DEV(Devtp[i].rdev);
+		    tcpudp[j].min = (minor_t) GET_MIN_DEV(Devtp[i].rdev);
+		    n++;
+		    break;
+		}
+	    }
+	}
+	tcpudps = n ? 1 : -1;
+    }
+/*
+ * Check for known IPv[46] TCP or UDP device.
+ */
+    for (i = 0; (i < NTCPUDP) && (tcpudps > 0); i++) {
+	if (tcpudp[i].ds
+
+#if	solaris<80000
+	&&  (maj == tcpudp[i].min)
+#else	/* solaris>=80000 */
+	&&  (maj == tcpudp[i].maj)
+#endif	/* solaris<80000 */
+
+	) {
+	    process_socket((KA_T)v->v_stream, tcpudp[i].proto);
+	    return(1);
+	}
+     }
+     return(0);
+}
+
+
+/*
+ * isvlocked() - is Solaris vnode locked?
+ */
+
+static char
+isvlocked(va)
+    struct vnode *va;		/* local vnode address */
+{
+
+#if	solaris<20500
+    struct filock f;
+    KA_T ff;
+    KA_T fp;
+#endif	/* solaris<20500 */
+
+    int i, l;
+
+#if	solaris>=20300
+    struct lock_descriptor ld;
+    KA_T lf;
+    KA_T lp;
+# if	solaris<20500
+#define	LOCK_END	ld.info.li_sleep.sli_flock.l_len
+#define	LOCK_FLAGS	ld.flags
+#define	LOCK_NEXT	ld.next
+#define	LOCK_OWNER	ld.owner.pid
+#define	LOCK_START	ld.start
+#define	LOCK_TYPE	ld.type
+# else	/* solaris>=20500 */
+#define	LOCK_END	ld.l_flock.l_len
+#define	LOCK_FLAGS	ld.l_state
+#define	LOCK_NEXT	ld.l_next
+#define	LOCK_OWNER	ld.l_flock.l_pid
+#define	LOCK_START	ld.l_start
+#define	LOCK_TYPE	ld.l_type
+# endif	/* solaris<20500 */
+#endif	/* solaris>=20300 */
+
+    if (va->v_filocks == NULL)
+	return(' ');
+
+#if	solaris<20500
+# if	solaris>20300 || (solaris==20300 && defined(P101318) && P101318>=45)
+    if (Ntype == N_NFS)
+# endif	/* solaris>20300 || (solaris==20300 && defined(P101318) && P101318>=45) */
+
+    {
+	ff = fp = (KA_T)va->v_filocks;
+	i = 0;
+	do {
+	    if (kread(fp, (char *)&f, sizeof(f)))
+		return(' ');
+	    i++;
+	    if (f.set.l_pid != (pid_t)Lp->pid)
+		continue;
+	    if (f.set.l_whence == 0 && f.set.l_start == 0
+	    &&  f.set.l_len == MAXEND)
+		l = 1;
+	    else
+		l = 0;
+	    switch (f.set.l_type & (F_RDLCK | F_WRLCK)) {
+	    case F_RDLCK:
+		return(l ? 'R' : 'r');
+	    case F_WRLCK:
+		return(l ? 'W' : 'w');
+	    case F_RDLCK|F_WRLCK:
+		return('u');
+	    default:
+		return('N');
+	    }
+	} while ((fp = (KA_T)f.next) && (fp != ff) && (i < 10000));
+    }
+#endif	/* solaris<20500 */
+
+#if	solaris>=20300
+    lf = lp = (KA_T)va->v_filocks;
+    i = 0;
+    do {
+	if (kread(lp, (char *)&ld, sizeof(ld)))
+	    return(' ');
+	i++;
+	if (!(LOCK_FLAGS & ACTIVE_LOCK) || LOCK_OWNER != (pid_t)Lp->pid)
+	    continue;
+	if (LOCK_START == 0
+	&&  (LOCK_END == 0
+
+# if	solaris<20500
+	||   LOCK_END == MAXEND
+# else	/* solaris>=20500 */
+	||   LOCK_END == MAXEND
+# endif	/* solaris<20500 */
+
+	))
+	    l = 1;
+	else
+	    l = 0;
+	switch (LOCK_TYPE) {
+	case F_RDLCK:
+	    return(l ? 'R' : 'r');
+	case F_WRLCK:
+	    return(l ? 'W' : 'w');
+	case (F_RDLCK | F_WRLCK):
+	    return('u');
+	default:
+	    return('L');
+	}
+    } while ((lp = (KA_T)LOCK_NEXT) && (lp != lf) && (i < 10000));
+    return(' ');
+#endif	/* solaris>=20300 */
+
+}
+
+
+/*
+ * finddev() - look up device by device number
+ */
+
+static struct l_dev *
+finddev(dev, rdev, flags)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+	int flags;			/* look flags -- see LOOKDEV_* symbol
+					 * definitions */
+{
+	struct clone *c;
+	struct l_dev *dp;
+	struct pseudo *p;
+
+	if (!Sdev)
+	    readdev(0);
+/*
+ * Search device table for match.
+ */
+
+#if	defined(HASDCACHE)
+
+finddev_again:
+
+#endif	/* defined(HASDCACHE) */
+
+	if (flags & LOOKDEV_TAB) {
+	    if ((dp = lkupdev(dev, rdev, 0, 0)))
+		return(dp);
+	}
+/*
+ * Search for clone.
+ */
+	if ((flags & LOOKDEV_CLONE) && Clone) {
+	    for (c = Clone; c; c = c->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MIN_DEV(c->cd.rdev)) {
+
+#if	defined(HASDCACHE)
+		    if (DCunsafe && !c->cd.v && !vfy_dev(&c->cd))
+			goto finddev_again;
+#endif	/* defined(HASDCACHE) */
+
+		    return(&c->cd);
+		}
+	    }
+	}
+/*
+ * Search for pseudo device match on major device only.
+ */
+	if ((flags & LOOKDEV_PSEUDO) && Pseudo) {
+	    for (p = Pseudo; p; p = p->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MAJ_DEV(p->pd.rdev)) {
+
+#if	defined(HASDCACHE)
+		    if (DCunsafe && !p->pd.v && !vfy_dev(&p->pd))
+			goto finddev_again;
+#endif	/* defined(HASDCACHE) */
+
+		    return(&p->pd);
+		}
+	    }
+	}
+	return((struct l_dev *)NULL);
+}
+
+
+#if	solaris>=20500
+/*
+ * idoorkeep() -- identify door keeper process
+ */
+
+static int
+idoorkeep(d)
+	struct door_node *d;		/* door's node */
+{
+	char buf[1024];
+	size_t bufl = sizeof(buf);
+	struct proc dp;
+	struct pid dpid;
+/*
+ * Get the proc structure and its pid structure for the door target.
+ */
+	if (!d->door_target
+	||  kread((KA_T)d->door_target, (char *)&dp, sizeof(dp)))
+	    return(0);
+	if (!dp.p_pidp
+	||  kread((KA_T)dp.p_pidp, (char *)&dpid, sizeof(dpid)))
+	    return(0);
+/*
+ * Form a description of the door.
+ *
+ * Put the description in the NAME column addition field.  If there's already
+ * something there, allocate more space and add the door description to it.
+ */
+	if (Lp->pid == (int)dpid.pid_id)
+	    (void) snpf(buf, bufl, "(this PID's door)");
+	else {
+	    (void) snpf(buf, bufl, "(door to %.64s[%ld])", dp.p_user.u_comm,
+		(long)dpid.pid_id);
+	}
+	(void) add_nma(buf, (int)strlen(buf));
+	return(1);
+}
+#endif	/* solaris>=20500 */
+
+
+/*
+ * process_node() - process vnode
+ */
+
+void
+process_node(va)
+	KA_T va;			/* vnode kernel space address */
+{
+	struct cnode cn;
+	dev_t dev, rdev, trdev;
+	unsigned char devs = 0;
+	unsigned char fxs = 0;
+	unsigned char ins = 0;
+	unsigned char kvs = 0;
+	unsigned char nns = 0;
+	unsigned char pnl = 0;
+	unsigned char rdevs = 0;
+	unsigned char rvs = 0;
+	unsigned char rfxs = 0;
+	unsigned char sdns = 0;
+	unsigned char tdef;
+	unsigned char trdevs = 0;
+	unsigned char unix_sock = 0;
+	struct dev_info di;
+	char din[DINAMEL];
+	char *ep;
+	struct fifonode f;
+	char *fa = (char *)NULL;
+	int fal;
+	static int ft = 1;
+	struct vnode fv, rv;
+	int fx, rfx;
+	struct hsnode h;
+	struct inode i;
+	int j;
+	KA_T ka, vka;
+	struct lnode lo;
+	struct vfs kv, rkv;
+	int len, llc, nl, snl, sepl;
+	struct mvfsnode m;
+	struct namenode nn;
+	struct l_vfs *nvfs, *vfs;
+	struct pcnode pc;
+	struct pcfs pcfs;
+	struct rnode r;
+	KA_T realvp = (KA_T)NULL;
+	struct snode rs;
+	struct snode s;
+
+#if	solaris>=110000
+	char *nm, *sep;
+	size_t nmrl, tl;
+	struct sdev_node sdn;
+	struct vattr sdva;
+	sotpi_info_t sti;
+	int stis = 0;
+#endif	/* solaris>=110000 */
+
+	struct l_dev *sdp = (struct l_dev *)NULL;
+	size_t sz;
+	struct tmpnode t;
+	char tbuf[128], *ty, ubuf[128];
+	int tbufx;
+	enum vtype type;
+	struct sockaddr_un ua;
+	static struct vnode *v = (struct vnode *)NULL;
+	KA_T vs;
+	int vty = 0;
+	int  vty_tmp;
+
+#if	solaris>=20500
+# if	solaris>=20600
+	struct fnnode fnn;
+	struct pairaddr {
+	    short f;
+	    unsigned short p;
+	} *pa;
+	KA_T peer;
+	struct sonode so;
+	KA_T soa, sona;
+# else	/* solaris<20600 */
+	struct autonode au;
+# endif	/* solaris>=20600 */
+
+	struct door_node dn;
+	int dns = 0;
+#endif	/* solaris >=20500 */
+
+#if	solaris<100000
+	KA_T so_ad[2];
+	struct so_so soso;
+	int so_st = 0;
+#else	/* solaris>=100000 */
+	union {
+	    ctfs_adirnode_t adir;
+	    ctfs_bunode_t bun;
+	    ctfs_cdirnode_t cdir;
+	    ctfs_ctlnode_t ctl;
+	    ctfs_evnode_t ev;
+	    ctfs_latenode_t late;
+	    ctfs_rootnode_t root;
+	    ctfs_symnode_t sym;
+	    ctfs_tdirnode_t tdir;
+	    ctfs_tmplnode_t tmpl;
+	} ctfs;
+	dev_t dv_dev;
+	struct dv_node dv;
+	unsigned char dv_devs = 0;
+	unsigned char dvs = 0;
+	port_t pn;
+	struct rnode4 r4;
+#endif	/* solaris<100000 */
+
+
+#if	defined(HASPROCFS)
+	struct procfsid *pfi;
+	struct pid pids;
+#endif	/* defined(HASPROCFS) */
+
+#if	defined(HAS_AFS)
+	struct afsnode an;
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HASVXFS)
+	struct l_ino vx;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	vfs_t zgvfs;
+	unsigned char zns = 0;
+	znode_t zn;
+	zfsvfs_t zvfs;
+#endif	/* defined(HAS_ZFS) */
+
+/*
+ * Do first-time only operations.
+ */
+
+#if	solaris<100000
+	so_ad[0] = so_ad[1] = (KA_T)0;
+#endif	/* solaris<100000 */
+
+	if (ft) {
+	    (void) build_Voptab();
+	    ft = 0;
+	}
+/*
+ * Read the vnode.
+ */
+	if (!va) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	if (!v) {
+
+	/*
+	 * Allocate space for the vnode or AFS vcache structure.
+	 */
+
+#if	defined(HAS_AFS)
+	    v = alloc_vcache();
+#else	/* !defined(HAS_AFS) */
+	    v = (struct vnode *) malloc(sizeof(struct vnode));
+#endif	/* defined(HAS_AFS) */
+
+	    if (!v) {
+		(void) fprintf(stderr, "%s: can't allocate %s space\n", Pn,
+
+#if	defined(HAS_AFS)
+			       "vcache"
+#else	/* !defined(HAS_AFS) */
+			       "vnode"
+#endif	/* defined(HAS_AFS) */
+
+			      );
+		Exit(1);
+	    }
+	}
+	if (readvnode(va, v)) {
+	    enter_nm(Namech);
+	    return;
+	}
+
+#if	defined(HASNCACHE)
+	Lf->na = va;
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = va;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+#if	defined(HASLFILEADD) && defined(HAS_V_PATH)
+	Lf->V_path = (KA_T)v->v_path;
+#endif	/* defined(HASLFILEADD) && defined(HAS_V_PATH) */
+
+	vs = (KA_T)v->v_stream;
+/*
+ * Check for a Solaris socket.
+ */
+	if (is_socket(v))
+	    return;
+/*
+ * Obtain the Solaris virtual file system structure.
+ */
+	if ((ka = (KA_T)v->v_vfsp)) {
+	    if (kread(ka, (char *)&kv, sizeof(kv))) {
+		vka = va;
+
+vfs_read_error:
+
+		(void) snpf(Namech, Namechl - 1,
+		    "vnode at %s: can't read vfs: %s",
+		    print_kptr(vka, tbuf, sizeof(tbuf)),
+		    print_kptr(ka, (char *)NULL, 0));
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		return;
+	    }
+	    kvs = 1;
+	} else
+	    kvs = 0;
+/*
+ * Derive the virtual file system structure's device number from
+ * its file system ID for NFS and High Sierra file systems.
+ */
+	if (kvs && ((fx = kv.vfs_fstype - 1) >= 0) && (fx < Fsinfomax)) {
+	    fxs = 1;
+	    if (strcmp(Fsinfo[fx], "nfs") == 0
+	    ||  strcmp(Fsinfo[fx], "nfs3") == 0
+	    ||  strcmp(Fsinfo[fx], "hsfs") == 0)
+		kv.vfs_dev = (dev_t)kv.vfs_fsid.val[0];
+	} else {
+	    fx = -1;
+	    fxs = 0;
+	}
+/*
+ * Determine the Solaris vnode type.
+ */
+	if ((Ntype = vop2ty(v, fx)) < 0) {
+	    if (v->v_type == VFIFO) {
+		vty = N_REGLR;
+		Ntype = N_FIFO;
+	    } else if (vs) {
+		Ntype = vty = N_STREAM;
+		Lf->is_stream = 1;
+	    }
+	    if (Ntype < 0) {
+		(void) snpf(Namech, Namechl - 1,
+		    "unknown file system type%s%s%s, v_op: %s",
+		    fxs ? " (" : "",
+		    fxs ? Fsinfo[fx] : "",
+		    fxs ? ")" : "",
+		    print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		return;
+	    }
+	} else {
+	    vty = Ntype;
+	    if (v->v_type == VFIFO)
+		Ntype = N_FIFO;
+	    else if (vs && Ntype != N_SOCK) {
+		Ntype = vty = N_STREAM;
+		Lf->is_stream = 1;
+	    }
+	}
+/*
+ * See if this Solaris node has been fattach'ed to another node.
+ * If it has, read the namenode, and enter the node addresses in
+ * the NAME column addition.
+ *
+ * See if it's covering a socket as well and process accordingly.
+ */
+	if (vty == N_NM) {
+	    if (read_nnn(va, (KA_T)v->v_data, &nn))
+		return;
+	    nns = 1;
+	    if (nn.nm_mountpt)
+
+#if	solaris>=20500
+		fa = ent_fa((KA_T *)((Ntype == N_FIFO || v->v_type == VDOOR)
+			    ? NULL : &va),
+			    (KA_T *)&nn.nm_mountpt, "->", &fal);
+#else	/* solaris<20500 */
+		fa = ent_fa((KA_T *)((Ntype == N_FIFO)
+			    ? NULL : &va),
+			    (KA_T *)&nn.nm_mountpt, "->", &fal);
+#endif	/* solaris>=20500 */
+
+	    if (Ntype != N_FIFO
+	    &&  nn.nm_filevp
+	    &&  !kread((KA_T)nn.nm_filevp, (char *)&rv, sizeof(rv))) {
+		rvs = 1;
+		if ((ka = (KA_T)rv.v_vfsp)
+		&&  !kread(ka, (char *)&rkv, sizeof(rkv))
+		&&  ((rfx = rkv.vfs_fstype - 1) >= 0)
+		&&  (rfx < Fsinfomax)
+		) {
+		    rfxs = 1;
+		} else {
+		    rfx = fx;
+		    rfxs = fxs;
+		}
+
+#if	defined(HASNCACHE)
+		Lf->na = (KA_T)nn.nm_filevp;
+#endif	/* defined(HASNCACHE) */
+
+		if (is_socket(&rv))
+		    return;
+	    }
+	}
+	if (Selinet && Ntype != N_SOCK)
+	    return;
+/*
+ * See if this Solaris node is served by spec_vnodeops.
+ */
+	if (Spvops && Spvops == (KA_T)v->v_op) 
+	    Ntype = N_SPEC;
+/*
+ * Determine the Solaris lock state.
+ */
+	Lf->lock = isvlocked(v);
+/*
+ * Establish the Solaris local virtual file system structure.
+ */
+	if (!(ka = (KA_T)v->v_vfsp) || !kvs)
+	    vfs = (struct l_vfs *)NULL;
+	else if (!(vfs = readvfs(ka, &kv, v))) {
+	    vka = va;
+	    goto vfs_read_error;
+	}
+/*
+ * Read the afsnode, autonode, cnode, door_node, fifonode, fnnode, lnode,
+ * inode, pcnode, rnode, snode, tmpnode, znode, etc.
+ */
+	switch (Ntype) {
+	case N_SPEC:
+	
+	/*
+	 * A N_SPEC node is a node that resides in in an underlying file system
+	 * type -- e.g. NFS, HSFS.  Its vnode points to an snode.  Subsequent
+	 * node structures are implied by the underlying node type.
+	 */
+	    if (read_nsn(va, (KA_T)v->v_data, &s))
+		return;
+	    realvp = (KA_T)s.s_realvp;
+	    if (!realvp && s.s_commonvp) {
+		if (read_cni(&s, &rv, v, &rs, &di, din, sizeof(din)) == 1)
+		    return;
+		if (!rv.v_stream) {
+		    if (din[0]) {
+			(void) snpf(Namech, Namechl, "COMMON: %s", din);
+			Namech[Namechl - 1] = '\0';
+			Lf->is_com = 1;
+		    }
+		    break;
+		}
+	    }
+	    if (!realvp) {
+
+	    /*
+	     * If the snode lacks a real vnode (and also lacks a common vnode),
+	     * it's original type is N_STREAM or N_REGLR, and it has a stream
+	     * pointer, get the module names.
+	     */
+		if ((vty == N_STREAM || vty == N_REGLR) && vs) {
+		    Lf->is_stream = 1;
+		    vty = N_STREAM;
+
+#if	solaris<100000
+		    read_mi(vs, (dev_t *)&s.s_dev, (caddr_t)&soso, &so_st,
+			    so_ad, &sdp);
+#else	/* solaris>=100000 */
+		    read_mi(vs, (dev_t *)&s.s_dev, NULL, NULL, NULL, &sdp);
+#endif	/* solaris<100000 */
+
+		    vs = (KA_T)NULL;
+		}
+	    }
+	    break;
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (readafsnode(va, v, &an))
+		return;
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+#if	solaris>=20500
+	case N_AUTO:
+
+# if	solaris<20600
+	    if (read_nan(va, (KA_T)v->v_data, &au))
+# else	/* solaris>=20600 */
+	    if (read_nan(va, (KA_T)v->v_data, &fnn))
+# endif	/* solaris<20600 */
+
+		return;
+	    break;
+
+# if	solaris>=100000
+	case N_DEV:
+	    if (read_ndvn(va, (KA_T)v->v_data, &dv, &dv_dev, &dv_devs))
+		return;
+	    dvs = 1;
+	    break;
+# endif	/* solaris>=100000 */
+
+	case N_DOOR:
+	    if (read_ndn(va, (KA_T)v->v_data, &dn))
+		return;
+	    dns = 1;
+	    break;
+#endif	/* solaris>=20500 */
+
+	case N_CACHE:
+	    if (read_ncn(va, (KA_T)v->v_data, &cn))
+		return;
+	    break;
+
+#if	solaris>=100000
+	case N_CTFSADIR:
+	case N_CTFSBUND:
+	case N_CTFSCDIR:
+	case N_CTFSCTL:
+	case N_CTFSEVT:
+	case N_CTFSLATE:
+	case N_CTFSROOT:
+	case N_CTFSSTAT:
+	case N_CTFSSYM:
+	case N_CTFSTDIR:
+	case N_CTFSTMPL:
+	    if (read_nctfsn(Ntype, va, (KA_T)v->v_data, (char *)&ctfs))
+		return;
+	    break;
+#endif	/* solaris>=100000 */
+
+#if	solaris>=20600
+	case N_SOCK:
+	    sona = (KA_T)v->v_data;
+	    if (read_nson(va, sona, &so))
+		return;
+	    break;
+#endif	/* solaris>=20600 */
+
+	case N_MNT:
+	    /* Information comes from the l_vfs structure. */
+	    break;
+	case N_MVFS:
+	    if (read_nmn(va, (KA_T)v->v_data, &m))
+		return;
+	    break;
+	case N_NFS:
+	    if (read_nrn(va, (KA_T)v->v_data, &r))
+		return;
+	    break;
+
+#if	solaris>=100000
+	case N_NFS4:
+	    if (read_nrn4(va, (KA_T)v->v_data, &r4))
+		return;
+	    break;
+#endif	/* solaris>=100000 */
+
+	case N_NM:
+	    if (nns)
+		realvp = (KA_T)nn.nm_filevp;
+
+#if	defined(HASNCACHE)
+		Lf->na = (KA_T)nn.nm_filevp;
+#endif	/* defined(HASNCACHE) */
+
+	    break;
+	case N_FD:
+	    break;	/* no successor node */
+	case N_FIFO:
+
+	/*
+	 * Solaris FIFO vnodes are usually linked to a fifonode.  One
+	 * exception is a FIFO vnode served by nm_vnodeops; it is linked
+	 * to a namenode, and the namenode points to the fifonode.
+	 *
+	 * Non-pipe fifonodes are linked to a vnode thorough fn_realvp.
+	 */
+	    if (vty == N_NM && nns) {
+		if (nn.nm_filevp) {
+		    if (read_nfn(va, (KA_T)nn.nm_filevp, &f))
+			return;
+		    realvp = (KA_T)NULL;
+		    vty = N_FIFO;
+		} else {
+		    (void) snpf(Namech, Namechl - 1,
+			"FIFO namenode at %s: no fifonode pointer",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    return;
+		}
+	    } else {
+		if (read_nfn(va, (KA_T)v->v_data, &f))
+		    return;
+		realvp = (KA_T)f.fn_realvp;
+	    }
+	    if (!realvp) {
+		Lf->inode = (INODETYPE)(nns ? nn.nm_vattr.va_nodeid : f.fn_ino);
+
+#if	solaris>=80000	/* Solaris 8 and above hack! */
+# if	defined(_LP64)
+		if (Lf->inode >= (unsigned long)0xbaddcafebaddcafe)
+# else	/* !defined(_LP64) */
+		if (Lf->inode >= (unsigned long)0xbaddcafe)
+# endif	/* defined(_LP64) */
+
+		    Lf->inp_ty = 0;
+		else
+#endif	/* solaris>=80000 Solaris 8 and above hack! */
+
+		    Lf->inp_ty = 1;
+		enter_dev_ch(print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		if (f.fn_flag & ISPIPE) {
+		    (void) snpf(tbuf, sizeof(tbuf), "PIPE");
+		    tbufx = (int)strlen(tbuf);
+		} else
+		    tbufx = 0;
+
+#if	solaris<20500
+		if (f.fn_mate) {
+		    (void) snpf(&tbuf[tbufx], sizeof(tbuf) - tbufx, "->%s",
+			print_kptr((KA_T)f.fn_mate, (char *)NULL, 0));
+		    tbufx = (int)strlen(tbuf);
+		}
+#else	/* solaris>=20500 */
+		if (f.fn_dest) {
+		    (void) snpf(&tbuf[tbufx], sizeof(tbuf) - tbufx, "->%s",
+			print_kptr((KA_T)f.fn_dest, (char *)NULL, 0));
+		    tbufx = (int)strlen(tbuf);
+		}
+#endif	/* solaris<20500 */
+
+		if (tbufx)
+		    (void) add_nma(tbuf, tbufx);
+		break;
+	    }
+	    break;
+
+	case N_HSFS:
+	    if (read_nhn(va, (KA_T)v->v_data, &h))
+		return;
+	    break;
+	case N_LOFS:
+	    llc = 0;
+	    do {
+		rvs = 0;
+		if (read_nln(va,
+			     llc ? (KA_T)rv.v_data : (KA_T)v->v_data,
+			     &lo))
+		{
+		    return;
+		}
+		if (!(realvp = (KA_T)lo.lo_vp)) {
+		    (void) snpf(Namech, Namechl - 1,
+			"lnode at %s: no real vnode",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    enter_nm(Namech);
+		    return;
+		}
+		if (read_nvn((KA_T)v->v_data, (KA_T)realvp, &rv))
+		    return;
+		rvs = 1;
+		llc++;
+		if ((ka = (KA_T)rv.v_vfsp)
+		&&  !kread(ka, (char *)&rkv, sizeof(rkv))
+		&&  ((rfx = rkv.vfs_fstype - 1) >= 0)
+		&&  (rfx < Fsinfomax)
+		) {
+		    rfxs = 1;
+		} else {
+		    rfx = fx;
+		    rfxs = fxs;
+		}
+		if (((vty_tmp = vop2ty(&rv, rfx)) == N_LOFS) && (llc > 1000)) {
+		    (void) snpf(Namech, Namechl - 1,
+			"lnode at %s: loop > 1000",
+			print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    enter_nm(Namech);
+		    return;
+		}
+	    } while (vty_tmp == N_LOFS);
+	    break;
+	case N_PCFS:
+	    if (read_npn(va, (KA_T)v->v_data, &pc))
+		return;
+	    break;
+
+#if	solaris>=100000
+	case N_PORT:
+	    if (read_nprtn(va, (KA_T)v->v_data, &pn))
+		return;
+	    break;
+#endif	/* solaris>=100000 */
+
+#if	defined(HASPROCFS)
+	case N_PROC:
+	    if (read_npi(va, v, &pids))
+		return;
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+#if	solaris>=110000
+	case N_SDEV:
+	    if (read_nsdn(va, (KA_T)v->v_data, &sdn, &sdva))
+		return;
+	    sdns = 1;
+	    break;
+#endif	/* solaris>=110000 */
+
+	case N_SAMFS:
+	    (void) add_nma(SAMFS_NMA_MSG, (int)strlen(SAMFS_NMA_MSG));
+	    break;
+	case N_SHARED:
+	    break;		/* No more sharedfs information is available. */
+	case N_STREAM:
+	    if (read_nsn(va, (KA_T)v->v_data, &s))
+		return;
+	    if (vs) {
+		Lf->is_stream = 1;
+
+#if	solaris<100000
+		read_mi(vs, (dev_t *)&s.s_dev, (caddr_t)&soso, &so_st, so_ad,
+		    &sdp);
+#else	/* solaris>=100000 */
+		read_mi(vs, (dev_t *)&s.s_dev, NULL, NULL, NULL, &sdp);
+#endif	/* solaris<100000 */
+
+		vs = (KA_T)NULL;
+	    }
+	    break;
+	case N_TMP:
+	    if (read_ntn(va, (KA_T)v->v_data, &t))
+		return;
+	    break;
+
+#if	defined(HASVXFS)
+	case N_VXFS:
+	    if (read_vxnode(va, v, vfs, fx, &vx, Vvops))
+		return;
+	    break;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	case N_ZFS:
+	    if (read_nzn(va, (KA_T)v->v_data, &zn))
+		return;
+	    zns = 1;
+	    break;
+#endif	/* defined(HAS_ZFS) */
+
+	case N_REGLR:
+	default:
+	    if (read_nin(va, (KA_T)v->v_data, &i))
+		return;
+	    ins = 1;
+	}
+/*
+ * If the node has a real vnode pointer, follow it.
+ */
+	if (realvp) {
+	    if (rvs) {
+		*v = rv;
+		fx = rfx;
+		fxs = rfxs;
+	    }
+	    else {
+		if (read_nvn((KA_T)v->v_data, (KA_T)realvp, v))
+		    return;
+		else {
+
+#if	defined(HASNCACHE)
+		    Lf->na = (KA_T)realvp;
+#endif	/* defined(HASNCACHE) */
+
+		    if ((ka = (KA_T)v->v_vfsp)
+	            &&  !kread(ka, (char *)&kv, sizeof(kv)))
+		    {
+			kvs = 1;
+		    }
+		    if (kvs
+		    &&  ((fx = kv.vfs_fstype - 1) >= 0)
+		    &&  (fx < Fsinfomax)
+		    ) {
+			fxs = 1;
+		    }
+		}
+	    }
+	/*
+	 * If the original vnode type is N_STREAM, if there is a stream
+	 * pointer and if there is no sdev_node, get the module names.
+	 */
+	    if (vty == N_STREAM && vs && !sdns) {
+		Lf->is_stream = 1;
+
+#if	solaris<100000
+		read_mi(vs, (dev_t *)&s.s_dev, (caddr_t)&soso, &so_st, so_ad,
+		    &sdp);
+#else	/* solaris>=100000 */
+		read_mi(vs, (dev_t *)&s.s_dev, NULL, NULL, NULL, &sdp);
+#endif	/* solaris<100000 */
+
+		vs = (KA_T)NULL;
+	    }
+	/*
+	 * Get the real vnode's type.
+	 */
+	    if ((vty = vop2ty(v, fx)) < 0) {
+		if (Ntype != N_FIFO && vs)
+		    vty = N_STREAM;
+		else {
+
+#if	solaris<100000
+		    (void) snpf(Namech, Namechl - 1,
+			"unknown file system type, v_op: %s",
+			print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+#else	/* solaris>=100000 */
+		    (void) snpf(Namech, Namechl - 1,
+			"unknown file system type (%s), v_op: %s",
+			fxs ? Fsinfo[fx] : "unknown",
+			print_kptr((KA_T)v->v_op, (char *)NULL, 0));
+#endif	/* solaris<100000 */
+
+		    Namech[Namechl - 1] = '\0';
+		}
+	    }
+	    if (Ntype == N_NM || Ntype == N_AFS)
+		Ntype = vty;
+	/*
+	 * Base further processing on the "real" vnode.
+	 */
+	    Lf->lock = isvlocked(v);
+	    switch (vty) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		if (readafsnode(va, v, &an))
+		    return;
+		break;
+#endif	/* defined(HAS_AFS) */
+	
+#if	solaris>=20500
+	    case N_AUTO:
+
+# if	solaris<20600
+		if (read_nan(va, (KA_T)v->v_data, &au))
+# else	/* solaris>=20600 */
+		if (read_nan(va, (KA_T)v->v_data, &fnn))
+# endif	/* solaris<20600 */
+
+		    return;
+		break;
+
+# if	solaris>=100000
+	    case N_DEV:
+		if (read_ndvn(va, (KA_T)v->v_data, &dv, &dv_dev, &dv_devs))
+		    return;
+		dvs = 1;
+		break;
+# endif	/* solaris>=100000 */
+
+	    case N_DOOR:
+
+# if	solaris<20600
+		if (read_ndn(realvp, (KA_T)v->v_data, &dn))
+# else	/* solaris>=20600 */
+		if (read_ndn(va, (KA_T)v->v_data, &dn))
+# endif	/* solaris<20500 */
+
+		    return;
+		dns = 1;
+		break;
+#endif	/* solaris>=20500 */
+
+	    case N_CACHE:
+		if (read_ncn(va, (KA_T)v->v_data, &cn))
+		    return;
+		break;
+
+#if	solaris>=100000
+	    case N_CTFSADIR:
+	    case N_CTFSBUND:
+	    case N_CTFSCDIR:
+	    case N_CTFSCTL:
+	    case N_CTFSEVT:
+	    case N_CTFSLATE:
+	    case N_CTFSROOT:
+	    case N_CTFSSTAT:
+	    case N_CTFSSYM:
+	    case N_CTFSTDIR:
+	    case N_CTFSTMPL:
+		if (read_nctfsn(vty, va, (KA_T)v->v_data, (char *)&ctfs))
+		    return;
+		break;
+#endif	/* solaris>=100000 */
+
+	    case N_HSFS:
+		if (read_nhn(va, (KA_T)v->v_data, &h))
+		    return;
+		break;
+	    case N_MNT:
+		/* Information comes from the l_vfs structure. */
+		break;
+	    case N_MVFS:
+		if (read_nmn(va, (KA_T)v->v_data, &m))
+		    return;
+		break;
+	    case N_NFS:
+		if (read_nrn(va, (KA_T)v->v_data, &r))
+		    return;
+		break;
+
+#if	solaris>=100000
+	    case N_NFS4:
+		if (read_nrn4(va, (KA_T)v->v_data, &r4))
+		    return;
+		break;
+#endif	/* solaris>=100000 */
+
+	    case N_NM:
+		if (read_nnn(va, (KA_T)v->v_data, &nn))
+		    return;
+		nns = 1;
+		break;
+
+#if	solaris>=100000
+	    case N_PORT:
+		if (read_nprtn(va, (KA_T)v->v_data, &pn))
+		    return;
+		break;
+#endif	/* solaris>=100000 */
+
+	    case N_PCFS:
+		if (read_npn(va, (KA_T)v->v_data, &pc))
+		    return;
+		break;
+	    case N_SAMFS:
+		(void) add_nma(SAMFS_NMA_MSG, (int)strlen(SAMFS_NMA_MSG));
+
+#if	solaris>=110000
+	    case N_SDEV:
+		if (read_nsdn(va, (KA_T)v->v_data, &sdn, &sdva))
+		    return;
+		if (Lf->is_stream) {
+
+		/*
+		 * This stream's real node is an sdev_node, so it's not really
+		 * a stream.  Reverse prior stream settings.
+		 */
+		    Lf->is_stream = 0;
+		    Namech[0] = '\0';
+		}
+		sdns = 1;
+		break;
+#endif	/* solaris>=110000 */
+
+		break;
+
+#if	solaris>=20600
+	    case N_SOCK:
+		sona = (KA_T)v->v_data;
+		if (read_nson(va, sona, &so))
+		    return;
+		break;
+#endif	/* solaris>=20600 */
+
+	    case N_STREAM:
+		if (vs) {
+		    Lf->is_stream = 1;
+
+#if	solaris<100000
+		read_mi(vs, (dev_t *)&s.s_dev, (caddr_t)&soso, &so_st, so_ad,
+		    &sdp);
+#else	/* solaris>=100000 */
+		read_mi(vs, (dev_t *)&s.s_dev, NULL, NULL, NULL, &sdp);
+#endif	/* solaris<100000 */
+
+		    vs = (KA_T)NULL;
+		}
+		break;
+	    case N_TMP:
+		if (read_ntn(va, (KA_T)v->v_data, &t))
+		    return;
+		break;
+
+#if	defined(HASVXFS)
+	    case N_VXFS:
+		if (read_vxnode(va, v, vfs, fx, &vx, Vvops))
+		    return;
+		break;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	    case N_ZFS:
+		if (read_nzn(va, (KA_T)v->v_data, &zn))
+		    return;
+		zns = 1;
+		break;
+#endif	/* defined(HAS_ZFS) */
+
+	    case N_REGLR:
+	    default:
+		if (read_nin(va, (KA_T)v->v_data, &i))
+		    return;
+		ins = 1;
+	    }
+	/*
+	 * If this is a Solaris loopback node, use the "real" node type.
+	 */
+	    if (Ntype == N_LOFS)
+		Ntype = vty;
+	}
+/*
+ * Get device and type for printing.
+ */
+	switch (((Ntype == N_FIFO) || (vty == N_SDEV)) ? vty : Ntype) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    dev = an.dev;
+	    devs = 1;
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+#if	solaris>=20500
+	case N_AUTO:
+	    if (kvs) {
+		dev = (dev_t)kv.vfs_fsid.val[0];
+		devs = 1;
+	    }
+	    break;
+
+# if	solaris>=100000
+	case N_DEV:
+	    if (dv_devs) {
+		dev = dv_dev;
+		devs = 1;
+	    } else if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    rdev = v->v_rdev;
+	    rdevs = 1;
+	    break;
+# endif	/* solaris>=100000 */
+
+	case N_DOOR:
+
+# if	solaris<20600
+	    if (kvs) {
+		dev = (dev_t)kv.vfs_fsid.val[0];
+		devs = 1;
+	    }
+# else	/* solaris>=20600 */
+	    if (nns) {
+		dev = (dev_t)nn.nm_vattr.va_fsid;
+		devs = 1;
+	    } else if (dns) {
+		dev = (dev_t)dn.door_index;
+		devs = 1;
+	    }
+# endif	/* solaris<20600 */
+
+	    break;
+#endif	/* solaris>=20500 */
+
+	case N_CACHE:
+	case N_HSFS:
+	case N_PCFS:
+	    if (kvs) {
+		dev = kv.vfs_dev;
+		devs = 1;
+	    }
+	    break;
+
+#if	solaris>=100000
+	case N_CTFSADIR:
+	case N_CTFSBUND:
+	case N_CTFSCDIR:
+	case N_CTFSCTL:
+	case N_CTFSEVT:
+	case N_CTFSLATE:
+	case N_CTFSROOT:
+	case N_CTFSSTAT:
+	case N_CTFSSYM:
+	case N_CTFSTDIR:
+	case N_CTFSTMPL:
+	    if (kvs) {
+		dev = kv.vfs_dev;
+		devs = 1;
+	    }
+	    break;
+#endif	/* solaris>=100000 */
+
+
+	case N_FD:
+	    if (kvs) {
+		dev = kv.vfs_dev;
+		devs = 1;
+	    }
+	    if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    }
+	    break;
+
+	case N_MNT:
+
+#if	defined(CVFS_DEVSAVE)
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+#endif	/* defined(CVFS_DEVSAVE) */
+
+	    break;
+	case N_MVFS:
+
+#if	defined(CVFS_DEVSAVE)
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+#endif	/* defined(CVFS_DEVSAVE) */
+
+	    break;
+	case N_NFS:
+	    dev = r.r_attr.va_fsid;
+	    devs = 1;
+	    break;
+
+#if	solaris>=100000
+	case N_NFS4:
+	    dev = r4.r_attr.va_fsid;
+	    devs = 1;
+	    break;
+#endif	/* solaris>=100000 */
+
+	case N_NM:
+	    if (nns) {
+		dev = (dev_t)nn.nm_vattr.va_fsid;
+		devs = 1;
+	    } else
+		enter_dev_ch("    NMFS");
+	    break;
+
+#if	solaris>=100000
+	case N_PORT:
+	    if (kvs) {
+		dev = kv.vfs_dev;
+		devs = 1;
+	    }
+	    break;
+#endif	/* solaris>=100000 */
+
+
+#if	defined(HASPROCFS)
+	case N_PROC:
+	    if (kvs) {
+		dev = kv.vfs_dev;
+		devs = 1;
+	    }
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+	case N_SAMFS:
+	    if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    } else if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    break;
+
+#if	solaris>=110000
+	case N_SDEV:
+	    if (sdns) {
+		dev = sdva.va_fsid;
+		rdev = sdva.va_rdev;
+		devs = rdevs = 1;
+	    }
+	    break;
+#endif	/* solaris>=110000 */
+
+	case N_SHARED:
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    break;
+
+#if	solaris>=20600
+	case N_SOCK:
+	    if (so.so_family == AF_UNIX)
+
+	    /*
+	     * Process an AF_UNIX socket node.
+	     */
+
+# if	solaris>=110000
+	    {
+
+	    /*
+	     * Process a Solaris >= 11 AF_UNIX socket node:
+	     *
+	     * Get its sotpi_info_t structure;
+	     */
+		if (read_nsti(&so, &sti))
+		    return;
+	    /*
+	     * Get its device numbers.  If they are located, start the NAME
+	     * column with the device name, followed by "->".
+	     */
+		nm = Namech;
+		nmrl = Namechl - 1;
+		Namech[Namechl - 1] = '\0';
+		if (!sdp)
+		    sdp = finddev(&DevDev, &sti.sti_dev, LOOKDEV_ALL);
+		if (sdp) {
+		    dev = DevDev;
+		    rdev = v->v_rdev;
+		    trdev = sdp->rdev;
+		    devs = rdevs = trdevs = 1;
+		    Lf->inode = (INODETYPE)sdp->inode;
+		    Lf->inp_ty = 1;
+		    (void) snpf(nm, nmrl, "%s", sdp->name);
+		    tl = strlen(nm);
+		    nm += tl;
+		    nmrl -= tl;
+		    sep = "->";
+		} else {
+		    devs = rdevs = trdevs = 0;
+		    sep = "";
+		}
+	    /*
+	     * Add the socket node's address to the NAME column.
+	     */
+		sepl = strlen(sep);
+		if (sona && ((nmrl - sepl) > 0)) {
+		    (void) snpf(nm, nmrl, "%s%s", sep,
+			print_kptr(sona, (char *)NULL, 0));
+		    tl = strlen(nm);
+		    nm += tl;
+		    nmrl -= tl;
+		}
+	    /*
+	     * Add the service type to the NAME column.
+	     */
+		switch (sti.sti_serv_type) {
+		case T_CLTS:
+		    ty = "dgram";
+		    break;
+		case T_COTS:
+		    ty = "stream";
+		    break;
+		case T_COTS_ORD:
+		    ty = "stream-ord";
+		    break;
+		default:
+		    ty = (char *)NULL;
+		}
+		if (ty && (nmrl > 1)) {
+		    (void) snpf(nm, nmrl, " %s", ty);
+		    tl = strlen(nm);
+		    nm += tl;
+		    nmrl -= tl;
+		}
+	    /*
+	     * Add the vnode and connected addresses to the NAME column,
+	     * as indicated by the socket node state.
+	     */
+		if ((so.so_state & SS_ISBOUND)
+		&&  (nmrl > 36)
+		&&  (sti.sti_ux_laddr.soua_magic == SOU_MAGIC_EXPLICIT)
+		) {
+		    (void) snpf(nm, nmrl, " Vn=%s",
+				print_kptr((KA_T)sti.sti_ux_laddr.soua_vp,
+					   (char *)NULL, 0)
+			       );
+		    tl = strlen(nm);
+		    nm += tl;
+		    nmrl -= tl;
+		}
+		if ((so.so_state & SS_ISCONNECTED)
+		&&  (nmrl > 38)
+		&&  (sti.sti_ux_faddr.soua_magic == SOU_MAGIC_EXPLICIT)
+		) {
+		    (void) snpf(nm, nmrl, " Conn=%s ",
+				print_kptr((KA_T)sti.sti_ux_faddr.soua_vp,
+					   (char *)NULL, 0)
+			       );
+		    tl = strlen(nm);
+		    nm += tl;
+		    nmrl -= tl;
+		}
+	    /*
+	     * Put local and connected UNIX addresses in the NAME column, if
+	     * they exist and as indicated by the socket node's state.
+	     */
+		if ((so.so_state & SS_ISBOUND)
+		&&  ((len = read_nusa(&sti.sti_laddr, &ua)) > 0)
+		&&  (nmrl > (len + 5))
+		) {
+		    if (Sfile
+		    &&  is_file_named(ua.sun_path, Ntype, VSOCK, 0))
+			Lf->sf |= SELNM;
+		    if (len > nmrl)
+			len = nmrl;
+		    if (len > 0) {
+			ua.sun_path[len] = '\0';
+			(void) snpf(nm, nmrl, " Lcl=%s", ua.sun_path);
+			tl = strlen(nm);
+			nm += tl;
+			nmrl -= tl;
+		    }
+		}
+		if ((so.so_state & SS_ISCONNECTED)
+		&&  ((len = read_nusa(&sti.sti_faddr, &ua)) > 0)
+		&&  (nmrl > (len + 5))
+		) {
+		    if (Sfile
+		    &&  is_file_named(ua.sun_path, Ntype, VSOCK, 0))
+			Lf->sf |= SELNM;
+		    if (len > nmrl)
+			len = nmrl;
+		    if (len > 0) {
+			ua.sun_path[len] = '\0';
+			(void) snpf(nm, nmrl, " Rem=%s", ua.sun_path);
+			tl = strlen(nm);
+			nm += tl;
+			nmrl -= tl;
+		    }
+		}
+	    } else {
+
+	    /*
+	     * Process Solaris >= 11 AF_INET, AF_INET6 and AF_ROUTE VSOCK
+	     * nodes.
+	     */
+		switch (so.so_family) {
+		case AF_INET:
+		case AF_INET6:
+		case AF_ROUTE:
+		    if (process_VSOCK((KA_T)va, v, &so))
+			return;
+		}
+	    }
+# else	/* solaris<110000 */
+	    {
+
+	    /*
+	     * Process an AF_UNIX socket node for Solaris < 11:
+	     *	  Locate its device numbers;
+	     *    Enter the sonode address as the device (netstat's local
+	     *	  address);
+	     *    Get a non-NULL local sockaddr_un and enter it in Namech;
+	     *    Get a non-NULL foreign sockaddr_un and enter it in Namech;
+	     *    Check for matches on sockaddr_un.sun_path names.
+	     */
+
+		if (!sdp)
+		    sdp = finddev(&DevDev,
+
+#  if	solaris<100000
+				  &so.so_vnode.v_rdev,
+#  else	/* solaris>=100000 */
+				  &so.so_dev,
+#  endif	/* solaris<100000 */
+
+				  LOOKDEV_ALL);
+
+		if (sdp) {
+		    dev = DevDev;
+
+#  if	solaris<100000
+		    rdev = so.so_vnode.v_rdev;
+#  else	/* solaris>=100000 */
+		    rdev = so.so_dev;
+#  endif	/* solaris<100000 */
+
+		    trdev = sdp->rdev;
+		    devs = rdevs = trdevs = 1;
+		    Lf->inode = (INODETYPE)sdp->inode;
+		    Lf->inp_ty = 1;
+		    (void) snpf(Namech, Namechl - 1, "%s", sdp->name);
+		    Namech[Namechl - 1] = '\0';
+		} else
+		    devs = 0;
+		nl = snl = (int)strlen(Namech);
+
+		if ((len = read_nusa(&so.so_laddr, &ua)))
+		{
+		    if (Sfile
+		    &&  is_file_named(ua.sun_path, Ntype, VSOCK, 0))
+			Lf->sf |= SELNM;
+		    sepl = Namech[0] ? 2 : 0;
+		    if (len > (Namechl - nl - sepl - 1))
+			len = Namechl - nl - sepl - 1;
+		    if (len > 0) {
+			ua.sun_path[len] = '\0';
+			(void) snpf(&Namech[nl], Namechl - nl, "%s%s",
+			    sepl ? "->" : "", ua.sun_path);
+			nl += (len + sepl);
+		    }
+		}
+		if ((len = read_nusa(&so.so_faddr, &ua)))
+		{
+		    if (Sfile
+		    &&  is_file_named(ua.sun_path, Ntype, VSOCK, 0))
+			Lf->sf |= SELNM;
+		    sepl = Namech[0] ? 2 : 0;
+		    if (len > (Namechl - nl - sepl - 1))
+			len = Namechl - nl - sepl - 1;
+		    if (len > 0) {
+			ua.sun_path[len] = 0;
+			(void) snpf(&Namech[nl], Namechl - nl, "%s%s",
+			    sepl ? "->" : "", ua.sun_path);
+			nl += (len + sepl);
+		    }
+		}
+		if ((nl == snl)
+
+#  if	defined(HASSOUXSOUA)
+		&&  so.so_ux_laddr.soua_magic == SOU_MAGIC_IMPLICIT
+#  else	/* !defined(HASSOUXSOUA) */
+		&&  so.so_ux_laddr.sou_magic == SOU_MAGIC_IMPLICIT
+#  endif	/* defined(HASSOUXSOUA) */
+
+		) {
+
+		/*
+		 * There are no addresses; this must be a socket pair.
+		 * Print its identity.
+		 */
+		    pa = (struct pairaddr *)&ua;
+		    if (!(peer = (KA_T)((int)pa->p)))
+
+#  if	defined(HASSOUXSOUA)
+			peer = (KA_T)so.so_ux_laddr.soua_vp;
+#  else	/* !defined(HASSOUXSOUA) */
+			peer = (KA_T)so.so_ux_laddr.sou_vp;
+#  endif	/* defined(HASSOUXSOUA) */
+
+		    if (peer)
+			(void) snpf(ubuf, sizeof(ubuf), "(socketpair: %s)",
+			    print_kptr(peer, (char *)NULL, 0));
+		    else
+			(void) snpf(ubuf, sizeof(ubuf), "(socketpair)");
+		    len = (int)strlen(ubuf);
+		    sepl = Namech[0] ? 2 : 0;
+		    if (len > (Namechl - nl - sepl - 1))
+			len = Namechl - nl - sepl - 1;
+		    if (len > 0) {
+			(void) snpf(&Namech[nl], Namechl - nl, "%s%s",
+			    sepl ? "->" : "", ubuf);
+			nl += (len + sepl);
+		    }
+		}
+	    /*
+	     * Add the local and foreign addresses, ala `netstat -f unix` to
+	     * the name.
+	     */
+
+#  if	defined(HASSOUXSOUA)
+		soa = (KA_T)so.so_ux_faddr.soua_vp;
+#  else	/* !defined(HASSOUXSOUA) */
+		soa = (KA_T)so.so_ux_faddr.sou_vp;
+#  endif	/* defined(HASSOUXSOUA) */
+
+		(void) snpf(ubuf, sizeof(ubuf), "%s(%s%s%s)",
+		    Namech[0] ? " " : "",
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0),
+		    soa ? "->" : "",
+		    soa ? print_kptr(soa, tbuf, sizeof(tbuf)) : "");
+		len = (int)strlen(ubuf);
+		if (len <= (Namechl - nl - 1)) {
+		    (void) snpf(&Namech[nl], Namechl - nl, "%s", ubuf);
+		    nl += len;
+		}
+	    /*
+	     * If there is a bound vnode, add its address to the name.
+	     */
+
+		if (so.so_ux_bound_vp) {
+		    (void) snpf(ubuf, sizeof(ubuf), "%s(Vnode=%s)",
+			Namech[0] ? " " : "",
+			print_kptr((KA_T)so.so_ux_bound_vp, (char *)NULL, 0));
+		    len = (int)strlen(ubuf);
+		    if (len <= (Namechl - nl - 1)) {
+			(void) snpf(&Namech[nl], Namechl - nl, "%s", ubuf);
+			nl += len;
+		    }
+		}
+	    }
+# endif	/* solaris>=110000 */
+
+	    break;
+
+#endif	/* solaris>=20600 */
+
+	case N_SPEC:
+
+#if	solaris<100000
+	    if (((Ntype = vty) == N_STREAM) && so_st) {
+		if (Funix)
+		    Lf->sf |= SELUNX;
+		unix_sock = 1;
+		if (so_ad[0]) {
+		    if (sdp) {
+			if (vfs) {
+			    dev = vfs->dev;
+			    devs = 1;
+			}
+			rdev = sdp->rdev;
+			rdevs = 1;
+			Lf->inode = (INODETYPE)sdp->inode;
+			Lf->inp_ty = 1;
+			(void) snpf(ubuf, sizeof(ubuf), "(%s%s%s)",
+			    print_kptr(so_ad[0], (char *)NULL, 0),
+			    so_ad[1] ? "->" : "",
+			    so_ad[1] ? print_kptr(so_ad[1], tbuf, sizeof(tbuf))
+				     : "");
+		    } else {
+			enter_dev_ch(print_kptr(so_ad[0], (char *)NULL, 0));
+			if (so_ad[1])
+			    (void) snpf(ubuf, sizeof(ubuf), "(->%s)",
+				print_kptr(so_ad[1], (char *)NULL, 0));
+		    }
+		    if (!Lf->nma && (Lf->nma = (char *)
+					       malloc((int)strlen(ubuf) + 1)))
+		    {
+			(void) snpf(Lf->nma, (int)strlen(ubuf) + 1, "%s", ubuf);
+		    }
+		} else if (soso.lux_dev.addr.tu_addr.ino) {
+		    if (vfs) {
+			dev = vfs->dev;
+			devs = 1;
+		    }
+		    rdev = soso.lux_dev.addr.tu_addr.dev;
+		    rdevs = 1;
+		} else {
+		    int dc, dl, dr;
+
+#if	solaris<20400
+		    dl = (soso.lux_dev.addr.tu_addr.dev >> 16) & 0xffff;
+		    dr = (soso.rux_dev.addr.tu_addr.dev >> 16) & 0xffff;
+#else	/* solaris>=20400 */
+		    dl = soso.lux_dev.addr.tu_addr.dev & 0xffff;
+		    dr = soso.rux_dev.addr.tu_addr.dev & 0xffff;
+#endif	/* solaris<20400 */
+
+		    dc = (dl << 16) | dr;
+		    enter_dev_ch(print_kptr((KA_T)dc, (char *)NULL, 0));
+		    devs = 0;
+		}
+		if (soso.laddr.buf && soso.laddr.len == sizeof(ua)) {
+		    if (kread((KA_T)soso.laddr.buf, (char *)&ua, sizeof(ua))
+		    == 0) {
+			ua.sun_path[sizeof(ua.sun_path) - 1] = '\0';
+			if (ua.sun_path[0]) {
+			    if (Sfile
+			    &&  is_file_named(ua.sun_path, Ntype, type, 0))
+				Lf->sf |= SELNM;
+			    len = (int)strlen(ua.sun_path);
+			    nl = (int)strlen(Namech);
+			    sepl = Namech[0] ? 2 : 0;
+			    if (len > (Namechl - nl - sepl - 1))
+				len = Namechl - nl - sepl - 1;
+			    if (len > 0) {
+				ua.sun_path[len] = '\0';
+				(void) snpf(&Namech[nl], Namechl - nl, "%s%s",
+				    sepl ? "->" : "", ua.sun_path);
+			    }
+			}
+		    }
+		}
+	    } else
+#endif	/* solaris<100000 */
+
+	    {
+		if (vfs) {
+		    dev = vfs->dev;
+		    devs = 1;
+		}
+		rdev = s.s_dev;
+		rdevs = 1;
+	    }
+	    break;
+	case N_STREAM:
+	    if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    rdev = s.s_dev;
+	    rdevs = 1;
+	    break;
+	case N_TMP:
+	    dev = t.tn_attr.va_fsid;
+	    devs = 1;
+	    break;
+
+#if	defined(HASVXFS)
+	case N_VXFS:
+	    dev = vx.dev;
+	    devs = vx.dev_def;
+	    if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+		rdev = vx.rdev;
+		rdevs = vx.rdev_def;
+	    }
+	    break;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	case N_ZFS:
+	    if (zns) {
+		if (!read_nzvfs((KA_T)v->v_data, (KA_T)zn.z_zfsvfs, &zvfs)
+		&&  zvfs.z_vfs
+		&&  !kread((KA_T)zvfs.z_vfs, (char *)&zgvfs, sizeof(zgvfs))
+		) {
+		    dev = zgvfs.vfs_dev;
+		    devs = 1;
+		}
+	    }
+	    if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_ZFS) */
+
+	default:
+	    if (ins) {
+		dev = i.i_dev;
+		devs = 1;
+	    } else if (nns) {
+		dev = nn.nm_vattr.va_fsid;
+		devs = 1;
+	    } else if (vfs) {
+		dev = vfs->dev;
+		devs = 1;
+	    }
+	    if ((v->v_type == VCHR) || (v->v_type == VBLK)) {
+		rdev = v->v_rdev;
+		rdevs = 1;
+	    }
+	}
+	type = v->v_type;
+	if (devs && vfs && !vfs->dir) {
+	    (void) completevfs(vfs, &dev);
+
+#if	defined(HAS_AFS)
+	    if (vfs->dir && (Ntype == N_AFS || vty == N_AFS) && !AFSVfsp)
+		AFSVfsp = (KA_T)v->v_vfsp;
+#endif	/* defined(HAS_AFS) */
+
+	}
+/*
+ * Obtain the inode number.
+ */
+	switch (vty) {
+
+#if	defined(HAS_AFS)
+	case N_AFS:
+	    if (an.ino_st) {
+		Lf->inode = (INODETYPE)an.inode;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_AFS) */
+
+#if	solaris>=20500
+	case N_AUTO:
+
+# if	solaris<20600
+	    Lf->inode = (INODETYPE)au.an_nodeid;
+# else	/* solaris>=20600 */
+	    Lf->inode = (INODETYPE)fnn.fn_nodeid;
+# endif	/* solaris<20600 */
+
+	    Lf->inp_ty = 1;
+	    break;
+
+# if	solaris>=100000
+	case N_DEV:
+	    if (dvs) {
+		Lf->inode = (INODETYPE)dv.dv_ino;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+# endif	/* solaris>=100000 */
+
+	case N_DOOR:
+	    if (nns && (Lf->inode = (INODETYPE)nn.nm_vattr.va_nodeid)) {
+		Lf->inp_ty = 1;
+		break;
+	    }
+	    if (dns) {
+		if ((Lf->inode = (INODETYPE)dn.door_index)) 
+		    Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* solaris>=20500 */
+
+	case N_CACHE:
+	    Lf->inode = (INODETYPE)cn.c_fileno;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	solaris>=100000
+	case N_CTFSADIR:
+	case N_CTFSBUND:
+	case N_CTFSCDIR:
+	case N_CTFSCTL:
+	case N_CTFSEVT:
+	case N_CTFSLATE:
+	case N_CTFSROOT:
+	case N_CTFSSTAT:
+	case N_CTFSSYM:
+	case N_CTFSTDIR:
+	case N_CTFSTMPL:
+	    /* Method of computing CTFS inode not known. */
+	    break;
+#endif	/* solaris>=10000 */
+
+	case N_FD:
+	    if (v->v_type == VDIR)
+		Lf->inode = (INODETYPE)2;
+	    else
+		Lf->inode = (INODETYPE)(GET_MIN_DEV(v->v_rdev) * 100);
+	    Lf->inp_ty = 1;
+	    break;
+	case N_HSFS:
+	    Lf->inode = (INODETYPE)h.hs_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+
+	case N_MNT:
+
+#if	defined(HASFSINO)
+	    if (vfs) {
+		Lf->inode = vfs->fs_ino;
+		Lf->inp_ty = 1;
+	    }
+#endif	/* defined(HASFSINO) */
+
+	    break;
+	case N_MVFS:
+	    Lf->inode = (INODETYPE)m.m_ino;
+	    Lf->inp_ty = 1;
+	    break;
+	case N_NFS:
+	    Lf->inode = (INODETYPE)r.r_attr.va_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	solaris>=100000
+	case N_NFS4:
+	    Lf->inode = (INODETYPE)r4.r_attr.va_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+#endif	/* solaris>=100000 */
+
+	case N_NM:
+	    Lf->inode = (INODETYPE)nn.nm_vattr.va_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	defined(HASPROCFS)
+	case N_PROC:
+
+	/*
+	 * The proc file system inode number is defined when the
+	 * prnode is read.
+	 */
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+	case N_PCFS:
+	    if (kvs && kv.vfs_data
+	    && !kread((KA_T)kv.vfs_data, (char *)&pcfs, sizeof(pcfs))) {
+
+#if	solaris>=70000
+# if	defined(HAS_PC_DIRENTPERSEC)
+		Lf->inode = (INODETYPE)pc_makenodeid(pc.pc_eblkno,
+			    pc.pc_eoffset,
+			    pc.pc_entry.pcd_attr,
+			    IS_FAT32(&pcfs)
+				? ltohs(pc.pc_entry.pcd_scluster_lo) |
+				  (ltohs(pc.pc_entry.un.pcd_scluster_hi) << 16)
+				: ltohs(pc.pc_entry.pcd_scluster_lo),
+			    pc_direntpersec(&pcfs));
+# else	/* !defined(HAS_PC_DIRENTPERSEC) */
+		Lf->inode = (INODETYPE)pc_makenodeid(pc.pc_eblkno,
+			    pc.pc_eoffset,
+			    pc.pc_entry.pcd_attr,
+			    IS_FAT32(&pcfs)
+				? ltohs(pc.pc_entry.pcd_scluster_lo) |
+				  (ltohs(pc.pc_entry.un.pcd_scluster_hi) << 16)
+				: ltohs(pc.pc_entry.pcd_scluster_lo),
+			    pcfs.pcfs_entps);
+# endif	/* defined(HAS_PC_DIRENTPERSEC) */
+#else	/* solaris<70000 */
+		Lf->inode = (INODETYPE)pc_makenodeid(pc.pc_eblkno,
+			    pc.pc_eoffset,
+			    &pc.pc_entry,
+			    pcfs.pcfs_entps);
+#endif	/* solaris>=70000 */
+
+		Lf->inp_ty = 1;
+	    }
+	    break;
+
+	case N_REGLR:
+	    if (nns) {
+		if ((Lf->inode = (INODETYPE)nn.nm_vattr.va_nodeid))
+		    Lf->inp_ty = 1;
+	    } else if (ins) {
+		if ((Lf->inode = (INODETYPE)i.i_number))
+		    Lf->inp_ty = 1;
+	    }
+	    break;
+	case N_SAMFS:
+	    break;		/* No more SAM-FS information is available. */
+
+#if	solaris>=110000
+	case N_SDEV:
+	    if (sdns) {
+		Lf->inode = (INODETYPE)sdva.va_nodeid;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* solaris>=110000 */
+
+	case N_SHARED:
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "SHARED");
+	    Lf->inp_ty = 2;
+	    break;
+	case N_STREAM:
+
+#if	solaris<100000
+	    if (so_st && soso.lux_dev.addr.tu_addr.ino) {
+		if (Lf->inp_ty) {
+		    nl = Lf->nma ? (int)strlen(Lf->nma) : 0;
+		    (void) snpf(ubuf, sizeof(ubuf),
+			"%s(Inode=%lu)", nl ? " " : "",
+			(unsigned long)soso.lux_dev.addr.tu_addr.ino);
+		    len = nl + (int)strlen(ubuf) + 1;
+		    if (Lf->nma)
+			Lf->nma = (char *) realloc(Lf->nma, len);
+		    else
+			Lf->nma = (char *) malloc(len);
+		    if (Lf->nma)
+			(void) snpf(&Lf->nma[nl], len - nl, "%s", ubuf);
+		} else {
+		    Lf->inode = (INODETYPE)soso.lux_dev.addr.tu_addr.ino;
+		    Lf->inp_ty = 1;
+		}
+	    }
+#endif	/* solaris<100000 */
+
+	    break;
+	case N_TMP:
+	    Lf->inode = (INODETYPE)t.tn_attr.va_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	defined(HASVXFS)
+	case N_VXFS:
+	    if (vx.ino_def) {
+		Lf->inode = (INODETYPE)vx.ino;
+		Lf->inp_ty = 1;
+	    } else if (type == VCHR)
+		pnl = 1;
+	    break;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	case N_ZFS:
+	    if (zns) {
+		Lf->inode = (INODETYPE)zn.z_id;
+		Lf->inp_ty = 1;
+	    }
+	    break;
+#endif	/* defined(HAS_ZFS) */
+
+	}
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->sz = (SZOFFTYPE)an.size;
+		Lf->sz_def = 1;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+#if	solaris>=20500
+	    case N_AUTO:
+
+# if	solaris<20600
+		Lf->sz = (SZOFFTYPE)au.an_size;
+# else	/* solaris >=20600 */
+		Lf->sz = (SZOFFTYPE)fnn.fn_size;
+# endif	/* solaris < 20600 */
+
+		Lf->sz_def = 1;
+		break;
+#endif	/* solaris>=20500 */
+
+	    case N_CACHE:
+		Lf->sz = (SZOFFTYPE)cn.c_size;
+		Lf->sz_def = 1;
+		break;
+
+#if	solaris>=100000
+	    case N_CTFSADIR:
+	    case N_CTFSBUND:
+	    case N_CTFSCDIR:
+	    case N_CTFSCTL:
+	    case N_CTFSEVT:
+	    case N_CTFSLATE:
+	    case N_CTFSROOT:
+	    case N_CTFSSTAT:
+	    case N_CTFSSYM:
+	    case N_CTFSTDIR:
+	    case N_CTFSTMPL:
+		/* Method of computing CTFS size not known. */
+		break;
+#endif	/* solaris>=100000 */
+
+	    case N_FD:
+		if (v->v_type == VDIR)
+		    Lf->sz = (Unof + 2) * 16;
+		else
+		    Lf->sz = (unsigned long)0;
+		Lf->sz_def = 1;
+		break;
+
+#if	solaris>=20600
+	    case N_SOCK:
+		Lf->off_def = 1;
+		break;
+#endif	/* solaris>=20600 */
+
+	    case N_HSFS:
+		Lf->sz = (SZOFFTYPE)h.hs_dirent.ext_size;
+		Lf->sz_def = 1;
+		break;
+	    case N_NM:
+		Lf->sz = (SZOFFTYPE)nn.nm_vattr.va_size;
+		Lf->sz_def = 1;
+		break;
+
+# if	solaris>=100000
+	     case N_DEV:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+# endif	/* solaris>=100000 */
+
+	    case N_DOOR:
+	    case N_FIFO:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_MNT:
+
+#if	defined(CVFS_SZSAVE)
+		if (vfs) {
+		    Lf->sz = (SZOFFTYPE)vfs->size;
+		    Lf->sz_def = 1;
+		} else
+#endif	/* defined(CVFS_SZSAVE) */
+
+		    Lf->off_def = 1;
+		break;
+	    case N_MVFS:
+		/* The location of file size isn't known. */
+		break;
+	    case N_NFS:
+		if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		else {
+		    Lf->sz = (SZOFFTYPE)r.r_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+
+#if	solaris>=100000
+	    case N_NFS4:
+		if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		else {
+		    Lf->sz = (SZOFFTYPE)r4.r_size;
+		    Lf->sz_def = 1;
+		}
+		break;
+#endif	/* solaris>=100000 */
+
+	    case N_PCFS:
+		Lf->sz = (SZOFFTYPE)pc.pc_size;
+		Lf->sz_def = 1;
+		break;
+
+#if	solaris>=100000
+	    case N_PORT:
+		Lf->sz = (SZOFFTYPE)pn.port_curr;
+		Lf->sz_def = 1;
+		break;
+#endif	/* solaris>=100000 */
+
+
+#if	defined(HASPROCFS)
+	    case N_PROC:
+
+	    /*
+	     * The proc file system size is defined when the
+	     * prnode is read.
+	     */
+		break;
+#endif	/* defined(HASPROCFS) */
+
+	    case N_REGLR:
+		if (type == VREG || type == VDIR) {
+		    if (ins | nns) {
+			Lf->sz = (SZOFFTYPE)(nns ? nn.nm_vattr.va_size
+						 : i.i_size);
+			Lf->sz_def = 1;
+		    }
+		} else if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		break;
+
+#if	solaris>=110000
+	    case N_SDEV:
+		if (sdns) {
+		    if (type == VREG || type == VDIR) {
+			Lf->sz = (SZOFFTYPE)sdva.va_size;
+			Lf->sz_def = 1;
+		    } else if ((type == VCHR || type == VBLK) && !Fsize)
+			Lf->off_def = 1;
+		}
+		break;
+#endif	/* solaris>=110000 */
+
+	    case N_SAMFS:
+		break;		/* No more SAM-FS information is available. */
+	    case N_SHARED:
+		break;		/* No more sharedfs information is available. */
+	    case N_STREAM:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_TMP:
+		Lf->sz = (SZOFFTYPE)t.tn_attr.va_size;
+		Lf->sz_def = 1;
+		break;
+
+#if	defined(HASVXFS)
+	    case N_VXFS:
+		if (type == VREG || type == VDIR) {
+		    Lf->sz = (SZOFFTYPE)vx.sz;
+		    Lf->sz_def = vx.sz_def;
+		} else if ((type == VCHR || type == VBLK) && !Fsize)
+		    Lf->off_def = 1;
+		break;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	    case N_ZFS:
+		if (zns) {
+		    if (type == VREG || type == VDIR) {
+			Lf->sz = (SZOFFTYPE)zn.z_size;
+			Lf->sz_def = 1;
+		    } else if ((type == VCHR || type == VBLK) && !Fsize)
+			Lf->off_def = 1;
+		}
+		break;
+#endif	/* defined(HAS_ZFS) */
+
+	    }
+	}
+/*
+ * Record link count.
+ */
+
+#if	!defined(HASXOPT)
+	if (Fnlink)
+#endif	/* !defined(HASXOPT) */
+
+	{
+	    switch (Ntype) {
+
+#if	defined(HAS_AFS)
+	    case N_AFS:
+		Lf->nlink = an.nlink;
+		Lf->nlink_def = an.nlink_st;
+		break;
+#endif	/* defined(HAS_AFS) */
+
+#if	solaris>=20500
+	    case N_AUTO:
+		break;
+	    case N_CACHE:
+		Lf->nlink = (long)cn.c_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+#endif	/* solaris>=20500 */
+
+#if	solaris>=100000
+	    case N_CTFSADIR:
+	    case N_CTFSBUND:
+	    case N_CTFSCDIR:
+	    case N_CTFSCTL:
+	    case N_CTFSEVT:
+	    case N_CTFSLATE:
+	    case N_CTFSROOT:
+	    case N_CTFSSTAT:
+	    case N_CTFSSYM:
+	    case N_CTFSTDIR:
+	    case N_CTFSTMPL:
+		/* Method of computing CTFS link count not known. */
+		break;
+#endif	/* solaris>=100000 */
+
+	case N_FD:
+	    Lf->nlink = (v->v_type == VDIR) ? 2 : 1;
+	    Lf->nlink_def = 1;
+	    break;
+
+#if	solaris>=20600
+	    case N_SOCK:			/* no link count */
+		break;
+#endif	/* solaris>=20600 */
+
+	    case N_HSFS:
+		Lf->nlink = (long)h.hs_dirent.nlink;
+		Lf->nlink_def = 1;
+		break;
+	    case N_NM:
+		Lf->nlink = (long)nn.nm_vattr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+
+# if	solaris>=100000
+	    case N_DEV:
+		if (dvs) {
+		    Lf->nlink = (long)dv.dv_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+# endif	/* solaris>=100000 */
+
+	    case N_DOOR:
+		Lf->nlink = (long)v->v_count;
+		Lf->nlink_def = 1;
+		break;
+	    case N_FIFO:
+		break;
+	    case N_MNT:
+
+#if	defined(CVFS_NLKSAVE)
+		if (vfs) {
+		    Lf->nlink = (long)vfs->nlink;
+		    Lf->nlink_def = 1;
+		}
+#endif	/* defined(CVFS_NLKSAVE) */
+
+		break;
+	    case N_MVFS:			/* no link count */
+		break;
+	    case N_NFS:
+		Lf->nlink = (long)r.r_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+
+#if	solaris>=100000
+	    case N_NFS4:
+		Lf->nlink = (long)r4.r_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+#endif	/* solaris>=100000 */
+
+	    case N_PCFS:
+		break;
+
+#if	defined(HASPROCFS)
+	    case N_PROC:
+		break;
+#endif	/* defined(HASPROCFS) */
+
+	    case N_REGLR:
+		if (ins) {
+		    Lf->nlink = (long)i.i_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+	    case N_SAMFS:
+		break;		/* No more SAM-FS information is available. */
+
+#if	solaris>=110000
+	    case N_SDEV:
+		if (sdns) {
+		    Lf->nlink = (long)sdva.va_nlink;
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* solaris>=110000 */
+
+	    case N_SHARED:
+		break;		/* No more sharedfs information is available. */
+	    case N_STREAM:
+		break;
+	    case N_TMP:
+		Lf->nlink = (long)t.tn_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+
+#if	defined(HASVXFS)
+	    case N_VXFS:
+		Lf->nlink = vx.nl;
+		Lf->nlink_def = vx.nl_def;
+		break;
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HAS_ZFS)
+	    case N_ZFS:
+		if (zns) {
+		    Lf->nlink = (long)MIN(zn.z_links, UINT32_MAX);
+		    Lf->nlink_def = 1;
+		}
+		break;
+#endif	/* defined(HAS_ZFS) */
+
+	    }
+	    if (Nlink && Lf->nlink_def && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+
+#if	defined(HASVXFS)
+/*
+ * Record a VxFS file.
+ */
+
+# if	defined(HASVXFSDNLC)
+	Lf->is_vxfs = (Ntype == N_VXFS) ? 1 : 0;
+# endif	/* defined(HASVXFSDNLC) */
+#endif	/* defined(HASVXFS) */
+
+/*
+ * Record an NFS selection.
+ */
+	if (Fnfs) {
+	    if ((Ntype == N_NFS) || (Ntype == N_NFS4))
+		Lf->sf |= SELNFS;
+	}
+
+#if	solaris>=20500
+/*
+ * If this is a Solaris 2.5 and greater autofs entry, save the autonode name
+ * (less than Solaris 2.6) or fnnode name (Solaris 2.6 and greater).
+ */
+	if (Ntype == N_AUTO && !Namech[0]) {
+
+# if	solaris<20600
+	    if (au.an_name[0])
+		(void) snpf(Namech, Namechl - 1, "%s", au.an_name);
+		Namech[Namechl - 1] = '\0';
+# else  /* solaris>=20600 */
+	    if (fnn.fn_name
+	    &&  (len = fnn.fn_namelen) > 0
+	    &&  len < (Namechl - 1))
+	    {
+		if (kread((KA_T)fnn.fn_name, Namech, len))
+		    Namech[0] = '\0';
+		else
+		    Namech[len] = '\0';
+	    }
+# endif /* solaris<20600 */
+
+	}
+/*
+ * If there is no local virtual file system pointer, or if its directory and
+ * file system names are NULL, and if there is a namenode, and if we're using
+ * the device number from it, see if its nm_mountpt vnode pointer leads to a
+ * local virtual file system structure with non-NULL directory and file system
+ * names.  If it does, switch to that local virtual file system pointer.
+ */
+	if (nns && (!vfs || (!vfs->dir && !vfs->fsname))
+	&&  devs && (dev == nn.nm_vattr.va_fsid)
+	&&  nn.nm_mountpt)
+	{
+	    if (!readvnode((KA_T)nn.nm_mountpt, &fv) && fv.v_vfsp) {
+		if ((nvfs = readvfs((KA_T)fv.v_vfsp, (struct vfs *)NULL, 
+				    nn.nm_filevp))
+		&&  !nvfs->dir)
+		{
+		    (void) completevfs(nvfs, &dev);
+		}
+
+# if	defined(HASNCACHE)
+		if (nvfs && nvfs->dir && nvfs->fsname) {
+		    fa = (char *)NULL;
+		    vfs = nvfs;
+		}
+# endif	/* defined(HASNCACHE) */
+
+	    }
+	}
+
+# if	defined(HASNCACHE)
+/*
+ * If there's a namenode and its device and node number match this one,
+ * use the nm_mountpt's address for name cache lookups.
+ */
+	if (nns && devs && (dev == nn.nm_vattr.va_fsid) && (Lf->inp_ty == 1)
+	&&  (Lf->inode == (INODETYPE)nn.nm_vattr.va_nodeid))
+	    Lf->na = (KA_T)nn.nm_mountpt;
+# endif	/* defined(HASNCACHE) */
+#endif	/* solaris>=20500 */
+
+/*
+ * Save the file system names.
+ */
+	if (vfs) {
+	    Lf->fsdir = vfs->dir;
+	    Lf->fsdev = vfs->fsname;
+
+#if	defined(HASMNTSTAT)
+	    Lf->mnt_stat = vfs->mnt_stat;
+#endif	/* defined(HASMNTSTAT) */
+
+	    if (!Lf->fsdir && !Lf->fsdev && kvs && fxs) {
+
+	    /*
+	     * The file system names are unknown.
+	     *
+	     * Set the file system device to the file system type and clear
+	     * the doubtful device numbers.
+	     */
+		Lf->fsdev = Fsinfo[fx];
+		devs = 0;
+		rdevs = 0;
+	    }
+
+#if	defined(HASFSINO)
+	    else
+		Lf->fs_ino = vfs->fs_ino;
+#endif	/* defined(HASFSINO) */
+
+	}
+/*
+ * Save the device numbers, and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	switch (type) {
+
+	case VNON:
+	    ty ="VNON";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+	case VREG:
+	case VDIR:
+	    ty = (type == VREG) ? "VREG" : "VDIR";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    if (unix_sock) {
+		ty = "unix";
+		break;
+	    }
+	    ty = "VCHR";
+	    if (Lf->is_stream == 0 && Lf->is_com == 0)
+		Ntype = N_CHR;
+	    break;
+
+#if	solaris>=20500
+	case VDOOR:
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    ty = "DOOR";
+	    if (dns)
+		(void) idoorkeep(&dn);
+	    break;
+#endif	/* solaris>=20500 */
+
+	case VLNK:
+	    ty = "VLNK";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+
+#if	solaris>=100000
+	case VPORT:
+	    ty = "PORT";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+#endif	/* solaris>=100000 */
+
+#if	solaris>=20600
+	case VPROC:
+
+	/*
+	 * The proc file system type is defined when the prnode is read.
+	 */
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    ty = (char *)NULL;
+	    break;
+#endif	/* solaris>=20600 */
+
+#if	defined(HAS_VSOCK)
+	case VSOCK:
+
+# if	solaris>=20600
+	    if (so.so_family == AF_UNIX) {
+		ty = "unix";
+		if (Funix)
+		    Lf->sf |= SELUNX;
+	    } else {
+		if (so.so_family == AF_INET) {
+
+#  if	defined(HASIPv6)
+		    ty = "IPv4";
+#  else	/* !defined(HASIPv6) */
+		    ty = "inet";
+#  endif	/* defined(HASIPv6) */
+
+		    (void) snpf(Namech, Namechl - 1, printsockty(so.so_type));
+		    Namech[Namechl - 1] = '\0';
+		    if (TcpStIn || UdpStIn || TcpStXn || UdpStXn)
+			Lf->sf |= SELEXCLF;
+		    else if (Fnet && (FnetTy != 6))
+			Lf->sf |= SELNET;
+		}
+
+#  if	defined(HASIPv6)
+		else if (so.so_family == AF_INET6) {
+		    ty = "IPv6";
+		    (void) snpf(Namech, Namechl - 1, printsockty(so.so_type));
+		    Namech[Namechl - 1] = '\0';
+		    if (TcpStIn || UdpStIn || TcpStXn || UdpStXn)
+			Lf->sf |= SELEXCLF;
+		    else if (Fnet && (FnetTy != 4))
+			Lf->sf |= SELNET;
+		}
+#  endif	/* defined(HASIPv6) */
+
+		else {
+		    ty = "sock";
+		    (void) printunkaf(so.so_family, 0);
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, ", %s", printsockty(so.so_type));
+		}
+	    }
+# endif	/* solaris>=20600 */
+
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+#endif	/* defined(HAS_VSOCK) */
+
+	case VBAD:
+	    ty = "VBAD";
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    break;
+	case VFIFO:
+	    ty = "FIFO";
+	    if (!Lf->dev_ch || Lf->dev_ch[0] == '\0') {
+		Lf->dev = dev;
+		Lf->dev_def = devs;
+		Lf->rdev = rdev;
+		Lf->rdev_def = rdevs;
+	    }
+	    break;
+	default:
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+/*
+ * If this a Solaris common vnode/snode void some information.
+ */
+	if (Lf->is_com)
+	    Lf->sz_def = Lf->inp_ty = 0;
+/*
+ * If a file attach description remains, put it in the NAME column addition.
+ */
+	if (fa)
+	    (void) add_nma(fa, fal);
+
+#if	defined(HASBLKDEV)
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VBLK))
+	    find_bl_ino();
+#endif	/* defined(HASBLKDEV) */
+
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR)) {
+	    find_ch_ino();
+	/*
+	 * If the VCHR inode number still isn't known and this is a COMMON
+	 * vnode file or a stream, or if a pseudo node ID lookup has been
+	 * requested, see if an inode number can be derived from a pseudo
+	 * or clone device node.
+	 *
+	 * If it can, save the pseudo or clone device for temporary
+	 * use when searching for a match with a named file argument.
+	 */
+	    if ((Lf->inp_ty == 0) && (Lf->is_com || Lf->is_stream || pnl)
+	    &&  (Clone || Pseudo))
+	    {
+		if (!sdp) {
+		    if (rdevs || devs) {
+			if (Lf->is_stream && !pnl)
+			    sdp = finddev(devs  ? &dev  : &DevDev,
+					  rdevs ? &rdev : &Lf->dev,
+					  LOOKDEV_CLONE);
+			else
+			    sdp = finddev(devs  ? &dev  : &DevDev,
+					  rdevs ? &rdev : &Lf->dev,
+					  LOOKDEV_PSEUDO);
+			if (!sdp)
+			    sdp = finddev(devs  ? &dev  : &DevDev,
+					  rdevs ? &rdev : &Lf->dev,
+					  LOOKDEV_ALL);
+			if (sdp) {
+			    if (!rdevs) {
+				Lf->rdev = Lf->dev;
+				Lf->rdev_def = rdevs = 1;
+			    }
+			    if (!devs) {
+				Lf->dev = DevDev;
+				devs = Lf->dev_def = 1;
+			    }
+			}
+		    }
+		} else {
+
+		/*
+		 * A local device structure has been located.  Make sure
+		 * that it's accompanied by device settings.
+		 */
+		    if (!devs && vfs) {
+			dev = Lf->dev = vfs->dev;
+			devs = Lf->dev_def = 1;
+		    }
+		    if (!rdevs) {
+			Lf->rdev = rdev = sdp->rdev;
+			Lf->rdev_def = rdevs = 1;
+		    }
+		}
+		if (sdp) {
+
+		/*
+		 * Process the local device information.
+		 */
+		    trdev = sdp->rdev;
+		    Lf->inode = sdp->inode;
+		    Lf->inp_ty = trdevs = 1;
+		    if (!Namech[0] || Lf->is_com) {
+			(void) snpf(Namech, Namechl - 1, "%s", sdp->name);
+			Namech[Namechl - 1] = '\0';
+		    }
+		    if (Lf->is_com && !Lf->nma) {
+			len = (int)strlen("(COMMON)") + 1;
+			if (!(Lf->nma = (char *) malloc(len))) {
+			    (void) fprintf(stderr,
+				"%s: no space for (COMMON): PID %d; FD %s\n",
+				Pn, Lp->pid, Lf->fd);
+			    Exit(1);
+			}
+			(void) snpf(Lf->nma, len, "(COMMON)");
+		    }
+		}
+	    }
+	}
+/*
+ * Record stream status.
+ */
+	if (Lf->inp_ty == 0 && Lf->is_stream && strcmp(Lf->iproto, "STR") == 0)
+	    Lf->inp_ty = 2;
+/*
+ * Test for specified file.
+ */
+
+#if	defined(HASPROCFS)
+	if (Ntype == N_PROC) {
+	    if (Procsrch) {
+		Procfind = 1;
+		Lf->sf |= SELNM;
+	    } else {
+		for (pfi = Procfsid; pfi; pfi = pfi->next) {
+		    if ((pfi->pid && pfi->pid == pids.pid_id)
+
+# if	defined(HASPINODEN)
+		    ||  (Lf->inp_ty == 1 && Lf->inode == pfi->inode)
+# endif	/* defined(HASPINODEN) */
+
+		    ) {
+			pfi->f = 1;
+			if (!Namech[0]) {
+			    (void) snpf(Namech, Namechl - 1, "%s", pfi->nm);
+			    Namech[Namechl - 1] = '\0';
+			}
+			Lf->sf |= SELNM;
+			break;
+		    }
+		}
+	    }
+	} else
+#endif	/* defined(HASPROCFS) */
+
+	{
+	    if (Sfile) {
+		if (trdevs) {
+		    rdev = Lf->rdev;
+		    Lf->rdev = trdev;
+		    tdef = Lf->rdev_def;
+		    Lf->rdev_def = 1;
+		}
+		if (is_file_named(NULL, Ntype, type, 1))
+		    Lf->sf |= SELNM;
+		if (trdevs) {
+		    Lf->rdev = rdev;
+		    Lf->rdev_def = tdef;
+		}
+	    }
+	}
+/*
+ * Enter name characters.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+/*
+ * read_cni() - read common snode information
+ */
+
+static int
+read_cni(s, rv, v, rs, di, din, dinl)
+	struct snode *s;		/* starting snode */
+	struct vnode *rv;		/* "real" vnode receiver */
+	struct vnode *v;		/* starting vnode */
+	struct snode *rs;		/* "real" snode receiver */
+	struct dev_info *di;		/* dev_info structure receiver */
+	char *din;			/* device info name receiver */
+	int dinl;			/* sizeof(*din) */
+{
+	char tbuf[32];
+
+	if (read_nvn((KA_T)v->v_data, (KA_T)s->s_commonvp, rv))
+	    return(1);
+	if (read_nsn((KA_T)s->s_commonvp, (KA_T)rv->v_data, rs))
+	    return(1);
+	*din = '\0';
+	if (rs->s_dip) {
+	    if (kread((KA_T)rs->s_dip, (char *)di, sizeof(struct dev_info))) {
+		(void) snpf(Namech, Namechl - 1,
+		    "common snode at %s: no dev info: %s",
+		    print_kptr((KA_T)rv->v_data, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)rs->s_dip, (char *)NULL, 0));
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		return(1);
+	    }
+	    if (di->devi_name
+	    &&  kread((KA_T)di->devi_name, din, dinl-1) == 0)
+		din[dinl-1] = '\0';
+	}
+	return(0);
+}
+
+
+/*
+ * readinode() - read inode
+ */
+
+static int
+readinode(ia, i)
+	KA_T ia;			/* inode kernel address */
+	struct inode *i;		/* inode buffer */
+{
+	if (kread((KA_T)ia, (char *)i, sizeof(struct inode))) {
+	    (void) snpf(Namech, Namechl - 1, "can't read inode at %s",
+		print_kptr((KA_T)ia, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	solaris>=20500
+/*
+ * read_ndn() - read node's door node
+ */
+
+static int
+read_ndn(na, da, dn)
+	KA_T na;			/* containing vnode's address */
+	KA_T da;			/* door node's address */
+	struct door_node *dn;		/* door node receiver */
+{
+	char tbuf[32];
+
+	if (!da || kread((KA_T)da, (char *)dn, sizeof(struct door_node))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"vnode at %s: can't read door_node: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(da, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=20500 */
+
+
+
+/*
+ * read_mi() - read stream's module information
+ */
+
+static void
+read_mi(s, rdev, so, so_st, so_ad, sdp)
+	KA_T s;				/* kernel stream pointer address */
+	dev_t *rdev;			/* raw device pointer */
+	caddr_t so;			/* so_so return (Solaris) */
+	int *so_st;			/* so_so status */
+	KA_T *so_ad;			/* so_so addresses */
+	struct l_dev **sdp;		/* returned device pointer */
+{
+	struct l_dev *dp;
+	int i, j, k, nl;
+	KA_T ka;
+	struct module_info mi;
+	char mn[STRNML];
+	struct stdata sd;
+	struct queue q;
+	struct qinit qi;
+	KA_T qp;
+/*
+ * If there is no stream pointer, or we can't read the stream head,
+ * return.
+ */
+	if (!s)
+	    return;
+	if (kread((KA_T)s, (char *)&sd, sizeof(sd))) {
+	    (void) snpf(Namech, Namechl - 1, "can't read stream head: %s",
+		print_kptr(s, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return;
+	}
+/*
+ * Follow the stream head to each of its queue structures, retrieving the
+ * module names from each queue's q_info->qi_minfo->mi_idname chain of
+ * structures.  Separate each additional name from the previous one with
+ * "->".
+ *
+ * Ignore failures to read all but queue structure chain entries.
+ *
+ * Ignore module names that end in "head".
+ */
+	k = 0;
+	Namech[0] = '\0';
+	if (!(dp = finddev(&DevDev, rdev, LOOKDEV_CLONE)))
+	    dp = finddev(&DevDev, rdev, LOOKDEV_ALL);
+	if (dp) {
+	    (void) snpf(Namech, Namechl - 1, "%s", dp->name);
+	    Namech[Namechl - 1] = '\0';
+	    k = (int)strlen(Namech);
+	    *sdp = dp;
+	} else
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "STR");
+	nl = sizeof(mn) - 1;
+	mn[nl] = '\0';
+	qp = (KA_T)sd.sd_wrq;
+	for (i = 0; qp && i < 20; i++, qp = (KA_T)q.q_next) {
+	    if (!qp || kread(qp, (char *)&q, sizeof(q)))
+		break;
+	    if ((ka = (KA_T)q.q_qinfo) == (KA_T)NULL
+	    ||  kread(ka, (char *)&qi, sizeof(qi)))
+		continue;
+	    if ((ka = (KA_T)qi.qi_minfo) == (KA_T)NULL
+	    ||  kread(ka, (char *)&mi, sizeof(mi)))
+		continue;
+	    if ((ka = (KA_T)mi.mi_idname) == (KA_T)NULL
+	    ||  kread(ka, mn, nl))
+		continue;
+	    if ((j = (int)strlen(mn)) < 1)
+		continue;
+	    if (j >= 4 && strcmp(&mn[j - 4], "head") == 0)
+		continue;
+
+#if	solaris<100000
+	    if (strcmp(mn, "sockmod") == 0) {
+
+	    /*
+	     * Save the Solaris sockmod device and inode numbers.
+	     */
+		if (so) {
+
+		    struct so_so s;
+
+		    if (!kread((KA_T)q.q_ptr, (char *)&s, sizeof(s))) {
+			if (!(*so_st))
+			    so_ad[0] = (KA_T)q.q_ptr;
+			else
+			    so_ad[1] = (KA_T)q.q_ptr;
+			(void) savesockmod(&s, (struct so_so *)so, so_st);
+		    }
+		}
+	    }
+#endif	/* solaris<100000 */
+
+	    if (k) {
+		if ((k + 2) > (Namechl - 1))
+		    break;
+		(void) snpf(&Namech[k], Namechl - k, "->");
+		k += 2;
+	    }
+	    if ((k + j) > (Namechl - 1))
+		break;
+	    (void) snpf(&Namech[k], Namechl - k, "%s", mn);
+	    k += j;
+	}
+}
+
+
+#if	solaris>=20500
+
+/*
+ * read_nan(na, ca, cn) - read node's autofs node
+ */
+
+static int
+read_nan(na, aa, rn)
+	KA_T na;			/* containing node's address */
+	KA_T aa;			/* autofs node address */
+
+# if    solaris<20600
+	struct autonode *rn;		/* autofs node receiver */
+# else  /* solaris>=20600 */
+	struct fnnode *rn;		/* autofs node receiver */
+# endif /* solaris<20600 */
+
+{
+	char tbuf[32];
+
+# if    solaris<20600
+	if (!aa || kread((KA_T)aa, (char *)rn, sizeof(struct autonode)))
+# else  /* solaris>=20600 */
+	if (!aa || kread((KA_T)aa, (char *)rn, sizeof(struct fnnode)))
+# endif /* solaris<20600 */
+
+	{
+	    (void) snpf(Namech, Namechl - 1,
+
+# if    solaris<20600
+		"node at %s: can't read autonode: %s",
+# else  /* solaris>=20600 */
+		"node at %s: can't read fnnode: %s",
+# endif /* solaris<20600 */
+
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(aa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=20500 */
+
+
+/*
+ * read_ncn(na, ca, cn) - read node's cache node
+ */
+
+static int
+read_ncn(na, ca, cn)
+	KA_T na;			/* containing node's address */
+	KA_T ca;			/* cache node address */
+	struct cnode *cn;		/* cache node receiver */
+{
+	char tbuf[32];
+
+	if (!ca || kread((KA_T)ca, (char *)cn, sizeof(struct cnode))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read cnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ca, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	solaris>=100000
+/*
+ * read_nctfsn(ty, na, ca, cn) - read node's cache node
+ */
+
+static int
+read_nctfsn(ty, na, ca, cn)
+	int ty;				/* node type -- i.e., N_CTFS* */
+	KA_T na;			/* containing node's address */
+	KA_T ca;			/* cache node address */
+	char *cn;			/* CTFS node receiver */
+{
+	char *cp, *nm, tbuf[32];
+	READLEN_T sz;
+
+	switch (ty) {
+	case N_CTFSADIR:
+	    nm = "ADIR";
+	    sz = (READLEN_T)sizeof(ctfs_adirnode_t);
+	    break;
+	case N_CTFSBUND:
+	    nm = "BUND";
+	    sz = (READLEN_T)sizeof(ctfs_bunode_t);
+	    break;
+	case N_CTFSCDIR:
+	    nm = "CDIR";
+	    sz = (READLEN_T)sizeof(ctfs_cdirnode_t);
+	    break;
+	case N_CTFSCTL:
+	    nm = "CTL";
+	    sz = (READLEN_T)sizeof(ctfs_ctlnode_t);
+	    break;
+	case N_CTFSEVT:
+	    nm = "EVT";
+	    sz = (READLEN_T)sizeof(ctfs_evnode_t);
+	    break;
+	case N_CTFSLATE:
+	    nm = "LATE";
+	    sz = (READLEN_T)sizeof(ctfs_latenode_t);
+	    break;
+	case N_CTFSROOT:
+	    nm = "ROOT";
+	    sz = (READLEN_T)sizeof(ctfs_rootnode_t);
+	    break;
+	case N_CTFSSTAT:
+	    nm = "STAT";
+	    sz = (READLEN_T)sizeof(ctfs_ctlnode_t);
+	    break;
+	case N_CTFSSYM:
+	    nm = "SYM";
+	    sz = (READLEN_T)sizeof(ctfs_symnode_t);
+	    break;
+	case N_CTFSTDIR:
+	    nm = "TDIR";
+	    sz = (READLEN_T)sizeof(ctfs_tdirnode_t);
+	    break;
+	case N_CTFSTMPL:
+	    nm = "TMPL";
+	    sz = (READLEN_T)sizeof(ctfs_tmplnode_t);
+	    break;
+	default:
+	    (void) snpf(Namech, Namechl - 1, "unknown CTFS node type: %d", ty);
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	if (!ca || kread((KA_T)ca, cn, sz)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read CTFS %s node: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		nm,
+		print_kptr(ca, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=100000 */
+
+
+/*
+ * read_nfn() - read node's fifonode
+ */
+
+static int
+read_nfn(na, fa, f)
+	KA_T na;			/* containing node's address */
+	KA_T fa;			/* fifonode address */
+	struct fifonode *f;		/* fifonode receiver */
+{
+	char tbuf[32];
+
+	if (!fa || readfifonode(fa, f)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read fifonode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(fa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nhn() - read node's High Sierra node
+ */
+
+static int
+read_nhn(na, ha, h)
+	KA_T na;			/* containing node's address */
+	KA_T ha;			/* hsnode address */
+	struct hsnode *h;		/* hsnode receiver */
+{
+	char tbuf[32];
+
+	if (!ha || readhsnode(ha, h)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read hsnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ha, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nin() - read node's inode
+ */
+
+static int
+read_nin(na, ia, i)
+	KA_T na;			/* containing node's address */
+	KA_T ia;			/* kernel inode address */
+	struct inode *i;		/* inode receiver */
+{
+	char tbuf[32];
+
+	if (!ia || readinode(ia, i)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read inode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ia, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nln(na, la, ln) - read node's loopback node
+ */
+
+static int
+read_nln(na, la, ln)
+	KA_T na;			/* containing node's address */
+	KA_T la;			/* loopback node address */
+	struct lnode *ln;		/* loopback node receiver */
+{
+	char tbuf[32];
+
+	if (!la || kread((KA_T)la, (char *)ln, sizeof(struct lnode))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read lnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(la, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nnn() - read node's namenode
+ */
+
+static int
+read_nnn(na, nna, nn)
+	KA_T na;			/* containing node's address */
+	KA_T nna;			/* namenode address */
+	struct namenode *nn;		/* namenode receiver */
+{
+	char tbuf[32];
+
+	if (!nna || kread((KA_T)nna, (char *)nn, sizeof(struct namenode))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read namenode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(nna, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nmn() - read node's mvfsnode
+ */
+
+static int
+read_nmn(na, ma, m)
+	KA_T na;			/* containing node's address */
+	KA_T ma;			/* kernel mvfsnode address */
+	struct mvfsnode *m;		/* mvfsnode receiver */
+{
+	char tbuf[32];
+
+	if (!ma || kread((KA_T)ma, (char *)m, sizeof(struct mvfsnode))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read mvfsnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ma, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	defined(HASPROCFS)
+/*
+ * read_npi() - read node's /proc file system information
+ */
+
+static int
+read_npi(na, v, pids)
+	KA_T na;			/* containing node's address */
+	struct vnode *v;		/* containing vnode */
+	struct pid *pids;		/* pid structure receiver */
+{
+	struct as as;
+	struct proc p;
+	struct prnode pr;
+	char tbuf[32];
+
+#if	solaris>=20600
+	prcommon_t pc, ppc;
+	int pcs, ppcs, prpcs, prppcs;
+	struct proc pp;
+	pid_t prpid;
+	id_t prtid;
+	char *ty = (char *)NULL;
+#endif	/* solaris>=20600 */
+
+	if (!v->v_data || kread((KA_T)v->v_data, (char *)&pr, sizeof(pr))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read prnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+
+#if	solaris<20600
+/*
+ * For Solaris < 2.6:
+ *	* Read the proc structure, get the process size and PID;
+ *	* Return the PID;
+ *	* Enter a name, constructed from the file system and PID;
+ *	* Enter an inode number, constructed from the PID.
+ */
+	if (!pr.pr_proc) {
+	    if (v->v_type == VDIR) {
+		(void) snpf(Namech, Namechl - 1, "/%s", HASPROCFS);
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		Lf->inode = (INODETYPE)PR_ROOTINO;
+		Lf->inp_ty = 1;
+	    } else {
+		(void) snpf(Namech, Namechl - 1, "/%s/", HASPROCFS);
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		Lf->inp_ty = 0;
+	    }
+	    return(0);
+	}
+	if (kread((KA_T)pr.pr_proc, (char *)&p, sizeof(p))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"prnode at %s: can't read proc: %s",
+		print_kptr((KA_T)v->v_data, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)pr.pr_proc, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	if (p.p_as && !kread((KA_T)p.p_as, (char *)&as, sizeof(as))) {
+	    Lf->sz = (SZOFFTYPE)as.a_size;
+	    Lf->sz_def = 1;
+	}
+	if (!p.p_pidp
+	||  kread((KA_T)p.p_pidp, (char *)pids, sizeof(struct pid))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"proc struct at %s: can't read pid: %s",
+		print_kptr((KA_T)pr.pr_proc, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)p.p_pidp, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	(void) snpf(Namech, Namechl, "/%s/%d", HASPROCFS, (int)pids->pid_id);
+	Namech[Namechl - 1] = '\0';
+	Lf->inode = (INODETYPE)ptoi(pids->pid_id);
+	Lf->inp_ty = 1;
+#else	/* solaris>=20600 */
+/*
+ * Enter the >= Solaris 2.6 inode number.
+ */
+	Lf->inode = (INODETYPE)pr.pr_ino;
+	Lf->inp_ty = 1;
+/*
+ * Read the >= Solaris 2.6 prnode common structures.
+ *
+ * Return the PID number.
+ *
+ * Identify the lwp PID (the thread ID).
+ */
+	if (pr.pr_common
+	&&  kread((KA_T)pr.pr_common, (char *)&pc, sizeof(pc)) == 0) {
+	    pcs = 1;
+	    if (pc.prc_proc
+	    &&  kread((KA_T)pc.prc_proc, (char *)&p, sizeof(p)) == 0)
+		prpcs = 1;
+	    else
+		prpcs = 0;
+	} else
+	   pcs = prpcs = 0;
+	if (pr.pr_pcommon
+	&&  kread((KA_T)pr.pr_pcommon, (char *)&ppc, sizeof(ppc)) == 0) {
+	    ppcs = 1;
+	    if (ppc.prc_proc
+	    &&  kread((KA_T)ppc.prc_proc, (char *)&pp, sizeof(pp)) == 0)
+		prppcs = 1;
+	    else
+		prppcs = 0;
+	} else
+	    ppcs = prppcs = 0;
+	if (pcs && pc.prc_pid)
+	    pids->pid_id = prpid = pc.prc_pid;
+	else if (ppcs && ppc.prc_pid)
+	    pids->pid_id = prpid = ppc.prc_pid;
+	else
+	    pids->pid_id = prpid = (pid_t)0;
+	if (pcs && pc.prc_tid)
+	    prtid = pc.prc_tid;
+	else if (ppcs && ppc.prc_tid)
+	    prtid = ppc.prc_tid;
+	else
+	    prtid = (id_t)0;
+/*
+ * Identify the Solaris 2.6 /proc file system name, file size, and file type.
+ */
+	switch (pr.pr_type) {
+	case PR_PROCDIR:
+	    (void) snpf(Namech, Namechl - 1,  "/%s", HASPROCFS);
+	    ty = "PDIR";
+	    break;
+	case PR_PIDDIR:
+	    (void) snpf(Namech, Namechl - 1,  "/%s/%d", HASPROCFS, (int)prpid);
+	    ty = "PDIR";
+	    break;
+	case PR_AS:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/as", HASPROCFS, (int)prpid);
+	    ty = "PAS";
+	    if (prpcs
+	    &&  kread((KA_T)pc.prc_proc, (char *)&p, sizeof(p)) == 0
+	    &&  p.p_as
+	    &&  kread((KA_T)p.p_as, (char *)&as, sizeof(as)) == 0) {
+		Lf->sz = (SZOFFTYPE)as.a_size;
+		Lf->sz_def = 1;
+	    }
+	    break;
+	case PR_CTL:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/ctl", HASPROCFS, (int)prpid);
+	    ty = "PCTL";
+	    break;
+	case PR_STATUS:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/status", HASPROCFS, (int)prpid);
+	    ty = "PSTA";
+	    break;
+	case PR_LSTATUS:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lstatus", HASPROCFS, (int)prpid);
+	    ty = "PLST";
+	    break;
+	case PR_PSINFO:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/psinfo", HASPROCFS, (int)prpid);
+	    ty = "PSIN";
+	    break;
+	case PR_LPSINFO:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lpsinfo", HASPROCFS, (int)prpid);
+	    ty = "PLPI";
+	    break;
+	case PR_MAP:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/map", HASPROCFS, (int)prpid);
+	    ty = "PMAP";
+	    break;
+	case PR_RMAP:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/rmap", HASPROCFS, (int)prpid);
+	    ty = "PRMP";
+	    break;
+	case PR_XMAP:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/xmap", HASPROCFS, (int)prpid);
+	    ty = "PXMP";
+	    break;
+	case PR_CRED:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/cred", HASPROCFS, (int)prpid);
+	    ty = "PCRE";
+	    break;
+	case PR_SIGACT:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/sigact", HASPROCFS, (int)prpid);
+	    ty = "PSGA";
+	    break;
+	case PR_AUXV:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/auxv", HASPROCFS, (int)prpid);
+	    ty = "PAXV";
+	    break;
+
+# if	defined(HASPR_LDT)
+	case PR_LDT:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/ldt", HASPROCFS, (int)prpid);
+	    ty = "PLDT";
+	    break;
+# endif	/* defined(HASPR_LDT) */
+
+	case PR_USAGE:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/usage", HASPROCFS, (int)prpid);
+	    ty = "PUSG";
+	    break;
+	case PR_LUSAGE:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lusage", HASPROCFS, (int)prpid);
+	    ty = "PLU";
+	    break;
+	case PR_PAGEDATA:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/pagedata", HASPROCFS, (int)prpid);
+	    ty = "PGD";
+	    break;
+	case PR_WATCH:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/watch", HASPROCFS, (int)prpid);
+	    ty = "PW";
+	    break;
+	case PR_CURDIR:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/cwd", HASPROCFS, (int)prpid);
+	    ty = "PCWD";
+	    break;
+	case PR_ROOTDIR:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/root", HASPROCFS, (int)prpid);
+	    ty = "PRTD";
+	    break;
+	case PR_FDDIR:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/fd", HASPROCFS, (int)prpid);
+	    ty = "PFDR";
+	    break;
+	case PR_FD:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/fd/%d", HASPROCFS, (int)prpid,
+		pr.pr_index);
+	    ty = "PFD";
+	    break;
+	case PR_OBJECTDIR:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/object", HASPROCFS, (int)prpid);
+	    ty = "PODR";
+	    break;
+	case PR_OBJECT:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/object/", HASPROCFS, (int)prpid);
+	    ty = "POBJ";
+	    break;
+	case PR_LWPDIR:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lpw", HASPROCFS, (int)prpid);
+	    ty = "PLDR";
+	    break;
+	case PR_LWPIDDIR:
+	    (void) snpf(Namech, Namechl,
+		"/%s/%d/lwp/%d", HASPROCFS, (int)prpid, (int)prtid);
+	    ty = "PLDR";
+	    break;
+	case PR_LWPCTL:
+	    (void) snpf(Namech, Namechl - 1, "/%s/%d/lwp/%d/lwpctl", HASPROCFS,
+		(int)prpid, (int)prtid);
+	    ty = "PLC";
+	    break;
+	case PR_LWPSTATUS:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lwp/%d/lwpstatus", HASPROCFS,
+		(int)prpid, (int)prtid);
+	    ty = "PLWS";
+	    break;
+	case PR_LWPSINFO:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lwp/%d/lwpsinfo", HASPROCFS,
+		(int)prpid, (int)prtid);
+	    ty = "PLWI";
+	    break;
+	case PR_LWPUSAGE:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lwp/%d/lwpusage", HASPROCFS,
+		(int)prpid, (int)prtid);
+	    ty = "PLWU";
+	    break;
+	case PR_XREGS:
+	    (void) snpf(Namech, Namechl - 1, "/%s/%d/lwp/%d/xregs", HASPROCFS,
+		(int)prpid, (int)prtid);
+	    ty = "PLWX";
+	    break;
+
+# if	defined(HASPR_GWINDOWS)
+	case PR_GWINDOWS:
+	    (void) snpf(Namech, Namechl - 1,
+		"/%s/%d/lwp/%d/gwindows", HASPROCFS,
+		(int)prpid, (int)prtid);
+	    ty = "PLWG";
+	    break;
+# endif	/* defined(HASPR_GWINDOWS) */
+
+	case PR_PIDFILE:
+	    (void) snpf(Namech, Namechl - 1, "/%s/%d", HASPROCFS, (int)prpid);
+	    ty = "POPF";
+	    break;
+	case PR_LWPIDFILE:
+	    (void) snpf(Namech, Namechl - 1, "/%s/%d", HASPROCFS, (int)prpid);
+	    ty = "POLP";
+	    break;
+	case PR_OPAGEDATA:
+	    (void) snpf(Namech, Namechl - 1, "/%s/%d", HASPROCFS, (int)prpid);
+	    ty = "POPG";
+	    break;
+	default:
+	    ty = (char *)NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	else
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o",
+		(pr.pr_type & 0xfff));
+/*
+ * Record the Solaris 2.6 /proc file system inode number.
+ */
+	Lf->inode = (INODETYPE)pr.pr_ino;
+	Lf->inp_ty = 1;
+# endif	/* solaris<20600 */
+
+	Namech[Namechl - 1] = '\0';
+	enter_nm(Namech);
+	return(0);
+}
+#endif	/* defined(HASPROCFS) */
+
+
+/*
+ * read_npn() - read node's pcnode
+ */
+
+static int
+read_npn(na, pa, p)
+	KA_T na;			/* containing node's address */
+	KA_T pa;			/* pcnode address */
+	struct pcnode *p;		/* pcnode receiver */
+{
+	char tbuf[32];
+
+	if (!pa || kread(pa, (char *)p, sizeof(struct pcnode))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read pcnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(pa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	solaris>=100000
+/*
+ * read_nprtn() - read node's port node
+ */
+
+static int
+read_nprtn(na, pa, p)
+	KA_T na;			/* containing node's address */
+	KA_T pa;			/* port node address */
+	port_t *p;			/* port node receiver */
+{
+	char tbuf[32];
+
+	if (!pa || kread(pa, (char *)p, sizeof(port_t))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read port node: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(pa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=100000 */
+
+
+/*
+ * read_nrn() - read node's rnode
+ */
+
+static int
+read_nrn(na, ra, r)
+	KA_T na;			/* containing node's address */
+	KA_T ra;			/* rnode address */
+	struct rnode *r;		/* rnode receiver */
+{
+	char tbuf[32];
+
+	if (!ra || readrnode(ra, r)) {
+	    (void) snpf(Namech, Namechl - 1, "node at %s: can't read rnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ra, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	solaris>=100000
+/*
+ * read_nrn4() - read node's rnode4
+ */
+
+static int
+read_nrn4(na, ra, r)
+	KA_T na;			/* containing node's address */
+	KA_T ra;			/* rnode address */
+	struct rnode4 *r;		/* rnode receiver */
+{
+	char tbuf[32];
+
+	if (!ra ||
+	    kread((KA_T)ra, (char *)r, sizeof(struct rnode4))
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read rnode4: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ra, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=100000 */
+
+
+#if	solaris>=110000
+/*
+ * read_nsdn() - read node's sdev_node
+ */
+
+static int
+read_nsdn(na, sa, sdn, sdva)
+	KA_T na;			/* containing node's adress */
+	KA_T sa;			/* sdev_node address */
+	struct sdev_node *sdn;		/* sdev_node receiver */
+	struct vattr *sdva;		/* sdev_node's vattr receiver */
+{
+	KA_T va;
+	char tbuf[32], tbuf1[32];
+
+	if (!sa || kread((KA_T)sa, (char *)sdn, sizeof(struct sdev_node))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read sdev_node: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(sa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	if (!(va = (KA_T)sdn->sdev_attr)
+	||  kread(va, (char *)sdva, sizeof(struct vattr))
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s; sdev_node at %s: can't read vattr: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(sa, tbuf1, sizeof(tbuf1)),
+		print_kptr(va, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=110000 */
+
+
+#if	solaris>=20600
+/*
+ * read_nson() - read node's sonode
+ */
+
+static int
+read_nson(na, sa, sn)
+	KA_T na;			/* containing node's address */
+	KA_T sa;			/* sonode address */
+	struct sonode *sn;		/* sonode receiver */
+
+{
+	char tbuf[32];
+
+	if (!sa || kread((KA_T)sa, (char *)sn, sizeof(struct sonode))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read sonode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(sa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=20600 */
+
+
+/*
+ * read_nsn() - read node's snode
+ */
+
+static int
+read_nsn(na, sa, s)
+	KA_T na;			/* containing node's address */
+	KA_T sa;			/* snode address */
+	struct snode *s;		/* snode receiver */
+{
+	char tbuf[32];
+
+	if (!sa || readsnode(sa, s)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read snode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(sa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	solaris>=110000
+/*
+ * read_nsti() - read socket node's info
+ */
+
+static int
+read_nsti(so, stpi)
+	struct sonode *so;		/* socket's sonode */
+	sotpi_info_t *stpi;		/* local socket info receiver */
+{
+	char tbuf[32];
+
+	(void) CTF_init(&Sockfs_ctfs, SOCKFS_MOD_FORMAT, Sockfs_requests);
+	if (!so
+	||  !so->so_priv
+	||  CTF_MEMBER_READ(so->so_priv,stpi,sotpi_info_members, sti_dev)
+	||  CTF_MEMBER_READ(so->so_priv,stpi,sotpi_info_members, sti_laddr)
+	||  CTF_MEMBER_READ(so->so_priv,stpi,sotpi_info_members, sti_faddr)
+	||  CTF_MEMBER_READ(so->so_priv,stpi,sotpi_info_members, sti_ux_laddr)
+	||  CTF_MEMBER_READ(so->so_priv,stpi,sotpi_info_members, sti_ux_faddr)
+	||  CTF_MEMBER_READ(so->so_priv,stpi,sotpi_info_members, sti_serv_type)
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"sonode at %s: can't read so_priv: %s",
+		print_kptr((KA_T)so, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)so->so_priv, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=110000 */
+
+
+/*
+ * read_ntn() - read node's tmpnode
+ */
+
+static int
+read_ntn(na, ta, t)
+	KA_T na;			/* containing node's address */
+	KA_T ta;			/* tmpnode address */
+	struct tmpnode *t;		/* tmpnode receiver */
+{
+	char tbuf[32];
+
+	if (!ta || readtnode(ta, t)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read tnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(ta, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	solaris>=20600
+/*
+ * read_nusa() - read sondode's UNIX socket address
+ */
+
+static int
+read_nusa(so, ua)
+	struct soaddr *so;		/* kernel socket info structure */
+	struct sockaddr_un *ua;		/* local sockaddr_un address */
+{
+	KA_T a;
+	int len;
+	int min = offsetof(struct sockaddr_un, sun_path);
+
+	ua->sun_path[0] = '\0';
+
+	if (!(a = (KA_T)so->soa_sa)
+	||  (len = so->soa_len) < (min + 2)
+	||  len > (int)sizeof(struct sockaddr_un)
+	||  kread(a, (char *)ua, len)
+	||  ua->sun_family != AF_UNIX)
+	    return(0);
+	len -= min;
+	if (len >= sizeof(ua->sun_path))
+	    len = sizeof(ua->sun_path) - 1;
+	ua->sun_path[len] = '\0';
+	return((int)strlen(ua->sun_path));
+}
+#endif	/* solaris>=20600 */
+
+
+/*
+ * read_nvn() - read node's vnode
+ */
+
+static int
+read_nvn(na, va, v)
+	KA_T na;			/* node's address */
+	KA_T va;			/* vnode address */
+	struct vnode *v;		/* vnode receiver */
+{
+	char tbuf[32];
+
+	if (readvnode(va, v)) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read real vnode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(va, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+#if	 defined(HAS_ZFS)
+/*
+ * read_nzn() - read node's ZFS node
+ */
+
+static int
+read_nzn(na, nza, zn)
+	KA_T na;			/* containing node's address */
+	KA_T nza;			/* znode address */
+	znode_t *zn;			/* znode receiver */
+{
+	int err = 0;			/* error flag */
+	CTF_member_t *mp;		/* member pointer */
+	char tbuf[32];			/* temporary buffer */
+	znode_phys_t zp;		/* physical znode */
+
+	(void) CTF_init(&ZFS_ctfs, ZFS_MOD_FORMAT, ZFS_requests);
+	if (!nza
+	||  CTF_MEMBER_READ(nza, zn, znode_members, z_zfsvfs)
+	||  CTF_MEMBER_READ(nza, zn, znode_members, z_vnode)
+	||  CTF_MEMBER_READ(nza, zn, znode_members, z_id)
+	||  CTF_MEMBER_READ(nza, zn, znode_members, z_phys)
+	||  CTF_MEMBER_READ(nza, zn, znode_members, z_links)
+	||  CTF_MEMBER_READ(nza, zn, znode_members, z_size)
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"node at %s: can't read znode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(nza, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * If the physical znode pointer is defined, read the physizal znode
+ * and propagate its values to the znode.
+ */
+	if (znode_members[MX_z_phys].m_offset != CTF_MEMBER_UNDEF) {
+	    err = read_nznp(nza, (KA_T)zn->z_phys, &zp);
+	    if (!err) {
+		zn->z_links = zp.zp_links;
+		zn->z_size = zp.zp_size;
+	    }
+	} else {
+	   
+	/*
+	 * Make sure z_link and z_size are defined when z_phys isn't.
+	 */
+	    if (znode_members[MX_z_links].m_offset == CTF_MEMBER_UNDEF) {
+		(void) snpf(Namech, Namechl - 1,
+		    "node at %s: can't read z_links: %s",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr(nza, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    enter_nm(Namech);
+		    err = 1;
+	    }
+	    if (znode_members[MX_z_size].m_offset == CTF_MEMBER_UNDEF) {
+		(void) snpf(Namech, Namechl - 1,
+		    "node at %s: can't read z_size: %s",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr(nza, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    enter_nm(Namech);
+		    err = 1;
+	    }
+	}
+	return(err);
+}
+
+
+/*
+ * read_nznp() - read znode's persistent znode
+ */
+
+static int
+read_nznp(nza, nzpa, zp)
+	KA_T nza;			/* containing znode's address */
+	KA_T nzpa;			/* persistent znode address */
+	znode_phys_t *zp;		/* persistent znode receiver */
+{
+	char tbuf[32];
+
+	(void) CTF_init(&ZFS_ctfs, ZFS_MOD_FORMAT, ZFS_requests);
+	if (!nzpa
+	||  CTF_MEMBER_READ(nzpa, zp, znode_phys_members, zp_size)
+	||  CTF_MEMBER_READ(nzpa, zp, znode_phys_members, zp_links)
+	) {
+	    (void) snpf(Namech, Namechl - 1, "znode at %s: "
+	                                 "can't read znode_phys: %s",
+		print_kptr(nza, tbuf, sizeof(tbuf)),
+		print_kptr(nzpa, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * read_nzvfs() - read znode's associated vfs
+ */
+
+static int
+read_nzvfs(nza, nzva, zv)
+	KA_T nza;			/* containing znode's address */
+	KA_T nzva;			/* associated vfs address */
+	zfsvfs_t *zv;			/* associated vfs receiver */
+{
+	char tbuf[32];
+
+	(void) CTF_init(&ZFS_ctfs, ZFS_MOD_FORMAT, ZFS_requests);
+	if (!nzva
+	||  CTF_MEMBER_READ(nzva, zv, zfsvfs_members, z_vfs)
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"znode at %s: can't read zfsvfs: %s",
+		print_kptr(nza, tbuf, sizeof(tbuf)),
+		print_kptr(nzva, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HAS_ZFS) */
+
+
+#if	solaris<100000
+/*
+ * savesockmod() - save addresses from sockmod so_so structure
+ */
+
+static void
+savesockmod(so, sop, so_st)
+	struct so_so *so;		/* new so_so structure pointer */
+	struct so_so *sop;		/* previous so_so structure pointer */
+	int *so_st;			/* status of *sop (0 if not loaded) */
+{
+
+#if	solaris<20500
+	dev_t d1, d2, d3;
+#endif	/* solaris<20500 */
+
+#define	luxadr	lux_dev.addr.tu_addr
+#define	luxdev	lux_dev.addr.tu_addr.dev
+#define	luxino	lux_dev.addr.tu_addr.ino
+#define	ruxadr	rux_dev.addr.tu_addr
+#define	ruxdev	rux_dev.addr.tu_addr.dev
+#define	ruxino	rux_dev.addr.tu_addr.ino
+
+#if	solaris<20500
+/*
+ * If either address in the new structure is missing a device number, clear
+ * its corresponding inode number.  Then sort the inode-less device numbers.
+ */
+	if (!so->luxdev)
+	    so->luxino = (ino_t)0;
+	if (!so->ruxdev)
+	    so->ruxino = (ino_t)0;
+	if (!so->luxino && !so->ruxino) {
+	    if (so->luxdev > so->ruxdev) {
+		d2 = so->luxdev;
+		d1 = so->luxdev = so->ruxdev;
+		so->ruxdev = d2;
+	    } else {
+		d1 = so->luxdev;
+		d2 = so->ruxdev;
+	    }
+	} else
+	    d1 = d2 = (dev_t)0;
+/*
+ * If the previous structure hasn't been loaded, save the new one in it with
+ * adjusted or sorted addresses.
+ */
+	if (!*so_st) {
+	    if (so->luxdev && so->luxino) {
+		*sop = *so;
+		sop->ruxdev = (dev_t)0;
+		sop->ruxino = (ino_t)0;
+		*so_st = 1;
+		return;
+	    }
+	    if (so->ruxdev && so->ruxino) {
+		*sop = *so;
+		sop->luxadr = sop->ruxadr;
+		sop->ruxdev = (dev_t)0;
+		sop->ruxino = (ino_t)0;
+		*so_st = 1;
+		return;
+	    }
+	    *sop = *so;
+	    *so_st = 1;
+	    return;
+	}
+/*
+ * See if the new sockmod addresses need to be merged with the previous
+ * ones:
+ *
+ *	*  Don't merge if the previous so_so structure's lux_dev has a non-
+ *	   zero device and a non-zero inode number.
+ *
+ *	*  If either of the device/inode pairs in the new structure is non-
+ *	   zero, propagate them to the previous so_so structure.
+ *
+ *	*  Don't merge if the both device numbers in the new structure are
+ *	   zero.
+ */
+	if (sop->luxdev && sop->luxino)
+	    return;
+	if (so->luxdev && so->luxino) {
+	    sop->luxadr = so->luxadr;
+	    sop->ruxdev = (dev_t)0;
+	    sop->ruxino = (ino_t)0;
+	    return;
+	}
+	if (so->ruxdev && so->ruxino) {
+	    sop->luxadr = so->ruxadr;
+	    sop->ruxdev = (dev_t)0;
+	    sop->ruxino = (ino_t)0;
+	    return;
+	}
+	if (!so->luxdev && !so->ruxdev)
+	    return;
+/*
+ * Check the previous structure's device numbers:
+ *
+ *	*  If both are zero, replace the previous structure with the new one.
+ *
+ *	*  Choose the minimum and maximum non-zero device numbers contained in
+ *	   either structure.
+ */
+	if (!sop->luxdev && !sop->ruxdev) {
+	    *sop = *so;
+	    return;
+	}
+	if (!sop->luxdev && (d1 || d2)) {
+	    if (d1) {
+		sop->luxdev = d1;
+		d1 = (dev_t)0;
+	    } else {
+		sop->luxdev = d2;
+		d2 = (dev_t)0;
+	    }
+	    if (sop->luxdev > sop->ruxdev) {
+		d3 = sop->luxdev;
+		sop->luxdev = sop->ruxdev;
+		sop->ruxdev = d3;
+	    }
+	}
+	if (!sop->ruxdev && (d1 || d2)) {
+	    if (d1) {
+		sop->ruxdev = d1;
+		d1 = (dev_t)0;
+	    } else {
+		sop->ruxdev = d2;
+		d2 = (dev_t)0;
+	    }
+	    if (sop->luxdev > sop->ruxdev) {
+		d3 = sop->luxdev;
+		sop->luxdev = sop->ruxdev;
+		sop->ruxdev = d3;
+	    }
+	}
+	if (sop->luxdev && sop->ruxdev) {
+	    if (d1) {
+		if (d1 < sop->luxdev)
+		    sop->luxdev = d1;
+		else if (d1 > sop->ruxdev)
+		    sop->ruxdev = d1;
+	    }
+	    if (d2) {
+		if (d2 < sop->luxdev)
+		    sop->luxdev = d2;
+		else if (d2 > sop->ruxdev)
+		    sop->ruxdev = d2;
+	    }
+	}
+#else	/* solaris>=20500 */
+/*
+ * Save the first sockmod structure.
+ */
+	if (!*so_st) {
+	    *so_st = 1;
+	    *sop = *so;
+	}
+#endif	/* solaris<20500 */
+
+}
+#endif	/* solaris<100000 */
+
+
+
+/*
+ * vop2ty() - convert vnode operation switch address to internal type
+ */
+
+int
+vop2ty(vp, fx)
+	struct vnode *vp;		/* local vnode pointer */
+	int fx;				/* file system index (-1 if none) */
+{
+	int h;
+	register int i;
+	KA_T ka;
+	int nty;
+	v_optab_t *nv, *v, *vt;
+
+#if	defined(HAS_AFS)
+	static int afs = 0;		/* afs test status: -1 = no AFS
+					 *		     0 = not tested
+					 *		     1 = AFS */
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Locate the node type by hashing the vnode's v_op address into the Voptab[].
+ */
+	if (!(ka = (KA_T)vp->v_op))
+	    return(-1);
+	h = HASHVOP(ka);
+	for (v = Voptab[h]; v; v = v->next) {
+	    if (ka == v->v_op)
+		break;
+	}
+	if (!v) {
+
+	/*
+	 * If there's no entry in the Voptab[] for the v_op address, see if
+	 * an entry can be found via the file system type and FxToVoptab[].
+	 */
+	    if ((fx >= 0) && (fx < Fsinfomax) && (v = FxToVoptab[fx])) {
+
+	    /*
+	     * There's an FxToVoptab[] mapping, so add an entry to Voptab[]
+	     * for the v_op address.
+	     */
+		if (!(nv = (v_optab_t *)malloc((MALLOC_S)sizeof(v_optab_t)))) {
+		    (void) fprintf(stderr, "%s: can't add \"%s\" to Voptab\n",
+			Pn, Fsinfo[fx]);
+		    Exit(1);
+		}
+		*nv = *v;
+		nv->v_op = ka;
+		h = HASHVOP(ka);
+		nv->next = Voptab[h];
+		Voptab[h] = v = nv;
+	    }
+	}
+	if (!v)
+	    return(-1);
+
+#if	defined(HAS_AFS)
+/*
+ * Do special AFS checks.
+ */
+	if (v->nty == N_AFS) {
+	    if (vp->v_data || !vp->v_vfsp)
+		return(-1);
+	    switch (afs) {
+	    case -1:
+		return(-1);
+	    case 0:
+		if (!hasAFS(vp)) {
+		    afs = -1;
+		    return(-1);
+		}
+		afs = 1;
+		return(N_AFS);
+	    case 1:
+		if ((KA_T)vp->v_vfsp == AFSVfsp)
+		return(N_AFS);
+	    }
+	    return(-1);
+	}
+#endif	/* defined(HAS_AFS) */
+
+	return(v->nty);
+}
+
+
+#if	solaris>=100000
+/*
+ * read_ndvn() -- read node's dv_node
+ */
+
+static int
+read_ndvn(na, da, dv, dev, devs)
+	KA_T na;			/* containing vnode's address */
+	KA_T da;			/* containing vnode's v_data */
+	struct dv_node *dv;		/* dv_node receiver */
+	dev_t *dev;			/* underlying file system device
+					 * number receptor */
+	unsigned char *devs;		/* status of *dev */
+{
+	struct vnode rv;
+	struct snode s;
+	char tbuf[32];
+	struct vfs v;
+/*
+ * Read the snode.
+ */
+	if (!da || kread((KA_T)da, (char *)&s, sizeof(s))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"dv_node vnode at %s: can't read snode: %s",
+		print_kptr(na, tbuf, sizeof(tbuf)),
+		print_kptr(da, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * Read the snode's real vnode.
+ */
+	if (!s.s_realvp
+	|| kread((KA_T)s.s_realvp, (char *)&rv, sizeof(struct dv_node)))
+	{
+	    (void) snpf(Namech, Namechl - 1,
+		"dv_node snode at %s: can't read real vnode: %s",
+		print_kptr(da, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)s.s_realvp, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * Read the real vnode's dv_node.
+ */
+	if (!rv.v_data || kread((KA_T)rv.v_data, (char *)dv, sizeof(rv))) {
+	    (void) snpf(Namech, Namechl - 1,
+		"dv_node real vnode at %s: can't read dv_node: %s",
+		print_kptr((KA_T)s.s_realvp, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)rv.v_data, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * Return the device number of the underlying file system, if possible.
+ */
+	if (rv.v_vfsp && !kread((KA_T)rv.v_vfsp, (char *)&v, sizeof(v))) {
+	    *dev = v.vfs_dev;
+	    *devs = 1;
+	}
+	return(0);
+}
+#endif	/* solaris<100000 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dnode1.c
new file mode 100644
index 0000000..ac279e5
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dnode1.c
@@ -0,0 +1,441 @@
+/*
+ * dnode1.h - Solaris AFS support
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.9 2005/08/08 19:55:41 abe Exp $";
+#endif
+
+
+#if	defined(HAS_AFS)
+#include "lsof.h"
+
+#include <rpc/xdr.h>
+#define __XDR_INCLUDE__
+#define int32   old_solaris_int32
+
+# if	solaris>=20600
+#undef	SHARED
+#undef	PRIVATE
+# endif	/* solaris>=20600 */
+
+#include <afs/param.h>
+#include <afs/afsint.h>
+#include <afs/vldbint.h>
+
+
+/*
+ * This is an emulation of the afs_rwlock_t definition that appears in
+ * the AFS sources in afs/lock.h.
+ */
+
+# if	defined(AFS_SUN5_ENV)
+#define AFS_NOBOZO_LOCK
+# endif	/* defined(AFS_SUN5_ENV) */
+
+#define INSTRUMENT_LOCKS
+
+# if	defined(AFS_FINEGR_SUNLOCK)
+typedef	kmutex_	afs_lock_t;
+typedef	krwlock_t afs_rwlock_t;
+# endif	/* !defined(AFS_FINEGR_SUNLOCK) */
+
+struct afs_lock {
+
+# if	solaris>=20500
+    unsigned char d1[2];
+    unsigned short d1_5[3];
+# else	/* solaris < 20500 */
+    unsigned char d1[4];
+# endif	/* solaris>=20500 */
+
+    struct timeval d2;
+
+# if	defined(INSTRUMENT_LOCKS)
+    unsigned int d3[3];
+# endif	/* defined(INSTRUMENT_LOCKS) */
+
+};
+typedef struct afs_lock afs_lock_t;
+typedef struct afs_lock afs_rwlock_t;
+
+
+/*
+ * This is an emulation of the afs_bozoLock_t definition that appears in
+ * the AFS sources in afs/lock.h.
+ */
+
+struct afs_bozoLock {
+    short d1;
+    char d2[2];
+    char *d3;
+};
+
+# if	!defined(AFS_NOBOZO_LOCK)
+typedef struct afs_bozoLock afs_bozoLock_t;
+# else	/* defined(AFS_NOBOZO_LOCK) */
+#  if	defined(AFS_SUN5_ENV)
+typedef kmutex_t afs_bozoLock_t;
+#  else	/* !defined(AFS_SUN5_ENV) */
+typedef struct afs_bozoLock afs_bozoLock_t;
+#  endif	/* defined(AFS_SUN5_ENV) */
+# endif	/* !defined(AFS_NOBOZO_LOCK) */
+
+#define	KERNEL
+#include <afs/afs.h>
+#undef	KERNEL
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static struct volume *getvolume,(struct VenusFid *f, int *vols));
+_PROTOTYPE(static int is_rootFid,(struct vcache *vc, int *rfid));
+
+
+/*
+ * alloc_vcache() - allocate space for vcache structure
+ */
+
+struct vnode *
+alloc_vcache()
+{
+	return((struct vnode *)malloc(sizeof(struct vcache)));
+}
+
+
+/*
+ * ckAFSsym() - check for missing X_AFS_* symbols in AFS name list file
+ */
+
+void
+ckAFSsym(nl)
+	struct nlist *nl;		/* copy of Nl[] when empty */
+{
+	char *path = AFSAPATHDEF;
+	int i;
+	KA_T v;
+
+# if	defined(HASAOPT)
+	if (AFSApath)
+	    path = AFSApath;
+# endif	/* defined(HASAOPT) */
+
+/*
+ * If an alternate AFS name list file was specified, see if it can be read.
+ */
+	if (!is_readable(path, 0)) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't access AFS name list file: %s\n",
+		    Pn, path);
+	    return;
+	}
+/*
+ * Read the AFS modload symbols and compare its non-zero values with
+ * the non-zero values in Nl[].  Quit if there is any mis-match.
+ */
+	if (nlist(path, nl) < 0)
+	    return;
+	for (i = 0; Nl[i].n_name && Nl[i].n_name[0]; i++) {
+	    if (!nl[i].n_value || !Nl[i].n_value)
+		continue;
+	    if (nl[i].n_value != Nl[i].n_value)
+		return;
+	}
+/*
+ * If any AFS symbol that doesn't have a value in Nl[] has one from
+ * the AFS modload file, copy its modload value to Nl[].
+ */
+	if ((i = get_Nl_value("arFid", Drive_Nl, &v)) >= 0
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+	if ((i = get_Nl_value("avops", Drive_Nl, &v)) >= 0
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+	if ((i = get_Nl_value("avol", Drive_Nl, &v)) >= 0
+	&&  !Nl[i].n_value && nl[i].n_value)
+	    Nl[i].n_value = nl[i].n_value;
+}
+
+
+/*
+ * getvolume() - get volume structure
+ */
+
+static struct volume *
+getvolume(f, vols)
+	struct VenusFid *f;		/* file ID pointer */
+	int *vols;			/* afs_volumes status return */
+{
+	int i;
+	static KA_T ka = 0;
+	KA_T kh;
+	static struct volume v;
+	KA_T vp;
+	static int w = 0;
+
+	if (!ka) {
+	    if (get_Nl_value("avol", Drive_Nl, &ka) < 0 || !ka) {
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: no kernel address for afs_volumes\n", Pn);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		*vols = 0;
+		return((struct volume *)NULL);
+	    }
+	}
+	*vols = 1;
+	i = (NVOLS - 1) & f->Fid.Volume;
+	kh = (KA_T)((char *)ka + (i * sizeof(struct volume *)));
+	if (kread(kh, (char *)&vp, sizeof(vp)))
+	    return((struct volume *)NULL);
+	while (vp) {
+	    if (kread((KA_T)vp, (char *)&v, sizeof(v)))
+		return((struct volume *)NULL);
+	    if (v.volume == f->Fid.Volume && v.cell == f->Cell)
+		return(&v);
+	    vp = (KA_T)v.next;
+	}
+	return((struct volume *)NULL);
+}
+
+
+/*
+ * hasAFS() - test for AFS presence via vfs structure
+ */
+
+int
+hasAFS(vp)
+	struct vnode *vp;		/* vnode pointer */
+{
+	struct mounts *mp;
+	int n;
+	struct vfs v;
+/*
+ * If this vnode has a v_data pointer, then it probably isn't an AFS vnode;
+ * return FALSE.
+ *
+ * If the vfs struct address of /afs is known and this vnode's v_vfsp matches
+ * it, return TRUE.
+ *
+ * Read this vnode's vfs structure and see if it's device (fsid.val[0]) is
+ * AFSdev.  If it is, record the AFS vfs struct address and return TRUE.
+ */
+	if (AFSVfsp && !vp->v_data && (KA_T)vp->v_vfsp == AFSVfsp)
+	    return(1);
+	if (!AFSdevStat)
+	    (void) readmnt();
+	if (!AFSdevStat
+	||  vp->v_data
+	||  !vp->v_vfsp
+	||  kread((KA_T)vp->v_vfsp, (char *)&v, sizeof(v))
+	||  v.vfs_data)
+	    return(0);
+	if ((dev_t)v.vfs_fsid.val[0] == AFSdev) {
+	    AFSVfsp = (KA_T)vp->v_vfsp;
+	    return(1);
+	}
+/*
+ * Search the local mount table for /afs devices.  Count /afs devices,
+ * and skip a device number test for them.  A match on device number for
+ * non-AFS devices produces a FALSE return.
+ */
+	for (mp = readmnt(), n = 0; mp; mp = mp->next) {
+	    if (AFSdevStat && mp->dev == AFSdev
+	    &&  mp->dir && strcmp(mp->dir, "/afs") == 0
+	    &&  mp->fsname && strcmp(mp->fsname, "AFS") == 0)
+		n++;
+	    else if (mp->dev == (dev_t)v.vfs_fsid.val[0])
+		return(0);
+	}
+/*
+ * If there is exactly one /afs device, assume its vfs struct address is
+ * the one for this vnode, record it, and return TRUE.
+ */
+	if (n == 1) {
+	    AFSVfsp = (KA_T)vp->v_vfsp;
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * is_rootFid() - is the file ID the root file ID
+ *
+ * return: 0	= is not root file ID
+ *	   1	= is root file ID
+ *	   rfid = 0 if root file ID structure address not available
+ *		  1 if root file ID structure address available
+ */
+
+static int
+is_rootFid(vc, rfid)
+	struct vcache *vc;		/* vcache structure */
+	int *rfid;			/* root file ID pointer status return */
+{
+	KA_T arFid;
+	char *err;
+	static int f = 0;		/* rootFid structure status:
+					 *     -1 = unavailable
+					 *	0 = not yet accessed
+					 *	1 = available */
+	static struct VenusFid r;
+	static int w = 0;
+
+	switch (f) {
+	case -1:
+	    if (vc->v.v_flag & VROOT) {
+		*rfid = 1;
+		return(1);
+	    }
+	    *rfid = 0;
+	    return(0);
+	case 0:
+	    if (get_Nl_value("arFid", Drive_Nl, &arFid) < 0 || !arFid) {
+		err = "no afs_rootFid kernel address";
+
+rfid_unavailable:
+
+		if (!w && !Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: AFS root Fid error: %s\n", Pn, err);
+		    (void) fprintf(stderr,
+			"      This may hamper AFS node number reporting.\n");
+		    w = 1;
+		}
+		f = -1;
+		if (vc->v.v_flag & VROOT) {
+		    *rfid = 1;
+		    return(1);
+		}
+		*rfid = 0;
+		return(0);
+	    }
+	    if (kread(arFid, (char *)&r, sizeof(r))) {
+		err = "can't read afs_rootFid from kernel";
+		goto rfid_unavailable;
+	    }
+	    f = 1;
+	    /* fall through */
+	case 1:
+	    *rfid = 1;
+	    if (vc->fid.Fid.Unique == r.Fid.Unique
+	    &&  vc->fid.Fid.Vnode == r.Fid.Vnode
+	    &&  vc->fid.Fid.Volume == r.Fid.Volume
+	    &&  vc->fid.Cell == r.Cell)
+		return(1);
+	}
+	*rfid = 0;
+	return(0);
+}
+
+
+/*
+ * readafsnode() - read AFS node
+ */
+
+int
+readafsnode(va, v, an)
+	KA_T va;			/* kernel vnode address */
+	struct vnode *v;		/* vnode buffer pointer */
+	struct afsnode *an;		/* afsnode recipient */
+{
+	char *cp, tbuf[32];
+	KA_T ka;
+	int len, rfid, vols;
+	struct vcache *vc;
+	struct volume *vp;
+
+	cp = ((char *)v + sizeof(struct vnode));
+	ka = (KA_T)((char *)va + sizeof(struct vnode));
+	len = sizeof(struct vcache) - sizeof(struct vnode);
+	if (kread(ka, cp, len)) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %s: can't read vcache remainder from %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr(ka, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(1);
+	}
+	vc = (struct vcache *)v;
+	if (!AFSdevStat)
+	    (void) readmnt();
+	an->dev = AFSdevStat ? AFSdev: 0;
+	an->size = (unsigned long)vc->m.Length;
+	an->nlink = (long)vc->m.LinkCount;
+	an->nlink_st = 1;
+/*
+ * Manufacture the "inode" number.
+ */
+	if (vc->mvstat == 2) {
+	    if ((vp = getvolume(&vc->fid, &vols))) {
+		an->inode = (INODETYPE)((vp->mtpoint.Fid.Vnode
+			  +		(vp->mtpoint.Fid.Volume << 16))
+			  & 0x7fffffff);
+		if (an->inode == (INODETYPE)0) {
+		    if (is_rootFid(vc, &rfid))
+			an->ino_st = 1;
+		    else if (rfid) {
+			an->inode = (INODETYPE)2;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		} else
+		    an->ino_st = 1;
+	    } else {
+		if (vols) {
+		    an->inode = (INODETYPE)2;
+		    an->ino_st = 1;
+		} else {
+		    if (v->v_flag & VROOT) {
+			an->inode = (INODETYPE)0;
+			an->ino_st = 1;
+		    } else
+			an->ino_st = 0;
+		}
+	    }
+	} else {
+	    an->inode = (INODETYPE)((vc->fid.Fid.Vnode
+		      +			(vc->fid.Fid.Volume << 16))
+		      & 0x7fffffff);
+	    an->ino_st = 1;
+	}
+	return(0);
+}
+#endif	/* defined(HAS_AFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dnode2.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dnode2.c
new file mode 100644
index 0000000..9d6a94f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dnode2.c
@@ -0,0 +1,518 @@
+/*
+ * dnode2.c - Solaris node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode2.c,v 1.23 2010/01/18 19:03:54 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	defined(HASVXFS)
+
+# if	defined(HASVXFSUTIL)
+#include <vxfsutil.h>
+#define	EMSGPFX		"vx_inode: "
+
+_PROTOTYPE(static char *add2em,(char * em, char *fmt, char *arg));
+_PROTOTYPE(static char *ckptr,(char * em, char *ptr, int len, int slen,
+				  char *nm));
+_PROTOTYPE(static char *getioffs,(char **vx,  int *vxl,
+				  char **dev, int *devl,
+				  char **ino, int *inol,
+				  char **nl,  int *nll,
+				  char **sz,  int *szl));
+# else	/* !defined(HASVXFSUTIL) */
+#  if	defined(HASVXFS_FS_H) && !defined(HASVXFS_VX_INODE)
+#undef	fs_bsize
+#include <sys/fs/vx_fs.h>
+#  endif	/* defined(HASVXFS_FS_H) && !defined(HASVXFS_VX_INODE) */
+
+#  if	HASVXFS_SOL_H
+#include <sys/fs/vx_sol.h>
+#  endif	/* defined(HSVXFS_SOL_H) */
+
+#  if	defined(HASVXFS_SOLARIS_H) && defined(HASVXFS_U64_T)
+#include <sys/fs/vx_solaris.h>
+#  endif	/* defined(HASVXFS_SOLARIS_H) && defined(HASVXFS_U64_T) */
+
+#  if	defined(HASVXFS_MACHDEP_H)
+#   if	defined(HASVXFS_OFF32_T) && solaris>=70000
+#define	off32_t	VXFS_off32_t
+#   endif	/* defined(HASVXFS_OFF32_T) && solaris>=70000 */
+#include <sys/fs/vx_machdep.h>
+#  endif	/* defined(HASVXFS_MACHDEP_H) */
+
+#  if	defined(HASVXFS_SOLARIS_H)
+struct kdm_vnode {			/* dummy for <sys/fs/vx_inode.h> */
+    int d1;
+};
+#undef	fs_bsize
+#define	uint16_t	VXFS_uint16_t
+
+#   if	defined(HASVXFS_OFF64_T)
+#define	off64_t		VXFS_off64_t
+#   endif	/* defined(HASVXFS_OFF64_T) */
+
+#  if	defined(HASVXFS_SOLARIS_H) && !defined(HASVXFS_U64_T)
+#include <sys/fs/vx_solaris.h>
+#  endif	/* defined(HASVXFS_SOLARIS_H) && !defined(HASVXFS_U64_T) */
+
+#include <sys/fs/vx_layout.h>
+#include <sys/fs/vx_const.h>
+#include <sys/fs/vx_mlink.h>
+#  endif	/* defined(HASVXFS_SOLARIS_H) */
+
+#include <sys/fs/vx_inode.h>
+# endif	/* defined(HASVXFSUTIL) */
+
+
+# if	defined(HASVXFSUTIL)
+static struct vx_ioffsets Ioffsets;	/* VXFS inode offsets */
+static int Ioffs_state = -1;		/* Ioffsets state:
+					 *   -1 = uninitialized
+					 *    0 = initialized
+					 *   >0 = initialization error */
+
+
+/*
+ * access_vxfs_ioffsets() - access the VXFS inode offsets
+ */
+
+extern int
+access_vxfs_ioffsets()
+{
+
+/*
+ * This operation is done in an external function, so it can be done before
+ * GID permission has been surrendered.
+ */
+	Ioffs_state = vxfsu_get_ioffsets(&Ioffsets, sizeof(Ioffsets));
+	return(Ioffs_state);
+}
+
+
+/*
+ * add2em() - add to error message
+ */
+
+static char *
+add2em(em, fmt, arg)
+	char *em;			/* current error message */
+	char *fmt;			/* message format */
+	char *arg;			/* format's single string argument */
+{
+	MALLOC_S al, eml, nl;
+	char msg[1024];
+	MALLOC_S msgl = (MALLOC_S)sizeof(msg);
+
+	(void) snpf(msg, msgl, fmt, arg);
+	msg[msgl - 1] = '\0';
+	nl = (MALLOC_S)strlen(msg);
+	if (!em) {
+	    al = (MALLOC_S)strlen(EMSGPFX) + nl + 1;
+	    em = (char *)malloc((MALLOC_S)al);
+	    eml = (MALLOC_S)0;
+	} else {
+	    if (!(eml = (MALLOC_S)strlen(em))) {
+		(void) fprintf(stderr, "%s: add2em: previous message empty\n",
+		    Pn);
+		Exit(1);
+	    }
+	    al = eml + nl + 3;
+	    em = (char *)realloc((MALLOC_P *)em, al);
+	}
+	if (!em) {
+	    (void) fprintf(stderr, "%s: no VxFS error message space\n", Pn);
+	    Exit(1);
+	}
+	(void) snpf(em + eml, al - eml, "%s%s%s",
+	    eml ? "" : EMSGPFX,
+	    eml ? "; " : "",
+	    msg);
+	return(em);
+}
+
+
+/*
+ * ckptr() - check pointer and length
+ */
+
+static char *
+ckptr(em, ptr, len, slen, nm)
+	char *em;			/* pointer to previous error message */
+	char *ptr;			/* pointer to check */
+	int len;			/* pointer's value length */
+	int slen;			/* value's storage length */
+	char *nm;			/* element name */
+{
+
+#if	defined(_LP64)
+#define	PTR_CAST	unsigned long long
+#else	/* !defined(_LP64) */
+#define	PTR_CAST	unsigned long
+#endif	/* defined(_LP64) */
+
+	PTR_CAST m;
+	char tbuf[1024];
+
+	if (!ptr)
+	    return(add2em(em, "no %s pointer", nm ? nm : "(null)"));
+	if (len > slen) {
+	    (void) snpf(tbuf, sizeof(tbuf) - 1,
+		"%s size, %d, > %d",
+		nm ? nm : "(null)",
+		len, slen);
+	    tbuf[sizeof(tbuf) - 1] = '\0';
+	    return(add2em(em, "%s", tbuf));
+	}
+	if ((m = (PTR_CAST)(len - 1)) < (PTR_CAST)1)
+	    return(em);
+	if ((PTR_CAST)ptr & m)
+	    return(add2em(em, "%s misaligned", nm ? nm : "(null)"));
+	return(em);
+}
+
+
+/*
+ * getioffs() - get the vx_inode offsets
+ */
+
+static char *
+getioffs(vx, vxl, dev, devl, ino, inol, nl, nll, sz, szl)
+	char **vx;		/* pointer to allocated vx_inode space */
+	int *vxl;		/* sizeof(*vx) */
+	char **dev;		/* pointer to device number element of *vx */
+	int *devl;		/* sizeof(*dev) */
+	char **ino;		/* pointer to node number element of *vx */
+	int *inol;		/* sizeof(*ino) */
+	char **nl;		/* pointer to nlink element of *vx */
+	int *nll;		/* sizeof(*nl) */
+	char **sz;		/* pointer to size element of *vx */
+	int *szl;		/* sizeof(*sz) */
+{
+	char *tv;
+	int tvl;
+
+	if (Ioffs_state)
+	    return(add2em((char *)NULL, "%s error", "vxfsu_get_ioffsets"));
+	tvl = (int)(Ioffsets.ioff_dev + Ioffsets.ioff_dev_sz);
+	if ((Ioffsets.ioff_nlink + Ioffsets.ioff_nlink_sz) > tvl)
+	    tvl = (int)(Ioffsets.ioff_nlink + Ioffsets.ioff_nlink_sz);
+	if ((Ioffsets.ioff_number + Ioffsets.ioff_number_sz) > tvl)
+	    tvl = (int)(Ioffsets.ioff_number + Ioffsets.ioff_number_sz);
+	if ((Ioffsets.ioff_size + Ioffsets.ioff_size_sz) > tvl)
+	    tvl = (int)(Ioffsets.ioff_size + Ioffsets.ioff_size_sz);
+	if (!tvl)
+	    return(add2em((char *)NULL, "zero length %s", "vx_inode"));
+	if (!(tv = (char *)malloc((MALLOC_S)tvl))) {
+	    (void) fprintf(stderr, "%s: no vx_inode space\n", Pn);
+	    Exit(1);
+	}
+	*vx = tv;
+	*vxl = tvl;
+	*dev = tv + Ioffsets.ioff_dev;
+	*devl = (int)Ioffsets.ioff_dev_sz;
+	*ino = tv + Ioffsets.ioff_number;
+	*inol = (int)Ioffsets.ioff_number_sz;
+	*nl = tv + Ioffsets.ioff_nlink;
+	*nll = (int)Ioffsets.ioff_nlink_sz;
+	*sz = tv + Ioffsets.ioff_size;
+	*szl = (int)Ioffsets.ioff_size_sz;
+	return((char *)NULL);
+}
+
+
+#  if	defined(HASVXFSRNL)
+
+#define	RNLCINIT	64		/* inital RNL cache size */
+#define	RNLCINCR	32		/* RNL cache increment */
+
+/*
+ * print_vxfs_rnl_path() -- print VxFS RNL path
+ */
+
+int
+print_vxfs_rnl_path(lf)
+	struct lfile *lf;		/* file whose name is to be printed */
+{
+	char **bp = (char **)NULL;
+	int i, j, n, p;
+	typedef struct rmc {		/* RNL mount point cache */
+	    char *mp;			/* mount point */
+	    unsigned char s;		/* RNL status: 0 = supported
+					 *	       1 = not supported */
+	} rmc_t;
+	static rmc_t *rm = (rmc_t *)NULL;
+					/* RNL mount point cache */
+	static int rma = 0;		/* allocated cache entries */
+	static int rmu = 0;		/* used cache entries */
+	size_t sz;
+/*
+ * This must be a VxFS file, it must have an inode and its mount point must
+ * be known.
+ */
+	if (!lf->is_vxfs || (lf->inp_ty != 1) || !lf->fsdir)
+	    return(0);
+/*
+ * Locate or create an RNL mount point cache entry.
+ */
+	for (i = 0; i < rmu; i++) {
+	    if (rm[i].mp == lf->fsdir)
+		break;
+	}
+	if (i >= rmu) {
+
+	/*
+	 * A new entry must be created.
+	 */
+	    if (i >= rma) {
+
+	    /*
+	     * RNL mount point cache space must be allocated.
+	     */
+		rma += rm ? RNLCINCR : RNLCINIT;
+		sz = (size_t)(rma * sizeof(rmc_t));
+		if (rm)
+		    rm = (rmc_t *)realloc((MALLOC_P *)rm, (MALLOC_S)sz);
+		else
+		    rm = (rmc_t *)malloc((MALLOC_S)sz);
+		if (!rm) {
+		    (void) fprintf(stderr,
+			"%s: no RNL mount point cache space\n", Pn);
+		    Exit(1);
+		}
+	    }
+	    i = rmu;
+	    rm[rmu].mp = lf->fsdir;
+	    rm[rmu++].s = 0;
+	}
+	if (rm[i].s)
+	    return(0);
+/*
+ * Get the RNL path for this mount point and inode.
+ */
+	if (vxfs_inotopath(lf->fsdir, (uint64_t)lf->inode, 0, &bp, &n)) {
+	    if (errno == ENOTSUP)
+		rm[i].s = 1;
+	    return(0);
+	}
+/*
+ * Print the first RNL path, then free the allocated function reply space.
+ */
+	if (bp) {
+	    for (j = 0; j < n; j++) {
+		if (bp[j] && *bp[j]) {
+		    safestrprt(bp[j], stdout, 0);
+		    p = 1;
+		    break;
+		}
+	    }
+	    for (j = 0; j < n; j++) {
+		if (bp[j])
+		     (void) free((FREE_P *)bp[j]);
+	    }
+	    (void) free((FREE_P *)bp);
+	} else
+	    p = 0;
+	return(p);
+}
+#  endif	/* defined(HASVXFSRNL) */
+# endif	/* defined(HASVXFSUTIL) */
+
+
+/*
+ * read_vxnode() - read Veritas file system inode information
+ */
+
+int
+read_vxnode(va, v, vfs, fx, li, vnops)
+	KA_T va;			/* containing vnode's address */
+	struct vnode *v;		/* containing vnode */
+	struct l_vfs *vfs;		/* local vfs structure */
+	int fx;				/* file system index (-1 if none) */
+	struct l_ino *li;		/* local inode value receiver */
+	KA_T *vnops;			/* table of VxFS v_op values */
+{
+	struct vnode cv;
+	char tbuf[32];
+
+# if	defined(HASVXFS_VX_INODE)
+	struct vx_inode vx;
+	int vxl = (int)sizeof(vx);
+	dev_t *vxn_dev = (dev_t *)&vx.i_dev;
+	int *vxn_nlink = (int *)&vx.i_nlink;
+	unsigned int *vxn_ino = (unsigned int *)&vx.i_number;
+	SZOFFTYPE *vxn_sz = (SZOFFTYPE *)&vx.i_size;
+	char *vxp = (char *)&vx;
+# else	/* !defined(HASVXFS_VX_INODE) */
+#  if	defined(HASVXFSUTIL)
+	static char *em = (char *)NULL;
+	int devl, nll, szl;
+	static int inol;
+	static char *vxp = (char *)NULL;
+	static int vxl = 0;
+	static dev_t *vxn_dev = (dev_t *)NULL;
+	static int *vxn_nlink = (int *)NULL;
+	static char *vxn_ino = (char *)NULL;
+	static SZOFFTYPE *vxn_sz = (SZOFFTYPE *)NULL;
+#  else	/* !defined(HASVXFSUTIL) */
+	struct inode vx;
+	int vxl = sizeof(vx);
+	dev_t *vxn_dev = (dev_t *)&vx.i_dev;
+	int *vxn_nlink = (int *)&vx.i_nlink;
+	long *vxn_ino = (long *)&vx.i_number;
+	SZOFFTYPE *vxn_sz = (SZOFFTYPE *)&vx.i_size;
+	char *vxp = (char &)&vx;
+#  endif	/* defined(HASVXFSUTIL) */
+# endif	/* defined(HASVXFS_VX_INODE) */
+
+	li->dev_def = li->ino_def = li->nl_def = li->rdev_def = li->sz_def = 0;
+/*
+ * See if this is vnode is served by fdd_chain_vnops.  If it is, its
+ * v_data pointer leads to the "real" vnode.
+ */
+	if (v->v_data && v->v_op && (VXVOP_FDDCH < VXVOP_NUM)
+	&&  vnops[VXVOP_FDDCH] && ((KA_T)v->v_op == vnops[VXVOP_FDDCH]))
+	{
+	    if (kread((KA_T)v->v_data, (char *)&cv, sizeof(cv))) {
+		(void) snpf(Namech, Namechl,
+		    "node at %s: can't read real vx vnode: %s",
+		    print_kptr(va, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return(1);
+	    }
+
+# if	defined(HASNCACHE)
+	    Lf->na = (KA_T)v->v_data;
+# endif	/* defined(HASNCACHE) */
+
+	    *v = cv;
+	    Ntype = vop2ty(v, fx);
+	}
+
+#  if	defined(HASVXFSUTIL)
+/*
+ * If libvxfsutil[64].a is in use, establish the vx_inode size and the
+ * locations and sizes of its device, link count, node number, and size
+ * elements.
+ *
+ * If an error was detected while determining the vx_inode values, repeat
+ * the error explanation in the NAME column.
+ */
+	if (!vxp && !em) {
+	    em = getioffs(&vxp, &vxl,
+			  (char **)&vxn_dev, &devl,
+			  &vxn_ino, &inol,
+			  (char **)&vxn_nlink, &nll,
+			  (char **)&vxn_sz, &szl);
+	    if (!em) {
+
+	    /*
+	     * Check the returned pointers and their sizes.
+	     */
+		em = ckptr(em, (char *)vxn_dev, devl, sizeof(dev_t), "dev");
+		em = ckptr(em, (char *)vxn_ino, inol, sizeof(INODETYPE), "ino");
+		em = ckptr(em, (char *)vxn_nlink, nll, sizeof(int), "nlink");
+		em = ckptr(em, (char *)vxn_sz, szl, sizeof(SZOFFTYPE), "sz");
+	    }
+	}
+	if (em) {
+	    (void) snpf(Namech, Namechl, "%s", em);
+	    (void) enter_nm(Namech);
+	    return(1);
+	}
+#  endif	/* !defined(HASVXFSUTIL) */
+
+/*
+ * Read vnode's vx_inode.
+ */
+	if (!v->v_data || kread((KA_T)v->v_data, vxp, vxl)) {
+	    (void) snpf(Namech, Namechl, "node at %s: can't read vx_inode: %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+	    (void) enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * Return device number, inode number, link count, raw device number, and size.
+ */
+	if (vfs && vfs->fsname) {
+	    li->dev = (dev_t)vfs->dev;
+	    li->dev_def = 1;
+	} else if (vxn_dev) {
+	    li->dev = (dev_t)*vxn_dev;
+	    li->dev_def = 1;
+	}
+	if (vxn_ino) {
+
+# if	defined(HASVXFSUTIL)
+	    switch (inol) {
+	    case sizeof(short):
+		li->ino = (INODETYPE)*((short *)vxn_ino);
+		li->ino_def = 1;
+		break;
+	    case sizeof(unsigned int):
+		li->ino = (INODETYPE)*((unsigned int *)vxn_ino);
+		li->ino_def = 1;
+		break;
+	    case sizeof(unsigned long long):
+		li->ino = (INODETYPE)*((unsigned long long *)vxn_ino);
+		li->ino_def = 1;
+		break;
+	    default:
+		break;
+	    }
+# else	/* !defined(HASVXFSUTIL) */
+	    li->ino = (INODETYPE)*vxn_ino;
+	    li->ino_def = 1;
+# endif	/* defined(HASVXFSUTIL) */
+
+	}
+	if (vxn_nlink) {
+	    li->nl = (long)*vxn_nlink;
+	    li->nl_def = 1;
+	}
+	li->rdev = v->v_rdev;
+	li->rdev_def = 1;
+	if (vxn_sz) {
+	    li->sz = (SZOFFTYPE)*vxn_sz;
+	    li->sz_def = 1;
+	}
+	return(0);
+}
+#endif	/* defined(HASVXFS) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dproc.c
new file mode 100644
index 0000000..eecdf1f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dproc.c
@@ -0,0 +1,2239 @@
+/*
+ * dproc.c - Solaris lsof functions for accessing process information
+ */
+
+
+/*
+ * 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.36 2010/01/18 19:03:54 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+#if	solaris<20500
+#include "kernelbase.h"
+#endif	/* solaris<20500 */
+
+#if	defined(HAS_CRED_IMPL_H)
+# if	solaris>=110000
+#define	_KERNEL
+# endif	/* solaris>=110000 */
+
+#include <sys/cred_impl.h>
+
+# if	solaris>=110000
+#undef	_KERNEL
+# endif	/* solaris>=110000 */
+#endif	/* defined(HAS_CRED_IMPL_H) */
+
+
+/*
+ * Local definitions
+ */
+
+#if	defined(__sparc) || defined(__sparcv9)
+#define	ARCH64B	"sparcv9"
+#else	/* !defined(__sparc) && !defined(__sparcv9) */
+# if	defined(__i386) || defined(__amd64)
+#define	ARCH64B	"amd64"
+# endif	/* defined(__i386) || defined(__amd64) */
+#endif	/* defined(__sparc) || defined(__sparcv9) */
+
+#if	solaris>=20501
+#define	KVMHASHBN	8192		/* KVM hash bucket count -- MUST BE
+					 * A POWER OF 2!!! */
+#define	HASHKVM(va)	((int)((va * 31415) >> 3) & (KVMHASHBN-1))
+					/* virtual address hash function */
+
+# if	solaris<70000
+#define	KAERR	(u_longlong_t)-1	/* kvm_physaddr() error return */
+#define	KBUFT	char			/* kernel read buffer type */
+#define	KPHYS	u_longlong_t		/* kernel physical address type */
+#define	KVIRT	u_int			/* kernel virtual address type */
+# else	/* solaris>=70000 */
+#define	KAERR	(uint64_t)-1		/* kvm_physaddr() error return */
+#define	KBUFT	void			/* kernel read buffer type */
+#define	KPHYS	uint64_t		/* kernel physical address type */
+#define	KVIRT	uintptr_t		/* kernel virtual address type */
+# endif	/* solaris<70000 */
+#endif	/* solaris>=20501 */
+
+
+/*
+ * Local structures
+ */
+
+#if	solaris>=20501
+typedef struct kvmhash {
+	KVIRT vpa;			/* virtual page address */
+	KPHYS pa;			/* physical address */
+	struct kvmhash *nxt;		/* next virtual address */
+} kvmhash_t;
+#endif	/* solaris>=20501 */
+
+
+/*
+ * Local variables
+ */
+
+#if	solaris>=20501
+static struct as *Kas = (struct as *)NULL;
+					/* pointer to kernel's address space
+					 * map in kernel virtual memory */
+static kvmhash_t **KVMhb = (kvmhash_t **)NULL;
+					/* KVM hash buckets */
+static int PageSz = 0;			/* page size */
+static int PSMask = 0;			/* page size mask */
+static int PSShft = 0;			/* page size shift */
+
+# if	solaris<70000
+static struct as Kam;			/* kernel's address space map */
+static int Kmd = -1;			/* memory device file descriptor */
+# endif	/* solaris<70000 */
+#endif	/* solaris>=20501 */
+
+#if	solaris>=20500
+static KA_T Kb = (KA_T)NULL;		/* KERNELBASE for Solaris 2.5 */
+#endif	/* solaris>=20500 */
+
+static int Np;				/* number of P[], Pgid[] and Pid[]
+					 * entries  */
+static int Npa = 0;			/* number of P[], Pgid[] and Pid[]
+					 * entries for which space has been
+					 * allocated */
+static struct proc *P = NULL;		/* local proc structure table */
+static int *Pgid = NULL;		/* process group IDs for P[] entries */
+static int *Pid = NULL;			/* PIDs for P[] entries */
+static KA_T PrAct = (KA_T)NULL;		/* kernel's *practive address */
+static gid_t Savedgid;			/* saved (effective) GID */
+static KA_T Sgvops;			/* [_]segvn_ops address */
+static int Switchgid = 0;		/* must switch GIDs for kvm_open() */
+
+#if	defined(HASZONES)
+static znhash_t **ZoneNm = (znhash_t **)NULL;
+					/* zone names hash buckets */
+#endif	/* defined(HASZONES) */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void get_kernel_access,(void));
+_PROTOTYPE(static void process_text,(KA_T pa));
+_PROTOTYPE(static void read_proc,(void));
+_PROTOTYPE(static void readfsinfo,(void));
+
+#if	solaris>=20501
+_PROTOTYPE(static void readkam,(KA_T addr));
+#endif	/* solaris>=20501 */
+
+#if	solaris>=20501 && solaris<70000
+_PROTOTYPE(extern u_longlong_t kvm_physaddr,(kvm_t *, struct as *, u_int));
+#endif	/* solaris>=20501 && solaris<70000 */
+
+#if	defined(HASZONES)
+_PROTOTYPE(static int hash_zn,(char *zn));
+#endif	/* defined(HASZONES) */
+
+
+
+/*
+ * close_kvm() - close kernel virtual memory access
+ */
+
+void
+close_kvm()
+{
+	if (!Kd)
+	    return;
+	if (Kd) {
+	    if (kvm_close(Kd) != 0) {
+		(void) fprintf(stderr, "%s: kvm_close failed\n", Pn);
+		Exit(1);
+	    }
+	    Kd = (kvm_t *)NULL;
+	}
+
+#if	solaris>=20501 && solaris<70000
+	if (Kmd >= 0) {
+	    (void) close(Kmd);
+	    Kmd = -1;
+	}
+#endif	/* solaris>=20501 && solaris<70000 */
+
+}
+
+
+/*
+ * gather_proc_info() - gather process information
+ */
+
+void
+gather_proc_info()
+{
+	short cckreg;			/* conditional status of regular file
+					 * checking:
+					 *     0 = unconditionally check
+					 *     1 = conditionally check */
+	short ckscko;			/* socket file only checking status:
+					 *     0 = none
+					 *     1 = check only socket files,
+					 *	   including TCP and UDP
+					 *	   streams with eXPORT data,
+					 *	   where supported */
+	static int ft = 1;
+	int i, j;
+	struct proc *p;
+	int pgid, pid, px;
+	long pofv;
+	short pss, sf;
+	struct user *u;
+	uid_t uid;
+
+#if	solaris>=20400
+	int k;
+
+# if	!defined(NFPCHUNK)
+#define	uf_ofile	uf_file
+#define	uf_pofile	uf_flag
+#define	u_flist		u_finfo.fi_list
+#define	u_nofiles	u_finfo.fi_nfiles
+#define	NFPREAD		64
+# else	/* defined(NFPCHUNK) */
+#define	NFPREAD		NFPCHUNK
+# endif	/* !defined(NFPCHUNK) */
+	uf_entry_t uf[NFPREAD];
+#endif	/* solaris>=20400 */
+#if	solaris>=20500
+	struct cred pc;
+#endif	/* solaris>=20500 */
+
+#if	defined(HASZONES)
+	struct zone z;
+	int zh;
+	char zn[ZONENAME_MAX + 1];
+	znhash_t *zp, *zpn;
+#endif	/* defined(HASZONES) */
+
+	if (ft) {
+/*
+ * Do first-time only operations.
+ */
+	/*
+	 * Get the segment vnodeops address.
+	 */
+	    if (get_Nl_value("sgvops", Drive_Nl, &Sgvops) < 0)
+		Sgvops = (KA_T)NULL;
+	    ft = 0;
+	} else if (!HasALLKMEM) {
+
+	/*
+	 * If not the first time and the ALLKMEM device isn't available, it is
+	 * necessary to close and reopen the KVM device, so that kvm_open()
+	 * will acquire a fresh address for the head of the linked list process
+	 * table.
+	 */
+	    close_kvm();
+	    open_kvm();
+
+#if	solaris>=20501
+	/*
+	 * If not the first time and the ALLKMEM device isn't available,
+	 * re-read the kernel's address space map.
+	 */
+	    readkam((KA_T)NULL);
+#endif	/* solaris>=20501 */
+
+	}
+/*
+ * Define socket and regular file conditional processing flags.
+ *
+ * If only socket files have been selected, or socket files have been
+ * selected, ANDed with other selection options, enable the skipping of
+ * regular files.
+ *
+ * If socket files and some process options have been selected, enable
+ * conditional skipping of regular file; i.e., regular files will be skipped
+ * unless they belong to a process selected by one of the specified options.
+ */
+	if (Selflags & SELNW) {
+
+	/*
+	 * Some network files selection options have been specified.
+	 */
+	    if (Fand || !(Selflags & ~SELNW)) {
+
+	    /*
+	     * Selection ANDing or only network file options have been
+	     * specified, so set unconditional skipping of regular files
+	     * and socket file only checking.
+	     */
+		cckreg = 0;
+		ckscko = 1;
+	    } else {
+
+	    /*
+	     * If ORed file selection options have been specified, or no
+	     * ORed process selection options have been specified, enable
+	     * unconditional file checking and clear socket file only
+	     * checking.
+	     *
+	     * If only ORed process selection options have been specified,
+	     * enable conditional file skipping and socket file only checking.
+	     */
+		if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+		    cckreg = ckscko = 0;
+		else
+		    cckreg = ckscko = 1;
+	    }
+	} else {
+
+	/*
+	 * No network file selection options were specified.  Enable
+	 * unconditional file checking and clear socket file only checking.
+	 */
+	    cckreg = ckscko = 0;
+	}
+/*
+ * Read the process table.
+ */
+	read_proc();
+/*
+ * Loop through processes.
+ */
+	for (p = P, px = 0; px < Np; p++, px++) {
+
+	/*
+	 * Get the process ID.
+	 */
+
+	    if (Fpgid)
+		pgid = Pgid[px];
+	    else
+		pgid = 0;
+	    pid = Pid[px];
+
+#if solaris<20500
+	    uid = p->p_uid;
+#else	/* solaris >=20500 */
+	/*
+	 * Read credentials for Solaris 2.5 and above process.
+	 */
+	    if (kread((KA_T)p->p_cred, (char *)&pc, sizeof(pc)))
+		continue;
+	    uid = pc.cr_uid;
+#endif	/* solaris<20500 */
+
+	/*
+	 * See if the process is excluded.
+	 */
+	    if  (is_proc_excl(pid, pgid, (UID_ARG)uid, &pss, &sf))
+		continue;
+
+#if	defined(HASZONES)
+	/*
+	 * If the -z (zone) option was specified, get the zone name.
+	 */
+	    if (Fzone) {
+		zn[0] = zn[sizeof(zn) - 1] = '\0';
+		if (p->p_zone
+		&& !kread((KA_T)p->p_zone, (char *)&z, sizeof(z)))
+		{
+		    if (!z.zone_name
+		    ||  kread((KA_T)z.zone_name, (char *)&zn, sizeof(zn) - 1))
+			zn[0] = '\0';
+		}
+	    }
+#endif	/* defined(HASZONES) */
+
+	/*
+	 * Get the user area associated with the process.
+	 */
+	    u = &p->p_user;
+	/*
+	 * Allocate a local process structure and start filling it.
+	 */
+	    if (is_cmd_excl(u->u_comm, &pss, &sf))
+		continue;
+	    if (cckreg) {
+
+	    /*
+	     * If conditional checking of regular files is enabled, enable
+	     * socket file only checking, based on the process' selection
+	     * status.
+	     */
+		ckscko = (sf & SELPROC) ? 0 : 1;
+	    }
+	    alloc_lproc(pid, pgid, (int)p->p_ppid, (UID_ARG)uid, u->u_comm,
+		(int)pss, (int)sf);
+	    Plf = (struct lfile *)NULL;
+
+#if	defined(HASZONES)
+	/*
+	 * If zone processing is enabled and requested, and if there is a zone
+	 * name:
+	 *
+	 *	o Skip processes excluded by zone name.
+	 *	o Save zone name.
+	 */
+	    if (Fzone && zn[0]) {
+		zh = hash_zn(zn);
+		if (ZoneArg) {
+
+		/*
+		 * See if zone name excludes the process.
+		 */
+		    for (zp = ZoneArg[zh]; zp; zp = zp->next) {
+			if (!strcmp(zn, zp->zn))
+			    break;
+		    }
+		    if (!zp)
+			continue;
+		    zp->f = 1;
+		    Lp->pss |= PS_PRI;
+		    Lp->sf |= SELZONE;
+		}
+	    /*
+	     * Make sure the zone name is cached, then save a pointer to it in
+	     * the local proc structure.
+	     */
+		if (!ZoneNm) {
+		    if (!(ZoneNm = (znhash_t **)calloc(HASHZONE,
+					        sizeof(znhash_t *))))
+		    {
+			(void) fprintf(stderr,
+			    "%s: no space for zone name hash\n", Pn);
+			Exit(1);
+		    }
+		}
+		for (zp = ZoneNm[zh]; zp; zp = zp->next) {
+		    if (!strcmp(zn, zp->zn))
+			break;
+		}
+		if (!zp) {
+
+		/*
+		 * The zone name isn't cached, so cache it.
+		 */
+		    if (!(zp = (znhash_t *)malloc((MALLOC_S)sizeof(znhash_t))))
+		    {
+			(void) fprintf(stderr,
+			    "%s: no zone name cache space: %s\n", Pn, zn);
+			Exit(1);
+		    }
+		    if (!(zp->zn = mkstrcpy(zn, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr,
+			    "%s: no zone name space at PID %d: %s\n",
+			    Pn, (int)Lp->pid, zn);
+			Exit(1);
+		    }
+		    zp->next = ZoneNm[zh];
+		    ZoneNm[zh] = zp;
+		}
+		Lp->zn = zp->zn;
+	    }
+#endif	/* defined(HASZONES) */
+
+	/*
+	 * Save file count.
+	 */
+	    Unof = u->u_nofiles;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (!ckscko && u->u_cdir) {
+		alloc_lfile(CWD, -1);
+
+#if	defined(FILEPTR)
+		FILEPTR = (struct file *)NULL;
+#endif	/* defined(FILEPTR) */
+
+		process_node((KA_T)u->u_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (!ckscko && u->u_rdir) {
+		alloc_lfile(RTD, -1);
+
+#if	defined(FILEPTR)
+		FILEPTR = (struct file *)NULL;
+#endif	/* defined(FILEPTR) */
+
+		process_node((KA_T)u->u_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save information on text files.
+	 */
+	    if (!ckscko && p->p_as && Sgvops) {
+
+#if	defined(FILEPTR)
+		FILEPTR = (struct file *)NULL;
+#endif	/* defined(FILEPTR) */
+
+		process_text((KA_T)p->p_as);
+	    }
+	/*
+	 * Save information on file descriptors.
+	 *
+	 * Under Solaris the file pointers are stored in dynamically-linked
+	 * ufchunk structures, each containing NFPREAD file pointers.  The
+	 * first ufchunk structure is in the user area.
+	 *
+	 * Under Solaris 2.4 the file pointers are in a dynamically allocated,
+	 * contiguous memory block.
+	 */
+
+#if	solaris<20400
+	    for (i = 0, j = 0; i < u->u_nofiles; i++) {
+		if (++j > NFPCHUNK) {
+		    if (!u->u_flist.uf_next)
+			break;
+		    if (kread((KA_T)u->u_flist.uf_next,
+			(char *)&u->u_flist, sizeof(struct ufchunk)))
+			    break;
+		    j = 1;
+		}
+		if (!u->u_flist.uf_ofile[j-1])
+#else	/* solaris>=20400 */
+	    for (i = 0, j = NFPREAD; i < u->u_nofiles; i++) {
+		if (++j > NFPREAD) {
+		    k = u->u_nofiles - i;
+		    if (k > NFPREAD)
+			k = NFPREAD;
+		    if (kread((KA_T)((unsigned long)u->u_flist +
+				     i * sizeof(uf_entry_t)),
+				     (char*)&uf, k * sizeof(uf_entry_t)))
+		    {
+			break;
+		    }
+		    j = 1;
+		}
+		if (!uf[j-1].uf_ofile)
+#endif	/* solaris<20400 */
+
+		    continue;
+		alloc_lfile((char *)NULL, i);
+
+#if	solaris<20400
+		pofv = (long)u->u_flist.uf_pofile[j-1];
+		process_file((KA_T)u->u_flist.uf_ofile[j-1]);
+#else	/* solaris>=20400 */
+		pofv = uf[j-1].uf_pofile;
+		process_file((KA_T)uf[j-1].uf_ofile);
+#endif	/* solaris <20400 */
+
+		if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+		    if (Fsv & FSV_FG)
+			Lf->pof = pofv;
+#endif	/* defined(HASFSTRUCT) */
+
+		    link_lfile();
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_kernel_access() - access the required information in the kernel
+ */
+
+static void
+get_kernel_access()
+{
+	int i;
+	struct stat sb;
+	KA_T v;
+
+#if	defined(HAS_AFS)
+	struct nlist *nl = (struct nlist *)NULL;
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Check the Solaris or SunOS version number; check the SunOS architecture.
+ */
+	(void) ckkv("Solaris", LSOF_VSTR, (char *)NULL, (char *)NULL);
+
+#if	solaris>=70000
+/*
+ * Compare the Solaris 7 and above lsof compilation bit size with the kernel
+ * bit size.
+ *
+ * Quit on a mismatch.
+ */
+	{
+	    char *cp, isa[1024];
+	    short kbits = 32;
+
+# if	defined(_LP64)
+	    short xkbits = 64;
+# else	/* !defined(_LP64) */
+	    short xkbits = 32;
+# endif	/* defined(_LP64) */
+
+	    if (sysinfo(SI_ISALIST, isa, (long)sizeof(isa)) < 0) {
+		(void) fprintf(stderr, "%s: can't get ISA list: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+	    for (cp = isa; *cp;) {
+		if (strncmp(cp, ARCH64B, strlen(ARCH64B)) == 0) {
+		    kbits = 64;
+		    break;
+		}
+		if (!(cp = strchr(cp, ' ')))
+		    break;
+		cp++;
+	    }
+	    if (kbits != xkbits) {
+		(void) fprintf(stderr,
+		    "%s: FATAL: lsof was compiled for a %d bit kernel,\n",
+		    Pn, (int)xkbits);
+		(void) fprintf(stderr,
+		    "      but this machine has booted a %d bit kernel.\n",
+		    (int)kbits);
+		Exit(1);
+	    }
+	}
+#endif	/* solaris>=70000 */
+
+/*
+ * Get kernel symbols.
+ */
+	if (Nmlst && !is_readable(Nmlst, 1))
+	    Exit(1);
+	(void) build_Nl(Drive_Nl);
+
+#if	defined(HAS_AFS)
+	if (!Nmlst) {
+
+	/*
+	 * If AFS is defined and we're getting kernel symbol values from
+	 * from N_UNIX, make a copy of Nl[] for possible use with the AFS
+	 * modload file.
+	 */
+	    if (!(nl = (struct nlist *)malloc(Nll))) {
+		(void) fprintf(stderr, "%s: no space (%d) for Nl[] copy\n",
+		    Pn, Nll);
+		Exit(1);
+	    }
+	    (void) memcpy((void *)nl, (void *)Nl, (size_t)Nll);
+	}
+#endif	/* defined(HAS_AFS) */
+
+	if (nlist(Nmlst ? Nmlst : N_UNIX, Nl) < 0) {
+	    (void) fprintf(stderr, "%s: can't read namelist from %s\n",
+		Pn, Nmlst ? Nmlst : N_UNIX);
+	    Exit(1);
+	}
+
+#if	defined(HAS_AFS)
+	if (nl) {
+
+	/*
+	 * If AFS is defined and we're getting kernel symbol values from
+	 * N_UNIX, and if any X_AFS_* symbols isn't there, see if it is in the
+	 * the AFS modload file.  Make sure that other symbols that appear in
+	 * both name list files have the same values.
+	 */
+	    if ((get_Nl_value("arFID", Drive_Nl, &v) >= 0 && !v)
+	    ||  (get_Nl_value("avops", Drive_Nl, &v) >= 0 && !v)
+	    ||  (get_Nl_value("avol",  Drive_Nl, &v) >= 0 && !v))
+		(void) ckAFSsym(nl);
+	    (void) free((MALLOC_P *)nl);
+	}
+#endif	/* defined(HAS_AFS) */
+
+/*
+ * Determine the availability of the ALLKMEM device.  If it is available, the
+ * active processes will be gathered directly from the active process chain.
+ *
+ * If ALLKMEM isn't available, the active processes will be gathered via the
+ * kvm_*proc() functions.
+ */
+	if (statsafely(ALLKMEM, &sb) == 0)
+	    HasALLKMEM = 1;
+
+#if	defined(HASVXFSUTIL)
+/*
+ * If the VXFS utility library is being used, attempt to get the VXFS inode
+ * offsets before setgid permission is surrendered.
+ */
+	if (access_vxfs_ioffsets() && !Fwarn) {
+
+	/*
+	 * Warn that the VxFS offsets are unavailable.
+	 */
+	    (void) fprintf(stderr,
+		"%s: WARNING: vxfsu_get_ioffsets() returned an error.\n", Pn);
+	    (void) fprintf(stderr,
+		"%s: WARNING: Thus, no vx_inode information is available\n",
+		Pn);
+	    (void) fprintf(stderr,
+		"%s: WARNING: for display or selection of VxFS files.\n", Pn);
+	}
+#endif	/* defined(HASVXFSUTIL) */
+
+#if	defined(WILLDROPGID)
+/*
+ * If Solaris kernel memory is coming from KMEM, the process is willing to
+ * surrender GID permission, and the ALLKMEM device is not available, set up
+ * for GID switching after the first call to open_kvm().
+ */
+	if (!Memory && !HasALLKMEM) {
+	    Savedgid = getegid();
+	    if (Setgid)
+		Switchgid = 1;
+	}
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open access to kernel memory.
+ */
+	open_kvm();
+
+#if	solaris>=20500
+/*
+ * Get the kernel's KERNELBASE value for Solaris 2.5 and above.
+ */
+	v = (KA_T)0;
+	if (get_Nl_value("kbase", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&Kb, sizeof(Kb))) {
+	    (void) fprintf(stderr,
+		"%s: can't read kernel base address from %s\n",
+		Pn, print_kptr(v, (char *)NULL, 0));
+	    Exit(1);
+	}
+#endif	/* solaris>=20500 */
+
+/*
+ * Get the Solaris clone major device number, if possible.
+ */
+	v = (KA_T)0;
+	if ((get_Nl_value("clmaj", Drive_Nl, &v) < 0) || !v) {
+	   if (get_Nl_value("clmaj_alt", Drive_Nl, &v) < 0)
+		v = (KA_T)0;
+	}
+	if (v && kread((KA_T)v, (char *)&CloneMaj, sizeof(CloneMaj)) == 0)
+	    HaveCloneMaj = 1;
+/*
+ * If the ALLKMEM device is available, check for the address of the kernel's
+ * active process chain.  If it's not available, clear the ALLKMEM status.
+ */
+	if (HasALLKMEM) {
+	   if ((get_Nl_value("pract", Drive_Nl, &PrAct) < 0) || !PrAct)
+		HasALLKMEM = 0;
+	}
+
+#if	solaris>=20501
+/*
+ * If the ALLKMEM device isn't available, get the kernel's virtual to physical
+ * map structure for Solaris 2.5.1 and above.
+ */
+	if (!HasALLKMEM) {
+	    if (get_Nl_value("kasp", Drive_Nl, &v) >= 0 && v) {
+		PageSz = getpagesize();
+		PSMask = PageSz - 1;
+		for (i = 1, PSShft = 0; i < PageSz; i <<= 1, PSShft++)
+		    ;
+		(void) readkam(v);
+	    }
+	}
+#endif	/* solaris>=20501 */
+
+#if	defined(WILLDROPGID)
+/*
+ * If the ALLKMEM device is available -- i.e., we're not using the kvm_*proc()
+ * functions to read proc structures -- and if we're willing to drop setgid
+ * permission, do so.
+ */
+	if (HasALLKMEM)
+	    (void) dropgid();
+#endif	/* defined(WILLDROPGID) */
+
+}
+
+
+#if	defined(HASZONES)
+/*
+ * enter_zone_arg() - enter zone name argument
+ */
+
+int
+enter_zone_arg(zn)
+	char *zn;				/* zone name */
+{
+	int zh;
+	znhash_t *zp, *zpn;
+/*
+ * Allocate zone argument hash space, as required.
+ */
+	if (!ZoneArg) {
+	    if (!(ZoneArg = (znhash_t **)calloc(HASHZONE, sizeof(znhash_t *))))
+	    {
+		(void) fprintf(stderr, "%s: no space for zone arg hash\n", Pn);
+		Exit(1);
+	    }
+	}
+/*
+ * Hash the zone name and search the argument hash.
+ */
+	zh = hash_zn(zn);
+	for (zp = ZoneArg[zh]; zp; zp = zp->next) {
+	    if (!strcmp(zp->zn, zn))
+		break;
+	}
+	if (zp)	{
+
+	/*
+	 * Process a duplicate.
+	 */
+	    if (!Fwarn)
+		(void) fprintf(stderr, "%s: duplicate zone name: %s\n", Pn, zn);
+	    return(1);
+	}
+/*
+ * Create a new hash entry and link it to its bucket.
+ */
+	if (!(zpn = (znhash_t *)malloc((MALLOC_S)sizeof(znhash_t)))) {
+	    (void) fprintf(stderr, "%s no hash space for zone: %s\n", Pn, zn);
+	    Exit(1);
+	}
+	zpn->f = 0;
+	zpn->zn = zn;
+	zpn->next = ZoneArg[zh];
+	ZoneArg[zh] = zpn;
+	return(0);
+}
+
+
+/*
+ * hash_zn() - hash zone name
+ */
+
+static int
+hash_zn(zn)
+	char *zn;				/* zone name */
+{
+	register int i, h;
+	size_t l;
+
+	if (!(l = strlen(zn)))
+	    return(0);
+	if (l == 1)
+	    return((int)*zn & (HASHZONE - 1));
+	for (i = h = 0; i < (int)(l - 1); i++) {
+	    h ^= ((int)zn[i] * (int)zn[i+1]) << ((i*3)%13);
+	}
+	return(h & (HASHZONE - 1));
+}
+#endif	/* defined(HASZONES) */
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+/*
+ * Read Solaris file system information and construct the clone table.
+ *
+ * The clone table is needed to identify sockets.
+ */
+	readfsinfo();
+
+#if	defined(HASDCACHE)
+	readdev(0);
+#else	/* !defined(HASDCACHE) */
+	read_clone();
+#endif	/*defined(HASDCACHE) */
+
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	register int br;
+/*
+ * Because lsof reads kernel data and follows pointers found there at a
+ * rate considerably slower than the kernel, lsof sometimes acquires
+ * invalid pointers.  If the invalid pointers are fed to kvm_[k]read(),
+ * a segmentation violation may result, so legal kernel addresses are
+ * limited by the value of the KERNELBASE symbol (Kb value from the
+ * kernel's _kernelbase variable for Solaris 2.5 and above).
+ */
+
+#if	solaris>=20500
+#define	KVMREAD	kvm_kread
+	if (addr < Kb)
+#else	/* solaris<20500 */
+#define	KVMREAD kvm_read
+	if (addr < (KA_T)KERNELBASE)
+#endif	/* solaris>=20500 */
+
+	    return(1);
+
+#if	solaris>=20501
+
+/*
+ * Do extra address checking for Solaris above 2.5 when the ALLKMEM device
+ * isn't available.
+ *
+ * Make sure the virtual address represents real physical memory by testing
+ * it with kvm_physaddr().
+ *
+ * For Solaris below 7 read the kernel data with llseek() and read().  For
+ * Solaris 7 and above use kvm_pread().
+ */
+	if (Kas && !HasALLKMEM) {
+
+# if	solaris>20501
+	    register int b2r;
+	    register char *bp;
+# endif	/* solaris>20501 */
+
+	    register int h, ip, tb;
+	    register kvmhash_t *kp;
+	    KPHYS pa;
+	    register KVIRT va, vpa;
+
+# if	solaris<20600
+	    for (tb = 0, va = (KVIRT)addr;
+		 tb < len;
+		 tb += br, va += (KVIRT)br)
+# else	/* solaris>=20600 */
+	    for (bp = buf, tb = 0, va = (KVIRT)addr;
+		 tb < len;
+		 bp += br, tb += br, va += (KVIRT)br)
+# endif	/* solaris<20600 */
+
+	    {
+		vpa = (va & (KVIRT)~PSMask) >> PSShft;
+		ip = (int)(va & (KVIRT)PSMask);
+		h = HASHKVM(vpa);
+		for (kp = KVMhb[h]; kp; kp = kp->nxt) {
+		    if (kp->vpa == vpa) {
+			pa = kp->pa;
+			break;
+		    }
+		}
+		if (!kp) {
+		    if ((pa = kvm_physaddr(Kd, Kas, va)) == KAERR)
+			return(1);
+		    if (!(kp = (kvmhash_t *)malloc(sizeof(kvmhash_t)))) {
+			(void) fprintf(stderr, "%s: no kvmhash_t space\n", Pn);
+			Exit(1);
+		    }
+		    kp->nxt = KVMhb[h];
+		    pa = kp->pa = (pa & ~(KPHYS)PSMask);
+		    kp->vpa = vpa;
+		    KVMhb[h] = kp;
+		}
+
+# if	solaris<20600
+		br = (int)(len - tb);
+		if ((ip + br) > PageSz)
+		    br = PageSz - ip;
+# else	/* solaris>=20600 */
+		b2r = (int)(len - tb);
+		if ((ip + b2r) > PageSz)
+		    b2r = PageSz - ip;
+		pa |= (KPHYS)ip;
+
+#  if	solaris<70000
+		if (llseek(Kmd, (offset_t)pa, SEEK_SET) == (offset_t)-1)
+		    return(1);
+		if ((br = (int)read(Kmd, (void *)bp, (size_t)b2r)) <= 0)
+		    return(1);
+#  else	/* solaris>=70000 */
+		if ((br = kvm_pread(Kd, pa, (void *)bp, (size_t)b2r)) <= 0)
+		    return(1);
+#  endif	/* solaris<70000 */
+# endif	/* solaris<20600 */
+
+	    }
+
+# if	solaris>=20600
+	    return(0);
+# endif	/* solaris>=20600 */
+
+	}
+#endif	/* solaris>=20501 */
+
+/*
+ * Use kvm_read for Solaris < 2.5; use kvm_kread() Solaris >= 2.5.
+ */
+	br = KVMREAD(Kd, (u_long)addr, buf, len);
+	return(((READLEN_T)br == len) ? 0 : 1);
+}
+
+
+/*
+ * open_kvm() - open kernel virtual memory access
+ */
+
+void
+open_kvm()
+{
+	if (Kd)
+	    return;
+
+#if	defined(WILLDROPGID)
+/*
+ * If this Solaris process began with setgid permission and its been
+ * surrendered, regain it.
+ */
+	(void) restoregid();
+#endif	/* defined(WILLDROPGID) */
+
+	if (!(Kd = kvm_open(Nmlst, Memory, NULL, O_RDONLY, Pn))) {
+	    (void) fprintf(stderr,
+		"%s: kvm_open(namelist=%s, corefile=%s): %s\n",
+		Pn,
+		Nmlst ? Nmlst : "default",
+		Memory  ? Memory  : "default",
+		strerror(errno));
+	    Exit(1);
+	}
+
+#if	solaris>=20501 && solaris<70000
+	if ((Kmd = open((Memory ? Memory : KMEM), O_RDONLY)) < 0) {
+	    (void) fprintf(stderr, "%s: open(\"/dev/mem\"): %s\n", Pn, 
+		strerror(errno));
+	    Exit(1);
+	}
+#endif	/* solaris>=20501 && solaris<70000 */
+
+#if	defined(WILLDROPGID)
+/*
+ * If this process has setgid permission, and is willing to surrender it,
+ * do so.
+ */
+	(void) dropgid();
+/*
+ * If this Solaris process must switch GIDs, enable switching after the
+ * first call to this function.
+ */
+	if (Switchgid == 1)
+	    Switchgid = 2;
+#endif	/* define(WILLDROPGID) */
+
+}
+
+
+/*
+ * process_text() - process text access information
+ */
+
+#if	solaris>=90000
+#include <sys/avl.h>
+
+/*
+ * Avl trees are implemented as follows: types in AVL trees contain an
+ * avl_node_t.  These avl_nodes connect to other avl nodes embedded in
+ * objects of the same type.  The avl_tree contains knowledge about the
+ * size of the structure and the offset of the AVL node in the object
+ * so we can convert between AVL nodes and (in this case) struct seg. 
+ *
+ * This code was provided by Casper Dik <Casper.Dik@holland.sun.com>.
+ */
+
+#define READ_AVL_NODE(n,o,s) \
+	if (kread((KA_T)AVL_NODE2DATA(n, o), (char*) s, sizeof(*s))) \
+		return -1
+
+static int
+get_first_seg(avl_tree_t *av, struct seg *s)
+{
+	avl_node_t *node = av->avl_root;
+	size_t off = av->avl_offset;
+	int count = 0;
+
+	while (node != NULL && ++count < MAXSEGS * 2) {
+	    READ_AVL_NODE(node, off, s);
+	    node = s->s_tree.avl_child[0];
+	    if (node == NULL)
+		return 0;
+	}
+	return -1;
+}
+
+static int
+get_next_seg(avl_tree_t *av, struct seg *s)
+{
+	avl_node_t *node = &s->s_tree;
+	size_t off = av->avl_offset;
+	int count = 0;
+
+	if (node->avl_child[1]) {
+	    /*
+	     * Has right child, go all the way to the leftmost child of
+	     * the right child.
+	     */
+	    READ_AVL_NODE(node->avl_child[1], off, s);
+	    while (node->avl_child[0] != NULL && ++count < 2 * MAXSEGS)
+		 READ_AVL_NODE(node->avl_child[0],off,s);
+	    if (count < 2 * MAXSEGS)
+		return 0;
+	} else {
+	    /*
+	     * No right child, go up until we find a node we're not a right
+	     * child of.
+	     */
+	    for (;count < 2 * MAXSEGS; count++) {
+		int index = AVL_XCHILD(node);
+		avl_node_t *parent = AVL_XPARENT(node);
+
+		if (parent == NULL)
+		    return -1;
+
+		READ_AVL_NODE(parent, off, s);
+
+		if (index == 0)
+		    return 0;
+	    }
+	}
+	return -1;
+}
+
+static void
+process_text(pa)
+	KA_T pa;			/* address space description pointer */
+{
+	struct as as;
+	int i, j, k;
+	struct seg s;
+	struct segvn_data vn;
+	avl_tree_t *avtp;
+	KA_T v[MAXSEGS];
+/*
+ * Get address space description.
+ */
+	if (kread((KA_T)pa, (char *)&as, sizeof(as))) {
+	    alloc_lfile(" txt", -1);
+	    (void) snpf(Namech, Namechl, "can't read text segment list (%s)",
+		print_kptr(pa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    if (Lf->sf)
+		link_lfile();
+	    return;
+	}
+/*
+ * Loop through the segments.  The loop should stop when the segment
+ * pointer returns to its starting point, but just in case, it's stopped
+ * when MAXSEGS unique segments have been recorded or 2*MAXSEGS segments
+ * have been examined.
+ */
+	for (avtp = &as.a_segtree, i = j = 0;
+	     (i < MAXSEGS) && (j < 2*MAXSEGS);
+	     j++)
+	{
+	    if (j ? get_next_seg(avtp, &s) : get_first_seg(avtp, &s))
+		break;
+	    if ((KA_T)s.s_ops == Sgvops && s.s_data) {
+		if (kread((KA_T)s.s_data, (char *)&vn, sizeof(vn)))
+		    break;
+		if (vn.vp) {
+			
+		/*
+		 * This is a virtual node segment.
+		 *
+		 * If its vnode pointer has not been seen already, record the
+		 * vnode pointer and process the vnode.
+		 */
+		    for (k = 0; k < i; k++) {
+			if (v[k] == (KA_T)vn.vp)
+			    break;
+		    }
+		    if (k >= i) {
+			v[i++] = (KA_T)vn.vp;
+			alloc_lfile(" txt", -1);
+
+# if	defined(FILEPTR)
+			FILEPTR = (struct file *)NULL;
+# endif	/* defined(FILEPTR) */
+
+			process_node((KA_T)vn.vp);
+			if (Lf->sf)
+			    link_lfile();
+		    }
+		}
+	    }
+	}
+}
+
+#else	/* solaris<90000 */
+
+# if	solaris>=20400
+#define S_NEXT s_next.list
+# else	/* solaris<20400 */
+#define S_NEXT s_next
+# endif	/* solaris>=20400 */
+
+static void
+process_text(pa)
+	KA_T pa;			/* address space description pointer */
+{
+	struct as as;
+	int i, j, k;
+	struct seg s;
+	struct segvn_data vn;
+	KA_T v[MAXSEGS];
+/*
+ * Get address space description.
+ */
+	if (kread((KA_T)pa, (char *)&as, sizeof(as))) {
+	    alloc_lfile(" txt", -1);
+	    (void) snpf(Namech, Namechl, "can't read text segment list (%s)",
+		print_kptr(pa, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    if (Lf->sf)
+		link_lfile();
+	    return;
+	}
+/*
+ * Loop through the segments.  The loop should stop when the segment
+ * pointer returns to its starting point, but just in case, it's stopped
+ * when MAXSEGS unique segments have been recorded or 2*MAXSEGS segments
+ * have been examined.
+ */
+	for (s.s_next = as.a_segs, i = j = 0;
+	     i < MAXSEGS && j < 2*MAXSEGS;
+	     j++)
+	{
+	    if (!s.S_NEXT
+	    ||  kread((KA_T)s.S_NEXT, (char *)&s, sizeof(s)))
+		break;
+	    if ((KA_T)s.s_ops == Sgvops && s.s_data) {
+		if (kread((KA_T)s.s_data, (char *)&vn, sizeof(vn)))
+		    break;
+		if (vn.vp) {
+			
+		/*
+		 * This is a virtual node segment.
+		 *
+		 * If its vnode pointer has not been seen already, record the
+		 * vnode pointer and process the vnode.
+		 */
+		    for (k = 0; k < i; k++) {
+			if (v[k] == (KA_T)vn.vp)
+			    break;
+		    }
+		    if (k >= i) {
+			v[i++] = (KA_T)vn.vp;
+			alloc_lfile(" txt", -1);
+
+# if	defined(FILEPTR)
+			FILEPTR = (struct file *)NULL;
+# endif	/* defined(FILEPTR) */
+
+			process_node((KA_T)vn.vp);
+			if (Lf->sf)
+			    link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Follow the segment link to the starting point in the address
+	 * space description.  (The i and j counters place an absolute
+	 * limit on the loop.)
+	 */
+
+# if	solaris<20400
+	    if (s.s_next == as.a_segs)
+# else	/* solaris>=20400 */
+	    if (s.s_next.list == as.a_segs.list)
+# endif	/* solaris<20400 */
+
+		break;
+	}
+}
+#endif  /* solaris>=90000 */
+
+
+/*
+ * readfsinfo() - read file system information
+ */
+
+static void
+readfsinfo()
+{
+	char buf[FSTYPSZ+1];
+	int i, len;
+
+	if ((Fsinfomax = sysfs(GETNFSTYP)) == -1) {
+	    (void) fprintf(stderr, "%s: sysfs(GETNFSTYP) error: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	} 
+	if (Fsinfomax == 0)
+		return;
+	if (!(Fsinfo = (char **)malloc((MALLOC_S)(Fsinfomax * sizeof(char *)))))
+	{
+	    (void) fprintf(stderr, "%s: no space for sysfs info\n", Pn);
+	    Exit(1);
+	}
+	for (i = 1; i <= Fsinfomax; i++) {
+	    if (sysfs(GETFSTYP, i, buf) == -1) {
+		(void) fprintf(stderr, "%s: sysfs(GETFSTYP) error: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+	    if (buf[0] == '\0') {
+		Fsinfo[i-1] = "";
+		continue;
+	    }
+	    buf[FSTYPSZ] = '\0';
+	    len = strlen(buf) + 1;
+	    if (!(Fsinfo[i-1] = (char *)malloc((MALLOC_S)len))) {
+		(void) fprintf(stderr,
+		    "%s: no space for file system entry %s\n", Pn, buf);
+		Exit(1);
+	    }
+	    (void) snpf(Fsinfo[i-1], len, "%s", buf);
+
+# if	defined(HAS_AFS)
+	    if (strcasecmp(buf, "afs") == 0)
+		AFSfstype = i;
+# endif	/* defined(HAS_AFS) */
+
+	}
+}
+
+
+#if	solaris>=20501
+/*
+ * readkam() - read kernel's address map structure
+ */
+
+static void
+readkam(addr)
+	KA_T addr;			/* kernel virtual address */
+{
+	register int i;
+	register kvmhash_t *kp, *kpp;
+	static KA_T kas = (KA_T)NULL;
+
+	if (addr)
+	    kas = addr;
+	Kas = (struct as *)NULL;
+
+#if	solaris<70000
+	if (kas && !kread(kas, (char *)&Kam, sizeof(Kam)))
+	    Kas = (KA_T)&Kam;
+#else	/* solaris>=70000 */
+	Kas = (struct as *)kas;
+#endif	/* solaris<70000 */
+
+	if (Kas) {
+	    if (!KVMhb) {
+		if (!(KVMhb = (kvmhash_t **)calloc(KVMHASHBN,
+						   sizeof(kvmhash_t *))))
+		{
+		     (void) fprintf(stderr,
+			"%s: no space (%d) for KVM hash buckets\n",
+			Pn, (int)(KVMHASHBN * sizeof(kvmhash_t *)));
+		    Exit(1);
+		}
+	    } else if (!addr) {
+		for (i = 0; i < KVMHASHBN; i++) {
+		    if ((kp = KVMhb[i])) {
+			while (kp) {
+			    kpp = kp->nxt;
+			    (void) free((void *)kp);
+			    kp = kpp;
+			}
+			KVMhb[i] = (kvmhash_t *)NULL;
+		    }
+		}
+	    }
+	}
+}
+#endif	/* solaris>=20501 */
+
+
+/*
+ * read_proc() - read proc structures
+ *
+ * As a side-effect, Kd is set by a call to kvm_open().
+ */
+
+static void
+read_proc()
+{
+	int ct, ctl, knp, n, try;
+	MALLOC_S len;
+	struct proc *p;
+	KA_T pa, paf, pan;
+	struct pid pg, pids;
+/*
+ * Try PROCTRYLM times to read a valid proc table.
+ */
+	for (try = 0; try < PROCTRYLM; try++) {
+
+	/*
+	 * Get a proc structure count estimate.
+	 */
+	    if (get_Nl_value("nproc", Drive_Nl, &pa) < 0 || !pa
+	    ||  kread(pa, (char *)&knp, sizeof(knp))
+	    ||  knp < 1)
+		knp = PROCDFLT;
+	/*
+	 * Pre-allocate space, as required.
+	 */
+	    n = knp + PROCDFLT/4;
+	    if (n > Npa) {
+
+	    /*
+	     * Allocate proc structure space.
+	     */
+		len = (n * sizeof(struct proc));
+		if (P)
+		    P = (struct proc *)realloc((MALLOC_P *)P, len);
+		else
+		    P = (struct proc *)malloc(len);
+		if (!P) {
+		    (void) fprintf(stderr, "%s: no proc table space\n", Pn);
+		    Exit(1);
+		}
+	    /*
+	     * Pre-allocate PGID and PID number space.
+	     */
+		len = (MALLOC_S)(n * sizeof(int));
+		if (Fpgid) {
+		    if (Pgid)
+			Pgid = (int *)realloc((MALLOC_P *)Pgid, len);
+		    else
+			Pgid = (int *)malloc(len);
+		    if (!Pgid) {
+			(void) fprintf(stderr, "%s: no PGID table space\n", Pn);
+			Exit(1);
+		    }
+		}
+		if (Pid)
+		    Pid = (int *)realloc((MALLOC_P *)Pid, len);
+		else
+		    Pid = (int *)malloc(len);
+		if (!Pid) {
+		    (void) fprintf(stderr, "%s: no PID table space\n", Pn);
+		    Exit(1);
+		}
+		Npa = n;
+	    }
+	    if (HasALLKMEM) {
+
+	    /*
+	     * Prepare for a proc table scan via direct reading of the active
+	     * chain.
+	     */
+		if (!PrAct || kread(PrAct, (char *)&paf, sizeof(pa))) {
+		    (void) fprintf(stderr, "%s: can't read practive from %s\n",
+			Pn, print_kptr(PrAct, (char *)NULL, 0));
+		    Exit(1);
+		}
+		ct = 1;
+		ctl = knp << 3;
+		pan = paf;
+		pa = (KA_T)NULL;
+	    } else {
+
+	    /*
+	     * Prepare for a proc table scan via the kvm_*proc() functions.
+	     */
+		if (kvm_setproc(Kd) != 0) {
+		    (void) fprintf(stderr, "%s: kvm_setproc: %s\n", Pn,
+			strerror(errno));
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Accumulate proc structures.
+	 */
+	    Np = 0;
+	    for (;;) {
+		if (Np >= Npa) {
+
+		/*
+		 * Expand the local proc table.
+		 */
+		    Npa += PROCDFLT/2;
+		    len = (MALLOC_S)(Npa * sizeof(struct proc));
+		    if (!(P = (struct proc *)realloc((MALLOC_P *)P, len))) {
+			(void) fprintf(stderr,
+			    "%s: no more (%d) proc space\n", Pn, Npa);
+			Exit(1);
+		    }
+		/*
+		 * Expand the PGID and PID tables.
+		 */
+		    len = (MALLOC_S)(Npa * sizeof(int));
+		    if (Fpgid) {
+			if (!(Pgid = (int *)realloc((MALLOC_P *)Pgid, len))) {
+			    (void) fprintf(stderr,
+				"%s: no more (%d) PGID space\n", Pn, Npa);
+			    Exit(1);
+			}
+		    }
+		    if (!(Pid = (int *)realloc((MALLOC_P *)Pid, len))) {
+			(void) fprintf(stderr,
+			    "%s: no more (%d) PID space\n", Pn, Npa);
+			Exit(1);
+		    }
+		}
+	    /*
+	     * Read the next proc structure.
+	     */
+		if (HasALLKMEM) {
+
+		/*
+		 * If the ALLKMEM device exists, read proc structures directly
+		 * from the active chain.
+		 */
+		    if (!pa)
+			pa = paf;
+		    else {
+			pa = pan;
+			if ((pan == paf) || (++ct > ctl))
+			   break;
+		    }
+		    if (!pa)
+			break;
+		    p = (struct proc *)&P[Np];
+		    if (kread(pa, (char *)p, sizeof(struct proc)))
+			break;
+		    pan = (KA_T)p->p_next;
+		} else {
+
+		/*
+		 * If the ALLKMEM device doesn't exist, read proc structures
+		 * via kbm_getproc().
+		 */
+		    if (!(p = kvm_nextproc(Kd)))
+			break;
+		}
+	    /*
+	     * Check process status.
+	     */
+		if (p->p_stat == 0 || p->p_stat == SZOMB)
+		    continue;
+
+#if	solaris >=20500
+		/*
+		 * Check Solaris 2.5 and above p_cred pointer.
+		 */
+	    	    if (!p->p_cred)
+			continue;
+#endif	/* solaris >=20500 */
+
+		/*
+		 * Read Solaris PGID and PID numbers.
+		 */
+		if (Fpgid) {
+		    if (!p->p_pgidp
+		    ||  kread((KA_T)p->p_pgidp, (char *)&pg, sizeof(pg)))
+			continue;
+		}
+		if (!p->p_pidp
+		||  kread((KA_T)p->p_pidp, (char *)&pids, sizeof(pids)))
+		    continue;
+	    /*
+	     * Save the PGID and PID numbers in local tables.
+	     */
+		if (Fpgid)
+		    Pgid[Np] = (int)pg.pid_id;
+		Pid[Np] = (int)pids.pid_id;
+	    /*
+	     * If the proc structure came from kvm_getproc(), save it in the
+	     * local table.
+	     */
+		if (!HasALLKMEM)
+		    P[Np] = *p;
+		Np++;
+	    }
+	/*
+	 * If not enough processes were saved in the local table, try again.
+	 *
+	 * If the ALLKMEM device isn't available, it is necessary to close and
+	 * reopen the KVM device, so that kvm_open() will acquire a fresh
+	 * address for the head of the linked list process table.
+	 */
+	    if (Np >= PROCMIN)
+		break;
+	    if (!HasALLKMEM) {
+		close_kvm();
+		open_kvm();
+	    }
+	}
+/*
+ * Quit if no proc structures were stored in the local table.
+ */
+	if (try >= PROCTRYLM) {
+	    (void) fprintf(stderr, "%s: can't read proc table\n", Pn);
+	    Exit(1);
+	}
+	if (Np < Npa && !RptTm) {
+
+	/*
+	 * Reduce the local proc structure table size to its minimum if
+	 * not in repeat mode.
+	 */
+	    len = (MALLOC_S)(Np * sizeof(struct proc));
+	    if (!(P = (struct proc *)realloc((MALLOC_P *)P, len))) {
+		(void) fprintf(stderr, "%s: can't reduce proc table to %d\n",
+		    Pn, Np);
+		Exit(1);
+	    }
+	/*
+	 * Reduce the Solaris PGID and PID tables to their minimum if
+	 * not in repeat mode.
+	 */
+	    len = (MALLOC_S)(Np * sizeof(int));
+	    if (Fpgid) {
+		if (!(Pgid = (int *)realloc((MALLOC_P *)Pgid, len))) {
+		    (void) fprintf(stderr,
+			"%s: can't reduce PGID table to %d\n", Pn, Np);
+		    Exit(1);
+		}
+	    }
+	    if (!(Pid = (int *)realloc((MALLOC_P *)Pid, len))) {
+		(void) fprintf(stderr,
+		    "%s: can't reduce PID table to %d\n", Pn, Np);
+		Exit(1);
+	    }
+	    Npa = Np;
+	}
+}
+
+
+#if	defined(WILLDROPGID)
+/*
+ * restoregid() -- restore setgid permission, as required
+ */
+
+void
+restoregid()
+{
+	if (Switchgid == 2 && !Setgid) {
+	    if (setgid(Savedgid) != 0) {
+		(void) fprintf(stderr,
+		    "%s: can't set effective GID to %d: %s\n",
+		    Pn, (int)Savedgid, strerror(errno));
+		Exit(1);
+	    }
+	    Setgid = 1;
+	}
+}
+#endif	/* defined(WILLDROPGID) */
+
+
+#if	defined(HASNCACHE) && solaris>=90000
+
+
+/*
+ * Local static values
+ */
+
+static int Mhl;				/* local name cache hash mask */
+static int Nhl = 0;			/* size of local name cache hash
+					 * pointer table */
+struct l_nch {
+	KA_T vp;			/* vnode address */
+	KA_T dp;			/* parent vnode address */
+	struct l_nch *pa;		/* parent Ncache address */
+	char *nm;			/* name */
+	int nl;				/* name length */
+};
+
+static struct l_nch *Ncache = (struct l_nch *)NULL;
+					/* the local name cache */
+static struct l_nch **Nchash = (struct l_nch **)NULL;
+					/* Ncache hash pointers */
+static int Ncfirst = 1;			/* first-call status */
+static KA_T NegVN = (KA_T)NULL;		/* negative vnode address */
+static int Nla = 0;			/* entries allocated to Ncache[] */
+static int Nlu = 0;			/* entries used in Ncache[] */
+
+_PROTOTYPE(static struct l_nch *ncache_addr,(KA_T v));
+
+#define ncachehash(v)		Nchash+((((int)(v)>>2)*31415)&Mhl)
+
+_PROTOTYPE(static int ncache_isroot,(KA_T va, char *cp));
+
+#define	LNCHINCRSZ	64	/* local size increment */
+#define	XNC		15	/* extra name characters to read beyond those
+				 * in name[] of the ncache_t structure -- this
+				 * is an efficiency hint and MUST BE AT LEAST
+				 * ONE. */
+
+
+/*
+ * ncache_addr() - look up a node's local ncache address
+ */
+
+static struct l_nch *
+
+ncache_addr(v)
+	KA_T v;					/* vnode's address */
+{
+	struct l_nch **hp;
+
+	for (hp = ncachehash(v); *hp; hp++) {
+	    if ((*hp)->vp == v)
+		return(*hp);
+	}
+	return((struct l_nch *)NULL);
+}
+
+
+/*
+ * ncache_isroot() - is head of name cache path a file system root?
+ */
+
+static int
+ncache_isroot(va, cp)
+	KA_T va;			/* kernel vnode address */
+	char *cp;			/* partial path */
+{
+	char buf[MAXPATHLEN];
+	int i;
+	MALLOC_S len;
+	struct mounts *mtp;
+	struct stat sb;
+	struct vnode v;
+	static int vca = 0;
+	static int vcn = 0;
+	static KA_T *vc = (KA_T *)NULL;
+
+	if (!va)
+	    return(0);
+/*
+ * Search the root vnode cache.
+ */
+	for (i = 0; i < vcn; i++) {
+	    if (va == vc[i])
+		return(1);
+	}
+/*
+ * Read the vnode and see if it's a VDIR node with the VROOT flag set.  If
+ * it is, then the path is complete.
+ *
+ * If it isn't, and if the file has an inode number, search the mount table
+ * and see if the file system's inode number is known.  If it is, form the
+ * possible full path, safely stat() it, and see if it's inode number matches
+ * the one we have for this file.  If it does, then the path is complete.
+ */
+	if (kread((KA_T)va, (char *)&v, sizeof(v))
+	||  v.v_type != VDIR || !(v.v_flag & VROOT)) {
+
+	/*
+	 * The vnode tests failed.  Try the inode tests.
+	 */
+	    if (Lf->inp_ty != 1 || !Lf->inode
+	    ||  !Lf->fsdir || (len = strlen(Lf->fsdir)) < 1)
+		return(0);
+	    if ((len + 1 + strlen(cp) + 1) > sizeof(buf))
+		return(0);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (strcmp(Lf->fsdir, mtp->dir) == 0)
+		    break;
+	    }
+	    if (!mtp)
+		return(0);
+	    (void) strcpy(buf, Lf->fsdir);
+	    if (buf[len - 1] != '/')
+		buf[len++] = '/';
+	    (void) strcpy(&buf[len], cp);
+	    if (statsafely(buf, &sb) != 0
+	    ||  (INODETYPE)sb.st_ino != Lf->inode)
+		return(0);
+	}
+/*
+ * Add the vnode address to the root vnode cache.
+ */
+	if (vcn >= vca) {
+	    vca += 10;
+	    len = (MALLOC_S)(vca * sizeof(KA_T));
+	    if (!vc)
+		vc = (KA_T *)malloc(len);
+	    else
+		vc = (KA_T *)realloc(vc, len);
+	    if (!vc) {
+		(void) fprintf(stderr, "%s: no space for root vnode table\n",
+		    Pn);
+		Exit(1);
+	    }
+	}
+	vc[vcn++] = va;
+	return(1);
+}
+
+
+/*
+ * ncache_load() - load the kernel's name cache
+ */
+
+void
+ncache_load()
+{
+	char *cp;
+	struct l_nch **hp, *lc;
+	int h, i, len, n, xl;
+	static int iNch = 0;
+	nc_hash_t *kh;
+	static KA_T kha = (KA_T)NULL;
+	static nc_hash_t *khl = (nc_hash_t *)NULL;
+	KA_T kn;
+	static ncache_t *nc = (ncache_t *)NULL;
+	static int Nch = 0;
+	static int nmo = 0;
+	KA_T v;
+	static int xn = 0;
+
+	if (!Fncache)
+	    return;
+	if (Ncfirst) {
+
+	/*
+	 * Do startup (first-time) functions.
+	 */
+	    Ncfirst = 0;
+	/*
+	 * Establish DNLC hash size.
+	 */
+	    v = (KA_T)0;
+	    if (get_Nl_value(X_NCSIZE, (struct drive_Nl *)NULL, &v) < 0
+	    ||  !v
+	    ||  kread((KA_T)v, (char *)&Nch, sizeof(Nch)))
+	    {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read DNLC hash size: %s\n",
+			Pn, print_kptr(v, (char *)NULL, 0));
+		iNch = Nch = 0;
+		return;
+	    }
+	    if ((iNch = Nch) < 1) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: DNLC hash size: %d\n", Pn, Nch);
+		iNch = Nch = 0;
+		return;
+	    }
+	/*
+	 * Get negative vnode address.
+	 */
+	    if (get_Nl_value(NCACHE_NEGVN, (struct drive_Nl *)NULL, &NegVN)
+	    < 0)
+		NegVN = (KA_T)NULL;
+	/*
+	 * Establish DNLC hash address.
+	 */
+	    v = (KA_T)0;
+	    if (get_Nl_value(X_NCACHE,(struct drive_Nl *)NULL,(KA_T *)&v) < 0
+	    || !v
+	    || kread(v, (char *)&kha, sizeof(kha))
+	    || !kha
+	    ) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: no DNLC hash address\n", Pn);
+		iNch = Nch = 0;
+		return;
+	    }
+	/*
+	 * Allocate space for a local copy of the kernel's hash table.
+	 */
+	    len = Nch * sizeof(nc_hash_t);
+	    if (!(khl = (nc_hash_t *)malloc((MALLOC_S)len))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate DNLC hash space: %d\n", Pn, len);
+		Exit(1);
+	    }
+	/*
+	 * Allocate space for a kernel DNLC entry, plus additional name space
+	 * for efficiency.
+	 */
+	    xn = XNC;
+	    if (!(nc = (ncache_t *)malloc((MALLOC_S)(sizeof(ncache_t) + XNC))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: can't allocate DNLC ncache_t space\n", Pn);
+		Exit(1);
+	    }
+	    nmo = offsetof(struct ncache, name);
+	/*
+	 * Allocate estimated space for the local cache, based on the
+	 * hash table count and the current average hash length.
+	 */
+	    v = (KA_T)0;
+	    if ((get_Nl_value("hshav", (struct drive_Nl *)NULL, (KA_T *)&v) < 0)
+	    || !v
+	    || kread(v, (char *)&i, sizeof(i))
+	    || (i < 1)
+	    ) {
+		i = 16;
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: can't read DNLC average hash bucket size,", Pn);
+		    (void) fprintf(stderr, " using %d\n", i);
+		}
+	    }
+	    Nla = Nch * i;
+	    if (!(Ncache = (struct l_nch *)calloc(Nla, sizeof(struct l_nch)))) {
+
+no_local_space:
+
+		(void) fprintf(stderr,
+		    "%s: no space for %d byte local name cache\n", Pn, len);
+		Exit(1);
+	    }
+	} else {
+
+	/*
+	 * Do setup for repeat calls.
+	 */
+	    if (!iNch || !Nla || !Ncache)
+		return;
+	    if (Nchash) {
+		(void) free((FREE_P *)Nchash);
+		Nchash = (struct l_nch **)NULL;
+	    }
+	    if (Ncache && Nlu) {
+
+	    /*
+	     * Free space malloc'd to names in local name cache.
+	     */
+	        for (i = 0, lc = Ncache; i < Nlu; i++, lc++) {
+		    if (lc->nm) {
+			(void) free((FREE_P *)lc->nm);
+			lc->nm = (char *)NULL;
+		    }
+	        }
+	    }
+	    Nch = iNch;
+	    Nlu = 0;
+	}
+/*
+ * Read the kernel's DNLC hash.
+ */
+	if (kread(kha, (char *)khl, (Nch * sizeof(nc_hash_t)))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't read DNLC hash: %s\n",
+		    Pn, print_kptr(kha, (char *)NULL, 0));
+	    iNch = Nch = 0;
+	    return;
+	}
+/*
+ * Build a local copy of the kernel name cache.
+ */
+	for (i = n = 0, kh = khl, lc = Ncache; i < Nch; i++, kh++) {
+
+	/*
+	 * Skip empty hash buckets.
+	 */
+	    if (!kh->hash_next || ((KA_T)kh->hash_next == kha))
+		continue;
+	/*
+	 * Process a hash bucket.
+	 */
+	    for (kn = (KA_T)kh->hash_next, h = 0;
+		 kn && (h < Nch) && (!h || (h && kn != (KA_T)kh->hash_next));
+		 kn = (KA_T)nc->hash_next, h++)
+	    {
+		if (kread(kn, (char *)nc, sizeof(ncache_t) + XNC))
+		    break;
+		if (!nc->vp || (len = (int)nc->namlen) < 1)
+		    continue;
+		if (NegVN && ((KA_T)nc->vp == NegVN))
+		    continue;
+		if ((len < 3) && (nc->name[0] == '.')) {
+		    if ((len < 2) || (nc->name[1] == '.'))
+			continue;
+		}
+	    /*
+	     * If not all the name has been read, read the rest of it,
+	     * allocating more space at the end of the ncache structure as
+	     * required.
+	     */
+		if (len > (XNC + 1)) {
+		    if (len > (xn + 1)) {
+			while (len > (xn + 1))
+			    xn = xn + xn;
+			xn = ((xn + 7) & ~7) - 1;
+			if (!(nc = (ncache_t *)realloc((MALLOC_P *)nc,
+					(sizeof(ncache_t) + xn)))
+			) {
+			    (void) fprintf(stderr,
+				"%s: can't extend DNLC ncache_t buffer\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    cp = &nc->name[XNC + 1];
+		    v = (KA_T)((char *)kn + nmo + XNC + 1);
+		    xl = len - XNC - 1;
+		    if (kread(v, cp, xl))
+			continue;
+		}
+	    /*
+	     * Allocate space for the name in the local name cache entry.
+	     */
+		if (!(cp = (char *)malloc(len + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for name cache name\n",
+			Pn, len + 1);
+		    Exit(1);
+		}
+		(void) strncpy(cp, nc->name, len);
+		cp[len] = '\0';
+	    /*
+	     * Make sure there is space for another local name cache entry.
+	     * If not, allocate twice as many entries.
+	     */
+		if (n >= Nla) {
+		    Nla = Nla + Nla;
+		    if (!(Ncache = (struct l_nch *)realloc(Ncache,
+				   (MALLOC_S)(Nla * sizeof(struct l_nch))))
+		    ) {
+			(void) fprintf(stderr,
+			    "%s: can't enlarge local name cache\n", Pn);
+			Exit(1);
+		    }
+		    lc = &Ncache[n];
+		}
+	    /*
+	     * Complete the local cache entry.
+	     */
+		lc->vp = (KA_T)nc->vp;
+		lc->dp = (KA_T)nc->dp;
+		lc->pa = (struct l_nch *)NULL;
+		lc->nm = cp;
+		lc->nl = len;
+		lc++;
+		n++;
+	    }
+	}
+/*
+ * Reduce memory usage, as required.
+ */
+	if ((Nlu = n) < 1) {
+
+	/*
+	 * No DNLC entries were located, an unexpected result.
+	 */
+	    if (!RptTm && Ncache) {
+
+	    /*
+	     * If not in repeat mode, free the space that has been malloc'd
+	     * to the local name cache.
+	     */
+		(void) free((FREE_P *)Ncache);
+	 	Ncache = (struct l_nch *)NULL;
+		Nla = Nlu = 0;
+	    }
+	/*
+	 * Issue a warning and disable furthe DNLC processing.
+	 */
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: unusable local name cache size: %d\n", Pn, n);
+	    iNch = Nch = 0;
+	    return;
+	}
+	if ((Nlu < Nla) && !RptTm) {
+	    len = Nlu * sizeof(struct l_nch);
+	    if (!(Ncache = (struct l_nch *)realloc(Ncache, len)))
+		goto no_local_space;
+	    Nla = Nlu;
+	}
+/*
+ * Build a hash table to locate Ncache entries.
+ */
+	for (Nhl = 1; Nhl < Nlu; Nhl <<= 1)
+	    ;
+	Nhl <<= 1;
+	Mhl = Nhl - 1;
+	if (!(Nchash = (struct l_nch **)calloc(Nhl + Nlu,
+					sizeof(struct l_nch *))))
+	{
+	    (void) fprintf(stderr,
+		"%s: no space for %d name cache hash pointers\n",
+		Pn, Nhl + Nlu);
+	    Exit(1);
+	}
+	for (i = 0, lc = Ncache; i < Nlu; i++, lc++) {
+	    for (hp = ncachehash(lc->vp), h = 1; *hp; hp++) {
+		if ((*hp)->vp == lc->vp && strcmp((*hp)->nm, lc->nm) == 0
+		&&  (*hp)->dp == lc->dp
+		) {
+		    h = 0;
+		    break;
+		}
+	    }
+	    if (h)
+		*hp = lc;
+	}
+/*
+ * Make a final pass through the local cache and convert parent vnode
+ * addresses to local name cache pointers.
+ */
+	for (i = 0, lc = Ncache; i < Nlu; i++, lc++) {
+	    if (!lc->dp)
+		continue;
+	     if (NegVN && (lc->dp == NegVN)) {
+		lc->pa = (struct l_nch *)NULL;
+		continue;
+	     }
+	    lc->pa = ncache_addr(lc->dp);
+	}
+}
+
+
+/*
+ * ncache_lookup() - look up a node's name in the kernel's name cache
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	struct l_nch *lc;
+	struct mounts *mtp;
+	int nl, rlen;
+
+	*cp = '\0';
+	*fp = 0;
+
+# if	defined(HASFSINO)
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller to print the file system mount point name only.
+ */
+	if (Lf->inp_ty == 1 && Lf->fs_ino && Lf->inode == Lf->fs_ino)
+	    return(cp);
+# endif	/* defined(HASFSINO) */
+
+/*
+ * Look up the name cache entry for the node address.
+ */
+	if (!Nlu || !(lc = ncache_addr(Lf->na))) {
+
+	/*
+	 * If the node has no cache entry, see if it's the mount
+	 * point of a known file system.
+	 */
+	    if (!Lf->fsdir || !Lf->dev_def || Lf->inp_ty != 1)
+		return((char *)NULL);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (Lf->dev == mtp->dev
+		&&  mtp->inode == Lf->inode
+		&&  strcmp(mtp->dir, Lf->fsdir) == 0)
+		    return(cp);
+	    }
+	    return((char *)NULL);
+	}
+/*
+ * Begin the path assembly.
+ */
+	if ((nl = lc->nl) > (blen - 1))
+	    return((char *)NULL);
+	cp = buf + blen - nl - 1;
+	rlen = blen - nl - 1;
+	(void) strcpy(cp, lc->nm);
+/*
+ * Look up the name cache entries that are parents of the node address.
+ * Quit when:
+ *
+ *	there's no parent;
+ *	the name is too large to fit in the receiving buffer.
+ */
+	for (;;) {
+	    if (!lc->pa) {
+		if (ncache_isroot(lc->dp, cp))
+		    *fp = 1;
+		break;
+	    }
+	    lc = lc->pa;
+	    if (((nl = lc->nl) + 1) > rlen)
+		break;
+	    *(cp - 1) = '/';
+	    cp--;
+	    rlen--;
+	    (void) strncpy((cp - nl), lc->nm, nl);
+	    cp -= nl;
+	    rlen -= nl;
+	}
+	return(cp);
+}
+#endif	/* defined(HASNCACHE) && solaris>=90000 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/sun/dproto.h
new file mode 100644
index 0000000..fd6cb2c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dproto.h
@@ -0,0 +1,109 @@
+/*
+ * dproto.h - Solaris function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * 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: dproto.h,v 1.21 2010/01/18 19:03:54 abe Exp $
+ */
+
+
+#if	defined(HASVXFSUTIL)
+_PROTOTYPE(extern int access_vxfs_ioffsets,(void));
+#endif	/* defined(HASVXFSUTIL) */
+
+_PROTOTYPE(extern void completevfs,(struct l_vfs *vfs, dev_t *dev));
+
+# if	defined(HAS_LIBCTF)
+_PROTOTYPE(extern int CTF_getmem,(ctf_file_t *f, const char *mod,
+				  const char *ty, CTF_member_t *mem));
+_PROTOTYPE(extern void CTF_init,(int *i, char *t, CTF_request_t *r));
+_PROTOTYPE(extern int CTF_memCB,(const char *name, ctf_id_t id, ulong_t offset,
+				 void *arg));
+# endif	/* defined(HAS_LIBCTF) */
+
+_PROTOTYPE(extern int is_file_named,(char *p, int nt, enum vtype vt, int ps));
+_PROTOTYPE(extern struct l_vfs *readvfs,(KA_T ka, struct vfs *la, struct vnode *lv));
+_PROTOTYPE(extern int vop2ty,(struct vnode *vp, int fx));
+
+#if	defined(HAS_AFS)
+_PROTOTYPE(extern struct vnode *alloc_vcache,(void));
+_PROTOTYPE(extern void ckAFSsym,(struct nlist *nl));
+_PROTOTYPE(extern int hasAFS,(struct vnode *vp));
+_PROTOTYPE(extern int readafsnode,(KA_T va, struct vnode *v, struct afsnode *an));
+#endif	/* defined(HAS_AFS) */
+
+#if	defined(HASDCACHE)
+_PROTOTYPE(extern int rw_clone_sect,(int m));
+_PROTOTYPE(extern void clr_sect,(void));
+_PROTOTYPE(extern int rw_pseudo_sect,(int m));
+#endif	/* defined(HASDCACHE) */
+
+#if	defined(HASIPv6)
+_PROTOTYPE(extern struct hostent *gethostbyname2,(const char *nm, int proto));
+#endif	/* defined(HASIPv6) */
+
+#if	defined(HAS_V_PATH)
+_PROTOTYPE(extern int print_v_path,(struct lfile *lf));
+_PROTOTYPE(extern void read_v_path,(KA_T ka, char *rb, size_t rbl));
+#endif	/* defined(HAS_V_PATH) */
+
+#if	defined(HASVXFS)
+_PROTOTYPE(extern int read_vxnode,(KA_T va, struct vnode *v, struct l_vfs *vfs,
+				   int fx, struct l_ino *li, KA_T *vnops));
+# if	defined(HASVXFSRNL)
+_PROTOTYPE(extern int print_vxfs_rnl_path,(struct lfile *lf));
+# endif	/* defined(HASVXFSRNL) */
+#endif	/* defined(HASVXFS) */
+
+#if	defined(HASZONES)
+_PROTOTYPE(extern int enter_zone_arg,(char *zn));
+#endif	/* defined(HASZONES) */
+
+_PROTOTYPE(extern void close_kvm,(void));
+_PROTOTYPE(extern void open_kvm,(void));
+_PROTOTYPE(extern void process_socket,(KA_T sa, char *ty));
+
+#if	solaris>=110000
+_PROTOTYPE(extern int process_VSOCK,(KA_T va, struct vnode *v,
+				     struct sonode *so));
+#endif	/* solaris>=11000 */
+
+_PROTOTYPE(extern void read_clone,(void));
+
+#if	solaris<20500
+_PROTOTYPE(extern int get_max_fd,(void));
+#endif	/* solaris<20500 */
+
+#if	defined(WILLDROPGID)
+_PROTOTYPE(extern void restoregid,(void));
+#endif	/* defined(WILLDROPGID) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dsock.c
new file mode 100644
index 0000000..50eae2a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dsock.c
@@ -0,0 +1,2089 @@
+/*
+ * dsock.c - Solaris socket processing functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.31 2011/08/07 22:53:42 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	solaris>=110000
+#include <inet/ipclassifier.h>
+#endif	/* solaris>=110000 */
+
+
+#if	defined(HAS_LIBCTF) && solaris>=110000
+/*
+ * Icmp_t, rts_t and udp_t structure support for Solaris >=11 via libctf
+ *
+ * These structure definitions may look like kernel structures, but they
+ * are not.  They have been defined to have member names that duplicate
+ * those used by the kernel that are of interest to lsof.  Member valuess
+ * are obtained via the CTF library, libctf.
+ *
+ * Robert Byrnes developed the CTF library access code and contributed it
+ * to lsof.
+ */
+
+/*
+ * Icmp_t internal structure definition
+ */
+
+typedef struct icmp_s {
+	uint_t icmp_state;		/* TPI state */
+	KA_T *icmp_connp;		/* connection structure pointer */
+	in6_addr_t icmp_bound_v6src;	/* Explicitely bound to address */
+	in6_addr_t icmp_v6src;		/* Source address of this stream */
+	union {
+	    uint_t icmp_dummy;
+	    uint_t
+		icmp_Debug : 1,	   	/* SO_DEBUG option */
+		icmp_dontroute : 1,	/* SO_DONTROUTE option */
+		icmp_broadcast : 1,	/* SO_BROADCAST option */
+		icmp_reuseaddr : 1,	/* SO_REUSEADDR option */
+		icmp_useloopback : 1,	/* SO_USELOOPBACK option */
+		icmp_hdrincl : 1,	/* IP_HDRINCL option, etc. */
+		icmp_dgram_errind : 1,	/* SO_DGRAM_ERRIND option */
+		icmp_pad : 25;		/* pad to bit 31 */
+	} icmp_debug;			/* This name identifies a single bit
+					 * variable of the kernel's union, but
+					 * CTF won't read individual bit
+					 * variables, so for CTF's purposes
+					 * it is declared as a uint_t union,
+					 * named by the first bit variable of
+					 * the kernel union, whose address CTF
+					 * groks. */
+} icmp_t;
+
+
+/*
+ * Rts_t internal structure definition
+ */
+
+typedef struct rts_s {
+	uint_t rts_state;		/* Provider interface state */
+
+# if	defined(HAS_CONN_NEW)
+	KA_T *rts_connp;		/* connection structure pointer */
+# endif	/* defined(HAS_CONN_NEW) */
+
+	union {
+	    uint_t rts_dummy;
+	    uint_t
+		rts_Debug : 1,		/* SO_DEBUG option */
+		rts_dontroute : 1,	/* SO_DONTROUTE option */
+		rts_broadcast : 1,	/* SO_BROADCAST option */
+		rts_reuseaddr : 1,	/* SO_REUSEADDR option */
+		rts_useloopback : 1,	/* SO_USELOOPBACK option */
+		icmp_pad : 27;		/* padding to bit 31 */
+	} rts_debug;			/* This name identifies a single bit
+					 * variable, but CTF won't read
+					 * individual bit variables, so for
+					 * CTF's purposes it is declared as a
+					 * uint_t union, named by its first
+					 * bit variable, whose address CTF
+					 * groks. */
+} rts_t;
+
+/*
+ * Udp_t internal structure definition
+ */
+
+typedef struct udp { uint_t udp_state;		/* TPI state */
+	in_port_t udp_port;		/* port bound to this stream */
+	in_port_t udp_dstport;		/* connected port */
+	in6_addr_t udp_v6src;		/* source address of this stream */
+	in6_addr_t udp_v6dst;		/* connected destination */
+	ushort_t udp_ipversion;		/* version -- IPV[46]_VERSION */
+	KA_T *udp_connp; 		/* connection structure pointer */
+	uint_t udp_bits;		/* socket option bits */
+} udp_t;
+
+
+/*
+ * CTF definitions for icmp_t, rts_t and udp_t
+ */
+
+static int	IRU_ctfs = 0;		/* CTF initialization status for
+					 * icmp_t, rts_t and udp_t */
+
+# if	defined(_LP64)
+#define	IRU_MOD_FORMAT "/kernel/%s/genunix"
+#else	/* !defined(_LP64) */
+#define	IRU_MOD_FORMAT "/kernel/genunix"
+#endif	/* defined(_LP64) */
+
+					/* genunix pathname template to which
+					 * the kernel's instruction type set
+					 * is added for CTF access to icmp_t,
+					 * rts_t and udp_t */
+
+
+/*
+ * Icmp_t, rts_t and udp_t access definitions and structures
+ */
+
+#define	ICMP_T_TYPE_NAME "icmp_t"
+
+static	CTF_member_t icmp_t_members[] = {
+    CTF_MEMBER(icmp_state),
+#define	MX_icmp_state			0
+
+# if	defined(HAS_CONN_NEW)
+
+    CTF_MEMBER(icmp_connp),
+#define	MX_icmp_connp			1
+# else	/* !defined(HAS_CONN_NEW) */
+    CTF_MEMBER(icmp_bound_v6src),
+#define	MX_icmp_bound_v6src		1
+
+    CTF_MEMBER(icmp_v6src),
+#define	MX_icmp_v6src			2
+
+    CTF_MEMBER(icmp_debug),
+#define	MX_icmp_debug			3
+# endif	/* defined(HAS_CONN_NEW) */
+
+    { NULL, 0 }
+};
+
+
+#define	RTS_T_TYPE_NAME "rts_t"
+
+static	CTF_member_t rts_t_members[] = {
+    CTF_MEMBER(rts_state),
+#define	MX_rts_state			0
+
+# if	defined(HAS_CONN_NEW)
+    CTF_MEMBER(rts_connp),
+#define	MX_rts_connp			1
+# else	/* !defined(HAS_CONN_NEW) */
+
+    CTF_MEMBER(rts_debug),
+#define	MX_rts_debug			1
+# endif	/* defined(HAS_CONN_NEW) */
+
+    { NULL, 0 }
+};
+
+
+#define UDP_T_TYPE_NAME "udp_t"
+
+static	CTF_member_t udp_t_members[] = {
+    CTF_MEMBER(udp_state),
+#define	MX_udp_state			0
+
+    CTF_MEMBER(udp_connp),
+#define	MX_udp_connp			1
+
+# if	!defined(HAS_CONN_NEW)
+    CTF_MEMBER(udp_port),
+#define	MX_udp_port			2
+
+    CTF_MEMBER(udp_dstport),
+#define	MX_udp_dstport			3
+
+    CTF_MEMBER(udp_v6src),
+#define	MX_udp_v6src			4
+
+    CTF_MEMBER(udp_v6dst),
+#define	MX_udp_v6dst			5
+
+    CTF_MEMBER(udp_ipversion),
+#define	MX_udp_ipversion		6
+
+    CTF_MEMBER(udp_bits),
+#define	MX_udp_bits			7
+# endif	/* !defined(HAS_CONN_NEW) */
+
+    { NULL, 0 }
+};
+
+
+/*
+ * CTF icmp_t, rts_t and udp_t request table
+ */
+
+static CTF_request_t IRU_requests[] = {
+    { ICMP_T_TYPE_NAME,		icmp_t_members },
+    { RTS_T_TYPE_NAME,		rts_t_members },
+    { UDP_T_TYPE_NAME,		udp_t_members },
+    { NULL,			NULL }
+};
+
+
+/*
+ * Icmp_t, rts_t and udp_t function prototypes
+ */
+
+_PROTOTYPE(static int read_icmp_t,(KA_T va, KA_T ph, KA_T ia, icmp_t *ic));
+_PROTOTYPE(static int read_rts_t,(KA_T va, KA_T ph, KA_T ra, rts_t *rt));
+_PROTOTYPE(static int read_udp_t,(KA_T ua, udp_t *uc));
+#endif	/* defined(HAS_LIBCTF) && solaris>=110000 */
+
+
+#if	solaris<80000 || defined(HAS_IPCLASSIFIER_H)
+/*
+ * Make sure the tcpb structure is always defined.
+ */
+
+typedef struct tcpb {
+	int dummy;
+} tcpb_t;
+#endif	/* solaris<80000 || defined(HAS_IPCLASSIFIER_H) */
+
+#if	defined(HASIPv6)
+
+/*
+ * IPv6_2_IPv4()  -- macro to define the address of an IPv4 address contained
+ *		     in an IPv6 address
+ */
+
+#define IPv6_2_IPv4(v6)	(((uint8_t *)((struct in6_addr *)v6)->s6_addr)+12)
+
+/*
+ * IPv_ADDR_UNSPEC() -- macro to test an IP[46] address for an unspecified
+ *			address value
+ */
+
+#define IPv_ADDR_UNSPEC(af, p) \
+    (((af) == AF_INET6) ? (IN6_IS_ADDR_UNSPECIFIED((struct in6_addr *)p)) \
+			: (((struct in_addr *)(p))->s_addr == INADDR_ANY))
+#else	/* !defined(HASIPv6) */
+
+/*
+ * IPv_ADDR_UNSPEC() -- IPv4-only form of macro to test for an unspecified
+ *			address value
+ */
+
+#define	IPv_ADDR_UNSPEC(af, p) (((struct in_addr *)(p))->s_addr == INADDR_ANY)
+
+#endif	/* !defined(HASIPv6) */
+
+#if	defined(HASTCPOPT)
+# if	solaris==20600
+#include <netinet/tcp.h>
+# endif	/* solaris==20600 */
+#include <netinet/tcp_timer.h>
+#include <netinet/tcp_var.h>
+
+# if	defined(TH_TIMER_NEEDED)
+#define	ACK_TIMER	TH_TIMER_NEEDED
+# else
+#  if	defined(TH_ACK_TIMER_NEEDED)
+#define	ACK_TIMER	TH_ACK_TIMER_NEEDED
+#  endif	/* defined(TH_ACK_TIMER_NEEDED) */
+# endif	/* defined(TH_TIMER_NEEDED */
+#endif	/* defined(HASTCPOPT) */
+
+#if	defined(HASSOOPT)
+# if	solaris<100000
+#define	KEEPALIVE_INTERVAL	tcp_keepalive_intrvl
+# else	/* solaris>=100000 */
+#define	KEEPALIVE_INTERVAL	tcp_ka_last_intrvl
+# endif	/* solaris<100000 */
+#endif	/* defined(HASSOOPT) */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void save_TCP_size,(tcp_t *tc));
+_PROTOTYPE(static void save_TCP_states,(tcp_t *tc, caddr_t *fa, tcpb_t *tb,
+					caddr_t *xp));
+
+
+/*
+ * build_IPstates() -- build the TCP and UDP state tables
+ */
+
+void
+build_IPstates()
+{
+	if (!TcpSt) {
+	    (void) enter_IPstate("TCP", "CLOSED", TCPS_CLOSED);
+	    (void) enter_IPstate("TCP", "IDLE", TCPS_IDLE);
+	    (void) enter_IPstate("TCP", "BOUND", TCPS_BOUND);
+	    (void) enter_IPstate("TCP", "LISTEN", TCPS_LISTEN);
+	    (void) enter_IPstate("TCP", "SYN_SENT", TCPS_SYN_SENT);
+	    (void) enter_IPstate("TCP", "SYN_RCVD", TCPS_SYN_RCVD);
+	    (void) enter_IPstate("TCP", "ESTABLISHED", TCPS_ESTABLISHED);
+	    (void) enter_IPstate("TCP", "CLOSE_WAIT", TCPS_CLOSE_WAIT);
+	    (void) enter_IPstate("TCP", "FIN_WAIT_1", TCPS_FIN_WAIT_1);
+	    (void) enter_IPstate("TCP", "CLOSING", TCPS_CLOSING);
+	    (void) enter_IPstate("TCP", "LAST_ACK", TCPS_LAST_ACK);
+	    (void) enter_IPstate("TCP", "FIN_WAIT_2", TCPS_FIN_WAIT_2);
+	    (void) enter_IPstate("TCP", "TIME_WAIT", TCPS_TIME_WAIT);
+	    (void) enter_IPstate("TCP", (char *)NULL, 0);
+	}
+	if (!UdpSt) {
+	    (void) enter_IPstate("UDP", "Unbound", TS_UNBND);
+	    (void) enter_IPstate("UDP", "Wait_BIND_REQ_Ack", TS_WACK_BREQ);
+	    (void) enter_IPstate("UDP", "Wait_UNBIND_REQ_Ack", TS_WACK_UREQ);
+	    (void) enter_IPstate("UDP", "Idle", TS_IDLE);
+	    (void) enter_IPstate("UDP", "Wait_OPT_REQ_Ack", TS_WACK_OPTREQ);
+	    (void) enter_IPstate("UDP", "Wait_CONN_REQ_Ack", TS_WACK_CREQ);
+	    (void) enter_IPstate("UDP", "Wait_CONN_REQ_Confirm", TS_WCON_CREQ);
+	    (void) enter_IPstate("UDP", "Wait_CONN_IND_Response", TS_WRES_CIND);
+	    (void) enter_IPstate("UDP", "Wait_CONN_RES_Ack", TS_WACK_CRES);
+	    (void) enter_IPstate("UDP", "Wait_Data_Xfr", TS_DATA_XFER);
+	    (void) enter_IPstate("UDP", "Wait_Read_Release", TS_WIND_ORDREL);
+	    (void) enter_IPstate("UDP", "Wait_Write_Release", TS_WREQ_ORDREL);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack", TS_WACK_DREQ6);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack", TS_WACK_DREQ7);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack", TS_WACK_DREQ9);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack", TS_WACK_DREQ10);
+	    (void) enter_IPstate("UDP", "Wait_DISCON_REQ_Ack", TS_WACK_DREQ11);
+	    (void) enter_IPstate("UDP", (char *)NULL, 0);
+	}
+}
+
+
+/*
+ * print_tcptpi() - print TCP/TPI info
+ */
+
+void
+print_tcptpi(nl)
+	int nl;				/* 1 == '\n' required */
+{
+	char *cp = (char *)NULL;
+	char  sbuf[128];
+	int i;
+	int ps = 0;
+	unsigned int u;
+
+	if (Ftcptpi & TCPTPI_STATE) {
+	    switch (Lf->lts.type) {
+	    case 0:				/* TCP */
+		if (!TcpSt)
+		    (void) build_IPstates();
+		if ((i = Lf->lts.state.i + TcpStOff) < 0 || i >= TcpNstates) {
+		    (void) snpf(sbuf, sizeof(sbuf), "UNKNOWN_TCP_STATE_%d",
+			Lf->lts.state.i);
+		    cp = sbuf;
+		} else
+		    cp = TcpSt[i];
+		break;
+	    case 1:				/* TPI */
+		if (!UdpSt)
+		    (void) build_IPstates();
+		if ((u = Lf->lts.state.ui + UdpStOff) < 0 || u >= UdpNstates) {
+		    (void) snpf(sbuf, sizeof(sbuf), "UNKNOWN_UDP_STATE_%u",
+			Lf->lts.state.ui);
+		    cp = sbuf;
+		} else
+		    cp = UdpSt[u];
+	    }
+	    if (cp) {
+		if (Ffield)
+		    (void) printf("%cST=%s%c", LSOF_FID_TCPTPI, cp, Terminator);
+		else {
+		    putchar('(');
+		    (void) fputs(cp, stdout);
+		}
+		ps++;
+	    }
+	}
+
+#if	defined(HASTCPTPIQ)
+	if (Ftcptpi & TCPTPI_QUEUES) {
+	    if (Lf->lts.rqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QR=%lu", Lf->lts.rq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.sqs) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QS=%lu", Lf->lts.sq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int opt;
+
+	    if ((opt = Lf->lts.opt)
+	    ||  Lf->lts.pqlens || Lf->lts.qlens || Lf->lts.qlims
+	    ||  Lf->lts.rbszs  || Lf->lts.sbsz
+	    ) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSO", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(SO_BROADCAST)
+		if (opt & SO_BROADCAST) {
+		    (void) printf("%cBROADCAST", sep);
+		    opt &= ~SO_BROADCAST;
+		    sep = ',';
+		}
+# endif	/* defined(SO_BROADCAST) */
+
+# if	defined(SO_DEBUG)
+		if (opt & SO_DEBUG) {
+		    (void) printf("%cDEBUG", sep);
+		    opt &= ~ SO_DEBUG;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DEBUG) */
+
+# if	defined(SO_DGRAM_ERRIND)
+		if (opt & SO_DGRAM_ERRIND) {
+		    (void) printf("%cDGRAM_ERRIND", sep);
+		    opt &= ~SO_DGRAM_ERRIND;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DGRAM_ERRIND) */
+
+# if	defined(SO_DONTROUTE)
+		if (opt & SO_DONTROUTE) {
+		    (void) printf("%cDONTROUTE", sep);
+		    opt &= ~SO_DONTROUTE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DONTROUTE) */
+
+# if	defined(SO_KEEPALIVE)
+		if (opt & SO_KEEPALIVE) {
+		    (void) printf("%cKEEPALIVE", sep);
+		    if (Lf->lts.kai)
+			(void) printf("=%d", Lf->lts.kai);
+		    opt &= ~SO_KEEPALIVE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_KEEPALIVE) */
+
+# if	defined(SO_LINGER)
+		if (opt & SO_LINGER) {
+		    (void) printf("%cLINGER", sep);
+		    if (Lf->lts.ltm)
+			(void) printf("=%d", Lf->lts.ltm);
+		    opt &= ~SO_LINGER;
+		    sep = ',';
+		}
+# endif	/* defined(SO_LINGER) */
+
+# if	defined(SO_OOBINLINE)
+		if (opt & SO_OOBINLINE) {
+		    (void) printf("%cOOBINLINE", sep);
+		    opt &= ~SO_OOBINLINE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_OOBINLINE) */
+
+		if (Lf->lts.pqlens) {
+		    (void) printf("%cPQLEN=%u", sep, Lf->lts.pqlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlens) {
+		    (void) printf("%cQLEN=%u", sep, Lf->lts.qlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlims) {
+		    (void) printf("%cQLIM=%u", sep, Lf->lts.qlim);
+		    sep = ',';
+		}
+		if (Lf->lts.rbszs) {
+		    (void) printf("%cRCVBUF=%lu", sep, Lf->lts.rbsz);
+		    sep = ',';
+		}
+
+# if	defined(SO_REUSEADDR)
+		if (opt & SO_REUSEADDR) {
+		    (void) printf("%cREUSEADDR", sep);
+		    opt &= ~SO_REUSEADDR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEADDR) */
+
+		if (Lf->lts.sbszs) {
+		    (void) printf("%cSNDBUF=%lu", sep, Lf->lts.sbsz);
+		    sep = ',';
+		}
+
+# if	defined(SO_TIMESTAMP)
+		if (opt & SO_TIMESTAMP) {
+		    (void) printf("%cTIMESTAMP", sep);
+		    opt &= ~SO_TIMESTAMP;
+		    sep = ',';
+		}
+# endif	/* defined(SO_TIMESTAMP) */
+
+# if	defined(SO_USELOOPBACK)
+		if (opt & SO_USELOOPBACK) {
+		    (void) printf("%cUSELOOPBACK", sep);
+		    opt &= ~SO_USELOOPBACK;
+		    sep = ',';
+		}
+# endif	/* defined(SO_USELOOPBACK) */
+
+		if (opt)
+		    (void) printf("%cUNKNOWN=%#x", sep, opt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int topt;
+
+	    if ((topt = Lf->lts.topt) || Lf->lts.msss) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cTF", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(TF_ACKNOW)
+		if (topt & TF_ACKNOW) {
+		    (void) printf("%cACKNOW", sep);
+		    topt &= ~TF_ACKNOW;
+		    sep = ',';
+		}
+# endif	/* defined(TF_ACKNOW) */
+
+# if	defined(TF_DELACK)
+		if (topt & TF_DELACK) {
+		    (void) printf("%cDELACK", sep);
+		    topt &= ~TF_DELACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_DELACK) */
+
+		if (Lf->lts.msss) {
+		    (void) printf("%cMSS=%lu", sep, Lf->lts.mss);
+		    sep = ',';
+		}
+
+# if	defined(TF_NODELAY)
+		if (topt & TF_NODELAY) {
+		    (void) printf("%cNODELAY", sep);
+		    topt &= ~TF_NODELAY;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NODELAY) */
+
+# if	defined(TF_NOOPT)
+		if (topt & TF_NOOPT) {
+		    (void) printf("%cNOOPT", sep);
+		    topt &= ~TF_NOOPT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NOOPT) */
+
+# if	defined(TF_SENTFIN)
+		if (topt & TF_SENTFIN) {
+		    (void) printf("%cSENTFIN", sep);
+		    topt &= ~TF_SENTFIN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SENTFIN) */
+
+		if (topt)
+		    (void) printf("%cUNKNOWN=%#x", sep, topt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASTCPOPT) */
+
+#if	defined(HASTCPTPIW)
+	if (Ftcptpi & TCPTPI_WINDOWS) {
+	    if (Lf->lts.rws) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WR=%lu", Lf->lts.rw);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.wws) {
+		if (Ffield)
+			putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WW=%lu", Lf->lts.ww);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+#endif	/* defined(HASTCPTPIW) */
+
+	if (Ftcptpi && !Ffield && ps)
+	    putchar(')');
+	if (nl)
+	    putchar('\n');
+}
+
+#if	solaris>=110000
+/*
+ * procss_VSOCK() -- process a VSOCK socket
+ */
+
+# if	defined(HAS_CONN_NEW)
+/*
+ * Adjust for changes in the conn_s structure, introduced at OpenSolaris
+ * level b134.
+ */
+
+#define	conn_ulp conn_proto
+#define conn_rem V4_PART_OF_V6(connua_v6addr.connua_faddr)
+#define conn_src V4_PART_OF_V6(connua_v6addr.connua_laddr)
+# endif	/* defined(HAS_CONN_NEW) */
+
+int
+process_VSOCK(va, v, so)
+	KA_T va;			/* containing vnode address */
+	struct vnode *v;		/* pointer to containing vnode */
+	struct sonode *so;		/* pointer to socket's sonode */
+{
+	int af;				/* address family */
+	struct conn_s cs;		/* connection info */
+	unsigned char *fa = (unsigned char *)NULL;
+					/* foreign address */
+	u_short fp = (u_short)0;	/* foreign port */
+	u_short lp;			/* local port */
+	icmp_t ic;			/* ICMP control structure */
+	KA_T ka;			/* temporary kernel address */
+	unsigned char *la = (unsigned char *)NULL;
+					/* local address */
+	KA_T pha;			/* protocol handle address */
+	rts_t rt;			/* AF_ROUTE control structure */
+	int s;				/* state */
+	unsigned char *ta = (unsigned char *)NULL;
+					/* temporary address */
+	char tbuf[32], tbuf1[32];	/* temporary buffers */
+	tcp_t tc;			/* TCP control structure */
+	tcph_t th;			/* TCP header structure */
+
+# if	defined(HAS_CONN_NEW)
+	struct ip_xmit_attr_s xa;
+	caddr_t *xp = (caddr_t *)NULL;
+# else	/* !defined(HAS_CONN_NEW) */
+	tcph_t *tha = (tcph_t *)NULL;	/* TCP header structure address */
+# endif	/* defined(HAS_CONN_NEW) */
+
+	char *ty;			/* TCP type */
+	udp_t uc;			/* local UDP control structure */
+/*
+ * Read VSOCK's connection information.  Enter its address as the protocol
+ * control block device address.
+ */
+	if (!(pha = (KA_T)so->so_proto_handle))
+	    return(0);
+	if (kread(pha, (char *)&cs, sizeof(cs))) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %s; snode at %s; can't read proto handle at: %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)v->v_data, tbuf1, sizeof(tbuf1)),
+		print_kptr(pha, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	enter_dev_ch(print_kptr(pha, (char *)NULL, 0));
+/*
+ * Process connection info by protocol.
+ */
+	switch ((af = so->so_family)) {
+	case AF_INET:
+	case AF_INET6:
+
+	/*
+	 * Set INET type -- IPv4 or IPv6.
+	 */
+	    if (af == AF_INET)
+		ty = "IPv4";
+	    else
+		ty = "IPv6";
+	    (void) snpf(Lf->type, sizeof(Lf->type), ty);
+
+	    switch (cs.conn_ulp) {
+	    case IPPROTO_TCP:
+
+	    /*
+	     * Process TCP socket; read its control structure.
+	     */
+		if (!(ka = (KA_T)cs.conn_proto_priv.cp_tcp)
+		||  kread(ka, (char *)&tc, sizeof(tc))
+		) {
+		    (void) snpf(Namech, Namechl - 1,
+			"can't read TCP socket's control structure: %s",
+			print_kptr((KA_T)ka, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    enter_nm(Namech);
+		    return(1);
+		}
+	    /*
+	     * Set TCP protcol name in Lf->iproto[].
+	     */
+		(void) snpf(Lf->iproto, IPROTOL - 1, "%s", "TCP");
+		Lf->iproto[IPROTOL - 1] = '\0';
+		Lf->inp_ty = 2;
+	    /*
+	     * Check for TCP state inclusion or exclusion.
+	     */
+		if (TcpNstates) {
+		    if ((s = (int)tc.tcp_state + TcpStOff) < TcpNstates) {
+			if (TcpStXn) {
+			    if (TcpStX[s]) {
+				Lf->sf |= SELEXCLF;
+				return(1);
+			    }
+			}
+			if (TcpStIn) {
+			    if (TcpStI[s]) {
+				TcpStI[s] = 2;
+				Lf->sf |= SELNET;
+			    } else {
+				Lf->sf |= SELEXCLF;
+				return(1);
+			    }
+			}
+		    }
+		}
+	    /*
+	     * Set network file selection status.
+	     */
+		if (Fnet) {
+		    if (!FnetTy
+		    ||  ((FnetTy == 4) && (af == AF_INET))
+		    ||  ((FnetTy == 6) && (af == AF_INET6))
+		    ) {
+			Lf->sf |= SELNET;
+		    }
+		}
+	    /*
+	     * Save local and remote (foreign) TCP address.
+	     */
+		if (af == AF_INET6) {
+		    ta = (unsigned char *)&cs.connua_v6addr.connua_faddr;
+		    la = (unsigned char *)&cs.connua_v6addr.connua_laddr;
+		} else {
+		    ta = (unsigned char *)&cs.conn_rem;
+		    la = (unsigned char *)&cs.conn_src;
+		}
+		if (!IPv_ADDR_UNSPEC(af, ta) || (u_short)cs.conn_fport) {
+		    fa = ta;
+		    fp = (u_short)cs.conn_fport;
+		}
+		if ((af == AF_INET6)
+		&&  ((la && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la))
+		||  ((fa && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)fa))))
+		) {
+
+		/*
+		 * Convert IPv4 addresses in IPv6 structures to IPv4 addresses
+		 * in IPv4 structures.  Change the address family to AF_INET.
+		 */
+		    if (la)
+			la = (unsigned char *)IPv6_2_IPv4(la);
+		    if (fa)
+			fa = (unsigned char *)IPv6_2_IPv4(fa);
+		    af = AF_INET;
+		}
+		lp = (u_short)cs.conn_lport;
+		(void) ent_inaddr(la, (int)ntohs(lp), fa, (int)ntohs(fp), af);
+	    /*
+	     * Save TCP state information.
+	     */
+
+# if	defined(HAS_CONN_NEW)
+		if ((ka = (KA_T)cs.conn_ixa)
+		&&  !kread(ka, (char *)&xa, sizeof(xa))
+		) {
+		    xp = (caddr_t *)&xa;
+		}
+		(void) save_TCP_states(&tc, (caddr_t *)&cs, (tcpb_t *)NULL, xp);
+# else	/* !defined(HAS_CONN_NEW) */
+		if (tc.tcp_tcp_hdr_len
+		&&  (ka = (KA_T)tc.tcp_tcph)
+		&&  !kread(ka, (char *)&th, sizeof(th))
+		) {
+		    tha = &th;
+		}
+		(void) save_TCP_states(&tc, (caddr_t *)tha, (tcpb_t *)NULL,
+				       (caddr_t *)NULL);
+# endif	/* defined(HAS_CONN_NEW) */
+
+		Lf->lts.type = 0;
+		Lf->lts.state.i = (int)tc.tcp_state;
+	    /*
+	     * Save TCP size information.
+	     */
+		(void) save_TCP_size(&tc);
+		break;
+	    case IPPROTO_UDP:
+
+	    /*
+	     * Process UDP socket; read its control structure.
+	     */
+		if (!(ka = (KA_T)cs.conn_proto_priv.cp_udp)
+		||  kread(ka, (char *)&uc, sizeof(uc))
+		) {
+		    (void) snpf(Namech, Namechl - 1,
+			"can't read UDP socket's control structure: %s",
+			print_kptr((KA_T)ka, (char *)NULL, 0));
+		    Namech[Namechl - 1] = '\0';
+		    enter_nm(Namech);
+		    return(1);
+		}
+	    /*
+	     * Set UDP protcol name in Lf->iproto[].
+	     */
+		(void) snpf(Lf->iproto, IPROTOL - 1, "%s", "UDP");
+		Lf->iproto[IPROTOL - 1] = '\0';
+		Lf->inp_ty = 2;
+	    /*
+	     * Check for UDP state inclusion or exclusion.
+	     */
+		if (UdpNstates) {
+		    if ((s = (int)uc.udp_state + TcpStOff) < UdpNstates) {
+			if (UdpStXn) {
+			    if (UdpStX[s]) {
+				Lf->sf |= SELEXCLF;
+				return(1);
+			    }
+			}
+			if (UdpStIn) {
+			    if (UdpStI[s]) {
+				UdpStI[s] = 2;
+				Lf->sf |= SELNET;
+			    } else {
+				Lf->sf |= SELEXCLF;
+				return(1);
+			    }
+			}
+		    }
+		}
+	    /*
+	     * Set network file selection status.
+	     */
+		if (Fnet) {
+		    if (!FnetTy
+		    ||  ((FnetTy == 4) && (af == AF_INET))
+		    ||  ((FnetTy == 6) && (af == AF_INET6))
+		    ) {
+			Lf->sf |= SELNET;
+		    }
+		}
+	    /*
+	     * Save local and remote (foreign) UDP address.
+	     */
+		if (af == AF_INET6) {
+		    ta = (unsigned char *)&cs.connua_v6addr.connua_faddr;
+		    la = (unsigned char *)&cs.connua_v6addr.connua_laddr;
+		} else {
+		    ta = (unsigned char *)&cs.conn_rem;
+		    la = (unsigned char *)&cs.conn_src;
+		}
+		if (!IPv_ADDR_UNSPEC(af, ta) || (u_short)cs.conn_fport) {
+		    fa = ta;
+		    fp = (u_short)cs.conn_fport;
+	    	}
+		lp = (u_short)cs.conn_lport;
+		(void) ent_inaddr(la, (int)ntohs(lp), fa, (int)ntohs(fp), af);
+	    /*
+	     * Save UDP state and size information.
+	     */
+		if (!Fsize)
+		    Lf->off_def = 1;
+		Lf->lts.type = 1;
+		Lf->lts.state.ui = (unsigned int)uc.udp_state;
+
+# if	defined(HASSOOPT)
+	    /*
+	     * Save UDP flags.
+	     */
+		if (Ftcptpi & TCPTPI_FLAGS) {
+		    union {
+			uint_t flags;
+			uint_t 
+			    udpb_debug : 1,	   /* SO_DEBUG option */
+			    udpb_dontroute : 1,	   /* SO_DONTROUTE option */
+			    udpb_broadcast : 1,	   /* SO_BROADCAST option */
+			    udpb_reuseaddr : 1,	   /* SO_REUSEADDR option */
+			    udpb_useloopback : 1,  /* SO_USELOOPBACK option */
+			    udpb_dgram_errind : 1, /* SO_DGRAM_ERRIND option */
+			    udpb_pad : 26;	   /* pad to bit 31 */
+		    } ucf;
+
+		    ucf.flags = uc.udp_bits;
+		    if (ucf.udpb_debug)
+			Lf->lts.opt |= SO_DEBUG;
+		    if (ucf.udpb_dontroute)
+		        Lf->lts.opt |= SO_DONTROUTE;
+		    if (ucf.udpb_broadcast)
+		        Lf->lts.opt |= SO_BROADCAST;
+		    if (ucf.udpb_reuseaddr)
+			Lf->lts.opt |= SO_REUSEADDR;
+		    if (ucf.udpb_useloopback)
+			Lf->lts.opt |= SO_USELOOPBACK;
+		    if (ucf.udpb_dgram_errind)
+			Lf->lts.opt |= SO_DGRAM_ERRIND;
+		}
+# endif	/* defined(HASSOOPT) */
+
+		break;
+	    case IPPROTO_ICMP:
+	    case IPPROTO_ICMPV6:
+
+	    /*
+	     * Process ICMP or ICMP6 socket.
+	     *
+	     * Set protocol name.
+	     */
+		if (cs.conn_ulp == IPPROTO_ICMP)
+		    ty = "ICMP";
+		else
+		    ty = "ICMP6";
+		(void) snpf(Lf->iproto, IPROTOL - 1, "%s", ty);
+		Lf->iproto[IPROTOL - 1] = '\0';
+		Lf->inp_ty = 2;
+	    /*
+	     * Read the ICMP control structure.
+	     */
+		if (read_icmp_t(va, pha, (KA_T)cs.conn_proto_priv.cp_icmp, &ic))
+		    return(1);
+	    /*
+	     * Save ICMP size and state information.
+	     */
+		if (!Fsize)
+		    Lf->off_def = 1;
+		Lf->lts.type = 1;
+		Lf->lts.state.ui = (unsigned int)ic.icmp_state;
+	    /*
+	     * Set network file selection status.
+	     */
+		if (Fnet) {
+		    if (!FnetTy
+		    ||  ((FnetTy == 4) && (af == AF_INET))
+		    ||  ((FnetTy == 6) && (af == AF_INET6))
+		    ) {
+			Lf->sf |= SELNET;
+		    }
+		}
+	    /*
+	     * Save addresses.
+	     */
+		ta = (af == AF_INET6) ? (unsigned char *)&ic.icmp_bound_v6src
+		   :  (unsigned char *)&V4_PART_OF_V6(ic.icmp_bound_v6src);
+		if (!IPv_ADDR_UNSPEC(af, ta))
+		    la = ta;
+		ta = (af == AF_INET6) ? (unsigned char *)&ic.icmp_v6src
+		   :  (unsigned char *)&V4_PART_OF_V6(ic.icmp_v6src);
+		if (!IPv_ADDR_UNSPEC(af, ta))
+		    fa = ta;
+		if (la || fa)
+		    (void)ent_inaddr(la, 0, fa, 0, af);
+
+# if	defined(HASSOOPT)
+	    /*
+	     * Save ICMP flags.
+	     */
+		if (Ftcptpi & TCPTPI_FLAGS) {
+		    if (ic.icmp_debug.icmp_Debug)
+			Lf->lts.opt |= SO_DEBUG;
+		    if (ic.icmp_debug.icmp_dontroute)
+		        Lf->lts.opt |= SO_DONTROUTE;
+		    if (ic.icmp_debug.icmp_broadcast)
+		        Lf->lts.opt |= SO_BROADCAST;
+		    if (ic.icmp_debug.icmp_reuseaddr)
+			Lf->lts.opt |= SO_REUSEADDR;
+		    if (ic.icmp_debug.icmp_useloopback)
+			Lf->lts.opt |= SO_USELOOPBACK;
+		    if (ic.icmp_debug.icmp_dgram_errind)
+			Lf->lts.opt |= SO_DGRAM_ERRIND;
+		}
+# endif	/* defined(HASSOOPT) */
+
+		break;
+	    default:
+		(void) snpf(Namech, Namechl - 1,
+		    "unsupported conn_s AF_INET%s protocol: %u",
+		    (af == AF_INET6) ? "6" : "",
+		    (unsigned int)cs.conn_ulp);
+		Namech[Namechl - 1] = '\0';
+		enter_nm(Namech);
+		return(1);
+	    }
+	    break;
+	case AF_ROUTE:
+
+	/*
+	 * Set INET type -- IPv4 or IPv6.
+	 */
+	    if (af == AF_INET)
+		ty = "IPv4";
+	    else
+		ty = "IPv6";
+	    (void) snpf(Lf->type, sizeof(Lf->type), ty);
+	/*
+	 * Set protocol name.
+	 */
+	    (void) strncpy(Lf->iproto, "ROUTE", IPROTOL - 1);
+	    Lf->iproto[IPROTOL - 1] = '\0';
+	    Lf->inp_ty = 2;
+
+	/*
+	 * Read routing control structure.
+	 */
+	    if (read_rts_t(va, pha, (KA_T)cs.conn_proto_priv.cp_rts, &rt))
+		return(1);
+	/*
+	/*
+	 * Save AF_ROUTE size and state information.
+	 */
+	    if (!Fsize)
+		Lf->off_def = 1;
+	    Lf->lts.type = 1;
+	    Lf->lts.state.i = (int)rt.rts_state;
+	/*
+	 * Set network file selection status.
+	 */
+	    if (Fnet) {
+		if (!FnetTy
+		||  ((FnetTy == 4) && (af == AF_INET))
+		||  ((FnetTy == 6) && (af == AF_INET6))
+		) {
+		    Lf->sf |= SELNET;
+		}
+	    }
+
+# if	defined(HASSOOPT)
+	/*
+	 * Save ROUTE flags.
+	 */
+	    if (Ftcptpi & TCPTPI_FLAGS) {
+		if (rt.rts_debug.rts_Debug)
+		    Lf->lts.opt |= SO_DEBUG;
+		if (rt.rts_debug.rts_dontroute)
+		    Lf->lts.opt |= SO_DONTROUTE;
+		if (rt.rts_debug.rts_broadcast)
+		    Lf->lts.opt |= SO_BROADCAST;
+		if (rt.rts_debug.rts_reuseaddr)
+		   Lf->lts.opt |= SO_REUSEADDR;
+		if (rt.rts_debug.rts_useloopback)
+		    Lf->lts.opt |= SO_USELOOPBACK;
+	    }
+# endif	/* defined(HASSOOPT) */
+
+	    break;
+	default:
+	    (void) printiproto((int)cs.conn_ulp);
+	    (void) snpf(Namech, Namechl - 1, "unsupported socket family: %u",
+		so->so_family);
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    Lf->inp_ty = 2;
+	}
+	return(1);
+}
+#endif	/* solaris>=110000*/
+
+
+/*
+ * process_socket() - process Solaris socket
+ */
+
+void
+process_socket(sa, ty)
+	KA_T sa;			/* stream's data address in kernel */
+	char *ty;			/* socket type name */
+{
+	int af;
+	unsigned char *fa = (unsigned char *)NULL;
+	int fp = 0;
+	int i, lp;
+
+#if	solaris<110000
+# if	solaris>=100000 && defined(HAS_IPCLASSIFIER_H)
+	struct conn_s ic;
+#define	ipc_v6laddr	conn_srcv6
+#define	ipc_v6faddr	conn_remv6
+#define	ipc_fport	conn_fport
+#define	ipc_lport	conn_lport
+# else	/* solaris<100000 || !defined(HAS_IPCLASSIFIER_H) */
+	struct ipc_s ic;
+# endif	/* solaris>=100000 && defined(HAS_IPCLASSIFIER_H) */
+#else	/* solaris>=110000 */
+	struct conn_s cs;
+#endif	/* solaris<110000 */
+
+	int ics = 0;
+	unsigned char *la = (unsigned char *)NULL;
+	struct module_info mi;
+	KA_T ka;
+	u_short p;
+	KA_T pcb = (KA_T)NULL;
+	struct queue q;
+	struct qinit qi;
+	KA_T qp;
+	u_short *s;
+	struct stdata sd;
+	unsigned char *ta;
+	char tbuf[32];
+
+#if	solaris<20600
+	struct tcp_s {			/* should come from kernel source
+					 * file ../uts/common/inet/tcp.c */
+
+# if	solaris>=20400
+	    struct tcp_s *d1[8];
+# endif	/* solaris>=20400 */
+
+# if	defined(P101318) && P101318>=32
+	    struct tcp_s *d1[6];
+# endif	/* defined(P101318) && P101318>=32 */
+
+	    int tcp_state;
+	    queue_t *d3[2];
+	    mblk_t *d4[2];
+	    u_long d5;
+	    mblk_t *d6;
+	    u_long d7;
+	    u_long tcp_snxt;	/* Senders next seq num */
+	    u_long tcp_suna;	/* Sender unacknowledged */
+	    u_long tcp_swnd;	/* Senders window (relative to suna) */
+	    u_long d8[5];
+	    int tcp_hdr_len;	/* combined TCP/IP header length */
+	    tcph_t *tcp_tcph;	/* pointer to combined header */
+	    int d9;
+	    unsigned int d10;
+	    int d11;
+	    mblk_t *d12;
+	    long d13;
+	    mblk_t *d14;
+	    u_long d15;
+
+# if	solaris<20400 && (!defined(P101318) || P101318<32)
+	    mblk_t *d16;
+# endif	/* solaris<20400 && (!defined(P101318) || P101318<32) */
+
+	    unsigned int d17;
+	    u_long tcp_rnxt;	/* Seq we expect to recv next */
+	    u_long tcp_rwnd;	/* Current receive window */
+	    u_long d18;
+	    long d19[2];
+	    mblk_t *d20[4];
+	    u_long d21[5];
+	    long d22[3];
+
+# if	solaris<20500
+	    u_long d23[2];
+	    u_long tcp_rack;	/* Seq # we have acked */
+# else	/* solaris>=20500 */
+	    u_long d23[3];
+# endif	/* solaris<20500 */
+
+# if	solaris<20400
+	    u_long d24[28];
+# else	/* solaris>=20400 */
+#  if	solaris<20500
+	    u_long d24[67];
+#  else	/* solaris>=20500 */
+#   if	solaris<20501
+	    u_long d25[6];
+#   else	/* solaris>=20501 */
+	    u_long d25[8];
+#   endif	/* solaris<20501 */
+	    u_long tcp_rack;	/* Seq # we have acked */
+#   if	solaris<20501
+	    u_long d26[29];
+#   else	/* solaris>=20501 */
+	    u_long d26[33];
+#   endif	/* solaris>=20501 */
+#  endif	/* solaris<20500 */
+# endif	/* solaris<20400 */
+
+	    iph_t tcp_iph;
+	} tc;
+#else	/* solaris>=20600 */
+	struct tcp_s tc;
+#endif	/* solaris<20600 */
+
+#if	solaris>=80000 && !defined(HAS_IPCLASSIFIER_H)
+	tcpb_t	tcb;
+#endif	/* solaris>=80000 && !defined(HAS_IPCLASSIFIER_H) */
+
+	tcpb_t *tcbp = (tcpb_t *)NULL;
+	int tcs = 0;
+	tcph_t th;
+	tcph_t *tha = (tcph_t *)NULL;
+
+#if	solaris<110000
+	struct ud_s {			/* should come from kernel source
+					 * file ../uts/common/inet/udp.c */
+	    uint udp_state;		/* TPI state */
+	    unsigned char d1[2];
+	    unsigned char udp_port[2];	/* port bound to this stream */
+	    unsigned char udp_src[4];	/* source address of this stream */
+	} uc;
+#else	/* solaris>=110000 */
+	udp_t uc;			/* UDP control structure */
+#endif	/* solaris<110000 */
+	int ucs = 0;
+
+#if	defined(HASIPv6)
+	if (strrchr(ty, '6')) {
+	    (void) snpf(Lf->type, sizeof(Lf->type), "IPv6");
+	    af = AF_INET6;
+	} else {
+	    (void) snpf(Lf->type, sizeof(Lf->type), "IPv4");
+	    af = AF_INET;
+	}
+#else	/* !defined(HASIPv6) */
+	(void) snpf(Lf->type, sizeof(Lf->type), "inet");
+	af = AF_INET;
+#endif	/* defined(HASIPv6) */
+
+/*
+ * Set network file selection status.
+ */
+	if (Fnet) {
+	    if (!FnetTy
+	    ||  ((FnetTy == 4) && (af == AF_INET))
+
+#if	defined(HASIPv6)
+	    ||  ((FnetTy == 6) && (af == AF_INET6))
+#endif	/* defined(HASIPv6) */
+
+	    ) {
+		if (!TcpStIn && !UdpStIn)
+		    Lf->sf |= SELNET;
+	    }
+	}
+	Lf->inp_ty = 2;
+/*
+ * Convert type to upper case protocol name.
+ */
+	if (ty) {
+	    for (i = 0; (ty[i] != '\0') && (i < IPROTOL) && (i < 3); i++) {
+		if (islower((unsigned char)ty[i]))
+		    Lf->iproto[i] = toupper((unsigned char)ty[i]);
+		else
+		    Lf->iproto[i] = ty[i];
+	    }
+	} else
+	    i = 0;
+	Lf->iproto[i] = '\0';
+/*
+ * Read stream queue entries to obtain private IP, TCP, and UDP structures.
+ */
+	if (!sa || readstdata(sa, &sd))
+	    qp = (KA_T)NULL;
+	else
+	    qp = (KA_T)sd.sd_wrq;
+	for (i = 0; qp && i < 20; i++, qp = (KA_T)q.q_next) {
+	    if (kread(qp, (char *)&q, sizeof(q)))
+		break;
+	    if ((ka = (KA_T)q.q_qinfo) == (KA_T)NULL
+	    ||  kread(ka, (char *)&qi, sizeof(qi)))
+		continue;
+	    if ((ka = (KA_T)qi.qi_minfo) == (KA_T)NULL
+	    ||  kread(ka, (char *)&mi, sizeof(mi))
+	    ||  (ka = (KA_T)mi.mi_idname) == (KA_T)NULL)
+		continue;
+	    if (kread(ka, (char *)&tbuf, sizeof(tbuf) - 1))
+		continue;
+	    if ((pcb = (KA_T)q.q_ptr) == (KA_T)NULL)
+		continue;
+
+#if	solaris<110000
+	    if (strncasecmp(tbuf, "IP",  2) == 0) {
+		if (kread(pcb, (char *)&ic, sizeof(ic)) == 0)
+		    ics = 1;
+		continue;
+	    }
+#endif	/* solaris<110000 */
+
+	    if (strncasecmp(tbuf, "TCP", 3) == 0) {
+
+#if	solaris<=90000 || !defined(HAS_IPCLASSIFIER_H)
+		if (!kread((KA_T)pcb, (char *)&tc, sizeof(tc)))
+
+# if	solaris>=80000
+		{
+		    if (tc.tcp_base
+		    &&  !kread((KA_T)tc.tcp_base, (char *)&tcb, sizeof(tcb))) {
+			tcs = 1;
+			tcbp = &tcb;
+		    }
+		    tc.tcp_base = &tcb;		/* support for macros */
+		    tcb.tcpb_tcp = &tc;		/* support for macros */
+		}
+# else	/* solaris<80000 */
+		    tcs = 1;
+# endif	/* solaris>=80000 */
+#else	/* solaris>90000 && defined(HAS_IPCLASSIFIER_H) */
+# if	solaris>=110000
+		if (!kread(pcb, (char *)&cs, sizeof(cs))
+		&&  (cs.conn_ulp == IPPROTO_TCP)
+		) {
+		    ics = 1;
+		    if ((ka = (KA_T)cs.conn_proto_priv.cp_tcp)
+		    &&  !kread(ka, (char *)&tc, sizeof(tc))
+		    ) {
+			tcs = 1;
+		    }
+		}
+# else	/* solaris<110000 */
+		if (!kread((KA_T)pcb, (char *)&ic, sizeof(ic))
+		&&  ic.conn_tcp
+		&&  !kread((KA_T)ic.conn_tcp, (char *)&tc, sizeof(tc))
+		) {
+		    ics = tcs = 1;
+		}
+# endif	/* solaris>=110000 */
+#endif        /* solaris<=90000 || !defined(HAS_IPCLASSIFIER_H) */
+
+		if (tcs && TcpNstates) {
+		    int s = (int)tc.tcp_state + TcpStOff;
+		/*
+		 * Check for TCP state inclusion or exclusion.
+		 */
+
+		    if (s < TcpNstates) {
+			if (TcpStXn) {
+			    if (TcpStX[s]) {
+				Lf->sf &= ~SELNET;
+				Lf->sf |= SELEXCLF;
+				return;
+			    }
+			}
+			if (TcpStIn) {
+			    if (TcpStI[s]) {
+				TcpStI[s] = 2;
+				Lf->sf |= SELNET;
+			    } else {
+				Lf->sf &= ~SELNET;
+				Lf->sf |= SELEXCLF;
+				return;
+			    }
+			}
+		    }
+		}
+		if (!(Lf->sf & SELNET) && !TcpStIn && UdpStIn) {
+		    if (Fnet) {
+			if (!FnetTy
+			||  (FnetTy == 4) && (af == AF_INET)
+
+#if	defined(HASIPv6)
+			||  (FnetTy == 6) && (af == AF_INET6)
+#endif 	/* defined(HASIPv6) */
+
+			) {
+			    Lf->sf |= SELNET;
+			}
+		    }
+		}
+		continue;
+	    }
+	    if (strncasecmp(tbuf, "UDP", 3) == 0) {
+
+#if	solaris<110000
+		if (kread(pcb, (char *)&uc, sizeof(uc)) == 0)
+		    ucs = 1;
+#else	/* solaris>=110000 */
+		if (!kread(pcb, (char *)&cs, sizeof(cs))
+		&&  (cs.conn_ulp == IPPROTO_UDP)
+		) {
+		    ics = 1;
+		    if ((ka = (KA_T)cs.conn_proto_priv.cp_udp)
+		    &&  !read_udp_t(ka, &uc)
+		    ) {
+			ucs = 1;
+		    }
+		}
+#endif	/* solaris<110000 */
+
+		if (ucs && UdpNstates) {
+		    unsigned int s = (unsigned int)uc.udp_state + UdpStOff;
+		/*
+		 * Check for UDP state inclusion or exclusion.
+		 */
+
+		    if (s < UdpNstates) {
+			if (UdpStXn) {
+			    if (UdpStX[s]) {
+				Lf->sf &= ~SELNET;
+				Lf->sf |= SELEXCLF;
+				return;
+			    }
+			}
+			if (UdpStIn) {
+			    if (UdpStI[s]) {
+				UdpStI[s] = 2;
+				Lf->sf |= SELNET;
+			    } else {
+				Lf->sf |= SELEXCLF;
+				return;
+			    }
+			}
+		    }
+		}
+		if (!(Lf->sf & SELNET) && TcpStIn && !UdpStIn) {
+		    if (Fnet) {
+			if (!FnetTy
+			||  (FnetTy == 4) && (af == AF_INET)
+
+#if	defined(HASIPv6)
+			||  (FnetTy == 6) && (af == AF_INET6)
+#endif 	/* defined(HASIPv6) */
+
+			) {
+			    Lf->sf |= SELNET;
+			}
+		    }
+		}
+		continue;
+	    }
+	}
+	if (ics) {
+
+	/*
+	 * Print stream head's q_ptr address as protocol control block address.
+	 */
+	    if (pcb)
+		enter_dev_ch(print_kptr(pcb, (char *)NULL, 0));
+	    if (strncmp(Lf->iproto, "UDP", 3) == 0) {
+
+	/*
+	 * Save UDP address and TPI state.
+	 */
+
+#if	solaris<20600
+		la = (unsigned char *)&ic.ipc_udp_addr;
+		p = (u_short)ic.ipc_udp_port;
+#else	/* solaris>=20600 */
+# if	solaris>=110000
+		af = (uc.udp_ipversion == IPV6_VERSION) ? AF_INET6 : AF_INET;
+		la = (af == AF_INET6) ? (unsigned char *)&uc.udp_v6src
+		   :  (unsigned char *)&V4_PART_OF_V6(uc.udp_v6src);
+		p = (u_short)uc.udp_port;
+# else	/* solaris<110000 */
+#  if	defined(HASIPv6)
+		la = (af == AF_INET6) ? (unsigned char *)&ic.ipc_v6laddr
+		   :  (unsigned char *)IPv6_2_IPv4(&ic.ipc_v6laddr);
+#  else	/* !defined(HASIPv6 */
+		la = (unsigned char *)&ic.ipc_laddr;
+#  endif	/* defined(HASIPv6) */
+
+		p = (u_short)ic.ipc_lport;
+# endif	/* solaris>=110000 */
+#endif	/* solaris<20600 */
+
+#if	solaris<110000
+		if (IPv_ADDR_UNSPEC(af, la) && !p && ucs) {
+
+		/*
+		 * If the ipc_s structure has no local address, use
+		 * the port in the ud_s structure.
+		 */
+		    s = (u_short *)&uc.udp_port[0];
+		    p = *s;
+		}
+
+# if	defined(HASIPv6)
+		if ((af == AF_INET6) && la
+		&&  IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la)) {
+
+		/*
+		 * Convert a local IPv4 address in an IPv6 structure to an IPv4
+		 * address in an IPv4 structure.  Change the address family to
+		 * AF_INET.
+		 */
+		    la = (unsigned char *)IPv6_2_IPv4(la);
+		    af = AF_INET;
+		}
+# endif	/* defined(HASIPv6) */
+#endif	/* solaris<110000 */
+
+		(void) ent_inaddr(la, (int)ntohs(p), (unsigned char *)NULL,
+				  -1, af);
+		if (!Fsize)
+		    Lf->off_def = 1;
+		if (ucs) {
+		    Lf->lts.type = 1;
+		    Lf->lts.state.ui = (unsigned int)uc.udp_state;
+		}
+	    } else if (strncmp(Lf->iproto, "TCP", 3) == 0) {
+		if (ics) {
+
+	    /*
+	     * Save TCP address.
+	     */
+
+#if	solaris<20400
+		    la = (unsigned char *)&ic.ipc_tcp_addr[0];
+		    p = (u_short)ic.ipc_tcp_addr[5];
+#else	/* solaris>=20400 */
+# if	solaris<20600
+		    la = (unsigned char *)&ic.ipc_tcp_laddr;
+		    p = (u_short)((short *)&ic.ipc_tcp_ports)[1];
+# else	/* solaris>=20600 */
+#  if	solaris>=110000
+		    la = (af == AF_INET6)
+		       ? (unsigned char *)&cs.connua_v6addr.connua_laddr
+		       : (unsigned char *)&cs.conn_src;
+	            lp = cs.conn_lport;
+#  else	/* solaris<110000 */
+#   if	defined(HASIPv6)
+		    la = (af == AF_INET6) ? (unsigned char *)&ic.ipc_v6laddr
+		       :  (unsigned char *)IPv6_2_IPv4(&ic.ipc_v6laddr);
+#   else		/* !defined(HASIPv6 */
+		    la = (unsigned char *)&ic.ipc_laddr;
+#   endif	/* defined(HASIPv6) */
+
+		    p = (u_short)ic.ipc_lport;
+#  endif	/* solaris>=110000 */
+# endif	/* solaris<20600 */
+#endif	/* solaris<20400 */
+
+#if	solaris<110000
+		    if (IPv_ADDR_UNSPEC(af, la) && !p && tcs) {
+
+		    /*
+		     * If the ipc_s structure has no local address, use the
+		     * local address in the stream's tcp_iph structure (except
+		     * for Solaris 2.4), and the port number in the stream's
+		     * tcph structure.
+		     */
+
+# if	solaris!=20400 && solaris<80000
+			la = (unsigned char *)&tc.tcp_iph.iph_src[0];
+# else	/* solaris==20400 || solaris<80000 */
+#  if	solaris>=100000 && defined(HAS_IPCLASSIFIER_H)
+			la = (af == AF_INET6) ? (unsigned char *)&ic.conn_srcv6
+			   :  (unsigned char *)IPv6_2_IPv4(&ic.conn_srcv6);
+#  else	/* solaris<100000 || !defined(HAS_IPCLASSIFIER_H) */
+#   if	solaris>=80000
+#    if	defined(HASIPv6)
+			la = (af == AF_INET6)
+			   ? (unsigned char *)&tcb.tcpb_ip_src_v6
+			   :  (unsigned char *)IPv6_2_IPv4(&tcb.tcpb_ip_src_v6);
+#    else	/* !defined(HASIPv6) */
+			la = (unsigned char *)&tcb.tcpb_ip_src;
+#    endif	/* defined(HASIPv6) */
+#   endif	/* solaris>=80000 */
+#  endif	/* solaris>=100000 && defined(HAS_IPCLASSIFIER_H) */
+# endif	/* solaris!=20400 && !defined(HASIPv6) */
+
+			if (tc.tcp_hdr_len && tc.tcp_tcph
+			&&  !kread((KA_T)tc.tcp_tcph, (char *)&th, sizeof(th))
+			) {
+			    tha = &th;
+			    s = (u_short *)&th.th_lport[0];
+			    p = *s;
+			}
+		    }
+#endif	/* solaris<110000 */
+
+		    lp = (int)ntohs(p);
+
+#if	solaris<20400
+		    if ((int)ic.ipc_tcp_addr[2] != INADDR_ANY
+		    ||  ic.ipc_tcp_addr[4] != 0)
+		    {
+			fa = (unsigned char *)&ic.ipc_tcp_addr[2];
+			fp = (int)ntohs(ic.ipc_tcp_addr[4]);
+		    }
+#else	/* solaris>=20400 */
+# if	solaris<20600
+		    if ((int)ic.ipc_tcp_faddr != INADDR_ANY
+		    ||  ((u_short *) &ic.ipc_tcp_ports)[0] != 0)
+		    {
+			fa = (unsigned char *)&ic.ipc_tcp_faddr;
+			fp = (int)ntohs(((u_short *)&ic.ipc_tcp_ports)[0]);
+		    }
+# else	/* solaris>=20600 */
+
+#  if	solaris>=110000
+		    ta = (af == AF_INET6)
+		       ? (unsigned char *)&cs.connua_v6addr.connua_faddr
+		       : (unsigned char *)&cs.conn_rem;
+		    if (!IPv_ADDR_UNSPEC(af, ta) || ((u_short)cs.conn_fport)) {
+			fa = ta;
+			fp = (u_short)cs.conn_fport;
+		    }
+#  else	/* solaris<110000 */
+#   if	defined(HASIPv6)
+		    ta = (af == AF_INET6) ? (unsigned char *)&ic.ipc_v6faddr
+		       :  (unsigned char *)IPv6_2_IPv4(&ic.ipc_v6faddr);
+#   else	/* !defined(HASIPv6) */
+		    ta = (unsigned char *)&ic.ipc_faddr;
+#   endif	/* defined(HASIPv6) */
+
+		    if (!IPv_ADDR_UNSPEC(af, ta) || ((u_short)ic.ipc_fport)) {
+			fa = ta;
+			fp = (int)ntohs(((u_short)ic.ipc_fport));
+		    }
+#  endif	/* solaris>=110000 */
+# endif	/* solaris<20600 */
+#endif	/* solaris <20400 */
+
+#if	defined(HASIPv6)
+		    if ((af == AF_INET6)
+		    &&  ((la && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)la))
+		    ||  ((fa && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)fa))))
+		    ) {
+
+		    /*
+		     * Convert IPv4 addresses in IPv6 structures to IPv4
+		     * addresses in IPv4 structures.  Change the address
+		     * family to AF_INET.
+		     */
+			if (la)
+			    la = (unsigned char *)IPv6_2_IPv4(la);
+			if (fa)
+			    fa = (unsigned char *)IPv6_2_IPv4(fa);
+			af = AF_INET;
+		    }
+#endif	/* defined(HASIPv6) */
+
+		    if (fa || la)
+			(void) ent_inaddr(la, lp, fa, fp, af);
+		}
+	    /*
+	     * Save TCP state information.
+	     */
+		if (tcs) {
+		    (void) save_TCP_states(&tc, (caddr_t *)tha, tcbp,
+					   (caddr_t *)NULL);
+		    Lf->lts.type = 0;
+		    Lf->lts.state.i = (int)tc.tcp_state;
+		}
+	    /*
+	     * Save TCP size information.
+	     */
+
+		if (tcs)
+		    (void) save_TCP_size(&tc);
+	    }
+	} else
+	    (void) strcat(Namech, "no TCP/UDP/IP information available");
+/*
+ * Enter name characters if there are some.
+ */
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+#if	solaris>=110000
+/*
+ * read_icmp_t() - read connections icmp_t info
+ */
+
+static int
+read_icmp_t(va, ph, ia, ic)
+	KA_T va;			/* containing vnode kernel address */
+	KA_T ph;			/* containing protocol handle kernel
+					 * address */
+	KA_T ia;			/* icmp_t structure's kernel address */
+	icmp_t *ic;			/* local icmp_t receiver */
+{
+	char tbuf[32], tbuf1[32];	/* print_kptr() temporary buffers */
+
+# if	defined(HAS_CONN_NEW)
+	struct conn_s cs;		/* connection structure */
+	KA_T ka;			/* kernel address */
+
+	zeromem((char *)ic, sizeof(icmp_t));
+# endif	/* defined(HAS_CONN_NEW) */
+
+	(void) CTF_init(&IRU_ctfs, IRU_MOD_FORMAT, IRU_requests);
+	if (!ia
+	||  CTF_MEMBER_READ(ia, ic, icmp_t_members, icmp_state)
+
+# if	defined(HAS_CONN_NEW)
+	||  CTF_MEMBER_READ(ia, ic, icmp_t_members, icmp_connp)
+# else	/* !defined(HAS_CONN_NEW) */
+	||  CTF_MEMBER_READ(ia, ic, icmp_t_members, icmp_bound_v6src)
+	||  CTF_MEMBER_READ(ia, ic, icmp_t_members, icmp_v6src)
+	||  CTF_MEMBER_READ(ia, ic, icmp_t_members, icmp_debug)
+# endif	/* defined(HAS_CONN_NEW) */
+
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"vnode at %s; proto handle at %s; can't read icmp_t at %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr(ph, tbuf1, sizeof(tbuf1)),
+		print_kptr(ia, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+
+# if	defined(HAS_CONN_NEW)
+	if ((ka = (KA_T)ic->icmp_connp)
+	&& !kread(ka, (char *)&cs, sizeof(cs)))
+	{
+	    struct ip_xmit_attr_s xa;
+
+	/*
+	 * Complete the icmp_t structure from the conn_s structure.
+	 */
+	    ic->icmp_bound_v6src = cs.conn_bound_addr_v6;
+	    ic->icmp_v6src = cs.conn_saddr_v6;
+	    ic->icmp_debug.icmp_Debug = cs.conn_debug;
+	    ic->icmp_debug.icmp_broadcast = cs.conn_broadcast;
+	    ic->icmp_debug.icmp_reuseaddr = cs.conn_reuseaddr;
+	    ic->icmp_debug.icmp_useloopback = cs.conn_useloopback;
+	    ic->icmp_debug.icmp_dgram_errind = cs.conn_dgram_errind;
+	    if ((ka = (KA_T)cs.conn_ixa)
+	    &&  !kread(ka, (char *)&xa, sizeof(xa))
+	    ) {
+		ic->icmp_debug.icmp_dontroute = (xa.ixa_flags & IXAF_DONTROUTE)
+					      ? 1 : 0;
+	    }
+
+	}
+# endif	/* defined(HAS_CONN_NEW) */
+
+	return(0);
+}
+
+
+/*
+ * read_rts_t() - read connections rts_t info
+ */
+
+static int
+read_rts_t(va, ph, ra, rt)
+	KA_T va;			/* containing vnode kernel address */
+	KA_T ph;			/* containing protocol handle kernel
+					 * address */
+	KA_T ra;			/* rts_t structure's kernel address */
+	rts_t *rt;			/* local rts_t receiver */
+{
+	char tbuf[32], tbuf1[32];	/* print_kptr() temporary buffers */
+
+# if	defined(HAS_CONN_NEW)
+	struct conn_s cs;		/* connextion structure */
+	KA_T ka;			/* kernal address */
+
+	zeromem((char *)rt, sizeof(rts_t));
+# endif	/* defined(HAS_CONN_NEW) */
+
+	(void) CTF_init(&IRU_ctfs, IRU_MOD_FORMAT, IRU_requests);
+	if (!ra
+	||  CTF_MEMBER_READ(ra, rt, rts_t_members, rts_state)
+
+# if	defined(HAS_CONN_NEW)
+	||  CTF_MEMBER_READ(ra, rt, rts_t_members, rts_connp)
+# else	/* !defined(HAS_CONN_NEW) */
+	||  CTF_MEMBER_READ(ra, rt, rts_t_members, rts_debug)
+# endif	/* defined(HAS_CONN_NEW) */
+
+	) {
+	    (void) snpf(Namech, Namechl - 1,
+		"vnode at %s; proto handle at %s; can't read rts_t at %s",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr(ph, tbuf1, sizeof(tbuf1)),
+		print_kptr(ra, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+
+# if	defined(HAS_CONN_NEW)
+	if ((ka = (KA_T)rt->rts_connp)
+	&&  !kread(ka, (char *)&cs, sizeof(struct conn_s))
+	) {
+	    struct ip_xmit_attr_s xa;
+
+	/*
+	 * Fill in rts_debug from the connection structure.
+	 */
+	    rt->rts_debug.rts_Debug = cs.conn_debug;
+	    rt->rts_debug.rts_broadcast = cs.conn_broadcast;
+	    rt->rts_debug.rts_reuseaddr = cs.conn_reuseaddr;
+	    rt->rts_debug.rts_useloopback = cs.conn_useloopback;
+	    if ((ka = (KA_T)cs.conn_ixa)
+	    &&  !kread(ka, (char *)&xa, sizeof(xa))
+	    ) {
+		rt->rts_debug.rts_dontroute = (xa.ixa_flags & IXAF_DONTROUTE)
+					    ? 1 : 0;
+	    }
+	}
+
+# endif	/* defined(HAS_CONN_NEW) */
+
+	return(0);
+}
+
+
+/*
+ * read_udp_t() - read UDP control structure
+ */
+
+static int
+read_udp_t(ua, uc)
+	KA_T ua;			/* ucp_t kernel address */
+	udp_t *uc;			/* receiving udp_t structure */
+{
+	(void) CTF_init(&IRU_ctfs, IRU_MOD_FORMAT, IRU_requests);
+	if (!ua
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_state)
+
+# if	defined(HAS_CONN_NEW)
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_connp)
+# else	/* !defined(HAS_CONN_NEW) */
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_port)
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_dstport)
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_v6src)
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_v6dst)
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_ipversion)
+	||  CTF_MEMBER_READ(ua, uc, udp_t_members, udp_bits)
+# endif	/* defined(HAS_CONN_NEW) */
+
+	) {
+	    (void) snpf(Namech, Namechl, "can't read udp_t: %s",
+			print_kptr(ua, (char *)NULL, 0));
+	    Namech[Namechl - 1] = '\0';
+	    enter_nm(Namech);
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* solaris>=110000 */
+
+
+/*
+ * save_TCP_size() -- save TCP size information
+ */
+
+static void
+
+save_TCP_size(tc)
+	tcp_t *tc;			/* pointer to TCP control structure */
+{
+	int rq, sq;
+
+#if	defined(HASTCPTPIQ) || defined(HASTCPTPIW)
+# if	defined(HASTCPTPIW)
+	Lf->lts.rw = (int)tc->tcp_rwnd;
+	Lf->lts.ww = (int)tc->tcp_swnd;
+	Lf->lts.rws = Lf->lts.wws = 1;
+# endif	/* defined(HASTCPTPIW) */
+
+	if ((rq = (int)tc->tcp_rnxt - (int)tc->tcp_rack) < 0)
+	    rq = 0;
+	if ((sq = (int)tc->tcp_snxt - (int)tc->tcp_suna - 1) < 0)
+	    sq  = 0;
+
+# if	defined(HASTCPTPIQ)
+	Lf->lts.rq = (unsigned long)rq;
+	Lf->lts.sq = (unsigned long)sq;
+	Lf->lts.rqs = Lf->lts.sqs = 1;
+# endif	/* defined(HASTCPTPIQ) */
+
+	if (Fsize) {
+	    if (Lf->access == 'r')
+		Lf->sz = (SZOFFTYPE)rq;
+	    else if (Lf->access == 'w')
+		Lf->sz = (SZOFFTYPE)sq;
+	    else
+		Lf->sz = (SZOFFTYPE)(rq + sq);
+		Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+#else	/* !defined(HASTCPTPIQ) && !defined(HASTCPTPIW) */
+	Lf->off_def = 1;
+#endif	/* defined(HASTCPTPIQ) || defined(HASTCPTPIW) */
+
+}
+
+
+/*
+ * save_TCP_states() - save TCP states
+ */
+
+static void
+save_TCP_states(tc, fa, tb, xp)
+	tcp_t *tc;			/* pointer to TCP control structure */
+	caddr_t *fa;			/* flags address (may be NULL):
+					 *   if HAS_CONN_NEW: conn_s *
+					 *   if !CONN_HAS_NEW: tcph_t *
+					 */
+	tcpb_t *tb;			/* pointer to TCP base structure (may
+					 * be NULL) */
+	caddr_t *xp;			/* pointer to struct ip_xmit_attr_s if
+					 * HAS_CONN_NEW (may be NULL) */
+{
+	if (!tc)
+	    return;
+
+#if	defined(HASSOOPT)
+# if	defined(HAS_CONN_NEW)
+	if (Ftcptpi & TCPTPI_FLAGS && fa) {
+	    struct conn_s *cs = (struct conn_s *)fa;
+
+	    if (cs->conn_broadcast)
+		Lf->lts.opt |= SO_BROADCAST;
+	    if (cs->conn_debug)
+		Lf->lts.opt |= SO_DEBUG;
+	    if (cs->conn_dgram_errind)
+		Lf->lts.opt |= SO_DGRAM_ERRIND;
+	    if (xp && (((ip_xmit_attr_t *)xp)->ixa_flags & IXAF_DONTROUTE))
+		Lf->lts.opt |= SO_DONTROUTE;
+	    if (cs->conn_keepalive) {
+		Lf->lts.opt |= SO_KEEPALIVE;
+		Lf->lts.kai = (unsigned int)tc->tcp_ka_interval;
+	    }
+	    if (cs->conn_linger) {
+		Lf->lts.opt |= SO_LINGER;
+		Lf->lts.ltm = (unsigned int)cs->conn_lingertime;
+	    }
+	    if (cs->conn_oobinline)
+		Lf->lts.opt |= SO_OOBINLINE;
+	    Lf->lts.pqlen = (unsigned int)tc->tcp_conn_req_cnt_q0;
+	    Lf->lts.qlen = (unsigned int)tc->tcp_conn_req_cnt_q;
+	    Lf->lts.qlim = (unsigned int)tc->tcp_conn_req_max;
+	    Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims
+			   = (unsigned char)1;
+	    if (cs->conn_reuseaddr)
+		Lf->lts.opt |= SO_REUSEADDR;
+	    if (cs->conn_useloopback)
+		Lf->lts.opt |= SO_USELOOPBACK;
+# else	/* !defined(HAS_CONN_NEW) */
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    if (tc->tcp_broadcast)
+		Lf->lts.opt |= SO_BROADCAST;
+	    if (tc->tcp_debug)
+		Lf->lts.opt |= SO_DEBUG;
+	    if (tc->tcp_dgram_errind)
+		Lf->lts.opt |= SO_DGRAM_ERRIND;
+	    if (tc->tcp_dontroute)
+		Lf->lts.opt |= SO_DONTROUTE;
+	    if (tc->KEEPALIVE_INTERVAL) {
+		Lf->lts.opt |= SO_KEEPALIVE;
+		Lf->lts.kai = (unsigned int)tc->KEEPALIVE_INTERVAL;
+	    }
+	    if (tc->tcp_linger) {
+		Lf->lts.opt |= SO_LINGER;
+		Lf->lts.ltm = (unsigned int)tc->tcp_lingertime;
+	    }
+	    if (tc->tcp_oobinline)
+		Lf->lts.opt |= SO_OOBINLINE;
+	    Lf->lts.pqlen = (unsigned int)tc->tcp_conn_req_cnt_q0;
+	    Lf->lts.qlen = (unsigned int)tc->tcp_conn_req_cnt_q;
+	    Lf->lts.qlim = (unsigned int)tc->tcp_conn_req_max;
+	    Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims
+			   = (unsigned char)1;
+
+#  if	solaris>=80000
+#   if	defined(HAS_IPCLASSIFIER_H)
+	    if (tc->tcp_reuseaddr)
+#   else /* !defined(HAS_IPCLASSIFIER_H) */
+	    if (tb && tb->tcpb_reuseaddr)
+#   endif /* !defined(HAS_IPCLASSIFIER_H) */
+
+	    Lf->lts.opt |= SO_REUSEADDR;
+#  endif	/* solaris>=80000 */
+
+	    if (tc->tcp_useloopback)
+		Lf->lts.opt |= SO_USELOOPBACK;
+# endif /* defined(HAS_CONN_NEW) */
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASTCPOPT)
+# if	defined(ACK_TIMER)
+#  if	!defined(HAS_CONN_NEW)
+	    if (fa && (((tcph_t *)fa)->th_flags[0] & ACK_TIMER))
+		Lf->lts.topt |= TF_DELACK;
+#  endif /* !defined(HAS_CONN_NEW) */
+# endif	/* defined(ACK_TIMER) */
+
+# if	solaris<80000 || defined(HAS_IPCLASSIFIER_H)
+	    Lf->lts.mss = (unsigned long)tc->tcp_mss;
+# else	/* solaris>=80000 && !defined(HAS_IPCLASSIFIER_H) */
+	    if (tb)
+		Lf->lts.mss = (unsigned long)tb->tcpb_mss;
+# endif	/* solaris<80000 || defined(HAS_IPCLASSIFIER_H) */
+
+	    Lf->lts.msss = (unsigned char)1;
+	    if (tc->tcp_naglim == 1L)
+		Lf->lts.topt |= TF_NODELAY;
+	    if (tc->tcp_fin_sent)
+		Lf->lts.topt |= TF_SENTFIN;
+	}
+#endif	/* defined(HASTCPOPT) */
+
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/sun/dstore.c
new file mode 100644
index 0000000..345493a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/dstore.c
@@ -0,0 +1,234 @@
+/*
+ * dstore.c - Solaris global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.23 2010/01/18 19:03:54 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Global storage definitions
+ */
+
+#if	defined(HAS_AFS)
+
+# if	defined(HASAOPT)
+char *AFSApath = (char *)NULL;		/* alternate AFS name list path
+					 * (from -a) */
+# endif	/* defined(HASAOPT) */
+
+dev_t AFSdev;				/* AFS file system device number */
+int AFSdevStat = 0;			/* AFSdev status: 0 = unknown;
+					 *		  1 = known */
+int AFSfstype = -1;			/* AFS file system type index */
+KA_T AFSVfsp = (KA_T)NULL;		/* AFS vfs struct kernel address */
+#endif	/* defined(HAS_AFS) */
+
+struct clone *Clone = NULL;		/* clone list */
+major_t CloneMaj;			/* clone major device number */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *	       (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+	{ "afsops",	"afs_ops"		 },
+	{ "arFid",	"afs_rootFid"		 },
+	{ "avops",	"afs_vnodeops"		 },
+	{ "Avops",	"Afs_vnodeops"		 },
+	{ "avol",	"afs_volumes"		 },
+	{ "auvops",	"auto_vnodeops"		 },
+	{ "ctfsadir",	"ctfs_ops_adir"		 },
+	{ "ctfsbund",	"ctfs_ops_bundle"	 },
+	{ "ctfscdir",	"ctfs_ops_cdir"		 },
+	{ "ctfsctl",	"ctfs_ops_ctl",		 },
+	{ "ctfsevt",	"ctfs_ops_event",	 },
+	{ "ctfslate",	"ctfs_ops_latest",	 },
+	{ "ctfsroot",	"ctfs_ops_root",	 },
+	{ "ctfsstat",	"ctfs_ops_stat",	 },
+	{ "ctfssym",	"ctfs_ops_sym",		 },
+	{ "ctfstdir",	"ctfs_ops_tdir",	 },
+	{ "ctfstmpl",	"ctfs_ops_tmpl",	 },
+	{ "cvops",	"cachefs_vnodeops"	 },
+	{ "clmaj",	"clonemaj"		 },
+	{ "clmaj_alt",	"clone_major"		 },
+	{ "fdops",	"fdvnodeops"		 },
+	{ "fd_ops",	"fd_vnodeops"		 },
+	{ "fvops",	"fifo_vnodeops"		 },
+	{ "hvops",	"hsfs_vnodeops"		 },
+	{ "lvops",	"lo_vnodeops"		 },
+	{ "mntops",	"mntvnodeops"		 },
+	{ "mvops",	"mvfs_vnodeops"		 },
+
+#if	solaris<90000
+	{ X_NCACHE,	"ncache"		 },
+	{ X_NCSIZE,	"ncsize"		 },
+#else	/* solaris>=90000 */
+	{ X_NCACHE,	"nc_hash"		 },
+	{ X_NCSIZE,	"nc_hashsz"		 },
+	{ "hshav",	"nc_hashavelen"		 },
+#endif	/* solaris<90000 */
+
+#if	defined(NCACHE_NEGVN)
+	{ NCACHE_NEGVN,	NCACHE_NEGVN		 },
+#endif	/* defined(NCACHE_NEGVN) */
+
+	{ "nvops",	"nfs_vnodeops"		 },
+	{ "n3vops",	"nfs3_vnodeops"		 },
+	{ "n4vops",	"nfs4_vnodeops"		 },
+	{ "nmvops",	"nm_vnodeops"		 },
+        { "nproc",	"nproc"			 },
+	{ "pdvops",	"pcfs_dvnodeops"	 },
+	{ "pfvops",	"pcfs_fvnodeops"	 },
+	{ "portvops",	"port_vnodeops"		 },
+	{ "pract",	"practive"		 },
+	{ "prvops",	"prvnodeops"		 },
+	{ "sam1vops",	"samfs_vnodeops"	 },
+	{ "sam2vops",	"samfs_client_vnodeops"	 },
+	{ "sam3vops",	"samfs_vnodeopsp"	 },
+	{ "sam4vops",	"samfs_client_vnodeopsp" },
+	{ "sdevops",	"sdev_vnodeops"		 },
+	{ "sgvops",	"segvn_ops"		 },
+	{ "shvops",	"sharefs_ops_data"	 },
+	{ "sckvops",	"sock_vnodeops"		 },
+	{ "socketvops",	"socket_vnodeops"	 },
+	{ "spvops",	"spec_vnodeops"		 },
+	{ "sncavops",	"socknca_vnodeops"	 },
+	{ "stpivops",	"socktpi_vnodeops"	 },
+	{ "tvops",	"tmp_vnodeops"		 },
+	{ "uvops",	"ufs_vnodeops"		 },
+	{ "vvfops",	"fdd_vnops"		 },
+	{ "vvfcops",	"fdd_chain_vnops"	 },
+	{ "vvfclops",	"vx_fcl_vnodeops_p"	 },
+	{ "vvops",	"vx_vnodeops"		 },
+	{ "vvops_p",	"vx_vnodeops_p"		 },
+
+#if	solaris>=20500
+	{ "devops",	"dv_vnodeops"		 },
+	{ "doorops",	"door_vnodeops"		 },
+	{ "kbase",	"_kernelbase"		 },
+#endif	/* solaris>=20500 */
+
+#if	solaris>=20501
+	{ "kasp",	"kas"			 },
+#endif	/* solaris>=20501 */
+
+#if	solaris>=110000
+	{ "devipnetops","devipnet_vnodeops"	 },
+	{ "devnetops",	"devnet_vnodeops"	 },
+	{ "devptsops",	"devpts_vnodeops"	 },
+	{ "devvtops",	"devvt_vnodeops"	 },
+#endif	/* solaris>=110000 */
+
+	{ "zfsdops",	"zfs_dvnodeops"		 },
+	{ "zfseops",	"zfs_evnodeops"		 },
+	{ "zfsfops",	"zfs_fvnodeops"		 },
+	{ "zfsshops",	"zfs_sharevnodeops"	 },
+	{ "zfssymops",	"zfs_symvnodeops"	 },
+	{ "zfsxdops",	"zfs_xdvnodeops"	 },
+	{ "",		""			 },
+	{ NULL,		NULL			 }
+};
+
+char **Fsinfo = NULL;			/* file system information */
+int Fsinfomax = 0;			/* maximum file system type */
+int HasALLKMEM = 0;			/* has ALLKMEM device */
+int HaveCloneMaj = 0;			/* clone major device number has
+					 * been identified and is in
+					 * CloneMaj */
+kvm_t *Kd = NULL;			/* kvm descriptor */
+struct l_vfs *Lvfs = NULL;		/* local vfs structure table */
+struct netclone *Netclone = NULL;	/* net clone devices from
+					 * /devices/pseudo */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+	{ (long)FAPPEND,	FF_APPEND	},
+	{ (long)FSYNC,		FF_SYNC		},
+
+# if	defined(FREVOKED)
+	{ (long)FREVOKED,	FF_REVOKED	},
+# endif	/* defined(FREVOKED) */
+
+	{ (long)FDSYNC,		FF_DSYNC	},
+	{ (long)FRSYNC,		FF_RSYNC	},
+
+# if	defined(FOFFMAX)
+	{ (long)FOFFMAX,	FF_LARGEFILE	},
+# endif	/* defined(FFOFFMAX) */
+
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNOCTTY,	FF_NOCTTY	},
+	{ (long)FASYNC,		FF_ASYNC	},
+	{ (long)FNODSYNC,	FF_NODSYNC	},
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+# if	defined(UF_EXCLOSE)
+	{ (long)UF_EXCLOSE,	POF_CLOEXEC	},
+# endif	/* defined(UF_EXCLOSE) */
+
+# if	defined(FD_CLOEXEC)
+	{ (long)FD_CLOEXEC,	POF_CLOEXEC	},
+# endif	/* defined(FD_CLOEXEC) */
+
+# if	defined(UF_FDLOCK)
+	{ (long)UF_FDLOCK,	POF_FDLOCK	},
+# endif	/* defined(UF_FDLOCK) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
+
+struct pseudo *Pseudo = NULL;		/* non-clone devices from
+					 * /devices/pseudo */
+int Unof;				/* u_nofiles value */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/machine.h b/lsof_4.85/lsof_4.85_src/dialects/sun/machine.h
new file mode 100644
index 0000000..1264a09
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/machine.h
@@ -0,0 +1,749 @@
+/*
+ * machine.h - Solaris definitions 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: machine.h,v 1.47 2011/09/07 19:16:00 abe Exp $
+ */
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H  1
+
+# if	defined(HAS_LGRP_ROOT_CONFLICT)
+/*
+ * <sys/lgrp.h> must be #include'd early on some older Solaris systems at
+ * version 9 and Solaris 10 before _KMEMUSER or _KERNEL are defined to avoid
+ * a conflict with the use of lgrp_root as an external symbol in <sys/lgrp.h>
+ * and a macro in <sys/lgrp_user.h>.
+ */
+
+#include <sys/lgrp.h>
+# endif	/* defined(HAS_LGRP_ROOT_CONFLICT) */
+
+
+# if	solaris>=100000
+/*
+ * Define a dummy aio_req structure for Solaris >= 10, because #include'ing
+ * <sys/aio_req.h> with _KERNEL defined creates too many problems.
+ */
+
+typedef struct aio_req { int dummy; } aio_req_t;
+
+/*
+ * Include <sys/utsname.h> so it won't be corrupted for 32 bit compilations
+ * when _KERNEL is defined for some include files in dlsof.h.
+ *
+ * Daniel Trinkle identified this requirement.
+ */
+
+#include <sys/utsname.h>
+# endif	/* solaris>=100000 */
+
+
+# if	solaris>=20600
+/*
+ * <sys/poll.h> must be #include'd for Solaris >= 2.6 while _KMEMUSER is
+ * defined.  Since <netdb.h> also #include's <sys/poll.h> and <netdb.h>
+ * is #include'd from lsof.h, we must perform some early #include magic
+ * here to set things up properly.
+ */
+
+#define	_KMEMUSER	1
+#define	__BIT_TYPES_DEFINED__	1	/* work around to keep the BIND
+					 * <sys/bitypes.h> from colliding with
+					 * the Solaris <sys/int_types.h> */
+
+#  if	defined(HAS_PAD_MUTEX)
+/*
+ * Some versions of Solaris 11 need to have the pad_mutex_t typedef defined.
+ * However, it is only defined by <sys/mutex.h> when _KERNEL is defined, and
+ * doing that causes other difficulties.
+ *
+ * So <sys/mutex.h> is included here, followed by a copy of its pad_mutex_t
+ * typedef, all outside the _KERNEL definition.
+ *
+ * This brute force work-around was supplied by Carson Gaspar.
+ */
+
+#include	<sys/mutex.h>
+typedef struct pad_mutex {
+	kmutex_t	pad_mutex;
+#   if	defined(_LP64)
+	char		pad_pad[64 - sizeof (kmutex_t)];
+#   endif	/* defined(_LP64) */
+} pad_mutex_t;
+#  endif	/* defined(HAS_PAD_MUTEX) */
+
+#include <sys/poll.h>
+
+# if	solaris>=80000
+#include <sys/wait.h>
+#include <sys/types32.h>
+#define	_KERNEL	1
+#include <netinet/in.h>
+#undef	_KERNEL
+#define	ipa_32	s6_ipaddr.ipa_32
+# endif	/* solaris>=80000 */
+
+# endif	/* solaris>=20600 */
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+# if	solaris>=20501
+#define	CAN_USE_CLNT_CREATE	1
+# endif	/* solaris>=20501 */
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+# if	solaris<100000
+#define	DEVDEV_PATH	"/dev"
+# else	/* solaris>=100000 */
+#define	DEVDEV_PATH	"/devices"
+# endif	/* solaris<100000 */
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+# if	solaris<20500
+#define	GET_MAX_FD	get_max_fd
+# endif	/* solaris<20500 */
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+#define	HASAOPT		1
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASEOPT is defined for dialects that support the +|-e option.
+ */
+
+/* #define	HASEOPT	1 */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+#define	HASFIFONODE	1
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ * If any file structure value is unavailable, its use may be suppressed
+ * with any of the following definitions:
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+#define	HASHSNODE	1
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ */
+
+/* #define	HASINODE	1	*/
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those dialects that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines them.
+ *
+ * If any additional elements need to be preset in the alloc_lfile() function
+ * of proc.c, the SETLFILEADD macro may be defined to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+# if	solaris>=10000 && defined(HAS_V_PATH)
+#define	HASLFILEADD	KA_T V_path;
+#define	CLRLFILEADD(lf)	(lf)->V_path = (KA_T)NULL;
+#define SETLFILEADD Lf->V_path = (KA_T)NULL;
+# endif	/* solaris>=10000 && defined(HAS_V_PATH) */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+# if	solaris>=10000 && defined(HAS_V_PATH)
+#define	HASMNTSTAT	1
+# endif	/* solaris>=10000 && defined(HAS_V_PATH) */
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+# if	solaris>=10000 && defined(HAS_V_PATH)
+/* #define	HASNCACHE	1	*/
+#else	/* solaris<10 || !defined(HAS_V_PATH) */
+#define	HASNCACHE	1
+# endif	/* solaris>=10000 && defined(HAS_V_PATH) */
+
+#define	NCACHELDPFX	open_kvm();	/* do before calling ncache_load() */
+
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those dialects that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+# if	solaris<100000
+#define	HASPRINTDEV	print_dev
+# endif	/* solaris<100000 */
+
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+# if	solaris>=10000 && defined(HAS_V_PATH)
+#define	HASPRIVNMCACHE	print_v_path
+# else	/* solaris<10 || !defined(HAS_V_PATH) */
+#  if	defined(HASVXFSRNL)
+#define	HASPRIVNMCACHE	print_vxfs_rnl_path
+#  else	/* !defined(HASVXFSRNL) */
+/* #define	HASPRIVNMCACHE	<function name>	*/
+#  endif	/* defined(HASVXFSRNL) */
+# endif	/* solaris>=10000 && defined(HAS_V_PATH) */
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+#define	HASPROCFS	"proc"
+#define	HASFSTYPE	1
+#define	HASPINODEN	1
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+#define	HASRNODE	1
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1	*/
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ *
+ * If a special definition is required (e.g., for Solaris) before #include'ing
+ * <ctype.h>, do that here.
+ */
+
+#define	HASSETLOCALE	1
+#define	HASWIDECHAR	1
+#define	WIDECHARINCL	<wchar.h>
+#define __XPG4_CHAR_CLASS__
+#include	<ctype.h>
+#undef __XPG4_CHAR_CLASS__
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+#define	HASSNODE	1
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+# if	solaris>=20600
+#define	HASSOOPT	1	/* has socket option information */
+/* #define	HASSOSTATE	1	has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+# endif	/* solaris>=20600 */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those dialects that support streams.
+ */
+
+#define	HASSTREAMS	1
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+# if	solaris==20300 || solaris>=20500
+#define	HASTCPTPIQ	1
+# endif	/* solaris==20300 || solaris>=20500 */
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+# if	solaris==20300 || solaris>=20500
+#define	HASTCPTPIW	1
+# endif	/* solaris==20300 || solaris>=20500 */
+
+
+/*
+ * HASTCPUDPSTATE is defined for dialects that have TCP and UDP state
+ * support -- i.e., for the "-stcp|udp:state" option and its associated
+ * speed improvements.
+ */
+
+#define	HASTCPUDPSTATE	1
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+#define	HASTMPNODE	1
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file system
+ * node, the vnode.  BSD derivatives usually do; System V derivatives prior to
+ * R4 usually don't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+# if	solaris>=10000 && defined(HAS_V_PATH)
+#define	HASXOPT		"report deleted paths"
+#define	HASXOPT_VALUE	0
+# endif	/* solaris>=10000 && defined(HAS_V_PATH) */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+# if	solaris>=20501
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"		/* INODETYPE printf specification
+					 * modifier */
+# endif	/* solaris>=20501 */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	long
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+#define	USE_LIB_COMPLETEVFS			1	/* cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+/* #define	USE_LIB_IS_FILE_NAMED		1	   isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+/* #define	USE_LIB_PRINTDEVNAME		1	   pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+/* #define	USE_LIB_PRINT_TCPTPI		1	   ptti.c */
+/* #define	USE_LIB_READDEV			1	   rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+
+# if	solaris<90000
+#define	USE_LIB_RNCH				1	/* rnch.c */
+# endif	/* solaris<90000 */
+
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+
+# if	solaris<20600
+#define	USE_LIB_SNPF				1	/* snpf.c */
+# else	/* solaris>=20600 */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+# endif	/* solaris<20600 */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)		memset((void *)a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/sun/solaris_kaddr_filters b/lsof_4.85/lsof_4.85_src/dialects/sun/solaris_kaddr_filters
new file mode 100644
index 0000000..7fcd692
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/sun/solaris_kaddr_filters
@@ -0,0 +1,239 @@
+	Solaris Kernel Address Filtering in lsof 4.50 and Above
+
+Current Filter
+==============
+
+Lsof revisions 4.49 and below, have exactly one filter:  the kernel
+virtual address is checked against the kernel's virtual address
+base -- e.g., what's found in the kernel variable kernelbase.  For
+sun4m that's 0xf0000000, for sun4u, 0x10000000.
+
+This filter keeps lsof from handing some bad addresses to the
+kernel, but not all bad addresses.  For example, the virtual address
+0x657a682e passes this test on a sun4u machine, but on at least
+one sun4u that virtual address translates to the physical address
+0x1cf08c30000, which is the address of a register of a qfe interface
+on the machine.  There is some evidence that a kvm_kread() call for
+the 0x657a682e address may crash that sun4u.
+
+Lsof 4.71 and above use no filter if they detect that /dev/allkmem
+exists.  That is done because, when /dev/allkmem exists, /dev/kmem has
+address filtering in its device driver.
+
+
+======================
+!!!IMPORTANT UPDATE!!!
+======================
+
+In late May 2002 I learned that Sun had reports of other kernel
+crashes, caused by adb, lsof, and mdb, related to incorrect addresses
+being supplied to /dev/kmem.  (This report was written originally
+on July 18, 2000.)
+
+The problem is described in and fixed or patched:
+
+    Solaris 7: SPARC kernel patch 106541-20
+	       Intel kernel patch 106542-20
+
+    Solaris 8: SPARC kernel patch 108528-14
+	       Intel kernel patch 108529-14
+
+    Solaris 9: bug 4344513
+
+So, if you want to be comfortable using lsof (or adb or mdb) with
+Solaris, install the appropriate Solaris 7 or 8 patches, or upgrade
+to Solaris 9.
+
+Note that these patches provide the /dev/allkmem device, whose presence
+causes lsof to rely on the address filtering of the /dev/kmem device.
+
+
+New Filters
+===========
+
+Lsof 4.50 adds additional filters to the kernelbase check.  The
+filters differ, based on the Solaris version:
+
+	Solaris
+	Version		New Filters
+	=======		===========
+
+	2.5 and below	none
+	2.5.1           kvm_physaddr() (-lkvm), caching, llseek(),
+			    and /dev/mem
+	2.6             kvm_physaddr() (-lkvm), caching, llseek(),
+			    and /dev/mem
+	7, 8, and 9     kvm_physaddr() (ioctl()), caching, and
+			    kvm_pread()
+
+			See !!!IMPORTANT NOTICE!! above for
+			information on a Solaris 9 bug report about,
+			or Solaris 7 and 8 kernel patches to the
+			kernel /dev/kmem driver.  Those fixes
+			obviate the need for the kernel address
+			filtering described in this report.
+
+			!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+			!!! I STRONGLY RECOMMEND YOU INSTALL  !!!
+			!!! THE PATCHES OR UPGRADE TO SOLARIS !!!
+			!!! 9.                                !!!
+			!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+kvm_physaddr() (-lkvm)
+======================
+
+Solaris has an undocumented function called kvm_physaddr() that
+will convert a kernel virtual address to a kernel physical address.
+(Until Solaris 7 this function doesn't even have a prototype
+definition in <kvm.h>.)
+
+I have been assured repeatedly by Casper Dik of Sun that this
+function, when given a kernel virtual address, will produce addresses
+of physical memory only; it will not produce physical addresses of
+interface registers, such as the one for the qfe interface.
+
+In Solaris 2.5.1 this function runs in application space from within
+the KVM library.  Since it needs to know the components of the
+kernel's address space map, it must read those from kernel memory
+each time it is called.  That can be time consuming.
+
+I'm not sure about kvm_physaddr() for Solaris 2.6.  It may still
+run in application space from within the KVM library, but if so,
+it is much faster than its 2.5.1 ancestor.
+
+kvm_physaddr() (ioctl())
+========================
+
+I'm sure that at Solaris 7 and above kvm_physaddr() has moved inside
+the kernel and is called with an ioctl().  That makes it much faster
+than its ancestors.
+
+kvm_physaddr() Use
+==================
+
+Lsof 4.50 for Solaris will use one or the other version of
+kvm_physaddr() for Solaris 2.5.1, 2.6, 7, and 8.
+
+Using it for Solaris 2.5.1 causes lsof to take four times as much
+real time as it formerly did with only the kernelbase filtering.
+
+Caching
+=======
+
+To recover the performance lost by kvm_physaddr() on Solaris 2.5.1,
+I added virtual-to-physical address caching to lsof's kernel read
+function, kread().  This improves Solaris 2.6, 7, and 8 performance,
+too, but by a smaller amount.
+
+It turns out that a typical lsof run may require reading from 16,000
+or more different kernel virtual addresses.  However, it also turns
+out that those addresses are contained within about 600 distinct
+kernel memory pages.
+
+To exploit this condition lsof caches each virtual page address
+that has a corresponding legitimate physical page address for use
+in checking later addresses.  This caching regains all but a bit
+of the performance loss on Solaris 2.5.1.
+
+Caching can provide some performance gain on Solaris 2.6, 7, and
+8, but it's not nearly as large as the gain for 2.5.1, and may
+depend on the machine architecture type.
+
+/dev/mem
+========
+
+Once lsof has kernel physical addresses, on Solaris 2.5.1 and 2.6
+it seeks to those addresses with llseek() and reads from them via
+the /dev/mem device.  This contrasts with lsof's pre-4.50 behavior
+where it fed kernel virtual addresses to kvm_kread(), letting it
+and the kernel do the virtual to physical translations -- and
+letting that combined process crash that one unlucky sun4u via its
+qfe interface.
+
+Using /dev/mem requires no more permission for lsof, but it does
+require an additional open file descriptor and use of the 64 bit
+llseek() function.
+
+The additional file descriptor is an unfortunate consequence of
+the KVM library's opacity.  The library usually has /dev/kmem open
+to a file descriptor, but lsof can't easily get at that descriptor,
+so it opens one of its own.
+
+On Solaris 2.6 for one test system, a 4 CPU E4000 sun4u, doing
+physical kernel address reads from /dev/mem turned out to be faster
+than using kvm_kread().  It was marginally faster on a sun4d, and
+marginally slower on two sun4m's.
+
+kvm_pread()
+===========
+
+Even though it is still undocumented, the kvm_physaddr() function
+is represented by a prototype in the Solaris 7 and 8 <kvm.h>.
+Additionally useful is another undocumented function, kvm_pread()
+(for physical read), that also is represented by a <kvm.h> prototype
+in Solaris 7 and 8.
+
+Lsof 4.50 for Solaris 7 and 8 uses kvm_pread() instead of opening
+a descriptor to /dev/mem, llseek()-ing to physical addresses in
+it, and using read(2) to obtain physical address contents.  The
+bonus of kvm_pread() is two-fold: 1) it does positioning as well
+as reading, so there's one less function call; and 2) its combined
+operation appears to be faster than llseek() plus read() -- or even
+kvm_kread().
+
+Combined with the virtual-to-physical address caching, the performance
+boost of kvm_pread() makes lsof faster on Solaris 7 and 8 than
+previous revisions, using only kernelbase filtering and kvm_kread().
+
+Remaining Risks
+===============
+
+There may remain some extremely small likelihood that lsof will
+transmit a bad physical address to the kernel.  Here are some
+possible failure scenarios:
+
+	*  The physical address filters haven't been tested on
+	   the machine whose qfe interface was affected.  That's
+	   because the machine's memory configuration was changed
+	   before the test could be run.
+
+	*  The kvm_physaddr() function, especially in Solaris
+	   2.5.1, might fail to map an address correctly.  Only
+	   Sun can correct this problem.
+
+	*  Because lsof must read the kernel address map from
+	   kernel virtual memory to pass it to the Solaris 2.5.1
+	   and 2.6 kvm_physaddr() functions, lsof must use kvm_kread()
+	   to read the map.
+
+	   There's also the chance that lsof could pass a stale
+	   kernel address map to kvm_physaddr(), because re-reading
+	   it for each call to kvm_physaddr() would lead to
+	   unacceptable performance.  When in repeat mode lsof
+	   re-reads the map between each cycle.
+
+	   On Solaris 7 and 8, since kvm_physaddr() is inside the
+	   kernel, there's no chance of its having a stale address
+	   map.
+
+	*  There's an extremely small chance that a cached
+	   virtual+physical page address could become invalid.
+	   This is so small I think it can be ignored, since the
+	   kernel memory map rarely changes.
+
+	   When in repeat mode, lsof clears its virtual+physical
+	   address map between cycles.
+
+	*  Lsof still uses Sun's kvm_getproc() (from -lkvm), and
+	   I have no idea what kernel address filtering it does,
+	   if any.
+
+I wish to acknowledge: Casper Dik of Sun, who provided information
+about kvm_physaddr() and helped test the lsof changes; Jim Mewes
+of Phone.com, who reported the initial problem and helped test the
+lsof changes; and several readers of the lsof-l listserv, who
+volunteered to run test programs.
+
+
+Vic Abell
+March 16, 2004
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/Makefile b/lsof_4.85/lsof_4.85_src/dialects/uw/Makefile
new file mode 100644
index 0000000..867362a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/Makefile
@@ -0,0 +1,159 @@
+
+# SCO OSR6 and UW Makefile
+#
+# $Id: Makefile,v 1.14 2008/04/15 13:30:58 abe Exp $
+
+PROG=	lsof
+
+BIN=	${DESTDIR}
+
+DOC=	${DESTDIR}
+
+I=/usr/include
+S=/usr/include/sys
+L=/usr/include/local
+P=
+
+CDEF=
+CDEFS=  ${CDEF} ${CFGF}
+INCL=	${DINC}
+CFLAGS=	${CDEFS} ${INCL} ${DEBUG}
+
+HDR=    lsof.h lsof_fields.h dlsof.h machine.h proto.h dproto.h
+
+SRC=    dfile.c dmnt.c dnode.c dnode1.c dnode2.c dnode3.c dproc.c \
+	dsock.c dstore.c \
+	arg.c main.c misc.c node.c print.c proc.c store.c usage.c util.c
+
+OBJ=	dfile.o dmnt.o dnode.o dnode1.o dnode2.o dnode3.o dproc.o \
+	dsock.o dstore.o \
+	arg.o main.o misc.o node.o print.o proc.o store.o usage.o util.o
+
+MAN=	lsof.8
+
+OTHER=	
+
+SHELL=	/bin/sh
+
+SOURCE=	Makefile ${OTHER} ${MAN} ${HDR} ${SRC}
+
+all: ${PROG}
+
+${PROG}: ${LIB} ${P} ${OBJ}
+	${CC} -o $@ ${CFLAGS} ${OBJ} ${CFGL}
+
+clean: FRC
+	rm -f Makefile.bak ${PROG} a.out core errs lint.out tags *.o version.h
+	rm -f machine.h.old new_machine.h
+	(cd lib; ${MAKE} -f Makefile.skel clean)
+
+install: all FRC
+	@echo ''
+	@echo 'Please write your own install rule.  Lsof should be installed'
+	@echo 'setgid to the group that can can read /dev/kmem.  Normally'
+	@echo 'that is the system group.  Your AIX install rule actions might'
+	@echo 'look something like this:'
+	@echo ''
+	@echo '    install -m <modes> -o <owner> -g <group> -f $${BIN} $${PROG}'
+	@echo '    install -m 444 -f $${DOC} $${MAN}'
+	@echo ''
+	@echo 'You will have to fill in the <modes>, <owner> and <group>'
+	@echo 'values and complete the skeletons for the BIN and DOC strings'
+	@echo 'given at the beginning of this Makefile, e.g.,'
+	@echo ''
+	@echo '    BIN= $${DESTDIR}/usr/local/etc'
+	@echo '    DOC= $${DESTDIR}/usr/man/manl'
+	@echo ''
+
+${LIB}: FRC
+	(cd lib; ${MAKE} DEBUG="${DEBUG}" CFGF="${CFGF}")
+
+version.h:	FRC
+	@echo Constructing version.h
+	@rm -f version.h
+	@echo '#define	LSOF_BLDCMT	"${LSOF_BLDCMT}"' > version.h;
+	@echo '#define	LSOF_CC		"${CC}"' >> version.h
+	@echo '#define	LSOF_CCV	"${CCV}"' >> version.h
+	@echo '#define	LSOF_CCDATE	"'`date`'"' >> version.h
+	@echo '#define	LSOF_CCFLAGS	"'`echo ${CFLAGS} | sed 's/\\\\(/\\(/g' | sed 's/\\\\)/\\)/g' | sed 's/"/\\\\"/g'`'"' >> version.h
+	@echo '#define	LSOF_CINFO	"${CINFO}"' >> version.h
+	@if [ "X${LSOF_HOST}" = "X" ]; then \
+	  echo '#define	LSOF_HOST	"'`uname -n`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_HOST}" = "none" ]; then \
+	    echo '#define	LSOF_HOST	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_HOST	"${LSOF_HOST}"' >> version.h; \
+	  fi \
+	fi
+	@echo '#define	LSOF_LDFLAGS	"${CFGL}"' >> version.h
+	@if [ "X${LSOF_LOGNAME}" = "X" ]; then \
+	  echo '#define	LSOF_LOGNAME	"${LOGNAME}"' >> version.h; \
+	else \
+	  if [ "${LSOF_LOGNAME}" = "none" ]; then \
+	    echo '#define	LSOF_LOGNAME	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_LOGNAME	"${LSOF_LOGNAME}"' >> version.h; \
+	  fi; \
+	fi
+	@if [ "X${LSOF_SYSINFO}" = "X" ]; then \
+	    echo '#define	LSOF_SYSINFO	"'`uname -a`'"' >> version.h; \
+	else \
+	  if [ "${LSOF_SYSINFO}" = "none" ]; then \
+	    echo '#define	LSOF_SYSINFO	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_SYSINFO	"${LSOF_SYSINFO}"' >> version.h; \
+	  fi \
+	fi
+	@if [ "X${LSOF_USER}" = "X" ]; then \
+	  echo '#define	LSOF_USER	"${USER}"' >> version.h; \
+	else \
+	  if [ "${LSOF_USER}" = "none" ]; then \
+	    echo '#define	LSOF_USER	""' >> version.h; \
+	  else \
+	    echo '#define	LSOF_USER	"${LSOF_USER}"' >> version.h; \
+	  fi \
+	fi
+	@sed '/VN/s/.ds VN \(.*\)/#define	LSOF_VERSION	"\1"/' < version >> version.h
+
+FRC:
+
+# DO NOT DELETE THIS LINE - make depend DEPENDS ON IT
+
+dfile.o:	${HDR} dfile.c
+
+dmnt.o:		${HDR} dmnt.c
+
+dnode.o:	${HDR} dnode.c
+
+dnode1.o:	${HDR} dnode1.c
+
+dnode2.o:	${HDR} dnode2.c
+
+dnode3.o:	${HDR} dnode3.c
+
+dproc.o:	${HDR} dproc.c
+
+dsock.o:	${HDR} dsock.c
+
+dstore.o:	${HDR} dstore.c
+
+arg.o:		${HDR} arg.c
+
+main.o:		${HDR} main.c
+
+misc.o:		${HDR} misc.c
+
+node.o:		${HDR} node.c
+
+print.o:	${HDR} print.c
+
+proc.o:		${HDR} proc.c
+
+store.o:	${HDR} store.c
+
+usage.o:	${HDR} version.h usage.c
+
+util.o:		${HDR} util.c
+
+# *** Do not add anything here - It will go away. ***
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/Mksrc b/lsof_4.85/lsof_4.85_src/dialects/uw/Mksrc
new file mode 100755
index 0000000..76a96e4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/Mksrc
@@ -0,0 +1,23 @@
+#!/bin/sh
+#
+# Mksrc - make SCO UnixWare source files
+#
+# WARNING: This script assumes it is running from the main directory
+#	   of the lsof, version 4 distribution.
+#
+# One environment variable applies:
+#
+# LSOF_MKC	is the method for creating the source files.
+#		It defaults to "ln -s".  A common alternative is "cp".
+#
+# $Id: Mksrc,v 1.5 99/06/22 09:52:02 abe Exp $
+
+D=dialects/uw
+L="dfile.c dlsof.h dmnt.c dnode.c dnode1.c dnode2.c dnode3.c dproc.c dproto.h dsock.c dstore.c machine.h"
+
+for i in $L
+do
+  rm -f $i
+  $LSOF_MKC $D/$i $i
+  echo "$LSOF_MKC $D/$i $i"
+done
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dfile.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dfile.c
new file mode 100644
index 0000000..4ea24da
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dfile.c
@@ -0,0 +1,216 @@
+/*
+ * dfile.c - SCO UnixWare file processing functions for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dfile.c,v 1.11 2000/08/01 15:26:38 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * get_max_fd() - get maximum file descriptor plus one
+ */
+
+int
+get_max_fd()
+{
+	struct rlimit r;
+
+	if (getrlimit(RLIMIT_NOFILE, &r))
+	    return(-1);
+	return(r.rlim_cur);
+}
+
+
+/*
+ * process_file() - process file
+ */
+
+void
+process_file(fp)
+	KA_T fp;			/* kernel file structure address */
+{
+	struct file f;
+	int flag;
+
+#if     defined(FILEPTR)
+	FILEPTR = &f;
+#endif  /* defined(FILEPTR) */
+
+	if (kread(fp, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read file struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	Lf->off = (SZOFFTYPE)f.f_offset;
+
+	if (f.f_count
+
+#if	defined(HAS_F_OPEN)
+	|| f.f_open
+#endif	/* defined(HAS_F_OPEN) */
+
+    	) {
+
+	/*
+	 * Construct access code.
+	 */
+	    if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+		Lf->access = 'r';
+	    else if (flag == FWRITE)
+		Lf->access = 'w';
+	    else if (flag == (FREAD | FWRITE))
+		Lf->access = 'u';
+
+#if	defined(HASFSTRUCT)
+	/*
+	 * Save file structure values.
+	 */
+	    if (Fsv & FSV_CT) {
+		Lf->fct = (long)f.f_count;
+		Lf->fsv |= FSV_CT;
+	    }
+	    if (Fsv & FSV_FA) {
+		Lf->fsa = fp;
+		Lf->fsv |= FSV_FA;
+	    }
+	    if (Fsv & FSV_FG) {
+		Lf->ffg = (long)f.f_flag;
+		Lf->fsv |= FSV_FG;
+	    }
+	    if (Fsv & FSV_NI) {
+		Lf->fna = (KA_T)f.f_vnode;
+		Lf->fsv |= FSV_NI;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Process structure.
+	 */
+	    process_node((KA_T)f.f_vnode);
+		return;
+	}
+	enter_nm("no more information");
+}
+
+
+/*
+ * Case independent character mappings -- for strcasecmp() and strncasecmp()
+ */
+
+static short CIMap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\301', '\302', '\303', '\304', '\305', '\306', '\307',
+	'\310', '\311', '\312', '\313', '\314', '\315', '\316', '\317',
+	'\320', '\321', '\322', '\323', '\324', '\325', '\326', '\327',
+	'\330', '\331', '\332', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+
+/*
+ * strcasecmp() - case insentitive character compare (from BSD)
+ */
+
+int
+strcasecmp(s1, s2)
+	char *s1, *s2;
+{
+	short *mp = CIMap;
+	unsigned char *cp1 = (unsigned char *)s1;
+	unsigned char *cp2 = (unsigned char *)s2;
+
+	while (mp[*cp1] == mp[*cp2]) {
+	    if (*cp1++ == '\0')
+		return(0);
+	    cp2++;
+	}
+	return ((int)(mp[*cp1] - mp[*cp2]));
+}
+
+
+/*
+ * strncasecmp() - case insensitive character compare, limited by length
+ *		   (from BSD)
+ */
+
+int
+strncasecmp(s1, s2, n)
+	char *s1, *s2;
+	int n;
+{
+	short *mp = CIMap;
+	unsigned char *cp1, *cp2;
+
+	if (n) {
+	    cp1 = (unsigned char *)s1;
+	    cp2 = (unsigned char *)s2;
+	    do {
+		if (mp[*cp1] != mp[*cp2])
+		    return((int)(mp[*cp1] - mp[*cp2]));
+		if (*cp1++ == '\0')
+		    break;
+		cp2++;
+	    } while (--n != 0);
+	}
+	return(0);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dlsof.h b/lsof_4.85/lsof_4.85_src/dialects/uw/dlsof.h
new file mode 100644
index 0000000..72cfff2
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dlsof.h
@@ -0,0 +1,358 @@
+/*
+ * dlsof.h - SCO UnixWare header file for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+
+#if	!defined(UW_LSOF_H)
+#define	UW_LSOF_H	1
+
+#include <dirent.h>
+#include <fcntl.h>
+#include <malloc.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <sys/conf.h>
+#include <sys/exec.h>
+#include <sys/mkdev.h>
+#include <sys/mnttab.h>
+#include <sys/mntent.h>
+#include <netdb.h>
+#include <string.h>
+#include <nlist.h>
+#include <sys/file.h>
+#include <sys/flock.h>
+#include <sys/immu.h>
+#include <sys/fstyp.h>
+#include <sys/fsid.h>
+
+# if	UNIXWAREV>=70103
+#include <sys/poll.h>
+#include <sys/fs/prdata.h>
+#define	PR_PIDDIR	PR_PIDCAT_DIR
+#define	PR_AS		PR_PIDCAT_AS
+#define	PR_CTL		PR_PIDCAT_CTL
+#define	PR_STATUS	PR_PIDCAT_STATUS
+#define	PR_MAP		PR_PIDCAT_MAP
+#define	PR_CRED		PR_PIDCAT_CRED
+#define	PR_SIGACT	PR_PIDCAT_SIGACT
+#define	PR_OBJECTDIR	PR_PIDCAT_OBJECTDIR
+#define	PR_LWPDIR	PR_PIDCAT_LWP_DIR
+#define	PR_LWPIDDIR	PR_PIDCAT_LWP_IDDIR
+#define	PR_LWPCTL	PR_PIDCAT_LWP_CTL
+#define	PR_LWPSTATUS	PR_PIDCAT_LWP_STATUS
+#define	PR_LWPSINFO	PR_PIDCAT_LWP_SINFO
+# endif	/* UNIXWAREV>=70103 */
+
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/fs/memfs_mnode.h>
+#include <sys/fs/namenode.h>
+
+# if	UNIXWAREV>=70000
+#undef	IREAD
+#undef	IWRITE
+#undef	IEXEC
+# endif	/* UNIXWAREV>=70000 */
+
+#include <sys/fs/snode.h>
+
+# if	UNIXWAREV<20102
+#include <fs/proc/prdata.h>
+# else	/* UNIXWAREV>=20102 */
+#  if	UNIXWAREV<70103
+#include <fs/procfs/prdata.h>
+#  endif	/* UNIXWAREV<70103 */
+# endif	/* UNIXWAREV<20102 */
+
+#include <sys/mount.h>
+#include <sys/stream.h>
+#include <sys/strsubr.h>
+#include <sys/sysmacros.h>
+#undef	major
+#undef	minor
+#define	major(d)	(((d) >> L_BITSMINOR) & L_MAXMAJ)
+#define	minor(d)	((d) & L_MAXMIN)
+#include <sys/time.h>
+#include <sys/fs/s5dir.h>
+#include <signal.h>
+#include <sys/proc.h>
+#include <sys/user.h>
+#include <sys/var.h>
+#include <sys/procfs.h>
+#include <sys/priocntl.h>
+#include <sys/tihdr.h>
+#include <sys/tiuser.h>
+#include <sys/un.h>
+#include <rpc/types.h>
+#include <nfs/nfs.h>
+
+#define	_KERNEL
+#include <sys/fs/fifonode.h>
+
+# if	UNIXWAREV>=70000
+#include <rpc/xdr.h>
+# endif	/* UNIXWAREV>=70000 */
+
+#include <nfs/rnode.h>
+#undef	_KERNEL
+
+#include <netinet/in.h>
+
+# if	defined(HASIPv6)
+#include <netinet/in6.h>
+#  if	!defined(IN6_ARE_ADDR_EQUAL)
+#define	IN6_ARE_ADDR_EQUAL	IN6_ADDR_EQUAL	/* required by RFC2292 */
+#  endif	/* !defined(IN6_ARE_ADDR_EQUAL) */
+# endif	/* defined(HASIPv6) */
+
+#include <rpc/rpc.h>
+#include <rpc/clnt_soc.h>
+#include <rpc/pmap_prot.h>
+#include <rpc/rpcent.h>
+#include <sys/socket.h>
+#include <net/route.h>
+
+# if	defined(HAS_INKERNEL)
+#define	INKERNEL
+# endif	/* defined(HAS_INKERNEL) */
+
+#include <netinet/in_pcb.h>
+
+# if	defined(HAS_INKERNEL)
+#undef	INKERNEL
+# endif	/* defined(HAS_INKERNEL) */
+
+# if	UNIXWAREV>=70000
+#undef	TCP_MAXSEG
+#undef	TCP_NODELAY
+# endif	/* UNIXWAREV>=70000 */
+
+#include <netinet/tcp.h>
+#include <netinet/tcp_fsm.h>
+
+# if	UNIXWAREV<70000
+#include <netinet/tcp_kern.h>
+# else	/* UNIXWAREV>=70000 */
+#include <netinet/tcp_timer.h>
+
+#  if	defined(HAS_INKERNEL)
+#define	INKERNEL
+#  endif	/* defined(HAS_INKERNEL) */
+
+#include <netinet/tcp_var.h>
+
+#  if	defined(HAS_INKERNEL)
+#undef	INKERNEL
+#  endif	/* defined(HAS_INKERNEL) */
+# endif	/* UNIXWAREV<70000 */
+
+#include <sys/protosw.h>
+#include <sys/socketvar.h>
+#include <sys/sockmod.h>
+
+# if	UNIXWAREV>=70101
+#undef	SS_ISBOUND
+#undef	SS_ISCONNECTED
+#undef	SS_ISCONNECTING
+#undef	SS_CANTRCVMORE
+#undef	SS_CANTSENDMORE
+#include <sys/socksys.h>
+# endif	/* UNIXWAREV>=70101 */
+
+#include <sys/tiuser.h>
+#include <vm/hat.h>
+#include <vm/as.h>
+#include <vm/seg.h>
+
+# if	UNIXWAREV>=70000 && UNIXWAREV<70103
+typedef ulong_t channel_t;		/* also in types.h #if _KERNEL */
+# endif	/* UNIXWAREV>=70000 && UNIXWAREV<70103 */
+
+#include <vm/seg_dev.h>
+#include <vm/seg_map.h>
+#include <vm/seg_vn.h>
+
+#define	COMP_P		const void
+#define DEVINCR		1024	/* device table malloc() increment */
+#define	DIRTYPE		dirent
+#define	FSNAMEL		4
+typedef	off_t		KA_T;
+#define	KMEM		"/dev/kmem"
+
+# if	defined(HAS_UW_NSC)
+#define N_UNIX		"/unix"
+# else	/* !defined(HAS_UW_NSC) */
+#define N_UNIX		"/stand/unix"
+# endif	/* defined(HAS_UW_NSC) */
+
+# if	UNIXWAREV<70103
+#define MALLOC_P	char
+#define MALLOC_S	unsigned
+# else	/* UNIXWAREV>=70103 */
+#define MALLOC_P	void
+#define MALLOC_S	size_t
+# endif	/* UNIXWAREV<70103 */
+
+#define FREE_P		MALLOC_P
+#define MAXSEGS		100	/* maximum text segments */
+#define	MAXSYSCMDL	(PSCOMSIZ - 1)	/* max system command name length */
+#define	PROCFS		"/proc"
+#define	PROCINCR	32	/* local proc table malloc increment */
+#define	PROCMIN		3	/* processes that make a "good" scan */
+#define	PROCSIZE	sizeof(struct proc)
+#define	PROCTRYLM	5	 /* times to try to read proc table */
+#define QSORT_P		char
+
+# if	UNIXWAREV<7000
+#define	READLEN_T	unsigned
+# else	/* UNIXWAREV>=7000 */
+#define	READLEN_T	size_t
+# endif	/* UNIXWAREV<7000 */
+
+# if	defined(HASPROCFS)
+#define	PNSIZ		5	/* size of /HASPROCFS names */
+#define	PR_INOBIAS	64L	/* /HASPROCFS PID to i_number bias */
+#define	PR_ROOTINO	2	/* /HASPROCFS root inode number */
+# endif
+
+#define STRNCPY_L	size_t
+#define	STRNML		32
+
+# if	UNIXWAREV>=70000
+#define	SZOFFTYPE	unsigned long long
+					/* type for size and offset */
+#define	SZOFFPSPEC	"ll"		/* SZOFFTYPE printf specification
+					 * modifier */
+/*
+ * Use the 64 bit stat() functions, so that lsof can get parameters on
+ * large and small files.
+ */
+#define	fstat		fstat64
+#define	lstat		lstat64
+#define	stat		stat64
+# else	/* UNIXWAREV<70000 */
+#define	SZOFFTYPE	unsigned long	/* type for size and offset */
+#define	SZOFFPSPEC	"l"		/* SZOFFTYPE printf specification modifier */
+# endif	/* UNIXWAREV>=7000 */
+
+#define U_SIZE		sizeof(struct user)
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+extern int CloneMaj;
+extern char **Fsinfo;
+extern int Fsinfomax;
+extern int HaveCloneMaj;
+extern int Kd;
+
+struct l_ino {
+	dev_t dev;			/* device */
+	long nlink;			/* link count */
+	char *nm;			/* name */
+	INODETYPE number;		/* inode number */
+	dev_t rdev;			/* raw device */
+	SZOFFTYPE size;			/* file size */
+	unsigned char dev_def;		/* dev is defined */
+	unsigned char nlink_def;	/* link count is defined */
+	unsigned char number_def;	/* number is defined */
+	unsigned char rdev_def;		/* rdev is defined */
+	unsigned char size_def;		/* size is defined */
+};
+
+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 */
+
+# if	defined(HASFSTYPE)
+	char *fstype;			/* st_fstype */
+# endif
+
+};
+
+extern short Nfstyp;
+
+#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 */
+};
+
+#include <setjmp.h>
+
+
+/*
+ * Definition for ckfa.c
+ */
+
+#define	CKFA_XDEVTST strcmp(sb.st_fstype,"cdfs")==0
+
+
+/*
+ * Definition for dvch.c, isfn.c, and rdev.c
+ */
+
+#define	CLONEMAJ	CloneMaj	/* clone major variable name */
+#define	HAS_STD_CLONE	1		/* has standard clone handling */
+#define	HAVECLONEMAJ	HaveCloneMaj	/* clone major status variable name */
+
+
+/*
+ * Definitions for rnch.c
+ */
+
+#if     defined(HASNCACHE)
+#include <sys/dnlc.h>
+#endif  /* defined(HASNCACHE) */
+
+#endif	/* UW_LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dmnt.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dmnt.c
new file mode 100644
index 0000000..93690b2
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dmnt.c
@@ -0,0 +1,227 @@
+/*
+ * dmnt.c - SCO UnixWare mount support functions for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dmnt.c,v 1.7 2005/08/13 16:21:41 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	struct mnttab me;
+	FILE *mfp;
+	struct mounts *mtp;
+	char *opt, *opte;
+	struct stat sb;
+
+#if	defined(HASPROCFS)
+	int procfs = 0;
+#endif
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Open access to the mount table and read mount table entries.
+ */
+	if (!(mfp = fopen(MNTTAB, "r"))) {
+	    (void) fprintf(stderr, "%s: can't access %s\n", Pn, MNTTAB);
+	    return(0);
+        }
+	while (!getmntent(mfp, &me)) {
+
+	/*
+	 * Skip loop-back mounts, since they are aliases for legitimate file
+	 * systems and there is no way to determine that a vnode refers to a
+	 * loop-back alias.
+	 *
+	 * Also skip file systems of type MNTTYPE_IGNORE or with the option
+	 * MNTOPT_IGNORE, since they are auto-mounted file systems whose
+	 * real entries (if they are mounted) will be separately identified
+	 * by getmntent().
+	 */
+	    if (!strcmp(me.mnt_fstype, MNTTYPE_LO)
+	    ||  !strcmp(me.mnt_fstype, MNTTYPE_IGNORE))
+		continue;
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(me.mnt_mountp, (MALLOC_S *)NULL))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ",Pn);
+		safestrprt(me.mnt_special, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(me.mnt_mountp, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: can't stat()", Pn);
+
+#if	defined(HASFSTYPE)
+		    putc(' ', stderr);
+		    safestrprt(me.mnt_fstype, stderr, 0);
+#endif	/* defined(HASFSTYPE) */
+
+		    (void) fprintf(stderr, " file system ");
+		    safestrprt(me.mnt_mountp, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		if (!(opt = strstr(me.mnt_mntopts, "dev="))) {
+		    (void) memset(&sb, 0, sizeof(sb));
+		    if (!(opte = x2dev(opt + 4, &sb.st_dev))) {
+			sb.st_mode = S_IFDIR | 0777;
+
+#if	defined(HASFSTYPE)
+			(void) strncpy(sb.st_fstype, me.mnt_fstype,
+				       sizeof(sb.st_fstype));
+			sb.st_fstype[sizeof(sb.st_fstype) - 1 ] = '\0';
+#endif	/* HASFSTYPE */
+
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"      assuming \"%.*s\" from %s\n",
+				(opte - opt), opt, MNTTAB);
+			}
+		    } else
+			opt = (char *)NULL;
+		}
+		if (!opt)
+		    continue;
+	    }
+	/*
+	 * Allocate and fill a local mount structure.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts))))
+		goto no_space_for_mount;
+
+#if	defined(HASFSTYPE)
+	    if (!(mtp->fstype = mkstrcpy(sb.st_fstype, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+#endif	/* HASFSTYPE */
+
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+	    mtp->next = Lmi;
+	    mtp->dev = sb.st_dev;
+	    mtp->rdev = sb.st_rdev;
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+
+#if	defined(HASPROCFS)
+# if	defined(HASFSTYPE)
+	    if (!strcmp(sb.st_fstype, HASPROCFS))
+# else	/* !defined*HASFSTYPE) */
+	    if (!strcmp(me.mnt_special, "/proc"))
+# endif	/* defined(HASFSTYPE) */
+
+	    {
+
+	    /*
+	     * Save information on exactly one procfs file system.
+	     */
+		if (procfs)
+		    Mtprocfs = (struct mounts *)NULL;
+		else {
+		    procfs = 1;
+		    Mtprocfs = mtp;
+		}
+	    }
+#endif	/* defined(HASPROCFS) */
+
+	/*
+	 * Interpolate a possible file system (mounted-on device) name link.
+	 */
+	    if (!(dn = mkstrcpy(me.mnt_special, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mounts structure.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+        }
+	(void) fclose(mfp);
+/*
+ * Clean up and return local mount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dnode.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode.c
new file mode 100644
index 0000000..bc91e46
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode.c
@@ -0,0 +1,1574 @@
+/*
+ * dnode.c - SCO UnixWare node functions for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode.c,v 1.28 2006/03/28 21:57:57 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+#include <sys/fs/namenode.h>
+
+#if	UNIXWAREV>=70000
+#undef	IREAD
+#undef	IWRITE
+#undef	IEXEC
+#endif	/* UNIXWAREV>=70000 */
+
+#if	defined(HAS_UW_CFS)
+#include <fs/nsc_cfs/cnode.h>
+#endif	/* defined(HAS_UW_CFS) */
+
+#include <sys/fs/ufs_inode.h>
+
+#if	defined(HASXNAMNODE)
+#include <sys/fs/xnamnode.h>
+#endif	/* defined(HASXNAMNODE) */
+
+
+_PROTOTYPE(static void ent_fa,(KA_T *a1, KA_T *a2, char *d));
+_PROTOTYPE(static int get_vty,(struct vnode *v, KA_T va, struct vfs *kv, int *fx));
+
+#if	UNIXWAREV<70103
+_PROTOTYPE(static int examine_stream,(KA_T vs, struct queue *q, char *mn,
+	   char *sn, KA_T *sqp));
+#else	/* UNIXWAREV>=70103 */
+_PROTOTYPE(static int examine_stream,(KA_T vs, struct queue *q, char **mch,
+	   char **mn, char *sn, KA_T *sqp));
+_PROTOTYPE(static struct l_dev * findspdev,(dev_t *dev, dev_t *rdev));
+_PROTOTYPE(static void getspdev,(void));
+_PROTOTYPE(static int get_vty,(struct vnode *v, KA_T va, struct vfs *kv,
+	   int *fx));
+_PROTOTYPE(static struct l_dev * ismouse,(struct vnode *va, struct l_ino *i,
+	   int fx, struct vfs *kv));
+#endif	/* UNIXWAREV<70103 */
+
+_PROTOTYPE(static struct l_dev * findstrdev,(dev_t *dev, dev_t *rdev));
+_PROTOTYPE(static char isvlocked,(struct vnode *va));
+_PROTOTYPE(static int readlino,(int fx, struct vnode *v, struct l_ino *i));
+
+
+/*
+ * Local variables and definitions
+ */
+
+static struct protos {
+	char *module;			/* stream module name */
+	char *proto;			/* TCP/IP protocol name */
+} Protos[] = {
+	{ "tcpu",	"TCP"	},
+	{ "udpu",	"UDP"	},
+	{ "tcpl",	"TCP"	},
+	{ "tcp",	"TCP"	},
+	{ "udpl",	"UDP"	},
+	{ "udp",	"UDP"	},
+
+#if	UNIXWAREV<70103
+	{ "icmp",	"ICMP"	},
+	{ "ipu",	"IP"	},
+	{ "ipl",	"IP"	},
+	{ "ip",		"IP"	},
+#endif	/* UNIXWAREV<70103 */
+
+};
+#define	NPROTOS	(sizeof(Protos)/sizeof(struct protos))
+
+#if	UNIXWAREV>=70103
+static struct specdev {
+    char *name;
+    struct l_dev *dp;
+} SpDev[] = {
+    { "/dev/log",	(struct l_dev *)NULL },
+    { "/dev/mouse",	(struct l_dev *)NULL },
+};
+#define	SPDEV_CT	(sizeof(SpDev) / sizeof(struct specdev))
+static int SpDevX = -1;			/* SpDev[] maximum index */
+#endif	/* UNIXWAREV>=70103 */
+
+
+/*
+ * ent_fa() - enter fattach addresses in NAME column addition
+ */
+
+static void
+ent_fa(a1, a2, d)
+	KA_T *a1;			/* first fattach address (NULL OK) */
+	KA_T *a2;			/* second fattach address */
+	char *d;			/* direction ("->" or "<-") */
+{
+	char buf[64], *cp, tbuf[32];
+	MALLOC_S len;
+
+	if (Lf->nma)
+	    return;
+	if (!a1)
+	    (void) snpf(buf, sizeof(buf), "(FA:%s%s)", d,
+		print_kptr(*a2, (char *)NULL, 0));
+	else
+	    (void) snpf(buf, sizeof(buf), " (FA:%s%s%s)",
+		print_kptr(*a1, tbuf, sizeof(tbuf)), d,
+		print_kptr(*a2, (char *)NULL, 0));
+	len = strlen(buf) + 1;
+	if ((cp = (char *)malloc(len)) == NULL) {
+	    (void) fprintf(stderr,
+		"%s: no space for fattach addresses at PID %d, FD %s\n",
+		Pn, Lp->pid, Lf->fd);
+	    Exit(1);
+	}
+	(void) snpf(cp, len, "%s", buf);
+	Lf->nma = cp;
+}
+
+
+/*
+ * examine_stream() - examine stream
+ */
+
+static int
+
+#if	UNIXWAREV<70103
+examine_stream(vs, q, mn, sn, sqp)
+#else	/* UNIXWAREV>=70103 */
+examine_stream(vs, q, mch, mn, sn, sqp)
+#endif	/* UNIXWAREV<70103 */
+
+	KA_T vs;			/* stream head's stdata kernel
+					 * address */
+	struct queue *q;		/* queue structure buffer */
+
+#if	UNIXWAREV>=70103
+	char **mch;			/* important stream module name chain,
+					 * module names separated by "->" */
+	char **mn;			/* pointer to module name receiver */
+#else	/* UNIXWAREV<70103 */
+	char *mn;			/* module name receiver */
+#endif	/* UNIXWAREV>=70103 */
+
+	char *sn;			/* special module name */
+	KA_T *sqp;			/* special module's q_ptr */
+{
+	struct module_info mi;
+	KA_T qp;
+	struct qinit qi;
+	struct stdata sd;
+	char tbuf[32];
+
+#if	UNIXWAREV>=70103
+	static char *ab = (char *)NULL;
+	static MALLOC_S aba = (size_t)0;
+	MALLOC_S al, len, naba, tlen;
+	char *ap;
+	char tmnb[STRNML+1];
+#endif	/* UNIXWAREV>=70103 */
+
+/*
+ * Read stream's head.
+ */
+	if (!vs || readstdata(vs, &sd)) {
+	    (void) snpf(Namech, Namechl, "can't read stream head from %s",
+		print_kptr(vs, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(1);
+	}
+	if (!sd.sd_wrq) {
+	    enter_nm("no stream write queue");
+	    return(1);
+	}
+/*
+ * Examine the write queue.
+ */
+
+#if	UNIXWAREV<70103
+	for (qp = (KA_T)sd.sd_wrq, *mn = '\0'; qp; qp = (KA_T)q->q_next)
+#else	/* UNIXWAREV>=70103 */
+	for (qp = (KA_T)sd.sd_wrq, al = (MALLOC_S)0, ap = ab,
+		  *mn = (char *)NULL, tmnb[sizeof(tmnb) - 1] = '\0';
+	     qp;
+	     qp = (KA_T)q->q_next)
+#endif	/* UNIXWAREV<70103 */
+
+	{
+
+	/*
+	 * Read stream queue entry.
+	 */
+	    if (kread(qp, (char *)q, sizeof(struct queue))) {
+		(void) snpf(Namech, Namechl, "can't read stream queue from %s",
+		    print_kptr(qp, (char *)NULL, 0));
+		enter_nm(Namech);
+		return(1);
+	    }
+	/*
+	 * Read queue's information structure.
+	 */
+	    if (!q->q_qinfo || readstqinit((KA_T)q->q_qinfo, &qi)) {
+		(void) snpf(Namech, Namechl, "can't read qinit for %s from %s",
+		    print_kptr(qp, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)q->q_qinfo, (char *)NULL, 0));
+		enter_nm(Namech);
+		return(1);
+	    }
+	/*
+	 * Read module information structure.
+	 */
+	    if (!qi.qi_minfo || readstmin((KA_T)qi.qi_minfo, &mi)) {
+		(void) snpf(Namech, Namechl,
+		    "can't read module info for %s from %s",
+		    print_kptr((KA_T)q->q_qinfo, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)qi.qi_minfo, (char *)NULL, 0));
+		enter_nm(Namech);
+		return(1);
+	    }
+	/*
+	 * Read module name.
+	 */
+
+#if	UNIXWAREV<70103
+	    if (!mi.mi_idname || kread((KA_T)mi.mi_idname, mn, STRNML-1))
+#else	/* UNIXWAREV>=70103 */
+	    if (!mi.mi_idname || kread((KA_T)mi.mi_idname, tmnb, STRNML))
+#endif	/* UNIXWAREV<70103 */
+
+	    {
+		(void) snpf(Namech, Namechl,
+		    "can't read module name for %s from %s",
+		    print_kptr((KA_T)qi.qi_minfo, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)mi.mi_idname, (char *)NULL, 0));
+		enter_nm(Namech);
+		return(1);
+	    }
+
+#if	UNIXWAREV<70103
+	    *(mn + STRNML - 1) = '\0';
+#endif	/* UNIXWAREV<70103 */
+
+	/*
+	 * Save the q_ptr of the first special module.
+	 */
+
+#if	UNIXWAREV<70103
+	    if (!sn || *sqp || !q->q_ptr)
+		continue;
+	    if (strcmp(mn, sn) == 0)
+		*sqp = (KA_T)q->q_ptr;
+#else	/* UNIXWAREV>=70103 */
+	    if (sn && !*sqp && q->q_ptr) {
+		if (strcmp(tmnb, sn) == 0)
+		    *sqp = (KA_T)q->q_ptr;
+	    }
+	/*
+	 * Assemble the module name chain.  Allocate space as required.
+	 * Skip null module names and some "uninteresting" ones.
+	 */
+	    len = strlen(tmnb);
+	    if (len
+	    &&  strcmp(tmnb, "strrhead")
+	    &&  strcmp(tmnb, "strwhead")
+	    ) {
+		tlen = len + 1 + (al ? 2 : 0);
+		if ((tlen + al) > aba) {
+		    aba = tlen + al + 64;	/* allocate some extra */
+		    if (!ab) {
+			ab = ap = (char *)malloc(aba);
+		    } else {
+			ab = (char *)realloc((MALLOC_P *)ab, aba);
+			if (al)
+			    ap = ab + (al - 1);
+			else
+			    ap = ab;
+		    }
+		    if (!ab) {
+			(void) fprintf(stderr,
+			    "%s: no space for stream chain", Pn); 
+			Exit(1);
+		    }
+		}
+		(void) snpf(ap, aba - (al - 1), "%s%s",
+		    (ap == ab) ? "" : "->", tmnb);
+		*mn = ap + ((ap == ab) ? 0 : 2);
+		al += tlen;
+		ap += (tlen - 1);
+	    }
+#endif	/* UNIXWAREV<70103 */
+
+	}
+
+#if	UNIXWAREV>=70103
+	*mch = ab;
+	if (!*mn)
+	    *mn = "";
+#endif	/* UNIXWAREV>=70103 */
+
+	return(0);
+}
+
+
+#if	UNIXWAREV>=70103
+/*
+ * findspdev() - find special device by raw major device number
+ */
+
+static struct l_dev *
+findspdev(dev, rdev)
+	dev_t *dev;			/* containing device */
+	dev_t *rdev;			/* raw device */
+{
+	int i;
+	struct l_dev *dp;
+
+	if (*dev != DevDev)
+	    return((struct l_dev *)NULL);
+	if (SpDevX < 0)
+	    (void) getspdev();
+	for (i = 0; i < SpDevX; i++) {
+	    if (!(dp = SpDev[i].dp))
+		continue;
+	    if (GET_MAJ_DEV(*rdev) == GET_MAJ_DEV(dp->rdev))
+		return(dp);
+	}
+	return((struct l_dev *)NULL);
+}
+#endif	/* UNIXWAREV>=70103 */
+
+
+/*
+ * findstrdev() - look up stream device by device number
+ */
+
+static struct l_dev *
+findstrdev(dev, rdev)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+{
+	struct clone *c;
+	struct l_dev *dp;
+/*
+ * Search device table for match.
+ */
+
+#if	HASDCACHE
+
+findstrdev_again:
+
+#endif	/* HASDCACHE */
+
+	if ((dp = lkupdev(dev, rdev, 0, 0)))
+	    return(dp);
+/*
+ * Search for clone.
+ */
+	if (Clone) {
+	    for (c = Clone; c; c = c->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MIN_DEV(Devtp[c->dx].rdev)) {
+
+#if	HASDCACHE
+		    if (DCunsafe && !Devtp[c->dx].v && !vfy_dev(&Devtp[c->dx]))
+			goto findstrdev_again;
+#endif	/* HASDCACHE */
+
+		    return(&Devtp[c->dx]);
+		}
+	    }
+	}
+
+#if	UNIXWAREV<70103
+	return((struct l_dev *)NULL);
+#else	/* UNIXWAREV>=70103 */
+/*
+ * Search for non-clone clone.
+ */
+	return(findspdev(dev, rdev));
+#endif	/* UNIXWAREV<70103 */
+
+}
+
+
+#if	UNIXWAREV>=70103
+/*
+ * getspecdev() -- get Devtp[] pointers for "special" devices
+ */
+
+static void
+getspdev()
+{
+	struct l_dev *dp;
+	int i, j, n;
+
+	if (SpDevX >= 0)
+	    return;
+/*
+ * Scan Devtp[] for the devices named in SpDev[].
+ */
+	for (i = n = 0; (i < Ndev) && (n < SPDEV_CT); i++) {
+	    dp = Sdev[i];
+	    for (j = 0; j < SPDEV_CT; j++) {
+		if (SpDev[j].dp)
+		    continue;
+		if (strcmp(SpDev[j].name, dp->name) == 0) {
+		    SpDev[j].dp = dp;
+		    n++;
+		    SpDevX = j + 1;
+		    break;
+		}
+	    }
+	}
+	if (SpDevX < 0)
+	    SpDevX = 0;
+}
+#endif	/* UNIXWAREV>=70103 */
+
+
+/*
+ * get_vty() - get vnode type
+ *
+ * return: vnode type as an N_* symbol value
+ *	   N_REGLR if no special file system type applies
+ *	   -1 if the vnode type is VUNNAMED
+ *	   -2 if the vfs structure has an illegal type index
+ *	   -3 if the vfs structure can't be read
+ */
+
+static int
+get_vty(v, va, kv, fx)
+	struct vnode *v;		/* vnode to test */
+	KA_T va;			/* vnode's kernel address */
+	struct vfs *kv;			/* copy of vnode's kernel vfs struct */
+	int *fx;			/* file system type index */
+{
+	int fxt;
+	int nty = N_REGLR;
+	char tbuf[32];
+
+	if (v->v_type == VUNNAMED) {
+	    *fx = 0;
+	    return(-1);
+	}
+	if (!v->v_vfsp) {
+	    *fx = 0;
+	    if ((v->v_type == VFIFO) || v->v_stream)
+		return(N_STREAM);
+	    return(N_REGLR);
+	}
+	if (!kread((KA_T)v->v_vfsp, (char *)kv, sizeof(struct vfs))) {
+
+	/*
+	 * Check the file system type.
+	 */
+	    fxt = kv->vfs_fstype;
+	    if (fxt > 0 && fxt <= Fsinfomax) {
+		if (!strcmp(Fsinfo[fxt-1], "fifofs"))
+		    nty = N_FIFO;
+		else if (!strcmp(Fsinfo[fxt-1], "nfs"))
+		    nty = N_NFS;
+		else if (!strcmp(Fsinfo[fxt-1], "namefs"))
+		    nty = N_NM;
+		else if (!strcmp(Fsinfo[fxt-1], "nsc_cfs"))
+		    nty = N_CFS;
+
+
+#if	defined(HASPROCFS)
+		else if (!strcmp(Fsinfo[fxt-1], "proc"))
+		    nty = N_PROC;
+#endif	/* defined(HASPROCFS) */
+
+	    } else {
+		(void) snpf(Namech, Namechl,
+		    "vnode@%s: bad file system index (%d)",
+		    print_kptr(va, (char *)NULL, 0), fxt);
+		enter_nm(Namech);
+		return(-2);
+	    }
+	} else {
+	    (void) snpf(Namech, Namechl, "vnode@%s: bad vfs pointer (%s)",
+		print_kptr(va, tbuf, sizeof(tbuf)),
+		print_kptr((KA_T)v->v_vfsp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return(-3);
+	}
+	if (nty == N_REGLR) {
+	    if (v->v_type == VFIFO)
+		nty = N_FIFO;
+	    else if (v->v_stream)
+		nty = N_STREAM;
+	}
+	*fx = fxt;
+	return(nty);
+}
+
+
+#if	UNIXWAREV>=70103
+/*
+ * ismouse() - is vnode attached to /dev/mouse
+ */
+
+static struct l_dev *
+ismouse(va, i, fx, kv)
+	struct vnode *va;		/* local vnode address */
+	struct l_ino *i;		/* local inode structure */
+	int fx;				/* file system index */
+	struct vfs *kv;			/* copy of kernel VFS structure */
+{
+	struct l_dev *dp;
+	int j;
+
+	if ((fx < 1) || (fx > Fsinfomax))
+	    return((struct l_dev *)NULL);
+	if ((dp = findspdev(&kv->vfs_dev, &va->v_rdev))) {
+	    i->dev = kv->vfs_dev;
+	    i->dev_def = 1;
+	    i->nlink = (long)0;
+	    i->nlink_def = 0;
+	    i->nm = (char *)NULL;
+	    i->number = dp->inode;
+	    i->number_def = 1;
+	    i->rdev = va->v_rdev;
+	    i->rdev_def = 0;
+	    i->size = (SZOFFTYPE)0;
+	    i->size_def = 0;
+	    Ntype = N_REGLR;
+	}
+	return(dp);
+}
+#endif	/* UNIXWAREV>=70103 */
+
+
+/*
+ * isvlocked() - is a vnode locked
+ */
+
+static char
+isvlocked(va)
+	struct vnode *va;		/* local vnode address */
+{
+	struct filock f;
+	KA_T flf, flp;
+	int i, l;
+
+	if (!(flf = (KA_T)va->v_filocks))
+	    return(' ');
+	flp = flf;
+	i = 0;
+	do {
+	    if (i++ > 1000)
+		break;
+	    if (kread(flp, (char *)&f, sizeof(f)))
+		break;
+	    if (f.set.l_sysid || f.set.l_pid != (pid_t)Lp->pid)
+		continue;
+	    if (!f.set.l_whence && !f.set.l_start
+
+#if	UNIXWAREV>=70101
+# if	UNIXWAREV<70103
+	    &&  (f.set.l_len == 0x7fffffffffffffff)
+# else	/* UNIXWAREV>=70103 */
+	    &&  (f.set.l_len == 0x7fffffffffffffffLL)
+# endif	/* UNIXWAREV<70103 */
+#else	/* UNIXWAREV<70101 */
+	    &&  ((f.set.l_len == 0) || (f.set.l_len == 0x7fffffff))
+#endif	/* UNIXWAREV>=70101*/
+
+	    )
+		l = 1;
+	    else
+		l = 0;
+	    switch (f.set.l_type & (F_RDLCK | F_WRLCK)) {
+	    case F_RDLCK:
+		return((l) ? 'R' : 'r');
+	    case F_WRLCK:
+		return((l) ? 'W' : 'w');
+	    case (F_RDLCK + F_WRLCK):
+		return('u');
+	    default:
+		return(' ');
+	    }
+	} while (flp != (KA_T)f.next && (flp = (KA_T)f.next) && flp != flf);
+	return(' ');
+}
+
+
+/*
+ * process_node() - process node
+ */
+
+void
+process_node(na)
+	KA_T na;			/* vnode kernel space address */
+{
+	char *cp, *ep;
+	dev_t dev, rdev;
+	unsigned char devs = 0;
+	unsigned char rdevs = 0;
+	unsigned char ni = 0;
+	struct l_dev *dp;
+	struct fifonode f;
+	int fx, rfx;
+	struct l_ino i;
+	int is = 1;
+	int j, k;
+	KA_T ka;
+	struct vfs kv, rkv;
+
+#if	UNIXWAREV<70103
+	struct module_info mi;
+	char mn[STRNML];
+#else	/* UNIXWAREV>=70103 */
+	char *mch, *mn;
+#endif	/* UNIXWAREV<70103 */
+
+	struct mnode mno;
+	MALLOC_S msz;
+	struct namenode nn;
+	int px;
+	struct queue q;
+	struct rnode r;
+	struct vnode rv, v;
+	struct snode s;
+	unsigned char sd = 1;
+	struct so_so so;
+	KA_T sqp = (KA_T)NULL;
+	size_t sz;
+	char tbuf[32], *ty;
+	enum vtype type;
+	struct sockaddr_un ua;
+
+#if	defined(HASPROCFS)
+	struct as as;
+	struct proc p;
+	KA_T pa;
+	struct procfsid *pfi;
+	long pid;
+	struct prnode pr;
+# if	UNIXWAREV<20102
+	struct pid pids;
+# else	/* UNIXWAREV>=20102 */
+	struct prcommon prc;
+# endif	/* UNIXWAREV>=20102 */
+#endif	/* defined(HASPROCFS) */
+
+/*
+ * Read the vnode.
+ */
+	if (!na) {
+	    enter_nm("no vnode address");
+	    return;
+	}
+	if (readvnode((KA_T)na, &v)) {
+            enter_nm(Namech);
+            return;
+        }
+
+#if	defined(HASNCACHE)
+	Lf->na = na;
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASFSTRUCT)
+	Lf->fna = na;
+	Lf->fsv |= FSV_NI;
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Determine the vnode type.
+ */
+	if ((Ntype = get_vty(&v, na, &kv, &fx)) < 0) {
+	    if (Ntype == -1)
+		Lf->sf = 0;
+	    return;
+	}
+/*
+ * Determine the lock state.
+ */
+
+get_lock_state:
+
+	Lf->lock = isvlocked(&v);
+/*
+ * Read the fifonode, inode, namenode, prnode, rnode, snode, ...
+ */
+	switch (Ntype) {
+	case N_FIFO:
+	    if (!v.v_data || readfifonode((KA_T)v.v_data, &f)) {
+		(void) snpf(Namech, Namechl,
+		    "vnode@%s: can't read fifonode (%s)",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    if (f.fn_realvp) {
+		if (readvnode((KA_T)f.fn_realvp, &rv)) {
+		    (void) snpf(Namech, Namechl,
+			"fifonode@%s: can't read real vnode (%s)",
+			print_kptr((KA_T)v.v_data, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)f.fn_realvp, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+
+#if	defined(HASNCACHE)
+		Lf->na = (KA_T)f.fn_realvp;
+#endif	/* defined(HASNCACHE) */
+
+		if (!rv.v_data || (is = readlino(fx, &rv, &i))) {
+		    (void) snpf(Namech, Namechl,
+			"fifonode@%s: can't read inode (%s)",
+			print_kptr((KA_T)v.v_data, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)rv.v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    } else
+		ni = 1;
+	    break;
+	case N_NFS:
+	    if (!v.v_data || readrnode((KA_T)v.v_data, &r)) {
+		(void) snpf(Namech, Namechl, "vnode@%s: can't read rnode (%s)",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    break;
+	case N_NM:
+	    if (!v.v_data || kread((KA_T)v.v_data, (char *)&nn, sizeof(nn))) {
+		(void) snpf(Namech, Namechl, "vnode@%s: no namenode (%s)",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    i.dev = nn.nm_vattr.va_fsid;
+	    i.rdev = nn.nm_vattr.va_rdev;
+	    i.number = (INODETYPE)nn.nm_vattr.va_nodeid;
+	    i.size = nn.nm_vattr.va_size;
+	    if (!nn.nm_mountpt)
+		break;
+	/*
+	 * The name node is mounted over/to another vnode.  Process that node.
+	 */
+	    (void) ent_fa(&na, (KA_T *)&nn.nm_mountpt, "->");
+	    if (kread((KA_T)nn.nm_mountpt, (char *)&rv, sizeof(rv))) {
+		(void) snpf(Namech, Namechl,
+		    "vnode@%s: can't read namenode's mounted vnode (%s)",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)nn.nm_mountpt, (char *)NULL, 0));
+		return;
+	    }
+	    if ((Ntype = get_vty(&rv, (KA_T)nn.nm_mountpt, &rkv, &rfx)) < 0) {
+		if (Ntype == -1)
+		    Lf->sf = 0;
+		return;
+	    }
+	/*
+	 * Unless the mounted-over/to node is another "namefs" node, promote
+	 * it to the vnode of interest.
+	 */
+	    if (Ntype == N_NM)
+		break;
+	    fx = rfx;
+	    kv = rkv;
+	    v = rv;
+	    goto get_lock_state;
+
+#if	defined(HASPROCFS)
+	case N_PROC:
+	    ni = 1;
+	    if (!v.v_data || kread((KA_T)v.v_data, (char *)&pr, sizeof(pr))) {
+		(void) snpf(Namech, Namechl, "vnode@%s: can't read prnode (%s)",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+
+# if	UNIXWAREV>=20102
+	    i.number = (INODETYPE)pr.pr_ino;
+	    sd = 0;
+	    if (pr.pr_common
+	    &&  !kread((KA_T)pr.pr_common, (char *)&prc, sizeof(prc))) {
+		pid = (long)prc.prc_pid;
+		switch(pr.pr_type) {
+		case PR_PIDDIR:
+		    (void) snpf(Namech, Namechl, "/%s/%ld", HASPROCFS, pid);
+		    break;
+		case PR_AS:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/as", HASPROCFS, pid);
+		    break;
+		case PR_CTL:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/ctl", HASPROCFS, pid);
+		    break;
+		case PR_STATUS:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/status", HASPROCFS,
+			pid);
+		    break;
+		case PR_MAP:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/map", HASPROCFS, pid);
+		    break;
+		case PR_CRED:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/cred", HASPROCFS, pid);
+		    break;
+		case PR_SIGACT:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/sigact", HASPROCFS,
+			pid);
+		    break;
+		case PR_OBJECTDIR:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/object", HASPROCFS,
+			pid);
+		    break;
+		case PR_LWPDIR:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/lwp", HASPROCFS, pid);
+		    break;
+		case PR_LWPIDDIR:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/lwp/%d",
+			HASPROCFS, pid, prc.prc_lwpid);
+		    break;
+		case PR_LWPCTL:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/lwp/%d/lwpctl",
+			HASPROCFS, pid, prc.prc_lwpid);
+		    break;
+		case PR_LWPSTATUS:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/lwp/%d/lwpstatus",
+			HASPROCFS, pid, prc.prc_lwpid);
+		    break;
+		case PR_LWPSINFO:
+		    (void) snpf(Namech, Namechl, "/%s/%ld/lwp/%d/lwpsinfo",
+			HASPROCFS, pid, prc.prc_lwpid);
+		    break;
+		}
+	    } else
+		pid = 0l;
+	    break;
+# else	/* UNIXWAREV<20102 */
+	    if (!pr.pr_proc) {
+		sd = 0;
+		pid = 0l;
+		if (v.v_type == VDIR)
+		    i.number = (INODETYPE)PR_ROOTINO;
+		else
+		    i.number = (INODETYPE)0;
+		break;
+	    }
+	    if (kread((KA_T)pr.pr_proc, (char *)&p, sizeof(p))) {
+		(void) snpf(Namech, Namechl, "prnode@%s: can't read proc (%s)",
+		    print_kptr((KA_T)v.v_data, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)pr.pr_proc, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    if (!p.p_pidp || kread((KA_T)p.p_pidp, (char *)&pids, sizeof(pids)))
+	    {
+		(void) snpf(Namech, Namechl,
+		    "proc struct at %s: can't read pid (%s)",
+		    print_kptr((KA_T)pr.pr_proc, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)p.p_pidp, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	    pid = (long)pids.pid_id;
+	    (void) snpf(Namech, Namechl, "/%s/%ld", HASPROCFS, pid);
+	    i.number = (INODETYPE)(pid + PR_INOBIAS);
+	    if (!p.p_as ||  kread((KA_T)p.p_as, (char *)&as, sizeof(as)))
+		sd = 0;
+	    else
+		i.size = as.a_size;
+	    break;
+# endif	/* UNIXWAREV>=20102 */
+#endif	/* defined(HASPROCFS) */
+
+	case N_STREAM:
+	    if (v.v_stream) {
+		Lf->is_stream = ni = 1;
+
+#if	UNIXWAREV>=70101
+		if (process_unix_sockstr(&v, na)) {
+
+		/*
+		 * The stream is a UNIX socket stream.  No more need be done;
+		 * process_unix_stream() has done it all.
+		 */
+		    return;
+		}
+#endif	/* UNIXWAREV>=70101 */
+
+	    /*
+	     * Get the queue pointer and module name at the end of the stream.
+	     * The module name identifies socket streams.
+	     */
+		if (examine_stream((KA_T)v.v_stream, &q,
+
+#if	UNIXWAREV>=70103
+				   &mch, &mn,
+#else	/* UNIXWAREV<70103 */
+ 				   mn,
+#endif	/* UNIXWAREV>=70103 */
+
+				   "sockmod", &sqp))
+		    return;
+		for (px = 0; px < NPROTOS; px++) {
+		    if (strcmp(mn, Protos[px].module) == 0) {
+			process_socket(Protos[px].proto, &q);
+			return;
+		    }
+		}
+	    /*
+	     * If this stream has a "sockmod" module with a non-NULL q_ptr,
+	     * try to use it to read an so_so structure.
+	     */
+		if (sqp && kread(sqp, (char *)&so, sizeof(so)) == 0)
+		    break;
+		sqp = (KA_T)NULL;
+		(void) snpf(Namech, Namechl, "STR");
+		j = strlen(Namech);
+		if (v.v_type == VCHR) {
+	    /*
+	     * If this is a VCHR stream, look up the device name and record it.
+	     */
+		    if ((dp = findstrdev(&DevDev, (dev_t *)&v.v_rdev))) {
+			Lf->inode = dp->inode;
+			Lf->inp_ty = 1;
+			Namech[j++] = ':';
+			k = strlen(dp->name);
+			if ((j + k) <= (Namechl - 1)) {
+			    (void) snpf(&Namech[j], Namechl - j, "%s",
+				dp->name);
+			    j += k;
+			    if ((cp = strrchr(Namech, '/'))
+			    &&  *(cp + 1) == '\0')
+			    {
+				*cp = '\0';
+				j--;
+			    }
+			}
+		    }
+		}
+	    /*
+	     * Follow the "STR" and possibly the device name with "->" and
+	     * the module name or the stream's significant module names.
+	     */
+		if ((j + 2) <= (Namechl - 1)) {
+		    (void) snpf(&Namech[j], Namechl - j, "->");
+		    j += 2;
+		}
+
+#if	UNIXWAREV<70103
+		if (mn[0]) {
+		    if ((j + strlen(mn)) <= (Namechl - 1))
+			(void) snpf(&Namech[j], Namechl - j, mn);
+#else	/* UNIXWAREV>=70103 */
+		if (*mch) {
+		    if ((j + strlen(mch)) <= (Namechl - 1))
+			(void) snpf(&Namech[j], Namechl - j, mch);
+#endif	/* UNIXWAREV<70103 */
+
+		} else {
+		    if ((j + strlen("none")) <= (Namechl - 1))
+			(void) snpf(&Namech[j], Namechl - j, "none");
+	        }
+	    }
+	    break;
+	case N_REGLR:
+	default:
+
+	/*
+	 * Follow a VBLK or VCHR vnode to its snode, then to its real vnode,
+	 * finally to its inode.
+	 */
+	    if ((v.v_type == VBLK) || (v.v_type == VCHR)) {
+		if (!v.v_data || readsnode((KA_T)v.v_data, &s)) {
+		    (void) snpf(Namech, Namechl,
+			"vnode@%s: can't read snode (%s)",
+			print_kptr(na, tbuf, sizeof(tbuf)),
+			print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		if (s.s_realvp) {
+		    if (readvnode((KA_T)s.s_realvp, &rv)) {
+			(void) snpf(Namech, Namechl,
+			    "snode@%s: can't read real vnode (%s)",
+			    print_kptr((KA_T)v.v_data, tbuf, sizeof(tbuf)),
+			    print_kptr((KA_T)s.s_realvp, (char *)NULL, 0));
+			enter_nm(Namech);
+			return;
+		    }
+		    if (!rv.v_data || (is = readlino(fx, &rv, &i))) {
+			(void) snpf(Namech, Namechl,
+			    "snode@%s: unknown inode@%s; fx=",
+			    print_kptr((KA_T)v.v_data, tbuf, sizeof(tbuf)),
+			    print_kptr((KA_T)rv.v_data, (char *)NULL, 0));
+			ep = endnm(&sz);
+			if (fx < 1 || fx > Fsinfomax)
+			    (void) snpf(ep, sz, "%d", fx);
+			else
+			    (void) snpf(ep, sz, "%s", Fsinfo[fx - 1]);
+			enter_nm(Namech);
+			return;
+		    }
+		}
+	    /*
+	     * If there's no real vnode, look for a common vnode and a
+	     * common snode.
+	     */
+		else if ((ka = (KA_T)s.s_commonvp)) {
+		    if (readvnode(ka, &rv)) {
+			(void) snpf(Namech, Namechl,
+			    "snode@%s: can't read common vnode (%s)",
+			    print_kptr((KA_T)v.v_data, tbuf, sizeof(tbuf)),
+			    print_kptr((KA_T)ka, (char *)NULL, 0));
+			enter_nm(Namech);
+			return;
+		    }
+
+#if	UNIXWAREV>=70103
+		    if (!rv.v_vfsp) {
+			if ((dp = ismouse(&rv, &i, fx, &kv))) {
+			    (void) snpf(Namech, Namechl, "STR:%s", dp->name);
+			    break;
+			}
+		    }
+#endif	/* UNIXWAREV>=70103 */
+
+		    if (get_vty(&rv, ka, &rkv, &rfx) < 0)
+		        Lf->is_com = ni = 1;
+		    else {
+			if ((is = readlino(rfx, &rv, &i))) {
+			    (void) snpf(Namech, Namechl,
+				"vnode@%s: unknown successor@%s; fx=",
+				print_kptr((KA_T)ka, tbuf, sizeof(tbuf)),
+				print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+			    ep = endnm(&sz);
+			    if (rfx < 1 || rfx > Fsinfomax)
+				(void) snpf(ep, sz, "%d", rfx);
+			    else
+				(void) snpf(ep, sz, "%s", Fsinfo[rfx - 1]);
+			    enter_nm(Namech);
+			    return;
+			}
+		    }
+		} else
+		    ni = 1;
+		break;
+	    }
+
+#if	UNIXWAREV>=70103
+	    else if (v.v_type == VNON) {
+		ni = 1;
+		break;
+	    }
+#endif	/* UNIXWAREV>=70103 */
+
+	    if (v.v_data == NULL) {
+		(void) snpf(Namech, Namechl, "vnode@%s: no further information",
+		    print_kptr(na, (char *)NULL, 0));
+		enter_nm(Namech);
+		return;
+	    }
+	/*
+	 * Read inode information.
+	 */
+	    if ((is = readlino(fx, &v, &i))) {
+		(void) snpf(Namech, Namechl,
+		    "vnode@%s: unknown successor@%s; fx=",
+		    print_kptr(na, tbuf, sizeof(tbuf)),
+		    print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		ep = endnm(&sz);
+		if (fx < 1 || fx > Fsinfomax)
+		    (void) snpf(ep, sz, "%d", fx);
+		else
+		    (void) snpf(ep, sz, "%s", Fsinfo[fx - 1]);
+		enter_nm(Namech);
+		return;
+	    }
+	}
+/*
+ * Get device and type for printing.
+ */
+	switch (Ntype) {
+	case N_NFS:
+	    dev = r.r_attr.va_fsid;
+	    devs = 1;
+	    break;
+
+#if	defined(HASPROCFS)
+	case N_PROC:
+	    dev = kv.vfs_dev;
+	    devs = 1;
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+	case N_STREAM:
+	    if (sqp) {
+		if (so.lux_dev.size >= 8) {
+		    dev = DevDev;
+		    rdev = so.lux_dev.addr.tu_addr.dev;
+		    devs = rdevs = 1;
+		} else
+		    enter_dev_ch(print_kptr(sqp, (char *)NULL, 0));
+		break;
+	    }
+	    if (v.v_type == VFIFO) {
+		KA_T ta;
+
+		if ((ta = (KA_T)(v.v_data ? v.v_data : v.v_stream)))
+		    enter_dev_ch(print_kptr(ta, (char *)NULL, 0));
+		break;
+	    }
+	    /* fall through */
+	default:
+	    if (!ni) {
+		dev = i.dev;
+		devs = (Ntype == N_CFS) ? i.dev_def : 1;
+	    } else if ((Ntype == N_STREAM)
+		   &&  ((v.v_type == VCHR) || (v.v_type == VBLK)))
+	    {
+		dev = DevDev;
+		devs = 1;
+	    }
+	    if ((v.v_type == VCHR) || (v.v_type == VBLK)) {
+		rdev = v.v_rdev;
+		rdevs = (Ntype == N_CFS) ? i.rdev_def : 1;
+	    }
+	}
+	type = v.v_type;
+/*
+ * Obtain the inode number.
+ */
+	switch (Ntype) {
+
+	case N_NFS:
+	    Lf->inode = (INODETYPE)r.r_attr.va_nodeid;
+	    Lf->inp_ty = 1;
+	    break;
+
+#if	defined(HASPROCFS)
+	case N_PROC:
+	    Lf->inode = i.number;
+	    Lf->inp_ty = 1;
+	    break;
+#endif	/* defined(HASPROCFS) */
+
+	case N_FIFO:
+	    if (!f.fn_realvp) {
+		enter_dev_ch(print_kptr((KA_T)v.v_data, (char *)NULL, 0));
+		Lf->inode = (INODETYPE)f.fn_ino;
+		Lf->inp_ty = 1;
+		if (f.fn_flag & ISPIPE)
+		    (void) snpf(Namech, Namechl, "PIPE");
+		if (f.fn_mate) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, "->%s",
+			print_kptr((KA_T)f.fn_mate, (char *)NULL, 0));
+		}
+		break;
+	    }
+	    /* fall through */
+	case N_CFS:
+	case N_REGLR:
+	    if (!ni) {
+		Lf->inode = i.number;
+		Lf->inp_ty = (Ntype == N_CFS) ? i.number_def : 1;
+	    }
+	    break;
+	case N_STREAM:
+	    if (sqp && so.lux_dev.size >= 8) {
+		Lf->inode = (INODETYPE)so.lux_dev.addr.tu_addr.ino;
+		Lf->inp_ty = 1;
+	    }
+	}
+/*
+ * Obtain the file size.
+ */
+	if (Foffset)
+	    Lf->off_def = 1;
+	else {
+	    switch (Ntype) {
+
+	    case N_FIFO:
+	    case N_STREAM:
+		if (!Fsize)
+		    Lf->off_def = 1;
+		break;
+	    case N_NFS:
+		Lf->sz = (SZOFFTYPE)r.r_attr.va_size;
+		Lf->sz_def = sd;
+		break;
+
+#if	defined(HASPROCFS)
+	    case N_PROC:
+
+#if	UNIXWAREV<70103
+		Lf->sz = (SZOFFTYPE)i.size;
+		Lf->sz_def = sd;
+#else	/* UNIXWAREV>=70103 */
+		Lf->sz = (SZOFFTYPE)0;
+		Lf->sz_def = 0;
+#endif	/* UNIXWAREV<70103 */
+
+		break;
+#endif	/* defined(HASPROCFS) */
+
+	    case N_CFS:
+	    case N_REGLR:
+		if ((type == VREG) || (type == VDIR)) {
+		    if (!ni) {
+			Lf->sz = (SZOFFTYPE)i.size;
+			Lf->sz_def = (Ntype == N_CFS) ? i.size_def : sd;
+		    }
+		} else if (((type == VBLK) || (type == VCHR)) && !Fsize)
+		    Lf->off_def = 1;
+		break;
+	    }
+	}
+/*
+ * Record link count.
+ */
+	if (Fnlink) {
+	    switch(Ntype) {
+	    case N_FIFO:
+		Lf->nlink = (long)f.fn_open;
+		Lf->nlink_def = 1;
+		break;
+	    case N_NFS:
+		Lf->nlink = (long)r.r_attr.va_nlink;
+		Lf->nlink_def = 1;
+		break;
+
+#if	defined(HASPROCFS)
+	    case N_PROC:
+#endif	/* defined(HASPROCFS) */
+
+	    case N_CFS:
+	    case N_REGLR:
+		if (!ni) {
+		    Lf->nlink = (long)i.nlink;
+		    Lf->nlink_def = i.nlink_def;
+		}
+		break;
+	    }
+	    if (Nlink && Lf->nlink_def && (Lf->nlink < Nlink))
+		Lf->sf |= SELNLINK;
+	}
+/*
+ * Record an NFS file selection.
+ */
+	if (Ntype == N_NFS && Fnfs)
+	    Lf->sf |= SELNFS;
+/*
+ * Defer file system info lookup until printname().
+ */
+	Lf->lmi_srch = 1;
+/*
+ * Save the device numbers and their states.
+ *
+ * Format the vnode type, and possibly the device name.
+ */
+	if (type != VFIFO) {
+	    Lf->dev = dev;
+	    Lf->dev_def = devs;
+	    Lf->rdev = rdev;
+	    Lf->rdev_def = rdevs;
+	}
+	switch (type) {
+	case VNON:
+	    ty ="VNON";
+	    break;
+	case VREG:
+	    ty = "VREG";
+	    break;
+	case VDIR:
+	    ty = "VDIR";
+	    break;
+	case VBLK:
+	    ty = "VBLK";
+	    Ntype = N_BLK;
+	    break;
+	case VCHR:
+	    ty = "VCHR";
+	    if (Lf->is_stream == 0)
+		Ntype = N_CHR;
+	    break;
+	case VLNK:
+	    ty = "VLNK";
+	    break;
+
+#if	defined(VSOCK)
+	case VSOCK:
+	    ty = "SOCK";
+	    break;
+#endif	/* VSOCK */
+
+	case VBAD:
+	    ty = "VBAD";
+	    break;
+	case VFIFO:
+	    if (!Lf->dev_ch || Lf->dev_ch[0] == '\0') {
+		Lf->dev = dev;
+		Lf->dev_def = devs;
+		Lf->rdev = rdev;
+		Lf->rdev_def = rdevs;
+	    }
+	    ty = "FIFO";
+	    break;
+	case VUNNAMED:
+	    ty = "UNNM";
+	    break;
+	default:
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%04o", (type & 0xfff));
+	    ty = NULL;
+	}
+	if (ty)
+	    (void) snpf(Lf->type, sizeof(Lf->type), "%s", ty);
+	Lf->ntype = Ntype;
+/*
+ * If this is a VBLK file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (Lf->ntype == N_BLK))
+	    find_bl_ino();
+/*
+ * If this is a VCHR file and it's missing an inode number, try to
+ * supply one.
+ */
+	if ((Lf->inp_ty == 0) && (type == VCHR))
+	    find_ch_ino();
+/*
+ * If this is a stream with a "sockmod" module whose q_ptr leads to an
+ * so_so structure, assume it's a UNIX domain socket and try to get
+ * the path.  Clear the is_stream status.
+ */
+	if (Ntype == N_STREAM && sqp) {
+	    if (Funix)
+		Lf->sf |= SELUNX;
+	    (void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	    if (!Namech[0]
+	    &&  so.laddr.buf && so.laddr.len == sizeof(ua)
+	    &&  !kread((KA_T)so.laddr.buf, (char *)&ua, sizeof(ua))) {
+		ua.sun_path[sizeof(ua.sun_path) - 1] = '\0';
+		(void) snpf(Namech, Namechl, "%s", ua.sun_path);
+		if (Sfile && is_file_named(Namech, 0))
+		    Lf->sf = SELNM;
+		if (so.lux_dev.size >= 8) {
+		    Lf->inode = (INODETYPE)so.lux_dev.addr.tu_addr.ino;
+		    Lf->inp_ty = 1;
+		}
+	    }
+	    if (so.so_conn) {
+		ep = endnm(&sz);
+		(void) snpf(ep, sz, "->%s",
+		    print_kptr((KA_T)so.so_conn, (char *)NULL, 0));
+	    }
+	    Lf->is_stream = 0;
+	}
+/*
+ * Test for specified file.
+ */
+
+#if	defined(HASPROCFS)
+	if (Ntype == N_PROC) {
+	    if (Procsrch) {
+		Procfind = 1;
+		Lf->sf |= SELNM;
+	    } else {
+		for (pfi = Procfsid; pfi; pfi = pfi->next) {
+
+		    if ((pfi->pid && pid && pfi->pid == (pid_t)pid)
+
+# if	defined(HASPINODEN)
+		    || ((Lf->inp_ty == 1) && (Lf->inode == pfi->inode))
+# endif	/* defined(HASPINODEN) */
+
+		    ) {
+			pfi->f = 1;
+			Lf->sf |= SELNM;
+			if (!Namech[0] && pfi->nm) {
+			    (void) strncpy(Namech, pfi->nm, Namechl - 1);
+			    Namech[Namechl-1] = '\0';
+			}
+			break;
+		    }
+		}
+	    }
+	} else
+#endif	/* defined(HASPROCFS) */
+
+	{
+	    if (Sfile && is_file_named((char *)NULL,
+				       ((type == VCHR) || (type == VBLK)) ? 1
+									  : 0))
+		Lf->sf |= SELNM;
+	}
+/*
+ * Enter name characters.  If there's an l_ino structure with a file name
+ * pointer, and no name column addition exists, make what the l_ino file
+ * name pointer addresses a name column addition.
+ */
+	if (!Lf->nma && !is && i.nm) {
+	    if ((msz = (MALLOC_S)strlen(i.nm))) {
+		if (!(cp = (char *)malloc(msz + 1))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for l_ino name addition\n",
+			msz, Pn);
+		    Exit(1);
+		}
+		(void) snpf(cp, msz + 1, "%s", i.nm);
+		Lf->nma = cp;
+	    }
+	}
+	if (Namech[0])
+	    enter_nm(Namech);
+}
+
+
+/*
+ * readlino() - read local inode information
+ */
+
+static int
+readlino(fx, v, i)
+	int fx;				/* file system index */
+	struct vnode *v;		/* vnode pointing to inode */
+	struct l_ino *i;		/* local inode */
+{
+
+#if	defined(HAS_UW_CFS)
+	cnode_t cn;
+#endif	/* defined(HAS_UW_CFS) */
+
+	struct vnode fa;
+	struct mnode mn;
+	struct inode sn;
+
+#if	defined(HASXNAMNODE)
+	struct xnamnode xn;
+#endif	/* defined(HASXNAMNODE) */
+
+	i->nlink_def = 0;
+	if (fx < 1 || fx > Fsinfomax || !v->v_data)
+	    return(1);
+	if (!strcmp(Fsinfo[fx-1], "fifofs")
+	||  !strcmp(Fsinfo[fx-1], "sfs")
+	||  !strcmp(Fsinfo[fx-1], "ufs")) {
+	    if (kread((KA_T)v->v_data, (char *)&sn, sizeof(sn)))
+		return(1);
+	    i->dev = sn.i_dev;
+	    i->dev_def = 1;
+	    i->rdev = v->v_rdev;
+	    i->rdev_def = 1;
+	    i->nlink = (long)sn.i_nlink;
+	    i->nlink_def = 1;
+	    i->nm = (char *)NULL;
+	    i->number = (INODETYPE)sn.i_number;
+	    i->size = (SZOFFTYPE)sn.i_size;
+	    i->size_def = 1;
+	    return(0);
+	}
+
+#if	defined(HAS_UW_CFS)
+	else if (!strcmp(Fsinfo[fx-1], "nsc_cfs")) {
+	    if (kread((KA_T)v->v_data, (char *)&cn, sizeof(cn)))
+		return(1);
+	    if (cn.c_attr.va_mask & AT_FSID) {
+		i->dev = cn.c_attr.va_fsid;
+		i->dev_def = 1;
+	    } else
+		i->dev_def = 0;
+	    i->rdev = v->v_rdev;
+	    i->rdev_def = 1;
+	    if (cn.c_attr.va_mask & AT_NLINK) {
+		i->nlink = cn.c_attr.va_nlink;
+		i->nlink_def = 1;
+	    } else
+		i->nlink_def = 0;
+	    i->nm = (char *)NULL;
+	    if (cn.c_attr.va_mask & AT_NODEID) {
+		i->number = (INODETYPE)cn.c_attr.va_nodeid;
+		i->number_def = 1;
+	    } else
+		i->number_def = 0;
+	    if (cn.c_attr.va_mask & AT_SIZE) {
+		i->size = cn.c_attr.va_size;
+		i->size_def = 1;
+	    } else
+		i->size_def = 0;
+	    return(0);
+	}
+#endif	/* defined(HAS_UW_CFS) */
+
+	else if (!strcmp(Fsinfo[fx-1], "s5"))
+	    return(reads5lino(v, i));
+ 	else if (!strcmp(Fsinfo[fx-1], "vxfs"))
+	    return(readvxfslino(v, i));
+ 	else if (!strcmp(Fsinfo[fx-1], "bfs"))
+	    return(readbfslino(v, i));
+
+#if	defined(HASXNAMNODE)
+	else if (!strcmp(Fsinfo[fx-1], "xnamfs")
+	     ||  !strcmp(Fsinfo[fx-1], "XENIX"))
+	{
+	    if (kread((KA_T)v->v_data, (char *)&xn, sizeof(xn)))
+		return(1);
+	    i->dev = xn.x_dev;
+	    i->nlink = (long)xn.x_count;
+	    i->nlink_def = 1;
+	    i->nm = (char *)NULL;
+	    i->rdev = xn.x_fsid;
+	    i->size = xn.x_size;
+	    return(0);
+	}
+#endif	/* defined(HASXNAMNODE) */
+
+	else if (!strcmp(Fsinfo[fx-1], "memfs")) {
+	    if (kread((KA_T)v->v_data, (char *)&mn, sizeof(mn)))
+		return(1);
+	    i->dev = mn.mno_fsid;
+	    i->dev_def = 1;
+	    i->nlink = (long)mn.mno_nlink;
+	    i->nlink_def = 1;
+	    i->nm = (char *)NULL;
+	    i->number = (INODETYPE)mn.mno_nodeid;
+	    i->number_def = 1;
+	    i->rdev = mn.mno_rdev;
+	    i->rdev = mn.mno_rdev;
+	    i->size = (SZOFFTYPE)mn.mno_size;
+	    i->size_def = 1;
+	    return(0);
+	}
+
+#if	UNIXWAREV>=70000
+	else if (!strcmp(Fsinfo[fx-1], "cdfs"))
+	    return readcdfslino(v, i);
+	else if (!strcmp(Fsinfo[fx-1], "dosfs"))
+	    return readdosfslino(v, i);
+#endif	/* UNIXWAREV>=70000 */
+
+	return(1);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dnode1.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode1.c
new file mode 100644
index 0000000..e87597b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode1.c
@@ -0,0 +1,94 @@
+/*
+ * dnode1.c - SCO UnixWare node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode1.c,v 1.6 2005/08/13 16:21:41 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	!defined(DYNAMIC_STACK_TRACE)
+#define	DYNAMIC_STACK_TRACE		/* suppress C's objection to a zero
+					 * length st_buffer[] element in the
+					 * stack_trace struct, defined in
+					 * <sys/percpu.h> */
+					 
+#endif	/* !defined(DYNAMIC_STACK_TRACE) */
+
+#undef	IFMT
+#undef	IFIFO
+#undef	IFCHR
+#undef	IFDIR
+#undef	IFNAM
+#undef	IFBLK
+#undef	IFREG
+#undef	IFLNK
+#undef	ISUID
+#undef	ISGID
+#undef	ISVTX
+#undef	IREAD
+#undef	IWRITE
+#undef	IEXEC
+#include <sys/fs/s5inode.h>
+
+
+/*
+ * reads5lino() - read s5 inode's local inode information
+ */
+
+int
+reads5lino(v, i)
+	struct vnode *v;		/* containing vnode */
+	struct l_ino *i;		/* local inode information */
+{
+	struct inode s5i;
+
+	if (kread((KA_T)v->v_data, (char *)&s5i, sizeof(s5i)))
+	    return(1);
+	i->dev = s5i.i_dev;
+	i->dev_def = 1;
+	i->rdev = s5i.i_rdev;
+	i->rdev_def = 1;
+	i->nlink = (long)s5i.i_nlink;
+	i->nlink_def = 1;
+	i->nm = (char *)NULL;
+	i->number = (INODETYPE)s5i.i_number;
+	i->number_def = 1;
+	i->size = s5i.i_size;
+	i->size_def = 1;
+	return(0);
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dnode2.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode2.c
new file mode 100644
index 0000000..e7c24f7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode2.c
@@ -0,0 +1,114 @@
+/*
+ * dnode2.c - SCO UnixWare node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode2.c,v 1.7 2005/08/13 16:21:41 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	defined(HASVXFS)
+
+# if	UNIXWAREV<70000
+#undef	fs_bsize
+#undef	IFMT
+#undef	IFIFO
+#undef	IFCHR
+#undef	IFDIR
+#undef	IFNAM
+#undef	IFBLK
+#undef	IFREG
+#undef	IFLNK
+#undef	ISUID
+#undef	ISGID
+#undef	ISVTX
+#undef	IREAD
+#undef	IWRITE
+#undef	IEXEC
+#include <sys/fs/vx_inode.h>
+# else	/* UNIXWAREV>=70000 */
+struct vx_inode{
+	unsigned long d1[28];
+	dev_t i_dev;
+	unsigned long i_number;
+	unsigned long d2[76];
+	unsigned long i_nlink;
+	unsigned long d3[2];
+	unsigned long long i_size;
+	unsigned long d4[8];
+	dev_t i_rdev;
+};
+# endif	/* UNIXWAREV<70000 */
+#endif	/* defined(HASVXFS) */
+
+
+/*
+ * readvxfslino() - read vxfs inode's local inode information
+ */
+
+int
+readvxfslino(v, i)
+	struct vnode *v;		/* containing vnode */
+	struct l_ino *i;		/* local inode information */
+{
+
+#if	defined(HASVXFS)
+	struct vx_inode vx;
+
+	if (kread((KA_T)v->v_data, (char *)&vx, sizeof(vx)))
+	    return(1);
+	i->dev = vx.i_dev;
+	i->dev_def = 1;
+	i->nlink = (long)vx.i_nlink;
+	i->nlink_def = 1;
+	i->nm = (char *)NULL;
+	i->number = (INODETYPE)vx.i_number;
+	i->number_def = 1;
+	if (v->v_type == VCHR) {
+	    i->rdev = vx.i_rdev;
+	    i->rdev_def = 1;
+	} else {
+	    i->rdev = (dev_t)0;
+	    i->rdev_def = 0;
+	}
+	i->size = (SZOFFTYPE)vx.i_size;
+	i->size_def = 1;
+	return(0);
+#else	/* !defined(HASVXFS) */
+	return(1);
+#endif	/* defined(HASVXFS) */
+
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dnode3.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode3.c
new file mode 100644
index 0000000..8e5d979
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dnode3.c
@@ -0,0 +1,271 @@
+/*
+ * dnode2.c - SCO UnixWare node functions for lsof
+ *
+ * This module must be separate to keep separate the multiple kernel inode
+ * structure definitions.
+ */
+
+/*
+ * Copyright 1998 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dnode3.c,v 1.5 2005/08/13 16:21:41 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#include <sys/fs/bfs.h>
+
+#if	UNIXWAREV>=7000
+# if	UNIXWAREV>=70103
+#undef	IEXEC
+#undef	IREAD
+#undef	IWRITE
+# endif	/* UNIXWAREV>=70103 */
+#undef	ISUID
+#undef	ISGID
+#undef	ISVTX
+#include <sys/fs/cdfs_fs.h>
+#endif	/* UNIXWAREV>=7000 */
+
+
+/*
+ * Local definitions
+ */
+
+#define	DOS_NAME_PFX	"(DOS name: "
+#define	DOS_NAME_SFX	")"
+
+#if	UNIXWAREV>=7000 && !defined(TYPELOGSECSHIFT)
+#define	TYPELOGSECSHIFT	uint_t		/* just in case Configure missed it */
+#endif	/* UNIXWAREV>=7000 && !defined(TYPELOGSECSHIFT) */
+
+
+/*
+ * Local static variables
+ */
+
+static unsigned char Dos2Unix[] = {	/* derived from tounix[] in
+					 * /etc/conf/pack.d/ccnv/space.c */
+    '_', '_', '_', '_', '_', '_', '_', '_',		/* 0x01-0x08 */
+    '_', '_', '_', '_', '_', '_', '_', '_',		/* 0x09-0x10 */
+    '_', '_', '_', '_', '_', '_', '_', '_',		/* 0x11-0x18 */
+    '_', '_', '_', '_', '_', '_', '_', ' ',		/* 0x19-0x20 */
+    '!', '"', '#', '$', '%', '&', '\'', '(',		/* 0x21-0x28 */
+    ')', '*', '+', ',', '-', '.', '/', '0',		/* 0x29-0x30 */
+    '1', '2', '3', '4', '5', '6', '7', '8',		/* 0x31-0x38 */
+    '9', ':', ';', '<', '=', '>', '?', '@',		/* 0x39-0x40 */
+    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',		/* 0x41-0x48 */
+    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',		/* 0x49-0x50 */
+    'q', 'r', 's', 't', 'u', 'v', 'w', 'x',		/* 0x51-0x58 */
+    'y', 'z', '[', '\\', ']', '^', '_', '`',		/* 0x59-0x60 */
+    'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',		/* 0x61-0x68 */
+    'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p',		/* 0x69-0x70 */
+    'q', 'r', 's', 't', 'u', 'v', 'w', 'x',		/* 0x71-0x78 */
+    'y', 'z', '{', '|', '}', '~', '_', 0347,		/* 0x79-0x80 */
+    0374, 0351, 0342, 0344, 0340, 0345, 0347, 0352,	/* 0x81-0x88 */
+    0353, 0350, 0357, 0356, 0354, 0344, 0345, 0351,	/* 0x89-0x90 */
+    0346, 0346, 0364, 0366, 0362, 0373, 0371, 0377,	/* 0X91-0X98 */
+    0366, 0374, 0370, 0243, 0370, 0367, '_',  0341,	/* 0x99-0xa0 */
+    0355, 0363, 0372, 0361, 0361, 0252, 0272, 0277,	/* 0xa1-0xa8 */
+    0256, 0254, 0275, 0274, 0241, 0253, 0273, '_',	/* 0xa9-0xb0 */
+    '_',  '_',  '_',  '_',  0341, 0342, 0340, 0251,	/* 0xb1-0xb8 */
+    '_',  '_',  '_',  '_',  0242, 0245, '_',  '_',	/* 0xb9-0xc0 */
+    '_',  '_',  '_',  '_',  '_',  0343, 0343, '_',	/* 0xc1-0xc8 */
+    '_',  '_',  '_',  '_',  '_',  '_',  0244, 0360,	/* 0xc9-0xd0 */
+    0320, 0352, 0353, 0350, '_',  0355, 0356, 0357,	/* 0xd1-0xd8 */
+    '_',  '_',  '_',  '_',  0246, 0354, '_',  0363,	/* 0xd9-0xe0 */
+    0337, 0364, 0362, 0365, 0365, 0265, 0376, 0376,	/* 0xe1-0xe8 */
+    0372, 0373, 0371, 0375, 0375, 0257, 0264, 0255,	/* 0xe9-0xf0 */
+    0261, '_',  0276, 0266, 0247, 0327, 0270, 0260,	/* 0xf1-0xf8 */
+    0250, 0267, 0271, 0263, 0262, '_',  '_'		/* 0xf9-0xff */
+};
+
+
+
+/*
+ * readbfslino() - read bfs inode's local inode information
+ */
+
+int
+readbfslino(v, i)
+	struct vnode *v;		/* containing vnode */
+	struct l_ino *i;		/* local inode information */
+{
+	struct inode b;
+	struct vfs kv;
+
+	if (kread((KA_T)v->v_data, (char *)&b, sizeof(b)))
+	    return(1);
+	if (!v->v_vfsp || kread((KA_T)v->v_vfsp, (char *)&kv, sizeof(kv)))
+	    return(1);
+	i->dev = kv.vfs_dev;
+	i->dev_def = 1;
+	i->rdev = (dev_t)0;
+	i->rdev_def = 0;
+	i->nlink = (long)b.i_diskino.d_fattr.va_nlink;
+	i->nlink_def = 1;
+	i->nm = (char *)NULL;
+	i->number = (INODETYPE)b.i_diskino.d_ino;
+	i->number_def = 1;
+	i->size = (SZOFFTYPE)BFS_FILESIZE(&b.i_diskino);
+	i->size_def = 1;
+	return(0);
+}
+
+
+#if	UNIXWAREV>=7000
+/*
+ * reacdfslino() - read cdfs inode's local inode information
+ *
+ * Adapted from work by Eric Dumazet <edumazet@cosmosbay.com>.
+ */
+
+int
+readcdfslino(v, i)
+	struct vnode *v;		/* containing vnode */
+	struct l_ino *i;		/* local inode information */
+{
+	cdfs_inode_t ci;
+	TYPELOGSECSHIFT lss;
+	KA_T ka;
+	struct vfs kv;
+/*
+ * Read the CDFs node.  Fill in return values from its contents.
+ */
+	if (!v->v_data || kread((KA_T)v->v_data, (char *)&ci, sizeof(ci)))
+	    return(1);
+	if (!v->v_vfsp || kread((KA_T)v->v_vfsp, (char *)&kv, sizeof(kv)))
+	    return(1);
+	i->dev = kv.vfs_dev;
+	i->dev_def = 1;
+	i->rdev = ci.i_DevNum;
+	i->rdev_def = 1;
+	i->nlink = (long)ci.i_LinkCnt;
+	i->nlink_def = 1;
+	i->nm = (char *)NULL;
+	i->size = (SZOFFTYPE)ci.i_Size;
+	i->size_def = 1;
+/*
+ * Compute the node number.
+ *
+ * (See the CDFS_INUM() macro in <sys/fs/cdfs_inode.h>.)
+ *
+ * It's too wasteful to read the entire cdfs structure for one element,
+ * cdfs_LogSecShift, so it's read specially.  Its type, TYPELOGSECSHIFT,
+ * should be defined by lsof's Configure script, but for safety's sake
+ * has a uint_t default, defined in this source file.
+ */
+	i->number = (INODETYPE)0;
+	if (!(ka = (KA_T)kv.vfs_data))
+	    return(0);
+	ka = (KA_T)((char *)ka + offsetof(struct cdfs, cdfs_LogSecShift));
+	if (!kread(ka, (char *)&lss, sizeof(lss))) {
+	    i->number = (INODETYPE)((ci.i_Fid.fid_SectNum << lss)
+		      + ci.i_Fid.fid_Offset);
+	    i->number_def = 1;
+	}
+	return(0);
+}
+
+
+/*
+ * readdosfslino() - read dosfs inode's local inode information
+ *
+ * Adapted from work by Eric Dumazet <edumazet@cosmosbay.com>.
+ */
+
+
+int
+readdosfslino(v, i)
+	struct vnode *v;		/* containing vnode */
+	struct l_ino *i;		/* local inode information */
+{
+	struct dosfs_inode {
+	    int pad1[19];
+	    int device;
+	    int pad2[21];
+	    long offset;
+	    long dirnum;
+	    int pad3[3];
+	    unsigned char name[16];
+	    int pad4[3];
+	    unsigned long size;
+	} di;
+	static char *nm = (char *)NULL;
+	static MALLOC_S nml = (MALLOC_S)0;
+	int sz;
+/*
+ * Read the DOSFS node.  Fill in return values from its contents.
+ */
+	if (!v->v_data || kread((KA_T)v->v_data, (char *)&di, sizeof(di)))
+	    return(1);
+	i->dev = (dev_t)di.device;
+	i->dev_def = 1;
+	i->rdev = (dev_t)0;
+	i->rdev_def = 1;
+	i->nlink_def = 0;
+	i->size = (SZOFFTYPE)di.size;
+	i->size_def = 1;
+/*
+ * Allocate space for and save the name, prepared as a name column addition.
+ */
+	i->nm = (char *)NULL;
+	if (di.name[0]) {
+	    if (!nm) {
+		nml = (MALLOC_S)(strlen(DOS_NAME_PFX) + sizeof(di.name)
+		    +  strlen(DOS_NAME_SFX) + 1);
+		if (!(nm = (char *)malloc(nml))) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d bytes for DOS name\n", nml, Pn);
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Calculate the DOS name length and convert DOS to UNIX characters.
+	 */
+	    for (sz = 0; sz < sizeof(di.name); sz++) {
+		if (!di.name[sz])
+		    break;
+		di.name[sz] = Dos2Unix[(di.name[sz] & 0xff) - 1];
+	    }
+	    if (sz) {
+		(void) snpf(nm, nml, "%s%-*.*s%s", DOS_NAME_PFX, sz, sz,
+		    di.name, DOS_NAME_SFX);
+		i->nm = nm;
+	    }
+	}
+/*
+ * Compute the node number.
+ */
+	i->number = (INODETYPE)((di.dirnum << 16) + di.offset);
+	i->number_def = 1;
+	return(0);
+}
+#endif	/* UNIXWAREV>=7000 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dproc.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dproc.c
new file mode 100644
index 0000000..0a48d28
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dproc.c
@@ -0,0 +1,650 @@
+/*
+ * dproc.c - SCO UnixWare process access functions for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dproc.c,v 1.14 2002/10/08 20:18:34 abe Exp $";
+#endif
+
+#include "lsof.h"
+
+
+/*
+ * Local static values
+ */
+
+static int Np;				/* occupied P[] count */
+static int Npa = 0;			/* allocated P[] count */
+static struct proc *P = (struct proc *)NULL;
+					/* proc table */
+static KA_T Pract;			/* kernel's practive address */
+static KA_T Sgdnops;			/* kernel's segdev_ops address */
+static KA_T Sgvnops;			/* kernel's segvn_ops address */
+static struct var Var;			/* kernel variables */
+
+
+/*
+ * Local definitions
+ */
+
+#define	PROCINCR	32		/* increment for increasing P[] */
+
+
+/*
+ * Local function prototypes.
+ */
+
+_PROTOTYPE(static int get_clonemaj,(void));
+_PROTOTYPE(static void read_proc,(void));
+_PROTOTYPE(static void get_kernel_access,(void));
+_PROTOTYPE(static void readfsinfo,(void));
+_PROTOTYPE(static void process_text,(KA_T pa));
+
+
+/*
+ * gather_proc_info() -- gather process information
+ */
+
+void
+gather_proc_info()
+{
+	struct cred cr;
+	struct execinfo ex;
+	static struct fd_entry *fe;
+	struct fd_entry *f;
+	KA_T fa;
+	int i, nf;
+	MALLOC_S len;
+	static int nfea = 0;
+	struct proc *p;
+	int pgid, pid, px;
+	struct pid pids;
+	short pss, sf;
+	uid_t uid;
+
+#if	UNIXWAREV>=70103
+	struct pollx plx;
+#endif	/* UNIXWAREV>=70103 */
+
+/*
+ * Examine proc structures and their associated information.
+ */
+	(void) read_proc();
+	for (p = P, px = 0; px < Np; p++, px++) {
+	    if ((p->p_flag & P_DESTROY) || (p->p_flag & P_GONE)
+	    ||  !p->p_pidp
+
+#if	!defined(HAS_P_PGID)
+	    || !p->p_pgidp
+#endif	/* !defined(HAS_P_PGID) */
+
+	    || !p->p_cred || !p->p_execinfo)
+		continue;
+	/*
+	 * Get Process ID, Process group ID, and User ID.
+	 */
+	    if (!p->p_pidp
+	    ||  kread((KA_T)p->p_pidp, (char *)&pids, sizeof(pids)))
+		continue;
+	    pid = (int)pids.pid_id;
+
+#if	defined(HAS_P_PGID)
+	    pgid = (int)p->p_pgid;
+#else	/* !defined(HAS_P_PGID) */
+	    if (!p->p_pgidp
+	    ||  kread((KA_T)p->p_pgidp, (char *)&pids, sizeof(pids)))
+		continue;
+	    pgid = (int)pids.pid_id;
+#endif	/* defined(HAS_P_PGID) */
+
+	    if (!p->p_cred
+	    ||  kread((KA_T)p->p_cred, (char *)&cr, sizeof(cr)))
+		continue;
+	    uid = cr.cr_uid;
+	    if (is_proc_excl(pid, pgid, (UID_ARG)uid, &pss, &sf))
+		continue;
+	/*
+	 * Get the execution information -- for the command name.
+	 */
+	    if (!p->p_execinfo
+	    ||  kread((KA_T)p->p_execinfo, (char *)&ex, sizeof(ex)))
+		continue;
+	/*
+	 * Allocate a local process structure.
+	 */
+	    if (is_cmd_excl(ex.ei_comm, &pss, &sf))
+		continue;
+	    alloc_lproc(pid, pgid, (int)p->p_ppid, (UID_ARG)uid, ex.ei_comm,
+		(int)pss, (int)sf);
+	    Plf = NULL;
+	/*
+	 * Save current working directory information.
+	 */
+	    if (p->p_cdir) {
+		alloc_lfile(CWD, -1);
+		process_node((KA_T)p->p_cdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Save root directory information.
+	 */
+	    if (p->p_rdir) {
+		alloc_lfile(RTD, -1);
+		process_node((KA_T)p->p_rdir);
+		if (Lf->sf)
+		    link_lfile();
+	    }
+	/*
+	 * Print information on the text file.
+	 */
+	    if (Sgvnops && p->p_as)
+		process_text((KA_T)p->p_as);
+	/*
+	 * Save information on file descriptors.
+	 */
+	    if (!p->p_fdtab.fdt_entrytab || (nf = p->p_fdtab.fdt_sizeused) < 1)
+		continue;
+	    len = (MALLOC_S)(nf * sizeof(struct fd_entry));
+	    if (nf > nfea) {
+		if (fe)
+		    fe = (struct fd_entry *)realloc((MALLOC_P *)fe, len);
+		else
+		    fe = (struct fd_entry *)malloc(len);
+		if (!fe) {
+		    (void) fprintf(stderr,
+			"%s: PID %d; no space for %d file descriptors\n",
+			Pn, pid, nf);
+		    Exit(1);
+		}
+		nfea = nf;
+	    }
+	    if (kread((KA_T)p->p_fdtab.fdt_entrytab, (char *)fe, len))
+		continue;
+	    for (f = fe, i = 0; i < nf; f++, i++) {
+		if ((fa = (KA_T)f->fd_file) && (f->fd_status & FD_INUSE)) {
+
+#if	UNIXWAREV>=70103
+		    if (f->fd_flag & FPOLLED) {
+			if (kread(fa, (char *)&plx, sizeof(plx))
+			||  !(fa = (KA_T)plx.px_fp))
+			    continue;
+		    }
+#endif	/* UNIXWAREV>=70103 */
+
+		    alloc_lfile(NULL, i);
+		    process_file(fa);
+		    if (Lf->sf) {
+
+#if	defined(HASFSTRUCT)
+			if (Fsv & FSV_FG)
+			    Lf->pof = (long)f->fd_flag;
+#endif	/* defined(HASFSTRUCT) */
+
+			link_lfile();
+		    }
+		}
+	    }
+	/*
+	 * Examine results.
+	 */
+	    if (examine_lproc())
+		return;
+	}
+}
+
+
+/*
+ * get_clonemaj() - get clone major device number
+ */
+
+static int
+get_clonemaj()
+{
+	KA_T v;
+
+#if	UNIXWAREV<70000
+	char buf[32];
+	struct cdevsw *c, *cd;
+	int i, sz;
+	MALLOC_S len;
+	int rv = 0;
+/*
+ * Read the cdevsw[] size and allocate temporary space for it.
+ */
+	if (get_Nl_value("ncdev", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&sz, sizeof(sz)) || !sz)
+	    return(rv);
+	len = (MALLOC_S)(sz * sizeof(struct cdevsw));
+	if (!(cd = (struct cdevsw *)malloc(len))) {
+	    (void) fprintf(stderr, "%s: can't allocate %d bytes for cdevsw\n",
+		Pn);
+	    Exit(1);
+	}
+/*
+ * Read the cdevsw[] from kernel memory.
+ */
+	if (get_Nl_value("cdev", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)cd, (int)len)) {
+	    (void) free((MALLOC_P *)cd);
+	    return(rv);
+	}
+/*
+ * Scan the cdevsw[], reading it's names, looking for "clone".
+ * Record its cdevsw[] index (i.e., major device number).
+ */
+	len = sizeof(buf) - 1;
+	buf[len] = '\0';
+	for (c = cd, i = 0; i < sz; c++, i++) {
+	    if (!c->d_name
+	    ||  kread((KA_T)c->d_name, buf, len)
+	    ||  strcmp(buf, "clone") != 0)
+		continue;
+	    CloneMaj = i;
+	    HaveCloneMaj = rv = 1;
+	    break;
+	}
+	(void) free((MALLOC_P *)cd);
+	return(rv);
+#else	/* UNIXWAREV>=70000 */
+/*
+ * At UnixWare 7 the clone major device is found in the kernel's
+ * clonemajor variable.
+ */
+	if (get_Nl_value("cmaj", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&CloneMaj, sizeof(CloneMaj)))
+	    return(0);
+	return((HaveCloneMaj = 1));
+#endif	/* UNIXWAREV<70000 */
+
+}
+
+
+/*
+ * get_kernel_access() - get access to kernel memory
+ */
+
+static void
+get_kernel_access()
+{
+	KA_T v;
+/*
+ * Check kernel version.
+ */
+	(void) ckkv("UW", (char *)NULL, LSOF_VSTR, (char *)NULL);
+
+#if	defined(WILLDROPGID)
+/*
+ * If kernel memory isn't coming from KMEM, drop setgid permission
+ * before attempting to open the (Memory) file.
+ */
+	if (Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the non-KMEM memory file is readable.
+ */
+	if (Memory && !is_readable(Memory, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Open kernel memory access.
+ */
+	if ((Kd = open(Memory ? Memory : KMEM, O_RDONLY, 0)) < 0) {
+	    (void) fprintf(stderr, "%s: can't open %s: %s\n", Pn,
+		Memory ? Memory : KMEM, strerror(errno));
+	    Exit(1);
+	}
+
+#if	defined(WILLDROPGID)
+/*
+ * Drop setgid permission, if necessary.
+ */
+	if (!Memory)
+	    (void) dropgid();
+#else	/* !defined(WILLDROPGID) */
+/*
+ * See if the name list file is readable.
+ */
+	if (Nmlst && !is_readable(Nmlst, 1))
+	    Exit(1);
+#endif	/* defined(WILLDROPGID) */
+
+/*
+ * Access kernel symbols and values.
+ */
+	(void) build_Nl(Drive_Nl);
+        if (nlist(Nmlst ? Nmlst : N_UNIX, Nl) < 0) {
+	    (void) fprintf(stderr, "%s: can't read kernel name list from %s\n",
+		Pn, Nmlst ? Nmlst : N_UNIX);
+	    Exit(1);
+	}
+	if (get_Nl_value("var", Drive_Nl, &v) < 0 || !v
+	||  kread((KA_T)v, (char *)&Var, sizeof(Var))) {
+	    (void) fprintf(stderr,
+		"%s: can't read system configuration info\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("proc", Drive_Nl, &Pract) < 0 || !Pract) {
+	    (void) fprintf(stderr,
+		"%s: can't find active process chain pointer\n", Pn);
+	    Exit(1);
+	}
+	if (get_Nl_value("sgdnops", Drive_Nl, &Sgdnops) < 0 || !Sgdnops)
+	    Sgdnops = (unsigned long)0;
+	if (get_Nl_value("sgvnops", Drive_Nl, &Sgvnops) < 0 || !Sgvnops)
+	    Sgvnops = (unsigned long)0;
+/*
+ * Identify the clone major device number.
+ */
+	if (!get_clonemaj()) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING; can't identify major clone device number\n",
+		    Pn);
+	}
+}
+
+
+/*
+ * initialize() - perform all initialization
+ */
+
+void
+initialize()
+{
+	get_kernel_access();
+	readfsinfo();
+}
+
+
+/*
+ * kread() - read from kernel memory
+ */
+
+int
+kread(addr, buf, len)
+	KA_T addr;			/* kernel memory address */
+	char *buf;			/* buffer to receive data */
+	READLEN_T len;			/* length to read */
+{
+	READLEN_T br;
+
+#if	UNIXWAREV<7000
+	if (lseek(Kd, (long)addr, L_SET) == (long)-1L)
+		return(-1);
+	br = (READLEN_T) read(Kd, buf, len);
+#else	/* UNIXWAREV>=7000 */
+	br = (READLEN_T) pread(Kd, buf, len, (off_t)addr);
+#endif	/* UNIXWAREV<7000 */
+
+	return((br == len) ? 0 : 1);
+}
+
+
+/*
+ * process_text() - process text access information
+ */
+
+static void
+process_text(pa)
+	KA_T pa;			/* kernel address space description
+					 * pointer */
+{
+	struct as as;
+	struct segdev_data dv;
+	char *fd;
+	int i, j, k, l;
+	struct seg s;
+	KA_T v[MAXSEGS];
+	struct segvn_data vn;
+	KA_T vp;
+/*
+ * Get address space description.
+ */
+	if (kread(pa, (char *)&as, sizeof(as)))
+	    return;
+/*
+ * Loop through the segments.  The loop should stop when the segment
+ * pointer returns to its starting point, but just in case, it's stopped
+ * when MAXSEGS have been recorded or 2*MAXSEGS have been examined.
+ */
+	s.s_next = as.a_segs;
+	for (i = j = k = 0; i < MAXSEGS && j < 2*MAXSEGS; j++) {
+	    if (!s.s_next || kread((KA_T)s.s_next, (char *)&s, sizeof(s)))
+		break;
+	    fd = (char *)NULL;
+	    vp = (KA_T)NULL;
+	    if (Sgvnops == (KA_T)s.s_ops && s.s_data) {
+
+	    /*
+	     * Process a virtual node segment.
+	     */
+		if (kread((KA_T)s.s_data, (char *)&vn, sizeof(vn)))
+		    break;
+		if ((vp = (KA_T)vn.svd_vp)) {
+		    if ((vn.svd_flags & SEGVN_PGPROT)
+		    ||  (vn.svd_prot & PROT_EXEC))
+			fd = " txt";
+		    else
+			fd = " mem";
+		}
+	    } else if (Sgdnops == (KA_T)s.s_ops && s.s_data) {
+
+	    /*
+	     * Process a special device segment.
+	     */
+		if (kread((KA_T)s.s_data, (char *)&dv, sizeof(dv)))
+		    break;
+		if ((vp = (KA_T)dv.vp))
+		    fd = "mmap";
+	    }
+	    if (fd && vp) {
+
+	    /*
+	     * Process the vnode pointer.  First make sure it's unique.
+	     */
+		for (l = 0; l < k; l++) {
+		    if (v[l] == vp)
+			break;
+		}
+		if (l >= k) {
+		    alloc_lfile(fd, -1);
+		    process_node(vp);
+		    if (Lf->sf) {
+			link_lfile();
+			i++;
+		    }
+		}
+		v[k++] = vp;
+	    }
+	/*
+	 * Follow the segment link to the starting point in the address
+	 * space description.  (The i and j counters place an absolute
+	 * limit on the loop.)
+	 */
+	    if (s.s_next == as.a_segs)
+		break;
+	}
+}
+
+
+/*
+ * readfsinfo() - read file system information
+ */
+
+static void
+readfsinfo()
+{
+	char buf[FSTYPSZ+1];
+	int i, len;
+
+	if ((Fsinfomax = sysfs(GETNFSTYP)) == -1) {
+	    (void) fprintf(stderr, "%s: sysfs(GETNFSTYP) error: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	} 
+	if (Fsinfomax == 0)
+	    return;
+	if (!(Fsinfo = (char **)malloc((MALLOC_S)(Fsinfomax * sizeof(char *)))))
+	{
+	    (void) fprintf(stderr, "%s: no space for sysfs info\n", Pn);
+	    Exit(1);
+	}
+	for (i = 1; i <= Fsinfomax; i++) {
+	    if (sysfs(GETFSTYP, i, buf) == -1) {
+		(void) fprintf(stderr, "%s: sysfs(GETFSTYP) error: %s\n",
+		    Pn, strerror(errno));
+		Exit(1);
+	    }
+	    buf[FSTYPSZ] = '\0';
+	    len = strlen(buf) + 1;
+	    if (!(Fsinfo[i-1] = (char *)malloc((MALLOC_S)len))) {
+		(void) fprintf(stderr,
+		    "%s: no space for file system entry %s\n", Pn, buf);
+		Exit(1);
+	    }
+	    (void) snpf(Fsinfo[i-1], len, "%s", buf);
+	}
+}
+
+
+/*
+ * read_proc() - read the process table
+ */
+
+static void
+read_proc()
+{
+	MALLOC_S len;
+	struct proc *p;
+	KA_T pa;
+	char tbuf[32];
+	int try;
+
+	if (!P) {
+
+	/*
+	 * Allocate initial space for local proc table.
+	 */
+	    if ((Npa = Var.v_proc) < 1) {
+		(void) fprintf(stderr, "%s: bad proc table size: %d\n",
+		    Pn, Var.v_proc);
+		Exit(1);
+	    }
+	    Npa += PROCINCR;
+	    len = (MALLOC_S)(Npa * sizeof(struct proc));
+	    if (!(P = (struct proc *)malloc(len))) {
+		(void) fprintf(stderr, "%s: no space for %d proc structures\n",
+		    Pn, Npa);
+		Exit(1);
+	    }
+	}
+/*
+ * Scan the active process chain.
+ */
+	for (try = 0; try < PROCTRYLM; try++) {
+
+	/*
+	 * Read the active process chain head.
+	 */
+	    pa = (KA_T)NULL;
+	    if (!Pract || kread((KA_T)Pract, (char *)&pa, sizeof(pa)) || !pa) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: active proc chain ptr err; addr=%s, val=%s\n",
+			Pn, print_kptr(Pract, tbuf, sizeof(tbuf)),
+			print_kptr(pa, (char *)NULL, 0));
+		continue;
+	    }
+	/*
+	 * Follow the active process chain, accumulating proc structures.
+	 */
+	    for (Np = 0, p = P; pa;) {
+		if (Np >= Npa) {
+
+		/*
+		 * Allocate more proc table space.
+		 */
+		    Npa += PROCINCR;
+		    len = (MALLOC_S)(Npa * sizeof(struct proc));
+		    if (!(P = (struct proc *)realloc((MALLOC_P *)P, len))) {
+			(void) fprintf(stderr,
+			    "%s: can't realloc %d proc table entries (%d)\n",
+			    Pn, Npa, len);
+			Exit(1);
+		    }
+		    p = &P[Np];
+		}
+		if (kread(pa, (char *)p, sizeof(struct proc)))
+		    break;
+		pa = (KA_T)p->p_next;
+		if ((p->p_flag & P_DESTROY) || (p->p_flag & P_GONE)
+		||  !p->p_pidp
+
+#if	!defined(HAS_P_PGID)
+		|| !p->p_pgidp
+#endif	/* !defined(HAS_P_PGID) */
+
+		|| !p->p_cred || !p->p_execinfo)
+		    continue;
+		Np++;
+		p++;
+	    }
+	/*
+	 * See if enough processes were accumulated.
+	 */
+	    if (Np >= PROCMIN)
+		break;
+	}
+/*
+ * Quit if not enough proc structures could be collected.
+ */
+	if (try >= PROCTRYLM) {
+	    (void) fprintf(stderr, "%s: can't read proc table\n", Pn);
+	    Exit(1);
+	}
+	if (Np < Npa && !RptTm) {
+
+	/*
+	 * If not repeating, reduce the local proc table size to a minimum.
+	 */
+	    len = (MALLOC_S)(Np * sizeof(struct proc));
+	    if (!(P = (struct proc *)realloc((MALLOC_P *)P, len))) {
+		(void) fprintf(stderr,
+		    "%s: can't reduce proc table to %d entries\n", Pn, Np);
+		Exit(1);
+	    }
+	    Npa = Np;
+	}
+}
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dproto.h b/lsof_4.85/lsof_4.85_src/dialects/uw/dproto.h
new file mode 100644
index 0000000..491fe60
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dproto.h
@@ -0,0 +1,49 @@
+/*
+ * dproto.h - SCO UnixWare function prototypes for lsof
+ *
+ * The _PROTOTYPE macro is defined in the common proto.h.
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+
+
+_PROTOTYPE(extern int get_max_fd,(void));
+_PROTOTYPE(extern int is_file_named,(char *p, int cd));
+_PROTOTYPE(extern void process_socket,(char *pr, struct queue *q));
+_PROTOTYPE(extern int readbfslino,(struct vnode *v, struct l_ino *i));
+_PROTOTYPE(extern int readcdfslino,(struct vnode *v, struct l_ino *i));
+_PROTOTYPE(extern int readdosfslino,(struct vnode *v, struct l_ino *i));
+_PROTOTYPE(extern int reads5lino,(struct vnode *v, struct l_ino *i));
+_PROTOTYPE(extern int readvxfslino,(struct vnode *v, struct l_ino *i));
+_PROTOTYPE(extern int strcasecmp,(char *s1, char *s2));
+_PROTOTYPE(extern int strncasecmp,(char *s1, char *s2, int n));
+
+#if	UNIXWAREV>=70101
+_PROTOTYPE(extern int process_unix_sockstr,(struct vnode *v, KA_T na));
+#endif	/* UNIXWAREV>=70101 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dsock.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dsock.c
new file mode 100644
index 0000000..accdb62
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dsock.c
@@ -0,0 +1,1197 @@
+/*
+ * dsock.c - SCO UnixWare socket processing functions for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dsock.c,v 1.16 2005/08/13 16:21:41 abe Exp $";
+#endif
+
+
+#define	TCPSTATES		/* activate tcpstates[] */
+#include "lsof.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+#if	UNIXWAREV>=70101 && UNIXWAREV<70103
+_PROTOTYPE(static struct sockaddr_un *find_unix_sockaddr_un,(KA_T ka));
+#endif	/* UNIXWAREV>=70101 && UNIXWAREV<70103 */
+
+
+/*
+ * print_tcptpi() - print TCP/TPI info
+ */
+
+void
+print_tcptpi(nl)
+	int nl;				/* 1 == '\n' required */
+{
+	char buf[128];
+	char *cp = (char *)NULL;
+	int ps = 0;
+	int s;
+
+	if (Ftcptpi & TCPTPI_STATE) {
+	    s = Lf->lts.state.i;
+	    switch (Lf->lts.type) {
+	    case 0:
+		if (s < 0 || s >= TCP_NSTATES) {
+		    (void) snpf(buf, sizeof(buf), "UNKNOWN_TCP_STATE_%d", s);
+		    cp = buf;
+		} else
+		    cp = tcpstates[s];
+		break;
+	    case 1:
+		switch (s) {
+		case TS_UNBND:
+		    cp = "TS_UNBND";
+		    break;
+		case TS_WACK_BREQ:
+		    cp = "TS_WACK_BREQ";
+		    break;
+		case TS_WACK_UREQ:
+		    cp = "TS_WACK_UREQ";
+		    break;
+		case TS_IDLE:
+		    cp = "TS_IDLE";
+		    break;
+		case TS_WACK_OPTREQ:
+		    cp = "TS_WACK_OPTREQ";
+		    break;
+		case TS_WACK_CREQ:
+		    cp = "TS_WACK_CREQ";
+		    break;
+		case TS_WCON_CREQ:
+		    cp = "TS_WCON_CREQ";
+		    break;
+		case TS_WRES_CIND:
+		    cp = "TS_WRES_CIND";
+		    break;
+		case TS_WACK_CRES:
+		    cp = "TS_WACK_CRES";
+		    break;
+		case TS_DATA_XFER:
+		    cp = "TS_DATA_XFER";
+		    break;
+		case TS_WIND_ORDREL:
+		    cp = "TS_WIND_ORDREL";
+		    break;
+		case TS_WREQ_ORDREL:
+		    cp = "TS_WREQ_ORDREL";
+		    break;
+		case TS_WACK_DREQ6:
+		    cp = "TS_WACK_DREQ6";
+		    break;
+		case TS_WACK_DREQ7:
+		    cp = "TS_WACK_DREQ7";
+		    break;
+		case TS_WACK_DREQ9:
+		    cp = "TS_WACK_DREQ9";
+		    break;
+		case TS_WACK_DREQ10:
+		    cp = "TS_WACK_DREQ10";
+		    break;
+		case TS_WACK_DREQ11:
+		    cp = "TS_WACK_DREQ11";
+		    break;
+		default:
+		    (void) snpf(buf, sizeof(buf), "UNKNOWN_TPI_STATE_%d", s);
+		    cp = buf;
+		}
+	    }
+	    if (cp) {
+		if (Ffield)
+		    (void) printf("%cST=%s%c", LSOF_FID_TCPTPI, cp, Terminator);
+		else {
+		    putchar('(');
+		    (void) fputs(cp, stdout);
+		}
+		ps++;
+	    }
+	}
+
+# if	defined(HASTCPTPIQ)
+	if (Ftcptpi & TCPTPI_QUEUES) {
+	    if (Lf->lts.rqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QR=%lu", Lf->lts.rq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.sqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QS=%lu", Lf->lts.sq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+# endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int opt;
+
+	    if ((opt = Lf->lts.opt)
+	    ||  Lf->lts.pqlens || Lf->lts.qlens || Lf->lts.qlims
+	    ||  Lf->lts.rbszs  || Lf->lts.sbsz
+	    ) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSO", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(SO_ACCEPTCONN)
+		if (opt & SO_ACCEPTCONN) {
+		    (void) printf("%cACCEPTCONN", sep);
+		    opt &= ~SO_ACCEPTCONN;
+		    sep = ',';
+		}
+# endif	/* defined(SO_ACCEPTCONN) */
+
+# if	defined(SO_BROADCAST)
+		if (opt & SO_BROADCAST) {
+		    (void) printf("%cBROADCAST", sep);
+		    opt &= ~SO_BROADCAST;
+		    sep = ',';
+		}
+# endif	/* defined(SO_BROADCAST) */
+
+# if	defined(SO_DEBUG)
+		if (opt & SO_DEBUG) {
+		    (void) printf("%cDEBUG", sep);
+		    opt &= ~ SO_DEBUG;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DEBUG) */
+
+# if	defined(SO_DONTROUTE)
+		if (opt & SO_DONTROUTE) {
+		    (void) printf("%cDONTROUTE", sep);
+		    opt &= ~SO_DONTROUTE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DONTROUTE) */
+
+# if	defined(SO_IMASOCKET)
+		if (opt & SO_IMASOCKET) {
+		    (void) printf("%cIMASOCKET", sep);
+		    opt &= ~SO_IMASOCKET;
+		    sep = ',';
+		}
+# endif	/* defined(SO_IMASOCKET) */
+
+# if	defined(SO_KEEPALIVE)
+		if (opt & SO_KEEPALIVE) {
+		    (void) printf("%cKEEPALIVE", sep);
+		    opt &= ~SO_KEEPALIVE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_KEEPALIVE) */
+
+# if	defined(SO_LINGER)
+		if (opt & SO_LINGER) {
+		    (void) printf("%cLINGER", sep);
+		    if (Lf->lts.ltm)
+			(void) printf("=%d", Lf->lts.ltm);
+		    opt &= ~SO_LINGER;
+		    sep = ',';
+		}
+# endif	/* defined(SO_LINGER) */
+
+# if	defined(SO_LISTENING)
+		if (opt & SO_LISTENING) {
+		    (void) printf("%cLISTENING", sep);
+		    opt &= ~SO_LISTENING;
+		    sep = ',';
+		}
+# endif	/* defined(SO_LISTENING) */
+
+# if	defined(SO_MGMT)
+		if (opt & SO_MGMT) {
+		    (void) printf("%cMGMT", sep);
+		    opt &= ~SO_MGMT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_MGMT) */
+
+# if	defined(SO_OOBINLINE)
+		if (opt & SO_OOBINLINE) {
+		    (void) printf("%cOOBINLINE", sep);
+		    opt &= ~SO_OOBINLINE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_OOBINLINE) */
+
+# if	defined(SO_ORDREL)
+		if (opt & SO_ORDREL) {
+		    (void) printf("%cORDREL", sep);
+		    opt &= ~SO_ORDREL;
+		    sep = ',';
+		}
+# endif	/* defined(SO_ORDREL) */
+
+# if	defined(SO_PARALLELSVR)
+		if (opt & SO_PARALLELSVR) {
+		    (void) printf("%cPARALLELSVR", sep);
+		    opt &= ~SO_PARALLELSVR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_PARALLELSVR) */
+
+		if (Lf->lts.pqlens) {
+		    (void) printf("%cPQLEN=%u", sep, Lf->lts.pqlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlens) {
+		    (void) printf("%cQLEN=%u", sep, Lf->lts.qlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlims) {
+		    (void) printf("%cQLIM=%u", sep, Lf->lts.qlim);
+		    sep = ',';
+		}
+		if (Lf->lts.rbszs) {
+		    (void) printf("%cRCVBUF=%lu", sep, Lf->lts.rbsz);
+		    sep = ',';
+		}
+
+# if	defined(SO_RDWR)
+		if (opt & SO_RDWR) {
+		    (void) printf("%cRDWR", sep);
+		    opt &= ~SO_RDWR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_RDWR) */
+
+# if	defined(SO_REUSEADDR)
+		if (opt & SO_REUSEADDR) {
+		    (void) printf("%cREUSEADDR", sep);
+		    opt &= ~SO_REUSEADDR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEADDR) */
+
+# if	defined(SO_REUSEPORT)
+		if (opt & SO_REUSEPORT) {
+		    (void) printf("%cREUSEPORT", sep);
+		    opt &= ~SO_REUSEPORT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEPORT) */
+
+# if	defined(SO_SEMA)
+		if (opt & SO_SEMA) {
+		    (void) printf("%cSEMA", sep);
+		    opt &= ~SO_SEMA;
+		    sep = ',';
+		}
+# endif	/* defined(SO_SEMA) */
+
+		if (Lf->lts.sbszs) {
+		    (void) printf("%cSNDBUF=%lu", sep, Lf->lts.sbsz);
+		    sep = ',';
+		}
+
+# if	defined(SO_USELOOPBACK)
+		if (opt & SO_USELOOPBACK) {
+		    (void) printf("%cUSELOOPBACK", sep);
+		    opt &= ~SO_USELOOPBACK;
+		    sep = ',';
+		}
+# endif	/* defined(SO_USELOOPBACK) */
+
+		if (opt)
+		    (void) printf("%cUNKNOWN=%#x", sep, opt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int ss;
+
+	    if ((ss = Lf->lts.ss)) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSS", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(SS_ASYNC)
+		if (ss & SS_ASYNC) {
+		    (void) printf("%cASYNC", sep);
+		    ss &= ~SS_ASYNC;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ASYNC) */
+
+# if	defined(SS_CANTRCVMORE)
+		if (ss & SS_CANTRCVMORE) {
+		    (void) printf("%cCANTRCVMORE", sep);
+		    ss &= ~SS_CANTRCVMORE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_CANTRCVMORE) */
+
+# if	defined(SS_CANTSENDMORE)
+		if (ss & SS_CANTSENDMORE) {
+		    (void) printf("%cCANTSENDMORE", sep);
+		    ss &= ~SS_CANTSENDMORE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_CANTSENDMORE) */
+
+# if	defined(SS_IGNERR)
+		if (ss & SS_IGNERR) {
+		    (void) printf("%cIGNERR", sep);
+		    ss &= ~SS_IGNERR;
+		    sep = ',';
+		}
+# endif	/* defined(SS_IGNERR) */
+
+# if	defined(SS_ISBOUND)
+		if (ss & SS_ISBOUND) {
+		    (void) printf("%cISBOUND", sep);
+		    ss &= ~SS_ISBOUND;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISBOUND) */
+
+# if	defined(SS_ISCONNECTED)
+		if (ss & SS_ISCONNECTED) {
+		    (void) printf("%cISCONNECTED", sep);
+		    ss &= ~SS_ISCONNECTED;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISCONNECTED) */
+
+# if	defined(SS_ISCONNECTING)
+		if (ss & SS_ISCONNECTING) {
+		    (void) printf("%cISCONNECTING", sep);
+		    ss &= ~SS_ISCONNECTING;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISCONNECTING) */
+
+# if	defined(SS_ISDISCONNECTING)
+		if (ss & SS_ISDISCONNECTING) {
+		    (void) printf("%cISDISCONNECTING", sep);
+		    ss &= ~SS_ISDISCONNECTING;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISDISCONNECTING) */
+
+# if	defined(SS_NBIO)
+		if (ss & SS_NBIO) {
+		    (void) printf("%cNBIO", sep);
+		    ss &= ~SS_NBIO;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NBIO) */
+
+# if	defined(SS_NODELETE)
+		if (ss & SS_NODELETE) {
+		    (void) printf("%cNODELETE", sep);
+		    ss &= ~SS_NODELETE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NODELETE) */
+
+# if	defined(SS_NOGHOST)
+		if (ss & SS_NOGHOST) {
+		    (void) printf("%cNOGHOST", sep);
+		    ss &= ~SS_NOGHOST;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOGHOST) */
+
+# if	defined(SS_NOINPUT)
+		if (ss & SS_NOINPUT) {
+		    (void) printf("%cNOINPUT", sep);
+		    ss &= ~SS_NOINPUT;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOINPUT) */
+
+# if	defined(SS_NOFDREF)
+		if (ss & SS_NOFDREF) {
+		    (void) printf("%cNOFDREF", sep);
+		    ss &= ~SS_NOFDREF;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOFDREF) */
+
+# if	defined(SS_PRIV)
+		if (ss & SS_PRIV) {
+		    (void) printf("%cPRIV", sep);
+		    ss &= ~SS_PRIV;
+		    sep = ',';
+		}
+# endif	/* defined(SS_PRIV) */
+
+# if	defined(SS_RCVATMARK)
+		if (ss & SS_RCVATMARK) {
+		    (void) printf("%cRCVATMARK", sep);
+		    ss &= ~SS_RCVATMARK;
+		    sep = ',';
+		}
+# endif	/* defined(SS_RCVATMARK) */
+
+# if	defined(SS_SETRCV)
+		if (ss & SS_SETRCV) {
+		    (void) printf("%cSETRCV", sep);
+		    ss &= ~SS_SETRCV;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SETRCV) */
+
+# if	defined(SS_SETSND)
+		if (ss & SS_SETSND) {
+		    (void) printf("%cSETSND", sep);
+		    ss &= ~SS_SETSND;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SETSND) */
+
+# if	defined(SS_ZOMBIE)
+		if (ss & SS_ZOMBIE) {
+		    (void) printf("%cZOMBIE", sep);
+		    ss &= ~SS_ZOMBIE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ZOMBIE) */
+
+		if (ss)
+		    (void) printf("%cUNKNOWN=%#x", sep, ss);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOSTATE) */
+
+#if	defined(HASTCPOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int topt;
+
+	    if ((topt = Lf->lts.topt) || Lf->lts.msss) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cTF", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(TF_ACKNOW)
+		if (topt & TF_ACKNOW) {
+		    (void) printf("%cACKNOW", sep);
+		    topt &= ~TF_ACKNOW;
+		    sep = ',';
+		}
+# endif	/* defined(TF_ACKNOW) */
+
+# if	defined(TF_DELACK)
+		if (topt & TF_DELACK) {
+		    (void) printf("%cDELACK", sep);
+		    topt &= ~TF_DELACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_DELACK) */
+
+# if	defined(TF_HAVEACKED)
+		if (topt & TF_HAVEACKED) {
+		    (void) printf("%cHAVEACKED", sep);
+		    topt &= ~TF_HAVEACKED;
+		    sep = ',';
+		}
+# endif	/* defined(TF_HAVEACKED) */
+
+# if	defined(TF_HAVECLOSED)
+		if (topt & TF_HAVECLOSED) {
+		    (void) printf("%cHAVECLOSED", sep);
+		    topt &= ~TF_HAVECLOSED;
+		    sep = ',';
+		}
+# endif	/* defined(TF_HAVECLOSED) */
+
+# if	defined(TF_IOLOCK)
+		if (topt & TF_IOLOCK) {
+		    (void) printf("%cIOLOCK", sep);
+		    topt &= ~TF_IOLOCK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_IOLOCK) */
+
+		if (Lf->lts.msss) {
+		    (void) printf("%cMSS=%lu", sep, Lf->lts.mss);
+		    sep = ',';
+		}
+
+# if	defined(TF_MAXSEG_TSTMP)
+		if (topt & TF_MAXSEG_TSTMP) {
+		    (void) printf("%cMAXSEG_TSTMP", sep);
+		    topt &= ~TF_MAXSEG_TSTMP;
+		    sep = ',';
+		}
+# endif	/* defined(TF_MAXSEG_TSTMP) */
+
+# if	defined(TF_NEEDCLOSE)
+		if (topt & TF_NEEDCLOSE) {
+		    (void) printf("%cNEEDCLOSE", sep);
+		    topt &= ~TF_NEEDCLOSE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDCLOSE) */
+
+# if	defined(TF_NEEDIN)
+		if (topt & TF_NEEDIN) {
+		    (void) printf("%cNEEDIN", sep);
+		    topt &= ~TF_NEEDIN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDIN) */
+
+# if	defined(TF_NEEDOUT)
+		if (topt & TF_NEEDOUT) {
+		    (void) printf("%cNEEDOUT", sep);
+		    topt &= ~TF_NEEDOUT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDOUT) */
+
+# if	defined(TF_NEEDTIMER)
+		if (topt & TF_NEEDTIMER) {
+		    (void) printf("%cNEEDTIMER", sep);
+		    topt &= ~TF_NEEDTIMER;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDTIMER) */
+
+# if	defined(TF_NODELACK)
+		if (topt & TF_NODELACK) {
+		    (void) printf("%cNODELACK", sep);
+		    topt &= ~TF_NODELACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NODELACK) */
+
+# if	defined(TF_NODELAY)
+		if (topt & TF_NODELAY) {
+		    (void) printf("%cNODELAY", sep);
+		    topt &= ~TF_NODELAY;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NODELAY) */
+
+# if	defined(TF_NOOPT)
+		if (topt & TF_NOOPT) {
+		    (void) printf("%cNOOPT", sep);
+		    topt &= ~TF_NOOPT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NOOPT) */
+
+# if	defined(TF_RCVD_SCALE)
+		if (topt & TF_RCVD_SCALE) {
+		    (void) printf("%cRCVD_SCALE", sep);
+		    topt &= ~TF_RCVD_SCALE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_SCALE) */
+
+# if	defined(TF_RCVD_TSTMP)
+		if (topt & TF_RCVD_TSTMP) {
+		    (void) printf("%cRCVD_TSTMP", sep);
+		    topt &= ~TF_RCVD_TSTMP;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_TSTMP) */
+
+# if	defined(TF_REQ_SCALE)
+		if (topt & TF_REQ_SCALE) {
+		    (void) printf("%cREQ_SCALE", sep);
+		    topt &= ~TF_REQ_SCALE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_REQ_SCALE) */
+
+# if	defined(TF_REQ_TSTMP)
+		if (topt & TF_REQ_TSTMP) {
+		    (void) printf("%cREQ_TSTMP", sep);
+		    topt &= ~TF_REQ_TSTMP;
+		    sep = ',';
+		}
+# endif	/* defined(TF_REQ_TSTMP) */
+
+# if	defined(TF_SACK_PERMIT)
+		if (topt & TF_SACK_PERMIT) {
+		    (void) printf("%cSACK_PERMIT", sep);
+		    topt &= ~TF_SACK_PERMIT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SACK_PERMIT) */
+
+# if	defined(TF_SENTFIN)
+		if (topt & TF_SENTFIN) {
+		    (void) printf("%cSENTFIN", sep);
+		    topt &= ~TF_SENTFIN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SENTFIN) */
+
+# if	defined(TF_USERCLOSE)
+		if (topt & TF_USERCLOSE) {
+		    (void) printf("%cUSERCLOSE", sep);
+		    topt &= ~TF_USERCLOSE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_USERCLOSE) */
+
+		if (topt)
+		    (void) printf("%cUNKNOWN=%#x", sep, topt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASTCPOPT) */
+
+# if	defined(HASTCPTPIW)
+	if (Ftcptpi & TCPTPI_WINDOWS) {
+	    if (Lf->lts.rws) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WR=%lu", Lf->lts.rw);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.wws) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WW=%lu", Lf->lts.ww);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+# endif	/* defined(HASTCPTPIW) */
+
+	if (!Ffield && ps)
+	    putchar(')');
+	if (nl)
+	    putchar('\n');
+}
+
+
+/*
+ * process_socket() - process socket
+ */
+
+void
+process_socket(pr, q)
+	char *pr;			/* protocol name */
+	struct queue *q;		/* queue at end of stream */
+{
+	unsigned char *fa = (unsigned char *)NULL;
+	int fp, ipv, lp;
+	struct inpcb inp;
+	unsigned char *la = (unsigned char *)NULL;
+	struct tcpcb t;
+	int tcp = 0;
+	short ts = 0;
+	int udp = 0;
+
+/*
+ * Process protocol specification.
+ */
+	Lf->inp_ty = 2;
+	(void) snpf(Lf->iproto, sizeof(Lf->iproto), "%s", pr);
+	Lf->is_stream = 0;
+	if (strcasecmp(pr, "TCP") == 0) {
+	    ipv = 4;
+	    tcp = 1;
+	} else if (strcasecmp(pr, "UDP") == 0) {
+	    ipv = 4;
+	    udp = 1;
+	}
+
+#if	defined(HASIPv6)
+	else if (strcasecmp(pr, "TCP6") == 0) {
+	    ipv = 6;
+	    tcp = 1;
+	    Lf->iproto[3] = '\0';
+	} else if (strcasecmp(pr, "UDP6") == 0) {
+	    ipv = 6;
+	    udp = 1;
+	    Lf->iproto[3] = '\0';
+	}
+#endif	/* defined(HASIPv6) */
+
+	if (Fnet && (tcp || udp)) {
+	    if (!FnetTy || (FnetTy == ipv))
+		Lf->sf |= SELNET;
+	}
+
+#if	defined(HASIPv6)
+        (void) snpf(Lf->type, sizeof(Lf->type), (ipv == 6) ? "IPv6" : "IPv4");
+#else	/* !defined(HASIPv6) */
+        (void) snpf(Lf->type, sizeof(Lf->type), "inet");
+#endif	/* defined(HASIPv6) */
+
+/*
+ * The PCB address is found in the private data structure at the end
+ * of the queue.
+ */
+	if (q->q_ptr) {
+	    enter_dev_ch(print_kptr((KA_T)q->q_ptr, (char *)NULL, 0));
+	    if (tcp || udp) {
+		if (kread((KA_T)q->q_ptr, (char *)&inp, sizeof(inp))) {
+		    (void) snpf(Namech, Namechl, "can't read inpcb from %s",
+			print_kptr((KA_T)q->q_ptr, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+		la = (unsigned char *)&inp.inp_laddr;
+		lp = (int)ntohs(inp.inp_lport);
+		if (inp.inp_faddr.s_addr != INADDR_ANY || inp.inp_fport != 0) {
+		    fa = (unsigned char *)&inp.inp_faddr;
+		    fp = (int)ntohs(inp.inp_fport);
+		}
+		if (fa || la)
+		    (void) ent_inaddr(la, lp, fa, fp, AF_INET);
+		if (tcp) {
+		    if (inp.inp_ppcb
+		    &&  !kread((KA_T)inp.inp_ppcb, (char *)&t, sizeof(t))) {
+			ts = 1;
+			Lf->lts.type = 0;
+			Lf->lts.state.i = (int)t.t_state;
+		    }
+		} else {
+		    Lf->lts.type = 1;
+		    Lf->lts.state.i = (int)inp.inp_tstate;
+		} 
+	    } else
+		enter_nm("no address for this protocol");
+	} else
+	    enter_nm("no address");
+/*
+ * Save size information.
+ */
+	if (ts) {
+	    if (Fsize) {
+
+#if	UNIXWAREV>=70000
+#define	t_outqsize	t_qsize
+#endif	/* UNIXWAREV>=70000 */
+
+		if (Lf->access == 'r')
+		    Lf->sz = (SZOFFTYPE)t.t_iqsize;
+		else if (Lf->access == 'w')
+		    Lf->sz = (SZOFFTYPE)t.t_outqsize;
+		else
+		    Lf->sz = (SZOFFTYPE)(t.t_iqsize + t.t_outqsize);
+		Lf->sz_def = 1;
+
+	    } else
+		Lf->off_def = 1;
+
+#if	defined(HASTCPTPIQ)
+		Lf->lts.rq = (unsigned long)t.t_iqsize;
+		Lf->lts.sq = (unsigned long)t.t_outqsize;
+		Lf->lts.rqs = Lf->lts.sqs = 1;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	    Lf->lts.opt = (unsigned int)inp.inp_protoopt;
+	    Lf->lts.ltm = (unsigned int)inp.inp_linger;
+	    Lf->lts.pqlen = (unsigned int)t.t_q0len;
+	    Lf->lts.qlen = (unsigned int)t.t_qlen;
+	    Lf->lts.qlim = (unsigned int)t.t_qlimit;
+	    Lf->lts.rbsz = (unsigned long)inp.inp_rbufsize;
+	    Lf->lts.sbsz = (unsigned long)inp.inp_sbufsize;
+	    Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
+			   = Lf->lts.sbszs = (unsigned char)1;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	    Lf->lts.ss = (unsigned int)inp.inp_state;
+#endif	/* defined(HASSOSTATE) */
+
+#if	defined(HASTCPOPT)
+	    Lf->lts.mss = (unsigned long)t.t_maxseg;
+	    Lf->lts.msss = (unsigned char)1;
+	    Lf->lts.topt = (unsigned int)t.t_flags;
+#endif	/* defined(HASTCPOPT) */
+
+	}
+	else if (Fsize) {
+	    Lf->sz = (SZOFFTYPE)q->q_count;
+	    Lf->sz_def = 1;
+	} else
+	    Lf->off_def = 1;
+	enter_nm(Namech);
+	return;
+}
+
+
+#if	UNIXWAREV>=70101
+/*
+ * process_unix_sockstr() - process a UNIX socket stream, if applicable
+ */
+
+int
+process_unix_sockstr(v, na)
+	struct vnode *v;		/* the stream's vnode */
+	KA_T na;			/* kernel vnode address */
+{
+	int as;
+	char *ep, tbuf[32], tbuf1[32], *ty;
+	KA_T ka, sa, sh;
+	struct stdata sd;
+	struct ss_socket ss;
+	size_t sz;
+
+# if	UNIXWAREV<70103
+	struct sockaddr_un *la, *ra;
+# else	/* UNIXWAREV>=70103 */
+	struct sockaddr_un la, ra;
+	unsigned char las = 0;
+	unsigned char ras = 0;
+	int up = (int)(sizeof(la.sun_path) - 1);
+/*
+ * It's serious if the sizeof(sun_path) in sockaddr_un isn't greater than zero.
+ */
+	if (up < 0) {
+	    (void) snpf(Namech, Namechl, "sizeof(sun_path) < 1 (%d)", up);
+	    enter_nm(Namech);
+	    return(1);
+	}
+# endif	/* UNIXWAREV<70103 */
+
+/*
+ * Read the stream head, if possible.
+ */
+	if (!(sh = (KA_T)v->v_stream))
+	    return(0);
+	if (readstdata(sh, &sd)) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %s; can't read stream head at %s",
+		print_kptr(na, (char *)NULL, 0),
+		print_kptr(sh, tbuf, sizeof(tbuf)));
+	    enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * If the stream head has pointer to a socket, read the socket structure
+ */
+	if (!(sa = (KA_T)sd.sd_socket))
+	    return(0);
+	if (kread(sa, (char *)&ss, sizeof(ss))) {
+	    (void) snpf(Namech, Namechl,
+		"vnode at %s; stream head at %s; can't read socket at %s",
+		print_kptr(na, (char *)NULL, 0),
+		print_kptr(sh, tbuf, sizeof(tbuf)),
+		print_kptr(sa, tbuf1, sizeof(tbuf1)));
+	    enter_nm(Namech);
+	    return(1);
+	}
+/*
+ * If the socket is bound to the PF_UNIX protocol family, process it as
+ * a UNIX socket.  Otherwise, return and let the vnode be processed as a
+ * stream.
+ */
+	if (ss.family != PF_UNIX)
+	    return(0);
+	(void) snpf(Lf->type, sizeof(Lf->type), "unix");
+	if (Funix)
+	    Lf->sf |= SELUNX;
+	Lf->is_stream = 0;
+	if (!Fsize)
+	    Lf->off_def = 1;
+	enter_dev_ch(print_kptr(sa, (char *)NULL, 0));
+/*
+ * Process the local address.
+ */
+
+# if	UNIXWAREV<70103
+	if ((la = find_unix_sockaddr_un((KA_T)sd.sd_socket))) {
+	    if (Sfile && is_file_named(la->sun_path, 0))
+		Lf->sf = SELNM;
+	}
+# else	/* UNIXWAREV>=70103 */
+	if (((as = (KA_T)ss.local_addrsz) > 0) && (ka = (KA_T)ss.local_addr))
+	{
+	    if (as > sizeof(la))
+		as = (int)sizeof(la);
+	    if (!kread(ka, (char *)&la, as)) {
+		la.sun_path[up] = '\0';
+		if (la.sun_path[0]) {
+		    las = 1;
+		    if (Sfile && is_file_named(la.sun_path, 0))
+			Lf->sf = SELNM;
+		}
+	    }
+	}
+# endif	/* UNIXWAREV<70103 */
+
+/*
+ * Process the remote address.
+ */
+
+# if	UNIXWAREV<70103
+	if ((ra = find_unix_sockaddr_un((KA_T)ss.conn_ux))) {
+	    if (Sfile && is_file_named(ra->sun_path, 0))
+		Lf->sf = SELNM;
+	}
+# else	/* UNIXWAREV>=70103 */
+	if (((as = (KA_T)ss.remote_addrsz) > 0) && (ka = (KA_T)ss.remote_addr))
+	{
+	    if (as > sizeof(la))
+		as = (int)sizeof(ra);
+	    if (!kread(ka, (char *)&ra, as)) {
+		ra.sun_path[up] = '\0';
+		if (ra.sun_path[0]) {
+		    ras = 1;
+		    if (Sfile && is_file_named(ra.sun_path, 0))
+			Lf->sf = SELNM;
+		}
+	    }
+	}
+# endif	/* UNIXWAREV<70103 */
+
+/*
+ * Start Namech[] with the service type, converted to a name, ala netstat.
+ */
+	switch (ss.servtype) {
+	case T_COTS:
+	case T_COTS_ORD:
+	    ty = "stream";
+	    break;
+	case T_CLTS:
+	    ty = "dgram";
+	    break;
+	default:
+	    ty = (char *)NULL;
+	}
+	if (ty) {
+	    (void) snpf(Namech, Namechl, "%s", ty);
+	    ty = ":";
+	} else {
+	    Namech[0] = '\0';
+	    ty = "";
+	}
+/*
+ * Add names to Namech[].
+ */
+
+#if	UNIXWAREV<70103
+	if (la && la->sun_path[0]) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%s%s", ty, la->sun_path);
+	}
+#else	/* UNIXWAREV>=70103 */
+	if (las) {
+	    ep = endnm(&sz);
+	    (void) snpf(ep, sz, "%s%s", ty, la.sun_path);
+	}
+#endif	/* UNIXWAREV<70103 */
+
+	ep = endnm(&sz);
+
+#if	UNIXWAREV<70103
+	if (ra && ra->sun_path[0])
+	    (void) snpf(ep, sz, "->%s", ra->sun_path);
+#else	/* UNIXWAREV>=70103 */
+	if (ras)
+	    (void) snpf(ep, sz, "->%s", ra.sun_path);
+#endif	/* UNIXWAREV<70103 */
+
+	else if ((ka = (KA_T)ss.conn_ux))
+	    (void) snpf(ep, sz, "->%s", print_kptr(ka, (char *)NULL, 0));
+	if (Namech[0])
+	    enter_nm(Namech);
+	return(1);
+}
+
+
+# if	UNIXWAREV<70103
+/*
+ * find_unix_sockaddr_un() -- find UNIX socket address structure
+ *
+ */
+
+static struct sockaddr_un *
+find_unix_sockaddr_un(ka)
+	KA_T ka;			/* socket's kernel address */
+{
+	static struct soreq *al = (struct soreq *)NULL;
+	static int alct = 0;
+	int i;
+
+	if (!al) {
+	    MALLOC_S alen, len;
+	    char *ch = (char *)NULL;
+	    int ct, pct;
+	    struct strioctl ioc;
+	    int sock = -1;
+
+	    if (alct < 0)
+		return((struct sockaddr_un *)NULL);
+	/*
+	 * If there has been no attempt to acquire the  address list yet,
+	 * do so.
+	 *
+	 * Get a SOCK_STREAM PF_UNIX socket descriptor and use ioctl() to
+	 * send a stream message to acquire the list of PF_UNIX addresses.
+	 */
+	    if ((sock = socket (PF_UNIX, SOCK_STREAM, 0)) < 0) {
+
+	    /*
+	     * Some error was detected.  Return allocated resources and
+	     * indicate that no further attempts need be made.
+	     */
+
+find_err_exit:
+
+		alct = -1;
+		if (sock >= 0)
+		    close(sock);
+		if (ch)
+		    (void) free((FREE_P *)ch);
+		return((struct sockaddr_un *)NULL);
+	    }
+	/*
+	 * Read the address list.  Before starting, get an estimate of its
+	 * size and add a small safety margin.
+	 */
+	    if ((ct = ioctl(sock, SI_UX_COUNT, 0)) < 0)
+		goto find_err_exit;
+	    ct += 32;
+	    pct = 0;
+	    do {
+		if (ct > pct) {
+
+		/*
+		 * If the previously allocated space is insufficient,
+		 * or if none has been allocated, allocate space.
+		 */
+		    alen = (MALLOC_S)(ct * sizeof(struct soreq));
+		    if (ch)
+			ch = (char *)realloc((MALLOC_P *)ch, alen);
+		    else
+			ch = (char *)malloc(alen);
+		    if (!ch)
+			goto find_err_exit;
+		    pct = ct;
+		}
+	   /*
+	    * Read the address list into the allocated space.
+	    */
+		ioc.ic_cmd = SI_UX_LIST;
+		ioc.ic_dp = ch;
+		ioc.ic_len = (int)alen;
+		ioc.ic_timout = 0;
+		if ((ct = ioctl(sock, I_STR, &ioc)) < 0)
+		    goto find_err_exit;
+	    } while (ct > pct);
+	/*
+	 * The list has been acquired.  Free any excess space pre-allocated to
+	 * it, then save its address.   Close the stream socket.
+	 */
+	    alct = ct;
+	    if ((len = (MALLOC_S)(alct * sizeof(struct soreq))) < alen) {
+		if (!(ch = (char *)realloc((MALLOC_P *)ch, len)))
+		    goto find_err_exit;
+	    }
+	    al = (struct soreq *)ch;
+	    close(sock);
+	}
+/*
+ * Search a previously acquired address list, based on the supplied kernel
+ * socket address.  If an entry is found, return a pointer to it, making
+ * sure the path it contains is terminated.
+ */
+	for (i = 0; i < alct; i++) {
+	    if ((KA_T)al[i].so_addr == ka)
+		break;
+	}
+	if (i >= alct || !al[i].sockaddr.sun_path[0])
+	    return((struct sockaddr_un *)NULL);
+	al[i].sockaddr.sun_path[(int)(sizeof(al[i].sockaddr.sun_path) - 1)]
+	    = '\0';
+	return(&al[i].sockaddr);
+}
+# endif	/* UNIXWAREV<70103 */
+#endif	/* UNIXWAREV>=70101 */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/dstore.c b/lsof_4.85/lsof_4.85_src/dialects/uw/dstore.c
new file mode 100644
index 0000000..4501400
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/dstore.c
@@ -0,0 +1,134 @@
+/*
+ * dstore.c - SCO UnixWare global storage for lsof
+ */
+
+
+/*
+ * Copyright 1996 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1996 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dstore.c,v 1.8 2000/11/03 18:57:07 abe Exp abe $";
+#endif
+
+
+#include "lsof.h"
+
+
+int CloneMaj;				/* clone major device number (see
+					 * HaveCloneMaj) */
+
+
+/*
+ * Drive_Nl -- table to drive the building of Nl[] via build_Nl()
+ *             (See lsof.h and misc.c.)
+ */
+
+struct drive_Nl Drive_Nl[] = {
+	{ "cdev",	"cdevsw"	},	/* UW < 7 */
+	{ "cmaj",	"clonemajor"	},	/* UW >= 7 */
+	{ "ncdev",	"cdevswsz"	},	/* UW < 7 */
+	{ X_NCACHE,	"ncache"	},
+	{ X_NCSIZE,	"ncsize"	},
+	{ "proc",	"practive"	},
+	{ "sgvnops",	"segvn_ops"	},
+	{ "sgdnops",	"segdev_ops"	},
+	{ "var",	"v"		},
+	{ "",		""		},
+	{ NULL,		NULL		}
+};
+
+char **Fsinfo = NULL;			/* file system information */
+int Fsinfomax = 0;			/* maximum file system type */
+int HaveCloneMaj = 0;			/* CloneMaj status */
+int Kd = -1;				/* /dev/kmem file descriptor */
+short Nfstyp = 0;			/* number of fstypsw[] entries */
+
+#if	defined(HASFSTRUCT)
+/*
+ * Pff_tab[] - table for printing file flags
+ */
+
+struct pff_tab Pff_tab[] = {
+	{ (long)FREAD,		FF_READ		},
+	{ (long)FWRITE,		FF_WRITE	},
+	{ (long)FNDELAY,	FF_NDELAY	},
+
+# if	defined(FDIRECT)
+	{ (long)FDIRECT,	FF_DIRECT	},
+# endif	/* defined(FDIRECT) */
+
+	{ (long)FAPPEND,	FF_APPEND	},
+
+# if	defined(FASYNC)
+	{ (long)FASYNC,		FF_ASYNC	},
+# endif	/* defined(FASYNC) */
+
+	{ (long)FSYNC,		FF_SYNC		},
+
+# if	defined(FDSYNC)
+	{ (long)FDSYNC,		FF_DSYNC	},
+# endif	/* defined(FDSYNC) */
+
+# if	defined(FLARGEFILE)
+	{ (long)FLARGEFILE,	FF_LARGEFILE	},
+# endif	/* defined(FLARGEFILE) */
+
+# if	defined(FCLONE)
+	{ (long)FCLONE,		FF_CLONE	},
+# endif	/* defined(FCLONE) */
+
+# if	defined(FILE_MBLK)
+	{ (long)FILE_MBLK,	FF_FILE_MBLK	},
+# endif	/* defined(FILE_MBLK) */
+
+	{ (long)FNONBLOCK,	FF_NBLOCK	},
+	{ (long)FNOCTTY,	FF_NOCTTY	},
+
+# if	defined(FNMFS)
+	{ (long)FNMFS,		FF_NMFS		},
+# endif	/* defined(FNMFS) */
+
+	{ (long)0,		NULL		}
+};
+
+
+/*
+ * Pof_tab[] - table for print process open file flags
+ */
+
+struct pff_tab Pof_tab[] = {
+
+	{ (long)FCLOSEXEC,	POF_CLOEXEC	},
+
+# if	defined(UF_FDLOCK)
+	{ (long)UF_FDLOCK,	POF_FDLOCK	},
+# endif	/* defined(UF_FDLOCK) */
+
+	{ (long)0,		NULL		}
+};
+#endif	/* defined(HASFSTRUCT) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/machine.h b/lsof_4.85/lsof_4.85_src/dialects/uw/machine.h
new file mode 100644
index 0000000..87f8aca
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/machine.h
@@ -0,0 +1,630 @@
+/*
+ * machine.h - SCO UnixWare definitions for lsof
+ */
+
+
+/*
+ * Copyright 1996 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: machine.h,v 1.36 2010/07/29 16:03:02 abe Exp $
+ */
+
+
+#if	!defined(LSOF_MACHINE_H)
+#define	LSOF_MACHINE_H	1
+
+
+#define	_KMEMUSER			/* to get _KMEMUSER-influenced types */
+
+# if	UNIXWAREV>=70103
+#define	_KERNEL	1			/* for rnode.h */
+#define	_FSKI	2			/* for rnode.h */
+#endif	/* UNIXWAREV>=70103 */
+
+#include <sys/types.h>
+
+# if	UNIXWAREV>=70103
+#undef	_KERNEL
+#undef	_FSKI
+#endif	/* UNIXWAREV>=70103 */
+
+#include <sys/param.h>
+
+
+/*
+ * CAN_USE_CLNT_CREATE is defined for those dialects where RPC clnt_create()
+ * can be used to obtain a CLIENT handle in lieu of clnttcp_create().
+ */
+
+#if	UNIXWAREV>=20103
+#define	CAN_USE_CLNT_CREATE	1
+#endif	/* UNIXWAREV>=20103 */
+
+
+/*
+ * DEVDEV_PATH defines the path to the directory that contains device
+ * nodes.
+ */
+
+#define	DEVDEV_PATH	"/dev"
+
+
+/*
+ * GET_MAX_FD is defined for those dialects that provide a function other than
+ * getdtablesize() to obtain the maximum file descriptor number plus one.
+ */
+
+#define	GET_MAX_FD	get_max_fd
+
+
+/*
+ * HASAOPT is defined for those dialects that have AFS support; it specifies
+ * that the default path to an alternate AFS kernel name list file may be
+ * supplied with the -A <path> option.
+ */
+
+/* #define	HASAOPT		1	*/
+
+
+/*
+ * HASBLKDEV is defined for those dialects that want block device information
+ * recorded in BDevtp[].
+ */
+
+#define	HASBLKDEV	1
+
+
+/*
+ * HASCDRNODE is defined for those dialects that have CD-ROM nodes.
+ */
+
+/* #define	HASCDRNODE	1 */
+
+
+/*
+ * HASDCACHE is defined for those dialects that support a device cache
+ * file.
+ *
+ * HASENVDC defined the name of an environment variable that contains the
+ * device cache file path.  The HASENVDC environment variable is ignored when
+ * the lsof process is setuid(root) or its real UID is 0.
+ *
+ * HASPERSDC defines the format for the last component of a personal device
+ * cache file path.  The first will be the home directory of the real UID that
+ * executes lsof.
+ *
+ * HASPERSDCPATH defines the environment variable whose value is the middle
+ * component of the personal device cache file path.  The middle component
+ * follows the home directory and precedes the results of applying HASPERSDC.
+ * The HASPERSDCPATH environment variable is ignored when the lsof process is
+ * setuid(root) or its real UID is 0.
+ *
+ * HASSYSDC defines a public device cache file path.  When it's defined, it's
+ * used as the path from which to read the device cache.
+ *
+ * Consult the 00DCACHE and 00FAQ files of the lsof distribution for more
+ * information on device cache file path construction.
+ */
+
+#define	HASDCACHE	1
+#define	HASENVDC	"LSOFDEVCACHE"
+#define	HASPERSDC	"%h/%p.lsof_%L"
+#define	HASPERSDCPATH	"LSOFPERSDCPATH"
+/* #define	HASSYSDC	"/your/choice/of/path" */
+
+
+/*
+ * HASFIFONODE is defined for those dialects that have FIFO nodes.
+ */
+
+#define	HASFIFONODE	1
+
+
+/*
+ * HASFSINO is defined for those dialects that have the file system
+ * inode element, fs_ino, in the lfile structure definition in lsof.h.
+ */
+
+#define	HASFSINO	1
+
+
+/*
+ * HASFSTRUCT is defined if the dialect has a file structure.
+ *
+ * FSV_DEFAULT defines the default set of file structure values to list.
+ * It defaults to zero (0), but may be made up of a combination of the
+ * FSV_* symbols from lsof.h.
+ *
+ *   HASNOFSADDR  -- has no file structure address
+ *   HASNOFSFLAGS -- has no file structure flags
+ *   HASNOFSCOUNT -- has no file structure count
+ *   HASNOFSNADDR -- has no file structure node address
+ */
+
+#define	HASFSTRUCT	1
+/* #define	FSV_DEFAULT	FSV_? | FSV_? | FSV_? */
+/* #define	HASNOFSADDR	1	has no file structure address */
+/* #define	HASNOFSFLAGS	1	has no file structure flags */
+/* #define	HASNOFSCOUNT	1	has no file structure count */
+/* #define	HASNOFSNADDR	1	has no file structure node address */
+
+
+/*
+ * HASGNODE is defined for those dialects that have gnodes.
+ */
+
+/* #define	HASGNODE	1 */
+
+
+/*
+ * HASHSNODE is defined for those dialects that have High Sierra nodes.
+ */
+
+/* #define	HASHSNODE	1 */
+
+
+/*
+ * HASINODE is defined for those dialects that have inodes and wish to
+ * use readinode() from node.c.
+ *
+ * UnixWare has multiple inodes, sized differently.
+ */
+
+/* #define	HASINODE	1 */
+
+
+/*
+ * HASINTSIGNAL is defined for those dialects whose signal function returns
+ * an int.
+ */
+
+/* #define	HASINTSIGNAL	1 */
+
+
+/*
+ * HASKERNIDCK is defined for those dialects that support the comparison of
+ * the build to running kernel identity.
+ */
+
+#define	HASKERNIDCK	1
+
+
+/*
+ * HASKOPT is defined for those systems that support the -k option of
+ * reading the kernel's name list from an optional file.
+ */
+
+#define	HASKOPT	1
+
+
+/*
+ * HASLFILEADD is defined for those dialects that need additional elements
+ * in struct lfile.  The HASLFILEADD definition is a macro that defines
+ * them.  If any of the additional elements need to be preset in the
+ * alloc_lfile() function of proc.c, the SETLFILEADD macro may be defined
+ * to do that.
+ *
+ * If any additional elements need to be cleared in alloc_lfile() or in the
+ * free_proc() function of proc.c, the CLRLFILEADD macro may be defined to
+ * do that.  Note that CLRLFILEADD takes one argument, the pointer to the
+ * lfile struct.  The CLRLFILEADD macro is expected to expand to statements
+ * that are complete -- i.e., have terminating semi-colons -- so the macro is
+ * called without a terminating semicolon by proc.c.
+ *
+ * The HASXOPT definition may be used to select the conditions under which
+ * private lfile elements are used.
+ */
+
+/* #define HASLFILEADD int ... */
+/* #define CLRLFILEADD(lf)	(lf)->... = (type)NULL;	*/
+/* #define SETLFILEADD Lf->... */
+
+
+/*
+ * HASMNTSTAT indicates the dialect supports the mount stat(2) result option
+ * in its l_vfs and mounts structures.
+ */
+
+/* #define	HASMNTSTAT	1	*/
+
+
+/*
+ * HASMNTSUP is defined for those dialects that support the mount supplement
+ * option.
+ */
+
+/* #define	HASMNTSUP	1	*/
+
+
+/*
+ * HASMOPT is defined for those dialects that support the reading of
+ * kernel memory from an alternate file.
+ */
+
+#define	HASMOPT	1
+
+
+/*
+ * HASNCACHE is defined for those dialects that have a kernel name cache
+ * that lsof can search.  A value of 1 directs printname() to prefix the
+ * cache value with the file system directory name; 2, avoid the prefix.
+ *
+ * NCACHELDPFX is a set of C commands to execute before calling ncache_load().
+ *
+ * NCACHELDSFX is a set of C commands to execute after calling ncache_load().
+ */
+
+#define	HASNCACHE	1
+/* #define	NCACHELDPFX	??? */
+/* #define	NCACHELDSFX	??? */
+
+
+/*
+ * HASNLIST is defined for those systems that use nlist() to acccess
+ * kernel symbols.
+ */
+
+#define	HASNLIST	1
+
+
+/*
+ * HASPIPEFN is defined for those dialects that have a special function to
+ * process DTYPE_PIPE file structure entries.  Its value is the name of the
+ * function.
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+/* #define	HASPIPEFN	process_pipe? */
+
+
+/*
+ * HASPIPENODE is defined for those dialects that have pipe nodes.
+ */
+
+/* #define	HASPIPENODE	1 */
+
+
+/*
+ * HASPMAPENABLED is defined when the reporting of portmapper registration
+ * info is enabled by default.
+ */
+
+/* #define	HASPMAPENABLED	1 */
+
+
+/*
+ * HASPPID is defined for those dialects that support identification of
+ * the parent process IDentifier (PPID) of a process.
+ */
+
+#define	HASPPID		1
+
+
+/*
+ * HASPRINTDEV, HASPRINTINO, HASPRINTNM, HASPRINTOFF, and HASPRINTSZ
+ * define private dialect-specific functions for printing DEVice numbers,
+ * INOde numbers, NaMes, file OFFsets, and file SiZes.  The functions are
+ * called from print_file().
+ */
+
+/* #define	HASPRINTDEV	print_dev?	*/
+/* #define	HASPRINTINO	print_ino?	*/
+/* #define	HASPRINTNM	print_nm?	*/
+/* #define	HASPRINTOFF	print_off?	*/
+/* #define	HASPRINTSZ	print_sz?	*/
+
+
+/*
+ * HASPRIVFILETYPE and PRIVFILETYPE are defined for dialects that have a
+ * file structure type that isn't defined by a DTYPE_* symbol.  They are
+ * used in lib/prfp.c to select the type's processing.
+ *
+ * PRIVFILETYPE is the definition of the f_type value in the file struct.
+ *
+ * HASPRIVFILETYPE is the name of the processing function.
+ */
+
+/* #define	HASPRIVFILETYPE	process_shmf?	*/
+/* #define	PRIVFILETYPE	??	*/
+
+
+/*
+ * HASPRIVNMCACHE is defined for dialects that have a private method for
+ * printing cached NAME column values for some files.  HASPRIVNAMECACHE
+ * is defined to be the name of the function.
+ *
+ * The function takes one argument, a struct lfile pointer to the file, and
+ * returns non-zero if it prints a name to stdout.
+ */
+
+/* #define	HASPRIVNMCACHE	<function name>	*/
+
+
+/*
+ * HASPRIVPRIPP is defined for dialects that have a private function for
+ * printing IP protocol names.  When HASPRIVPRIPP isn't defined, the
+ * IP protocol name printing function defaults to printiprto().
+ */
+
+/* #define	HASPRIVPRIPP	1	*/
+
+
+/*
+ * HASPROCFS is defined for those dialects that have a proc file system --
+ * usually /proc and usually in SYSV4 derivatives.
+ *
+ * HASFSTYPE is defined as 1 for those systems that have a file system type
+ * string, st_fstype, in the stat() buffer; 2, for those systems that have a
+ * file system type integer in the stat() buffer, named MOUNTS_STAT_FSTYPE;
+ * 0, for systems whose stat(2) structure has no file system type member.  The
+ * additional symbols MOUNTS_FSTYPE, RMNT_FSTYPE, and RMNT_STAT_FSTYPE may be
+ * defined in dlsof.h to direct how the readmnt() function in lib/rmnt.c
+ * preserves these stat(2) and getmntent(3) buffer values in the local mounts
+ * structure.
+ *
+ * The defined value is the string that names the file system type.
+ *
+ * The HASPROCFS definition usually must be accompanied by the HASFSTYPE
+ * definition and the providing of an fstype element in the local mounts
+ * structure (defined in dlsof.h).
+ *
+ * The HASPROCFS definition may be accompanied by the HASPINODEN definition.
+ * HASPINODEN specifies that searching for files in HASPROCFS is to be done
+ * by inode number.
+ */
+
+#define		HASPROCFS	"proc"
+#define		HASFSTYPE	1
+
+# if	UNIXWAREV>=20102
+#define	HASPINODEN	1
+# endif	/* UNIXWAREV>=20102 */
+
+
+/*
+ * HASRNODE is defined for those dialects that have rnodes.
+ */
+
+#define	HASRNODE	1
+
+
+/*
+ * Define HASSECURITY to restrict the listing of all open files to the
+ * root user.  When HASSECURITY is defined, the non-root user may list
+ * only files whose processes have the same user ID as the real user ID
+ * (the one that its user logged on with) of the lsof process.
+ */
+
+/* #define	HASSECURITY	1 */
+
+
+/*
+ * If HASSECURITY is defined, define HASNOSOCKSECURITY to allow users
+ * restricted by HASSECURITY to list any open socket files, provide their
+ * listing is selected by the "-i" option.
+ */
+
+/* #define	HASNOSOCKSECURITY	1	*/
+
+
+/*
+ * HASSETLOCALE is defined for those dialects that have <locale.h> and
+ * setlocale().
+ *
+ * If the dialect also has wide character support for language locales,
+ * HASWIDECHAR activates lsof's wide character support and WIDECHARINCL
+ * defines the header file (if any) that must be #include'd to use the
+ * mblen() and mbtowc() functions.
+ */
+
+#define	HASSETLOCALE	1
+
+# if	UNIXWAREV>=70104
+#define	HASWIDECHAR	1
+# endif	/* UNIXWAREV>=70104 */
+
+/* #define	WIDECHARINCL	<wchar.h>	*/
+
+
+/*
+ * HASSNODE is defined for those dialects that have snodes.
+ */
+
+#define	HASSNODE	1
+
+
+/*
+ * HASTASKS is defined for those dialects that have task reporting support.
+ */
+
+/* #define	HASTASKS	1 */
+
+
+/*
+ * HASSOOPT, HASSOSTATE and HASTCPOPT define the availability of information
+ * on socket options (SO_* symbols), socket states (SS_* symbols) and TCP
+ * options.
+ */
+
+#define	HASSOOPT	1	/* has socket option information */
+#define	HASSOSTATE	1	/* has socket state information */
+#define	HASTCPOPT	1	/* has TCP options or flags */
+
+
+/*
+ * Define HASSPECDEVD to be the name of a function that handles the results
+ * of a successful stat(2) of a file name argument.
+ *
+ * For example, HASSPECDEVD() for Darwin makes sure that st_dev is set to
+ * what stat("/dev") returns -- i.e., what's in DevDev.
+ *
+ * The function takes two arguments:
+ *
+ *	1: pointer to the full path name of file
+ *	2: pointer to the stat(2) result
+ *
+ * The function returns void.
+ */
+
+/* #define	HASSPECDEVD	process_dev_stat */
+
+
+/*
+ * HASSTREAMS is defined for those systems that support streams.
+ */
+
+#define	HASSTREAMS	1
+
+
+/*
+ * HASTCPTPIQ is defined for dialects where it is possible to report the
+ * TCP/TPI Recv-Q and Send-Q values produced by netstat.
+ */
+
+#define	HASTCPTPIQ	1
+
+
+/*
+ * HASTCPTPIW is defined for dialects where it is possible to report the
+ * TCP/TPI send and receive window sizes produced by netstat.
+ */
+
+/* #define	HASTCPTPIW	1 */
+
+
+/*
+ * HASTMPNODE is defined for those dialects that have tmpnodes.
+ */
+
+/* #define	HASTMPNODE	1 */
+
+
+/*
+ * HASVNODE is defined for those dialects that use the Sun virtual file
+ * system node, the vnode.  BSD derivatives usually do; System V derivatives
+ * prior to R4 usually don't.
+ */
+
+#define	HASVNODE	1
+
+
+/*
+ * HASXOPT is defined for those dialects that have an X option.  It
+ * defines the text for the usage display.  HASXOPT_VALUE defines the
+ * option's default binary value -- 0 or 1.
+ */
+
+/* #define	HASXOPT		"help text for X option" */
+/* #define	HASXOPT_VALUE	1 */
+
+
+/*
+ * INODETYPE and INODEPSPEC define the internal node number type and its
+ * printf specification modifier.  These need not be defined and lsof.h
+ * can be allowed to define defaults.
+ *
+ * These are defined here, because they must be used in dlsof.h.
+ */
+
+# if	UNIXWAREV>=70000
+#define	INODETYPE	unsigned long long
+					/* inode number internal storage type */
+#define	INODEPSPEC	"ll"	 	/* INODETYPE printf specification
+					 * modifier */
+# endif	/* UNIXWAREV>=70000 */
+
+
+/*
+ * UID_ARG defines the size of a User ID number when it is passed
+ * as a function argument.
+ */
+
+#define	UID_ARG	long
+
+
+/*
+ * Each USE_LIB_<function_name> is defined for dialects that use the
+ * <function_name> in the lsof library.
+ *
+ * Note: other definitions and operations may be required to condition the
+ * library function source code.  They may be found in the dialect dlsof.h
+ * header files.
+ */
+
+#define	USE_LIB_CKKV				1	/* ckkv.c */
+/* #define	USE_LIB_COMPLETEVFS		1	   cvfs.c */
+#define	USE_LIB_FIND_CH_INO			1	/* fino.c */
+#define	USE_LIB_IS_FILE_NAMED			1	/* isfn.c */
+#define	USE_LIB_LKUPDEV				1	/* lkud.c */
+#define	USE_LIB_PRINTDEVNAME			1	/* pdvn.c */
+/* #define	USE_LIB_PROCESS_FILE		1	   prfp.c */
+/* #define	USE_LIB_PRINT_TCPTPI		1	   ptti.c */
+#define	USE_LIB_READDEV				1	/* rdev.c */
+/* #define	USE_LIB_READMNT			1	   rmnt.c */
+/* #define	USE_LIB_REGEX			1	   regex.c */
+/* #define	USE_LIB_RNAM			1	   rnam.c */
+#define	USE_LIB_RNCH				1	/* rnch.c */
+/* #define	USE_LIB_RNMH			1	   rnmh.c */
+/* #define	USE_LIB_SNPF			1	   snpf.c */
+#define	snpf	snprintf	   /* use the system's snprintf() */
+
+
+/*
+ * WARNDEVACCESS is defined for those dialects that should issue a warning
+ * when lsof can't access /dev (or /device) or one of its sub-directories.
+ * The warning can be inhibited by the lsof caller with the -w option.
+ */
+
+#define	WARNDEVACCESS	1
+
+
+/*
+ * WARNINGSTATE is defined for those dialects that want to suppress all lsof
+ * warning messages.
+ */
+
+/* #define	WARNINGSTATE	1	warnings are enabled by default */
+
+
+/*
+ * WILLDROPGID is defined for those dialects whose lsof executable runs
+ * setgid(not_real_GID) and whose setgid power can be relinquished after
+ * the dialect's initialize() function has been executed.
+ */
+
+#define	WILLDROPGID	1
+
+
+/*
+ * zeromem is a macro that uses bzero or memset.
+ */
+
+#define	zeromem(a, l)	memset(a, 0, l)
+
+#endif	/* !defined(LSOF_MACHINE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/README b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/README
new file mode 100644
index 0000000..27f8588
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/README
@@ -0,0 +1,6 @@
+Some header files in this subdirectory tree are Copyright (c) The Santa
+Cruz Operation, Inc.  They are reproduced, either in their original or
+corrected forms with permission.
+
+Vic Abell
+March 31, 1998
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/nsc_cfs/cnode.h b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/nsc_cfs/cnode.h
new file mode 100644
index 0000000..dfdbd89
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/nsc_cfs/cnode.h
@@ -0,0 +1,78 @@
+/*
+ * cnode.h -- Vic Abell's definition of an nsc_cfs node - with help from
+ *	      the kind folks at SCO
+ */
+
+
+/*
+ * Copyright 2001 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.
+ */
+
+#if	!defined(FS_NSC_CFS_CNODE_H)
+#define	FS_NSC_CFS_CNODE_H	1
+
+#include <sys/nsc_synch.h>
+
+
+/*
+ * chandle_t definition from the kernel's <fs/nsc_cfs/cfs.h>
+ */
+
+#define CFS_FHSIZE 44
+
+typedef struct cfhandle {
+	char fh_data[CFS_FHSIZE];
+} cfhandle_t;
+
+
+/*
+ * CFS node structure
+ */
+
+typedef struct cnode {
+	struct cnode	*c_freef;	/* free list forward pointer */
+	struct cnode	*c_freeb;	/* free list back pointer */
+	struct cnode	*c_hash;	/* cnode hash chain */
+	struct vnode	c_vnode;	/* vnode for remote file */
+	cfhandle_t	c_fh;		/* file handle */
+	void *c_hp;			/* Hash pointer */
+	u_long		c_flags;	/* flags, see below */
+	union {
+		daddr_t C_nextr;	/* next byte read offset (read-ahead) */
+		int	C_lastcookie;	/* last readdir cookie */
+	} c_c;
+	long		c_owner;	/* proc index for locker of cnode */
+	long		c_count;	/* number of cnode locks for c_owner */
+	long		c_lwpid;	/* lwp id of locker of cnode */
+	CONDITION_T	c_cxlock;	/* Synch structure */
+	int		c_rw_excl;	/* RW locked exclusively */
+	/* Credentials here are only for use by cfs-as-nfs-client. */
+	struct cred	*c_cred;	/* current credentials */
+	struct vattr	c_attr;		/* cached vnode attributes */
+/*
+ * Lsof needs nothing below c_attr.
+ */
+} cnode_t;
+#endif	/* !defined(FS_NSC_CFS_CNODE_H) */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/procfs/README b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/procfs/README
new file mode 100644
index 0000000..4b07b74
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/procfs/README
@@ -0,0 +1,4 @@
+This directory applies to UnixWare 2.1.2 and above.
+
+Vic Abell
+February 16, 1998
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/procfs/prdata.h b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/procfs/prdata.h
new file mode 100644
index 0000000..e7130b0
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/fs/procfs/prdata.h
@@ -0,0 +1,228 @@
+#ifndef _FS_PROCFS_PRDATA_H     /* wrapper symbol for kernel use */
+#define _FS_PROCFS_PRDATA_H     /* subject to change without notice */
+
+#ident  "@(#)kern:fs/procfs/prdata.h    1.19.2.1"
+#ident  "$Header: $"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#ifdef _KERNEL_HEADERS
+
+#include <fs/vnode.h>           /* SVR4.2COMPAT */
+#include <io/uio.h>             /* SVR4.0COMPAT */
+#include <mem/seg.h>            /* SVR4.0COMPAT */
+#include <proc/proc.h>          /* REQUIRED */
+#include <util/ksynch.h>        /* REQUIRED */
+#include <util/types.h>         /* REQUIRED */
+
+#elif defined(_KERNEL) 
+
+#include <sys/vnode.h>          /* SVR4.2COMPAT */
+#include <sys/uio.h>            /* SVR4.0COMPAT */
+#include <vm/seg.h>             /* SVR4.0COMPAT */
+#include <sys/proc.h>           /* REQUIRED */
+#include <sys/ksynch.h>         /* REQUIRED */
+#include <sys/types.h>          /* REQUIRED */
+
+#endif /* _KERNEL_HEADERS */
+
+#if defined(_KERNEL) || defined(_KMEMUSER)
+
+/*
+ * Common file object to which all /proc vnodes for a specific process
+ * or LWP refer.
+ */
+typedef struct prcommon {
+        lock_t  prc_mutex;      /* Lock for prc_flags and prc_rdwriters */
+        uchar_t prc_flags;      /* flags */
+        ulong_t prc_rdwriters;  /* # holding or queued for process r/w lock 
+
+
+
+*/
+        sv_t    prc_rdwrdone;   /* sync object to wait for r/w refs done */
+        sv_t    prc_stopsv;     /* sync object to wait for proc or LWP stop 
+
+
+
+*/
+        struct pollhead *prc_pollhead;  /* Pointer to list of pollers */
+        pid_t   prc_pid;        /* process-ID */
+        uint_t  prc_opens;      /* Number of opens of prnodes */
+        uint_t  prc_writers;    /* Number of write opens of prnodes */
+        proc_t  *prc_proc;      /* Associated process */
+        lwp_t   *prc_lwp;       /* Associated LWP */
+        lwpid_t prc_lwpid;      /* LWP id */
+        int     prc_slot;       /* Associated process slot number */
+} prcommon_t;
+
+/* prc_flags */
+#define PRC_DESTROY     0x01    /* process or LWP is being destroyed */
+#define PRC_LWP         0x02    /* structure refers to an LWP */
+#define PRC_SYS         0x04    /* process is a system process */
+
+/*
+ * prc_mutex:   Per prcommon structure lock protecting fields within
+ *              a prcommon structure.
+ */
+extern lkinfo_t prc_mutex_lkinfo;
+
+/*
+ * Node types for /proc files (directories and files contained therein).
+ */
+typedef enum prnodetype {
+        PR_PROCDIR,             /* 00 /proc */
+        PR_PIDDIR,              /* 01 /proc/pid */
+        PR_AS,                  /* 02 /proc/pid/as */
+        PR_CTL,                 /* 03 /proc/pid/ctl */
+        PR_STATUS,              /* 04 /proc/pid/status */
+        PR_PSINFO,              /* 05 /proc/pid/psinfo */
+        PR_MAP,                 /* 06 /proc/pid/map */
+        PR_CRED,                /* 07 /proc/pid/cred */
+        PR_SIGACT,              /* 08 /proc/pid/sigact */
+        PR_OBJECTDIR,           /* 09 /proc/pid/object */
+        PR_LWPDIR,              /* 0A /proc/pid/lwp */
+        PR_LWPIDDIR,            /* 0B /proc/pid/lwp/lwpid */
+        PR_LWPCTL,              /* 0C /proc/pid/lwp/lwpid/lwpctl */
+        PR_LWPSTATUS,           /* 0D /proc/pid/lwp/lwpid/lwpstatus */
+        PR_LWPSINFO             /* 0F /proc/pid/lwp/lwpid/lwpsinfo */
+} prnodetype_t;
+
+typedef struct prnode {
+        lock_t          pr_mutex;       /* Locks pr_flags and child 
+pr_files */
+        prnodetype_t    pr_type;        /* Node type */
+        mode_t          pr_mode;        /* File mode */
+        ino_t           pr_ino;         /* Node id (for stat(2)) */
+        ulong_t         pr_flags;       /* Private flags */
+        prcommon_t      *pr_common;     /* common data structure */
+        prcommon_t      *pr_pcommon;    /* process common data structure */
+        struct vnode    *pr_parent;     /* Parent directory */
+        struct vnode    **pr_files;     /* Contained files (for directory) 
+*/
+        struct vnode    *pr_next;       /* List in chain of (invalid) 
+vnodes */
+        uint_t          pr_index;       /* Position within parent */
+        struct vnode    pr_vnode;       /* Embedded vnode */
+} prnode_t;
+
+/*
+ * Values for pr_flags.
+ */
+#define PR_INVAL        0x01            /* Vnode is invalidated */
+
+
+#define VTOP(vp)        ((prnode_t *)((vp)->v_data))
+#define PTOV(pnp)       (&(pnp)->pr_vnode)
+
+/*
+ * Tables used by prmakenode() in constructing a /proc vnode from
+ * a <directory, name> pair.
+ */
+typedef struct prntable {
+        char            *prn_comp;      /* Name within directory */
+        prnodetype_t    prn_ctype;      /* Node type of result vnode */
+        int             prn_zvisible;   /* Visibility if a zombie */
+        int             prn_nasvisible; /* Visibility if no address space 
+*/
+        vtype_t         prn_ftype;      /* File type of result vnode */
+        mode_t          prn_mode;       /* File mode of result vnode */
+} prntable_t;
+
+
+#endif /* _KERNEL || _KMEMUSER */
+
+
+#ifdef _KERNEL
+
+/*
+ * pr_mutex:    Per-structure lock protecting the pr_files field
+ *              and the pr_flags field of a child.
+ */
+extern lkinfo_t pr_mutex_lkinfo;
+
+extern prntable_t       pdtable[], ldtable[];
+extern int              npdent, nldent;
+
+extern struct vnodeops prvnodeops;
+extern struct vfs *procvfs;
+extern dev_t procdev;
+
+struct pstatus;
+struct psinfo;
+struct lwpstatus;
+struct lwpsinfo;
+struct pfamily;
+
+extern ulong_t  prsize(prnode_t *);
+extern void     prgetsigact(proc_t *, struct sigaction *);
+extern void     prgetaction(proc_t *, int, struct sigaction *);
+extern int      prusrio(proc_t *, enum uio_rw, struct uio *);
+extern lwp_t    *prchoose(proc_t *);
+extern greg_t   prgetpc(gregset_t);
+extern int      prgetscall(gregset_t);
+extern caddr_t  prgetpsaddr(lwp_t *);
+extern void     prdebugon(lwp_t *);
+extern void     prdebugoff(lwp_t *);
+extern void     prgetpfamily(const user_t *up, struct pfamily *fp);
+extern int      prwritectl_family(ulong_t, vnode_t *, uio_t *, int, cred_t 
+*);
+extern boolean_t pr_p_rdwr(prcommon_t *, boolean_t);
+extern void     pr_v_rdwr(prcommon_t *);
+extern boolean_t pr_p_mutex(prcommon_t *);
+#ifdef DEBUG
+extern int      prfilesempty(vnode_t **, int);
+#endif
+extern int      prvpsegs(proc_t *, vnode_t **);
+extern void     prmapname(vnode_t *, char *, ino_t *, cred_t *);
+extern int      prcountsegs(struct as *);
+extern int      prnsegs(struct as *);
+extern int      setisempty(ulong_t *, unsigned int);
+extern int      prgetpstatus(proc_t *, struct pstatus *);
+extern void     prgetpsinfo(proc_t *, struct psinfo *);
+extern int      prgetlwpstatus(lwp_t *, struct lwpstatus *);
+extern void     prgetlwpsinfo(lwp_t *, struct lwpsinfo *);
+extern void     prchlvl(lid_t);
+
+#define prino(slot, lwpid, type) (((lwpid)<<18) | ((slot)<<5) | type + 2)
+
+/*
+ * Is an LWP stopped on an event of interest to /proc?
+ */
+#define ISTOP(lwp)      ((lwp)->l_stat == SSTOP \
+                          && ((lwp)->l_whystop == PR_REQUESTED \
+                              || (lwp)->l_whystop == PR_SIGNALLED \
+                              || (lwp)->l_whystop == PR_SYSENTRY \
+                              || (lwp)->l_whystop == PR_SYSEXIT \
+                              || (lwp)->l_whystop == PR_FAULTED))
+
+/*
+ * Assign one set to another (possible different sizes).
+ *
+ * Assigning to a smaller set causes members to be lost.
+ * Assigning to a larger set causes extra members to be cleared.
+ */
+#define prassignset(ap, sp)                                     \
+{                                                               \
+        register int _i_ = sizeof(*(ap))/sizeof(ulong_t);       \
+        while (--_i_ >= 0)                                      \
+                ((ulong_t*)(ap))[_i_] =                         \
+                  (_i_ >= sizeof(*(sp))/sizeof(ulong_t)) ?      \
+                  0L : ((ulong_t*)(sp))[_i_];                   \
+}
+
+/*
+ * Determine whether or not a set (of arbitrary size) is empty.
+ */
+#define prisempty(sp) setisempty((ulong_t *)(sp), 
+sizeof(*(sp))/sizeof(ulong_t))
+
+#endif /* _KERNEL */
+
+#if defined(__cplusplus)
+        }
+#endif
+
+#endif  /* _FS_PROCFS_PRDATA_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/README b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/README
new file mode 100644
index 0000000..441b270
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/README
@@ -0,0 +1,6 @@
+The header files in this subdirectory tree are Copyright (c) The Santa
+Cruz Operation, Inc.  They are reproduced here, either in their original
+or corrected forms with permission.
+
+Vic Abell
+March 31, 1998
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/fifonode.h b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/fifonode.h
new file mode 100644
index 0000000..39a6857
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/fifonode.h
@@ -0,0 +1,143 @@
+/*
+ * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
+ *                                                                         
+ *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
+ *                   SANTA CRUZ OPERATION INC.                             
+ *                                                                         
+ *   The copyright notice above does not evidence any actual or intended   
+ *   publication of such source code.                                      
+ */
+
+#ifndef _FS_FIFOFS_FIFONODE_H	/* wrapper symbol for kernel use */
+#define _FS_FIFOFS_FIFONODE_H	/* subject to change without notice */
+
+#ident	"@(#)kern:fs/fifofs/fifonode.h	1.14"
+#ident	"$Header: $"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#ifdef _KERNEL_HEADERS
+
+#include <util/types.h>		/* REQUIRED */
+#include <util/ksynch.h>	/* REQUIRED */
+#include <fs/vnode.h>		/* REQUIRED */
+
+#elif defined(_KERNEL) || defined(_KMEMUSER)
+
+#include <sys/types.h>		/* REQUIRED */
+#include <sys/ksynch.h>	/* REQUIRED */
+#include <sys/vnode.h>		/* REQUIRED */
+
+#endif /* _KERNEL_HEADERS */
+
+#if defined(_KERNEL) || defined(_KMEMUSER)
+
+struct nodelock {
+	lock_t	n_lock;
+	int	n_count;
+};
+
+/*
+ * Each FIFOFS object is identified by a struct fifonode/vnode pair.
+ */
+struct fifonode {
+	struct vnode	fn_vnode;	/* represents the fifo/pipe */
+	struct vnode	*fn_mate;	/* the other end of a pipe */
+	struct vnode	*fn_realvp;	/* node being shadowed by fifo */
+	sleep_t		fn_iolock;	/* fifonode iolock */
+	sv_t		fn_rwait;	/* wait for first reader */
+	sv_t		fn_wwait;	/* wait for first writer */
+	sv_t		fn_fdwait;	/* to synchronize fd passing */
+	sv_t		fn_openwait;	/* to serialize fifo_open */
+	ino_t		fn_ino;		/* node id for pipes */
+	short		fn_wcnt;	/* number of writers */
+	short		fn_rcnt;	/* number of readers */
+	short		fn_open;	/* open count of node*/
+	ushort		fn_flag;	/* flags as defined below */
+	struct vnode	*fn_unique;	/* new vnode created by CONNLD */
+	time_t		fn_atime;	/* creation times for pipe */
+	time_t		fn_mtime;
+	time_t		fn_ctime;
+	struct fifonode	*fn_nextp;	/* next link in the linked list */
+	struct fifonode	*fn_backp;	/* back link in linked list */
+	struct nodelock *fn_nodelp;	/* lock shared by both ends of a pipe */
+};
+
+#endif /* _KERNEL || _KMEMUSER */
+
+#ifdef _KERNEL
+
+/*
+ * Valid flags for fifonodes.
+ */
+#define ISPIPE		01	/* fifonode is that of a pipe */
+#define FIFOWOPEN	02	/* open in progress */
+#define FIFOWCLOSE      04	/* close in progress */
+#define FIFOSEND       010	/* file descriptor at stream head of pipe */
+#define FIFOPASS       020	/* CONNLD passed a new vnode in fn_unique */
+#define	FIFOMACPRIV    040	/* bypass MAC checks for privilege process */
+#define CONNLDPUSHED  0100	/* CONNLD is pushed */
+#define FIFOMODTIME   0200	/* access/modification/change time modified */
+
+#define FIFOBSIZE       1024    /* FIFOFS block size */
+
+/* #ifdef MERGE */
+extern int fifo_rdchk(vnode_t *);
+/* #endif MERGE */
+
+/*
+ * Macros to convert a vnode to a fifonode, and vice versa.
+ */
+#define VTOF(vp) ((struct fifonode *)((vp)->v_data))
+#define FTOV(fp) (&(fp)->fn_vnode)
+
+/*
+ * Functions used in multiple places.
+ */
+extern int fifo_rdchk(vnode_t *);
+extern int fifo_mkpipe(vnode_t **, vnode_t **, cred_t *);
+extern void fifo_rmpipe(vnode_t *, vnode_t *, cred_t *);
+
+/*
+ * Macros for manipulating locks and synchronization variables
+ */
+
+/*
+ * Macros called by fifovp() and fifo_inactive()
+ * to avoid a race on the vnode.
+ */
+#define FIFO_LOCK(fp, lockp) \
+	SLEEP_LOCK_RELLOCK(&(fp)->fn_iolock, PRIPIPE, lockp)
+#define FIFO_TRYLOCK(fp) SLEEP_TRYLOCK(&(fp)->fn_iolock)
+#define FIFO_LOCKBLKD(fp) SLEEP_LOCKBLKD(&(fp)->fn_iolock)
+#define FIFO_UNLOCK(fp) SLEEP_UNLOCK(&(fp)->fn_iolock)
+
+/*
+ * Macro to manipulate fn_nodelp->n_lock.
+ */
+#define PIPE_LOCK(fp) LOCK(&(fp)->fn_nodelp->n_lock, PLFIFO)
+#define PIPE_UNLOCK(fp, pl) UNLOCK(&(fp)->fn_nodelp->n_lock, pl)
+
+/*
+ * Macro to manipulate fn_fdwait.
+ * While waiting on fn_fdwait, fn_nodelp->n_lock is dropped.
+ */
+#define FIFO_FDWAIT(fp) \
+	SV_WAIT_SIG(&(fp)->fn_fdwait, PRIPIPE, &(fp)->fn_nodelp->n_lock)
+#define FIFO_FDWAKEUP(fp) SV_SIGNAL(&(fp)->fn_fdwait, 0)
+
+/*
+ * Macro to obtain and release the stream head mutex, sd_mutex
+ */
+#define	STREAM_LOCK(stp) LOCK((stp)->sd_mutex, PLSTR);
+#define	STREAM_UNLOCK(stp, pl) UNLOCK((stp)->sd_mutex, pl);
+
+#endif	/* _KERNEL */
+
+#if defined(__cplusplus)
+	}
+#endif
+
+#endif	/* _FS_FIFOFS_FIFONODE_H */
diff --git a/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/namenode.h b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/namenode.h
new file mode 100644
index 0000000..2c92a0a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/dialects/uw/uw7/sys/fs/namenode.h
@@ -0,0 +1,100 @@
+/*
+ * Copyright (c) 1998 The Santa Cruz Operation, Inc.. All Rights Reserved. 
+ *                                                                         
+ *        THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF THE               
+ *                   SANTA CRUZ OPERATION INC.                             
+ *                                                                         
+ *   The copyright notice above does not evidence any actual or intended   
+ *   publication of such source code.                                      
+ */
+
+#ifndef _FS_NAMEFS_NAMENODE_H	/* wrapper symbol for kernel use */
+#define _FS_NAMEFS_NAMENODE_H	/* subject to change without notice */
+
+#ident	"@(#)kern:fs/namefs/namenode.h	1.13.2.1"
+#ident	"$Header: $"
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+#ifdef _KERNEL_HEADERS
+
+#include <util/types.h>	/* REQUIRED */
+#include <util/ksynch.h>	/* REQUIRED */
+#include <fs/vnode.h>	/* REQUIRED */
+#include <acc/dac/acl.h>	/* REQUIRED */
+
+#elif defined(_KERNEL) || defined(_KMEMUSER)
+
+#include <sys/types.h>	/* REQUIRED */
+#include <sys/ksynch.h>	/* REQUIRED */
+#include <sys/vnode.h>	/* REQUIRED */
+#include <sys/acl.h>	/* REQUIRED */
+
+#endif /* _KERNEL_HEADERS */
+
+/*
+ * This structure is used to pass a file descriptor from user
+ * level to the kernel. It is first used by fattach() and then
+ * be NAMEFS.
+ */
+struct namefd {
+	int fd;
+};
+
+#if defined(_KERNEL) || defined(_KMEMUSER)
+
+/*
+ * Each NAMEFS object is identified by a struct namenode/vnode pair.
+ */
+struct namenode {
+	struct vnode    nm_vnode;	/* represents mounted file desc.*/
+	ushort		nm_flag;	/* flags defined below */
+	struct vattr    nm_vattr;	/* attributes of mounted file desc.*/
+	struct vnode	*nm_filevp;	/* file desc. prior to mounting */
+	struct file	*nm_filep;	/* file pointer of nm_filevp */
+	struct vnode	*nm_mountpt;	/* mount point prior to mounting */
+	struct namenode *nm_nextp;	/* next link in the linked list */
+	struct namenode *nm_backp;	/* back link in linked list */
+	struct acl	*nm_aclp;	/* ACL entries */
+	rwsleep_t	nm_lock;	/* protects namenode */
+};
+
+#endif /* _KERNEL || _KMEMUSER */
+
+#ifdef _KERNEL
+
+/*
+ * Valid flags for namenodes.
+ */
+#define NMUNMOUNT	 01	/* the namenode is unmounted */
+#define NMREMOVED	 02	/* the namenode is removed from namenode list */
+#define NMREAD     	 04	/* the mount file has FREAD set */
+#define NMWRITE     	010	/* the mount file has FWRITE set */
+
+/*
+ * Constants.
+ */
+#define	NMBSIZE		1024	/* NAMEFS block size */
+#define	NMFSIZE		1024	/* NAMEFS fundamental block size */
+
+/*
+ * Macros to convert a vnode to a namenode, and vice versa.
+ */
+#define VTONM(vp) ((struct namenode *)((vp)->v_data))
+#define NMTOV(nm) (&(nm)->nm_vnode)
+
+#define	STREAM_LOCK(stp) LOCK((stp)->sd_mutex, PLSTR);
+#define	STREAM_UNLOCK(stp, pl) UNLOCK((stp)->sd_mutex, pl);
+
+extern int nm_tflush;		/* the frequency of flush namefs */
+extern int namefs_fstype;	/* index into vfssw returned by vfs_attach */
+
+#endif	/* _KERNEL */
+
+#if defined(__cplusplus)
+	}
+#endif
+
+#endif	/* _FS_NAMEFS_NAMENODE_H */
diff --git a/lsof_4.85/lsof_4.85_src/lib/Makefile.skel b/lsof_4.85/lsof_4.85_src/lib/Makefile.skel
new file mode 100644
index 0000000..5c2b022
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/Makefile.skel
@@ -0,0 +1,62 @@
+# Lsof library Makefile skeleton
+#
+# This skeleton is added to definitions established by Configure.
+#
+# $Id: Makefile.skel,v 1.13 2001/02/13 02:12:16 abe Exp $
+
+LIB=	liblsof.a
+
+CDEF=	${RC_CFLAGS}
+CDEFS=	${CDEF} ${CFGF}
+INCL=	${DINC}
+
+HDR=	../lsof.h ../proto.h ../dlsof.h ../dproto.h ../machine.h
+
+SRC=	ckkv.c cvfs.c dvch.c fino.c isfn.c lkud.c pdvn.c prfp.c \
+	ptti.c rdev.c regex.c rmnt.c rnam.c rnch.c rnmh.c snpf.c
+
+OBJ=	ckkv.o cvfs.o dvch.o fino.o isfn.o lkud.o pdvn.o prfp.o \
+	ptti.o rdev.o regex.o rmnt.o rnam.o rnch.o rnmh.o snpf.o
+
+all:	${LIB}
+
+${LIB}:	${OBJ}
+	${AR}
+	${RANLIB}
+
+clean:	FRC
+	rm -f ${LIB} ${OBJ} errs Makefile.bak a.out core
+
+FRC:
+
+ckkv.o: ${HDR} ckkv.c
+
+cvfs.o: ${HDR} cvfs.c
+
+dvch.o: ${HDR} dvch.c
+
+fino.o: ${HDR} fino.c
+
+isfn.o: ${HDR} isfn.c
+
+lkud.o: ${HDR} lkud.c
+
+pdvn.o: ${HDR} pdvn.c
+
+prfp.o: ${HDR} prfp.c
+
+ptti.o:	${HDR} ptti.c
+
+rdev.o: ${HDR} rdev.c
+
+regex.o: ${HDR} ../regex.h regex.c
+
+rmnt.o: ${HDR} rmnt.c
+
+rnam.o: ${HDR} rnam.c
+
+rnch.o: ${HDR} rnch.c
+
+rnmh.o: ${HDR} rnmh.c
+
+snpf.o: ${HDR} snpf.c
diff --git a/lsof_4.85/lsof_4.85_src/lib/ckkv.c b/lsof_4.85/lsof_4.85_src/lib/ckkv.c
new file mode 100644
index 0000000..876758a
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/ckkv.c
@@ -0,0 +1,93 @@
+/*
+ * cvfs.c -- ckkv() function for lsof library
+ */
+
+
+/*
+ * Copyright 1998 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_CKKV)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1998 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ckkv.c,v 1.3 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+#include <sys/utsname.h>
+
+
+/*
+ * ckkv() - check kernel version
+ */
+
+void
+ckkv(d, er, ev, ea)
+	char *d;			/* dialect */
+	char *er;			/* expected revision; NULL, no test */
+	char *ev;			/* expected version; NULL, no test */
+	char *ea;			/* expected architecture; NULL, no
+					 * test */
+{
+
+# if	defined(HASKERNIDCK) 
+	struct utsname u;
+
+	if (Fwarn)
+	    return;
+/*
+ * Read the system information via uname(2).
+ */
+	if (uname(&u) < 0) {
+	    (void) fprintf(stderr, "%s: uname error: %s\n",
+		Pn, strerror(errno));
+	    Exit(1);
+	}
+	if (er && strcmp(er, u.release)) {
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s release %s; this is %s.\n",
+		Pn, d, er, u.release);
+	}
+	if (ev && strcmp(ev, u.version)) {
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s version %s; this is %s.\n",
+		Pn, d, ev, u.version);
+	}
+	if (ea && strcmp(ea, u.machine)) {
+	    (void) fprintf(stderr,
+		"%s: WARNING: compiled for %s architecture %s; this is %s.\n",
+		Pn, d, ea, u.machine);
+	}
+# endif	/* defined(HASKERNIDCK) */
+
+}
+#else	/* !defined(USE_LIB_CKKV) */
+char ckkv_d1[] = "d"; char *ckkv_d2 = ckkv_d1;
+#endif	/* defined(USE_LIB_CKKV) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/cvfs.c b/lsof_4.85/lsof_4.85_src/lib/cvfs.c
new file mode 100644
index 0000000..067e53e
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/cvfs.c
@@ -0,0 +1,110 @@
+/*
+ * cvfs.c -- completevfs() function for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+/*
+ * The caller must define CVFS_DEVSAVE to have the device number moved
+ * from the mounts entry to the local vfs structure.
+ *
+ * The caller must define CVFS_NLKSAVE to have the link count moved from
+ * the mounts entry to the local vfs structure.
+ *
+ * The caller must define CVFS_SZSAVE to have the size moved from the
+ * mounts entry to the local vfs structure.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_COMPLETEVFS)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: cvfs.c,v 1.6 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include	"../lsof.h"
+
+
+/*
+ * completevfs() - complete local vfs structure
+ */
+
+void
+completevfs(vfs, dev)
+	struct l_vfs *vfs;		/* local vfs structure pointer */
+	dev_t *dev;			/* device */
+{
+	struct mounts *mp;
+/*
+ * If only Internet socket files are selected, don't bother completing the
+ * local vfs structure.
+ */
+	if (Selinet)
+	    return;
+/*
+ * Search for a match on device number.
+ */
+	for (mp = readmnt(); mp; mp = mp->next) {
+	    if (mp->dev == *dev) {
+
+# if	defined(CVFS_DEVSAVE)
+		vfs->dev = mp->dev;
+# endif	/* defined(CVFS_DEVSAVE) */
+
+# if	defined(CVFS_NLKSAVE)
+		vfs->nlink = mp->nlink;
+# endif	/* defined(CVFS_NLKSAVE) */
+
+# if	defined(CVFS_SZSAVE)
+		vfs->size = mp->size;
+# endif	/* defined(CVFS_SZSAVE) */
+
+		vfs->dir = mp->dir;
+		vfs->fsname = mp->fsname;
+
+# if	defined(HASFSINO)
+		vfs->fs_ino = mp->inode;
+# endif	/* defined(HASFSINO) */
+
+# if	defined(HASMNTSTAT)
+		vfs->mnt_stat = mp->stat;
+# endif	/* defined(HASMNTSTAT) */
+
+
+		return;
+	    }
+	}
+}
+#else	/* !defined(USE_LIB_COMPLETEVFS) */
+char cvfs_d1[] = "d"; char *cvfs_d2 = cvfs_d1;
+#endif	/* defined(USE_LIB_COMPLETEVFS) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/dvch.c b/lsof_4.85/lsof_4.85_src/lib/dvch.c
new file mode 100644
index 0000000..ffdc4b4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/dvch.c
@@ -0,0 +1,1413 @@
+/*
+ * dvch.c -- device cache functions for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(HASDCACHE)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: dvch.c,v 1.16 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+/*
+ * dvch.c - module that contains common device cache functions
+ *
+ * The caller may define the following:
+ *
+ *	DCACHE_CLONE	is the name of the function that reads and writes the
+ *			clone section of the device cache file.  The clone
+ *			section follows the device section.  If DCACHE_CLONE
+ *			isn't defined, but HAS_STD_CLONE is defined to be 1,
+ *			DCACHE_CLONE defaults to the local static function
+ *			rw_clone_sect() that reads and writes a standard
+ *			clone cache.
+ *
+ *	DCACHE_CLR	is the name of the function that clears the clone and
+ *			pseudo caches when reading the device cache fails.   If
+ *			DCACHE_CLR isn't defined, but HAS_STD_CLONE is defined
+ *			to be 1, DCACHE_CLR defaults to the local static
+ *			function clr_sect() that clears a standard clone cache.
+ *
+ *	DCACHE_PSEUDO	is the name of the function that reads and writes
+ *			the pseudo section of the device cache file.  The
+ *			pseudo section follows the device section and the
+ *			clone section, if there is one.
+ *
+ *	DVCH_CHOWN	if the dialect has no fchown() function, so
+ *			chown() must be used instead.
+ *
+ *	DVCH_DEVPATH	if the path to the device directory isn't "/dev".
+ *
+ *	DVCH_EXPDEV	if st_rdev must be expanded with the expdev()
+ *			macro before use.  (This is an EP/IX artifact.)
+ *
+ *	HASBLKDEV	if block device information is stored in BDevtp[].
+ */
+
+
+/*
+ * Local definitions
+ */
+
+# if	!defined(DVCH_DEVPATH)
+#define	DVCH_DEVPATH	"/dev"
+# endif	/* !defined(DVCH_DEVPATH) */
+
+/*
+ * Local storage
+ */
+
+static int crctbl[CRC_TBLL];		/* crc partial results table */
+
+
+/*
+ * Local function prototypes
+ */
+
+#undef	DCACHE_CLR_LOCAL
+# if	!defined(DCACHE_CLR)
+#  if	defined(HAS_STD_CLONE) && HAS_STD_CLONE==1
+#define	DCACHE_CLR		clr_sect
+#define	DCACHE_CLR_LOCAL	1
+_PROTOTYPE(static void clr_sect,(void));
+#  endif	/* defined(HAS_STD_CLONE) && HAS_STD_CLONE==1 */
+# endif	/* !defined(DCACHE_CLR) */
+
+#undef	DCACHE_CLONE_LOCAL
+# if	!defined(DCACHE_CLONE)
+#  if	defined(HAS_STD_CLONE) && HAS_STD_CLONE==1
+#define	DCACHE_CLONE		rw_clone_sect
+#define	DCACHE_CLONE_LOCAL	1
+_PROTOTYPE(static int rw_clone_sect,(int m));
+#  endif	/* defined(HAS_STD_CLONE) && HAS_STD_CLONE==1 */
+# endif	/*!defined(DCACHE_CLONE) */
+
+
+# if	defined(HASBLKDEV)
+/*
+ * alloc_bdcache() - allocate block device cache
+ */
+
+void
+alloc_bdcache()
+{
+	if (!(BDevtp = (struct l_dev *)calloc((MALLOC_S)BNdev,
+				       sizeof(struct l_dev))))
+	{
+	    (void) fprintf(stderr, "%s: no space for block devices\n", Pn);
+	    Exit(1);
+	}
+	if (!(BSdev = (struct l_dev **)malloc((MALLOC_S)(sizeof(struct l_dev *)
+				       * BNdev))))
+	{
+	    (void) fprintf(stderr, "%s: no space for block device pointers\n",
+		Pn);
+	    Exit(1);
+	}
+}
+# endif	/* defined(HASBLKDEV) */
+
+
+/*
+ * alloc_dcache() - allocate device cache
+ */
+
+void
+alloc_dcache()
+{
+	if (!(Devtp = (struct l_dev *)calloc((MALLOC_S)Ndev,
+				      sizeof(struct l_dev))))
+	{
+	    (void) fprintf(stderr, "%s: no space for devices\n", Pn);
+	    Exit(1);
+	}
+	if (!(Sdev = (struct l_dev **)malloc((MALLOC_S)(sizeof(struct l_dev *)
+				      * Ndev))))
+	{
+	    (void) fprintf(stderr, "%s: no space for device pointers\n",
+		Pn);
+	    Exit(1);
+	}
+}
+
+
+/*
+ * clr_devtab() - clear the device tables and free their space
+ */
+
+void
+clr_devtab()
+{
+	int i;
+
+	if (Devtp) {
+	    for (i = 0; i < Ndev; i++) {
+		if (Devtp[i].name) {
+		    (void) free((FREE_P *)Devtp[i].name);
+		    Devtp[i].name = (char *)NULL;
+		}
+	    }
+	    (void) free((FREE_P *)Devtp);
+	    Devtp = (struct l_dev *)NULL;
+	}
+	if (Sdev) {
+	    (void) free((FREE_P *)Sdev);
+	    Sdev = (struct l_dev **)NULL;
+	}
+	Ndev = 0;
+
+# if	defined(HASBLKDEV)
+	if (BDevtp) {
+	    for (i = 0; i < BNdev; i++) {
+		if (BDevtp[i].name) {
+		    (void) free((FREE_P *)BDevtp[i].name);
+		    BDevtp[i].name = (char *)NULL;
+		}
+	    }
+	    (void) free((FREE_P *)BDevtp);
+	    BDevtp = (struct l_dev *)NULL;
+	}
+	if (BSdev) {
+	    (void) free((FREE_P *)BSdev);
+	    BSdev = (struct l_dev **)NULL;
+	}
+	BNdev = 0;
+# endif	/* defined(HASBLKDEV) */
+
+}
+
+
+# if	defined(DCACHE_CLR_LOCAL)
+/*
+ * clr_sect() - clear cached standard clone sections
+ */
+
+static void
+clr_sect()
+{
+	struct clone *c, *c1;
+
+	if (Clone) {
+	    for (c = Clone; c; c = c1) {
+		c1 = c->next;
+		(void) free((FREE_P *)c);
+	    }
+	    Clone = (struct clone *)NULL;
+	}
+}
+# endif	/* defined(DCACHE_CLR_LOCAL) */
+
+
+/*
+ * crc(b, l, s) - compute a crc for a block of bytes
+ */
+
+void
+crc(b, l, s)
+	char *b;			/* block address */
+	int  l;				/* length */
+	unsigned *s;			/* sum */
+{
+	char *cp;			/* character pointer */
+	char *lm;			/* character limit pointer */
+	unsigned sum;			/* check sum */
+
+	cp = b;
+	lm = cp + l;
+	sum = *s;
+	do {
+		sum ^= ((int) *cp++) & 0xff;
+		sum = (sum >> 8) ^ crctbl[sum & 0xff];
+	} while (cp < lm);
+	*s = sum;
+}
+
+
+/*
+ * crcbld - build the CRC-16 partial results table
+ */
+
+void
+crcbld()
+{
+	int bit;			/* temporary bit value */
+	unsigned entry;			/* entry under construction */
+	int i;				/* polynomial table index */
+	int j;				/* bit shift count */
+
+	for(i = 0; i < CRC_TBLL; i++) {
+		entry = i;
+		for (j = 1; j <= CRC_BITS; j++) {
+			bit = entry & 1;
+			entry >>= 1;
+			if (bit)
+				entry ^= CRC_POLY;
+		}
+		crctbl[i] = entry;
+	}
+}
+
+
+/*
+ * dcpath() - define device cache file paths
+ */
+
+int
+dcpath(rw, npw)
+	int rw;				/* read (1) or write (2) mode */
+	int npw;			/* inhibit (0) or enable (1) no
+					 * path warning message */
+{
+	char buf[MAXPATHLEN+1], *cp1, *cp2, hn[MAXPATHLEN+1];
+	int endf;
+	int i, j;
+	int l = 0;
+	int ierr = 0;			/* intermediate error state */
+	int merr = 0;			/* malloc error state */
+	struct passwd *p = (struct passwd *)NULL;
+	static short wenv = 1;		/* HASENVDC warning state */
+	static short wpp = 1;		/* HASPERSDCPATH warning state */
+/*
+ * Release any space reserved by previous path calls to dcpath().
+ */
+	if (DCpath[1]) {
+	    (void) free((FREE_P *)DCpath[1]);
+	    DCpath[1] = (char *)NULL;
+	}
+	if (DCpath[3]) {
+	    (void) free((FREE_P *)DCpath[3]);
+	    DCpath[3] = (char *)NULL;
+	}
+/*
+ * If a path was specified via -D, it's character address will have been
+ * stored in DCpathArg by ctrl_dcache().  Use that address if the real UID
+ * of this process is root, or the mode is read, or the process is neither
+ * setuid-root nor setgid.
+ */
+	if (Myuid == 0 || rw == 1 || (!Setuidroot && !Setgid))
+	    DCpath[0] = DCpathArg;
+	else
+	    DCpath[0] = (char *)NULL;
+
+# if	defined(HASENVDC)
+/*
+ * If HASENVDC is defined, get its value from the environment, unless this
+ * is a setuid-root process, or the real UID of the process is 0, or the
+ * mode is write and the process is setgid.
+ */
+	if ((cp1 = getenv(HASENVDC)) && (l = strlen(cp1)) > 0
+	&&  !Setuidroot && Myuid && (rw == 1 || !Setgid)) {
+	    if (!(cp2 = mkstrcpy(cp1, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr,
+		    "%s: no space for device cache path: %s=", Pn, HASENVDC);
+		safestrprt(cp1, stderr, 1);
+		merr = 1;
+	    } else
+		DCpath[1] = cp2;
+	} else if (cp1 && l > 0) {
+	    if (!Fwarn && wenv) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: ignoring environment: %s=", Pn, HASENVDC);
+		safestrprt(cp1, stderr, 1);
+	    }
+	    wenv = 0;
+	}
+# endif	/* defined(HASENVDC) */
+
+# if	defined(HASSYSDC)
+/*
+ * If HASSYSDC is defined, record the path of the system-wide device
+ * cache file, unless the mode is write.
+ */
+	if (rw != 2)
+	    DCpath[2] = HASSYSDC;
+	else
+	    DCpath[2] = (char *)NULL;
+# endif	/* defined(HASSYSDC) */
+
+# if	defined(HASPERSDC)
+/*
+ * If HASPERSDC is defined, form a personal device cache path by
+ * interpreting the conversions specified in it.
+ *
+ * Get (HASPERSDCPATH) from the environment and add it to the home directory
+ * path, if possible.
+ */
+	for (cp1 = HASPERSDC, endf = i = 0; *cp1 && !endf; cp1++) {
+	    if (*cp1 != '%') {
+
+	    /*
+	     * If the format character isn't a `%', copy it.
+	     */
+		if (i < (int)sizeof(buf)) {
+		    buf[i++] = *cp1;
+		    continue;
+		} else {
+		    ierr = 2;
+		    break;
+		}
+	     }
+	/*
+	 * `%' starts a conversion; the next character specifies
+	 * the conversion type.
+	 */
+	    cp1++;
+	    switch (*cp1) {
+
+	    /*
+	     * Two consecutive `%' characters convert to one `%'
+	     * character in the output.
+	     */
+
+	    case '%':
+		if (i < (int)sizeof(buf))
+			buf[i++] = '%';
+		else
+			ierr = 2;
+		break;
+
+	    /*
+	     * ``%0'' defines a root boundary.  If the effective
+	     * (setuid-root) or real UID of the process is root, any
+	     * path formed to this point is discarded and path formation
+	     * begins with the next character.
+	     *
+	     * If neither the effective nor the real UID is root, path
+	     * formation ends.
+	     *
+	     * This allows HASPERSDC to specify one path for non-root
+	     * UIDs and another for the root (effective or real) UID.
+	     */
+
+	    case '0':
+		if (Setuidroot || !Myuid)
+		    i = 0;
+		else
+		    endf = 1;
+		break;
+
+	    /*
+	     * ``%h'' converts to the home directory.
+	     */
+	
+	    case 'h':
+		if (!p && !(p = getpwuid(Myuid))) {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: can't get home dir for UID: %d\n",
+			    Pn, (int)Myuid);
+		    ierr = 1;
+		    break;
+		}
+		if ((i + (l = strlen(p->pw_dir))) >= (int)sizeof(buf)) {
+		    ierr = 2;
+		    break;
+		}
+		(void) strcpy(&buf[i], p->pw_dir);
+		i += l;
+		if (i > 0 && buf[i - 1] == '/' && *(cp1 + 1)) {
+
+		/*
+		 * If the home directory ends in a '/' and the next format
+		 * character is a '/', delete the '/' at the end of the home
+		 * directory.
+		 */
+		    i--;
+		    buf[i] = '\0';
+		}
+		break;
+
+	    /*
+	     * ``%l'' converts to the full host name.
+	     *
+	     * ``%L'' converts to the first component (characters up
+	     * to the first `.') of the host name.
+	     */
+
+	    case 'l':
+	    case 'L':
+		if (gethostname(hn, sizeof(hn) - 1) < 0) {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: no gethostname for %%l or %%L: %s\n",
+			    Pn, strerror(errno));
+		    ierr = 1;
+		    break;
+		}
+		hn[sizeof(hn) - 1] = '\0';
+		if (*cp1 == 'L' && (cp2 = strchr(hn, '.')) && cp2 > hn)
+		    *cp2 = '\0';
+		j = strlen(hn);
+		if ((j + i) < (int)sizeof(buf)) {
+		    (void) strcpy(&buf[i], hn);
+		    i += j;
+		} else
+		    ierr = 2;
+		break;
+
+	    /*
+	     * ``%p'' converts to the contents of LSOFPERSDCPATH, followed
+	     * by a '/'.
+	     *
+	     * It is ignored when:
+	     *
+	     *    The lsof process is setuid-root;
+	     *    The real UID of the lsof process is 0;
+	     *    The mode is write and the process is setgid.
+	     */
+
+	    case 'p':
+
+#  if	defined(HASPERSDCPATH)
+		if ((cp2 = getenv(HASPERSDCPATH))
+		&&  (l = strlen(cp2)) > 0
+		&&  !Setuidroot
+		&&  Myuid
+		&&  (rw == 1 || !Setgid))
+		{
+		    if (i && buf[i - 1] == '/' && *cp2 == '/') {
+			cp2++;
+			l--;
+		    }
+		    if ((i + l) < ((int)sizeof(buf) - 1)) {
+			(void) strcpy(&buf[i], cp2);
+			i += l;
+			if (buf[i - 1] != '/') {
+			    if (i < ((int)sizeof(buf) - 2)) {
+				buf[i++] = '/';
+				buf[i] = '\0';
+			    } else
+				ierr = 2;
+			}
+		    } else
+			ierr = 2;
+		} else {
+		    if (cp2 && l > 0)  {
+			if (!Fwarn && wpp) {
+			    (void) fprintf(stderr,
+				"%s: WARNING: ignoring environment: %s",
+				Pn, HASPERSDCPATH);
+			    safestrprt(cp2, stderr, 1);
+			} 
+			wpp = 0;
+		    }
+		}
+#  else	/* !defined(HASPERSDCPATH) */
+		if (!Fwarn && wpp)
+		    (void) fprintf(stderr,
+			"%s: WARNING: HASPERSDCPATH disabled: %s\n",
+			Pn, HASPERSDC);
+		ierr = 1;
+		wpp = 0;
+#  endif	/* defined(HASPERSDCPATH) */
+
+		break;
+
+	    /*
+	     * ``%u'' converts to the login name of the real UID of the
+	     * lsof process.
+	     */
+
+	    case 'u':
+		if (!p && !(p = getpwuid(Myuid))) {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: can't get login name for UID: %d\n",
+			    Pn, (int)Myuid);
+		    ierr = 1;
+		    break;
+		}
+		if ((i + (l = strlen(p->pw_name))) >= (int)sizeof(buf)) {
+		    ierr = 2;
+		    break;
+		}
+		(void) strcpy(&buf[i], p->pw_name);
+		i += l;
+		break;
+
+	    /*
+	     * ``%U'' converts to the real UID of the lsof process.
+	     */
+
+	    case 'U':
+		(void) snpf(hn, sizeof(hn), "%d", (int)Myuid);
+		if ((i + (l = strlen(hn))) >= (int)sizeof(buf))
+		    ierr = 2;
+		else {
+		    (void) strcpy(&buf[i], hn);
+		    i += l;
+		}
+		break;
+	    default:
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: bad conversion (%%%c): %s\n",
+			Pn, *cp1, HASPERSDC);
+		ierr = 1;
+	    }
+	    if (endf || ierr > 1)
+		break;
+	}
+	if (ierr) {
+
+	/*
+	 * If there was an intermediate error of some type, handle it.
+	 * A type 1 intermediate error has already been noted with a
+	 * warning message.  A type 2 intermediate error requires the
+	 * issuing of a buffer overlow warning message.
+	 */
+	    if (ierr == 2 && !Fwarn)
+		(void) fprintf(stderr,
+	 	    "%s: WARNING: device cache path too large: %s\n",
+		    Pn, HASPERSDC);
+	    i = 0;
+	}
+	buf[i] = '\0';
+/*
+ * If there is one, allocate space for the personal device cache path,
+ * copy buf[] to it, and store its pointer in DCpath[3].
+ */
+	if (i) {
+	    if (!(cp1 = mkstrcpy(buf, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr,
+		    "%s: no space for device cache path: ", Pn);
+		safestrprt(buf, stderr, 1);
+		merr = 1;
+	    } else
+		DCpath[3] = cp1;
+	}
+# endif	/* defined(HASPERSDC) */
+
+/*
+ * Quit if there was a malloc() error.  The appropriate error message
+ * will have been issued to stderr.
+ */
+	if (merr)
+	    Exit(1);
+/*
+ * Return the index of the first defined path.  Since DCpath[] is arranged
+ * in priority order, searching it beginning to end follows priority.
+ * Return an error indication if the search discloses no path name.
+ */
+	for (i = 0; i < MAXDCPATH; i++) {
+	    if (DCpath[i])
+		return(i);
+	}
+	if (!Fwarn && npw)
+	    (void) fprintf(stderr,
+		"%s: WARNING: can't form any device cache path\n", Pn);
+	return(-1);
+}
+
+
+/*
+ * open_dcache() - open device cache file
+ */
+
+int
+open_dcache(m, r, s)
+	int m;			/* mode: 1 = read; 2 = write */
+	int r;			/* create DCpath[] if 0, reuse if 1 */
+	struct stat *s;		/* stat() receiver */
+{
+	char buf[128];
+	char *w = (char *)NULL;
+/*
+ * Get the device cache file paths.
+ */
+	if (!r) {
+	    if ((DCpathX = dcpath(m, 1)) < 0)
+		return(1);
+	}
+/*
+ * Switch to the requested open() action.
+ */
+	switch (m) {
+	case 1:
+
+	/*
+	 * Check for access permission.
+	 */
+	    if (!is_readable(DCpath[DCpathX], 0)) {
+		if (DCpathX == 2 && errno == ENOENT)
+		    return(2);
+		if (!Fwarn)
+		    (void) fprintf(stderr, ACCESSERRFMT,
+			Pn, DCpath[DCpathX], strerror(errno));
+		return(1);
+	    }
+	/*
+	 * Open for reading.
+	 */
+	    if ((DCfd = open(DCpath[DCpathX], O_RDONLY, 0)) < 0) {
+		if (DCstate == 3 && errno == ENOENT)
+		    return(1);
+
+cant_open:
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't open %s: %s\n",
+			Pn, DCpath[DCpathX], strerror(errno));
+		return(1);
+	    }
+	    if (stat(DCpath[DCpathX], s) != 0) {
+
+cant_stat:
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't stat(%s): %s\n",
+			Pn, DCpath[DCpathX], strerror(errno));
+close_exit:
+		(void) close(DCfd);
+		DCfd = -1;
+		return(1);
+	    }
+	    if ((int)(s->st_mode & 07777) != ((DCpathX == 2) ? 0644 : 0600)) {
+		(void) snpf(buf, sizeof(buf), "doesn't have %04o modes",
+	    	    (DCpathX == 2) ? 0644 : 0600);
+		w = buf;
+	    } else if ((s->st_mode & S_IFMT) != S_IFREG)
+		w = "isn't a regular file";
+	    else if (!s->st_size)
+		w = "is empty";
+	    if (w) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: %s %s.\n", Pn, DCpath[DCpathX], w);
+		goto close_exit;
+	    }
+	    return(0);
+	case 2:
+
+	/*
+	 * Open for writing: first unlink any previous version; then
+	 * open exclusively, specifying it's an error if the file exists.
+	 */
+	    if (unlink(DCpath[DCpathX]) < 0) {
+		if (errno != ENOENT) {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: can't unlink %s: %s\n",
+			    Pn, DCpath[DCpathX], strerror(errno));
+		    return(1);
+		}
+	    }
+	    if ((DCfd = open(DCpath[DCpathX], O_RDWR|O_CREAT|O_EXCL, 0600)) < 0)
+		goto cant_open;
+	/*
+	 * If the real user is not root, but the process is setuid-root,
+	 * change the ownerships of the file to the real ones.
+	 */
+	    if (Myuid && Setuidroot) {
+
+# if	defined(DVCH_CHOWN)
+	 	if (chown(DCpath[DCpathX], Myuid, getgid()) < 0)
+# else	/* !defined(DVCH_CHOWN) */
+	 	if (fchown(DCfd, Myuid, getgid()) < 0)
+# endif	/* defined(DVCH_CHOWN) */
+
+		{
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			     "%s: WARNING: can't change ownerships of %s: %s\n",
+			     Pn, DCpath[DCpathX], strerror(errno));
+	 	}
+	    }
+	    if (!Fwarn && DCstate != 1 && !DCunsafe)
+		(void) fprintf(stderr,
+		    "%s: WARNING: created device cache file: %s\n",
+			Pn, DCpath[DCpathX]);
+	    if (stat(DCpath[DCpathX], s) != 0) {
+		(void) unlink(DCpath[DCpathX]);
+		goto cant_stat;
+	    }
+	    return(0);
+	default:
+
+	/*
+	 * Oops!
+	 */
+	    (void) fprintf(stderr, "%s: internal error: open_dcache=%d\n",
+		Pn, m);
+	    Exit(1);
+	}
+	return(1);
+}
+
+
+/*
+ * read_dcache() - read device cache file
+ */
+
+int
+read_dcache()
+{
+	char buf[MAXPATHLEN*2], cbuf[64], *cp;
+	int i, len, ov;
+	struct stat sb, devsb;
+/*
+ * Open the device cache file.
+ *
+ * If the open at HASSYSDC fails because the file doesn't exist, and
+ * the real UID of this process is not zero, try to open a device cache
+ * file at HASPERSDC.
+ */
+	if ((ov = open_dcache(1, 0, &sb)) != 0) {
+	    if (DCpathX == 2) {
+		if (ov == 2 && DCpath[3]) {
+		    DCpathX = 3;
+		    if (open_dcache(1, 1, &sb) != 0)
+			return(1);
+		} else
+		    return(1);
+	    } else
+		return(1);
+	}
+/*
+ * If the open device cache file's last mtime/ctime isn't greater than
+ * DVCH_DEVPATH's mtime/ctime, ignore it, unless -Dr was specified.
+ */
+	if (stat(DVCH_DEVPATH, &devsb) != 0) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't stat(%s): %s\n",
+		    Pn, DVCH_DEVPATH, strerror(errno));
+	} else {
+	    if (sb.st_mtime <= devsb.st_mtime || sb.st_ctime <= devsb.st_ctime)
+		DCunsafe = 1;
+	}
+	if (!(DCfs = fdopen(DCfd, "r"))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't fdopen(%s)\n", Pn, DCpath[DCpathX]);
+	    (void) close(DCfd);
+	    DCfd = -1;
+	    return(1);
+	}
+/*
+ * Read the section count line; initialize the CRC table;
+ * validate the section count line.
+ */
+	if (!fgets(buf, sizeof(buf), DCfs)) {
+
+cant_read:
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't fread %s: %s\n", Pn, DCpath[DCpathX],
+		    strerror(errno));
+read_close:
+		(void) fclose(DCfs);
+		DCfd = -1;
+		DCfs = (FILE *)NULL;
+		(void) clr_devtab();
+
+# if	defined(DCACHE_CLR)
+		(void) DCACHE_CLR();
+# endif	/* defined(DCACHE_CLR) */
+
+		return(1);
+	}
+	(void) crcbld();
+	DCcksum = 0;
+	(void) crc(buf, strlen(buf), &DCcksum);
+	i = 1;
+	cp = "";
+
+# if	defined(HASBLKDEV)
+	i++;
+	cp = "s";
+# endif	/* defined(HASBLKDEV) */
+
+# if	defined(DCACHE_CLONE)
+	i++;
+	cp = "s";
+# endif	/* defined(DCACHE_CLONE) */
+
+# if	defined(DCACHE_PSEUDO)
+	i++;
+	cp = "s";
+# endif	/* defined(DCACHE_PSEUDO) */
+
+	(void) snpf(cbuf, sizeof(cbuf), "%d section%s", i, cp);
+	len = strlen(cbuf);
+	(void) snpf(&cbuf[len], sizeof(cbuf) - len, ", dev=%lx\n",
+		    (long)DevDev);
+	if (!strncmp(buf, cbuf, len) && (buf[len] == '\n')) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: no /dev device in %s: line ", Pn,
+		    DCpath[DCpathX]);
+		safestrprt(buf, stderr, 1+4+8);
+	    }
+	    goto read_close;
+	}
+	if (strcmp(buf, cbuf)) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: bad section count line in %s: line ",
+		    Pn, DCpath[DCpathX]);
+		safestrprt(buf, stderr, 1+4+8);
+	    }
+	    goto read_close;
+	}
+/*
+ * Read device section header and validate it.
+ */
+	if (!fgets(buf, sizeof(buf), DCfs))
+	    goto cant_read;
+	(void) crc(buf, strlen(buf), &DCcksum);
+	len = strlen("device section: ");
+	if (strncmp(buf, "device section: ", len) != 0) {
+
+read_dhdr:
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: bad device section header in %s: line ",
+		    Pn, DCpath[DCpathX]);
+		safestrprt(buf, stderr, 1+4+8);
+	    }
+	    goto read_close;
+	}
+/*
+ * Compute the device count; allocate Sdev[] and Devtp[] space.
+ */
+	if ((Ndev = atoi(&buf[len])) < 1)
+	    goto read_dhdr;
+	alloc_dcache();
+/*
+ * Read the device lines and store their information in Devtp[].
+ * Construct the Sdev[] pointers to Devtp[].
+ */
+	for (i = 0; i < Ndev; i++) {
+	    if (!fgets(buf, sizeof(buf), DCfs)) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read device %d from %s\n",
+			Pn, i + 1, DCpath[DCpathX]);
+		goto read_close;
+	    }
+	    (void) crc(buf, strlen(buf), &DCcksum);
+	/*
+	 * Convert hexadecimal device number.
+	 */
+	    if (!(cp = x2dev(buf, &Devtp[i].rdev)) || *cp != ' ') {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: device %d: bad device in %s: line ",
+			Pn, i + 1, DCpath[DCpathX]);
+		    safestrprt(buf, stderr, 1+4+8);
+		}
+		goto read_close;
+	    }
+	/*
+	 * Convert inode number.
+	 */
+	    for (cp++, Devtp[i].inode = (INODETYPE)0; *cp != ' '; cp++) {
+		if (*cp < '0' || *cp > '9') {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: device %d: bad inode # in %s: line ",
+			    Pn, i + 1, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1+4+8);
+		    }
+		    goto read_close;
+		}
+		Devtp[i].inode = (INODETYPE)((Devtp[i].inode * 10)
+			       + (int)(*cp - '0'));
+	    }
+	/*
+	 * Get path name; allocate space for it; copy it; store the
+	 * pointer in Devtp[]; clear verify status; construct the Sdev[]
+	 * pointer to Devtp[].
+	 */
+	    if ((len = strlen(++cp)) < 2 || *(cp + len - 1) != '\n') {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: device %d: bad path in %s: line ",
+			Pn, i + 1, DCpath[DCpathX]);
+		    safestrprt(buf, stderr, 1+4+8);
+		 }
+		 goto read_close;
+	    }
+	    *(cp + len - 1) = '\0';
+	    if (!(Devtp[i].name = mkstrcpy(cp, (MALLOC_S *)NULL))) {
+		(void) fprintf(stderr,
+		    "%s: device %d: no space for path: line ", Pn, i + 1);
+		safestrprt(buf, stderr, 1+4+8);
+		Exit(1);
+	    }
+	    Devtp[i].v = 0;
+	    Sdev[i] = &Devtp[i];
+	}
+
+# if	defined(HASBLKDEV)
+/*
+ * Read block device section header and validate it.
+ */
+	if (!fgets(buf, sizeof(buf), DCfs))
+	    goto cant_read;
+	(void) crc(buf, strlen(buf), &DCcksum);
+	len = strlen("block device section: ");
+	if (strncmp(buf, "block device section: ", len) != 0) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: bad block device section header in %s: line ",
+		    Pn, DCpath[DCpathX]);
+		safestrprt(buf, stderr, 1+4+8);
+	    }
+	    goto read_close;
+	}
+/*
+ * Compute the block device count; allocate BSdev[] and BDevtp[] space.
+ */
+	if ((BNdev = atoi(&buf[len])) > 0) {
+	    alloc_bdcache();
+	/*
+	 * Read the block device lines and store their information in BDevtp[].
+	 * Construct the BSdev[] pointers to BDevtp[].
+	 */
+	    for (i = 0; i < BNdev; i++) {
+		if (!fgets(buf, sizeof(buf), DCfs)) {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: can't read block device %d from %s\n",
+			    Pn, i + 1, DCpath[DCpathX]);
+		    goto read_close;
+		}
+		(void) crc(buf, strlen(buf), &DCcksum);
+	    /*
+	     * Convert hexadecimal device number.
+	     */
+		if (!(cp = x2dev(buf, &BDevtp[i].rdev)) || *cp != ' ') {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: block dev %d: bad device in %s: line ",
+			    Pn, i + 1, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1+4+8);
+		    }
+		    goto read_close;
+		}
+	    /*
+	     * Convert inode number.
+	     */
+		for (cp++, BDevtp[i].inode = (INODETYPE)0; *cp != ' '; cp++) {
+		    if (*cp < '0' || *cp > '9') {
+		      if (!Fwarn) {
+			(void) fprintf(stderr,
+			  "%s: WARNING: block dev %d: bad inode # in %s: line ",
+			  Pn, i + 1, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1+4+8);
+		      }
+		      goto read_close;
+		    }
+		    BDevtp[i].inode = (INODETYPE)((BDevtp[i].inode * 10)
+				    + (int)(*cp - '0'));
+		}
+	    /*
+	     * Get path name; allocate space for it; copy it; store the
+	     * pointer in BDevtp[]; clear verify status; construct the BSdev[]
+	     * pointer to BDevtp[].
+	     */
+		if ((len = strlen(++cp)) < 2 || *(cp + len - 1) != '\n') {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: WARNING: block dev %d: bad path in %s: line",
+			    Pn, i + 1, DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1+4+8);
+		    }
+		    goto read_close;
+		}
+	        *(cp + len - 1) = '\0';
+		if (!(BDevtp[i].name = mkstrcpy(cp, (MALLOC_S *)NULL))) {
+		    (void) fprintf(stderr,
+			"%s: block dev %d: no space for path: line", Pn, i + 1);
+		    safestrprt(buf, stderr, 1+4+8);
+		    Exit(1);
+		}
+	        BDevtp[i].v = 0;
+	        BSdev[i] = &BDevtp[i];
+	    }
+	}
+# endif	/* defined(HASBLKDEV) */
+
+# if	defined(DCACHE_CLONE)
+/*
+ * Read the clone section.
+ */
+	if (DCACHE_CLONE(1))
+	    goto read_close;
+# endif	/* defined(DCACHE_CLONE) */
+
+# if	defined(DCACHE_PSEUDO)
+/*
+ * Read the pseudo section.
+ */
+	if (DCACHE_PSEUDO(1))
+	    goto read_close;
+# endif	/* defined(DCACHE_PSEUDO) */
+
+/*
+ * Read and check the CRC section; it must be the last thing in the file.
+ */
+	(void) snpf(cbuf, sizeof(cbuf), "CRC section: %x\n", DCcksum);
+	if (!fgets(buf, sizeof(buf), DCfs) || strcmp(buf, cbuf) != 0) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: bad CRC section in %s: line ",
+		    Pn, DCpath[DCpathX]);
+		safestrprt(buf, stderr, 1+4+8);
+	    }
+	    goto read_close;
+	}
+	if (fgets(buf, sizeof(buf), DCfs)) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: WARNING: data follows CRC section in %s: line ",
+		    Pn, DCpath[DCpathX]);
+		safestrprt(buf, stderr, 1+4+8);
+	    }
+	    goto read_close;
+	}
+/*
+ * Check one device entry at random -- the randomness based on our
+ * PID.
+ */
+	i = (int)(Mypid % Ndev);
+	if (stat(Devtp[i].name, &sb) != 0
+
+# if	defined(DVCH_EXPDEV)
+	||  expdev(sb.st_rdev) != Devtp[i].rdev
+# else	/* !defined(DVCH_EXPDEV) */
+	||  sb.st_rdev != Devtp[i].rdev
+# endif	/* defined(DVCH_EXPDEV) */
+
+	|| sb.st_ino != Devtp[i].inode) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+			"%s: WARNING: device cache mismatch: %s\n",
+			Pn, Devtp[i].name);
+	    goto read_close;
+	}
+/*
+ * Close the device cache file and return OK.
+ */
+	(void) fclose(DCfs);
+	DCfd = -1;
+	DCfs = (FILE *)NULL;
+	return(0);
+}
+
+
+# if	defined(DCACHE_CLONE_LOCAL)
+/*
+ * rw_clone_sect() - read/write the device cache file clone section
+ */
+
+static int
+rw_clone_sect(m)
+	int m;				/* mode: 1 = read; 2 = write */
+{
+	char buf[MAXPATHLEN*2], *cp, *cp1;
+	struct clone *c;
+	struct l_dev *dp;
+	int i, j, len, n;
+
+	if (m == 1) {
+
+	/*
+	 * Read the clone section header and validate it.
+	 */
+	    if (!fgets(buf, sizeof(buf), DCfs)) {
+
+bad_clone_sect:
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: bad clone section header in %s: line ",
+			Pn, DCpath[DCpathX]);
+		    safestrprt(buf, stderr, 1+4+8);
+		}
+		return(1);
+	    }
+	    (void) crc(buf, strlen(buf), &DCcksum);
+	    len = strlen("clone section: ");
+	    if (strncmp(buf, "clone section: ", len) != 0)
+		goto bad_clone_sect;
+	    if ((n = atoi(&buf[len])) < 0)
+		goto bad_clone_sect;
+	/*
+	 * Read the clone section lines and create the Clone list.
+	 */
+	    for (i = 0; i < n; i++) {
+		if (fgets(buf, sizeof(buf), DCfs) == NULL) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: no %d clone line in %s: line ", Pn, i + 1,
+			    DCpath[DCpathX]);
+			safestrprt(buf, stderr, 1+4+8);
+		    }
+		    return(1);
+		}
+		(void) crc(buf, strlen(buf), &DCcksum);
+	    /*
+	     * Assemble Devtp[] index and make sure it's correct.
+	     */
+		for (cp = buf, j = 0; *cp != ' '; cp++) {
+		    if (*cp < '0' || *cp > '9') {
+
+bad_clone_index:
+			if (!Fwarn) {
+			    (void) fprintf(stderr,
+				"%s: clone %d: bad cached device index: line ",
+				Pn, i + 1);
+			    safestrprt(buf, stderr, 1+4+8);
+			}
+			return(1);
+		    }
+		    j = (j * 10) + (int)(*cp - '0');
+		}
+		if (j < 0 || j >= Ndev || (cp1 = strchr(++cp, '\n')) == NULL)
+		    goto bad_clone_index;
+		if (strncmp(cp, Devtp[j].name, (cp1 - cp)) != 0)
+		    goto bad_clone_index;
+	    /*
+	     * Allocate and complete a clone structure.
+	     */
+		if (!(c = (struct clone *)malloc(sizeof(struct clone)))) {
+		    (void) fprintf(stderr,
+			"%s: clone %d: no space for cached clone: line ", Pn,
+			i + 1);
+		    safestrprt(buf, stderr, 1+4+8);
+		    Exit(1);
+		}
+		c->dx = j;
+		c->next = Clone;
+		Clone = c;
+	    }
+	    return(0);
+	} else if (m == 2) {
+
+	/*
+	 * Write the clone section header.
+	 */
+	    for (c = Clone, n = 0; c; c = c->next, n++)
+		;
+	    (void) snpf(buf, sizeof(buf), "clone section: %d\n", n);
+	    if (wr2DCfd(buf, &DCcksum))
+		return(1);
+	/*
+	 * Write the clone section lines.
+	 */
+	    for (c = Clone; c; c = c->next) {
+		for (dp = &Devtp[c->dx], j = 0; j < Ndev; j++) {
+		    if (dp == Sdev[j])
+			break;
+		}
+		if (j >= Ndev) {
+		    if (!Fwarn) {
+			(void) fprintf(stderr,
+			    "%s: can't make index for clone: ", Pn);
+			safestrprt(dp->name, stderr, 1);
+		    }
+		    (void) unlink(DCpath[DCpathX]);
+		    (void) close(DCfd);
+		    DCfd = -1;
+		    return(1);
+		}
+		(void) snpf(buf, sizeof(buf), "%d %s\n", j, dp->name);
+		if (wr2DCfd(buf, &DCcksum))
+		    return(1);
+	    }
+	    return(0);
+	}
+/*
+ * A shouldn't-happen case: mode neither 1 nor 2.
+ */
+	(void) fprintf(stderr, "%s: internal rw_clone_sect error: %d\n",
+	    Pn, m);
+	Exit(1);
+	return(1);		/* This useless return(1) keeps some
+				 * compilers happy. */
+}
+# endif	/* defined(DCACHE_CLONE_LOCAL) */
+
+
+/*
+ * write_dcache() - write device cache file
+ */
+
+void
+write_dcache()
+{
+	char buf[MAXPATHLEN*2], *cp;
+	struct l_dev *dp;
+	int i;
+	struct stat sb;
+/*
+ * Open the cache file; set up the CRC table; write the section count.
+ */
+	if (open_dcache(2, 0, &sb))
+    		return;
+	i = 1;
+	cp = "";
+
+# if	defined(HASBLKDEV)
+	i++;
+	cp = "s";
+# endif	/* defined(HASBLKDEV) */
+
+# if	defined(DCACHE_CLONE)
+	i++;
+	cp = "s";
+# endif	/* defined(DCACHE_CLONE) */
+
+# if	defined(DCACHE_PSEUDO)
+	i++;
+	cp = "s";
+# endif	/* defined(DCACHE_PSEUDO) */
+
+	(void) snpf(buf, sizeof(buf), "%d section%s, dev=%lx\n", i, cp,
+	    (long)DevDev);
+	(void) crcbld();
+	DCcksum = 0;
+	if (wr2DCfd(buf, &DCcksum))
+		return;
+/*
+ * Write the device section from the contents of Sdev[] and Devtp[].
+ */
+	(void) snpf(buf, sizeof(buf), "device section: %d\n", Ndev);
+	if (wr2DCfd(buf, &DCcksum))
+	    return;
+	for (i = 0; i < Ndev; i++) {
+	    dp = Sdev[i];
+	    (void) snpf(buf, sizeof(buf), "%lx %ld %s\n", (long)dp->rdev,
+			(long)dp->inode, dp->name);
+	    if (wr2DCfd(buf, &DCcksum))
+		return;
+	}
+
+# if	defined(HASBLKDEV)
+/*
+ * Write the block device section from the contents of BSdev[] and BDevtp[].
+ */
+	(void) snpf(buf, sizeof(buf), "block device section: %d\n", BNdev);
+	if (wr2DCfd(buf, &DCcksum))
+	    return;
+	if (BNdev) {
+	    for (i = 0; i < BNdev; i++) {
+		dp = BSdev[i];
+		(void) snpf(buf, sizeof(buf), "%lx %ld %s\n", (long)dp->rdev,
+		    (long)dp->inode, dp->name);
+		if (wr2DCfd(buf, &DCcksum))
+		    return;
+	    }
+	}
+# endif	/* defined(HASBLKDEV) */
+
+# if	defined(DCACHE_CLONE)
+/*
+ * Write the clone section.
+ */
+	if (DCACHE_CLONE(2))
+	    return;
+# endif	/* defined(DCACHE_CLONE) */
+
+# if	defined(DCACHE_PSEUDO)
+/*
+ * Write the pseudo section.
+ */
+	if (DCACHE_PSEUDO(2))
+	    return;
+# endif	/* defined(DCACHE_PSEUDO) */
+
+/*
+ * Write the CRC section and close the file.
+ */
+	(void) snpf(buf, sizeof(buf), "CRC section: %x\n", DCcksum);
+	if (wr2DCfd(buf, (unsigned *)NULL))
+		return;
+	if (close(DCfd) != 0) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't close %s: %s\n",
+		    Pn, DCpath[DCpathX], strerror(errno));
+	    (void) unlink(DCpath[DCpathX]);
+	    DCfd = -1;
+	}
+	DCfd = -1;
+/*
+ * If the previous reading of the previous device cache file marked it
+ * "unsafe," drop that marking and record that the device cache file was
+ * rebuilt.
+ */
+	if (DCunsafe) {
+	    DCunsafe = 0;
+	    DCrebuilt = 1;
+	}
+}
+
+
+/*
+ * wr2DCfd() - write to the DCfd file descriptor
+ */
+
+int
+wr2DCfd(b, c)
+	char *b;			/* buffer */
+	unsigned *c;			/* checksum receiver */
+{
+	int bl, bw;
+
+	bl = strlen(b);
+	if (c)
+	    (void) crc(b, bl, c);
+	while (bl > 0) {
+	    if ((bw = write(DCfd, b, bl)) < 0) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't write to %s: %s\n",
+			Pn, DCpath[DCpathX], strerror(errno));
+		(void) unlink(DCpath[DCpathX]);
+		(void) close(DCfd);
+		DCfd = -1;
+		return(1);
+	    }
+	    b += bw;
+	    bl -= bw;
+	}
+	return(0);
+}
+#else	/* !defined(HASDCACHE) */
+char dvch_d1[] = "d"; char *dvch_d2 = dvch_d1;
+#endif	/* defined(HASDCACHE) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/fino.c b/lsof_4.85/lsof_4.85_src/lib/fino.c
new file mode 100644
index 0000000..6beff86
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/fino.c
@@ -0,0 +1,148 @@
+/*
+ * fino.c -- find inode functions for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+/*
+ * fino.c -- find block (optional) and character device file inode numbers
+ *
+ * The caller must define:
+ *
+ *	HASBLKDEV	to activate the block device inode lookup
+ */
+
+
+#include "../machine.h"
+
+#if	defined(HASBLKDEV) || defined(USE_LIB_FIND_CH_INO)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: fino.c,v 1.5 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+#else	/* !defined(HASBLKDEV) && !defined(USE_LIB_FIND_CH_INO) */
+char fino_d1[] = "d"; char *fino_d2 = fino_d1;
+#endif	/* defined(HASBLKDEV) || defined(USE_LIB_FIND_CH_INO) */
+
+
+#if	defined(HASBLKDEV)
+/*
+ * find_bl_ino() - find the inode number for a block device file
+ */
+
+void
+find_bl_ino()
+{
+	dev_t ldev, tdev;
+	int low, hi, mid;
+
+	readdev(0);
+
+# if	defined(HASDCACHE)
+find_bl_ino_again:
+# endif	/* defined(HASDCACHE) */
+
+	low = mid = 0;
+	hi = BNdev - 1;
+	if (!Lf->dev_def || (Lf->dev != DevDev) || !Lf->rdev_def)
+	    return;
+	ldev = Lf->rdev;
+	while (low <= hi) {
+	    mid = (low + hi) / 2;
+	    tdev = BSdev[mid]->rdev;
+	    if (ldev < tdev)
+		hi = mid - 1;
+	    else if (ldev > tdev)
+		low = mid + 1;
+	    else {
+
+# if	defined(HASDCACHE)
+		if (DCunsafe && !BSdev[mid]->v && !vfy_dev(BSdev[mid]))
+		    goto find_bl_ino_again;
+# endif	/* defined(HASDCACHE) */
+
+		Lf->inode = BSdev[mid]->inode;
+		if (Lf->inp_ty == 0)
+		    Lf->inp_ty = 1;
+		return;
+	    }
+	}
+}
+#endif	/* defined(HASBLKDEV) */
+
+
+#if	defined(USE_LIB_FIND_CH_INO)
+/*
+ * find_ch_ino() - find the inode number for a character device file
+ */
+
+void
+find_ch_ino()
+{
+	dev_t ldev, tdev;
+	int low, hi, mid;
+
+	readdev(0);
+
+# if	defined(HASDCACHE)
+find_ch_ino_again:
+# endif	/* defined(HASDCACHE) */
+
+	low = mid = 0;
+	hi = Ndev - 1;
+	if (!Lf->dev_def || (Lf->dev != DevDev) || !Lf->rdev_def)
+	    return;
+	ldev = Lf->rdev;
+	while (low <= hi) {
+	    mid = (low + hi) / 2;
+	    tdev = Sdev[mid]->rdev;
+	    if (ldev < tdev)
+		hi = mid - 1;
+	    else if (ldev > tdev)
+		low = mid + 1;
+	    else {
+
+# if	defined(HASDCACHE)
+		if (DCunsafe && !Sdev[mid]->v && !vfy_dev(Sdev[mid]))
+		    goto find_ch_ino_again;
+# endif	/* defined(HASDCACHE) */
+
+		Lf->inode = Sdev[mid]->inode;
+		if (Lf->inp_ty == 0)
+		    Lf->inp_ty = 1;
+		return;
+	    }
+	}
+}
+#endif	/* defined(USE_LIB_FIND_CH_INO) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/isfn.c b/lsof_4.85/lsof_4.85_src/lib/isfn.c
new file mode 100644
index 0000000..b23846d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/isfn.c
@@ -0,0 +1,418 @@
+/*
+ * isfn.c -- is_file_named() function for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+/*
+ * To use this source file:
+ *
+ * 1. Define USE_LIB_IS_FILE_NAMED.
+ *
+ * 2. If clone support is required:
+ *
+ *    a.  Define HAVECLONEMAJ to be the name of the variable that
+ *	  contains the status of the clone major device -- e.g.,
+ *
+ *		#define HAVECLONEMAJ HaveCloneMaj
+ *
+ *    b.  Define CLONEMAJ to be the name of the constant or
+ *	  variable that defines the clone major device -- e.g.,
+ *
+ *		#define CLONEMAJ CloneMaj
+ *
+ *    c.  Make sure that clone devices are identified by an lfile
+ *	  element is_stream value of 1.
+ *
+ *    d.  Accept clone searching by device number only.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_IS_FILE_NAMED)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: isfn.c,v 1.10 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+/*
+ * Local structures
+ */
+
+struct hsfile {
+	struct sfile *s;		/* the Sfile table address */
+	struct hsfile *next;		/* the next hash bucket entry */
+};
+
+/*
+ * Local static variables
+ */
+
+# if	defined(HAVECLONEMAJ)
+static struct hsfile *HbyCd =		/* hash by clone buckets */
+	(struct hsfile *)NULL;
+static int HbyCdCt = 0;			/* HbyCd entry count */
+# endif	/* defined(HAVECLONEMAJ) */
+
+static struct hsfile *HbyFdi =		/* hash by file (dev,ino) buckets */
+	(struct hsfile *)NULL;
+static int HbyFdiCt = 0;		/* HbyFdi entry count */
+static struct hsfile *HbyFrd =		/* hash by file raw device buckets */
+	(struct hsfile *)NULL;
+static int HbyFrdCt = 0;		/* HbyFrd entry count */
+static struct hsfile *HbyFsd =		/* hash by file system buckets */
+	(struct hsfile *)NULL;
+static int HbyFsdCt = 0;		/* HbyFsd entry count */
+static struct hsfile *HbyNm =		/* hash by name buckets */
+	(struct hsfile *)NULL;
+static int HbyNmCt = 0;			/* HbyNm entry count */
+
+
+/*
+ * Local definitions
+ */
+
+# if	defined(HAVECLONEMAJ)
+#define	SFCDHASH	1024		/* Sfile hash by clone device (power
+					 * of 2!) */
+# endif	/* defined(HAVECLONEMAJ) */
+
+#define	SFDIHASH	4094		/* Sfile hash by (device,inode) number
+					 * pair bucket count (power of 2!) */
+#define	SFFSHASH	1024		/* Sfile hash by file system device
+					 * number bucket count (power of 2!) */
+#define SFHASHDEVINO(maj, min, ino, mod) ((int)(((int)((((int)(maj+1))*((int)((min+1))))+ino)*31415)&(mod-1)))
+					/* hash for Sfile by major device,
+					 * minor device, and inode, modulo mod
+					 * (mod must be a power of 2) */
+#define	SFRDHASH	1024		/* Sfile hash by raw device number
+					 * bucket count (power of 2!) */
+#define SFHASHRDEVI(maj, min, rmaj, rmin, ino, mod) ((int)(((int)((((int)(maj+1))*((int)((min+1))))+((int)(rmaj+1)*(int)(rmin+1))+ino)*31415)&(mod-1)))
+					/* hash for Sfile by major device,
+					 * minor device, major raw device,
+					 * minor raw device, and inode, modulo
+					 * mod (mod must be a power of 2) */
+#define	SFNMHASH	4096		/* Sfile hash by name bucket count
+					 * (must be a power of 2!) */
+
+
+
+/*
+ * hashSfile() - hash Sfile entries for use in is_file_named() searches
+ */
+
+void
+hashSfile()
+{
+	static int hs = 0;
+	int i;
+	int sfplm = 3;
+	struct sfile *s;
+	struct hsfile *sh, *sn;
+/*
+ * Do nothing if there are no file search arguments cached or if the
+ * hashes have already been constructed.
+ */
+	if (!Sfile || hs)
+	    return;
+/*
+ * Allocate hash buckets by (device,inode), file system device, and file name.
+ */
+
+# if	defined(HAVECLONEMAJ)
+	if (HAVECLONEMAJ) {
+	    if (!(HbyCd = (struct hsfile *)calloc((MALLOC_S)SFCDHASH,
+						  sizeof(struct hsfile))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for %d clone hash buckets\n",
+		    Pn, SFCDHASH);
+		Exit(1);
+	    }
+	    sfplm++;
+	}
+# endif	/* defined(HAVECLONEMAJ) */
+
+	if (!(HbyFdi = (struct hsfile *)calloc((MALLOC_S)SFDIHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d (dev,ino) hash buckets\n",
+		Pn, SFDIHASH);
+	    Exit(1);
+	}
+	if (!(HbyFrd = (struct hsfile *)calloc((MALLOC_S)SFRDHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d rdev hash buckets\n",
+		Pn, SFRDHASH);
+	    Exit(1);
+	}
+	if (!(HbyFsd = (struct hsfile *)calloc((MALLOC_S)SFFSHASH,
+					       sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d file sys hash buckets\n",
+		Pn, SFFSHASH);
+	    Exit(1);
+	}
+	if (!(HbyNm = (struct hsfile *)calloc((MALLOC_S)SFNMHASH,
+					      sizeof(struct hsfile))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for %d name hash buckets\n",
+		Pn, SFNMHASH);
+	    Exit(1);
+	}
+	hs++;
+/*
+ * Scan the Sfile chain, building file, file system, raw device, and file
+ * name hash bucket chains.
+ */
+	for (s = Sfile; s; s = s->next) {
+	    for (i = 0; i < sfplm; i++) {
+		if (i == 0) {
+		    if (!s->aname)
+			continue;
+		    sh = &HbyNm[hashbyname(s->aname, SFNMHASH)];
+		    HbyNmCt++;
+		} else if (i == 1) {
+		    if (s->type) {
+			sh = &HbyFdi[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev), s->i,
+						  SFDIHASH)];
+			HbyFdiCt++;
+		    } else {
+			sh = &HbyFsd[SFHASHDEVINO(GET_MAJ_DEV(s->dev),
+						  GET_MIN_DEV(s->dev),
+						  0,
+						  SFFSHASH)];
+			HbyFsdCt++;
+		    }
+		} else if (i == 2) {
+		    if ((s->mode == S_IFCHR) || (s->mode == S_IFBLK)) {
+			sh = &HbyFrd[SFHASHRDEVI(GET_MAJ_DEV(s->dev),
+						 GET_MIN_DEV(s->dev),
+						 GET_MAJ_DEV(s->rdev),
+						 GET_MIN_DEV(s->rdev),
+						 s->i,
+						 SFRDHASH)];
+			HbyFrdCt++;
+		    } else
+			continue;
+		}
+
+# if	defined(HAVECLONEMAJ)
+		else {
+		    if (!HAVECLONEMAJ || (GET_MAJ_DEV(s->rdev) != CLONEMAJ))
+			continue;
+		    sh = &HbyCd[SFHASHDEVINO(0, GET_MIN_DEV(s->rdev), 0,
+					     SFCDHASH)];
+		    HbyCdCt++;
+		}
+# else	/* ! defined(HAVECLONEMAJ) */
+		else
+		    continue;
+# endif	/* defined(HAVECLONEMAJ) */
+
+		if (!sh->s) {
+		    sh->s = s;
+		    sh->next = (struct hsfile *)NULL;
+		    continue;
+		} else {
+		    if (!(sn = (struct hsfile *)malloc(
+				(MALLOC_S)sizeof(struct hsfile))))
+		    {
+			(void) fprintf(stderr,
+			    "%s: can't allocate hsfile bucket for: %s\n",
+			    Pn, s->aname);
+			Exit(1);
+		    }
+		    sn->s = s;
+		    sn->next = sh->next;
+		    sh->next = sn;
+		}
+	    }
+	}
+}
+
+
+/*
+ * is_file_named() - is this file named?
+ */
+
+int
+is_file_named(p, cd)
+	char *p;			/* path name; NULL = search by device
+					 * and inode (from *Lf) */
+	int cd;				/* character or block type file --
+					 * VCHR or VBLK vnode, or S_IFCHR
+					 * or S_IFBLK inode */
+{
+	char *ep;
+	int f = 0;
+	struct sfile *s = (struct sfile *)NULL;
+	struct hsfile *sh;
+	size_t sz;
+/*
+ * Check for a path name match, as requested.
+ */
+	if (p && HbyNmCt) {
+	    for (sh = &HbyNm[hashbyname(p, SFNMHASH)]; sh; sh = sh->next) {
+		if ((s = sh->s) && strcmp(p, s->aname) == 0) {
+		    f = 2;
+		    break;
+		}
+	    }
+	}
+
+# if	defined(HAVECLONEMAJ)
+/*
+ * If this is a stream, check for a clone device match.
+ */
+	if (!f && HbyCdCt && Lf->is_stream && Lf->dev_def && Lf->rdev_def
+	&&  (Lf->dev == DevDev))
+	{
+	    for (sh = &HbyCd[SFHASHDEVINO(0, GET_MAJ_DEV(Lf->rdev), 0,
+					  SFCDHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (GET_MAJ_DEV(Lf->rdev)
+		==		    GET_MIN_DEV(s->rdev))) {
+		    f = 3;
+		    break;
+		}
+	    }
+	}
+# endif	/* defined(HAVECLONEMAJ) */
+
+/*
+ * Check for a regular file.
+ */
+	if (!f && HbyFdiCt && Lf->dev_def
+	&& (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh = &HbyFdi[SFHASHDEVINO(GET_MAJ_DEV(Lf->dev),
+					   GET_MIN_DEV(Lf->dev),
+					   Lf->inode,
+					   SFDIHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (Lf->dev == s->dev)
+		&&  (Lf->inode == s->i)) {
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a file system match.
+ */
+	if (!f && HbyFsdCt && Lf->dev_def) {
+	    for (sh = &HbyFsd[SFHASHDEVINO(GET_MAJ_DEV(Lf->dev),
+	    				   GET_MIN_DEV(Lf->dev), 0,
+					   SFFSHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (s->dev == Lf->dev)) {
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Check for a character or block device match.
+ */
+	if (!f && HbyFrdCt && cd
+	&&  Lf->dev_def && (Lf->dev == DevDev)
+	&&  Lf->rdev_def
+	&& (Lf->inp_ty == 1 || Lf->inp_ty == 3))
+	{
+	    for (sh = &HbyFrd[SFHASHRDEVI(GET_MAJ_DEV(Lf->dev),
+					  GET_MIN_DEV(Lf->dev),
+					  GET_MAJ_DEV(Lf->rdev),
+					  GET_MIN_DEV(Lf->rdev),
+					  Lf->inode, SFRDHASH)];
+		 sh;
+		 sh = sh->next)
+	    {
+		if ((s = sh->s) && (s->dev == Lf->dev)
+		&&  (s->rdev == Lf->rdev) && (s->i == Lf->inode))
+		{
+		    f = 1;
+		    break;
+		}
+	    }
+	}
+/*
+ * Convert the name if a match occurred.
+ */
+	switch (f) {
+	case 0:
+	    return(0);
+	case 1:
+	    if (s->type) {
+
+	    /*
+	     * If the search argument isn't a file system, propagate it
+	     * to Namech[]; otherwise, let printname() compose the name.
+	     */
+		(void) snpf(Namech, Namechl, "%s", s->name);
+		if (s->devnm) {
+		    ep = endnm(&sz);
+		    (void) snpf(ep, sz, " (%s)", s->devnm);
+		}
+	    }
+	    break;
+	case 2:
+	    (void) strcpy(Namech, p);
+	    break;
+
+# if	defined(HAVECLONEMAJ)
+	/* case 3:		do nothing for stream clone matches */
+# endif	/* defined(HAVECLONEMAJ) */
+
+	}
+	if (s)
+	    s->f = 1;
+	return(1);
+}
+#else	/* !defined(USE_LIB_IS_FILE_NAMED) */
+char isfn_d1[] = "d"; char *isfn_d2 = isfn_d1;
+#endif	/* defined(USE_LIB_IS_FILE_NAMED) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/lkud.c b/lsof_4.85/lsof_4.85_src/lib/lkud.c
new file mode 100644
index 0000000..268af4f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/lkud.c
@@ -0,0 +1,207 @@
+/*
+ * lkud.c -- device lookup functions for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+/*
+ * lkud.c -- lookup device
+ *
+ * The caller may define:
+ *
+ *	HASBLKDEV	to activate block device lookup
+ */
+
+
+#include "../machine.h"
+
+#if	defined(HASBLKDEV) || defined(USE_LIB_LKUPDEV)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: lkud.c,v 1.7 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+#else	/* !defined(HASBLKDEV) && !defined(USE_LIB_LKUPDEV) */
+char lkud_d1[] = "d"; char *lkud_d2 = lkud_d1;
+#endif	/* defined(HASBLKDEV) || defined(USE_LIB_LKUPDEV) */
+
+
+
+#if	defined(HASBLKDEV)
+/*
+ * lkupbdev() - look up a block device
+ */
+
+struct l_dev *
+lkupbdev(dev, rdev, i, r)
+	dev_t *dev;			/* pointer to device number */
+	dev_t *rdev;			/* pointer to raw device number */
+	int i;				/* inode match status */
+	int r;				/* if 1, rebuild the device cache with
+					 * rereaddev() when no match is found
+					 * and HASDCACHE is defined and
+					 * DCunsafe is one */
+{
+	INODETYPE inode = (INODETYPE)0;
+	int low, hi, mid;
+	struct l_dev *dp;
+	int ty = 0;
+
+	if (*dev != DevDev)
+	    return((struct l_dev *)NULL);
+	readdev(0);
+	if (i) {
+	    inode = Lf->inode;
+	    ty = Lf->inp_ty;
+	}
+/*
+ * Search block device table for match.
+ */
+
+# if	defined(HASDCACHE)
+
+lkupbdev_again:
+
+# endif	/* defined(HASDCACHE) */
+
+	low = mid = 0;
+	hi = BNdev - 1;
+	while (low <= hi) {
+	    mid = (low + hi) / 2;
+	    dp = BSdev[mid];
+	    if (*rdev < dp->rdev)
+		hi = mid - 1;
+	    else if (*rdev > dp->rdev)
+		low = mid + 1;
+	    else {
+		if ((i == 0) || (ty != 1) || (inode == dp->inode)) {
+
+# if	defined(HASDCACHE)
+		    if (DCunsafe && !dp->v && !vfy_dev(dp))
+			goto lkupbdev_again;
+# endif	/* defined(HASDCACHE) */
+
+		    return(dp);
+		}
+		if (inode < dp->inode)
+		    hi = mid - 1;
+		else
+		    low = mid + 1;
+	    }
+	}
+
+# if	defined(HASDCACHE)
+	if (DCunsafe && r) {
+	    (void) rereaddev();
+	    goto lkupbdev_again;
+	}
+# endif	/* defined(HASDCACHE) */
+
+	return((struct l_dev *)NULL);
+}
+#endif	/* defined(HASBLKDEV) */
+
+
+#if	defined(USE_LIB_LKUPDEV)
+/*
+ * lkupdev() - look up a character device
+ */
+
+struct l_dev *
+lkupdev(dev, rdev, i, r)
+	dev_t *dev;			/* pointer to device number */
+	dev_t *rdev;			/* pointer to raw device number */
+	int i;				/* inode match status */
+	int r;				/* if 1, rebuild the device cache with
+					 * rereaddev() when no match is found
+					 * and HASDCACHE is defined and
+					 * DCunsafe is one */
+{
+	INODETYPE inode = (INODETYPE)0;
+	int low, hi, mid;
+	struct l_dev *dp;
+	int ty = 0;
+
+	if (*dev != DevDev)
+	    return((struct l_dev *)NULL);
+	readdev(0);
+	if (i) {
+	    inode = Lf->inode;
+	    ty = Lf->inp_ty;
+	}
+/*
+ * Search device table for match.
+ */
+
+# if	defined(HASDCACHE)
+
+lkupdev_again:
+
+# endif	/* defined(HASDCACHE) */
+
+	low = mid = 0;
+	hi = Ndev - 1;
+	while (low <= hi) {
+	    mid = (low + hi) / 2;
+	    dp = Sdev[mid];
+	    if (*rdev < dp->rdev)
+		hi = mid - 1;
+	    else if (*rdev > dp->rdev)
+		low = mid + 1;
+	    else {
+		if ((i == 0) || (ty != 1) || (inode == dp->inode)) {
+
+# if	defined(HASDCACHE)
+		    if (DCunsafe && !dp->v && !vfy_dev(dp))
+			goto lkupdev_again;
+# endif	/* defined(HASDCACHE) */
+
+		    return(dp);
+		}
+		if (inode < dp->inode)
+		    hi = mid - 1;
+		else
+		    low = mid + 1;
+	    }
+	}
+
+# if	defined(HASDCACHE)
+	if (DCunsafe && r) {
+	    (void) rereaddev();
+	    goto lkupdev_again;
+	}
+# endif	/* defined(HASDCACHE) */
+
+	return((struct l_dev *)NULL);
+}
+#endif	/* defined(USE_LIB_LKUPDEV) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/pdvn.c b/lsof_4.85/lsof_4.85_src/lib/pdvn.c
new file mode 100644
index 0000000..ccd5c73
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/pdvn.c
@@ -0,0 +1,182 @@
+/*
+ * pdvn.c -- print device name functions for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_PRINTDEVNAME)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: pdvn.c,v 1.8 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+#else	/* !defined(USE_LIB_PRINTDEVNAME) */
+char pdvn_d1[] = "d"; char *pdvn_d2 = pdvn_d1;
+#endif	/* defined(USE_LIB_PRINTDEVNAME) */
+
+
+/*
+ * To use this source file:
+ *
+ * 1. Define USE_LIB_PRINTDEVNAME, or both.
+ *
+ * 2. Define HAS_STD_CLONE to enable standard clone searches in
+ *    printdevname().
+ *
+ * 3. Define HASBLDKDEV to enable block device processing.
+ */
+
+
+/*
+ * Local definitions
+ */
+
+#define	LIKE_BLK_SPEC	"like block special"
+#define	LIKE_CHR_SPEC	"like character special"
+
+
+# if	defined(USE_LIB_PRINTDEVNAME)
+/*
+ * printdevname() - print block or character device name
+ */
+
+int
+printdevname(dev, rdev, f, nty)
+	dev_t *dev;			/* device */
+	dev_t *rdev;			/* raw device */
+	int f;				/* 1 = print trailing '\n' */
+	int nty;			/* node type: N_BLK or N_CHR */
+{
+
+#  if	defined(HAS_STD_CLONE)
+	struct clone *c;
+#  endif	/* defined(HAS_STD_CLONE) */
+
+	struct l_dev *dp;
+	int r = 1;
+
+#  if	defined(HASDCACHE)
+
+printdevname_again:
+
+#  endif	/* defined(HASDCACHE) */
+
+# if	defined(HAS_STD_CLONE)
+/*
+ * Search for clone if this is a character device on the same device as
+ * /dev (or /devices).
+ */
+	if ((nty == N_CHR) && Lf->is_stream && Clone && (*dev == DevDev)) {
+	    r = 0;	/* Don't let lkupdev() rebuild the device cache,
+			 * because when it has been rebuilt we want to
+			 * search again for clones. */
+	    readdev(0);
+	    for (c = Clone; c; c = c->next) {
+		if (GET_MAJ_DEV(*rdev) == GET_MIN_DEV(Devtp[c->dx].rdev)) {
+
+#  if	defined(HASDCACHE)
+		    if (DCunsafe && !Devtp[c->dx].v && !vfy_dev(&Devtp[c->dx]))
+			goto printdevname_again;
+#  endif	/* defined(HASDCACHE) */
+
+		    safestrprt(Devtp[c->dx].name, stdout, f);
+		    return(1);
+		}
+	    }
+	}
+# endif	/* defined(HAS_STD_CLONE) */
+
+/*
+ * Search appropriate device table for a full match.
+ */
+
+# if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(dev, rdev, 1, r);
+	else
+# endif	/* defined(HASBLKDEV) */
+
+	dp = lkupdev(dev, rdev, 1, r);
+	if (dp) {
+	    safestrprt(dp->name, stdout, f);
+	    return(1);
+	}
+/*
+ * Search device table for a match without inode number and dev.
+ */
+
+# if	defined(HASBLKDEV)
+	if (nty == N_BLK)
+	    dp = lkupbdev(&DevDev, rdev, 0, r);
+	else
+# endif	/* defined(HASBLKDEV) */
+
+	dp = lkupdev(&DevDev, rdev, 0, r);
+	if (dp) {
+	/*
+	 * A match was found.  Record it as a name column addition.
+	 */
+	    char *cp, *ttl;
+	    int len;
+
+	    ttl = (nty == N_BLK) ? LIKE_BLK_SPEC : LIKE_CHR_SPEC;
+	    len = (int)(1 + strlen(ttl) + 1 + strlen(dp->name) + 1);
+	    if (!(cp = (char *)malloc((MALLOC_S)(len + 1)))) {
+		(void) fprintf(stderr, "%s: no nma space for: (%s %s)\n",
+		    Pn, ttl, dp->name);
+		Exit(1);
+	    }
+	    (void) snpf(cp, len + 1, "(%s %s)", ttl, dp->name);
+	    (void) add_nma(cp, len);
+	    (void) free((MALLOC_P *)cp);
+	    return(0);
+	}
+
+# if	defined(HASDCACHE)
+/*
+ * We haven't found a match.
+ *
+ * If rebuilding the device cache was suppressed and the device cache is
+ * "unsafe," rebuild it.
+ */
+	if (!r && DCunsafe) {
+	    (void) rereaddev();
+	    goto printdevname_again;
+	}
+# endif	/* defined(HASDCACHE) */
+
+	return(0);
+}
+#endif	/* defined(USE_LIB_PRINTDEVNAME) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/prfp.c b/lsof_4.85/lsof_4.85_src/lib/prfp.c
new file mode 100644
index 0000000..2f8d841
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/prfp.c
@@ -0,0 +1,212 @@
+/*
+ * prfp.c -- process_file() function for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_PROCESS_FILE)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: prfp.c,v 1.14 2008/10/21 16:12:36 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+/*
+ * process_file() - process file
+ */
+
+/*
+ * The caller may define:
+ *
+ *	FILEPTR	as the name of the location to store a pointer
+ *			to the current file struct -- e.g.,
+ *
+ *			struct file *foobar;
+ *			#define FILEPTR	foobar
+ */
+
+void
+process_file(fp)
+	KA_T fp;			/* kernel file structure address */
+{
+	struct file f;
+	int flag;
+	char tbuf[32];
+
+#if	defined(FILEPTR)
+/*
+ * Save file structure address for process_node().
+ */
+	FILEPTR = &f;
+#endif	/* defined(FILEPTR) */
+
+/*
+ * Read file structure.
+ */
+	if (kread((KA_T)fp, (char *)&f, sizeof(f))) {
+	    (void) snpf(Namech, Namechl, "can't read file struct from %s",
+		print_kptr(fp, (char *)NULL, 0));
+	    enter_nm(Namech);
+	    return;
+	}
+	Lf->off = (SZOFFTYPE)f.f_offset;
+	if (f.f_count) {
+
+	/*
+	 * Construct access code.
+	 */
+	    if ((flag = (f.f_flag & (FREAD | FWRITE))) == FREAD)
+		Lf->access = 'r';
+	    else if (flag == FWRITE)
+		Lf->access = 'w';
+	    else if (flag == (FREAD | FWRITE))
+		Lf->access = 'u';
+
+#if	defined(HASFSTRUCT)
+	/*
+	 * Save file structure values.
+	 */
+
+# if	!defined(HASNOFSCOUNT)
+	    if (Fsv & FSV_CT) {
+		Lf->fct = (long)f.f_count;
+		Lf->fsv |= FSV_CT;
+	    }
+# endif	/* !defined(HASNOFSCOUNT) */
+
+# if	!defined(HASNOFSADDR)
+	    if (Fsv & FSV_FA) {
+		Lf->fsa = fp;
+		Lf->fsv |= FSV_FA;
+	    }
+# endif	/* !defined(HASNOFSADDR) */
+
+# if	!defined(HASNOFSFLAGS)
+	    if (Fsv & FSV_FG) {
+		Lf->ffg = (long)f.f_flag;
+		Lf->fsv |= FSV_FG;
+	    }
+# endif	/* !defined(HASNOFSFLAGS) */
+
+# if	!defined(HASNOFSNADDR)
+	    if (Fsv & FSV_NI) {
+		Lf->fna = (KA_T)f.f_data;
+		Lf->fsv |= FSV_NI;
+	    }
+# endif	/* !defined(HASNOFSNADDR) */
+#endif	/* defined(HASFSTRUCT) */
+
+	/*
+	 * Process structure by its type.
+	 */
+	    switch (f.f_type) {
+
+
+#if	defined(DTYPE_PIPE)
+	    case DTYPE_PIPE:
+# if	defined(HASPIPEFN)
+		if (!Selinet)
+		    HASPIPEFN((KA_T)f.f_data);
+# endif	/* defined(HASPIPEFN) */
+		return;
+#endif	/* defined(DTYPE_PIPE) */
+
+#if	defined(DTYPE_GNODE)
+	    case DTYPE_GNODE:
+#endif	/* defined(DTYPE_GNODE) */
+
+#if	defined(DTYPE_INODE)
+	    case DTYPE_INODE:
+#endif	/* defined(DTYPE_INODE) */
+
+#if	defined(DTYPE_PORT)
+	    case DTYPE_PORT:
+#endif	/* defined(DTYPE_PORT) */
+
+#if	defined(DTYPE_VNODE)
+	    case DTYPE_VNODE:
+#endif	/* defined(DTYPE_VNODE) */
+
+#if	defined(HASF_VNODE)
+		process_node((KA_T)f.f_vnode);
+#else	/* !defined(HASF_VNODE) */
+		process_node((KA_T)f.f_data);
+#endif	/* defined(HASF_VNODE) */
+
+		return;
+	    case DTYPE_SOCKET:
+		process_socket((KA_T)f.f_data);
+		return;
+
+#if	defined(HASKQUEUE)
+	    case DTYPE_KQUEUE:
+		process_kqueue((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASKQUEUE) */
+
+#if	defined(HASPSXSEM)
+	    case DTYPE_PSXSEM:
+		process_psxsem((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASPSXSEM) */
+
+#if	defined(HASPSXSHM)
+	    case DTYPE_PSXSHM:
+		process_psxshm((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASPSXSHM) */
+
+#if	defined(HASPRIVFILETYPE)
+	    case PRIVFILETYPE:
+		HASPRIVFILETYPE((KA_T)f.f_data);
+		return;
+#endif	/* defined(HASPRIVFILETYPE) */
+
+	    default:
+		if (f.f_type || f.f_ops) {
+		    (void) snpf(Namech, Namechl,
+			"%s file struct, ty=%#x, op=%s",
+			print_kptr(fp, tbuf, sizeof(tbuf)), (int)f.f_type,
+			print_kptr((KA_T)f.f_ops, (char *)NULL, 0));
+		    enter_nm(Namech);
+		    return;
+		}
+	    }
+	}
+	enter_nm("no more information");
+}
+#else	/* !defined(USE_LIB_PROCESS_FILE) */
+char prfp_d1[] = "d"; char *prfp_d2 = prfp_d1;
+#endif	/* defined(USE_LIB_PROCESS_FILE) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/ptti.c b/lsof_4.85/lsof_4.85_src/lib/ptti.c
new file mode 100644
index 0000000..e542454
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/ptti.c
@@ -0,0 +1,1370 @@
+/*
+ * ptti.c -- BSD style print_tcptpi() function for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_PRINT_TCPTPI)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: ptti.c,v 1.6 2008/10/21 16:13:23 abe Exp $";
+# endif	/* !defined(lint) */
+
+#define	TCPSTATES			/* activate tcpstates[] */
+#include "../lsof.h"
+
+
+/*
+ * build_IPstates() -- build the TCP and UDP state tables
+ *
+ * Note: this module does not support a UDP state table.
+ */
+
+void
+build_IPstates()
+{
+
+/*
+ * Set the TcpNstates global variable.
+ */
+	TcpNstates = TCP_NSTATES;
+	TcpSt = (char **)&tcpstates;
+}
+
+
+/*
+ * print_tcptpi() - print TCP/TPI info
+ */
+
+void
+print_tcptpi(nl)
+	int nl;				/* 1 == '\n' required */
+{
+	int ps = 0;
+	int s;
+
+	if ((Ftcptpi & TCPTPI_STATE) && Lf->lts.type == 0) {
+	    if (Ffield)
+		(void) printf("%cST=", LSOF_FID_TCPTPI);
+	    else
+		putchar('(');
+	    if (!TcpNstates)
+		(void) build_IPstates();
+	    if ((s = Lf->lts.state.i) < 0 || s >= TcpNstates)
+		(void) printf("UNKNOWN_TCP_STATE_%d", s);
+	    else
+		(void) fputs(TcpSt[s], stdout);
+	    ps++;
+	    if (Ffield)
+		putchar(Terminator);
+	}
+
+#if	defined(HASTCPTPIQ)
+	if (Ftcptpi & TCPTPI_QUEUES) {
+	    if (Lf->lts.rqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QR=%lu", Lf->lts.rq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.sqs) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("QS=%lu", Lf->lts.sq);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASSOOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int opt;
+
+	    if ((opt = Lf->lts.opt)
+	    ||  Lf->lts.pqlens || Lf->lts.qlens || Lf->lts.qlims
+	    ||  Lf->lts.rbszs  || Lf->lts.sbsz
+	    ) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSO", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(SO_ACCEPTCONN)
+		if (opt & SO_ACCEPTCONN) {
+		    (void) printf("%cACCEPTCONN", sep);
+		    opt &= ~SO_ACCEPTCONN;
+		    sep = ',';
+		}
+# endif	/* defined(SO_ACCEPTCONN) */
+
+# if	defined(SO_ACCEPTFILTER)
+		if (opt & SO_ACCEPTFILTER) {
+		    (void) printf("%cACCEPTFILTER", sep);
+		    opt &= ~SO_ACCEPTFILTER;
+		    sep = ',';
+		}
+# endif	/* defined(SO_ACCEPTFILTER) */
+
+# if	defined(SO_AUDIT)
+		if (opt & SO_AUDIT) {
+		    (void) printf("%cAUDIT", sep);
+		    opt &= ~SO_AUDIT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_AUDIT) */
+
+# if	defined(SO_BINDANY)
+		if (opt & SO_BINDANY) {
+		    (void) printf("%cBINDANY", sep);
+		    opt &= ~SO_BINDANY;
+		    sep = ',';
+		}
+# endif	/* defined(SO_BINDANY) */
+
+# if	defined(SO_BINTIME)
+		if (opt & SO_BINTIME) {
+		    (void) printf("%cBINTIME", sep);
+		    opt &= ~SO_BINTIME;
+		    sep = ',';
+		}
+# endif	/* defined(SO_BINTIME) */
+
+# if	defined(SO_BROADCAST)
+		if (opt & SO_BROADCAST) {
+		    (void) printf("%cBROADCAST", sep);
+		    opt &= ~SO_BROADCAST;
+		    sep = ',';
+		}
+# endif	/* defined(SO_BROADCAST) */
+
+# if	defined(SO_CKSUMRECV)
+		if (opt & SO_CKSUMRECV) {
+		    (void) printf("%cCKSUMRECV", sep);
+		    opt &= ~SO_CKSUMRECV;
+		    sep = ',';
+		}
+# endif	/* defined(SO_CKSUMRECV) */
+
+# if	defined(SO_CLUA_IN_NOALIAS)
+		if (opt & SO_CLUA_IN_NOALIAS) {
+		    (void) printf("%cCLUA_IN_NOALIAS", sep);
+		    opt &= ~SO_CLUA_IN_NOALIAS;
+		    sep = ',';
+		}
+# endif	/* defined(SO_CLUA_IN_NOALIAS) */
+
+# if	defined(SO_CLUA_IN_NOLOCAL)
+		if (opt & SO_CLUA_IN_NOLOCAL) {
+		    (void) printf("%cCLUA_IN_NOLOCAL", sep);
+		    opt &= ~SO_CLUA_IN_NOLOCAL;
+		    sep = ',';
+		}
+# endif	/* defined(SO_CLUA_IN_NOLOCAL) */
+
+# if	defined(SO_DEBUG)
+		if (opt & SO_DEBUG) {
+		    (void) printf("%cDEBUG", sep);
+		    opt &= ~ SO_DEBUG;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DEBUG) */
+
+# if	defined(SO_DGRAM_ERRIND)
+		if (opt & SO_DGRAM_ERRIND) {
+		    (void) printf("%cDGRAM_ERRIND", sep);
+		    opt &= ~SO_DGRAM_ERRIND;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DGRAM_ERRIND) */
+
+# if	defined(SO_DONTROUTE)
+		if (opt & SO_DONTROUTE) {
+		    (void) printf("%cDONTROUTE", sep);
+		    opt &= ~SO_DONTROUTE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DONTROUTE) */
+
+# if	defined(SO_DONTTRUNC)
+		if (opt & SO_DONTTRUNC) {
+		    (void) printf("%cDONTTRUNC", sep);
+		    opt &= ~SO_DONTTRUNC;
+		    sep = ',';
+		}
+# endif	/* defined(SO_DONTTRUNC) */
+
+# if	defined(SO_EXPANDED_RIGHTS)
+		if (opt & SO_EXPANDED_RIGHTS) {
+		    (void) printf("%cEXPANDED_RIGHTS", sep);
+		    opt &= ~SO_EXPANDED_RIGHTS;
+		    sep = ',';
+		}
+# endif	/* defined(SO_EXPANDED_RIGHTS) */
+
+# if	defined(SO_KEEPALIVE)
+		if (opt & SO_KEEPALIVE) {
+		    (void) printf("%cKEEPALIVE", sep);
+		    if (Lf->lts.kai)
+			(void) printf("=%d", Lf->lts.kai);
+		    opt &= ~SO_KEEPALIVE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_KEEPALIVE) */
+
+# if	defined(SO_KERNACCEPT)
+		if (opt & SO_KERNACCEPT) {
+		    (void) printf("%cKERNACCEPT", sep);
+		    opt &= ~SO_KERNACCEPT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_KERNACCEPT) */
+
+# if	defined(SO_IMASOCKET)
+		if (opt & SO_IMASOCKET) {
+		    (void) printf("%cIMASOCKET", sep);
+		    opt &= ~SO_IMASOCKET;
+		    sep = ',';
+		}
+# endif	/* defined(SO_IMASOCKET) */
+
+# if	defined(SO_LINGER)
+		if (opt & SO_LINGER) {
+		    (void) printf("%cLINGER", sep);
+		    if (Lf->lts.ltm)
+			(void) printf("=%d", Lf->lts.ltm);
+		    opt &= ~SO_LINGER;
+		    sep = ',';
+		}
+# endif	/* defined(SO_LINGER) */
+
+# if	defined(SO_LISTENING)
+		if (opt & SO_LISTENING) {
+		    (void) printf("%cLISTENING", sep);
+		    opt &= ~SO_LISTENING;
+		    sep = ',';
+		}
+# endif	/* defined(SO_LISTENING) */
+
+# if	defined(SO_MGMT)
+		if (opt & SO_MGMT) {
+		    (void) printf("%cMGMT", sep);
+		    opt &= ~SO_MGMT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_MGMT) */
+
+# if	defined(SO_PAIRABLE)
+		if (opt & SO_PAIRABLE) {
+		    (void) printf("%cPAIRABLE", sep);
+		    opt &= ~SO_PAIRABLE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_PAIRABLE) */
+
+# if	defined(SO_RESVPORT)
+		if (opt & SO_RESVPORT) {
+		    (void) printf("%cRESVPORT", sep);
+		    opt &= ~SO_RESVPORT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_RESVPORT) */
+
+# if	defined(SO_NOREUSEADDR)
+		if (opt & SO_NOREUSEADDR) {
+		    (void) printf("%cNOREUSEADDR", sep);
+		    opt &= ~SO_NOREUSEADDR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_NOREUSEADDR) */
+
+# if	defined(SO_NOSIGPIPE)
+		if (opt & SO_NOSIGPIPE) {
+		    (void) printf("%cNOSIGPIPE", sep);
+		    opt &= ~SO_NOSIGPIPE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_NOSIGPIPE) */
+
+# if	defined(SO_OOBINLINE)
+		if (opt & SO_OOBINLINE) {
+		    (void) printf("%cOOBINLINE", sep);
+		    opt &= ~SO_OOBINLINE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_OOBINLINE) */
+
+# if	defined(SO_ORDREL)
+		if (opt & SO_ORDREL) {
+		    (void) printf("%cORDREL", sep);
+		    opt &= ~SO_ORDREL;
+		    sep = ',';
+		}
+# endif	/* defined(SO_ORDREL) */
+
+		if (Lf->lts.pqlens) {
+		    (void) printf("%cPQLEN=%u", sep, Lf->lts.pqlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlens) {
+		    (void) printf("%cQLEN=%u", sep, Lf->lts.qlen);
+		    sep = ',';
+		}
+		if (Lf->lts.qlims) {
+		    (void) printf("%cQLIM=%u", sep, Lf->lts.qlim);
+		    sep = ',';
+		}
+		if (Lf->lts.rbszs) {
+		    (void) printf("%cRCVBUF=%lu", sep, Lf->lts.rbsz);
+		    sep = ',';
+		}
+
+# if	defined(SO_REUSEADDR)
+		if (opt & SO_REUSEADDR) {
+		    (void) printf("%cREUSEADDR", sep);
+		    opt &= ~SO_REUSEADDR;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEADDR) */
+
+# if	defined(SO_REUSEALIASPORT)
+		if (opt & SO_REUSEALIASPORT) {
+		    (void) printf("%cREUSEALIASPORT", sep);
+		    opt &= ~SO_REUSEALIASPORT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEALIASPORT) */
+
+# if	defined(SO_REUSEPORT)
+		if (opt & SO_REUSEPORT) {
+		    (void) printf("%cREUSEPORT", sep);
+		    opt &= ~SO_REUSEPORT;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSEPORT) */
+
+# if	defined(SO_REUSERAD)
+		if (opt & SO_REUSERAD) {
+		    (void) printf("%cREUSERAD", sep);
+		    opt &= ~SO_REUSERAD;
+		    sep = ',';
+		}
+# endif	/* defined(SO_REUSERAD) */
+
+# if	defined(SO_SECURITY_REQUEST)
+		if (opt & SO_SECURITY_REQUEST) {
+		    (void) printf("%cSECURITY_REQUEST", sep);
+		    opt &= ~SO_SECURITY_REQUEST;
+		    sep = ',';
+		}
+# endif	/* defined(SO_SECURITY_REQUEST) */
+
+		if (Lf->lts.sbszs) {
+		    (void) printf("%cSNDBUF=%lu", sep, Lf->lts.sbsz);
+		    sep = ',';
+		}
+
+# if	defined(SO_TIMESTAMP)
+		if (opt & SO_TIMESTAMP) {
+		    (void) printf("%cTIMESTAMP", sep);
+		    opt &= ~SO_TIMESTAMP;
+		    sep = ',';
+		}
+# endif	/* defined(SO_TIMESTAMP) */
+
+# if	defined(SO_UMC)
+		if (opt & SO_UMC) {
+		    (void) printf("%cUMC", sep);
+		    opt &= ~SO_UMC;
+		    sep = ',';
+		}
+# endif	/* defined(SO_UMC) */
+
+# if	defined(SO_USE_IFBUFS)
+		if (opt & SO_USE_IFBUFS) {
+		    (void) printf("%cUSE_IFBUFS", sep);
+		    opt &= ~SO_USE_IFBUFS;
+		    sep = ',';
+		}
+# endif	/* defined(SO_USE_IFBUFS) */
+
+# if	defined(SO_USELOOPBACK)
+		if (opt & SO_USELOOPBACK) {
+		    (void) printf("%cUSELOOPBACK", sep);
+		    opt &= ~SO_USELOOPBACK;
+		    sep = ',';
+		}
+# endif	/* defined(SO_USELOOPBACK) */
+
+# if	defined(SO_WANTMORE)
+		if (opt & SO_WANTMORE) {
+		    (void) printf("%cWANTMORE", sep);
+		    opt &= ~SO_WANTMORE;
+		    sep = ',';
+		}
+# endif	/* defined(SO_WANTMORE) */
+
+# if	defined(SO_WANTOOBFLAG)
+		if (opt & SO_WANTOOBFLAG) {
+		    (void) printf("%cWANTOOBFLAG", sep);
+		    opt &= ~SO_WANTOOBFLAG;
+		    sep = ',';
+		}
+# endif	/* defined(SO_WANTOOBFLAG) */
+
+		if (opt)
+		    (void) printf("%cUNKNOWN=%#x", sep, opt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    unsigned int ss;
+
+	    if ((ss = Lf->lts.ss)) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cSS", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(SS_ASYNC)
+		if (ss & SS_ASYNC) {
+		    (void) printf("%cASYNC", sep);
+		    ss &= ~SS_ASYNC;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ASYNC) */
+
+# if	defined(SS_BOUND)
+		if (ss & SS_BOUND) {
+		    (void) printf("%cBOUND", sep);
+		    ss &= ~SS_BOUND;
+		    sep = ',';
+		}
+# endif	/* defined(SS_BOUND) */
+
+# if	defined(HASSBSTATE)
+#  if	defined(SBS_CANTRCVMORE)
+		if (Lf->lts.sbs_rcv & SBS_CANTRCVMORE) {
+		    (void) printf("%cCANTRCVMORE", sep);
+		    Lf->lts.sbs_rcv &= ~SBS_CANTRCVMORE;
+		    sep = ',';
+		}
+#  endif	/* defined(SBS_CANTRCVMORE) */
+
+#  if	defined(SBS_CANTSENDMORE)
+		if (Lf->lts.sbs_snd & SBS_CANTSENDMORE) {
+		    (void) printf("%cCANTSENDMORE", sep);
+		    Lf->lts.sbs_snd &= ~SBS_CANTSENDMORE;
+		    sep = ',';
+		}
+#  endif	/* defined(SS_CANTSENDMORE) */
+# else	/* !defined(HASSBSTATE) */
+
+#  if	defined(SS_CANTRCVMORE)
+		if (ss & SS_CANTRCVMORE) {
+		    (void) printf("%cCANTRCVMORE", sep);
+		    ss &= ~SS_CANTRCVMORE;
+		    sep = ',';
+		}
+#  endif	/* defined(SS_CANTRCVMORE) */
+
+#  if	defined(SS_CANTSENDMORE)
+		if (ss & SS_CANTSENDMORE) {
+		    (void) printf("%cCANTSENDMORE", sep);
+		    ss &= ~SS_CANTSENDMORE;
+		    sep = ',';
+		}
+#  endif	/* defined(SS_CANTSENDMORE) */
+# endif	/* defined(HASSBSTATE) */
+
+# if	defined(SS_COMP)
+		if (ss & SS_COMP) {
+		    (void) printf("%cCOMP", sep);
+		    ss &= ~SS_COMP;
+		    sep = ',';
+		}
+# endif	/* defined(SS_COMP) */
+
+# if	defined(SS_CONNECTOUT)
+		if (ss & SS_CONNECTOUT) {
+		    (void) printf("%cCONNECTOUT", sep);
+		    ss &= ~SS_CONNECTOUT;
+		    sep = ',';
+		}
+# endif	/* defined(SS_CONNECTOUT) */
+
+# if	defined(SS_HIPRI)
+		if (ss & SS_HIPRI) {
+		    (void) printf("%cHIPRI", sep);
+		    ss &= ~SS_HIPRI;
+		    sep = ',';
+		}
+# endif	/* defined(SS_HIPRI) */
+
+# if	defined(SS_IGNERR)
+		if (ss & SS_IGNERR) {
+		    (void) printf("%cIGNERR", sep);
+		    ss &= ~SS_IGNERR;
+		    sep = ',';
+		}
+# endif	/* defined(SS_IGNERR) */
+
+# if	defined(SS_INCOMP)
+		if (ss & SS_INCOMP) {
+		    (void) printf("%cINCOMP", sep);
+		    ss &= ~SS_INCOMP;
+		    sep = ',';
+		}
+# endif	/* defined(SS_INCOMP) */
+
+# if	defined(SS_IOCWAIT)
+		if (ss & SS_IOCWAIT) {
+		    (void) printf("%cIOCWAIT", sep);
+		    ss &= ~SS_IOCWAIT;
+		    sep = ',';
+		}
+# endif	/* defined(SS_IOCWAIT) */
+
+# if	defined(SS_ISCONFIRMING)
+		if (ss & SS_ISCONFIRMING) {
+		    (void) printf("%cISCONFIRMING", sep);
+		    ss &= ~SS_ISCONFIRMING;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISCONFIRMING) */
+
+# if	defined(SS_ISCONNECTED)
+		if (ss & SS_ISCONNECTED) {
+		    (void) printf("%cISCONNECTED", sep);
+		    ss &= ~SS_ISCONNECTED;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISCONNECTED) */
+
+# if	defined(SS_ISCONNECTING)
+		if (ss & SS_ISCONNECTING) {
+		    (void) printf("%cISCONNECTING", sep);
+		    ss &= ~SS_ISCONNECTING;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISCONNECTING) */
+
+# if	defined(SS_ISDISCONNECTING)
+		if (ss & SS_ISDISCONNECTING) {
+		    (void) printf("%cISDISCONNECTING", sep);
+		    ss &= ~SS_ISDISCONNECTING;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ISDISCONNECTING) */
+
+# if	defined(SS_MORETOSEND)
+		if (ss & SS_MORETOSEND) {
+		    (void) printf("%cMORETOSEND", sep);
+		    ss &= ~SS_MORETOSEND;
+		    sep = ',';
+		}
+# endif	/* defined(SS_MORETOSEND) */
+
+# if	defined(SS_NBIO)
+		if (ss & SS_NBIO) {
+		    (void) printf("%cNBIO", sep);
+		    ss &= ~SS_NBIO;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NBIO) */
+
+# if	defined(SS_NOCONN)
+		if (ss & SS_NOCONN) {
+		    (void) printf("%cNOCONN", sep);
+		    ss &= ~SS_NOCONN;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOCONN) */
+
+# if	defined(SS_NODELETE)
+		if (ss & SS_NODELETE) {
+		    (void) printf("%cNODELETE", sep);
+		    ss &= ~SS_NODELETE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NODELETE) */
+
+# if	defined(SS_NOFDREF)
+		if (ss & SS_NOFDREF) {
+		    (void) printf("%cNOFDREF", sep);
+		    ss &= ~SS_NOFDREF;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOFDREF) */
+
+# if	defined(SS_NOGHOST)
+		if (ss & SS_NOGHOST) {
+		    (void) printf("%cNOGHOST", sep);
+		    ss &= ~SS_NOGHOST;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOGHOST) */
+
+# if	defined(SS_NOINPUT)
+		if (ss & SS_NOINPUT) {
+		    (void) printf("%cNOINPUT", sep);
+		    ss &= ~SS_NOINPUT;
+		    sep = ',';
+		}
+# endif	/* defined(SS_NOINPUT) */
+
+# if	defined(SS_PRIV)
+		if (ss & SS_PRIV) {
+		    (void) printf("%cPRIV", sep);
+		    ss &= ~SS_PRIV;
+		    sep = ',';
+		}
+# endif	/* defined(SS_PRIV) */
+
+# if	defined(SS_QUEUE)
+		if (ss & SS_QUEUE) {
+		    (void) printf("%cQUEUE", sep);
+		    ss &= ~SS_QUEUE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_QUEUE) */
+
+# if	defined(HASSBSTATE)
+#  if	defined(SBS_RCVATMARK)
+		if (Lf->lts.sbs_rcv & SBS_RCVATMARK) {
+		    (void) printf("%cRCVATMARK", sep);
+		    Lf->lts.sbs_rcv &= ~SBS_RCVATMARK;
+		    sep = ',';
+		}
+#  endif	/* defined(SBS_RCVATMARK) */
+
+# else	/* !defined(HASSBSTATE) */
+#  if	defined(SS_RCVATMARK)
+		if (ss & SS_RCVATMARK) {
+		    (void) printf("%cRCVATMARK", sep);
+		    ss &= ~SS_RCVATMARK;
+		    sep = ',';
+		}
+#  endif	/* defined(SS_RCVATMARK) */
+# endif	/* defined(HASSBSTATE) */
+
+# if	defined(SS_READWAIT)
+		if (ss & SS_READWAIT) {
+		    (void) printf("%cREADWAIT", sep);
+		    ss &= ~SS_READWAIT;
+		    sep = ',';
+		}
+# endif	/* defined(SS_READWAIT) */
+
+# if	defined(SS_SETRCV)
+		if (ss & SS_SETRCV) {
+		    (void) printf("%cSETRCV", sep);
+		    ss &= ~SS_SETRCV;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SETRCV) */
+
+# if	defined(SS_SETSND)
+		if (ss & SS_SETSND) {
+		    (void) printf("%cSETSND", sep);
+		    ss &= ~SS_SETSND;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SETSND) */
+
+# if	defined(SS_SIGREAD)
+		if (ss & SS_SIGREAD) {
+		    (void) printf("%cSIGREAD", sep);
+		    ss &= ~SS_SIGREAD;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SIGREAD) */
+
+# if	defined(SS_SIGWRITE)
+		if (ss & SS_SIGWRITE) {
+		    (void) printf("%cSIGWRITE", sep);
+		    ss &= ~SS_SIGWRITE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SIGWRITE) */
+
+# if	defined(SS_SPLICED)
+		if (ss & SS_SPLICED) {
+		    (void) printf("%cSPLICED", sep);
+		    ss &= ~SS_SPLICED;
+		    sep = ',';
+		}
+# endif	/* defined(SS_SPLICED) */
+
+# if	defined(SS_WRITEWAIT)
+		if (ss & SS_WRITEWAIT) {
+		    (void) printf("%cWRITEWAIT", sep);
+		    ss &= ~SS_WRITEWAIT;
+		    sep = ',';
+		}
+# endif	/* defined(SS_WRITEWAIT) */
+
+# if	defined(SS_ZOMBIE)
+		if (ss & SS_ZOMBIE) {
+		    (void) printf("%cZOMBIE", sep);
+		    ss &= ~SS_ZOMBIE;
+		    sep = ',';
+		}
+# endif	/* defined(SS_ZOMBIE) */
+
+		if (ss)
+		    (void) printf("%cUNKNOWN=%#x", sep, ss);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASSOSTATE) */
+
+#if	defined(HASTCPOPT)
+	if (Ftcptpi & TCPTPI_FLAGS) {
+	    int topt;
+
+	    if ((topt = Lf->lts.topt) || Lf->lts.msss) {
+		char sep = ' ';
+
+		if (Ffield)
+		    sep = LSOF_FID_TCPTPI;
+		else if (!ps)
+		    sep = '(';
+		(void) printf("%cTF", sep);
+		ps++;
+		sep = '=';
+
+# if	defined(TF_ACKNOW)
+		if (topt & TF_ACKNOW) {
+		    (void) printf("%cACKNOW", sep);
+		    topt &= ~TF_ACKNOW;
+		    sep = ',';
+		}
+# endif	/* defined(TF_ACKNOW) */
+
+# if	defined(TF_CANT_TXSACK)
+		if (topt & TF_CANT_TXSACK) {
+		    (void) printf("%cCANT_TXSACK", sep);
+		    topt &= ~TF_CANT_TXSACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_CANT_TXSACK) */
+
+# if	defined(TF_DEAD)
+		if (topt & TF_DEAD) {
+		    (void) printf("%cDEAD", sep);
+		    topt &= ~TF_DEAD;
+		    sep = ',';
+		}
+# endif	/* defined(TF_DEAD) */
+
+# if	defined(TF_DELACK)
+		if (topt & TF_DELACK) {
+		    (void) printf("%cDELACK", sep);
+		    topt &= ~TF_DELACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_DELACK) */
+
+# if	defined(TF_DELAY_ACK)
+		if (topt & TF_DELAY_ACK) {
+		    (void) printf("%cDELAY_ACK", sep);
+		    topt &= ~TF_DELAY_ACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_DELAY_ACK) */
+
+# if	defined(TF_DISABLE_ECN)
+		if (topt & TF_DISABLE_ECN) {
+		    (void) printf("%cDISABLE_ECN", sep);
+		    topt &= ~TF_DISABLE_ECN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_DISABLE_ECN) */
+
+# if	defined(TF_ECN)
+		if (topt & TF_ECN) {
+		    (void) printf("%cECN", sep);
+		    topt &= ~TF_ECN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_ECN) */
+
+# if	defined(TF_ECN_PERMIT)
+		if (topt & TF_ECN_PERMIT) {
+		    (void) printf("%cECN_PERMIT", sep);
+		    topt &= ~TF_ECN_PERMIT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_ECN_PERMIT) */
+
+# if	defined(TF_FASTRECOVERY)
+		if (topt & TF_FASTRECOVERY) {
+		    (void) printf("%cFASTRECOVERY", sep);
+		    topt &= ~TF_FASTRECOVERY;
+		    sep = ',';
+		}
+# endif	/* defined(TF_FASTRECOVERY) */
+
+# if	defined(TF_FASTRXMT_PHASE)
+		if (topt & TF_FASTRXMT_PHASE) {
+		    (void) printf("%cFASTRXMT_PHASE", sep);
+		    topt &= ~TF_FASTRXMT_PHASE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_FASTRXMT_PHASE) */
+
+# if	defined(TF_HAVEACKED)
+		if (topt & TF_HAVEACKED) {
+		    (void) printf("%cHAVEACKED", sep);
+		    topt &= ~TF_HAVEACKED;
+		    sep = ',';
+		}
+# endif	/* defined(TF_HAVEACKED) */
+
+# if	defined(TF_HAVECLOSED)
+		if (topt & TF_HAVECLOSED) {
+		    (void) printf("%cHAVECLOSED", sep);
+		    topt &= ~TF_HAVECLOSED;
+		    sep = ',';
+		}
+# endif	/* defined(TF_HAVECLOSED) */
+
+# if	defined(TF_IGNR_RXSACK)
+		if (topt & TF_IGNR_RXSACK) {
+		    (void) printf("%cIGNR_RXSACK", sep);
+		    topt &= ~TF_IGNR_RXSACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_IGNR_RXSACK) */
+
+# if	defined(TF_IOLOCK)
+		if (topt & TF_IOLOCK) {
+		    (void) printf("%cIOLOCK", sep);
+		    topt &= ~TF_IOLOCK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_IOLOCK) */
+
+# if	defined(TF_LARGESEND)
+		if (topt & TF_LARGESEND) {
+		    (void) printf("%cLARGESEND", sep);
+		    topt &= ~TF_LARGESEND;
+		    sep = ',';
+		}
+# endif	/* defined(TF_LARGESEND) */
+
+# if	defined(TF_LASTIDLE)
+		if (topt & TF_LASTIDLE) {
+		    (void) printf("%cLASTIDLE", sep);
+		    topt &= ~TF_LASTIDLE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_LASTIDLE) */
+
+# if	defined(TF_LQ_OVERFLOW)
+		if (topt & TF_LQ_OVERFLOW) {
+		    (void) printf("%cLQ_OVERFLOW", sep);
+		    topt &= ~TF_LQ_OVERFLOW;
+		    sep = ',';
+		}
+# endif	/* defined(TF_LQ_OVERFLOW) */
+
+		if (Lf->lts.msss) {
+		    (void) printf("%cMSS=%lu", sep, Lf->lts.mss);
+		    sep = ',';
+		}
+
+# if	defined(TF_MORETOCOME)
+		if (topt & TF_MORETOCOME) {
+		    (void) printf("%cMORETOCOME", sep);
+		    topt &= ~TF_MORETOCOME;
+		    sep = ',';
+		}
+# endif	/* defined(TF_MORETOCOME) */
+
+# if	defined(TF_NEEDACK)
+		if (topt & TF_NEEDACK) {
+		    (void) printf("%cNEEDACK", sep);
+		    topt &= ~TF_NEEDACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDACK) */
+
+# if	defined(TF_NEEDCLOSE)
+		if (topt & TF_NEEDCLOSE) {
+		    (void) printf("%cNEEDCLOSE", sep);
+		    topt &= ~TF_NEEDCLOSE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDCLOSE) */
+
+# if	defined(TF_NEEDFIN)
+		if (topt & TF_NEEDFIN) {
+		    (void) printf("%cNEEDFIN", sep);
+		    topt &= ~TF_NEEDFIN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDFIN) */
+
+# if	defined(TF_NEEDIN)
+		if (topt & TF_NEEDIN) {
+		    (void) printf("%cNEEDIN", sep);
+		    topt &= ~TF_NEEDIN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDIN) */
+
+# if	defined(TF_NEEDOUT)
+		if (topt & TF_NEEDOUT) {
+		    (void) printf("%cNEEDOUT", sep);
+		    topt &= ~TF_NEEDOUT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDOUT) */
+
+# if	defined(TF_NEEDSYN)
+		if (topt & TF_NEEDSYN) {
+		    (void) printf("%cNEEDSYN", sep);
+		    topt &= ~TF_NEEDSYN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDSYN) */
+
+# if	defined(TF_NEEDTIMER)
+		if (topt & TF_NEEDTIMER) {
+		    (void) printf("%cNEEDTIMER", sep);
+		    topt &= ~TF_NEEDTIMER;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEEDTIMER) */
+
+# if	defined(TF_NEWRENO_RXMT)
+		if (topt & TF_NEWRENO_RXMT) {
+		    (void) printf("%cNEWRENO_RXMT", sep);
+		    topt &= ~TF_NEWRENO_RXMT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NEWRENO_RXMT) */
+
+# if	defined(TF_NODELACK)
+		if (topt & TF_NODELACK) {
+		    (void) printf("%cNODELACK", sep);
+		    topt &= ~TF_NODELACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NODELACK) */
+
+# if	defined(TF_NODELAY)
+		if (topt & TF_NODELAY) {
+		    (void) printf("%cNODELAY", sep);
+		    topt &= ~TF_NODELAY;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NODELAY) */
+
+# if	defined(TF_NOOPT)
+		if (topt & TF_NOOPT) {
+		    (void) printf("%cNOOPT", sep);
+		    topt &= ~TF_NOOPT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NOOPT) */
+
+# if	defined(TF_NOPUSH)
+		if (topt & TF_NOPUSH) {
+		    (void) printf("%cNOPUSH", sep);
+		    topt &= ~TF_NOPUSH;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NOPUSH) */
+
+# if	defined(TF_NO_PMTU)
+		if (topt & TF_NO_PMTU) {
+		    (void) printf("%cNO_PMTU", sep);
+		    topt &= ~TF_NO_PMTU;
+		    sep = ',';
+		}
+# endif	/* defined(TF_NO_PMTU) */
+
+# if	defined(TF_RAW)
+		if (topt & TF_RAW) {
+		    (void) printf("%cRAW", sep);
+		    topt &= ~TF_RAW;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RAW) */
+
+# if	defined(TF_RCVD_CC)
+		if (topt & TF_RCVD_CC) {
+		    (void) printf("%cRCVD_CC", sep);
+		    topt &= ~TF_RCVD_CC;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_CC) */
+
+# if	defined(TF_RCVD_SCALE)
+		if (topt & TF_RCVD_SCALE) {
+		    (void) printf("%cRCVD_SCALE", sep);
+		    topt &= ~TF_RCVD_SCALE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_SCALE) */
+
+# if	defined(TF_RCVD_CE)
+		if (topt & TF_RCVD_CE) {
+		    (void) printf("%cRCVD_CE", sep);
+		    topt &= ~TF_RCVD_CE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_CE) */
+
+# if	defined(TF_RCVD_TS)
+		if (topt & TF_RCVD_TS) {
+		    (void) printf("%cRCVD_TS", sep);
+		    topt &= ~TF_RCVD_TS;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_TS) */
+
+# if	defined(TF_RCVD_TSTMP)
+		if (topt & TF_RCVD_TSTMP) {
+		    (void) printf("%cRCVD_TSTMP", sep);
+		    topt &= ~TF_RCVD_TSTMP;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_TSTMP) */
+
+# if	defined(TF_RCVD_WS)
+		if (topt & TF_RCVD_WS) {
+		    (void) printf("%cRCVD_WS", sep);
+		    topt &= ~TF_RCVD_WS;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RCVD_WS) */
+
+# if	defined(TF_REASSEMBLING)
+		if (topt & TF_REASSEMBLING) {
+		    (void) printf("%cREASSEMBLING", sep);
+		    topt &= ~TF_REASSEMBLING;
+		    sep = ',';
+		}
+# endif	/* defined(TF_REASSEMBLING) */
+
+# if	defined(TF_REQ_CC)
+		if (topt & TF_REQ_CC) {
+		    (void) printf("%cREQ_CC", sep);
+		    topt &= ~TF_REQ_CC;
+		    sep = ',';
+		}
+# endif	/* defined(TF_REQ_CC) */
+
+# if	defined(TF_REQ_SCALE)
+		if (topt & TF_REQ_SCALE) {
+		    (void) printf("%cREQ_SCALE", sep);
+		    topt &= ~TF_REQ_SCALE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_REQ_SCALE) */
+
+# if	defined(TF_REQ_TSTMP)
+		if (topt & TF_REQ_TSTMP) {
+		    (void) printf("%cREQ_TSTMP", sep);
+		    topt &= ~TF_REQ_TSTMP;
+		    sep = ',';
+		}
+# endif	/* defined(TF_REQ_TSTMP) */
+
+# if	defined(TF_RFC1323)
+		if (topt & TF_RFC1323) {
+		    (void) printf("%cRFC1323", sep);
+		    topt &= ~TF_RFC1323;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RFC1323) */
+
+# if	defined(TF_RXWIN0SENT)
+		if (topt & TF_RXWIN0SENT) {
+		    (void) printf("%cRXWIN0SENT", sep);
+		    topt &= ~TF_RXWIN0SENT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_RXWIN0SENT) */
+
+# if	defined(TF_SACK_GENERATE)
+		if (topt & TF_SACK_GENERATE) {
+		    (void) printf("%cSACK_GENERATE", sep);
+		    topt &= ~TF_SACK_GENERATE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SACK_GENERATE) */
+
+# if	defined(TF_SACK_PERMIT)
+		if (topt & TF_SACK_PERMIT) {
+		    (void) printf("%cSACK_PERMIT", sep);
+		    topt &= ~TF_SACK_PERMIT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SACK_PERMIT) */
+
+# if	defined(TF_SACK_PROCESS)
+		if (topt & TF_SACK_PROCESS) {
+		    (void) printf("%cSACK_PROCESS", sep);
+		    topt &= ~TF_SACK_PROCESS;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SACK_PROCESS) */
+
+# if	defined(TF_SEND)
+		if (topt & TF_SEND) {
+		    (void) printf("%cSEND", sep);
+		    topt &= ~TF_SEND;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SEND) */
+
+# if	defined(TF_SEND_AND_DISCONNECT)
+		if (topt & TF_SEND_AND_DISCONNECT) {
+		    (void) printf("%cSEND_AND_DISCONNECT", sep);
+		    topt &= ~TF_SEND_AND_DISCONNECT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SEND_AND_DISCONNECT) */
+
+# if	defined(TF_SENDCCNEW)
+		if (topt & TF_SENDCCNEW) {
+		    (void) printf("%cSENDCCNEW", sep);
+		    topt &= ~TF_SENDCCNEW;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SENDCCNEW) */
+
+# if	defined(TF_SEND_CWR)
+		if (topt & TF_SEND_CWR) {
+		    (void) printf("%cSEND_CWR", sep);
+		    topt &= ~TF_SEND_CWR;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SEND_CWR) */
+
+# if	defined(TF_SEND_ECHO)
+		if (topt & TF_SEND_ECHO) {
+		    (void) printf("%cSEND_ECHO", sep);
+		    topt &= ~TF_SEND_ECHO;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SEND_ECHO) */
+
+# if	defined(TF_SEND_TSTMP)
+		if (topt & TF_SEND_TSTMP) {
+		    (void) printf("%cSEND_TSTMP", sep);
+		    topt &= ~TF_SEND_TSTMP;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SEND_TSTMP) */
+
+# if	defined(TF_SENTFIN)
+		if (topt & TF_SENTFIN) {
+		    (void) printf("%cSENTFIN", sep);
+		    topt &= ~TF_SENTFIN;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SENTFIN) */
+
+# if	defined(TF_SENT_TS)
+		if (topt & TF_SENT_TS) {
+		    (void) printf("%cSENT_TS", sep);
+		    topt &= ~TF_SENT_TS;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SENT_TS) */
+
+# if	defined(TF_SENT_WS)
+		if (topt & TF_SENT_WS) {
+		    (void) printf("%cSENT_WS", sep);
+		    topt &= ~TF_SENT_WS;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SENT_WS) */
+
+# if	defined(TF_SIGNATURE)
+		if (topt & TF_SIGNATURE) {
+		    (void) printf("%cSIGNATURE", sep);
+		    topt &= ~TF_SIGNATURE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SIGNATURE) */
+
+# if	defined(TF_SLOWLINK)
+		if (topt & TF_SLOWLINK) {
+		    (void) printf("%cSLOWLINK", sep);
+		    topt &= ~TF_SLOWLINK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SLOWLINK) */
+
+# if	defined(TF_STDURG)
+		if (topt & TF_STDURG) {
+		    (void) printf("%cSTDURG", sep);
+		    topt &= ~TF_STDURG;
+		    sep = ',';
+		}
+# endif	/* defined(TF_STDURG) */
+
+# if	defined(TF_SYN_REXMT)
+		if (topt & TF_SYN_REXMT) {
+		    (void) printf("%cSYN_REXMT", sep);
+		    topt &= ~TF_SYN_REXMT;
+		    sep = ',';
+		}
+# endif	/* defined(TF_SYN_REXMT) */
+
+# if	defined(TF_UIOMOVED)
+		if (topt & TF_UIOMOVED) {
+		    (void) printf("%cUIOMOVED", sep);
+		    topt &= ~TF_UIOMOVED;
+		    sep = ',';
+		}
+# endif	/* defined(TF_UIOMOVED) */
+
+# if	defined(TF_USE_SCALE)
+		if (topt & TF_USE_SCALE) {
+		    (void) printf("%cUSE_SCALE", sep);
+		    topt &= ~TF_USE_SCALE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_USE_SCALE) */
+
+# if	defined(TF_WASIDLE)
+		if (topt & TF_WASIDLE) {
+		    (void) printf("%cWASIDLE", sep);
+		    topt &= ~TF_WASIDLE;
+		    sep = ',';
+		}
+# endif	/* defined(TF_WASIDLE) */
+
+# if	defined(TF_WASFRECOVERY)
+		if (topt & TF_WASFRECOVERY) {
+		    (void) printf("%cWASFRECOVERY", sep);
+		    topt &= ~TF_WASFRECOVERY;
+		    sep = ',';
+		}
+# endif	/* defined(TF_WASFRECOVERY) */
+
+# if	defined(TF_WILL_SACK)
+		if (topt & TF_WILL_SACK) {
+		    (void) printf("%cWILL_SACK", sep);
+		    topt &= ~TF_WILL_SACK;
+		    sep = ',';
+		}
+# endif	/* defined(TF_WILL_SACK) */
+
+		if (topt)
+		    (void) printf("%cUNKNOWN=%#x", sep, topt);
+		if (Ffield)
+		    putchar(Terminator);
+	    }
+	}
+#endif	/* defined(HASTCPOPT) */
+
+#if	defined(HASTCPTPIW)
+	if (Ftcptpi & TCPTPI_WINDOWS) {
+	    if (Lf->lts.rws) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WR=%lu", Lf->lts.rw);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	    if (Lf->lts.wws) {
+		if (Ffield)
+		    putchar(LSOF_FID_TCPTPI);
+		else {
+		    if (ps)
+			putchar(' ');
+		    else
+			putchar('(');
+		}
+		(void) printf("WW=%lu", Lf->lts.ww);
+		if (Ffield)
+		    putchar(Terminator);
+		ps++;
+	    }
+	}
+#endif	/* defined(HASTCPTPIW) */
+
+	if (ps && !Ffield)
+	    putchar(')');
+	if (nl)
+	    putchar('\n');
+}
+#else	/* !defined(USE_LIB_PRINT_TCPTPI) */
+char ptti_d1[] = "d"; char *ptti_d2 = ptti_d1;
+#endif	/* defined(USE_LIB_PRINT_TCPTPI) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/rdev.c b/lsof_4.85/lsof_4.85_src/lib/rdev.c
new file mode 100644
index 0000000..9c5b6f4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/rdev.c
@@ -0,0 +1,524 @@
+/*
+ * rdev.c -- readdev() function for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_READDEV)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: rdev.c,v 1.12 2008/10/21 16:13:23 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+_PROTOTYPE(static int rmdupdev,(struct l_dev ***dp, int n, char *nm));
+
+
+/*
+ * To use this source file:
+ *
+ * 1. Define DIRTYPE as:
+ *
+ *	  #define DIRTYPE direct
+ *    or  #define DIRTYPE dirent
+ *
+ * 2. Define HASDNAMLEN if struct DIRTYPE has a d_namlen element, giving
+ *    the length of d_name.
+ *
+ * 3. Define the RDEV_EXPDEV macro to apply special handling to device
+ *    numbers, as required.  For example, for EP/IX 2.1.1:
+ *
+ *	#define RDEV_EXPDEV(n)	expdev(n)
+ *
+ *    to use the expdev() function to expand device numbers.  If
+ *    no RDEV_EXPDEV macro is defined, it defaults to:
+ *
+ *	#define RDEV_EXPDEV(n)	(n)
+ *
+ * 4. Define HASBLKDEV to request that information on S_IFBLK devices be
+ *    recorded in BDevtp[].
+ *
+ *    Define NOWARNBLKDEV to suppress the issuance of a warning when no
+ *    block devices are found.
+ *
+ * 5. Define RDEV_STATFN to be a stat function other than stat() or lstat()
+ *    -- e.g.,
+ *
+ *	#define	RDEV_STATFN	private_stat
+ *
+ * 6. Define HAS_STD_CLONE to request that clone device information be stored
+ *    in standard clone structures (defined in lsof.h and addressed via
+ *    Clone).  If HAS_STD_CLONE is defined, these must also be defined:
+ *
+ *	a.  Define CLONEMAJ to be the name of the constant or
+ *	    variable that defines the clone major device -- e.g.,
+ *
+ *		#define CLONEMAJ CloneMaj
+ *
+ *	b.  Define HAVECLONEMAJ to be the name of the variable that
+ *	    contains the status of the clone major device -- e.g.,
+ *
+ *		#define HAVECLONEMAJ HaveCloneMaj
+ *
+ *    Define HAS_STD_CLONE to be 1 if readdev() is expected to build the
+ *    clone table, the clone table is cached (if HASDCACHE is defined), and
+ *    there is a function to clear the cache table when the device table must
+ *    be reloaded.  (See dvch.c for naming the clone cache build and clear
+ *    functions.)
+ */
+
+
+# if	!defined(RDEV_EXPDEV)
+#define	RDEV_EXPDEV(n)		(n)
+# endif	/* !defined(RDEV_EXPDEV) */
+
+# if	!defined(RDEV_STATFN)
+#  if	defined(USE_STAT)
+#define	RDEV_STATFN	stat
+#  else	/* !defined(USE_STAT) */
+#define	RDEV_STATFN	lstat
+#  endif	/* defined(USE_STAT) */
+# endif	/* !defined(RDEV_STATFN) */
+
+
+/*
+ * readdev() - read device names, modes and types
+ */
+
+void
+readdev(skip)
+	int skip;			/* skip device cache read if 1 */
+{
+
+# if	defined(HAS_STD_CLONE) && HAS_STD_CLONE==1
+	struct clone *c;
+# endif	/* defined(HAS_STD_CLONE) && HAS_STD_CLONE==1 */
+
+# if	defined(HASDCACHE)
+	int dcrd;
+# endif	/* defined(HASDCACHE) */
+
+	DIR *dfp;
+	int dnamlen;
+	struct DIRTYPE *dp;
+	char *fp = (char *)NULL;
+	int i = 0;
+
+# if	defined(HASBLKDEV)
+	int j = 0;
+# endif	/* defined(HASBLKDEV) */
+
+	char *path = (char *)NULL;
+	MALLOC_S pl;
+	struct stat sb;
+
+	if (Sdev)
+	    return;
+
+# if	defined(HASDCACHE)
+/*
+ * Read device cache, as directed.
+ */
+	if (!skip) {
+	    if (DCstate == 2 || DCstate == 3) {
+		if ((dcrd = read_dcache()) == 0)
+		    return;
+	    }
+	} else
+	    dcrd = 1;
+# endif	/* defined(HASDCACHE) */
+
+	Dstkn = Dstkx = 0;
+	Dstk = (char **)NULL;
+	(void) stkdir("/dev");
+/*
+ * Unstack the next /dev or /dev/<subdirectory> directory.
+ */
+	while (--Dstkx >= 0) {
+	    if (!(dfp = OpenDir(Dstk[Dstkx]))) {
+
+# if	defined(WARNDEVACCESS)
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't open: ", Pn);
+		    safestrprt(Dstk[Dstkx], stderr, 1);
+		}
+# endif	/* defined(WARNDEVACCESS) */
+
+		(void) free((FREE_P *)Dstk[Dstkx]);
+		Dstk[Dstkx] = (char *)NULL;
+		continue;
+	    }
+	    if (path) {
+		(void) free((FREE_P *)path);
+		path = (char *)NULL;
+	    }
+	    if (!(path = mkstrcat(Dstk[Dstkx], -1, "/", 1, (char *)NULL, -1,
+				  &pl)))
+	    {
+		(void) fprintf(stderr, "%s: no space for: ", Pn);
+		safestrprt(Dstk[Dstkx], stderr, 1);
+		Exit(1);
+	    }
+	    (void) free((FREE_P *)Dstk[Dstkx]);
+	    Dstk[Dstkx] = (char *)NULL;
+	/*
+	 * Scan the directory.
+	 */
+	    for (dp = ReadDir(dfp); dp; dp = ReadDir(dfp)) {
+		if (dp->d_ino == 0 || dp->d_name[0] == '.')
+		    continue;
+	    /*
+	     * Form the full path name and get its status.
+	     */
+
+# if	defined(HASDNAMLEN)
+		dnamlen = (int)dp->d_namlen;
+# else	/* !defined(HASDNAMLEN) */
+		dnamlen = (int)strlen(dp->d_name);
+# endif	/* defined(HASDNAMLEN) */
+
+		if (fp) {
+		    (void) free((FREE_P *)fp);
+		    fp = (char *)NULL;
+		}
+		if (!(fp = mkstrcat(path, pl, dp->d_name, dnamlen,
+				    (char *)NULL, -1, (MALLOC_S *)NULL)))
+		{
+		    (void) fprintf(stderr, "%s: no space for: ", Pn);
+		    safestrprt(path, stderr, 0);
+		    safestrprtn(dp->d_name, dnamlen, stderr, 1);
+		    Exit(1);
+		}
+		if (RDEV_STATFN(fp, &sb) != 0) {
+		    if (errno == ENOENT)	/* a sym link to nowhere? */
+			continue;
+
+# if	defined(WARNDEVACCESS)
+		    if (!Fwarn) {
+			int errno_save = errno;
+
+			(void) fprintf(stderr, "%s: can't stat ", Pn);
+			safestrprt(fp, stderr, 0);
+			(void) fprintf(stderr, ": %s\n", strerror(errno_save));
+		    }
+# endif	/* defined(WARNDEVACCESS) */
+
+		    continue;
+		}
+	    /*
+	     * If it's a subdirectory, stack its name for later
+	     * processing.
+	     */
+		if ((sb.st_mode & S_IFMT) == S_IFDIR) {
+		    (void) stkdir(fp);
+		    continue;
+		}
+		if ((sb.st_mode & S_IFMT) == S_IFCHR) {
+
+		/*
+		 * Save character device information in Devtp[].
+		 */
+		    if (i >= Ndev) {
+			Ndev += DEVINCR;
+			if (!Devtp)
+			    Devtp = (struct l_dev *)malloc(
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			else
+			    Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+				    (MALLOC_S)(sizeof(struct l_dev)*Ndev));
+			if (!Devtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for character device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    Devtp[i].rdev = RDEV_EXPDEV(sb.st_rdev);
+		    Devtp[i].inode = (INODETYPE)sb.st_ino;
+		    if (!(Devtp[i].name = mkstrcpy(fp, (MALLOC_S *)NULL))) {
+			(void) fprintf(stderr,
+			    "%s: no space for device name: ", Pn);
+			safestrprt(fp, stderr, 1);
+			Exit(1);
+		    }
+		    Devtp[i].v = 0;
+
+# if	defined(HAS_STD_CLONE) && HAS_STD_CLONE==1
+		    if (HAVECLONEMAJ && GET_MAJ_DEV(Devtp[i].rdev) == CLONEMAJ)
+		    {
+
+		    /*
+		     * Record clone device information.
+		     */
+			if (!(c = (struct clone *)malloc(sizeof(struct clone))))
+			{
+			    (void) fprintf(stderr,
+				"%s: no space for clone device: ", Pn);
+			    safestrprt(fp, stderr, 1);
+			    Exit(1);
+			}
+			c->dx = i;
+			c->next = Clone;
+			Clone = c;
+		    }
+# endif	/* defined(HAS_STD_CLONE) && HAS_STD_CLONE==1 */
+
+		    i++;
+		}
+
+# if	defined(HASBLKDEV)
+		if ((sb.st_mode & S_IFMT) == S_IFBLK) {
+
+		/*
+		 * Save block device information in BDevtp[].
+		 */
+		    if (j >= BNdev) {
+			BNdev += DEVINCR;
+			if (!BDevtp)
+			    BDevtp = (struct l_dev *)malloc(
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			else
+			    BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+				     (MALLOC_S)(sizeof(struct l_dev)*BNdev));
+			if (!BDevtp) {
+			    (void) fprintf(stderr,
+				"%s: no space for block device\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    BDevtp[j].name = fp;
+		    fp = (char *)NULL;
+		    BDevtp[j].inode = (INODETYPE)sb.st_ino;
+		    BDevtp[j].rdev = RDEV_EXPDEV(sb.st_rdev);
+		    BDevtp[j].v = 0;
+		    j++;
+		}
+# endif	/* defined(HASBLKDEV) */
+
+	    }
+	    (void) CloseDir(dfp);
+	}
+/*
+ * Free any allocated space.
+ */
+	if (!Dstk) {
+	    (void) free((FREE_P *)Dstk);
+	    Dstk = (char **)NULL;
+	}
+	if (fp)
+	    (void) free((FREE_P *)fp);
+	if (path)
+	    (void) free((FREE_P *)path);
+
+# if	defined(HASBLKDEV)
+/*
+ * Reduce the BDevtp[] (optional) and Devtp[] tables to their minimum
+ * sizes; allocate and build sort pointer lists; and sort the tables by
+ * device number.
+ */
+	if (BNdev) {
+	    if (BNdev > j) {
+		BNdev = j;
+		BDevtp = (struct l_dev *)realloc((MALLOC_P *)BDevtp,
+			 (MALLOC_S)(sizeof(struct l_dev) * BNdev));
+	    }
+	    if (!(BSdev = (struct l_dev **)malloc(
+			  (MALLOC_S)(sizeof(struct l_dev *) * BNdev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for block device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (j = 0; j < BNdev; j++) {
+		BSdev[j] = &BDevtp[j];
+	    }
+	    (void) qsort((QSORT_P *)BSdev, (size_t)BNdev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    BNdev = rmdupdev(&BSdev, BNdev, "block");
+	}
+	
+#  if	!defined(NOWARNBLKDEV)
+	else {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: no block devices found\n", Pn);
+	}
+#  endif	/* !defined(NOWARNBLKDEV) */
+# endif	/* defined(HASBLKDEV) */
+
+	if (Ndev) {
+	    if (Ndev > i) {
+		Ndev = i;
+		Devtp = (struct l_dev *)realloc((MALLOC_P *)Devtp,
+			(MALLOC_S)(sizeof(struct l_dev) * Ndev));
+	    }
+	    if (!(Sdev = (struct l_dev **)malloc(
+			 (MALLOC_S)(sizeof(struct l_dev *) * Ndev))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no space for character device sort pointers\n", Pn);
+		Exit(1);
+	    }
+	    for (i = 0; i < Ndev; i++) {
+		Sdev[i] = &Devtp[i];
+	    }
+	    (void) qsort((QSORT_P *)Sdev, (size_t)Ndev,
+		(size_t)sizeof(struct l_dev *), compdev);
+	    Ndev = rmdupdev(&Sdev, Ndev, "char");
+	} else {
+	    (void) fprintf(stderr, "%s: no character devices found\n", Pn);
+	    Exit(1);
+	}
+
+# if	defined(HASDCACHE)
+/*
+ * Write device cache file, as required.
+ */
+	if (DCstate == 1 || (DCstate == 3 && dcrd))
+	    write_dcache();
+# endif	/* defined(HASDCACHE) */
+
+}
+
+
+# if	defined(HASDCACHE)
+/*
+ * rereaddev() - reread device names, modes and types
+ */
+
+void
+rereaddev()
+{
+	(void) clr_devtab();
+
+# if	defined(DCACHE_CLR)
+	(void) DCACHE_CLR();
+# endif	/* defined(DCACHE_CLR) */
+
+	readdev(1);
+	DCunsafe = 0;
+}
+#endif	/* defined(HASDCACHE) */
+
+
+/*
+ * rmdupdev() - remove duplicate (major/minor/inode) devices
+ */
+
+static int
+rmdupdev(dp, n, nm)
+	struct l_dev ***dp;	/* device table pointers address */
+	int n;			/* number of pointers */
+	char *nm;		/* device table name for error message */
+{
+
+# if	defined(HAS_STD_CLONE) && HAS_STD_CLONE==1
+	struct clone *c, *cp;
+# endif	/* defined(HAS_STD_CLONE) && HAS_STD_CLONE==1 */
+
+	int i, j, k;
+	struct l_dev **p;
+
+	for (i = j = 0, p = *dp; i < n ;) {
+	    for (k = i + 1; k < n; k++) {
+		if (p[i]->rdev != p[k]->rdev || p[i]->inode != p[k]->inode)
+		    break;
+
+# if	defined(HAS_STD_CLONE) && HAS_STD_CLONE==1
+	    /*
+	     * See if we're deleting a duplicate clone device.  If so,
+	     * delete its clone table entry.
+	     */
+		for (c = Clone, cp = (struct clone *)NULL;
+		     c;
+		     cp = c, c = c->next)
+		{
+		    if (&Devtp[c->dx] != p[k])
+			continue;
+		    if (!cp)
+			Clone = c->next;
+		    else
+			cp->next = c->next;
+		    (void) free((FREE_P *)c);
+		    break;
+		}
+# endif	/* defined(HAS_STD_CLONE) && HAS_STD_CLONE==1 */
+
+	    }
+	    if (i != j)
+		p[j] = p[i];
+	    j++;
+	    i = k;
+	}
+	if (n == j)
+	    return(n);
+	if (!(*dp = (struct l_dev **)realloc((MALLOC_P *)*dp,
+		    (MALLOC_S)(j * sizeof(struct l_dev *)))))
+	{
+	    (void) fprintf(stderr, "%s: can't realloc %s device pointers\n",
+		Pn, nm);
+	    Exit(1);
+	}
+	return(j);
+}
+
+
+# if	defined(HASDCACHE)
+/*
+ * vfy_dev() - verify a device table entry (usually when DCunsafe == 1)
+ *
+ * Note: rereads entire device table when an entry can't be verified.
+ */
+
+int
+vfy_dev(dp)
+	struct l_dev *dp;		/* device table pointer */
+{
+	struct stat sb;
+
+	if (!DCunsafe || dp->v)
+	    return(1);
+	if (RDEV_STATFN(dp->name, &sb) != 0
+	||  dp->rdev != RDEV_EXPDEV(sb.st_rdev)
+	||  dp->inode != sb.st_ino) {
+	   (void) rereaddev();
+	   return(0);
+	}
+	dp->v = 1;
+	return(1);
+}
+# endif	/* defined(HASDCACHE) */
+#else	/* !defined(USE_LIB_READDEV) */
+char rdev_d1[] = "d"; char *rdev_d2 = rdev_d1;
+#endif	/* defined(USE_LIB_READDEV) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/regex.c b/lsof_4.85/lsof_4.85_src/lib/regex.c
new file mode 100644
index 0000000..88e959d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/regex.c
@@ -0,0 +1,6328 @@
+/*
+ * regex.c -- POSIX-conformant regular expression function set for the lsof
+ *	      library
+ *
+ * This file is used when the UNIX dialect does not have a POSIX-conformant
+ * regular expression function set.  In that case USE_LIB_REGEX is defined.
+ *
+ * V. Abell <abe@purdue.edu>
+ * Purdue University Computing Center
+ */
+
+
+/*
+ * Copyright 2000 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.
+ *
+ * This software has been adapted from snprintf.c in sendmail 8.9.3.  It
+ * is subject to the sendmail copyright statements listed below, and the
+ * sendmail licensing terms stated in the sendmail LICENSE file comment
+ * section of this file.
+ *
+ * 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.
+ */
+
+
+#include "../machine.h"
+
+#ifdef	USE_LIB_REGEX
+/*
+ * This file comes from GLIBC 2.2.  It is used when the UNIX dialect does not
+ * have a POSIX-conformant regular expression function set.  In that case
+ * USE_LIB_REGEX is defined.
+ */
+
+/* Extended regular expression matching and search library,
+   version 0.12.
+   (Implements POSIX draft P1003.2/D11.2, except for some of the
+   internationalization features.)
+   Copyright (C) 1993-1999, 2000 Free Software Foundation, Inc.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+/* AIX requires this to be the first thing in the file. */
+#if defined _AIX && !defined REGEX_MALLOC
+  #pragma alloca
+#endif
+
+#undef	_GNU_SOURCE
+#define _GNU_SOURCE
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#ifndef PARAMS
+# if defined __GNUC__ || (defined __STDC__ && __STDC__)
+#  define PARAMS(args) args
+# else
+#  define PARAMS(args) ()
+# endif  /* GCC.  */
+#endif  /* Not PARAMS.  */
+
+#if defined STDC_HEADERS && !defined emacs
+# include <stddef.h>
+#else
+/* We need this for `regex.h', and perhaps for the Emacs include files.  */
+# include <sys/types.h>
+#endif
+
+#define WIDE_CHAR_SUPPORT (HAVE_WCTYPE_H && HAVE_WCHAR_H && HAVE_BTOWC)
+
+/* For platform which support the ISO C amendement 1 functionality we
+   support user defined character classes.  */
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+/* Solaris 2.5 has a bug: <wchar.h> must be included before <wctype.h>.  */
+# include <wchar.h>
+# include <wctype.h>
+#endif
+
+#ifdef _LIBC
+/* We have to keep the namespace clean.  */
+# define regfree(preg) __regfree (preg)
+# define regexec(pr, st, nm, pm, ef) __regexec (pr, st, nm, pm, ef)
+# define regcomp(preg, pattern, cflags) __regcomp (preg, pattern, cflags)
+# define regerror(errcode, preg, errbuf, errbuf_size) \
+	__regerror(errcode, preg, errbuf, errbuf_size)
+# define re_set_registers(bu, re, nu, st, en) \
+	__re_set_registers (bu, re, nu, st, en)
+# define re_match_2(bufp, string1, size1, string2, size2, pos, regs, stop) \
+	__re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+# define re_match(bufp, string, size, pos, regs) \
+	__re_match (bufp, string, size, pos, regs)
+# define re_search(bufp, string, size, startpos, range, regs) \
+	__re_search (bufp, string, size, startpos, range, regs)
+# define re_compile_pattern(pattern, length, bufp) \
+	__re_compile_pattern (pattern, length, bufp)
+# define re_set_syntax(syntax) __re_set_syntax (syntax)
+# define re_search_2(bufp, st1, s1, st2, s2, startpos, range, regs, stop) \
+	__re_search_2 (bufp, st1, s1, st2, s2, startpos, range, regs, stop)
+# define re_compile_fastmap(bufp) __re_compile_fastmap (bufp)
+
+# define btowc __btowc
+
+/* We are also using some library internals.  */
+# include <locale/localeinfo.h>
+# include <locale/elem-hash.h>
+# include <langinfo.h>
+#endif
+
+/* This is for other GNU distributions with internationalized messages.  */
+#if HAVE_LIBINTL_H || defined _LIBC
+# include <libintl.h>
+# ifdef _LIBC
+#  undef gettext
+#  define gettext(msgid) __dcgettext ("libc", msgid, LC_MESSAGES)
+# endif
+#else
+# define gettext(msgid) (msgid)
+#endif
+
+#ifndef gettext_noop
+/* This define is so xgettext can find the internationalizable
+   strings.  */
+# define gettext_noop(String) String
+#endif
+
+/* The `emacs' switch turns on certain matching commands
+   that make sense only in Emacs. */
+#ifdef emacs
+
+# include "lisp.h"
+# include "buffer.h"
+# include "syntax.h"
+
+#else  /* not emacs */
+
+/* If we are not linking with Emacs proper,
+   we can't use the relocating allocator
+   even if config.h says that we can.  */
+# undef REL_ALLOC
+
+# if defined STDC_HEADERS || defined _LIBC
+#  include <stdlib.h>
+# else
+char *malloc ();
+char *realloc ();
+# endif
+
+/* When used in Emacs's lib-src, we need to get bzero and bcopy somehow.
+   If nothing else has been done, use the method below.  */
+# ifdef INHIBIT_STRING_HEADER
+#  if !(defined HAVE_BZERO && defined HAVE_BCOPY)
+#   if !defined bzero && !defined bcopy
+#    undef INHIBIT_STRING_HEADER
+#   endif
+#  endif
+# endif
+
+/* This is the normal way of making sure we have a bcopy and a bzero.
+   This is used in most programs--a few other programs avoid this
+   by defining INHIBIT_STRING_HEADER.  */
+# ifndef INHIBIT_STRING_HEADER
+#  if defined HAVE_STRING_H || defined STDC_HEADERS || defined _LIBC
+#   include <string.h>
+#   ifndef bzero
+#    ifndef _LIBC
+#     define bzero(s, n)	(memset (s, '\0', n), (s))
+#    else
+#     define bzero(s, n)	__bzero (s, n)
+#    endif
+#   endif
+#  else
+#   include <strings.h>
+#   ifndef memcmp
+#    define memcmp(s1, s2, n)	bcmp (s1, s2, n)
+#   endif
+#   ifndef memcpy
+#    define memcpy(d, s, n)	(bcopy (s, d, n), (d))
+#   endif
+#  endif
+# endif
+
+/* Define the syntax stuff for \<, \>, etc.  */
+
+/* This must be nonzero for the wordchar and notwordchar pattern
+   commands in re_match_2.  */
+# ifndef Sword
+#  define Sword 1
+# endif
+
+# ifdef SWITCH_ENUM_BUG
+#  define SWITCH_ENUM_CAST(x) ((int)(x))
+# else
+#  define SWITCH_ENUM_CAST(x) (x)
+# endif
+
+#endif /* not emacs */
+
+#if defined _LIBC || HAVE_LIMITS_H
+# include <limits.h>
+#endif
+
+#ifndef MB_LEN_MAX
+# define MB_LEN_MAX 1
+#endif
+
+/* Get the interface, including the syntax bits.  */
+/* Disabled by V. Abell on January 29, 2001: #include <regex.h> */
+#include "../regex.h"
+
+/* isalpha etc. are used for the character classes.  */
+#include <ctype.h>
+
+/* Jim Meyering writes:
+
+   "... Some ctype macros are valid only for character codes that
+   isascii says are ASCII (SGI's IRIX-4.0.5 is one such system --when
+   using /bin/cc or gcc but without giving an ansi option).  So, all
+   ctype uses should be through macros like ISPRINT...  If
+   STDC_HEADERS is defined, then autoconf has verified that the ctype
+   macros don't need to be guarded with references to isascii. ...
+   Defining isascii to 1 should let any compiler worth its salt
+   eliminate the && through constant folding."
+   Solaris defines some of these symbols so we must undefine them first.  */
+
+#undef ISASCII
+#if defined STDC_HEADERS || (!defined isascii && !defined HAVE_ISASCII)
+# define ISASCII(c) 1
+#else
+# define ISASCII(c) isascii(c)
+#endif
+
+#ifdef isblank
+# define ISBLANK(c) (ISASCII (c) && isblank (c))
+#else
+# define ISBLANK(c) ((c) == ' ' || (c) == '\t')
+#endif
+#ifdef isgraph
+# define ISGRAPH(c) (ISASCII (c) && isgraph (c))
+#else
+# define ISGRAPH(c) (ISASCII (c) && isprint (c) && !isspace (c))
+#endif
+
+#undef ISPRINT
+#define ISPRINT(c) (ISASCII (c) && isprint (c))
+#define ISDIGIT(c) (ISASCII (c) && isdigit (c))
+#define ISALNUM(c) (ISASCII (c) && isalnum (c))
+#define ISALPHA(c) (ISASCII (c) && isalpha (c))
+#define ISCNTRL(c) (ISASCII (c) && iscntrl (c))
+#define ISLOWER(c) (ISASCII (c) && islower (c))
+#define ISPUNCT(c) (ISASCII (c) && ispunct (c))
+#define ISSPACE(c) (ISASCII (c) && isspace (c))
+#define ISUPPER(c) (ISASCII (c) && isupper (c))
+#define ISXDIGIT(c) (ISASCII (c) && isxdigit (c))
+
+#ifdef _tolower
+# define TOLOWER(c) _tolower(c)
+#else
+# define TOLOWER(c) tolower(c)
+#endif
+
+#ifndef NULL
+# define NULL (void *)0
+#endif
+
+/* We remove any previous definition of `SIGN_EXTEND_CHAR',
+   since ours (we hope) works properly with all combinations of
+   machines, compilers, `char' and `unsigned char' argument types.
+   (Per Bothner suggested the basic approach.)  */
+#undef SIGN_EXTEND_CHAR
+#if __STDC__
+# define SIGN_EXTEND_CHAR(c) ((signed char) (c))
+#else  /* not __STDC__ */
+/* As in Harbison and Steele.  */
+# define SIGN_EXTEND_CHAR(c) ((((unsigned char) (c)) ^ 128) - 128)
+#endif
+
+#ifndef emacs
+/* How many characters in the character set.  */
+# define CHAR_SET_SIZE 256
+
+# ifdef SYNTAX_TABLE
+
+extern char *re_syntax_table;
+
+# else /* not SYNTAX_TABLE */
+
+static char re_syntax_table[CHAR_SET_SIZE];
+
+static void
+init_syntax_once ()
+{
+   register int c;
+   static int done = 0;
+
+   if (done)
+     return;
+   bzero (re_syntax_table, sizeof re_syntax_table);
+
+   for (c = 0; c < CHAR_SET_SIZE; ++c)
+     if (ISALNUM (c))
+	re_syntax_table[c] = Sword;
+
+   re_syntax_table['_'] = Sword;
+
+   done = 1;
+}
+
+# endif /* not SYNTAX_TABLE */
+
+# define SYNTAX(c) re_syntax_table[(unsigned char) (c)]
+
+#endif /* emacs */
+
+/* Should we use malloc or alloca?  If REGEX_MALLOC is not defined, we
+   use `alloca' instead of `malloc'.  This is because using malloc in
+   re_search* or re_match* could cause memory leaks when C-g is used in
+   Emacs; also, malloc is slower and causes storage fragmentation.  On
+   the other hand, malloc is more portable, and easier to debug.
+
+   Because we sometimes use alloca, some routines have to be macros,
+   not functions -- `alloca'-allocated space disappears at the end of the
+   function it is called in.  */
+
+#ifdef REGEX_MALLOC
+
+# define REGEX_ALLOCATE malloc
+# define REGEX_REALLOCATE(source, osize, nsize) realloc (source, nsize)
+# define REGEX_FREE free
+
+#else /* not REGEX_MALLOC  */
+
+/* Emacs already defines alloca, sometimes.  */
+# ifndef alloca
+
+/* Make alloca work the best possible way.  */
+#  ifdef __GNUC__
+#   define alloca __builtin_alloca
+#  else /* not __GNUC__ */
+#   if HAVE_ALLOCA_H
+#    include <alloca.h>
+#   endif /* HAVE_ALLOCA_H */
+#  endif /* not __GNUC__ */
+
+# endif /* not alloca */
+
+# define REGEX_ALLOCATE alloca
+
+/* Assumes a `char *destination' variable.  */
+# define REGEX_REALLOCATE(source, osize, nsize)				\
+  (destination = (char *) alloca (nsize),				\
+   memcpy (destination, source, osize))
+
+/* No need to do anything to free, after alloca.  */
+# define REGEX_FREE(arg) ((void)0) /* Do nothing!  But inhibit gcc warning.  */
+
+#endif /* not REGEX_MALLOC */
+
+/* Define how to allocate the failure stack.  */
+
+#if defined REL_ALLOC && defined REGEX_MALLOC
+
+# define REGEX_ALLOCATE_STACK(size)				\
+  r_alloc (&failure_stack_ptr, (size))
+# define REGEX_REALLOCATE_STACK(source, osize, nsize)		\
+  r_re_alloc (&failure_stack_ptr, (nsize))
+# define REGEX_FREE_STACK(ptr)					\
+  r_alloc_free (&failure_stack_ptr)
+
+#else /* not using relocating allocator */
+
+# ifdef REGEX_MALLOC
+
+#  define REGEX_ALLOCATE_STACK malloc
+#  define REGEX_REALLOCATE_STACK(source, osize, nsize) realloc (source, nsize)
+#  define REGEX_FREE_STACK free
+
+# else /* not REGEX_MALLOC */
+
+#  define REGEX_ALLOCATE_STACK alloca
+
+#  define REGEX_REALLOCATE_STACK(source, osize, nsize)			\
+   REGEX_REALLOCATE (source, osize, nsize)
+/* No need to explicitly free anything.  */
+#  define REGEX_FREE_STACK(arg)
+
+# endif /* not REGEX_MALLOC */
+#endif /* not using relocating allocator */
+
+
+/* True if `size1' is non-NULL and PTR is pointing anywhere inside
+   `string1' or just past its end.  This works if PTR is NULL, which is
+   a good thing.  */
+#define FIRST_STRING_P(ptr) 					\
+  (size1 && string1 <= (ptr) && (ptr) <= string1 + size1)
+
+/* (Re)Allocate N items of type T using malloc, or fail.  */
+#define TALLOC(n, t) ((t *) malloc ((n) * sizeof (t)))
+#define RETALLOC(addr, n, t) ((addr) = (t *) realloc (addr, (n) * sizeof (t)))
+#define RETALLOC_IF(addr, n, t) \
+  if (addr) RETALLOC((addr), (n), t); else (addr) = TALLOC ((n), t)
+#define REGEX_TALLOC(n, t) ((t *) REGEX_ALLOCATE ((n) * sizeof (t)))
+
+#define BYTEWIDTH 8 /* In bits.  */
+
+#define STREQ(s1, s2) ((strcmp (s1, s2) == 0))
+
+#undef MAX
+#undef MIN
+#define MAX(a, b) ((a) > (b) ? (a) : (b))
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+
+typedef char boolean;
+#define false 0
+#define true 1
+
+static int re_match_2_internal PARAMS ((struct re_pattern_buffer *bufp,
+					const char *string1, int size1,
+					const char *string2, int size2,
+					int pos,
+					struct re_registers *regs,
+					int stop));
+
+/* These are the command codes that appear in compiled regular
+   expressions.  Some opcodes are followed by argument bytes.  A
+   command code can specify any interpretation whatsoever for its
+   arguments.  Zero bytes may appear in the compiled regular expression.  */
+
+typedef enum
+{
+  no_op = 0,
+
+  /* Succeed right away--no more backtracking.  */
+  succeed,
+
+        /* Followed by one byte giving n, then by n literal bytes.  */
+  exactn,
+
+        /* Matches any (more or less) character.  */
+  anychar,
+
+        /* Matches any one char belonging to specified set.  First
+           following byte is number of bitmap bytes.  Then come bytes
+           for a bitmap saying which chars are in.  Bits in each byte
+           are ordered low-bit-first.  A character is in the set if its
+           bit is 1.  A character too large to have a bit in the map is
+           automatically not in the set.  */
+  charset,
+
+        /* Same parameters as charset, but match any character that is
+           not one of those specified.  */
+  charset_not,
+
+        /* Start remembering the text that is matched, for storing in a
+           register.  Followed by one byte with the register number, in
+           the range 0 to one less than the pattern buffer's re_nsub
+           field.  Then followed by one byte with the number of groups
+           inner to this one.  (This last has to be part of the
+           start_memory only because we need it in the on_failure_jump
+           of re_match_2.)  */
+  start_memory,
+
+        /* Stop remembering the text that is matched and store it in a
+           memory register.  Followed by one byte with the register
+           number, in the range 0 to one less than `re_nsub' in the
+           pattern buffer, and one byte with the number of inner groups,
+           just like `start_memory'.  (We need the number of inner
+           groups here because we don't have any easy way of finding the
+           corresponding start_memory when we're at a stop_memory.)  */
+  stop_memory,
+
+        /* Match a duplicate of something remembered. Followed by one
+           byte containing the register number.  */
+  duplicate,
+
+        /* Fail unless at beginning of line.  */
+  begline,
+
+        /* Fail unless at end of line.  */
+  endline,
+
+        /* Succeeds if at beginning of buffer (if emacs) or at beginning
+           of string to be matched (if not).  */
+  begbuf,
+
+        /* Analogously, for end of buffer/string.  */
+  endbuf,
+
+        /* Followed by two byte relative address to which to jump.  */
+  jump,
+
+	/* Same as jump, but marks the end of an alternative.  */
+  jump_past_alt,
+
+        /* Followed by two-byte relative address of place to resume at
+           in case of failure.  */
+  on_failure_jump,
+
+        /* Like on_failure_jump, but pushes a placeholder instead of the
+           current string position when executed.  */
+  on_failure_keep_string_jump,
+
+        /* Throw away latest failure point and then jump to following
+           two-byte relative address.  */
+  pop_failure_jump,
+
+        /* Change to pop_failure_jump if know won't have to backtrack to
+           match; otherwise change to jump.  This is used to jump
+           back to the beginning of a repeat.  If what follows this jump
+           clearly won't match what the repeat does, such that we can be
+           sure that there is no use backtracking out of repetitions
+           already matched, then we change it to a pop_failure_jump.
+           Followed by two-byte address.  */
+  maybe_pop_jump,
+
+        /* Jump to following two-byte address, and push a dummy failure
+           point. This failure point will be thrown away if an attempt
+           is made to use it for a failure.  A `+' construct makes this
+           before the first repeat.  Also used as an intermediary kind
+           of jump when compiling an alternative.  */
+  dummy_failure_jump,
+
+	/* Push a dummy failure point and continue.  Used at the end of
+	   alternatives.  */
+  push_dummy_failure,
+
+        /* Followed by two-byte relative address and two-byte number n.
+           After matching N times, jump to the address upon failure.  */
+  succeed_n,
+
+        /* Followed by two-byte relative address, and two-byte number n.
+           Jump to the address N times, then fail.  */
+  jump_n,
+
+        /* Set the following two-byte relative address to the
+           subsequent two-byte number.  The address *includes* the two
+           bytes of number.  */
+  set_number_at,
+
+  wordchar,	/* Matches any word-constituent character.  */
+  notwordchar,	/* Matches any char that is not a word-constituent.  */
+
+  wordbeg,	/* Succeeds if at word beginning.  */
+  wordend,	/* Succeeds if at word end.  */
+
+  wordbound,	/* Succeeds if at a word boundary.  */
+  notwordbound	/* Succeeds if not at a word boundary.  */
+
+#ifdef emacs
+  ,before_dot,	/* Succeeds if before point.  */
+  at_dot,	/* Succeeds if at point.  */
+  after_dot,	/* Succeeds if after point.  */
+
+	/* Matches any character whose syntax is specified.  Followed by
+           a byte which contains a syntax code, e.g., Sword.  */
+  syntaxspec,
+
+	/* Matches any character whose syntax is not that specified.  */
+  notsyntaxspec
+#endif /* emacs */
+} re_opcode_t;
+
+/* Common operations on the compiled pattern.  */
+
+/* Store NUMBER in two contiguous bytes starting at DESTINATION.  */
+
+#define STORE_NUMBER(destination, number)				\
+  do {									\
+    (destination)[0] = (number) & 0377;					\
+    (destination)[1] = (number) >> 8;					\
+  } while (0)
+
+/* Same as STORE_NUMBER, except increment DESTINATION to
+   the byte after where the number is stored.  Therefore, DESTINATION
+   must be an lvalue.  */
+
+#define STORE_NUMBER_AND_INCR(destination, number)			\
+  do {									\
+    STORE_NUMBER (destination, number);					\
+    (destination) += 2;							\
+  } while (0)
+
+/* Put into DESTINATION a number stored in two contiguous bytes starting
+   at SOURCE.  */
+
+#define EXTRACT_NUMBER(destination, source)				\
+  do {									\
+    (destination) = *(source) & 0377;					\
+    (destination) += SIGN_EXTEND_CHAR (*((source) + 1)) << 8;		\
+  } while (0)
+
+#ifdef DEBUG
+static void extract_number _RE_ARGS ((int *dest, unsigned char *source));
+static void
+extract_number (dest, source)
+    int *dest;
+    unsigned char *source;
+{
+  int temp = SIGN_EXTEND_CHAR (*(source + 1));
+  *dest = *source & 0377;
+  *dest += temp << 8;
+}
+
+# ifndef EXTRACT_MACROS /* To debug the macros.  */
+#  undef EXTRACT_NUMBER
+#  define EXTRACT_NUMBER(dest, src) extract_number (&dest, src)
+# endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+/* Same as EXTRACT_NUMBER, except increment SOURCE to after the number.
+   SOURCE must be an lvalue.  */
+
+#define EXTRACT_NUMBER_AND_INCR(destination, source)			\
+  do {									\
+    EXTRACT_NUMBER (destination, source);				\
+    (source) += 2; 							\
+  } while (0)
+
+#ifdef DEBUG
+static void extract_number_and_incr _RE_ARGS ((int *destination,
+					       unsigned char **source));
+static void
+extract_number_and_incr (destination, source)
+    int *destination;
+    unsigned char **source;
+{
+  extract_number (destination, *source);
+  *source += 2;
+}
+
+# ifndef EXTRACT_MACROS
+#  undef EXTRACT_NUMBER_AND_INCR
+#  define EXTRACT_NUMBER_AND_INCR(dest, src) \
+  extract_number_and_incr (&dest, &src)
+# endif /* not EXTRACT_MACROS */
+
+#endif /* DEBUG */
+
+/* If DEBUG is defined, Regex prints many voluminous messages about what
+   it is doing (if the variable `debug' is nonzero).  If linked with the
+   main program in `iregex.c', you can enter patterns and strings
+   interactively.  And if linked with the main program in `main.c' and
+   the other test files, you can run the already-written tests.  */
+
+#ifdef DEBUG
+
+/* We use standard I/O for debugging.  */
+# include <stdio.h>
+
+/* It is useful to test things that ``must'' be true when debugging.  */
+# include <assert.h>
+
+static int debug;
+
+# define DEBUG_STATEMENT(e) e
+# define DEBUG_PRINT1(x) if (debug) printf (x)
+# define DEBUG_PRINT2(x1, x2) if (debug) printf (x1, x2)
+# define DEBUG_PRINT3(x1, x2, x3) if (debug) printf (x1, x2, x3)
+# define DEBUG_PRINT4(x1, x2, x3, x4) if (debug) printf (x1, x2, x3, x4)
+# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e) 				\
+  if (debug) print_partial_compiled_pattern (s, e)
+# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)			\
+  if (debug) print_double_string (w, s1, sz1, s2, sz2)
+
+
+/* Print the fastmap in human-readable form.  */
+
+void
+print_fastmap (fastmap)
+    char *fastmap;
+{
+  unsigned was_a_range = 0;
+  unsigned i = 0;
+
+  while (i < (1 << BYTEWIDTH))
+    {
+      if (fastmap[i++])
+	{
+	  was_a_range = 0;
+          putchar (i - 1);
+          while (i < (1 << BYTEWIDTH)  &&  fastmap[i])
+            {
+              was_a_range = 1;
+              i++;
+            }
+	  if (was_a_range)
+            {
+              printf ("-");
+              putchar (i - 1);
+            }
+        }
+    }
+  putchar ('\n');
+}
+
+
+/* Print a compiled pattern string in human-readable form, starting at
+   the START pointer into it and ending just before the pointer END.  */
+
+void
+print_partial_compiled_pattern (start, end)
+    unsigned char *start;
+    unsigned char *end;
+{
+  int mcnt, mcnt2;
+  unsigned char *p1;
+  unsigned char *p = start;
+  unsigned char *pend = end;
+
+  if (start == NULL)
+    {
+      printf ("(null)\n");
+      return;
+    }
+
+  /* Loop over pattern commands.  */
+  while (p < pend)
+    {
+#ifdef _LIBC
+      printf ("%t:\t", p - start);
+#else
+      printf ("%ld:\t", (long int) (p - start));
+#endif
+
+      switch ((re_opcode_t) *p++)
+	{
+        case no_op:
+          printf ("/no_op");
+          break;
+
+	case exactn:
+	  mcnt = *p++;
+          printf ("/exactn/%d", mcnt);
+          do
+	    {
+              putchar ('/');
+	      putchar (*p++);
+            }
+          while (--mcnt);
+          break;
+
+	case start_memory:
+          mcnt = *p++;
+          printf ("/start_memory/%d/%d", mcnt, *p++);
+          break;
+
+	case stop_memory:
+          mcnt = *p++;
+	  printf ("/stop_memory/%d/%d", mcnt, *p++);
+          break;
+
+	case duplicate:
+	  printf ("/duplicate/%d", *p++);
+	  break;
+
+	case anychar:
+	  printf ("/anychar");
+	  break;
+
+	case charset:
+        case charset_not:
+          {
+            register int c, last = -100;
+	    register int in_range = 0;
+
+	    printf ("/charset [%s",
+	            (re_opcode_t) *(p - 1) == charset_not ? "^" : "");
+
+            assert (p + *p < pend);
+
+            for (c = 0; c < 256; c++)
+	      if (c / 8 < *p
+		  && (p[1 + (c/8)] & (1 << (c % 8))))
+		{
+		  /* Are we starting a range?  */
+		  if (last + 1 == c && ! in_range)
+		    {
+		      putchar ('-');
+		      in_range = 1;
+		    }
+		  /* Have we broken a range?  */
+		  else if (last + 1 != c && in_range)
+              {
+		      putchar (last);
+		      in_range = 0;
+		    }
+
+		  if (! in_range)
+		    putchar (c);
+
+		  last = c;
+              }
+
+	    if (in_range)
+	      putchar (last);
+
+	    putchar (']');
+
+	    p += 1 + *p;
+	  }
+	  break;
+
+	case begline:
+	  printf ("/begline");
+          break;
+
+	case endline:
+          printf ("/endline");
+          break;
+
+	case on_failure_jump:
+          extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/on_failure_jump to %t", p + mcnt - start);
+#else
+  	  printf ("/on_failure_jump to %ld", (long int) (p + mcnt - start));
+#endif
+          break;
+
+	case on_failure_keep_string_jump:
+          extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/on_failure_keep_string_jump to %t", p + mcnt - start);
+#else
+  	  printf ("/on_failure_keep_string_jump to %ld",
+		  (long int) (p + mcnt - start));
+#endif
+          break;
+
+	case dummy_failure_jump:
+          extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/dummy_failure_jump to %t", p + mcnt - start);
+#else
+  	  printf ("/dummy_failure_jump to %ld", (long int) (p + mcnt - start));
+#endif
+          break;
+
+	case push_dummy_failure:
+          printf ("/push_dummy_failure");
+          break;
+
+        case maybe_pop_jump:
+          extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/maybe_pop_jump to %t", p + mcnt - start);
+#else
+  	  printf ("/maybe_pop_jump to %ld", (long int) (p + mcnt - start));
+#endif
+	  break;
+
+        case pop_failure_jump:
+	  extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/pop_failure_jump to %t", p + mcnt - start);
+#else
+  	  printf ("/pop_failure_jump to %ld", (long int) (p + mcnt - start));
+#endif
+	  break;
+
+        case jump_past_alt:
+	  extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/jump_past_alt to %t", p + mcnt - start);
+#else
+  	  printf ("/jump_past_alt to %ld", (long int) (p + mcnt - start));
+#endif
+	  break;
+
+        case jump:
+	  extract_number_and_incr (&mcnt, &p);
+#ifdef _LIBC
+  	  printf ("/jump to %t", p + mcnt - start);
+#else
+  	  printf ("/jump to %ld", (long int) (p + mcnt - start));
+#endif
+	  break;
+
+        case succeed_n:
+          extract_number_and_incr (&mcnt, &p);
+	  p1 = p + mcnt;
+          extract_number_and_incr (&mcnt2, &p);
+#ifdef _LIBC
+	  printf ("/succeed_n to %t, %d times", p1 - start, mcnt2);
+#else
+	  printf ("/succeed_n to %ld, %d times",
+		  (long int) (p1 - start), mcnt2);
+#endif
+          break;
+
+        case jump_n:
+          extract_number_and_incr (&mcnt, &p);
+	  p1 = p + mcnt;
+          extract_number_and_incr (&mcnt2, &p);
+	  printf ("/jump_n to %d, %d times", p1 - start, mcnt2);
+          break;
+
+        case set_number_at:
+          extract_number_and_incr (&mcnt, &p);
+	  p1 = p + mcnt;
+          extract_number_and_incr (&mcnt2, &p);
+#ifdef _LIBC
+	  printf ("/set_number_at location %t to %d", p1 - start, mcnt2);
+#else
+	  printf ("/set_number_at location %ld to %d",
+		  (long int) (p1 - start), mcnt2);
+#endif
+          break;
+
+        case wordbound:
+	  printf ("/wordbound");
+	  break;
+
+	case notwordbound:
+	  printf ("/notwordbound");
+          break;
+
+	case wordbeg:
+	  printf ("/wordbeg");
+	  break;
+
+	case wordend:
+	  printf ("/wordend");
+
+# ifdef emacs
+	case before_dot:
+	  printf ("/before_dot");
+          break;
+
+	case at_dot:
+	  printf ("/at_dot");
+          break;
+
+	case after_dot:
+	  printf ("/after_dot");
+          break;
+
+	case syntaxspec:
+          printf ("/syntaxspec");
+	  mcnt = *p++;
+	  printf ("/%d", mcnt);
+          break;
+
+	case notsyntaxspec:
+          printf ("/notsyntaxspec");
+	  mcnt = *p++;
+	  printf ("/%d", mcnt);
+	  break;
+# endif /* emacs */
+
+	case wordchar:
+	  printf ("/wordchar");
+          break;
+
+	case notwordchar:
+	  printf ("/notwordchar");
+          break;
+
+	case begbuf:
+	  printf ("/begbuf");
+          break;
+
+	case endbuf:
+	  printf ("/endbuf");
+          break;
+
+        default:
+          printf ("?%d", *(p-1));
+	}
+
+      putchar ('\n');
+    }
+
+#ifdef _LIBC
+  printf ("%t:\tend of pattern.\n", p - start);
+#else
+  printf ("%ld:\tend of pattern.\n", (long int) (p - start));
+#endif
+}
+
+
+void
+print_compiled_pattern (bufp)
+    struct re_pattern_buffer *bufp;
+{
+  unsigned char *buffer = bufp->buffer;
+
+  print_partial_compiled_pattern (buffer, buffer + bufp->used);
+  printf ("%ld bytes used/%ld bytes allocated.\n",
+	  bufp->used, bufp->allocated);
+
+  if (bufp->fastmap_accurate && bufp->fastmap)
+    {
+      printf ("fastmap: ");
+      print_fastmap (bufp->fastmap);
+    }
+
+#ifdef _LIBC
+  printf ("re_nsub: %Zd\t", bufp->re_nsub);
+#else
+  printf ("re_nsub: %ld\t", (long int) bufp->re_nsub);
+#endif
+  printf ("regs_alloc: %d\t", bufp->regs_allocated);
+  printf ("can_be_null: %d\t", bufp->can_be_null);
+  printf ("newline_anchor: %d\n", bufp->newline_anchor);
+  printf ("no_sub: %d\t", bufp->no_sub);
+  printf ("not_bol: %d\t", bufp->not_bol);
+  printf ("not_eol: %d\t", bufp->not_eol);
+  printf ("syntax: %lx\n", bufp->syntax);
+  /* Perhaps we should print the translate table?  */
+}
+
+
+void
+print_double_string (where, string1, size1, string2, size2)
+    const char *where;
+    const char *string1;
+    const char *string2;
+    int size1;
+    int size2;
+{
+  int this_char;
+
+  if (where == NULL)
+    printf ("(null)");
+  else
+    {
+      if (FIRST_STRING_P (where))
+        {
+          for (this_char = where - string1; this_char < size1; this_char++)
+            putchar (string1[this_char]);
+
+          where = string2;
+        }
+
+      for (this_char = where - string2; this_char < size2; this_char++)
+        putchar (string2[this_char]);
+    }
+}
+
+void
+printchar (c)
+     int c;
+{
+  putc (c, stderr);
+}
+
+#else /* not DEBUG */
+
+# undef assert
+# define assert(e)
+
+# define DEBUG_STATEMENT(e)
+# define DEBUG_PRINT1(x)
+# define DEBUG_PRINT2(x1, x2)
+# define DEBUG_PRINT3(x1, x2, x3)
+# define DEBUG_PRINT4(x1, x2, x3, x4)
+# define DEBUG_PRINT_COMPILED_PATTERN(p, s, e)
+# define DEBUG_PRINT_DOUBLE_STRING(w, s1, sz1, s2, sz2)
+
+#endif /* not DEBUG */
+
+/* Set by `re_set_syntax' to the current regexp syntax to recognize.  Can
+   also be assigned to arbitrarily: each pattern buffer stores its own
+   syntax, so it can be changed between regex compilations.  */
+/* This has no initializer because initialized variables in Emacs
+   become read-only after dumping.  */
+reg_syntax_t re_syntax_options;
+
+
+/* Specify the precise syntax of regexps for compilation.  This provides
+   for compatibility for various utilities which historically have
+   different, incompatible syntaxes.
+
+   The argument SYNTAX is a bit mask comprised of the various bits
+   defined in regex.h.  We return the old syntax.  */
+
+reg_syntax_t
+re_set_syntax (syntax)
+    reg_syntax_t syntax;
+{
+  reg_syntax_t ret = re_syntax_options;
+
+  re_syntax_options = syntax;
+#ifdef DEBUG
+  if (syntax & RE_DEBUG)
+    debug = 1;
+  else if (debug) /* was on but now is not */
+    debug = 0;
+#endif /* DEBUG */
+  return ret;
+}
+#ifdef _LIBC
+weak_alias (__re_set_syntax, re_set_syntax)
+#endif
+
+/* This table gives an error message for each of the error codes listed
+   in regex.h.  Obviously the order here has to be same as there.
+   POSIX doesn't require that we do anything for REG_NOERROR,
+   but why not be nice?  */
+
+static const char re_error_msgid[] =
+  {
+#define REG_NOERROR_IDX	0
+    gettext_noop ("Success")	/* REG_NOERROR */
+    "\0"
+#define REG_NOMATCH_IDX (REG_NOERROR_IDX + sizeof "Success")
+    gettext_noop ("No match")	/* REG_NOMATCH */
+    "\0"
+#define REG_BADPAT_IDX	(REG_NOMATCH_IDX + sizeof "No match")
+    gettext_noop ("Invalid regular expression") /* REG_BADPAT */
+    "\0"
+#define REG_ECOLLATE_IDX (REG_BADPAT_IDX + sizeof "Invalid regular expression")
+    gettext_noop ("Invalid collation character") /* REG_ECOLLATE */
+    "\0"
+#define REG_ECTYPE_IDX	(REG_ECOLLATE_IDX + sizeof "Invalid collation character")
+    gettext_noop ("Invalid character class name") /* REG_ECTYPE */
+    "\0"
+#define REG_EESCAPE_IDX	(REG_ECTYPE_IDX + sizeof "Invalid character class name")
+    gettext_noop ("Trailing backslash") /* REG_EESCAPE */
+    "\0"
+#define REG_ESUBREG_IDX	(REG_EESCAPE_IDX + sizeof "Trailing backslash")
+    gettext_noop ("Invalid back reference") /* REG_ESUBREG */
+    "\0"
+#define REG_EBRACK_IDX	(REG_ESUBREG_IDX + sizeof "Invalid back reference")
+    gettext_noop ("Unmatched [ or [^")	/* REG_EBRACK */
+    "\0"
+#define REG_EPAREN_IDX	(REG_EBRACK_IDX + sizeof "Unmatched [ or [^")
+    gettext_noop ("Unmatched ( or \\(") /* REG_EPAREN */
+    "\0"
+#define REG_EBRACE_IDX	(REG_EPAREN_IDX + sizeof "Unmatched ( or \\(")
+    gettext_noop ("Unmatched \\{") /* REG_EBRACE */
+    "\0"
+#define REG_BADBR_IDX	(REG_EBRACE_IDX + sizeof "Unmatched \\{")
+    gettext_noop ("Invalid content of \\{\\}") /* REG_BADBR */
+    "\0"
+#define REG_ERANGE_IDX	(REG_BADBR_IDX + sizeof "Invalid content of \\{\\}")
+    gettext_noop ("Invalid range end")	/* REG_ERANGE */
+    "\0"
+#define REG_ESPACE_IDX	(REG_ERANGE_IDX + sizeof "Invalid range end")
+    gettext_noop ("Memory exhausted") /* REG_ESPACE */
+    "\0"
+#define REG_BADRPT_IDX	(REG_ESPACE_IDX + sizeof "Memory exhausted")
+    gettext_noop ("Invalid preceding regular expression") /* REG_BADRPT */
+    "\0"
+#define REG_EEND_IDX	(REG_BADRPT_IDX + sizeof "Invalid preceding regular expression")
+    gettext_noop ("Premature end of regular expression") /* REG_EEND */
+    "\0"
+#define REG_ESIZE_IDX	(REG_EEND_IDX + sizeof "Premature end of regular expression")
+    gettext_noop ("Regular expression too big") /* REG_ESIZE */
+    "\0"
+#define REG_ERPAREN_IDX	(REG_ESIZE_IDX + sizeof "Regular expression too big")
+    gettext_noop ("Unmatched ) or \\)") /* REG_ERPAREN */
+  };
+
+static const size_t re_error_msgid_idx[] =
+  {
+    REG_NOERROR_IDX,
+    REG_NOMATCH_IDX,
+    REG_BADPAT_IDX,
+    REG_ECOLLATE_IDX,
+    REG_ECTYPE_IDX,
+    REG_EESCAPE_IDX,
+    REG_ESUBREG_IDX,
+    REG_EBRACK_IDX,
+    REG_EPAREN_IDX,
+    REG_EBRACE_IDX,
+    REG_BADBR_IDX,
+    REG_ERANGE_IDX,
+    REG_ESPACE_IDX,
+    REG_BADRPT_IDX,
+    REG_EEND_IDX,
+    REG_ESIZE_IDX,
+    REG_ERPAREN_IDX
+  };
+
+/* Avoiding alloca during matching, to placate r_alloc.  */
+
+/* Define MATCH_MAY_ALLOCATE unless we need to make sure that the
+   searching and matching functions should not call alloca.  On some
+   systems, alloca is implemented in terms of malloc, and if we're
+   using the relocating allocator routines, then malloc could cause a
+   relocation, which might (if the strings being searched are in the
+   ralloc heap) shift the data out from underneath the regexp
+   routines.
+
+   Here's another reason to avoid allocation: Emacs
+   processes input from X in a signal handler; processing X input may
+   call malloc; if input arrives while a matching routine is calling
+   malloc, then we're scrod.  But Emacs can't just block input while
+   calling matching routines; then we don't notice interrupts when
+   they come in.  So, Emacs blocks input around all regexp calls
+   except the matching calls, which it leaves unprotected, in the
+   faith that they will not malloc.  */
+
+/* Normally, this is fine.  */
+#define MATCH_MAY_ALLOCATE
+
+/* When using GNU C, we are not REALLY using the C alloca, no matter
+   what config.h may say.  So don't take precautions for it.  */
+#ifdef __GNUC__
+# undef C_ALLOCA
+#endif
+
+/* The match routines may not allocate if (1) they would do it with malloc
+   and (2) it's not safe for them to use malloc.
+   Note that if REL_ALLOC is defined, matching would not use malloc for the
+   failure stack, but we would still use it for the register vectors;
+   so REL_ALLOC should not affect this.  */
+#if (defined C_ALLOCA || defined REGEX_MALLOC) && defined emacs
+# undef MATCH_MAY_ALLOCATE
+#endif
+
+
+/* Failure stack declarations and macros; both re_compile_fastmap and
+   re_match_2 use a failure stack.  These have to be macros because of
+   REGEX_ALLOCATE_STACK.  */
+
+
+/* Number of failure points for which to initially allocate space
+   when matching.  If this number is exceeded, we allocate more
+   space, so it is not a hard limit.  */
+#ifndef INIT_FAILURE_ALLOC
+# define INIT_FAILURE_ALLOC 5
+#endif
+
+/* Roughly the maximum number of failure points on the stack.  Would be
+   exactly that if always used MAX_FAILURE_ITEMS items each time we failed.
+   This is a variable only so users of regex can assign to it; we never
+   change it ourselves.  */
+
+#ifdef INT_IS_16BIT
+
+# if defined MATCH_MAY_ALLOCATE
+/* 4400 was enough to cause a crash on Alpha OSF/1,
+   whose default stack limit is 2mb.  */
+long int re_max_failures = 4000;
+# else
+long int re_max_failures = 2000;
+# endif
+
+union fail_stack_elt
+{
+  unsigned char *pointer;
+  long int integer;
+};
+
+typedef union fail_stack_elt fail_stack_elt_t;
+
+typedef struct
+{
+  fail_stack_elt_t *stack;
+  unsigned long int size;
+  unsigned long int avail;		/* Offset of next open position.  */
+} fail_stack_type;
+
+#else /* not INT_IS_16BIT */
+
+# if defined MATCH_MAY_ALLOCATE
+/* 4400 was enough to cause a crash on Alpha OSF/1,
+   whose default stack limit is 2mb.  */
+int re_max_failures = 4000;
+# else
+int re_max_failures = 2000;
+# endif
+
+union fail_stack_elt
+{
+  unsigned char *pointer;
+  int integer;
+};
+
+typedef union fail_stack_elt fail_stack_elt_t;
+
+typedef struct
+{
+  fail_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} fail_stack_type;
+
+#endif /* INT_IS_16BIT */
+
+#define FAIL_STACK_EMPTY()     (fail_stack.avail == 0)
+#define FAIL_STACK_PTR_EMPTY() (fail_stack_ptr->avail == 0)
+#define FAIL_STACK_FULL()      (fail_stack.avail == fail_stack.size)
+
+
+/* Define macros to initialize and free the failure stack.
+   Do `return -2' if the alloc fails.  */
+
+#ifdef MATCH_MAY_ALLOCATE
+# define INIT_FAIL_STACK()						\
+  do {									\
+    fail_stack.stack = (fail_stack_elt_t *)				\
+      REGEX_ALLOCATE_STACK (INIT_FAILURE_ALLOC * sizeof (fail_stack_elt_t)); \
+									\
+    if (fail_stack.stack == NULL)					\
+      return -2;							\
+									\
+    fail_stack.size = INIT_FAILURE_ALLOC;				\
+    fail_stack.avail = 0;						\
+  } while (0)
+
+# define RESET_FAIL_STACK()  REGEX_FREE_STACK (fail_stack.stack)
+#else
+# define INIT_FAIL_STACK()						\
+  do {									\
+    fail_stack.avail = 0;						\
+  } while (0)
+
+# define RESET_FAIL_STACK()
+#endif
+
+
+/* Double the size of FAIL_STACK, up to approximately `re_max_failures' items.
+
+   Return 1 if succeeds, and 0 if either ran out of memory
+   allocating space for it or it was already too large.
+
+   REGEX_REALLOCATE_STACK requires `destination' be declared.   */
+
+#define DOUBLE_FAIL_STACK(fail_stack)					\
+  ((fail_stack).size > (unsigned) (re_max_failures * MAX_FAILURE_ITEMS)	\
+   ? 0									\
+   : ((fail_stack).stack = (fail_stack_elt_t *)				\
+        REGEX_REALLOCATE_STACK ((fail_stack).stack, 			\
+          (fail_stack).size * sizeof (fail_stack_elt_t),		\
+          ((fail_stack).size << 1) * sizeof (fail_stack_elt_t)),	\
+									\
+      (fail_stack).stack == NULL					\
+      ? 0								\
+      : ((fail_stack).size <<= 1, 					\
+         1)))
+
+
+/* Push pointer POINTER on FAIL_STACK.
+   Return 1 if was able to do so and 0 if ran out of memory allocating
+   space to do so.  */
+#define PUSH_PATTERN_OP(POINTER, FAIL_STACK)				\
+  ((FAIL_STACK_FULL ()							\
+    && !DOUBLE_FAIL_STACK (FAIL_STACK))					\
+   ? 0									\
+   : ((FAIL_STACK).stack[(FAIL_STACK).avail++].pointer = POINTER,	\
+      1))
+
+/* Push a pointer value onto the failure stack.
+   Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_POINTER(item)					\
+  fail_stack.stack[fail_stack.avail++].pointer = (unsigned char *) (item)
+
+/* This pushes an integer-valued item onto the failure stack.
+   Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_INT(item)					\
+  fail_stack.stack[fail_stack.avail++].integer = (item)
+
+/* Push a fail_stack_elt_t value onto the failure stack.
+   Assumes the variable `fail_stack'.  Probably should only
+   be called from within `PUSH_FAILURE_POINT'.  */
+#define PUSH_FAILURE_ELT(item)					\
+  fail_stack.stack[fail_stack.avail++] =  (item)
+
+/* These three POP... operations complement the three PUSH... operations.
+   All assume that `fail_stack' is nonempty.  */
+#define POP_FAILURE_POINTER() fail_stack.stack[--fail_stack.avail].pointer
+#define POP_FAILURE_INT() fail_stack.stack[--fail_stack.avail].integer
+#define POP_FAILURE_ELT() fail_stack.stack[--fail_stack.avail]
+
+/* Used to omit pushing failure point id's when we're not debugging.  */
+#ifdef DEBUG
+# define DEBUG_PUSH PUSH_FAILURE_INT
+# define DEBUG_POP(item_addr) *(item_addr) = POP_FAILURE_INT ()
+#else
+# define DEBUG_PUSH(item)
+# define DEBUG_POP(item_addr)
+#endif
+
+
+/* Push the information about the state we will need
+   if we ever fail back to it.
+
+   Requires variables fail_stack, regstart, regend, reg_info, and
+   num_regs_pushed be declared.  DOUBLE_FAIL_STACK requires `destination'
+   be declared.
+
+   Does `return FAILURE_CODE' if runs out of memory.  */
+
+#define PUSH_FAILURE_POINT(pattern_place, string_place, failure_code)	\
+  do {									\
+    char *destination;							\
+    /* Must be int, so when we don't save any registers, the arithmetic	\
+       of 0 + -1 isn't done as unsigned.  */				\
+    /* Can't be int, since there is not a shred of a guarantee that int	\
+       is wide enough to hold a value of something to which pointer can	\
+       be assigned */							\
+    active_reg_t this_reg;						\
+    									\
+    DEBUG_STATEMENT (failure_id++);					\
+    DEBUG_STATEMENT (nfailure_points_pushed++);				\
+    DEBUG_PRINT2 ("\nPUSH_FAILURE_POINT #%u:\n", failure_id);		\
+    DEBUG_PRINT2 ("  Before push, next avail: %d\n", (fail_stack).avail);\
+    DEBUG_PRINT2 ("                     size: %d\n", (fail_stack).size);\
+									\
+    DEBUG_PRINT2 ("  slots needed: %ld\n", NUM_FAILURE_ITEMS);		\
+    DEBUG_PRINT2 ("     available: %d\n", REMAINING_AVAIL_SLOTS);	\
+									\
+    /* Ensure we have enough space allocated for what we will push.  */	\
+    while (REMAINING_AVAIL_SLOTS < NUM_FAILURE_ITEMS)			\
+      {									\
+        if (!DOUBLE_FAIL_STACK (fail_stack))				\
+          return failure_code;						\
+									\
+        DEBUG_PRINT2 ("\n  Doubled stack; size now: %d\n",		\
+		       (fail_stack).size);				\
+        DEBUG_PRINT2 ("  slots available: %d\n", REMAINING_AVAIL_SLOTS);\
+      }									\
+									\
+    /* Push the info, starting with the registers.  */			\
+    DEBUG_PRINT1 ("\n");						\
+									\
+    if (1)								\
+      for (this_reg = lowest_active_reg; this_reg <= highest_active_reg; \
+	   this_reg++)							\
+	{								\
+	  DEBUG_PRINT2 ("  Pushing reg: %lu\n", this_reg);		\
+	  DEBUG_STATEMENT (num_regs_pushed++);				\
+									\
+	  DEBUG_PRINT2 ("    start: %p\n", regstart[this_reg]);		\
+	  PUSH_FAILURE_POINTER (regstart[this_reg]);			\
+									\
+	  DEBUG_PRINT2 ("    end: %p\n", regend[this_reg]);		\
+	  PUSH_FAILURE_POINTER (regend[this_reg]);			\
+									\
+	  DEBUG_PRINT2 ("    info: %p\n      ",				\
+			reg_info[this_reg].word.pointer);		\
+	  DEBUG_PRINT2 (" match_null=%d",				\
+			REG_MATCH_NULL_STRING_P (reg_info[this_reg]));	\
+	  DEBUG_PRINT2 (" active=%d", IS_ACTIVE (reg_info[this_reg]));	\
+	  DEBUG_PRINT2 (" matched_something=%d",			\
+			MATCHED_SOMETHING (reg_info[this_reg]));	\
+	  DEBUG_PRINT2 (" ever_matched=%d",				\
+			EVER_MATCHED_SOMETHING (reg_info[this_reg]));	\
+	  DEBUG_PRINT1 ("\n");						\
+	  PUSH_FAILURE_ELT (reg_info[this_reg].word);			\
+	}								\
+									\
+    DEBUG_PRINT2 ("  Pushing  low active reg: %ld\n", lowest_active_reg);\
+    PUSH_FAILURE_INT (lowest_active_reg);				\
+									\
+    DEBUG_PRINT2 ("  Pushing high active reg: %ld\n", highest_active_reg);\
+    PUSH_FAILURE_INT (highest_active_reg);				\
+									\
+    DEBUG_PRINT2 ("  Pushing pattern %p:\n", pattern_place);		\
+    DEBUG_PRINT_COMPILED_PATTERN (bufp, pattern_place, pend);		\
+    PUSH_FAILURE_POINTER (pattern_place);				\
+									\
+    DEBUG_PRINT2 ("  Pushing string %p: `", string_place);		\
+    DEBUG_PRINT_DOUBLE_STRING (string_place, string1, size1, string2,   \
+				 size2);				\
+    DEBUG_PRINT1 ("'\n");						\
+    PUSH_FAILURE_POINTER (string_place);				\
+									\
+    DEBUG_PRINT2 ("  Pushing failure id: %u\n", failure_id);		\
+    DEBUG_PUSH (failure_id);						\
+  } while (0)
+
+/* This is the number of items that are pushed and popped on the stack
+   for each register.  */
+#define NUM_REG_ITEMS  3
+
+/* Individual items aside from the registers.  */
+#ifdef DEBUG
+# define NUM_NONREG_ITEMS 5 /* Includes failure point id.  */
+#else
+# define NUM_NONREG_ITEMS 4
+#endif
+
+/* We push at most this many items on the stack.  */
+/* We used to use (num_regs - 1), which is the number of registers
+   this regexp will save; but that was changed to 5
+   to avoid stack overflow for a regexp with lots of parens.  */
+#define MAX_FAILURE_ITEMS (5 * NUM_REG_ITEMS + NUM_NONREG_ITEMS)
+
+/* We actually push this many items.  */
+#define NUM_FAILURE_ITEMS				\
+  (((0							\
+     ? 0 : highest_active_reg - lowest_active_reg + 1)	\
+    * NUM_REG_ITEMS)					\
+   + NUM_NONREG_ITEMS)
+
+/* How many items can still be added to the stack without overflowing it.  */
+#define REMAINING_AVAIL_SLOTS ((fail_stack).size - (fail_stack).avail)
+
+
+/* Pops what PUSH_FAIL_STACK pushes.
+
+   We restore into the parameters, all of which should be lvalues:
+     STR -- the saved data position.
+     PAT -- the saved pattern position.
+     LOW_REG, HIGH_REG -- the highest and lowest active registers.
+     REGSTART, REGEND -- arrays of string positions.
+     REG_INFO -- array of information about each subexpression.
+
+   Also assumes the variables `fail_stack' and (if debugging), `bufp',
+   `pend', `string1', `size1', `string2', and `size2'.  */
+
+#define POP_FAILURE_POINT(str, pat, low_reg, high_reg, regstart, regend, reg_info)\
+{									\
+  DEBUG_STATEMENT (unsigned failure_id;)				\
+  active_reg_t this_reg;						\
+  const unsigned char *string_temp;					\
+									\
+  assert (!FAIL_STACK_EMPTY ());					\
+									\
+  /* Remove failure points and point to how many regs pushed.  */	\
+  DEBUG_PRINT1 ("POP_FAILURE_POINT:\n");				\
+  DEBUG_PRINT2 ("  Before pop, next avail: %d\n", fail_stack.avail);	\
+  DEBUG_PRINT2 ("                    size: %d\n", fail_stack.size);	\
+									\
+  assert (fail_stack.avail >= NUM_NONREG_ITEMS);			\
+									\
+  DEBUG_POP (&failure_id);						\
+  DEBUG_PRINT2 ("  Popping failure id: %u\n", failure_id);		\
+									\
+  /* If the saved string location is NULL, it came from an		\
+     on_failure_keep_string_jump opcode, and we want to throw away the	\
+     saved NULL, thus retaining our current position in the string.  */	\
+  string_temp = POP_FAILURE_POINTER ();					\
+  if (string_temp != NULL)						\
+    str = (const char *) string_temp;					\
+									\
+  DEBUG_PRINT2 ("  Popping string %p: `", str);				\
+  DEBUG_PRINT_DOUBLE_STRING (str, string1, size1, string2, size2);	\
+  DEBUG_PRINT1 ("'\n");							\
+									\
+  pat = (unsigned char *) POP_FAILURE_POINTER ();			\
+  DEBUG_PRINT2 ("  Popping pattern %p:\n", pat);			\
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, pat, pend);			\
+									\
+  /* Restore register info.  */						\
+  high_reg = (active_reg_t) POP_FAILURE_INT ();				\
+  DEBUG_PRINT2 ("  Popping high active reg: %ld\n", high_reg);		\
+									\
+  low_reg = (active_reg_t) POP_FAILURE_INT ();				\
+  DEBUG_PRINT2 ("  Popping  low active reg: %ld\n", low_reg);		\
+									\
+  if (1)								\
+    for (this_reg = high_reg; this_reg >= low_reg; this_reg--)		\
+      {									\
+	DEBUG_PRINT2 ("    Popping reg: %ld\n", this_reg);		\
+									\
+	reg_info[this_reg].word = POP_FAILURE_ELT ();			\
+	DEBUG_PRINT2 ("      info: %p\n",				\
+		      reg_info[this_reg].word.pointer);			\
+									\
+	regend[this_reg] = (const char *) POP_FAILURE_POINTER ();	\
+	DEBUG_PRINT2 ("      end: %p\n", regend[this_reg]);		\
+									\
+	regstart[this_reg] = (const char *) POP_FAILURE_POINTER ();	\
+	DEBUG_PRINT2 ("      start: %p\n", regstart[this_reg]);		\
+      }									\
+  else									\
+    {									\
+      for (this_reg = highest_active_reg; this_reg > high_reg; this_reg--) \
+	{								\
+	  reg_info[this_reg].word.integer = 0;				\
+	  regend[this_reg] = 0;						\
+	  regstart[this_reg] = 0;					\
+	}								\
+      highest_active_reg = high_reg;					\
+    }									\
+									\
+  set_regs_matched_done = 0;						\
+  DEBUG_STATEMENT (nfailure_points_popped++);				\
+} /* POP_FAILURE_POINT */
+
+
+
+/* Structure for per-register (a.k.a. per-group) information.
+   Other register information, such as the
+   starting and ending positions (which are addresses), and the list of
+   inner groups (which is a bits list) are maintained in separate
+   variables.
+
+   We are making a (strictly speaking) nonportable assumption here: that
+   the compiler will pack our bit fields into something that fits into
+   the type of `word', i.e., is something that fits into one item on the
+   failure stack.  */
+
+
+/* Declarations and macros for re_match_2.  */
+
+typedef union
+{
+  fail_stack_elt_t word;
+  struct
+  {
+      /* This field is one if this group can match the empty string,
+         zero if not.  If not yet determined,  `MATCH_NULL_UNSET_VALUE'.  */
+#define MATCH_NULL_UNSET_VALUE 3
+    unsigned match_null_string_p : 2;
+    unsigned is_active : 1;
+    unsigned matched_something : 1;
+    unsigned ever_matched_something : 1;
+  } bits;
+} register_info_type;
+
+#define REG_MATCH_NULL_STRING_P(R)  ((R).bits.match_null_string_p)
+#define IS_ACTIVE(R)  ((R).bits.is_active)
+#define MATCHED_SOMETHING(R)  ((R).bits.matched_something)
+#define EVER_MATCHED_SOMETHING(R)  ((R).bits.ever_matched_something)
+
+
+/* Call this when have matched a real character; it sets `matched' flags
+   for the subexpressions which we are currently inside.  Also records
+   that those subexprs have matched.  */
+#define SET_REGS_MATCHED()						\
+  do									\
+    {									\
+      if (!set_regs_matched_done)					\
+	{								\
+	  active_reg_t r;						\
+	  set_regs_matched_done = 1;					\
+	  for (r = lowest_active_reg; r <= highest_active_reg; r++)	\
+	    {								\
+	      MATCHED_SOMETHING (reg_info[r])				\
+		= EVER_MATCHED_SOMETHING (reg_info[r])			\
+		= 1;							\
+	    }								\
+	}								\
+    }									\
+  while (0)
+
+/* Registers are set to a sentinel when they haven't yet matched.  */
+static char reg_unset_dummy;
+#define REG_UNSET_VALUE (&reg_unset_dummy)
+#define REG_UNSET(e) ((e) == REG_UNSET_VALUE)
+
+/* Subroutine declarations and macros for regex_compile.  */
+
+static reg_errcode_t regex_compile _RE_ARGS ((const char *pattern, size_t size,
+					      reg_syntax_t syntax,
+					      struct re_pattern_buffer *bufp));
+static void store_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc, int arg));
+static void store_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
+				 int arg1, int arg2));
+static void insert_op1 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
+				  int arg, unsigned char *end));
+static void insert_op2 _RE_ARGS ((re_opcode_t op, unsigned char *loc,
+				  int arg1, int arg2, unsigned char *end));
+static boolean at_begline_loc_p _RE_ARGS ((const char *pattern, const char *p,
+					   reg_syntax_t syntax));
+static boolean at_endline_loc_p _RE_ARGS ((const char *p, const char *pend,
+					   reg_syntax_t syntax));
+static reg_errcode_t compile_range _RE_ARGS ((unsigned int range_start,
+					      const char **p_ptr,
+					      const char *pend,
+					      char *translate,
+					      reg_syntax_t syntax,
+					      unsigned char *b));
+
+/* Fetch the next character in the uncompiled pattern---translating it
+   if necessary.  Also cast from a signed character in the constant
+   string passed to us by the user to an unsigned char that we can use
+   as an array index (in, e.g., `translate').  */
+#ifndef PATFETCH
+# define PATFETCH(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++;						\
+    if (translate) c = (unsigned char) translate[c];			\
+  } while (0)
+#endif
+
+/* Fetch the next character in the uncompiled pattern, with no
+   translation.  */
+#define PATFETCH_RAW(c)							\
+  do {if (p == pend) return REG_EEND;					\
+    c = (unsigned char) *p++; 						\
+  } while (0)
+
+/* Go backwards one character in the pattern.  */
+#define PATUNFETCH p--
+
+
+/* If `translate' is non-null, return translate[D], else just D.  We
+   cast the subscript to translate because some data is declared as
+   `char *', to avoid warnings when a string constant is passed.  But
+   when we use a character as a subscript we must make it unsigned.  */
+#ifndef TRANSLATE
+# define TRANSLATE(d) \
+  (translate ? (char) translate[(unsigned char) (d)] : (d))
+#endif
+
+
+/* Macros for outputting the compiled pattern into `buffer'.  */
+
+/* If the buffer isn't allocated when it comes in, use this.  */
+#define INIT_BUF_SIZE  32
+
+/* Make sure we have at least N more bytes of space in buffer.  */
+#define GET_BUFFER_SPACE(n)						\
+    while ((unsigned long) (b - bufp->buffer + (n)) > bufp->allocated)	\
+      EXTEND_BUFFER ()
+
+/* Make sure we have one more byte of buffer space and then add C to it.  */
+#define BUF_PUSH(c)							\
+  do {									\
+    GET_BUFFER_SPACE (1);						\
+    *b++ = (unsigned char) (c);						\
+  } while (0)
+
+
+/* Ensure we have two more bytes of buffer space and then append C1 and C2.  */
+#define BUF_PUSH_2(c1, c2)						\
+  do {									\
+    GET_BUFFER_SPACE (2);						\
+    *b++ = (unsigned char) (c1);					\
+    *b++ = (unsigned char) (c2);					\
+  } while (0)
+
+
+/* As with BUF_PUSH_2, except for three bytes.  */
+#define BUF_PUSH_3(c1, c2, c3)						\
+  do {									\
+    GET_BUFFER_SPACE (3);						\
+    *b++ = (unsigned char) (c1);					\
+    *b++ = (unsigned char) (c2);					\
+    *b++ = (unsigned char) (c3);					\
+  } while (0)
+
+
+/* Store a jump with opcode OP at LOC to location TO.  We store a
+   relative address offset by the three bytes the jump itself occupies.  */
+#define STORE_JUMP(op, loc, to) \
+  store_op1 (op, loc, (int) ((to) - (loc) - 3))
+
+/* Likewise, for a two-argument jump.  */
+#define STORE_JUMP2(op, loc, to, arg) \
+  store_op2 (op, loc, (int) ((to) - (loc) - 3), arg)
+
+/* Like `STORE_JUMP', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP(op, loc, to) \
+  insert_op1 (op, loc, (int) ((to) - (loc) - 3), b)
+
+/* Like `STORE_JUMP2', but for inserting.  Assume `b' is the buffer end.  */
+#define INSERT_JUMP2(op, loc, to, arg) \
+  insert_op2 (op, loc, (int) ((to) - (loc) - 3), arg, b)
+
+
+/* This is not an arbitrary limit: the arguments which represent offsets
+   into the pattern are two bytes long.  So if 2^16 bytes turns out to
+   be too small, many things would have to change.  */
+/* Any other compiler which, like MSC, has allocation limit below 2^16
+   bytes will have to use approach similar to what was done below for
+   MSC and drop MAX_BUF_SIZE a bit.  Otherwise you may end up
+   reallocating to 0 bytes.  Such thing is not going to work too well.
+   You have been warned!!  */
+#if defined _MSC_VER  && !defined WIN32
+/* Microsoft C 16-bit versions limit malloc to approx 65512 bytes.
+   The REALLOC define eliminates a flurry of conversion warnings,
+   but is not required. */
+# define MAX_BUF_SIZE  65500L
+# define REALLOC(p,s) realloc ((p), (size_t) (s))
+#else
+# define MAX_BUF_SIZE (1L << 16)
+# define REALLOC(p,s) realloc ((p), (s))
+#endif
+
+/* Extend the buffer by twice its current size via realloc and
+   reset the pointers that pointed into the old block to point to the
+   correct places in the new one.  If extending the buffer results in it
+   being larger than MAX_BUF_SIZE, then flag memory exhausted.  */
+#if __BOUNDED_POINTERS__
+# define SET_HIGH_BOUND(P) (__ptrhigh (P) = __ptrlow (P) + bufp->allocated)
+# define MOVE_BUFFER_POINTER(P) \
+  (__ptrlow (P) += incr, SET_HIGH_BOUND (P), __ptrvalue (P) += incr)
+# define ELSE_EXTEND_BUFFER_HIGH_BOUND		\
+  else						\
+    {						\
+      SET_HIGH_BOUND (b);			\
+      SET_HIGH_BOUND (begalt);			\
+      if (fixup_alt_jump)			\
+	SET_HIGH_BOUND (fixup_alt_jump);	\
+      if (laststart)				\
+	SET_HIGH_BOUND (laststart);		\
+      if (pending_exact)			\
+	SET_HIGH_BOUND (pending_exact);		\
+    }
+#else
+# define MOVE_BUFFER_POINTER(P) (P) += incr
+# define ELSE_EXTEND_BUFFER_HIGH_BOUND
+#endif
+#define EXTEND_BUFFER()							\
+  do {									\
+    unsigned char *old_buffer = bufp->buffer;				\
+    if (bufp->allocated == MAX_BUF_SIZE)				\
+      return REG_ESIZE;							\
+    bufp->allocated <<= 1;						\
+    if (bufp->allocated > MAX_BUF_SIZE)					\
+      bufp->allocated = MAX_BUF_SIZE;					\
+    bufp->buffer = (unsigned char *) REALLOC (bufp->buffer, bufp->allocated);\
+    if (bufp->buffer == NULL)						\
+      return REG_ESPACE;						\
+    /* If the buffer moved, move all the pointers into it.  */		\
+    if (old_buffer != bufp->buffer)					\
+      {									\
+	int incr = bufp->buffer - old_buffer;				\
+	MOVE_BUFFER_POINTER (b);					\
+	MOVE_BUFFER_POINTER (begalt);					\
+	if (fixup_alt_jump)						\
+	  MOVE_BUFFER_POINTER (fixup_alt_jump);				\
+	if (laststart)							\
+	  MOVE_BUFFER_POINTER (laststart);				\
+	if (pending_exact)						\
+	  MOVE_BUFFER_POINTER (pending_exact);				\
+      }									\
+    ELSE_EXTEND_BUFFER_HIGH_BOUND					\
+  } while (0)
+
+
+/* Since we have one byte reserved for the register number argument to
+   {start,stop}_memory, the maximum number of groups we can report
+   things about is what fits in that byte.  */
+#define MAX_REGNUM 255
+
+/* But patterns can have more than `MAX_REGNUM' registers.  We just
+   ignore the excess.  */
+typedef unsigned regnum_t;
+
+
+/* Macros for the compile stack.  */
+
+/* Since offsets can go either forwards or backwards, this type needs to
+   be able to hold values from -(MAX_BUF_SIZE - 1) to MAX_BUF_SIZE - 1.  */
+/* int may be not enough when sizeof(int) == 2.  */
+typedef long pattern_offset_t;
+
+typedef struct
+{
+  pattern_offset_t begalt_offset;
+  pattern_offset_t fixup_alt_jump;
+  pattern_offset_t inner_group_offset;
+  pattern_offset_t laststart_offset;
+  regnum_t regnum;
+} compile_stack_elt_t;
+
+
+typedef struct
+{
+  compile_stack_elt_t *stack;
+  unsigned size;
+  unsigned avail;			/* Offset of next open position.  */
+} compile_stack_type;
+
+
+#define INIT_COMPILE_STACK_SIZE 32
+
+#define COMPILE_STACK_EMPTY  (compile_stack.avail == 0)
+#define COMPILE_STACK_FULL  (compile_stack.avail == compile_stack.size)
+
+/* The next available element.  */
+#define COMPILE_STACK_TOP (compile_stack.stack[compile_stack.avail])
+
+
+/* Set the bit for character C in a list.  */
+#define SET_LIST_BIT(c)                               \
+  (b[((unsigned char) (c)) / BYTEWIDTH]               \
+   |= 1 << (((unsigned char) c) % BYTEWIDTH))
+
+
+/* Get the next unsigned number in the uncompiled pattern.  */
+#define GET_UNSIGNED_NUMBER(num) 					\
+  { if (p != pend)							\
+     {									\
+       PATFETCH (c); 							\
+       while ('0' <= c && c <= '9')					\
+         { 								\
+           if (num < 0)							\
+              num = 0;							\
+           num = num * 10 + c - '0'; 					\
+           if (p == pend) 						\
+              break; 							\
+           PATFETCH (c);						\
+         } 								\
+       } 								\
+    }
+
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+/* The GNU C library provides support for user-defined character classes
+   and the functions from ISO C amendement 1.  */
+# ifdef CHARCLASS_NAME_MAX
+#  define CHAR_CLASS_MAX_LENGTH CHARCLASS_NAME_MAX
+# else
+/* This shouldn't happen but some implementation might still have this
+   problem.  Use a reasonable default value.  */
+#  define CHAR_CLASS_MAX_LENGTH 256
+# endif
+
+# ifdef _LIBC
+#  define IS_CHAR_CLASS(string) __wctype (string)
+# else
+#  define IS_CHAR_CLASS(string) wctype (string)
+# endif
+#else
+# define CHAR_CLASS_MAX_LENGTH  6 /* Namely, `xdigit'.  */
+
+# define IS_CHAR_CLASS(string)						\
+   (STREQ (string, "alpha") || STREQ (string, "upper")			\
+    || STREQ (string, "lower") || STREQ (string, "digit")		\
+    || STREQ (string, "alnum") || STREQ (string, "xdigit")		\
+    || STREQ (string, "space") || STREQ (string, "print")		\
+    || STREQ (string, "punct") || STREQ (string, "graph")		\
+    || STREQ (string, "cntrl") || STREQ (string, "blank"))
+#endif
+
+#ifndef MATCH_MAY_ALLOCATE
+
+/* If we cannot allocate large objects within re_match_2_internal,
+   we make the fail stack and register vectors global.
+   The fail stack, we grow to the maximum size when a regexp
+   is compiled.
+   The register vectors, we adjust in size each time we
+   compile a regexp, according to the number of registers it needs.  */
+
+static fail_stack_type fail_stack;
+
+/* Size with which the following vectors are currently allocated.
+   That is so we can make them bigger as needed,
+   but never make them smaller.  */
+static int regs_allocated_size;
+
+static const char **     regstart, **     regend;
+static const char ** old_regstart, ** old_regend;
+static const char **best_regstart, **best_regend;
+static register_info_type *reg_info;
+static const char **reg_dummy;
+static register_info_type *reg_info_dummy;
+
+/* Make the register vectors big enough for NUM_REGS registers,
+   but don't make them smaller.  */
+
+static
+regex_grow_registers (num_regs)
+     int num_regs;
+{
+  if (num_regs > regs_allocated_size)
+    {
+      RETALLOC_IF (regstart,	 num_regs, const char *);
+      RETALLOC_IF (regend,	 num_regs, const char *);
+      RETALLOC_IF (old_regstart, num_regs, const char *);
+      RETALLOC_IF (old_regend,	 num_regs, const char *);
+      RETALLOC_IF (best_regstart, num_regs, const char *);
+      RETALLOC_IF (best_regend,	 num_regs, const char *);
+      RETALLOC_IF (reg_info,	 num_regs, register_info_type);
+      RETALLOC_IF (reg_dummy,	 num_regs, const char *);
+      RETALLOC_IF (reg_info_dummy, num_regs, register_info_type);
+
+      regs_allocated_size = num_regs;
+    }
+}
+
+#endif /* not MATCH_MAY_ALLOCATE */
+
+static boolean group_in_compile_stack _RE_ARGS ((compile_stack_type
+						 compile_stack,
+						 regnum_t regnum));
+
+/* `regex_compile' compiles PATTERN (of length SIZE) according to SYNTAX.
+   Returns one of error codes defined in `regex.h', or zero for success.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate'
+   fields are set in BUFP on entry.
+
+   If it succeeds, results are put in BUFP (if it returns an error, the
+   contents of BUFP are undefined):
+     `buffer' is the compiled pattern;
+     `syntax' is set to SYNTAX;
+     `used' is set to the length of the compiled pattern;
+     `fastmap_accurate' is zero;
+     `re_nsub' is the number of subexpressions in PATTERN;
+     `not_bol' and `not_eol' are zero;
+
+   The `fastmap' and `newline_anchor' fields are neither
+   examined nor set.  */
+
+/* Return, freeing storage we allocated.  */
+#define FREE_STACK_RETURN(value)		\
+  return (free (compile_stack.stack), value)
+
+static reg_errcode_t
+regex_compile (pattern, size, syntax, bufp)
+     const char *pattern;
+     size_t size;
+     reg_syntax_t syntax;
+     struct re_pattern_buffer *bufp;
+{
+  /* We fetch characters from PATTERN here.  Even though PATTERN is
+     `char *' (i.e., signed), we declare these variables as unsigned, so
+     they can be reliably used as array indices.  */
+  register unsigned char c, c1;
+
+  /* A random temporary spot in PATTERN.  */
+  const char *p1;
+
+  /* Points to the end of the buffer, where we should append.  */
+  register unsigned char *b;
+
+  /* Keeps track of unclosed groups.  */
+  compile_stack_type compile_stack;
+
+  /* Points to the current (ending) position in the pattern.  */
+  const char *p = pattern;
+  const char *pend = pattern + size;
+
+  /* How to translate the characters in the pattern.  */
+  RE_TRANSLATE_TYPE translate = bufp->translate;
+
+  /* Address of the count-byte of the most recently inserted `exactn'
+     command.  This makes it possible to tell if a new exact-match
+     character can be added to that command or if the character requires
+     a new `exactn' command.  */
+  unsigned char *pending_exact = 0;
+
+  /* Address of start of the most recently finished expression.
+     This tells, e.g., postfix * where to find the start of its
+     operand.  Reset at the beginning of groups and alternatives.  */
+  unsigned char *laststart = 0;
+
+  /* Address of beginning of regexp, or inside of last group.  */
+  unsigned char *begalt;
+
+  /* Place in the uncompiled pattern (i.e., the {) to
+     which to go back if the interval is invalid.  */
+  const char *beg_interval;
+
+  /* Address of the place where a forward jump should go to the end of
+     the containing expression.  Each alternative of an `or' -- except the
+     last -- ends with a forward jump of this sort.  */
+  unsigned char *fixup_alt_jump = 0;
+
+  /* Counts open-groups as they are encountered.  Remembered for the
+     matching close-group on the compile stack, so the same register
+     number is put in the stop_memory as the start_memory.  */
+  regnum_t regnum = 0;
+
+#ifdef DEBUG
+  DEBUG_PRINT1 ("\nCompiling pattern: ");
+  if (debug)
+    {
+      unsigned debug_count;
+
+      for (debug_count = 0; debug_count < size; debug_count++)
+        putchar (pattern[debug_count]);
+      putchar ('\n');
+    }
+#endif /* DEBUG */
+
+  /* Initialize the compile stack.  */
+  compile_stack.stack = TALLOC (INIT_COMPILE_STACK_SIZE, compile_stack_elt_t);
+  if (compile_stack.stack == NULL)
+    return REG_ESPACE;
+
+  compile_stack.size = INIT_COMPILE_STACK_SIZE;
+  compile_stack.avail = 0;
+
+  /* Initialize the pattern buffer.  */
+  bufp->syntax = syntax;
+  bufp->fastmap_accurate = 0;
+  bufp->not_bol = bufp->not_eol = 0;
+
+  /* Set `used' to zero, so that if we return an error, the pattern
+     printer (for debugging) will think there's no pattern.  We reset it
+     at the end.  */
+  bufp->used = 0;
+
+  /* Always count groups, whether or not bufp->no_sub is set.  */
+  bufp->re_nsub = 0;
+
+#if !defined emacs && !defined SYNTAX_TABLE
+  /* Initialize the syntax table.  */
+   init_syntax_once ();
+#endif
+
+  if (bufp->allocated == 0)
+    {
+      if (bufp->buffer)
+	{ /* If zero allocated, but buffer is non-null, try to realloc
+             enough space.  This loses if buffer's address is bogus, but
+             that is the user's responsibility.  */
+          RETALLOC (bufp->buffer, INIT_BUF_SIZE, unsigned char);
+        }
+      else
+        { /* Caller did not allocate a buffer.  Do it for them.  */
+          bufp->buffer = TALLOC (INIT_BUF_SIZE, unsigned char);
+        }
+      if (!bufp->buffer) FREE_STACK_RETURN (REG_ESPACE);
+
+      bufp->allocated = INIT_BUF_SIZE;
+    }
+
+  begalt = b = bufp->buffer;
+
+  /* Loop through the uncompiled pattern until we're at the end.  */
+  while (p != pend)
+    {
+      PATFETCH (c);
+
+      switch (c)
+        {
+        case '^':
+          {
+            if (   /* If at start of pattern, it's an operator.  */
+                   p == pattern + 1
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's come before.  */
+                || at_begline_loc_p (pattern, p, syntax))
+              BUF_PUSH (begline);
+            else
+              goto normal_char;
+          }
+          break;
+
+
+        case '$':
+          {
+            if (   /* If at end of pattern, it's an operator.  */
+                   p == pend
+                   /* If context independent, it's an operator.  */
+                || syntax & RE_CONTEXT_INDEP_ANCHORS
+                   /* Otherwise, depends on what's next.  */
+                || at_endline_loc_p (p, pend, syntax))
+               BUF_PUSH (endline);
+             else
+               goto normal_char;
+           }
+           break;
+
+
+	case '+':
+        case '?':
+          if ((syntax & RE_BK_PLUS_QM)
+              || (syntax & RE_LIMITED_OPS))
+            goto normal_char;
+        handle_plus:
+        case '*':
+          /* If there is no previous pattern... */
+          if (!laststart)
+            {
+              if (syntax & RE_CONTEXT_INVALID_OPS)
+                FREE_STACK_RETURN (REG_BADRPT);
+              else if (!(syntax & RE_CONTEXT_INDEP_OPS))
+                goto normal_char;
+            }
+
+          {
+            /* Are we optimizing this jump?  */
+            boolean keep_string_p = false;
+
+            /* 1 means zero (many) matches is allowed.  */
+            char zero_times_ok = 0, many_times_ok = 0;
+
+            /* If there is a sequence of repetition chars, collapse it
+               down to just one (the right one).  We can't combine
+               interval operators with these because of, e.g., `a{2}*',
+               which should only match an even number of `a's.  */
+
+            for (;;)
+              {
+                zero_times_ok |= c != '+';
+                many_times_ok |= c != '?';
+
+                if (p == pend)
+                  break;
+
+                PATFETCH (c);
+
+                if (c == '*'
+                    || (!(syntax & RE_BK_PLUS_QM) && (c == '+' || c == '?')))
+                  ;
+
+                else if (syntax & RE_BK_PLUS_QM  &&  c == '\\')
+                  {
+                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
+
+                    PATFETCH (c1);
+                    if (!(c1 == '+' || c1 == '?'))
+                      {
+                        PATUNFETCH;
+                        PATUNFETCH;
+                        break;
+                      }
+
+                    c = c1;
+                  }
+                else
+                  {
+                    PATUNFETCH;
+                    break;
+                  }
+
+                /* If we get here, we found another repeat character.  */
+               }
+
+            /* Star, etc. applied to an empty pattern is equivalent
+               to an empty pattern.  */
+            if (!laststart)
+              break;
+
+            /* Now we know whether or not zero matches is allowed
+               and also whether or not two or more matches is allowed.  */
+            if (many_times_ok)
+              { /* More than one repetition is allowed, so put in at the
+                   end a backward relative jump from `b' to before the next
+                   jump we're going to put in below (which jumps from
+                   laststart to after this jump).
+
+                   But if we are at the `*' in the exact sequence `.*\n',
+                   insert an unconditional jump backwards to the .,
+                   instead of the beginning of the loop.  This way we only
+                   push a failure point once, instead of every time
+                   through the loop.  */
+                assert (p - 1 > pattern);
+
+                /* Allocate the space for the jump.  */
+                GET_BUFFER_SPACE (3);
+
+                /* We know we are not at the first character of the pattern,
+                   because laststart was nonzero.  And we've already
+                   incremented `p', by the way, to be the character after
+                   the `*'.  Do we have to do something analogous here
+                   for null bytes, because of RE_DOT_NOT_NULL?  */
+                if (TRANSLATE (*(p - 2)) == TRANSLATE ('.')
+		    && zero_times_ok
+                    && p < pend && TRANSLATE (*p) == TRANSLATE ('\n')
+                    && !(syntax & RE_DOT_NEWLINE))
+                  { /* We have .*\n.  */
+                    STORE_JUMP (jump, b, laststart);
+                    keep_string_p = true;
+                  }
+                else
+                  /* Anything else.  */
+                  STORE_JUMP (maybe_pop_jump, b, laststart - 3);
+
+                /* We've added more stuff to the buffer.  */
+                b += 3;
+              }
+
+            /* On failure, jump from laststart to b + 3, which will be the
+               end of the buffer after this jump is inserted.  */
+            GET_BUFFER_SPACE (3);
+            INSERT_JUMP (keep_string_p ? on_failure_keep_string_jump
+                                       : on_failure_jump,
+                         laststart, b + 3);
+            pending_exact = 0;
+            b += 3;
+
+            if (!zero_times_ok)
+              {
+                /* At least one repetition is required, so insert a
+                   `dummy_failure_jump' before the initial
+                   `on_failure_jump' instruction of the loop. This
+                   effects a skip over that instruction the first time
+                   we hit that loop.  */
+                GET_BUFFER_SPACE (3);
+                INSERT_JUMP (dummy_failure_jump, laststart, laststart + 6);
+                b += 3;
+              }
+            }
+	  break;
+
+
+	case '.':
+          laststart = b;
+          BUF_PUSH (anychar);
+          break;
+
+
+        case '[':
+          {
+            boolean had_char_class = false;
+	    unsigned int range_start = 0xffffffff;
+
+            if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+            /* Ensure that we have enough space to push a charset: the
+               opcode, the length count, and the bitset; 34 bytes in all.  */
+	    GET_BUFFER_SPACE (34);
+
+            laststart = b;
+
+            /* We test `*p == '^' twice, instead of using an if
+               statement, so we only need one BUF_PUSH.  */
+            BUF_PUSH (*p == '^' ? charset_not : charset);
+            if (*p == '^')
+              p++;
+
+            /* Remember the first position in the bracket expression.  */
+            p1 = p;
+
+            /* Push the number of bytes in the bitmap.  */
+            BUF_PUSH ((1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* Clear the whole map.  */
+            bzero (b, (1 << BYTEWIDTH) / BYTEWIDTH);
+
+            /* charset_not matches newline according to a syntax bit.  */
+            if ((re_opcode_t) b[-2] == charset_not
+                && (syntax & RE_HAT_LISTS_NOT_NEWLINE))
+              SET_LIST_BIT ('\n');
+
+            /* Read in characters and ranges, setting map bits.  */
+            for (;;)
+              {
+                if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                PATFETCH (c);
+
+                /* \ might escape characters inside [...] and [^...].  */
+                if ((syntax & RE_BACKSLASH_ESCAPE_IN_LISTS) && c == '\\')
+                  {
+                    if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
+
+                    PATFETCH (c1);
+                    SET_LIST_BIT (c1);
+		    range_start = c1;
+                    continue;
+                  }
+
+                /* Could be the end of the bracket expression.  If it's
+                   not (i.e., when the bracket expression is `[]' so
+                   far), the ']' character bit gets set way below.  */
+                if (c == ']' && p != p1 + 1)
+                  break;
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character class.  */
+                if (had_char_class && c == '-' && *p != ']')
+                  FREE_STACK_RETURN (REG_ERANGE);
+
+                /* Look ahead to see if it's a range when the last thing
+                   was a character: if this is a hyphen not at the
+                   beginning or the end of a list, then it's the range
+                   operator.  */
+                if (c == '-'
+                    && !(p - 2 >= pattern && p[-2] == '[')
+                    && !(p - 3 >= pattern && p[-3] == '[' && p[-2] == '^')
+                    && *p != ']')
+                  {
+                    reg_errcode_t ret
+                      = compile_range (range_start, &p, pend, translate,
+				       syntax, b);
+                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
+		    range_start = 0xffffffff;
+                  }
+
+                else if (p[0] == '-' && p[1] != ']')
+                  { /* This handles ranges made up of characters only.  */
+                    reg_errcode_t ret;
+
+		    /* Move past the `-'.  */
+                    PATFETCH (c1);
+
+                    ret = compile_range (c, &p, pend, translate, syntax, b);
+                    if (ret != REG_NOERROR) FREE_STACK_RETURN (ret);
+		    range_start = 0xffffffff;
+                  }
+
+                /* See if we're at the beginning of a possible character
+                   class.  */
+
+                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == ':')
+                  { /* Leave room for the null.  */
+                    char str[CHAR_CLASS_MAX_LENGTH + 1];
+
+                    PATFETCH (c);
+                    c1 = 0;
+
+                    /* If pattern is `[[:'.  */
+                    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                    for (;;)
+                      {
+                        PATFETCH (c);
+                        if ((c == ':' && *p == ']') || p == pend)
+                          break;
+			if (c1 < CHAR_CLASS_MAX_LENGTH)
+			  str[c1++] = c;
+			else
+			  /* This is in any case an invalid class name.  */
+			  str[0] = '\0';
+                      }
+                    str[c1] = '\0';
+
+                    /* If isn't a word bracketed by `[:' and `:]':
+                       undo the ending character, the letters, and leave
+                       the leading `:' and `[' (but set bits for them).  */
+                    if (c == ':' && *p == ']')
+                      {
+#if defined _LIBC || WIDE_CHAR_SUPPORT
+                        boolean is_lower = STREQ (str, "lower");
+                        boolean is_upper = STREQ (str, "upper");
+			wctype_t wt;
+                        int ch;
+
+			wt = IS_CHAR_CLASS (str);
+			if (wt == 0)
+			  FREE_STACK_RETURN (REG_ECTYPE);
+
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);
+
+                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                        for (ch = 0; ch < 1 << BYTEWIDTH; ++ch)
+			  {
+# ifdef _LIBC
+			    if (__iswctype (__btowc (ch), wt))
+			      SET_LIST_BIT (ch);
+# else
+			    if (iswctype (btowc (ch), wt))
+			      SET_LIST_BIT (ch);
+# endif
+
+			    if (translate && (is_upper || is_lower)
+				&& (ISUPPER (ch) || ISLOWER (ch)))
+			      SET_LIST_BIT (ch);
+			  }
+
+                        had_char_class = true;
+#else
+                        int ch;
+                        boolean is_alnum = STREQ (str, "alnum");
+                        boolean is_alpha = STREQ (str, "alpha");
+                        boolean is_blank = STREQ (str, "blank");
+                        boolean is_cntrl = STREQ (str, "cntrl");
+                        boolean is_digit = STREQ (str, "digit");
+                        boolean is_graph = STREQ (str, "graph");
+                        boolean is_lower = STREQ (str, "lower");
+                        boolean is_print = STREQ (str, "print");
+                        boolean is_punct = STREQ (str, "punct");
+                        boolean is_space = STREQ (str, "space");
+                        boolean is_upper = STREQ (str, "upper");
+                        boolean is_xdigit = STREQ (str, "xdigit");
+
+                        if (!IS_CHAR_CLASS (str))
+			  FREE_STACK_RETURN (REG_ECTYPE);
+
+                        /* Throw away the ] at the end of the character
+                           class.  */
+                        PATFETCH (c);
+
+                        if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+                        for (ch = 0; ch < 1 << BYTEWIDTH; ch++)
+                          {
+			    /* This was split into 3 if's to
+			       avoid an arbitrary limit in some compiler.  */
+                            if (   (is_alnum  && ISALNUM (ch))
+                                || (is_alpha  && ISALPHA (ch))
+                                || (is_blank  && ISBLANK (ch))
+                                || (is_cntrl  && ISCNTRL (ch)))
+			      SET_LIST_BIT (ch);
+			    if (   (is_digit  && ISDIGIT (ch))
+                                || (is_graph  && ISGRAPH (ch))
+                                || (is_lower  && ISLOWER (ch))
+                                || (is_print  && ISPRINT (ch)))
+			      SET_LIST_BIT (ch);
+			    if (   (is_punct  && ISPUNCT (ch))
+                                || (is_space  && ISSPACE (ch))
+                                || (is_upper  && ISUPPER (ch))
+                                || (is_xdigit && ISXDIGIT (ch)))
+			      SET_LIST_BIT (ch);
+			    if (   translate && (is_upper || is_lower)
+				&& (ISUPPER (ch) || ISLOWER (ch)))
+			      SET_LIST_BIT (ch);
+                          }
+                        had_char_class = true;
+#endif	/* libc || wctype.h */
+                      }
+                    else
+                      {
+                        c1++;
+                        while (c1--)
+                          PATUNFETCH;
+                        SET_LIST_BIT ('[');
+                        SET_LIST_BIT (':');
+			range_start = ':';
+                        had_char_class = false;
+                      }
+                  }
+                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '=')
+		  {
+		    unsigned char str[MB_LEN_MAX + 1];
+#ifdef _LIBC
+		    uint32_t nrules =
+		      _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+#endif
+
+		    PATFETCH (c);
+		    c1 = 0;
+
+		    /* If pattern is `[[='.  */
+		    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+		    for (;;)
+		      {
+			PATFETCH (c);
+			if ((c == '=' && *p == ']') || p == pend)
+			  break;
+			if (c1 < MB_LEN_MAX)
+			  str[c1++] = c;
+			else
+			  /* This is in any case an invalid class name.  */
+			  str[0] = '\0';
+                      }
+		    str[c1] = '\0';
+
+		    if (c == '=' && *p == ']' && str[0] != '\0')
+		      {
+			/* If we have no collation data we use the default
+			   collation in which each character is in a class
+			   by itself.  It also means that ASCII is the
+			   character set and therefore we cannot have character
+			   with more than one byte in the multibyte
+			   representation.  */
+#ifdef _LIBC
+			if (nrules == 0)
+#endif
+			  {
+			    if (c1 != 1)
+			      FREE_STACK_RETURN (REG_ECOLLATE);
+
+			    /* Throw away the ] at the end of the equivalence
+			       class.  */
+			    PATFETCH (c);
+
+			    /* Set the bit for the character.  */
+			    SET_LIST_BIT (str[0]);
+			  }
+#ifdef _LIBC
+			else
+			  {
+			    /* Try to match the byte sequence in `str' against
+			       those known to the collate implementation.
+			       First find out whether the bytes in `str' are
+			       actually from exactly one character.  */
+			    const int32_t *table;
+			    const unsigned char *weights;
+			    const unsigned char *extra;
+			    const int32_t *indirect;
+			    int32_t idx;
+			    const unsigned char *cp = str;
+			    int ch;
+
+			    /* This #include defines a local function!  */
+# include <locale/weight.h>
+
+			    table = (const int32_t *)
+			      _NL_CURRENT (LC_COLLATE, _NL_COLLATE_TABLEMB);
+			    weights = (const unsigned char *)
+			      _NL_CURRENT (LC_COLLATE, _NL_COLLATE_WEIGHTMB);
+			    extra = (const unsigned char *)
+			      _NL_CURRENT (LC_COLLATE, _NL_COLLATE_EXTRAMB);
+			    indirect = (const int32_t *)
+			      _NL_CURRENT (LC_COLLATE, _NL_COLLATE_INDIRECTMB);
+
+			    idx = findidx (&cp);
+			    if (idx == 0 || cp < str + c1)
+			      /* This is no valid character.  */
+			      FREE_STACK_RETURN (REG_ECOLLATE);
+
+			    /* Throw away the ] at the end of the equivalence
+			       class.  */
+			    PATFETCH (c);
+
+			    /* Now we have to go throught the whole table
+			       and find all characters which have the same
+			       first level weight.
+
+			       XXX Note that this is not entirely correct.
+			       we would have to match multibyte sequences
+			       but this is not possible with the current
+			       implementation.  */
+			    for (ch = 1; ch < 256; ++ch)
+			      /* XXX This test would have to be changed if we
+				 would allow matching multibyte sequences.  */
+			      if (table[ch] > 0)
+				{
+				  int32_t idx2 = table[ch];
+				  size_t len = weights[idx2];
+
+				  /* Test whether the lenghts match.  */
+				  if (weights[idx] == len)
+				    {
+				      /* They do.  New compare the bytes of
+					 the weight.  */
+				      size_t cnt = 0;
+
+				      while (cnt < len
+					     && (weights[idx + 1 + cnt]
+						 == weights[idx2 + 1 + cnt]))
+					++len;
+
+				      if (cnt == len)
+					/* They match.  Mark the character as
+					   acceptable.  */
+					SET_LIST_BIT (ch);
+				    }
+				}
+			  }
+#endif
+			had_char_class = true;
+		      }
+                    else
+                      {
+                        c1++;
+                        while (c1--)
+                          PATUNFETCH;
+                        SET_LIST_BIT ('[');
+                        SET_LIST_BIT ('=');
+			range_start = '=';
+                        had_char_class = false;
+                      }
+		  }
+                else if (syntax & RE_CHAR_CLASSES && c == '[' && *p == '.')
+		  {
+		    unsigned char str[128];	/* Should be large enough.  */
+#ifdef _LIBC
+		    uint32_t nrules =
+		      _NL_CURRENT_WORD (LC_COLLATE, _NL_COLLATE_NRULES);
+#endif
+
+		    PATFETCH (c);
+		    c1 = 0;
+
+		    /* If pattern is `[[='.  */
+		    if (p == pend) FREE_STACK_RETURN (REG_EBRACK);
+
+		    for (;;)
+		      {
+			PATFETCH (c);
+			if ((c == '.' && *p == ']') || p == pend)
+			  break;
+			if (c1 < sizeof (str))
+			  str[c1++] = c;
+			else
+			  /* This is in any case an invalid class name.  */
+			  str[0] = '\0';
+                      }
+		    str[c1] = '\0';
+
+		    if (c == '.' && *p == ']' && str[0] != '\0')
+		      {
+			/* If we have no collation data we use the default
+			   collation in which each character is the name
+			   for its own class which contains only the one
+			   character.  It also means that ASCII is the
+			   character set and therefore we cannot have character
+			   with more than one byte in the multibyte
+			   representation.  */
+#ifdef _LIBC
+			if (nrules == 0)
+#endif
+			  {
+			    if (c1 != 1)
+			      FREE_STACK_RETURN (REG_ECOLLATE);
+
+			    /* Throw away the ] at the end of the equivalence
+			       class.  */
+			    PATFETCH (c);
+
+			    /* Set the bit for the character.  */
+			    SET_LIST_BIT (str[0]);
+			    range_start = ((const unsigned char *) str)[0];
+			  }
+#ifdef _LIBC
+			else
+			  {
+			    /* Try to match the byte sequence in `str' against
+			       those known to the collate implementation.
+			       First find out whether the bytes in `str' are
+			       actually from exactly one character.  */
+			    int32_t table_size;
+			    const int32_t *symb_table;
+			    const unsigned char *extra;
+			    int32_t idx;
+			    int32_t elem;
+			    int32_t second;
+			    int32_t hash;
+
+			    table_size =
+			      _NL_CURRENT_WORD (LC_COLLATE,
+						_NL_COLLATE_SYMB_HASH_SIZEMB);
+			    symb_table = (const int32_t *)
+			      _NL_CURRENT (LC_COLLATE,
+					   _NL_COLLATE_SYMB_TABLEMB);
+			    extra = (const unsigned char *)
+			      _NL_CURRENT (LC_COLLATE,
+					   _NL_COLLATE_SYMB_EXTRAMB);
+
+			    /* Locate the character in the hashing table.  */
+			    hash = elem_hash (str, c1);
+
+			    idx = 0;
+			    elem = hash % table_size;
+			    second = hash % (table_size - 2);
+			    while (symb_table[2 * elem] != 0)
+			      {
+				/* First compare the hashing value.  */
+				if (symb_table[2 * elem] == hash
+				    && c1 == extra[symb_table[2 * elem + 1]]
+				    && memcmp (str,
+					       &extra[symb_table[2 * elem + 1]
+						     + 1],
+					       c1) == 0)
+				  {
+				    /* Yep, this is the entry.  */
+				    idx = symb_table[2 * elem + 1];
+				    idx += 1 + extra[idx];
+				    break;
+				  }
+
+				/* Next entry.  */
+				elem += second;
+			      }
+
+			    if (symb_table[2 * elem] == 0)
+			      /* This is no valid character.  */
+			      FREE_STACK_RETURN (REG_ECOLLATE);
+
+			    /* Throw away the ] at the end of the equivalence
+			       class.  */
+			    PATFETCH (c);
+
+			    /* Now add the multibyte character(s) we found
+			       to the accept list.
+
+			       XXX Note that this is not entirely correct.
+			       we would have to match multibyte sequences
+			       but this is not possible with the current
+			       implementation.  Also, we have to match
+			       collating symbols, which expand to more than
+			       one file, as a whole and not allow the
+			       individual bytes.  */
+			    c1 = extra[idx++];
+			    if (c1 == 1)
+			      range_start = extra[idx];
+			    while (c1-- > 0)
+			      {
+				SET_LIST_BIT (extra[idx]);
+				++idx;
+			      }
+			  }
+#endif
+			had_char_class = false;
+		      }
+                    else
+                      {
+                        c1++;
+                        while (c1--)
+                          PATUNFETCH;
+                        SET_LIST_BIT ('[');
+                        SET_LIST_BIT ('.');
+			range_start = '.';
+                        had_char_class = false;
+                      }
+		  }
+                else
+                  {
+                    had_char_class = false;
+                    SET_LIST_BIT (c);
+		    range_start = c;
+                  }
+              }
+
+            /* Discard any (non)matching list bytes that are all 0 at the
+               end of the map.  Decrease the map-length byte too.  */
+            while ((int) b[-1] > 0 && b[b[-1] - 1] == 0)
+              b[-1]--;
+            b += b[-1];
+          }
+          break;
+
+
+	case '(':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_open;
+          else
+            goto normal_char;
+
+
+        case ')':
+          if (syntax & RE_NO_BK_PARENS)
+            goto handle_close;
+          else
+            goto normal_char;
+
+
+        case '\n':
+          if (syntax & RE_NEWLINE_ALT)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+	case '|':
+          if (syntax & RE_NO_BK_VBAR)
+            goto handle_alt;
+          else
+            goto normal_char;
+
+
+        case '{':
+           if (syntax & RE_INTERVALS && syntax & RE_NO_BK_BRACES)
+             goto handle_interval;
+           else
+             goto normal_char;
+
+
+        case '\\':
+          if (p == pend) FREE_STACK_RETURN (REG_EESCAPE);
+
+          /* Do not translate the character after the \, so that we can
+             distinguish, e.g., \B from \b, even if we normally would
+             translate, e.g., B to b.  */
+          PATFETCH_RAW (c);
+
+          switch (c)
+            {
+            case '(':
+              if (syntax & RE_NO_BK_PARENS)
+                goto normal_backslash;
+
+            handle_open:
+              bufp->re_nsub++;
+              regnum++;
+
+              if (COMPILE_STACK_FULL)
+                {
+                  RETALLOC (compile_stack.stack, compile_stack.size << 1,
+                            compile_stack_elt_t);
+                  if (compile_stack.stack == NULL) return REG_ESPACE;
+
+                  compile_stack.size <<= 1;
+                }
+
+              /* These are the values to restore when we hit end of this
+                 group.  They are all relative offsets, so that if the
+                 whole pattern moves because of realloc, they will still
+                 be valid.  */
+              COMPILE_STACK_TOP.begalt_offset = begalt - bufp->buffer;
+              COMPILE_STACK_TOP.fixup_alt_jump
+                = fixup_alt_jump ? fixup_alt_jump - bufp->buffer + 1 : 0;
+              COMPILE_STACK_TOP.laststart_offset = b - bufp->buffer;
+              COMPILE_STACK_TOP.regnum = regnum;
+
+              /* We will eventually replace the 0 with the number of
+                 groups inner to this one.  But do not push a
+                 start_memory for groups beyond the last one we can
+                 represent in the compiled pattern.  */
+              if (regnum <= MAX_REGNUM)
+                {
+                  COMPILE_STACK_TOP.inner_group_offset = b - bufp->buffer + 2;
+                  BUF_PUSH_3 (start_memory, regnum, 0);
+                }
+
+              compile_stack.avail++;
+
+              fixup_alt_jump = 0;
+              laststart = 0;
+              begalt = b;
+	      /* If we've reached MAX_REGNUM groups, then this open
+		 won't actually generate any code, so we'll have to
+		 clear pending_exact explicitly.  */
+	      pending_exact = 0;
+              break;
+
+
+            case ')':
+              if (syntax & RE_NO_BK_PARENS) goto normal_backslash;
+
+              if (COMPILE_STACK_EMPTY)
+		{
+		  if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+		    goto normal_backslash;
+		  else
+		    FREE_STACK_RETURN (REG_ERPAREN);
+		}
+
+            handle_close:
+              if (fixup_alt_jump)
+                { /* Push a dummy failure point at the end of the
+                     alternative for a possible future
+                     `pop_failure_jump' to pop.  See comments at
+                     `push_dummy_failure' in `re_match_2'.  */
+                  BUF_PUSH (push_dummy_failure);
+
+                  /* We allocated space for this jump when we assigned
+                     to `fixup_alt_jump', in the `handle_alt' case below.  */
+                  STORE_JUMP (jump_past_alt, fixup_alt_jump, b - 1);
+                }
+
+              /* See similar code for backslashed left paren above.  */
+              if (COMPILE_STACK_EMPTY)
+		{
+		  if (syntax & RE_UNMATCHED_RIGHT_PAREN_ORD)
+		    goto normal_char;
+		  else
+		    FREE_STACK_RETURN (REG_ERPAREN);
+		}
+
+              /* Since we just checked for an empty stack above, this
+                 ``can't happen''.  */
+              assert (compile_stack.avail != 0);
+              {
+                /* We don't just want to restore into `regnum', because
+                   later groups should continue to be numbered higher,
+                   as in `(ab)c(de)' -- the second group is #2.  */
+                regnum_t this_group_regnum;
+
+                compile_stack.avail--;
+                begalt = bufp->buffer + COMPILE_STACK_TOP.begalt_offset;
+                fixup_alt_jump
+                  = COMPILE_STACK_TOP.fixup_alt_jump
+                    ? bufp->buffer + COMPILE_STACK_TOP.fixup_alt_jump - 1
+                    : 0;
+                laststart = bufp->buffer + COMPILE_STACK_TOP.laststart_offset;
+                this_group_regnum = COMPILE_STACK_TOP.regnum;
+		/* If we've reached MAX_REGNUM groups, then this open
+		   won't actually generate any code, so we'll have to
+		   clear pending_exact explicitly.  */
+		pending_exact = 0;
+
+                /* We're at the end of the group, so now we know how many
+                   groups were inside this one.  */
+                if (this_group_regnum <= MAX_REGNUM)
+                  {
+                    unsigned char *inner_group_loc
+                      = bufp->buffer + COMPILE_STACK_TOP.inner_group_offset;
+
+                    *inner_group_loc = regnum - this_group_regnum;
+                    BUF_PUSH_3 (stop_memory, this_group_regnum,
+                                regnum - this_group_regnum);
+                  }
+              }
+              break;
+
+
+            case '|':					/* `\|'.  */
+              if (syntax & RE_LIMITED_OPS || syntax & RE_NO_BK_VBAR)
+                goto normal_backslash;
+            handle_alt:
+              if (syntax & RE_LIMITED_OPS)
+                goto normal_char;
+
+              /* Insert before the previous alternative a jump which
+                 jumps to this alternative if the former fails.  */
+              GET_BUFFER_SPACE (3);
+              INSERT_JUMP (on_failure_jump, begalt, b + 6);
+              pending_exact = 0;
+              b += 3;
+
+              /* The alternative before this one has a jump after it
+                 which gets executed if it gets matched.  Adjust that
+                 jump so it will jump to this alternative's analogous
+                 jump (put in below, which in turn will jump to the next
+                 (if any) alternative's such jump, etc.).  The last such
+                 jump jumps to the correct final destination.  A picture:
+                          _____ _____
+                          |   | |   |
+                          |   v |   v
+                         a | b   | c
+
+                 If we are at `b', then fixup_alt_jump right now points to a
+                 three-byte space after `a'.  We'll put in the jump, set
+                 fixup_alt_jump to right after `b', and leave behind three
+                 bytes which we'll fill in when we get to after `c'.  */
+
+              if (fixup_alt_jump)
+                STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+
+              /* Mark and leave space for a jump after this alternative,
+                 to be filled in later either by next alternative or
+                 when know we're at the end of a series of alternatives.  */
+              fixup_alt_jump = b;
+              GET_BUFFER_SPACE (3);
+              b += 3;
+
+              laststart = 0;
+              begalt = b;
+              break;
+
+
+            case '{':
+              /* If \{ is a literal.  */
+              if (!(syntax & RE_INTERVALS)
+                     /* If we're at `\{' and it's not the open-interval
+                        operator.  */
+		  || (syntax & RE_NO_BK_BRACES))
+                goto normal_backslash;
+
+            handle_interval:
+              {
+                /* If got here, then the syntax allows intervals.  */
+
+                /* At least (most) this many matches must be made.  */
+                int lower_bound = -1, upper_bound = -1;
+
+                beg_interval = p - 1;
+
+                if (p == pend)
+                  {
+                    if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                      goto unfetch_interval;
+                    else
+                      FREE_STACK_RETURN (REG_EBRACE);
+                  }
+
+                GET_UNSIGNED_NUMBER (lower_bound);
+
+                if (c == ',')
+                  {
+                    GET_UNSIGNED_NUMBER (upper_bound);
+		    if ((!(syntax & RE_NO_BK_BRACES) && c != '\\')
+			|| ((syntax & RE_NO_BK_BRACES) && c != '}'))
+		      FREE_STACK_RETURN (REG_BADBR);
+
+		    if (upper_bound < 0)
+		      upper_bound = RE_DUP_MAX;
+                  }
+                else
+                  /* Interval such as `{1}' => match exactly once. */
+                  upper_bound = lower_bound;
+
+                if (lower_bound < 0 || upper_bound > RE_DUP_MAX
+                    || lower_bound > upper_bound)
+                  {
+                    if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                      goto unfetch_interval;
+                    else
+                      FREE_STACK_RETURN (REG_BADBR);
+                  }
+
+                if (!(syntax & RE_NO_BK_BRACES))
+                  {
+                    if (c != '\\') FREE_STACK_RETURN (REG_EBRACE);
+
+                    PATFETCH (c);
+                  }
+
+                if (c != '}')
+                  {
+                    if (!(syntax & RE_INTERVALS) && (syntax & RE_NO_BK_BRACES))
+                      goto unfetch_interval;
+                    else
+                      FREE_STACK_RETURN (REG_BADBR);
+                  }
+
+                /* We just parsed a valid interval.  */
+
+                /* If it's invalid to have no preceding re.  */
+                if (!laststart)
+                  {
+                    if (syntax & RE_CONTEXT_INVALID_OPS)
+                      FREE_STACK_RETURN (REG_BADRPT);
+                    else if (syntax & RE_CONTEXT_INDEP_OPS)
+                      laststart = b;
+                    else
+                      goto unfetch_interval;
+                  }
+
+                /* If the upper bound is zero, don't want to succeed at
+                   all; jump from `laststart' to `b + 3', which will be
+                   the end of the buffer after we insert the jump.  */
+                 if (upper_bound == 0)
+                   {
+                     GET_BUFFER_SPACE (3);
+                     INSERT_JUMP (jump, laststart, b + 3);
+                     b += 3;
+                   }
+
+                 /* Otherwise, we have a nontrivial interval.  When
+                    we're all done, the pattern will look like:
+                      set_number_at <jump count> <upper bound>
+                      set_number_at <succeed_n count> <lower bound>
+                      succeed_n <after jump addr> <succeed_n count>
+                      <body of loop>
+                      jump_n <succeed_n addr> <jump count>
+                    (The upper bound and `jump_n' are omitted if
+                    `upper_bound' is 1, though.)  */
+                 else
+                   { /* If the upper bound is > 1, we need to insert
+                        more at the end of the loop.  */
+                     unsigned nbytes = 10 + (upper_bound > 1) * 10;
+
+                     GET_BUFFER_SPACE (nbytes);
+
+                     /* Initialize lower bound of the `succeed_n', even
+                        though it will be set during matching by its
+                        attendant `set_number_at' (inserted next),
+                        because `re_compile_fastmap' needs to know.
+                        Jump to the `jump_n' we might insert below.  */
+                     INSERT_JUMP2 (succeed_n, laststart,
+                                   b + 5 + (upper_bound > 1) * 5,
+                                   lower_bound);
+                     b += 5;
+
+                     /* Code to initialize the lower bound.  Insert
+                        before the `succeed_n'.  The `5' is the last two
+                        bytes of this `set_number_at', plus 3 bytes of
+                        the following `succeed_n'.  */
+                     insert_op2 (set_number_at, laststart, 5, lower_bound, b);
+                     b += 5;
+
+                     if (upper_bound > 1)
+                       { /* More than one repetition is allowed, so
+                            append a backward jump to the `succeed_n'
+                            that starts this interval.
+
+                            When we've reached this during matching,
+                            we'll have matched the interval once, so
+                            jump back only `upper_bound - 1' times.  */
+                         STORE_JUMP2 (jump_n, b, laststart + 5,
+                                      upper_bound - 1);
+                         b += 5;
+
+                         /* The location we want to set is the second
+                            parameter of the `jump_n'; that is `b-2' as
+                            an absolute address.  `laststart' will be
+                            the `set_number_at' we're about to insert;
+                            `laststart+3' the number to set, the source
+                            for the relative address.  But we are
+                            inserting into the middle of the pattern --
+                            so everything is getting moved up by 5.
+                            Conclusion: (b - 2) - (laststart + 3) + 5,
+                            i.e., b - laststart.
+
+                            We insert this at the beginning of the loop
+                            so that if we fail during matching, we'll
+                            reinitialize the bounds.  */
+                         insert_op2 (set_number_at, laststart, b - laststart,
+                                     upper_bound - 1, b);
+                         b += 5;
+                       }
+                   }
+                pending_exact = 0;
+                beg_interval = NULL;
+              }
+              break;
+
+            unfetch_interval:
+              /* If an invalid interval, match the characters as literals.  */
+               assert (beg_interval);
+               p = beg_interval;
+               beg_interval = NULL;
+
+               /* normal_char and normal_backslash need `c'.  */
+               PATFETCH (c);
+
+               if (!(syntax & RE_NO_BK_BRACES))
+                 {
+                   if (p > pattern  &&  p[-1] == '\\')
+                     goto normal_backslash;
+                 }
+               goto normal_char;
+
+#ifdef emacs
+            /* There is no way to specify the before_dot and after_dot
+               operators.  rms says this is ok.  --karl  */
+            case '=':
+              BUF_PUSH (at_dot);
+              break;
+
+            case 's':
+              laststart = b;
+              PATFETCH (c);
+              BUF_PUSH_2 (syntaxspec, syntax_spec_code[c]);
+              break;
+
+            case 'S':
+              laststart = b;
+              PATFETCH (c);
+              BUF_PUSH_2 (notsyntaxspec, syntax_spec_code[c]);
+              break;
+#endif /* emacs */
+
+
+            case 'w':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              laststart = b;
+              BUF_PUSH (wordchar);
+              break;
+
+
+            case 'W':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              laststart = b;
+              BUF_PUSH (notwordchar);
+              break;
+
+
+            case '<':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              BUF_PUSH (wordbeg);
+              break;
+
+            case '>':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              BUF_PUSH (wordend);
+              break;
+
+            case 'b':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              BUF_PUSH (wordbound);
+              break;
+
+            case 'B':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              BUF_PUSH (notwordbound);
+              break;
+
+            case '`':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              BUF_PUSH (begbuf);
+              break;
+
+            case '\'':
+	      if (syntax & RE_NO_GNU_OPS)
+		goto normal_char;
+              BUF_PUSH (endbuf);
+              break;
+
+            case '1': case '2': case '3': case '4': case '5':
+            case '6': case '7': case '8': case '9':
+              if (syntax & RE_NO_BK_REFS)
+                goto normal_char;
+
+              c1 = c - '0';
+
+              if (c1 > regnum)
+                FREE_STACK_RETURN (REG_ESUBREG);
+
+              /* Can't back reference to a subexpression if inside of it.  */
+              if (group_in_compile_stack (compile_stack, (regnum_t) c1))
+                goto normal_char;
+
+              laststart = b;
+              BUF_PUSH_2 (duplicate, c1);
+              break;
+
+
+            case '+':
+            case '?':
+              if (syntax & RE_BK_PLUS_QM)
+                goto handle_plus;
+              else
+                goto normal_backslash;
+
+            default:
+            normal_backslash:
+              /* You might think it would be useful for \ to mean
+                 not to translate; but if we don't translate it
+                 it will never match anything.  */
+              c = TRANSLATE (c);
+              goto normal_char;
+            }
+          break;
+
+
+	default:
+        /* Expects the character in `c'.  */
+	normal_char:
+	      /* If no exactn currently being built.  */
+          if (!pending_exact
+
+              /* If last exactn not at current position.  */
+              || pending_exact + *pending_exact + 1 != b
+
+              /* We have only one byte following the exactn for the count.  */
+	      || *pending_exact == (1 << BYTEWIDTH) - 1
+
+              /* If followed by a repetition operator.  */
+              || *p == '*' || *p == '^'
+	      || ((syntax & RE_BK_PLUS_QM)
+		  ? *p == '\\' && (p[1] == '+' || p[1] == '?')
+		  : (*p == '+' || *p == '?'))
+	      || ((syntax & RE_INTERVALS)
+                  && ((syntax & RE_NO_BK_BRACES)
+		      ? *p == '{'
+                      : (p[0] == '\\' && p[1] == '{'))))
+	    {
+	      /* Start building a new exactn.  */
+
+              laststart = b;
+
+	      BUF_PUSH_2 (exactn, 0);
+	      pending_exact = b - 1;
+            }
+
+	  BUF_PUSH (c);
+          (*pending_exact)++;
+	  break;
+        } /* switch (c) */
+    } /* while p != pend */
+
+
+  /* Through the pattern now.  */
+
+  if (fixup_alt_jump)
+    STORE_JUMP (jump_past_alt, fixup_alt_jump, b);
+
+  if (!COMPILE_STACK_EMPTY)
+    FREE_STACK_RETURN (REG_EPAREN);
+
+  /* If we don't want backtracking, force success
+     the first time we reach the end of the compiled pattern.  */
+  if (syntax & RE_NO_POSIX_BACKTRACKING)
+    BUF_PUSH (succeed);
+
+  free (compile_stack.stack);
+
+  /* We have succeeded; set the length of the buffer.  */
+  bufp->used = b - bufp->buffer;
+
+#ifdef DEBUG
+  if (debug)
+    {
+      DEBUG_PRINT1 ("\nCompiled pattern: \n");
+      print_compiled_pattern (bufp);
+    }
+#endif /* DEBUG */
+
+#ifndef MATCH_MAY_ALLOCATE
+  /* Initialize the failure stack to the largest possible stack.  This
+     isn't necessary unless we're trying to avoid calling alloca in
+     the search and match routines.  */
+  {
+    int num_regs = bufp->re_nsub + 1;
+
+    /* Since DOUBLE_FAIL_STACK refuses to double only if the current size
+       is strictly greater than re_max_failures, the largest possible stack
+       is 2 * re_max_failures failure points.  */
+    if (fail_stack.size < (2 * re_max_failures * MAX_FAILURE_ITEMS))
+      {
+	fail_stack.size = (2 * re_max_failures * MAX_FAILURE_ITEMS);
+
+# ifdef emacs
+	if (! fail_stack.stack)
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) xmalloc (fail_stack.size
+					    * sizeof (fail_stack_elt_t));
+	else
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) xrealloc (fail_stack.stack,
+					     (fail_stack.size
+					      * sizeof (fail_stack_elt_t)));
+# else /* not emacs */
+	if (! fail_stack.stack)
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) malloc (fail_stack.size
+					   * sizeof (fail_stack_elt_t));
+	else
+	  fail_stack.stack
+	    = (fail_stack_elt_t *) realloc (fail_stack.stack,
+					    (fail_stack.size
+					     * sizeof (fail_stack_elt_t)));
+# endif /* not emacs */
+      }
+
+    regex_grow_registers (num_regs);
+  }
+#endif /* not MATCH_MAY_ALLOCATE */
+
+  return REG_NOERROR;
+} /* regex_compile */
+
+/* Subroutines for `regex_compile'.  */
+
+/* Store OP at LOC followed by two-byte integer parameter ARG.  */
+
+static void
+store_op1 (op, loc, arg)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg;
+{
+  *loc = (unsigned char) op;
+  STORE_NUMBER (loc + 1, arg);
+}
+
+
+/* Like `store_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+store_op2 (op, loc, arg1, arg2)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg1, arg2;
+{
+  *loc = (unsigned char) op;
+  STORE_NUMBER (loc + 1, arg1);
+  STORE_NUMBER (loc + 3, arg2);
+}
+
+
+/* Copy the bytes from LOC to END to open up three bytes of space at LOC
+   for OP followed by two-byte integer parameter ARG.  */
+
+static void
+insert_op1 (op, loc, arg, end)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg;
+    unsigned char *end;
+{
+  register unsigned char *pfrom = end;
+  register unsigned char *pto = end + 3;
+
+  while (pfrom != loc)
+    *--pto = *--pfrom;
+
+  store_op1 (op, loc, arg);
+}
+
+
+/* Like `insert_op1', but for two two-byte parameters ARG1 and ARG2.  */
+
+static void
+insert_op2 (op, loc, arg1, arg2, end)
+    re_opcode_t op;
+    unsigned char *loc;
+    int arg1, arg2;
+    unsigned char *end;
+{
+  register unsigned char *pfrom = end;
+  register unsigned char *pto = end + 5;
+
+  while (pfrom != loc)
+    *--pto = *--pfrom;
+
+  store_op2 (op, loc, arg1, arg2);
+}
+
+
+/* P points to just after a ^ in PATTERN.  Return true if that ^ comes
+   after an alternative or a begin-subexpression.  We assume there is at
+   least one character before the ^.  */
+
+static boolean
+at_begline_loc_p (pattern, p, syntax)
+    const char *pattern, *p;
+    reg_syntax_t syntax;
+{
+  const char *prev = p - 2;
+  boolean prev_prev_backslash = prev > pattern && prev[-1] == '\\';
+
+  return
+       /* After a subexpression?  */
+       (*prev == '(' && (syntax & RE_NO_BK_PARENS || prev_prev_backslash))
+       /* After an alternative?  */
+    || (*prev == '|' && (syntax & RE_NO_BK_VBAR || prev_prev_backslash));
+}
+
+
+/* The dual of at_begline_loc_p.  This one is for $.  We assume there is
+   at least one character after the $, i.e., `P < PEND'.  */
+
+static boolean
+at_endline_loc_p (p, pend, syntax)
+    const char *p, *pend;
+    reg_syntax_t syntax;
+{
+  const char *next = p;
+  boolean next_backslash = *next == '\\';
+  const char *next_next = p + 1 < pend ? p + 1 : 0;
+
+  return
+       /* Before a subexpression?  */
+       (syntax & RE_NO_BK_PARENS ? *next == ')'
+        : next_backslash && next_next && *next_next == ')')
+       /* Before an alternative?  */
+    || (syntax & RE_NO_BK_VBAR ? *next == '|'
+        : next_backslash && next_next && *next_next == '|');
+}
+
+
+/* Returns true if REGNUM is in one of COMPILE_STACK's elements and
+   false if it's not.  */
+
+static boolean
+group_in_compile_stack (compile_stack, regnum)
+    compile_stack_type compile_stack;
+    regnum_t regnum;
+{
+  int this_element;
+
+  for (this_element = compile_stack.avail - 1;
+       this_element >= 0;
+       this_element--)
+    if (compile_stack.stack[this_element].regnum == regnum)
+      return true;
+
+  return false;
+}
+
+
+/* Read the ending character of a range (in a bracket expression) from the
+   uncompiled pattern *P_PTR (which ends at PEND).  We assume the
+   starting character is in `P[-2]'.  (`P[-1]' is the character `-'.)
+   Then we set the translation of all bits between the starting and
+   ending characters (inclusive) in the compiled pattern B.
+
+   Return an error code.
+
+   We use these short variable names so we can use the same macros as
+   `regex_compile' itself.  */
+
+static reg_errcode_t
+compile_range (range_start_char, p_ptr, pend, translate, syntax, b)
+     unsigned int range_start_char;
+     const char **p_ptr, *pend;
+     RE_TRANSLATE_TYPE translate;
+     reg_syntax_t syntax;
+     unsigned char *b;
+{
+  unsigned this_char;
+  const char *p = *p_ptr;
+  reg_errcode_t ret;
+#if _LIBC
+  const unsigned char *collseq;
+  unsigned int start_colseq;
+  unsigned int end_colseq;
+#else
+  unsigned end_char;
+#endif
+
+  if (p == pend)
+    return REG_ERANGE;
+
+  /* Have to increment the pointer into the pattern string, so the
+     caller isn't still at the ending character.  */
+  (*p_ptr)++;
+
+  /* Report an error if the range is empty and the syntax prohibits this.  */
+  ret = syntax & RE_NO_EMPTY_RANGES ? REG_ERANGE : REG_NOERROR;
+
+#if _LIBC
+  collseq = (const unsigned char *) _NL_CURRENT (LC_COLLATE,
+						 _NL_COLLATE_COLLSEQMB);
+
+  start_colseq = collseq[(unsigned char) TRANSLATE (range_start_char)];
+  end_colseq = collseq[(unsigned char) TRANSLATE (p[0])];
+  for (this_char = 0; this_char <= (unsigned char) -1; ++this_char)
+    {
+      unsigned int this_colseq = collseq[(unsigned char) TRANSLATE (this_char)];
+
+      if (start_colseq <= this_colseq && this_colseq <= end_colseq)
+	{
+	  SET_LIST_BIT (TRANSLATE (this_char));
+	  ret = REG_NOERROR;
+	}
+    }
+#else
+  /* Here we see why `this_char' has to be larger than an `unsigned
+     char' -- we would otherwise go into an infinite loop, since all
+     characters <= 0xff.  */
+  range_start_char = TRANSLATE (range_start_char);
+  end_char = TRANSLATE (p[0]);
+  for (this_char = range_start_char; this_char <= end_char; ++this_char)
+    {
+      SET_LIST_BIT (TRANSLATE (this_char));
+      ret = REG_NOERROR;
+    }
+#endif
+
+  return ret;
+}
+
+/* re_compile_fastmap computes a ``fastmap'' for the compiled pattern in
+   BUFP.  A fastmap records which of the (1 << BYTEWIDTH) possible
+   characters can start a string that matches the pattern.  This fastmap
+   is used by re_search to skip quickly over impossible starting points.
+
+   The caller must supply the address of a (1 << BYTEWIDTH)-byte data
+   area as BUFP->fastmap.
+
+   We set the `fastmap', `fastmap_accurate', and `can_be_null' fields in
+   the pattern buffer.
+
+   Returns 0 if we succeed, -2 if an internal error.   */
+
+int
+re_compile_fastmap (bufp)
+     struct re_pattern_buffer *bufp;
+{
+  int j, k;
+#ifdef MATCH_MAY_ALLOCATE
+  fail_stack_type fail_stack;
+#endif
+#ifndef REGEX_MALLOC
+  char *destination;
+#endif
+
+  register char *fastmap = bufp->fastmap;
+  unsigned char *pattern = bufp->buffer;
+  unsigned char *p = pattern;
+  register unsigned char *pend = pattern + bufp->used;
+
+#ifdef REL_ALLOC
+  /* This holds the pointer to the failure stack, when
+     it is allocated relocatably.  */
+  fail_stack_elt_t *failure_stack_ptr;
+#endif
+
+  /* Assume that each path through the pattern can be null until
+     proven otherwise.  We set this false at the bottom of switch
+     statement, to which we get only if a particular path doesn't
+     match the empty string.  */
+  boolean path_can_be_null = true;
+
+  /* We aren't doing a `succeed_n' to begin with.  */
+  boolean succeed_n_p = false;
+
+  assert (fastmap != NULL && p != NULL);
+
+  INIT_FAIL_STACK ();
+  bzero (fastmap, 1 << BYTEWIDTH);  /* Assume nothing's valid.  */
+  bufp->fastmap_accurate = 1;	    /* It will be when we're done.  */
+  bufp->can_be_null = 0;
+
+  while (1)
+    {
+      if (p == pend || *p == succeed)
+	{
+	  /* We have reached the (effective) end of pattern.  */
+	  if (!FAIL_STACK_EMPTY ())
+	    {
+	      bufp->can_be_null |= path_can_be_null;
+
+	      /* Reset for next path.  */
+	      path_can_be_null = true;
+
+	      p = fail_stack.stack[--fail_stack.avail].pointer;
+
+	      continue;
+	    }
+	  else
+	    break;
+	}
+
+      /* We should never be about to go beyond the end of the pattern.  */
+      assert (p < pend);
+
+      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
+	{
+
+        /* I guess the idea here is to simply not bother with a fastmap
+           if a backreference is used, since it's too hard to figure out
+           the fastmap for the corresponding group.  Setting
+           `can_be_null' stops `re_search_2' from using the fastmap, so
+           that is all we do.  */
+	case duplicate:
+	  bufp->can_be_null = 1;
+          goto done;
+
+
+      /* Following are the cases which match a character.  These end
+         with `break'.  */
+
+	case exactn:
+          fastmap[p[1]] = 1;
+	  break;
+
+
+        case charset:
+          for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+	    if (p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH)))
+              fastmap[j] = 1;
+	  break;
+
+
+	case charset_not:
+	  /* Chars beyond end of map must be allowed.  */
+	  for (j = *p * BYTEWIDTH; j < (1 << BYTEWIDTH); j++)
+            fastmap[j] = 1;
+
+	  for (j = *p++ * BYTEWIDTH - 1; j >= 0; j--)
+	    if (!(p[j / BYTEWIDTH] & (1 << (j % BYTEWIDTH))))
+              fastmap[j] = 1;
+          break;
+
+
+	case wordchar:
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) == Sword)
+	      fastmap[j] = 1;
+	  break;
+
+
+	case notwordchar:
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) != Sword)
+	      fastmap[j] = 1;
+	  break;
+
+
+        case anychar:
+	  {
+	    int fastmap_newline = fastmap['\n'];
+
+	    /* `.' matches anything ...  */
+	    for (j = 0; j < (1 << BYTEWIDTH); j++)
+	      fastmap[j] = 1;
+
+	    /* ... except perhaps newline.  */
+	    if (!(bufp->syntax & RE_DOT_NEWLINE))
+	      fastmap['\n'] = fastmap_newline;
+
+	    /* Return if we have already set `can_be_null'; if we have,
+	       then the fastmap is irrelevant.  Something's wrong here.  */
+	    else if (bufp->can_be_null)
+	      goto done;
+
+	    /* Otherwise, have to check alternative paths.  */
+	    break;
+	  }
+
+#ifdef emacs
+        case syntaxspec:
+	  k = *p++;
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) == (enum syntaxcode) k)
+	      fastmap[j] = 1;
+	  break;
+
+
+	case notsyntaxspec:
+	  k = *p++;
+	  for (j = 0; j < (1 << BYTEWIDTH); j++)
+	    if (SYNTAX (j) != (enum syntaxcode) k)
+	      fastmap[j] = 1;
+	  break;
+
+
+      /* All cases after this match the empty string.  These end with
+         `continue'.  */
+
+
+	case before_dot:
+	case at_dot:
+	case after_dot:
+          continue;
+#endif /* emacs */
+
+
+        case no_op:
+        case begline:
+        case endline:
+	case begbuf:
+	case endbuf:
+	case wordbound:
+	case notwordbound:
+	case wordbeg:
+	case wordend:
+        case push_dummy_failure:
+          continue;
+
+
+	case jump_n:
+        case pop_failure_jump:
+	case maybe_pop_jump:
+	case jump:
+        case jump_past_alt:
+	case dummy_failure_jump:
+          EXTRACT_NUMBER_AND_INCR (j, p);
+	  p += j;
+	  if (j > 0)
+	    continue;
+
+          /* Jump backward implies we just went through the body of a
+             loop and matched nothing.  Opcode jumped to should be
+             `on_failure_jump' or `succeed_n'.  Just treat it like an
+             ordinary jump.  For a * loop, it has pushed its failure
+             point already; if so, discard that as redundant.  */
+          if ((re_opcode_t) *p != on_failure_jump
+	      && (re_opcode_t) *p != succeed_n)
+	    continue;
+
+          p++;
+          EXTRACT_NUMBER_AND_INCR (j, p);
+          p += j;
+
+          /* If what's on the stack is where we are now, pop it.  */
+          if (!FAIL_STACK_EMPTY ()
+	      && fail_stack.stack[fail_stack.avail - 1].pointer == p)
+            fail_stack.avail--;
+
+          continue;
+
+
+        case on_failure_jump:
+        case on_failure_keep_string_jump:
+	handle_on_failure_jump:
+          EXTRACT_NUMBER_AND_INCR (j, p);
+
+          /* For some patterns, e.g., `(a?)?', `p+j' here points to the
+             end of the pattern.  We don't want to push such a point,
+             since when we restore it above, entering the switch will
+             increment `p' past the end of the pattern.  We don't need
+             to push such a point since we obviously won't find any more
+             fastmap entries beyond `pend'.  Such a pattern can match
+             the null string, though.  */
+          if (p + j < pend)
+            {
+              if (!PUSH_PATTERN_OP (p + j, fail_stack))
+		{
+		  RESET_FAIL_STACK ();
+		  return -2;
+		}
+            }
+          else
+            bufp->can_be_null = 1;
+
+          if (succeed_n_p)
+            {
+              EXTRACT_NUMBER_AND_INCR (k, p);	/* Skip the n.  */
+              succeed_n_p = false;
+	    }
+
+          continue;
+
+
+	case succeed_n:
+          /* Get to the number of times to succeed.  */
+          p += 2;
+
+          /* Increment p past the n for when k != 0.  */
+          EXTRACT_NUMBER_AND_INCR (k, p);
+          if (k == 0)
+	    {
+              p -= 4;
+  	      succeed_n_p = true;  /* Spaghetti code alert.  */
+              goto handle_on_failure_jump;
+            }
+          continue;
+
+
+	case set_number_at:
+          p += 4;
+          continue;
+
+
+	case start_memory:
+        case stop_memory:
+	  p += 2;
+	  continue;
+
+
+	default:
+          abort (); /* We have listed all the cases.  */
+        } /* switch *p++ */
+
+      /* Getting here means we have found the possible starting
+         characters for one path of the pattern -- and that the empty
+         string does not match.  We need not follow this path further.
+         Instead, look at the next alternative (remembered on the
+         stack), or quit if no more.  The test at the top of the loop
+         does these things.  */
+      path_can_be_null = false;
+      p = pend;
+    } /* while p */
+
+  /* Set `can_be_null' for the last path (also the first path, if the
+     pattern is empty).  */
+  bufp->can_be_null |= path_can_be_null;
+
+ done:
+  RESET_FAIL_STACK ();
+  return 0;
+} /* re_compile_fastmap */
+#ifdef _LIBC
+weak_alias (__re_compile_fastmap, re_compile_fastmap)
+#endif
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using PATTERN_BUFFER and REGS will use
+   this memory for recording register information.  STARTS and ENDS
+   must be allocated using the malloc library routine, and must each
+   be at least NUM_REGS * sizeof (regoff_t) bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+
+void
+re_set_registers (bufp, regs, num_regs, starts, ends)
+    struct re_pattern_buffer *bufp;
+    struct re_registers *regs;
+    unsigned num_regs;
+    regoff_t *starts, *ends;
+{
+  if (num_regs)
+    {
+      bufp->regs_allocated = REGS_REALLOCATE;
+      regs->num_regs = num_regs;
+      regs->start = starts;
+      regs->end = ends;
+    }
+  else
+    {
+      bufp->regs_allocated = REGS_UNALLOCATED;
+      regs->num_regs = 0;
+      regs->start = regs->end = (regoff_t *) 0;
+    }
+}
+#ifdef _LIBC
+weak_alias (__re_set_registers, re_set_registers)
+#endif
+
+/* Searching routines.  */
+
+/* Like re_search_2, below, but only one string is specified, and
+   doesn't let you say where to stop matching. */
+
+int
+re_search (bufp, string, size, startpos, range, regs)
+     struct re_pattern_buffer *bufp;
+     const char *string;
+     int size, startpos, range;
+     struct re_registers *regs;
+{
+  return re_search_2 (bufp, NULL, 0, string, size, startpos, range,
+		      regs, size);
+}
+#ifdef _LIBC
+weak_alias (__re_search, re_search)
+#endif
+
+
+/* Using the compiled pattern in BUFP->buffer, first tries to match the
+   virtual concatenation of STRING1 and STRING2, starting first at index
+   STARTPOS, then at STARTPOS + 1, and so on.
+
+   STRING1 and STRING2 have length SIZE1 and SIZE2, respectively.
+
+   RANGE is how far to scan while trying to match.  RANGE = 0 means try
+   only at STARTPOS; in general, the last start tried is STARTPOS +
+   RANGE.
+
+   In REGS, return the indices of the virtual concatenation of STRING1
+   and STRING2 that matched the entire BUFP->buffer and its contained
+   subexpressions.
+
+   Do not consider matching one past the index STOP in the virtual
+   concatenation of STRING1 and STRING2.
+
+   We return either the position in the strings at which the match was
+   found, -1 if no match, or -2 if error (such as failure
+   stack overflow).  */
+
+int
+re_search_2 (bufp, string1, size1, string2, size2, startpos, range, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int startpos;
+     int range;
+     struct re_registers *regs;
+     int stop;
+{
+  int val;
+  register char *fastmap = bufp->fastmap;
+  register RE_TRANSLATE_TYPE translate = bufp->translate;
+  int total_size = size1 + size2;
+  int endpos = startpos + range;
+
+  /* Check for out-of-range STARTPOS.  */
+  if (startpos < 0 || startpos > total_size)
+    return -1;
+
+  /* Fix up RANGE if it might eventually take us outside
+     the virtual concatenation of STRING1 and STRING2.
+     Make sure we won't move STARTPOS below 0 or above TOTAL_SIZE.  */
+  if (endpos < 0)
+    range = 0 - startpos;
+  else if (endpos > total_size)
+    range = total_size - startpos;
+
+  /* If the search isn't to be a backwards one, don't waste time in a
+     search for a pattern that must be anchored.  */
+  if (bufp->used > 0 && range > 0
+      && ((re_opcode_t) bufp->buffer[0] == begbuf
+	  /* `begline' is like `begbuf' if it cannot match at newlines.  */
+	  || ((re_opcode_t) bufp->buffer[0] == begline
+	      && !bufp->newline_anchor)))
+    {
+      if (startpos > 0)
+	return -1;
+      else
+	range = 1;
+    }
+
+#ifdef emacs
+  /* In a forward search for something that starts with \=.
+     don't keep searching past point.  */
+  if (bufp->used > 0 && (re_opcode_t) bufp->buffer[0] == at_dot && range > 0)
+    {
+      range = PT - startpos;
+      if (range <= 0)
+	return -1;
+    }
+#endif /* emacs */
+
+  /* Update the fastmap now if not correct already.  */
+  if (fastmap && !bufp->fastmap_accurate)
+    if (re_compile_fastmap (bufp) == -2)
+      return -2;
+
+  /* Loop through the string, looking for a place to start matching.  */
+  for (;;)
+    {
+      /* If a fastmap is supplied, skip quickly over characters that
+         cannot be the start of a match.  If the pattern can match the
+         null string, however, we don't need to skip characters; we want
+         the first null string.  */
+      if (fastmap && startpos < total_size && !bufp->can_be_null)
+	{
+	  if (range > 0)	/* Searching forwards.  */
+	    {
+	      register const char *d;
+	      register int lim = 0;
+	      int irange = range;
+
+              if (startpos < size1 && startpos + range >= size1)
+                lim = range - (size1 - startpos);
+
+	      d = (startpos >= size1 ? string2 - size1 : string1) + startpos;
+
+              /* Written out as an if-else to avoid testing `translate'
+                 inside the loop.  */
+	      if (translate)
+                while (range > lim
+                       && !fastmap[(unsigned char)
+				   translate[(unsigned char) *d++]])
+                  range--;
+	      else
+                while (range > lim && !fastmap[(unsigned char) *d++])
+                  range--;
+
+	      startpos += irange - range;
+	    }
+	  else				/* Searching backwards.  */
+	    {
+	      register char c = (size1 == 0 || startpos >= size1
+                                 ? string2[startpos - size1]
+                                 : string1[startpos]);
+
+	      if (!fastmap[(unsigned char) TRANSLATE (c)])
+		goto advance;
+	    }
+	}
+
+      /* If can't match the null string, and that's all we have left, fail.  */
+      if (range >= 0 && startpos == total_size && fastmap
+          && !bufp->can_be_null)
+	return -1;
+
+      val = re_match_2_internal (bufp, string1, size1, string2, size2,
+				 startpos, regs, stop);
+#ifndef REGEX_MALLOC
+# ifdef C_ALLOCA
+      alloca (0);
+# endif
+#endif
+
+      if (val >= 0)
+	return startpos;
+
+      if (val == -2)
+	return -2;
+
+    advance:
+      if (!range)
+        break;
+      else if (range > 0)
+        {
+          range--;
+          startpos++;
+        }
+      else
+        {
+          range++;
+          startpos--;
+        }
+    }
+  return -1;
+} /* re_search_2 */
+#ifdef _LIBC
+weak_alias (__re_search_2, re_search_2)
+#endif
+
+/* This converts PTR, a pointer into one of the search strings `string1'
+   and `string2' into an offset from the beginning of that string.  */
+#define POINTER_TO_OFFSET(ptr)			\
+  (FIRST_STRING_P (ptr)				\
+   ? ((regoff_t) ((ptr) - string1))		\
+   : ((regoff_t) ((ptr) - string2 + size1)))
+
+/* Macros for dealing with the split strings in re_match_2.  */
+
+#define MATCHING_IN_FIRST_STRING  (dend == end_match_1)
+
+/* Call before fetching a character with *d.  This switches over to
+   string2 if necessary.  */
+#define PREFETCH()							\
+  while (d == dend)						    	\
+    {									\
+      /* End of string2 => fail.  */					\
+      if (dend == end_match_2) 						\
+        goto fail;							\
+      /* End of string1 => advance to string2.  */ 			\
+      d = string2;						        \
+      dend = end_match_2;						\
+    }
+
+
+/* Test if at very beginning or at very end of the virtual concatenation
+   of `string1' and `string2'.  If only one string, it's `string2'.  */
+#define AT_STRINGS_BEG(d) ((d) == (size1 ? string1 : string2) || !size2)
+#define AT_STRINGS_END(d) ((d) == end2)
+
+
+/* Test if D points to a character which is word-constituent.  We have
+   two special cases to check for: if past the end of string1, look at
+   the first character in string2; and if before the beginning of
+   string2, look at the last character in string1.  */
+#define WORDCHAR_P(d)							\
+  (SYNTAX ((d) == end1 ? *string2					\
+           : (d) == string2 - 1 ? *(end1 - 1) : *(d))			\
+   == Sword)
+
+/* Disabled due to a compiler bug -- see comment at case wordbound */
+#if 0
+/* Test if the character before D and the one at D differ with respect
+   to being word-constituent.  */
+#define AT_WORD_BOUNDARY(d)						\
+  (AT_STRINGS_BEG (d) || AT_STRINGS_END (d)				\
+   || WORDCHAR_P (d - 1) != WORDCHAR_P (d))
+#endif
+
+/* Free everything we malloc.  */
+#ifdef MATCH_MAY_ALLOCATE
+# define FREE_VAR(var) if (var) REGEX_FREE (var); var = NULL
+# define FREE_VARIABLES()						\
+  do {									\
+    REGEX_FREE_STACK (fail_stack.stack);				\
+    FREE_VAR (regstart);						\
+    FREE_VAR (regend);							\
+    FREE_VAR (old_regstart);						\
+    FREE_VAR (old_regend);						\
+    FREE_VAR (best_regstart);						\
+    FREE_VAR (best_regend);						\
+    FREE_VAR (reg_info);						\
+    FREE_VAR (reg_dummy);						\
+    FREE_VAR (reg_info_dummy);						\
+  } while (0)
+#else
+# define FREE_VARIABLES() ((void)0) /* Do nothing!  But inhibit gcc warning. */
+#endif /* not MATCH_MAY_ALLOCATE */
+
+/* These values must meet several constraints.  They must not be valid
+   register values; since we have a limit of 255 registers (because
+   we use only one byte in the pattern for the register number), we can
+   use numbers larger than 255.  They must differ by 1, because of
+   NUM_FAILURE_ITEMS above.  And the value for the lowest register must
+   be larger than the value for the highest register, so we do not try
+   to actually save any registers when none are active.  */
+#define NO_HIGHEST_ACTIVE_REG (1 << BYTEWIDTH)
+#define NO_LOWEST_ACTIVE_REG (NO_HIGHEST_ACTIVE_REG + 1)
+
+/* Matching routines.  */
+
+#ifndef emacs   /* Emacs never uses this.  */
+/* re_match is like re_match_2 except it takes only a single string.  */
+
+int
+re_match (bufp, string, size, pos, regs)
+     struct re_pattern_buffer *bufp;
+     const char *string;
+     int size, pos;
+     struct re_registers *regs;
+{
+  int result = re_match_2_internal (bufp, NULL, 0, string, size,
+				    pos, regs, size);
+# ifndef REGEX_MALLOC
+#  ifdef C_ALLOCA
+  alloca (0);
+#  endif
+# endif
+  return result;
+}
+# ifdef _LIBC
+weak_alias (__re_match, re_match)
+# endif
+#endif /* not emacs */
+
+static boolean group_match_null_string_p _RE_ARGS ((unsigned char **p,
+						    unsigned char *end,
+						register_info_type *reg_info));
+static boolean alt_match_null_string_p _RE_ARGS ((unsigned char *p,
+						  unsigned char *end,
+						register_info_type *reg_info));
+static boolean common_op_match_null_string_p _RE_ARGS ((unsigned char **p,
+							unsigned char *end,
+						register_info_type *reg_info));
+static int bcmp_translate _RE_ARGS ((const char *s1, const char *s2,
+				     int len, char *translate));
+
+/* re_match_2 matches the compiled pattern in BUFP against the
+   the (virtual) concatenation of STRING1 and STRING2 (of length SIZE1
+   and SIZE2, respectively).  We start matching at POS, and stop
+   matching at STOP.
+
+   If REGS is non-null and the `no_sub' field of BUFP is nonzero, we
+   store offsets for the substring each group matched in REGS.  See the
+   documentation for exactly how many groups we fill.
+
+   We return -1 if no match, -2 if an internal error (such as the
+   failure stack overflowing).  Otherwise, we return the length of the
+   matched substring.  */
+
+int
+re_match_2 (bufp, string1, size1, string2, size2, pos, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int pos;
+     struct re_registers *regs;
+     int stop;
+{
+  int result = re_match_2_internal (bufp, string1, size1, string2, size2,
+				    pos, regs, stop);
+#ifndef REGEX_MALLOC
+# ifdef C_ALLOCA
+  alloca (0);
+# endif
+#endif
+  return result;
+}
+#ifdef _LIBC
+weak_alias (__re_match_2, re_match_2)
+#endif
+
+/* This is a separate function so that we can force an alloca cleanup
+   afterwards.  */
+static int
+re_match_2_internal (bufp, string1, size1, string2, size2, pos, regs, stop)
+     struct re_pattern_buffer *bufp;
+     const char *string1, *string2;
+     int size1, size2;
+     int pos;
+     struct re_registers *regs;
+     int stop;
+{
+  /* General temporaries.  */
+  int mcnt;
+  unsigned char *p1;
+
+  /* Just past the end of the corresponding string.  */
+  const char *end1, *end2;
+
+  /* Pointers into string1 and string2, just past the last characters in
+     each to consider matching.  */
+  const char *end_match_1, *end_match_2;
+
+  /* Where we are in the data, and the end of the current string.  */
+  const char *d, *dend;
+
+  /* Where we are in the pattern, and the end of the pattern.  */
+  unsigned char *p = bufp->buffer;
+  register unsigned char *pend = p + bufp->used;
+
+  /* Mark the opcode just after a start_memory, so we can test for an
+     empty subpattern when we get to the stop_memory.  */
+  unsigned char *just_past_start_mem = 0;
+
+  /* We use this to map every character in the string.  */
+  RE_TRANSLATE_TYPE translate = bufp->translate;
+
+  /* Failure point stack.  Each place that can handle a failure further
+     down the line pushes a failure point on this stack.  It consists of
+     restart, regend, and reg_info for all registers corresponding to
+     the subexpressions we're currently inside, plus the number of such
+     registers, and, finally, two char *'s.  The first char * is where
+     to resume scanning the pattern; the second one is where to resume
+     scanning the strings.  If the latter is zero, the failure point is
+     a ``dummy''; if a failure happens and the failure point is a dummy,
+     it gets discarded and the next next one is tried.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
+  fail_stack_type fail_stack;
+#endif
+#ifdef DEBUG
+  static unsigned failure_id;
+  unsigned nfailure_points_pushed = 0, nfailure_points_popped = 0;
+#endif
+
+#ifdef REL_ALLOC
+  /* This holds the pointer to the failure stack, when
+     it is allocated relocatably.  */
+  fail_stack_elt_t *failure_stack_ptr;
+#endif
+
+  /* We fill all the registers internally, independent of what we
+     return, for use in backreferences.  The number here includes
+     an element for register zero.  */
+  size_t num_regs = bufp->re_nsub + 1;
+
+  /* The currently active registers.  */
+  active_reg_t lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+  active_reg_t highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+
+  /* Information on the contents of registers. These are pointers into
+     the input strings; they record just what was matched (on this
+     attempt) by a subexpression part of the pattern, that is, the
+     regnum-th regstart pointer points to where in the pattern we began
+     matching and the regnum-th regend points to right after where we
+     stopped matching the regnum-th subexpression.  (The zeroth register
+     keeps track of what the whole pattern matches.)  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **regstart, **regend;
+#endif
+
+  /* If a group that's operated upon by a repetition operator fails to
+     match anything, then the register for its start will need to be
+     restored because it will have been set to wherever in the string we
+     are when we last see its open-group operator.  Similarly for a
+     register's end.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **old_regstart, **old_regend;
+#endif
+
+  /* The is_active field of reg_info helps us keep track of which (possibly
+     nested) subexpressions we are currently in. The matched_something
+     field of reg_info[reg_num] helps us tell whether or not we have
+     matched any of the pattern so far this time through the reg_num-th
+     subexpression.  These two fields get reset each time through any
+     loop their register is in.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, this is global.  */
+  register_info_type *reg_info;
+#endif
+
+  /* The following record the register info as found in the above
+     variables when we find a match better than any we've seen before.
+     This happens as we backtrack through the failure points, which in
+     turn happens only if we have not yet matched the entire string. */
+  unsigned best_regs_set = false;
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **best_regstart, **best_regend;
+#endif
+
+  /* Logically, this is `best_regend[0]'.  But we don't want to have to
+     allocate space for that if we're not allocating space for anything
+     else (see below).  Also, we never need info about register 0 for
+     any of the other register vectors, and it seems rather a kludge to
+     treat `best_regend' differently than the rest.  So we keep track of
+     the end of the best match so far in a separate variable.  We
+     initialize this to NULL so that when we backtrack the first time
+     and need to test it, it's not garbage.  */
+  const char *match_end = NULL;
+
+  /* This helps SET_REGS_MATCHED avoid doing redundant work.  */
+  int set_regs_matched_done = 0;
+
+  /* Used when we pop values we don't care about.  */
+#ifdef MATCH_MAY_ALLOCATE /* otherwise, these are global.  */
+  const char **reg_dummy;
+  register_info_type *reg_info_dummy;
+#endif
+
+#ifdef DEBUG
+  /* Counts the total number of registers pushed.  */
+  unsigned num_regs_pushed = 0;
+#endif
+
+  DEBUG_PRINT1 ("\n\nEntering re_match_2.\n");
+
+  INIT_FAIL_STACK ();
+
+#ifdef MATCH_MAY_ALLOCATE
+  /* Do not bother to initialize all the register variables if there are
+     no groups in the pattern, as it takes a fair amount of time.  If
+     there are groups, we include space for register 0 (the whole
+     pattern), even though we never use it, since it simplifies the
+     array indexing.  We should fix this.  */
+  if (bufp->re_nsub)
+    {
+      regstart = REGEX_TALLOC (num_regs, const char *);
+      regend = REGEX_TALLOC (num_regs, const char *);
+      old_regstart = REGEX_TALLOC (num_regs, const char *);
+      old_regend = REGEX_TALLOC (num_regs, const char *);
+      best_regstart = REGEX_TALLOC (num_regs, const char *);
+      best_regend = REGEX_TALLOC (num_regs, const char *);
+      reg_info = REGEX_TALLOC (num_regs, register_info_type);
+      reg_dummy = REGEX_TALLOC (num_regs, const char *);
+      reg_info_dummy = REGEX_TALLOC (num_regs, register_info_type);
+
+      if (!(regstart && regend && old_regstart && old_regend && reg_info
+            && best_regstart && best_regend && reg_dummy && reg_info_dummy))
+        {
+          FREE_VARIABLES ();
+          return -2;
+        }
+    }
+  else
+    {
+      /* We must initialize all our variables to NULL, so that
+         `FREE_VARIABLES' doesn't try to free them.  */
+      regstart = regend = old_regstart = old_regend = best_regstart
+        = best_regend = reg_dummy = NULL;
+      reg_info = reg_info_dummy = (register_info_type *) NULL;
+    }
+#endif /* MATCH_MAY_ALLOCATE */
+
+  /* The starting position is bogus.  */
+  if (pos < 0 || pos > size1 + size2)
+    {
+      FREE_VARIABLES ();
+      return -1;
+    }
+
+  /* Initialize subexpression text positions to -1 to mark ones that no
+     start_memory/stop_memory has been seen for. Also initialize the
+     register information struct.  */
+  for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
+    {
+      regstart[mcnt] = regend[mcnt]
+        = old_regstart[mcnt] = old_regend[mcnt] = REG_UNSET_VALUE;
+
+      REG_MATCH_NULL_STRING_P (reg_info[mcnt]) = MATCH_NULL_UNSET_VALUE;
+      IS_ACTIVE (reg_info[mcnt]) = 0;
+      MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+      EVER_MATCHED_SOMETHING (reg_info[mcnt]) = 0;
+    }
+
+  /* We move `string1' into `string2' if the latter's empty -- but not if
+     `string1' is null.  */
+  if (size2 == 0 && string1 != NULL)
+    {
+      string2 = string1;
+      size2 = size1;
+      string1 = 0;
+      size1 = 0;
+    }
+  end1 = string1 + size1;
+  end2 = string2 + size2;
+
+  /* Compute where to stop matching, within the two strings.  */
+  if (stop <= size1)
+    {
+      end_match_1 = string1 + stop;
+      end_match_2 = string2;
+    }
+  else
+    {
+      end_match_1 = end1;
+      end_match_2 = string2 + stop - size1;
+    }
+
+  /* `p' scans through the pattern as `d' scans through the data.
+     `dend' is the end of the input string that `d' points within.  `d'
+     is advanced into the following input string whenever necessary, but
+     this happens before fetching; therefore, at the beginning of the
+     loop, `d' can be pointing at the end of a string, but it cannot
+     equal `string2'.  */
+  if (size1 > 0 && pos <= size1)
+    {
+      d = string1 + pos;
+      dend = end_match_1;
+    }
+  else
+    {
+      d = string2 + pos - size1;
+      dend = end_match_2;
+    }
+
+  DEBUG_PRINT1 ("The compiled pattern is:\n");
+  DEBUG_PRINT_COMPILED_PATTERN (bufp, p, pend);
+  DEBUG_PRINT1 ("The string to match is: `");
+  DEBUG_PRINT_DOUBLE_STRING (d, string1, size1, string2, size2);
+  DEBUG_PRINT1 ("'\n");
+
+  /* This loops over pattern commands.  It exits by returning from the
+     function if the match is complete, or it drops through if the match
+     fails at this starting point in the input data.  */
+  for (;;)
+    {
+#ifdef _LIBC
+      DEBUG_PRINT2 ("\n%p: ", p);
+#else
+      DEBUG_PRINT2 ("\n0x%x: ", p);
+#endif
+
+      if (p == pend)
+	{ /* End of pattern means we might have succeeded.  */
+          DEBUG_PRINT1 ("end of pattern ... ");
+
+	  /* If we haven't matched the entire string, and we want the
+             longest match, try backtracking.  */
+          if (d != end_match_2)
+	    {
+	      /* 1 if this match ends in the same string (string1 or string2)
+		 as the best previous match.  */
+	      boolean same_str_p = (FIRST_STRING_P (match_end)
+				    == MATCHING_IN_FIRST_STRING);
+	      /* 1 if this match is the best seen so far.  */
+	      boolean best_match_p;
+
+	      /* AIX compiler got confused when this was combined
+		 with the previous declaration.  */
+	      if (same_str_p)
+		best_match_p = d > match_end;
+	      else
+		best_match_p = !MATCHING_IN_FIRST_STRING;
+
+              DEBUG_PRINT1 ("backtracking.\n");
+
+              if (!FAIL_STACK_EMPTY ())
+                { /* More failure points to try.  */
+
+                  /* If exceeds best match so far, save it.  */
+                  if (!best_regs_set || best_match_p)
+                    {
+                      best_regs_set = true;
+                      match_end = d;
+
+                      DEBUG_PRINT1 ("\nSAVING match as best so far.\n");
+
+                      for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
+                        {
+                          best_regstart[mcnt] = regstart[mcnt];
+                          best_regend[mcnt] = regend[mcnt];
+                        }
+                    }
+                  goto fail;
+                }
+
+              /* If no failure points, don't restore garbage.  And if
+                 last match is real best match, don't restore second
+                 best one. */
+              else if (best_regs_set && !best_match_p)
+                {
+  	        restore_best_regs:
+                  /* Restore best match.  It may happen that `dend ==
+                     end_match_1' while the restored d is in string2.
+                     For example, the pattern `x.*y.*z' against the
+                     strings `x-' and `y-z-', if the two strings are
+                     not consecutive in memory.  */
+                  DEBUG_PRINT1 ("Restoring best registers.\n");
+
+                  d = match_end;
+                  dend = ((d >= string1 && d <= end1)
+		           ? end_match_1 : end_match_2);
+
+		  for (mcnt = 1; (unsigned) mcnt < num_regs; mcnt++)
+		    {
+		      regstart[mcnt] = best_regstart[mcnt];
+		      regend[mcnt] = best_regend[mcnt];
+		    }
+                }
+            } /* d != end_match_2 */
+
+	succeed_label:
+          DEBUG_PRINT1 ("Accepting match.\n");
+
+          /* If caller wants register contents data back, do it.  */
+          if (regs && !bufp->no_sub)
+	    {
+              /* Have the register data arrays been allocated?  */
+              if (bufp->regs_allocated == REGS_UNALLOCATED)
+                { /* No.  So allocate them with malloc.  We need one
+                     extra element beyond `num_regs' for the `-1' marker
+                     GNU code uses.  */
+                  regs->num_regs = MAX (RE_NREGS, num_regs + 1);
+                  regs->start = TALLOC (regs->num_regs, regoff_t);
+                  regs->end = TALLOC (regs->num_regs, regoff_t);
+                  if (regs->start == NULL || regs->end == NULL)
+		    {
+		      FREE_VARIABLES ();
+		      return -2;
+		    }
+                  bufp->regs_allocated = REGS_REALLOCATE;
+                }
+              else if (bufp->regs_allocated == REGS_REALLOCATE)
+                { /* Yes.  If we need more elements than were already
+                     allocated, reallocate them.  If we need fewer, just
+                     leave it alone.  */
+                  if (regs->num_regs < num_regs + 1)
+                    {
+                      regs->num_regs = num_regs + 1;
+                      RETALLOC (regs->start, regs->num_regs, regoff_t);
+                      RETALLOC (regs->end, regs->num_regs, regoff_t);
+                      if (regs->start == NULL || regs->end == NULL)
+			{
+			  FREE_VARIABLES ();
+			  return -2;
+			}
+                    }
+                }
+              else
+		{
+		  /* These braces fend off a "empty body in an else-statement"
+		     warning under GCC when assert expands to nothing.  */
+		  assert (bufp->regs_allocated == REGS_FIXED);
+		}
+
+              /* Convert the pointer data in `regstart' and `regend' to
+                 indices.  Register zero has to be set differently,
+                 since we haven't kept track of any info for it.  */
+              if (regs->num_regs > 0)
+                {
+                  regs->start[0] = pos;
+                  regs->end[0] = (MATCHING_IN_FIRST_STRING
+				  ? ((regoff_t) (d - string1))
+			          : ((regoff_t) (d - string2 + size1)));
+                }
+
+              /* Go through the first `min (num_regs, regs->num_regs)'
+                 registers, since that is all we initialized.  */
+	      for (mcnt = 1; (unsigned) mcnt < MIN (num_regs, regs->num_regs);
+		   mcnt++)
+		{
+                  if (REG_UNSET (regstart[mcnt]) || REG_UNSET (regend[mcnt]))
+                    regs->start[mcnt] = regs->end[mcnt] = -1;
+                  else
+                    {
+		      regs->start[mcnt]
+			= (regoff_t) POINTER_TO_OFFSET (regstart[mcnt]);
+                      regs->end[mcnt]
+			= (regoff_t) POINTER_TO_OFFSET (regend[mcnt]);
+                    }
+		}
+
+              /* If the regs structure we return has more elements than
+                 were in the pattern, set the extra elements to -1.  If
+                 we (re)allocated the registers, this is the case,
+                 because we always allocate enough to have at least one
+                 -1 at the end.  */
+              for (mcnt = num_regs; (unsigned) mcnt < regs->num_regs; mcnt++)
+                regs->start[mcnt] = regs->end[mcnt] = -1;
+	    } /* regs && !bufp->no_sub */
+
+          DEBUG_PRINT4 ("%u failure points pushed, %u popped (%u remain).\n",
+                        nfailure_points_pushed, nfailure_points_popped,
+                        nfailure_points_pushed - nfailure_points_popped);
+          DEBUG_PRINT2 ("%u registers pushed.\n", num_regs_pushed);
+
+          mcnt = d - pos - (MATCHING_IN_FIRST_STRING
+			    ? string1
+			    : string2 - size1);
+
+          DEBUG_PRINT2 ("Returning %d from re_match_2.\n", mcnt);
+
+          FREE_VARIABLES ();
+          return mcnt;
+        }
+
+      /* Otherwise match next pattern command.  */
+      switch (SWITCH_ENUM_CAST ((re_opcode_t) *p++))
+	{
+        /* Ignore these.  Used to ignore the n of succeed_n's which
+           currently have n == 0.  */
+        case no_op:
+          DEBUG_PRINT1 ("EXECUTING no_op.\n");
+          break;
+
+	case succeed:
+          DEBUG_PRINT1 ("EXECUTING succeed.\n");
+	  goto succeed_label;
+
+        /* Match the next n pattern characters exactly.  The following
+           byte in the pattern defines n, and the n bytes after that
+           are the characters to match.  */
+	case exactn:
+	  mcnt = *p++;
+          DEBUG_PRINT2 ("EXECUTING exactn %d.\n", mcnt);
+
+          /* This is written out as an if-else so we don't waste time
+             testing `translate' inside the loop.  */
+          if (translate)
+	    {
+	      do
+		{
+		  PREFETCH ();
+		  if ((unsigned char) translate[(unsigned char) *d++]
+		      != (unsigned char) *p++)
+                    goto fail;
+		}
+	      while (--mcnt);
+	    }
+	  else
+	    {
+	      do
+		{
+		  PREFETCH ();
+		  if (*d++ != (char) *p++) goto fail;
+		}
+	      while (--mcnt);
+	    }
+	  SET_REGS_MATCHED ();
+          break;
+
+
+        /* Match any character except possibly a newline or a null.  */
+	case anychar:
+          DEBUG_PRINT1 ("EXECUTING anychar.\n");
+
+          PREFETCH ();
+
+          if ((!(bufp->syntax & RE_DOT_NEWLINE) && TRANSLATE (*d) == '\n')
+              || (bufp->syntax & RE_DOT_NOT_NULL && TRANSLATE (*d) == '\000'))
+	    goto fail;
+
+          SET_REGS_MATCHED ();
+          DEBUG_PRINT2 ("  Matched `%d'.\n", *d);
+          d++;
+	  break;
+
+
+	case charset:
+	case charset_not:
+	  {
+	    register unsigned char c;
+	    boolean not = (re_opcode_t) *(p - 1) == charset_not;
+
+            DEBUG_PRINT2 ("EXECUTING charset%s.\n", not ? "_not" : "");
+
+	    PREFETCH ();
+	    c = TRANSLATE (*d); /* The character to match.  */
+
+            /* Cast to `unsigned' instead of `unsigned char' in case the
+               bit list is a full 32 bytes long.  */
+	    if (c < (unsigned) (*p * BYTEWIDTH)
+		&& p[1 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+	      not = !not;
+
+	    p += 1 + *p;
+
+	    if (!not) goto fail;
+
+	    SET_REGS_MATCHED ();
+            d++;
+	    break;
+	  }
+
+
+        /* The beginning of a group is represented by start_memory.
+           The arguments are the register number in the next byte, and the
+           number of groups inner to this one in the next.  The text
+           matched within the group is recorded (in the internal
+           registers data structure) under the register number.  */
+        case start_memory:
+	  DEBUG_PRINT3 ("EXECUTING start_memory %d (%d):\n", *p, p[1]);
+
+          /* Find out if this group can match the empty string.  */
+	  p1 = p;		/* To send to group_match_null_string_p.  */
+
+          if (REG_MATCH_NULL_STRING_P (reg_info[*p]) == MATCH_NULL_UNSET_VALUE)
+            REG_MATCH_NULL_STRING_P (reg_info[*p])
+              = group_match_null_string_p (&p1, pend, reg_info);
+
+          /* Save the position in the string where we were the last time
+             we were at this open-group operator in case the group is
+             operated upon by a repetition operator, e.g., with `(a*)*b'
+             against `ab'; then we want to ignore where we are now in
+             the string in case this attempt to match fails.  */
+          old_regstart[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                             ? REG_UNSET (regstart[*p]) ? d : regstart[*p]
+                             : regstart[*p];
+	  DEBUG_PRINT2 ("  old_regstart: %d\n",
+			 POINTER_TO_OFFSET (old_regstart[*p]));
+
+          regstart[*p] = d;
+	  DEBUG_PRINT2 ("  regstart: %d\n", POINTER_TO_OFFSET (regstart[*p]));
+
+          IS_ACTIVE (reg_info[*p]) = 1;
+          MATCHED_SOMETHING (reg_info[*p]) = 0;
+
+	  /* Clear this whenever we change the register activity status.  */
+	  set_regs_matched_done = 0;
+
+          /* This is the new highest active register.  */
+          highest_active_reg = *p;
+
+          /* If nothing was active before, this is the new lowest active
+             register.  */
+          if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+            lowest_active_reg = *p;
+
+          /* Move past the register number and inner group count.  */
+          p += 2;
+	  just_past_start_mem = p;
+
+          break;
+
+
+        /* The stop_memory opcode represents the end of a group.  Its
+           arguments are the same as start_memory's: the register
+           number, and the number of inner groups.  */
+	case stop_memory:
+	  DEBUG_PRINT3 ("EXECUTING stop_memory %d (%d):\n", *p, p[1]);
+
+          /* We need to save the string position the last time we were at
+             this close-group operator in case the group is operated
+             upon by a repetition operator, e.g., with `((a*)*(b*)*)*'
+             against `aba'; then we want to ignore where we are now in
+             the string in case this attempt to match fails.  */
+          old_regend[*p] = REG_MATCH_NULL_STRING_P (reg_info[*p])
+                           ? REG_UNSET (regend[*p]) ? d : regend[*p]
+			   : regend[*p];
+	  DEBUG_PRINT2 ("      old_regend: %d\n",
+			 POINTER_TO_OFFSET (old_regend[*p]));
+
+          regend[*p] = d;
+	  DEBUG_PRINT2 ("      regend: %d\n", POINTER_TO_OFFSET (regend[*p]));
+
+          /* This register isn't active anymore.  */
+          IS_ACTIVE (reg_info[*p]) = 0;
+
+	  /* Clear this whenever we change the register activity status.  */
+	  set_regs_matched_done = 0;
+
+          /* If this was the only register active, nothing is active
+             anymore.  */
+          if (lowest_active_reg == highest_active_reg)
+            {
+              lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+              highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+            }
+          else
+            { /* We must scan for the new highest active register, since
+                 it isn't necessarily one less than now: consider
+                 (a(b)c(d(e)f)g).  When group 3 ends, after the f), the
+                 new highest active register is 1.  */
+              unsigned char r = *p - 1;
+              while (r > 0 && !IS_ACTIVE (reg_info[r]))
+                r--;
+
+              /* If we end up at register zero, that means that we saved
+                 the registers as the result of an `on_failure_jump', not
+                 a `start_memory', and we jumped to past the innermost
+                 `stop_memory'.  For example, in ((.)*) we save
+                 registers 1 and 2 as a result of the *, but when we pop
+                 back to the second ), we are at the stop_memory 1.
+                 Thus, nothing is active.  */
+	      if (r == 0)
+                {
+                  lowest_active_reg = NO_LOWEST_ACTIVE_REG;
+                  highest_active_reg = NO_HIGHEST_ACTIVE_REG;
+                }
+              else
+                highest_active_reg = r;
+            }
+
+          /* If just failed to match something this time around with a
+             group that's operated on by a repetition operator, try to
+             force exit from the ``loop'', and restore the register
+             information for this group that we had before trying this
+             last match.  */
+          if ((!MATCHED_SOMETHING (reg_info[*p])
+               || just_past_start_mem == p - 1)
+	      && (p + 2) < pend)
+            {
+              boolean is_a_jump_n = false;
+
+              p1 = p + 2;
+              mcnt = 0;
+              switch ((re_opcode_t) *p1++)
+                {
+                  case jump_n:
+		    is_a_jump_n = true;
+                  case pop_failure_jump:
+		  case maybe_pop_jump:
+		  case jump:
+		  case dummy_failure_jump:
+                    EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+		    if (is_a_jump_n)
+		      p1 += 2;
+                    break;
+
+                  default:
+                    /* do nothing */ ;
+                }
+	      p1 += mcnt;
+
+              /* If the next operation is a jump backwards in the pattern
+	         to an on_failure_jump right before the start_memory
+                 corresponding to this stop_memory, exit from the loop
+                 by forcing a failure after pushing on the stack the
+                 on_failure_jump's jump in the pattern, and d.  */
+              if (mcnt < 0 && (re_opcode_t) *p1 == on_failure_jump
+                  && (re_opcode_t) p1[3] == start_memory && p1[4] == *p)
+		{
+                  /* If this group ever matched anything, then restore
+                     what its registers were before trying this last
+                     failed match, e.g., with `(a*)*b' against `ab' for
+                     regstart[1], and, e.g., with `((a*)*(b*)*)*'
+                     against `aba' for regend[3].
+
+                     Also restore the registers for inner groups for,
+                     e.g., `((a*)(b*))*' against `aba' (register 3 would
+                     otherwise get trashed).  */
+
+                  if (EVER_MATCHED_SOMETHING (reg_info[*p]))
+		    {
+		      unsigned r;
+
+                      EVER_MATCHED_SOMETHING (reg_info[*p]) = 0;
+
+		      /* Restore this and inner groups' (if any) registers.  */
+                      for (r = *p; r < (unsigned) *p + (unsigned) *(p + 1);
+			   r++)
+                        {
+                          regstart[r] = old_regstart[r];
+
+                          /* xx why this test?  */
+                          if (old_regend[r] >= regstart[r])
+                            regend[r] = old_regend[r];
+                        }
+                    }
+		  p1++;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  PUSH_FAILURE_POINT (p1 + mcnt, d, -2);
+
+                  goto fail;
+                }
+            }
+
+          /* Move past the register number and the inner group count.  */
+          p += 2;
+          break;
+
+
+	/* \<digit> has been turned into a `duplicate' command which is
+           followed by the numeric value of <digit> as the register number.  */
+        case duplicate:
+	  {
+	    register const char *d2, *dend2;
+	    int regno = *p++;   /* Get which register to match against.  */
+	    DEBUG_PRINT2 ("EXECUTING duplicate %d.\n", regno);
+
+	    /* Can't back reference a group which we've never matched.  */
+            if (REG_UNSET (regstart[regno]) || REG_UNSET (regend[regno]))
+              goto fail;
+
+            /* Where in input to try to start matching.  */
+            d2 = regstart[regno];
+
+            /* Where to stop matching; if both the place to start and
+               the place to stop matching are in the same string, then
+               set to the place to stop, otherwise, for now have to use
+               the end of the first string.  */
+
+            dend2 = ((FIRST_STRING_P (regstart[regno])
+		      == FIRST_STRING_P (regend[regno]))
+		     ? regend[regno] : end_match_1);
+	    for (;;)
+	      {
+		/* If necessary, advance to next segment in register
+                   contents.  */
+		while (d2 == dend2)
+		  {
+		    if (dend2 == end_match_2) break;
+		    if (dend2 == regend[regno]) break;
+
+                    /* End of string1 => advance to string2. */
+                    d2 = string2;
+                    dend2 = regend[regno];
+		  }
+		/* At end of register contents => success */
+		if (d2 == dend2) break;
+
+		/* If necessary, advance to next segment in data.  */
+		PREFETCH ();
+
+		/* How many characters left in this segment to match.  */
+		mcnt = dend - d;
+
+		/* Want how many consecutive characters we can match in
+                   one shot, so, if necessary, adjust the count.  */
+                if (mcnt > dend2 - d2)
+		  mcnt = dend2 - d2;
+
+		/* Compare that many; failure if mismatch, else move
+                   past them.  */
+		if (translate
+                    ? bcmp_translate (d, d2, mcnt, translate)
+                    : memcmp (d, d2, mcnt))
+		  goto fail;
+		d += mcnt, d2 += mcnt;
+
+		/* Do this because we've match some characters.  */
+		SET_REGS_MATCHED ();
+	      }
+	  }
+	  break;
+
+
+        /* begline matches the empty string at the beginning of the string
+           (unless `not_bol' is set in `bufp'), and, if
+           `newline_anchor' is set, after newlines.  */
+	case begline:
+          DEBUG_PRINT1 ("EXECUTING begline.\n");
+
+          if (AT_STRINGS_BEG (d))
+            {
+              if (!bufp->not_bol) break;
+            }
+          else if (d[-1] == '\n' && bufp->newline_anchor)
+            {
+              break;
+            }
+          /* In all other cases, we fail.  */
+          goto fail;
+
+
+        /* endline is the dual of begline.  */
+	case endline:
+          DEBUG_PRINT1 ("EXECUTING endline.\n");
+
+          if (AT_STRINGS_END (d))
+            {
+              if (!bufp->not_eol) break;
+            }
+
+          /* We have to ``prefetch'' the next character.  */
+          else if ((d == end1 ? *string2 : *d) == '\n'
+                   && bufp->newline_anchor)
+            {
+              break;
+            }
+          goto fail;
+
+
+	/* Match at the very beginning of the data.  */
+        case begbuf:
+          DEBUG_PRINT1 ("EXECUTING begbuf.\n");
+          if (AT_STRINGS_BEG (d))
+            break;
+          goto fail;
+
+
+	/* Match at the very end of the data.  */
+        case endbuf:
+          DEBUG_PRINT1 ("EXECUTING endbuf.\n");
+	  if (AT_STRINGS_END (d))
+	    break;
+          goto fail;
+
+
+        /* on_failure_keep_string_jump is used to optimize `.*\n'.  It
+           pushes NULL as the value for the string on the stack.  Then
+           `pop_failure_point' will keep the current value for the
+           string, instead of restoring it.  To see why, consider
+           matching `foo\nbar' against `.*\n'.  The .* matches the foo;
+           then the . fails against the \n.  But the next thing we want
+           to do is match the \n against the \n; if we restored the
+           string value, we would be back at the foo.
+
+           Because this is used only in specific cases, we don't need to
+           check all the things that `on_failure_jump' does, to make
+           sure the right things get saved on the stack.  Hence we don't
+           share its code.  The only reason to push anything on the
+           stack at all is that otherwise we would have to change
+           `anychar's code to do something besides goto fail in this
+           case; that seems worse than this.  */
+        case on_failure_keep_string_jump:
+          DEBUG_PRINT1 ("EXECUTING on_failure_keep_string_jump");
+
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+#ifdef _LIBC
+          DEBUG_PRINT3 (" %d (to %p):\n", mcnt, p + mcnt);
+#else
+          DEBUG_PRINT3 (" %d (to 0x%x):\n", mcnt, p + mcnt);
+#endif
+
+          PUSH_FAILURE_POINT (p + mcnt, NULL, -2);
+          break;
+
+
+	/* Uses of on_failure_jump:
+
+           Each alternative starts with an on_failure_jump that points
+           to the beginning of the next alternative.  Each alternative
+           except the last ends with a jump that in effect jumps past
+           the rest of the alternatives.  (They really jump to the
+           ending jump of the following alternative, because tensioning
+           these jumps is a hassle.)
+
+           Repeats start with an on_failure_jump that points past both
+           the repetition text and either the following jump or
+           pop_failure_jump back to this on_failure_jump.  */
+	case on_failure_jump:
+        on_failure:
+          DEBUG_PRINT1 ("EXECUTING on_failure_jump");
+
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+#ifdef _LIBC
+          DEBUG_PRINT3 (" %d (to %p)", mcnt, p + mcnt);
+#else
+          DEBUG_PRINT3 (" %d (to 0x%x)", mcnt, p + mcnt);
+#endif
+
+          /* If this on_failure_jump comes right before a group (i.e.,
+             the original * applied to a group), save the information
+             for that group and all inner ones, so that if we fail back
+             to this point, the group's information will be correct.
+             For example, in \(a*\)*\1, we need the preceding group,
+             and in \(zz\(a*\)b*\)\2, we need the inner group.  */
+
+          /* We can't use `p' to check ahead because we push
+             a failure point to `p + mcnt' after we do this.  */
+          p1 = p;
+
+          /* We need to skip no_op's before we look for the
+             start_memory in case this on_failure_jump is happening as
+             the result of a completed succeed_n, as in \(a\)\{1,3\}b\1
+             against aba.  */
+          while (p1 < pend && (re_opcode_t) *p1 == no_op)
+            p1++;
+
+          if (p1 < pend && (re_opcode_t) *p1 == start_memory)
+            {
+              /* We have a new highest active register now.  This will
+                 get reset at the start_memory we are about to get to,
+                 but we will have saved all the registers relevant to
+                 this repetition op, as described above.  */
+              highest_active_reg = *(p1 + 1) + *(p1 + 2);
+              if (lowest_active_reg == NO_LOWEST_ACTIVE_REG)
+                lowest_active_reg = *(p1 + 1);
+            }
+
+          DEBUG_PRINT1 (":\n");
+          PUSH_FAILURE_POINT (p + mcnt, d, -2);
+          break;
+
+
+        /* A smart repeat ends with `maybe_pop_jump'.
+	   We change it to either `pop_failure_jump' or `jump'.  */
+        case maybe_pop_jump:
+          EXTRACT_NUMBER_AND_INCR (mcnt, p);
+          DEBUG_PRINT2 ("EXECUTING maybe_pop_jump %d.\n", mcnt);
+          {
+	    register unsigned char *p2 = p;
+
+            /* Compare the beginning of the repeat with what in the
+               pattern follows its end. If we can establish that there
+               is nothing that they would both match, i.e., that we
+               would have to backtrack because of (as in, e.g., `a*a')
+               then we can change to pop_failure_jump, because we'll
+               never have to backtrack.
+
+               This is not true in the case of alternatives: in
+               `(a|ab)*' we do need to backtrack to the `ab' alternative
+               (e.g., if the string was `ab').  But instead of trying to
+               detect that here, the alternative has put on a dummy
+               failure point which is what we will end up popping.  */
+
+	    /* Skip over open/close-group commands.
+	       If what follows this loop is a ...+ construct,
+	       look at what begins its body, since we will have to
+	       match at least one of that.  */
+	    while (1)
+	      {
+		if (p2 + 2 < pend
+		    && ((re_opcode_t) *p2 == stop_memory
+			|| (re_opcode_t) *p2 == start_memory))
+		  p2 += 3;
+		else if (p2 + 6 < pend
+			 && (re_opcode_t) *p2 == dummy_failure_jump)
+		  p2 += 6;
+		else
+		  break;
+	      }
+
+	    p1 = p + mcnt;
+	    /* p1[0] ... p1[2] are the `on_failure_jump' corresponding
+	       to the `maybe_finalize_jump' of this case.  Examine what
+	       follows.  */
+
+            /* If we're at the end of the pattern, we can change.  */
+            if (p2 == pend)
+	      {
+		/* Consider what happens when matching ":\(.*\)"
+		   against ":/".  I don't really understand this code
+		   yet.  */
+  	        p[-3] = (unsigned char) pop_failure_jump;
+                DEBUG_PRINT1
+                  ("  End of pattern: change to `pop_failure_jump'.\n");
+              }
+
+            else if ((re_opcode_t) *p2 == exactn
+		     || (bufp->newline_anchor && (re_opcode_t) *p2 == endline))
+	      {
+		register unsigned char c
+                  = *p2 == (unsigned char) endline ? '\n' : p2[2];
+
+                if ((re_opcode_t) p1[3] == exactn && p1[5] != c)
+                  {
+  		    p[-3] = (unsigned char) pop_failure_jump;
+                    DEBUG_PRINT3 ("  %c != %c => pop_failure_jump.\n",
+                                  c, p1[5]);
+                  }
+
+		else if ((re_opcode_t) p1[3] == charset
+			 || (re_opcode_t) p1[3] == charset_not)
+		  {
+		    int not = (re_opcode_t) p1[3] == charset_not;
+
+		    if (c < (unsigned char) (p1[4] * BYTEWIDTH)
+			&& p1[5 + c / BYTEWIDTH] & (1 << (c % BYTEWIDTH)))
+		      not = !not;
+
+                    /* `not' is equal to 1 if c would match, which means
+                        that we can't change to pop_failure_jump.  */
+		    if (!not)
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+	      }
+            else if ((re_opcode_t) *p2 == charset)
+	      {
+		/* We win if the first character of the loop is not part
+                   of the charset.  */
+                if ((re_opcode_t) p1[3] == exactn
+ 		    && ! ((int) p2[1] * BYTEWIDTH > (int) p1[5]
+ 			  && (p2[2 + p1[5] / BYTEWIDTH]
+ 			      & (1 << (p1[5] % BYTEWIDTH)))))
+		  {
+		    p[-3] = (unsigned char) pop_failure_jump;
+		    DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                  }
+
+		else if ((re_opcode_t) p1[3] == charset_not)
+		  {
+		    int idx;
+		    /* We win if the charset_not inside the loop
+		       lists every character listed in the charset after.  */
+		    for (idx = 0; idx < (int) p2[1]; idx++)
+		      if (! (p2[2 + idx] == 0
+			     || (idx < (int) p1[4]
+				 && ((p2[2 + idx] & ~ p1[5 + idx]) == 0))))
+			break;
+
+		    if (idx == p2[1])
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+		else if ((re_opcode_t) p1[3] == charset)
+		  {
+		    int idx;
+		    /* We win if the charset inside the loop
+		       has no overlap with the one after the loop.  */
+		    for (idx = 0;
+			 idx < (int) p2[1] && idx < (int) p1[4];
+			 idx++)
+		      if ((p2[2 + idx] & p1[5 + idx]) != 0)
+			break;
+
+		    if (idx == p2[1] || idx == p1[4])
+                      {
+  		        p[-3] = (unsigned char) pop_failure_jump;
+                        DEBUG_PRINT1 ("  No match => pop_failure_jump.\n");
+                      }
+		  }
+	      }
+	  }
+	  p -= 2;		/* Point at relative address again.  */
+	  if ((re_opcode_t) p[-1] != pop_failure_jump)
+	    {
+	      p[-1] = (unsigned char) jump;
+              DEBUG_PRINT1 ("  Match => jump.\n");
+	      goto unconditional_jump;
+	    }
+        /* Note fall through.  */
+
+
+	/* The end of a simple repeat has a pop_failure_jump back to
+           its matching on_failure_jump, where the latter will push a
+           failure point.  The pop_failure_jump takes off failure
+           points put on by this pop_failure_jump's matching
+           on_failure_jump; we got through the pattern to here from the
+           matching on_failure_jump, so didn't fail.  */
+        case pop_failure_jump:
+          {
+            /* We need to pass separate storage for the lowest and
+               highest registers, even though we don't care about the
+               actual values.  Otherwise, we will restore only one
+               register from the stack, since lowest will == highest in
+               `pop_failure_point'.  */
+            active_reg_t dummy_low_reg, dummy_high_reg;
+            unsigned char *pdummy;
+            const char *sdummy;
+
+            DEBUG_PRINT1 ("EXECUTING pop_failure_jump.\n");
+            POP_FAILURE_POINT (sdummy, pdummy,
+                               dummy_low_reg, dummy_high_reg,
+                               reg_dummy, reg_dummy, reg_info_dummy);
+          }
+	  /* Note fall through.  */
+
+	unconditional_jump:
+#ifdef _LIBC
+	  DEBUG_PRINT2 ("\n%p: ", p);
+#else
+	  DEBUG_PRINT2 ("\n0x%x: ", p);
+#endif
+          /* Note fall through.  */
+
+        /* Unconditionally jump (without popping any failure points).  */
+        case jump:
+	  EXTRACT_NUMBER_AND_INCR (mcnt, p);	/* Get the amount to jump.  */
+          DEBUG_PRINT2 ("EXECUTING jump %d ", mcnt);
+	  p += mcnt;				/* Do the jump.  */
+#ifdef _LIBC
+          DEBUG_PRINT2 ("(to %p).\n", p);
+#else
+          DEBUG_PRINT2 ("(to 0x%x).\n", p);
+#endif
+	  break;
+
+
+        /* We need this opcode so we can detect where alternatives end
+           in `group_match_null_string_p' et al.  */
+        case jump_past_alt:
+          DEBUG_PRINT1 ("EXECUTING jump_past_alt.\n");
+          goto unconditional_jump;
+
+
+        /* Normally, the on_failure_jump pushes a failure point, which
+           then gets popped at pop_failure_jump.  We will end up at
+           pop_failure_jump, also, and with a pattern of, say, `a+', we
+           are skipping over the on_failure_jump, so we have to push
+           something meaningless for pop_failure_jump to pop.  */
+        case dummy_failure_jump:
+          DEBUG_PRINT1 ("EXECUTING dummy_failure_jump.\n");
+          /* It doesn't matter what we push for the string here.  What
+             the code at `fail' tests is the value for the pattern.  */
+          PUSH_FAILURE_POINT (NULL, NULL, -2);
+          goto unconditional_jump;
+
+
+        /* At the end of an alternative, we need to push a dummy failure
+           point in case we are followed by a `pop_failure_jump', because
+           we don't want the failure point for the alternative to be
+           popped.  For example, matching `(a|ab)*' against `aab'
+           requires that we match the `ab' alternative.  */
+        case push_dummy_failure:
+          DEBUG_PRINT1 ("EXECUTING push_dummy_failure.\n");
+          /* See comments just above at `dummy_failure_jump' about the
+             two zeroes.  */
+          PUSH_FAILURE_POINT (NULL, NULL, -2);
+          break;
+
+        /* Have to succeed matching what follows at least n times.
+           After that, handle like `on_failure_jump'.  */
+        case succeed_n:
+          EXTRACT_NUMBER (mcnt, p + 2);
+          DEBUG_PRINT2 ("EXECUTING succeed_n %d.\n", mcnt);
+
+          assert (mcnt >= 0);
+          /* Originally, this is how many times we HAVE to succeed.  */
+          if (mcnt > 0)
+            {
+               mcnt--;
+	       p += 2;
+               STORE_NUMBER_AND_INCR (p, mcnt);
+#ifdef _LIBC
+               DEBUG_PRINT3 ("  Setting %p to %d.\n", p - 2, mcnt);
+#else
+               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p - 2, mcnt);
+#endif
+            }
+	  else if (mcnt == 0)
+            {
+#ifdef _LIBC
+              DEBUG_PRINT2 ("  Setting two bytes from %p to no_op.\n", p+2);
+#else
+              DEBUG_PRINT2 ("  Setting two bytes from 0x%x to no_op.\n", p+2);
+#endif
+	      p[2] = (unsigned char) no_op;
+              p[3] = (unsigned char) no_op;
+              goto on_failure;
+            }
+          break;
+
+        case jump_n:
+          EXTRACT_NUMBER (mcnt, p + 2);
+          DEBUG_PRINT2 ("EXECUTING jump_n %d.\n", mcnt);
+
+          /* Originally, this is how many times we CAN jump.  */
+          if (mcnt)
+            {
+               mcnt--;
+               STORE_NUMBER (p + 2, mcnt);
+#ifdef _LIBC
+               DEBUG_PRINT3 ("  Setting %p to %d.\n", p + 2, mcnt);
+#else
+               DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p + 2, mcnt);
+#endif
+	       goto unconditional_jump;
+            }
+          /* If don't have to jump any more, skip over the rest of command.  */
+	  else
+	    p += 4;
+          break;
+
+	case set_number_at:
+	  {
+            DEBUG_PRINT1 ("EXECUTING set_number_at.\n");
+
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+            p1 = p + mcnt;
+            EXTRACT_NUMBER_AND_INCR (mcnt, p);
+#ifdef _LIBC
+            DEBUG_PRINT3 ("  Setting %p to %d.\n", p1, mcnt);
+#else
+            DEBUG_PRINT3 ("  Setting 0x%x to %d.\n", p1, mcnt);
+#endif
+	    STORE_NUMBER (p1, mcnt);
+            break;
+          }
+
+#if 0
+	/* The DEC Alpha C compiler 3.x generates incorrect code for the
+	   test  WORDCHAR_P (d - 1) != WORDCHAR_P (d)  in the expansion of
+	   AT_WORD_BOUNDARY, so this code is disabled.  Expanding the
+	   macro and introducing temporary variables works around the bug.  */
+
+	case wordbound:
+	  DEBUG_PRINT1 ("EXECUTING wordbound.\n");
+	  if (AT_WORD_BOUNDARY (d))
+	    break;
+	  goto fail;
+
+	case notwordbound:
+	  DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
+	  if (AT_WORD_BOUNDARY (d))
+	    goto fail;
+	  break;
+#else
+	case wordbound:
+	{
+	  boolean prevchar, thischar;
+
+	  DEBUG_PRINT1 ("EXECUTING wordbound.\n");
+	  if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
+	    break;
+
+	  prevchar = WORDCHAR_P (d - 1);
+	  thischar = WORDCHAR_P (d);
+	  if (prevchar != thischar)
+	    break;
+	  goto fail;
+	}
+
+      case notwordbound:
+	{
+	  boolean prevchar, thischar;
+
+	  DEBUG_PRINT1 ("EXECUTING notwordbound.\n");
+	  if (AT_STRINGS_BEG (d) || AT_STRINGS_END (d))
+	    goto fail;
+
+	  prevchar = WORDCHAR_P (d - 1);
+	  thischar = WORDCHAR_P (d);
+	  if (prevchar != thischar)
+	    goto fail;
+	  break;
+	}
+#endif
+
+	case wordbeg:
+          DEBUG_PRINT1 ("EXECUTING wordbeg.\n");
+	  if (WORDCHAR_P (d) && (AT_STRINGS_BEG (d) || !WORDCHAR_P (d - 1)))
+	    break;
+          goto fail;
+
+	case wordend:
+          DEBUG_PRINT1 ("EXECUTING wordend.\n");
+	  if (!AT_STRINGS_BEG (d) && WORDCHAR_P (d - 1)
+              && (!WORDCHAR_P (d) || AT_STRINGS_END (d)))
+	    break;
+          goto fail;
+
+#ifdef emacs
+  	case before_dot:
+          DEBUG_PRINT1 ("EXECUTING before_dot.\n");
+ 	  if (PTR_CHAR_POS ((unsigned char *) d) >= point)
+  	    goto fail;
+  	  break;
+
+  	case at_dot:
+          DEBUG_PRINT1 ("EXECUTING at_dot.\n");
+ 	  if (PTR_CHAR_POS ((unsigned char *) d) != point)
+  	    goto fail;
+  	  break;
+
+  	case after_dot:
+          DEBUG_PRINT1 ("EXECUTING after_dot.\n");
+          if (PTR_CHAR_POS ((unsigned char *) d) <= point)
+  	    goto fail;
+  	  break;
+
+	case syntaxspec:
+          DEBUG_PRINT2 ("EXECUTING syntaxspec %d.\n", mcnt);
+	  mcnt = *p++;
+	  goto matchsyntax;
+
+        case wordchar:
+          DEBUG_PRINT1 ("EXECUTING Emacs wordchar.\n");
+	  mcnt = (int) Sword;
+        matchsyntax:
+	  PREFETCH ();
+	  /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
+	  d++;
+	  if (SYNTAX (d[-1]) != (enum syntaxcode) mcnt)
+	    goto fail;
+          SET_REGS_MATCHED ();
+	  break;
+
+	case notsyntaxspec:
+          DEBUG_PRINT2 ("EXECUTING notsyntaxspec %d.\n", mcnt);
+	  mcnt = *p++;
+	  goto matchnotsyntax;
+
+        case notwordchar:
+          DEBUG_PRINT1 ("EXECUTING Emacs notwordchar.\n");
+	  mcnt = (int) Sword;
+        matchnotsyntax:
+	  PREFETCH ();
+	  /* Can't use *d++ here; SYNTAX may be an unsafe macro.  */
+	  d++;
+	  if (SYNTAX (d[-1]) == (enum syntaxcode) mcnt)
+	    goto fail;
+	  SET_REGS_MATCHED ();
+          break;
+
+#else /* not emacs */
+	case wordchar:
+          DEBUG_PRINT1 ("EXECUTING non-Emacs wordchar.\n");
+	  PREFETCH ();
+          if (!WORDCHAR_P (d))
+            goto fail;
+	  SET_REGS_MATCHED ();
+          d++;
+	  break;
+
+	case notwordchar:
+          DEBUG_PRINT1 ("EXECUTING non-Emacs notwordchar.\n");
+	  PREFETCH ();
+	  if (WORDCHAR_P (d))
+            goto fail;
+          SET_REGS_MATCHED ();
+          d++;
+	  break;
+#endif /* not emacs */
+
+        default:
+          abort ();
+	}
+      continue;  /* Successfully executed one pattern command; keep going.  */
+
+
+    /* We goto here if a matching operation fails. */
+    fail:
+      if (!FAIL_STACK_EMPTY ())
+	{ /* A restart point is known.  Restore to that state.  */
+          DEBUG_PRINT1 ("\nFAIL:\n");
+          POP_FAILURE_POINT (d, p,
+                             lowest_active_reg, highest_active_reg,
+                             regstart, regend, reg_info);
+
+          /* If this failure point is a dummy, try the next one.  */
+          if (!p)
+	    goto fail;
+
+          /* If we failed to the end of the pattern, don't examine *p.  */
+	  assert (p <= pend);
+          if (p < pend)
+            {
+              boolean is_a_jump_n = false;
+
+              /* If failed to a backwards jump that's part of a repetition
+                 loop, need to pop this failure point and use the next one.  */
+              switch ((re_opcode_t) *p)
+                {
+                case jump_n:
+                  is_a_jump_n = true;
+                case maybe_pop_jump:
+                case pop_failure_jump:
+                case jump:
+                  p1 = p + 1;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  p1 += mcnt;
+
+                  if ((is_a_jump_n && (re_opcode_t) *p1 == succeed_n)
+                      || (!is_a_jump_n
+                          && (re_opcode_t) *p1 == on_failure_jump))
+                    goto fail;
+                  break;
+                default:
+                  /* do nothing */ ;
+                }
+            }
+
+          if (d >= string1 && d <= end1)
+	    dend = end_match_1;
+        }
+      else
+        break;   /* Matching at this starting point really fails.  */
+    } /* for (;;) */
+
+  if (best_regs_set)
+    goto restore_best_regs;
+
+  FREE_VARIABLES ();
+
+  return -1;         			/* Failure to match.  */
+} /* re_match_2 */
+
+/* Subroutine definitions for re_match_2.  */
+
+
+/* We are passed P pointing to a register number after a start_memory.
+
+   Return true if the pattern up to the corresponding stop_memory can
+   match the empty string, and false otherwise.
+
+   If we find the matching stop_memory, sets P to point to one past its number.
+   Otherwise, sets P to an undefined byte less than or equal to END.
+
+   We don't handle duplicates properly (yet).  */
+
+static boolean
+group_match_null_string_p (p, end, reg_info)
+    unsigned char **p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  /* Point to after the args to the start_memory.  */
+  unsigned char *p1 = *p + 2;
+
+  while (p1 < end)
+    {
+      /* Skip over opcodes that can match nothing, and return true or
+	 false, as appropriate, when we get to one that can't, or to the
+         matching stop_memory.  */
+
+      switch ((re_opcode_t) *p1)
+        {
+        /* Could be either a loop or a series of alternatives.  */
+        case on_failure_jump:
+          p1++;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+
+          /* If the next operation is not a jump backwards in the
+	     pattern.  */
+
+	  if (mcnt >= 0)
+	    {
+              /* Go through the on_failure_jumps of the alternatives,
+                 seeing if any of the alternatives cannot match nothing.
+                 The last alternative starts with only a jump,
+                 whereas the rest start with on_failure_jump and end
+                 with a jump, e.g., here is the pattern for `a|b|c':
+
+                 /on_failure_jump/0/6/exactn/1/a/jump_past_alt/0/6
+                 /on_failure_jump/0/6/exactn/1/b/jump_past_alt/0/3
+                 /exactn/1/c
+
+                 So, we have to first go through the first (n-1)
+                 alternatives and then deal with the last one separately.  */
+
+
+              /* Deal with the first (n-1) alternatives, which start
+                 with an on_failure_jump (see above) that jumps to right
+                 past a jump_past_alt.  */
+
+              while ((re_opcode_t) p1[mcnt-3] == jump_past_alt)
+                {
+                  /* `mcnt' holds how many bytes long the alternative
+                     is, including the ending `jump_past_alt' and
+                     its number.  */
+
+                  if (!alt_match_null_string_p (p1, p1 + mcnt - 3,
+				                      reg_info))
+                    return false;
+
+                  /* Move to right after this alternative, including the
+		     jump_past_alt.  */
+                  p1 += mcnt;
+
+                  /* Break if it's the beginning of an n-th alternative
+                     that doesn't begin with an on_failure_jump.  */
+                  if ((re_opcode_t) *p1 != on_failure_jump)
+                    break;
+
+		  /* Still have to check that it's not an n-th
+		     alternative that starts with an on_failure_jump.  */
+		  p1++;
+                  EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+                  if ((re_opcode_t) p1[mcnt-3] != jump_past_alt)
+                    {
+		      /* Get to the beginning of the n-th alternative.  */
+                      p1 -= 3;
+                      break;
+                    }
+                }
+
+              /* Deal with the last alternative: go back and get number
+                 of the `jump_past_alt' just before it.  `mcnt' contains
+                 the length of the alternative.  */
+              EXTRACT_NUMBER (mcnt, p1 - 2);
+
+              if (!alt_match_null_string_p (p1, p1 + mcnt, reg_info))
+                return false;
+
+              p1 += mcnt;	/* Get past the n-th alternative.  */
+            } /* if mcnt > 0 */
+          break;
+
+
+        case stop_memory:
+	  assert (p1[1] == **p);
+          *p = p1 + 2;
+          return true;
+
+
+        default:
+          if (!common_op_match_null_string_p (&p1, end, reg_info))
+            return false;
+        }
+    } /* while p1 < end */
+
+  return false;
+} /* group_match_null_string_p */
+
+
+/* Similar to group_match_null_string_p, but doesn't deal with alternatives:
+   It expects P to be the first byte of a single alternative and END one
+   byte past the last. The alternative can contain groups.  */
+
+static boolean
+alt_match_null_string_p (p, end, reg_info)
+    unsigned char *p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  unsigned char *p1 = p;
+
+  while (p1 < end)
+    {
+      /* Skip over opcodes that can match nothing, and break when we get
+         to one that can't.  */
+
+      switch ((re_opcode_t) *p1)
+        {
+	/* It's a loop.  */
+        case on_failure_jump:
+          p1++;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          p1 += mcnt;
+          break;
+
+	default:
+          if (!common_op_match_null_string_p (&p1, end, reg_info))
+            return false;
+        }
+    }  /* while p1 < end */
+
+  return true;
+} /* alt_match_null_string_p */
+
+
+/* Deals with the ops common to group_match_null_string_p and
+   alt_match_null_string_p.
+
+   Sets P to one after the op and its arguments, if any.  */
+
+static boolean
+common_op_match_null_string_p (p, end, reg_info)
+    unsigned char **p, *end;
+    register_info_type *reg_info;
+{
+  int mcnt;
+  boolean ret;
+  int reg_no;
+  unsigned char *p1 = *p;
+
+  switch ((re_opcode_t) *p1++)
+    {
+    case no_op:
+    case begline:
+    case endline:
+    case begbuf:
+    case endbuf:
+    case wordbeg:
+    case wordend:
+    case wordbound:
+    case notwordbound:
+#ifdef emacs
+    case before_dot:
+    case at_dot:
+    case after_dot:
+#endif
+      break;
+
+    case start_memory:
+      reg_no = *p1;
+      assert (reg_no > 0 && reg_no <= MAX_REGNUM);
+      ret = group_match_null_string_p (&p1, end, reg_info);
+
+      /* Have to set this here in case we're checking a group which
+         contains a group and a back reference to it.  */
+
+      if (REG_MATCH_NULL_STRING_P (reg_info[reg_no]) == MATCH_NULL_UNSET_VALUE)
+        REG_MATCH_NULL_STRING_P (reg_info[reg_no]) = ret;
+
+      if (!ret)
+        return false;
+      break;
+
+    /* If this is an optimized succeed_n for zero times, make the jump.  */
+    case jump:
+      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+      if (mcnt >= 0)
+        p1 += mcnt;
+      else
+        return false;
+      break;
+
+    case succeed_n:
+      /* Get to the number of times to succeed.  */
+      p1 += 2;
+      EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+
+      if (mcnt == 0)
+        {
+          p1 -= 4;
+          EXTRACT_NUMBER_AND_INCR (mcnt, p1);
+          p1 += mcnt;
+        }
+      else
+        return false;
+      break;
+
+    case duplicate:
+      if (!REG_MATCH_NULL_STRING_P (reg_info[*p1]))
+        return false;
+      break;
+
+    case set_number_at:
+      p1 += 4;
+
+    default:
+      /* All other opcodes mean we cannot match the empty string.  */
+      return false;
+  }
+
+  *p = p1;
+  return true;
+} /* common_op_match_null_string_p */
+
+
+/* Return zero if TRANSLATE[S1] and TRANSLATE[S2] are identical for LEN
+   bytes; nonzero otherwise.  */
+
+static int
+bcmp_translate (s1, s2, len, translate)
+     const char *s1, *s2;
+     register int len;
+     RE_TRANSLATE_TYPE translate;
+{
+  register const unsigned char *p1 = (const unsigned char *) s1;
+  register const unsigned char *p2 = (const unsigned char *) s2;
+  while (len)
+    {
+      if (translate[*p1++] != translate[*p2++]) return 1;
+      len--;
+    }
+  return 0;
+}
+
+/* Entry points for GNU code.  */
+
+/* re_compile_pattern is the GNU regular expression compiler: it
+   compiles PATTERN (of length SIZE) and puts the result in BUFP.
+   Returns 0 if the pattern was valid, otherwise an error string.
+
+   Assumes the `allocated' (and perhaps `buffer') and `translate' fields
+   are set in BUFP on entry.
+
+   We call regex_compile to do the actual compilation.  */
+
+const char *
+re_compile_pattern (pattern, length, bufp)
+     const char *pattern;
+     size_t length;
+     struct re_pattern_buffer *bufp;
+{
+  reg_errcode_t ret;
+
+  /* GNU code is written to assume at least RE_NREGS registers will be set
+     (and at least one extra will be -1).  */
+  bufp->regs_allocated = REGS_UNALLOCATED;
+
+  /* And GNU code determines whether or not to get register information
+     by passing null for the REGS argument to re_match, etc., not by
+     setting no_sub.  */
+  bufp->no_sub = 0;
+
+  /* Match anchors at newline.  */
+  bufp->newline_anchor = 1;
+
+  ret = regex_compile (pattern, length, re_syntax_options, bufp);
+
+  if (!ret)
+    return NULL;
+  return gettext (re_error_msgid + re_error_msgid_idx[(int) ret]);
+}
+#ifdef _LIBC
+weak_alias (__re_compile_pattern, re_compile_pattern)
+#endif
+
+/* Entry points compatible with 4.2 BSD regex library.  We don't define
+   them unless specifically requested.  */
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+
+/* BSD has one and only one pattern buffer.  */
+static struct re_pattern_buffer re_comp_buf;
+
+char *
+#ifdef _LIBC
+/* Make these definitions weak in libc, so POSIX programs can redefine
+   these names if they don't use our functions, and still use
+   regcomp/regexec below without link errors.  */
+weak_function
+#endif
+re_comp (s)
+    const char *s;
+{
+  reg_errcode_t ret;
+
+  if (!s)
+    {
+      if (!re_comp_buf.buffer)
+	return gettext ("No previous regular expression");
+      return 0;
+    }
+
+  if (!re_comp_buf.buffer)
+    {
+      re_comp_buf.buffer = (unsigned char *) malloc (200);
+      if (re_comp_buf.buffer == NULL)
+        return (char *) gettext (re_error_msgid
+				 + re_error_msgid_idx[(int) REG_ESPACE]);
+      re_comp_buf.allocated = 200;
+
+      re_comp_buf.fastmap = (char *) malloc (1 << BYTEWIDTH);
+      if (re_comp_buf.fastmap == NULL)
+	return (char *) gettext (re_error_msgid
+				 + re_error_msgid_idx[(int) REG_ESPACE]);
+    }
+
+  /* Since `re_exec' always passes NULL for the `regs' argument, we
+     don't need to initialize the pattern buffer fields which affect it.  */
+
+  /* Match anchors at newlines.  */
+  re_comp_buf.newline_anchor = 1;
+
+  ret = regex_compile (s, strlen (s), re_syntax_options, &re_comp_buf);
+
+  if (!ret)
+    return NULL;
+
+  /* Yes, we're discarding `const' here if !HAVE_LIBINTL.  */
+  return (char *) gettext (re_error_msgid + re_error_msgid_idx[(int) ret]);
+}
+
+
+int
+#ifdef _LIBC
+weak_function
+#endif
+re_exec (s)
+    const char *s;
+{
+  const int len = strlen (s);
+  return
+    0 <= re_search (&re_comp_buf, s, len, 0, len, (struct re_registers *) 0);
+}
+
+#endif /* _REGEX_RE_COMP */
+
+/* POSIX.2 functions.  Don't define these for Emacs.  */
+
+#ifndef emacs
+
+/* regcomp takes a regular expression as a string and compiles it.
+
+   PREG is a regex_t *.  We do not expect any fields to be initialized,
+   since POSIX says we shouldn't.  Thus, we set
+
+     `buffer' to the compiled pattern;
+     `used' to the length of the compiled pattern;
+     `syntax' to RE_SYNTAX_POSIX_EXTENDED if the
+       REG_EXTENDED bit in CFLAGS is set; otherwise, to
+       RE_SYNTAX_POSIX_BASIC;
+     `newline_anchor' to REG_NEWLINE being set in CFLAGS;
+     `fastmap' to an allocated space for the fastmap;
+     `fastmap_accurate' to zero;
+     `re_nsub' to the number of subexpressions in PATTERN.
+
+   PATTERN is the address of the pattern string.
+
+   CFLAGS is a series of bits which affect compilation.
+
+     If REG_EXTENDED is set, we use POSIX extended syntax; otherwise, we
+     use POSIX basic syntax.
+
+     If REG_NEWLINE is set, then . and [^...] don't match newline.
+     Also, regexec will try a match beginning after every newline.
+
+     If REG_ICASE is set, then we considers upper- and lowercase
+     versions of letters to be equivalent when matching.
+
+     If REG_NOSUB is set, then when PREG is passed to regexec, that
+     routine will report only success or failure, and nothing about the
+     registers.
+
+   It returns 0 if it succeeds, nonzero if it doesn't.  (See regex.h for
+   the return codes and their meanings.)  */
+
+int
+regcomp (preg, pattern, cflags)
+    regex_t *preg;
+    const char *pattern;
+    int cflags;
+{
+  reg_errcode_t ret;
+  reg_syntax_t syntax
+    = (cflags & REG_EXTENDED) ?
+      RE_SYNTAX_POSIX_EXTENDED : RE_SYNTAX_POSIX_BASIC;
+
+  /* regex_compile will allocate the space for the compiled pattern.  */
+  preg->buffer = 0;
+  preg->allocated = 0;
+  preg->used = 0;
+
+  /* Try to allocate space for the fastmap.  */
+  preg->fastmap = (char *) malloc (1 << BYTEWIDTH);
+
+  if (cflags & REG_ICASE)
+    {
+      unsigned i;
+
+      preg->translate
+	= (RE_TRANSLATE_TYPE) malloc (CHAR_SET_SIZE
+				      * sizeof (*(RE_TRANSLATE_TYPE)0));
+      if (preg->translate == NULL)
+        return (int) REG_ESPACE;
+
+      /* Map uppercase characters to corresponding lowercase ones.  */
+      for (i = 0; i < CHAR_SET_SIZE; i++)
+        preg->translate[i] = ISUPPER (i) ? TOLOWER (i) : i;
+    }
+  else
+    preg->translate = NULL;
+
+  /* If REG_NEWLINE is set, newlines are treated differently.  */
+  if (cflags & REG_NEWLINE)
+    { /* REG_NEWLINE implies neither . nor [^...] match newline.  */
+      syntax &= ~RE_DOT_NEWLINE;
+      syntax |= RE_HAT_LISTS_NOT_NEWLINE;
+      /* It also changes the matching behavior.  */
+      preg->newline_anchor = 1;
+    }
+  else
+    preg->newline_anchor = 0;
+
+  preg->no_sub = !!(cflags & REG_NOSUB);
+
+  /* POSIX says a null character in the pattern terminates it, so we
+     can use strlen here in compiling the pattern.  */
+  ret = regex_compile (pattern, strlen (pattern), syntax, preg);
+
+  /* POSIX doesn't distinguish between an unmatched open-group and an
+     unmatched close-group: both are REG_EPAREN.  */
+  if (ret == REG_ERPAREN) ret = REG_EPAREN;
+
+  if (ret == REG_NOERROR && preg->fastmap)
+    {
+      /* Compute the fastmap now, since regexec cannot modify the pattern
+	 buffer.  */
+      if (re_compile_fastmap (preg) == -2)
+	{
+	  /* Some error occurred while computing the fastmap, just forget
+	     about it.  */
+	  free (preg->fastmap);
+	  preg->fastmap = NULL;
+	}
+    }
+
+  return (int) ret;
+}
+#ifdef _LIBC
+weak_alias (__regcomp, regcomp)
+#endif
+
+
+/* regexec searches for a given pattern, specified by PREG, in the
+   string STRING.
+
+   If NMATCH is zero or REG_NOSUB was set in the cflags argument to
+   `regcomp', we ignore PMATCH.  Otherwise, we assume PMATCH has at
+   least NMATCH elements, and we set them to the offsets of the
+   corresponding matched substrings.
+
+   EFLAGS specifies `execution flags' which affect matching: if
+   REG_NOTBOL is set, then ^ does not match at the beginning of the
+   string; if REG_NOTEOL is set, then $ does not match at the end.
+
+   We return 0 if we find a match and REG_NOMATCH if not.  */
+
+int
+regexec (preg, string, nmatch, pmatch, eflags)
+    const regex_t *preg;
+    const char *string;
+    size_t nmatch;
+    regmatch_t pmatch[];
+    int eflags;
+{
+  int ret;
+  struct re_registers regs;
+  regex_t private_preg;
+  int len = strlen (string);
+  boolean want_reg_info = !preg->no_sub && nmatch > 0;
+
+  private_preg = *preg;
+
+  private_preg.not_bol = !!(eflags & REG_NOTBOL);
+  private_preg.not_eol = !!(eflags & REG_NOTEOL);
+
+  /* The user has told us exactly how many registers to return
+     information about, via `nmatch'.  We have to pass that on to the
+     matching routines.  */
+  private_preg.regs_allocated = REGS_FIXED;
+
+  if (want_reg_info)
+    {
+      regs.num_regs = nmatch;
+      regs.start = TALLOC (nmatch * 2, regoff_t);
+      if (regs.start == NULL)
+        return (int) REG_NOMATCH;
+      regs.end = regs.start + nmatch;
+    }
+
+  /* Perform the searching operation.  */
+  ret = re_search (&private_preg, string, len,
+                   /* start: */ 0, /* range: */ len,
+                   want_reg_info ? &regs : (struct re_registers *) 0);
+
+  /* Copy the register information to the POSIX structure.  */
+  if (want_reg_info)
+    {
+      if (ret >= 0)
+        {
+          unsigned r;
+
+          for (r = 0; r < nmatch; r++)
+            {
+              pmatch[r].rm_so = regs.start[r];
+              pmatch[r].rm_eo = regs.end[r];
+            }
+        }
+
+      /* If we needed the temporary register info, free the space now.  */
+      free (regs.start);
+    }
+
+  /* We want zero return to mean success, unlike `re_search'.  */
+  return ret >= 0 ? (int) REG_NOERROR : (int) REG_NOMATCH;
+}
+#ifdef _LIBC
+weak_alias (__regexec, regexec)
+#endif
+
+
+/* Returns a message corresponding to an error code, ERRCODE, returned
+   from either regcomp or regexec.   We don't use PREG here.  */
+
+size_t
+regerror (errcode, preg, errbuf, errbuf_size)
+    int errcode;
+    const regex_t *preg;
+    char *errbuf;
+    size_t errbuf_size;
+{
+  const char *msg;
+  size_t msg_size;
+
+  if (errcode < 0
+      || errcode >= (int) (sizeof (re_error_msgid_idx)
+			   / sizeof (re_error_msgid_idx[0])))
+    /* Only error codes returned by the rest of the code should be passed
+       to this routine.  If we are given anything else, or if other regex
+       code generates an invalid error code, then the program has a bug.
+       Dump core so we can fix it.  */
+    abort ();
+
+  msg = gettext (re_error_msgid + re_error_msgid_idx[errcode]);
+
+  msg_size = strlen (msg) + 1; /* Includes the null.  */
+
+  if (errbuf_size != 0)
+    {
+      if (msg_size > errbuf_size)
+        {
+#if defined HAVE_MEMPCPY || defined _LIBC
+	  *((char *) __mempcpy (errbuf, msg, errbuf_size - 1)) = '\0';
+#else
+          memcpy (errbuf, msg, errbuf_size - 1);
+          errbuf[errbuf_size - 1] = 0;
+#endif
+        }
+      else
+        memcpy (errbuf, msg, msg_size);
+    }
+
+  return msg_size;
+}
+#ifdef _LIBC
+weak_alias (__regerror, regerror)
+#endif
+
+
+/* Free dynamically allocated space used by PREG.  */
+
+void
+regfree (preg)
+    regex_t *preg;
+{
+  if (preg->buffer != NULL)
+    free (preg->buffer);
+  preg->buffer = NULL;
+
+  preg->allocated = 0;
+  preg->used = 0;
+
+  if (preg->fastmap != NULL)
+    free (preg->fastmap);
+  preg->fastmap = NULL;
+  preg->fastmap_accurate = 0;
+
+  if (preg->translate != NULL)
+    free (preg->translate);
+  preg->translate = NULL;
+}
+#ifdef _LIBC
+weak_alias (__regfree, regfree)
+#endif
+
+#endif /* not emacs  */
+#else	/* !defined(USE_LIB_REGEX) */
+char regex_d1[] = "d"; char *regex_d2 = regex_d1;
+#endif	/* defined(USE_LIB_REGEX) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/rmnt.c b/lsof_4.85/lsof_4.85_src/lib/rmnt.c
new file mode 100644
index 0000000..0e1470f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/rmnt.c
@@ -0,0 +1,243 @@
+/*
+ * rmnt.c -- readmnt() function for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(USE_LIB_READMNT)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: rmnt.c,v 1.12 2008/10/21 16:13:23 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+
+/*
+ * The caller may define:
+ *
+ * 1.  An RMNT_EXPDEV macro to expand (ala EP/IX) device numbers;
+ *
+ *     EP/IX, for example, uses:
+ *
+ *	#define RMNT_EXPDEV(n) expdev(n)
+ *
+ * 2.  A custom macro, MNTSKIP, for making decisions to skip entries
+ *     -- e.g., ones whose mnt_type is MNTTYPE_IGNORE.
+ *
+ * 3.  RMNT_FSTYPE to specify the member name of the character string of the
+ *     mntent structure containing the file system type, and MOUNTS_FSTYPE to
+ *     specify the member name of the character string pointer of the local
+ *     mounts structure where RMNT_FSTYPE is to be copied.
+ *
+ * 4.  RMNT_STAT_FSTYPE to specify the member name of the stat structure
+ *     containing an integer file system type, and MOUNTS_STAT_FSTYPE to
+ *     specify the member name of the integer in the local mounts structure
+ *     where RMNT_STAT_FSTYPE is to be copied.
+ *     
+ */
+
+#if	!defined(RMNT_EXPDEV)
+#define	RMNT_EXPDEV(n)	n
+#endif	/* !defined(RMNT_EXPDEV) */
+
+
+/*
+ * Local static definitions
+ */
+
+static struct mounts *Lmi = (struct mounts *)NULL;	/* local mount info */
+static int Lmist = 0;					/* Lmi status */
+
+
+/*
+ * readmnt() - read mount table
+ */
+
+struct mounts *
+readmnt()
+{
+	char *dn = (char *)NULL;
+	char *ln;
+	FILE *mfp;
+	struct mntent *mp;
+	struct mounts *mtp;
+	char *opt, *opte;
+	struct stat sb;
+
+	if (Lmi || Lmist)
+	    return(Lmi);
+/*
+ * Open access to the mount table.
+ */
+	if (!(mfp = setmntent(MOUNTED, "r"))) {
+	    (void) fprintf(stderr, "%s: can't access %s\n", Pn, MOUNTED);
+	    Exit(1);
+	}
+/*
+ * Read mount table entries.
+ */
+	while ((mp = getmntent(mfp))) {
+
+#if	defined(MNTSKIP)
+	/*
+	 * Specfy in the MNTSKIP macro the decisions needed to determine
+	 * that this entry should be skipped.
+	 *
+	 * Typically entries whose mnt_type is MNTTYPE_IGNORE are skipped.
+	 *
+	 * The MNTSKIP macro allows the caller to use other tests.
+	 */
+	    MNTSKIP
+#endif	/* MNTSKIP */
+
+	/*
+	 * Interpolate a possible symbolic directory link.
+	 */
+	    if (dn)
+		(void) free((FREE_P *)dn);
+	    if (!(dn = mkstrcpy(mp->mnt_dir, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    if (!(ln = Readlink(dn))) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		continue;
+	    }
+	    if (ln != dn) {
+		(void) free((FREE_P *)dn);
+		dn = ln;
+	    }
+	    if (*dn != '/')
+		continue;
+	/*
+	 * Stat() the directory.
+	 */
+	    if (statsafely(dn, &sb)) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: WARNING: can't stat() ", Pn);
+		    safestrprt(mp->mnt_type, stderr, 0);
+		    (void) fprintf(stderr, " file system ");
+		    safestrprt(mp->mnt_dir, stderr, 1);
+		    (void) fprintf(stderr,
+			"      Output information may be incomplete.\n");
+		}
+		if ((opt = strstr(mp->mnt_opts, "dev="))) {
+		    (void) zeromem(&sb, sizeof(sb));
+		    if ((opte = x2dev(opt + 4, (dev_t *)&sb.st_dev))) {
+			sb.st_mode = S_IFDIR | 0777;
+			if (!Fwarn)
+			    (void) fprintf(stderr,
+				"      assuming \"%.*s\" from %s\n",
+				(int)(opte - opt), opt, MOUNTED);
+		    } else
+			opt = (char *)NULL;
+		}
+		if (!opt)
+		    continue;
+	    }
+	/*
+	 * Allocate and fill a local mounts structure with the directory
+	 * (mounted) information.
+	 */
+	    if (!(mtp = (struct mounts *)malloc(sizeof(struct mounts)))) {
+
+no_space_for_mount:
+
+		(void) fprintf(stderr, "%s: no space for mount at ", Pn);
+		safestrprt(mp->mnt_fsname, stderr, 0);
+		(void) fprintf(stderr, " (");
+		safestrprt(mp->mnt_dir, stderr, 0);
+		(void) fprintf(stderr, ")\n");
+		Exit(1);
+	    }
+	    mtp->dir = dn;
+	    dn = (char *)NULL;
+	    mtp->next = Lmi;
+	    mtp->dev = RMNT_EXPDEV(sb.st_dev);
+	    mtp->rdev = RMNT_EXPDEV(sb.st_rdev);
+	    mtp->inode = (INODETYPE)sb.st_ino;
+	    mtp->mode = sb.st_mode;
+
+# if	defined(RMNT_FSTYPE) && defined(MOUNTS_FSTYPE)
+	/*
+	 * Make a copy of RMNT_FSTYPE in MOUNTS_FSTYPE.
+	 */
+	    if (!(mtp->MOUNTS_FSTYPE = mkstrcpy(mp->RMNT_FSTYPE,
+						(MALLOC_S *)NULL)))
+	    {
+		(void) fprintf(stderr, "%s: no space for fstype (%s): %s\n",
+		    Pn, mtp->dir, mp->RMNT_FSTYPE);
+		Exit(1);
+	    }
+	    (void) strcpy(mtp->MOUNTS_FSTYPE, mp->RMNT_FSTYPE);
+# endif	/* defined(RMNT_FSTYP) && defined(MOUNTS_FSTYP) */
+
+# if	defined(RMNT_STAT_FSTYPE) && defined(MOUNTS_STAT_FSTYPE)
+	/*
+	 * Make a copy of RMNT_STAT_FSTYPE in MOUNTS_STAT_FSTYPE.
+	 */
+	    mtp->MOUNTS_STAT_FSTYPE = (int)sb.RMNT_STAT_FSTYPE;
+# endif	/* defined(RMNT_STAT_FSTYP) && defined(MOUNTS_STAT_FSTYP) */
+
+	/*
+	 * Interpolate a possible file system (mounted-on device) name link.
+	 */
+	    if (!(dn = mkstrcpy(mp->mnt_fsname, (MALLOC_S *)NULL)))
+		goto no_space_for_mount;
+	    mtp->fsname = dn;
+	    ln = Readlink(dn);
+	    dn = (char *)NULL;
+	/*
+	 * Stat() the file system (mounted-on) name and add file system
+	 * information to the local mounts structure.
+	 */
+	    if (!ln || statsafely(ln, &sb))
+		sb.st_mode = 0;
+	    mtp->fsnmres = ln;
+	    mtp->fs_mode = sb.st_mode;
+	    Lmi = mtp;
+	}
+	(void) endmntent(mfp);
+/*
+ * Clean up and return the local nount info table address.
+ */
+	if (dn)
+	    (void) free((FREE_P *)dn);
+	Lmist = 1;
+	return(Lmi);
+}
+#else	/* !defined(USE_LIB_READMNT) */
+char rmnt_d1[] = "d"; char *rmnt_d2 = rmnt_d1;
+#endif	/* defined(USE_LIB_READMNT) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/rnam.c b/lsof_4.85/lsof_4.85_src/lib/rnam.c
new file mode 100644
index 0000000..c7ed582
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/rnam.c
@@ -0,0 +1,669 @@
+/*
+ * rnam.c -- BSD format name cache functions for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(HASNCACHE) && defined(USE_LIB_RNAM)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: rnam.c,v 1.11 2008/10/21 16:13:23 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+/*
+ * rnam.c - read BSD format (struct namecache or nch) name cache
+ *
+ * This code is effective only when HASNCACHE is defined.
+ */
+
+/*
+ * The caller must:
+ *
+ *	#include the relevant header file -- e.g., <sys/namei.h>.
+ *
+ *	Define X_NCACHE as the nickname for the kernel cache address.
+ *
+ *	Define X_NCSIZE as the nickname for the size of the kernel cache.
+ *
+ *	Define NCACHE_NXT if the kernel's name cache is a linked list, starting
+ *	at the X_NCACHE address, rather than a table, starting at that address.
+ *
+ *	Define NCACHE_NO_ROOT if the calling dialect doesn't support
+ *	the locating of the root node of a file system.
+ *
+ *	Define the name of the name cache structure -- e.g.,
+ *
+ *		#define NCACHE	<structure name>
+ *
+ *	Define the following casts, if they differ from the defaults:
+ *
+ *		NCACHE_SZ_CAST	cast for X_NCSIZE (default int)
+ *
+ *	e.g.,
+ *		#define NCACHE_SZ_CAST unsigned long
+ *
+ *	Define the names of these elements of struct NCACHE:
+ *
+ *	must		#define NCACHE_NM	<name>
+ *	must		#define NCACHE_NMLEN	<name length
+ *	optional	#define NCACHE_NXT	<link to next entry>
+ *	must		#define NCACHE_NODEADDR	<node address>
+ *	must		#define NCACHE_NODEID	<node capability ID)
+ *	optional	#define NCACHE_PARADDR	<parent node address>
+ *	optional	#define NCACHE_PARID	<parent node capability ID)
+ *
+ * The caller may need to:
+ *
+ *	Define NCHNAMLEN as the length of the name element of NCACHE, if it's
+ *	not defined in the header file that defines the NCACHE structure.
+ *
+ *	Define this prototype for ncache_load():
+ *
+ *		_PROTOTYPE(static void ncache_load,(void));
+ */
+
+
+/*
+ * Local static values
+ */
+
+static int Mch;				/* name cache hash mask */
+
+# if	!defined(NCACHE_NC_CAST)
+#define	NCACHE_SZ_CAST	int
+# endif	/* !defined(NCACHE_NC_CAST) */
+
+static NCACHE_SZ_CAST Nc = 0;		/* size of name cache */
+static int Nch = 0;			/* size of name cache hash pointer
+					 * table */
+struct l_nch {
+	KA_T na;			/* node address */
+
+# if	defined(NCACHE_NODEID)
+	unsigned long id;		/* capability ID */
+# endif	/* defined(NCACHE_NODEID) */
+
+# if	defined(NCACHE_PARADDR) && defined(NCACHE_PARID)
+	KA_T pa;			/* parent node address */
+	struct l_nch *pla;		/* parent local node address */
+	unsigned long did;		/* parent capability ID */
+# endif	/* defined(NCACHE_PARADDR) && defined(NCACHE_PARID) */
+
+	char nm[NCHNAMLEN+1];		/* name */
+	int nl;				/* name length */
+};
+
+static struct l_nch *Ncache = (struct l_nch*)NULL;
+					/* the local name cache */
+static struct l_nch **Nchash = (struct l_nch **)NULL;
+					/* Ncache hash pointers */
+static int Ncfirst = 1;			/* first-call status */
+
+# if	defined(NCACHE_NODEID)
+#define ncachehash(i,n)		Nchash+(((((int)(n)>>2)+((int)(i)))*31415)&Mch)
+_PROTOTYPE(static struct l_nch *ncache_addr,(unsigned long i, KA_T na));
+# else	/* !defined(NCACHE_NODEID) */
+#define ncachehash(n)		Nchash+((((int)(n)>>2)*31415)&Mch)
+_PROTOTYPE(static struct l_nch *ncache_addr,(KA_T na));
+# endif	/* defined(NCACHE_NODEID) */
+
+#define DEFNCACHESZ	1024	/* local size if X_NCSIZE kernel value < 1 */
+#define	LNCHINCRSZ	64	/* local size increment */
+
+# if	!defined(NCACHE_NO_ROOT)
+_PROTOTYPE(static int ncache_isroot,(KA_T na, char *cp));
+# endif	/* !defined(NCACHE_NO_ROOT) */
+
+
+/*
+ * ncache_addr() - look up a node's local ncache address
+ */
+
+static struct l_nch *
+
+# if	defined(NCACHE_NODEID)
+ncache_addr(i, na)
+	unsigned long i;		/* node's capability ID */
+# else	/* !defined(NCACHE_NODEID) */
+ncache_addr(na)
+# endif	/* defined(NCACHE_NODEID) */
+
+	KA_T na;			/* node's address */
+{
+	struct l_nch **hp;
+
+# if	defined(NCACHE_NODEID)
+	for (hp = ncachehash(i, na); *hp; hp++)
+# else	/* !defined(NCACHE_NODEID) */
+	for (hp = ncachehash(na); *hp; hp++)
+# endif	/* defined(NCACHE_NODEID) */
+
+	{
+
+# if	defined(NCACHE_NODEID)
+	    if ((*hp)->id == i && (*hp)->na == na)
+# else	/* !defined(NCACHE_NODEID) */
+	    if ((*hp)->na == na)
+# endif	/* defined(NCACHE_NODEID) */
+
+		return(*hp);
+	}
+	return((struct l_nch *)NULL);
+}
+
+
+# if	!defined(NCACHE_NO_ROOT)
+/*
+ * ncache_isroot() - is head of name cache path a file system root?
+ */
+
+static int
+ncache_isroot(na, cp)
+	KA_T na;				/* kernel node address */
+	char *cp;				/* partial path */
+{
+	char buf[MAXPATHLEN];
+	int i;
+	MALLOC_S len;
+	struct mounts *mtp;
+	static int nca = 0;
+	static int ncn = 0;
+	static KA_T *nc = (KA_T *)NULL;
+	struct stat sb;
+	struct vnode v;
+
+	if (!na)
+	    return(0);
+/*
+ * Search the root vnode cache.
+ */
+	for (i = 0; i < ncn; i++) {
+	    if (na == nc[i])
+		return(1);
+	}
+/*
+ * Read the vnode and see if it's a VDIR node with the VROOT flag set.  If
+ * it is, then the path is complete.
+ *
+ * If it isn't, and if the file has an inode number, search the mount table
+ * and see if the file system's inode number is known.  If it is, form the
+ * possible full path, safely stat() it, and see if it's inode number matches
+ * the one we have for this file.  If it does, then the path is complete.
+ */
+	if (kread((KA_T)na, (char *)&v, sizeof(v))
+	||  v.v_type != VDIR || !(v.v_flag & VROOT)) {
+
+	/*
+	 * The vnode tests failed.  Try the inode tests.
+	 */
+	    if (Lf->inp_ty != 1 || !Lf->inode
+	    ||  !Lf->fsdir || (len = strlen(Lf->fsdir)) < 1)
+		return(0);
+	    if ((len + 1 + strlen(cp) + 1) > sizeof(buf))
+		return(0);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (strcmp(Lf->fsdir, mtp->dir) == 0)
+		    break;
+	    }
+	    if (!mtp)
+		return(0);
+	    (void) strcpy(buf, Lf->fsdir);
+	    if (buf[len - 1] != '/')
+		buf[len++] = '/';
+	    (void) strcpy(&buf[len], cp);
+	    if (statsafely(buf, &sb) != 0
+	    ||  (unsigned long)sb.st_ino != Lf->inode)
+		return(0);
+	}
+/*
+ * Add the node address to the root node cache.
+ */
+	if (ncn >= nca) {
+	    if (!nca) {
+		len = (MALLOC_S)(10 * sizeof(KA_T));
+		nc = (KA_T *)malloc(len);
+	    } else {
+		len = (MALLOC_S)((nca + 10) * sizeof(KA_T));
+		nc = (KA_T *)realloc(nc, len);
+	    }
+	    if (!nc) {
+		(void) fprintf(stderr, "%s: no space for root node table\n",
+		    Pn);
+		Exit(1);
+	    }
+	    nca += 10;
+	}
+	nc[ncn++] = na;
+	return(1);
+}
+# endif	/* !defined(NCACHE_NO_ROOT) */
+
+
+/*
+ * ncache_load() - load the kernel's name cache
+ */
+
+void
+ncache_load()
+{
+	struct l_nch **hp, *lc;
+	int i, len, n;
+	static int iNc = 0;
+	struct NCACHE *kc;
+	static KA_T kp = (KA_T)NULL;
+	KA_T v;
+
+# if	defined(NCACHE_NXT)
+	static KA_T kf;
+	struct NCACHE nc;
+# else	/* !defined NCACHE_NXT) */
+	static struct NCACHE *kca = (struct NCACHE *)NULL;
+# endif	/* defined(NCACHE_NXT) */
+
+	if (!Fncache)
+	    return;
+	if (Ncfirst) {
+
+	/*
+	 * Do startup (first-time) functions.
+	 */
+	    Ncfirst = 0;
+	/*
+	 * Establish kernel cache size.
+	 */
+	    v = (KA_T)0;
+	    if (get_Nl_value(X_NCSIZE, (struct drive_Nl *)NULL, &v) < 0
+	    ||  !v
+	    ||  kread((KA_T)v, (char *)&Nc, sizeof(Nc)))
+	    {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read name cache size: %s\n",
+			Pn, print_kptr(v, (char *)NULL, 0));
+		iNc = Nc = 0;
+		return;
+	    }
+	    iNc = Nc;
+	    if (Nc < 1) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: kernel name cache size: %d\n", Pn, Nc);
+		    (void) fprintf(stderr,
+			"      Cache size assumed to be: %d\n", DEFNCACHESZ);
+		}
+		iNc = Nc = DEFNCACHESZ;
+	    }
+	/*
+	 * Establish kernel cache address.
+	 */
+	    v = (KA_T)0;
+	    if (get_Nl_value(X_NCACHE, (struct drive_Nl *)NULL, &v) < 0
+	    ||  !v
+	    ||  kread((KA_T)v, (char *)&kp, sizeof(kp))) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read name cache address: %s\n",
+			Pn, print_kptr(v, (char *)NULL, 0));
+		iNc = Nc = 0;
+		return;
+	    }
+
+# if	defined(NCACHE_NXT)
+	    kf = kp;
+
+# else	/* !defined(NCACHE_NXT) */
+	/*
+	 * Allocate space for a local copy of the kernel's cache.
+	 */
+	    len = Nc * sizeof(struct NCACHE);
+	    if (!(kca = (struct NCACHE *)malloc((MALLOC_S)len))) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: can't allocate name cache space: %d\n", Pn, len);
+		Exit(1);
+	    }
+# endif	/* defined(NCACHE_NXT) */
+
+	/*
+	 * Allocate space for the local cache.
+	 */
+	    len = Nc * sizeof(struct l_nch);
+	    if (!(Ncache = (struct l_nch *)malloc((MALLOC_S)len))) {
+
+no_local_space:
+
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: no space for %d byte local name cache\n", Pn, len);
+		Exit(1);
+	    }
+	} else {
+
+	/*
+	 * Do setup for repeat calls.
+	 */
+	    if ((Nc = iNc) == 0)
+		return;
+	    if (Nchash) {
+		(void) free((FREE_P *)Nchash);
+		Nchash = (struct l_nch **)NULL;
+	    }
+
+# if    defined(NCACHE_NXT)
+	    kp = kf;
+# endif /* defined(NCACHE_NXT) */
+
+	}
+
+# if    !defined(NCACHE_NXT)
+
+/*
+ * Read the kernel's name cache.
+ */
+	if (kread(kp, (char *)kca, (Nc * sizeof(struct NCACHE)))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't read kernel's name cache: %s\n",
+		    Pn, print_kptr(kp, (char *)NULL, 0));
+	    Nc = 0;
+	    return;
+        }
+# endif /* !defined(NCACHE_NXT) */
+
+/*
+ * Build a local copy of the kernel name cache.
+ */
+
+# if	defined(NCACHE_NXT)
+	for (i = iNc * 16, kc = &nc, lc = Ncache, n = 0; kp; )
+# else	/* !defined(NCACHE_NXT) */
+	for (i = n = 0, kc = kca, lc = Ncache; i < Nc; i++, kc++)
+# endif	/* defined(NCACHE_NXT) */
+
+	{
+
+# if	defined(NCACHE_NXT)
+	    if (kread(kp, (char *)kc, sizeof(nc)))
+		break;
+	    if ((kp = (KA_T)kc->NCACHE_NXT) == kf)
+		kp = (KA_T)NULL;
+# endif	/* defined(NCACHE_NXT) */
+
+	    if (!kc->NCACHE_NODEADDR)
+		continue;
+	    if ((len = kc->NCACHE_NMLEN) < 1 || len > NCHNAMLEN)
+		continue;
+	    if (len < 3 && kc->NCACHE_NM[0] == '.') {
+		if (len == 1 || (len == 2 && kc->NCACHE_NM[1] == '.'))
+		    continue;
+	    }
+
+# if	defined(NCACHE_NXT)
+	    if (n >= Nc) {
+		Nc += LNCHINCRSZ;
+		if (!(Ncache = (struct l_nch *)realloc(Ncache,
+		     (MALLOC_S)(Nc * sizeof(struct l_nch)))))
+		{
+		    (void) fprintf(stderr,
+			"%s: no more space for %d entry local name cache\n",
+			Pn, Nc);
+		    Exit(1);
+		}
+		lc = &Ncache[n];
+	    }
+# endif	/* defined(NCACHE_NXT) */
+
+#  if	defined(NCACHE_NODEID)
+	    lc->na = (KA_T)kc->NCACHE_NODEADDR;
+	    lc->id = kc->NCACHE_NODEID;
+#  endif	/* defined(NCACHE_NODEID) */
+
+#  if	defined(NCACHE_PARADDR)
+	    lc->pa = (KA_T)kc->NCACHE_PARADDR;
+	    lc->pla = (struct l_nch *)NULL;
+#  endif	/* defined(NCACHE_PARADDR) */
+
+#  if	defined(NCACHE_PARID)
+	    lc->did = kc->NCACHE_PARID;
+#  endif	/* defined(NCACHE_PARID) */
+
+	    (void) strncpy(lc->nm, kc->NCACHE_NM, len);
+	    lc->nm[len] = '\0';
+	    lc->nl = strlen(lc->nm);
+	    n++;
+	    lc++;
+
+# if	defined(NCACHE_NXT)
+	    if (n >= i) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: name cache truncated at %d entries\n",
+			Pn, n);
+		break;
+	    }
+# endif	/* defined(NCACHE_NXT) */
+
+	}
+/*
+ * Reduce memory usage, as required.
+ */
+
+# if	!defined(NCACHE_NXT)
+	if (!RptTm)
+	    (void) free((FREE_P *)kca);
+# endif	/* !defined(NCACHE_NXT) */
+
+	if (n < 1) {
+	    Nc = 0;
+	    if (!RptTm) {
+		(void) free((FREE_P *)Ncache);
+		Ncache = (struct l_nch *)NULL;
+	    }
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: unusable name cache size: %d\n", Pn, n);
+	    return;
+	}
+	if (n < Nc) {
+	    Nc = n;
+	    if (!RptTm) {
+		len = Nc * sizeof(struct l_nch);
+		if (!(Ncache = (struct l_nch *)realloc(Ncache, len)))
+		    goto no_local_space;
+	    }
+	}
+/*
+ * Build a hash table to locate Ncache entries.
+ */
+	for (Nch = 1; Nch < Nc; Nch <<= 1)
+	    ;
+	Nch <<= 1;
+	Mch = Nch - 1;
+	if (!(Nchash = (struct l_nch **)calloc(Nch+Nc, sizeof(struct l_nch *))))
+	{
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: no space for %d name cache hash pointers\n",
+		    Pn, Nch + Nc);
+	    Exit(1);
+	}
+	for (i = 0, lc = Ncache; i < Nc; i++, lc++) {
+
+# if	defined(NCACHE_NODEID)
+	    for (hp = ncachehash(lc->id, lc->na), n = 1; *hp; hp++)
+# else	/* defined(NCACHE_NODEID) */
+	    for (hp = ncachehash(lc->na), n = 1; *hp; hp++)
+# endif	/* defined(NCACHE_NODEID) */
+
+	    {
+
+# if	defined(NCACHE_NODEID)
+		if ((*hp)->na == lc->na && (*hp)->id == lc->id
+# else	/* defined(NCACHE_NODEID) */
+		if ((*hp)->na == lc->na
+# endif	/* defined(NCACHE_NODEID) */
+
+		&&  strcmp((*hp)->nm, lc->nm) == 0
+
+# if	defined(NCACHE_PARADDR) && defined(NCACHE_PARID)
+		&&  (*hp)->pa == lc->pa && (*hp)->did == lc->did
+# endif	/* defined(NCACHE_PARADDR) && defined(NCACHE_PARID) */
+
+		) {
+		    n = 0;
+		    break;
+		}
+	    }
+	    if (n)
+		*hp = lc;
+	}
+
+# if	defined(NCACHE_PARADDR) && defined(NCACHE_PARID)
+/*
+ * Make a final pass through the local cache and convert parent node
+ * addresses to local name cache pointers.
+ */
+	for (i = 0, lc = Ncache; i < Nc; i++, lc++) {
+	    if (!lc->pa)
+		continue;
+	    lc->pla = ncache_addr(lc->did, lc->pa);
+	}
+# endif	/* defined(NCACHE_PARADDR) && defined(NCACHE_PARID) */
+}
+
+
+/*
+ * ncache_lookup() - look up a node's name in the kernel's name cache
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	struct l_nch *lc;
+	struct mounts *mtp;
+	int nl, rlen;
+
+	*cp = '\0';
+	*fp = 0;
+
+# if	defined(HASFSINO)
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller to print the file system mount point name only.
+ */
+	if ((Lf->inp_ty == 1) && Lf->fs_ino && (Lf->inode == Lf->fs_ino))
+	    return(cp);
+# endif	/* defined(HASFSINO) */
+
+/*
+ * Look up the name cache entry for the node address.
+ */
+
+# if	defined(NCACHE_NODEID)
+	if (Nc == 0 || !(lc = ncache_addr(Lf->id, Lf->na)))
+# else	/* defined(NCACHE_NODEID) */
+	if (Nc == 0 || !(lc = ncache_addr(Lf->na)))
+# endif	/* defined(NCACHE_NODEID) */
+
+
+	{
+
+	/*
+	 * If the node has no cache entry, see if it's the mount
+	 * point of a known file system.
+	 */
+	    if (!Lf->fsdir || !Lf->dev_def || Lf->inp_ty != 1)
+		return((char *)NULL);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (Lf->dev == mtp->dev
+		&&  mtp->inode == Lf->inode
+		&&  strcmp(mtp->dir, Lf->fsdir) == 0)
+		    return(cp);
+	    }
+	    return((char *)NULL);
+	}
+/*
+ * Start the path assembly.
+ */
+	if ((nl = lc->nl) > (blen - 1))
+	    return((char *)NULL);
+	cp = buf + blen - nl - 1;
+	rlen = blen - nl - 1;
+	(void) strcpy(cp, lc->nm);
+
+# if	defined(NCACHE_PARADDR) && defined(NCACHE_PARID)
+/*
+ * Look up the name cache entries that are parents of the node address.
+ * Quit when:
+ *
+ *	there's no parent;
+ *	the name length is too large to fit in the receiving buffer.
+ */
+	for (;;) {
+	    if (!lc->pla) {
+
+#  if	!defined(NCACHE_NO_ROOT)
+		if (ncache_isroot(lc->pa, cp))
+		    *fp = 1;
+#  endif	/* !defined(NCACHE_NO_ROOT) */
+
+		break;
+	    }
+	    lc = lc->pla;
+	    if (((nl = lc->nl) + 1) > rlen)
+		break;
+	    *(cp - 1) = '/';
+	    cp--;
+	    rlen--;
+	    (void) strncpy((cp - nl), lc->nm, nl);
+	    cp -= nl;
+	    rlen -= nl;
+	}
+# endif	/* defined(NCACHE_PARADDR) && defined(NCACHE_PARID) */
+	return(cp);
+}
+#else	/* !defined(HASNCACHE) || !defined(USE_LIB_RNAM) */
+char rnam_d1[] = "d"; char *rnam_d2 = rnam_d1;
+#endif	/* defined(HASNCACHE) && defined(USE_LIB_RNAM) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/rnch.c b/lsof_4.85/lsof_4.85_src/lib/rnch.c
new file mode 100644
index 0000000..0bdb7db
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/rnch.c
@@ -0,0 +1,811 @@
+/*
+ * rnch.c -- Sun format name cache functions for lsof library
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(HASNCACHE) && defined(USE_LIB_RNCH)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: rnch.c,v 1.11 2008/10/21 16:13:23 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+/*
+ * rnch.c - read Sun format (struct ncache) name cache
+ *
+ * This code is effective only when HASNCACHE is defined.
+ */
+
+/*
+ * The caller must:
+ *
+ *	#include the relevant header file -- e.g., <sys/dnlc.h>.
+ *
+ *	Define X_NCSIZE as the nickname for the kernel cache size variable,
+ *	or, if X_NCSIZE is undefined, define FIXED_NCSIZE as the size of the
+ *	kernel cache.
+ *
+ *	Define X_NCACHE as the nickname for the kernel cache address and
+ *	define ADDR_NCACHE if the address is the address of the cache,
+ *	rather than the address of a pointer to it.
+ *
+ *	Define NCACHE_NXT if the kernel's name cache is a linked list, starting
+ *	at the X_NCACHE address, rather than a table, starting at that address.
+ *
+ *	Define any of the following casts that differ from their defaults:
+ *
+ *		NCACHE_SZ_CAST	cast for X_NCACHE (default int)
+ *
+ * The caller may:
+ *
+ *	Define NCACHE_DP	as the name of the element in the
+ *				ncache structure that contains the
+ *				parent vnode pointer.
+ *
+ *				Default: dp
+ *
+ *	Define NCACHE_NAME	as the name of the element in the
+ *				ncache structure that contains the
+ *				name.
+ *
+ *				Default: name
+ *
+ *	Define NCACHE_NAMLEN	as the name of the element in the
+ *				ncache structure that contains the
+ *				name length.
+ *
+ *				Deafult: namlen
+ *
+ *	Define NCACHE_NEGVN	as the name of the name list element
+ *				whose value is a vnode address to
+ *				ignore when loading the kernel name
+ *				cache.
+ *
+ *	Define NCACHE_NODEID	as the name of the element in the
+ *				ncache structure that contains the
+ *				vnode's capability ID.
+ *
+ *	Define NCACHE_PARID	as the name of the element in the
+ *				ncache structure that contains the
+ *				parent vnode's capability ID.
+ *
+ *	Define NCACHE_VP	as the name of the element in the
+ *				ncache structure that contains the
+ *				vnode pointer.
+ *
+ *				Default: vp
+ *
+ * Note: if NCACHE_NODEID is defined, then NCACHE_PARID must be defined.
+ *
+ *
+ * The caller must:
+ *
+ *	Define this prototype for ncache_load():
+ *
+ *		_PROTOTYPE(void ncache_load,(void));
+ */
+
+
+/*
+ * Local static values
+ */
+
+static int Mch;				/* name cache hash mask */
+
+# if	!defined(NCACHE_NC_CAST)
+#define	NCACHE_SZ_CAST	int
+# endif	/* !defined(NCACHE_NC_CAST) */
+
+static NCACHE_SZ_CAST Nc = 0;		/* size of name cache */
+static int Nch = 0;			/* size of name cache hash pointer
+					 * table */
+struct l_nch {
+	KA_T vp;			/* vnode address */
+	KA_T dp;			/* parent vnode address */
+	struct l_nch *pa;		/* parent Ncache address */
+
+# if	defined(NCACHE_NODEID)
+	unsigned long id;		/* node's capability ID */
+	unsigned long did;		/* parent node's capability ID */
+# endif	/* defined(NCACHE_NODEID) */
+
+	char *nm;			/* name */
+	int nl;				/* name length */
+};
+
+static struct l_nch *Ncache = (struct l_nch *)NULL;
+					/* the local name cache */
+static struct l_nch **Nchash = (struct l_nch **)NULL;
+					/* Ncache hash pointers */
+static int Ncfirst = 1;			/* first-call status */
+
+# if 	defined(NCACHE_NEGVN)
+static KA_T NegVN = (KA_T)NULL;		/* negative vnode address */
+static int NegVNSt = 0;			/* NegVN status: 0 = not loaded */
+# endif	/* defined(NCACHE_NEGVN) */
+
+# if	defined(NCACHE_NODEID)
+_PROTOTYPE(static struct l_nch *ncache_addr,(unsigned long i, KA_T v));
+#define ncachehash(i,v)		Nchash+(((((int)(v)>>2)+((int)(i)))*31415)&Mch)
+# else	/* !defined(NCACHE_NODEID) */
+_PROTOTYPE(static struct l_nch *ncache_addr,(KA_T v));
+#define ncachehash(v)		Nchash+((((int)(v)>>2)*31415)&Mch)
+# endif	/* defined(NCACHE_NODEID) */
+
+_PROTOTYPE(static int ncache_isroot,(KA_T va, char *cp));
+
+#define DEFNCACHESZ	1024	/* local size if X_NCSIZE kernel value < 1 */
+#define	LNCHINCRSZ	64	/* local size increment */
+
+# if	!defined(NCACHE_DP)
+#define	NCACHE_DP	dp
+# endif	/* !defined(NCACHE_DP) */
+
+# if	!defined(NCACHE_NAME)
+#define	NCACHE_NAME	name
+# endif	/* !defined(NCACHE_NAME) */
+
+# if	!defined(NCACHE_NAMLEN)
+#define	NCACHE_NAMLEN	namlen
+# endif	/* !defined(NCACHE_NAMLEN) */
+
+# if	!defined(NCACHE_VP)
+#define	NCACHE_VP	vp
+# endif	/* !defined(NCACHE_VP) */
+
+
+/*
+ * ncache_addr() - look up a node's local ncache address
+ */
+
+static struct l_nch *
+
+# if	defined(NCACHE_NODEID)
+ncache_addr(i, v)
+# else	/* !defined(NCACHE_NODEID) */
+ncache_addr(v)
+# endif	/* defined(NCACHE_NODEID) */
+
+# if	defined(NCACHE_NODEID)
+	unsigned long i;			/* capability ID */
+# endif	/* defined(NCACHE_NODEID) */
+
+	KA_T v;					/* vnode's address */
+{
+	struct l_nch **hp;
+
+# if	defined(NCACHE_NODEID)
+	for (hp = ncachehash(i, v); *hp; hp++)
+# else	/* !defined(NCACHE_NODEID) */
+	for (hp = ncachehash(v); *hp; hp++)
+# endif	/* defined(NCACHE_NODEID) */
+
+	{
+
+# if	defined(NCACHE_NODEID)
+	    if ((*hp)->vp == v && (*hp)->id == i)
+# else	/* !defined(NCACHE_NODEID) */
+	    if ((*hp)->vp == v)
+# endif	/* defined(NCACHE_NODEID) */
+
+		return(*hp);
+	}
+	return((struct l_nch *)NULL);
+}
+
+
+/*
+ * ncache_isroot() - is head of name cache path a file system root?
+ */
+
+static int
+ncache_isroot(va, cp)
+	KA_T va;			/* kernel vnode address */
+	char *cp;			/* partial path */
+{
+	char buf[MAXPATHLEN];
+	int i;
+	MALLOC_S len;
+	struct mounts *mtp;
+	struct stat sb;
+	struct vnode v;
+	static int vca = 0;
+	static int vcn = 0;
+	static KA_T *vc = (KA_T *)NULL;
+
+	if (!va)
+	    return(0);
+/*
+ * Search the root vnode cache.
+ */
+	for (i = 0; i < vcn; i++) {
+	    if (va == vc[i])
+		return(1);
+	}
+/*
+ * Read the vnode and see if it's a VDIR node with the VROOT flag set.  If
+ * it is, then the path is complete.
+ *
+ * If it isn't, and if the file has an inode number, search the mount table
+ * and see if the file system's inode number is known.  If it is, form the
+ * possible full path, safely stat() it, and see if it's inode number matches
+ * the one we have for this file.  If it does, then the path is complete.
+ */
+	if (kread((KA_T)va, (char *)&v, sizeof(v))
+	||  v.v_type != VDIR || !(v.v_flag & VROOT)) {
+
+	/*
+	 * The vnode tests failed.  Try the inode tests.
+	 */
+	    if (Lf->inp_ty != 1 || !Lf->inode
+	    ||  !Lf->fsdir || (len = strlen(Lf->fsdir)) < 1)
+		return(0);
+	    if ((len + 1 + strlen(cp) + 1) > sizeof(buf))
+		return(0);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (strcmp(Lf->fsdir, mtp->dir) == 0)
+		    break;
+	    }
+	    if (!mtp)
+		return(0);
+	    (void) strcpy(buf, Lf->fsdir);
+	    if (buf[len - 1] != '/')
+		buf[len++] = '/';
+	    (void) strcpy(&buf[len], cp);
+	    if (statsafely(buf, &sb) != 0
+	    ||  (unsigned long)sb.st_ino != Lf->inode)
+		return(0);
+	}
+/*
+ * Add the vnode address to the root vnode cache.
+ */
+	if (vcn >= vca) {
+	    vca += 10;
+	    len = (MALLOC_S)(vca * sizeof(KA_T));
+	    if (!vc)
+		vc = (KA_T *)malloc(len);
+	    else
+		vc = (KA_T *)realloc(vc, len);
+	    if (!vc) {
+		(void) fprintf(stderr, "%s: no space for root vnode table\n",
+		    Pn);
+		Exit(1);
+	    }
+	}
+	vc[vcn++] = va;
+	return(1);
+}
+
+
+/*
+ * ncache_load() - load the kernel's name cache
+ */
+
+void
+ncache_load()
+{
+	char *cp, *np;
+	struct l_nch **hp, *lc;
+	int i, len, n;
+	static int iNc = 0;
+	struct ncache *kc;
+	static KA_T kp = (KA_T)NULL;
+	KA_T v;
+
+# if	defined(HASDNLCPTR)
+	static int na = 0;
+	static char *nb = (char *)NULL;
+# endif	/* defined(HASDNLCPTR) */
+
+# if	defined(NCACHE_NXT)
+	static KA_T kf;
+	struct ncache nc;
+# else	/* !defined(NCACHE_NXT) */
+	static struct ncache *kca = (struct ncache *)NULL;
+# endif	/* defined(NCACHE_NXT) */
+
+	if (!Fncache)
+	    return;
+	if (Ncfirst) {
+
+	/*
+	 * Do startup (first-time) functions.
+	 */
+	    Ncfirst = 0;
+	/*
+	 * Establish kernel cache size.
+	 */
+
+# if	defined(X_NCSIZE)
+	    v = (KA_T)0;
+	    if (get_Nl_value(X_NCSIZE, (struct drive_Nl *)NULL, &v) < 0
+	    ||  !v
+	    ||  kread((KA_T)v, (char *)&Nc, sizeof(Nc)))
+	    {
+		if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't read name cache size: %s\n",
+			Pn, print_kptr(v, (char *)NULL, 0));
+		iNc = Nc = 0;
+		return;
+	    }
+	    iNc = Nc;
+# else	/* !defined(X_NCSIZE) */
+	    iNc = Nc = FIXED_NCSIZE;
+# endif	/* defined(X_NCSIZE) */
+
+	    if (Nc < 1) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: kernel name cache size: %d\n", Pn, Nc);
+		    (void) fprintf(stderr,
+			"      Cache size assumed to be: %d\n", DEFNCACHESZ);
+		}
+		iNc = Nc = DEFNCACHESZ;
+	    }
+
+# if	defined(NCACHE_NEGVN)
+	/*
+	 * Get negative vnode address.
+	 */
+	    if (!NegVNSt) {
+		if (get_Nl_value(NCACHE_NEGVN, (struct drive_Nl *)NULL, &NegVN)
+		< 0)
+		    NegVN = (KA_T)NULL;
+		NegVNSt = 1;
+	    }
+# endif	/* defined(NCACHE_NEGVN) */
+
+	/*
+	 * Establish kernel cache address.
+	 */
+
+# if	defined(ADDR_NCACHE)
+	    kp = (KA_T)0;
+	    if (get_Nl_value(X_NCACHE,(struct drive_Nl *)NULL,(KA_T *)&kp) < 0
+	    || !kp) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: no name cache address\n", Pn);
+		iNc = Nc = 0;
+		return;
+	    }
+# else	/* !defined(ADDR_NCACHE) */
+	    v = (KA_T)0;
+	    if (get_Nl_value(X_NCACHE, (struct drive_Nl *)NULL, &v) < 0
+	    || !v
+	    ||  kread((KA_T)v, (char *)&kp, sizeof(kp))) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: can't read name cache ptr: %s\n",
+			Pn, print_kptr(v, (char *)NULL, 0));
+		iNc = Nc = 0;
+		return;
+	    }
+# endif	/* defined(ADDR_NCACHE) */
+
+	/*
+	 * Allocate space for a local copy of the kernel's cache.
+	 */
+
+# if	!defined(NCACHE_NXT)
+	    len = Nc * sizeof(struct ncache);
+	    if (!(kca = (struct ncache *)malloc((MALLOC_S)len))) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: can't allocate name cache space: %d\n", Pn, len);
+		Exit(1);
+	    }
+# endif	/* !defined(NCACHE_NXT) */
+
+	/*
+	 * Allocate space for the local cache.
+	 */
+	    len = Nc * sizeof(struct l_nch);
+	    if (!(Ncache = (struct l_nch *)calloc(Nc, sizeof(struct l_nch)))) {
+
+no_local_space:
+
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+		      "%s: no space for %d byte local name cache\n", Pn, len);
+		Exit(1);
+	    }
+	} else {
+
+	/*
+	 * Do setup for repeat calls.
+	 */
+	    if (!iNc)
+		return;
+	    if (Nchash) {
+		(void) free((FREE_P *)Nchash);
+		Nchash = (struct l_nch **)NULL;
+	    }
+	    if (Ncache) {
+
+	    /*
+	     * Free space malloc'd to names in local name cache.
+	     */
+	        for (i = 0, lc = Ncache; i < Nc; i++, lc++) {
+		    if (lc->nm) {
+			(void) free((FREE_P *)lc->nm);
+			lc->nm = (char *)NULL;
+		    }
+	        }
+	    }
+	    Nc = iNc;
+
+# if	defined(NCACHE_NXT)
+	    kp = kf;
+# endif	/* defined(NCACHE_NXT) */
+
+	}
+
+# if	!defined(NCACHE_NXT)
+
+/*
+ * Read the kernel's name cache.
+ */
+	if (kread(kp, (char *)kca, (Nc * sizeof(struct ncache)))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't read kernel's name cache: %s\n",
+		    Pn, print_kptr(kp, (char *)NULL, 0));
+	    Nc = 0;
+	    return;
+	}
+# endif	/* !defined(NCACHE_NXT) */
+
+/*
+ * Build a local copy of the kernel name cache.
+ */
+
+# if	defined(NCACHE_NXT)
+	for (i = iNc * 16, kc = &nc, kf = kp, lc = Ncache, n = 0; kp; )
+# else	/* !defined(NCACHE_NXT) */
+	for (i = n = 0, kc = kca, lc = Ncache; i < Nc; i++, kc++)
+# endif	/* defined(NCACHE_NXT) */
+
+	{
+
+# if	defined(NCACHE_NXT)
+	    if (kread(kp, (char *)kc, sizeof(nc)))
+		break;
+	    if ((kp = (KA_T)kc->NCACHE_NXT) == kf)
+		kp = (KA_T)NULL;
+# endif	/* defined(NCACHE_NXT) */
+
+	    if (!kc->NCACHE_VP || (len = kc->NCACHE_NAMLEN) < 1)
+		continue;
+
+# if	defined(NCACHE_NEGVN)
+	    if (NegVN && ((KA_T)kc->NCACHE_VP == NegVN))
+		continue;
+# endif	/* defined(NCACHE_NEGVN) */
+
+# if	defined(HASDNLCPTR)
+	/*
+	 * Read name from kernel to a temporary buffer.
+	 */
+	    if (len > na) {
+		na = len;
+		if (!nb)
+		    nb = (char *)malloc(na);
+		else
+		    nb = (char *)realloc((MALLOC_P *)nb, na);
+		if (!nb) {
+		    (void) fprintf(stderr,
+			"%s: can't allocate %d byte temporary name buffer\n",
+			Pn, na);
+		    Exit(1);
+		}
+	    }
+	    if (!kc->NCACHE_NAME || kread((KA_T)kc->NCACHE_NAME, nb, len))
+		continue;
+	    np = nb;
+# else	/* !defined(HASDNLCPTR) */
+	/*
+	 * Use name that is in the kernel cache entry.
+	 */
+	    if (len > NC_NAMLEN)
+		continue;
+	    np = kc->NCACHE_NAME;
+# endif	/* defined(HASDNLCPTR) */
+
+	    if (len < 3 && *np == '.') {
+		if (len == 1 || (len == 2 && np[1] == '.'))
+		    continue;
+	    }
+	/*
+	 * Allocate space for name in local cache entry.
+	 */
+	    if (!(cp = (char *)malloc(len + 1))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for name cache name: %s\n",
+		    Pn, len + 1, np);
+		Exit(1);
+	    }
+	    (void) strncpy(cp, np, len);
+	    cp[len] = '\0';
+
+# if	defined(NCACHE_NXT)
+	    if (n >= Nc) {
+
+	    /*
+	     * Allocate more local space to receive the kernel's linked
+	     * entries.
+	     */
+		Nc += LNCHINCRSZ;
+		if (!(Ncache = (struct l_nch *)realloc(Ncache,
+		     (MALLOC_S)(Nc * sizeof(struct l_nch)))))
+		{
+		    (void) fprintf(stderr,
+			"%s: no more space for %d entry local name cache\n",
+			Pn, Nc);
+		    Exit(1);
+		}
+		lc = &Ncache[n];
+		iNc = Nc;
+	    }
+# endif	/* defined(NCACHE_NXT) */
+
+	/*
+	 * Complete the local cache entry.
+	 */
+	    lc->vp = (KA_T)kc->NCACHE_VP;
+	    lc->dp = (KA_T)kc->NCACHE_DP;
+	    lc->pa = (struct l_nch *)NULL;
+	    lc->nm = cp;
+	    lc->nl = len;
+
+# if	defined(NCACHE_NODEID)
+	    lc->id = (unsigned long)kc->NCACHE_NODEID;
+	    lc->did = (unsigned long)kc->NCACHE_PARID;
+# endif	/* defined(NCACHE_NODEID) */
+
+	    n++;
+	    lc++;
+
+# if	defined(NCACHE_NXT)
+	    if (n >= i) {
+		if (!Fwarn)
+		    (void) fprintf(stderr,
+			"%s: WARNING: name cache truncated at %d entries\n",
+			Pn, n);
+		break;
+	    }
+# endif	/* defined(NCACHE_NXT) */
+
+	}
+/*
+ * Reduce memory usage, as required.
+ */
+
+# if	!defined(NCACHE_NXT)
+	if (!RptTm)
+	    (void) free((FREE_P *)kca);
+# endif	/* !defined(NCACHE_NXT) */
+
+	if (n < 1) {
+	    if (!RptTm && Ncache) {
+
+	    /*
+	     * If not in repeat mode, free the space that has been malloc'd
+	     * to the local name cache.
+	     */
+		for (i = 0, lc = Ncache; i < Nc; i++, lc++) {
+		    if (lc->nm) {
+			(void) free((FREE_P *)lc->nm);
+			lc->nm = (char *)NULL;
+		    }
+		}
+		(void) free((FREE_P *)Ncache);
+	 	Ncache = (struct l_nch *)NULL;
+		Nc = 0;
+	    }
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: unusable name cache size: %d\n", Pn, n);
+	    return;
+	}
+	if (n < Nc) {
+	    Nc = n;
+	    if (!RptTm) {
+		len = Nc * sizeof(struct l_nch);
+		if (!(Ncache = (struct l_nch *)realloc(Ncache, len)))
+		    goto no_local_space;
+	    }
+	}
+/*
+ * Build a hash table to locate Ncache entries.
+ */
+	for (Nch = 1; Nch < Nc; Nch <<= 1)
+	    ;
+	Nch <<= 1;
+	Mch = Nch - 1;
+	if (!(Nchash = (struct l_nch **)calloc(Nch+Nc, sizeof(struct l_nch *))))
+	{
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: no space for %d name cache hash pointers\n",
+		    Pn, Nch + Nc);
+	    Exit(1);
+	}
+	for (i = 0, lc = Ncache; i < Nc; i++, lc++) {
+
+# if	defined(NCACHE_NODEID)
+	    for (hp = ncachehash(lc->id, lc->vp), n = 1; *hp; hp++)
+# else	/* !defined(NCACHE_NODEID) */
+	    for (hp = ncachehash(lc->vp), n = 1; *hp; hp++)
+# endif	/* defined(NCACHE_NODEID) */
+
+	    {
+		if ((*hp)->vp == lc->vp && strcmp((*hp)->nm, lc->nm) == 0
+		&&  (*hp)->dp == lc->dp
+
+# if	defined(NCACHE_NODEID)
+		&&  (*hp)->id == lc->id && (*hp)->did == lc->did
+# endif	/* defined(NCACHE_NODEID) */
+
+		) {
+		    n = 0;
+		    break;
+		}
+	    }
+	    if (n)
+		*hp = lc;
+	}
+/*
+ * Make a final pass through the local cache and convert parent vnode
+ * addresses to local name cache pointers.
+ */
+	for (i = 0, lc = Ncache; i < Nc; i++, lc++) {
+	    if (!lc->dp)
+		continue;
+
+# if	defined(NCACHE_NEGVN)
+	     if (NegVN && (lc->dp == NegVN)) {
+		lc->pa = (struct l_nch *)NULL;
+		continue;
+	     }
+# endif	/* defined(NCACHE_NEGVN) */
+
+# if	defined(NCACHE_NODEID)
+	    lc->pa = ncache_addr(lc->did, lc->dp);
+# else	/* !defined(NCACHE_NODEID) */
+	    lc->pa = ncache_addr(lc->dp);
+# endif	/* defined(NCACHE_NODEID) */
+	
+	}
+}
+
+
+/*
+ * ncache_lookup() - look up a node's name in the kernel's name cache
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	struct l_nch *lc;
+	struct mounts *mtp;
+	int nl, rlen;
+
+	*cp = '\0';
+	*fp = 0;
+
+# if	defined(HASFSINO)
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller to print the file system mount point name only.
+ */
+	if ((Lf->inp_ty == 1) && Lf->fs_ino && (Lf->inode == Lf->fs_ino))
+	    return(cp);
+# endif	/* defined(HASFSINO) */
+
+/*
+ * Look up the name cache entry for the node address.
+ */
+	if (!Nc
+
+# if	defined(NCACHE_NODEID)
+	||  !(lc = ncache_addr(Lf->id, Lf->na))
+# else	/* !defined(NCACHE_NODEID) */
+	||  !(lc = ncache_addr(Lf->na))
+# endif	/* defined(NCACHE_NODEID) */
+
+	) {
+
+	/*
+	 * If the node has no cache entry, see if it's the mount
+	 * point of a known file system.
+	 */
+	    if (!Lf->fsdir || !Lf->dev_def || Lf->inp_ty != 1)
+		return((char *)NULL);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (Lf->dev == mtp->dev
+		&&  mtp->inode == Lf->inode
+		&&  strcmp(mtp->dir, Lf->fsdir) == 0)
+		    return(cp);
+	    }
+	    return((char *)NULL);
+	}
+/*
+ * Begin the path assembly.
+ */
+	if ((nl = lc->nl) > (blen - 1))
+	    return((char *)NULL);
+	cp = buf + blen - nl - 1;
+	rlen = blen - nl - 1;
+	(void) strcpy(cp, lc->nm);
+/*
+ * Look up the name cache entries that are parents of the node address.
+ * Quit when:
+ *
+ *	there's no parent;
+ *	the name is too large to fit in the receiving buffer.
+ */
+	for (;;) {
+	    if (!lc->pa) {
+		if (ncache_isroot(lc->dp, cp))
+		    *fp = 1;
+		break;
+	    }
+	    lc = lc->pa;
+	    if (((nl = lc->nl) + 1) > rlen)
+		break;
+	    *(cp - 1) = '/';
+	    cp--;
+	    rlen--;
+	    (void) strncpy((cp - nl), lc->nm, nl);
+	    cp -= nl;
+	    rlen -= nl;
+	}
+	return(cp);
+}
+#else	/* !defined(HASNCACHE) || !defined(USE_LIB_RNCH) */
+char rnch_d1[] = "d"; char *rnch_d2 = rnch_d1;
+#endif	/* defined(HASNCACHE) && defined(USE_LIB_RNCH) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/rnmh.c b/lsof_4.85/lsof_4.85_src/lib/rnmh.c
new file mode 100644
index 0000000..9cf00a9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/rnmh.c
@@ -0,0 +1,743 @@
+/*
+ * rnmh.c -- functions to read BSD format name cache information from a
+ *	     kernel hash table
+ */
+
+
+/*
+ * Copyright 1997 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.
+ */
+
+
+#include "../machine.h"
+
+#if	defined(HASNCACHE) && defined(USE_LIB_RNMH)
+
+# if	!defined(lint)
+static char copyright[] =
+"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: rnmh.c,v 1.13 2008/10/21 16:13:23 abe Exp $";
+# endif	/* !defined(lint) */
+
+#include "../lsof.h"
+
+
+/*
+ * rnmh.c - read BSD format hashed kernel name cache
+ */
+
+/*
+ * The caller must:
+ *
+ *	#include the relevant header file -- e.g., <sys/namei.h>.
+ *
+ *	Define X_NCACHE as the nickname for the kernel cache hash tables
+ *	address.
+ *
+ *	Define X_NCSIZE as the nickname for the size of the kernel cache has
+ *	table length.
+ *
+ *	Define NCACHE_NO_ROOT if the calling dialect doesn't support
+ *	the locating of the root node of a file system.
+ *
+ *	Define the name of the name cache structure -- e.g.,
+ *
+ *		#define NCACHE	<structure name>
+ *
+ *
+ *	Define the following casts, if they differ from the defaults:
+ *
+ *		NCACHE_SZ_CAST	case for X_NCSIZE (default unsigned long)
+ *
+ *	Define the names of these elements of struct NCACHE:
+ *
+ *		#define NCACHE_NM	<name>
+ *		#define NCACHE_NXT	<link to next entry>
+ *		#define NCACHE_NODEADDR	<node address>
+ *		#define NCACHE_PARADDR	<parent node address>
+ *
+ *	Optionally define:
+ *
+ *		#define NCACHE_NMLEN	<name length>
+ *
+ *	Optionally define *both*:
+ *
+ *		#define	NCACHE_NODEID	<node capability ID>
+ *		#define	NCACHE_PARID	<parent node capability ID>
+ *
+ * The caller may need to:
+ *
+ *	Define this prototype for ncache_load():
+ *
+ *		_PROTOTYPE(static void ncache_load,(void));
+ *
+ *	Define NCACHE_VROOT to be the value of the flag that signifies that
+ *	the vnode is the root of its file system.
+ *
+ *		E.g., for BSDI >= 5:
+ *
+ *			#define NCACHE_VROOT	VV_ROOT
+ *
+ *	If not defined, NCACHE_VROOT is defined as "VROOT".
+ *
+ *	Define VNODE_VFLAG if the vnode's flag member's name isn't v_flag.
+ *
+ * Note: if NCHNAMLEN is defined, the name is assumed to be in
+ * NCACHE_NM[NCHNAMLEN]; if it isn't defined, the name is assumed to be in an
+ * extension that begins at NCACHE_NM[0].
+ *
+ * Note: if NCACHE_NMLEN is not defined, then NCACHE_NM must be a pointer to
+ * a kernel allocated, NUL-terminated, string buffer.
+ */
+
+
+/*
+ * Casts
+ */
+
+# if	!defined(NCACHE_NC_CAST)
+#define	NCACHE_SZ_CAST  unsigned long
+# endif	/* !defined(NCACHE_NC_CAST) */
+
+
+/*
+ * Flags
+ */
+
+# if	!defined(NCACHE_NMLEN)
+#undef	NCHNAMLEN
+# endif	/* !defined(NCACHE_NMLEN) */
+
+# if	!defined(NCACHE_VROOT)
+#define	NCACHE_VROOT	VROOT		/* vnode is root of its file system */
+# endif	/* !defined(NCACHE_VROOT) */
+
+# if	!defined(VNODE_VFLAG)
+#define	VNODE_VFLAG	v_flag
+# endif	/* !defined(VNODE_VFLAG) */
+
+
+/*
+ * Local static values
+ */
+
+static int Mch;				/* name cache hash mask */
+
+struct l_nch {
+	KA_T na;			/* node address */
+	KA_T pa;			/* parent node address */
+	struct l_nch *pla;		/* parent local node address */
+	int nl;				/* name length */
+	struct l_nch *next;		/* next entry */
+
+# if	defined(NCACHE_NODEID)
+	unsigned long id;		/* capability ID */
+	unsigned long did;		/* parent capability ID */
+# endif	/* defined(NCACHE_NODEID) */
+
+# if	defined(NCHNAMLEN)
+	char nm[NCHNAMLEN + 1];		/* name */
+# else	/* !defined(NCHNAMLEN) */
+	char nm[1];			/* variable length name */
+# endif	/* defined(NCHNAMLEN) */
+
+};
+
+static struct l_nch *Ncache = (struct l_nch *)NULL;
+					/* the head of the local name cache */
+static struct l_nch **Nchash = (struct l_nch **)NULL;
+					/* Ncache hash pointers */
+
+# if	defined(NCACHE_NODEID)
+#define ncachehash(i,n)		Nchash+(((((int)(n)>>2)+((int)(i)))*31415)&Mch)
+_PROTOTYPE(static struct l_nch *ncache_addr,(unsigned long i, KA_T na));
+# else	/* !defined(NCACHE_NODEID) */
+#define ncachehash(n)		Nchash+((((int)(n)>>2)*31415)&Mch)
+_PROTOTYPE(static struct l_nch *ncache_addr,(KA_T na));
+# endif	/* defined(NCACHE_NODEID) */
+
+# if	!defined(NCACHE_NO_ROOT)
+_PROTOTYPE(static int ncache_isroot,(KA_T na, char *cp));
+# endif	/* !defined(NCACHE_NO_ROOT) */
+
+
+/*
+ * ncache_addr() - look up a node's local ncache address
+ */
+
+static struct l_nch *
+
+# if	defined(NCACHE_NODEID)
+ncache_addr(i, na)
+	unsigned long i;		/* node's capability ID */
+# else	/* !defined(NCACHE_NODEID) */
+ncache_addr(na)
+# endif	/* defined(NCACHE_NODEID) */
+
+	KA_T na;			/* node's address */
+{
+	struct l_nch **hp;
+
+# if	defined(NCACHE_NODEID)
+	for (hp = ncachehash(i, na); *hp; hp++)
+# else	/* !defined(NCACHE_NODEID) */
+	for (hp = ncachehash(na); *hp; hp++)
+# endif	/* defined(NCACHE_NODEID) */
+
+	{
+
+# if	defined(NCACHE_NODEID)
+	    if ((*hp)->id == i && (*hp)->na == na)
+# else	/* !defined(NCACHE_NODEID) */
+	    if ((*hp)->na == na)
+# endif	/* defined(NCACHE_NODEID) */
+
+		return(*hp);
+	}
+	return((struct l_nch *)NULL);
+}
+
+
+# if	!defined(NCACHE_NO_ROOT)
+/*
+ * ncache_isroot() - is head of name cache path a file system root?
+ */
+
+static int
+ncache_isroot(na, cp)
+	KA_T na;			/* kernel node address */
+	char *cp;			/* partial path */
+{
+	char buf[MAXPATHLEN];
+	int i;
+	MALLOC_S len;
+	struct mounts *mtp;
+	static int nca = 0;
+	static int ncn = 0;
+	static KA_T *nc = (KA_T *)NULL;
+	struct stat sb;
+	struct vnode v;
+
+	if (!na)
+	    return(0);
+/*
+ * Search the root vnode cache.
+ */
+	for (i = 0; i < ncn; i++) {
+	    if (na == nc[i])
+		return(1);
+	}
+/*
+ * Read the vnode and see if it's a VDIR node with the NCACHE_VROOT flag set.
+ * If it is, then the path is complete.
+ *
+ * If it isn't, and if the file has an inode number, search the mount table
+ * and see if the file system's inode number is known.  If it is, form the
+ * possible full path, safely stat() it, and see if it's inode number matches
+ * the one we have for this file.  If it does, then the path is complete.
+ */
+	if (kread((KA_T)na, (char *)&v, sizeof(v))
+	||  v.v_type != VDIR || !(v.VNODE_VFLAG & NCACHE_VROOT)) {
+
+	/*
+	 * The vnode tests failed.  Try the inode tests.
+	 */
+	    if (Lf->inp_ty != 1 || !Lf->inode
+	    ||  !Lf->fsdir || (len = strlen(Lf->fsdir)) < 1)
+		return(0);
+	    if ((len + 1 + strlen(cp) + 1) > sizeof(buf))
+		return(0);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (strcmp(Lf->fsdir, mtp->dir) == 0)
+		    break;
+	    }
+	    if (!mtp)
+		return(0);
+	    (void) strcpy(buf, Lf->fsdir);
+	    if (buf[len - 1] != '/')
+		buf[len++] = '/';
+	    (void) strcpy(&buf[len], cp);
+	    if (statsafely(buf, &sb) != 0
+	    ||  (unsigned long)sb.st_ino != Lf->inode)
+		return(0);
+	}
+/*
+ * Add the node address to the root node cache.
+ */
+	if (ncn >= nca) {
+	    if (!nca) {
+		len = (MALLOC_S)(10 * sizeof(KA_T));
+		nc = (KA_T *)malloc(len);
+	    } else {
+		len = (MALLOC_S)((nca + 10) * sizeof(KA_T));
+		nc = (KA_T *)realloc(nc, len);
+	    }
+	    if (!nc) {
+		(void) fprintf(stderr, "%s: no space for root node table\n",
+		    Pn);
+		Exit(1);
+	    }
+	    nca += 10;
+	}
+	nc[ncn++] = na;
+	return(1);
+}
+# endif	/* !defined(NCACHE_NO_ROOT) */
+
+
+/*
+ * ncache_load() - load the kernel's name cache
+ */
+
+void
+ncache_load()
+{
+	struct NCACHE c;
+	struct l_nch **hp, *ln;
+	KA_T ka, knx;
+	static struct NCACHE **khp = (struct namecache **)NULL;
+	static int khpl = 0;
+	NCACHE_SZ_CAST khsz;
+	unsigned long kx;
+	static struct l_nch *lc = (struct l_nch *)NULL;
+	static int lcl = 0;
+	int len, lim, n, nch, nchl, nlcl;
+	char tbuf[32];
+	KA_T v;
+
+# if	!defined(NCHNAMLEN)
+	int cin = sizeof(c.NCACHE_NM);
+	KA_T nmo = (KA_T)offsetof(struct NCACHE, NCACHE_NM);
+# endif	/* !defined(NCHNAMLEN) */
+
+# if	!defined(NCACHE_NMLEN)
+	char nbf[MAXPATHLEN + 1];
+	int nbfl = (int)(sizeof(nbf) - 1);
+	KA_T nk;
+	char *np;
+	int rl;
+
+	nbf[nbfl] = '\0';
+# endif	/* !defined(NCACHE_NMLEN) */
+
+	if (!Fncache)
+	    return;
+/*
+ * Free previously allocated space.
+ */
+	for (lc = Ncache; lc; lc = ln) {
+	    ln = lc->next;
+	    (void) free((FREE_P *)lc);
+	}
+	Ncache = (struct l_nch *)NULL;
+	if (Nchash)
+	    (void) free((FREE_P *)Nchash);
+	Nchash = (struct l_nch **)NULL;
+/*
+ * Get kernel cache hash table size
+ */
+	v = (KA_T)0;
+	if (get_Nl_value(X_NCSIZE, (struct drive_Nl *)NULL, &v) < 0
+	||  !v
+	||  kread((KA_T)v, (char *)&khsz, sizeof(khsz)))
+	{
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: can't read name cache hash size: %s\n",
+		    Pn, print_kptr(v, (char *)NULL, 0));
+	    return;
+	}
+	if (khsz < 1) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: name cache hash size length error: %#lx\n",
+		    Pn, khsz);
+	    return;
+	}
+/*
+ * Get kernel cache hash table address.
+ */
+	ka = (KA_T)0;
+	v = (KA_T)0;
+	if (get_Nl_value(X_NCACHE, (struct drive_Nl *)NULL, &v) < 0
+	||  !v
+	||  kread((KA_T)v, (char *)&ka, sizeof(ka))
+	||  !ka)
+	{
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: unusable name cache hash pointer: (%s)=%s\n",
+	            Pn, print_kptr(v, tbuf, sizeof(tbuf)),
+		    print_kptr(ka, (char *)NULL, 0));
+	    return;
+	}
+/*
+ * Allocate space for the hash table pointers and read them.
+ */
+	len = (MALLOC_S)(khsz * sizeof(struct NCACHE *));
+	if (len > khpl) {
+	    if (khp)
+		khp = (struct NCACHE **)realloc((MALLOC_P *)khp, len);
+	    else
+		khp = (struct NCACHE **)malloc(len);
+	    if (!khp) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for name cache hash table\n",
+		    Pn, len);
+		Exit(1);
+	    }
+	    khpl = len;
+	}
+	if (kread((KA_T)ka, (char *)khp, len)) {
+	    (void) fprintf(stderr,
+		"%s: can't read name cache hash pointers from: %s\n",
+		Pn, print_kptr(ka, (char *)NULL, 0));
+	    return;
+	}
+/*
+ * Process the kernel's name cache hash table buckets.
+ */
+	lim = khsz * 10;
+	for (kx = nch = 0; kx < khsz; kx++) {
+
+	/*
+	 * Loop through the entries for a hash bucket.
+	 */
+	    for (ka = (KA_T)khp[kx], n = 0; ka; ka = knx, n++) {
+		if (n > lim) {
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING: name cache hash chain too long\n",
+			    Pn);
+		    break;
+		}
+		if (kread(ka, (char *)&c, sizeof(c)))
+		    break;
+		knx = (KA_T)c.NCACHE_NXT;
+		if (!c.NCACHE_NODEADDR)
+		    continue;
+
+# if	defined(NCACHE_NMLEN)
+		if ((len = c.NCACHE_NMLEN) < 1)
+		    continue;
+# else	/* !defined(NCACHE_NMLEN) */
+	    /*
+	     * If it's possible to read the first four characters of the name,
+	     * do so and check for "." and "..".
+	     */
+		if (!c.NCACHE_NM
+		||  kread((KA_T)c.NCACHE_NM, nbf, 4))
+		    continue;
+		if (nbf[0] == '.') {
+		    if (!nbf[1]
+		    ||  ((nbf[1] == '.') && !nbf[2]))
+			continue;
+		}
+	   /*
+	    * Read the rest of the name, 32 characters at a time, until a NUL
+	    * character has been read or nbfl characters have been read.
+	    */
+		nbf[4] = '\0';
+		if ((len = (int)strlen(nbf)) < 4) {
+		    if (!len)
+			continue;
+		} else {
+		    for (np = &nbf[4]; len < nbfl; np += rl) {
+			if ((rl = nbfl - len) > 32) {
+			    rl = 32;
+			    nbf[len + rl] = '\0';
+			}
+			nk = (KA_T)((char *)c.NCACHE_NM + len);
+			if (kread(nk, np, rl)) {
+			    rl = -1;
+			    break;
+			}
+			rl = (int)strlen(np);
+			len += rl;
+			if (rl < 32)
+			    break;
+		    }
+		    if (rl < 0)
+			continue;
+		}
+# endif	/* defined(NCACHE_NMLEN) */
+
+	    /*
+	     * Allocate a cache entry long enough to contain the name and
+	     * move the name to it.
+	     */
+
+# if	defined(NCHNAMLEN)
+		if (len > NCHNAMLEN)
+		    continue;
+		if (len < 3 && c.NCACHE_NM[0] == '.') {
+		    if (len == 1 || (len == 2 && c.NCACHE_NM[1] == '.'))
+			continue;
+		}
+		if ((nlcl = sizeof(struct l_nch)) > lcl)
+# else	/* !defined(NCHNAMLEN) */
+		if ((nlcl = sizeof(struct l_nch) + len) > lcl)
+# endif	/* defined(NCHNAMLEN) */
+
+		{
+		    if (lc)
+			lc = (struct l_nch *)realloc(lc, nlcl);
+		    else
+			lc = (struct l_nch *)malloc(nlcl);
+		    if (!lc) {
+			(void) fprintf(stderr,
+			    "%s: can't allocate %d local name cache bytes\n",
+			    Pn, nlcl);
+			Exit(1);
+		    }
+		    lcl = nlcl;
+		}
+
+# if	defined(NCHNAMLEN)
+		(void) strncpy(lc->nm, c.NCACHE_NM, len);
+# else	/* !defined(NCHNAMLEN) */
+#  if	defined(NCACHE_NMLEN)
+		if ((len < 3) && (cin > 1)) {
+
+		/*
+		 * If this is a one or two character name, and if NCACHE_NM[]
+		 * in c has room for at least two characters, check for "."
+		 * and ".." first, ignoring this entry if the name is either.
+		 */
+		    if (len < 3 && c.NCACHE_NM[0] == '.') {
+			if (len == 1 || (len == 2 && c.NCACHE_NM[1] == '.'))
+			    continue;
+		    }
+		}
+		if (len > cin) {
+
+		/*
+		 * If not all (possibly not any, depending on the value in
+		 * cin) of the name has yet been read to lc->nm[], read it
+		 * or the rest of it.  If it wasn't possible before to check
+		 * for "." or "..", do that. too.
+		 */
+		    if (cin > 0)
+			(void) strncpy(lc->nm, c.NCACHE_NM, cin);
+		    if (kread(ka + (KA_T)(nmo + cin), &lc->nm[cin], len - cin))
+			continue;
+		    if ((cin < 2) && (len < 3) && (lc->nm[0] == '.')) {
+			if (len == 1 || (len == 2 && lc->nm[1] == '.'))
+			    continue;
+		    }
+		} else
+		    (void) strncpy(lc->nm, c.NCACHE_NM, len);
+#  else	/* !defined(NCACHE_NMLEN) */
+		(void) strncpy(lc->nm, nbf, len);
+#  endif	/* defined(NCACHE_NMLEN) */
+
+# endif	/* defined(NCHNAMLEN) */
+		lc->nm[len] = '\0';
+	    /*
+	     * Complete the new local cache entry and link it to the previous
+	     * local cache chain.
+	     */
+		lc->next = Ncache;
+		Ncache = lc;
+		lc->na = (KA_T)c.NCACHE_NODEADDR;
+		lc->nl = len;
+		lc->pa = (KA_T)c.NCACHE_PARADDR;
+		lc->pla = (struct l_nch *)NULL;
+
+# if	defined(NCACHE_NODEID)
+		lc->id = c.NCACHE_NODEID;
+		lc->did = c.NCACHE_PARID;
+# endif	/* defined(NCACHE_NODEID) */
+
+		lcl = 0;
+		lc = (struct l_nch *)NULL;
+		nch++;
+	    }
+	}
+/*
+ * Reduce memory usage, as required.
+ */
+	if (!RptTm) {
+	    (void) free((FREE_P *)khp);
+	    khp = (struct NCACHE **)NULL;
+	    khpl = 0;
+	}
+	if (nch < 1) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: WARNING: unusable name cache size: %d\n", Pn, nch);
+	    return;
+	}
+/*
+ * Build a hash table to locate Ncache entries.
+ */
+	for (nchl = 1; nchl < nch; nchl <<= 1)
+	    ;
+	nchl <<= 1;
+	Mch = nchl - 1;
+	len = nchl + nch;
+	if (!(Nchash = (struct l_nch **)calloc(len, sizeof(struct l_nch *)))) {
+	    if (!Fwarn)
+		(void) fprintf(stderr,
+		    "%s: no space for %d local name cache hash pointers\n",
+		    Pn, len);
+	    Exit(1);
+	}
+	for (lc = Ncache; lc; lc = lc->next) {
+
+# if	defined(NCACHE_NODEID)
+	    for (hp = ncachehash(lc->id, lc->na),
+# else	/* !defined(NCACHE_NODEID) */
+	    for (hp = ncachehash(lc->na),
+# endif	/* defined(NCACHE_NODEID) */
+
+		    n = 1; *hp; hp++)
+		{
+		if ((*hp)->na == lc->na && strcmp((*hp)->nm, lc->nm) == 0) {
+		    n = 0;
+		    break;
+		}
+	    }
+	    if (n)
+		*hp = lc;
+	    else
+		lc->pa = (KA_T)0;
+	}
+/*
+ * Make a final pass through the local cache and convert parent node
+ * addresses to local name cache pointers.
+ */
+	for (lc = Ncache; lc; lc = lc->next) {
+	    if (!lc->pa)
+		continue;
+
+# if	defined(NCACHE_NODEID)
+	    lc->pla = ncache_addr(lc->did, lc->pa);
+# else	/* !defined(NCACHE_NODEID) */
+	    lc->pla = ncache_addr(lc->pa);
+# endif	/* defined(NCACHE_NODEID) */
+
+	}
+}
+
+
+/*
+ * ncache_lookup() - look up a node's name in the kernel's name cache
+ */
+
+char *
+ncache_lookup(buf, blen, fp)
+	char *buf;			/* receiving name buffer */
+	int blen;			/* receiving buffer length */
+	int *fp;			/* full path reply */
+{
+	char *cp = buf;
+	struct l_nch *lc;
+	struct mounts *mtp;
+	int nl, rlen;
+
+	*cp = '\0';
+	*fp = 0;
+
+# if	defined(HASFSINO)
+/*
+ * If the entry has an inode number that matches the inode number of the
+ * file system mount point, return an empty path reply.  That tells the
+ * caller to print the file system mount point name only.
+ */
+	if ((Lf->inp_ty == 1) && Lf->fs_ino && (Lf->inode == Lf->fs_ino))
+	    return(cp);
+# endif	/* defined(HASFSINO) */
+
+/*
+ * Look up the name cache entry for the node address.
+ */
+
+# if	defined(NCACHE_NODEID)
+	if (!Nchash || !(lc = ncache_addr(Lf->id, Lf->na)))
+# else	/* !defined(NCACHE_NODEID) */
+	if (!Nchash || !(lc = ncache_addr(Lf->na)))
+# endif	/* defined(NCACHE_NODEID) */
+
+	{
+
+	/*
+	 * If the node has no cache entry, see if it's the mount
+	 * point of a known file system.
+	 */
+	    if (!Lf->fsdir || !Lf->dev_def || Lf->inp_ty != 1)
+		return((char *)NULL);
+	    for (mtp = readmnt(); mtp; mtp = mtp->next) {
+		if (!mtp->dir || !mtp->inode)
+		    continue;
+		if (Lf->dev == mtp->dev
+		&&  mtp->inode == Lf->inode
+		&&  (strcmp(mtp->dir, Lf->fsdir) == 0))
+		    return(cp);
+	    }
+	    return((char *)NULL);
+	}
+/*
+ * Start the path assembly.
+ */
+	if ((nl = lc->nl) > (blen - 1))
+	    return((char *)NULL);
+	cp = buf + blen - nl - 1;
+	rlen = blen - nl - 1;
+	(void) strcpy(cp, lc->nm);
+/*
+ * Look up the name cache entries that are parents of the node address.
+ * Quit when:
+ *
+ *	there's no parent;
+ *	the name length is too large to fit in the receiving buffer.
+ */
+	for (;;) {
+	    if (!lc->pla) {
+
+#  if	!defined(NCACHE_NO_ROOT)
+		if (ncache_isroot(lc->pa, cp))
+		    *fp = 1;
+#  endif	/* !defined(NCACHE_NO_ROOT) */
+
+		break;
+	    }
+	    lc = lc->pla;
+	    if (((nl = lc->nl) + 1) > rlen)
+		break;
+	    *(cp - 1) = '/';
+	    cp--;
+	    rlen--;
+	    (void) strncpy((cp - nl), lc->nm, nl);
+	    cp -= nl;
+	    rlen -= nl;
+	}
+	return(cp);
+}
+#else	/* !defined(HASNCACHE) || !defined(USE_LIB_RNMH) */
+char rnmh_d1[] = "d"; char *rnmh_d2 = rnmh_d1;
+#endif	/* defined(HASNCACHE) && defined(USE_LIB_RNMH) */
diff --git a/lsof_4.85/lsof_4.85_src/lib/snpf.c b/lsof_4.85/lsof_4.85_src/lib/snpf.c
new file mode 100644
index 0000000..c20b91f
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lib/snpf.c
@@ -0,0 +1,749 @@
+/*
+ * snpf.c -- snprintf() empulation functions for lsof library
+ *
+ * V. Abell
+ * Purdue University Computing Center
+ */
+
+/*
+ * Copyright 2000 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.
+ *
+ * This software has been adapted from snprintf.c in sendmail 8.9.3.  It
+ * is subject to the sendmail copyright statements listed below, and the
+ * sendmail licensing terms stated in the sendmail LICENSE file comment
+ * section of this file.
+ *
+ * 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.
+ */
+
+#include "../machine.h"
+
+#ifdef	USE_LIB_SNPF
+
+/*
+ * Sendmail copyright statements:
+ *
+ * Copyright (c) 1998 Sendmail, Inc.  All rights reserved.
+ * Copyright (c) 1997 Eric P. Allman.  All rights reserved.
+ * Copyright (c) 1988, 1993
+ *	The Regents of the University of California.  All rights reserved.
+ *
+ * By using this file, you agree to the terms and conditions set
+ * forth in the LICENSE file which can be found at the top level of
+ * the sendmail distribution.
+ *
+ * The LICENSE file may be found in the following comment section.
+ */
+
+
+/*
+ * Begin endmail LICENSE file.
+
+			     SENDMAIL LICENSE
+
+The following license terms and conditions apply, unless a different
+license is obtained from Sendmail, Inc., 1401 Park Avenue, Emeryville, CA
+94608, or by electronic mail at license@sendmail.com.
+
+License Terms:
+
+Use, Modification and Redistribution (including distribution of any
+modified or derived work) in source and binary forms is permitted only if
+each of the following conditions is met:
+
+1. Redistributions qualify as "freeware" or "Open Source Software" under
+   one of the following terms:
+
+   (a) Redistributions are made at no charge beyond the reasonable cost of
+       materials and delivery.
+
+   (b) Redistributions are accompanied by a copy of the Source Code or by an
+       irrevocable offer to provide a copy of the Source Code for up to three
+       years at the cost of materials and delivery.  Such redistributions
+       must allow further use, modification, and redistribution of the Source
+       Code under substantially the same terms as this license.  For the
+       purposes of redistribution "Source Code" means the complete source
+       code of sendmail including all modifications.
+
+   Other forms of redistribution are allowed only under a separate royalty-
+   free agreement permitting such redistribution subject to standard
+   commercial terms and conditions.  A copy of such agreement may be
+   obtained from Sendmail, Inc. at the above address.
+
+2. Redistributions of source code must retain the copyright notices as they
+   appear in each source code file, these license terms, and the
+   disclaimer/limitation of liability set forth as paragraph 6 below.
+
+3. Redistributions in binary form must reproduce the Copyright Notice,
+   these license terms, and the disclaimer/limitation of liability set
+   forth as paragraph 6 below, in the documentation and/or other materials
+   provided with the distribution.  For the purposes of binary distribution
+   the "Copyright Notice" refers to the following language:
+   "Copyright (c) 1998 Sendmail, Inc.  All rights reserved."
+
+4. Neither the name of Sendmail, Inc. nor the University of California nor
+   the names of their contributors may be used to endorse or promote
+   products derived from this software without specific prior written
+   permission.  The name "sendmail" is a trademark of Sendmail, Inc.
+
+5. All redistributions must comply with the conditions imposed by the
+   University of California on certain embedded code, whose copyright
+   notice and conditions for redistribution are as follows:
+
+   (a) Copyright (c) 1988, 1993 The Regents of the University of
+       California.  All rights reserved.
+
+   (b) Redistribution and use in source and binary forms, with or without
+       modification, are permitted provided that the following conditions
+       are met:
+
+      (i)   Redistributions of source code must retain the above copyright
+            notice, this list of conditions and the following disclaimer.
+
+      (ii)  Redistributions in binary form must reproduce the above
+            copyright notice, this list of conditions and the following
+            disclaimer in the documentation and/or other materials provided
+            with the distribution.
+
+      (iii) All advertising materials mentioning features or use of this
+            software must display the following acknowledgement:  "This
+            product includes software developed by the University of
+            California, Berkeley and its contributors."
+
+      (iv)  Neither the name of the University nor the names of its
+            contributors may be used to endorse or promote products derived
+            from this software without specific prior written permission.
+
+6. Disclaimer/Limitation of Liability: THIS SOFTWARE IS PROVIDED BY
+   SENDMAIL, INC. AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED
+   WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+   MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN
+   NO EVENT SHALL SENDMAIL, INC., THE REGENTS OF THE UNIVERSITY OF
+   CALIFORNIA OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+   NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+   USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+   ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+   (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+   THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+(Version 8.6, last updated 6/24/1998)
+
+ * End endmail LICENSE file.
+ */
+
+
+/*
+ * If "ll" format support is not possible -- e.g., the long long type isn't
+ * supported -- define HAS_NO_LONG_LONG.
+ */
+
+# ifndef lint
+static char copyright[] =
+"@(#) Copyright 2000 Purdue Research Foundation.\nAll rights reserved.\n";
+# endif /* !defined(lint) */
+
+#include <varargs.h>
+
+#if	defined(__STDC__)
+#define	_PROTOTYPE(function, params)	function params
+#else	/* !defined(__STDC__) */
+#define	_PROTOTYPE(function, params)	function()
+#endif /* defined(__STDC__) */
+
+
+/*
+**  SNPRINTF, VSNPRINT -- counted versions of printf
+**
+**	These versions have been grabbed off the net.  They have been
+**	cleaned up to compile properly and support for .precision and
+**	%lx has been added.
+*/
+
+/**************************************************************
+ * Original:
+ * Patrick Powell Tue Apr 11 09:48:21 PDT 1995
+ * A bombproof version of doprnt (dopr) included.
+ * Sigh.  This sort of thing is always nasty do deal with.  Note that
+ * the version here does not include floating point...
+ *
+ * snprintf() is used instead of sprintf() as it does limit checks
+ * for string length.  This covers a nasty loophole.
+ *
+ * The other functions are there to prevent NULL pointers from
+ * causing nast effects.
+ **************************************************************/
+
+/*static char _id[] = "$Id: snpf.c,v 1.5 2008/10/21 16:13:23 abe Exp $";*/
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void dopr,(char *bp, char *ep, char *fmt, va_list args));
+_PROTOTYPE(static void dopr_outch,(char **bp, char *ep, int c));
+_PROTOTYPE(static void dostr,(char **bp, char *ep, char *str, int));
+
+# if	!defined(HAS_NO_LONG_LONG)
+_PROTOTYPE(static void fmtllnum,(char **bp, char *ep, long long value,
+				 int base, int dosign, int ljust, int len,
+				 int zpad));
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+_PROTOTYPE(static void fmtnum,(char **bp, char *ep, long value, int base,
+			       int dosign, int ljust, int len, int zpad));
+_PROTOTYPE(static void fmtstr,(char **bp, char *ep, char *value, int ljust,
+			       int len, int zpad,
+			       int maxwidth));
+
+
+/*
+ * Local variables
+ */
+
+static int Length;
+
+
+/*
+ * snpf() -- count-controlled sprintf()
+ */
+
+int
+snpf(va_alist)
+	va_dcl				/* requires at least three arguments:
+					 *   bp =  receiving buffer pointer
+					 *   ct =  length of buffer
+					 *   fmt = format string
+					 */
+{
+	va_list args;
+	char *bp, *fmt;
+	int ct, len;
+
+	va_start(args);
+	bp = va_arg(args, char *);
+	ct = va_arg(args, int);
+	fmt = va_arg(args, char *);
+	len = vsnpf(bp, ct, fmt, args);
+	va_end(args);
+	return(len);
+}
+
+
+/*
+ * vsnpf() -- count-controlled vsprintf()
+ */
+
+int
+vsnpf(str, count, fmt, args)
+	char *str;			/* result buffer */
+	int count;			/* size of buffer */
+	char *fmt;			/* format */
+	va_list args;			/* variable length argument list */
+{
+	char *ep = str + count - 1;
+
+	*str = '\0';
+	(void) dopr(str, ep, fmt, args);
+	if (count > 0)
+	    *ep = '\0';
+	return(Length);
+}
+
+
+/*
+ * dopr() -- poor man's version of doprintf
+ */
+
+
+static void
+dopr(bp, ep, fmt, args)
+	char *bp;			/* buffer start */
+	char *ep;			/* buffer end (start + length - 1) */
+	char *fmt;			/* format */
+	va_list args;			/* variable length argument list */
+{
+	int ch;
+	char ebuf[64];
+	int ebufl = (int)(sizeof(ebuf) - 1);
+	long value;
+	int longflag  = 0;
+	int longlongflag  = 0;
+	int pointflag = 0;
+	int maxwidth  = 0;
+	char *strvalue;
+	int ljust;
+	int len;
+	int zpad;
+	int zxflag = 0;
+
+# if	!defined(HAS_NO_LONG_LONG)
+	long long llvalue;
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+	Length = 0;
+	while((ch = *fmt++)) {
+	    switch (ch) {
+	    case '%':
+		ljust = len = zpad = zxflag = maxwidth = 0;
+		longflag = longlongflag = pointflag = 0;
+
+nextch:
+
+		ch = *fmt++;
+		switch (ch) {
+		case '\0':
+		    dostr(&bp, ep, "**end of format**" , 0);
+		    return;
+		case '-':
+		    ljust = 1;
+		    goto nextch;
+		case '0': /* set zero padding if len not set */
+		    if ((len == 0) && !pointflag)
+			zpad = '0';
+		case '1':
+		case '2':
+		case '3':
+		case '4':
+		case '5':
+		case '6':
+		case '7':
+		case '8':
+		case '9':
+		    if (pointflag)
+			maxwidth = (maxwidth * 10) + (int)(ch - '0');
+		    else
+			 len = (len * 10) + (int)(ch - '0');
+		    goto nextch;
+		case '*': 
+		   if (pointflag)
+			maxwidth = va_arg(args, int);
+		    else
+			len = va_arg(args, int);
+		    goto nextch;
+		case '#':
+		    zxflag = 1;
+		    goto nextch;
+		case '.':
+		    pointflag = 1;
+		    goto nextch;
+		case 'l':
+		    if (longflag) {
+			longflag = 0;
+			longlongflag = 1;
+			goto nextch;
+		    }
+		    longflag = 1;
+		    goto nextch;
+		case 'u':
+		case 'U':
+		    if (longlongflag) {
+
+# if	!defined(HAS_NO_LONG_LONG)
+			llvalue = va_arg(args, long long);
+			(void) fmtllnum(&bp,ep,llvalue,10,0,ljust,len,zpad);
+# else	/* defined(HAS_NO_LONG_LONG) */
+			(void) strncpy(ebuf, "ll is unsupported", ebufl);
+			ebuf[(int)ebufl] = '\0';
+			(void) dostr(&bp, ep, ebuf, 0);
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+			break;
+		    }
+		    if (longflag)
+			value = va_arg(args, long);
+		    else
+			value = va_arg(args, int);
+		    (void) fmtnum(&bp, ep, value, 10,0, ljust, len, zpad);
+		    break;
+		case 'o':
+		case 'O':
+		    if (longlongflag) {
+
+# if	!defined(HAS_NO_LONG_LONG)
+			llvalue = va_arg(args, long long);
+			(void) fmtllnum(&bp,ep,llvalue,8,0,ljust,len,zpad);
+# else	/* defined(HAS_NO_LONG_LONG) */
+			(void) strncpy(ebuf, "ll is unsupported", ebufl);
+			ebuf[(int)ebufl] = '\0';
+			(void) dostr(&bp, ep, ebuf, 0);
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+			break;
+		    }
+		    if (longflag)
+			value = va_arg(args, long);
+		    else
+			value = va_arg(args, int);
+		    (void) fmtnum(&bp, ep, value, 8,0, ljust, len, zpad);
+		    break;
+		case 'd':
+		case 'D':
+		    if (longlongflag) {
+
+# if	!defined(HAS_NO_LONG_LONG)
+			llvalue = va_arg(args, long long);
+			(void) fmtllnum(&bp,ep,llvalue,10,1,ljust,len,zpad);
+# else	/* defined(HAS_NO_LONG_LONG) */
+			(void) strncpy(ebuf, "ll is unsupported", ebufl);
+			ebuf[(int)ebufl] = '\0';
+			(void) dostr(&bp, ep, ebuf, 0);
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+			break;
+		    }
+		    if (longflag)
+			value = va_arg(args, long);
+		    else
+			value = va_arg(args, int);
+		    (void) fmtnum(&bp, ep, value, 10,1, ljust, len, zpad);
+		    break;
+		case 'x':
+		    if (longlongflag) {
+
+# if	!defined(HAS_NO_LONG_LONG)
+			llvalue = va_arg(args, long long);
+			if (zxflag && llvalue) {
+			    (void) dostr(&bp, ep, "0x", 0);
+			    if (len >= 2)
+				len -= 2;
+			}
+			(void) fmtllnum(&bp,ep,llvalue,16,0,ljust,len,zpad);
+# else	/* defined(HAS_NO_LONG_LONG) */
+			(void) strncpy(ebuf, "ll is unsupported", ebufl);
+			ebuf[(int)ebufl] = '\0';
+			(void) dostr(&bp, ep, ebuf, 0);
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+			break;
+		    }
+		    if (longflag)
+			value = va_arg(args, long);
+		    else
+			value = va_arg(args, int);
+		    if (zxflag && value) {
+			(void) dostr(&bp, ep, "0x", 0);
+			if (len >= 2)
+			    len -= 2;
+		    }
+		    (void) fmtnum(&bp, ep, value, 16,0, ljust, len, zpad);
+		    break;
+		case 'X':
+		    if (longlongflag) {
+
+# if	!defined(HAS_NO_LONG_LONG)
+			llvalue = va_arg(args, long long);
+			if (zxflag && llvalue) {
+			    (void) dostr(&bp, ep, "0x", 0);
+			    if (len >= 2)
+				len -= 2;
+			}
+			(void) fmtllnum(&bp,ep,llvalue,-16,0,ljust,len,zpad);
+# else	/* defined(HAS_NO_LONG_LONG) */
+			(void) strncpy(ebuf, "ll is unsupported", ebufl);
+			ebuf[(int)ebufl] = '\0';
+			(void) dostr(&bp, ep, ebuf, 0);
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+			break;
+		    }
+		    if (longflag)
+			value = va_arg(args, long);
+		    else
+			value = va_arg(args, int);
+		    if (zxflag && value) {
+			(void) dostr(&bp, ep, "0x", 0);
+			if (len >= 2)
+			    len -= 2;
+		    }
+		    (void) fmtnum(&bp, ep, value,-16,0, ljust, len, zpad);
+		    break;
+		case 's':
+		    strvalue = va_arg(args, char *);
+		    if (maxwidth > 0 || !pointflag) {
+			if (pointflag && len > maxwidth)
+			    len = maxwidth; /* Adjust padding */
+			(void) fmtstr(&bp, ep, strvalue, ljust, len, zpad,
+				      maxwidth);
+		    }
+		    break;
+		case 'c':
+		    ch = va_arg(args, int);
+		    dopr_outch(&bp, ep, ch);
+		    break;
+		case '%':
+		    (void) dopr_outch(&bp, ep, ch);
+		    continue;
+		default:
+		    ebuf[0] = ch;
+		    (void) strncpy(&ebuf[1], " is unsupported", ebufl);
+		    ebuf[(int)ebufl] = '\0';
+		    (void) dostr(&bp, ep, ebuf, 0);
+		}
+		break;
+	    default:
+		(void) dopr_outch(&bp, ep, ch);
+		break;
+	    }
+	}
+	*bp = '\0';
+}
+
+
+# if	!defined(HAS_NO_LONG_LONG)
+/*
+ * fmtllnum() -- format long long number for output
+ */
+
+static void
+fmtllnum(bp, ep, value, base, dosign, ljust, len, zpad)
+	char **bp;			/* current buffer pointer */
+	char *ep;			/* end of buffer (-1) */
+	long long value;		/* number to format */
+	int base;			/* number base */
+	int dosign;			/* sign request */
+	int ljust;			/* left justfication request */
+	int len;			/* length request */
+	int zpad;			/* zero padding request */
+{
+	int signvalue = 0;
+	unsigned long long uvalue;
+	char convert[20];
+	int place = 0;
+	int padlen = 0; /* amount to pad */
+	int caps = 0;
+
+	uvalue = value;
+	if (dosign) {
+	    if (value < 0) {
+		signvalue = '-';
+		uvalue = -value;
+	    }
+	}
+	if (base < 0) {
+	    caps = 1;
+	    base = -base;
+	}
+	do {
+	    convert[place++] = 
+		(caps ? "0123456789ABCDEF" : "0123456789abcdef")
+		    [uvalue % (unsigned)base];
+	    uvalue = (uvalue / (unsigned)base);
+	} while (uvalue && (place < (int)(sizeof(convert) - 1)));
+	convert[place] = 0;
+	padlen = len - place;
+	if (padlen < 0)
+	    padlen = 0;
+	if(ljust)
+	    padlen = -padlen;
+	if (zpad && padlen > 0) {
+	    if (signvalue) {
+		(void) dopr_outch(bp, ep, signvalue);
+		--padlen;
+		signvalue = 0;
+	    }
+	    while (padlen > 0) {
+		(void) dopr_outch(bp, ep, zpad);
+		--padlen;
+	    }
+	}
+	while (padlen > 0) {
+	    (void) dopr_outch(bp, ep, ' ');
+	     --padlen;
+	}
+	if (signvalue)
+	    (void) dopr_outch(bp, ep, signvalue);
+	while (place > 0)
+	    (void) dopr_outch(bp, ep, convert[--place]);
+	while (padlen < 0) {
+	    (void) dopr_outch(bp, ep, ' ');
+	    ++padlen;
+	}
+}
+# endif	/* !defined(HAS_NO_LONG_LONG) */
+
+
+/*
+ * fmtnum() -- format number for output
+ */
+
+static void
+fmtnum(bp, ep, value, base, dosign, ljust, len, zpad)
+	char **bp;			/* current buffer pointer */
+	char *ep;			/* end of buffer (-1) */
+	long value;			/* number to format */
+	int base;			/* number base */
+	int dosign;			/* sign request */
+	int ljust;			/* left justfication request */
+	int len;			/* length request */
+	int zpad;			/* zero padding request */
+{
+	int signvalue = 0;
+	unsigned long uvalue;
+	char convert[20];
+	int place = 0;
+	int padlen = 0; /* amount to pad */
+	int caps = 0;
+
+	uvalue = value;
+	if (dosign) {
+	    if (value < 0) {
+		signvalue = '-';
+		uvalue = -value;
+	    }
+	}
+	if (base < 0) {
+	    caps = 1;
+	    base = -base;
+	}
+	do {
+	    convert[place++] = 
+		(caps ? "0123456789ABCDEF" : "0123456789abcdef")
+		    [uvalue % (unsigned)base];
+	    uvalue = (uvalue / (unsigned)base);
+	} while (uvalue && (place < (int)(sizeof(convert) - 1)));
+	convert[place] = 0;
+	padlen = len - place;
+	if (padlen < 0)
+	    padlen = 0;
+	if(ljust)
+	    padlen = -padlen;
+	if (zpad && padlen > 0) {
+	    if (signvalue) {
+		(void) dopr_outch(bp, ep, signvalue);
+		--padlen;
+		signvalue = 0;
+	    }
+	    while (padlen > 0) {
+		(void) dopr_outch(bp, ep, zpad);
+		--padlen;
+	    }
+	}
+	while (padlen > 0) {
+	    (void) dopr_outch(bp, ep, ' ');
+	     --padlen;
+	}
+	if (signvalue)
+	    (void) dopr_outch(bp, ep, signvalue);
+	while (place > 0)
+	    (void) dopr_outch(bp, ep, convert[--place]);
+	while (padlen < 0) {
+	    (void) dopr_outch(bp, ep, ' ');
+	    ++padlen;
+	}
+}
+
+
+/*
+ * fmtstr() -- format string for output
+ */
+
+static void
+fmtstr(bp, ep, value, ljust, len, zpad, maxwidth)
+	char **bp;			/* current buffer pointer */
+	char *ep;			/* end of buffer (-1) */
+	char *value;			/* string to format */
+	int ljust;			/* left justification request */
+	int len;			/* length request */
+	int zpad;			/* zero padding request */
+	int maxwidth;			/* maximum width request */
+{
+	int padlen, strlen;     /* amount to pad */
+
+	if (value == 0)
+	    value = "<NULL>";
+	for (strlen = 0; value[strlen]; ++ strlen)	/* strlen() */
+	    ;
+	if ((strlen > maxwidth) && maxwidth)
+	    strlen = maxwidth;
+	padlen = len - strlen;
+	if (padlen < 0)
+	    padlen = 0;
+	if (ljust)
+	    padlen = -padlen;
+	while (padlen > 0) {
+	    (void) dopr_outch(bp, ep, ' ');
+	    --padlen;
+	}
+	(void) dostr(bp, ep, value, maxwidth);
+	while (padlen < 0) {
+	    (void) dopr_outch(bp, ep, ' ');
+	    ++padlen;
+	}
+}
+
+
+/*
+ * dostr() -- do string output
+ */
+
+static void
+dostr(bp, ep, str, cut)
+	char **bp;			/* current buffer pointer */
+	char *ep;			/* end of buffer (-1) */
+	char *str;			/* string to output */
+	int cut;			/* limit on amount of string to output:
+					 *   0 == no limit */
+{
+	int f;
+
+	f = cut ? 1 : 0;
+	while (*str) {
+	    if (f) {
+		if (cut-- > 0)
+		    (void) dopr_outch(bp, ep, *str);
+	    } else
+		(void) dopr_outch(bp, ep, *str);
+	    str++;
+	}
+}
+
+
+/*
+ * dopr_outch() -- output a character (or two)
+ */
+
+static void
+dopr_outch(bp, ep, c)
+	char **bp;			/* current buffer pointer */
+	char *ep;			/* end of buffer (-1) */
+	int c;				/* character to output */
+{
+	register char *cp = *bp;
+
+	if (iscntrl(c) && c != '\n' && c != '\t') {
+	    c = '@' + (c & 0x1F);
+	    if (cp < ep)
+		*cp++ = '^';
+	    Length++;
+	}
+	if (cp < ep)
+	    *cp++ = c;
+	*bp = cp;
+	Length++;
+}
+
+#else	/* !defined(USE_LIB_SNPF) */
+char snpf_d1[] = "d"; char *snpf_d2 = snpf_d1;
+#endif	/* defined(USE_LIB_SNPF) */
diff --git a/lsof_4.85/lsof_4.85_src/lsof.8 b/lsof_4.85/lsof_4.85_src/lsof.8
new file mode 100644
index 0000000..5855195
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lsof.8
@@ -0,0 +1,4408 @@
+.ds VN 4.85
+.TH LSOF 8 Revision-\*(VN
+.if !\n()P .nr )P 1v
+.SH NAME
+lsof \- list open files
+.SH SYNOPSIS
+.B lsof
+[
+.B \-?abChKlnNOPRtUvVX
+] [
+.BI -A " A"
+] [
+.BI \-c " c"
+] [
+.BI +c " c"
+] [
+.BI +|\-d " d"
+] [
+.BI +|\-D " D"
+] [
+.BI +|\-e " s"
+] [
+.B +|\-f [cfgGn]
+] [
+.BI \-F " [f]"
+] [
+.BI \-g " [s]"
+] [
+.BI \-i " [i]"
+] [
+.BI \-k " k"
+] [
+.BI +|\-L " [l]"
+] [
+.BI +|\-m " m"
+] [
+.B +|\-M
+] [
+.BI \-o " [o]"
+] [
+.BI \-p " s"
+] [
+.BI +|\-r " [t[m<fmt>]]"
+] [
+.BI \-s " [p:s]"
+] [
+.BI \-S " [t]"
+] [
+.BI \-T " [t]"
+] [
+.BI \-u " s"
+] [
+.B +|\-w
+] [
+.BI \-x " [fl]"
+] [
+.BI \-z " [z]"
+] [
+.BI \-Z " [Z]"
+] [
+.B --
+] [\fInames\fP]
+.SH DESCRIPTION
+.I Lsof
+revision \*(VN lists on its standard output file information about files
+opened by processes for the following UNIX dialects:
+.PP
+.nf
+	AIX 5.3
+	Apple Darwin 9 and Mac OS X 10.[56]
+	FreeBSD 4.9 and 6.4 for x86-based systems
+	FreeBSD 8.[02] and 9.0 for AMD64-based systems
+	Linux 2.1.72 and above for x86-based systems
+	Solaris 9, 10 and 11
+.fi
+.PP
+(See the
+.B DISTRIBUTION
+section of this manual page for information on how to obtain the
+latest
+.I lsof
+revision.)
+.PP
+An open file may be a regular file, a directory, a block special file,
+a character special file, an executing text reference, a library,
+a stream or a network file (Internet socket, NFS file or UNIX domain socket.)
+A specific file or all the files in a file system may be selected by path.
+.PP
+Instead of a formatted display,
+.I lsof
+will produce output that can be parsed by other programs.
+See the
+.BR \-F ,
+option description, and the
+.B "OUTPUT FOR OTHER PROGRAMS"
+section for more information.
+.PP
+In addition to producing a single output list,
+.I lsof
+will run in repeat mode.
+In repeat mode it will produce output, delay, then repeat the output
+operation until stopped with an interrupt or quit signal.
+See the
+.BI +|\-r " [t[m<fmt>]]"
+option description for more information.
+.SH OPTIONS
+In the absence of any options,
+.I lsof
+lists all open files belonging to all active processes.
+.PP
+If any list request option is specified, other list requests must be
+specifically requested \- e.g., if
+.B \-U
+is specified for the listing of UNIX socket files, NFS files won't be
+listed unless
+.B \-N
+is also specified;
+or if a user list is specified with the
+.B \-u
+option, UNIX domain socket files, belonging to users not in the list,
+won't be listed unless the
+.B \-U
+option is also specified.
+.PP
+Normally list options that are specifically stated are ORed \- i.e.,
+specifying the
+.B \-i
+option without an address and the \fB\-u\fPfoo option produces a
+listing of all network files OR files belonging to processes owned
+by user ``foo''.
+The exceptions are:
+.TP \w'1)\ 'u
+1)
+the `^' (negated) login name or user ID (UID), specified with the
+.B \-u
+option;
+.TP \w'1)\ 'u
+2)
+the `^' (negated) process ID (PID), specified with the
+.B \-p
+option;
+.TP \w'1)\ 'u
+3)
+the `^' (negated) process group ID (PGID), specified with the
+.B \-g
+option;
+.TP \w'1)\ 'u
+4)
+the `^' (negated) command, specified with the
+.B \-c
+option;
+.TP \w'1)\ 'u
+5)
+the (`^') negated TCP or UDP protocol state names, specified with the
+.BI \-s " [p:s]"
+option.
+.PP
+Since they represent exclusions, they are applied without ORing or ANDing
+and take effect before any other selection criteria are applied.
+.PP
+The
+.B \-a
+option may be used to AND the selections.
+For example, specifying
+.BR \-a ,
+.BR \-U ,
+and \fB\-u\fPfoo produces a listing of only UNIX socket files that
+belong to processes owned by user ``foo''.
+.PP
+Caution: the
+.B \-a
+option causes all list selection options to be ANDed; it can't
+be used to cause ANDing of selected pairs of selection options
+by placing it between them, even though its placement there is
+acceptable.
+Wherever
+.B \-a
+is placed, it causes the ANDing of all selection options.
+.PP
+Items of the same selection set \- command names, file descriptors,
+network addresses, process identifiers, user identifiers, zone names,
+security contexts \- are joined in a single ORed set and applied
+before the result participates in ANDing.
+Thus, for example, specifying \fB\-i\fP@aaa.bbb, \fB\-i\fP@ccc.ddd,
+.BR \-a ,
+and \fB\-u\fPfff,ggg will select the listing of files that belong to
+either login ``fff'' OR ``ggg'' AND have network connections to either
+host aaa.bbb OR ccc.ddd.
+.PP
+Options may be grouped together following a single prefix -- e.g.,
+the option set ``\fB\-a \-b \-C\fP'' may be stated as
+.BR \-abC .
+However, since values are optional following 
+.BR +|\-f ,
+.BR \-F ,
+.BR \-g ,
+.BR \-i ,
+.BR +|\-L ,
+.BR \-o ,
+.BR +|\-r ,
+.BR \-s ,
+.BR \-S ,
+.BR \-T ,
+.B \-x
+and
+.BR \-z .
+when you have no values for them be careful that the
+following character isn't ambiguous.
+For example,
+.B \-Fn
+might represent the
+.B \-F
+and
+.B \-n
+options, or it might represent the
+.B n
+field identifier character following the
+.B \-F
+option.
+When ambiguity is possible, start a new option with a `-'
+character \- e.g., ``\fB\-F \-n\fP''.
+If the next option is a file name, follow the possibly ambiguous
+option with ``--'' \- e.g., ``\fB\-F -- \fIname\fR''.
+.PP
+Either the `+' or the `\-' prefix may be applied to a group of options.
+Options that don't take on separate meanings for each
+prefix \- e.g., \fB\-i\fP \- may be grouped under either prefix.
+Thus, for example, ``+M -i'' may be stated as ``+Mi'' and the group
+means the same as the separate options.
+Be careful of prefix grouping when one or more options in the group
+does take on separate meanings under different prefixes \-
+e.g., \fB+|\-M\fP; ``-iM'' is not the same request as ``\-i +M''.
+When in doubt, use separate options with appropriate prefixes.
+.TP \w'names'u+4
+.B \-? \-h
+These two equivalent options select a usage (help) output list.
+.I Lsof
+displays a shortened form of this output when it detects an error
+in the options supplied to it, after it has displayed messages
+explaining each error.
+(Escape the `?' character as your shell requires.)
+.TP \w'names'u+4
+.B \-a
+causes list selection options to be ANDed, as described above.
+.TP \w'names'u+4
+.BI \-A " A"
+is available on systems configured for AFS whose AFS
+kernel code is implemented via dynamic modules.
+It allows the
+.I lsof
+user to specify
+.I A
+as an alternate name list file where the kernel addresses of the dynamic
+modules might be found.
+See the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information about dynamic modules, their
+symbols, and how they affect
+.IR lsof .
+.TP \w'names'u+4
+.B \-b
+causes
+.I lsof
+to avoid kernel functions that might block \-
+.IR lstat (2),
+.IR readlink (2),
+and
+.IR stat (2).
+.IP
+See the
+.B "BLOCKS AND TIMEOUTS"
+and
+.B "AVOIDING KERNEL BLOCKS"
+sections for information on using this option.
+.TP \w'names'u+4
+.BI \-c " c"
+selects the listing of files for processes executing the
+command that begins with the characters of
+.IR c .
+Multiple commands may be specified, using multiple
+.B \-c
+options.
+They are joined in a single ORed set before participating in
+AND option selection.
+.IP
+If
+.I c
+begins with a `^', then the following characters specify a command
+name whose processes are to be ignored (excluded.)
+.IP
+If
+.I c
+begins and ends with a slash ('/'), the characters between the slashes
+are interpreted as a regular expression.
+Shell meta\-characters in the regular expression must be quoted to prevent 
+their interpretation by the shell.
+The closing slash may be followed by these modifiers:
+.IP
+.nf
+	b	the regular expression is a basic one.
+.br
+	i	ignore the case of letters.
+.br
+	x	the regular expression is an extended one
+.br
+		(default).
+.fi
+.IP
+See the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information on basic and extended regular
+expressions.
+.IP
+The simple command specification is tested first.
+If that test fails, the command regular expression is applied.
+If the simple command test succeeds, the command regular expression
+test isn't made.
+This may result in ``no command found for regex:'' messages
+when lsof's
+.B \-V
+option is specified.
+.TP \w'names'u+4
+.BI +c " w"
+defines the maximum number of initial characters of the name,
+supplied by the UNIX dialect, of the UNIX command associated with a process
+to be printed in the COMMAND column.
+(The
+.I lsof
+default is nine.)
+.IP
+Note that many UNIX dialects do not supply all command name characters
+to
+.I lsof
+in the files and structures from which
+.I lsof
+obtains command name.
+Often dialects limit the number of characters supplied in those sources.
+For example, Linux 2.4.27 and Solaris 9 both limit command name length to
+16 characters.
+.IP
+If
+.I w
+is zero ('0'), all command characters supplied to
+.I lsof
+by the UNIX dialect will be printed.
+.IP
+If
+.I w
+is less than the length of the column title, ``COMMAND'', it will
+be raised to that length.
+.TP \w'names'u+4
+.B \-C
+disables the reporting of any path name
+components from the kernel's name cache.
+See the
+.B "KERNEL NAME CACHE"
+section for more information.
+.TP \w'names'u+4
+.BI +d " s"
+causes
+.I lsof
+to search for all open instances of directory
+.I s
+and the files and directories it contains at its top level.
+.B +d
+does NOT descend the directory tree, rooted at
+.IR s .
+The
+.BI +D " D"
+option may be used to request a full\-descent directory tree search,
+rooted at directory
+.IR D .
+.IP
+Processing of the
+.B +d
+option does not follow symbolic links within
+.I s
+unless the
+.B \-x
+or
+.B \-x " l"
+option is also specified.
+Nor does it
+search for open files on file system mount points on subdirectories of
+.I s
+unless the
+.B \-x
+or
+.B \-x " f"
+option is also specified.
+.IP
+Note: the authority of the user of this option limits it to searching for
+files that the user has permission to examine with the system
+.IR stat (2)
+function.
+.TP \w'names'u+4
+.BI \-d " s"
+specifies a list of file descriptors (FDs) to exclude from
+or include in the output listing.
+The file descriptors are specified in the comma\-separated set
+.I s
+\&\- e.g., ``cwd,1,3'', ``^6,^2''.
+(There should be no spaces in the set.)
+.IP
+The list is an exclusion list if all entries of the set begin with `^'.
+It is an inclusion list if no entry begins with `^'.
+Mixed lists are not permitted.
+.IP
+A file descriptor number range may be in the set as long as
+neither member is empty, both members are numbers, and the ending
+member is larger than the starting one \- e.g., ``0-7'' or ``3-10''.
+Ranges may be specified for exclusion if they have the `^' prefix \-
+e.g., ``^0-7'' excludes all file descriptors 0 through 7.
+.IP
+Multiple file descriptor numbers are joined in a single ORed set before
+participating in AND option selection.
+.IP
+When there are exclusion and inclusion members in the set,
+.I lsof
+reports them as errors and exits with a non\-zero return code.
+.IP
+See the description of File Descriptor (FD) output values in the
+.B OUTPUT
+section for more information on file descriptor names.
+.TP \w'names'u+4
+.BI +D " D"
+causes
+.I lsof
+to search for all open instances of directory
+.I D
+and all the files and directories it contains to its complete depth.
+.IP
+Processing of the
+.B +D
+option does not follow symbolic links within
+.I D
+unless the
+.B \-x
+or
+.B \-x " l"
+option is also specified.
+Nor does it
+search for open files on file system mount points on subdirectories of
+.I D
+unless the
+.B \-x
+or
+.B \-x " f"
+option is also specified.
+.IP
+Note: the authority of the user of this option limits it to searching for
+files that the user has permission to examine with the system
+.IR stat (2)
+function.
+.IP
+Further note:
+.I lsof
+may process this option slowly and require a large amount of dynamic memory
+to do it.
+This is because it must descend the entire directory tree, rooted at
+.IR D ,
+calling
+.IR stat (2)
+for each file and directory, building a list of all the files it finds, and
+searching that list for a match with every open file.
+When directory
+.I D
+is large, these steps can take a long time, so use this option prudently.
+.TP \w'names'u+4
+.BI \-D " D"
+directs
+.I lsof's
+use of the device cache file.
+The use of this option is sometimes restricted.
+See the
+.B "DEVICE CACHE FILE"
+section and the sections that follow it for more information on this
+option.
+.IP
+.B -D
+must be followed by a function letter; the function letter may optionally
+be followed by a path name.
+.I Lsof
+recognizes these function letters:
+.IP
+.nf
+	\fB?\fP \- report device cache file paths
+	\fBb\fP \- build the device cache file
+	\fBi\fP \- ignore the device cache file
+	\fBr\fP \- read the device cache file
+	\fBu\fP \- read and update the device cache file
+.fi
+.IP
+The
+.BR b ,
+.BR r ,
+and
+.B u
+functions, accompanied by a path name, are sometimes restricted.
+When these functions are restricted, they will not appear in
+the description of the
+.B \-D
+option that accompanies
+.B \-h
+or
+.B \-?
+option output.
+See the
+.B "DEVICE CACHE FILE"
+section and the sections that follow it for more information on these
+functions and when they're restricted.
+.IP
+The
+.B ?
+function reports the read\-only and write paths that lsof can
+use for the device cache file,
+the names of any environment variables whose values
+.I lsof
+will examine when forming the device cache file path,
+and the format for the personal device cache file path.
+(Escape the `?' character as your shell requires.)
+.IP
+When available, the
+.BR b ,
+.BR r ,
+and
+.B u
+functions may be followed by the device cache file's path.
+The standard default is
+.I .lsof_hostname
+in the home directory of the real user ID that executes
+.IR lsof ,
+but this could have been changed when
+.I lsof
+was configured and compiled.
+(The output of the
+.B \-h
+and
+.B \-?
+options show the current default prefix \- e.g., ``.lsof''.)
+The suffix,
+.IR hostname ,
+is the first component of the host's name returned by
+.IR gethostname (2) .
+.IP
+When available, the
+.B b
+function directs
+.I lsof
+to build a new device cache file at the default or specified path.
+.IP
+The
+.B i
+function directs
+.I lsof
+to ignore the default device cache file and obtain its information
+about devices via direct calls to the kernel.
+.IP
+The
+.B r
+function directs
+.I lsof
+to read the device cache at the default or specified path, but
+prevents it from creating a new device cache file when none
+exists or the existing one is improperly structured.
+The
+.B r
+function, when specified without a path name, prevents
+.I lsof
+from updating an incorrect or outdated device cache file,
+or creating a new one in its place.
+The
+.B r
+function is always available when it is specified without a
+path name argument; it may be restricted by the permissions of the
+.I lsof
+process.
+.IP
+When available, the
+.B u
+function directs
+.I lsof
+to read the device cache file at the default or specified path,
+if possible, and to rebuild it, if necessary.
+This is the default device cache file function when no
+.B \-D
+option has been specified.
+.TP \w'names'u+4
+.BI +|\-e " s"
+exempts the file system whose path name is
+.I s
+from being subjected to kernel function calls that might block.
+The
+.B +e
+option exempts
+.IR stat (2),
+.IR lstat (2)
+and most
+.IR readlink (2)
+kernel function calls.
+The
+.B \-e
+option exempts only
+.IR stat(2)
+and
+.IR lstat (2)
+kernel function calls.
+Multiple file systems may be specified with separate
+.B +|\-e
+specifications and each may have
+.IR readlink (2)
+calls exempted or not.
+.IP
+This option is currently implemented only for Linux.
+.IP
+.B CAUTION:
+this option can easily be mis\-applied to other than
+the file system of interest, because it uses path name rather
+than the more reliable device and inode numbers.
+(Device and inode numbers are acquired via the potentially blocking
+.IR stat (2)
+kernel call and are thus not available, but see the
+.BI +|\-m " m"
+option as a possible alternative way to supply device numbers.)
+\fBUse this option with great care and fully specify the path name of the
+file system to be exempted.\fP
+.IP
+When open files on exempted file systems are reported, it may not be
+possible to obtain all their information.
+Therefore, some information columns will be blank, the characters ``UNKN''
+preface the values in the TYPE column, and the applicable exemption option
+is added in parentheses to the end of the NAME column.
+(Some device number information might be made available via the
+.BI +|\-m " m"
+option.)
+.TP \w'names'u+4
+.B +|\-f [cfgGn]
+.B f
+by itself clarifies how path name arguments are to be interpreted.
+When followed by
+.BR c ,
+.BR f ,
+.BR g ,
+.BR G ,
+or
+.B n
+in any combination it specifies
+that the listing of kernel file structure information is to be enabled
+(`+') or inhibited (`\-').
+.IP
+Normally a path name argument is taken to be a file system name if
+it matches a mounted\-on directory name reported by
+.IR mount (8),
+or if it represents a block device, named in the
+.I mount
+output and associated with a mounted directory name.
+When
+.B +f
+is specified, all path name arguments will be taken to be file
+system names, and
+.I lsof
+will complain if any are not.
+This can be useful, for example, when the file system name
+(mounted\-on device) isn't a block device.
+This happens for some CD-ROM file systems.
+.IP
+When
+.B \-f
+is specified by itself, all path name arguments will be taken to be
+simple files.
+Thus, for example, the ``\fB\-f\fP\ -- /'' arguments direct lsof to search
+for open files with a `/' path name, not all open files in the `/'
+(root) file system.
+.IP
+Be careful to make sure
+.B +f
+and
+.B \-f
+are properly terminated and aren't followed by a character (e.g., of
+the file or file system name) that might be taken as a parameter.
+For example, use ``--'' after
+.B +f
+and
+.B \-f
+as in these examples.
+.IP
+.nf
+	$ lsof +f -- /file/system/name
+	$ lsof -f -- /file/name
+.fi
+.IP
+The listing of information from kernel file structures, requested with the
+.B +f [cfgGn]
+option form, is normally
+inhibited, and is not available in whole or part for some dialects \- e.g.,
+/proc\-based Linux kernels below 2.6.22.
+When the prefix to
+.B f
+is a plus sign (`+'), these characters request file structure information:
+.IP
+.nf
+	\fBc\fR	file structure use count (not Linux)
+	\fBf\fR	file structure address (not Linux)
+	\fBg\fR	file flag abbreviations (Linux 2.6.22 and up)
+	\fBG\fR	file flags in hexadecimal (Linux 2.6.22 and up)
+	\fBn\fR	file structure node address (not Linux)
+.fi
+.IP
+When the prefix is minus (`\-') the same characters disable the
+listing of the indicated values.
+.IP
+File structure addresses, use counts, flags, and node addresses may be
+used to detect more readily identical files inherited by child
+processes and identical files in use by different processes.
+.I Lsof
+column output can be sorted by output columns holding the values
+and listed to identify identical file use, or
+.I lsof
+field output can be parsed by an AWK or Perl post\-filter script,
+or by a C program.
+.TP \w'names'u+4
+.BI \-F " f"
+specifies a character list,
+.IR f ,
+that selects the fields to be output for processing by another program,
+and the character that terminates each output field.
+Each field to be output is specified with a single character in
+.IR f .
+The field terminator defaults to NL, but may be changed to NUL (000).
+See the
+.B "OUTPUT FOR OTHER PROGRAMS"
+section for a description of the field identification characters and
+the field output process.
+.IP
+When the field selection character list is empty, all standard fields are
+selected (except the raw device field, security context and zone field for
+compatibility reasons)
+and the NL field terminator is used.
+.IP
+When the field selection character list contains only a zero (`0'),
+all fields are selected (except the raw device field for compatibility
+reasons) and the NUL terminator character is used.
+.IP
+Other combinations of fields and their associated field terminator
+character must be set with explicit entries in
+.IR f ,
+as described in the
+.B "OUTPUT FOR OTHER PROGRAMS"
+section.
+.IP
+When a field selection character identifies an item
+.I lsof
+does not normally list \- e.g., PPID, selected with
+.BR \-R " \-"
+specification of the field character \- e.g., ``\fB\-FR\fP'' \-
+also selects the listing of the item.
+.IP
+When the field selection character list contains the single
+character `?',
+.I lsof
+will display a help list of the field identification characters.
+(Escape the `?' character as your shell requires.)
+.TP \w'names'u+4
+.BI \-g " [s]"
+excludes or selects the listing of files for the processes
+whose optional process group IDentification (PGID) numbers are in the
+comma\-separated set
+.I s
+\&\- e.g., ``123'' or ``123,^456''.
+(There should be no spaces in the set.)
+.IP
+PGID numbers that begin with `^' (negation) represent exclusions.
+.IP
+Multiple PGID numbers are joined in a single ORed set before participating
+in AND option selection.
+However, PGID exclusions are applied without ORing or ANDing
+and take effect before other selection criteria are applied.
+.IP
+The
+.B \-g
+option also enables the output display of PGID numbers.
+When specified without a PGID set that's all it does.
+.TP \w'names'u+4
+.BI \-i " [i]"
+selects the listing of files any of whose Internet address
+matches the address specified in \fIi\fP.
+If no address is specified, this option selects the listing of all
+Internet and x.25 (HP\-UX) network files.
+.IP
+If
+.BI \-i 4
+or
+.BI \-i 6
+is specified with no following address, only files of the indicated
+IP version, IPv4 or IPv6, are displayed.
+(An IPv6 specification may be used only if the dialects supports IPv6,
+as indicated by ``[46]'' and ``IPv[46]'' in
+.I lsof's
+.B \-h
+or
+.B \-?
+output.)
+Sequentially specifying
+.BR \-i 4,
+followed by
+.BR \-i 6
+is the same as specifying
+.BR \-i ,
+and vice-versa.
+Specifying
+.BR \-i 4,
+or
+.BR \-i 6
+after
+.B \-i
+is the same as specifying
+.BR \-i 4
+or
+.BR \-i 6
+by itself.
+.IP
+Multiple addresses (up to a limit of 100) may be specified with multiple
+.B \-i
+options.
+(A port number or service name range is counted as one address.)
+They are joined in a single ORed set before participating in
+AND option selection.
+.IP
+An Internet address is specified in the form (Items in square
+brackets are optional.):
+.IP
+[\fI46\fP][\fIprotocol\fP][@\fIhostname\fP\||\|\fIhostaddr\fP][:\fIservice\fP\||\|\fIport\fP]
+.IP
+where:
+.nf
+.br
+	\fI46\fP specifies the IP version, IPv4 or IPv6
+.br
+		that applies to the following address.
+.br
+		'6' may be be specified only if the UNIX
+.br
+		dialect supports IPv6.  If neither '4' nor
+.br
+		'6' is specified, the following address
+.br
+		applies to all IP versions.
+.br
+	\fIprotocol\fP is a protocol name \- \fBTCP\fP, \fBUDP\fP
+.br		or \fBUDPLITE\fP.
+.br
+	\fIhostname\fP is an Internet host name.  Unless a
+.br
+		specific IP version is specified, open
+.br
+		network files associated with host names
+.br
+		of all versions will be selected.
+.br
+	\fIhostaddr\fP is a numeric Internet IPv4 address in
+.br
+		dot form; or an IPv6 numeric address in
+.br
+		colon form, enclosed in brackets, if the
+.br
+		UNIX dialect supports IPv6.  When an IP
+.br
+		version is selected, only its numeric
+.br
+		addresses may be specified.
+.br
+	\fIservice\fP is an \fI/etc/services\fP name \- e.g., \fBsmtp\fP \-
+		or a list of them.
+.br
+	\fIport\fP is a port number, or a list of them.
+.fi
+.IP
+IPv6 options may be used only if the UNIX dialect supports IPv6.
+To see if the dialect supports IPv6, run
+.I lsof
+and specify the
+.B \-h
+or
+.B \-?
+(help) option.
+If the displayed description of the
+.B \-i
+option contains ``[46]'' and ``IPv[46]'', IPv6 is supported.
+.IP
+IPv4 host names and addresses may not be specified if network file selection
+is limited to IPv6 with
+.BR \-i " 6."
+IPv6 host names and addresses may not be specified if network file selection
+is limited to IPv4 with
+.BR \-i " 4."
+When an open IPv4 network file's address is mapped in an IPv6 address,
+the open file's type will be IPv6, not IPv4, and its display will be
+selected by '6', not '4'.
+.IP
+At least one address component \-
+.BR 4,
+.BR 6,
+.IR protocol ,
+.IR hostname ,
+.IR hostaddr ,
+or
+.I service
+\&\- must be supplied.
+The `@' character, leading the host specification, is always required;
+as is the `:', leading the port specification.
+Specify either
+.I hostname
+or
+.IR hostaddr .
+Specify either
+.I service
+name list or
+.I port
+number list.
+If a
+.I service
+name list is specified, the
+.I protocol
+may also need to be specified if the TCP, UDP and UDPLITE port numbers for
+the service name are different.
+Use any case \- lower or upper \- for
+.IR protocol .
+.IP
+.I Service
+names and
+.I port
+numbers may be combined in a list whose entries are separated by commas
+and whose numeric range entries are separated by minus signs.
+There may be no embedded spaces, and all service names must belong to
+the specified
+.IR protocol .
+Since service names may contain embedded minus signs, the starting entry
+of a range can't be a service name; it can be a port number, however.
+.IP
+Here are some sample addresses:
+.nf
+
+.br
+	-i6 \- IPv6 only
+.br
+	TCP:25 \- TCP and port 25
+.br
+	@1.2.3.4 \- Internet IPv4 host address 1.2.3.4
+.br
+	@[3ffe:1ebc::1]:1234 \- Internet IPv6 host address
+		3ffe:1ebc::1, port 1234
+.br
+	UDP:who \- UDP who service port
+.br
+	TCP@lsof.itap:513 \- TCP, port 513 and host name lsof.itap
+.br
+	tcp@foo:1-10,smtp,99 \- TCP, ports 1 through 10,
+		service name \fIsmtp\fP, port 99, host name foo
+.br
+	tcp@bar:1-smtp \- TCP, ports 1 through \fIsmtp\fP, host bar
+.br
+	:time \- either TCP, UDP or UDPLITE time service port
+.fi
+.TP \w'names'u+4
+.B \-K
+selects the listing of tasks of processes, on dialects
+where task reporting is supported.
+(If help output \- i.e., the output of the
+.B \-h
+or
+.B \-?
+options \- shows this option, then task reporting is supported by
+the dialect.)
+.IP
+When
+.B \-K
+and
+.B \-a
+are both specified and the tasks of a main process are selected
+by other options, the main process will also be listed as though
+it were a task, but without a task ID.
+(See the description of the TID column in the
+.B OUTPUT
+section.)
+.TP \w'names'u+4
+.BI \-k " k"
+specifies a kernel name list file,
+.IR k ,
+in place of /vmunix, /mach, etc.
+.B \-k
+is not available under AIX on the IBM RISC/System 6000.
+.TP \w'names'u+4
+.B \-l
+inhibits the conversion of user ID numbers to login names.
+It is also useful when login name lookup is working improperly or slowly.
+.TP \w'names'u+4
+.BI +|\-L " [l]"
+enables (`+') or disables (`-') the listing of file link
+counts, where they are available \- e.g., they aren't available
+for sockets, or most FIFOs and pipes.
+.IP
+When
+.B +L
+is specified without a following number, all link counts will be listed.
+When
+.B \-L
+is specified (the default), no link counts will be listed.
+.IP
+When
+.B +L
+is followed by a number, only files having a link count less than
+that number will be listed.
+(No number may follow
+.BR \-L .)
+A specification of the form ``\fB+L1\fP'' will select open files that
+have been unlinked.
+A specification of the form ``\fB+aL1\ \fI<file_system>\fR'' will select
+unlinked open files on the specified file system.
+.IP
+For other link count comparisons, use field output (\fB\-F\fP)
+and a post\-processing script or program.
+.TP \w'names'u+4
+.BI +|\-m " m"
+specifies an alternate kernel memory file or activates
+mount table supplement processing.
+.IP
+The option form
+.BI \-m " m"
+specifies a kernel memory file,
+.IR m ,
+in place of
+.I /dev/kmem
+or
+.I /dev/mem
+\&\- e.g., a crash dump file.
+.IP
+The option form
+.B +m
+requests that a mount supplement file be written to the standard output
+file.
+All other options are silently ignored.
+.IP
+There will be a line in the mount supplement file for each mounted file
+system, containing the mounted file system directory, followed by a single
+space, followed by the device number in hexadecimal "0x" format \- e.g.,
+.IP
+.nf
+	/ 0x801
+.fi
+.IP
+.I Lsof
+can use the mount supplement file to get device numbers for file systems
+when it can't get them via
+.IR stat (2)
+or
+.IR lstat (2).
+.IP
+The option form
+.BI +m " m"
+identifies
+.I m
+as a mount supplement file.
+.IP
+Note: the
+.B +m
+and
+.BI +m " m"
+options are not available for all supported dialects.
+Check the output of
+.I lsof's
+.B \-h
+or
+.B \-?
+options to see if the
+.B +m
+and
+.BI +m " m"
+options are available.
+.TP \w'names'u+4
+.B +|\-M
+Enables (\fB+\fP) or disables (\fB-\fP) the
+reporting of portmapper registrations for local TCP, UDP and UDPLITE ports,
+where port mapping is supported.
+(See the last paragraph of this option description for information about
+where portmapper registration reporting is suported.)
+.IP
+The default reporting mode is set by the
+.I lsof
+builder with the HASPMAPENABLED #define in the dialect's machine.h
+header file;
+.I lsof
+is distributed with the HASPMAPENABLED #define deactivated, so
+portmapper reporting is disabled by default and must be requested
+with
+.BR \+M .
+Specifying
+.I lsof's
+.B \-h
+or
+.B \-?
+option will report the default mode.
+Disabling portmapper registration when it is already disabled or
+enabling it when already enabled is acceptable.
+When portmapper registration reporting is enabled,
+.I lsof
+displays the portmapper registration (if any) for local TCP, UDP or
+UDPLITE ports
+in square brackets immediately following the port numbers or service
+names \- e.g., ``:1234[name]'' or ``:name[100083]''.
+The registration information may be a name or number, depending
+on what the registering program supplied to the portmapper when
+it registered the port.
+.IP
+When portmapper registration reporting is enabled,
+.I lsof
+may run a little more slowly or even become blocked when access to the
+portmapper becomes congested or stopped.
+Reverse the reporting mode to determine if portmapper registration
+reporting is slowing or blocking
+.IR lsof .
+.IP
+For purposes of portmapper registration reporting
+.I lsof
+considers a TCP, UDP or UDPLITE port local if: it is found in the local part
+of its containing kernel structure;
+or if it is located in the foreign part of its containing kernel
+structure and the local and foreign Internet addresses are the same;
+or if it is located in the foreign part of its containing kernel
+structure and the foreign Internet address is INADDR_LOOPBACK (127.0.0.1).
+This rule may make
+.I lsof
+ignore some foreign ports on machines with multiple interfaces
+when the foreign Internet address is on a different interface
+from the local one.
+.IP
+See the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for further discussion of portmapper registration
+reporting issues.
+.IP
+Portmapper registration reporting is supported only on dialects that
+have RPC header files.
+(Some Linux distributions with GlibC 2.14 do not have them.)
+When portmapper registration reporting is supported, the
+.B \-h
+or
+.B \-?
+help output will show the
+.B +|\-M
+option.
+.TP \w'names'u+4
+.B \-n
+inhibits the conversion of network numbers to 
+host names for network files.
+Inhibiting conversion may make
+.I lsof
+run faster.
+It is also useful when host name lookup is not working properly.
+.TP \w'names'u+4
+.B \-N
+selects the listing of NFS files.
+.TP \w'names'u+4
+.BI \-o
+directs
+.I lsof
+to display file offset at all times.
+It causes the SIZE/OFF output column title to be changed to OFFSET.
+Note: on some UNIX dialects
+.I lsof
+can't obtain accurate or consistent file offset information from its
+kernel data sources, sometimes just for particular kinds of files
+(e.g., socket files.)
+Consult the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information.
+.IP
+The
+.B \-o
+and
+.B \-s
+options are mutually exclusive; they can't both be specified.
+When neither is specified,
+.I lsof
+displays whatever value \- size or offset \- is appropriate and
+available for the type of the file.
+.TP \w'names'u+4
+.BI \-o " o"
+defines the number of decimal digits (\fIo\fP) to be
+printed after the ``0t'' for a file offset before the form is switched
+to ``0x...''.
+An
+.I o
+value of zero (unlimited) directs
+.I lsof
+to use the ``0t'' form for all offset output.
+.IP
+This option does NOT direct
+.I lsof
+to display offset at all times; specify
+.B \-o
+(without a trailing number) to do that.
+.BI \-o " o"
+only specifies the number of digits after ``0t'' in
+either mixed size and offset or offset\-only output.
+Thus, for example, to direct
+.I lsof
+to display offset at all times with a decimal digit count of 10, use:
+.IP
+.nf
+	-o -o 10
+or
+	-oo10
+.fi
+.IP
+The default number of digits allowed after ``0t'' is normally 8,
+but may have been changed by the lsof builder.
+Consult the description of the
+.BI \-o " o"
+option in the output of the
+.B \-h
+or
+.B \-?
+option to determine the default that is in effect.
+.TP \w'names'u+4
+.B \-O
+directs
+.I lsof
+to bypass the strategy it uses to avoid being blocked by some
+kernel operations \- i.e., doing them in forked child processes.
+See the
+.B "BLOCKS AND TIMEOUTS"
+and
+.B "AVOIDING KERNEL BLOCKS"
+sections for more information on kernel operations that may block
+.IR lsof .
+.IP
+While use of this option will reduce
+.I lsof
+startup overhead, it may also cause
+.I lsof
+to hang when the kernel doesn't respond to a function.
+Use this option cautiously.
+.TP \w'names'u+4
+.BI \-p " s"
+excludes or selects the listing of files for the processes
+whose optional process IDentification (PID) numbers are in the
+comma\-separated set
+.I s
+\&\- e.g., ``123'' or ``123,^456''.
+(There should be no spaces in the set.)
+.IP
+PID numbers that begin with `^' (negation) represent exclusions.
+.IP
+Multiple process ID numbers are joined in a single ORed set before
+participating in AND option selection.
+However, PID exclusions are applied without ORing or ANDing
+and take effect before other selection criteria are applied.
+.TP \w'names'u+4
+.B \-P
+inhibits the conversion of port numbers to port
+names for network files.
+Inhibiting the conversion may make
+.I lsof
+run a little faster.
+It is also useful when port name lookup is not working properly.
+.TP \w'names'u+4
+.BI +|\-r " [t[m<fmt>]]"
+puts
+.I lsof
+in repeat mode.
+There
+.I lsof
+lists open files as selected by other options, delays
+.I t
+seconds (default fifteen), then repeats the listing, delaying
+and listing repetitively until stopped by a condition defined by
+the prefix to the option.
+.IP
+If the prefix is a `\-', repeat mode is endless.
+.I Lsof
+must be terminated with an interrupt or quit signal.
+.IP
+If the prefix is `+', repeat mode will end the first cycle no open files
+are listed \- and of course when
+.I lsof
+is stopped with an interrupt or quit signal.
+When repeat mode ends because no files are listed, the process exit code
+will be zero if any open files were ever listed; one, if none were ever
+listed.
+.IP
+.I Lsof
+marks the end of each listing:
+if field output is in progress (the
+.BR \-F ,
+option has been specified), the default marker is `m'; otherwise the
+default marker is ``========''.
+The marker is followed by a NL character.
+.IP
+The optional "m<fmt>" argument specifies a format for the marker line.
+The <fmt> characters following `m' are interpreted as a format
+specification to the
+.IR strftime (3)
+function, when both it and the
+.IR localtime (3)
+function are available in the dialect's C library.
+Consult the
+.IR strftime (3)
+documentation for what may appear in its format specification.
+Note that when field output is requested with the
+.B \-F
+option, <fmt> cannot contain the NL format, ``%n''.
+Note also that when <fmt> contains spaces or other characters that
+affect the shell's interpretation of arguments, <fmt> must be
+quoted appropriately.
+.IP
+Repeat mode reduces
+.I lsof
+startup overhead, so it is more efficient to use this mode
+than to call
+.I lsof
+repetitively from a shell script, for example.
+.IP
+To use repeat mode most efficiently, accompany
+.B +|\-r
+with specification of other
+.I lsof
+selection options, so the amount of kernel memory access
+.I lsof
+does will be kept to a minimum.
+Options that filter at the process level \- e.g.,
+.BR \-c ,
+.BR \-g ,
+.BR \-p ,
+.B \-u
+\&\- are the most efficient selectors.
+.IP
+Repeat mode is useful when coupled with field output (see the
+.BR \-F ,
+option description) and a supervising
+.I awk
+or
+.I Perl
+script, or a C program.
+.TP \w'names'u+4
+.B \-R
+directs lsof to list the Parent Process IDentification
+number in the PPID column.
+.TP \w'names'u+4
+.BI \-s " [p:s]"
+.B s
+alone directs
+.I lsof
+to display file size at all times.
+It causes the SIZE/OFF output column title to be changed to SIZE.
+If the file does not have a size, nothing is displayed.
+.IP
+When followed by a protocol name (\fIp\fR), either TCP or UDP,
+a colon (`:') and a comma\-separated protocol state name list,
+the option causes open TCP and UDP files to be excluded if their
+state name(s) are in the list (\fIs\fP) preceded by a `^'; or
+included if their name(s) are not preceded by a `^'.
+.IP
+When an inclusion list is defined, only network files with state
+names in the list will be present in the
+.I lsof
+output.
+Thus, specifying one state name means that only network files
+with that lone state name will be listed.
+.IP
+Case is unimportant in the protocol or state names, but there may
+be no spaces and the colon (`:') separating the protocol
+name (\fIp\fP) and the state name list (\fIs\fP) is required.
+.IP
+If only TCP and UDP files are to be listed, as controlled by
+the specified exclusions and inclusions, the
+.B \-i
+option must be specified, too.
+If only a single protocol's files are to be listed, add its name
+as an argument to the
+.B \-i
+option.
+.IP
+For example, to list only network files with TCP state LISTEN, use:
+.IP
+.nf
+	\-iTCP \-sTCP:LISTEN
+.fi
+.IP
+Or, for example, to list network files with all UDP states except
+Idle, use:
+.IP
+.nf
+	\-iUDP -sUDP:Idle
+.fi
+.IP
+State names vary with UNIX dialects, so it's not possible to
+provide a complete list.  Some common TCP state names are:
+CLOSED, IDLE, BOUND, LISTEN, ESTABLISHED, SYN_SENT, SYN_RCDV,
+ESTABLISHED, CLOSE_WAIT, FIN_WAIT1, CLOSING, LAST_ACK, FIN_WAIT_2,
+and TIME_WAIT.
+Two common UDP state names are Unbound and Idle.
+.IP
+See the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information on how to use protocol state exclusion and
+inclusion, including examples.
+.IP
+The
+.B \-o
+(without a following decimal digit count) and
+.B \-s
+option (without a following protocol and state name list)
+are mutually exclusive; they can't both be specified.
+When neither is specified,
+.I lsof
+displays whatever value \- size or offset \- is appropriate and
+available for the type of file.
+.IP
+Since some types of files don't have true sizes \- sockets, FIFOs,
+pipes, etc. \- lsof displays for their sizes the content amounts in
+their associated kernel buffers, if possible.
+.TP \w'names'u+4
+.BI \-S " [t]"
+specifies an optional time-out seconds value for kernel functions \-
+.IR lstat (2),
+.IR readlink (2),
+and
+.IR stat (2)
+\- that might otherwise deadlock.
+The minimum for
+.I t
+is two;
+the default, fifteen; when no value is specified, the default is used.
+.IP
+See the
+.B "BLOCKS AND TIMEOUTS"
+section for more information.
+.TP \w'names'u+4
+.BI \-T " [t]"
+controls the reporting of some TCP/TPI information, also
+reported by
+.IR netstat (1),
+following the network addresses.
+In normal output the information appears in parentheses, each item
+except TCP or TPI state name identified by a keyword, followed by `=',
+separated from others by a single space:
+.IP
+.nf
+	<TCP or TPI state name>
+	QR=<read queue length>
+	QS=<send queue length>
+	SO=<socket options and values>
+	SS=<socket states>
+	TF=<TCP flags and values>
+	WR=<window read length>
+	WW=<window write length>
+.fi
+.IP
+Not all values are reported for all UNIX dialects.
+Items values (when available) are reported after the item name and '='.
+.IP
+When the field output mode is in effect (See
+.BR "OUTPUT FOR OTHER PROGRAMS" .)
+each item appears as a field with a `T' leading character.
+.IP
+.B \-T
+with no following key characters disables TCP/TPI information reporting.
+.IP
+.B \-T
+with following characters selects the reporting of specific TCP/TPI
+information:
+.IP
+.nf
+	\fBf\fP	selects reporting of socket options,
+		states and values, and TCP flags and
+		values.
+	\fBq\fP	selects queue length reporting.
+	\fBs\fP	selects connection state reporting.
+	\fBw\fP	selects window size reporting.
+.fi
+.IP
+Not all selections are enabled for some UNIX dialects.
+State may be selected for all dialects and is reported by default.
+The
+.B \-h
+or
+.B \-?
+help output for the
+.B \-T
+option will show what selections may be used with the UNIX dialect.
+.IP
+When
+.B \-T
+is used to select information \- i.e., it is followed by one or more
+selection characters \- the displaying of state is disabled by default,
+and it must be explicitly selected again in the characters following
+.BR \-T .
+(In effect, then, the default is equivalent to
+.BR -Ts .)
+For example, if queue lengths and state are desired, use
+.BR \-Tqs .
+.IP
+Socket options, socket states, some socket values, TCP flags and
+one TCP value may be reported (when available in the UNIX dialect)
+in the form of the names that commonly appear after SO_, so_, SS_,
+TCP_  and TF_ in the dialect's header files \-
+most often <sys/socket.h>, <sys/socketvar.h> and <netinet/tcp_var.h>.
+Consult those header files for the meaning of the flags, options,
+states and values.
+.IP
+``SO='' precedes socket options and values; ``SS='', socket states;
+and ``TF='', TCP flags and values.
+.IP
+If a flag or option has a value, the value will follow an '=' and
+the name -- e.g., ``SO=LINGER=5'', ``SO=QLIM=5'', ``TF=MSS=512''.
+The following seven values may be reported:
+.IP
+.nf
+	Name
+	Reported	Description (Common Symbol)
+
+	KEEPALIVE	keep alive time (SO_KEEPALIVE)
+	LINGER	linger time (SO_LINGER)
+	MSS		maximum segment size (TCP_MAXSEG)
+	PQLEN	partial listen queue connections
+	QLEN		established listen queue connections
+	QLIM		established listen queue limit
+	RCVBUF	receive buffer length (SO_RCVBUF)
+	SNDBUF	send buffer length (SO_SNDBUF)
+.fi
+.IP
+Details on what socket options and values, socket states, and TCP flags
+and values may be displayed for particular UNIX dialects may be found in
+the answer to the ``Why doesn't lsof report socket options, socket states,
+and TCP flags and values for my dialect?'' and ``Why doesn't lsof report
+the partial listen queue connection count for my dialect?''
+questions in the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+.TP \w'names'u+4
+.B \-t 
+specifies that
+.I lsof
+should produce terse output with process identifiers only and no header \-
+e.g., so that the output may be piped to
+.IR kill (1).
+.B \-t
+selects the
+.B \-w
+option.
+.TP \w'names'u+4
+.BI \-u " s"
+selects the listing of files for the user whose login names
+or user ID numbers are in the comma\-separated set
+.I s
+\&\- e.g., ``abe'',
+or ``548,root''.
+(There should be no spaces in the set.)
+.IP
+Multiple login names or user ID numbers are joined in a single ORed set
+before participating in AND option selection.
+.IP
+If a login name or user ID is preceded by a `^', it becomes a negation \-
+i.e., files of processes owned by the login name or user ID will never
+be listed.
+A negated login name or user ID selection is neither ANDed nor ORed
+with other selections; it is applied before all other selections and
+absolutely excludes the listing of the files of the process.
+For example, to direct
+.I lsof
+to exclude the listing of files belonging to root processes,
+specify ``\-u^root'' or ``\-u^0''.
+.TP \w'names'u+4
+.B \-U
+selects the listing of UNIX domain socket files.
+.TP \w'names'u+4
+.B \-v
+selects the listing of
+.I lsof
+version information, including: revision number;
+when the
+.I lsof
+binary was constructed;
+who constructed the binary and where;
+the name of the compiler used to construct the
+.I lsof binary;
+the version number of the compiler when readily available;
+the compiler and loader flags used to construct the
+.I lsof
+binary;
+and system information, typically the output of
+.IR uname 's
+.B \-a
+option.
+.TP \w'names'u+4
+.B \-V
+directs
+.I lsof
+to indicate the items it was asked to list and failed to find \- command
+names, file names, Internet addresses or files, login names, NFS files,
+PIDs, PGIDs, and UIDs.
+.IP
+When other options are ANDed to search options, or compile\-time
+options restrict the listing of some files,
+.I lsof
+may not report that it failed to find a search item when an ANDed
+option or compile\-time option prevents the listing of the open file
+containing the located search item.
+.IP
+For example, ``lsof -V -iTCP@foobar -a -d 999'' may not report a
+failure to locate open files at ``TCP@foobar'' and may not list
+any, if none have a file descriptor number of 999.
+A similar situation arises when HASSECURITY and HASNOSOCKSECURITY are
+defined at compile time and they prevent the listing of open files.
+.TP \w'names'u+4
+.B +|\-w
+Enables (\fB+\fP) or disables (\fB-\fP) the suppression of warning messages.
+.IP
+The
+.I lsof
+builder may choose to have warning messages disabled or enabled by
+default.
+The default warning message state is indicated in the output of the
+.B \-h
+or
+.B \-?
+option.
+Disabling warning messages when they are already disabled or enabling
+them when already enabled is acceptable.
+.IP
+The
+.B \-t
+option selects the
+.B \-w
+option.
+.TP \w'names'u+4
+.BI \-x " [fl]"
+may accompany the
+.B +d
+and
+.B +D
+options to direct their processing to cross over symbolic
+links and|or file system mount points encountered when
+scanning the directory (\fB+d\fP) or directory tree (\fB+D\fP).
+.IP
+If
+.B -x
+is specified by itself without a following parameter, cross\-over
+processing of both symbolic links and file system mount points is
+enabled.
+Note that when
+.B \-x
+is specified without a parameter, the next argument must begin with '-'
+or '+'.
+.IP
+The optional 'f' parameter enables file system mount point cross\-over
+processing; 'l', symbolic link cross\-over processing.
+.IP
+The
+.B \-x
+option may not be supplied without also supplying a
+.B +d
+or
+.B +D
+option.
+.TP \w'names'u+4
+.B \-X
+This is a dialect\-specific option.
+.HP \w'names'u+4
+\ \ \ \ AIX:
+.br
+This IBM AIX RISC/System 6000 option requests the reporting
+of executed text file and shared library references.
+.IP
+.B WARNING:
+because this option uses the kernel readx() function, its use on
+a busy AIX system might cause an application process to hang so
+completely that it can neither be killed nor stopped.
+I have never seen this happen or had a report of its happening,
+but I think there is a remote possibility it could happen.
+.IP
+By default use of readx() is disabled.
+On AIX 5L and above
+.I lsof
+may need setuid\-root permission to perform the actions this
+option requests.
+.IP
+The
+.I lsof
+builder may specify that the
+.B \-X
+option be restricted to processes whose real UID is root.
+If that has been done, the
+.B \-X
+option will not appear in the
+.B \-h
+or
+.B \-?
+help output unless the real UID of the
+.I lsof
+process is root.
+The default
+.I lsof
+distribution allows any UID to specify
+.BR \-X,
+so by default it will appear in the help output.
+.IP
+When AIX readx() use
+is disabled,
+.I lsof
+may not be able to report information for all text and loader file
+references, but it may also avoid exacerbating an AIX
+kernel directory search kernel error, known as the Stale Segment
+ID bug.
+.IP
+The readx() function, used by
+.I lsof
+or any other program to access some sections of kernel virtual
+memory, can trigger the Stale Segment ID bug.
+It can cause the kernel's dir_search() function to believe erroneously
+that part of an in\-memory copy of a file system directory has been
+zeroed.
+Another application process, distinct from
+.IR lsof ,
+asking the kernel to search the directory \- e.g., by using
+.IR open "(2) \-"
+can cause dir_search() to loop forever, thus hanging the application process.
+.IP
+Consult the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+and the
+.I 00README
+file of the
+.I lsof
+distribution for a more complete description of the Stale Segment ID bug,
+its APAR, and methods for defining readx() use when compiling
+.IR lsof .
+.HP \w'names'u+4
+\ \ \ \ Linux:
+.br
+This Linux option requests that
+.I lsof
+skip the reporting of information on all open TCP, UDP and UDPLITE IPv4
+and IPv6 files.
+.IP
+This Linux option is most useful when the system has an extremely
+large number of open TCP, UDP and UDPLITE files, the processing of whose
+information in the
+.I /proc/net/tcp*
+and
+.I /proc/net/udp*
+files would take
+.I lsof
+a long time, and whose reporting is not of interest.
+.IP
+Use this option with care and only when you are sure that the
+information you want
+.I lsof
+to display isn't associated with open TCP, UDP or UDPLITE socket files.
+.HP \w'names'u+4
+\ \ \ \ Solaris 10 and above:
+.br
+This Solaris 10 and above option requests the reporting of cached
+paths for files that have been deleted \- i.e., removed with
+.IR rm (1)
+or
+.IR unlink (2).
+.IP
+The cached path is followed by the string ``\ (deleted)'' to indicate
+that the path by which the file was opened has been deleted.
+.IP
+Because intervening changes made to the path \- i.e., renames with
+.IR mv (1)
+or
+.IR rename (2)
+\- are not recorded in the cached path, what
+.I lsof
+reports is only the path by which the file was opened, not its
+possibly different final path.
+.TP \w'names'u+4
+.BI \-z " [z]"
+specifies how Solaris 10 and higher zone information is to be handled.
+.IP
+Without a following argument \- e.g., NO
+.IR z " \-"
+the option specifies that zone names are to be listed in the ZONE
+output column.
+.IP
+The
+.B \-z
+option may be followed by a zone name,
+.BI z .
+That causes lsof to list only open files for processes in that zone.
+Multiple
+.BI \-z " z"
+option and argument pairs may be specified to form a list of named zones.
+Any open file of any process in any of the zones will be listed, subject
+to other conditions specified by other options and arguments.
+.TP \w'names'u+4
+.BI \-Z " [Z]"
+specifies how SELinux security contexts are to be handled.
+It and 'Z' field output character support are inhibited
+when SELinux is disabled in the running Linux kernel.
+See
+.B "OUTPUT FOR OTHER PROGRAMS"
+for more information on the 'Z' field output character.
+.IP
+Without a following argument \- e.g., NO
+.IR Z " \-"
+the option specifies that security contexts are to be listed in the
+SECURITY\-CONTEXT output column.
+.IP
+The
+.B \-Z
+option may be followed by a wildcard security context name,
+.BI Z .
+That causes lsof to list only open files for processes in that security
+context.
+Multiple
+.BI \-Z " Z"
+option and argument pairs may be specified to form a list of security
+contexts.
+Any open file of any process in any of the security contexts will be listed,
+subject to other conditions specified by other options and arguments.
+Note that
+.I Z
+can be A:B:C or *:B:C or A:B:* or *:*:C to match against the A:B:C context.
+.TP \w'names'u+4
+.B --
+The double minus sign option is a marker that signals the end of
+the keyed options.
+It may be used, for example, when the first file name begins with
+a minus sign.
+It may also be used when the absence of a value for the last keyed
+option must be signified by the presence of a minus sign in the following
+option and before the start of the file names.
+.TP \w'names'u+4
+.I names
+These are path names of specific files to list.
+Symbolic links are resolved before use.
+The first name may be separated from the preceding options with
+the ``--'' option.
+.IP
+If a
+.I name 
+is the mounted\-on directory of a file system or the device of the
+file system,
+.I lsof
+will list all the files open on the file system.
+To be considered a file system, the
+.I name
+must match a mounted\-on directory name in
+.IR mount (8)
+output, or match the name of a block device associated with a mounted\-on
+directory name.
+The
+.B +|\-f
+option may be used to force
+.I lsof
+to consider a
+.I name
+a file system identifier (\fB+f\fP) or a simple file (\fB\-f\fP).
+.IP
+If
+.I name
+is a path to a directory that is not the mounted\-on directory name of
+a file system, it is treated just as a regular file is treated \- i.e.,
+its listing is restricted to processes that have it open as a file or
+as a process\-specific directory, such as the root or current working
+directory.
+To request that
+.I lsof
+look for open files inside a directory name, use the
+.BI +d " s"
+and
+.BI +D " D"
+options.
+.IP
+If a
+.I name
+is the base name of a family of multiplexed files \- e. g, AIX's
+.IR /dev/pt[cs] " \-"
+.I lsof
+will list all the associated multiplexed files on the device that
+are open \- e.g.,
+.IR /dev/pt[cs]/1 ,
+.IR /dev/pt[cs]/2 ,
+etc.
+.IP
+If a
+.I name
+is a UNIX domain socket name,
+.I lsof
+will usually search for it by the characters of the name alone \- exactly as
+it is specified and is recorded in the kernel socket structure.
+(See the next paragraph for an exception to that rule for Linux.)
+Specifying a relative path \- e.g.,
+.I ./file
+\&\- in place of the
+file's absolute path \- e.g.,
+.I /tmp/file
+\&\- won't work because
+.I lsof
+must match the characters you specify with what it finds in the
+kernel UNIX domain socket structures.
+.IP
+If a
+.I name
+is a Linux UNIX domain socket name, in one case
+.I lsof
+is able to search for it by its device and inode number, allowing
+.I name
+to be a relative path.
+The case requires that the absolute path -- i.e., one beginning with a
+slash ('/') be used by the process that created the socket, and hence be
+stored in the
+.I /proc/net/unix
+file; and it requires that
+.I lsof
+be able to obtain the device and node numbers of both the absolute path in
+.I /proc/net/unix
+and
+.I name
+via successful
+.IR stat (2)
+system calls.
+When those conditions are met,
+.I lsof
+will be able to search for the UNIX domain socket when some path to it is
+is specified in
+.IR name .
+Thus, for example, if the path is
+.IR /dev/log ,
+and an
+.I lsof
+search is initiated when the working directory is
+.IR /dev ,
+then
+.I name
+could be
+.IR ./log .
+.IP
+If a
+.I name
+is none of the above,
+.I lsof
+will list any open files whose device and inode match that of the
+specified path
+.IR name .
+.IP
+If you have also specified the
+.B \-b
+option,
+the only
+.I names
+you may safely specify are file systems for which your mount table
+supplies alternate device numbers.
+See the
+.B "AVOIDING KERNEL BLOCKS"
+and
+.B "ALTERNATE DEVICE NUMBERS"
+sections for more information.
+.IP
+Multiple file names are joined in a single ORed set before
+participating in AND option selection.
+.SH AFS
+.I Lsof
+supports the recognition of AFS files for these dialects (and AFS
+versions):
+.PP
+.nf
+	AIX 4.1.4 (AFS 3.4a)
+	HP\-UX 9.0.5 (AFS 3.4a)
+	Linux 1.2.13 (AFS 3.3)
+	Solaris 2.[56] (AFS 3.4a)
+.fi
+.PP
+It may recognize AFS files on other versions of these dialects,
+but has not been tested there.
+Depending on how AFS is implemented,
+.I lsof
+may recognize AFS files in other dialects, or may have difficulties
+recognizing AFS files in the supported dialects.
+.PP
+.I Lsof
+may have trouble identifying all aspects of AFS files in
+supported dialects when AFS kernel support is implemented via
+dynamic modules whose addresses do not appear in the kernel's
+variable name list.
+In that case,
+.I lsof
+may have to guess at the identity of AFS files, and might not be able to
+obtain volume information from the kernel that is needed for calculating
+AFS volume node numbers.
+When
+.I lsof
+can't compute volume node numbers, it reports blank in the NODE column.
+.PP
+The
+.BI \-A " A"
+option is available in some dialect implementations of
+.I lsof
+for specifying the name list file where dynamic module kernel
+addresses may be found.
+When this option is available, it will be listed in the
+.I lsof
+help output, presented in response to the
+.B \-h
+or
+.B \-?
+.PP
+See the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information about dynamic modules, their
+symbols, and how they affect
+.I lsof
+options.
+.PP
+Because AFS path lookups don't seem to participate in the
+kernel's name cache operations,
+.I lsof
+can't identify path name components for AFS files.
+.SH SECURITY
+.I Lsof
+has three features that may cause security concerns.
+First, its default compilation mode allows anyone to list all
+open files with it.
+Second, by default it creates a user\-readable and user\-writable device
+cache file in the home directory of the real user ID that executes
+.IR lsof .
+(The list\-all\-open\-files and device cache features may be disabled when
+.I lsof
+is compiled.)
+Third, its
+.B \-k
+and
+.B \-m
+options name alternate kernel name list or memory files.
+.PP
+Restricting the listing of all open files is controlled by the
+compile\-time HASSECURITY and HASNOSOCKSECURITY options.
+When HASSECURITY is defined,
+.I lsof
+will allow only the root user to list all open files.
+The non\-root user may list only open files of processes with the same user
+IDentification number as the real user ID number of the
+.I lsof
+process (the one that its user logged on with).
+.PP
+However, if HASSECURITY and HASNOSOCKSECURITY are both defined,
+anyone may list open socket files, provided they are selected
+with the
+.B \-i
+option.
+.PP
+When HASSECURITY is not defined, anyone may list all open files.
+.PP
+Help output, presented in response to the
+.B \-h
+or
+.B \-?
+option, gives the status of the HASSECURITY and HASNOSOCKSECURITY definitions.
+.PP
+See the
+.B Security
+section of the
+.I 00README
+file of the
+.I lsof
+distribution for information on building
+.I lsof
+with the HASSECURITY and HASNOSOCKSECURITY options enabled.
+.PP
+Creation and use of a user\-readable and user\-writable device
+cache file is controlled by the compile\-time HASDCACHE option.
+See the
+.B "DEVICE CACHE FILE"
+section and the sections that follow it for details on how its path
+is formed.
+For security considerations it is important to note that in the default
+.I lsof
+distribution, if the real user ID under which
+.I lsof
+is executed is root, the device cache file will be written in root's
+home directory \- e.g.,
+.I /
+or
+.IR /root .
+When HASDCACHE is not defined,
+.I lsof
+does not write or attempt to read a device cache file.
+.PP
+When HASDCACHE is defined, the
+.I lsof
+help output, presented in response to the
+.BR \-h ,
+.BR \-D? ,
+or
+.B \-?
+options, will provide device cache file handling information.
+When HASDCACHE is not defined, the
+.B \-h
+or
+.B \-?
+output will have no
+.B \-D
+option description.
+.PP
+Before you decide to disable the device cache file feature \- enabling
+it improves the performance of
+.I lsof
+by reducing the startup overhead of examining all the nodes in
+.I /dev
+(or
+.IR /devices )
+\&\- read the discussion of it in the
+.I 00DCACHE
+file of the
+.I lsof
+distribution and the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+.PP
+WHEN IN DOUBT, YOU CAN TEMPORARILY DISABLE THE USE OF THE DEVICE CACHE FILE
+WITH THE
+.B \-Di
+OPTION.
+.PP
+When
+.I lsof
+user declares alternate kernel name list or memory files with the
+.B \-k
+and
+.B \-m
+options,
+.I lsof
+checks the user's authority to read them with
+.IR access (2).
+This is intended to prevent whatever special power
+.I lsof's
+modes might confer on it from letting it read files not normally
+accessible via the authority of the real user ID.
+.SH OUTPUT
+This section describes the information
+.I lsof
+lists for each open file.
+See the
+.B "OUTPUT FOR OTHER PROGRAMS"
+section for additional information on output that can be processed
+by another program.
+.PP
+.I Lsof
+only outputs printable (declared so by
+.IR isprint (3))
+8 bit characters.
+Non\-printable characters are printed in one of three forms:
+the C ``\\[bfrnt]'' form;
+the control character `^' form (e.g., ``^@'');
+or hexadecimal leading ``\\x'' form (e.g., ``\\xab'').
+Space is non\-printable in the COMMAND column (``\\x20'')
+and printable elsewhere.
+.PP
+For some dialects \- if HASSETLOCALE is defined in the dialect's
+machine.h header file \-
+.I lsof
+will print the extended 8 bit characters of a language locale.
+The
+.I lsof
+process must be supplied a language locale environment variable
+(e.g., LANG) whose value represents a known language locale
+in which the extended characters are considered printable by
+.IR isprint (3).
+Otherwise
+.I lsof
+considers the extended characters non\-printable and prints them according
+to its rules for non\-printable characters, stated above.
+Consult your dialect's
+.IR setlocale (3)
+man page for the names of other environment variables that may
+be used in place of LANG \- e.g., LC_ALL, LC_CTYPE, etc.
+.PP
+.I Lsof's
+language locale support for a dialect also covers wide characters \- e.g.,
+UTF-8 \- when HASSETLOCALE and HASWIDECHAR are defined in the dialect's
+machine.h header file, and when a suitable language locale has been defined
+in the appropriate environment variable for the
+.I lsof
+process.
+Wide characters are printable under those conditions if
+.IR iswprint (3)
+reports them to be.
+If HASSETLOCALE, HASWIDECHAR and a suitable language locale aren't defined,
+or if
+.IR iswprint (3)
+reports wide characters that aren't printable,
+.I lsof
+considers the wide characters non\-printable and prints each of their
+8 bits according to its rules for non\-printable characters, stated above.
+.PP
+Consult the answers to the "Language locale support" questions in the
+lsof FAQ (The \fBFAQ\fP section gives its location.) for more information.
+.PP
+.I Lsof
+dynamically sizes the output columns each time it runs, guaranteeing
+that each column is a minimum size.
+It also guarantees that each column is separated from its predecessor
+by at least one space.
+.TP \w'COMMAND'u+4
+COMMAND
+contains the first nine characters of the name of the UNIX command
+associated with the process.
+If a non\-zero
+.I w
+value is specified to the
+.BI +c " w"
+option, the column contains the first
+.I w
+characters of the name of the UNIX command associated with the process
+up to the limit of characters supplied to
+.I lsof
+by the UNIX dialect.
+(See the description of the
+.BI +c " w"
+command or the
+.I lsof
+FAQ for more information.
+The \fBFAQ\fP section gives its location.)
+.IP
+If
+.I w
+is less than the length of the column title, ``COMMAND'', it will
+be raised to that length.
+.IP
+If a zero
+.I w
+value is specified to the
+.BI +c " w"
+option, the column contains all the characters of the name of the UNIX command
+associated with the process.
+.IP
+All command name characters maintained by the kernel in its structures
+are displayed in field output when the command name descriptor (`c')
+is specified.
+See the
+.B "OUTPUT FOR OTHER COMMANDS"
+section for information on selecting field output and the associated
+command name descriptor.
+.TP
+PID
+is the Process IDentification number of the process.
+.TP
+TID
+is the task IDentification number, if a task reporting is supported
+by the dialect and a task is being listed.
+(If help output \- i.e., the output of the
+.B \-h
+or
+.B \-?
+options \- shows this option, then task reporting is supported by
+the dialect.)
+.IP
+A blank TID column indicates a process \- i.e., a non\-task.
+.TP
+ZONE
+is the Solaris 10 and higher zone name.
+This column must be selected with the
+.B \-z
+option.
+.TP
+SECURITY\-CONTEXT
+is the SELinux security context.
+This column must be selected with the
+.B -Z
+option.
+Note that the
+.B -Z
+option is inhibited when SELinux is disabled in the running Linux
+kernel.
+.TP
+PPID
+is the Parent Process IDentification number of the process.
+It is only displayed when the
+.B \-R
+option has been specified.
+.TP
+PGID
+is the process group IDentification number associated with
+the process.
+It is only displayed when the
+.B \-g
+option has been specified.
+.TP
+USER
+is the user ID number or login name of the user to whom
+the process belongs, usually the same as reported by
+.IR ps (1).
+However, on Linux USER is the user ID number or login that owns
+the directory in /proc where
+.I lsof
+finds information about the process.
+Usually that is the same value reported by
+.IR ps (1),
+but may differ when the process has changed its effective user ID.
+(See the
+.B \-l
+option description for information on when a user ID number or
+login name is displayed.)
+.TP
+FD
+is the File Descriptor number of the file or:
+.IP
+.nf
+	\fBcwd\fP	current working directory;
+.br
+	\fBL\fInn\fR	library references (AIX);
+.br
+	\fBerr\fR	FD information error (see NAME column);
+.br
+	\fBjld\fR	jail directory (FreeBSD);
+.br
+	\fBltx\fP	shared library text (code and data);
+.br
+	\fBMxx\fP	hex memory\-mapped type number xx.
+.br
+	\fBm86\fP	DOS Merge mapped file;
+.br
+	\fBmem\fP	memory\-mapped file;
+.br
+	\fBmmap\fP	memory\-mapped device;
+.br
+	\fBpd\fP	parent directory;
+.br
+	\fBrtd\fP	root directory;
+.br
+	\fBtr\fR	kernel trace file (OpenBSD);
+.br
+	\fBtxt\fP	program text (code and data);
+.br
+	\fBv86\fP	VP/ix mapped file;
+.fi
+.IP
+FD is followed by one of these characters, describing the mode under which
+the file is open:
+.IP
+	\fBr\fP for read access;
+.br
+	\fBw\fP for write access;
+.br
+	\fBu\fP for read and write access;
+.br
+	space if mode unknown and no lock
+.br
+		character follows;
+.br
+	`\-' if mode unknown and lock
+.br
+		character follows.
+.IP
+The mode character is followed by one of these lock characters, describing
+the type of lock applied to the file:
+.IP
+	\fBN\fP for a Solaris NFS lock of unknown type;
+.br
+	\fBr\fP for read lock on part of the file;
+.br
+	\fBR\fP for a read lock on the entire file;
+.br
+	\fBw\fP for a write lock on part of the file;
+.br
+	\fBW\fP for a write lock on the entire file;
+.br
+	\fBu\fP for a read and write lock of any length;
+.br
+	\fBU\fP for a lock of unknown type;
+.br
+	\fBx\fP for an SCO OpenServer Xenix lock on part
+	of the file;
+.br
+	\fBX\fP for an SCO OpenServer Xenix lock on the
+	entire file;
+.br
+	space if there is no lock.
+.IP
+See the
+.B LOCKS
+section for more information on the lock information character.
+.IP
+The FD column contents constitutes a single field for parsing in
+post\-processing scripts.
+.TP
+TYPE
+is the type of the node associated with the file \- e.g., GDIR, GREG,
+VDIR, VREG, etc.
+.IP
+or ``IPv4'' for an IPv4 socket;
+.IP
+or ``IPv6'' for an open IPv6 network file \- even if its address is
+IPv4, mapped in an IPv6 address;
+.IP
+or ``ax25'' for a Linux AX.25 socket;
+.IP
+or ``inet'' for an Internet domain socket;
+.IP
+or ``lla'' for a HP\-UX link level access file;
+.IP
+or ``rte'' for an AF_ROUTE socket;
+.IP
+or ``sock'' for a socket of unknown domain;
+.IP
+or ``unix'' for a UNIX domain socket;
+.IP
+or ``x.25'' for an HP\-UX x.25 socket;
+.IP
+or ``BLK'' for a block special file;
+.IP
+or ``CHR'' for a character special file;
+.IP
+or ``DEL'' for a Linux map file that has been deleted;
+.IP
+or ``DIR'' for a directory;
+.IP
+or ``DOOR'' for a VDOOR file;
+.IP
+or ``FIFO'' for a FIFO special file;
+.IP
+or ``KQUEUE'' for a BSD style kernel event queue file;
+.IP
+or ``LINK'' for a symbolic link file;
+.IP
+or ``MPB'' for a multiplexed block file;
+.IP
+or ``MPC'' for a multiplexed character file;
+.IP
+or ``NOFD'' for a Linux /proc/<PID>/fd directory that can't be opened \--
+the directory path appears in the NAME column, followed by an error
+message;
+.IP
+or ``PAS'' for a
+.I /proc/as
+file;
+.IP
+or ``PAXV'' for a
+.I /proc/auxv
+file;
+.IP
+or ``PCRE'' for a
+.I /proc/cred
+file;
+.IP
+or ``PCTL'' for a
+.I /proc
+control file;
+.IP
+or ``PCUR'' for the current
+.I /proc
+process;
+.IP
+or ``PCWD'' for a
+.I /proc
+current working directory;
+.IP
+or ``PDIR'' for a
+.I /proc
+directory;
+.IP
+or ``PETY'' for a
+.I /proc
+executable type (\fIetype\fP);
+.IP
+or ``PFD'' for a
+.I /proc
+file descriptor;
+.IP
+or ``PFDR'' for a
+.I /proc
+file descriptor directory;
+.IP
+or ``PFIL'' for an executable
+.I /proc
+file;
+.IP
+or ``PFPR'' for a
+.I /proc
+FP register set;
+.IP
+or ``PGD'' for a
+.I /proc/pagedata
+file;
+.IP
+or ``PGID'' for a
+.I /proc
+group notifier file;
+.IP
+or ``PIPE'' for pipes;
+.IP
+or ``PLC'' for a
+.I /proc/lwpctl
+file;
+.IP
+or ``PLDR'' for a
+.I /proc/lpw
+directory;
+.IP
+or ``PLDT'' for a
+.I /proc/ldt
+file;
+.IP
+or ``PLPI'' for a
+.I /proc/lpsinfo
+file;
+.IP
+or ``PLST'' for a
+.I /proc/lstatus
+file;
+.IP
+or ``PLU'' for a
+.I /proc/lusage
+file;
+.IP
+or ``PLWG'' for a
+.I /proc/gwindows
+file;
+.IP
+or ``PLWI'' for a
+.I /proc/lwpsinfo
+file;
+.IP
+or ``PLWS'' for a
+.I /proc/lwpstatus
+file;
+.IP
+or ``PLWU'' for a
+.I /proc/lwpusage
+file;
+.IP
+or ``PLWX'' for a
+.I /proc/xregs
+file'
+.IP
+or ``PMAP'' for a
+.I /proc
+map file (\fImap\fP);
+.IP
+or ``PMEM'' for a
+.I /proc
+memory image file;
+.IP
+or ``PNTF'' for a
+.I /proc
+process notifier file;
+.IP
+or ``POBJ'' for a
+.I /proc/object
+file;
+.IP
+or ``PODR'' for a
+.I /proc/object
+directory;
+.IP
+or ``POLP'' for an old format
+.I /proc
+light weight process file;
+.IP
+or ``POPF'' for an old format
+.I /proc
+PID file;
+.IP
+or ``POPG'' for an old format
+.I /proc
+page data file;
+.IP
+or ``PORT'' for a SYSV named pipe;
+.IP
+or ``PREG'' for a
+.I /proc
+register file;
+.IP
+or ``PRMP'' for a
+.I /proc/rmap
+file;
+.IP
+or ``PRTD'' for a
+.I /proc
+root directory;
+.IP
+or ``PSGA'' for a
+.I /proc/sigact
+file;
+.IP
+or ``PSIN'' for a
+.I /proc/psinfo
+file;
+.IP
+or ``PSTA'' for a
+.I /proc
+status file;
+.IP
+or ``PSXSEM'' for a POSIX semaphore file;
+.IP
+or ``PSXSHM'' for a POSIX shared memory file;
+.IP
+or ``PUSG'' for a
+.I /proc/usage
+file;
+.IP
+or ``PW'' for a
+.I /proc/watch
+file;
+.IP
+or ``PXMP'' for a
+.I /proc/xmap
+file;
+.IP
+or ``REG'' for a regular file;
+.IP
+or ``SMT'' for a shared memory transport file;
+.IP
+or ``STSO'' for a stream socket;
+.IP
+or ``UNNM'' for an unnamed type file;
+.IP
+or ``XNAM'' for an OpenServer Xenix special file of unknown type;
+.IP
+or ``XSEM'' for an OpenServer Xenix semaphore file;
+.IP
+or ``XSD'' for an OpenServer Xenix shared data file;
+.IP
+or the four type number octets if the corresponding name isn't known.
+.TP
+FILE\-ADDR
+contains the kernel file structure address when
+.B f
+has been specified to
+.BR +f ;
+.TP
+FCT
+contains the file reference count from the kernel file structure when
+.B c
+has been specified to
+.BR +f ;
+.TP
+FILE\-FLAG
+when
+.B g
+or
+.B G
+has been specified to
+.BR +f ,
+this field contains the contents of the f_flag[s] member of the kernel
+file structure and the kernel's per\-process open file flags (if available);
+\&`G' causes them to be displayed in hexadecimal;
+\&`g', as short\-hand names;
+two lists may be displayed with entries separated by commas, the
+lists separated by a semicolon (`;');
+the first list may contain short\-hand names for f_flag[s] values from
+the following table:
+.IP
+.nf
+	AIO		asynchronous I/O (e.g., FAIO)
+	AP		append
+	ASYN		asynchronous I/O (e.g., FASYNC)
+	BAS		block, test, and set in use
+	BKIU		block if in use
+	BL		use block offsets
+	BSK		block seek
+	CA		copy avoid
+	CIO		concurrent I/O
+	CLON		clone
+	CLRD		CL read
+	CR		create
+	DF		defer
+	DFI		defer IND
+	DFLU		data flush
+	DIR		direct
+	DLY		delay
+	DOCL		do clone
+	DSYN		data\-only integrity
+	DTY		must be a directory
+	EVO		event only
+	EX		open for exec
+	EXCL		exclusive open
+	FSYN		synchronous writes
+	GCDF		defer during unp_gc() (AIX)
+	GCMK		mark during unp_gc() (AIX)
+	GTTY		accessed via /dev/tty
+	HUP		HUP in progress
+	KERN		kernel
+	KIOC		kernel\-issued ioctl
+	LCK		has lock
+	LG		large file
+	MBLK		stream message block
+	MK		mark
+	MNT		mount
+	MSYN		multiplex synchronization
+	NATM		don't update atime
+	NB		non\-blocking I/O
+	NBDR		no BDRM check
+	NBIO		SYSV non\-blocking I/O
+	NBF		n\-buffering in effect
+	NC		no cache
+	ND		no delay
+	NDSY		no data synchronization
+	NET		network
+	NFLK		don't follow links
+	NMFS		NM file system
+	NOTO		disable background stop
+	NSH		no share
+	NTTY		no controlling TTY
+	OLRM		OLR mirror
+	PAIO		POSIX asynchronous I/O
+	PP		POSIX pipe
+	R		read
+	RC		file and record locking cache
+	REV		revoked
+	RSH		shared read
+	RSYN		read synchronization
+	RW		read and write access
+	SL		shared lock
+	SNAP		cooked snapshot
+	SOCK		socket
+	SQSH		Sequent shared set on open
+	SQSV		Sequent SVM set on open
+	SQR		Sequent set repair on open
+	SQS1		Sequent full shared open
+	SQS2		Sequent partial shared open
+	STPI		stop I/O
+	SWR		synchronous read
+	SYN		file integrity while writing
+	TCPM		avoid TCP collision
+	TR		truncate
+	W		write
+	WKUP		parallel I/O synchronization
+	WTG		parallel I/O synchronization
+	VH		vhangup pending
+	VTXT		virtual text
+	XL		exclusive lock
+.fi
+.IP
+this list of names was derived from F* #define's in dialect header files
+<fcntl.h>, <linux</fs.h>, <sys/fcntl.c>, <sys/fcntlcom.h>, and <sys/file.h>;
+see the lsof.h header file for a list showing the correspondence
+between the above short\-hand names and the header file definitions;
+.IP
+the second list (after the semicolon) may contain short\-hand names
+for kernel per\-process open file flags from this table:
+.IP
+.nf
+	ALLC		allocated
+	BR		the file has been read
+	BHUP		activity stopped by SIGHUP
+	BW		the file has been written
+	CLSG		closing
+	CX		close\-on-exec (see fcntl(F_SETFD))
+	LCK		lock was applied
+	MP		memory\-mapped
+	OPIP		open pending \- in progress
+	RSVW		reserved wait
+	SHMT		UF_FSHMAT set (AIX)
+	USE		in use (multi\-threaded)
+.fi
+.TP
+NODE\-ID
+(or INODE\-ADDR for some dialects)
+contains a unique identifier for the file node (usually the kernel
+vnode or inode address, but also occasionally a concatenation of
+device and node number) when
+.B n
+has been specified to
+.BR +f ;
+.TP
+DEVICE
+contains the device numbers, separated by commas, for a character special,
+block special, regular, directory or NFS file;
+.IP
+or ``memory'' for a memory file system node under Tru64 UNIX;
+.IP
+or the address of the private data area of a Solaris socket
+stream;
+.IP
+or a kernel reference address that identifies the file
+(The kernel reference address may be used for FIFO's, for example.);
+.IP
+or
+the base address or device name of a Linux AX.25 socket device.
+.IP
+Usually only the lower thirty two bits of Tru64 UNIX kernel addresses
+are displayed.
+.TP
+SIZE, SIZE/OFF, or OFFSET
+is the size of the file or the file offset in bytes.
+A value is displayed in this column only if it is available.
+.I Lsof
+displays whatever value \- size or offset \- is appropriate for the type
+of the file and the version of
+.IR lsof .
+.IP
+On some UNIX dialects
+.I lsof
+can't obtain accurate or consistent file offset information from its
+kernel data sources, sometimes just for particular kinds of files
+(e.g., socket files.)
+In other cases, files don't have true sizes \- e.g., sockets, FIFOs,
+pipes \- so
+.I lsof
+displays for their sizes the content amounts it finds in their kernel
+buffer descriptors (e.g., socket buffer size counts or TCP/IP window
+sizes.)
+Consult the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information.
+.IP
+The file size is displayed in decimal;
+the offset is normally displayed in decimal with a leading ``0t'' if
+it contains 8 digits or less; in hexadecimal with a leading ``0x'' if
+it is longer than 8 digits.
+(Consult the
+.BI \-o " o"
+option description for information on when 8 might default to
+some other value.)
+.IP
+Thus the leading ``0t'' and ``0x'' identify an offset when the column
+may contain both a size and an offset (i.e., its title is SIZE/OFF).
+.IP
+If the
+.B \-o
+option is specified,
+.I lsof
+always displays the file offset (or nothing if no offset is available)
+and labels the column OFFSET.
+The offset always begins with ``0t'' or ``0x'' as described above.
+.IP
+The
+.I lsof
+user can control the switch from ``0t'' to ``0x'' with the
+.BI \-o " o"
+option.
+Consult its description for more information.
+.IP
+If the
+.B \-s
+option is specified,
+.I lsof
+always displays the file size (or nothing if no size is available)
+and labels the column SIZE.
+The
+.B \-o
+and
+.B \-s
+options are mutually exclusive; they can't both be specified.
+.IP
+For files that don't have a fixed size \- e.g., don't reside
+on a disk device \-
+.I lsof
+will display appropriate information about the current size or
+position of the file if it is available in the kernel structures
+that define the file.
+.TP
+NLINK
+contains the file link count when
+.B +L
+has been specified;
+.TP
+NODE
+is the node number of a local file;
+.IP
+or the inode number of an NFS file in the server host;
+.IP
+or the Internet protocol type \- e. g, ``TCP'';
+.IP
+or ``STR'' for a stream;
+.IP
+or ``CCITT'' for an HP\-UX x.25 socket;
+.IP
+or the IRQ or inode number of a Linux AX.25 socket device.
+.TP
+NAME
+is the name of the mount point and file system on which the file resides;
+.IP
+or the name of a file specified in the
+.I names
+option (after any symbolic links have been resolved);
+.IP
+or the name of a character special or block special device;
+.IP
+or the local and remote Internet addresses of a network file;
+the local host name or IP number is followed by a colon (':'), the
+port, ``->'', and the two\-part remote address;
+IP addresses may be reported as numbers or names, depending on the
+.BR +|\-M ,
+.BR \-n ,
+and
+.B \-P
+options;
+colon\-separated IPv6 numbers are enclosed in square brackets;
+IPv4 INADDR_ANY and IPv6 IN6_IS_ADDR_UNSPECIFIED addresses, and
+zero port numbers are represented by an asterisk ('*');
+a UDP destination address may be followed by the amount of time
+elapsed since the last packet was sent to the destination;
+TCP, UDP and UDPLITE remote addresses may be followed by TCP/TPI
+information in parentheses \- state (e.g., ``(ESTABLISHED)'', ``(Unbound)''),
+queue sizes, and window sizes (not all dialects) \- in a fashion
+similar to what
+.IR netstat (1)
+reports;
+see the
+.B \-T
+option description or the description of the TCP/TPI field in
+.B "OUTPUT FOR OTHER PROGRAMS"
+for more information on state, queue size, and window size;
+.IP
+or the address or name of a UNIX domain socket, possibly including
+a stream clone device name, a file system object's path name, local
+and foreign kernel addresses, socket pair information, and a bound
+vnode address;
+.IP
+or the local and remote mount point names of an NFS file;
+.IP
+or ``STR'', followed by the stream name;
+.IP
+or a stream character device name, followed by ``->'' and the stream name
+or a list of stream module names, separated by ``->'';
+.IP
+or ``STR:'' followed by the SCO OpenServer stream device and module
+names, separated by ``->'';
+.IP
+or system directory name, `` -- '', and as many components of the path
+name as
+.I lsof
+can find in the kernel's name cache for selected dialects
+(See the
+.B "KERNEL NAME CACHE"
+section for more information.);
+.IP
+or ``PIPE->'', followed by a Solaris kernel pipe destination address;
+.IP
+or ``COMMON:'', followed by the vnode device information structure's
+device name, for a Solaris common vnode;
+.IP
+or the address family, followed by a slash (`/'), followed by fourteen
+comma\-separated bytes of a non\-Internet raw socket address;
+.IP
+or the HP\-UX x.25 local address, followed by the virtual connection
+number (if any), followed by the remote address (if any);
+.IP
+or ``(dead)'' for disassociated Tru64 UNIX files \- typically terminal files
+that have been flagged with the TIOCNOTTY ioctl and closed by daemons;
+.IP
+or ``rd=<offset>'' and ``wr=<offset>'' for the values of the
+read and write offsets of a FIFO;
+.IP
+or ``clone \fIn\fP:/dev/event'' for SCO OpenServer file clones of the
+.I /dev/event
+device, where
+.I n
+is the minor device number of the file;
+.IP
+or ``(socketpair: n)'' for a Solaris 2.6, 8, 9  or 10
+UNIX domain socket, created by the
+.IR socketpair (3N)
+network function;
+.IP
+or ``no PCB'' for socket files that do not have a protocol block
+associated with them, optionally followed by ``, CANTSENDMORE'' if
+sending on the socket has been disabled, or ``, CANTRCVMORE'' if
+receiving on the socket has been disabled (e.g., by the
+.IR shutdown (2)
+function);
+.IP
+or the local and remote addresses of a Linux IPX socket file
+in the form <net>:[<node>:]<port>, followed in parentheses
+by the transmit and receive queue sizes, and the connection state;
+.IP
+or ``dgram'' or ``stream'' for the type UnixWare 7.1.1 and above in\-kernel
+UNIX domain sockets, followed by a colon (':') and the local path name
+when available, followed by ``->'' and the remote path name or kernel
+socket address in hexadecimal when available.
+.PP
+For dialects that support a ``namefs'' file system, allowing one
+file to be attached to another with
+.IR fattach (3C),
+.I lsof
+will add ``(FA:<address1><direction><address2>)'' to the NAME column.
+<address1> and <address2> are hexadecimal vnode addresses.
+<direction> will be ``<-'' if <address2> has been fattach'ed to
+this vnode whose address is <address1>;
+and ``->'' if <address1>, the vnode address of this vnode, has been
+fattach'ed to <address2>.
+<address1> may be omitted if it already appears in the DEVICE column.
+.PP
+.I
+Lsof
+may add two parenthetical notes to the NAME column for open Solaris 10 files:
+\&``(?)'' if
+.I lsof
+considers the path name of questionable accuracy;
+and ``(deleted)'' if the
+.B \-X
+option has been specified and
+.I lsof
+detects the open file's path name has been deleted.
+Consult the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information on these NAME column additions.
+.SH LOCKS
+.I Lsof
+can't adequately report the wide variety of UNIX dialect file locks
+in a single character.
+What it reports in a single character is a compromise between the
+information it finds in the kernel and the limitations of the reporting
+format.
+.PP
+Moreover, when a process holds several byte level locks on a file,
+.I lsof
+only reports the status of the first lock it encounters.
+If it is a byte level lock, then the lock character will be reported
+in lower case \- i.e., `r', `w', or `x' \- rather than the upper case
+equivalent reported for a full file lock.
+.PP
+Generally
+.I lsof
+can only report on locks held by local processes on local files.
+When a local process sets a lock on a remotely mounted (e.g., NFS)
+file, the remote server host usually records the lock state.
+One exception is Solaris \- at some patch levels of 2.3, and in all
+versions above 2.4, the Solaris kernel records information on remote
+locks in local structures.
+.PP
+.I Lsof
+has trouble reporting locks for some UNIX dialects.
+Consult the
+.B BUGS
+section of this manual page or the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for more information.
+.SH "OUTPUT FOR OTHER PROGRAMS"
+When the
+.B \-F
+option is specified,
+.I lsof
+produces output that is suitable for processing by another program \- e.g, an
+.I awk
+or
+.I Perl
+script, or a C program.
+.PP
+Each unit of information is output in a field that is identified
+with a leading character and terminated by a NL (012) (or a NUL
+(000) if the 0 (zero) field identifier character is specified.)
+The data of the field follows immediately after the field identification
+character and extends to the field terminator.
+.PP
+It is possible to think of field output as process and file sets.
+A process set begins with a field whose identifier is `p' (for
+process IDentifier (PID)).
+It extends to the beginning of the next PID field or the beginning
+of the first file set of the process, whichever comes first.
+Included in the process set are fields that identify the command,
+the process group IDentification (PGID) number, the task number and
+the user ID (UID) number or login name.
+.PP
+A file set begins with a field whose identifier is `f' (for
+file descriptor).
+It is followed by lines that describe the file's access mode,
+lock state, type, device, size, offset, inode, protocol, name
+and stream module names.
+It extends to the beginning of the next file or process set,
+whichever comes first.
+.PP
+When the NUL (000) field terminator has been selected with the
+0 (zero) field identifier character,
+.I lsof
+ends each process and file set with a NL (012) character.
+.PP
+.I Lsof
+always produces one field, the PID (`p') field.
+All other fields may be declared optionally in the field identifier
+character list that follows the
+.B \-F
+option.
+When a field selection character identifies an item
+.I lsof
+does not normally list \- e.g., PPID, selected with
+.BR \-R " \-"
+specification of the field character \- e.g., ``\fB\-FR\fP'' \-
+also selects the listing of the item.
+.PP
+It is entirely possible to select a set of fields that cannot
+easily be parsed \- e.g., if the field descriptor field is not
+selected, it may be difficult to identify file sets.
+To help you avoid this difficulty,
+.I lsof
+supports the
+.B \-F
+option; it selects the output of all fields with NL terminators
+(the
+.B \-F0
+option pair selects the output of all fields with NUL terminators).
+For compatibility reasons neither
+.B \-F
+nor
+.B \-F0
+select the raw device field.
+.PP
+These are the fields that
+.I lsof
+will produce.
+The single character listed first is the field identifier.
+.PP
+.nf
+	a	file access mode
+	c	process command name (all characters from proc or
+		user structure)
+	C	file structure share count
+	d	file's device character code 
+	D	file's major/minor device number (0x<hexadecimal>)
+	f	file descriptor
+	F	file structure address (0x<hexadecimal>)
+	G	file flaGs (0x<hexadecimal>; names if \fB+fg\fP follows)
+	g	process group ID
+	i	file's inode number
+	K	tasK ID
+	k	link count
+	l	file's lock status
+	L	process login name
+	m	marker between repeated output
+	n	file name, comment, Internet address
+	N	node identifier (ox<hexadecimal>
+	o	file's offset (decimal)
+	p	process ID (always selected)
+	P	protocol name
+	r	raw device number (0x<hexadecimal>)
+	R	parent process ID
+	s	file's size (decimal)
+	S	file's stream identification
+	t	file's type
+	T	TCP/TPI information, identified by prefixes (the
+		`=' is part of the prefix):
+		    QR=<read queue size>
+		    QS=<send queue size>
+		    SO=<socket options and values> (not all dialects)
+		    SS=<socket states> (not all dialects)
+		    ST=<connection state>
+		    TF=<TCP flags and values> (not all dialects)
+		    WR=<window read size>  (not all dialects)
+		    WW=<window write size>  (not all dialects)
+		(TCP/TPI information isn't reported for all supported
+		  UNIX dialects. The \fB\-h\fP or \fB\-?\fP help output for the
+		  \fB\-T\fP option will show what TCP/TPI reporting can be
+		  requested.)
+	u	process user ID
+	z	Solaris 10 and higher zone name
+	Z	SELinux security context (inhibited when SELinux is disabled)
+	0	use NUL field terminator character in place of NL
+	1\-9	dialect\-specific field identifiers (The output
+		of \fB\-F?\fP identifies the information to be found
+		in dialect\-specific fields.)
+.fi
+.PP
+You can get on\-line help information on these characters and their
+descriptions by specifying the
+.B \-F?
+option pair.
+(Escape the `?' character as your shell requires.)
+Additional information on field content can be found in the
+.B OUTPUT
+section.
+.PP
+As an example, ``\fB\-F pcfn\fP'' will select the process ID (`p'),
+command name (`c'), file descriptor (`f') and file name (`n')
+fields with an NL field terminator character; ``\fB\-F pcfn0\fP''
+selects the same output with a NUL (000) field terminator character.
+.PP
+.I Lsof
+doesn't produce all fields for every process or file set, only
+those that are available.
+Some fields are mutually exclusive: file device characters and
+file major/minor device numbers; file inode number and protocol
+name; file name and stream identification; file size and offset.
+One or the other member of these mutually exclusive sets will appear
+in field output, but not both.
+.PP
+Normally
+.I lsof
+ends each field with a NL (012) character.
+The
+0 (zero) field identifier character may be specified to change the
+field terminator character
+to a NUL (000).
+A NUL terminator may be easier to process with
+.I xargs (1),
+for example, or with programs whose quoting mechanisms may not
+easily cope with the range of characters in the field output.
+When the NUL field terminator is in use,
+.I lsof
+ends each process and file set with a NL (012).
+.PP
+Three aids to producing programs that can process
+.I lsof
+field output are included in the
+.I lsof
+distribution.
+The first is a C header file,
+.IR lsof_fields.h ,
+that contains symbols for the field identification characters, indexes for
+storing them in a table, and explanation strings that may be compiled into
+programs.
+.I Lsof
+uses this header file.
+.PP
+The second aid is a set of sample scripts that process field output,
+written in
+.IR awk ,
+.I Perl
+4, and
+.I Perl
+5.
+They're located in the
+.I scripts
+subdirectory of the
+.I lsof
+distribution.
+.PP
+The third aid is the C library used for the
+.I lsof
+test suite.
+The test suite is written in C and uses field output to validate
+the correct operation of
+.IR lsof .
+The library can be found in the
+.I tests/LTlib.c
+file of the
+.I lsof
+distribution.
+The library uses the first aid, the
+.I lsof_fields.h
+header file.
+.SH "BLOCKS AND TIMEOUTS"
+.I Lsof
+can be blocked by some kernel functions that it uses \-
+.IR lstat (2),
+.IR readlink (2),
+and
+.IR stat (2).
+These functions are stalled in the kernel, for example, when the
+hosts where mounted NFS file systems reside become inaccessible.
+.PP
+.I Lsof
+attempts to break these blocks with timers and child processes,
+but the techniques are not wholly reliable.
+When
+.I lsof
+does manage to break a block, it will report the break with an error
+message.
+The messages may be suppressed with the
+.B \-t
+and
+.B \-w
+options.
+.PP
+The default timeout value may be displayed with the
+.B \-h
+or
+.B \-?
+option, and it may be changed with the
+.BI \-S " [t]"
+option.
+The minimum for
+.I t
+is two seconds, but you should avoid small values, since slow system
+responsiveness can cause short timeouts to expire unexpectedly and
+perhaps stop
+.I lsof
+before it can produce any output.
+.PP
+When
+.I lsof
+has to break a block during its access of mounted file system
+information, it normally continues, although with less information
+available to display about open files.
+.PP
+.I Lsof
+can also be directed to avoid the protection of timers and child processes
+when using the kernel functions that might block by specifying the
+.B \-O
+option.
+While this will allow
+.I lsof
+to start up with less overhead, it exposes
+.I lsof
+completely to the kernel situations that might block it.
+Use this option cautiously.
+.SH "AVOIDING KERNEL BLOCKS"
+.PP
+You can use the
+.B \-b
+option to tell
+.I lsof
+to avoid using kernel functions that would block.
+Some cautions apply.
+.PP
+First, using this option usually requires that your system supply
+alternate device numbers in place of the device numbers that
+.I lsof
+would normally obtain with the
+.IR lstat (2)
+and
+.IR stat (2)
+kernel functions.
+See the
+.B "ALTERNATE DEVICE NUMBERS"
+section for more information on alternate device numbers.
+.PP
+Second, you can't specify
+.I names
+for
+.I lsof
+to locate unless they're file system names.
+This is because
+.I lsof
+needs to know the device and inode numbers of files listed with
+.I names
+in the
+.I lsof
+options, and the
+.B \-b
+option prevents
+.I lsof
+from obtaining them.
+Moreover, since
+.I lsof
+only has device numbers for the file systems that have alternates,
+its ability to locate files on file systems depends completely on the
+availability and accuracy of the alternates.
+If no alternates are available, or if they're incorrect,
+.I lsof
+won't be able to locate files on the named file systems.
+.PP
+Third, if the names of your file system directories that
+.I lsof
+obtains from your system's mount table are symbolic links,
+.I lsof
+won't be able to resolve the links.
+This is because the
+.B \-b
+option causes
+.I lsof
+to avoid the kernel
+.IR readlink (2)
+function it uses to resolve symbolic links.
+.PP
+Finally, using the
+.B \-b
+option causes
+.I lsof
+to issue warning messages when it needs to use the kernel functions
+that the
+.B \-b
+option directs it to avoid.
+You can suppress these messages by specifying the
+.B \-w
+option, but if you do, you won't see the alternate device numbers
+reported in the warning messages.
+.SH "ALTERNATE DEVICE NUMBERS"
+.PP
+On some dialects, when
+.I lsof
+has to break a block because it can't get information about a
+mounted file system via the
+.IR lstat (2)
+and
+.IR stat (2)
+kernel functions, or because you specified the
+.B \-b
+option,
+.I lsof
+can obtain some of the information it needs \- the device number and
+possibly the file system type \- from the system mount table.
+When that is possible,
+.I lsof
+will report the device number it obtained.
+(You can suppress the report by specifying the
+.B \-w
+option.)
+.PP
+You can assist this process if your mount table is supported with an
+.I /etc/mtab
+or
+.I /etc/mnttab
+file that contains an options field by adding a ``dev=xxxx'' field for
+mount points that do not have one in their options strings.
+Note: you must be able to edit the file \- i.e., some mount tables
+like recent Solaris /etc/mnttab or Linux /proc/mounts are read\-only
+and can't be modified.
+.PP
+You may also be able to supply device numbers using the
+.B +m
+and
+.BI +m " m"
+options, provided they are supported by your dialect.
+Check the output of
+.I lsof's
+.B \-h
+or
+.B \-?
+options to see if the
+.B +m
+and
+.BI +m " m"
+options are available.
+.PP
+The ``xxxx'' portion of the field is the hexadecimal value
+of the file system's device number.
+(Consult the
+.I st_dev
+field of the output of the
+.IR lstat (2)
+and
+.IR stat (2)
+functions for the appropriate values for your file systems.)
+Here's an example from a Sun Solaris 2.6
+.I /etc/mnttab
+for a file system remotely mounted via NFS:
+.PP
+.nf
+	nfs  ignore,noquota,dev=2a40001
+.fi
+.PP
+There's an advantage to having ``dev=xxxx'' entries in your mount
+table file, especially for file systems that are mounted from remote
+NFS servers.
+When a remote server crashes and you want to identify its users by running
+.I lsof
+on one of its clients,
+.I lsof
+probably won't be able to get output from the
+.IR lstat (2)
+and
+.IR stat (2)
+functions for the file system.
+If it can obtain the file system's device number from the mount table,
+it will be able to display the files open on the crashed NFS server.
+.PP
+Some dialects that do not use an ASCII
+.I /etc/mtab
+or
+.I /etc/mnttab
+file for the mount table may still provide an alternative device number
+in their internal mount tables.
+This includes AIX, Apple Darwin, FreeBSD, NetBSD, OpenBSD, and Tru64 UNIX.
+.I Lsof
+knows how to obtain the alternative device number for these dialects
+and uses it when its attempt to
+.IR lstat (2)
+or
+.IR stat (2)
+the file system is blocked.
+.PP
+If you're not sure your dialect supplies alternate device numbers
+for file systems from its mount table, use this
+.I lsof
+incantation to see if it reports any alternate device numbers:
+.PP
+.IP
+lsof -b
+.PP
+Look for standard error file warning messages that
+begin ``assuming "dev=xxxx" from ...''.
+.SH "KERNEL NAME CACHE"
+.PP
+.I Lsof
+is able to examine the kernel's name cache or use other kernel
+facilities (e.g., the ADVFS 4.x tag_to_path() function under
+Tru64 UNIX) on some dialects for most file system types,
+excluding AFS, and extract recently used path name components from it.
+(AFS file system path lookups don't use the kernel's name cache; some
+Solaris VxFS file system operations apparently don't use it, either.)
+.PP
+.I Lsof
+reports the complete paths it finds in the NAME column.
+If
+.I lsof
+can't report all components in a path, it reports in the NAME column
+the file system name, followed by a space, two `-' characters, another
+space, and the name components it has located, separated by
+the `/' character.
+.PP
+When
+.I lsof
+is run in repeat mode \- i.e., with the
+.B \-r
+option specified \- the extent to which it can report path name
+components for the same file may vary from cycle to cycle.
+That's because other running processes can cause the kernel to
+remove entries from its name cache and replace them with others.
+.PP
+.I Lsof's
+use of the kernel name cache to identify the paths of files
+can lead it to report incorrect components under some circumstances.
+This can happen when the kernel name cache uses device and node
+number as a key (e.g., SCO OpenServer) and a key on a rapidly
+changing file system is reused.
+If the UNIX dialect's kernel doesn't purge the name cache entry for
+a file when it is unlinked,
+.I lsof
+may find a reference to the wrong entry in the cache.
+The
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+has more information on this situation.
+.PP
+.I Lsof
+can report path name components for these dialects:
+.PP
+.nf
+	FreeBSD
+	HP\-UX
+	Linux
+	NetBSD
+	NEXTSTEP
+	OpenBSD
+	OPENSTEP
+	SCO OpenServer
+	SCO|Caldera UnixWare
+	Solaris
+	Tru64 UNIX
+.fi
+.PP
+.I Lsof
+can't report path name components for these dialects:
+.PP
+.nf
+	AIX
+.fi
+.PP
+If you want to know why
+.I lsof
+can't report path name components for some dialects, see the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+.SH "DEVICE CACHE FILE"
+.PP
+Examining all members of the
+.I /dev
+(or
+.IR /devices )
+node tree with
+.IR stat (2)
+functions can be time consuming.
+What's more, the information that
+.I lsof
+needs \- device number, inode number, and path \- rarely changes.
+.PP
+Consequently,
+.I lsof
+normally maintains an ASCII text file of cached
+.I /dev
+(or
+.IR /devices )
+information (exception: the /proc\-based Linux
+.I lsof
+where it's not needed.)
+The local system administrator who builds
+.I lsof
+can control the way the device cache file path is formed, selecting
+from these options:
+.PP
+.nf
+	Path from the \fB\-D\fP option;
+	Path from an environment variable;
+	System\-wide path;
+	Personal path (the default);
+	Personal path, modified by an environment variable.
+.fi
+.PP
+Consult the output of the
+.BR \-h ,
+.B \-D? ,
+or
+.B \-?
+help options for the current state of device cache support.
+The help output lists the default read\-mode device cache file path that
+is in effect for the current invocation of
+.IR lsof .
+The
+.B \-D?
+option output lists the read\-only and write device cache file paths,
+the names of any applicable environment variables, and the personal
+device cache path format.
+.PP
+.I Lsof
+can detect that the current device cache file has been accidentally
+or maliciously modified by integrity checks, including the computation
+and verification of a sixteen bit Cyclic Redundancy Check (CRC) sum on
+the file's contents.
+When
+.I lsof
+senses something wrong with the file, it issues a warning and attempts
+to remove the current cache file and create a new copy, but only to
+a path that the process can legitimately write.
+.PP
+The path from which a
+.I lsof
+process may attempt to read a device cache file may not be the same
+as the path to which it can legitimately write.
+Thus when
+.I lsof
+senses that it needs to update the device cache file, it may
+choose a different path for writing it from the path from which
+it read an incorrect or outdated version.
+.PP
+If available, the
+.B \-Dr
+option will inhibit the writing of a new device cache file.
+(It's always available when specified without a path name argument.)
+.PP
+When a new device is added to the system, the device cache file may
+need to be recreated.
+Since
+.I lsof
+compares the mtime of the device cache file with the mtime and ctime
+of the
+.I /dev
+(or
+.IR /devices )
+directory, it usually detects that a new device has been added;
+in that case
+.I lsof
+issues a warning message and attempts to rebuild the device cache file.
+.PP
+Whenever
+.I lsof
+writes a device cache file, it sets its ownership to the real UID
+of the executing process, and its permission modes to 0600, this
+restricting its reading and writing to the file's owner.
+.SH "LSOF PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS"
+.PP
+Two permissions of the
+.I lsof
+executable affect its ability to access device cache files.
+The permissions are set by the local system administrator when
+.I lsof
+is installed.
+.PP
+The first and rarer permission is setuid\-root.
+It comes into effect when
+.I lsof
+is executed; its effective UID is then
+root, while its real (i.e., that of the logged\-on user) UID is not.
+The
+.I lsof
+distribution recommends that versions for these dialects run setuid\-root.
+.PP
+.nf
+	HP-UX 11.11 and 11.23
+	Linux
+.fi
+.PP
+The second and more common permission is setgid.
+It comes into effect when the effective group IDentification number (GID)
+of the
+.I lsof
+process is set to one that can access kernel memory devices \-
+e.g., ``kmem'', ``sys'', or ``system''.
+.PP
+An
+.I lsof
+process that has setgid permission usually surrenders the permission
+after it has accessed the kernel memory devices.
+When it does that,
+.I lsof
+can allow more liberal device cache path formations.
+The
+.I lsof
+distribution recommends that versions for these dialects run setgid
+and be allowed to surrender setgid permission.
+.PP
+.nf
+	AIX 5.[12] and 5.3-ML1
+	Apple Darwin 7.x Power Macintosh systems
+	FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems
+	FreeBSD 5.x and [6789].x for Alpha, AMD64 and Sparc64-based
+	    systems
+	HP\-UX 11.00 
+	NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based
+	    systems
+	NEXTSTEP 3.[13] for NEXTSTEP architectures
+	OpenBSD 2.[89] and 3.[0\-9] for x86-based systems
+	OPENSTEP 4.x
+	SCO OpenServer Release 5.0.6 for x86-based systems
+	SCO|Caldera UnixWare 7.1.4 for x86-based systems
+	Solaris 2.6, 8, 9 and 10
+	Tru64 UNIX 5.1
+.fi
+.PP
+(Note:
+.I lsof
+for AIX 5L and above needs setuid\-root permission if its
+.B \-X
+option is used.)
+.PP
+.I Lsof
+for these dialects does not support a device cache, so the permissions
+given to the executable don't apply to the device cache file.
+.PP
+.nf
+	Linux
+.fi
+.SH "DEVICE CACHE FILE PATH FROM THE \-D OPTION"
+.PP
+The
+.B \-D
+option provides limited means for specifying the device cache file path.
+Its
+.B ?
+function will report the read\-only and write device cache file paths that
+.I lsof
+will use.
+.PP
+When the
+.B \-D
+.BR b ,
+.BR r ,
+and
+.B u
+functions are available, you can use them to request that the cache file be
+built in a specific location (\fBb\fR[\fIpath\fR]);
+read but not rebuilt (\fBr\fR[\fIpath\fR]);
+or read and rebuilt (\fBu\fR[\fIpath\fR]).
+The
+.BR b ,
+.BR r ,
+and
+.B u
+functions are restricted under some conditions.
+They are restricted when the
+.I lsof
+process is setuid\-root.
+The path specified with the
+.B r
+function is always read\-only, even
+when it is available.
+.PP
+The
+.BR b ,
+.BR r ,
+and
+.B u
+functions are also restricted when the
+.I lsof
+process runs setgid and
+.I lsof
+doesn't surrender the setgid permission.
+(See the
+.B "LSOF PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS"
+section for a list of implementations that normally don't surrender
+their setgid permission.)
+.PP
+A further
+.B \-D
+function,
+.B i
+(for ignore), is always available.
+.PP
+When available, the
+.B b
+function tells
+.I lsof
+to read device information from the kernel with the
+.IR stat (2)
+function and build a device cache file at the indicated path.
+.PP
+When available, the
+.B r
+function tells
+.I lsof
+to read the device cache file, but not update it.
+When a path argument accompanies
+.BR \-Dr ,
+it names the device cache file path.
+The
+.B r
+function is always available when it is specified without a
+path name argument.
+If
+.I lsof
+is not running setuid\-root and surrenders its setgid permission,
+a path name argument may accompany the
+.B r
+function.
+.PP
+When available, the
+.B u
+function tells
+.I lsof
+to attempt to read and use the device cache file.
+If it can't read the file, or if it finds the contents of the
+file incorrect or outdated, it will read information from the kernel,
+and attempt to write an updated version of the device cache file,
+but only to a path it considers legitimate for the
+.I lsof
+process effective and real UIDs.
+.SH "DEVICE CACHE PATH FROM AN ENVIRONMENT VARIABLE"
+.PP
+.I Lsof's
+second choice for the device cache file is the contents of the
+LSOFDEVCACHE environment variable.
+It avoids this choice if the
+.I lsof
+process is setuid\-root, or the real UID of the process is root.
+.PP
+A further restriction applies to a device cache file path taken from
+the LSOFDEVCACHE environment variable:
+.I lsof
+will not write a device cache file to the path if the
+.I lsof
+process doesn't surrender its setgid permission.
+(See the
+.B "LSOF PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS"
+section for information on implementations that don't surrender
+their setgid permission.)
+.PP
+The local system administrator can disable the use of the LSOFDEVCACHE
+environment variable or change its name when building
+.IR lsof .
+Consult the output of
+.B \-D?
+for the environment variable's name.
+.SH "SYSTEM-WIDE DEVICE CACHE PATH"
+.PP
+The local system administrator may choose to have a system\-wide
+device cache file when building
+.IR lsof .
+That file will generally be constructed by a special system administration
+procedure when the system is booted or when the contents of
+.I /dev
+or
+.IR /devices )
+changes.
+If defined, it is
+.I lsof's
+third device cache file path choice.
+.PP
+You can tell that a system\-wide device cache file is in effect
+for your local installation by examining the
+.I lsof
+help option output \- i.e., the output from the
+.B \-h
+or
+.B \-?
+option.
+.PP
+.I Lsof
+will never write to the system\-wide device cache file path by
+default.
+It must be explicitly named with a
+.B \-D
+function in a root\-owned procedure.
+Once the file has been written, the procedure must change its permission
+modes to 0644 (owner\-read and owner\-write, group\-read, and other\-read).
+.SH "PERSONAL DEVICE CACHE PATH (DEFAULT)"
+.PP
+The default device cache file path of the
+.I lsof
+distribution is one recorded in the home directory of the real UID
+that executes
+.IR lsof .
+Added to the home directory is a second path component of the form
+.IR .lsof_hostname .
+.PP
+This is
+.I lsof's
+fourth device cache file path choice, and is
+usually the default.
+If a system\-wide device cache file path was defined when
+.I lsof
+was built,
+this fourth choice will be applied when
+.I lsof
+can't find the system\-wide device cache file.
+This is the
+.B only
+time
+.I lsof
+uses two paths when reading the device cache file.
+.PP
+The
+.I hostname
+part of the second component is the base
+name of the executing host, as returned by
+.IR gethostname (2).
+The base name is defined to be the characters preceding the first `.'
+in the
+.IR gethostname (2)
+output, or all the
+.IR gethostname (2)
+output if it contains no `.'.
+.PP
+The device cache file belongs to the user ID and is readable and
+writable by the user ID alone \- i.e., its modes are 0600.
+Each distinct real user ID on a given host that executes
+.I lsof
+has a distinct device cache file.
+The
+.I hostname
+part of the path distinguishes device cache files in an NFS\-mounted
+home directory into which device cache files are written from
+several different hosts.
+.PP
+The personal device cache file path formed by this method represents
+a device cache file that
+.I lsof
+will attempt to read, and will attempt to write should it not
+exist or should its contents be incorrect or outdated.
+.PP
+The
+.B \-Dr
+option without a path name argument will inhibit the writing of a new
+device cache file.
+.PP
+The
+.B \-D?
+option will list the format specification for constructing the
+personal device cache file.
+The conversions used in the format specification are described in the
+.I 00DCACHE
+file of the
+.I lsof
+distribution.
+.SH "MODIFIED PERSONAL DEVICE CACHE PATH"
+.PP
+If this option is defined by the local system administrator when
+.I lsof
+is built, the LSOFPERSDCPATH environment variable contents may
+be used to add a component of the personal device cache file path.
+.PP
+The LSOFPERSDCPATH variable contents are inserted in the path at the
+place marked by the local system administrator with the ``%p''
+conversion in the HASPERSDC format specification of the dialect's
+.I machine.h 
+header file.
+(It's placed right after the home directory in the default
+.I lsof
+distribution.)
+.PP
+Thus, for example, if LSOFPERSDCPATH contains ``LSOF'', the home
+directory is ``/Homes/abe'', the host name is ``lsof.itap.purdue.edu'',
+and the HASPERSDC format is the default (``%h/%p.lsof_%L''), the
+modified personal device cache file path is:
+.PP
+.nf
+	/Homes/abe/LSOF/.lsof_vic
+.fi
+.PP
+The LSOFPERSDCPATH environment variable is ignored when the
+.I lsof
+process is setuid\-root or when the real UID of the process is root.
+.PP
+.I Lsof
+will not write to a modified personal device cache file path if the
+.I lsof
+process doesn't surrender setgid permission.
+(See the
+.B "LSOF PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS"
+section for a list of implementations that normally don't surrender
+their setgid permission.)
+.PP
+If, for example, you want to create a sub\-directory of personal
+device cache file paths by using the LSOFPERSDCPATH environment
+variable to name it, and
+.I lsof
+doesn't surrender its setgid permission, you will have to allow
+.I lsof
+to create device cache files at the standard personal path and
+move them to your subdirectory with shell commands.
+.PP
+The local system administrator may: disable this option when
+.I lsof
+is built; change the name of the environment variable from
+LSOFPERSDCPATH to something else; change the HASPERSDC
+format to include the personal path component in another place;
+or exclude the personal path component entirely.
+Consult the output of the
+.B \-D?
+option for the environment variable's name and the HASPERSDC
+format specification.
+.SH DIAGNOSTICS
+Errors are identified with messages on the standard error file.
+.PP
+.I Lsof
+returns a one (1) if any error was detected, including the failure to
+locate command names, file names, Internet addresses or files, login
+names, NFS files, PIDs, PGIDs, or UIDs it was asked to list.
+If the
+.B \-V
+option is specified,
+.I lsof
+will indicate the search items it failed to list.
+.PP
+It returns a zero (0) if no errors were detected and if it was able to
+list some information about all the specified search arguments.
+.PP
+.PP
+When
+.I lsof
+cannot open access to
+.I /dev
+(or
+.IR /devices )
+or one of its subdirectories, or get information on a file in them with
+.IR stat (2),
+it issues a warning message and continues.
+That
+.I lsof
+will issue warning messages about inaccessible files in
+.I /dev
+(or
+.IR /devices )
+is indicated in its help output \- requested with the
+.B \-h
+or
+>B \-?
+options \-  with the message:
+.PP
+.nf
+	Inaccessible /dev warnings are enabled.
+.fi
+.PP
+The warning message may be suppressed with the
+.B \-w
+option.
+It may also have been suppressed by the system administrator when
+.I lsof
+was compiled by the setting of the WARNDEVACCESS definition.
+In this case, the output from the help options will include the message:
+.PP
+.nf
+	Inaccessible /dev warnings are disabled.
+.fi
+.PP
+Inaccessible device warning messages usually disappear after
+.I lsof
+has created a working device cache file.
+.SH EXAMPLES
+For a more extensive set of examples, documented more fully, see the
+.I 00QUICKSTART
+file of the
+.I lsof
+distribution.
+.PP
+To list all open files, use:
+.IP
+lsof
+.PP
+To list all open Internet, x.25 (HP\-UX), and UNIX domain files, use:
+.IP
+lsof -i -U
+.PP
+To list all open IPv4 network files in use by the process whose PID is
+1234, use:
+.IP
+lsof -i 4 -a -p 1234
+.PP
+Presuming the UNIX dialect supports IPv6, to list only open IPv6
+network files, use:
+.IP
+lsof -i 6
+.PP
+To list all files using any protocol on ports 513, 514, or 515 of host
+wonderland.cc.purdue.edu, use:
+.IP
+lsof -i @wonderland.cc.purdue.edu:513-515
+.PP
+To list all files using any protocol on any port of mace.cc.purdue.edu
+(cc.purdue.edu is the default domain), use:
+.IP
+lsof -i @mace
+.PP
+To list all open files for login name ``abe'', or user ID 1234, or
+process 456, or process 123, or process 789, use:
+.IP
+lsof -p 456,123,789 -u 1234,abe
+.PP
+To list all open files on device /dev/hd4, use:
+.IP
+lsof /dev/hd4
+.PP
+To find the process that has /u/abe/foo open, use:
+.IP
+lsof /u/abe/foo
+.PP
+To send a SIGHUP to the processes that have /u/abe/bar open, use:
+.IP
+kill -HUP `lsof -t /u/abe/bar`
+.PP
+To find any open file, including an open UNIX domain socket file,
+with the name
+.IR /dev/log ,
+use:
+.IP
+lsof /dev/log
+.PP
+To find processes with open files on the NFS file system named
+.I /nfs/mount/point
+whose server is inaccessible, and presuming your mount table supplies
+the device number for
+.IR /nfs/mount/point ,
+use:
+.IP
+lsof -b /nfs/mount/point
+.PP
+To do the preceding search with warning messages suppressed, use:
+.IP
+lsof -bw /nfs/mount/point
+.PP
+To ignore the device cache file, use:
+.IP
+lsof -Di
+.PP
+To obtain PID and command name field output for each process, file
+descriptor, file device number, and file inode number for each file
+of each process, use:
+.IP
+lsof -FpcfDi
+.PP
+To list the files at descriptors 1 and 3 of every process running the
+.I lsof
+command for login ID ``abe'' every 10 seconds, use:
+.IP
+lsof -c lsof -a -d 1 -d 3 -u abe -r10
+.PP
+To list the current working directory of processes running a command that
+is exactly four characters long and has an 'o' or 'O' in character three,
+use this regular expression form of the
+.BI \-c " c"
+option:
+.IP
+lsof -c /^..o.$/i -a -d cwd
+.PP
+To find an IP version 4 socket file by its associated numeric dot\-form
+address, use:
+.IP
+lsof -i@128.210.15.17
+.PP
+To find an IP version 6 socket file (when the UNIX dialect supports
+IPv6) by its associated numeric colon\-form address, use:
+.IP
+lsof -i@[0:1:2:3:4:5:6:7]
+.PP
+To find an IP version 6 socket file (when the UNIX dialect supports
+IPv6) by an associated numeric colon\-form address that has a run of
+zeroes in it \- e.g., the loop\-back address \- use:
+.IP
+lsof -i@[::1]
+.PP
+To obtain a repeat mode marker line that contains the current time, use:
+.IP
+lsof -rm====%T====
+.PP
+To add spaces to the previous marker line, use:
+.IP
+lsof -r "m==== %T ===="
+.SH BUGS
+Since
+.I lsof
+reads kernel memory in its search for open files, rapid changes in kernel
+memory may produce unpredictable results.
+.PP
+When a file has multiple record locks, the lock status character
+(following the file descriptor) is derived from a test of the first
+lock structure, not from any combination of the individual record
+locks that might be described by multiple lock structures.
+.PP
+.I Lsof
+can't search for files with restrictive access permissions by
+.I name
+unless it is installed with root set\-UID permission.
+Otherwise it is limited to searching for files to which its user
+or its set-GID group (if any) has access permission.
+.PP
+The display of the destination address of a raw socket (e.g., for
+.IR ping )
+depends on the UNIX operating system.
+Some dialects store the destination address in the raw socket's protocol
+control block, some do not.
+.PP
+.I Lsof
+can't always represent Solaris device numbers in the same way that
+.IR ls (1)
+does.
+For example, the major and minor device numbers that the
+.IR lstat (2)
+and
+.IR stat (2)
+functions report for the directory on which CD-ROM files are mounted
+(typically 
+.IR /cdrom )
+are not the same as the ones that it reports for the device on which
+CD-ROM files are mounted (typically
+.IR /dev/sr0 ).
+(\fILsof\fP reports the directory numbers.)
+.PP
+The support for
+.I /proc
+file systems is available only for BSD and Tru64 UNIX dialects, Linux, and
+dialects derived from SYSV R4 \- e.g., FreeBSD, NetBSD, OpenBSD, Solaris,
+UnixWare.
+.PP
+Some
+.I /proc
+file items \- device number, inode number, and file size \-
+are unavailable in some dialects.
+Searching for files in a
+.I /proc
+file system may require that the full path name be specified.
+.PP
+No text (\fBtxt\fP) file descriptors are displayed for Linux
+processes.
+All entries for files other than the current working directory,
+the root directory, and numerical file descriptors are labeled
+.B mem
+descriptors.
+.PP
+.I Lsof
+can't search for Tru64 UNIX named pipes by name, because their kernel
+implementation of lstat(2) returns an improper device number for a
+named pipe.
+.PP
+.I Lsof
+can't report fully or correctly on HP\-UX 9.01, 10.20, and 11.00 locks
+because of insufficient access to kernel data or errors in the
+kernel data.
+See the
+.I lsof
+FAQ (The \fBFAQ\fP section gives its location.)
+for details.
+.PP
+The AIX SMT file type is a fabrication.
+It's made up for file structures whose type (15) isn't defined in the AIX
+.I /usr/include/sys/file.h
+header file.
+One way to create such file structures is to run X clients with the DISPLAY
+variable set to ``:0.0''.
+.PP
+The
+.BI +|\-f [cfgGn]
+option is not supported under /proc\-based Linux
+.IR lsof ,
+because it doesn't read kernel structures from kernel memory.
+.SH ENVIRONMENT
+.I Lsof
+may access these environment variables.
+.TP \w'LSOFPERSDCPATH'u+4
+LANG
+defines a language locale.
+See
+.IR setlocale (3)
+for the names of other variables that can be used in place
+of LANG \- e.g., LC_ALL, LC_TYPE, etc.
+.TP
+LSOFDEVCACHE
+defines the path to a device cache file.
+See the
+.B "DEVICE CACHE PATH FROM AN ENVIRONMENT VARIABLE"
+section for more information.
+.TP
+LSOFPERSDCPATH
+defines the middle component of a modified personal device cache
+file path.
+See the
+.B "MODIFIED PERSONAL DEVICE CACHE PATH"
+section for more information.
+.SH FAQ
+Frequently-asked questions and their answers (an FAQ) are
+available in the
+.I 00FAQ
+file of the
+.I lsof
+distribution.
+.PP
+That file is also available via anonymous ftp from
+.I lsof.itap.purdue.edu
+at
+.IR pub/tools/unix/lsof FAQ .
+The URL is:
+.IP
+ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
+.SH FILES
+.TP \w'.lsof_hostname'u+4
+.I /dev/kmem
+kernel virtual memory device
+.TP
+.I /dev/mem
+physical memory device
+.TP
+.I /dev/swap
+system paging device
+.TP
+.I .lsof_hostname
+.I lsof's
+device cache file
+(The suffix,
+.IR hostname ,
+is the first component of the host's name returned by
+.IR gethostname (2) .)
+.SH AUTHORS
+.I Lsof
+was written by Victor A. Abell <abe@purdue.edu> of Purdue University.
+Many others have contributed to
+.IR lsof .
+They're listed in the
+.I 00CREDITS
+file of the
+.I lsof
+distribution.
+.SH DISTRIBUTION
+The latest distribution of
+.I lsof
+is available via anonymous ftp from the host
+.IR lsof.itap.purdue.edu .
+You'll find the
+.I lsof
+distribution in the
+.I pub/tools/unix/lsof
+directory.
+.PP
+You can also use this URL:
+.IP
+ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof
+.PP
+.I Lsof
+is also mirrored elsewhere.
+When you access
+.I lsof.itap.purdue.edu
+and change to its
+.I pub/tools/unix/lsof
+directory, you'll be given a list of some mirror sites.
+The
+.I pub/tools/unix/lsof
+directory also contains a more complete list in its
+.I mirrors
+file.
+Use mirrors with caution \- not all mirrors always have the latest
+.I lsof
+revision.
+.PP
+Some pre\-compiled
+.I Lsof
+executables are available on
+.IR lsof.itap.purdue.edu ,
+but their use is discouraged \- it's better that you build
+your own from the sources.
+If you feel you must use a pre\-compiled executable, please
+read the cautions that appear in the README files of the
+.I pub/tools/unix/lsof/binaries
+subdirectories and in the 00* files of the distribution.
+.PP
+More information on the
+.I lsof
+distribution can be found in its
+.I README.lsof_<version>
+file.
+If you intend to get the
+.I lsof
+distribution and build it, please read
+.I README.lsof_<version>
+and the other 00* files of the distribution before sending questions
+to the author.
+.SH SEE ALSO
+.PP
+Not all the following manual pages may exist in every UNIX
+dialect to which
+.I lsof
+has been ported.
+.PP
+access(2),
+awk(1),
+crash(1),
+fattach(3C),
+ff(1),
+fstat(8),
+fuser(1),
+gethostname(2),
+isprint(3),
+kill(1),
+localtime(3),
+lstat(2),
+modload(8),
+mount(8),
+netstat(1),
+ofiles(8L),
+perl(1),
+ps(1),
+readlink(2),
+setlocale(3),
+stat(2),
+strftime(3),
+time(2),
+uname(1).
diff --git a/lsof_4.85/lsof_4.85_src/lsof.h b/lsof_4.85/lsof_4.85_src/lsof.h
new file mode 100644
index 0000000..97b8f5b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lsof.h
@@ -0,0 +1,984 @@
+/*
+ * lsof.h - common 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: lsof.h,v 1.65 2011/09/07 19:13:49 abe Exp $
+ */
+
+
+#if	!defined(LSOF_H)
+#define	LSOF_H	1
+
+#include "machine.h"
+
+# if	!defined(FSV_DEFAULT)
+#define	FSV_DEFAULT	0
+# endif	/* !defined(FSV_DEFAULT) */
+
+#include "lsof_fields.h"
+
+#include <ctype.h>
+#include <errno.h>
+
+# if	defined(HASSETLOCALE)
+#include <locale.h>
+# endif	/* defined(HASSETLOCALE) */
+
+#include <netdb.h>
+#include <pwd.h>
+#include <stdio.h>
+
+#include <sys/stat.h>
+#include <sys/wait.h>
+
+
+/*
+ * Definitions and structures that may be needed by dlsof.h
+ */
+
+# if	!defined(INODETYPE)
+#define	INODETYPE	unsigned long	/* node number storage type */
+#define	INODEPSPEC	"l"		/* node number printf specification
+					 * modifier */
+# endif	/* !defined(INODETYPE) */
+
+struct l_dev {
+	dev_t rdev;			/* device */
+	INODETYPE inode;		/* inode number */
+	char *name;			/* name */
+	int v;				/* has been verified
+					 * (when DCUnsafe == 1) */
+};
+
+
+/*
+ * FILE_FLAG column names
+ */
+
+#define	FF_AIO		"AIO"
+#define	FF_APPEND	"AP"
+#define	FF_ASYNC	"ASYN"
+#define	FF_BLKANDSET	"BAS"
+#define	FF_BLKINUSE	"BKIU"
+#define	FF_BLKSEEK	"BSK"
+#define	FF_CIO		"CIO"
+#define	FF_CLONE	"CLON"
+#define	FF_CLREAD	"CLRD"
+#define	FF_COPYAVOID	"CA"
+#define	FF_CREAT	"CR"
+#define	FF_DATAFLUSH	"DFLU"
+#define	FF_DEFER	"DF"
+#define	FF_DEFERIND	"DFI"
+#define	FF_DELAY	"DLY"
+#define	FF_DIRECT	"DIR"
+#define	FF_DIRECTORY	"DTY"
+#define	FF_DOCLONE	"DOCL"
+#define	FF_DSYNC	"DSYN"
+#define	FF_EVTONLY	"EVO"
+#define	FF_EXCL		"EXCL"
+#define	FF_EXEC		"EX"
+#define	FF_EXLOCK	"XL"
+#define	FF_FILE_MBLK	"MBLK"
+#define	FF_FSYNC	"FSYN"
+#define	FF_GCFDEFER	"GCDF"
+#define	FF_GCFMARK	"GCMK"
+#define	FF_GENTTY	"GTTY"
+#define	FF_HASLOCK	"LCK"
+#define	FF_HUP		"HUP"
+#define	FF_KERNEL	"KERN"
+#define	FF_KIOCTL	"KIOC"
+#define	FF_LARGEFILE	"LG"
+#define	FF_MARK		"MK"
+#define	FF_MOUNT	"MNT"
+#define	FF_MSYNC	"MSYN"
+#define	FF_NBDRM	"NBDR"
+#define	FF_NBIO		"NBIO"
+#define	FF_NBLOCK	"NB"
+#define	FF_NBUF		"NBF"
+#define	FF_NMFS		"NMFS"
+#define	FF_NDELAY	"ND"
+#define	FF_NET		"NET"
+#define	FF_NOATM	"NATM"
+#define	FF_NOCACHE	"NC"
+#define	FF_NOCTTY	"NTTY"
+#define	FF_NODSYNC	"NDSY"
+#define	FF_NOFOLNK	"NFLK"
+#define	FF_NOTOSTOP	"NOTO"
+#define	FF_NSHARE	"NSH"
+#define	FF_OLRMIRROR	"OLRM"
+#define	FF_POSIX_AIO	"PAIO"
+#define	FF_POSIX_PIPE	"PP"
+#define	FF_RAIOSIG	"RAIO"
+#define	FF_RCACH	"RC"
+#define	FF_RDWR		"RW"
+#define	FF_READ		"R"
+#define	FF_REVOKED	"REV"
+#define	FF_RSHARE	"RSH"
+#define	FF_RSYNC	"RSYN"
+#define	FF_SETBLK	"BL"
+#define	FF_SHLOCK	"SL"
+#define	FF_SNAP		"SNAP"
+#define	FF_SOCKET	"SOCK"
+#define	FF_SQTSH1	"SQS1"
+#define	FF_SQTSH2	"SQS2"
+#define	FF_SQTREPAIR	"SQR"
+#define	FF_SQTSH	"SQSH"
+#define	FF_SQTSVM	"SQSV"
+#define	FF_STOPIO	"STPI"
+#define	FF_SYNC		"SYN"
+#define	FF_SYNCRON	"SWR"
+#define	FF_TCP_MDEVONLY	"TCPM"
+#define	FF_TERMIO	"TIO"
+#define	FF_TRUNC	"TR"
+#define	FF_VHANGUP	"VH"
+#define	FF_VTEXT	"VTXT"
+#define	FF_WAKEUP	"WKUP"
+#define	FF_WAITING	"WTG"
+#define	FF_WRITE	"W"
+
+
+/*
+ * Process open file flag names
+ */
+
+#define	POF_ALLOCATED	"ALLC"
+#define	POF_BNRD	"BR"
+#define	POF_BNWR	"BW"
+#define POF_BNHUP	"BHUP"
+#define	POF_CLOEXEC	"CX"
+#define	POF_CLOSING	"CLSG"
+#define	POF_FDLOCK	"LCK"
+#define	POF_INUSE	"USE"
+#define	POF_MAPPED	"MP"
+#define	POF_FSHMAT	"SHMT"
+#define	POF_RESERVED	"OPIP"
+#define	POF_RSVWT	"RSVW"
+
+
+/*
+ * Cross-over (-x) option values
+ */
+
+#define	XO_FILESYS	0x1		/* file system mount points */
+#define	XO_SYMLINK	0x2		/* symbolic links */
+#define	XO_ALL		(XO_FILESYS | XO_SYMLINK)
+
+#include "dlsof.h"
+
+#include <sys/types.h>			/* just in case -- because utmp.h
+					 * may need it */
+#include "./regex.h"
+
+# if	defined(EMPTY)
+#undef	EMPTY
+# endif	/* defined(EMPTY) */
+
+# if	defined(HASUTMPX)
+#include <utmpx.h>
+# else	/* !defined(HASUTMPX) */
+#include <utmp.h>
+# endif	/* defined(HASUTMPX) */
+
+extern int errno;
+extern char *optarg;
+extern int optind;
+
+#define	ACCESSERRFMT	"%s: WARNING: access %s: %s\n"
+
+# if	defined(HASDCACHE)
+#define	CRC_POLY	0120001 	/* CRC-16 polynomial */
+#define	CRC_TBLL	256		/* crc table length for software */
+#define	CRC_BITS	8		/* number of bits contributing */
+# endif	/* defined(HASDCACHE) */
+#define	CMDL		9		/* maximum number of characters from
+					 * command name to print in COMMAND
+					 * column */
+#define	CWD		" cwd"		/* current working directory fd name */
+#define	FDLEN		8		/* fd printing array length */
+#define	FSV_FA		0x1		/* file struct addr status */
+#define	FSV_CT		0x2		/* file struct count status */
+#define	FSV_FG		0x4		/* file struct flags */
+#define	FSV_NI		0x8		/* file struct node ID status */
+
+# if	!defined(GET_MAJ_DEV)
+#define	GET_MAJ_DEV	major		/* if no dialect specific macro has
+					 * been defined, use standard major()
+					 * macro */
+# endif	/* !defined(GET_MAJ_DEV) */
+
+# if	!defined(GET_MIN_DEV)
+#define	GET_MIN_DEV	minor		/* if no dialect specific macro has
+					 * been defined, use standard minor()
+					 * macro */
+# endif	/* !defined(GET_MIN_DEV) */
+
+# if	defined(HASSELINUX)
+#define	HASHCNTX	128		/* security context hash bucket count
+					 * -- MUST BE A POWER OF 2!!! */
+# endif	/* defined(HASSELINUX) */
+
+# if	defined(HASZONES)
+#define	HASHZONE	128		/* zone hash bucket count -- MUST BE
+					 * A POWER OF 2!!! */
+# endif	/* defined(HASZONES) */
+
+#define	IDINCR		10		/* PID/PGID table malloc() increment */
+
+# if	!defined(INADDR_LOOPBACK)
+#define	INADDR_LOOPBACK	(u_long)0x7f000001
+# endif	/* !defined(INADDR_LOOPBACK) */
+
+#define	IPROTOL		8		/* Internet protocol length */
+
+# if	!defined(KA_T_FMT_X)
+#define	KA_T_FMT_X	"0x%08lx"	/* format for printing kernel
+					 * addresses in 0x... format */
+# endif	/* !defined(KA_T_FMT_X) */
+
+# if	!defined(LOGINML)
+#  if	defined(HASUTMPX)
+static struct utmpx dummy_utmp;		/* to get login name length */
+#define	LOGINML		sizeof(dummy_utmp.ut_user)
+					/* login name length */
+#  else	/* !defined(HASUTMPX) */
+static struct utmp dummy_utmp;		/* to get login name length */
+#define	LOGINML		sizeof(dummy_utmp.ut_name)
+					/* login name length */
+#  endif	/* defined(HASUTMPX) */
+# endif	/* !defined(LOGINML) */
+
+#define	LPROCINCR	128		/* Lproc[] allocation increment */
+#define	LSOF_URL	"ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/"
+#define	MIN_AF_ADDR	sizeof(struct in_addr)
+					/* minimum AF_* address length */
+
+# if	defined(HASIPv6)
+#define	MAX_AF_ADDR	sizeof(struct in6_addr)
+					/* maximum AF_* address length */
+# else	/* !defined(HASIPv6) */
+#define	MAX_AF_ADDR	MIN_AF_ADDR	/* maximum AF_* address length */
+# endif	/* defined(HASIPv6) */
+
+#define	MAXDCPATH	4		/* paths in DCpath[] */
+#define	MAXNWAD		100		/* maximum network addresses */
+
+# if	!defined(MEMMOVE)
+#define	MEMMOVE		memmove
+# endif	/* !defined*MEMMOVE) */
+
+#define	N_REGLR		0		/* regular file system node */
+#define	N_AFS		1		/* AFS node */
+#define	N_AFPFS		2		/* Apple Darwin AppleShare */
+#define	N_AUSX		3		/* Auspex LFS node */
+#define	N_AUTO		4		/* automount node */
+#define	N_BLK		5		/* block device node */
+#define	N_CACHE		6		/* cached file system node */
+#define	N_CDFS		7		/* CD-ROM node */
+#define	N_CFS		8		/* CFS node */
+#define	N_CHR		9		/* character device node */
+#define	N_COM		10		/* streams common device node */
+#define	N_CTFSADIR	11		/* Solaris CTFS adir node */
+#define	N_CTFSBUND	12		/* Solaris CTFS bundle node */
+#define	N_CTFSCDIR	13		/* Solaris CTFS cdir node */
+#define	N_CTFSCTL	14		/* Solaris CTFS ctl node */
+#define	N_CTFSEVT	15		/* Solaris CTFS events node */
+#define	N_CTFSLATE	16		/* Solaris CTFS latest node */
+#define	N_CTFSROOT	17		/* Solaris CTFS root node */
+#define	N_CTFSSTAT	18		/* Solaris CTFS status node */
+#define	N_CTFSSYM	19		/* Solaris CTFS symbolic node */
+#define	N_CTFSTDIR	20		/* Solaris CTFS type node */
+#define	N_CTFSTMPL	21		/* Solaris CTFS template node */
+#define	N_DEV		22		/* DEV FS node */
+#define	N_DOOR		23		/* DOOR node */
+#define	N_FD		24		/* FD node */
+#define	N_FIFO		25		/* FIFO node */
+#define	N_HSFS		26		/* High Sierra node */
+#define	N_KERN		27		/* BSD /kern node */
+#define	N_LOFS		28		/* loopback node */
+#define	N_MNT		29		/* mount file system device node */
+#define	N_MPC		30		/* multiplexed device node */
+#define	N_MVFS		31		/* multi-volume file system node (?) */
+#define	N_NFS		32		/* NFS node */
+#define	N_NFS4		33		/* NFS version 4 node */
+#define	N_NM		34		/* named file system node */
+#define	N_OBJF		35		/* objfs file system node */
+#define	N_PCFS		36		/* PC file system node */
+#define	N_PIPE		37		/* pipe device node */
+#define	N_PORT		38		/* port node */
+#define	N_PROC		39		/* /proc node */
+#define	N_PSEU		49		/* pseudofs node */
+#define	N_SAMFS		41		/* Solaris SAM-FS */
+#define	N_SANFS		42		/* AIX SANFS */
+#define	N_SDEV		43		/* Solaris sdev file system node */
+#define	N_SHARED	44		/* Solaris sharedfs */
+#define	N_SOCK		45		/* sock_vnodeops node */
+#define	N_SPEC		46		/* spec_vnodeops node */
+#define	N_STREAM	47		/* stream node */
+#define	N_TMP		48		/* tmpfs node */
+#define	N_UFS		49		/* UNIX file system node */
+#define	N_UNKN		50		/* unknown node type */
+#define	N_VXFS		51		/* Veritas file system node */
+#define	N_XFS		52		/* XFS node */
+#define	N_ZFS		53		/* ZFS node */
+
+# if	!defined(OFFDECDIG)
+#define	OFFDECDIG	8		/* maximum number of digits in the
+					 * offset decimal form (0t...) */
+# endif	/* !defined(OFFDECDIG) */
+
+# if	!defined(USELOCALREADDIR)
+#define	CloseDir	closedir	/* use standard closedir() */
+#define	OpenDir		opendir		/* use standard opendir() */
+#define	ReadDir		readdir		/* use standard readdir() */
+# endif	/* !defined(USELOCALREADDIR) */
+
+#define	RPTTM		15		/* default repeat seconds */
+#define	RTD		" rtd"		/* root directory fd name */
+#define TCPTPI_FLAGS	0x0001		/* report TCP/TPI socket options and
+					 * state, and TCP_NODELAY state */
+#define	TCPTPI_QUEUES	0x0002		/* report TCP/TPI queue lengths */
+#define	TCPTPI_STATE	0x0004		/* report TCP/TPI state */
+#define TCPTPI_WINDOWS	0x0008		/* report TCP/TPI window sizes */
+#define	TCPTPI_ALL	(TCPTPI_QUEUES | TCPTPI_STATE | TCPTPI_WINDOWS)
+					/* report all TCP/TPI info */
+#define	TCPUDPALLOC	32		/* allocation amount for TCP and UDP
+					 * state tables */
+#define	TMLIMIT		15		/* readlink() & stat() timeout sec */
+#define	TMLIMMIN	2		/* minimum timeout */
+#define	TYPEL		8		/* type character length */
+#define	UIDCACHEL	1024		/* UID cache length */
+#define	UIDINCR		10		/* UID table malloc() increment */
+#define	USERPRTL	8		/* UID/login print length limit */
+
+# if	!defined(SZOFFTYPE)
+#define	SZOFFTYPE	unsigned long	/* type for size and offset */
+#undef	SZOFFPSPEC
+#define	SZOFFPSPEC	"l"		/* SZOFFTYPE printf specification
+					 * modifier */
+# endif	/* !defined(SZOFFTYPE) */
+
+# if	!defined(TIMEVAL_LSOF)
+#define	TIMEVAL_LSOF	timeval
+# endif	/* !defined(TIMEVAL_LSOF) */
+
+# if	!defined(XDR_PMAPLIST)
+#define	XDR_PMAPLIST	xdr_pmaplist
+# endif	/* !defined(XDR_PMAPLIST) */
+
+# if	!defined(XDR_VOID)
+#define	XDR_VOID	xdr_void
+# endif	/* !defined(XDR_VOID) */
+
+
+/*
+ * Output title definitions
+ */
+
+#define	CMDTTL		"COMMAND"
+extern int CmdColW;
+#define	CNTXTTL		"SECURITY-CONTEXT"
+extern int CntxColW;
+#define DEVTTL		"DEVICE"
+extern int DevColW;
+#define	FCTTL		"FCT"
+extern int FcColW;
+#define	FDTTL 		"FD"
+extern int FdColW;
+#define	FGTTL		"FILE-FLAG"
+extern int FgColW;
+#define	FSTTL		"FILE-ADDR"
+extern int FsColW;
+#define	NITTL		"NODE-ID"
+extern int NiColW;
+extern char *NiTtl;
+#define	NLTTL		"NLINK"
+extern int NlColW;
+#define	NMTTL		"NAME"
+extern int NmColW;
+#define NODETTL		"NODE"
+extern int NodeColW;
+#define OFFTTL		"OFFSET"
+#define	PGIDTTL		"PGID"
+extern int PgidColW;
+#define	PIDTTL		"PID"
+extern int PidColW;
+#define	PPIDTTL		"PPID"
+extern int PpidColW;
+#define SZTTL		"SIZE"
+#define	SZOFFTTL	"SIZE/OFF"
+extern int SzOffColW;
+#define	TIDTTL		"TID"
+extern	int TidColW;
+#define TYPETTL		"TYPE"
+extern int TypeColW;
+#define	USERTTL		"USER"
+extern int UserColW;
+#define ZONETTL		"ZONE"
+extern int ZoneColW;
+
+
+/*
+ * Selection flags
+ */
+
+#define	PS_PRI		1		/* primary process selection -- e.g.,
+					 * by PID or UID */
+#define	PS_SEC		2		/* secondary process selection -- e.g.,
+					 * by directory or file */
+#define	SELCMD		0x0001		/* select process by command name */
+#define	SELCNTX		0x0002		/* select security context (-Z) */
+#define	SELFD		0x0004		/* select file by descriptor name */
+#define	SELNA		0x0008		/* select socket by address (-i@...) */
+#define	SELNET		0x0010		/* select Internet socket files (-i) */
+#define	SELNFS		0x0020		/* select NFS files (-N) */
+#define	SELNLINK	0x0040		/* select based on link count */
+#define	SELNM		0x0080		/* select by name */
+#define	SELPGID		0x0100		/* select process group IDs (-g) */
+#define	SELPID		0x0200		/* select PIDs (-p) */
+#define	SELUID		0x0400		/* select UIDs (-u) */
+#define	SELUNX		0x0800		/* select UNIX socket (-U) */
+#define	SELZONE		0x1000		/* select zone (-z) */
+#define	SELEXCLF	0x2000		/* file selection excluded */
+#define	SELTASK		0x4000		/* select tasks (-K) */
+#define	SELALL		(SELCMD|SELCNTX|SELFD|SELNA|SELNET|SELNM|SELNFS|SELPID|SELUID|SELUNX|SELZONE|SELTASK)
+#define	SELPROC		(SELCMD|SELCNTX|SELPGID|SELPID|SELUID|SELZONE|SELTASK)
+					/* process selecters */
+#define	SELFILE		(SELFD|SELNFS|SELNLINK|SELNM)	/* file selecters */
+#define	SELNW		(SELNA|SELNET|SELUNX)		/* network selecters */
+
+/*
+ * Structure definitions
+ */
+
+# if	defined(HAS_AFS)
+struct afsnode {			/* AFS pseudo-node structure */
+	dev_t dev;
+	unsigned char ino_st;		/* 1 if inode has a value */
+	unsigned char nlink_st;		/* 1 if nlink has a value */
+	INODETYPE inode;
+	unsigned long size;
+	long nlink;
+};
+# endif	/* defined(HAS_AFS) */
+
+# if	defined(HAS_STD_CLONE)
+struct clone {
+	int dx;			/* index of device entry in Devtp[] */
+	struct clone *next;	/* forward link */
+};
+extern struct clone *Clone;
+# endif	/* defined(HAS_STD_CLONE) */
+
+# if	defined(HASNLIST)
+struct drive_Nl {			/* data to drive build_Nl() */
+	char *nn;			/* nickname for lookups */
+	char *knm;			/* kernel variable for name list */
+};
+extern struct drive_Nl Drive_Nl[];	/* defined in dstore.c */
+# endif	/* defined(HASNLIST) */
+
+
+/*
+ * Global storage definitions (including their structure definitions)
+ */
+
+typedef struct efsys_list {
+	char *path;			/* path to file system for which kernel
+					 * blocks are to be eliminated */
+	int pathl;			/* path length */
+	int rdlnk;			/* avoid readlink(2) if non-zero */
+	struct mounts *mp;		/* local mount table entry pointer */
+	struct efsys_list *next;	/* next efsys_list entry pointer */
+} efsys_list_t;
+extern efsys_list_t *Efsysl;		/* file systems for which kernel blocks
+					 * are to be eliminated */
+
+struct int_lst {
+	int i;				/* integer argument */
+	int f;				/* find state -- meaningful only if
+					 * x == 0 */
+	int x;				/* excluded state */
+};
+
+typedef struct lsof_rx {		/* regular expression table entry */
+	char *exp;			/* original regular expression */
+	regex_t cx;			/* compiled expression */
+	int mc;				/* match count */ 
+} lsof_rx_t;
+extern lsof_rx_t *CmdRx;
+extern int NCmdRxU;
+
+# if	defined(HASFSTRUCT)
+struct pff_tab {			/* print file flags table structure */
+	long val;			/* flag value */
+	char *nm;			/* name to print for flag */
+};
+# endif	/* defined(HASFSTRUCT) */
+
+struct seluid {
+	uid_t uid;			/* User ID */
+	char *lnm;			/* specified login name (NULL = none) */
+	unsigned char excl;		/* excluded state */
+	unsigned char f;		/* selected User ID find state
+					 * (meaningful only if excl == 0) */
+};
+
+# if	defined(HASBLKDEV)
+extern struct l_dev *BDevtp, **BSdev;
+extern int BNdev;
+# endif	/* defined(HASBLKDEV) */
+
+extern int CkPasswd;
+
+struct str_lst {
+	char *str;			/* string */
+	int len;			/* string length */
+	short f;			/* selected string find state */
+	short x;			/* exclusion (if non-zero) */
+	struct str_lst *next;		/* next list entry */
+};
+extern struct str_lst *Cmdl;
+extern int CmdLim;
+extern int Cmdni;
+extern int Cmdnx;
+ 
+# if	defined(HASSELINUX)
+typedef struct cntxlist {
+	char *cntx;			/* zone name */
+	int f;				/* "find" flag (used only in CntxArg) */
+	struct cntxlist *next;		/* next zone hash entry */
+} cntxlist_t;
+extern cntxlist_t *CntxArg;
+extern int CntxStatus;
+# endif	/* defined(HASSELINUX) */
+
+# if	defined(HASDCACHE)
+extern unsigned DCcksum;
+extern int DCfd;
+extern FILE *DCfs;
+extern char *DCpathArg;
+extern char *DCpath[];
+extern int DCpathX;
+extern int DCrebuilt;
+extern int DCstate;
+extern int DCunsafe;
+# endif	/* defined(HASDCACHE) */
+
+extern int DChelp;
+extern dev_t DevDev;
+extern struct l_dev *Devtp;
+extern char **Dstk;
+extern int Dstkn;
+extern int Dstkx;
+extern int ErrStat;
+extern uid_t Euid;
+extern int Fand;
+extern int Fblock;
+extern int Fcntx;
+extern int Ffield;
+extern int Ffilesys;
+extern int Fhelp;
+extern int Fhost;
+
+# if	defined(HASNCACHE)
+extern int Fncache;
+extern int NcacheReload;
+# endif	/* defined(HASNCACHE) */
+
+extern int Fnet;
+extern int FnetTy;
+extern int Fnfs;
+extern int Fnlink;
+extern int Foffset;
+extern int Fovhd;
+extern int Fport;
+
+# if	!defined(HASNORPC_H)
+extern int FportMap;
+# endif	/* !defined(HASNORPC_H) */
+
+extern int Fpgid;
+extern int Fppid;
+extern int Fsize;
+extern int Fsv;
+extern int FsvByf;
+extern int FsvFlagX;
+extern int Ftask;
+extern int Ftcptpi;
+extern int Fterse;
+extern int Funix;
+extern int Futol;
+extern int Fverbose;
+extern int Fwarn;
+
+# if	defined(HASXOPT_VALUE)
+extern int Fxopt;
+# endif	/* defined(HASXOPT_VALUE) */
+
+extern int Fxover;
+extern int Fzone;
+
+struct fd_lst {
+	char *nm;			/* file descriptor name -- range if
+					 * NULL */
+	int lo;				/* range start (if nm NULL) */
+	int hi;				/* range end (if nm NULL) */
+	struct fd_lst *next;
+};
+extern struct fd_lst *Fdl;
+extern int FdlTy;			/* Fdl[] type: -1 == none
+					 *		0 == include
+					 *		1 == exclude */
+
+struct fieldsel {
+	char id;			/* field ID character */
+	unsigned char st;		/* field status */
+	char *nm;			/* field name */
+	int *opt;			/* option variable address */
+	int ov;				/* value to OR with option variable */
+};
+extern struct fieldsel FieldSel[];
+
+extern int Hdr;
+
+enum IDType {PGID, PID};
+extern char *InodeFmt_d;
+extern char *InodeFmt_x;
+
+struct lfile {
+	char access;
+	char lock;
+	unsigned char dev_def;		/* device number definition status */
+	unsigned char inp_ty;		/* inode/iproto type
+					 *	0: neither inode nor iproto
+					 *	1: print inode in decimal
+					 *	2: iproto contains string
+					 *      3: print inode in hex
+					 */
+	unsigned char is_com;		/* common stream status */
+	unsigned char is_nfs;		/* NFS file status */
+	unsigned char is_stream;	/* stream device status */
+
+# if	defined(HASVXFS) && defined(HASVXFSDNLC)
+	unsigned char is_vxfs;		/* VxFS file status */
+# endif	/* defined(HASVXFS) && defined(HASVXFSDNLC) */
+
+	unsigned char lmi_srch;		/* local mount info search status:
+					 * 1 = printname() search required */
+
+# if	defined(HASMNTSTAT)
+	unsigned char mnt_stat;		/* mount point stat(2) status */
+# endif	/* defined(HASMNTSTAT) */
+
+	unsigned char nlink_def;	/* link count definition status */
+	unsigned char off_def;		/* offset definition status */
+	unsigned char rdev_def;		/* rdev definition status */
+	unsigned char sz_def;		/* size definition status */
+
+# if	defined(HASFSTRUCT)
+	unsigned char fsv;		/* file struct value status */
+# endif	/* defined(HASFSTRUCT) */
+
+	char fd[FDLEN];
+	char iproto[IPROTOL];
+	char type[TYPEL];
+	short sf;			/* select flags -- SEL* symbols */
+	int ch;				/* VMPC channel: -1 = none */
+	int ntype;			/* node type -- N_* value */
+	SZOFFTYPE off;
+	SZOFFTYPE sz;
+	dev_t dev;
+	dev_t rdev;
+	INODETYPE inode;
+	long nlink;			/* link count */
+	char *dev_ch;
+	char *fsdir;			/* file system directory */
+	char *fsdev;			/* file system device */
+
+# if	defined(HASFSINO)
+	INODETYPE fs_ino;		/* file system inode number */
+# endif	/* defined HASFSINO) */
+
+	struct linaddr {		/* local Internet address information */
+	    int af;			/* address family: 0 for none; AF_INET;
+					 * or AF_INET6 */
+	    int p;			/* port */
+	    union {
+		struct in_addr a4;	/* AF_INET Internet address */
+
+# if	defined(HASIPv6)
+		struct in6_addr a6;	/* AF_INET6 Internet address */
+# endif	/* defined(HASIPv6) */
+
+	    } ia;
+	} li[2];			/* li[0]: local
+					 * li[1]: foreign */
+	struct ltstate {		/* local TCP/TPI state */
+	    int type;			/* state type:
+					 *   -1 == none
+					 *    0 == TCP
+					 *    1 == TPI or socket (SS_*) */
+	    union {
+		int i;			/* integer state */
+		unsigned int ui;	/* unsigned integer state */
+	    } state;
+
+# if	defined(HASSOOPT)
+	    unsigned char pqlens;	/* pqlen status: 0 = none */
+	    unsigned char qlens;	/* qlen status:  0 = none */
+	    unsigned char qlims;	/* qlim status:  0 = none */
+	    unsigned char rbszs;	/* rbsz status:  0 = none */
+	    unsigned char sbszs;	/* sbsz status:  0 = none */
+	    int kai;			/* TCP keep-alive interval */
+	    int ltm;			/* TCP linger time */
+	    unsigned int opt;		/* socket options */
+	    unsigned int pqlen;		/* partial connection queue length */
+	    unsigned int qlen;		/* connection queue length */
+	    unsigned int qlim;		/* connection queue limit */
+	    unsigned long rbsz;		/* receive buffer size */
+	    unsigned long sbsz;		/* send buffer size */
+# endif	/* defined(HASSOOPT) */
+
+# if	defined(HASSOSTATE)
+	    unsigned int ss;		/* socket state */
+#  if	defined(HASSBSTATE)
+	    unsigned int sbs_rcv;	/* receive socket buffer state */
+	    unsigned int sbs_snd;	/* send socket buffer state */
+#  endif	/* defined(HASSBSTATE) */
+# endif	/* defined(HASSOSTATE) */
+
+# if	defined(HASTCPOPT)
+	    unsigned int topt;		/* TCP options */
+	    unsigned char msss;		/* mss status: 0 = none */
+	    unsigned long mss;		/* TCP maximum segment size */
+# endif	/* defined(HASTCPOPT) */
+
+# if	defined(HASTCPTPIQ)
+	    unsigned long rq;		/* receive queue length */
+	    unsigned long sq;		/* send queue length */
+	    unsigned char rqs;		/* rq status: 0 = none */
+	    unsigned char sqs;		/* sq status: 0 = none */
+# endif	/* defined(HASTCPTPIQ) */
+
+# if	defined(HASTCPTPIW)
+	    unsigned char rws;		/* rw status: 0 = none */
+	    unsigned char wws;		/* ww status: 0 = none */
+	    unsigned long rw;		/* read window size */
+	    unsigned long ww;		/* write window size */
+# endif	/* defined(HASTCPTPIW) */
+
+	} lts;
+	char *nm;
+	char *nma;			/* NAME column addition */
+
+# if	defined(HASNCACHE) && HASNCACHE<2
+	KA_T na;			/* file structure's node address */
+# endif	/* defined(HASNCACHE) && HASNCACHE<2 */
+
+# if	defined(HASNCACHE) && defined(HASNCVPID)
+	unsigned long id;		/* capability ID */
+# endif	/* defined(HASNCACHE) && defined(HASNCVPID) */
+
+# if	defined(HASLFILEADD)
+	HASLFILEADD
+# endif	/* defined(HASLFILEADD) */
+
+# if	defined(HASFSTRUCT)
+	KA_T fsa;			/* file structure address */
+	long fct;			/* file structure's f_count */
+	long ffg;			/* file structure's f_flag */
+	long pof;			/* process open-file flags */
+	KA_T fna;			/* file structure node address */
+# endif	/* defined(HASFSTRUCT) */
+
+	struct lfile *next;
+};
+extern struct lfile *Lf, *Plf;
+
+
+struct lproc {
+	char *cmd;			/* command name */
+ 
+# if	defined(HASSELINUX)
+	char *cntx;			/* security context */
+# endif	/* defined(HASSELINUX) */
+
+	short sf;			/* select flags -- SEL* symbols */
+	short pss;			/* state: 0 = not selected
+				 	 *	  1 = wholly selected
+				 	 *	  2 = partially selected */
+	int pid;			/* process ID */
+
+# if	defined(HASTASKS)
+	int tid;			/* task ID */
+# endif	/* HASTASKS */
+
+	int pgid;			/* process group ID */
+	int ppid;			/* parent process ID */
+	uid_t uid;			/* user ID */
+
+# if	defined(HASZONES)
+	char *zn;			/* zone name */
+# endif	/* defined(HASZONES) */
+
+	struct lfile *file;		/* open files of process */
+};
+extern struct lproc *Lp, *Lproc;
+
+extern char *Memory;
+extern int MntSup;
+extern char *MntSupP;
+
+# if	defined(HASPROCFS)
+extern struct mounts *Mtprocfs;
+# endif
+
+extern int Mxpgid;
+extern int Mxpid;
+extern int Mxuid;
+extern gid_t Mygid;
+extern int Mypid;
+extern uid_t Myuid;
+extern char *Namech;
+extern size_t Namechl;
+extern int Ndev;
+
+# if	defined(HASNLIST)
+#  if	!defined(NLIST_TYPE)
+#define	NLIST_TYPE	nlist
+#  endif	/* !defined(NLIST_TYPE) */
+extern struct NLIST_TYPE *Nl;
+extern int Nll;
+# endif	/* defined(HASNLIST) */
+extern long Nlink;
+extern int Nlproc;
+extern char *Nmlst;
+extern int Npgid;
+extern int Npgidi;
+extern int Npgidx;
+extern int Npid;
+extern int Npidi;
+extern int Npidx;
+extern int Npuns;
+extern int Ntype;
+extern int Nuid;
+extern int Nuidexcl;
+extern int Nuidincl;
+
+struct nwad {
+	char *arg;			/* argument */
+	char *proto;			/* protocol */
+	int af;				/* address family -- e.g.,
+					 * AF_INET, AF_INET6 */
+	unsigned char a[MAX_AF_ADDR];	/* address */
+	int sport;			/* starting port */
+	int eport;			/* ending port */
+	int f;				/* find state */
+	struct nwad *next;		/* forward link */
+};
+extern struct nwad *Nwad;
+
+extern int OffDecDig;
+extern char *Pn;
+
+# if	defined(HASFSTRUCT)
+extern struct pff_tab Pff_tab[];	/* file flags table */
+extern struct pff_tab Pof_tab[];	/* process open file flags table */
+# endif	/* defined(HASFSTRUCT) */
+
+# if	defined(HASPROCFS)
+struct procfsid {
+	pid_t pid;			/* search PID */
+	char *nm;			/* search name */
+	unsigned char f;		/* match found if == 1 */
+
+#  if	defined(HASPINODEN)
+	INODETYPE inode;		/* search inode number */
+#  endif	/* defined(HASPINODEN) */
+
+	struct procfsid *next;		/* forward link */
+};
+
+extern int Procfind;
+extern struct procfsid *Procfsid;
+extern int Procsrch;
+# endif	/* defined(HASPROCFS) */
+
+extern int PrPass;
+extern int RptTm;
+extern struct l_dev **Sdev;
+extern int Selall;
+extern int Selflags;
+extern int Setgid;
+extern int Selinet;
+extern int Setuidroot;
+extern struct sfile *Sfile;
+extern struct int_lst *Spgid;
+extern struct int_lst *Spid;
+extern struct seluid *Suid;
+extern char *SzOffFmt_0t;
+extern char *SzOffFmt_d;
+extern char *SzOffFmt_dv;
+extern char *SzOffFmt_x;
+extern int TaskPrtFl;
+extern int TcpStAlloc;
+extern unsigned char *TcpStI;
+extern int TcpStIn;
+extern int TcpStOff;
+extern unsigned char *TcpStX;
+extern int TcpStXn;
+extern int TcpNstates;
+extern char **TcpSt;
+extern char Terminator;
+extern int TmLimit;
+extern int UdpStAlloc;
+extern unsigned char *UdpStI;
+extern int UdpStIn;
+extern int UdpStOff;
+extern unsigned char *UdpStX;
+extern int UdpStXn;
+extern int UdpNstates;
+extern char **UdpSt;
+
+# if	defined(HASZONES)
+typedef struct znhash {
+	char *zn;			/* zone name */
+	int f;				/* "find" flag (used only in ZoneArg) */
+	struct znhash *next;		/* next zone hash entry */
+} znhash_t;
+extern znhash_t **ZoneArg;
+# endif	/* defined(HASZONES) */
+
+#include "proto.h"
+#include "dproto.h"
+
+#endif	/* LSOF_H */
diff --git a/lsof_4.85/lsof_4.85_src/lsof.man b/lsof_4.85/lsof_4.85_src/lsof.man
new file mode 100644
index 0000000..b740f66
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lsof.man
@@ -0,0 +1,3894 @@
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+NAME
+     lsof - list open files
+
+SYNOPSIS
+     lsof [ -?abChKlnNOPRtUvVX ] [ -A A ] [ -c c ] [  +c  c  ]  [
+     +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-f [cfgGn] ] [ -F [f] ] [
+     -g [s] ] [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m m ] [  +|-M
+     ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [ -s [p:s] ] [ -S
+     [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ]  [
+     -Z [Z] ] [ -- ] [names]
+
+DESCRIPTION
+     Lsof revision 4.85 lists on its standard output file  infor-
+     mation  about  files  opened  by processes for the following
+     UNIX dialects:
+
+          AIX 5.3
+          Apple Darwin 9 and Mac OS X 10.[56]
+          FreeBSD 4.9 and 6.4 for x86-based systems
+          FreeBSD 8.[02] and 9.0 for AMD64-based systems
+          Linux 2.1.72 and above for x86-based systems
+          Solaris 9, 10 and 11
+
+     (See the DISTRIBUTION section of this manual page for infor-
+     mation on how to obtain the latest lsof revision.)
+
+     An open file may be a regular file,  a  directory,  a  block
+     special  file,  a  character special file, an executing text
+     reference, a library, a stream or a network  file  (Internet
+     socket, NFS file or UNIX domain socket.)  A specific file or
+     all the files in a file system may be selected by path.
+
+     Instead of a formatted display,  lsof  will  produce  output
+     that  can  be  parsed by other programs.  See the -F, option
+     description, and the OUTPUT FOR OTHER PROGRAMS  section  for
+     more information.
+
+     In addition to producing a single output list, lsof will run
+     in  repeat  mode.   In  repeat  mode it will produce output,
+     delay, then repeat the output operation until  stopped  with
+     an  interrupt  or  quit  signal.   See  the +|-r [t[m<fmt>]]
+     option description for more information.
+
+OPTIONS
+     In the absence of any options, lsof  lists  all  open  files
+     belonging to all active processes.
+
+     If any list request option is specified, other list requests
+     must  be  specifically  requested - e.g., if -U is specified
+     for the listing of UNIX socket files,  NFS  files  won't  be
+     listed  unless  -N  is  also specified; or if a user list is
+     specified with the -u  option,  UNIX  domain  socket  files,
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   1
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     belonging  to  users not in the list, won't be listed unless
+     the -U option is also specified.
+
+     Normally list options that are specifically stated are  ORed
+     -  i.e., specifying the -i option without an address and the
+     -ufoo option produces a listing  of  all  network  files  OR
+     files  belonging  to  processes  owned by user ``foo''.  The
+     exceptions are:
+
+     1) the `^' (negated) login name or user ID (UID),  specified
+        with the -u option;
+
+     2) the `^' (negated) process ID (PID), specified with the -p
+        option;
+
+     3) the `^' (negated) process group ID (PGID), specified with
+        the -g option;
+
+     4) the `^' (negated) command, specified with the -c option;
+
+     5) the (`^') negated TCP or UDP protocol state names, speci-
+        fied with the -s [p:s] option.
+
+     Since they represent exclusions, they  are  applied  without
+     ORing  or  ANDing and take effect before any other selection
+     criteria are applied.
+
+     The -a option may be used to AND the selections.  For  exam-
+     ple, specifying -a, -U, and -ufoo produces a listing of only
+     UNIX socket files that belong to  processes  owned  by  user
+     ``foo''.
+
+     Caution: the -a option causes all list selection options  to
+     be ANDed; it can't be used to cause ANDing of selected pairs
+     of selection options by placing it between them, even though
+     its  placement  there is acceptable.  Wherever -a is placed,
+     it causes the ANDing of all selection options.
+
+     Items of the  same  selection  set  -  command  names,  file
+     descriptors,  network  addresses,  process identifiers, user
+     identifiers, zone names, security contexts - are joined in a
+     single  ORed  set and applied before the result participates
+     in  ANDing.   Thus,  for  example,  specifying   -i@aaa.bbb,
+     -i@ccc.ddd,  -a,  and  -ufff,ggg  will select the listing of
+     files that belong to either login  ``fff''  OR  ``ggg''  AND
+     have network connections to either host aaa.bbb OR ccc.ddd.
+
+     Options may be grouped together following a single prefix --
+     e.g.,  the  option  set  ``-a -b -C'' may be stated as -abC.
+     However, since values are optional following +|-f,  -F,  -g,
+     -i, +|-L, -o, +|-r, -s, -S, -T, -x and -z.  when you have no
+     values for them be  careful  that  the  following  character
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   2
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     isn't  ambiguous.   For  example, -Fn might represent the -F
+     and -n options, or it might represent the n field identifier
+     character following the -F option.  When ambiguity is possi-
+     ble, start a new option with a `-' character  -  e.g.,  ``-F
+     -n''.   If the next option is a file name, follow the possi-
+     bly ambiguous option with ``--'' - e.g., ``-F -- name''.
+
+     Either the `+' or the `-' prefix may be applied to  a  group
+     of  options.   Options  that don't take on separate meanings
+     for each prefix - e.g., -i - may  be  grouped  under  either
+     prefix.   Thus,  for  example,  ``+M  -i''  may be stated as
+     ``+Mi'' and  the  group  means  the  same  as  the  separate
+     options.   Be  careful  of  prefix grouping when one or more
+     options in the group does take on  separate  meanings  under
+     different  prefixes  -  e.g.,  +|-M; ``-iM'' is not the same
+     request as ``-i +M''.  When in doubt, use  separate  options
+     with appropriate prefixes.
+
+     -? -h    These two equivalent options select a usage  (help)
+              output  list.   Lsof  displays  a shortened form of
+              this output when it detects an error in the options
+              supplied  to  it,  after  it has displayed messages
+              explaining each error.  (Escape the  `?'  character
+              as your shell requires.)
+
+     -a       causes list  selection  options  to  be  ANDed,  as
+              described above.
+
+     -A A     is available on systems configured  for  AFS  whose
+              AFS kernel code is implemented via dynamic modules.
+              It allows the lsof user to specify A as  an  alter-
+              nate  name  list file where the kernel addresses of
+              the dynamic modules might be found.  See  the  lsof
+              FAQ (The FAQ section gives its location.)  for more
+              information about dynamic modules,  their  symbols,
+              and how they affect lsof.
+
+     -b       causes lsof to avoid kernel  functions  that  might
+              block - lstat(2), readlink(2), and stat(2).
+
+              See the BLOCKS AND  TIMEOUTS  and  AVOIDING  KERNEL
+              BLOCKS  sections  for  information  on  using  this
+              option.
+
+     -c c     selects the listing of files for processes  execut-
+              ing  the command that begins with the characters of
+              c.  Multiple commands may be specified, using  mul-
+              tiple -c options.  They are joined in a single ORed
+              set before participating in AND option selection.
+
+              If c begins with a `^', then the following  charac-
+              ters  specify a command name whose processes are to
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   3
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              be ignored (excluded.)
+
+              If c begins and ends with a slash ('/'), the  char-
+              acters  between  the  slashes  are interpreted as a
+              regular expression.  Shell meta-characters  in  the
+              regular  expression must be quoted to prevent their
+              interpretation by the shell.  The closing slash may
+              be followed by these modifiers:
+
+
+                   b    the regular expression is a basic one.
+                   i    ignore the case of letters.
+                   x    the regular expression is an extended one
+                        (default).
+
+              See the lsof FAQ (The FAQ section gives  its  loca-
+              tion.)   for more information on basic and extended
+              regular expressions.
+
+              The simple command specification is  tested  first.
+              If  that test fails, the command regular expression
+              is applied.  If the simple command  test  succeeds,
+              the  command  regular  expression  test isn't made.
+              This may result in ``no command found for  regex:''
+              messages when lsof's -V option is specified.
+
+     +c w     defines the maximum number of initial characters of
+              the name, supplied by the UNIX dialect, of the UNIX
+              command associated with a process to be printed  in
+              the COMMAND column.  (The lsof default is nine.)
+
+              Note that many UNIX dialects do not supply all com-
+              mand  name  characters  to  lsof  in  the files and
+              structures from which lsof  obtains  command  name.
+              Often  dialects limit the number of characters sup-
+              plied in those sources.  For example, Linux  2.4.27
+              and  Solaris 9 both limit command name length to 16
+              characters.
+
+              If w is zero ('0'), all command characters supplied
+              to lsof by the UNIX dialect will be printed.
+
+              If w is less than the length of the  column  title,
+              ``COMMAND'', it will be raised to that length.
+
+     -C       disables the reporting of any path name  components
+              from  the kernel's name cache.  See the KERNEL NAME
+              CACHE section for more information.
+
+     +d s     causes lsof to search for  all  open  instances  of
+              directory  s  and the files and directories it con-
+              tains at its top level.  +d does  NOT  descend  the
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   4
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              directory  tree,  rooted at s.  The +D D option may
+              be used to request a  full-descent  directory  tree
+              search, rooted at directory D.
+
+              Processing of the +d option does  not  follow  sym-
+              bolic  links within s unless the -x or -x  l option
+              is also specified.  Nor does  it  search  for  open
+              files on file system mount points on subdirectories
+              of s unless the -x or -x  f option is  also  speci-
+              fied.
+
+              Note: the authority of the user of this option lim-
+              its  it  to  searching  for files that the user has
+              permission to examine with the system stat(2) func-
+              tion.
+
+     -d s     specifies a  list  of  file  descriptors  (FDs)  to
+              exclude from or include in the output listing.  The
+              file   descriptors    are    specified    in    the
+              comma-separated   set   s   -   e.g.,  ``cwd,1,3'',
+              ``^6,^2''.  (There should be no spaces in the set.)
+
+              The list is an exclusion list if all entries of the
+              set  begin with `^'.  It is an inclusion list if no
+              entry begins with `^'.  Mixed lists are not permit-
+              ted.
+
+              A file descriptor number range may be in the set as
+              long  as  neither member is empty, both members are
+              numbers, and the ending member is larger  than  the
+              starting  one  - e.g., ``0-7'' or ``3-10''.  Ranges
+              may be specified for exclusion if they have the `^'
+              prefix  - e.g., ``^0-7'' excludes all file descrip-
+              tors 0 through 7.
+
+              Multiple file descriptor numbers are  joined  in  a
+              single  ORed set before participating in AND option
+              selection.
+
+              When there are exclusion and inclusion  members  in
+              the set, lsof reports them as errors and exits with
+              a non-zero return code.
+
+              See the description of File Descriptor (FD)  output
+              values  in  the OUTPUT section for more information
+              on file descriptor names.
+
+     +D D     causes lsof to search for  all  open  instances  of
+              directory  D  and  all the files and directories it
+              contains to its complete depth.
+
+              Processing  of  the  +D  option  does  not   follow
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   5
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              symbolic  links  within  D  unless  the -x or -x  l
+              option is also specified.  Nor does it  search  for
+              open files on file system mount points on subdirec-
+              tories of D unless the -x or -x  f option  is  also
+              specified.
+
+              Note: the authority of the user of this option lim-
+              its  it  to  searching  for files that the user has
+              permission to examine with the system stat(2) func-
+              tion.
+
+              Further note:  lsof may process this option  slowly
+              and  require a large amount of dynamic memory to do
+              it.  This is because it  must  descend  the  entire
+              directory  tree,  rooted  at D, calling stat(2) for
+              each file and directory, building a list of all the
+              files it finds, and searching that list for a match
+              with every open file.  When directory D  is  large,
+              these  steps  can  take  a  long  time, so use this
+              option prudently.
+
+     -D D     directs lsof's use of the device cache  file.   The
+              use  of  this  option is sometimes restricted.  See
+              the DEVICE CACHE FILE section and the sections that
+              follow it for more information on this option.
+
+              -D must be followed by a function letter; the func-
+              tion  letter  may  optionally be followed by a path
+              name.  Lsof recognizes these function letters:
+
+
+                   ? - report device cache file paths
+                   b - build the device cache file
+                   i - ignore the device cache file
+                   r - read the device cache file
+                   u - read and update the device cache file
+
+              The b, r, and u functions, accompanied  by  a  path
+              name,  are  sometimes restricted.  When these func-
+              tions are restricted, they will not appear  in  the
+              description of the -D option that accompanies -h or
+              -? option output.  See the DEVICE CACHE  FILE  sec-
+              tion  and  the  sections  that  follow  it for more
+              information on these  functions  and  when  they're
+              restricted.
+
+              The ? function  reports  the  read-only  and  write
+              paths  that lsof can use for the device cache file,
+              the names of any environment variables whose values
+              lsof  will  examine  when  forming the device cache
+              file path, and the format for the  personal  device
+              cache file path.  (Escape the `?' character as your
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   6
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              shell requires.)
+
+              When available, the b, r, and u  functions  may  be
+              followed  by  the  device  cache  file's path.  The
+              standard default  is  .lsof_hostname  in  the  home
+              directory  of  the real user ID that executes lsof,
+              but this could have been changed when lsof was con-
+              figured and compiled.  (The output of the -h and -?
+              options show the current  default  prefix  -  e.g.,
+              ``.lsof''.)   The  suffix,  hostname,  is the first
+              component of the host's name returned  by  gethost-
+              name(2).
+
+              When available, the  b  function  directs  lsof  to
+              build  a  new  device  cache file at the default or
+              specified path.
+
+              The i function directs lsof to ignore  the  default
+              device  cache file and obtain its information about
+              devices via direct calls to the kernel.
+
+              The r function directs  lsof  to  read  the  device
+              cache   at  the  default  or  specified  path,  but
+              prevents it from creating a new device  cache  file
+              when  none exists or the existing one is improperly
+              structured.  The r function, when specified without
+              a   path  name,  prevents  lsof  from  updating  an
+              incorrect or outdated device cache file, or  creat-
+              ing  a  new  one  in  its place.  The r function is
+              always available when it  is  specified  without  a
+              path  name  argument;  it  may be restricted by the
+              permissions of the lsof process.
+
+              When available, the u function directs lsof to read
+              the  device  cache file at the default or specified
+              path, if possible, and to rebuild it, if necessary.
+              This is the default device cache file function when
+              no -D option has been specified.
+
+     +|-e s   exempts the file system whose path name is  s  from
+              being subjected to kernel function calls that might
+              block.  The +e option exempts stat(2), lstat(2) and
+              most  readlink(2)  kernel  function  calls.  The -e
+              option exempts only  stat(2)  and  lstat(2)  kernel
+              function  calls.   Multiple  file  systems  may  be
+              specified with  separate  +|-e  specifications  and
+              each may have readlink(2) calls exempted or not.
+
+              This  option  is  currently  implemented  only  for
+              Linux.
+
+              CAUTION: this option can easily be  mis-applied  to
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   7
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              other  than the file system of interest, because it
+              uses path name rather than the more reliable device
+              and  inode  numbers.  (Device and inode numbers are
+              acquired via the potentially blocking stat(2)  ker-
+              nel  call  and  are thus not available, but see the
+              +|-m m option as a possible alternative way to sup-
+              ply  device  numbers.)   Use this option with great
+              care and fully specify the path name  of  the  file
+              system to be exempted.
+
+              When  open  files  on  exempted  file  systems  are
+              reported,  it  may  not  be  possible to obtain all
+              their  information.   Therefore,  some  information
+              columns will be blank, the characters ``UNKN'' pre-
+              face the values in the TYPE column, and the  appli-
+              cable  exemption  option is added in parentheses to
+              the end of the NAME column.   (Some  device  number
+              information  might be made available via the +|-m m
+              option.)
+
+     +|-f [cfgGn]
+              f by itself clarifies how path name  arguments  are
+              to be interpreted.  When followed by c, f, g, G, or
+              n in any combination it specifies that the  listing
+              of  kernel  file  structure  information  is  to be
+              enabled (`+') or inhibited (`-').
+
+              Normally a path name argument is taken to be a file
+              system  name  if  it matches a mounted-on directory
+              name reported by mount(8), or if  it  represents  a
+              block device, named in the mount output and associ-
+              ated with a mounted directory  name.   When  +f  is
+              specified, all path name arguments will be taken to
+              be file system names, and lsof will complain if any
+              are not.  This can be useful, for example, when the
+              file system name (mounted-on device) isn't a  block
+              device.  This happens for some CD-ROM file systems.
+
+              When -f is specified by itself, all path name argu-
+              ments  will be taken to be simple files.  Thus, for
+              example, the ``-f -- /'' arguments direct  lsof  to
+              search for open files with a `/' path name, not all
+              open files in the `/' (root) file system.
+
+              Be careful to make sure +f and -f are properly ter-
+              minated  and  aren't followed by a character (e.g.,
+              of the file or file  system  name)  that  might  be
+              taken  as  a  parameter.   For  example, use ``--''
+              after +f and -f as in these examples.
+
+
+                   $ lsof +f -- /file/system/name
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   8
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                   $ lsof -f -- /file/name
+
+              The listing of information from kernel file  struc-
+              tures,  requested  with the +f [cfgGn] option form,
+              is normally inhibited,  and  is  not  available  in
+              whole or part for some dialects - e.g., /proc-based
+              Linux kernels below 2.6.22.  When the prefix  to  f
+              is a plus sign (`+'), these characters request file
+              structure information:
+
+
+                   c    file structure use count (not Linux)
+                   f    file structure address (not Linux)
+                   g    file flag abbreviations (Linux 2.6.22 and up)
+                   G    file flags in hexadecimal (Linux 2.6.22 and up)
+                   n    file structure node address (not Linux)
+
+              When the prefix is minus (`-') the same  characters
+              disable the listing of the indicated values.
+
+              File structure addresses, use  counts,  flags,  and
+              node  addresses  may be used to detect more readily
+              identical files inherited by  child  processes  and
+              identical  files  in  use  by  different processes.
+              Lsof column output can be sorted by output  columns
+              holding the values and listed to identify identical
+              file use, or lsof field output can be parsed by  an
+              AWK or Perl post-filter script, or by a C program.
+
+     -F f     specifies a character list,  f,  that  selects  the
+              fields  to be output for processing by another pro-
+              gram, and the character that terminates each output
+              field.  Each field to be output is specified with a
+              single  character  in  f.   The  field   terminator
+              defaults  to  NL,  but may be changed to NUL (000).
+              See the OUTPUT FOR OTHER  PROGRAMS  section  for  a
+              description  of the field identification characters
+              and the field output process.
+
+              When the field selection character list  is  empty,
+              all  standard  fields  are selected (except the raw
+              device field, security context and zone  field  for
+              compatibility  reasons) and the NL field terminator
+              is used.
+
+              When the field selection  character  list  contains
+              only  a zero (`0'), all fields are selected (except
+              the raw device field for compatibility reasons) and
+              the NUL terminator character is used.
+
+              Other combinations of fields and  their  associated
+              field   terminator   character  must  be  set  with
+
+
+
+SunOS 5.9          Last change: Revision-4.85                   9
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              explicit entries in f, as described in  the  OUTPUT
+              FOR OTHER PROGRAMS section.
+
+              When a field selection character identifies an item
+              lsof  does not normally list - e.g., PPID, selected
+              with -R - specification of the  field  character  -
+              e.g.,  ``-FR''  -  also  selects the listing of the
+              item.
+
+              When the field selection  character  list  contains
+              the  single character `?', lsof will display a help
+              list  of  the  field   identification   characters.
+              (Escape the `?' character as your shell requires.)
+
+     -g [s]   excludes or selects the listing of  files  for  the
+              processes  whose optional process group IDentifica-
+              tion (PGID) numbers are in the comma-separated  set
+              s  -  e.g., ``123'' or ``123,^456''.  (There should
+              be no spaces in the set.)
+
+              PGID  numbers  that  begin  with   `^'   (negation)
+              represent exclusions.
+
+              Multiple PGID numbers are joined in a  single  ORed
+              set  before  participating in AND option selection.
+              However, PGID exclusions are applied without  ORing
+              or  ANDing  and  take effect before other selection
+              criteria are applied.
+
+              The -g option also enables the  output  display  of
+              PGID  numbers.   When  specified without a PGID set
+              that's all it does.
+
+     -i [i]   selects the listing of files any of whose  Internet
+              address  matches the address specified in i.  If no
+              address is specified, this option selects the list-
+              ing of all Internet and x.25 (HP-UX) network files.
+
+              If -i4  or  -i6  is  specified  with  no  following
+              address,  only  files  of the indicated IP version,
+              IPv4 or IPv6, are displayed.  (An  IPv6  specifica-
+              tion  may  be  used  only  if the dialects supports
+              IPv6, as indicated by ``[46]'' and  ``IPv[46]''  in
+              lsof's  -h  or -? output.)  Sequentially specifying
+              -i4, followed by -i6 is the same as specifying  -i,
+              and vice-versa.  Specifying -i4, or -i6 after -i is
+              the same as specifying -i4 or -i6 by itself.
+
+              Multiple addresses (up to a limit of  100)  may  be
+              specified with multiple -i options.  (A port number
+              or service name range is counted as  one  address.)
+              They  are  joined  in  a  single  ORed  set  before
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  10
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              participating in AND option selection.
+
+              An Internet address is specified in the form (Items
+              in square brackets are optional.):
+
+              [46][protocol][@hostname|hostaddr][:service|port]
+
+              where:
+                   46 specifies the IP version, IPv4 or IPv6
+                        that applies to the following address.
+                        '6' may be be specified only if the UNIX
+                        dialect supports IPv6.  If neither '4' nor
+                        '6' is specified, the following address
+                        applies to all IP versions.
+                   protocol is a protocol name - TCP, UDP
+                   hostname is an Internet host name.  Unless a
+                        specific IP version is specified, open
+                        network files associated with host names
+                        of all versions will be selected.
+                   hostaddr is a numeric Internet IPv4 address in
+                        dot form; or an IPv6 numeric address in
+                        colon form, enclosed in brackets, if the
+                        UNIX dialect supports IPv6.  When an IP
+                        version is selected, only its numeric
+                        addresses may be specified.
+                   service is an /etc/services name - e.g., smtp -
+                        or a list of them.
+                   port is a port number, or a list of them.
+
+              IPv6 options may be used only if the  UNIX  dialect
+              supports  IPv6.   To  see  if  the dialect supports
+              IPv6, run lsof and specify  the  -h  or  -?  (help)
+              option.   If  the  displayed  description of the -i
+              option contains ``[46]'' and ``IPv[46]'',  IPv6  is
+              supported.
+
+              IPv4 host names and addresses may not be  specified
+              if  network  file selection is limited to IPv6 with
+              -i 6.  IPv6 host names and  addresses  may  not  be
+              specified  if  network file selection is limited to
+              IPv4 with -i 4.  When an open IPv4  network  file's
+              address  is  mapped  in  an  IPv6 address, the open
+              file's type will be IPv6, not IPv4, and its display
+              will be selected by '6', not '4'.
+
+              At least one address component -  4,  6,  protocol,
+              hostname,  hostaddr, or service - must be supplied.
+              The `@' character, leading the host  specification,
+              is always required; as is the `:', leading the port
+              specification.  Specify  either  hostname  or  hos-
+              taddr.   Specify  either  service name list or port
+              number list.  If a service name list is  specified,
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  11
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              the  protocol  may also need to be specified if the
+              TCP, UDP and UDPLITE port numbers for  the  service
+              name  are different.  Use any case - lower or upper
+              - for protocol.
+
+              Service names and port numbers may be combined in a
+              list  whose  entries  are  separated  by commas and
+              whose numeric range entries are separated by  minus
+              signs.   There  may  be no embedded spaces, and all
+              service names must belong to the  specified  proto-
+              col.   Since  service  names  may  contain embedded
+              minus signs, the starting entry of a range can't be
+              a service name; it can be a port number, however.
+
+              Here are some sample addresses:
+
+                   -i6 - IPv6 only
+                   TCP:25 - TCP and port 25
+                   @1.2.3.4 - Internet IPv4 host address 1.2.3.4
+                   @[3ffe:1ebc::1]:1234 - Internet IPv6 host address
+                        3ffe:1ebc::1, port 1234
+                   UDP:who - UDP who service port
+                   TCP@lsof.itap:513 - TCP, port 513 and host name lsof.itap
+                   tcp@foo:1-10,smtp,99 - TCP, ports 1 through 10,
+                        service name smtp, port 99, host name foo
+                   tcp@bar:1-smtp - TCP, ports 1 through smtp, host bar
+                   :time - either TCP, UDP or UDPLITE time service port
+
+     -K       selects the  listing  of  tasks  of  processes,  on
+              dialects  where  task  reporting is supported.  (If
+              help output - i.e., the output  of  the  -h  or  -?
+              options - shows this option, then task reporting is
+              supported by the dialect.)
+
+              When -K and -a are both specified and the tasks  of
+              a  main  process are selected by other options, the
+              main process will also be listed as though it  were
+              a  task,  but without a task ID.  (See the descrip-
+              tion of the TID column in the OUTPUT section.)
+
+     -k k     specifies a kernel name list file, k, in  place  of
+              /vmunix, /mach, etc.  -k is not available under AIX
+              on the IBM RISC/System 6000.
+
+     -l       inhibits the conversion of user ID numbers to login
+              names.  It is also useful when login name lookup is
+              working improperly or slowly.
+
+     +|-L [l] enables (`+') or disables (`-') the listing of file
+              link  counts, where they are available - e.g., they
+              aren't available for sockets,  or  most  FIFOs  and
+              pipes.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  12
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              When +L is specified without  a  following  number,
+              all  link counts will be listed.  When -L is speci-
+              fied (the default), no link counts will be listed.
+
+              When +L is followed by a number, only files  having
+              a  link count less than that number will be listed.
+              (No number may follow -L.)  A specification of  the
+              form  ``+L1'' will select open files that have been
+              unlinked.    A   specification    of    the    form
+              ``+aL1 <file_system>''  will  select  unlinked open
+              files on the specified file system.
+
+              For other link count comparisons, use field  output
+              (-F) and a post-processing script or program.
+
+     +|-m m   specifies  an  alternate  kernel  memory  file   or
+              activates mount table supplement processing.
+
+              The option form -m  m  specifies  a  kernel  memory
+              file,  m, in place of /dev/kmem or /dev/mem - e.g.,
+              a crash dump file.
+
+              The option form +m requests that a mount supplement
+              file  be  written to the standard output file.  All
+              other options are silently ignored.
+
+              There will be a line in the mount  supplement  file
+              for   each  mounted  file  system,  containing  the
+              mounted file system directory, followed by a single
+              space, followed by the device number in hexadecimal
+              "0x" format - e.g.,
+
+
+                   / 0x801
+
+              Lsof can use the mount supplement file to get  dev-
+              ice numbers for file systems when it can't get them
+              via stat(2) or lstat(2).
+
+              The option form +m m identifies m as a  mount  sup-
+              plement file.
+
+              Note: the +m and +m m options are not available for
+              all supported dialects.  Check the output of lsof's
+              -h or -? options to see if the +m and +m m  options
+              are available.
+
+     +|-M     Enables (+) or disables (-) the reporting of  port-
+              mapper registrations for local TCP, UDP and UDPLITE
+              ports, where port mapping is supported.   (See  the
+              last  paragraph  of  this  option  description  for
+              information  about  where  portmapper  registration
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  13
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              reporting is suported.)
+
+              The default reporting  mode  is  set  by  the  lsof
+              builder  with  the  HASPMAPENABLED  #define  in the
+              dialect's machine.h header file;  lsof  is  distri-
+              buted  with the HASPMAPENABLED #define deactivated,
+              so portmapper reporting is disabled by default  and
+              must be requested with +M.  Specifying lsof's -h or
+              -? option will report the default mode.   Disabling
+              portmapper registration when it is already disabled
+              or enabling it when already enabled is  acceptable.
+              When  portmapper registration reporting is enabled,
+              lsof displays the portmapper registration (if  any)
+              for  local  TCP,  UDP  or  UDPLITE  ports in square
+              brackets immediately following the port numbers  or
+              service    names   -   e.g.,   ``:1234[name]''   or
+              ``:name[100083]''.   The  registration  information
+              may  be  a  name  or  number, depending on what the
+              registering program supplied to the portmapper when
+              it registered the port.
+
+              When portmapper registration reporting is  enabled,
+              lsof  may  run  a little more slowly or even become
+              blocked when access to the portmapper becomes cong-
+              ested  or  stopped.   Reverse the reporting mode to
+              determine if portmapper registration  reporting  is
+              slowing or blocking lsof.
+
+              For purposes of portmapper  registration  reporting
+              lsof considers a TCP, UDP or UDPLITE port local if:
+              it is found in the local  part  of  its  containing
+              kernel  structure;  or  if  it  is  located  in the
+              foreign part of its containing kernel structure and
+              the  local  and  foreign Internet addresses are the
+              same; or if it is located in the  foreign  part  of
+              its  containing  kernel  structure  and the foreign
+              Internet address  is  INADDR_LOOPBACK  (127.0.0.1).
+              This  rule  may make lsof ignore some foreign ports
+              on  machines  with  multiple  interfaces  when  the
+              foreign  Internet  address is on a different inter-
+              face from the local one.
+
+              See the lsof FAQ (The FAQ section gives  its  loca-
+              tion.)  for further discussion of portmapper regis-
+              tration reporting issues.
+
+              Portmapper registration reporting is supported only
+              on  dialects  that  have  RPC  header files.  (Some
+              Linux distributions with GlibC  2.14  do  not  have
+              them.)   When  portmapper registration reporting is
+              supported, the -h or -? help output will  show  the
+              +|-M option.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  14
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     -n       inhibits the conversion of network numbers to  host
+              names for network files.  Inhibiting conversion may
+              make lsof run faster.  It is also useful when  host
+              name lookup is not working properly.
+
+     -N       selects the listing of NFS files.
+
+     -o       directs lsof to display file offset at  all  times.
+              It  causes  the  SIZE/OFF output column title to be
+              changed to OFFSET.  Note:  on  some  UNIX  dialects
+              lsof  can't  obtain  accurate  or  consistent  file
+              offset information from its  kernel  data  sources,
+              sometimes just for particular kinds of files (e.g.,
+              socket files.)  Consult the lsof FAQ (The FAQ  sec-
+              tion gives its location.)  for more information.
+
+              The -o and -s options are mutually exclusive;  they
+              can't  both  be  specified.  When neither is speci-
+              fied, lsof displays whatever value - size or offset
+              -  is appropriate and available for the type of the
+              file.
+
+     -o o     defines the number of  decimal  digits  (o)  to  be
+              printed  after  the ``0t'' for a file offset before
+              the form is switched to ``0x...''.  An o  value  of
+              zero  (unlimited)  directs  lsof  to use the ``0t''
+              form for all offset output.
+
+              This option does NOT direct lsof to display  offset
+              at  all  times;  specify  -o  (without  a  trailing
+              number) to do that.  -o o only specifies the number
+              of  digits  after  ``0t''  in either mixed size and
+              offset or offset-only output.  Thus,  for  example,
+              to  direct lsof to display offset at all times with
+              a decimal digit count of 10, use:
+
+
+                   -o -o 10
+              or
+                   -oo10
+
+              The default number of digits allowed  after  ``0t''
+              is  normally  8,  but  may have been changed by the
+              lsof builder.  Consult the description of the -o  o
+              option  in  the  output  of  the -h or -? option to
+              determine the default that is in effect.
+
+     -O       directs lsof to bypass  the  strategy  it  uses  to
+              avoid  being  blocked  by  some kernel operations -
+              i.e., doing them in forked  child  processes.   See
+              the  BLOCKS AND TIMEOUTS and AVOIDING KERNEL BLOCKS
+              sections for more information on kernel  operations
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  15
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              that may block lsof.
+
+              While use of this option will reduce  lsof  startup
+              overhead,  it  may also cause lsof to hang when the
+              kernel doesn't respond to  a  function.   Use  this
+              option cautiously.
+
+     -p s     excludes or selects the listing of  files  for  the
+              processes  whose  optional  process  IDentification
+              (PID) numbers are in the comma-separated  set  s  -
+              e.g., ``123'' or ``123,^456''.  (There should be no
+              spaces in the set.)
+
+              PID  numbers  that  begin   with   `^'   (negation)
+              represent exclusions.
+
+              Multiple process ID numbers are joined in a  single
+              ORed  set before participating in AND option selec-
+              tion.  However, PID exclusions are applied  without
+              ORing or ANDing and take effect before other selec-
+              tion criteria are applied.
+
+     -P       inhibits the conversion of  port  numbers  to  port
+              names for network files.  Inhibiting the conversion
+              may make lsof run a little faster.  It is also use-
+              ful when port name lookup is not working properly.
+
+     +|-r [t[m<fmt>]]
+              puts lsof in repeat mode.  There  lsof  lists  open
+              files  as  selected  by  other  options,  delays  t
+              seconds (default fifteen), then repeats  the  list-
+              ing,   delaying   and  listing  repetitively  until
+              stopped by a condition defined by the prefix to the
+              option.
+
+              If the prefix is a `-',  repeat  mode  is  endless.
+              Lsof  must  be terminated with an interrupt or quit
+              signal.
+
+              If the prefix is `+',  repeat  mode  will  end  the
+              first  cycle  no  open  files  are  listed - and of
+              course when lsof is stopped with  an  interrupt  or
+              quit  signal.   When  repeat  mode  ends because no
+              files are listed, the process  exit  code  will  be
+              zero  if  any  open files were ever listed; one, if
+              none were ever listed.
+
+              Lsof marks the end of each listing:  if field  out-
+              put  is in progress (the -F, option has been speci-
+              fied), the default marker  is  `m';  otherwise  the
+              default marker is ``========''.  The marker is fol-
+              lowed by a NL character.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  16
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              The optional "m<fmt>" argument specifies  a  format
+              for  the marker line.  The <fmt> characters follow-
+              ing `m' are interpreted as a  format  specification
+              to  the  strftime(3) function, when both it and the
+              localtime(3)  function   are   available   in   the
+              dialect's C library.  Consult the strftime(3) docu-
+              mentation for what may appear in its format specif-
+              ication.   Note that when field output is requested
+              with the -F option, <fmt>  cannot  contain  the  NL
+              format, ``%n''.  Note also that when <fmt> contains
+              spaces or other characters that affect the  shell's
+              interpretation  of  arguments, <fmt> must be quoted
+              appropriately.
+
+              Repeat mode reduces lsof startup overhead, so it is
+              more  efficient  to use this mode than to call lsof
+              repetitively from a shell script, for example.
+
+              To use repeat mode most efficiently, accompany +|-r
+              with specification of other lsof selection options,
+              so the amount of kernel  memory  access  lsof  does
+              will  be kept to a minimum.  Options that filter at
+              the process level - e.g., -c, -g, -p, -u - are  the
+              most efficient selectors.
+
+              Repeat mode is useful when coupled with field  out-
+              put   (see   the  -F,  option  description)  and  a
+              supervising awk or Perl script, or a C program.
+
+     -R       directs lsof to list the Parent Process IDentifica-
+              tion number in the PPID column.
+
+     -s [p:s] s alone directs lsof to display file  size  at  all
+              times.   It causes the SIZE/OFF output column title
+              to be changed to SIZE.  If the file does not have a
+              size, nothing is displayed.
+
+              When followed by a protocol name (p), either TCP or
+              UDP,  a  colon (`:') and a comma-separated protocol
+              state name list, the option causes open TCP and UDP
+              files  to be excluded if their state name(s) are in
+              the list (s) preceded by  a  `^';  or  included  if
+              their name(s) are not preceded by a `^'.
+
+              When an inclusion list  is  defined,  only  network
+              files  with state names in the list will be present
+              in the lsof output.   Thus,  specifying  one  state
+              name  means  that only network files with that lone
+              state name will be listed.
+
+              Case is unimportant in the protocol or state names,
+              but  there  may  be  no  spaces and the colon (`:')
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  17
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              separating the protocol name (p) and the state name
+              list (s) is required.
+
+              If only TCP and UDP files are to be listed, as con-
+              trolled by the specified exclusions and inclusions,
+              the -i option must be specified, too.   If  only  a
+              single  protocol's  files are to be listed, add its
+              name as an argument to the -i option.
+
+              For example, to list only network  files  with  TCP
+              state LISTEN, use:
+
+
+                   -iTCP -sTCP:LISTEN
+
+              Or, for example, to list network files with all UDP
+              states except Idle, use:
+
+
+                   -iUDP -sUDP:Idle
+
+              State names vary with UNIX dialects,  so  it's  not
+              possible  to  provide a complete list.  Some common
+              TCP state names are:  CLOSED, IDLE, BOUND,  LISTEN,
+              ESTABLISHED,   SYN_SENT,   SYN_RCDV,   ESTABLISHED,
+              CLOSE_WAIT,    FIN_WAIT1,    CLOSING,     LAST_ACK,
+              FIN_WAIT_2,  and  TIME_WAIT.   Two common UDP state
+              names are Unbound and Idle.
+
+              See the lsof FAQ (The FAQ section gives  its  loca-
+              tion.)  for more information on how to use protocol
+              state exclusion and inclusion, including examples.
+
+              The -o (without a following  decimal  digit  count)
+              and  -s  option  (without  a following protocol and
+              state name list) are mutually exclusive; they can't
+              both be specified.  When neither is specified, lsof
+              displays whatever value  -  size  or  offset  -  is
+              appropriate and available for the type of file.
+
+              Since some types of files don't have true  sizes  -
+              sockets,  FIFOs,  pipes,  etc.  - lsof displays for
+              their sizes the content amounts in their associated
+              kernel buffers, if possible.
+
+     -S [t]   specifies an optional time-out  seconds  value  for
+              kernel   functions  -  lstat(2),  readlink(2),  and
+              stat(2)  -  that  might  otherwise  deadlock.   The
+              minimum for t is two; the default, fifteen; when no
+              value is specified, the default is used.
+
+              See  the  BLOCKS  AND  TIMEOUTS  section  for  more
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  18
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              information.
+
+     -T [t]   controls the reporting of some TCP/TPI information,
+              also  reported by netstat(1), following the network
+              addresses.   In  normal  output   the   information
+              appears in parentheses, each item except TCP or TPI
+              state name identified by  a  keyword,  followed  by
+              `=', separated from others by a single space:
+
+
+                   <TCP or TPI state name>
+                   QR=<read queue length>
+                   QS=<send queue length>
+                   SO=<socket options and values>
+                   SS=<socket states>
+                   TF=<TCP flags and values>
+                   WR=<window read length>
+                   WW=<window write length>
+
+              Not all values are reported for all UNIX  dialects.
+              Items  values  (when  available) are reported after
+              the item name and '='.
+
+              When the field output mode is in effect (See OUTPUT
+              FOR  OTHER PROGRAMS.)  each item appears as a field
+              with a `T' leading character.
+
+              -T  with  no  following  key  characters   disables
+              TCP/TPI information reporting.
+
+              -T with following characters selects the  reporting
+              of specific TCP/TPI information:
+
+
+                   f    selects reporting of socket options,
+                        states and values, and TCP flags and
+                        values.
+                   q    selects queue length reporting.
+                   s    selects connection state reporting.
+                   w    selects window size reporting.
+
+              Not  all  selections  are  enabled  for  some  UNIX
+              dialects.   State  may be selected for all dialects
+              and is reported by default.  The -h or -? help out-
+              put for the -T option will show what selections may
+              be used with the UNIX dialect.
+
+              When -T is used to select information - i.e., it is
+              followed  by one or more selection characters - the
+              displaying of state is disabled by default, and  it
+              must be explicitly selected again in the characters
+              following -T.  (In effect,  then,  the  default  is
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  19
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              equivalent  to -Ts.)  For example, if queue lengths
+              and state are desired, use -Tqs.
+
+              Socket options, socket states, some socket  values,
+              TCP  flags  and one TCP value may be reported (when
+              available in the UNIX dialect) in the form  of  the
+              names  that  commonly  appear  after SO_, so_, SS_,
+              TCP_  and TF_ in the dialect's header files -  most
+              often    <sys/socket.h>,    <sys/socketvar.h>   and
+              <netinet/tcp_var.h>.  Consult  those  header  files
+              for  the  meaning of the flags, options, states and
+              values.
+
+              ``SO=''  precedes  socket   options   and   values;
+              ``SS='',  socket states; and ``TF='', TCP flags and
+              values.
+
+              If a flag or option has a  value,  the  value  will
+              follow    an    '='   and   the   name   --   e.g.,
+              ``SO=LINGER=5'',   ``SO=QLIM=5'',   ``TF=MSS=512''.
+              The following seven values may be reported:
+
+
+                   Name
+                   Reported  Description (Common Symbol)
+
+                   KEEPALIVE keep alive time (SO_KEEPALIVE)
+                   LINGER    linger time (SO_LINGER)
+                   MSS       maximum segment size (TCP_MAXSEG)
+                   PQLEN     partial listen queue connections
+                   QLEN      established listen queue connections
+                   QLIM      established listen queue limit
+                   RCVBUF    receive buffer length (SO_RCVBUF)
+                   SNDBUF    send buffer length (SO_SNDBUF)
+
+              Details on what socket options and  values,  socket
+              states,  and  TCP flags and values may be displayed
+              for particular UNIX dialects may be  found  in  the
+              answer  to  the  ``Why  doesn't  lsof report socket
+              options, socket states, and TCP  flags  and  values
+              for my dialect?'' and ``Why doesn't lsof report the
+              partial  listen  queue  connection  count  for   my
+              dialect?''  questions in the lsof FAQ (The FAQ sec-
+              tion gives its location.)
+
+     -t       specifies that lsof  should  produce  terse  output
+              with process identifiers only and no header - e.g.,
+              so that the output may be  piped  to  kill(1).   -t
+              selects the -w option.
+
+     -u s     selects the listing of files  for  the  user  whose
+              login   names   or  user  ID  numbers  are  in  the
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  20
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              comma-separated  set  s   -   e.g.,   ``abe'',   or
+              ``548,root''.   (There  should  be no spaces in the
+              set.)
+
+              Multiple login names or user ID numbers are  joined
+              in  a  single  ORed set before participating in AND
+              option selection.
+
+              If a login name or user ID is preceded by a `^', it
+              becomes a negation - i.e., files of processes owned
+              by the login name or user ID will never be  listed.
+              A  negated  login name or user ID selection is nei-
+              ther ANDed nor ORed with other  selections;  it  is
+              applied  before all other selections and absolutely
+              excludes the listing of the files of  the  process.
+              For  example, to direct lsof to exclude the listing
+              of  files  belonging  to  root  processes,  specify
+              ``-u^root'' or ``-u^0''.
+
+     -U       selects the listing of UNIX domain socket files.
+
+     -v       selects the listing of  lsof  version  information,
+              including:  revision  number;  when the lsof binary
+              was constructed; who  constructed  the  binary  and
+              where;  the  name of the compiler used to construct
+              the lsof binary; the version number of the compiler
+              when  readily  available;  the  compiler and loader
+              flags used to construct the lsof binary; and system
+              information,  typically  the  output  of uname's -a
+              option.
+
+     -V       directs lsof to indicate the items it was asked  to
+              list  and  failed  to  find  -  command names, file
+              names, Internet addresses or  files,  login  names,
+              NFS files, PIDs, PGIDs, and UIDs.
+
+              When other options are ANDed to search options,  or
+              compile-time  options  restrict the listing of some
+              files, lsof may not report that it failed to find a
+              search  item  when  an ANDed option or compile-time
+              option prevents the listing of the open  file  con-
+              taining the located search item.
+
+              For example, ``lsof -V -iTCP@foobar -a -d 999'' may
+              not  report  a  failure  to  locate  open  files at
+              ``TCP@foobar'' and may not list any, if none have a
+              file descriptor number of 999.  A similar situation
+              arises when HASSECURITY and  HASNOSOCKSECURITY  are
+              defined  at compile time and they prevent the list-
+              ing of open files.
+
+     +|-w     Enables (+) or  disables  (-)  the  suppression  of
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  21
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              warning messages.
+
+              The lsof builder may choose to  have  warning  mes-
+              sages  disabled or enabled by default.  The default
+              warning message state is indicated in the output of
+              the  -h  or  -? option.  Disabling warning messages
+              when they are already  disabled  or  enabling  them
+              when already enabled is acceptable.
+
+              The -t option selects the -w option.
+
+     -x [fl]  may accompany the +d and +D options to direct their
+              processing to cross over symbolic links and|or file
+              system mount points encountered when  scanning  the
+              directory (+d) or directory tree (+D).
+
+              If -x is specified by itself  without  a  following
+              parameter,  cross-over  processing of both symbolic
+              links and file  system  mount  points  is  enabled.
+              Note that when -x is specified without a parameter,
+              the next argument must begin with '-' or '+'.
+
+              The optional  'f'  parameter  enables  file  system
+              mount  point  cross-over  processing; 'l', symbolic
+              link cross-over processing.
+
+              The -x option may not be supplied without also sup-
+              plying a +d or +D option.
+
+     -X       This is a dialect-specific option.
+
+         AIX:
+              This IBM AIX RISC/System 6000 option  requests  the
+              reporting  of executed text file and shared library
+              references.
+
+              WARNING:  because  this  option  uses  the   kernel
+              readx()  function,  its  use  on  a busy AIX system
+              might cause an application process to hang so  com-
+              pletely  that it can neither be killed nor stopped.
+              I have never seen this happen or had  a  report  of
+              its happening, but I think there is a remote possi-
+              bility it could happen.
+
+              By default use of readx() is disabled.  On  AIX  5L
+              and  above  lsof may need setuid-root permission to
+              perform the actions this option requests.
+
+              The lsof builder may specify that the -X option  be
+              restricted to processes whose real UID is root.  If
+              that has been done, the -X option will  not  appear
+              in  the -h or -? help output unless the real UID of
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  22
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              the lsof process is root.  The default lsof distri-
+              bution  allows any UID to specify -X, so by default
+              it will appear in the help output.
+
+              When AIX readx() use is disabled, lsof may  not  be
+              able  to report information for all text and loader
+              file references, but it may also avoid exacerbating
+              an  AIX kernel directory search kernel error, known
+              as the Stale Segment ID bug.
+
+              The readx() function, used by  lsof  or  any  other
+              program  to  access some sections of kernel virtual
+              memory, can trigger the Stale Segment ID  bug.   It
+              can  cause  the  kernel's  dir_search() function to
+              believe erroneously that part of an in-memory  copy
+              of   a  file  system  directory  has  been  zeroed.
+              Another application process,  distinct  from  lsof,
+              asking  the  kernel to search the directory - e.g.,
+              by using open(2) - can cause dir_search()  to  loop
+              forever, thus hanging the application process.
+
+              Consult the lsof FAQ (The  FAQ  section  gives  its
+              location.)   and the 00README file of the lsof dis-
+              tribution for a more complete  description  of  the
+              Stale  Segment  ID  bug,  its APAR, and methods for
+              defining readx() use when compiling lsof.
+
+         Linux:
+              This Linux  option  requests  that  lsof  skip  the
+              reporting  of  information on all open TCP, UDP and
+              UDPLITE IPv4 and IPv6 files.
+
+              This Linux option is most useful  when  the  system
+              has  an extremely large number of open TCP, UDP and
+              UDPLITE files, the processing of whose  information
+              in  the  /proc/net/tcp*  and  /proc/net/udp*  files
+              would take lsof a long time, and whose reporting is
+              not of interest.
+
+              Use this option with care and  only  when  you  are
+              sure  that the information you want lsof to display
+              isn't associated with  open  TCP,  UDP  or  UDPLITE
+              socket files.
+
+         Solaris 10 and above:
+              This Solaris  10  and  above  option  requests  the
+              reporting  of cached paths for files that have been
+              deleted - i.e., removed with rm(1) or unlink(2).
+
+              The  cached  path  is  followed   by   the   string
+              `` (deleted)''  to  indicate that the path by which
+              the file was opened has been deleted.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  23
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              Because intervening changes  made  to  the  path  -
+              i.e.,  renames  with  mv(1)  or rename(2) - are not
+              recorded in the cached path, what lsof  reports  is
+              only the path by which the file was opened, not its
+              possibly different final path.
+
+     -z [z]   specifies how Solaris 10 and higher  zone  informa-
+              tion is to be handled.
+
+              Without a following argument - e.g.,  NO  z  -  the
+              option  specifies  that zone names are to be listed
+              in the ZONE output column.
+
+              The -z option may be followed by a  zone  name,  z.
+              That  causes  lsof  to  list  only  open  files for
+              processes in that zone.  Multiple -z z  option  and
+              argument  pairs  may be specified to form a list of
+              named zones.  Any open file of any process  in  any
+              of  the zones will be listed, subject to other con-
+              ditions specified by other options and arguments.
+
+     -Z [Z]   specifies how SELinux security contexts are  to  be
+              handled.  It and 'Z' field output character support
+              are inhibited when SELinux is disabled in the  run-
+              ning  Linux  kernel.  See OUTPUT FOR OTHER PROGRAMS
+              for more information on the 'Z' field output  char-
+              acter.
+
+              Without a following argument - e.g.,  NO  Z  -  the
+              option  specifies  that security contexts are to be
+              listed in the SECURITY-CONTEXT output column.
+
+              The -Z option may be followed by a  wildcard  secu-
+              rity  context  name,  Z.   That causes lsof to list
+              only open files for processes in that security con-
+              text.   Multiple -Z Z option and argument pairs may
+              be specified to form a list of  security  contexts.
+              Any open file of any process in any of the security
+              contexts will be listed, subject  to  other  condi-
+              tions  specified  by  other  options and arguments.
+              Note that Z can be A:B:C or *:B:C or A:B:* or *:*:C
+              to match against the A:B:C context.
+
+     --       The double minus sign option is a marker that  sig-
+              nals the end of the keyed options.  It may be used,
+              for example, when the first file name begins with a
+              minus  sign.   It may also be used when the absence
+              of a value for the last keyed option must be signi-
+              fied by the presence of a minus sign in the follow-
+              ing option and before the start of the file names.
+
+     names    These are path names of  specific  files  to  list.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  24
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              Symbolic  links are resolved before use.  The first
+              name may be separated from  the  preceding  options
+              with the ``--'' option.
+
+              If a name is the mounted-on  directory  of  a  file
+              system  or the device of the file system, lsof will
+              list all the files open on the file system.  To  be
+              considered  a  file  system,  the name must match a
+              mounted-on directory name in  mount(8)  output,  or
+              match  the name of a block device associated with a
+              mounted-on directory name.  The +|-f option may  be
+              used to force lsof to consider a name a file system
+              identifier (+f) or a simple file (-f).
+
+              If name is a path to a directory that  is  not  the
+              mounted-on  directory  name of a file system, it is
+              treated just as a regular file is treated  -  i.e.,
+              its listing is restricted to processes that have it
+              open as a file or as a process-specific  directory,
+              such  as the root or current working directory.  To
+              request that lsof look  for  open  files  inside  a
+              directory name, use the +d s and +D D options.
+
+              If a name is the base name of a  family  of  multi-
+              plexed  files - e. g, AIX's /dev/pt[cs] - lsof will
+              list all the associated multiplexed  files  on  the
+              device   that   are  open  -  e.g.,  /dev/pt[cs]/1,
+              /dev/pt[cs]/2, etc.
+
+              If a name is a UNIX domain socket name,  lsof  will
+              usually search for it by the characters of the name
+              alone - exactly as it is specified and is  recorded
+              in  the  kernel  socket  structure.   (See the next
+              paragraph for an exception to that rule for Linux.)
+              Specifying  a  relative  path  -  e.g., ./file - in
+              place of the file's absolute path - e.g., /tmp/file
+              - won't work because lsof must match the characters
+              you specify with what it finds in the  kernel  UNIX
+              domain socket structures.
+
+              If a name is a Linux UNIX domain  socket  name,  in
+              one  case lsof is able to search for it by its dev-
+              ice and inode number, allowing name to be  a  rela-
+              tive  path.   The  case  requires that the absolute
+              path -- i.e., one beginning with a slash  ('/')  be
+              used  by  the  process that created the socket, and
+              hence be stored in the /proc/net/unix file; and  it
+              requires that lsof be able to obtain the device and
+              node  numbers  of  both  the   absolute   path   in
+              /proc/net/unix and name via successful stat(2) sys-
+              tem calls.  When those  conditions  are  met,  lsof
+              will  be  able to search for the UNIX domain socket
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  25
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+              when some path to  it  is  is  specified  in  name.
+              Thus,  for example, if the path is /dev/log, and an
+              lsof search is initiated when the working directory
+              is /dev, then name could be ./log.
+
+              If a name is none of the above, lsof will list  any
+              open files whose device and inode match that of the
+              specified path name.
+
+              If you have also specified the -b option, the  only
+              names  you  may safely specify are file systems for
+              which your mount table  supplies  alternate  device
+              numbers.  See the AVOIDING KERNEL BLOCKS and ALTER-
+              NATE DEVICE NUMBERS sections for more information.
+
+              Multiple file names are joined in a single ORed set
+              before participating in AND option selection.
+
+AFS
+     Lsof  supports  the  recognition  of  AFS  files  for  these
+     dialects (and AFS versions):
+
+          AIX 4.1.4 (AFS 3.4a)
+          HP-UX 9.0.5 (AFS 3.4a)
+          Linux 1.2.13 (AFS 3.3)
+          Solaris 2.[56] (AFS 3.4a)
+
+     It may recognize  AFS  files  on  other  versions  of  these
+     dialects,  but  has not been tested there.  Depending on how
+     AFS is implemented, lsof may recognize AFS  files  in  other
+     dialects,  or may have difficulties recognizing AFS files in
+     the supported dialects.
+
+     Lsof may have trouble identifying all aspects of  AFS  files
+     in supported dialects when AFS kernel support is implemented
+     via dynamic modules whose addresses do  not  appear  in  the
+     kernel's variable name list.  In that case, lsof may have to
+     guess at the identity of AFS files, and might not be able to
+     obtain volume information from the kernel that is needed for
+     calculating AFS volume node numbers.  When lsof  can't  com-
+     pute  volume  node  numbers,  it  reports  blank in the NODE
+     column.
+
+     The -A A option is available in some dialect implementations
+     of  lsof  for  specifying  the  name list file where dynamic
+     module kernel addresses may be found.  When this  option  is
+     available,  it  will  be  listed  in  the  lsof help output,
+     presented in response to the -h or -?
+
+     See the lsof FAQ (The FAQ section gives its location.)   for
+     more  information  about dynamic modules, their symbols, and
+     how they affect lsof options.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  26
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     Because AFS path lookups don't seem to  participate  in  the
+     kernel's  name  cache  operations,  lsof can't identify path
+     name components for AFS files.
+
+SECURITY
+     Lsof has three features that may  cause  security  concerns.
+     First,  its  default  compilation mode allows anyone to list
+     all open files with it.  Second, by  default  it  creates  a
+     user-readable  and  user-writable  device  cache file in the
+     home directory of the real user ID that executes lsof.  (The
+     list-all-open-files  and  device  cache features may be dis-
+     abled when lsof is compiled.)  Third, its -k and -m  options
+     name alternate kernel name list or memory files.
+
+     Restricting the listing of all open files is  controlled  by
+     the  compile-time HASSECURITY and HASNOSOCKSECURITY options.
+     When HASSECURITY is defined, lsof will allow only  the  root
+     user  to  list  all  open files.  The non-root user may list
+     only open files of processes with the same user  IDentifica-
+     tion  number  as the real user ID number of the lsof process
+     (the one that its user logged on with).
+
+     However,  if  HASSECURITY  and  HASNOSOCKSECURITY  are  both
+     defined,  anyone  may  list open socket files, provided they
+     are selected with the -i option.
+
+     When HASSECURITY is not defined, anyone may  list  all  open
+     files.
+
+     Help output, presented in response to the -h or  -?  option,
+     gives  the  status  of the HASSECURITY and HASNOSOCKSECURITY
+     definitions.
+
+     See the Security section of the 00README file  of  the  lsof
+     distribution  for  information  on  building  lsof  with the
+     HASSECURITY and HASNOSOCKSECURITY options enabled.
+
+     Creation and use of a user-readable and user-writable device
+     cache  file  is  controlled  by  the  compile-time HASDCACHE
+     option.  See the DEVICE CACHE FILE section and the  sections
+     that  follow  it for details on how its path is formed.  For
+     security considerations it is important to note that in  the
+     default  lsof  distribution, if the real user ID under which
+     lsof is executed is root, the  device  cache  file  will  be
+     written  in  root's home directory - e.g., / or /root.  When
+     HASDCACHE is not defined, lsof does not write or attempt  to
+     read a device cache file.
+
+     When HASDCACHE is defined, the lsof help  output,  presented
+     in response to the -h, -D?, or -? options, will provide dev-
+     ice cache file handling information.  When HASDCACHE is  not
+     defined,  the  -h  or  -?  output  will  have  no  -D option
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  27
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     description.
+
+     Before you decide to disable the device cache file feature -
+     enabling it improves the performance of lsof by reducing the
+     startup overhead of examining all  the  nodes  in  /dev  (or
+     /devices)  -  read the discussion of it in the 00DCACHE file
+     of the lsof distribution and the lsof FAQ (The  FAQ  section
+     gives its location.)
+
+     WHEN IN DOUBT, YOU CAN TEMPORARILY DISABLE THE  USE  OF  THE
+     DEVICE CACHE FILE WITH THE -Di OPTION.
+
+     When lsof user declares alternate kernel name list or memory
+     files  with  the  -k  and -m options, lsof checks the user's
+     authority to read them with access(2).  This is intended  to
+     prevent  whatever special power lsof's modes might confer on
+     it from letting it read files not  normally  accessible  via
+     the authority of the real user ID.
+
+OUTPUT
+     This section describes the information lsof lists  for  each
+     open  file.   See  the OUTPUT FOR OTHER PROGRAMS section for
+     additional information on output that can  be  processed  by
+     another program.
+
+     Lsof only outputs printable (declared so  by  isprint(3))  8
+     bit characters.  Non-printable characters are printed in one
+     of three forms:  the C ``\[bfrnt]'' form; the control  char-
+     acter `^' form (e.g., ``^@''); or hexadecimal leading ``\x''
+     form (e.g., ``\xab'').  Space is non-printable in  the  COM-
+     MAND column (``\x20'') and printable elsewhere.
+
+     For some dialects  -  if  HASSETLOCALE  is  defined  in  the
+     dialect's  machine.h  header  file  -  lsof  will  print the
+     extended 8 bit characters of a language  locale.   The  lsof
+     process must be supplied a language locale environment vari-
+     able (e.g., LANG) whose value represents  a  known  language
+     locale  in  which  the  extended  characters  are considered
+     printable  by  isprint(3).   Otherwise  lsof  considers  the
+     extended  characters non-printable and prints them according
+     to its rules for  non-printable  characters,  stated  above.
+     Consult  your  dialect's setlocale(3) man page for the names
+     of other environment variables that may be used in place  of
+     LANG - e.g., LC_ALL, LC_CTYPE, etc.
+
+     Lsof's language locale support for  a  dialect  also  covers
+     wide  characters  -  e.g.,  UTF-8  -  when  HASSETLOCALE and
+     HASWIDECHAR are defined in the  dialect's  machine.h  header
+     file,  and  when a suitable language locale has been defined
+     in the appropriate environment variable for  the  lsof  pro-
+     cess.   Wide characters are printable under those conditions
+     if  iswprint(3)  reports  them  to  be.   If   HASSETLOCALE,
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  28
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     HASWIDECHAR  and  a suitable language locale aren't defined,
+     or if iswprint(3) reports wide characters that aren't print-
+     able,  lsof  considers the wide characters non-printable and
+     prints each of their 8  bits  according  to  its  rules  for
+     non-printable characters, stated above.
+
+     Consult the answers to the "Language locale  support"  ques-
+     tions  in the lsof FAQ (The FAQ section gives its location.)
+     for more information.
+
+     Lsof dynamically sizes the output columns each time it runs,
+     guaranteeing  that  each  column is a minimum size.  It also
+     guarantees that each column is separated from its  predeces-
+     sor by at least one space.
+
+     COMMAND    contains the first nine characters of the name of
+                the UNIX command associated with the process.  If
+                a non-zero w value  is  specified  to  the  +c  w
+                option,  the  column contains the first w charac-
+                ters of the name of the UNIX  command  associated
+                with  the  process  up to the limit of characters
+                supplied to lsof by the UNIX dialect.   (See  the
+                description  of  the +c w command or the lsof FAQ
+                for more information.  The FAQ section gives  its
+                location.)
+
+                If w is less than the length of the column title,
+                ``COMMAND'', it will be raised to that length.
+
+                If a zero w  value  is  specified  to  the  +c  w
+                option, the column contains all the characters of
+                the name of the UNIX command associated with  the
+                process.
+
+                All command name  characters  maintained  by  the
+                kernel  in  its structures are displayed in field
+                output when the command name descriptor (`c')  is
+                specified.   See  the  OUTPUT  FOR OTHER COMMANDS
+                section for information on selecting field output
+                and the associated command name descriptor.
+
+     PID        is the Process IDentification number of the  pro-
+                cess.
+
+     TID        is the task  IDentification  number,  if  a  task
+                reporting  is supported by the dialect and a task
+                is being listed.  (If help  output  -  i.e.,  the
+                output  of  the  -h  or  -?  options - shows this
+                option, then task reporting is supported  by  the
+                dialect.)
+
+                A blank TID column indicates a process - i.e.,  a
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  29
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                non-task.
+
+     ZONE       is the Solaris 10 and  higher  zone  name.   This
+                column must be selected with the -z option.
+
+     SECURITY-CONTEXT
+                is the SELinux  security  context.   This  column
+                must  be  selected with the -Z option.  Note that
+                the -Z option is inhibited when SELinux  is  dis-
+                abled in the running Linux kernel.
+
+     PPID       is the Parent Process  IDentification  number  of
+                the  process.   It  is only displayed when the -R
+                option has been specified.
+
+     PGID       is the process group IDentification number  asso-
+                ciated  with  the  process.  It is only displayed
+                when the -g option has been specified.
+
+     USER       is the user ID number or login name of  the  user
+                to  whom the process belongs, usually the same as
+                reported by ps(1).  However, on Linux USER is the
+                user  ID  number or login that owns the directory
+                in /proc where lsof finds information  about  the
+                process.  Usually that is the same value reported
+                by ps(1), but may differ  when  the  process  has
+                changed  its  effective  user  ID.   (See  the -l
+                option description for information on when a user
+                ID number or login name is displayed.)
+
+     FD         is the File Descriptor number of the file or:
+
+
+                     cwd  current working directory;
+                     Lnn  library references (AIX);
+                     err  FD information error (see NAME column);
+                     jld  jail directory (FreeBSD);
+                     ltx  shared library text (code and data);
+                     Mxx  hex memory-mapped type number xx.
+                     m86  DOS Merge mapped file;
+                     mem  memory-mapped file;
+                     mmap memory-mapped device;
+                     pd   parent directory;
+                     rtd  root directory;
+                     tr   kernel trace file (OpenBSD);
+                     txt  program text (code and data);
+                     v86  VP/ix mapped file;
+
+                FD  is  followed  by  one  of  these  characters,
+                describing the mode under which the file is open:
+
+                     r for read access;
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  30
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                     w for write access;
+                     u for read and write access;
+                     space if mode unknown and no lock
+                          character follows;
+                     `-' if mode unknown and lock
+                          character follows.
+
+                The mode character is followed by  one  of  these
+                lock  characters,  describing  the  type  of lock
+                applied to the file:
+
+                     N for a Solaris NFS lock of unknown type;
+                     r for read lock on part of the file;
+                     R for a read lock on the entire file;
+                     w for a write lock on part of the file;
+                     W for a write lock on the entire file;
+                     u for a read and write lock of any length;
+                     U for a lock of unknown type;
+                     x for an SCO OpenServer Xenix lock  on  part
+                     of the file;
+                     X for an SCO OpenServer Xenix  lock  on  the
+                     entire file;
+                     space if there is no lock.
+
+                See the LOCKS section for more information on the
+                lock information character.
+
+                The FD column contents constitutes a single field
+                for parsing in post-processing scripts.
+
+     TYPE       is the type of the node associated with the  file
+                - e.g., GDIR, GREG, VDIR, VREG, etc.
+
+                or ``IPv4'' for an IPv4 socket;
+
+                or ``IPv6'' for an open IPv6 network file -  even
+                if  its  address  is  IPv4,  mapped  in  an  IPv6
+                address;
+
+                or ``ax25'' for a Linux AX.25 socket;
+
+                or ``inet'' for an Internet domain socket;
+
+                or ``lla'' for a HP-UX link level access file;
+
+                or ``rte'' for an AF_ROUTE socket;
+
+                or ``sock'' for a socket of unknown domain;
+
+                or ``unix'' for a UNIX domain socket;
+
+                or ``x.25'' for an HP-UX x.25 socket;
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  31
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                or ``BLK'' for a block special file;
+
+                or ``CHR'' for a character special file;
+
+                or ``DEL'' for a Linux map  file  that  has  been
+                deleted;
+
+                or ``DIR'' for a directory;
+
+                or ``DOOR'' for a VDOOR file;
+
+                or ``FIFO'' for a FIFO special file;
+
+                or ``KQUEUE'' for a BSD style kernel event  queue
+                file;
+
+                or ``LINK'' for a symbolic link file;
+
+                or ``MPB'' for a multiplexed block file;
+
+                or ``MPC'' for a multiplexed character file;
+
+                or ``NOFD'' for a Linux /proc/<PID>/fd  directory
+                that  can't  be  opened  --  the  directory  path
+                appears in the NAME column, followed by an  error
+                message;
+
+                or ``PAS'' for a /proc/as file;
+
+                or ``PAXV'' for a /proc/auxv file;
+
+                or ``PCRE'' for a /proc/cred file;
+
+                or ``PCTL'' for a /proc control file;
+
+                or ``PCUR'' for the current /proc process;
+
+                or ``PCWD'' for a /proc  current  working  direc-
+                tory;
+
+                or ``PDIR'' for a /proc directory;
+
+                or ``PETY'' for a /proc executable type (etype);
+
+                or ``PFD'' for a /proc file descriptor;
+
+                or ``PFDR'' for a /proc  file  descriptor  direc-
+                tory;
+
+                or ``PFIL'' for an executable /proc file;
+
+                or ``PFPR'' for a /proc FP register set;
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  32
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                or ``PGD'' for a /proc/pagedata file;
+
+                or ``PGID'' for a /proc group notifier file;
+
+                or ``PIPE'' for pipes;
+
+                or ``PLC'' for a /proc/lwpctl file;
+
+                or ``PLDR'' for a /proc/lpw directory;
+
+                or ``PLDT'' for a /proc/ldt file;
+
+                or ``PLPI'' for a /proc/lpsinfo file;
+
+                or ``PLST'' for a /proc/lstatus file;
+
+                or ``PLU'' for a /proc/lusage file;
+
+                or ``PLWG'' for a /proc/gwindows file;
+
+                or ``PLWI'' for a /proc/lwpsinfo file;
+
+                or ``PLWS'' for a /proc/lwpstatus file;
+
+                or ``PLWU'' for a /proc/lwpusage file;
+
+                or ``PLWX'' for a /proc/xregs file'
+
+                or ``PMAP'' for a /proc map file (map);
+
+                or ``PMEM'' for a /proc memory image file;
+
+                or ``PNTF'' for a /proc process notifier file;
+
+                or ``POBJ'' for a /proc/object file;
+
+                or ``PODR'' for a /proc/object directory;
+
+                or ``POLP'' for an old format /proc light  weight
+                process file;
+
+                or ``POPF'' for an old format /proc PID file;
+
+                or ``POPG'' for an old  format  /proc  page  data
+                file;
+
+                or ``PORT'' for a SYSV named pipe;
+
+                or ``PREG'' for a /proc register file;
+
+                or ``PRMP'' for a /proc/rmap file;
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  33
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                or ``PRTD'' for a /proc root directory;
+
+                or ``PSGA'' for a /proc/sigact file;
+
+                or ``PSIN'' for a /proc/psinfo file;
+
+                or ``PSTA'' for a /proc status file;
+
+                or ``PSXSEM'' for a POSIX semaphore file;
+
+                or ``PSXSHM'' for a POSIX shared memory file;
+
+                or ``PUSG'' for a /proc/usage file;
+
+                or ``PW'' for a /proc/watch file;
+
+                or ``PXMP'' for a /proc/xmap file;
+
+                or ``REG'' for a regular file;
+
+                or ``SMT'' for a shared memory transport file;
+
+                or ``STSO'' for a stream socket;
+
+                or ``UNNM'' for an unnamed type file;
+
+                or ``XNAM'' for an OpenServer Xenix special  file
+                of unknown type;
+
+                or ``XSEM'' for  an  OpenServer  Xenix  semaphore
+                file;
+
+                or ``XSD'' for an OpenServer  Xenix  shared  data
+                file;
+
+                or the four type number octets if the correspond-
+                ing name isn't known.
+
+     FILE-ADDR  contains the kernel file structure address when f
+                has been specified to +f;
+
+     FCT        contains the file reference count from the kernel
+                file structure when c has been specified to +f;
+
+     FILE-FLAG  when g or G has been specified to +f, this  field
+                contains  the contents of the f_flag[s] member of
+                the  kernel  file  structure  and  the   kernel's
+                per-process  open  file flags (if available); `G'
+                causes them to be displayed in hexadecimal;  `g',
+                as  short-hand  names; two lists may be displayed
+                with  entries  separated  by  commas,  the  lists
+                separated  by  a  semicolon (`;'); the first list
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  34
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                may contain short-hand names for f_flag[s] values
+                from the following table:
+
+
+                     AIO       asynchronous I/O (e.g., FAIO)
+                     AP        append
+                     ASYN      asynchronous I/O (e.g., FASYNC)
+                     BAS       block, test, and set in use
+                     BKIU      block if in use
+                     BL        use block offsets
+                     BSK       block seek
+                     CA        copy avoid
+                     CIO       concurrent I/O
+                     CLON      clone
+                     CLRD      CL read
+                     CR        create
+                     DF        defer
+                     DFI       defer IND
+                     DFLU      data flush
+                     DIR       direct
+                     DLY       delay
+                     DOCL      do clone
+                     DSYN      data-only integrity
+                     DTY       must be a directory
+                     EVO       event only
+                     EX        open for exec
+                     EXCL      exclusive open
+                     FSYN      synchronous writes
+                     GCDF      defer during unp_gc() (AIX)
+                     GCMK      mark during unp_gc() (AIX)
+                     GTTY      accessed via /dev/tty
+                     HUP       HUP in progress
+                     KERN      kernel
+                     KIOC      kernel-issued ioctl
+                     LCK       has lock
+                     LG        large file
+                     MBLK      stream message block
+                     MK        mark
+                     MNT       mount
+                     MSYN      multiplex synchronization
+                     NATM      don't update atime
+                     NB        non-blocking I/O
+                     NBDR      no BDRM check
+                     NBIO      SYSV non-blocking I/O
+                     NBF       n-buffering in effect
+                     NC        no cache
+                     ND        no delay
+                     NDSY      no data synchronization
+                     NET       network
+                     NFLK      don't follow links
+                     NMFS      NM file system
+                     NOTO      disable background stop
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  35
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                     NSH       no share
+                     NTTY      no controlling TTY
+                     OLRM      OLR mirror
+                     PAIO      POSIX asynchronous I/O
+                     PP        POSIX pipe
+                     R         read
+                     RC        file and record locking cache
+                     REV       revoked
+                     RSH       shared read
+                     RSYN      read synchronization
+                     RW        read and write access
+                     SL        shared lock
+                     SNAP      cooked snapshot
+                     SOCK      socket
+                     SQSH      Sequent shared set on open
+                     SQSV      Sequent SVM set on open
+                     SQR       Sequent set repair on open
+                     SQS1      Sequent full shared open
+                     SQS2      Sequent partial shared open
+                     STPI      stop I/O
+                     SWR       synchronous read
+                     SYN       file integrity while writing
+                     TCPM      avoid TCP collision
+                     TR        truncate
+                     W         write
+                     WKUP      parallel I/O synchronization
+                     WTG       parallel I/O synchronization
+                     VH        vhangup pending
+                     VTXT      virtual text
+                     XL        exclusive lock
+
+                this list of names was derived from F*  #define's
+                in dialect header files <fcntl.h>, <linux</fs.h>,
+                <sys/fcntl.c>,       <sys/fcntlcom.h>,        and
+                <sys/file.h>;  see  the  lsof.h header file for a
+                list showing the correspondence between the above
+                short-hand names and the header file definitions;
+
+                the second list (after the semicolon) may contain
+                short-hand names for kernel per-process open file
+                flags from this table:
+
+
+                     ALLC      allocated
+                     BR        the file has been read
+                     BHUP      activity stopped by SIGHUP
+                     BW        the file has been written
+                     CLSG      closing
+                     CX        close-on-exec (see fcntl(F_SETFD))
+                     LCK       lock was applied
+                     MP        memory-mapped
+                     OPIP      open pending - in progress
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  36
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                     RSVW      reserved wait
+                     SHMT      UF_FSHMAT set (AIX)
+                     USE       in use (multi-threaded)
+
+     NODE-ID    (or INODE-ADDR  for  some  dialects)  contains  a
+                unique  identifier for the file node (usually the
+                kernel vnode or inode address, but also occasion-
+                ally  a  concatenation of device and node number)
+                when n has been specified to +f;
+
+     DEVICE     contains the device numbers, separated by commas,
+                for  a character special, block special, regular,
+                directory or NFS file;
+
+                or ``memory'' for a memory file system node under
+                Tru64 UNIX;
+
+                or the address of the  private  data  area  of  a
+                Solaris socket stream;
+
+                or a kernel reference address that identifies the
+                file  (The  kernel  reference address may be used
+                for FIFO's, for example.);
+
+                or the base address or device  name  of  a  Linux
+                AX.25 socket device.
+
+                Usually only the lower thirty two bits  of  Tru64
+                UNIX kernel addresses are displayed.
+
+     SIZE, SIZE/OFF, or OFFSET
+                is the size of the file or  the  file  offset  in
+                bytes.   A value is displayed in this column only
+                if it is available.  Lsof displays whatever value
+                - size or offset - is appropriate for the type of
+                the file and the version of lsof.
+
+                On some UNIX dialects lsof can't obtain  accurate
+                or  consistent  file  offset information from its
+                kernel data sources, sometimes just for  particu-
+                lar  kinds  of  files  (e.g.,  socket files.)  In
+                other cases, files don't have true sizes -  e.g.,
+                sockets,  FIFOs,  pipes  -  so  lsof displays for
+                their sizes the content amounts it finds in their
+                kernel  buffer  descriptors  (e.g., socket buffer
+                size counts or TCP/IP window sizes.)  Consult the
+                lsof  FAQ  (The  FAQ section gives its location.)
+                for more information.
+
+                The file size is displayed in decimal; the offset
+                is  normally  displayed in decimal with a leading
+                ``0t'' if  it  contains  8  digits  or  less;  in
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  37
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                hexadecimal with a leading ``0x'' if it is longer
+                than 8 digits.  (Consult the -o o option descrip-
+                tion  for  information on when 8 might default to
+                some other value.)
+
+                Thus the leading ``0t'' and  ``0x''  identify  an
+                offset  when  the  column may contain both a size
+                and an offset (i.e., its title is SIZE/OFF).
+
+                If  the  -o  option  is  specified,  lsof  always
+                displays the file offset (or nothing if no offset
+                is available) and labels the column OFFSET.   The
+                offset  always  begins  with  ``0t'' or ``0x'' as
+                described above.
+
+                The lsof user can control the switch from  ``0t''
+                to  ``0x''  with  the  -o  o option.  Consult its
+                description for more information.
+
+                If  the  -s  option  is  specified,  lsof  always
+                displays  the file size (or nothing if no size is
+                available) and labels the column  SIZE.   The  -o
+                and -s options are mutually exclusive; they can't
+                both be specified.
+
+                For files that don't have a fixed  size  -  e.g.,
+                don't reside on a disk device - lsof will display
+                appropriate information about the current size or
+                position  of  the  file if it is available in the
+                kernel structures that define the file.
+
+     NLINK      contains the file link count  when  +L  has  been
+                specified;
+
+     NODE       is the node number of a local file;
+
+                or the inode number of an NFS file in the  server
+                host;
+
+                or the Internet protocol type - e. g, ``TCP'';
+
+                or ``STR'' for a stream;
+
+                or ``CCITT'' for an HP-UX x.25 socket;
+
+                or the IRQ or  inode  number  of  a  Linux  AX.25
+                socket device.
+
+     NAME       is the name of the mount point and file system on
+                which the file resides;
+
+                or the name of a  file  specified  in  the  names
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  38
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                option   (after  any  symbolic  links  have  been
+                resolved);
+
+                or the name of a character special or block  spe-
+                cial device;
+
+                or the local and remote Internet addresses  of  a
+                network file; the local host name or IP number is
+                followed by a colon (':'), the port, ``->'',  and
+                the  two-part remote address; IP addresses may be
+                reported as numbers or names,  depending  on  the
+                +|-M,  -n,  and  -P options; colon-separated IPv6
+                numbers are enclosed  in  square  brackets;  IPv4
+                INADDR_ANY   and   IPv6   IN6_IS_ADDR_UNSPECIFIED
+                addresses, and zero port numbers are  represented
+                by  an  asterisk ('*'); a UDP destination address
+                may be followed by the  amount  of  time  elapsed
+                since  the  last  packet was sent to the destina-
+                tion; TCP, UDP and UDPLITE remote  addresses  may
+                be followed by TCP/TPI information in parentheses
+                - state (e.g., ``(ESTABLISHED)'', ``(Unbound)''),
+                queue  sizes, and window sizes (not all dialects)
+                -  in  a  fashion  similar  to  what   netstat(1)
+                reports;  see  the  -T  option description or the
+                description of the TCP/TPI field  in  OUTPUT  FOR
+                OTHER  PROGRAMS  for  more  information on state,
+                queue size, and window size;
+
+                or the address or name of a UNIX  domain  socket,
+                possibly  including a stream clone device name, a
+                file system object's path name, local and foreign
+                kernel  addresses, socket pair information, and a
+                bound vnode address;
+
+                or the local and remote mount point names  of  an
+                NFS file;
+
+                or ``STR'', followed by the stream name;
+
+                or a stream character device  name,  followed  by
+                ``->''  and  the  stream name or a list of stream
+                module names, separated by ``->'';
+
+                or ``STR:'' followed by the SCO OpenServer stream
+                device and module names, separated by ``->'';
+
+                or system directory name, `` -- '', and  as  many
+                components  of  the path name as lsof can find in
+                the kernel's name  cache  for  selected  dialects
+                (See  the  KERNEL  NAME  CACHE  section  for more
+                information.);
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  39
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+                or ``PIPE->'', followed by a Solaris kernel  pipe
+                destination address;
+
+                or ``COMMON:'',  followed  by  the  vnode  device
+                information   structure's   device  name,  for  a
+                Solaris common vnode;
+
+                or the address family, followed by a slash (`/'),
+                followed  by  fourteen comma-separated bytes of a
+                non-Internet raw socket address;
+
+                or the HP-UX x.25 local address, followed by  the
+                virtual  connection  number (if any), followed by
+                the remote address (if any);
+
+                or ``(dead)'' for disassociated Tru64 UNIX  files
+                - typically terminal files that have been flagged
+                with the TIOCNOTTY ioctl and closed by daemons;
+
+                or ``rd=<offset>'' and  ``wr=<offset>''  for  the
+                values of the read and write offsets of a FIFO;
+
+                or ``clone n:/dev/event'' for SCO OpenServer file
+                clones  of  the /dev/event device, where n is the
+                minor device number of the file;
+
+                or ``(socketpair: n)'' for a Solaris  2.6,  8,  9
+                or   10   UNIX  domain  socket,  created  by  the
+                socketpair(3N) network function;
+
+                or ``no PCB'' for socket files that do not have a
+                protocol  block  associated with them, optionally
+                followed by ``, CANTSENDMORE'' if sending on  the
+                socket has been disabled, or ``, CANTRCVMORE'' if
+                receiving on the socket has been disabled  (e.g.,
+                by the shutdown(2) function);
+
+                or the local and remote addresses of a Linux  IPX
+                socket  file  in  the form <net>:[<node>:]<port>,
+                followed  in  parentheses  by  the  transmit  and
+                receive queue sizes, and the connection state;
+
+                or ``dgram'' or ``stream'' for the type  UnixWare
+                7.1.1  and  above  in-kernel UNIX domain sockets,
+                followed by a colon (':') and the local path name
+                when available, followed by ``->'' and the remote
+                path name or kernel socket address in hexadecimal
+                when available.
+
+     For dialects that support a ``namefs'' file system, allowing
+     one  file  to  be attached to another with fattach(3C), lsof
+     will  add  ``(FA:<address1><direction><address2>)''  to  the
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  40
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     NAME  column.   <address1>  and  <address2>  are hexadecimal
+     vnode addresses.  <direction> will be ``<-''  if  <address2>
+     has   been   fattach'ed  to  this  vnode  whose  address  is
+     <address1>; and ``->'' if <address1>, the vnode  address  of
+     this  vnode,  has been fattach'ed to <address2>.  <address1>
+     may be omitted if it already appears in the DEVICE column.
+
+     Lsof may add two parenthetical notes to the NAME column  for
+     open  Solaris  10 files:  ``(?)'' if lsof considers the path
+     name of questionable accuracy; and ``(deleted)'' if  the  -X
+     option  has  been specified and lsof detects the open file's
+     path name has been deleted.  Consult the lsof FAQ  (The  FAQ
+     section  gives its location.)  for more information on these
+     NAME column additions.
+
+LOCKS
+     Lsof can't  adequately  report  the  wide  variety  of  UNIX
+     dialect  file  locks in a single character.  What it reports
+     in a single character is a compromise between  the  informa-
+     tion  it  finds  in  the  kernel  and the limitations of the
+     reporting format.
+
+     Moreover, when a process holds several byte level locks on a
+     file,  lsof  only  reports  the  status of the first lock it
+     encounters.  If it is a byte level lock, then the lock char-
+     acter  will  be  reported in lower case - i.e., `r', `w', or
+     `x' - rather than the upper case equivalent reported  for  a
+     full file lock.
+
+     Generally lsof can  only  report  on  locks  held  by  local
+     processes  on local files.  When a local process sets a lock
+     on a remotely mounted (e.g., NFS) file,  the  remote  server
+     host  usually  records  the  lock  state.   One exception is
+     Solaris - at some patch levels of 2.3, and in  all  versions
+     above  2.4, the Solaris kernel records information on remote
+     locks in local structures.
+
+     Lsof has trouble reporting locks  for  some  UNIX  dialects.
+     Consult the BUGS section of this manual page or the lsof FAQ
+     (The FAQ section gives its location.)  for more information.
+
+OUTPUT FOR OTHER PROGRAMS
+     When the -F option is specified, lsof produces  output  that
+     is  suitable for processing by another program - e.g, an awk
+     or Perl script, or a C program.
+
+     Each unit of information is output in a field that is  iden-
+     tified with a leading character and terminated by a NL (012)
+     (or a NUL (000) if the 0 (zero) field  identifier  character
+     is  specified.)   The  data of the field follows immediately
+     after the field identification character and extends to  the
+     field terminator.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  41
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     It is possible to think of field output as process and  file
+     sets.  A process set begins with a field whose identifier is
+     `p' (for process  IDentifier  (PID)).   It  extends  to  the
+     beginning  of  the  next  PID  field or the beginning of the
+     first file  set  of  the  process,  whichever  comes  first.
+     Included  in  the  process  set are fields that identify the
+     command, the process group IDentification (PGID) number, the
+     task number and the user ID (UID) number or login name.
+
+     A file set begins with a field whose identifier is `f'  (for
+     file descriptor).  It is followed by lines that describe the
+     file's access mode, lock state, type, device, size,  offset,
+     inode,  protocol,  name and stream module names.  It extends
+     to the beginning of the next file or process set,  whichever
+     comes first.
+
+     When the NUL (000) field terminator has been  selected  with
+     the 0 (zero) field identifier character, lsof ends each pro-
+     cess and file set with a NL (012) character.
+
+     Lsof always produces one field, the PID  (`p')  field.   All
+     other  fields  may be declared optionally in the field iden-
+     tifier character list that follows the -F  option.   When  a
+     field  selection  character identifies an item lsof does not
+     normally list - e.g., PPID, selected with -R - specification
+     of  the  field  character - e.g., ``-FR'' - also selects the
+     listing of the item.
+
+     It is entirely possible to select a set of fields that  can-
+     not  easily  be parsed - e.g., if the field descriptor field
+     is not selected, it may be difficult to identify file  sets.
+     To  help  you  avoid  this  difficulty, lsof supports the -F
+     option; it selects the output of all fields with NL termina-
+     tors  (the  -F0 option pair selects the output of all fields
+     with NUL terminators).  For compatibility reasons neither -F
+     nor -F0 select the raw device field.
+
+     These are the fields that lsof  will  produce.   The  single
+     character listed first is the field identifier.
+
+          a    file access mode
+          c    process command name (all characters from proc or
+               user structure)
+          C    file structure share count
+          d    file's device character code
+          D    file's major/minor device number (0x<hexadecimal>)
+          f    file descriptor
+          F    file structure address (0x<hexadecimal>)
+          G    file flaGs (0x<hexadecimal>; names if +fg follows)
+          g    process group ID
+          i    file's inode number
+          K    tasK ID
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  42
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+          k    link count
+          l    file's lock status
+          L    process login name
+          m    marker between repeated output
+          n    file name, comment, Internet address
+          N    node identifier (ox<hexadecimal>
+          o    file's offset (decimal)
+          p    process ID (always selected)
+          P    protocol name
+          r    raw device number (0x<hexadecimal>)
+          R    parent process ID
+          s    file's size (decimal)
+          S    file's stream identification
+          t    file's type
+          T    TCP/TPI information, identified by prefixes (the
+               `=' is part of the prefix):
+                   QR=<read queue size>
+                   QS=<send queue size>
+                   SO=<socket options and values> (not all dialects)
+                   SS=<socket states> (not all dialects)
+                   ST=<connection state>
+                   TF=<TCP flags and values> (not all dialects)
+                   WR=<window read size>  (not all dialects)
+                   WW=<window write size>  (not all dialects)
+               (TCP/TPI information isn't reported for all supported
+                 UNIX dialects. The -h or -? help output for the
+                 -T option will show what TCP/TPI reporting can be
+                 requested.)
+          u    process user ID
+          z    Solaris 10 and higher zone name
+          Z    SELinux security context (inhibited when SELinux is disabled)
+          0    use NUL field terminator character in place of NL
+          1-9  dialect-specific field identifiers (The output
+               of -F? identifies the information to be found
+               in dialect-specific fields.)
+
+     You can get on-line help information on these characters and
+     their  descriptions  by  specifying  the  -F?  option  pair.
+     (Escape the `?' character as your  shell  requires.)   Addi-
+     tional information on field content can be found in the OUT-
+     PUT section.
+
+     As an example, ``-F pcfn'' will select the process ID (`p'),
+     command  name  (`c'),  file  descriptor  (`f') and file name
+     (`n') fields with an NL  field  terminator  character;  ``-F
+     pcfn0''  selects the same output with a NUL (000) field ter-
+     minator character.
+
+     Lsof doesn't produce all fields for every  process  or  file
+     set,  only  those that are available.  Some fields are mutu-
+     ally exclusive: file device characters and file  major/minor
+     device  numbers;  file  inode number and protocol name; file
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  43
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     name and stream identification; file size and  offset.   One
+     or  the  other  member of these mutually exclusive sets will
+     appear in field output, but not both.
+
+     Normally lsof ends each field with  a  NL  (012)  character.
+     The  0 (zero) field identifier character may be specified to
+     change the field terminator character to a NUL (000).  A NUL
+     terminator  may  be  easier  to  process with xargs (1), for
+     example, or with programs whose quoting mechanisms  may  not
+     easily  cope  with the range of characters in the field out-
+     put.  When the NUL field terminator is  in  use,  lsof  ends
+     each process and file set with a NL (012).
+
+     Three aids to producing programs that can process lsof field
+     output  are included in the lsof distribution.  The first is
+     a C header file, lsof_fields.h, that  contains  symbols  for
+     the  field  identification  characters,  indexes for storing
+     them in a table, and explanation strings that  may  be  com-
+     piled into programs.  Lsof uses this header file.
+
+     The second aid is a set of sample scripts that process field
+     output, written in awk, Perl 4, and Perl 5.  They're located
+     in the scripts subdirectory of the lsof distribution.
+
+     The third aid is the C library used for the lsof test suite.
+     The  test  suite  is  written  in C and uses field output to
+     validate the correct operation of lsof.  The library can  be
+     found  in  the  tests/LTlib.c file of the lsof distribution.
+     The library uses the first  aid,  the  lsof_fields.h  header
+     file.
+
+BLOCKS AND TIMEOUTS
+     Lsof can be blocked by some kernel functions that it uses  -
+     lstat(2),  readlink(2),  and  stat(2).   These functions are
+     stalled in the kernel, for example,  when  the  hosts  where
+     mounted NFS file systems reside become inaccessible.
+
+     Lsof attempts to break these blocks with  timers  and  child
+     processes, but the techniques are not wholly reliable.  When
+     lsof does manage to break a block, it will report the  break
+     with  an error message.  The messages may be suppressed with
+     the -t and -w options.
+
+     The default timeout value may be displayed with the -h or -?
+     option,  and  it may be changed with the -S [t] option.  The
+     minimum for t is two seconds, but  you  should  avoid  small
+     values,  since  slow  system  responsiveness can cause short
+     timeouts to expire unexpectedly and perhaps stop lsof before
+     it can produce any output.
+
+     When lsof has to break a block during its access of  mounted
+     file  system  information,  it  normally continues, although
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  44
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     with less information available to display about open files.
+
+     Lsof can also be directed to avoid the protection of  timers
+     and  child  processes  when  using the kernel functions that
+     might block by specifying the -O option.   While  this  will
+     allow  lsof  to start up with less overhead, it exposes lsof
+     completely to the kernel situations  that  might  block  it.
+     Use this option cautiously.
+
+AVOIDING KERNEL BLOCKS
+     You can use the -b option to tell lsof to avoid using kernel
+     functions that would block.  Some cautions apply.
+
+     First, using this option usually requires that  your  system
+     supply  alternate  device  numbers  in  place  of the device
+     numbers that lsof would normally obtain  with  the  lstat(2)
+     and  stat(2)  kernel  functions.   See  the ALTERNATE DEVICE
+     NUMBERS section for more  information  on  alternate  device
+     numbers.
+
+     Second, you can't specify names for lsof  to  locate  unless
+     they're  file  system  names.  This is because lsof needs to
+     know the device and inode numbers of files listed with names
+     in  the  lsof  options, and the -b option prevents lsof from
+     obtaining  them.   Moreover,  since  lsof  only  has  device
+     numbers for the file systems that have alternates, its abil-
+     ity to locate files on file systems  depends  completely  on
+     the  availability  and  accuracy  of  the alternates.  If no
+     alternates are available,  or  if  they're  incorrect,  lsof
+     won't be able to locate files on the named file systems.
+
+     Third, if the names of your  file  system  directories  that
+     lsof  obtains  from  your  system's mount table are symbolic
+     links, lsof won't be able to resolve  the  links.   This  is
+     because  the  -b  option  causes  lsof  to  avoid the kernel
+     readlink(2) function it uses to resolve symbolic links.
+
+     Finally, using the -b option causes lsof  to  issue  warning
+     messages  when it needs to use the kernel functions that the
+     -b option directs it to avoid.  You can suppress these  mes-
+     sages  by specifying the -w option, but if you do, you won't
+     see the alternate device numbers  reported  in  the  warning
+     messages.
+
+ALTERNATE DEVICE NUMBERS
+     On some dialects, when lsof has to break a block because  it
+     can't  get  information  about a mounted file system via the
+     lstat(2) and stat(2) kernel functions, or because you speci-
+     fied  the -b option, lsof can obtain some of the information
+     it needs - the device number and possibly  the  file  system
+     type  - from the system mount table.  When that is possible,
+     lsof will report the device number it  obtained.   (You  can
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  45
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     suppress the report by specifying the -w option.)
+
+     You can assist this process if your mount table is supported
+     with  an  /etc/mtab  or  /etc/mnttab  file  that contains an
+     options field by  adding  a  ``dev=xxxx''  field  for  mount
+     points that do not have one in their options strings.  Note:
+     you must be able to edit the file - i.e., some mount  tables
+     like  recent  Solaris  /etc/mnttab or Linux /proc/mounts are
+     read-only and can't be modified.
+
+     You may also be able to supply device numbers using  the  +m
+     and  +m  m  options,  provided  they  are  supported by your
+     dialect.  Check the output of lsof's -h or -? options to see
+     if the +m and +m m options are available.
+
+     The ``xxxx'' portion of the field is the  hexadecimal  value
+     of  the  file  system's  device number.  (Consult the st_dev
+     field of the output of the lstat(2)  and  stat(2)  functions
+     for  the  appropriate values for your file systems.)  Here's
+     an example from a Sun Solaris 2.6  /etc/mnttab  for  a  file
+     system remotely mounted via NFS:
+
+          nfs  ignore,noquota,dev=2a40001
+
+     There's an advantage to having ``dev=xxxx'' entries in  your
+     mount  table  file,  especially  for  file  systems that are
+     mounted from remote  NFS  servers.   When  a  remote  server
+     crashes  and  you want to identify its users by running lsof
+     on one of its clients, lsof probably won't be  able  to  get
+     output  from the lstat(2) and stat(2) functions for the file
+     system.  If it can obtain the file  system's  device  number
+     from  the  mount table, it will be able to display the files
+     open on the crashed NFS server.
+
+     Some  dialects  that  do  not  use  an  ASCII  /etc/mtab  or
+     /etc/mnttab  file  for  the mount table may still provide an
+     alternative device number in their  internal  mount  tables.
+     This  includes  AIX, Apple Darwin, FreeBSD, NetBSD, OpenBSD,
+     and Tru64 UNIX.  Lsof knows how to  obtain  the  alternative
+     device  number  for  these  dialects  and  uses  it when its
+     attempt to lstat(2) or stat(2) the file system is blocked.
+
+     If you're not sure your dialect  supplies  alternate  device
+     numbers for file systems from its mount table, use this lsof
+     incantation to  see  if  it  reports  any  alternate  device
+     numbers:
+
+          lsof -b
+
+     Look for standard error file  warning  messages  that  begin
+     ``assuming "dev=xxxx" from ...''.
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  46
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+KERNEL NAME CACHE
+     Lsof is able to examine the kernel's name cache or use other
+     kernel  facilities  (e.g., the ADVFS 4.x tag_to_path() func-
+     tion under Tru64 UNIX) on some dialects for most file system
+     types,  excluding  AFS,  and extract recently used path name
+     components from it.  (AFS file system path lookups don't use
+     the  kernel's  name  cache;  some  Solaris  VxFS file system
+     operations apparently don't use it, either.)
+
+     Lsof reports the complete paths it finds in the NAME column.
+     If lsof can't report all components in a path, it reports in
+     the NAME column the file system name, followed by  a  space,
+     two  `-'  characters, another space, and the name components
+     it has located, separated by the `/' character.
+
+     When lsof is run in repeat mode - i.e., with the  -r  option
+     specified - the extent to which it can report path name com-
+     ponents for the same file may  vary  from  cycle  to  cycle.
+     That's  because other running processes can cause the kernel
+     to remove entries from its name cache and replace them  with
+     others.
+
+     Lsof's use of the kernel name cache to identify the paths of
+     files  can lead it to report incorrect components under some
+     circumstances.  This can happen when the kernel  name  cache
+     uses  device and node number as a key (e.g., SCO OpenServer)
+     and a key on a rapidly changing file system is  reused.   If
+     the UNIX dialect's kernel doesn't purge the name cache entry
+     for a file when it is unlinked, lsof may find a reference to
+     the wrong entry in the cache.  The lsof FAQ (The FAQ section
+     gives its location.)  has more information  on  this  situa-
+     tion.
+
+     Lsof can report path name components for these dialects:
+
+          FreeBSD
+          HP-UX
+          Linux
+          NetBSD
+          NEXTSTEP
+          OpenBSD
+          OPENSTEP
+          SCO OpenServer
+          SCO|Caldera UnixWare
+          Solaris
+          Tru64 UNIX
+
+     Lsof can't report path name components for these dialects:
+
+          AIX
+
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  47
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     If you want to know why lsof can't  report  path  name  com-
+     ponents for some dialects, see the lsof FAQ (The FAQ section
+     gives its location.)
+
+DEVICE CACHE FILE
+     Examining all members of the /dev (or  /devices)  node  tree
+     with  stat(2) functions can be time consuming.  What's more,
+     the information that  lsof  needs  -  device  number,  inode
+     number, and path - rarely changes.
+
+     Consequently, lsof normally maintains an ASCII text file  of
+     cached   /dev  (or  /devices)  information  (exception:  the
+     /proc-based Linux lsof where it's not  needed.)   The  local
+     system administrator who builds lsof can control the way the
+     device cache file  path  is  formed,  selecting  from  these
+     options:
+
+          Path from the -D option;
+          Path from an environment variable;
+          System-wide path;
+          Personal path (the default);
+          Personal path, modified by an environment variable.
+
+     Consult the output of the -h, -D? , or -? help  options  for
+     the  current state of device cache support.  The help output
+     lists the default read-mode device cache file path  that  is
+     in  effect  for  the  current  invocation  of lsof.  The -D?
+     option output lists the read-only  and  write  device  cache
+     file  paths,  the  names of any applicable environment vari-
+     ables, and the personal device cache path format.
+
+     Lsof can detect that the current device cache file has  been
+     accidentally  or  maliciously  modified by integrity checks,
+     including the computation and verification of a sixteen  bit
+     Cyclic  Redundancy  Check  (CRC) sum on the file's contents.
+     When lsof senses something wrong with the file, it issues  a
+     warning  and  attempts  to remove the current cache file and
+     create a new copy, but only to a path that the  process  can
+     legitimately write.
+
+     The path from which a lsof process may  attempt  to  read  a
+     device  cache  file may not be the same as the path to which
+     it can legitimately write.  Thus when lsof  senses  that  it
+     needs  to update the device cache file, it may choose a dif-
+     ferent path for writing it from the path from which it  read
+     an incorrect or outdated version.
+
+     If available, the -Dr option will inhibit the writing  of  a
+     new  device  cache file.  (It's always available when speci-
+     fied without a path name argument.)
+
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  48
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     When a new device is added to the system, the  device  cache
+     file  may  need  to  be  recreated.  Since lsof compares the
+     mtime of the device cache file with the mtime and  ctime  of
+     the  /dev (or /devices) directory, it usually detects that a
+     new device has been added; in that case lsof issues a  warn-
+     ing message and attempts to rebuild the device cache file.
+
+     Whenever lsof writes a device cache file, it sets its owner-
+     ship  to the real UID of the executing process, and its per-
+     mission modes to 0600,  this  restricting  its  reading  and
+     writing to the file's owner.
+
+LSOF PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS
+     Two permissions of the lsof executable affect its ability to
+     access  device  cache files.  The permissions are set by the
+     local system administrator when lsof is installed.
+
+     The first and rarer permission  is  setuid-root.   It  comes
+     into effect when lsof is executed; its effective UID is then
+     root, while its real (i.e., that of the logged-on user)  UID
+     is  not.  The lsof distribution recommends that versions for
+     these dialects run setuid-root.
+
+          HP-UX 11.11 and 11.23
+          Linux
+
+     The second and more common permission is setgid.   It  comes
+     into  effect  when the effective group IDentification number
+     (GID) of the lsof process is set to one that can access ker-
+     nel memory devices - e.g., ``kmem'', ``sys'', or ``system''.
+
+     An  lsof  process  that  has   setgid   permission   usually
+     surrenders  the  permission after it has accessed the kernel
+     memory devices.  When it does  that,  lsof  can  allow  more
+     liberal device cache path formations.  The lsof distribution
+     recommends that versions for these dialects run  setgid  and
+     be allowed to surrender setgid permission.
+
+          AIX 5.[12] and 5.3-ML1
+          Apple Darwin 7.x Power Macintosh systems
+          FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems
+          FreeBSD 5.x and [6789].x for Alpha, AMD64 and Sparc64-based
+              systems
+          HP-UX 11.00
+          NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based
+              systems
+          NEXTSTEP 3.[13] for NEXTSTEP architectures
+          OpenBSD 2.[89] and 3.[0-9] for x86-based systems
+          OPENSTEP 4.x
+          SCO OpenServer Release 5.0.6 for x86-based systems
+          SCO|Caldera UnixWare 7.1.4 for x86-based systems
+          Solaris 2.6, 8, 9 and 10
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  49
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+          Tru64 UNIX 5.1
+
+     (Note:  lsof for AIX 5L and above needs setuid-root  permis-
+     sion if its -X option is used.)
+
+     Lsof for these dialects does not support a device cache,  so
+     the  permissions  given to the executable don't apply to the
+     device cache file.
+
+          Linux
+
+DEVICE CACHE FILE PATH FROM THE -D OPTION
+     The -D option provides limited means for specifying the dev-
+     ice  cache  file  path.   Its  ?  function  will  report the
+     read-only and write device cache file paths that  lsof  will
+     use.
+
+     When the -D b, r, and u functions are available, you can use
+     them  to  request that the cache file be built in a specific
+     location (b[path]); read but not rebuilt (r[path]); or  read
+     and  rebuilt  (u[path]).  The b, r, and u functions are res-
+     tricted under some conditions.  They are restricted when the
+     lsof  process is setuid-root.  The path specified with the r
+     function is always read-only, even when it is available.
+
+     The b, r, and u functions are also restricted when the  lsof
+     process  runs  setgid  and lsof doesn't surrender the setgid
+     permission.  (See the LSOF PERMISSIONS  THAT  AFFECT  DEVICE
+     CACHE FILE ACCESS section for a list of implementations that
+     normally don't surrender their setgid permission.)
+
+     A further -D function, i (for ignore), is always available.
+
+     When available, the b function tells  lsof  to  read  device
+     information  from  the  kernel with the stat(2) function and
+     build a device cache file at the indicated path.
+
+     When available, the r function tells lsof to read the device
+     cache  file, but not update it.  When a path argument accom-
+     panies -Dr, it names the device  cache  file  path.   The  r
+     function  is always available when it is specified without a
+     path name argument.  If lsof is not running setuid-root  and
+     surrenders  its  setgid permission, a path name argument may
+     accompany the r function.
+
+     When available, the u function tells lsof to attempt to read
+     and  use  the device cache file.  If it can't read the file,
+     or if it finds the contents of the file  incorrect  or  out-
+     dated, it will read information from the kernel, and attempt
+     to write an updated version of the device  cache  file,  but
+     only  to a path it considers legitimate for the lsof process
+     effective and real UIDs.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  50
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+DEVICE CACHE PATH FROM AN ENVIRONMENT VARIABLE
+     Lsof's second choice for the device cache file is  the  con-
+     tents  of  the LSOFDEVCACHE environment variable.  It avoids
+     this choice if the lsof process is setuid-root, or the  real
+     UID of the process is root.
+
+     A further restriction applies to a device  cache  file  path
+     taken from the LSOFDEVCACHE environment variable:  lsof will
+     not write a device cache file to the path if the  lsof  pro-
+     cess doesn't surrender its setgid permission.  (See the LSOF
+     PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS section for
+     information  on  implementations  that don't surrender their
+     setgid permission.)
+
+     The local system administrator can disable the  use  of  the
+     LSOFDEVCACHE  environment  variable  or change its name when
+     building lsof.  Consult the output of -D? for  the  environ-
+     ment variable's name.
+
+SYSTEM-WIDE DEVICE CACHE PATH
+     The  local  system  administrator  may  choose  to  have   a
+     system-wide device cache file when building lsof.  That file
+     will generally be constructed by a special  system  adminis-
+     tration procedure when the system is booted or when the con-
+     tents of /dev or  /devices)  changes.   If  defined,  it  is
+     lsof's third device cache file path choice.
+
+     You can tell that a system-wide  device  cache  file  is  in
+     effect  for  your  local  installation by examining the lsof
+     help option output - i.e., the output  from  the  -h  or  -?
+     option.
+
+     Lsof will never write to the system-wide device  cache  file
+     path  by  default.   It  must  be explicitly named with a -D
+     function in a root-owned procedure.  Once the file has  been
+     written,  the  procedure must change its permission modes to
+     0644   (owner-read   and   owner-write,   group-read,    and
+     other-read).
+
+PERSONAL DEVICE CACHE PATH (DEFAULT)
+     The default device cache file path of the lsof  distribution
+     is  one  recorded in the home directory of the real UID that
+     executes lsof.  Added to the home directory is a second path
+     component of the form .lsof_hostname.
+
+     This is lsof's fourth device cache file path choice, and  is
+     usually  the  default.   If  a system-wide device cache file
+     path was defined when lsof was  built,  this  fourth  choice
+     will  be applied when lsof can't find the system-wide device
+     cache file.  This is the only time lsof uses two paths  when
+     reading the device cache file.
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  51
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     The hostname part of the second component is the  base  name
+     of  the  executing host, as returned by gethostname(2).  The
+     base name is defined to  be  the  characters  preceding  the
+     first `.'  in the gethostname(2) output, or all the gethost-
+     name(2) output if it contains no `.'.
+
+     The device cache file belongs to the user ID and is readable
+     and  writable  by  the  user  ID alone - i.e., its modes are
+     0600.  Each distinct real user ID on a given host that  exe-
+     cutes  lsof  has a distinct device cache file.  The hostname
+     part of the path distinguishes  device  cache  files  in  an
+     NFS-mounted home directory into which device cache files are
+     written from several different hosts.
+
+     The personal device cache file path formed  by  this  method
+     represents  a  device  cache  file that lsof will attempt to
+     read, and will attempt to  write  should  it  not  exist  or
+     should its contents be incorrect or outdated.
+
+     The -Dr option without a path name argument will inhibit the
+     writing of a new device cache file.
+
+     The -D? option will list the format specification  for  con-
+     structing  the  personal device cache file.  The conversions
+     used in  the  format  specification  are  described  in  the
+     00DCACHE file of the lsof distribution.
+
+MODIFIED PERSONAL DEVICE CACHE PATH
+     If this option is defined by the local system  administrator
+     when  lsof is built, the LSOFPERSDCPATH environment variable
+     contents may be used to add a component of the personal dev-
+     ice cache file path.
+
+     The LSOFPERSDCPATH variable contents  are  inserted  in  the
+     path  at  the place marked by the local system administrator
+     with the ``%p'' conversion in the HASPERSDC format  specifi-
+     cation of the dialect's machine.h header file.  (It's placed
+     right after the home directory in the default lsof distribu-
+     tion.)
+
+     Thus, for example, if LSOFPERSDCPATH contains ``LSOF'',  the
+     home   directory   is   ``/Homes/abe'',  the  host  name  is
+     ``lsof.itap.purdue.edu'', and the HASPERSDC  format  is  the
+     default  (``%h/%p.lsof_%L''),  the  modified personal device
+     cache file path is:
+
+          /Homes/abe/LSOF/.lsof_vic
+
+     The LSOFPERSDCPATH environment variable is ignored when  the
+     lsof process is setuid-root or when the real UID of the pro-
+     cess is root.
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  52
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     Lsof will not write to a modified personal device cache file
+     path  if  the  lsof process doesn't surrender setgid permis-
+     sion.  (See the LSOF PERMISSIONS THAT  AFFECT  DEVICE  CACHE
+     FILE  ACCESS section for a list of implementations that nor-
+     mally don't surrender their setgid permission.)
+
+     If, for example, you want to create a sub-directory of  per-
+     sonal  device  cache  file paths by using the LSOFPERSDCPATH
+     environment variable to name it, and lsof doesn't  surrender
+     its setgid permission, you will have to allow lsof to create
+     device cache files at the standard personal  path  and  move
+     them to your subdirectory with shell commands.
+
+     The local system administrator may: disable this option when
+     lsof  is  built; change the name of the environment variable
+     from LSOFPERSDCPATH to something else; change the  HASPERSDC
+     format  to  include  the  personal path component in another
+     place; or exclude  the  personal  path  component  entirely.
+     Consult  the  output  of  the -D? option for the environment
+     variable's name and the HASPERSDC format specification.
+
+DIAGNOSTICS
+     Errors are identified with messages on  the  standard  error
+     file.
+
+     Lsof returns a one (1) if any error was detected,  including
+     the  failure  to  locate command names, file names, Internet
+     addresses or files, login names, NFS files, PIDs, PGIDs,  or
+     UIDs  it  was asked to list.  If the -V option is specified,
+     lsof will indicate the search items it failed to list.
+
+     It returns a zero (0) if no errors were detected and  if  it
+     was  able  to  list some information about all the specified
+     search arguments.
+
+     When lsof cannot open access to /dev (or /devices) or one of
+     its  subdirectories,  or  get  information on a file in them
+     with stat(2), it issues a  warning  message  and  continues.
+     That  lsof  will  issue  warning messages about inaccessible
+     files in /dev (or /devices) is indicated in its help  output
+     -  requested  with the -h or >B -?  options -  with the mes-
+     sage:
+
+          Inaccessible /dev warnings are enabled.
+
+     The warning message may be suppressed with  the  -w  option.
+     It may also have been suppressed by the system administrator
+     when lsof was compiled by the setting of  the  WARNDEVACCESS
+     definition.   In this case, the output from the help options
+     will include the message:
+
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  53
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+          Inaccessible /dev warnings are disabled.
+
+     Inaccessible device warning messages usually disappear after
+     lsof has created a working device cache file.
+
+EXAMPLES
+     For a more extensive set of examples, documented more fully,
+     see the 00QUICKSTART file of the lsof distribution.
+
+     To list all open files, use:
+
+          lsof
+
+     To list all open Internet, x.25  (HP-UX),  and  UNIX  domain
+     files, use:
+
+          lsof -i -U
+
+     To list all open IPv4 network files in use  by  the  process
+     whose PID is 1234, use:
+
+          lsof -i 4 -a -p 1234
+
+     Presuming the UNIX dialect supports IPv6, to list only  open
+     IPv6 network files, use:
+
+          lsof -i 6
+
+     To list all files using any protocol on ports 513,  514,  or
+     515 of host wonderland.cc.purdue.edu, use:
+
+          lsof -i @wonderland.cc.purdue.edu:513-515
+
+     To list  all  files  using  any  protocol  on  any  port  of
+     mace.cc.purdue.edu  (cc.purdue.edu  is  the default domain),
+     use:
+
+          lsof -i @mace
+
+     To list all open files for login name ``abe'',  or  user  ID
+     1234, or process 456, or process 123, or process 789, use:
+
+          lsof -p 456,123,789 -u 1234,abe
+
+     To list all open files on device /dev/hd4, use:
+
+          lsof /dev/hd4
+
+     To find the process that has /u/abe/foo open, use:
+
+          lsof /u/abe/foo
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  54
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     To send a SIGHUP to the processes that have /u/abe/bar open,
+     use:
+
+          kill -HUP `lsof -t /u/abe/bar`
+
+     To find any open file, including an open UNIX domain  socket
+     file, with the name /dev/log, use:
+
+          lsof /dev/log
+
+     To find processes with open files on  the  NFS  file  system
+     named  /nfs/mount/point  whose  server  is inaccessible, and
+     presuming your mount table supplies the  device  number  for
+     /nfs/mount/point, use:
+
+          lsof -b /nfs/mount/point
+
+     To do the preceding search with warning messages suppressed,
+     use:
+
+          lsof -bw /nfs/mount/point
+
+     To ignore the device cache file, use:
+
+          lsof -Di
+
+     To obtain PID and command name field output  for  each  pro-
+     cess,  file  descriptor,  file device number, and file inode
+     number for each file of each process, use:
+
+          lsof -FpcfDi
+
+     To list the files at descriptors 1 and 3  of  every  process
+     running  the  lsof  command  for  login  ID ``abe'' every 10
+     seconds, use:
+
+          lsof -c lsof -a -d 1 -d 3 -u abe -r10
+
+     To list the current working directory of processes running a
+     command  that is exactly four characters long and has an 'o'
+     or 'O' in character three, use this regular expression  form
+     of the -c c option:
+
+          lsof -c /^..o.$/i -a -d cwd
+
+     To find an IP  version  4  socket  file  by  its  associated
+     numeric dot-form address, use:
+
+          lsof -i@128.210.15.17
+
+     To find an IP version 6 socket file (when the  UNIX  dialect
+     supports IPv6) by its associated numeric colon-form address,
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  55
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     use:
+
+          lsof -i@[0:1:2:3:4:5:6:7]
+
+     To find an IP version 6 socket file (when the  UNIX  dialect
+     supports  IPv6)  by an associated numeric colon-form address
+     that has a run of zeroes in it - e.g., the loop-back address
+     - use:
+
+          lsof -i@[::1]
+
+     To obtain a  repeat  mode  marker  line  that  contains  the
+     current time, use:
+
+          lsof -rm====%T====
+
+     To add spaces to the previous marker line, use:
+
+          lsof -r "m==== %T ===="
+
+BUGS
+     Since lsof reads kernel memory in its search for open files,
+     rapid  changes  in  kernel  memory may produce unpredictable
+     results.
+
+     When a file has multiple record locks, the lock status char-
+     acter (following the file descriptor) is derived from a test
+     of the first lock structure, not from any combination of the
+     individual  record locks that might be described by multiple
+     lock structures.
+
+     Lsof can't search for files with restrictive access  permis-
+     sions  by name unless it is installed with root set-UID per-
+     mission.  Otherwise it is limited to searching for files  to
+     which its user or its set-GID group (if any) has access per-
+     mission.
+
+     The display of the  destination  address  of  a  raw  socket
+     (e.g., for ping) depends on the UNIX operating system.  Some
+     dialects store the destination address in the  raw  socket's
+     protocol control block, some do not.
+
+     Lsof can't always represent Solaris device  numbers  in  the
+     same  way that ls(1) does.  For example, the major and minor
+     device numbers  that  the  lstat(2)  and  stat(2)  functions
+     report  for  the directory on which CD-ROM files are mounted
+     (typically /cdrom) are not the same  as  the  ones  that  it
+     reports  for  the  device  on which CD-ROM files are mounted
+     (typically /dev/sr0).  (Lsof reports the directory numbers.)
+
+     The support for /proc file systems is available only for BSD
+     and  Tru64  UNIX  dialects, Linux, and dialects derived from
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  56
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     SYSV R4 - e.g., FreeBSD, NetBSD, OpenBSD, Solaris, UnixWare.
+
+     Some /proc file items - device  number,  inode  number,  and
+     file size - are unavailable in some dialects.  Searching for
+     files in a /proc file system may require that the full  path
+     name be specified.
+
+     No text (txt)  file  descriptors  are  displayed  for  Linux
+     processes.   All  entries  for  files other than the current
+     working directory, the root directory,  and  numerical  file
+     descriptors are labeled mem descriptors.
+
+     Lsof can't search  for  Tru64  UNIX  named  pipes  by  name,
+     because  their  kernel implementation of lstat(2) returns an
+     improper device number for a named pipe.
+
+     Lsof can't report fully or correctly on HP-UX  9.01,  10.20,
+     and  11.00  locks  because  of insufficient access to kernel
+     data or errors in the kernel data.  See the  lsof  FAQ  (The
+     FAQ section gives its location.)  for details.
+
+     The AIX SMT file type is a fabrication.  It's  made  up  for
+     file  structures  whose  type  (15) isn't defined in the AIX
+     /usr/include/sys/file.h header file.  One way to create such
+     file  structures  is to run X clients with the DISPLAY vari-
+     able set to ``:0.0''.
+
+     The +|-f[cfgGn] option is not  supported  under  /proc-based
+     Linux  lsof,  because it doesn't read kernel structures from
+     kernel memory.
+
+ENVIRONMENT
+     Lsof may access these environment variables.
+
+     LANG              defines a  language  locale.   See  setlo-
+                       cale(3)  for  the names of other variables
+                       that can be used in place of LANG -  e.g.,
+                       LC_ALL, LC_TYPE, etc.
+
+     LSOFDEVCACHE      defines the path to a device  cache  file.
+                       See the DEVICE CACHE PATH FROM AN ENVIRON-
+                       MENT VARIABLE section  for  more  informa-
+                       tion.
+
+     LSOFPERSDCPATH    defines the middle component of a modified
+                       personal  device cache file path.  See the
+                       MODIFIED PERSONAL DEVICE CACHE  PATH  sec-
+                       tion for more information.
+
+FAQ
+     Frequently-asked questions and their answers  (an  FAQ)  are
+     available in the 00FAQ file of the lsof distribution.
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  57
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+     That  file  is  also  available  via  anonymous   ftp   from
+     lsof.itap.purdue.edu at pub/tools/unix/lsofFAQ.  The URL is:
+
+          ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
+
+FILES
+     /dev/kmem         kernel virtual memory device
+
+     /dev/mem          physical memory device
+
+     /dev/swap         system paging device
+
+     .lsof_hostname    lsof's  device  cache  file  (The  suffix,
+                       hostname,  is  the  first component of the
+                       host's name returned by gethostname(2).)
+
+AUTHORS
+     Lsof was written by Victor A. Abell <abe@purdue.edu> of Pur-
+     due  University.   Many  others  have  contributed  to lsof.
+     They're listed in the 00CREDITS file of the  lsof  distribu-
+     tion.
+
+DISTRIBUTION
+     The latest distribution of lsof is available  via  anonymous
+     ftp  from  the  host  lsof.itap.purdue.edu.  You'll find the
+     lsof distribution in the pub/tools/unix/lsof directory.
+
+     You can also use this URL:
+
+          ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof
+
+     Lsof  is  also  mirrored   elsewhere.    When   you   access
+     lsof.itap.purdue.edu  and  change to its pub/tools/unix/lsof
+     directory, you'll be given a list of some mirror sites.  The
+     pub/tools/unix/lsof  directory also contains a more complete
+     list in its mirrors file.  Use mirrors with  caution  -  not
+     all mirrors always have the latest lsof revision.
+
+     Some  pre-compiled  Lsof  executables   are   available   on
+     lsof.itap.purdue.edu,  but  their  use is discouraged - it's
+     better that you build your own from  the  sources.   If  you
+     feel you must use a pre-compiled executable, please read the
+     cautions  that  appear  in   the   README   files   of   the
+     pub/tools/unix/lsof/binaries  subdirectories  and in the 00*
+     files of the distribution.
+
+     More information on the lsof distribution can  be  found  in
+     its  README.lsof_<version>  file.   If you intend to get the
+     lsof   distribution    and    build    it,    please    read
+     README.lsof_<version> and the other 00* files of the distri-
+     bution before sending questions to the author.
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  58
+
+
+
+
+
+
+Maintenance Procedures                                    LSOF(8)
+
+
+
+SEE ALSO
+     Not all the following manual pages may exist in  every  UNIX
+     dialect to which lsof has been ported.
+
+     access(2), awk(1), crash(1), fattach(3C),  ff(1),  fstat(8),
+     fuser(1), gethostname(2), isprint(3), kill(1), localtime(3),
+     lstat(2),  modload(8),  mount(8),  netstat(1),   ofiles(8L),
+     perl(1),    ps(1),   readlink(2),   setlocale(3),   stat(2),
+     strftime(3), time(2), uname(1).
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+SunOS 5.9          Last change: Revision-4.85                  59
+
+
+
diff --git a/lsof_4.85/lsof_4.85_src/lsof_fields.h b/lsof_4.85/lsof_4.85_src/lsof_fields.h
new file mode 100644
index 0000000..bcd3505
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/lsof_fields.h
@@ -0,0 +1,180 @@
+/*
+ * lsof_field.sh - field ID characters for lsof output that can be parsed
+ *		   (selected with -f or -F)
+ */
+
+
+/*
+ * 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: lsof_fields.h,v 1.12 2010/07/29 15:59:28 abe Exp $
+ */
+
+
+#if	!defined(LSOF_FORMAT_H)
+#define	LSOF_FORMAT_H	1
+
+/*
+ * Codes for output fields:
+ *
+ *	LSOF_FID_*	ID character
+ *	LSOF_FIX_*	ID index
+ *	LSOF_FNM_*	name
+ *
+ * A field is displayed in the form:
+ *		<ID_character><data><field_terminator>
+ *	
+ * Output fields are normally terminated with a NL ('\n'), but the field
+ * terminator can be set to NUL with the -0 (zero) option to lsof.
+ *
+ * Field sets -- process-specific information or information specific
+ * to a single file descriptor -- are terminated with NL when the field
+ * terminator is NUL.
+ */
+
+#define	LSOF_FID_ACCESS		'a'
+#define	LSOF_FIX_ACCESS		0
+#define	LSOF_FNM_ACCESS		"access: r = read; w = write; u = read/write"
+
+#define	LSOF_FID_CMD		'c'
+#define	LSOF_FIX_CMD		1
+#define	LSOF_FNM_CMD		"command name"
+
+#define	LSOF_FID_CT		'C'
+#define	LSOF_FIX_CT		2
+#define	LSOF_FNM_CT		"file struct share count"
+
+#define	LSOF_FID_DEVCH		'd'
+#define	LSOF_FIX_DEVCH		3
+#define	LSOF_FNM_DEVCH		"device character code"
+
+#define	LSOF_FID_DEVN		'D'
+#define	LSOF_FIX_DEVN		4
+#define	LSOF_FNM_DEVN		"major/minor device number as 0x<hex>"
+
+#define	LSOF_FID_FD		'f'
+#define	LSOF_FIX_FD		5
+#define	LSOF_FNM_FD		"file descriptor"
+
+#define	LSOF_FID_FA		'F'
+#define	LSOF_FIX_FA		6
+#define	LSOF_FNM_FA		"file struct address as 0x<hex>"
+
+#define	LSOF_FID_FG		'G'
+#define	LSOF_FIX_FG		7
+#define	LSOF_FNM_FG		"file flaGs"
+
+#define	LSOF_FID_INODE		'i'
+#define	LSOF_FIX_INODE		8
+#define	LSOF_FNM_INODE		"inode number"
+
+#define	LSOF_FID_NLINK		'k'
+#define	LSOF_FIX_NLINK		9
+#define	LSOF_FNM_NLINK		"link count"
+
+#define	LSOF_FID_TID		'K'
+#define	LSOF_FIX_TID		10
+#define	LSOF_FNM_TID		"task ID (TID)"
+
+#define	LSOF_FID_LOCK		'l'
+#define	LSOF_FIX_LOCK		11
+#define	LSOF_FNM_LOCK		"lock: r/R = read; w/W = write; u = read/write"
+
+#define	LSOF_FID_LOGIN		'L'
+#define	LSOF_FIX_LOGIN		12
+#define	LSOF_FNM_LOGIN		"login name"
+
+#define	LSOF_FID_MARK		'm'
+#define	LSOF_FIX_MARK		13
+#define	LSOF_FNM_MARK		"marker between repeated output"
+
+#define	LSOF_FID_NAME		'n'
+#define	LSOF_FIX_NAME		14
+#define	LSOF_FNM_NAME		"comment, name, Internet addresses"
+
+#define	LSOF_FID_NI		'N'
+#define	LSOF_FIX_NI		15
+#define	LSOF_FNM_NI		"file struct node ID as 0x<hex>"
+
+#define	LSOF_FID_OFFSET		'o'
+#define	LSOF_FIX_OFFSET		16
+#define	LSOF_FNM_OFFSET		"file offset as 0t<dec> or 0x<hex>"
+
+#define	LSOF_FID_PID		'p'
+#define	LSOF_FIX_PID		17
+#define	LSOF_FNM_PID		"process ID (PID)"
+
+#define	LSOF_FID_PGID		'g'
+#define	LSOF_FIX_PGID		18
+#define	LSOF_FNM_PGID		"process group ID (PGID)"
+
+#define	LSOF_FID_PROTO		'P'
+#define	LSOF_FIX_PROTO		19
+#define	LSOF_FNM_PROTO		"protocol name"
+
+#define	LSOF_FID_RDEV		'r'
+#define	LSOF_FIX_RDEV		20
+#define	LSOF_FNM_RDEV		"raw device number as 0x<hex>"
+
+#define	LSOF_FID_PPID		'R'
+#define	LSOF_FIX_PPID		21
+#define	LSOF_FNM_PPID		"paRent PID"
+
+#define	LSOF_FID_SIZE		's'
+#define	LSOF_FIX_SIZE		22
+#define	LSOF_FNM_SIZE		"file size"
+
+#define	LSOF_FID_STREAM		'S'
+#define	LSOF_FIX_STREAM		23
+#define	LSOF_FNM_STREAM		"stream module and device names"
+
+#define	LSOF_FID_TYPE		't'
+#define	LSOF_FIX_TYPE		24
+#define	LSOF_FNM_TYPE		"file type"
+
+#define	LSOF_FID_TCPTPI		'T'
+#define	LSOF_FIX_TCPTPI		25
+#define	LSOF_FNM_TCPTPI		"TCP/TPI info"
+
+#define	LSOF_FID_UID		'u'
+#define	LSOF_FIX_UID		26
+#define	LSOF_FNM_UID		"user ID (UID)"
+
+#define	LSOF_FID_ZONE		'z'
+#define	LSOF_FIX_ZONE		27
+#define	LSOF_FNM_ZONE		"zone name"
+
+#define	LSOF_FID_CNTX		'Z'
+#define	LSOF_FIX_CNTX		28
+#define	LSOF_FNM_CNTX		"security context"
+
+#define	LSOF_FID_TERM		'0'
+#define	LSOF_FIX_TERM		29
+#define	LSOF_FNM_TERM		"(zero) use NUL field terminator instead of NL"
+
+#endif	/* !defined(LSOF_FORMAT_H) */
diff --git a/lsof_4.85/lsof_4.85_src/main.c b/lsof_4.85/lsof_4.85_src/main.c
new file mode 100644
index 0000000..e2164d3
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/main.c
@@ -0,0 +1,1765 @@
+/*
+ * main.c - common main function for lsof
+ *
+ * V. Abell, Purdue University
+ */
+
+
+/*
+ * 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: main.c,v 1.55 2011/09/07 19:13:49 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions
+ */
+
+static int GObk[] = { 1, 1 };		/* option backspace values */
+static char GOp;			/* option prefix -- '+' or '-' */
+static char *GOv = (char *)NULL;	/* option `:' value pointer */
+static int GOx1 = 1;			/* first opt[][] index */
+static int GOx2 = 0;			/* second opt[][] index */
+
+
+_PROTOTYPE(static int GetOpt,(int ct, char *opt[], char *rules, int *err));
+_PROTOTYPE(static char *sv_fmt_str,(char *f));
+
+
+/*
+ * main() - main function for lsof
+ */
+
+int
+main(argc, argv)
+	int argc;
+	char *argv[];
+{
+	int ad, c, i, n, rv, se1, se2, ss;
+	char *cp;
+	int err = 0;
+	int ev = 0;
+	int fh = 0;
+	char *fmtr = (char *)NULL;
+	long l;
+	MALLOC_S len;
+	struct lfile *lf;
+	struct nwad *np, *npn;
+	char options[128];
+	int rc = 0;
+	struct stat sb;
+	struct sfile *sfp;
+	struct lproc **slp = (struct lproc **)NULL;
+	int sp = 0;
+	struct str_lst *str, *strt;
+	int version = 0;
+	int xover = 0;
+
+#if	defined(HAS_STRFTIME)
+	char *fmt = (char *)NULL;
+	size_t fmtl;
+#endif	/* defined(HAS_STRFTIME) */
+
+#if	defined(HASZONES)
+	znhash_t *zp;
+#endif	/* defined(HASZONES) */
+
+#if	defined(HASSELINUX)
+/*
+ * This stanza must be immediately before the "Save progam name." code, since
+ * it contains code itself.
+ */
+	cntxlist_t *cntxp;
+
+	CntxStatus = is_selinux_enabled() ? 1 : 0;
+#endif	/* defined(HASSELINUX) */
+
+/*
+ * Save program name.
+ */
+	if ((Pn = strrchr(argv[0], '/')))
+	    Pn++;
+	else
+	    Pn = argv[0];
+/*
+ * Close all file descriptors above 2.
+ *
+ * Make sure stderr, stdout, and stdin are open descriptors.  Open /dev/null
+ * for ones that aren't.  Be terse.
+ *
+ * Make sure umask allows lsof to define its own file permissions.
+ */
+	for (i = 3, n = GET_MAX_FD(); i < n; i++)
+	    (void) close(i);
+	while (((i = open("/dev/null", O_RDWR, 0)) >= 0) && (i < 2))
+	    ;
+	if (i < 0)
+	    Exit(1);
+	if (i > 2)
+	    (void) close(i);
+	(void) umask(0);
+
+#if	defined(HASSETLOCALE)
+/*
+ * Set locale to environment's definition.
+ */
+	(void) setlocale(LC_CTYPE, "");
+#endif	/* defined(HASSETLOCALE) */
+
+/*
+ * Common initialization.
+ */
+	Mypid = getpid();
+	if ((Mygid = (gid_t)getgid()) != getegid())
+	    Setgid = 1;
+	Euid = geteuid();
+	if ((Myuid = (uid_t)getuid()) && !Euid)
+	    Setuidroot = 1;
+	if (!(Namech = (char *)malloc(MAXPATHLEN + 1))) {
+	    (void) fprintf(stderr, "%s: no space for name buffer\n", Pn);
+	    Exit(1);
+	}
+	Namechl = (size_t)(MAXPATHLEN + 1);
+/*
+ * Create option mask.
+ */
+	(void) snpf(options, sizeof(options),
+	    "?a%sbc:%sD:d:%sf:F:g:hi:%s%slL:%s%snNo:Op:Pr:%ss:S:tT:u:UvVwx:%s%s%s",
+
+#if	defined(HAS_AFS) && defined(HASAOPT)
+	    "A:",
+#else	/* !defined(HAS_AFS) || !defined(HASAOPT) */
+	    "",
+#endif	/* defined(HAS_AFS) && defined(HASAOPT) */
+
+#if	defined(HASNCACHE)
+	    "C",
+#else	/* !defined(HASNCACHE) */
+	    "",
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASEOPT)
+	    "e:",
+#else	/* !defined(HASEOPT) */
+	    "",
+#endif	/* defined(HASEOPT) */
+
+#if	defined(HASKOPT)
+	    "k:",
+#else	/* !defined(HASKOPT) */
+	    "",
+#endif	/* defined(HASKOPT) */
+
+#if	defined(HASTASKS)
+	    "K",
+#else	/* !defined(HASTASKS) */
+	    "",
+#endif	/* defined(HASTASKS) */
+
+#if	defined(HASMOPT) || defined(HASMNTSUP)
+	    "m:",
+#else	/* !defined(HASMOPT) && !defined(HASMNTSUP) */
+	    "",
+#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */
+
+#if	defined(HASNORPC_H)
+	    "",
+#else	/* !defined(HASNORPC_H) */
+	    "M",
+#endif	/* defined(HASNORPC_H) */
+
+#if	defined(HASPPID)
+	    "R",
+#else	/* !defined(HASPPID) */
+	    "",
+#endif	/* defined(HASPPID) */
+
+#if	defined(HASXOPT)
+# if	defined(HASXOPT_ROOT)
+	    (Myuid == 0) ? "X" : "",
+# else	/* !defined(HASXOPT_ROOT) */
+	    "X",
+# endif	/* defined(HASXOPT_ROOT) */
+#else	/* !defined(HASXOPT) */
+	    "",
+#endif	/* defined(HASXOPT) */
+
+#if	defined(HASZONES)
+	    "z:",
+#else	/* !defined(HASZONES) */
+	    "",
+#endif	/* defined(HASZONES) */
+ 
+#if	defined(HASSELINUX)
+	    "Z:"
+#else	/* !defined(HASSELINUX) */
+	    ""
+#endif	/* defined(HASSELINUX) */
+
+	    );
+/*
+ * Loop through options.
+ */
+	while ((c = GetOpt(argc, argv, options, &rv)) != EOF) {
+	    if (rv) {
+		err = 1;
+		continue;
+	    }
+	    switch (c) {
+	    case 'a':
+		Fand = 1;
+		break;
+
+#if	defined(HAS_AFS) && defined(HASAOPT)
+	    case 'A':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    (void) fprintf(stderr, "%s: -A not followed by path\n", Pn);
+		    err = 1;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		} else
+		    AFSApath = GOv;
+		break;
+#endif	/* defined(HAS_AFS) && defined(HASAOPT) */
+
+	    case 'b':
+		Fblock = 1;
+		break;
+	    case 'c':
+		if (GOp == '+') {
+		    if (!GOv || (*GOv == '-') || (*GOv == '+')
+		    ||  !isdigit((int)*GOv))
+		    {
+			(void) fprintf(stderr,
+			    "%s: +c not followed by width number\n", Pn);
+			err = 1;
+			if (GOv) {
+			    GOx1 = GObk[0];
+			    GOx2 = GObk[1];
+			}
+		    } else {
+			CmdLim = atoi(GOv);
+
+#if	defined(MAXSYSCMDL)
+			if (CmdLim > MAXSYSCMDL) {
+			    (void) fprintf(stderr,
+				"%s: +c %d > what system provides (%d)\n",
+				Pn, CmdLim, MAXSYSCMDL);
+			    err = 1;
+			}
+#endif	/* defined(MAXSYSCMDL) */
+
+		    }
+		    break;
+		}
+		if (GOv && (*GOv == '/')) {
+		    if (enter_cmd_rx(GOv))
+			err = 1;
+		} else {
+		    if (enter_str_lst("-c", GOv, &Cmdl, &Cmdni, &Cmdnx))
+			err = 1;
+
+#if	defined(MAXSYSCMDL)
+		    else if (Cmdl->len > MAXSYSCMDL) {
+			(void) fprintf(stderr, "%s: \"-c ", Pn);
+			(void) safestrprt(Cmdl->str, stderr, 2);
+			(void) fprintf(stderr, "\" length (%d) > what system",
+			    Cmdl->len);
+			(void) fprintf(stderr, " provides (%d)\n",
+			    MAXSYSCMDL);
+			Cmdl->len = 0;	/* (to avoid later error report) */
+			err = 1;
+		    }
+#endif	/* defined(MAXSYSCMDL) */
+
+		}
+		break;
+
+#if	defined(HASNCACHE)
+	    case 'C':
+		Fncache = (GOp == '-') ? 0 : 1;
+		break;
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASEOPT)
+	    case 'e':
+		if (enter_efsys(GOv, ((GOp == '+') ? 1 : 0)))
+		    err = 1;
+		break;
+#endif	/* defined(HASEOPT) */
+
+	    case 'd':
+		if (GOp == '+') {
+		    if (enter_dir(GOv, 0))
+			err = 1;
+		    else {
+			Selflags |= SELNM;
+			xover = 1;
+		    }
+		} else {
+		    if (enter_fd(GOv))
+			err = 1;
+		}
+		break;
+	    case 'D':
+		if (GOp == '+') {
+		    if (enter_dir(GOv, 1))
+			err = 1;
+		    else {
+			Selflags |= SELNM;
+			xover = 1;
+		    }
+		} else {
+
+#if	defined(HASDCACHE)
+		    if (ctrl_dcache(GOv))
+			err = 1;
+#else	/* !defined(HASDCACHE) */
+		    (void) fprintf(stderr, "%s: unsupported option: -D\n", Pn);
+		    err = 1;
+#endif	/* defined(HASDCACHE) */
+
+		}
+		break;
+	    case 'f':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Ffilesys = (GOp == '+') ? 2 : 1;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+
+#if	defined(HASFSTRUCT)
+		for (; *GOv; GOv++) {
+		    switch (*GOv) {
+
+# if	!defined(HASNOFSCOUNT)
+		    case 'c':
+		    case 'C':
+			if (GOp == '+') {
+			    Fsv |= FSV_CT;
+			    FsvByf = 1;
+			} else
+			    Fsv &= (unsigned char)~FSV_CT;
+			break;
+# endif	/* !defined(HASNOFSCOUNT) */
+
+# if	!defined(HASNOFSADDR)
+		    case 'f':
+		    case 'F':
+			if (GOp == '+') {
+			    Fsv |= FSV_FA;
+			    FsvByf = 1;
+			} else
+			    Fsv &= (unsigned char)~FSV_FA;
+			break;
+# endif	/* !defined(HASNOFSADDR) */
+
+# if	!defined(HASNOFSFLAGS)
+		    case 'g':
+		    case 'G':
+			if (GOp == '+') {
+			    Fsv |= FSV_FG;
+			    FsvByf = 1;
+			} else
+			    Fsv &= (unsigned char)~FSV_FG;
+			FsvFlagX = (*GOv == 'G') ? 1 : 0;
+			break;
+# endif	/* !defined(HASNOFSFLAGS) */
+
+# if	!defined(HASNOFSNADDR)
+		    case 'n':
+		    case 'N':
+			if (GOp == '+') {
+			    Fsv |= FSV_NI;
+			    FsvByf = 1;
+			} else
+			    Fsv &= (unsigned char)~FSV_NI;
+			break;
+# endif	/* !defined(HASNOFSNADDR */
+
+		    default:
+			(void) fprintf(stderr,
+			    "%s: unknown file struct option: %c\n", Pn, *GOv);
+			err++;
+		    }
+		}
+#else	/* !defined(HASFSTRUCT) */
+		(void) fprintf(stderr,
+		    "%s: unknown string for %cf: %s\n", Pn, GOp, GOv);
+		err++;
+#endif	/* defined(HASFSTRUCT) */
+
+		break;
+	    case 'F':
+		if (!GOv || *GOv == '-' || *GOv == '+'
+		||  strcmp(GOv, "0") == 0) {
+		    if (GOv) {
+			if (*GOv == '-' || *GOv == '+') {
+			    GOx1 = GObk[0];
+			    GOx2 = GObk[1];
+			} else if (*GOv == '0')
+			    Terminator = '\0';
+		    }
+		    for (i = 0; FieldSel[i].nm; i++) {
+
+#if	!defined(HASPPID)
+			if (FieldSel[i].id == LSOF_FID_PPID)
+			    continue;
+#endif	/* !defined(HASPPID) */
+
+#if	!defined(HASFSTRUCT)
+			if (FieldSel[i].id == LSOF_FID_CT
+			||  FieldSel[i].id == LSOF_FID_FA
+			||  FieldSel[i].id == LSOF_FID_FG
+			||  FieldSel[i].id == LSOF_FID_NI)
+			    continue;
+#endif	/* !defined(HASFSTRUCT) */
+ 
+#if	defined(HASSELINUX)
+			if ((FieldSel[i].id == LSOF_FID_CNTX) && !CntxStatus)
+			    continue;
+#else	/* !defined(HASSELINUX) */
+			if (FieldSel[i].id == LSOF_FID_CNTX)
+			    continue;
+#endif	/* !defined(HASSELINUX) */
+
+			if (FieldSel[i].id == LSOF_FID_RDEV)
+			    continue;	/* for compatibility */
+
+#if	!defined(HASTASKS)
+			if (FieldSel[i].id == LSOF_FID_TID)
+			    continue;
+#endif	/* !defined(HASTASKS) */
+
+#if	!defined(HASZONES)
+			if (FieldSel[i].id == LSOF_FID_ZONE)
+			    continue;
+#endif	/* !defined(HASZONES) */
+
+			FieldSel[i].st = 1;
+			if (FieldSel[i].opt && FieldSel[i].ov)
+			    *(FieldSel[i].opt) |= FieldSel[i].ov;
+		    }
+
+#if	defined(HASFSTRUCT)
+		    Ffield = FsvFlagX = 1;
+#else	/* !defined(HASFSTRUCT) */
+		    Ffield = 1;
+#endif	/* defined(HASFSTRUCT) */
+
+		    break;
+		}
+		if (strcmp(GOv, "?") == 0) {
+		    fh = 1;
+		    break;
+		}
+		for (; *GOv; GOv++) {
+		    for (i = 0; FieldSel[i].nm; i++) {
+
+#if	!defined(HASPPID)
+			if (FieldSel[i].id == LSOF_FID_PPID)
+			    continue;
+#endif	/* !defined(HASPPID) */
+
+#if	!defined(HASFSTRUCT)
+			if (FieldSel[i].id == LSOF_FID_CT
+			||  FieldSel[i].id == LSOF_FID_FA
+			||  FieldSel[i].id == LSOF_FID_FG
+			||  FieldSel[i].id == LSOF_FID_NI)
+			    continue;
+#endif	/* !defined(HASFSTRUCT) */
+
+#if	!defined(HASTASKS)
+			if (FieldSel[i].id == LSOF_FID_TID)
+			    continue;
+#endif	/* !defined(HASTASKS) */
+
+			if (FieldSel[i].id == *GOv) {
+			    FieldSel[i].st = 1;
+			    if (FieldSel[i].opt && FieldSel[i].ov)
+				*(FieldSel[i].opt) |= FieldSel[i].ov;
+
+#if	defined(HASFSTRUCT)
+			    if (i == LSOF_FIX_FG)
+				FsvFlagX = 1;
+#endif	/* defined(HASFSTRUCT) */
+
+			    if (i == LSOF_FIX_TERM)
+				Terminator = '\0';
+			    break;
+			}
+		    }
+		    if ( ! FieldSel[i].nm) {
+			(void) fprintf(stderr,
+			    "%s: unknown field: %c\n", Pn, *GOv);
+			err++;
+		    }
+		}
+		Ffield = 1;
+		break;
+	    case 'g':
+		if (GOv) {
+		    if (*GOv == '-' || *GOv == '+') {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    } else if (enter_id(PGID, GOv))
+			err = 1;
+		}
+		Fpgid = 1;
+		break;
+	    case 'h':
+	    case '?':
+		Fhelp = 1;
+		break;
+	    case 'i':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Fnet = 1;
+		    FnetTy = 0;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+		if (enter_network_address(GOv))
+		    err = 1;
+		break;
+
+#if	defined(HASKOPT)
+	    case 'k':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    (void) fprintf(stderr, "%s: -k not followed by path\n", Pn);
+		    err = 1;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		} else
+		    Nmlst = GOv;
+		break;
+#endif	/* defined(HASKOPT) */
+
+#if	defined(HASTASKS)
+		case 'K':
+		    Ftask = 1;
+		    Selflags |= SELTASK;
+		    break;
+#endif	/* defined(HASTASKS) */
+
+	    case 'l':
+		Futol = 0;
+		break;
+	    case 'L':
+		Fnlink = (GOp == '+') ? 1 : 0;
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Nlink = 0l;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+		for (cp = GOv, l = 0l, n = 0; *cp; cp++) {
+		    if (!isdigit((unsigned char)*cp))
+			break;
+		    l = (l * 10l) + ((long)*cp - (long)'0');
+		    n++;
+		}
+		if (n) {
+		    if (GOp != '+') {
+			(void) fprintf(stderr,
+			    "%s: no number may follow -L\n", Pn);
+			err = 1;
+		    } else {
+			Nlink = l;
+			Selflags |= SELNLINK;
+		    }
+		} else
+		    Nlink = 0l;
+		if (*cp) {
+		    GOx1 = GObk[0];
+		    GOx2 = GObk[1] + n;
+		}
+		break;
+
+#if	defined(HASMOPT) || defined(HASMNTSUP)
+	    case 'm':
+		if (GOp == '-') {
+
+# if	defined(HASMOPT)
+		    if (!GOv || *GOv == '-' || *GOv == '+') {
+			(void) fprintf(stderr,
+			    "%s: -m not followed by path\n", Pn);
+			err = 1;
+			if (GOv) {
+			    GOx1 = GObk[0];
+			    GOx2 = GObk[1];
+			}
+		    } else
+			Memory = GOv;
+# else	/* !defined(HASMOPT) */
+		    (void) fprintf(stderr, "%s: -m not supported\n", Pn);
+		    err = 1;
+# endif	/* defined(HASMOPT) */
+
+		} else if (GOp == '+') {
+
+# if	defined(HASMNTSUP)
+		    if (!GOv || *GOv == '-' || *GOv == '+') {
+			MntSup = 1;
+			if (GOv) {
+			    GOx1 = GObk[0];
+			    GOx2 = GObk[1];
+			}
+		    } else {
+			MntSup = 2;
+			MntSupP = GOv;
+		    }
+# else	/* !defined(HASMNTSUP) */
+		    (void) fprintf(stderr, "%s: +m not supported\n", Pn);
+		    err = 1;
+# endif	/* defined(HASMNTSUP) */
+
+		} else {
+		    (void) fprintf(stderr, "%s: %cm not supported\n", Pn, GOp);
+		    err = 1;
+		}
+		break;
+#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */
+
+#if	!defined(HASNORPC_H)
+	    case 'M':
+		FportMap = (GOp == '+') ? 1 : 0;
+		break;
+#endif	/* !defined(HASNORPC_H) */
+
+	    case 'n':
+		Fhost = (GOp == '-') ? 0 : 1;
+		break;
+	    case 'N':
+		Fnfs = 1;
+		break;
+	    case 'o':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Foffset = 1;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+		for (cp = GOv, i = n = 0; *cp; cp++) {
+		    if (!isdigit((unsigned char)*cp))
+			break;
+		    i = (i * 10) + ((int)*cp - '0');
+		    n++;
+		}
+		if (n)
+		    OffDecDig = i;
+		else
+		    Foffset = 1;
+		if (*cp) {
+		    GOx1 = GObk[0];
+		    GOx2 = GObk[1] + n;
+		}
+		break;
+	    case 'O':
+		Fovhd = (GOp == '-') ? 1 : 0;
+		break;
+	    case 'p':
+		if (enter_id(PID, GOv))
+		    err = 1;
+		break;
+	    case 'P':
+		Fport = (GOp == '-') ? 0 : 1;
+		break;
+	    case 'r':
+		if (GOp == '+')
+		    ev = rc = 1;
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    RptTm = RPTTM;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+		for (cp = GOv, i = n = 0; *cp; cp++) {
+		    if (!isdigit((unsigned char)*cp))
+			break;
+		    i = (i * 10) + ((int)*cp - '0');
+		    n++;
+		}
+		if (n)
+		    RptTm = i;
+		else
+		    RptTm = RPTTM;
+		if (!*cp)
+		     break;
+		while(*cp && (*cp == ' '))
+		    cp++;
+		if (*cp != LSOF_FID_MARK) {
+		    GOx1 = GObk[0];
+		    GOx2 = GObk[1] + n;
+		    break;
+		}
+
+#if	defined(HAS_STRFTIME)
+
+	    /*
+	     * Collect the strftime(3) format and test it.
+	     */
+		cp++;
+		if ((fmtl = strlen(cp) + 1) < 1) {
+		    (void) fprintf(stderr, "%s: <fmt> too short: \"%s\"\n",
+			Pn, cp);
+		    err = 1;
+		} else {
+		    fmt = cp;
+		    fmtl = (fmtl * 8) + 1;
+		    if (!(fmtr = (char *)malloc((MALLOC_S)fmtl))) {
+			(void) fprintf(stderr,
+			    "%s: no space (%d) for <fmt> result: \"%s\"\n",
+			    Pn, (int)fmtl, cp);
+			    Exit(1);
+		    }
+		    if (util_strftime(fmtr, fmtl - 1, fmt) < 1) {
+			(void) fprintf(stderr, "%s: illegal <fmt>: \"%s\"\n",
+			    Pn, fmt);
+			err = 1;
+		    }
+		}
+
+#else	/* !defined(HAS_STRFTIME) */
+		(void) fprintf(stderr, "%s: m<fmt> not supported: \"%s\"\n",
+		    Pn, cp);
+		err = 1;
+#endif	/* defined(HAS_STRFTIME) */
+
+		break;
+
+#if	defined(HASPPID)
+	    case 'R':
+		Fppid = 1;
+		break;
+#endif	/* defined(HASPPID) */
+
+	    case 's':
+
+#if	defined(HASTCPUDPSTATE)
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Fsize = 1;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		} else {
+		    if (enter_state_spec(GOv))
+			err = 1;
+		}
+#else	/* !defined(HASTCPUDPSTATE) */
+		Fsize = 1;
+#endif	/* defined(HASTCPUDPSTATE) */
+
+		break;
+	    case 'S':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    TmLimit = TMLIMIT;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+		for (cp = GOv, i = n = 0; *cp; cp++) {
+		    if (!isdigit((unsigned char)*cp))
+			break;
+		    i = (i * 10) + ((int)*cp - '0');
+		    n++;
+		}
+		if (n)
+		    TmLimit = i;
+		else
+		    TmLimit = TMLIMIT;
+		if (*cp) {
+		    GOx1 = GObk[0];
+		    GOx2 = GObk[1] + n;
+		}
+		if (TmLimit < TMLIMMIN) {
+		    (void) fprintf(stderr,
+			"%s: WARNING: -S time (%d) changed to %d\n",
+			Pn, TmLimit, TMLIMMIN);
+		    TmLimit = TMLIMMIN;
+		}
+		break;
+	    case 't':
+		Fterse = Fwarn = 1;
+		break;
+	    case 'T':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Ftcptpi = (GOp == '-') ? 0 : TCPTPI_STATE;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		}
+		for (Ftcptpi = 0; *GOv; GOv++) {
+		    switch (*GOv) {
+
+#if	defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
+		    case 'f':
+			Ftcptpi |= TCPTPI_FLAGS;
+			break;
+#endif	/* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT) */
+
+#if	defined(HASTCPTPIQ)
+		    case 'q':
+			Ftcptpi |= TCPTPI_QUEUES;
+			break;
+#endif	/* defined(HASTCPTPIQ) */
+
+		    case 's':
+			Ftcptpi |= TCPTPI_STATE;
+			break;
+
+#if	defined(HASTCPTPIW)
+		    case 'w':
+			Ftcptpi |= TCPTPI_WINDOWS;
+			break;
+#endif	/* defined(HASTCPTPIW) */
+
+		    default:
+			(void) fprintf(stderr,
+			"%s: unsupported TCP/TPI info selection: %c\n",
+			    Pn, *GOv);
+			err = 1;
+		    }
+		}
+		break;
+	    case 'u':
+		if (enter_uid(GOv))
+		    err = 1;
+		break;
+	    case 'U':
+		Funix = 1;
+		break;
+	    case 'v':
+		version = 1;
+		break;
+	    case 'V':
+		Fverbose = 1;
+		break;
+	    case 'w':
+		Fwarn = (GOp == '+') ? 0 : 1;
+		break;
+	    case 'x':
+		if (!GOv || *GOv == '-' || *GOv == '+') {
+		    Fxover = XO_ALL;
+		    if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		    break;
+		} else {
+		    for (; *GOv; GOv++) {
+			switch (*GOv) {
+			case 'f':
+			    Fxover |= XO_FILESYS;
+			    break;
+			case 'l':
+			    Fxover |= XO_SYMLINK;
+			    break;
+			default:
+			    (void) fprintf(stderr,
+				"%s: unknown cross-over option: %c\n",
+				Pn, *GOv);
+			    err++;
+			}
+		    }
+		}
+		break;
+
+#if	defined(HASXOPT)
+	    case 'X':
+		Fxopt = Fxopt ? 0 : 1;
+		break;
+#endif	/* defined(HASXOPT) */
+
+#if	defined(HASZONES)
+	    case 'z':
+		Fzone = 1;
+		if (GOv && (*GOv != '-') && (*GOv != '+')) {
+
+		/*
+		 * Add to the zone name argument hash.
+		 */
+		    if (enter_zone_arg(GOv))
+			err = 1;
+		} else if (GOv) {
+		    GOx1 = GObk[0];
+		    GOx2 = GObk[1];
+		}
+		break;
+#endif	/* defined(HASZONES) */
+ 
+#if	defined(HASSELINUX)
+	    case 'Z':
+		if (!CntxStatus) {
+		   (void) fprintf(stderr, "%s: -Z limited to SELinux\n", Pn);
+		    err = 1;
+		} else {
+		    Fcntx = 1;
+		    if (GOv && (*GOv != '-') && (*GOv != '+')) {
+
+		    /*
+		     * Add to the context name argument hash.
+		     */
+			if (enter_cntx_arg(GOv))
+			    err = 1;
+		    } else if (GOv) {
+			GOx1 = GObk[0];
+			GOx2 = GObk[1];
+		    }
+		}
+		break;
+#endif	/* defined(HASSELINUX) */
+
+	    default:
+		(void) fprintf(stderr, "%s: unknown option (%c)\n", Pn, c);
+		err = 1;
+	    }
+	}
+/*
+ * Check for argument consistency.
+ */
+	if (Cmdnx && Cmdni) {
+
+	/*
+	 * Check for command inclusion/exclusion conflicts.
+	 */
+	    for (str = Cmdl; str; str = str->next) {
+		if (str->x) {
+		    for (strt = Cmdl; strt; strt = strt->next) {
+			if (!strt->x) {
+			    if (!strcmp(str->str, strt->str)) {
+				(void) fprintf(stderr,
+				    "%s: -c^%s and -c%s conflict.\n",
+				    Pn, str->str, strt->str);
+				err++;
+			    }
+			}
+		    }
+		}
+	    }
+	}
+
+#if	defined(HASTCPUDPSTATE)
+	if (TcpStXn && TcpStIn) {
+
+	/*
+	 * Check for excluded and included TCP states.
+	 */
+	    for (i = 0; i < TcpNstates; i++) {
+		if (TcpStX[i] && TcpStI[i]) {
+		    (void) fprintf(stderr,
+			"%s: can't include and exclude TCP state: %s\n",
+			Pn, TcpSt[i]);
+		    err = 1;
+		}
+	    }
+	}
+	if (UdpStXn && UdpStIn) {
+
+	/*
+	 * Check for excluded and included UDP states.
+	 */
+	    for (i = 0; i < UdpNstates; i++) {
+		if (UdpStX[i] && UdpStI[i]) {
+		    (void) fprintf(stderr,
+			"%s: can't include and exclude UDP state: %s\n",
+			Pn, UdpSt[i]);
+		    err = 1;
+		}
+	    }
+	}
+#endif	/* defined(HASTCPUDPSTATE) */
+
+	if (Fsize && Foffset) {
+	    (void) fprintf(stderr, "%s: -o and -s are mutually exclusive\n",
+		Pn);
+	    err++;
+	}
+	if (Ffield) {
+	    if (Fterse) {
+		(void) fprintf(stderr,
+		    "%s: -F and -t are mutually exclusive\n", Pn);
+		err++;
+	    }
+	    FieldSel[LSOF_FIX_PID].st = 1;
+
+#if	defined(HAS_STRFTIME)
+	    if (fmtr) {
+
+	    /*
+	     * The field output marker format can't contain "%n" new line
+	     * requests.
+	     */
+		for (cp = strchr(fmt, '%'); cp; cp = strchr(cp, '%')) {
+		    if (*++cp  == 'n') {
+			(void) fprintf(stderr,
+			    "%s: %%n illegal in -r m<fmt> when -F has", Pn);
+			(void) fprintf(stderr,
+			    " been specified: \"%s\"\n", fmt);
+			err++;
+			break;
+		    } else if (*cp == '%')
+			cp++;
+		}
+	    }
+#endif	/* defined(HAS_STRFTIME) */
+
+	}
+	if (Fxover && !xover) {
+	    (void) fprintf(stderr, "%s: -x must accompany +d or +D\n", Pn);
+	    err++;
+	}
+
+#if	defined(HASEOPT)
+	if (Efsysl) {
+
+	/*
+	 * If there are file systems specified by -e options, check them.
+	 */
+	    efsys_list_t *ep;		/* Efsysl pointer */
+	    struct mounts *mp, *mpw;	/* local mount table pointers */
+
+	    if ((mp = readmnt())) {
+		for (ep = Efsysl; ep; ep = ep->next) {
+		    for (mpw = mp; mpw; mpw = mpw->next) {
+			if (!strcmp(mpw->dir, ep->path)) {
+			    ep->mp = mpw;
+			    break;
+			}
+		    }
+		    if (!ep->mp) {
+			(void) fprintf(stderr,
+			    "%s: \"-e %s\" is not a mounted file system.\n",
+			    Pn, ep->path);
+			err++;
+		    }
+		}
+	    }
+	}
+#endif	/* defined(HASEOPT) */
+
+	if (DChelp || err || Fhelp || fh || version)
+	    usage(err ? 1 : 0, fh, version);
+/*
+ * Reduce the size of Suid[], if necessary.
+ */
+	if (Suid && Nuid && Nuid < Mxuid) {
+	    if (!(Suid = (struct seluid *)realloc((MALLOC_P *)Suid,
+			 (MALLOC_S)(sizeof(struct seluid) * Nuid))))
+	    {
+		(void) fprintf(stderr, "%s: can't realloc UID table\n", Pn);
+		Exit(1);
+	    }
+	    Mxuid = Nuid;
+	}
+/*
+ * Compute the selection flags.
+ */
+	if ((Cmdl && Cmdni) || CmdRx)
+	    Selflags |= SELCMD;
+ 
+#if	defined(HASSELINUX)
+	if (CntxArg)
+	    Selflags |= SELCNTX;
+#endif	/* defined(HASSELINUX) */
+
+	if (Fdl)
+	    Selflags |= SELFD;
+	if (Fnet)
+	    Selflags |= SELNET;
+	if (Fnfs)
+	    Selflags |= SELNFS;
+	if (Funix)
+	    Selflags |= SELUNX;
+	if (Npgid && Npgidi)
+	    Selflags |= SELPGID;
+	if (Npid && Npidi)
+	    Selflags |= SELPID;
+	if (Nuid && Nuidincl)
+	    Selflags |= SELUID;
+	if (Nwad)
+	    Selflags |= SELNA;
+
+#if	defined(HASZONES)
+	if (ZoneArg)
+	    Selflags |= SELZONE;
+#endif	/* defined(HASZONES) */
+
+	if (GOx1 < argc)
+	    Selflags |= SELNM;
+	if (Selflags == 0) {
+	    if (Fand) {
+		(void) fprintf(stderr,
+		    "%s: no select options to AND via -a\n", Pn);
+		usage(1, 0, 0);
+	    }
+	    Selflags = SELALL;
+	} else {
+	    if (GOx1 >= argc && (Selflags & (SELNA|SELNET)) != 0
+	    &&  (Selflags & ~(SELNA|SELNET)) == 0)
+		Selinet = 1;
+	    Selall = 0;
+	}
+/*
+ * Get the device for DEVDEV_PATH.
+ */
+	if (stat(DEVDEV_PATH, &sb)) {
+	    se1 = errno;
+ 	    if ((ad = strcmp(DEVDEV_PATH, "/dev"))) {
+		if ((ss = stat("/dev", &sb)))
+		    se2 = errno;
+		else
+		    se2 = 0;
+	    } else {
+		se2 = 0;
+		ss = 1;
+	    }
+	    if (ss) {
+		(void) fprintf(stderr, "%s: can't stat(%s): %s\n", Pn,
+		    DEVDEV_PATH, strerror(se1));
+		if (ad) {
+		    (void) fprintf(stderr, "%s: can't stat(/dev): %s\n", Pn,
+		    strerror(se2));
+		}
+		Exit(1);
+	    }
+	}
+	DevDev = sb.st_dev;
+/*
+ * Process the file arguments.
+ */
+	if (GOx1 < argc) {
+	    if (ck_file_arg(GOx1, argc, argv, Ffilesys, 0, (struct stat *)NULL))
+		usage(1, 0, 0);
+	}
+/*
+ * Do dialect-specific initialization.
+ */
+	initialize();
+	if (Sfile)
+	    (void) hashSfile();
+
+#if	defined(WILLDROPGID)
+/*
+ * If this process isn't setuid(root), but it is setgid(not_real_gid),
+ * relinquish the setgid power.  (If it hasn't already been done.)
+ */
+	(void) dropgid();
+#endif	/* defined(WILLDROPGID) */
+
+
+#if	defined(HASDCACHE)
+/*
+ * If there is a device cache, prepare the device table.
+ */
+	if (DCstate)
+	    readdev(0);
+#endif	/* defined(HASDCACHE) */
+
+/*
+ * Define the size and offset print formats.
+ */
+	(void) snpf(options, sizeof(options), "%%%su", INODEPSPEC);
+	InodeFmt_d = sv_fmt_str(options);
+	(void) snpf(options, sizeof(options), "%%#%sx", INODEPSPEC);
+	InodeFmt_x = sv_fmt_str(options);
+	(void) snpf(options, sizeof(options), "0t%%%su", SZOFFPSPEC);
+	SzOffFmt_0t = sv_fmt_str(options);
+	(void) snpf(options, sizeof(options), "%%%su", SZOFFPSPEC);
+	SzOffFmt_d = sv_fmt_str(options);
+	(void) snpf(options, sizeof(options), "%%*%su", SZOFFPSPEC);
+	SzOffFmt_dv = sv_fmt_str(options);
+	(void) snpf(options, sizeof(options), "%%#%sx", SZOFFPSPEC);
+	SzOffFmt_x = sv_fmt_str(options);
+
+#if	defined(HASMNTSUP)
+/*
+ * Report mount supplement information, as requested.
+ */
+	if (MntSup == 1) {
+	    (void) readmnt();
+	    Exit(0);
+	}
+#endif	/* defined(HASMNTSUP) */
+
+/*
+ * Gather and report process information every RptTm seconds.
+ */
+	if (RptTm)
+	    CkPasswd = 1;
+	do {
+
+	/*
+	 * Gather information about processes.
+	 */
+	    gather_proc_info();
+	/*
+	 * If the local process table has more than one entry, sort it by PID.
+	 */
+	    if (Nlproc > 1) {
+		if (Nlproc > sp) {
+		    len = (MALLOC_S)(Nlproc * sizeof(struct lproc *));
+		    sp = Nlproc;
+		    if (!slp)
+			slp = (struct lproc **)malloc(len);
+		    else
+			slp = (struct lproc **)realloc((MALLOC_P *)slp, len);
+		    if (!slp) {
+			(void) fprintf(stderr,
+			    "%s: no space for %d sort pointers\n", Pn, Nlproc);
+			Exit(1);
+		    }
+		}
+		for (i = 0; i < Nlproc; i++) {
+		    slp[i] = &Lproc[i];
+		}
+		(void) qsort((QSORT_P *)slp, (size_t)Nlproc,
+			     (size_t)sizeof(struct lproc *), comppid);
+	    }
+	    if ((n = Nlproc)) {
+
+#if	defined(HASNCACHE)
+	    /*
+	     * If using the kernel name cache, force its reloading.
+	     */
+		NcacheReload = 1;
+#endif	/* defined(HASNCACHE) */
+
+	    /*
+	     * Print the selected processes and count them.
+	     *
+	     * Lf contents must be preserved, since they may point to a
+	     * malloc()'d area, and since Lf is used throughout the print
+	     * process.
+	     */
+		for (lf = Lf, print_init(); PrPass < 2; PrPass++) {
+		    for (i = n = 0; i < Nlproc; i++) {
+			Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
+			if (Lp->pss) {
+			    if (print_proc())
+				n++;
+			}
+			if (RptTm && PrPass)
+			    (void) free_lproc(Lp);
+		    }
+		}
+		Lf = lf;
+	    }
+	/*
+	 * If a repeat time is set, sleep for the specified time.
+	 *
+	 * If conditional repeat mode is in effect, see if it's time to exit.
+	 */
+	    if (RptTm) {
+		if (rc) {
+		    if (!n)
+			break;
+		    else
+			ev = 0;
+		}
+
+#if	defined(HAS_STRFTIME)
+		if (fmt && fmtr) {
+
+		/*
+		 * Format the marker line.
+		 */
+		    (void) util_strftime(fmtr, fmtl - 1, fmt);
+		    fmtr[fmtl - 1] = '\0';
+		}
+#endif	/* defined(HAS_STRFTIME) */
+
+		if (Ffield) {
+		    putchar(LSOF_FID_MARK);
+
+#if	defined(HAS_STRFTIME)
+		    if (fmtr)
+	    	        (void) printf("%s", fmtr);
+#endif	/* defined(HAS_STRFTIME) */
+
+		    putchar(Terminator);
+		    if (Terminator != '\n')
+			putchar('\n');
+		} else {
+
+#if	defined(HAS_STRFTIME)
+		    if (fmtr)
+			cp = fmtr;
+		    else
+#endif	/* defined(HAS_STRFTIME) */
+
+			cp = "=======";
+		    puts(cp);
+		}
+		(void) fflush(stdout);
+		(void) childx();
+		(void) sleep(RptTm);
+		Hdr = Nlproc = 0;
+		CkPasswd = 1;
+	    }
+	} while (RptTm);
+/*
+ * See if all requested information was displayed.  Return zero if it
+ * was; one, if not.  If -V was specified, report what was not displayed.
+ */
+	(void) childx();
+	rv = 0;
+	for (str = Cmdl; str; str = str->next) {
+
+	/*
+	 * Check command specifications.
+	 */
+	    if (str->f)
+		continue;
+	    rv = 1;
+	    if (Fverbose) {
+		(void) printf("%s: command not located: ", Pn);
+		safestrprt(str->str, stdout, 1);
+	    }
+	}
+	for (i = 0; i < NCmdRxU; i++) {
+	
+	/*
+	 * Check command regular expressions.
+	 */
+	    if (CmdRx[i].mc)
+		continue;
+	    rv = 1;
+	    if (Fverbose) {
+		(void) printf("%s: no command found for regex: ", Pn);
+		safestrprt(CmdRx[i].exp, stdout, 1);
+	    }
+	}
+	for (sfp = Sfile; sfp; sfp = sfp->next) {
+
+	/*
+	 * Check file specifications.
+	 */
+	    if (sfp->f)
+		continue;
+	    rv = 1;
+	    if (Fverbose) {
+		(void) printf("%s: no file%s use located: ", Pn,
+		    sfp->type ? "" : " system");
+		safestrprt(sfp->aname, stdout, 1);
+	    }
+	}
+
+#if	defined(HASPROCFS)
+	/*
+	 * Report on proc file system search results.
+	 */
+	    if (Procsrch && !Procfind) {
+		rv = 1;
+		if (Fverbose) {
+		    (void) printf("%s: no file system use located: ", Pn);
+		    safestrprt(Mtprocfs ? Mtprocfs->dir : HASPROCFS, stdout, 1);
+		}
+	    }
+	    {
+		struct procfsid *pfi;
+
+		for (pfi = Procfsid; pfi; pfi = pfi->next) {
+		    if (!pfi->f) {
+			rv = 1;
+			if (Fverbose) {
+			    (void) printf("%s: no file use located: ", Pn);
+			    safestrprt(pfi->nm, stdout, 1);
+			}
+		    }
+		}
+	    }
+#endif	/* defined(HASPROCFS) */
+
+	if ((np = Nwad)) {
+
+	/*
+	 * Check Internet address specifications.
+	 *
+	 * If any Internet address derived from the same argument was found,
+	 * consider all derivations found.  If no derivation from the same
+	 * argument was found, report only the first failure.
+	 *
+	 */
+	    for (; np; np = np->next) {
+		if (!(cp = np->arg))
+		    continue;
+		for (npn = np->next; npn; npn = npn->next) {
+		    if (!npn->arg)
+			continue;
+		    if (!strcmp(cp, npn->arg)) {
+
+		    /*
+		     * If either of the duplicate specifications was found,
+		     * mark them both found.  If neither was found, mark all
+		     * but the first one found.
+		     */
+			if (np->f)
+			    npn->f = np->f;
+			else if (npn->f)
+			    np->f = npn->f;
+			else
+			    npn->f = 1;
+		    }
+		}
+	    }
+	    for (np = Nwad; np; np = np->next) {
+		if (!np->f && (cp = np->arg)) {
+		    rv = 1;
+		    if (Fverbose) {
+			(void) printf("%s: Internet address not located: ", Pn);
+			safestrprt(cp ? cp : "(unknown)", stdout, 1);
+		    }
+		}
+	    }
+	}
+	if (Fnet && Fnet < 2) {
+
+	/*
+	 * Report no Internet files located.
+	 */
+	    rv = 1;
+	    if (Fverbose)
+		(void) printf("%s: no Internet files located\n", Pn);
+	}
+
+#if	defined(HASTCPUDPSTATE)
+	if (TcpStIn) {
+
+	/*
+	 * Check for included TCP states not located.
+	 */
+	    for (i = 0; i < TcpNstates; i++) {
+		if (TcpStI[i] == 1) {
+		    rv = 1;
+		    if (Fverbose)
+			(void) printf("%s: TCP state not located: %s\n",
+			    Pn, TcpSt[i]);
+		}
+	    }
+	}
+	if (UdpStIn) {
+
+	/*
+	 * Check for included UDP states not located.
+	 */
+	    for (i = 0; i < UdpNstates; i++) {
+		if (UdpStI[i] == 1) {
+		    rv = 1;
+		    if (Fverbose)
+			(void) printf("%s: UDP state not located: %s\n",
+			    Pn, UdpSt[i]);
+		}
+	    }
+	}
+#endif	/* defined(HASTCPUDPSTATE) */
+
+	if (Fnfs && Fnfs < 2) {
+
+	/*
+	 * Report no NFS files located.
+	 */
+	    rv = 1;
+	    if (Fverbose)
+		(void) printf("%s: no NFS files located\n", Pn);
+	}
+	for (i = 0; i < Npid; i++) {
+
+	/*
+	 * Check inclusionary process ID specifications.
+	 */
+	    if (Spid[i].f || Spid[i].x)
+		continue;
+	    rv = 1;
+	    if (Fverbose)
+		(void) printf("%s: process ID not located: %d\n",
+		    Pn, Spid[i].i);
+	}
+
+#if	defined(HASTASKS)
+	if (Ftask && Ftask < 2) {
+
+	/*
+	 * Report no tasks located.
+	 */
+	    rv = 1;
+	    if (Fverbose)
+		(void) printf("%s: no tasks located\n", Pn);
+	}
+#endif	/* defined(HASTASKS) */
+
+#if	defined(HASZONES)
+	if (ZoneArg) {
+
+	/*
+	 * Check zone argument results.
+	 */
+	    for (i = 0; i < HASHZONE; i++) {
+		for (zp = ZoneArg[i]; zp; zp = zp->next) {
+		    if (!zp->f) {
+			rv = 1;
+			if (Fverbose) {
+			    (void) printf("%s: zone not located: ", Pn);
+			    safestrprt(zp->zn, stdout, 1);
+			}
+		    }
+		}
+	    }
+	}
+#endif	/* defined(HASZONES) */
+ 
+#if	defined(HASSELINUX)
+	if (CntxArg) {
+
+	/*
+	 * Check context argument results.
+	 */
+	    for (cntxp = CntxArg; cntxp; cntxp = cntxp->next) {
+		if (!cntxp->f) {
+		    rv = 1;
+		    if (Fverbose) {
+			(void) printf("%s: context not located: ", Pn);
+			safestrprt(cntxp->cntx, stdout, 1);
+		    }
+		}
+	    }
+	}
+#endif	/* defined(HASSELINUX) */
+
+	for (i = 0; i < Npgid; i++) {
+
+	/*
+	 * Check inclusionary process group ID specifications.
+	 */
+	    if (Spgid[i].f || Spgid[i].x)
+		continue;
+	    rv = 1;
+	    if (Fverbose)
+		(void) printf("%s: process group ID not located: %d\n",
+		    Pn, Spgid[i].i);
+	}
+	for (i = 0; i < Nuid; i++) {
+
+	/*
+	 * Check inclusionary user ID specifications.
+	 */
+	    if (Suid[i].excl || Suid[i].f)
+		continue;
+	    rv = 1;
+	    if (Fverbose) {
+		if (Suid[i].lnm) {
+		    (void) printf("%s: login name (UID %lu) not located: ",
+			Pn, (unsigned long)Suid[i].uid);
+		    safestrprt(Suid[i].lnm, stdout, 1);
+		} else
+		    (void) printf("%s: user ID not located: %lu\n", Pn,
+			(unsigned long)Suid[i].uid);
+	    }
+	}
+	if (!rv && rc)
+	    rv = ev;
+	if (!rv && ErrStat)
+	    rv = 1;
+	Exit(rv);
+	return(rv);		/* to make code analyzers happy */
+}
+
+
+/*
+ * GetOpt() -- Local get option
+ *
+ * Liberally adapted from the public domain AT&T getopt() source,
+ * distributed at the 1985 UNIFORM conference in Dallas
+ *
+ * The modifications allow `?' to be an option character and allow
+ * the caller to decide that an option that may be followed by a
+ * value doesn't have one -- e.g., has a default instead.
+ */
+
+static int
+GetOpt(ct, opt, rules, err)
+	int ct;				/* option count */
+	char *opt[];			/* options */
+	char *rules;			/* option rules */
+	int *err;			/* error return */
+{
+	register int c;
+	register char *cp = (char *)NULL;
+
+	if (GOx2 == 0) {
+
+	/*
+	 * Move to a new entry of the option array.
+	 *
+	 * EOF if:
+	 *
+	 *	Option list has been exhausted;
+	 *	Next option doesn't start with `-' or `+';
+	 *	Next option has nothing but `-' or `+';
+	 *	Next option is ``--'' or ``++''.
+	 */
+	    if (GOx1 >= ct
+	    ||  (opt[GOx1][0] != '-' && opt[GOx1][0] != '+')
+	    ||  !opt[GOx1][1])
+		 return(EOF);
+	    if (strcmp(opt[GOx1], "--") == 0 || strcmp(opt[GOx1], "++") == 0) {
+		GOx1++;
+		return(EOF);
+	    }
+	    GOp = opt[GOx1][0];
+	    GOx2 = 1;
+	}
+/*
+ * Flag `:' option character as an error.
+ *
+ * Check for a rule on this option character.
+ */
+	*err = 0;
+	if ((c = opt[GOx1][GOx2]) == ':') {
+	    (void) fprintf(stderr,
+		"%s: colon is an illegal option character.\n", Pn);
+	    *err = 1;
+	} else if (!(cp = strchr(rules, c))) {
+	    (void) fprintf(stderr, "%s: illegal option character: %c\n", Pn, c);
+	    *err = 2;
+	}
+	if (*err) {
+
+	/*
+	 * An error was detected.
+	 *
+	 * Advance to the next option character.
+	 *
+	 * Return the character causing the error.
+	 */
+	    if (opt[GOx1][++GOx2] == '\0') {
+		GOx1++;
+		GOx2 = 0;
+	    }
+	    return(c);
+	}
+	if (*(cp + 1) == ':') {
+
+	/*
+	 * The option may have a following value.  The caller decides
+	 * if it does.
+	 *
+	 * Save the position of the possible value in case the caller
+	 * decides it does not belong to the option and wants it
+	 * reconsidered as an option character.  The caller does that
+	 * with:
+	 *		GOx1 = GObk[0]; GOx2 = GObk[1];
+	 *
+	 * Don't indicate that an option of ``--'' is a possible value.
+	 *
+	 * Finally, on the assumption that the caller will decide that
+	 * the possible value belongs to the option, position to the
+	 * option following the possible value, so that the next call
+	 * to GetOpt() will find it.
+	 */
+	    if(opt[GOx1][GOx2 + 1] != '\0') {
+		GObk[0] = GOx1;
+		GObk[1] = ++GOx2;
+		GOv = &opt[GOx1++][GOx2];
+	    } else if (++GOx1 >= ct)
+		GOv = (char *)NULL;
+	    else {
+		GObk[0] = GOx1;
+		GObk[1] = 0;
+		GOv = opt[GOx1];
+		if (strcmp(GOv, "--") == 0)
+		    GOv = (char *)NULL;
+		else
+		    GOx1++;
+	    }
+	    GOx2 = 0;
+	} else {
+
+	/*
+	 * The option character stands alone with no following value.
+	 *
+	 * Advance to the next option character.
+	 */
+	    if (opt[GOx1][++GOx2] == '\0') {
+		GOx2 = 0;
+		GOx1++;
+	    }
+	    GOv = (char *)NULL;
+	}
+/*
+ * Return the option character.
+ */
+	return(c);
+}
+
+
+/*
+ * sv_fmt_str() - save format string
+ */
+
+static char *
+sv_fmt_str(f)
+	char *f;			/* format string */
+{
+	char *cp;
+	MALLOC_S l;
+
+	l = (MALLOC_S)(strlen(f) + 1);
+	if (!(cp = (char *)malloc(l))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes for format: %s\n", Pn, (int)l, f);
+	    Exit(1);
+	}
+	(void) snpf(cp, l, "%s", f);
+	return(cp);
+}
diff --git a/lsof_4.85/lsof_4.85_src/misc.c b/lsof_4.85/lsof_4.85_src/misc.c
new file mode 100644
index 0000000..3c1c32b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/misc.c
@@ -0,0 +1,1648 @@
+/*
+ * misc.c - common miscellaneous functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: misc.c,v 1.26 2008/10/21 16:21:41 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+#if	defined(HASWIDECHAR) && defined(WIDECHARINCL)
+#include WIDECHARINCL
+#endif	/* defined(HASWIDECHAR) && defined(WIDECHARINCL) */
+
+
+/*
+ * Local definitions
+ */
+
+#if	!defined(MAXSYMLINKS)
+#define	MAXSYMLINKS	32
+#endif	/* !defined(MAXSYMLINKS) */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void closePipes,(void));
+_PROTOTYPE(static int dolstat,(char *path, char *buf, int len));
+_PROTOTYPE(static int dostat,(char *path, char *buf, int len));
+_PROTOTYPE(static int doreadlink,(char *path, char *buf, int len));
+_PROTOTYPE(static int doinchild,(int (*fn)(), char *fp, char *rbuf, int rbln));
+
+#if	defined(HASINTSIGNAL)
+_PROTOTYPE(static int handleint,(int sig));
+#else	/* !defined(HASINTSIGNAL) */
+_PROTOTYPE(static void handleint,(int sig));
+#endif	/* defined(HASINTSIGNAL) */
+
+_PROTOTYPE(static char *safepup,(unsigned int c, int *cl));
+
+
+/*
+ * Local variables
+ */
+
+static pid_t Cpid = 0;			/* child PID */
+static jmp_buf Jmp_buf;			/* jump buffer */
+static int Pipes[] =			/* pipes for child process */
+	{ -1, -1, -1, -1 };
+static int CtSigs[] = { 0, SIGINT, SIGKILL };
+					/* child termination signals (in order
+					 * of application) -- the first is a
+					 * dummy to allow pipe closure to
+					 * cause the child to exit */
+#define	NCTSIGS	(sizeof(CtSigs) / sizeof(int))
+
+
+#if	defined(HASNLIST)
+/*
+ * build-Nl() - build kernel name list table
+ */
+
+static struct drive_Nl *Build_Nl = (struct drive_Nl *)NULL;
+					/* the default Drive_Nl address */
+
+void
+build_Nl(d)
+	struct drive_Nl *d;		/* data to drive the construction */
+{
+	struct drive_Nl *dp;
+	int i, n;
+
+	for (dp = d, n = 0; dp->nn; dp++, n++)
+	    ;
+	if (n < 1) {
+	    (void) fprintf(stderr,
+		"%s: can't calculate kernel name list length\n", Pn);
+	    Exit(1);
+	}
+	if (!(Nl = (struct NLIST_TYPE *)calloc((n + 1),
+					       sizeof(struct NLIST_TYPE))))
+	{
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes to kernel name list structure\n",
+		Pn, (int)((n + 1) * sizeof(struct NLIST_TYPE)));
+	    Exit(1);
+	}
+	for (dp = d, i = 0; i < n; dp++, i++) {
+	    Nl[i].NL_NAME = dp->knm;
+	}
+	Nll = (int)((n + 1) * sizeof(struct NLIST_TYPE));
+	Build_Nl = d;
+}
+#endif	/* defined(HASNLIST) */
+
+
+/*
+ * childx() - make child process exit (if possible)
+ */
+
+void
+childx()
+{
+	static int at, sx;
+	pid_t wpid;
+
+	if (Cpid > 1) {
+
+	/*
+	 * First close the pipes to and from the child.  That should cause the
+	 * child to exit.  Compute alarm time shares.
+	 */
+	    (void) closePipes();
+	    if ((at = TmLimit / NCTSIGS) < TMLIMMIN)
+		at = TMLIMMIN;
+	/*
+	 * Loop, waiting for the child to exit.  After the first pass, help
+	 * the child exit by sending it signals.
+	 */
+	    for (sx = 0; sx < NCTSIGS; sx++) {
+		if (setjmp(Jmp_buf)) {
+
+		/*
+		 * An alarm has rung.  Disable further alarms.
+		 *
+		 * If there are more signals to send, continue the signal loop.
+		 *
+		 * If the last signal has been sent, issue a warning (unless
+		 * warninge have been suppressed) and exit the signal loop.
+		 */
+		    (void) alarm(0);
+		    (void) signal(SIGALRM, SIG_DFL);
+		    if (sx < (NCTSIGS - 1))
+			continue;
+		    if (!Fwarn)
+			(void) fprintf(stderr,
+			    "%s: WARNING -- child process %d may be hung.\n",
+			    Pn, (int)Cpid);
+		    break;
+	        }
+	    /*
+	     * Send the next signal to the child process, after the first pass
+	     * through the loop.
+	     *
+	     * Wrap the wait() with an alarm.
+	     */
+		if (sx)
+		    (void) kill(Cpid, CtSigs[sx]);
+		(void) signal(SIGALRM, handleint);
+		(void) alarm(at);
+		wpid = (pid_t) wait(NULL);
+		(void) alarm(0);
+		(void) signal(SIGALRM, SIG_DFL);
+		if (wpid == Cpid)
+		    break;
+	    }
+	    Cpid = 0;
+	}
+}
+
+
+/*
+ * closePipes() - close open pipe file descriptors
+ */
+
+static void
+closePipes()
+{
+	int i;
+
+	for (i = 0; i < 4; i++) {
+	    if (Pipes[i] >= 0) {
+		(void) close(Pipes[i]);
+		Pipes[i] = -1;
+	    }
+	}
+}
+
+
+/*
+ * compdev() - compare Devtp[] entries
+ */
+
+int
+compdev(a1, a2)
+	COMP_P *a1, *a2;
+{
+	struct l_dev **p1 = (struct l_dev **)a1;
+	struct l_dev **p2 = (struct l_dev **)a2;
+
+	if ((dev_t)((*p1)->rdev) < (dev_t)((*p2)->rdev))
+	    return(-1);
+	if ((dev_t)((*p1)->rdev) > (dev_t)((*p2)->rdev))
+	    return(1);
+	if ((INODETYPE)((*p1)->inode) < (INODETYPE)((*p2)->inode))
+	    return(-1);
+	if ((INODETYPE)((*p1)->inode) > (INODETYPE)((*p2)->inode))
+	    return(1);
+	return(strcmp((*p1)->name, (*p2)->name));
+}
+
+
+/*
+ * doinchild() -- do a function in a child process
+ */
+
+static int
+doinchild(fn, fp, rbuf, rbln)
+	int (*fn)();			/* function to perform */
+	char *fp;			/* function parameter */
+	char *rbuf;			/* response buffer */
+	int rbln;			/* response buffer length */
+{
+	int en, rv;
+/*
+ * Check reply buffer size.
+ */
+	if (!Fovhd && rbln > MAXPATHLEN) {
+	    (void) fprintf(stderr,
+		"%s: doinchild error; response buffer too large: %d\n",
+		Pn, rbln);
+	    Exit(1);
+	}
+/*
+ * Set up to handle an alarm signal; handle an alarm signal; build
+ * pipes for exchanging information with a child process; start the
+ * child process; and perform functions in the child process.
+ */
+	if (!Fovhd) {
+	    if (setjmp(Jmp_buf)) {
+
+	    /*
+	     * Process an alarm that has rung.
+	     */
+		(void) alarm(0);
+		(void) signal(SIGALRM, SIG_DFL);
+		(void) childx();
+		errno = ETIMEDOUT;
+		return(1);
+	    } else if (!Cpid) {
+
+	    /*
+	     * Create pipes to exchange function information with a child
+	     * process.
+	     */
+		if (pipe(Pipes) < 0 || pipe(&Pipes[2]) < 0) {
+		    (void) fprintf(stderr, "%s: can't open pipes: %s\n",
+			Pn, strerror(errno));
+		    Exit(1);
+		}
+	    /*
+	     * Fork a child to execute functions.
+	     */
+		if ((Cpid = fork()) == 0) {
+
+		/*
+		 * Begin the child process.
+		 */
+
+		    int fd, nd, r_al, r_rbln;
+		    char r_arg[MAXPATHLEN+1], r_rbuf[MAXPATHLEN+1];
+		    int (*r_fn)();
+		/*
+		 * Close all open file descriptors except Pipes[0] and
+		 * Pipes[3].
+		 */
+		    for (fd = 0, nd = GET_MAX_FD(); fd < nd; fd++) {
+			if (fd == Pipes[0] || fd == Pipes[3])
+			    continue;
+			(void) close(fd);
+			if (fd == Pipes[1])
+			    Pipes[1] = -1;
+			else if (fd == Pipes[2])
+			    Pipes[2] = -1;
+		    }
+		    if (Pipes[1] >= 0) {
+			(void) close(Pipes[1]);
+			Pipes[1] = -1;
+		    }
+		    if (Pipes[2] >= 0) {
+			(void) close(Pipes[2]);
+			Pipes[2] = -1;
+		    }
+		/*
+		 * Read function requests, process them, and return replies.
+		 */
+		    for (;;) {
+			if (read(Pipes[0], (char *)&r_fn, sizeof(r_fn))
+			    != (int)sizeof(r_fn)
+			||  read(Pipes[0], (char *)&r_al, sizeof(int))
+			    != (int)sizeof(int)
+			||  r_al < 1
+			||  r_al > (int)sizeof(r_arg)
+			||  read(Pipes[0], r_arg, r_al) != r_al
+			||  read(Pipes[0], (char *)&r_rbln, sizeof(r_rbln))
+			    != (int)sizeof(r_rbln)
+			||  r_rbln < 1 || r_rbln > (int)sizeof(r_rbuf))
+			    break;
+			rv = r_fn(r_arg, r_rbuf, r_rbln);
+			en = errno;
+			if (write(Pipes[3], (char *)&rv, sizeof(rv))
+			    != sizeof(rv)
+			||  write(Pipes[3], (char *)&en, sizeof(en))
+			    != sizeof(en)
+			||  write(Pipes[3], r_rbuf, r_rbln) != r_rbln)
+			    break;
+		    }
+		    (void) _exit(0);
+		}
+	    /*
+	     * Continue in the parent process to finish the setup.
+	     */
+		if (Cpid < 0) {
+		    (void) fprintf(stderr, "%s: can't fork: %s\n",
+			Pn, strerror(errno));
+		    Exit(1);
+		}
+		(void) close(Pipes[0]);
+		(void) close(Pipes[3]);
+		Pipes[0] = Pipes[3] = -1;
+	    }
+	}
+	if (!Fovhd) {
+	    int len;
+
+	/*
+	 * Send a function to the child and wait for the response.
+	 */
+	    len  = strlen(fp) + 1;
+	    (void) signal(SIGALRM, handleint);
+	    (void) alarm(TmLimit);
+	    if (write(Pipes[1], (char *)&fn, sizeof(fn)) != sizeof(fn)
+	    ||  write(Pipes[1], (char *)&len, sizeof(len)) != sizeof(len)
+	    ||  write(Pipes[1], fp, len) != len
+	    ||  write(Pipes[1], (char *)&rbln, sizeof(rbln)) != sizeof(rbln)
+	    ||  read(Pipes[2], (char *)&rv, sizeof(rv)) != sizeof(rv)
+	    ||  read(Pipes[2], (char *)&en, sizeof(en)) != sizeof(en)
+	    ||  read(Pipes[2], rbuf, rbln) != rbln) {
+		(void) alarm(0);
+		(void) signal(SIGALRM, SIG_DFL);
+		(void) childx();
+		errno = ECHILD;
+		return(-1);
+	    }
+	} else {
+
+	/*
+	 * Do the operation directly -- not in a child.
+	 */
+	    (void) signal(SIGALRM, handleint);
+	    (void) alarm(TmLimit);
+	    rv = fn(fp, rbuf, rbln);
+	    en = errno;
+	}
+/*
+ * Function completed, response collected -- complete the operation.
+ */
+	(void) alarm(0);
+	(void) signal(SIGALRM, SIG_DFL);
+	errno = en;
+	return(rv);
+}
+
+
+/*
+ * dolstat() - do an lstat() function
+ */
+
+static int
+dolstat(path, rbuf, rbln)
+	char *path;			/* path */
+	char *rbuf;			/* response buffer */
+	int rbln;			/* response buffer length */
+
+/* ARGSUSED */
+
+{
+	return(lstat(path, (struct stat *)rbuf));
+}
+
+
+/*
+ * doreadlink() -- do a readlink() function
+ */
+
+static int
+doreadlink(path, rbuf, rbln)
+	char *path;			/* path */
+	char *rbuf;			/* response buffer */
+	int rbln;			/* response buffer length */
+{
+	return(readlink(path, rbuf, rbln));
+}
+
+
+/*
+ * dostat() - do a stat() function
+ */
+
+static int
+dostat(path, rbuf, rbln)
+	char *path;			/* path */
+	char *rbuf;			/* response buffer */
+	int rbln;			/* response buffer length */
+
+/* ARGSUSED */
+
+{
+	return(stat(path, (struct stat *)rbuf));
+}
+
+
+#if	defined(WILLDROPGID)
+/*
+ * dropgid() - drop setgid permission
+ */
+
+void
+dropgid()
+{
+	if (!Setuidroot && Setgid) {
+	    if (setgid(Mygid) < 0) {
+		(void) fprintf(stderr, "%s: can't setgid(%d): %s\n",
+		    Pn, (int)Mygid, strerror(errno));
+		Exit(1);
+	    }
+	    Setgid = 0;
+	}
+}
+#endif	/* defined(WILLDROPGID) */
+
+
+/*
+ * enter_dev_ch() - enter device characters in file structure
+ */
+
+void
+enter_dev_ch(m)
+	char *m;
+{
+	char *mp;
+
+	if (!m || *m == '\0')
+	    return;
+	if (!(mp = mkstrcpy(m, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no more dev_ch space at PID %d: \n",
+		Pn, Lp->pid);
+	    safestrprt(m, stderr, 1);
+	    Exit(1);
+	}
+	if (Lf->dev_ch)
+	   (void) free((FREE_P *)Lf->dev_ch);
+	Lf->dev_ch = mp;
+}
+
+
+/*
+ * enter_IPstate() -- enter a TCP or UDP state
+ */
+
+void
+enter_IPstate(ty, nm, nr)
+	char *ty;			/* type -- TCP or UDP */
+	char *nm;			/* state name (may be NULL) */
+	int nr;				/* state number */
+{
+
+#if	defined(USE_LIB_PRINT_TCPTPI)
+	TcpNstates = nr;
+#else	/* !defined(USE_LIB_PRINT_TCPTPI) */
+
+	int al, i, j, oc, nn, ns, off, tx;
+	char *cp;
+	MALLOC_S len;
+/*
+ * Check the type name and set the type index.
+ */
+	if (!ty) {
+	    (void) fprintf(stderr,
+		"%s: no type specified to enter_IPstate()\n", Pn);
+	    Exit(1);
+	}
+	if (!strcmp(ty, "TCP"))
+	    tx = 0;
+	else if (!strcmp(ty, "UDP"))
+	    tx = 1;
+	else {
+	    (void) fprintf(stderr, "%s: unknown type for enter_IPstate: %s\n",
+		Pn, ty);
+	    Exit(1);
+	}
+/*
+ * If the name argument is NULL, reduce the allocated table to its minimum
+ * size.
+ */
+	if (!nm) {
+	    if (tx) {
+		if (UdpSt) {
+		    if (!UdpNstates) {
+			(void) free((MALLOC_P *)UdpSt);
+			UdpSt = (char **)NULL;
+		    }
+		    if (UdpNstates < UdpStAlloc) {
+			len = (MALLOC_S)(UdpNstates * sizeof(char *));
+			if (!(UdpSt = (char **)realloc((MALLOC_P *)UdpSt, len)))
+			{
+			    (void) fprintf(stderr,
+				"%s: can't reduce UdpSt[]\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    UdpStAlloc = UdpNstates;
+		}
+	    } else {
+		if (TcpSt) {
+		    if (!TcpNstates) {
+			(void) free((MALLOC_P *)TcpSt);
+			TcpSt = (char **)NULL;
+		    }
+		    if (TcpNstates < TcpStAlloc) {
+			len = (MALLOC_S)(TcpNstates * sizeof(char *));
+			if (!(TcpSt = (char **)realloc((MALLOC_P *)TcpSt, len)))
+			{
+			    (void) fprintf(stderr,
+				"%s: can't reduce TcpSt[]\n", Pn);
+			    Exit(1);
+			}
+		    }
+		    TcpStAlloc = TcpNstates;
+		}
+	    }
+	    return;
+	}
+/*
+ * Check the name and number.
+ */
+	if ((len = (size_t)strlen(nm)) < 1) {
+	    (void) fprintf(stderr,
+		"%s: bad %s name (\"%s\"), number=%d\n", Pn, ty, nm, nr);
+	    Exit(1);
+	}
+/*
+ * Make a copy of the name.
+ */
+	if (!(cp = mkstrcpy(nm, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr,
+		"%s: enter_IPstate(): no %s space for %s\n",
+		Pn, ty, nm);
+	    Exit(1);
+	}
+/*
+ * Set the necessary offset for using nr as an index.  If it is
+ * a new offset, adjust previous entries.
+ */
+	if ((nr < 0) && ((off = -nr) > (tx ? UdpStOff : TcpStOff))) {
+	    if (tx ? UdpSt : TcpSt) {
+
+	    /*
+	     * A new, larger offset (smaller negative state number) could mean
+	     * a previously allocated state table must be enlarged and its
+	     * previous entries moved.
+	     */
+		oc = off - (tx ? UdpStOff : TcpStOff);
+		al = tx ? UdpStAlloc : TcpStAlloc;
+		ns = tx ? UdpNstates : TcpNstates;
+		if ((nn = ns + oc) >= al) {
+		    while ((nn + 5) > al) {
+			al += TCPUDPALLOC;
+		    }
+		    len = (MALLOC_S)(al * sizeof(char *));
+		    if (tx) {
+			if (!(UdpSt = (char **)realloc((MALLOC_P *)UdpSt, len)))
+			    goto no_IP_space;
+			UdpStAlloc = al;
+		    } else {
+			if (!(TcpSt = (char **)realloc((MALLOC_P *)TcpSt, len)))
+			    goto no_IP_space;
+			TcpStAlloc = al;
+		    }
+		    for (i = 0, j = oc; i < oc; i++, j++) {
+			if (tx) {
+			    if (i < UdpNstates)
+				UdpSt[j] = UdpSt[i];
+			    UdpSt[i] = (char *)NULL;
+			} else {
+			    if (i < TcpNstates)
+				TcpSt[j] = TcpSt[i];
+			    TcpSt[i] = (char *)NULL;
+			}
+		    }
+		    if (tx)
+			UdpNstates += oc;
+		    else
+			TcpNstates += oc;
+		}
+	    }
+	    if (tx)
+		UdpStOff = off;
+	    else
+		TcpStOff = off;
+	}
+/*
+ * Enter name as {Tc|Ud}pSt[nr + {Tc|Ud}pStOff].
+ *
+ * Allocate space, as required.
+ */
+	al = tx ? UdpStAlloc : TcpStAlloc;
+	off = tx ? UdpStOff : TcpStOff;
+	nn = nr + off + 1;
+	if (nn > al) {
+	    i = tx ? UdpNstates : TcpNstates;
+	    while ((nn + 5) > al) {
+		al += TCPUDPALLOC;
+	    }
+	    len = (MALLOC_S)(al * sizeof(char *));
+	    if (tx) {
+		if (UdpSt)
+		    UdpSt = (char **)realloc((MALLOC_P *)UdpSt, len);
+		else
+		    UdpSt = (char **)malloc(len);
+		if (!UdpSt) {
+
+no_IP_space:
+
+		    (void) fprintf(stderr, "%s: no %s state space\n", Pn, ty);
+		    Exit(1);
+		}
+		UdpNstates = nn;
+		UdpStAlloc = al;
+	    } else {
+		if (TcpSt)
+		    TcpSt = (char **)realloc((MALLOC_P *)TcpSt, len);
+		else
+		    TcpSt = (char **)malloc(len);
+		if (!TcpSt)
+		    goto no_IP_space;
+		TcpNstates = nn;
+		TcpStAlloc = al;
+	    }
+	    while (i < al) {
+		if (tx)
+		    UdpSt[i] = (char *)NULL;
+		else
+		    TcpSt[i] = (char *)NULL;
+		i++;
+	    }
+	} else {
+	    if (tx) {
+		if (nn > UdpNstates)
+		    UdpNstates = nn;
+	    } else {
+		if (nn > TcpNstates)
+		    TcpNstates = nn;
+	    }
+	}
+	if (tx) {
+	    if (UdpSt[nr + UdpStOff]) {
+
+dup_IP_state:
+
+		(void) fprintf(stderr,
+		    "%s: duplicate %s state %d (already %s): %s\n",
+		    Pn, ty, nr,
+		    tx ? UdpSt[nr + UdpStOff] : TcpSt[nr + TcpStOff],
+		    nm);
+	 	Exit(1);
+	    }
+	    UdpSt[nr + UdpStOff] = cp;
+	} else {
+	    if (TcpSt[nr + TcpStOff])
+		goto dup_IP_state;
+	    TcpSt[nr + TcpStOff] = cp;
+	}
+#endif	/* defined(USE_LIB_PRINT_TCPTPI) */
+
+}
+
+
+/*
+ * enter_nm() - enter name in local file structure
+ */
+
+void
+enter_nm(m)
+	char *m;
+{
+	char *mp;
+
+	if (!m || *m == '\0')
+	    return;
+	if (!(mp = mkstrcpy(m, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no more nm space at PID %d for: ",
+		Pn, Lp->pid);
+	    safestrprt(m, stderr, 1);
+	    Exit(1);
+	}
+	if (Lf->nm)
+	    (void) free((FREE_P *)Lf->nm);
+	Lf->nm = mp;
+}
+
+
+/*
+ * Exit() - do a clean exit()
+ */
+
+void
+Exit(xv)
+	int xv;				/* exit() value */
+{
+	(void) childx();
+
+#if	defined(HASDCACHE)
+	if (DCrebuilt && !Fwarn)
+	    (void) fprintf(stderr, "%s: WARNING: %s was updated.\n",
+		Pn, DCpath[DCpathX]);
+#endif	/* defined(HASDCACHE) */
+
+	exit(xv);
+}
+
+
+#if	defined(HASNLIST)
+/*
+ * get_Nl_value() - get Nl value for nickname
+ */
+
+int
+get_Nl_value(nn, d, v)
+	char *nn;			/* nickname of requested entry */
+	struct drive_Nl *d;		/* drive_Nl table that built Nl
+					 * (if NULL, use Build_Nl) */
+	KA_T *v;			/* returned value (if NULL,
+					 * return nothing) */
+{
+	int i;
+
+	if (!Nl || !Nll)
+	    return(-1);
+	if (!d)
+	    d = Build_Nl;
+	for (i = 0; d->nn; d++, i++) {
+	    if (strcmp(d->nn, nn) == 0) {
+		if (v)
+		    *v = (KA_T)Nl[i].n_value;
+		return(i);
+	    }
+	}
+	return(-1);
+}
+#endif	/* defined(HASNLIST) */
+
+
+/*
+ * handleint() - handle an interrupt
+ */
+
+#if	defined(HASINTSIGNAL)
+static int
+#else
+static void
+#endif
+
+/* ARGSUSED */
+
+handleint(sig)
+	int sig;
+{
+	longjmp(Jmp_buf, 1);
+}
+
+
+/*
+ * hashbyname() - hash by name
+ */
+
+int
+hashbyname(nm, mod)
+	char *nm;			/* pointer to NUL-terminated name */
+	int mod;			/* hash modulus */
+{
+	int i, j;
+
+	for (i = j = 0; *nm; nm++) {
+	    i ^= (int)*nm << j;
+	    if (++j > 7)
+		j = 0;
+	}
+	return(((int)(i * 31415)) & (mod - 1));
+}
+
+
+/*
+ * is_nw_addr() - is this network address selected?
+ */
+
+int
+is_nw_addr(ia, p, af)
+	unsigned char *ia;		/* Internet address */
+	int p;				/* port */
+	int af;				/* address family -- e.g., AF_INET,
+					 * AF_INET6 */
+{
+	struct nwad *n;
+
+	if (!(n = Nwad))
+	    return(0);
+	for (; n; n = n->next) {
+	    if (n->proto) {
+		if (strcasecmp(n->proto, Lf->iproto) != 0)
+		    continue;
+	    }
+	    if (af && n->af && af != n->af)
+		continue;
+
+#if	defined(HASIPv6)
+	    if (af == AF_INET6) {
+		if (n->a[15] || n->a[14] || n->a[13] || n->a[12]
+		||  n->a[11] || n->a[10] || n->a[9]  || n->a[8]
+		||  n->a[7]  || n->a[6]  || n->a[5]  || n->a[4]
+		||  n->a[3]  || n->a[2]  || n->a[1]  || n->a[0]) {
+		    if (ia[15] != n->a[15] || ia[14] != n->a[14]
+		    ||  ia[13] != n->a[13] || ia[12] != n->a[12]
+		    ||  ia[11] != n->a[11] || ia[10] != n->a[10]
+		    ||  ia[9]  != n->a[9]  || ia[8]  != n->a[8]
+		    ||  ia[7]  != n->a[7]  || ia[6]  != n->a[6]
+		    ||  ia[5]  != n->a[5]  || ia[4]  != n->a[4]
+		    ||  ia[3]  != n->a[3]  || ia[2]  != n->a[2]
+		    ||  ia[1]  != n->a[1]  || ia[0]  != n->a[0])
+			continue;
+		}
+	    } else if (af == AF_INET)
+#endif	/* defined(HASIPv6) */
+
+	    {
+		if (n->a[3] || n->a[2] || n->a[1] || n->a[0]) {
+		    if (ia[3] != n->a[3] || ia[2] != n->a[2]
+		    ||  ia[1] != n->a[1] || ia[0] != n->a[0])
+			continue;
+		}
+	    }
+
+#if	defined(HASIPv6)
+	    else
+		continue;
+#endif	/* defined(HASIPv6) */
+
+	    if (n->sport == -1 || (p >= n->sport && p <= n->eport)) {
+		n->f = 1;
+		return(1);
+	    }
+	}
+	return(0);
+}
+
+
+/*
+ * mkstrcpy() - make a string copy in malloc()'d space
+ *
+ * return: copy pointer
+ *	   copy length (optional)
+ */
+
+char *
+mkstrcpy(src, rlp)
+	char *src;			/* source */
+	MALLOC_S *rlp;			/* returned length pointer (optional)
+					 * The returned length is an strlen()
+					 * equivalent */
+{
+	MALLOC_S len;
+	char *ns;
+
+	len = (MALLOC_S)(src ? strlen(src) : 0);
+	ns = (char *)malloc(len + 1);
+	if (ns) {
+	    if (src)
+		(void) snpf(ns, len + 1, "%s", src);
+	    else
+		*ns = '\0';
+	}
+	if (rlp)
+	    *rlp = len;
+	return(ns);
+}
+
+
+/*
+ * mkstrcat() - make a catenated copy of up to three strings under optional
+ *		string-by-string count control
+ *
+ * return: copy pointer
+ *	   copy string length (optional)
+ */
+
+char *
+mkstrcat(s1, l1, s2, l2, s3, l3, clp)
+	char *s1;			/* source string 1 */
+	int l1;				/* length of string 1 (-1 if none) */
+	char *s2;			/* source string 2 */
+	int l2;				/* length of string 2 (-1 if none) */
+	char *s3;			/* source string 3 (optional) */
+	int l3	;			/* length of string 3 (-1 if none) */
+	MALLOC_S *clp;			/* pointer to return of copy length
+					 * (optional) */
+{
+	MALLOC_S cl, len1, len2, len3;
+	char *cp;
+
+	if (s1)
+	    len1 = (MALLOC_S)((l1 >= 0) ? l1 : strlen(s1));
+	else
+	    len1 = (MALLOC_S)0;
+	if (s2)
+	    len2 = (MALLOC_S)((l2 >= 0) ? l2 : strlen(s2));
+	else
+	    len2 = (MALLOC_S)0;
+	if (s3)
+	    len3 = (MALLOC_S)((l3 >= 0) ? l3 : strlen(s3));
+	else
+	    len3 = (MALLOC_S)0;
+	cl = len1 + len2 + len3;
+	if ((cp = (char *)malloc(cl + 1))) {
+	    char *tp = cp;
+
+	    if (s1 && len1) {
+		(void) strncpy(tp, s1, len1);
+		tp += len1;
+	    }
+	    if (s2 && len2) {
+		(void) strncpy(tp, s2, len2);
+		tp += len2;
+	    }
+	    if (s3 && len3) {
+		(void) strncpy(tp, s3, len3);
+		tp += len3;
+	    }
+	    *tp = '\0';
+	}
+	if (clp)
+	    *clp = cl;
+	return(cp);
+}
+
+
+/*
+ * is_readable() -- is file readable
+ */
+
+int
+is_readable(path, msg)
+	char *path;			/* file path */
+	int msg;			/* issue warning message if 1 */
+{
+	if (access(path, R_OK) < 0) {
+	    if (!Fwarn && msg == 1)
+		(void) fprintf(stderr, ACCESSERRFMT, Pn, path, strerror(errno));
+	    return(0);
+	}
+	return(1);
+}
+
+
+/*
+ * lstatsafely() - lstat path safely (i. e., with timeout)
+ */
+
+int
+lstatsafely(path, buf)
+	char *path;			/* file path */
+	struct stat *buf;		/* stat buffer address */
+{
+	if (Fblock) {
+	    if (!Fwarn) 
+		(void) fprintf(stderr,
+		    "%s: avoiding stat(%s): -b was specified.\n",
+		    Pn, path);
+	    errno = EWOULDBLOCK;
+	    return(1);
+	}
+	return(doinchild(dolstat, path, (char *)buf, sizeof(struct stat)));
+}
+
+
+/*
+ * Readlink() - read and interpret file system symbolic links
+ */
+
+char *
+Readlink(arg)
+	char *arg;			/* argument to be interpreted */
+{
+	char abuf[MAXPATHLEN+1];
+	int alen;
+	char *ap;
+	char *argp1, *argp2;
+	int i, len, llen, slen;
+	char lbuf[MAXPATHLEN+1];
+	static char *op = (char *)NULL;
+	static int ss = 0;
+	char *s1;
+	static char **stk = (char **)NULL;
+	static int sx = 0;
+	char tbuf[MAXPATHLEN+1];
+/*
+ * See if avoiding kernel blocks.
+ */
+	if (Fblock) {
+	    if (!Fwarn) {
+		(void) fprintf(stderr, "%s: avoiding readlink(", Pn);
+		safestrprt(arg, stderr, 0);
+		(void) fprintf(stderr, "): -b was specified.\n");
+	    }
+	    op = (char *)NULL;
+	    return(arg);
+	}
+/*
+ * Save the original path.
+ */
+	if (!op)
+	    op = arg;
+/*
+ * Evaluate each component of the argument for a symbolic link.
+ */
+	for (alen = 0, ap = abuf, argp1 = argp2 = arg; *argp2; argp1 = argp2 ) {
+	    for (argp2 = argp1 + 1; *argp2 && *argp2 != '/'; argp2++)
+		;
+	    if ((len = argp2 - arg) >= (int)sizeof(tbuf)) {
+
+path_too_long:
+		if (!Fwarn) {
+		    (void) fprintf(stderr,
+			"%s: readlink() path too long: ", Pn);
+		    safestrprt(op ? op : arg, stderr, 1);
+		}
+		op = (char *)NULL;
+		return((char *)NULL);
+	    }
+	    (void) strncpy(tbuf, arg, len);
+	    tbuf[len] = '\0';
+	/*
+	 * Dereference a symbolic link.
+	 */
+	    if ((llen=doinchild(doreadlink,tbuf,lbuf,sizeof(lbuf) - 1)) >= 0) {
+
+	    /*
+	     * If the link is a new absolute path, replace
+	     * the previous assembly with it.
+	     */
+		if (lbuf[0] == '/') {
+		    (void) strncpy(abuf, lbuf, llen);
+		    ap = &abuf[llen];
+		    *ap = '\0';
+		    alen = llen;
+		    continue;
+		}
+		lbuf[llen] = '\0';
+		s1 = lbuf;
+	    } else {
+		llen = argp2 - argp1;
+		s1 = argp1;
+	    }
+	/*
+	 * Make sure two components are separated by a `/'.
+	 *
+	 * If the first component is not a link, don't force
+	 * a leading '/'.
+	 *
+	 * If the first component is a link and the source of
+	 * the link has a leading '/', force a leading '/'.
+	 */
+	    if (*s1 == '/')
+		slen = 1;
+	    else {
+		if (alen > 0) {
+
+		/*
+		 * This is not the first component.
+		 */
+		    if (abuf[alen - 1] == '/')
+			slen = 1;
+		    else
+			slen = 2;
+		} else {
+
+		/*
+		 * This is the first component.
+		 */
+		    if (s1 == lbuf && tbuf[0] == '/')
+			slen = 2;
+		    else
+			slen = 1;
+		}
+	    }
+	/*
+	 * Add to the path assembly.
+	 */
+	    if ((alen + llen + slen) >= (int)sizeof(abuf))
+		goto path_too_long;
+	    if (slen == 2)
+		*ap++ = '/';
+	    (void) strncpy(ap, s1, llen);
+	    ap += llen;
+	    *ap = '\0';
+	    alen += (llen + slen - 1);
+	}
+/*
+ * If the assembled path and argument are the same, free all but the
+ * last string in the stack, and return the argument.
+ */
+	if (strcmp(arg, abuf) == 0) {
+	    for (i = 0; i < sx; i++) {
+		if (i < (sx - 1))
+		    (void) free((FREE_P *)stk[i]);
+		stk[i] = (char *)NULL;
+	    }
+	    sx = 0;
+	    op = (char *)NULL;
+	    return(arg);
+	}
+/*
+ * If the assembled path and argument are different, add it to the
+ * string stack, then Readlink() it.
+ */
+	if (!(s1 = mkstrcpy(abuf, (MALLOC_S *)NULL))) {
+
+no_readlink_space:
+
+	    (void) fprintf(stderr, "%s: no Readlink string space for ", Pn);
+	    safestrprt(abuf, stderr, 1);
+	    Exit(1);
+	}
+	if (sx >= MAXSYMLINKS) {
+
+	/*
+	 * If there are too many symbolic links, report an error, clear
+	 * the stack, and return no path.
+	 */
+	    if (!Fwarn) {
+		(void) fprintf(stderr,
+		    "%s: too many (> %d) symbolic links in readlink() path: ",
+			Pn, MAXSYMLINKS);
+		safestrprt(op ? op : arg, stderr, 1);
+	    }
+	    for (i = 0; i < sx; i++) {
+		(void) free((FREE_P *)stk[i]);
+		stk[i] = (char *)NULL;
+	    }
+	    (void) free((FREE_P *)stk);
+	    stk = (char **)NULL;
+	    ss = sx = 0;
+	    op = (char *)NULL;
+	    return((char *)NULL);
+	}
+	if (++sx > ss) {
+	    if (!stk)
+		stk = (char **)malloc((MALLOC_S)(sizeof(char *) * sx));
+	    else
+		stk = (char **)realloc((MALLOC_P *)stk,
+					(MALLOC_S)(sizeof(char *) * sx));
+	    if (!stk)
+		goto no_readlink_space;
+	    ss = sx;
+	}
+	stk[sx - 1] = s1;
+	return(Readlink(s1));
+}
+
+
+#if	defined(HASSTREAMS)
+/*
+ * readstdata() - read stream's stdata structure
+ */
+
+int
+readstdata(addr, buf)
+	KA_T addr;			/* stdata address in kernel*/
+	struct stdata *buf;		/* buffer addess */
+{
+	if (!addr
+	||  kread(addr, (char *)buf, sizeof(struct stdata))) {
+	    (void) snpf(Namech, Namechl, "no stream data in %s",
+		print_kptr(addr, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * readsthead() - read stream head
+ */
+
+int
+readsthead(addr, buf)
+	KA_T addr;			/* starting queue pointer in kernel */
+	struct queue *buf;		/* buffer for queue head */
+{
+	KA_T qp;
+
+	if (!addr) {
+	    (void) snpf(Namech, Namechl, "no stream queue head");
+	    return(1);
+	}
+	for (qp = addr; qp; qp = (KA_T)buf->q_next) {
+	    if (kread(qp, (char *)buf, sizeof(struct queue))) {
+		(void) snpf(Namech, Namechl, "bad stream queue link at %s",
+		    print_kptr(qp, (char *)NULL, 0));
+		return(1);
+	    }
+	}
+	return(0);
+}
+
+
+/*
+ * readstidnm() - read stream module ID name
+ */
+
+int
+readstidnm(addr, buf, len)
+	KA_T addr;			/* module ID name address in kernel */
+	char *buf;			/* receiving buffer address */
+	READLEN_T len;			/* buffer length */
+{
+	if (!addr || kread(addr, buf, len)) {
+	    (void) snpf(Namech, Namechl, "can't read module ID name from %s",
+		print_kptr(addr, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * readstmin() - read stream's module info
+ */
+
+int
+readstmin(addr, buf)
+	KA_T addr;			/* module info address in kernel */
+	struct module_info *buf;	/* receiving buffer address */
+{
+	if (!addr || kread(addr, (char *)buf, sizeof(struct module_info))) {
+	    (void) snpf(Namech, Namechl, "can't read module info from %s",
+		print_kptr(addr, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * readstqinit() - read stream's queue information structure
+ */
+
+int
+readstqinit(addr, buf)
+	KA_T addr;			/* queue info address in kernel */
+	struct qinit *buf;		/* receiving buffer address */
+{
+	if (!addr || kread(addr, (char *)buf, sizeof(struct qinit))) {
+	    (void) snpf(Namech, Namechl, "can't read queue info from %s",
+		print_kptr(addr, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* HASSTREAMS */
+
+
+/*
+ * safepup() - safely print an unprintable character -- i.e., print it in a
+ *	       printable form
+ *
+ * return: char * to printable equivalent
+ *	   cl = strlen(printable equivalent)
+ */
+
+static char *
+safepup(c, cl)
+	unsigned int c;			/* unprintable (i.e., !isprint())
+					 * character */
+	int *cl;			/* returned printable strlen -- NULL if
+					 * no return needed */
+{
+	int len;
+	char *rp;
+	static char up[8];
+
+	if (c < 0x20) {
+	    switch (c) {
+	    case '\b':
+		rp = "\\b";
+		break;
+	    case '\f':
+		rp = "\\f";
+		break;
+	    case '\n':
+		rp = "\\n";
+		break;
+	    case '\r':
+		rp = "\\r";
+		break;
+	    case '\t':
+		rp = "\\t";
+		break;
+	    default:
+		(void) snpf(up, sizeof(up), "^%c", c + 0x40);
+		rp = up;
+	    }
+	    len = 2;
+	} else if (c == 0xff) {
+	    rp = "^?";
+	    len = 2;
+	} else {
+	    (void) snpf(up, sizeof(up), "\\x%02x", (int)(c & 0xff));
+	    rp = up;
+	    len = 4;
+	}
+	if (cl)
+	    *cl = len;
+	return(rp);
+}
+
+
+/*
+ * safestrlen() - calculate a "safe" string length -- i.e., compute space for
+ *		  non-printable characters when printed in a printable form
+ */
+
+int
+safestrlen(sp, flags)
+	char *sp;			/* string pointer */
+	int flags;			/* flags:
+					 *   bit 0: 0 (0) = no NL
+					 *	    1 (1) = add trailing NL
+					 *	 1: 0 (0) = ' ' printable
+					 *	    1 (2) = ' ' not printable
+					 */
+{
+	char c;
+	int len = 0;
+
+	c = (flags & 2) ? ' ' : '\0';
+	if (sp) {
+	    for (; *sp; sp++) {
+		if (!isprint((unsigned char)*sp) || *sp == c) {
+		    if (*sp < 0x20 || (unsigned char)*sp == 0xff)
+			len += 2;		/* length of \. or ^. form */
+		    else
+			len += 4;		/* length of "\x%02x" printf */
+		} else
+		    len++;
+	    }
+	}
+	return(len);
+}
+
+
+/*
+ * safestrprt() - print a string "safely" to the indicated stream -- i.e.,
+ *		  print unprintable characters in a printable form
+ */
+
+void
+safestrprt(sp, fs, flags)
+	char *sp;			/* string to print pointer pointer */
+	FILE *fs;			/* destination stream -- e.g., stderr
+					 * or stdout */
+	int flags;			/* flags:
+					 *   bit 0: 0 (0) = no NL
+					 *	    1 (1) = add trailing NL
+					 *	 1: 0 (0) = ' ' printable
+					 *	    1 (2) = ' ' not printable
+					 *	 2: 0 (0) = print string as is
+					 *	    1 (4) = surround string
+					 *		    with '"'
+					 *	 4: 0 (0) = print ending '\n'
+					 *	    1 (8) = don't print ending
+					 *		    '\n'
+					 */
+{
+	char c;
+	int lnc, lnt, sl;
+
+#if	defined(HASWIDECHAR)
+	wchar_t w;
+	int wcmx = MB_CUR_MAX;
+#else	/* !defined(HASWIDECHAR) */
+	static int wcmx = 1;
+#endif	/* defined(HASWIDECHAR) */
+
+	c = (flags & 2) ? ' ' : '\0';
+	if (flags & 4)
+	    putc('"', fs);
+	if (sp) {
+	    for (sl = strlen(sp); *sp; sl -= lnc, sp += lnc) {
+
+#if	defined(HASWIDECHAR)
+		if (wcmx > 1) {
+		    lnc = mblen(sp, sl);
+		    if (lnc > 1) {
+			if ((mbtowc(&w, sp, sl) == lnc) && iswprint(w)) {
+			    for (lnt = 0; lnt < lnc; lnt++) {
+				putc((int)*(sp + lnt), fs);
+			    }
+			} else {
+			    for (lnt = 0; lnt < lnc; lnt++) {
+			        fputs(safepup((unsigned int)*(sp + lnt),
+					      (int *)NULL), fs);
+			    }
+			}
+			continue;
+		    } else
+			lnc = 1;
+		} else
+		    lnc = 1;
+#else	/* !defined(HASWIDECHAR) */
+		lnc = 1;
+#endif	/* defined(HASWIDECHAR) */
+
+		if (isprint((unsigned char)*sp) && *sp != c)
+		    putc((int)(*sp & 0xff), fs);
+		else {
+		    if ((flags & 8) && (*sp == '\n') && !*(sp + 1))
+			break;
+		    fputs(safepup((unsigned int)*sp, (int *)NULL), fs);
+		}
+	    }
+	}
+	if (flags & 4)
+	    putc('"', fs);
+	if (flags & 1)
+	    putc('\n', fs);
+}
+
+
+/*
+ * safestrprtn() - print a specified number of characters from a string
+ *		   "safely" to the indicated stream
+ */
+
+void
+safestrprtn(sp, len, fs, flags)
+	char *sp;			/* string to print pointer pointer */
+	int len;			/* safe number of characters to
+					 * print */
+	FILE *fs;			/* destination stream -- e.g., stderr
+					 * or stdout */
+	int flags;			/* flags:
+					 *   bit 0: 0 (0) = no NL
+					 *	    1 (1) = add trailing NL
+					 *	 1: 0 (0) = ' ' printable
+					 *	    1 (2) = ' ' not printable
+					 *	 2: 0 (0) = print string as is
+					 *	    1 (4) = surround string
+					 *		    with '"'
+					 *	 4: 0 (0) = print ending '\n'
+					 *	    1 (8) = don't print ending
+					 *		    '\n'
+					 */
+{
+	char c, *up;
+	int cl, i;
+
+	if (flags & 4)
+	    putc('"', fs);
+	if (sp) {
+	    c = (flags & 2) ? ' ' : '\0';
+	    for (i = 0; i < len && *sp; sp++) {
+		if (isprint((unsigned char)*sp) && *sp != c) {
+		    putc((int)(*sp & 0xff), fs);
+		    i++;
+		} else {
+		    if ((flags & 8) && (*sp == '\n') && !*(sp + 1))
+			break;
+		    up = safepup((unsigned int)*sp, &cl);
+		    if ((i + cl) > len)
+			break;
+		    fputs(up, fs);
+		    i += cl;
+		}
+	    }
+	} else
+	    i = 0;
+	for (; i < len; i++)
+	    putc(' ', fs);
+	if (flags & 4)
+	    putc('"', fs);
+	if (flags & 1)
+	    putc('\n', fs);
+}
+
+
+/*
+ * statsafely() - stat path safely (i. e., with timeout)
+ */
+
+int
+statsafely(path, buf)
+	char *path;			/* file path */
+	struct stat *buf;		/* stat buffer address */
+{
+	if (Fblock) {
+	    if (!Fwarn) 
+		(void) fprintf(stderr,
+		    "%s: avoiding stat(%s): -b was specified.\n",
+		    Pn, path);
+	    errno = EWOULDBLOCK;
+	    return(1);
+	}
+	return(doinchild(dostat, path, (char *)buf, sizeof(struct stat)));
+}
+
+
+/*
+ * stkdir() - stack directory name
+ */
+
+void
+stkdir(p)
+	char *p;		/* directory path */
+{
+	MALLOC_S len;
+/*
+ * Provide adequate space for directory stack pointers.
+ */
+	if (Dstkx >= Dstkn) {
+	    Dstkn += 128;
+	    len = (MALLOC_S)(Dstkn * sizeof(char *));
+	    if (!Dstk)
+		Dstk = (char **)malloc(len);
+	    else
+		Dstk = (char **)realloc((MALLOC_P *)Dstk, len);
+	    if (!Dstk) {
+		(void) fprintf(stderr,
+		    "%s: no space for directory stack at: ", Pn);
+		safestrprt(p, stderr, 1);
+		Exit(1);
+	    }
+	}
+/*
+ * Allocate space for the name, copy it there and put its pointer on the stack.
+ */
+	if (!(Dstk[Dstkx] = mkstrcpy(p, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no space for: ", Pn);
+	    safestrprt(p, stderr, 1);
+	    Exit(1);
+	}
+	Dstkx++;
+}
+
+
+/*
+ * x2dev() - convert hexadecimal ASCII string to device number
+ */
+
+char *
+x2dev(s, d)
+	char *s;			/* ASCII string */
+	dev_t *d;			/* device receptacle */
+{
+	char *cp, *cp1;
+	int n;
+	dev_t r;
+
+/*
+ * Skip an optional leading 0x.  Count the number of hex digits up to the end
+ * of the string, or to a space, or to a comma.  Return an error if an unknown
+ * character is encountered.  If the count is larger than (2 * sizeof(dev_t))
+ * -- e.g., because of sign extension -- ignore excess leading hex 0xf digits,
+ * but return an error if an excess leading digit isn't 0xf.
+ */
+	if  (strncasecmp(s, "0x", 2) == 0)
+		s += 2;
+	for (cp = s, n = 0; *cp; cp++, n++) {
+	    if (isdigit((unsigned char)*cp))
+		continue;
+	    if ((unsigned char)*cp >= 'a' && (unsigned char)*cp <= 'f')
+		continue;
+	    if ((unsigned char)*cp >= 'A' && (unsigned char)*cp <= 'F')
+		continue;
+	    if (*cp == ' ' || *cp == ',')
+		break;
+	    return((char *)NULL);
+	}
+	if (!n)
+	    return((char *)NULL);
+	if (n > (2 * (int)sizeof(dev_t))) {
+	    cp1 = s;
+	    s += (n - (2 * sizeof(dev_t)));
+	    while (cp1 < s) {
+		if (*cp1 != 'f' && *cp1 != 'F')
+		    return((char *)NULL);
+		cp1++;
+	    }
+	}
+/*
+ * Assemble the validated hex digits of the device number, starting at a point
+ * in the string relevant to sizeof(dev_t).
+ */
+	for (r = 0; s < cp; s++) {
+	    r = r << 4;
+	    if (isdigit((unsigned char)*s))
+		r |= (unsigned char)(*s - '0') & 0xf;
+	    else {
+		if (isupper((unsigned char)*s))
+		    r |= ((unsigned char)(*s - 'A') + 10) & 0xf;
+		else
+		    r |= ((unsigned char)(*s - 'a') + 10) & 0xf;
+	    }
+	}
+	*d = r;
+	return(s);
+}
diff --git a/lsof_4.85/lsof_4.85_src/node.c b/lsof_4.85/lsof_4.85_src/node.c
new file mode 100644
index 0000000..2ba020c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/node.c
@@ -0,0 +1,258 @@
+/*
+ * node.c - common node reading functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: node.c,v 1.5 2000/08/01 17:08:05 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * print_kptr() - print kernel pointer
+ */
+
+char *
+print_kptr(kp, buf, bufl)
+	KA_T kp;			/* kernel pointer address */
+	char *buf;			/* optional destination buffer */
+	size_t bufl;			/* size of buf[] */
+{
+	static char dbuf[32];
+
+	(void) snpf(buf ? buf : dbuf,
+		    buf ? bufl : sizeof(dbuf),
+		    KA_T_FMT_X, kp);
+	return(buf ? buf : dbuf);
+}
+
+
+#if	defined(HASCDRNODE)
+/*
+ * readcdrnode() - read CD-ROM node
+ */
+
+int
+readcdrnode(ca, c)
+	KA_T ca;			/* cdrnode kernel address */
+	struct cdrnode *c;		/* cdrnode buffer */
+{
+	if (kread((KA_T)ca, (char *)c, sizeof(struct cdrnode))) {
+	    (void) snpf(Namech, Namechl, "can't read cdrnode at %s",
+		print_kptr(ca, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASCDRNODE) */
+
+
+#if	defined(HASFIFONODE)
+/*
+ * readfifonode() - read fifonode
+ */
+
+int
+readfifonode(fa, f)
+	KA_T fa;			/* fifonode kernel address */
+	struct fifonode *f;		/* fifonode buffer */
+{
+	if (kread((KA_T)fa, (char *)f, sizeof(struct fifonode))) {
+	    (void) snpf(Namech, Namechl, "can't read fifonode at %s",
+		print_kptr(fa, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASFIFONODE) */
+
+
+#if	defined(HASGNODE)
+/*
+ * readgnode() - read gnode
+ */
+
+int
+readgnode(ga, g)
+	KA_T ga;			/* gnode kernel address */
+	struct gnode *g;		/* gnode buffer */
+{
+	if (kread((KA_T)ga, (char *)g, sizeof(struct gnode))) {
+	    (void) snpf(Namech, Namechl, "can't read gnode at %s",
+		print_kptr(ga, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASGNODE) */
+
+
+#if	defined(HASHSNODE)
+/*
+ * readhsnode() - read High Sierra file system node
+ */
+
+int
+readhsnode(ha, h)
+	KA_T ha;			/* hsnode kernel address */
+	struct hsnode *h;		/* hsnode buffer */
+{
+	if (kread((KA_T)ha, (char *)h, sizeof(struct hsnode))) {
+	    (void) snpf(Namech, Namechl, "can't read hsnode at %s",
+		print_kptr(ha, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASHSNODE) */
+
+
+#if	defined(HASINODE)
+/*
+ * readinode() - read inode
+ */
+
+int
+readinode(ia, i)
+	KA_T ia;			/* inode kernel address */
+	struct inode *i;		/* inode buffer */
+{
+	if (kread((KA_T)ia, (char *)i, sizeof(struct inode))) {
+	    (void) snpf(Namech, Namechl, "can't read inode at %s",
+		print_kptr(ia, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASINODE) */
+
+
+#if	defined(HASPIPENODE)
+/*
+ * readpipenode() - read pipe node
+ */
+
+int
+readpipenode(pa, p)
+	KA_T pa;			/* pipe node kernel address */
+	struct pipenode *p;		/* pipe node buffer */
+{
+	if (kread((KA_T)pa, (char *)p, sizeof(struct pipenode))) {
+	    (void) snpf(Namech, Namechl, "can't read pipenode at %s",
+		print_kptr(pa, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASPIPENODE) */
+
+
+#if	defined(HASRNODE)
+/*
+ * readrnode() - read rnode
+ */
+
+int
+readrnode(ra, r)
+	KA_T ra;			/* rnode kernel space address */
+	struct rnode *r;		/* rnode buffer pointer */
+{
+	if (kread((KA_T)ra, (char *)r, sizeof(struct rnode))) {
+	    (void) snpf(Namech, Namechl, "can't read rnode at %s",
+		print_kptr(ra, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASRNODE) */
+
+
+#if	defined(HASSNODE)
+/*
+ * readsnode() - read snode
+ */
+
+int
+readsnode(sa, s)
+	KA_T sa;			/* snode kernel space address */
+	struct snode *s;		/* snode buffer pointer */
+{
+	if (kread((KA_T)sa, (char *)s, sizeof(struct snode))) {
+	    (void) snpf(Namech, Namechl, "can't read snode at %s",
+		print_kptr(sa, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASSNODE) */
+
+
+#if	defined(HASTMPNODE)
+/*
+ * readtnode() - read tmpnode
+ */
+
+int
+readtnode(ta, t)
+	KA_T ta;			/* tmpnode kernel space address */
+	struct tmpnode *t;		/* tmpnode buffer pointer */
+{
+	if (kread((KA_T)ta, (char *)t, sizeof(struct tmpnode))) {
+	    (void) snpf(Namech, Namechl, "can't read tmpnode at %s",
+		print_kptr(ta, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASTMPNODE) */
+
+
+#if	defined(HASVNODE)
+/*
+ * readvnode() - read vnode
+ */
+
+int
+readvnode(va, v)
+	KA_T va;			/* vnode kernel space address */
+	struct vnode *v;		/* vnode buffer pointer */
+{
+	if (kread((KA_T)va, (char *)v, sizeof(struct vnode))) {
+	    (void) snpf(Namech, Namechl, "can't read vnode at %s",
+		print_kptr(va, (char *)NULL, 0));
+	    return(1);
+	}
+	return(0);
+}
+#endif	/* defined(HASVNODE) */
diff --git a/lsof_4.85/lsof_4.85_src/print.c b/lsof_4.85/lsof_4.85_src/print.c
new file mode 100644
index 0000000..0ae32fa
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/print.c
@@ -0,0 +1,2821 @@
+/*
+ * print.c - common print support functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: print.c,v 1.53 2011/09/07 19:13:49 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local definitions, structures and function prototypes
+ */
+
+#define HCINC		64		/* host cache size increase chunk */
+#define PORTHASHBUCKETS	128		/* port hash bucket count
+					 * !!MUST BE A POWER OF 2!! */
+#define	PORTTABTHRESH	10		/* threshold at which we will switch
+					 * from using getservbyport() to
+					 * getservent() -- see lkup_port()
+					 * and fill_porttab() */
+
+struct hostcache {
+	unsigned char a[MAX_AF_ADDR];	/* numeric address */
+	int af;				/* address family -- e.g., AF_INET
+					 * or AF_INET6 */
+	char *name;			/* name */
+};
+
+struct porttab {
+	int port;
+	MALLOC_S nl;			/* name length (excluding '\0') */
+	int ss;				/* service name status, 0 = lookup not
+					 * yet performed */
+	char *name;
+	struct porttab *next;
+};
+
+
+#if	defined(HASNORPC_H)
+static struct porttab **Pth[2] = { NULL, NULL };
+						/* port hash buckets:
+						 * Pth[0] for TCP service names
+						 * Pth[1] for UDP service names
+						 */
+#else	/* !defined(HASNORPC_H) */
+static struct porttab **Pth[4] = { NULL, NULL, NULL, NULL };
+						/* port hash buckets:
+						 * Pth[0] for TCP service names
+						 * Pth[1] for UDP service names
+						 * Pth[2] for TCP portmap info
+						 * Pth[3] for UDP portmap info
+						 */
+#endif	/* defined(HASNORPC_H) */
+
+#define HASHPORT(p)	(((((int)(p)) * 31415) >> 3) & (PORTHASHBUCKETS - 1))
+
+
+#if	!defined(HASNORPC_H)
+_PROTOTYPE(static void fill_portmap,(void));
+_PROTOTYPE(static void update_portmap,(struct porttab *pt, char *pn));
+#endif	/* !defined(HASNORPC_H) */
+
+_PROTOTYPE(static void fill_porttab,(void));
+_PROTOTYPE(static char *lkup_port,(int p, int pr, int src));
+_PROTOTYPE(static char *lkup_svcnam,(int h, int p, int pr, int ss));
+_PROTOTYPE(static int printinaddr,(void));
+
+
+/*
+ * endnm() - locate end of Namech
+ */
+
+char *
+endnm(sz)
+	size_t *sz;			/* returned remaining size */
+{
+	register char *s;
+	register size_t tsz;
+
+	for (s = Namech, tsz = Namechl; *s; s++, tsz--)
+		;
+	*sz = tsz;
+	return(s);
+}
+
+
+#if !defined(HASNORPC_H)
+/*
+ * fill_portmap() -- fill the RPC portmap program name table via a conversation
+ *		     with the portmapper
+ *
+ * The following copyright notice acknowledges that this function was adapted
+ * from getrpcportnam() of the source code of the OpenBSD netstat program.
+ */
+
+/*
+* Copyright (c) 1983, 1988, 1993
+*      The Regents of the University of California.  All rights reserved.
+*
+* Redistribution and use in source and binary forms, with or without
+* modification, are permitted provided that the following conditions
+* are met:
+* 1. Redistributions of source code must retain the above copyright
+*    notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+*    notice, this list of conditions and the following disclaimer in the
+*    documentation and/or other materials provided with the distribution.
+* 3. All advertising materials mentioning features or use of this software
+*    must display the following acknowledgement:
+*      This product includes software developed by the University of
+*      California, Berkeley and its contributors.
+* 4. Neither the name of the University nor the names of its contributors
+*    may be used to endorse or promote products derived from this software
+*    without specific prior written permission.
+*
+* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+* SUCH DAMAGE.
+*/
+
+static void
+fill_portmap()
+{
+	char buf[128], *cp, *nm;
+	CLIENT *c;
+	int h, port, pr;
+	MALLOC_S nl;
+	struct pmaplist *p = (struct pmaplist *)NULL;
+	struct porttab *pt;
+	struct rpcent *r;
+	struct TIMEVAL_LSOF tm;
+
+#if	!defined(CAN_USE_CLNT_CREATE)
+	struct hostent *he;
+	struct sockaddr_in ia;
+	int s = RPC_ANYSOCK;
+#endif	/* !defined(CAN_USE_CLNT_CREATE) */
+
+/*
+ * Construct structures for communicating with the portmapper.
+ */
+
+#if	!defined(CAN_USE_CLNT_CREATE)
+	zeromem(&ia, sizeof(ia));
+	ia.sin_family = AF_INET;
+	if ((he = gethostbyname("localhost")))
+	    MEMMOVE((caddr_t)&ia.sin_addr, he->h_addr, he->h_length);
+	ia.sin_port = htons(PMAPPORT);
+#endif	/* !defined(CAN_USE_CLNT_CREATE) */
+
+	tm.tv_sec = 60;
+	tm.tv_usec = 0;
+/*
+ * Get an RPC client handle.  Then ask for a dump of the port map.
+ */
+
+#if	defined(CAN_USE_CLNT_CREATE)
+	if (!(c = clnt_create("localhost", PMAPPROG, PMAPVERS, "tcp")))
+#else	/* !defined(CAN_USE_CLNT_CREATE) */
+	if (!(c = clnttcp_create(&ia, PMAPPROG, PMAPVERS, &s, 0, 0)))
+#endif	/* defined(CAN_USE_CLNT_CREATE) */
+
+	    return;
+	if (clnt_call(c, PMAPPROC_DUMP, XDR_VOID, NULL, XDR_PMAPLIST,
+		      (caddr_t)&p, tm)
+	!= RPC_SUCCESS) {
+	    clnt_destroy(c);
+	    return;
+	}
+/*
+ * Loop through the port map dump, creating portmap table entries from TCP
+ * and UDP members.
+ */
+	for (; p; p = p->pml_next) {
+	
+	/*
+	 * Determine the port map entry's protocol; ignore all but TCP and UDP.
+	 */
+	    if (p->pml_map.pm_prot == IPPROTO_TCP)
+		pr = 2;
+	    else if (p->pml_map.pm_prot == IPPROTO_UDP)
+		pr = 3;
+	    else
+		continue;
+	/*
+	 * See if there's already a portmap entry for this port.  If there is,
+	 * ignore this entry.
+	 */
+	    h = HASHPORT((port = (int)p->pml_map.pm_port));
+	    for (pt = Pth[pr][h]; pt; pt = pt->next) {
+		if (pt->port == port)
+		    break;
+	    }
+	    if (pt)
+		continue;
+	/*
+	 * Save the registration name or number.
+	 */
+	    cp = (char *)NULL;
+	    if ((r = (struct rpcent *)getrpcbynumber(p->pml_map.pm_prog))) {
+		if (r->r_name && strlen(r->r_name))
+		    cp = r->r_name;
+	    }
+	    if (!cp) {
+		(void) snpf(buf, sizeof(buf), "%lu",
+			    (unsigned long)p->pml_map.pm_prog);
+		cp = buf;
+	    }
+	    if (!strlen(cp))
+		continue;
+	/*
+	 * Allocate space for the portmap name entry and copy it there.
+	 */
+	    if (!(nm = mkstrcpy(cp, &nl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate space for portmap entry: ", Pn);
+		safestrprt(cp, stderr, 1);
+		Exit(1);
+	    }
+	    if (!nl) {
+		(void) free((FREE_P *)nm);
+		continue;
+	    }
+	/*
+	 * Allocate and fill a porttab struct entry for the portmap table.
+	 * Link it to the head of its hash bucket, and make it the new head.
+	 */
+	    if (!(pt = (struct porttab *)malloc(sizeof(struct porttab)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate porttab entry for portmap: ", Pn);
+		safestrprt(nm, stderr, 1);
+		Exit(1);
+	    }
+	    pt->name = nm;
+	    pt->nl = nl;
+	    pt->port = port;
+	    pt->next = Pth[pr][h];
+	    pt->ss = 0;
+	    Pth[pr][h] = pt;
+	}
+	clnt_destroy(c);
+}
+#endif	/* !defined(HASNORPC_H) */
+
+
+/*
+ * fill_porttab() -- fill the TCP and UDP service name port table with a
+ *		     getservent() scan
+ */
+
+static void
+fill_porttab()
+{
+	int h, p, pr;
+	MALLOC_S nl;
+	char *nm;
+	struct porttab *pt;
+	struct servent *se;
+
+	(void) endservent();
+/*
+ * Scan the services data base for TCP and UDP entries that have a non-null
+ * name associated with them.
+ */
+	(void) setservent(1);
+	while ((se = getservent())) {
+	    if (!se->s_name || !se->s_proto)
+		continue;
+	    if (strcasecmp(se->s_proto, "TCP") == 0)
+		pr = 0;
+	    else if (strcasecmp(se->s_proto, "UDP") == 0)
+		pr = 1;
+	    else
+		continue;
+	    if (!se->s_name || !strlen(se->s_name))
+		continue;
+	    p = ntohs(se->s_port);
+	/*
+	 * See if a port->service entry is already cached for this port and
+	 * prototcol.  If it is, leave it alone.
+	 */
+	    h = HASHPORT(p);
+	    for (pt = Pth[pr][h]; pt; pt = pt->next) {
+		if (pt->port == p)
+		    break;
+	    }
+	    if (pt)
+		continue;
+	/*
+	 * Add a new entry to the cache for this port and protocol.
+	 */
+	    if (!(nm = mkstrcpy(se->s_name, &nl))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate %d bytes for port %d name: %s\n",
+		    Pn, (int)(nl + 1), p, se->s_name);
+		Exit(1);
+	    }
+	    if (!nl) {
+		(void) free((FREE_P *)nm);
+		continue;
+	    }
+	    if (!(pt = (struct porttab *)malloc(sizeof(struct porttab)))) {
+		(void) fprintf(stderr,
+		    "%s: can't allocate porttab entry for port %d: %s\n",
+		    Pn, p, se->s_name);
+		Exit(1);
+	    }
+	    pt->name = nm;
+	    pt->nl = nl - 1;
+	    pt->port = p;
+	    pt->next = Pth[pr][h];
+	    pt->ss = 0;
+	    Pth[pr][h] = pt;
+	}
+	(void) endservent();
+}
+
+
+/*
+ * gethostnm() - get host name
+ */
+
+char *
+gethostnm(ia, af)
+	unsigned char *ia;		/* Internet address */
+	int af;				/* address family -- e.g., AF_INET
+					 * or AF_INET6 */
+{
+	int al = MIN_AF_ADDR;
+	char hbuf[256];
+	static struct hostcache *hc = (struct hostcache *)NULL;
+	static int hcx = 0;
+	char *hn, *np;
+	struct hostent *he = (struct hostent *)NULL;
+	int i, j;
+	MALLOC_S len;
+	static int nhc = 0;
+/*
+ * Search cache.
+ */
+
+#if	defined(HASIPv6)
+	if (af == AF_INET6)
+	    al = MAX_AF_ADDR;
+#endif	/* defined(HASIPv6) */
+
+	for (i = 0; i < hcx; i++) {
+	    if (af != hc[i].af)
+		continue;
+	    for (j = 0; j < al; j++) {
+		if (ia[j] != hc[i].a[j])
+		    break;
+	    }
+	    if (j >= al)
+		return(hc[i].name);
+	}
+/*
+ * If -n has been specified, construct a numeric address.  Otherwise, look up
+ * host name by address.  If that fails, or if there is no name in the returned
+ * hostent structure, construct a numeric version of the address.
+ */
+	if (Fhost)
+	    he = gethostbyaddr((char *)ia, al, af);
+	if (!he || !he->h_name) {
+
+#if	defined(HASIPv6)
+	    if (af == AF_INET6) {
+
+	    /*
+	     * Since IPv6 numeric addresses use `:' as a separator, enclose
+	     * them in brackets.
+	     */
+		hbuf[0] = '[';
+		if (!inet_ntop(af, ia, hbuf + 1, sizeof(hbuf) - 3)) {
+		    (void) snpf(&hbuf[1], (sizeof(hbuf) - 1),
+			"can't format IPv6 address]");
+		} else {
+		    len = strlen(hbuf);
+		    (void) snpf(&hbuf[len], sizeof(hbuf) - len, "]");
+		}
+	    } else
+#endif	/* defined(HASIPv6) */
+
+	    if (af == AF_INET)
+		(void) snpf(hbuf, sizeof(hbuf), "%u.%u.%u.%u", ia[0], ia[1],
+			    ia[2], ia[3]);
+	    else
+		(void) snpf(hbuf, sizeof(hbuf), "(unknown AF value: %d)", af);
+	    hn = hbuf;
+	} else
+	    hn = (char *)he->h_name;
+/*
+ * Allocate space for name and copy name to it.
+ */
+	if (!(np = mkstrcpy(hn, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: no space for host name: ", Pn);
+	    safestrprt(hn, stderr, 1);
+	    Exit(1);
+	}
+/*
+ * Add address/name entry to cache.  Allocate cache space in HCINC chunks.
+ */
+	if (hcx >= nhc) {
+	    nhc += HCINC;
+	    len = (MALLOC_S)(nhc * sizeof(struct hostcache));
+	    if (!hc)
+		hc = (struct hostcache *)malloc(len);
+	    else
+		hc = (struct hostcache *)realloc((MALLOC_P *)hc, len);
+	    if (!hc) {
+		(void) fprintf(stderr, "%s: no space for host cache\n", Pn);
+		Exit(1);
+	    }
+	}
+	hc[hcx].af = af;
+	for (i = 0; i < al; i++) {
+	    hc[hcx].a[i] = ia[i];
+	}
+	hc[hcx++].name = np;
+	return(np);
+}
+
+
+/*
+ * lkup_port() - look up port for protocol
+ */
+
+static char *
+lkup_port(p, pr, src)
+	int p;				/* port number */
+	int pr;				/* protocol index: 0 = tcp, 1 = udp */
+	int src;			/* port source: 0 = local
+					 *		1 = foreign */
+{
+	int h, nh;
+	MALLOC_S nl;
+	char *nm, *pn;
+	static char pb[128];
+	static int pm = 0;
+	struct porttab *pt;
+/*
+ * If the hash buckets haven't been allocated, do so.
+ */
+	if (!Pth[0]) {
+
+#if	defined(HASNORPC_H)
+	    nh = 2;
+#else	/* !defined(HASNORPC_H) */
+	    nh = FportMap ? 4 : 2;
+#endif	/* defined(HASNORPC_H) */
+
+	    for (h = 0; h < nh; h++) {
+		if (!(Pth[h] = (struct porttab **)calloc(PORTHASHBUCKETS,
+				sizeof(struct porttab *))))
+		{
+		    (void) fprintf(stderr,
+		      "%s: can't allocate %d bytes for %s %s hash buckets\n",
+		      Pn,
+		      (int)(2 * (PORTHASHBUCKETS * sizeof(struct porttab *))),
+		      (h & 1) ? "UDP" : "TCP",
+		      (h > 1) ? "portmap" : "port");
+		    Exit(1);
+		}
+	    }
+	}
+
+#if	!defined(HASNORPC_H)
+/*
+ * If we're looking up program names for portmapped ports, make sure the
+ * portmap table has been loaded.
+ */
+	if (FportMap && !pm) {
+	    (void) fill_portmap();
+	    pm++;
+	}
+#endif	/* !defined(HASNORPC_H) */
+
+/*
+ * Hash the port and see if its name has been cached.  Look for a local
+ * port first in the portmap, if portmap searching is enabled.
+ */
+	h = HASHPORT(p);
+
+#if	!defined(HASNORPC_H)
+	if (!src && FportMap) {
+	    for (pt = Pth[pr+2][h]; pt; pt = pt->next) {
+		if (pt->port != p)
+		    continue;
+		if (!pt->ss) {
+		    pn = Fport ? lkup_svcnam(h, p, pr, 0) : (char *)NULL;
+		    if (!pn) {
+			(void) snpf(pb, sizeof(pb), "%d", p);
+			pn = pb;
+		    }
+		    (void) update_portmap(pt, pn);
+		}
+		return(pt->name);
+	    }
+	}
+#endif	/* !defined(HASNORPC_H) */
+
+	for (pt = Pth[pr][h]; pt; pt = pt->next) {
+	    if (pt->port == p)
+		return(pt->name);
+	}
+/*
+ * Search for a possible service name, unless the -P option has been specified.
+ *
+ * If there is no service name, return a %d conversion.
+ *
+ * Don't cache %d conversions; a zero port number is a %d conversion that
+ * is represented by "*".
+ */
+	pn = Fport ? lkup_svcnam(h, p, pr, 1) : (char *)NULL;
+	if (!pn || !strlen(pn)) {
+	    if (p) {
+		(void) snpf(pb, sizeof(pb), "%d", p);
+		return(pb);
+	    } else
+		return("*");
+	}
+/*
+ * Allocate a new porttab entry for the TCP or UDP service name.
+ */
+	if (!(pt = (struct porttab *)malloc(sizeof(struct porttab)))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate porttab entry for port %d\n", Pn, p);
+	    Exit(1);
+	}
+/*
+ * Allocate space for the name; copy it to the porttab entry; and link the
+ * porttab entry to its hash bucket.
+ *
+ * Return a pointer to the name.
+ */
+	if (!(nm = mkstrcpy(pn, &nl))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate space for port name: ", Pn);
+	    safestrprt(pn, stderr, 1);
+	    Exit(1);
+	}
+	pt->name = nm;
+	pt->nl = nl;
+	pt->port = p;
+	pt->next = Pth[pr][h];
+	pt->ss = 0;
+	Pth[pr][h] = pt;
+	return(nm);
+}
+
+
+/*
+ * lkup_svcnam() - look up service name for port
+ */
+
+static char *
+lkup_svcnam(h, p, pr, ss)
+	int h;				/* porttab hash index */
+	int p;				/* port number */
+	int pr;				/* protocol: 0 = TCP, 1 = UDP */
+	int ss;				/* search status: 1 = Pth[pr][h]
+					 *		  already searched */
+{
+	static int fl[PORTTABTHRESH];
+	static int fln = 0;
+	static int gsbp = 0;
+	int i;
+	struct porttab *pt;
+	static int ptf = 0;
+	struct servent *se;
+/*
+ * Do nothing if -P has been specified.
+ */
+	if (!Fport)
+	    return((char *)NULL);
+
+	for (;;) {
+
+	/*
+	 * Search service name cache, if it hasn't already been done.
+	 * Return the name of a match.
+	 */
+	    if (!ss) {
+		for (pt = Pth[pr][h]; pt; pt = pt->next) {
+		    if (pt->port == p)
+			return(pt->name);
+		}
+	    }
+/*
+ * If fill_porttab() has been called, there is no service name.
+ *
+ * Do PORTTABTHRES getservbport() calls, remembering the failures, so they
+ * won't be repeated.
+ *
+ * After PORTABTHRESH getservbyport() calls, call fill_porttab() once,
+ */
+	    if (ptf)
+		break;
+	    if (gsbp < PORTTABTHRESH) {
+		for (i = 0; i < fln; i++) {
+		    if (fl[i] == p)
+			return((char *)NULL);
+		}
+		gsbp++;
+		if ((se = getservbyport(htons(p), pr ? "udp" : "tcp")))
+		    return(se->s_name);
+		if (fln < PORTTABTHRESH)
+		    fl[fln++] = p;
+		return((char *)NULL);
+	    }
+	    (void) fill_porttab();
+	    ptf++;
+	    ss = 0;
+	}
+	return((char *)NULL);
+}
+
+
+/*
+ * print_file() - print file
+ */
+
+void
+print_file()
+{
+	char buf[128];
+	char *cp = (char *)NULL;
+	dev_t dev;
+	int devs, len;
+
+	if (PrPass && !Hdr) {
+
+	/*
+	 * Print the header line if this is the second pass and the
+	 * header hasn't already been printed.
+	 */
+	    (void) printf("%-*.*s %*s", CmdColW, CmdColW, CMDTTL, PidColW,
+		PIDTTL);
+
+#if	defined(HASTASKS)
+	    if (TaskPrtFl)
+		(void) printf(" %*s", TidColW, TIDTTL);
+#endif	/* defined(HASTASKS)
+
+#if	defined(HASZONES)
+	    if (Fzone)
+		(void) printf(" %-*s", ZoneColW, ZONETTL);
+#endif	/* defined(HASZONES) */
+
+#if	defined(HASSELINUX)
+	    if (Fcntx)
+		(void) printf(" %-*s", CntxColW, CNTXTTL);
+#endif /* defined(HASSELINUX) */
+
+#if	defined(HASPPID)
+	    if (Fppid)
+	 	(void) printf(" %*s", PpidColW, PPIDTTL);
+#endif	/* defined(HASPPID) */
+
+	    if (Fpgid)
+		(void) printf(" %*s", PgidColW, PGIDTTL);
+	    (void) printf(" %*s %*s   %*s",
+		UserColW, USERTTL,
+		FdColW - 2, FDTTL,
+		TypeColW, TYPETTL);
+
+#if	defined(HASFSTRUCT)
+	    if (Fsv) {
+
+# if	!defined(HASNOFSADDR)
+		if (Fsv & FSV_FA)
+		    (void) printf(" %*s", FsColW, FSTTL);
+# endif	/* !defined(HASNOFSADDR) */
+
+# if	!defined(HASNOFSCOUNT)
+		if (Fsv & FSV_CT)
+		    (void) printf(" %*s", FcColW, FCTTL);
+# endif	/* !defined(HASNOFSCOUNT) */
+
+# if	!defined(HASNOFSFLAGS)
+		if (Fsv & FSV_FG)
+		    (void) printf(" %*s", FgColW, FGTTL);
+# endif	/* !defined(HASNOFSFLAGS) */
+
+# if	!defined(HASNOFSNADDR)
+		if (Fsv & FSV_NI)
+		    (void) printf(" %*s", NiColW, NiTtl);
+# endif	/* !defined(HASNOFSNADDR) */
+
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	    (void) printf(" %*s", DevColW, DEVTTL);
+	    if (Foffset)
+		(void) printf(" %*s", SzOffColW, OFFTTL);
+	    else if (Fsize)
+		(void) printf(" %*s", SzOffColW, SZTTL);
+	    else
+		(void) printf(" %*s", SzOffColW, SZOFFTTL);
+	    if (Fnlink)
+		(void) printf(" %*s", NlColW, NLTTL);
+	    (void) printf(" %*s %s\n", NodeColW, NODETTL, NMTTL);
+	    Hdr++;
+	}
+/*
+ * Size or print the command.
+ */
+	cp = (Lp->cmd && *Lp->cmd != '\0') ? Lp->cmd : "(unknown)";
+	if (!PrPass) {
+	    len = safestrlen(cp, 2);
+	    if (CmdLim && (len > CmdLim))
+		len = CmdLim;
+	    if (len > CmdColW)
+		CmdColW = len;
+	} else
+	    safestrprtn(cp, CmdColW, stdout, 2);
+/*
+ * Size or print the process ID.
+ */
+	if (!PrPass) {
+	    (void) snpf(buf, sizeof(buf), "%d", Lp->pid);
+	    if ((len = strlen(buf)) > PidColW)
+		PidColW = len;
+	} else
+	    (void) printf(" %*d", PidColW, Lp->pid);
+
+#if	defined(HASTASKS)
+/*
+ * Size or print task ID.
+ */
+	if (!PrPass) {
+	    if (Lp->tid) {
+		(void) snpf(buf, sizeof(buf), "%d", Lp->tid);
+		if ((len = strlen(buf)) > TidColW)
+		    TidColW = len;
+		TaskPrtFl = 1;
+	    }
+	} else if (TaskPrtFl) {
+	    if (Lp->tid)
+		(void) printf(" %*d", TidColW, Lp->tid);
+	    else
+		(void) printf(" %*s", TidColW, "");
+	}
+#endif	/* defined(HASTASKS) */
+
+#if	defined(HASZONES)
+/*
+ * Size or print the zone.
+ */
+	if (Fzone) {
+	    if (!PrPass) {
+		if (Lp->zn) {
+		    if ((len = strlen(Lp->zn)) > ZoneColW)
+			ZoneColW = len;
+		}
+	    } else
+		(void) printf(" %-*s", ZoneColW, Lp->zn ? Lp->zn : "");
+	}
+#endif	/* defined(HASZONES) */
+
+#if	defined(HASSELINUX)
+/*
+ * Size or print the context.
+ */
+	if (Fcntx) {
+	    if (!PrPass) {
+		if (Lp->cntx) {
+		    if ((len = strlen(Lp->cntx)) > CntxColW)
+			CntxColW = len;
+		}
+	    } else
+		(void) printf(" %-*s", CntxColW, Lp->cntx ? Lp->cntx : "");
+	}
+#endif	/* defined(HASSELINUX) */
+
+#if	defined(HASPPID)
+	if (Fppid) {
+
+	/*
+	 * Size or print the parent process ID.
+	 */
+	    if (!PrPass) {
+		(void) snpf(buf, sizeof(buf), "%d", Lp->ppid);
+		if ((len = strlen(buf)) > PpidColW)
+		    PpidColW = len;
+	    } else
+		(void) printf(" %*d", PpidColW, Lp->ppid);
+	}
+#endif	/* defined(HASPPID) */
+
+	if (Fpgid) {
+
+	/*
+	 * Size or print the process group ID.
+	 */
+	    if (!PrPass) {
+		(void) snpf(buf, sizeof(buf), "%d", Lp->pgid);
+		if ((len = strlen(buf)) > PgidColW)
+		    PgidColW = len;
+	    } else
+		(void) printf(" %*d", PgidColW, Lp->pgid);
+	}
+/*
+ * Size or print the user ID or login name.
+ */
+	if (!PrPass) {
+	    if ((len = strlen(printuid((UID_ARG)Lp->uid, NULL))) > UserColW)
+		UserColW = len;
+	} else
+	    (void) printf(" %*.*s", UserColW, UserColW,
+		printuid((UID_ARG)Lp->uid, NULL));
+/*
+ * Size or print the file descriptor, access mode and lock status.
+ */
+	if (!PrPass) {
+	    (void) snpf(buf, sizeof(buf), "%s%c%c",
+		Lf->fd,
+		(Lf->lock == ' ') ? Lf->access
+				  : (Lf->access == ' ') ? '-'
+							: Lf->access,
+		Lf->lock);
+	    if ((len = strlen(buf)) > FdColW)
+		FdColW = len;
+	} else
+	    (void) printf(" %*.*s%c%c", FdColW - 2, FdColW - 2, Lf->fd,
+		(Lf->lock == ' ') ? Lf->access
+				  : (Lf->access == ' ') ? '-'
+							: Lf->access,
+		Lf->lock);
+/*
+ * Size or print the type.
+ */
+	if (!PrPass) {
+	    if ((len = strlen(Lf->type)) > TypeColW)
+		TypeColW = len;
+	} else
+	    (void) printf(" %*.*s", TypeColW, TypeColW, Lf->type);
+
+#if	defined(HASFSTRUCT)
+/*
+ * Size or print the file structure address, file usage count, and node
+ * ID (address).
+ */
+
+	if (Fsv) {
+
+# if	!defined(HASNOFSADDR)
+	    if (Fsv & FSV_FA) {
+		cp =  (Lf->fsv & FSV_FA) ? print_kptr(Lf->fsa, buf, sizeof(buf))
+					 : "";
+		if (!PrPass) {
+		    if ((len = strlen(cp)) > FsColW)
+			FsColW = len;
+		} else
+		    (void) printf(" %*.*s", FsColW, FsColW, cp);
+		    
+	    }
+# endif	/* !defined(HASNOFSADDR) */
+
+# if	!defined(HASNOFSCOUNT)
+	    if (Fsv & FSV_CT) {
+		if (Lf->fsv & FSV_CT) {
+		    (void) snpf(buf, sizeof(buf), "%ld", Lf->fct);
+		    cp = buf;
+		} else
+		    cp = "";
+		if (!PrPass) {
+		    if ((len = strlen(cp)) > FcColW)
+			FcColW = len;
+		} else
+		    (void) printf(" %*.*s", FcColW, FcColW, cp);
+	    }
+# endif	/* !defined(HASNOFSCOUNT) */
+
+# if	!defined(HASNOFSFLAGS)
+	    if (Fsv & FSV_FG) {
+		if ((Lf->fsv & FSV_FG) && (FsvFlagX || Lf->ffg || Lf->pof))
+		    cp = print_fflags(Lf->ffg, Lf->pof);
+		else
+		    cp = "";
+		if (!PrPass) {
+		    if ((len = strlen(cp)) > FgColW)
+			FgColW = len;
+		} else
+		    (void) printf(" %*.*s", FgColW, FgColW, cp);
+	    }
+# endif	/* !defined(HASNOFSFLAGS) */
+
+# if	!defined(HASNOFSNADDR)
+	    if (Fsv & FSV_NI) {
+		cp = (Lf->fsv & FSV_NI) ? print_kptr(Lf->fna, buf, sizeof(buf))
+					: "";
+		if (!PrPass) {
+		    if ((len = strlen(cp)) > NiColW)
+			NiColW = len;
+		} else
+		    (void) printf(" %*.*s", NiColW, NiColW, cp);
+	    }
+# endif	/* !defined(HASNOFSNADDR) */
+
+	}
+#endif	/* defined(HASFSTRUCT) */
+
+/*
+ * Size or print the device information.
+ */
+
+	if (Lf->rdev_def) {
+	    dev = Lf->rdev;
+	    devs = 1;
+	} else if (Lf->dev_def) {
+	    dev = Lf->dev;
+	    devs = 1;
+	} else
+	    devs = 0;
+	if (devs) {
+
+#if	defined(HASPRINTDEV)
+	    cp = HASPRINTDEV(Lf, &dev);
+#else	/* !defined(HASPRINTDEV) */
+	    (void) snpf(buf, sizeof(buf), "%u,%u", GET_MAJ_DEV(dev),
+		GET_MIN_DEV(dev));
+	    cp = buf;
+#endif	/* defined(HASPRINTDEV) */
+
+	}
+
+	if (!PrPass) {
+	    if (devs)
+		len = strlen(cp);
+	    else if (Lf->dev_ch)
+		len = strlen(Lf->dev_ch);
+	    else
+		len = 0;
+	    if (len > DevColW)
+		DevColW = len;
+	} else {
+	    if (devs)
+		(void) printf(" %*.*s", DevColW, DevColW, cp);
+	    else {
+		if (Lf->dev_ch)
+		    (void) printf(" %*.*s", DevColW, DevColW, Lf->dev_ch);
+		else
+		    (void) printf(" %*.*s", DevColW, DevColW, "");
+	    }
+	}
+/*
+ * Size or print the size or offset.
+ */
+	if (!PrPass) {
+	    if (Lf->sz_def) {
+
+#if	defined(HASPRINTSZ)
+		cp = HASPRINTSZ(Lf);
+#else	/* !defined(HASPRINTSZ) */
+		(void) snpf(buf, sizeof(buf), SzOffFmt_d, Lf->sz);
+		cp = buf;
+#endif	/* defined(HASPRINTSZ) */
+
+		len = strlen(cp);
+	    } else if (Lf->off_def) {
+
+#if	defined(HASPRINTOFF)
+		cp = HASPRINTOFF(Lf, 0);
+#else	/* !defined(HASPRINTOFF) */
+		(void) snpf(buf, sizeof(buf), SzOffFmt_0t, Lf->off);
+		cp = buf;
+#endif	/* defined(HASPRINTOFF) */
+
+		len = strlen(cp);
+		if (OffDecDig && len > (OffDecDig + 2)) {
+
+#if	defined(HASPRINTOFF)
+		    cp = HASPRINTOFF(Lf, 1);
+#else	/* !defined(HASPRINTOFF) */
+		    (void) snpf(buf, sizeof(buf), SzOffFmt_x, Lf->off);
+		    cp = buf;
+#endif	/* defined(HASPRINTOFF) */
+
+		    len = strlen(cp);
+		}
+	    } else
+		len = 0;
+	    if (len > SzOffColW)
+		SzOffColW = len;
+	} else {
+	    putchar(' ');
+	    if (Lf->sz_def)
+
+#if	defined(HASPRINTSZ)
+		(void) printf("%*.*s", SzOffColW, SzOffColW, HASPRINTSZ(Lf));
+#else	/* !defined(HASPRINTSZ) */
+		(void) printf(SzOffFmt_dv, SzOffColW, Lf->sz);
+#endif	/* defined(HASPRINTSZ) */
+
+	    else if (Lf->off_def) {
+
+#if	defined(HASPRINTOFF)
+		cp = HASPRINTOFF(Lf, 0);
+#else	/* !defined(HASPRINTOFF) */
+		(void) snpf(buf, sizeof(buf), SzOffFmt_0t, Lf->off);
+		cp = buf;
+#endif	/* defined(HASPRINTOFF) */
+
+		if (OffDecDig && (int)strlen(cp) > (OffDecDig + 2)) {
+
+#if	defined(HASPRINTOFF)
+		    cp = HASPRINTOFF(Lf, 1);
+#else	/* !defined(HASPRINTOFF) */
+		    (void) snpf(buf, sizeof(buf), SzOffFmt_x, Lf->off);
+		    cp = buf;
+#endif	/* defined(HASPRINTOFF) */
+
+		}
+		(void) printf("%*.*s", SzOffColW, SzOffColW, cp);
+	    } else
+		(void) printf("%*.*s", SzOffColW, SzOffColW, "");
+	}
+/*
+ * Size or print the link count.
+ */
+	if (Fnlink) {
+	    if (Lf->nlink_def) {
+		(void) snpf(buf, sizeof(buf), " %ld", Lf->nlink);
+		cp = buf;
+	   } else
+		cp = "";
+	    if (!PrPass) {
+		if ((len = strlen(cp)) > NlColW)
+		    NlColW = len;
+	    } else
+		(void) printf(" %*s", NlColW, cp);
+	}
+/*
+ * Size or print the inode information.
+ */
+	switch (Lf->inp_ty) {
+	case 1:
+
+#if	defined(HASPRINTINO)
+	    cp = HASPRINTINO(Lf);
+#else	/* !defined(HASPRINTINO) */
+	    (void) snpf(buf, sizeof(buf), InodeFmt_d, Lf->inode);
+	    cp = buf;
+#endif	/* defined(HASPRINTINO) */
+
+	    break;
+	case 2:
+	    if (Lf->iproto[0])
+		cp = Lf->iproto;
+	    else
+		cp = "";
+	    break;
+	case 3:
+	    (void) snpf(buf, sizeof(buf), InodeFmt_x, Lf->inode);
+	    cp = buf;
+	    break;
+	default:
+	    cp = "";
+	}
+	if (!PrPass) {
+	    if ((len = strlen(cp)) > NodeColW)
+		NodeColW = len;
+	} else {
+	    (void) printf(" %*.*s", NodeColW, NodeColW, cp);
+	}
+/*
+ * If this is the second pass, print the name column.  (It doesn't need
+ * to be sized.)
+ */
+	if (PrPass) {
+	    putchar(' ');
+
+#if	defined(HASPRINTNM)
+	    HASPRINTNM(Lf);
+#else	/* !defined(HASPRINTNM) */
+	    printname(1);
+#endif	/* defined(HASPRINTNM) */
+
+	}
+}
+
+
+/*
+ * printinaddr() - print Internet addresses
+ */
+
+static int
+printinaddr()
+{
+	int i, len, src;
+	char *host, *port;
+	int nl = Namechl - 1;
+	char *np = Namech;
+	char pbuf[32];
+/*
+ * Process local network address first.  If there's a foreign address,
+ * separate it from the local address with "->".
+ */
+	for (i = 0, *np = '\0'; i < 2; i++) {
+	    if (!Lf->li[i].af)
+		continue;
+	    host = port = (char *)NULL;
+	    if (i) {
+
+	    /*
+	     * If this is the foreign address, insert the separator.
+	     */
+		if (nl < 2)
+
+addr_too_long:
+
+		    {
+			(void) snpf(Namech, Namechl,
+			    "network addresses too long");
+			return(1);
+		    }
+		(void) snpf(np, nl, "->");
+		np += 2;
+		nl -= 2;
+	    }
+	/*
+	 * Convert the address to a host name.
+	 */
+
+#if	defined(HASIPv6)
+	    if ((Lf->li[i].af == AF_INET6
+	    &&   IN6_IS_ADDR_UNSPECIFIED(&Lf->li[i].ia.a6))
+	    ||  (Lf->li[i].af == AF_INET
+	    &&    Lf->li[i].ia.a4.s_addr == INADDR_ANY))
+		host ="*";
+	    else
+		host = gethostnm((unsigned char *)&Lf->li[i].ia, Lf->li[i].af);
+#else /* !defined(HASIPv6) */
+	    if (Lf->li[i].ia.a4.s_addr == INADDR_ANY)
+		host ="*";
+	    else
+		host = gethostnm((unsigned char *)&Lf->li[i].ia, Lf->li[i].af);
+#endif	/* defined(HASIPv6) */
+
+	/*
+	 * Process the port number.
+	 */
+	    if (Lf->li[i].p > 0) {
+
+		if (Fport
+
+#if	!defined(HASNORPC_H)
+		||  FportMap
+#endif	/* defined(HASNORPC_H) */
+
+		) {
+
+		/*
+		 * If converting port numbers to service names, or looking
+		 * up portmap program names and numbers, do so by protocol.
+		 *
+		 * Identify the port source as local if: 1) it comes from the
+		 * local entry (0) of the file's Internet address array; or
+		 * 2) it comes from  the foreign entry (1), and the foreign
+		 * Internet address matches the local one; or 3) it is the
+		 * loopback address 127.0.0.1.  (Test 2 may not always work
+		 * -- e.g., on hosts with multiple interfaces.)
+		 */
+#if	!defined(HASNORPC_H)
+		    if ((src = i) && FportMap) {
+
+# if	defined(HASIPv6)
+			if (Lf->li[0].af == AF_INET6) {
+			    if (IN6_IS_ADDR_LOOPBACK(&Lf->li[i].ia.a6)
+			    ||  IN6_ARE_ADDR_EQUAL(&Lf->li[0].ia.a6,
+						   &Lf->li[1].ia.a6)
+			    )
+				src = 0;
+			} else
+# endif	/* defined(HASIPv6) */
+
+			if (Lf->li[0].af == AF_INET) {
+			    if (Lf->li[i].ia.a4.s_addr == htonl(INADDR_LOOPBACK)
+			    ||  Lf->li[0].ia.a4.s_addr == Lf->li[1].ia.a4.s_addr
+			    )
+				src = 0;
+			}
+		    }
+#endif	/* !defined(HASNORPC_H) */
+
+		    if (strcasecmp(Lf->iproto, "TCP") == 0)
+			port = lkup_port(Lf->li[i].p, 0, src);
+		    else if (strcasecmp(Lf->iproto, "UDP") == 0)
+			port = lkup_port(Lf->li[i].p, 1, src);
+		}
+		if (!port) {
+		    (void) snpf(pbuf, sizeof(pbuf), "%d", Lf->li[i].p);
+		    port = pbuf;
+		}
+	    } else if (Lf->li[i].p == 0)
+		port = "*";
+	/*
+	 * Enter the host name.
+	 */
+	    if (host) {
+		if ((len = strlen(host)) > nl)
+		    goto addr_too_long;
+		if (len) {
+		    (void) snpf(np, nl, "%s", host);
+		    np += len;
+		    nl -= len;
+		}
+	    }
+	/*
+	 * Enter the port number, preceded by a colon.
+	 */
+	    if (port) {
+		if (((len = strlen(port)) + 1) >= nl)
+		    goto addr_too_long;
+		(void) snpf(np, nl, ":%s", port);
+		np += len + 1;
+		nl -= len - 1;
+	    }
+	}
+	if (Namech[0]) {
+	    safestrprt(Namech, stdout, 0);
+	    return(1);
+	}
+	return(0);
+}
+
+
+/*
+ * print_init() - initialize for printing
+ */
+
+void
+print_init()
+{
+	PrPass = (Ffield || Fterse) ? 1 : 0;
+	CmdColW = strlen(CMDTTL);
+	DevColW = strlen(DEVTTL);
+	FdColW = strlen(FDTTL);
+	if (Fnlink)
+	    NlColW = strlen(NLTTL);
+	NmColW = strlen(NMTTL);
+	NodeColW = strlen(NODETTL);
+	PgidColW = strlen(PGIDTTL);
+	PidColW = strlen(PIDTTL);
+	PpidColW = strlen(PPIDTTL);
+	if (Fsize)
+	    SzOffColW = strlen(SZTTL);
+	else if (Foffset)
+	    SzOffColW = strlen(OFFTTL);
+	else
+	    SzOffColW = strlen(SZOFFTTL);
+	TaskPrtFl = 0;
+
+#if	defined(HASTASKS)
+	TidColW = strlen(TIDTTL);
+#endif	/* defined(HASTASKS) */
+
+	TypeColW = strlen(TYPETTL);
+	UserColW = strlen(USERTTL);
+
+#if	defined(HASFSTRUCT)
+
+# if	!defined(HASNOFSADDR)
+	FsColW = strlen(FSTTL);
+# endif	/* !defined(HASNOFSADDR) */
+
+# if	!defined(HASNOFSCOUNT)
+	FcColW = strlen(FCTTL);
+# endif	/* !defined(HASNOFSCOUNT) */
+
+# if	!defined(HASNOFSFLAGS)
+	FgColW = strlen(FGTTL);
+# endif	/* !defined(HASNOFSFLAGS) */
+
+# if	!defined(HASNOFSNADDR)
+	NiColW = strlen(NiTtl);
+# endif	/* !defined(HASNOFSNADDR) */
+#endif	/* defined(HASFSTRUCT) */
+
+#if	defined(HASSELINUX)
+	if (Fcntx)
+	    CntxColW = strlen(CNTXTTL);
+#endif	/* defined(HASSELINUX) */
+
+#if	defined(HASZONES)
+	if (Fzone)
+	    ZoneColW = strlen(ZONETTL);
+#endif	/* defined(HASZONES) */
+
+}
+
+
+#if	!defined(HASPRIVPRIPP)
+/*
+ * printiproto() - print Internet protocol name
+ */
+
+void
+printiproto(p)
+	int p;				/* protocol number */
+{
+	int i;
+	static int m = -1;
+	char *s;
+
+	switch (p) {
+
+#if	defined(IPPROTO_TCP)
+	case IPPROTO_TCP:
+	    s = "TCP";
+	    break;
+#endif	/* defined(IPPROTO_TCP) */
+
+#if	defined(IPPROTO_UDP)
+	case IPPROTO_UDP:
+	    s = "UDP";
+	    break;
+#endif	/* defined(IPPROTO_UDP) */
+
+#if	defined(IPPROTO_IP)
+# if	!defined(IPPROTO_HOPOPTS) || IPPROTO_IP!=IPPROTO_HOPOPTS
+	case IPPROTO_IP:
+	    s = "IP";
+	    break;
+# endif	/* !defined(IPPROTO_HOPOPTS) || IPPROTO_IP!=IPPROTO_HOPOPTS */
+#endif	/* defined(IPPROTO_IP) */
+
+#if	defined(IPPROTO_ICMP)
+	case IPPROTO_ICMP:
+	    s = "ICMP";
+	    break;
+#endif	/* defined(IPPROTO_ICMP) */
+
+#if	defined(IPPROTO_ICMPV6)
+	case IPPROTO_ICMPV6:
+	    s = "ICMPV6";
+	    break;
+#endif	/* defined(IPPROTO_ICMPV6) */
+
+#if	defined(IPPROTO_IGMP)
+	case IPPROTO_IGMP:
+	    s = "IGMP";
+	    break;
+#endif	/* defined(IPPROTO_IGMP) */
+
+#if	defined(IPPROTO_GGP)
+	case IPPROTO_GGP:
+	    s = "GGP";
+	    break;
+#endif	/* defined(IPPROTO_GGP) */
+
+#if	defined(IPPROTO_EGP)
+	case IPPROTO_EGP:
+	    s = "EGP";
+	    break;
+#endif	/* defined(IPPROTO_EGP) */
+
+#if	defined(IPPROTO_PUP)
+	case IPPROTO_PUP:
+	    s = "PUP";
+	    break;
+#endif	/* defined(IPPROTO_PUP) */
+
+#if	defined(IPPROTO_IDP)
+	case IPPROTO_IDP:
+	    s = "IDP";
+	    break;
+#endif	/* defined(IPPROTO_IDP) */
+
+#if	defined(IPPROTO_ND)
+	case IPPROTO_ND:
+	    s = "ND";
+	    break;
+#endif	/* defined(IPPROTO_ND) */
+
+#if	defined(IPPROTO_RAW)
+	case IPPROTO_RAW:
+	    s = "RAW";
+	    break;
+#endif	/* defined(IPPROTO_RAW) */
+
+#if	defined(IPPROTO_HELLO)
+	case IPPROTO_HELLO:
+	    s = "HELLO";
+	    break;
+#endif	/* defined(IPPROTO_HELLO) */
+
+#if	defined(IPPROTO_PXP)
+	case IPPROTO_PXP:
+	    s = "PXP";
+	    break;
+#endif	/* defined(IPPROTO_PXP) */
+
+#if	defined(IPPROTO_RAWIP)
+	case IPPROTO_RAWIP:
+	    s = "RAWIP";
+	    break;
+#endif	/* defined(IPPROTO_RAWIP) */
+
+#if	defined(IPPROTO_RAWIF)
+	case IPPROTO_RAWIF:
+	    s = "RAWIF";
+	    break;
+#endif	/* defined(IPPROTO_RAWIF) */
+
+#if	defined(IPPROTO_HOPOPTS)
+	case IPPROTO_HOPOPTS:
+	    s = "HOPOPTS";
+	    break;
+#endif	/* defined(IPPROTO_HOPOPTS) */
+
+#if	defined(IPPROTO_IPIP)
+	case IPPROTO_IPIP:
+	    s = "IPIP";
+	    break;
+#endif	/* defined(IPPROTO_IPIP) */
+
+#if	defined(IPPROTO_ST)
+	case IPPROTO_ST:
+	    s = "ST";
+	    break;
+#endif	/* defined(IPPROTO_ST) */
+
+#if	defined(IPPROTO_PIGP)
+	case IPPROTO_PIGP:
+	    s = "PIGP";
+	    break;
+#endif	/* defined(IPPROTO_PIGP) */
+
+#if	defined(IPPROTO_RCCMON)
+	case IPPROTO_RCCMON:
+	    s = "RCCMON";
+	    break;
+#endif	/* defined(IPPROTO_RCCMON) */
+
+#if	defined(IPPROTO_NVPII)
+	case IPPROTO_NVPII:
+	    s = "NVPII";
+	    break;
+#endif	/* defined(IPPROTO_NVPII) */
+
+#if	defined(IPPROTO_ARGUS)
+	case IPPROTO_ARGUS:
+	    s = "ARGUS";
+	    break;
+#endif	/* defined(IPPROTO_ARGUS) */
+
+#if	defined(IPPROTO_EMCON)
+	case IPPROTO_EMCON:
+	    s = "EMCON";
+	    break;
+#endif	/* defined(IPPROTO_EMCON) */
+
+#if	defined(IPPROTO_XNET)
+	case IPPROTO_XNET:
+	    s = "XNET";
+	    break;
+#endif	/* defined(IPPROTO_XNET) */
+
+#if	defined(IPPROTO_CHAOS)
+	case IPPROTO_CHAOS:
+	    s = "CHAOS";
+	    break;
+#endif	/* defined(IPPROTO_CHAOS) */
+
+#if	defined(IPPROTO_MUX)
+	case IPPROTO_MUX:
+	    s = "MUX";
+	    break;
+#endif	/* defined(IPPROTO_MUX) */
+
+#if	defined(IPPROTO_MEAS)
+	case IPPROTO_MEAS:
+	    s = "MEAS";
+	    break;
+#endif	/* defined(IPPROTO_MEAS) */
+
+#if	defined(IPPROTO_HMP)
+	case IPPROTO_HMP:
+	    s = "HMP";
+	    break;
+#endif	/* defined(IPPROTO_HMP) */
+
+#if	defined(IPPROTO_PRM)
+	case IPPROTO_PRM:
+	    s = "PRM";
+	    break;
+#endif	/* defined(IPPROTO_PRM) */
+
+#if	defined(IPPROTO_TRUNK1)
+	case IPPROTO_TRUNK1:
+	    s = "TRUNK1";
+	    break;
+#endif	/* defined(IPPROTO_TRUNK1) */
+
+#if	defined(IPPROTO_TRUNK2)
+	case IPPROTO_TRUNK2:
+	    s = "TRUNK2";
+	    break;
+#endif	/* defined(IPPROTO_TRUNK2) */
+
+#if	defined(IPPROTO_LEAF1)
+	case IPPROTO_LEAF1:
+	    s = "LEAF1";
+	    break;
+#endif	/* defined(IPPROTO_LEAF1) */
+
+#if	defined(IPPROTO_LEAF2)
+	case IPPROTO_LEAF2:
+	    s = "LEAF2";
+	    break;
+#endif	/* defined(IPPROTO_LEAF2) */
+
+#if	defined(IPPROTO_RDP)
+	case IPPROTO_RDP:
+	    s = "RDP";
+	    break;
+#endif	/* defined(IPPROTO_RDP) */
+
+#if	defined(IPPROTO_IRTP)
+	case IPPROTO_IRTP:
+	    s = "IRTP";
+	    break;
+#endif	/* defined(IPPROTO_IRTP) */
+
+#if	defined(IPPROTO_TP)
+	case IPPROTO_TP:
+	    s = "TP";
+	    break;
+#endif	/* defined(IPPROTO_TP) */
+
+#if	defined(IPPROTO_BLT)
+	case IPPROTO_BLT:
+	    s = "BLT";
+	    break;
+#endif	/* defined(IPPROTO_BLT) */
+
+#if	defined(IPPROTO_NSP)
+	case IPPROTO_NSP:
+	    s = "NSP";
+	    break;
+#endif	/* defined(IPPROTO_NSP) */
+
+#if	defined(IPPROTO_INP)
+	case IPPROTO_INP:
+	    s = "INP";
+	    break;
+#endif	/* defined(IPPROTO_INP) */
+
+#if	defined(IPPROTO_SEP)
+	case IPPROTO_SEP:
+	    s = "SEP";
+	    break;
+#endif	/* defined(IPPROTO_SEP) */
+
+#if	defined(IPPROTO_3PC)
+	case IPPROTO_3PC:
+	    s = "3PC";
+	    break;
+#endif	/* defined(IPPROTO_3PC) */
+
+#if	defined(IPPROTO_IDPR)
+	case IPPROTO_IDPR:
+	    s = "IDPR";
+	    break;
+#endif	/* defined(IPPROTO_IDPR) */
+
+#if	defined(IPPROTO_XTP)
+	case IPPROTO_XTP:
+	    s = "XTP";
+	    break;
+#endif	/* defined(IPPROTO_XTP) */
+
+#if	defined(IPPROTO_DDP)
+	case IPPROTO_DDP:
+	    s = "DDP";
+	    break;
+#endif	/* defined(IPPROTO_DDP) */
+
+#if	defined(IPPROTO_CMTP)
+	case IPPROTO_CMTP:
+	    s = "CMTP";
+	    break;
+#endif	/* defined(IPPROTO_CMTP) */
+
+#if	defined(IPPROTO_TPXX)
+	case IPPROTO_TPXX:
+	    s = "TPXX";
+	    break;
+#endif	/* defined(IPPROTO_TPXX) */
+
+#if	defined(IPPROTO_IL)
+	case IPPROTO_IL:
+	    s = "IL";
+	    break;
+#endif	/* defined(IPPROTO_IL) */
+
+#if	defined(IPPROTO_IPV6)
+	case IPPROTO_IPV6:
+	    s = "IPV6";
+	    break;
+#endif	/* defined(IPPROTO_IPV6) */
+
+#if	defined(IPPROTO_SDRP)
+	case IPPROTO_SDRP:
+	    s = "SDRP";
+	    break;
+#endif	/* defined(IPPROTO_SDRP) */
+
+#if	defined(IPPROTO_ROUTING)
+	case IPPROTO_ROUTING:
+	    s = "ROUTING";
+	    break;
+#endif	/* defined(IPPROTO_ROUTING) */
+
+#if	defined(IPPROTO_FRAGMENT)
+	case IPPROTO_FRAGMENT:
+	    s = "FRAGMNT";
+	    break;
+#endif	/* defined(IPPROTO_FRAGMENT) */
+
+#if	defined(IPPROTO_IDRP)
+	case IPPROTO_IDRP:
+	    s = "IDRP";
+	    break;
+#endif	/* defined(IPPROTO_IDRP) */
+
+#if	defined(IPPROTO_RSVP)
+	case IPPROTO_RSVP:
+	    s = "RSVP";
+	    break;
+#endif	/* defined(IPPROTO_RSVP) */
+
+#if	defined(IPPROTO_GRE)
+	case IPPROTO_GRE:
+	    s = "GRE";
+	    break;
+#endif	/* defined(IPPROTO_GRE) */
+
+#if	defined(IPPROTO_MHRP)
+	case IPPROTO_MHRP:
+	    s = "MHRP";
+	    break;
+#endif	/* defined(IPPROTO_MHRP) */
+
+#if	defined(IPPROTO_BHA)
+	case IPPROTO_BHA:
+	    s = "BHA";
+	    break;
+#endif	/* defined(IPPROTO_BHA) */
+
+#if	defined(IPPROTO_ESP)
+	case IPPROTO_ESP:
+	    s = "ESP";
+	    break;
+#endif	/* defined(IPPROTO_ESP) */
+
+#if	defined(IPPROTO_AH)
+	case IPPROTO_AH:
+	    s = "AH";
+	    break;
+#endif	/* defined(IPPROTO_AH) */
+
+#if	defined(IPPROTO_INLSP)
+	case IPPROTO_INLSP:
+	    s = "INLSP";
+	    break;
+#endif	/* defined(IPPROTO_INLSP) */
+
+#if	defined(IPPROTO_SWIPE)
+	case IPPROTO_SWIPE:
+	    s = "SWIPE";
+	    break;
+#endif	/* defined(IPPROTO_SWIPE) */
+
+#if	defined(IPPROTO_NHRP)
+	case IPPROTO_NHRP:
+	    s = "NHRP";
+	    break;
+#endif	/* defined(IPPROTO_NHRP) */
+
+#if	defined(IPPROTO_NONE)
+	case IPPROTO_NONE:
+	    s = "NONE";
+	    break;
+#endif	/* defined(IPPROTO_NONE) */
+
+#if	defined(IPPROTO_DSTOPTS)
+	case IPPROTO_DSTOPTS:
+	    s = "DSTOPTS";
+	    break;
+#endif	/* defined(IPPROTO_DSTOPTS) */
+
+#if	defined(IPPROTO_AHIP)
+	case IPPROTO_AHIP:
+	    s = "AHIP";
+	    break;
+#endif	/* defined(IPPROTO_AHIP) */
+
+#if	defined(IPPROTO_CFTP)
+	case IPPROTO_CFTP:
+	    s = "CFTP";
+	    break;
+#endif	/* defined(IPPROTO_CFTP) */
+
+#if	defined(IPPROTO_SATEXPAK)
+	case IPPROTO_SATEXPAK:
+	    s = "SATEXPK";
+	    break;
+#endif	/* defined(IPPROTO_SATEXPAK) */
+
+#if	defined(IPPROTO_KRYPTOLAN)
+	case IPPROTO_KRYPTOLAN:
+	    s = "KRYPTOL";
+	    break;
+#endif	/* defined(IPPROTO_KRYPTOLAN) */
+
+#if	defined(IPPROTO_RVD)
+	case IPPROTO_RVD:
+	    s = "RVD";
+	    break;
+#endif	/* defined(IPPROTO_RVD) */
+
+#if	defined(IPPROTO_IPPC)
+	case IPPROTO_IPPC:
+	    s = "IPPC";
+	    break;
+#endif	/* defined(IPPROTO_IPPC) */
+
+#if	defined(IPPROTO_ADFS)
+	case IPPROTO_ADFS:
+	    s = "ADFS";
+	    break;
+#endif	/* defined(IPPROTO_ADFS) */
+
+#if	defined(IPPROTO_SATMON)
+	case IPPROTO_SATMON:
+	    s = "SATMON";
+	    break;
+#endif	/* defined(IPPROTO_SATMON) */
+
+#if	defined(IPPROTO_VISA)
+	case IPPROTO_VISA:
+	    s = "VISA";
+	    break;
+#endif	/* defined(IPPROTO_VISA) */
+
+#if	defined(IPPROTO_IPCV)
+	case IPPROTO_IPCV:
+	    s = "IPCV";
+	    break;
+#endif	/* defined(IPPROTO_IPCV) */
+
+#if	defined(IPPROTO_CPNX)
+	case IPPROTO_CPNX:
+	    s = "CPNX";
+	    break;
+#endif	/* defined(IPPROTO_CPNX) */
+
+#if	defined(IPPROTO_CPHB)
+	case IPPROTO_CPHB:
+	    s = "CPHB";
+	    break;
+#endif	/* defined(IPPROTO_CPHB) */
+
+#if	defined(IPPROTO_WSN)
+	case IPPROTO_WSN:
+	    s = "WSN";
+	    break;
+#endif	/* defined(IPPROTO_WSN) */
+
+#if	defined(IPPROTO_PVP)
+	case IPPROTO_PVP:
+	    s = "PVP";
+	    break;
+#endif	/* defined(IPPROTO_PVP) */
+
+#if	defined(IPPROTO_BRSATMON)
+	case IPPROTO_BRSATMON:
+	    s = "BRSATMN";
+	    break;
+#endif	/* defined(IPPROTO_BRSATMON) */
+
+#if	defined(IPPROTO_WBMON)
+	case IPPROTO_WBMON:
+	    s = "WBMON";
+	    break;
+#endif	/* defined(IPPROTO_WBMON) */
+
+#if	defined(IPPROTO_WBEXPAK)
+	case IPPROTO_WBEXPAK:
+	    s = "WBEXPAK";
+	    break;
+#endif	/* defined(IPPROTO_WBEXPAK) */
+
+#if	defined(IPPROTO_EON)
+	case IPPROTO_EON:
+	    s = "EON";
+	    break;
+#endif	/* defined(IPPROTO_EON) */
+
+#if	defined(IPPROTO_VMTP)
+	case IPPROTO_VMTP:
+	    s = "VMTP";
+	    break;
+#endif	/* defined(IPPROTO_VMTP) */
+
+#if	defined(IPPROTO_SVMTP)
+	case IPPROTO_SVMTP:
+	    s = "SVMTP";
+	    break;
+#endif	/* defined(IPPROTO_SVMTP) */
+
+#if	defined(IPPROTO_VINES)
+	case IPPROTO_VINES:
+	    s = "VINES";
+	    break;
+#endif	/* defined(IPPROTO_VINES) */
+
+#if	defined(IPPROTO_TTP)
+	case IPPROTO_TTP:
+	    s = "TTP";
+	    break;
+#endif	/* defined(IPPROTO_TTP) */
+
+#if	defined(IPPROTO_IGP)
+	case IPPROTO_IGP:
+	    s = "IGP";
+	    break;
+#endif	/* defined(IPPROTO_IGP) */
+
+#if	defined(IPPROTO_DGP)
+	case IPPROTO_DGP:
+	    s = "DGP";
+	    break;
+#endif	/* defined(IPPROTO_DGP) */
+
+#if	defined(IPPROTO_TCF)
+	case IPPROTO_TCF:
+	    s = "TCF";
+	    break;
+#endif	/* defined(IPPROTO_TCF) */
+
+#if	defined(IPPROTO_IGRP)
+	case IPPROTO_IGRP:
+	    s = "IGRP";
+	    break;
+#endif	/* defined(IPPROTO_IGRP) */
+
+#if	defined(IPPROTO_OSPFIGP)
+	case IPPROTO_OSPFIGP:
+	    s = "OSPFIGP";
+	    break;
+#endif	/* defined(IPPROTO_OSPFIGP) */
+
+#if	defined(IPPROTO_SRPC)
+	case IPPROTO_SRPC:
+	    s = "SRPC";
+	    break;
+#endif	/* defined(IPPROTO_SRPC) */
+
+#if	defined(IPPROTO_LARP)
+	case IPPROTO_LARP:
+	    s = "LARP";
+	    break;
+#endif	/* defined(IPPROTO_LARP) */
+
+#if	defined(IPPROTO_MTP)
+	case IPPROTO_MTP:
+	    s = "MTP";
+	    break;
+#endif	/* defined(IPPROTO_MTP) */
+
+#if	defined(IPPROTO_AX25)
+	case IPPROTO_AX25:
+	    s = "AX25";
+	    break;
+#endif	/* defined(IPPROTO_AX25) */
+
+#if	defined(IPPROTO_IPEIP)
+	case IPPROTO_IPEIP:
+	    s = "IPEIP";
+	    break;
+#endif	/* defined(IPPROTO_IPEIP) */
+
+#if	defined(IPPROTO_MICP)
+	case IPPROTO_MICP:
+	    s = "MICP";
+	    break;
+#endif	/* defined(IPPROTO_MICP) */
+
+#if	defined(IPPROTO_SCCSP)
+	case IPPROTO_SCCSP:
+	    s = "SCCSP";
+	    break;
+#endif	/* defined(IPPROTO_SCCSP) */
+
+#if	defined(IPPROTO_ETHERIP)
+	case IPPROTO_ETHERIP:
+	    s = "ETHERIP";
+	    break;
+#endif	/* defined(IPPROTO_ETHERIP) */
+
+#if	defined(IPPROTO_ENCAP)
+# if	!defined(IPPROTO_IPIP) || IPPROTO_IPIP!=IPPROTO_ENCAP
+	case IPPROTO_ENCAP:
+	    s = "ENCAP";
+	    break;
+# endif	/* !defined(IPPROTO_IPIP) || IPPROTO_IPIP!=IPPROTO_ENCAP */
+#endif	/* defined(IPPROTO_ENCAP) */
+
+#if	defined(IPPROTO_APES)
+	case IPPROTO_APES:
+	    s = "APES";
+	    break;
+#endif	/* defined(IPPROTO_APES) */
+
+#if	defined(IPPROTO_GMTP)
+	case IPPROTO_GMTP:
+	    s = "GMTP";
+	    break;
+#endif	/* defined(IPPROTO_GMTP) */
+
+#if	defined(IPPROTO_DIVERT)
+	case IPPROTO_DIVERT:
+	    s = "DIVERT";
+	    break;
+#endif	/* defined(IPPROTO_DIVERT) */
+
+	default:
+	    s = (char *)NULL;
+	}
+	if (s)
+	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL-1, s);
+	else {	
+	    if (m < 0) {
+		for (i = 0, m = 1; i < IPROTOL-2; i++)
+		    m *= 10;
+	    }
+	    if (m > p)
+		(void) snpf(Lf->iproto, sizeof(Lf->iproto), "%d?", p);
+	    else
+		(void) snpf(Lf->iproto, sizeof(Lf->iproto), "*%d?", p % (m/10));
+	}
+}
+#endif	/* !defined(HASPRIVPRIPP) */
+
+
+/*
+ * printname() - print output name field
+ */
+
+void
+printname(nl)
+	int nl;				/* NL status */
+{
+
+#if	defined(HASNCACHE)
+	char buf[MAXPATHLEN];
+	char *cp;
+	int fp;
+#endif	/* defined(HASNCACHE) */
+
+	int ps = 0;
+
+	if (Lf->nm && Lf->nm[0]) {
+
+	/*
+	 * Print the name characters, if there are some.
+	 */
+	    safestrprt(Lf->nm, stdout, 0);
+	    ps++;
+	    if (!Lf->li[0].af && !Lf->li[1].af)
+		goto print_nma;
+	}
+	if (Lf->li[0].af || Lf->li[1].af) {
+	    if (ps)
+		putchar(' ');
+	/*
+	 * If the file has Internet addresses, print them.
+	 */
+	    if (printinaddr())
+		ps++;
+	    goto print_nma;
+	}
+	if (((Lf->ntype == N_BLK) || (Lf->ntype == N_CHR))
+	&&  Lf->dev_def && Lf->rdev_def
+	&&  printdevname(&Lf->dev, &Lf->rdev, 0, Lf->ntype))
+	{
+
+	/*
+	 * If this is a block or character device and it has a name, print it.
+	 */
+	    ps++;
+	    goto print_nma;
+	}
+	if (Lf->is_com) {
+
+	/*
+	 * If this is a common node, print that fact.
+	 */
+	    (void) fputs("COMMON: ", stdout);
+	    ps++;
+	    goto print_nma;
+	}
+
+#if	defined(HASPRIVNMCACHE)
+	if (HASPRIVNMCACHE(Lf)) {
+	    ps++;
+	    goto print_nma;
+	}
+#endif	/* defined(HASPRIVNMCACHE) */
+
+	if (Lf->lmi_srch) {
+	    struct mounts *mp;
+	/*
+	 * Do a deferred local mount info table search for the file system
+	 * (mounted) directory name and inode number, and mounted device name.
+	 */
+	    for (mp = readmnt(); mp; mp = mp->next) {
+		if (Lf->dev == mp->dev) {
+		    Lf->fsdir = mp->dir;
+		    Lf->fsdev = mp->fsname;
+
+#if	defined(HASFSINO)
+		    Lf->fs_ino = mp->inode;
+#endif	/* defined(HASFSINO) */
+
+		    break;
+		}
+	    }
+	    Lf->lmi_srch = 0;
+	}
+	if (Lf->fsdir || Lf->fsdev) {
+
+	/*
+	 * Print the file system directory name, device name, and
+	 * possible path name components.
+	 */
+
+#if	!defined(HASNCACHE) || HASNCACHE<2
+	    if (Lf->fsdir) {
+		safestrprt(Lf->fsdir, stdout, 0);
+		ps++;
+	    }
+#endif	/* !defined(HASNCACHE) || HASNCACHE<2 */
+
+#if	defined(HASNCACHE)
+
+# if	HASNCACHE<2
+	    if (Lf->na) {
+		if (NcacheReload) {
+
+#  if	defined(NCACHELDPFX)
+		    NCACHELDPFX
+#  endif	/* defined(NCACHELDPFX) */
+
+		    (void) ncache_load();
+
+#  if	defined(NCACHELDSFX)
+		    NCACHELDSFX
+#  endif	/* defined(NCACHELDSFX) */
+
+		    NcacheReload = 0;
+		}
+		if ((cp = ncache_lookup(buf, sizeof(buf), &fp))) {
+		    char *cp1; 
+
+		    if (*cp == '\0')
+			goto print_nma;
+		    if (fp && Lf->fsdir) {
+			if (*cp != '/') {
+			    cp1 = strrchr(Lf->fsdir, '/');
+			    if (cp1 == (char *)NULL ||  *(cp1 + 1) != '\0')
+				putchar('/');
+			    }
+		    } else
+			(void) fputs(" -- ", stdout);
+		    safestrprt(cp, stdout, 0);
+		    ps++;
+		    goto print_nma;
+		}
+	    }
+# else	/* HASNCACHE>1 */
+	    if (NcacheReload) {
+
+#  if	defined(NCACHELDPFX)
+		    NCACHELDPFX
+#  endif	/* defined(NCACHELDPFX) */
+
+		(void) ncache_load();
+
+#  if	defined(NCACHELDSFX)
+		    NCACHELDSFX
+#  endif	/* defined(NCACHELDSFX) */
+
+		NcacheReload = 0;
+	    }
+	    if ((cp = ncache_lookup(buf, sizeof(buf), &fp))) {
+		if (fp) {
+		    safestrprt(cp, stdout, 0);
+		    ps++;
+		} else {
+		    if (Lf->fsdir) {
+			safestrprt(Lf->fsdir, stdout, 0);
+			ps++;
+		    }
+		    if (*cp) {
+			(void) fputs(" -- ", stdout);
+			safestrprt(cp, stdout, 0);
+			ps++;
+		    }
+		}
+		goto print_nma;
+	    }
+	    if (Lf->fsdir) {
+		safestrprt(Lf->fsdir, stdout, 0);
+		ps++;
+	    }
+# endif	/* HASNCACHE<2 */
+#endif	/* defined(HASNCACHE) */
+
+	    if (Lf->fsdev) {
+		if (Lf->fsdir)
+		    (void) fputs(" (", stdout);
+		else
+		    (void) putchar('(');
+		safestrprt(Lf->fsdev, stdout, 0);
+		(void) putchar(')');
+		ps++;
+	    }
+	}
+/*
+ * Print the NAME column addition, if there is one.  If there isn't
+ * make sure a NL is printed, as requested.
+ */
+
+print_nma:
+
+	if (Lf->nma) {
+	    if (ps)
+		putchar(' ');
+	    safestrprt(Lf->nma, stdout, 0);
+	    ps++;
+	}
+/*
+ * If this file has TCP/IP state information, print it.
+ */
+	if (!Ffield && Ftcptpi
+	&&  (Lf->lts.type >= 0
+
+#if	defined(HASTCPTPIQ)
+	||   ((Ftcptpi & TCPTPI_QUEUES) && (Lf->lts.rqs || Lf->lts.sqs))
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASTCPTPIW)
+	||   ((Ftcptpi & TCPTPI_WINDOWS) && (Lf->lts.rws || Lf->lts.wws))
+#endif	/* defined(HASTCPTPIW) */
+
+	)) {
+	    if (ps)
+		putchar(' ');
+	    (void) print_tcptpi(0);
+	}
+	if (nl)
+	    putchar('\n');
+}
+
+
+/*
+ * printrawaddr() - print raw socket address
+ */
+
+void
+printrawaddr(sa)
+	struct sockaddr *sa;		/* socket address */
+{
+	char *ep;
+	size_t sz;
+
+	ep = endnm(&sz);
+	(void) snpf(ep, sz, "%u/%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
+	    sa->sa_family,
+	    (unsigned char)sa->sa_data[0],
+	    (unsigned char)sa->sa_data[1],
+	    (unsigned char)sa->sa_data[2],
+	    (unsigned char)sa->sa_data[3],
+	    (unsigned char)sa->sa_data[4],
+	    (unsigned char)sa->sa_data[5],
+	    (unsigned char)sa->sa_data[6],
+	    (unsigned char)sa->sa_data[7],
+	    (unsigned char)sa->sa_data[8],
+	    (unsigned char)sa->sa_data[9],
+	    (unsigned char)sa->sa_data[10],
+	    (unsigned char)sa->sa_data[11],
+	    (unsigned char)sa->sa_data[12],
+	    (unsigned char)sa->sa_data[13]);
+}
+
+
+/*
+ * printsockty() - print socket type
+ */
+
+char *
+printsockty(ty)
+	int ty;				/* socket type -- e.g., from so_type */
+{
+	static char buf[64];
+	char *cp;
+
+	switch (ty) {
+
+#if	defined(SOCK_STREAM)
+	case SOCK_STREAM:
+	    cp = "STREAM";
+	    break;
+#endif	/* defined(SOCK_STREAM) */
+
+#if	defined(SOCK_STREAM)
+	case SOCK_DGRAM:
+	    cp = "DGRAM";
+	    break;
+#endif	/* defined(SOCK_DGRAM) */
+
+#if	defined(SOCK_RAW)
+	case SOCK_RAW:
+	    cp = "RAW";
+	    break;
+#endif	/* defined(SOCK_RAW) */
+
+#if	defined(SOCK_RDM)
+	case SOCK_RDM:
+	    cp = "RDM";
+	    break;
+#endif	/* defined(SOCK_RDM) */
+
+#if	defined(SOCK_SEQPACKET)
+	case SOCK_SEQPACKET:
+	    cp = "SEQPACKET";
+	    break;
+#endif	/* defined(SOCK_SEQPACKET) */
+
+	default:
+	    (void) snpf(buf, sizeof(buf), "SOCK_%#x", ty);
+	    return(buf);
+	}
+	(void) snpf(buf, sizeof(buf), "SOCK_%s", cp);
+	return(buf);
+}
+
+
+/*
+ * printuid() - print User ID or login name
+ */
+
+char *
+printuid(uid, ty)
+	UID_ARG uid;			/* User IDentification number */
+	int *ty;			/* returned UID type pointer (NULL
+					 * (if none wanted).  If non-NULL
+					 * then: *ty = 0 = login name
+					 *	     = 1 = UID number */
+{
+	int i;
+	struct passwd *pw;
+	struct stat sb;
+	static struct stat sbs;
+	static struct uidcache {
+	    uid_t uid;
+	    char nm[LOGINML+1];
+	    struct uidcache *next;
+	} **uc = (struct uidcache **)NULL;
+	struct uidcache *up, *upn;
+	static char user[USERPRTL+1];
+
+	if (Futol) {
+	    if (CkPasswd) {
+
+	    /*
+	     * Get the mtime and ctime of /etc/passwd, as required.
+	     */
+		if (stat("/etc/passwd", &sb) != 0) {
+		    (void) fprintf(stderr, "%s: can't stat(/etc/passwd): %s\n",
+			Pn, strerror(errno));
+		    Exit(1);
+		}
+	    }
+	/*
+	 * Define the UID cache, if necessary.
+	 */
+	    if (!uc) {
+		if (!(uc = (struct uidcache **)calloc(UIDCACHEL,
+						sizeof(struct uidcache *))))
+		{
+		    (void) fprintf(stderr,
+			"%s: no space for %d byte UID cache hash buckets\n",
+			Pn, (int)(UIDCACHEL * (sizeof(struct uidcache *))));
+		    Exit(1);
+		}
+		if (CkPasswd) {
+		    sbs = sb;
+		    CkPasswd = 0;
+		}
+	    }
+	/*
+	 * If it's time to check /etc/passwd and if its the mtime/ctime has
+	 * changed, destroy the existing UID cache.
+	 */
+	    if (CkPasswd) {
+		if (sbs.st_mtime != sb.st_mtime || sbs.st_ctime != sb.st_ctime)
+		{
+		    for (i = 0; i < UIDCACHEL; i++) {
+			if ((up = uc[i])) {
+			    do {
+				upn = up->next;
+				(void) free((FREE_P *)up);
+			    } while ((up = upn) != (struct uidcache *)NULL);
+			    uc[i] = (struct uidcache *)NULL;
+			}
+		    }
+		    sbs = sb;
+		}
+		CkPasswd = 0;
+	    }
+	/*
+	 * Search the UID cache.
+	 */
+	    i = (int)((((unsigned long)uid * 31415L) >> 7) & (UIDCACHEL - 1));
+	    for (up = uc[i]; up; up = up->next) {
+		if (up->uid == (uid_t)uid) {
+		    if (ty)
+			*ty = 0;
+		    return(up->nm);
+		}
+	    }
+	/*
+	 * The UID is not in the cache.
+	 *
+	 * Look up the login name from the UID for a new cache entry.
+	 */
+	    if (!(pw = getpwuid((uid_t)uid))) {
+		if (!Fwarn) {
+		    (void) fprintf(stderr, "%s: no pwd entry for UID %lu\n",
+			Pn, (unsigned long)uid);
+		}
+	    } else {
+
+	    /*
+	     * Allocate and fill a new cache entry.  Link it to its hash bucket.
+	     */
+		if (!(upn = (struct uidcache *)malloc(sizeof(struct uidcache))))
+		{
+		    (void) fprintf(stderr,
+			"%s: no space for UID cache entry for: %lu, %s)\n",
+			Pn, (unsigned long)uid, pw->pw_name);
+		    Exit(1);
+		}
+		(void) strncpy(upn->nm, pw->pw_name, LOGINML);
+		upn->nm[LOGINML] = '\0';
+		upn->uid = (uid_t)uid;
+		upn->next = uc[i];
+		uc[i] = upn;
+		if (ty)
+		    *ty = 0;
+		return(upn->nm);
+	    }
+	}
+/*
+ * Produce a numeric conversion of the UID.
+ */
+	(void) snpf(user, sizeof(user), "%*lu", USERPRTL, (unsigned long)uid);
+	if (ty)
+	    *ty = 1;
+	return(user);
+}
+
+
+/*
+ * printunkaf() - print unknown address family
+ */
+
+void
+printunkaf(fam, ty)
+	int fam;			/* unknown address family */
+	int ty;				/* output type: 0 = terse; 1 = full */
+{
+	char *p, *s;
+
+	p = "";
+	switch (fam) {
+
+#if	defined(AF_UNSPEC)
+	case AF_UNSPEC:
+	    s = "UNSPEC";
+	    break;
+#endif	/* defined(AF_UNSPEC) */
+
+#if	defined(AF_UNIX)
+	case AF_UNIX:
+	    s = "UNIX";
+	    break;
+#endif	/* defined(AF_UNIX) */
+
+#if	defined(AF_INET)
+	case AF_INET:
+	    s = "INET";
+	    break;
+#endif	/* defined(AF_INET) */
+
+#if	defined(AF_INET6)
+	case AF_INET6:
+	    s = "INET6";
+	    break;
+#endif	/* defined(AF_INET6) */
+
+#if	defined(AF_IMPLINK)
+	case AF_IMPLINK:
+	    s = "IMPLINK";
+	    break;
+#endif	/* defined(AF_IMPLINK) */
+
+#if	defined(AF_PUP)
+	case AF_PUP:
+	    s = "PUP";
+	    break;
+#endif	/* defined(AF_PUP) */
+
+#if	defined(AF_CHAOS)
+	case AF_CHAOS:
+	    s = "CHAOS";
+	    break;
+#endif	/* defined(AF_CHAOS) */
+
+#if	defined(AF_NS)
+	case AF_NS:
+	    s = "NS";
+	    break;
+#endif	/* defined(AF_NS) */
+
+#if	defined(AF_ISO)
+	case AF_ISO:
+	    s = "ISO";
+	    break;
+#endif	/* defined(AF_ISO) */
+
+#if	defined(AF_NBS)
+# if	!defined(AF_ISO) || AF_NBS!=AF_ISO
+	case AF_NBS:
+	    s = "NBS";
+	    break;
+# endif	/* !defined(AF_ISO) || AF_NBS!=AF_ISO */
+#endif	/* defined(AF_NBS) */
+
+#if	defined(AF_ECMA)
+	case AF_ECMA:
+	    s = "ECMA";
+	    break;
+#endif	/* defined(AF_ECMA) */
+
+#if	defined(AF_DATAKIT)
+	case AF_DATAKIT:
+	    s = "DATAKIT";
+	    break;
+#endif	/* defined(AF_DATAKIT) */
+
+#if	defined(AF_CCITT)
+	case AF_CCITT:
+	    s = "CCITT";
+	    break;
+#endif	/* defined(AF_CCITT) */
+
+#if	defined(AF_SNA)
+	case AF_SNA:
+	    s = "SNA";
+	    break;
+#endif	/* defined(AF_SNA) */
+
+#if	defined(AF_DECnet)
+	case AF_DECnet:
+	    s = "DECnet";
+	    break;
+#endif	/* defined(AF_DECnet) */
+
+#if	defined(AF_DLI)
+	case AF_DLI:
+	    s = "DLI";
+	    break;
+#endif	/* defined(AF_DLI) */
+
+#if	defined(AF_LAT)
+	case AF_LAT:
+	    s = "LAT";
+	    break;
+#endif	/* defined(AF_LAT) */
+
+#if	defined(AF_HYLINK)
+	case AF_HYLINK:
+	    s = "HYLINK";
+	    break;
+#endif	/* defined(AF_HYLINK) */
+
+#if	defined(AF_APPLETALK)
+	case AF_APPLETALK:
+	    s = "APPLETALK";
+	    break;
+#endif	/* defined(AF_APPLETALK) */
+
+#if	defined(AF_BSC)
+	case AF_BSC:
+	    s = "BSC";
+	    break;
+#endif	/* defined(AF_BSC) */
+
+#if	defined(AF_DSS)
+	case AF_DSS:
+	    s = "DSS";
+	    break;
+#endif	/* defined(AF_DSS) */
+
+#if	defined(AF_ROUTE)
+	case AF_ROUTE:
+	    s = "ROUTE";
+	    break;
+#endif	/* defined(AF_ROUTE) */
+
+#if	defined(AF_RAW)
+	case AF_RAW:
+	    s = "RAW";
+	    break;
+#endif	/* defined(AF_RAW) */
+
+#if	defined(AF_LINK)
+	case AF_LINK:
+	    s = "LINK";
+	    break;
+#endif	/* defined(AF_LINK) */
+
+#if	defined(pseudo_AF_XTP)
+	case pseudo_AF_XTP:
+	    p = "pseudo_";
+	    s = "XTP";
+	    break;
+#endif	/* defined(pseudo_AF_XTP) */
+
+#if	defined(AF_RMP)
+	case AF_RMP:
+	    s = "RMP";
+	    break;
+#endif	/* defined(AF_RMP) */
+
+#if	defined(AF_COIP)
+	case AF_COIP:
+	    s = "COIP";
+	    break;
+#endif	/* defined(AF_COIP) */
+
+#if	defined(AF_CNT)
+	case AF_CNT:
+	    s = "CNT";
+	    break;
+#endif	/* defined(AF_CNT) */
+
+#if	defined(pseudo_AF_RTIP)
+	case pseudo_AF_RTIP:
+	    p = "pseudo_";
+	    s = "RTIP";
+	    break;
+#endif	/* defined(pseudo_AF_RTIP) */
+
+#if	defined(AF_NETMAN)
+	case AF_NETMAN:
+	    s = "NETMAN";
+	    break;
+#endif	/* defined(AF_NETMAN) */
+
+#if	defined(AF_INTF)
+	case AF_INTF:
+	    s = "INTF";
+	    break;
+#endif	/* defined(AF_INTF) */
+
+#if	defined(AF_NETWARE)
+	case AF_NETWARE:
+	    s = "NETWARE";
+	    break;
+#endif	/* defined(AF_NETWARE) */
+
+#if	defined(AF_NDD)
+	case AF_NDD:
+	    s = "NDD";
+	    break;
+#endif	/* defined(AF_NDD) */
+
+#if	defined(AF_NIT)
+# if	!defined(AF_ROUTE) || AF_ROUTE!=AF_NIT
+	case AF_NIT:
+	    s = "NIT";
+	    break;
+# endif	/* !defined(AF_ROUTE) || AF_ROUTE!=AF_NIT */
+#endif	/* defined(AF_NIT) */
+
+#if	defined(AF_802)
+# if	!defined(AF_RAW) || AF_RAW!=AF_802
+	case AF_802:
+	    s = "802";
+	    break;
+# endif	/* !defined(AF_RAW) || AF_RAW!=AF_802 */
+#endif	/* defined(AF_802) */
+
+#if	defined(AF_X25)
+	case AF_X25:
+	    s = "X25";
+	    break;
+#endif	/* defined(AF_X25) */
+
+#if	defined(AF_CTF)
+	case AF_CTF:
+	    s = "CTF";
+	    break;
+#endif	/* defined(AF_CTF) */
+
+#if	defined(AF_WAN)
+	case AF_WAN:
+	    s = "WAN";
+	    break;
+#endif	/* defined(AF_WAN) */
+
+#if	defined(AF_OSINET)
+# if	defined(AF_INET) && AF_INET!=AF_OSINET
+	case AF_OSINET:
+	    s = "OSINET";
+	    break;
+# endif	/* defined(AF_INET) && AF_INET!=AF_OSINET */
+#endif	/* defined(AF_OSINET) */
+
+#if	defined(AF_GOSIP)
+	case AF_GOSIP:
+	    s = "GOSIP";
+	    break;
+#endif	/* defined(AF_GOSIP) */
+
+#if	defined(AF_SDL)
+	case AF_SDL:
+	    s = "SDL";
+	    break;
+#endif	/* defined(AF_SDL) */
+
+#if	defined(AF_IPX)
+	case AF_IPX:
+	    s = "IPX";
+	    break;
+#endif	/* defined(AF_IPX) */
+
+#if	defined(AF_SIP)
+	case AF_SIP:
+	    s = "SIP";
+	    break;
+#endif	/* defined(AF_SIP) */
+
+#if	defined(psuedo_AF_PIP)
+	case psuedo_AF_PIP:
+	    p = "pseudo_";
+	    s = "PIP";
+	    break;
+#endif	/* defined(psuedo_AF_PIP) */
+
+#if	defined(AF_OTS)
+	case AF_OTS:
+	    s = "OTS";
+	    break;
+#endif	/* defined(AF_OTS) */
+
+#if	defined(pseudo_AF_BLUE)
+	case pseudo_AF_BLUE:	/* packets for Blue box */
+	    p = "pseudo_";
+	    s = "BLUE";
+	    break;
+#endif	/* defined(pseudo_AF_BLUE) */
+
+#if	defined(AF_NDRV)	/* network driver raw access */
+	case AF_NDRV:
+	    s = "NDRV";
+	    break;
+#endif	/* defined(AF_NDRV) */
+
+#if	defined(AF_SYSTEM)	/* kernel event messages */
+	case AF_SYSTEM:
+	    s = "SYSTEM";
+	    break;
+#endif	/* defined(AF_SYSTEM) */
+
+#if	defined(AF_USER)
+	case AF_USER:
+	    s = "USER";
+	    break;
+#endif	/* defined(AF_USER) */
+
+#if	defined(pseudo_AF_KEY)
+	case pseudo_AF_KEY:
+	    p = "pseudo_";
+	    s = "KEY";
+	    break;
+#endif	/* defined(pseudo_AF_KEY) */
+
+#if	defined(AF_KEY)		/* Security Association DB socket */
+	case AF_KEY:			
+	    s = "KEY";
+	    break;
+#endif	/* defined(AF_KEY) */
+
+#if	defined(AF_NCA)		/* NCA socket */
+	case AF_NCA:			
+	    s = "NCA";
+	    break;
+#endif	/* defined(AF_NCA) */
+
+#if	defined(AF_POLICY)		/* Security Policy DB socket */
+	case AF_POLICY:
+	    s = "POLICY";
+	    break;
+#endif	/* defined(AF_POLICY) */
+
+#if	defined(AF_PPP)		/* PPP socket */
+	case AF_PPP:			
+	    s = "PPP";
+	    break;
+#endif	/* defined(AF_PPP) */
+
+	default:
+	    if (!ty)
+		(void) snpf(Namech, Namechl, "%#x", fam);
+	    else
+		(void) snpf(Namech, Namechl,
+		    "no further information on family %#x", fam);
+	    return;
+	}
+	if (!ty)
+	    (void) snpf(Namech, Namechl, "%sAF_%s", p, s);
+	else
+	    (void) snpf(Namech, Namechl, "no further information on %sAF_%s",
+		p, s);
+	return;
+}
+
+
+#if	!defined(HASNORPC_H)
+/*
+ * update_portmap() - update a portmap entry with its port number or service
+ *		      name
+ */
+
+static void
+update_portmap(pt, pn)
+	struct porttab *pt;		/* porttab entry */
+	char *pn;			/* port name */
+{
+	MALLOC_S al, nl;
+	char *cp;
+
+	if (pt->ss)
+	    return;
+	if (!(al = strlen(pn))) {
+	    pt->ss = 1;
+	    return;
+	}
+	nl = al + pt->nl + 2;
+	if (!(cp = (char *)malloc(nl + 1))) {
+	    (void) fprintf(stderr,
+		"%s: can't allocate %d bytes for portmap name: %s[%s]\n",
+		Pn, (int)(nl + 1), pn, pt->name);
+	    Exit(1);
+	}
+	(void) snpf(cp, nl + 1, "%s[%s]", pn, pt->name);
+	(void) free((FREE_P *)pt->name);
+	pt->name = cp;
+	pt->nl = nl;
+	pt->ss = 1;
+}
+#endif	/* !defined(HASNORPC_H) */
diff --git a/lsof_4.85/lsof_4.85_src/proc.c b/lsof_4.85/lsof_4.85_src/proc.c
new file mode 100644
index 0000000..ee589bd
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/proc.c
@@ -0,0 +1,1243 @@
+/*
+ * proc.c - common process and file structure functions 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: proc.c,v 1.46 2010/07/29 15:59:28 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static int is_file_sel,(struct lproc *lp, struct lfile *lf));
+
+
+/*
+ * add_nma() - add to NAME column addition
+ */
+
+void
+add_nma(cp, len)
+	char *cp;			/* string to add */
+	int len;			/* string length */
+{
+	int nl;
+
+	if (!cp || !len)
+	    return;
+	if (Lf->nma) {
+	    nl = (int)strlen(Lf->nma);
+	    Lf->nma = (char *)realloc((MALLOC_P *)Lf->nma,
+				      (MALLOC_S)(len + nl + 2));
+	} else {
+	    nl = 0;
+	    Lf->nma = (char *)malloc((MALLOC_S)(len + 1));
+	}
+	if (!Lf->nma) {
+	    (void) fprintf(stderr, "%s: no name addition space: PID %ld, FD %s",
+		Pn, (long)Lp->pid, Lf->fd);
+	    Exit(1);
+	}
+	if (nl) {
+	    Lf->nma[nl] = ' ';
+	    (void) strncpy(&Lf->nma[nl + 1], cp, len);
+	    Lf->nma[nl + 1 + len] = '\0';
+	} else {
+	    (void) strncpy(Lf->nma, cp, len);
+	    Lf->nma[len] = '\0';
+	}
+}
+
+
+#if	defined(HASFSTRUCT)
+_PROTOTYPE(static char *alloc_fflbuf,(char **bp, int *al, int lr));
+
+
+/*
+ * alloc_fflbuf() - allocate file flags print buffer
+ */
+
+static char *
+alloc_fflbuf(bp, al, lr)
+	char **bp;			/* current buffer pointer */
+	int *al;			/* current allocated length */
+	int lr;				/* length required */
+{
+	int sz;
+
+	sz = (int)(lr + 1);		/* allocate '\0' space */
+	if (*bp && (sz <= *al))
+	    return(*bp);
+	if (*bp)
+	    *bp = (char *)realloc((MALLOC_P *)*bp, (MALLOC_S)sz);
+	else
+	    *bp = (char *)malloc((MALLOC_S)sz);
+	if (!*bp) {
+	    (void) fprintf(stderr, "%s: no space (%d) for print flags\n",
+		Pn, sz);
+	    Exit(1);
+	}
+	*al = sz;
+	return(*bp);
+}
+#endif	/* defined(HASFSTRUCT) */
+
+
+/*
+ * alloc_lfile() - allocate local file structure space
+ */
+
+void
+alloc_lfile(nm, num)
+	char *nm;			/* file descriptor name (may be NULL) */
+	int num;			/* file descriptor number -- -1 if
+					 * none */
+{
+	int fds;
+
+	if (Lf) {
+/*
+ * If reusing a previously allocated structure, release any allocated
+ * space it was using.
+ */
+	    if (Lf->dev_ch)
+		(void) free((FREE_P *)Lf->dev_ch);
+	    if (Lf->nm)
+		(void) free((FREE_P *)Lf->nm);
+	    if (Lf->nma)
+		(void) free((FREE_P *)Lf->nma);
+
+#if	defined(HASLFILEADD) && defined(CLRLFILEADD)
+	    CLRLFILEADD(Lf)
+#endif	/* defined(HASLFILEADD) && defined(CLRLFILEADD) */
+
+/*
+ * Othwerise, allocate a new structure.
+ */
+	} else if (!(Lf = (struct lfile *)malloc(sizeof(struct lfile)))) {
+	    (void) fprintf(stderr, "%s: no local file space at PID %d\n",
+		Pn, Lp->pid);
+	    Exit(1);
+	}
+/*
+ * Initialize the structure.
+ */
+	Lf->access = Lf->lock = ' ';
+	Lf->dev_def = Lf->inp_ty = Lf->is_com = Lf->is_nfs = Lf->is_stream
+		    = Lf->lmi_srch = Lf->nlink_def = Lf->off_def = Lf->sz_def
+		    = Lf->rdev_def
+		    = (unsigned char)0;
+	Lf->li[0].af = Lf->li[1].af = 0;
+	Lf->lts.type = -1;
+	Lf->nlink = 0l;
+
+#if	defined(HASMNTSTAT)
+	Lf->mnt_stat = (unsigned char)0;
+#endif	/* defined(HASMNTSTAT) */
+
+#if	defined(HASSOOPT)
+	Lf->lts.kai = Lf->lts.ltm = 0;
+	Lf->lts.opt = Lf->lts.qlen = Lf->lts.qlim = Lf->lts.pqlen
+		    = (unsigned int)0;
+	Lf->lts.rbsz = Lf->lts.sbsz = (unsigned long)0;
+	Lf->lts.qlens = Lf->lts.qlims = Lf->lts.pqlens = Lf->lts.rbszs
+		      = Lf->lts.sbszs = (unsigned char)0;
+#endif	/* defined(HASSOOPT) */
+
+#if	defined(HASSOSTATE)
+	Lf->lts.ss = 0;
+#endif	/* defined(HASSOSTATE) */
+
+#if	defined(HASTCPOPT)
+	Lf->lts.mss = (unsigned long)0;
+	Lf->lts.msss = (unsigned char)0;
+	Lf->lts.topt = (unsigned int)0;
+#endif	/* defined(HASTCPOPT) */
+
+#if	defined(HASTCPTPIQ)
+	Lf->lts.rqs = Lf->lts.sqs = (unsigned char)0;
+#endif	/* defined(HASTCPTPIQ) */
+
+#if	defined(HASTCPTPIW)
+	Lf->lts.rws = Lf->lts.wws = (unsigned char)0;
+#endif	/* defined(HASTCPTPIW) */
+
+#if	defined(HASFSINO)
+	Lf->fs_ino = 0;
+#endif	/* defined(HASFSINO) */
+
+#if	defined(HASVXFS) && defined(HASVXFSDNLC)
+	Lf->is_vxfs = 0;
+#endif	/* defined(HASVXFS) && defined(HASVXFSDNLC) */
+
+	Lf->inode = (INODETYPE)0;
+	Lf->off = (SZOFFTYPE)0;
+	if (Lp->pss & PS_PRI)
+	    Lf->sf = Lp->sf;
+	else
+	    Lf->sf = 0;
+	Lf->iproto[0] = Lf->type[0] = '\0';
+	if (nm) {
+	    (void) strncpy(Lf->fd, nm, FDLEN - 1);
+	    Lf->fd[FDLEN - 1] = '\0';
+	} else if (num >= 0) {
+	    if (num < 10000)
+		(void) snpf(Lf->fd, sizeof(Lf->fd), "%4d", num);
+	    else
+		(void) snpf(Lf->fd, sizeof(Lf->fd), "*%03d", num % 1000);
+	} else
+	    Lf->fd[0] = '\0';
+	Lf->dev_ch = Lf->fsdir = Lf->fsdev = Lf->nm = Lf->nma = (char *)NULL;
+	Lf->ch = -1;
+
+#if	defined(HASNCACHE) && HASNCACHE<2
+	Lf->na = (KA_T)NULL;
+#endif	/* defined(HASNCACHE) && HASNCACHE<2 */
+
+	Lf->next = (struct lfile *)NULL;
+	Lf->ntype = Ntype = N_REGLR;
+	Namech[0] = '\0';
+
+#if	defined(HASFSTRUCT)
+	Lf->fct = Lf->ffg = Lf->pof = (long)0;
+	Lf->fna = (KA_T)NULL;
+	Lf->fsv = (unsigned char)0;
+#endif	/* defined(HASFSTRUCT) */
+
+#if	defined(HASLFILEADD) && defined(SETLFILEADD)
+/*
+ * Do local initializations.
+ */
+	SETLFILEADD
+#endif	/* defined(HASLFILEADD) && defined(SETLFILEADD) */
+
+/*
+ * See if the file descriptor has been selected.
+ */
+	if (!Fdl || (!nm && num < 0))
+	    return;
+	fds = ck_fd_status(nm, num);
+	switch (FdlTy) {
+	case 0:			/* inclusion list */
+	    if (fds == 2)
+		Lf->sf |= SELFD;
+	    break;
+	case 1:			/* exclusion list */
+	    if (fds != 1)
+		Lf->sf |= SELFD;
+	}
+}
+
+
+/*
+ * alloc_lproc() - allocate local proc structure space
+ */
+
+void
+alloc_lproc(pid, pgid, ppid, uid, cmd, pss, sf)
+	int pid;			/* Process ID */
+	int pgid;			/* process group ID */
+	int ppid;			/* parent process ID */
+	UID_ARG uid;			/* User ID */
+	char *cmd;			/* command */
+	int pss;			/* process select state */
+	int sf;				/* process select flags */
+{
+	static int sz = 0;
+
+	if (!Lproc) {
+	    if (!(Lproc = (struct lproc *)malloc(
+			  (MALLOC_S)(LPROCINCR * sizeof(struct lproc)))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no malloc space for %d local proc structures\n",
+		    Pn, LPROCINCR);
+		Exit(1);
+	    }
+	    sz = LPROCINCR;
+	} else if ((Nlproc + 1) > sz) {
+	    sz += LPROCINCR;
+	    if (!(Lproc = (struct lproc *)realloc((MALLOC_P *)Lproc,
+			  (MALLOC_S)(sz * sizeof(struct lproc)))))
+	    {
+		(void) fprintf(stderr,
+		    "%s: no realloc space for %d local proc structures\n",
+		    Pn, sz);
+		Exit(1);
+	    }
+	}
+	Lp = &Lproc[Nlproc++];
+	Lp->pid = pid;
+
+#if	defined(HASTASKS)
+	Lp->tid = 0;
+#endif	/* defined(HASTASKS) */
+
+	Lp->pgid = pgid;
+	Lp->ppid = ppid;
+	Lp->file = (struct lfile *)NULL;
+	Lp->sf = (short)sf;
+	Lp->pss = (short)pss;
+	Lp->uid = (uid_t)uid;
+/*
+ * Allocate space for the full command name and copy it there.
+ */
+	if (!(Lp->cmd = mkstrcpy(cmd, (MALLOC_S *)NULL))) {
+	    (void) fprintf(stderr, "%s: PID %d, no space for command name: ",
+		Pn, pid);
+	    safestrprt(cmd, stderr, 1);
+	    Exit(1);
+	}
+
+#if	defined(HASZONES)
+/*
+ * Clear the zone name pointer.  The dialect's own code will set it.
+ */
+	Lp->zn = (char *)NULL;
+#endif	/* defined(HASZONES) */
+ 
+#if	defined(HASSELINUX)
+/*
+ * Clear the security context pointer.  The dialect's own code will
+ * set it.
+ */
+	Lp->cntx = (char *)NULL;
+#endif	/* defined(HASSELINUX) */
+
+}
+
+
+/*
+ * ck_fd_status() - check FD status
+ *
+ * return: 0 == FD is neither included nor excluded
+ *	   1 == FD is excluded
+ *	   2 == FD is included
+ */
+
+extern int
+ck_fd_status(nm, num)
+	char *nm;			/* file descriptor name (may be NULL) */
+	int num;			/* file descriptor number -- -1 if
+					 * none */
+{
+	char *cp;
+	struct fd_lst *fp;
+
+	if (!(fp = Fdl) || (!nm && num < 0))
+	    return(0);
+	if ((cp = nm)) {
+	    while (*cp && *cp == ' ')
+		cp++;
+	}
+/*
+ * Check for an exclusion match.
+ */
+	if (FdlTy == 1) {
+	    for (; fp; fp = fp->next) {
+		if (cp) {
+		    if (fp->nm && strcmp(fp->nm, cp) == 0)
+			return(1);
+		    continue;
+		}
+		if (num >= fp->lo && num <= fp->hi)
+		    return(1);
+	    }
+	    return(0);
+	}
+/*
+ * If Fdl isn't an exclusion list, check for an inclusion match.
+ */
+	for (; fp; fp = fp->next) {
+	    if (cp) {
+		if (fp->nm && strcmp(fp->nm, cp) == 0)
+		    return(2);
+		continue;
+	    }
+	    if (num >= fp->lo && num <= fp->hi)
+		return(2);
+	}
+	return(0);
+}
+
+
+/*
+ * comppid() - compare PIDs
+ */
+
+int
+comppid(a1, a2)
+	COMP_P *a1, *a2;
+{
+	struct lproc **p1 = (struct lproc **)a1;
+	struct lproc **p2 = (struct lproc **)a2;
+
+	if ((*p1)->pid < (*p2)->pid)
+	    return(-1);
+	if ((*p1)->pid > (*p2)->pid)
+	    return(1);
+
+#if	defined(HASTASKS)
+	if ((*p1)->tid < (*p2)->tid)
+	    return(-1);
+	if ((*p1)->tid > (*p2)->tid)
+	    return(1);
+#endif	/* defined(HASTASKS) */
+
+	return(0);
+}
+
+
+/*
+ * ent_inaddr() - enter Internet addresses
+ */
+
+void
+ent_inaddr(la, lp, fa, fp, af)
+	unsigned char *la;		/* local Internet address */
+	int lp;				/* local port */
+	unsigned char *fa;		/* foreign Internet address -- may
+					 * be NULL to indicate no foreign
+					 * address is known */
+	int fp;				/* foreign port */
+	int af;				/* address family -- e.g, AF_INET,
+					 * AF_INET */
+{
+	int m;
+
+	if (la) {
+	    Lf->li[0].af = af;
+
+#if	defined(HASIPv6)
+	    if (af == AF_INET6)
+		Lf->li[0].ia.a6 = *(struct in6_addr *)la;
+	    else
+#endif	/* defined(HASIPv6) */
+
+		Lf->li[0].ia.a4 = *(struct in_addr *)la;
+	    Lf->li[0].p = lp;
+	} else
+	    Lf->li[0].af = 0;
+	if (fa) {
+	    Lf->li[1].af = af;
+
+#if	defined(HASIPv6)
+	    if (af == AF_INET6)
+		Lf->li[1].ia.a6 = *(struct in6_addr *)fa;
+	    else
+#endif	/* defined(HASIPv6) */
+
+		Lf->li[1].ia.a4 = *(struct in_addr *)fa;
+	    Lf->li[1].p = fp;
+	} else
+	    Lf->li[1].af = 0;
+/*
+ * If network address matching has been selected, check both addresses.
+ */
+	if ((Selflags & SELNA) && Nwad) {
+	    m = (fa && is_nw_addr(fa, fp, af)) ? 1 : 0;
+	    m |= (la && is_nw_addr(la, lp, af)) ? 1 : 0;
+	    if (m)
+		Lf->sf |= SELNA;
+	}
+}
+
+
+/*
+ * examine_lproc() - examine local process
+ *
+ * return: 1 = last process
+ */
+
+int
+examine_lproc()
+{
+	int sbp = 0;
+
+	if (RptTm)
+	    return(0);
+/*
+ * List the process if the process is selected and:
+ *
+ *	o  listing is limited to a single PID selection -- this one;
+ *
+ *	o  listing is selected by an ANDed option set (not all options)
+ *	   that includes a single PID selection -- this one.
+ */
+	if ((Lp->sf & SELPID) && !Selall) {
+	    if ((Selflags == SELPID)
+	    ||  (Fand && (Selflags & SELPID))) {
+		sbp = 1;
+		Npuns--;
+	    }
+	}
+	if (Lp->pss && Npid == 1 && sbp) {
+	    print_init();
+	    (void) print_proc();
+	    PrPass++;
+	    if (PrPass < 2)
+		(void) print_proc();
+	    Lp->pss = 0;
+	}
+/*
+ * Deprecate an unselected (or listed) process.
+ */
+	if ( ! Lp->pss) {
+	    (void) free_lproc(Lp);
+	    Nlproc--;
+	}
+/*
+ * Indicate last-process if listing is limited to PID selections,
+ * and all selected processes have been listed.
+ */
+	return((sbp && Npuns == 0) ? 1 : 0);
+}
+
+
+/*
+ * free_lproc() - free lproc entry and its associated malloc'd space
+ */
+
+void
+free_lproc(lp)
+	struct lproc *lp;
+{
+	struct lfile *lf, *nf;
+
+	for (lf = lp->file; lf; lf = nf) {
+	    if (lf->dev_ch) {
+		(void) free((FREE_P *)lf->dev_ch);
+		lf->dev_ch = (char *)NULL;
+	    }
+	    if (lf->nm) {
+		(void) free((FREE_P *)lf->nm);
+		lf->nm = (char *)NULL;
+	    }
+	    if (lf->nma) {
+		(void) free((FREE_P *)lf->nma);
+		lf->nma = (char *)NULL;
+	    }
+
+#if	defined(HASLFILEADD) && defined(CLRLFILEADD)
+	    CLRLFILEADD(lf)
+#endif	/* defined(HASLFILEADD) && defined(CLRLFILEADD) */
+
+	    nf = lf->next;
+	    (void) free((FREE_P *)lf);
+	}
+	lp->file = (struct lfile *)NULL;
+	if (lp->cmd) {
+	    (void) free((FREE_P *)lp->cmd);
+	    lp->cmd = (char *)NULL;
+	}
+}
+
+
+/*
+ * is_cmd_excl() - is command excluded?
+ */
+
+int
+is_cmd_excl(cmd, pss, sf)
+	char *cmd;			/* command name */
+	short *pss;			/* process state */
+	short *sf;			/* process select flags */
+{
+	int i;
+	struct str_lst *sp;
+/*
+ * See if the command is excluded by a "-c^<command>" option.
+ */
+	if (Cmdl && Cmdnx) {
+	    for (sp = Cmdl; sp; sp = sp->next) {
+		if (sp->x && !strncmp(sp->str, cmd, sp->len))
+		    return(1);
+	    }
+	}
+/*
+ * The command is not excluded if no command selection was requested,
+ * or if its name matches any -c <command> specification.
+ * 
+ */
+	if ((Selflags & SELCMD) == 0)
+	    return(0);
+	for (sp = Cmdl; sp; sp = sp->next) {
+	    if (!sp->x && !strncmp(sp->str, cmd, sp->len)) {
+		sp->f = 1;
+		*pss |= PS_PRI;
+		*sf |= SELCMD;
+		return(0);
+	    }
+	}
+/*
+ * The command name doesn't match any -c <command> specification.  See if it
+ * matches a -c /RE/[bix] specification.
+ */
+	for (i = 0; i < NCmdRxU; i++) {
+	    if (!regexec(&CmdRx[i].cx, cmd, 0, NULL, 0)) {
+		CmdRx[i].mc = 1;
+		*pss |= PS_PRI;
+		*sf |= SELCMD;
+		return(0);
+	    }
+	}
+/*
+ * The command name matches no -c specification.
+ *
+ * It's excluded if the only selection condition is command name,
+ * or if command name selection is part of an ANDed set.
+ */
+	if (Selflags == SELCMD)
+	    return(1);
+	return (Fand ? 1 : 0);
+}
+
+
+/*
+ * is_file_sel() - is file selected?
+ */
+
+static int
+is_file_sel(lp, lf)
+	struct lproc *lp;		/* lproc structure pointer */
+	struct lfile *lf;		/* lfile structure pointer */
+{
+	if (!lf || !lf->sf)
+	    return(0);
+	if (Lf->sf & SELEXCLF)
+	    return(0);
+
+#if	defined(HASSECURITY) && defined(HASNOSOCKSECURITY)
+	if (Myuid && (Myuid != lp->uid)) {
+	    if (!(lf->sf & (SELNA | SELNET)))
+		return(0);
+	}
+#endif	/* defined(HASSECURITY) && defined(HASNOSOCKSECURITY) */
+
+	if (Selall)
+	    return(1);
+	if (Fand && ((lf->sf & Selflags) != Selflags))
+	    return(0);
+	return(1);
+}
+
+
+/*
+ * is_proc_excl() - is process excluded?
+ */
+
+int
+
+#if	defined(HASTASKS)
+is_proc_excl(pid, pgid, uid, pss, sf, tid)
+#else	/* !defined(HASTASKS) */
+is_proc_excl(pid, pgid, uid, pss, sf)
+#endif	/* defined(HASTASKS) */
+
+	int pid;			/* Process ID */
+	int pgid;			/* process group ID */
+	UID_ARG uid;			/* User ID */
+	short *pss;			/* process select state for lproc */
+	short *sf;			/* select flags for lproc */
+
+#if	defined(HASTASKS)
+	int tid;			/* task ID (not a task if zero) */
+#endif	/* defined(HASTASKS) */
+
+{
+	int i, j;
+
+	*pss = *sf = 0;
+
+#if	defined(HASSECURITY)
+/*
+ * The process is excluded by virtue of the security option if it
+ * isn't owned by the owner of this lsof process, unless the
+ * HASNOSOCKSECURITY option is also specified.  In that case the
+ * selected socket files of any process may be listed.
+ */
+# if	!defined(HASNOSOCKSECURITY)
+	if (Myuid && Myuid != (uid_t)uid)
+	    return(1);
+# endif	/* !defined(HASNOSOCKSECURITY) */
+#endif	/* defined(HASSECURITY) */
+
+/*
+ * If the excluding of process listing by UID has been specified, see if the
+ * owner of this process is excluded.
+ */
+	if (Nuidexcl) {
+	    for (i = j = 0; (i < Nuid) && (j < Nuidexcl); i++) {
+		if (!Suid[i].excl)
+		    continue;
+		if (Suid[i].uid == (uid_t)uid)
+		    return(1);
+		j++;
+	    }
+	}
+/*
+ * If the excluding of process listing by PGID has been specified, see if this
+ * PGID is excluded.
+ */
+	if (Npgidx) {
+	    for (i = j = 0; (i < Npgid) && (j < Npgidx); i++) {
+		if (!Spgid[i].x)
+		    continue;
+		if (Spgid[i].i == pgid)
+		    return(1);
+		j++;
+	    }
+	}
+/*
+ * If the excluding of process listing by PID has been specified, see if this
+ * PID is excluded.
+ */
+	if (Npidx) {
+	    for (i = j = 0; (i < Npid) && (j < Npidx); i++) {
+		if (!Spid[i].x)
+		    continue;
+		if (Spid[i].i == pid)
+		    return(1);
+		j++;
+	    }
+	}
+/*
+ * If the listing of all processes is selected, then this one is not excluded.
+ *
+ * However, if HASSECURITY and HASNOSOCKSECURITY are both specified, exclude
+ * network selections from the file flags, so that the tests in is_file_sel()
+ * work as expected.
+ */
+	if (Selall) {
+	    *pss = PS_PRI;
+
+#if	defined(HASSECURITY) && defined(HASNOSOCKSECURITY)
+	    *sf = SELALL & ~(SELNA | SELNET);
+#else	/* !defined(HASSECURITY) || !defined(HASNOSOCKSECURITY) */
+	    *sf = SELALL;
+#endif	/* defined(HASSECURITY) && defined(HASNOSOCKSECURITY) */
+
+	    return(0);
+	}
+/*
+ * If the listing of processes has been specified by process group ID, see
+ * if this one is included or excluded.
+ */
+	if (Npgidi && (Selflags & SELPGID)) {
+	    for (i = j = 0; (i < Npgid) && (j < Npgidi); i++) {
+		if (Spgid[i].x)
+		    continue;
+		if (Spgid[i].i == pgid) {
+		    Spgid[i].f = 1;
+		    *pss = PS_PRI;
+		    *sf = SELPGID;
+		    if (Selflags == SELPGID)
+			return(0);
+		    break;
+		}
+		j++;
+	    }
+	    if ((Selflags == SELPGID) && !*sf)
+		return(1);
+	}
+/*
+ * If the listing of processes has been specified by PID, see if this one is
+ * included or excluded.
+ */
+	if (Npidi && (Selflags & SELPID)) {
+	    for (i = j = 0; (i < Npid) && (j < Npidi); i++) {
+		if (Spid[i].x)
+		    continue;
+		if (Spid[i].i == pid) {
+		    Spid[i].f = 1;
+		    *pss = PS_PRI;
+		    *sf |= SELPID;
+		    if (Selflags == SELPID)
+			return(0);
+		    break;
+		}
+		j++;
+	    }
+	    if ((Selflags == SELPID) && !*sf)
+		return(1);
+	}
+/*
+ * If the listing of processes has been specified by UID, see if the owner of
+ * this process has been included.
+ */
+	if (Nuidincl && (Selflags & SELUID)) {
+	    for (i = j = 0; (i < Nuid) && (j < Nuidincl); i++) {
+		if (Suid[i].excl)
+		    continue;
+		if (Suid[i].uid == (uid_t)uid) {
+		    Suid[i].f = 1;
+		    *pss = PS_PRI;
+		    *sf |= SELUID;
+		    if (Selflags == SELUID)
+			return(0);
+		    break;
+		}
+		j++;
+	    }
+	    if (Selflags == SELUID && (*sf & SELUID) == 0)
+		return(1);
+	}
+
+#if	defined(HASTASKS)
+	if ((Selflags & SELTASK) && tid) {
+
+	/*
+	 * This is a task and tasks are selected.
+	 */
+	    *pss = PS_PRI;
+	    *sf |= SELTASK;
+	    if ((Selflags == SELTASK)
+	    ||  (Fand && ((*sf & Selflags) == Selflags)))
+		return(0);
+	}
+#endif	/* defined(HASTASKS) */
+
+/*
+ * When neither the process group ID, nor the PID, nor the task, nor the UID
+ * is selected:
+ *
+ *	If list option ANDing of process group IDs, PIDs, UIDs or tasks is
+ *	specified, the process is excluded;
+ *
+ *	Otherwise, it's not excluded by the tests of this function.
+ */
+	if ( ! *sf)
+	    return((Fand && (Selflags & (SELPGID|SELPID|SELUID|SELTASK)))
+		   ? 1 : 0);
+/*
+ * When the process group ID, PID, task or UID is selected and the process
+ * group ID, PID, task or UID list option has been specified:
+ *
+ *	If list option ANDing has been specified, and the correct
+ *	combination of selections are in place, reply that the process is no
+ *	excluded;
+ * or
+ *	If list option ANDing has not been specified, reply that the
+ *	process is not excluded by the tests of this function.
+ */
+	if (Selflags & (SELPGID|SELPID|SELUID|SELTASK)) {
+	    if (Fand)
+		return(((Selflags & (SELPGID|SELPID|SELUID|SELTASK)) != *sf)
+			? 1 : 0);
+	    return(0);
+	}
+/*
+ * Finally, when neither the process group ID, nor the PID, nor the UID, nor
+ * the task is selected, and no applicable list option has been specified:
+ *
+ *	If list option ANDing has been specified, this process is
+ *	excluded;
+ *
+ *	Otherwise, it isn't excluded by the tests of this function.
+ */
+	return(Fand ? 1 : 0);
+}
+
+
+/*
+ * link_lfile() - link local file structures
+ */
+
+void
+link_lfile()
+{
+	if (Lf->sf & SELEXCLF)
+	    return;
+	Lp->pss |= PS_SEC;
+	if (Plf)
+	    Plf->next = Lf;
+	else
+	    Lp->file = Lf;
+	Plf = Lf;
+	if (Fnet && (Lf->sf & SELNET))
+	    Fnet = 2;
+	if (Fnfs && (Lf->sf & SELNFS))
+	    Fnfs = 2;
+	if (Ftask && (Lf->sf & SELTASK))
+	    Ftask = 2;
+	Lf = (struct lfile *)NULL;
+}
+
+
+#if	defined(HASFSTRUCT)
+/*
+ * print_fflags() - print interpreted f_flag[s]
+ */
+
+char *
+print_fflags(ffg, pof)
+	long ffg;		/* file structure's flags value */
+	long pof;		/* process open files flags value */
+{
+	int al, ct, fx;
+	static int bl = 0;
+	static char *bp = (char *)NULL;
+	char *sep;
+	int sepl;
+	struct pff_tab *tp;
+	long wf;
+	char xbuf[64];
+/*
+ * Reduce the supplied flags according to the definitions in Pff_tab[] and
+ * Pof_tab[].
+ */
+	for (ct = fx = 0; fx < 2; fx++) {
+	    if (fx == 0) {
+		sep = "";
+		sepl = 0;
+		tp = Pff_tab;
+		wf = ffg;
+	    } else {
+		sep = ";";
+		sepl = 1;
+		tp = Pof_tab;
+		wf = pof;
+	    }
+	    for (; wf && !FsvFlagX; ct += al ) {
+		while (tp->nm) {
+		    if (wf & tp->val)
+			break;
+		    tp++;
+		}
+		if (!tp->nm)
+		    break;
+		al = (int)strlen(tp->nm) + sepl;
+		bp = alloc_fflbuf(&bp, &bl, al + ct);
+		(void) snpf(bp + ct, al + 1, "%s%s", sep, tp->nm);
+		sep = ",";
+		sepl = 1;
+		wf &= ~(tp->val);
+	    }
+	/*
+	 * If flag bits remain, print them in hex.  If hex output was
+	 * specified with +fG, print all flag values, including zero,
+	 * in hex.
+	 */
+	    if (wf || FsvFlagX) {
+		(void) snpf(xbuf, sizeof(xbuf), "0x%lx", wf);
+		al = (int)strlen(xbuf) + sepl;
+		bp = alloc_fflbuf(&bp, &bl, al + ct);
+		(void) snpf(bp + ct, al + 1, "%s%s", sep, xbuf);
+		ct += al;
+	    }
+	}
+/*
+ * Make sure there is at least a NUL terminated reply.
+ */
+	if (!bp) {
+	    bp = alloc_fflbuf(&bp, &bl, 0);
+	    *bp = '\0';
+	}
+	return(bp);
+}
+#endif	/* defined(HASFSTRUCT) */
+
+
+/*
+ * print_proc() - print process
+ */
+
+int
+print_proc()
+{
+	char buf[128], *cp;
+	int lc, len, st, ty;
+	int rv = 0;
+	unsigned long ul;
+/*
+ * If nothing in the process has been selected, skip it.
+ */
+	if (!Lp->pss)
+	    return(0);
+	if (Fterse) {
+
+#if	defined(HASTASKS)
+	/*
+	 * If this is a task of a process, skip it.
+	 */
+	    if (Lp->tid)
+		return(0);
+#endif	/* defined(HASTASKS) */
+
+	/*
+	 * The mode is terse and something in the process appears to have
+	 * been selected.  Make sure of that by looking for a selected file,
+	 * so that the HASSECURITY and HASNOSOCKSECURITY option combination
+	 * won't produce a false positive result.
+	 */
+	    for (Lf = Lp->file; Lf; Lf = Lf->next) {
+		if (is_file_sel(Lp, Lf)) {
+		    (void) printf("%d\n", Lp->pid);
+		    return(1);
+		}
+	    }
+	    return(0);
+	}
+/*
+ * If fields have been selected, output the process-only ones, provided
+ * that some file has also been selected.
+ */
+	if (Ffield) {
+	    for (Lf = Lp->file; Lf; Lf = Lf->next) {
+		if (is_file_sel(Lp, Lf))
+		    break;
+	    }
+	    if (!Lf)
+		return(rv);
+	    rv = 1;
+	    (void) printf("%c%d%c", LSOF_FID_PID, Lp->pid, Terminator);
+
+#if	defined(HASTASKS)
+	    if (FieldSel[LSOF_FIX_TID].st && Lp->tid)
+		(void) printf("%c%d%c", LSOF_FID_TID, Lp->tid, Terminator);
+#endif	/* defined(HASTASKS) */
+
+#if	defined(HASZONES)
+	    if (FieldSel[LSOF_FIX_ZONE].st && Fzone && Lp->zn)
+		(void) printf("%c%s%c", LSOF_FID_ZONE, Lp->zn, Terminator);
+#endif	/* defined(HASZONES) */
+ 
+#if	defined(HASSELINUX)
+	    if (FieldSel[LSOF_FIX_CNTX].st && Fcntx && Lp->cntx && CntxStatus)
+		(void) printf("%c%s%c", LSOF_FID_CNTX, Lp->cntx, Terminator);
+#endif	/* defined(HASSELINUX) */
+
+	    if (FieldSel[LSOF_FIX_PGID].st && Fpgid)
+		(void) printf("%c%d%c", LSOF_FID_PGID, Lp->pgid, Terminator);
+
+#if	defined(HASPPID)
+	    if (FieldSel[LSOF_FIX_PPID].st && Fppid)
+		(void) printf("%c%d%c", LSOF_FID_PPID, Lp->ppid, Terminator);
+#endif	/* defined(HASPPID) */
+
+	    if (FieldSel[LSOF_FIX_CMD].st) {
+		putchar(LSOF_FID_CMD);
+		safestrprt(Lp->cmd ? Lp->cmd : "(unknown)", stdout, 0);
+		putchar(Terminator);
+	    }
+	    if (FieldSel[LSOF_FIX_UID].st)
+		(void) printf("%c%d%c", LSOF_FID_UID, (int)Lp->uid, Terminator);
+	    if (FieldSel[LSOF_FIX_LOGIN].st) {
+		cp = printuid((UID_ARG)Lp->uid, &ty);
+		if (ty == 0)
+		    (void) printf("%c%s%c", LSOF_FID_LOGIN, cp, Terminator);
+	    }
+	    if (Terminator == '\0')
+	    putchar('\n');
+	}
+/*
+ * Print files.
+ */
+	for (Lf = Lp->file; Lf; Lf = Lf->next) {
+	    if (!is_file_sel(Lp, Lf))
+		continue;
+	    rv = 1;
+	/*
+	 * If no field output selected, print dialects-specific formatted
+	 * output.
+	 */
+	    if (!Ffield) {
+		print_file();
+		continue;
+	    }
+	/*
+	 * Print selected fields.
+	 */
+	    lc = st = 0;
+	    if (FieldSel[LSOF_FIX_FD].st) {
+		for (cp = Lf->fd; *cp == ' '; cp++)
+		    ;
+		if (*cp) {
+		    (void) printf("%c%s%c", LSOF_FID_FD, cp, Terminator);
+		    lc++;
+		}
+	    }
+	    if (FieldSel[LSOF_FIX_ACCESS].st) {
+		(void) printf("%c%c%c",
+		    LSOF_FID_ACCESS, Lf->access, Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_LOCK].st) {
+		(void) printf("%c%c%c", LSOF_FID_LOCK, Lf->lock, Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_TYPE].st) {
+		for (cp = Lf->type; *cp == ' '; cp++)
+		    ;
+		if (*cp) {
+		    (void) printf("%c%s%c", LSOF_FID_TYPE, cp, Terminator);
+		    lc++;
+		}
+	    }
+
+#if	defined(HASFSTRUCT)
+	    if (FieldSel[LSOF_FIX_FA].st && (Fsv & FSV_FA)
+	    &&  (Lf->fsv & FSV_FA)) {
+		(void) printf("%c%s%c", LSOF_FID_FA,
+		    print_kptr(Lf->fsa, (char *)NULL, 0), Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_CT].st && (Fsv & FSV_CT)
+	    &&  (Lf->fsv & FSV_CT)) {
+		(void) printf("%c%ld%c", LSOF_FID_CT, Lf->fct, Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_FG].st && (Fsv & FSV_FG)
+	    &&  (Lf->fsv & FSV_FG) && (FsvFlagX || Lf->ffg || Lf->pof)) {
+		(void) printf("%c%s%c", LSOF_FID_FG,
+		    print_fflags(Lf->ffg, Lf->pof), Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_NI].st && (Fsv & FSV_NI)
+	    &&  (Lf->fsv & FSV_NI)) {
+		(void) printf("%c%s%c", LSOF_FID_NI,
+		    print_kptr(Lf->fna, (char *)NULL, 0), Terminator);
+		lc++;
+	    }
+#endif	/* defined(HASFSTRUCT) */
+
+	    if (FieldSel[LSOF_FIX_DEVCH].st && Lf->dev_ch && Lf->dev_ch[0]) {
+		for (cp = Lf->dev_ch; *cp == ' '; cp++)
+		    ;
+		if (*cp) {
+		    (void) printf("%c%s%c", LSOF_FID_DEVCH, cp, Terminator);
+		    lc++;
+		}
+	    }
+	    if (FieldSel[LSOF_FIX_DEVN].st && Lf->dev_def) {
+		if (sizeof(unsigned long) > sizeof(dev_t))
+		    ul = (unsigned long)((unsigned int)Lf->dev);
+		else
+		    ul = (unsigned long)Lf->dev;
+		(void) printf("%c0x%lx%c", LSOF_FID_DEVN, ul, Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_RDEV].st && Lf->rdev_def) {
+		if (sizeof(unsigned long) > sizeof(dev_t))
+		    ul = (unsigned long)((unsigned int)Lf->rdev);
+		else
+		    ul = (unsigned long)Lf->rdev;
+		(void) printf("%c0x%lx%c", LSOF_FID_RDEV, ul, Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_SIZE].st && Lf->sz_def) {
+		putchar(LSOF_FID_SIZE);
+
+#if	defined(HASPRINTSZ)
+		cp = HASPRINTSZ(Lf);
+#else	/* !defined(HASPRINTSZ) */
+		(void) snpf(buf, sizeof(buf), SzOffFmt_d, Lf->sz);
+		cp = buf;
+#endif	/* defined(HASPRINTSZ) */
+
+		(void) printf("%s", cp);
+		putchar(Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_OFFSET].st && Lf->off_def) {
+		putchar(LSOF_FID_OFFSET);
+
+#if	defined(HASPRINTOFF)
+		cp = HASPRINTOFF(Lf, 0);
+#else	/* !defined(HASPRINTOFF) */
+		(void) snpf(buf, sizeof(buf), SzOffFmt_0t, Lf->off);
+		cp = buf;
+#endif	/* defined(HASPRINTOFF) */
+
+		len = strlen(cp);
+		if (OffDecDig && len > (OffDecDig + 2)) {
+
+#if	defined(HASPRINTOFF)
+		    cp = HASPRINTOFF(Lf, 1);
+#else	/* !defined(HASPRINTOFF) */
+		    (void) snpf(buf, sizeof(buf), SzOffFmt_x, Lf->off);
+		    cp = buf;
+#endif	/* defined(HASPRINTOFF) */
+
+		}
+		(void) printf("%s", cp);
+		putchar(Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_INODE].st && Lf->inp_ty == 1) {
+		putchar(LSOF_FID_INODE);
+		(void) printf(InodeFmt_d, Lf->inode);
+		putchar(Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_NLINK].st && Lf->nlink_def) {
+		(void) printf("%c%ld%c", LSOF_FID_NLINK, Lf->nlink, Terminator);
+		lc++;
+	    }
+	    if (FieldSel[LSOF_FIX_PROTO].st && Lf->inp_ty == 2) {
+		for (cp = Lf->iproto; *cp == ' '; cp++)
+		    ;
+		if (*cp) {
+		    (void) printf("%c%s%c", LSOF_FID_PROTO, cp, Terminator);
+		    lc++;
+		}
+	    }
+	    if (FieldSel[LSOF_FIX_STREAM].st && Lf->nm && Lf->is_stream) {
+		if (strncmp(Lf->nm, "STR:", 4) == 0
+		||  strcmp(Lf->iproto, "STR") == 0) {
+		    putchar(LSOF_FID_STREAM);
+		    printname(0);
+		    putchar(Terminator);
+		    lc++;
+		    st++;
+		}
+	    }
+	    if (st == 0 && FieldSel[LSOF_FIX_NAME].st) {
+		putchar(LSOF_FID_NAME);
+		printname(0);
+		putchar(Terminator);
+		lc++;
+	    }
+	    if (Lf->lts.type >= 0 && FieldSel[LSOF_FIX_TCPTPI].st) {
+		print_tcptpi(0);
+		lc++;
+	    }
+	    if (Terminator == '\0' && lc)
+		putchar('\n');
+	}
+	return(rv);
+}
diff --git a/lsof_4.85/lsof_4.85_src/proto.h b/lsof_4.85/lsof_4.85_src/proto.h
new file mode 100644
index 0000000..5b12d00
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/proto.h
@@ -0,0 +1,295 @@
+/*
+ * proto.h - common function prototypes 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: proto.h,v 1.36 2011/09/07 19:13:49 abe Exp $
+ */
+
+
+#if	!defined(PROTO_H)
+#define	PROTO_H	1
+
+
+/*
+ * The _PROTOTYPE macro provides strict ANSI C prototypes if __STDC__
+ * is defined, and old-style K&R prototypes otherwise.
+ *
+ * (With thanks to Andy Tanenbaum)
+ */
+
+# if	defined(__STDC__)
+#define	_PROTOTYPE(function, params)	function params
+# else	/* !defined(__STDC__) */
+#define	_PROTOTYPE(function, params)	function()
+# endif /* defined(__STDC__) */
+
+
+/*
+ * The following define keeps gcc>=2.7 from complaining about the failure
+ * of the Exit() function to return.
+ *
+ * Paul Eggert supplied it.
+ */
+
+# if	defined(__GNUC__) && !(__GNUC__<2 || (__GNUC__==2 && __GNUC_MINOR__<7))
+#define	exiting	__attribute__((__noreturn__))
+# else	/* !gcc || gcc<2.7 */
+#define	exiting
+# endif	/* gcc && gcc>=2.7 */
+
+
+_PROTOTYPE(extern void add_nma,(char *cp, int len));
+_PROTOTYPE(extern void alloc_lfile,(char *nm, int num));
+_PROTOTYPE(extern void alloc_lproc,(int pid, int pgid, int ppid, UID_ARG uid, char *cmd, int pss, int sf));
+_PROTOTYPE(extern void build_IPstates,(void));
+_PROTOTYPE(extern void childx,(void));
+_PROTOTYPE(extern int ck_fd_status,(char *nm, int num));
+_PROTOTYPE(extern int ck_file_arg,(int i, int ac, char *av[], int fv, int rs, struct stat *sbp));
+_PROTOTYPE(extern void ckkv,(char *d, char *er, char *ev, char *ea));
+_PROTOTYPE(extern void clr_devtab,(void));
+_PROTOTYPE(extern int compdev,(COMP_P *a1, COMP_P *a2));
+_PROTOTYPE(extern int comppid,(COMP_P *a1, COMP_P *a2));
+
+# if	defined(WILLDROPGID)
+_PROTOTYPE(extern void dropgid,(void));
+# endif	/* defined(WILLDROPGID) */
+
+_PROTOTYPE(extern char *endnm,(size_t *sz));
+_PROTOTYPE(extern int enter_cmd_rx,(char *x));
+_PROTOTYPE(extern void enter_dev_ch,(char *m));
+_PROTOTYPE(extern int enter_dir,(char *d, int descend));
+
+# if	defined(HASEOPT)
+_PROTOTYPE(extern int enter_efsys,(char *e, int rdlnk));
+# endif	/* defined(HASEOPT) */
+
+_PROTOTYPE(extern int enter_fd,(char *f));
+_PROTOTYPE(extern int enter_network_address,(char *na));
+_PROTOTYPE(extern int enter_id,(enum IDType ty, char *p));
+_PROTOTYPE(extern void enter_IPstate,(char *ty, char *nm, int nr));
+_PROTOTYPE(extern void enter_nm,(char *m));
+
+# if	defined(HASTCPUDPSTATE)
+_PROTOTYPE(extern int enter_state_spec,(char *ss));
+# endif	/* defined(HASTCPUDPSTATE) */
+
+_PROTOTYPE(extern int enter_str_lst,(char *opt, char *s, struct str_lst **lp,
+				     int *incl, int *excl));
+_PROTOTYPE(extern int enter_uid,(char *us));
+_PROTOTYPE(extern void ent_inaddr,(unsigned char *la, int lp, unsigned char *fa, int fp, int af));
+_PROTOTYPE(extern int examine_lproc,(void));
+_PROTOTYPE(extern void Exit,(int xv)) exiting;
+_PROTOTYPE(extern void find_ch_ino,(void));
+_PROTOTYPE(extern void free_lproc,(struct lproc *lp));
+_PROTOTYPE(extern void gather_proc_info,(void));
+_PROTOTYPE(extern char *gethostnm,(unsigned char *ia, int af));
+
+# if	!defined(GET_MAX_FD)
+/*
+ * This is not strictly a prototype, but GET_MAX_FD is the name of the
+ * function that, in lieu of getdtablesize(), returns the maximum file
+ * descriptor plus one (or file descriptor count).  GET_MAX_FD may be
+ * defined in the dialect's machine.h.  If it is not, the following
+ * selects getdtablesize().
+ */
+
+#define	GET_MAX_FD	getdtablesize
+# endif	/* !defined(GET_MAX_FD) */
+
+_PROTOTYPE(extern int hashbyname,(char *nm, int mod));
+_PROTOTYPE(extern void hashSfile,(void));
+_PROTOTYPE(extern void initialize,(void));
+_PROTOTYPE(extern int is_cmd_excl,(char *cmd, short *pss, short *sf));
+_PROTOTYPE(extern int is_nw_addr,(unsigned char *ia, int p, int af));
+
+#if	defined(HASTASKS)
+_PROTOTYPE(extern int is_proc_excl,(int pid, int pgid, UID_ARG uid, short *pss, short *sf, int tid));
+#else	/* !defined(HASTASKS) */
+_PROTOTYPE(extern int is_proc_excl,(int pid, int pgid, UID_ARG uid, short *pss, short *sf));
+#endif	/* defined(HASTASKS) */
+
+_PROTOTYPE(extern int is_readable,(char *path, int msg));
+_PROTOTYPE(extern int kread,(KA_T addr, char *buf, READLEN_T len));
+_PROTOTYPE(extern void link_lfile,(void));
+_PROTOTYPE(extern struct l_dev *lkupdev,(dev_t *dev,dev_t *rdev,int i,int r));
+_PROTOTYPE(extern int main,(int argc, char *argv[]));
+_PROTOTYPE(extern int lstatsafely,(char *path, struct stat *buf));
+_PROTOTYPE(extern char *mkstrcpy,(char *src, MALLOC_S *rlp));
+_PROTOTYPE(extern char *mkstrcat,(char *s1, int l1, char *s2, int l2, char *s3, int l3, MALLOC_S *clp));
+_PROTOTYPE(extern int printdevname,(dev_t *dev, dev_t *rdev, int f, int nty));
+_PROTOTYPE(extern void print_file,(void));
+_PROTOTYPE(extern void print_init,(void));
+_PROTOTYPE(extern void printname,(int nl));
+_PROTOTYPE(extern char *print_kptr,(KA_T kp, char *buf, size_t bufl));
+_PROTOTYPE(extern int print_proc,(void));
+_PROTOTYPE(extern void printrawaddr,(struct sockaddr *sa));
+_PROTOTYPE(extern void print_tcptpi,(int nl));
+_PROTOTYPE(extern char *printuid,(UID_ARG uid, int *ty));
+_PROTOTYPE(extern void printunkaf,(int fam, int ty));
+_PROTOTYPE(extern char *printsockty,(int ty));
+_PROTOTYPE(extern void process_file,(KA_T fp));
+_PROTOTYPE(extern void process_node,(KA_T f));
+_PROTOTYPE(extern char *Readlink,(char *arg));
+_PROTOTYPE(extern void readdev,(int skip));
+_PROTOTYPE(extern struct mounts *readmnt,(void));
+_PROTOTYPE(extern void rereaddev,(void));
+_PROTOTYPE(extern int safestrlen,(char *sp, int flags));
+_PROTOTYPE(extern void safestrprtn,(char *sp, int len, FILE *fs, int flags));
+_PROTOTYPE(extern void safestrprt,(char *sp, FILE *fs, int flags));
+_PROTOTYPE(extern int statsafely,(char *path, struct stat *buf));
+_PROTOTYPE(extern void stkdir,(char *p));
+_PROTOTYPE(extern void usage,(int xv, int fh, int version));
+_PROTOTYPE(extern int util_strftime,(char *fmtr, int fmtl, char *fmt));
+_PROTOTYPE(extern int vfy_dev,(struct l_dev *dp));
+_PROTOTYPE(extern char *x2dev,(char *s, dev_t *d));
+
+# if	defined(HASBLKDEV)
+_PROTOTYPE(extern void find_bl_ino,(void));
+_PROTOTYPE(extern struct l_dev *lkupbdev,(dev_t *dev,dev_t *rdev,int i,int r));
+_PROTOTYPE(extern int printbdevname,(dev_t *dev, dev_t *rdev, int f));
+# endif	/* defined(HASBLKDEV) */
+
+# if	defined(HASCDRNODE)
+_PROTOTYPE(extern int readcdrnode,(KA_T ca, struct cdrnode *c));
+# endif	/* defined(HASCDRNODE) */
+
+# if	defined(HASDCACHE)
+_PROTOTYPE(extern void alloc_dcache,(void));
+_PROTOTYPE(extern void crc,(char *b, int l, unsigned *s));
+_PROTOTYPE(extern void crdbld,(void));
+_PROTOTYPE(extern int ctrl_dcache,(char *p));
+_PROTOTYPE(extern int dcpath,(int rw, int npw));
+_PROTOTYPE(extern int open_dcache,(int m, int r, struct stat *sb));
+_PROTOTYPE(extern int read_dcache,(void));
+_PROTOTYPE(extern int wr2DCfd,(char *b, unsigned *c));
+_PROTOTYPE(extern void write_dcache,(void));
+# endif	/* defined(HASDCACHE) */
+
+# if	defined(HASFIFONODE)
+_PROTOTYPE(extern int readfifonode,(KA_T fa, struct fifonode *f));
+# endif	/* defined(HASFIFONODE) */
+
+# if	defined(HASFSTRUCT)
+_PROTOTYPE(extern char *print_fflags,(long ffg, long pof));
+# endif	/* defined(HASFSTRUCT) */
+
+# if	defined(HASGNODE)
+_PROTOTYPE(extern int readgnode,(KA_T ga, struct gnode *g));
+# endif	/* defined(HASGNODE) */
+
+# if	defined(HASKQUEUE)
+_PROTOTYPE(extern void process_kqueue,(KA_T ka));
+# endif	/* defined(HASKQUEUE) */
+
+# if	defined(HASHSNODE)
+_PROTOTYPE(extern int readhsnode,(KA_T ha, struct hsnode *h));
+# endif	/* defined(HASHSNODE) */
+
+# if	defined(HASINODE)
+_PROTOTYPE(extern int readinode,(KA_T ia, struct inode *i));
+# endif	/* defined(HASINODE) */
+
+# if	defined(HASNCACHE)
+_PROTOTYPE(extern void ncache_load,(void));
+_PROTOTYPE(extern char *ncache_lookup,(char *buf, int blen, int *fp));
+# endif	/* defined(HASNCACHE) */
+
+# if	defined(HASNLIST)
+_PROTOTYPE(extern void build_Nl,(struct drive_Nl *d));
+_PROTOTYPE(extern int get_Nl_value,(char *nn, struct drive_Nl *d, KA_T *v));
+# endif	/* defined(HASNLIST) */
+
+# if	defined(HASPIPENODE)
+_PROTOTYPE(extern int readpipenode,(KA_T pa, struct pipenode *p));
+# endif	/* defined(HASPIPENODE) */
+
+# if	defined(HASPRINTDEV)
+_PROTOTYPE(extern char *HASPRINTDEV,(struct lfile *lf, dev_t *dev));
+# endif	/* defined(HASPRINTDEV) */
+
+# if	defined(HASPRINTINO)
+_PROTOTYPE(extern char *HASPRINTINO,(struct lfile *lf));
+# endif	/* defined(HASPRINTINO) */
+
+# if	defined(HASPRINTNM)
+_PROTOTYPE(extern void HASPRINTNM,(struct lfile *lf));
+# endif	/* defined(HASPRINTNM) */
+
+# if	defined(HASPRINTOFF)
+_PROTOTYPE(extern char *HASPRINTOFF,(struct lfile *lf, int ty));
+# endif	/* defined(HASPRINTOFF) */
+
+# if	defined(HASPRINTSZ)
+_PROTOTYPE(extern char *HASPRINTSZ,(struct lfile *lf));
+# endif	/* defined(HASPRINTSZ) */
+
+# if	defined(HASPRIVNMCACHE)
+_PROTOTYPE(extern int HASPRIVNMCACHE,(struct lfile *lf));
+# endif	/* defined(HASPRIVNMCACHE) */
+
+# if	!defined(HASPRIVPRIPP)
+_PROTOTYPE(extern void printiproto,(int p));
+# endif	/* !defined(HASPRIVPRIPP) */
+
+# if	defined(HASRNODE)
+_PROTOTYPE(extern int readrnode,(KA_T ra, struct rnode *r));
+# endif	/* defined(HASRNODE) */
+
+# if	defined(HASSPECDEVD)
+_PROTOTYPE(extern void HASSPECDEVD,(char *p, struct stat *s));
+# endif	/* defined(HASSPECDEVD) */
+
+# if	defined(HASSNODE)
+_PROTOTYPE(extern int readsnode,(KA_T sa, struct snode *s));
+# endif	/* defined(HASSNODE) */
+
+# if	defined(HASSTREAMS)
+_PROTOTYPE(extern int readstdata,(KA_T addr, struct stdata *buf));
+_PROTOTYPE(extern int readsthead,(KA_T addr, struct queue *buf));
+_PROTOTYPE(extern int readstidnm,(KA_T addr, char *buf, READLEN_T len));
+_PROTOTYPE(extern int readstmin,(KA_T addr, struct module_info *buf));
+_PROTOTYPE(extern int readstqinit,(KA_T addr, struct qinit *buf));
+# endif	/* defined(HASSTREAMS) */
+
+# if	defined(HASTMPNODE)
+_PROTOTYPE(extern int readtnode,(KA_T ta, struct tmpnode *t));
+# endif	/* defined(HASTMPNODE) */
+
+# if	defined(HASVNODE)
+_PROTOTYPE(extern int readvnode,(KA_T va, struct vnode *v));
+# endif	/* defined(HASVNODE) */
+
+# if	defined(USE_LIB_SNPF)
+_PROTOTYPE(extern int snpf,(char *str, int len, char *fmt, ...));
+# endif	/* defined(USE_LIB_SNPF) */
+
+# endif	/* !defined(PROTO_H) */
diff --git a/lsof_4.85/lsof_4.85_src/regex.h b/lsof_4.85/lsof_4.85_src/regex.h
new file mode 100644
index 0000000..d1b41a8
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/regex.h
@@ -0,0 +1,617 @@
+/*
+ * regex.h -- regular expression definitions for lsof
+ *
+ * This header file is used only when the dialect has no POSIX-conformant
+ * regular expression function set.  When that is the case, the dialect's
+ * machine.h will define USE_LIB_REGEX.
+ *
+ * When the dialect has a POSIX-conformant regular expression function set,
+ * USE_LIB_REGEX is not defined and this header file #include's <regex.h>.
+ *
+ * V. Abell <abe@purdue.edu>
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2000 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.
+ *
+ * This software has been adapted from snprintf.c in sendmail 8.9.3.  It
+ * is subject to the sendmail copyright statements listed below, and the
+ * sendmail licensing terms stated in the sendmail LICENSE file comment
+ * section of this file.
+ *
+ * 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.
+ */
+
+
+#ifdef	USE_LIB_REGEX
+/*
+ * This section comes from GLIBC 2.2.  It is used only when the dialect
+ * has no POSIX-conformant regular expression function set.  When that is
+ * the case, the dialect's machine.h will define USE_LIB_REGEX.
+ */
+
+/* Definitions for data structures and routines for the regular
+   expression library, version 0.12.
+   Copyright (C) 1985,1989-1993,1995-1998, 2000 Free Software Foundation, Inc.
+
+   This file is part of the GNU C Library.  Its master source is NOT part of
+   the C library, however.  The master source lives in /gd/gnu/lib.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Library General Public License as
+   published by the Free Software Foundation; either version 2 of the
+   License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Library General Public License for more details.
+
+   You should have received a copy of the GNU Library General Public
+   License along with the GNU C Library; see the file COPYING.LIB.  If not,
+   write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+   Boston, MA 02111-1307, USA.  */
+
+#ifndef _REGEX_H
+#define _REGEX_H 1
+
+/* Allow the use in C++ code.  */
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* POSIX says that <sys/types.h> must be included (by the caller) before
+   <regex.h>.  */
+
+#if !defined _POSIX_C_SOURCE && !defined _POSIX_SOURCE && defined VMS
+/* VMS doesn't have `size_t' in <sys/types.h>, even though POSIX says it
+   should be there.  */
+# include <stddef.h>
+#endif
+
+/* The following two types have to be signed and unsigned integer type
+   wide enough to hold a value of a pointer.  For most ANSI compilers
+   ptrdiff_t and size_t should be likely OK.  Still size of these two
+   types is 2 for Microsoft C.  Ugh... */
+typedef long int s_reg_t;
+typedef unsigned long int active_reg_t;
+
+/* The following bits are used to determine the regexp syntax we
+   recognize.  The set/not-set meanings are chosen so that Emacs syntax
+   remains the value 0.  The bits are given in alphabetical order, and
+   the definitions shifted by one from the previous bit; thus, when we
+   add or remove a bit, only one other definition need change.  */
+typedef unsigned long int reg_syntax_t;
+
+/* If this bit is not set, then \ inside a bracket expression is literal.
+   If set, then such a \ quotes the following character.  */
+#define RE_BACKSLASH_ESCAPE_IN_LISTS ((unsigned long int) 1)
+
+/* If this bit is not set, then + and ? are operators, and \+ and \? are
+     literals.
+   If set, then \+ and \? are operators and + and ? are literals.  */
+#define RE_BK_PLUS_QM (RE_BACKSLASH_ESCAPE_IN_LISTS << 1)
+
+/* If this bit is set, then character classes are supported.  They are:
+     [:alpha:], [:upper:], [:lower:],  [:digit:], [:alnum:], [:xdigit:],
+     [:space:], [:print:], [:punct:], [:graph:], and [:cntrl:].
+   If not set, then character classes are not supported.  */
+#define RE_CHAR_CLASSES (RE_BK_PLUS_QM << 1)
+
+/* If this bit is set, then ^ and $ are always anchors (outside bracket
+     expressions, of course).
+   If this bit is not set, then it depends:
+        ^  is an anchor if it is at the beginning of a regular
+           expression or after an open-group or an alternation operator;
+        $  is an anchor if it is at the end of a regular expression, or
+           before a close-group or an alternation operator.
+
+   This bit could be (re)combined with RE_CONTEXT_INDEP_OPS, because
+   POSIX draft 11.2 says that * etc. in leading positions is undefined.
+   We already implemented a previous draft which made those constructs
+   invalid, though, so we haven't changed the code back.  */
+#define RE_CONTEXT_INDEP_ANCHORS (RE_CHAR_CLASSES << 1)
+
+/* If this bit is set, then special characters are always special
+     regardless of where they are in the pattern.
+   If this bit is not set, then special characters are special only in
+     some contexts; otherwise they are ordinary.  Specifically,
+     * + ? and intervals are only special when not after the beginning,
+     open-group, or alternation operator.  */
+#define RE_CONTEXT_INDEP_OPS (RE_CONTEXT_INDEP_ANCHORS << 1)
+
+/* If this bit is set, then *, +, ?, and { cannot be first in an re or
+     immediately after an alternation or begin-group operator.  */
+#define RE_CONTEXT_INVALID_OPS (RE_CONTEXT_INDEP_OPS << 1)
+
+/* If this bit is set, then . matches newline.
+   If not set, then it doesn't.  */
+#define RE_DOT_NEWLINE (RE_CONTEXT_INVALID_OPS << 1)
+
+/* If this bit is set, then . doesn't match NUL.
+   If not set, then it does.  */
+#define RE_DOT_NOT_NULL (RE_DOT_NEWLINE << 1)
+
+/* If this bit is set, nonmatching lists [^...] do not match newline.
+   If not set, they do.  */
+#define RE_HAT_LISTS_NOT_NEWLINE (RE_DOT_NOT_NULL << 1)
+
+/* If this bit is set, either \{...\} or {...} defines an
+     interval, depending on RE_NO_BK_BRACES.
+   If not set, \{, \}, {, and } are literals.  */
+#define RE_INTERVALS (RE_HAT_LISTS_NOT_NEWLINE << 1)
+
+/* If this bit is set, +, ? and | aren't recognized as operators.
+   If not set, they are.  */
+#define RE_LIMITED_OPS (RE_INTERVALS << 1)
+
+/* If this bit is set, newline is an alternation operator.
+   If not set, newline is literal.  */
+#define RE_NEWLINE_ALT (RE_LIMITED_OPS << 1)
+
+/* If this bit is set, then `{...}' defines an interval, and \{ and \}
+     are literals.
+  If not set, then `\{...\}' defines an interval.  */
+#define RE_NO_BK_BRACES (RE_NEWLINE_ALT << 1)
+
+/* If this bit is set, (...) defines a group, and \( and \) are literals.
+   If not set, \(...\) defines a group, and ( and ) are literals.  */
+#define RE_NO_BK_PARENS (RE_NO_BK_BRACES << 1)
+
+/* If this bit is set, then \<digit> matches <digit>.
+   If not set, then \<digit> is a back-reference.  */
+#define RE_NO_BK_REFS (RE_NO_BK_PARENS << 1)
+
+/* If this bit is set, then | is an alternation operator, and \| is literal.
+   If not set, then \| is an alternation operator, and | is literal.  */
+#define RE_NO_BK_VBAR (RE_NO_BK_REFS << 1)
+
+/* If this bit is set, then an ending range point collating higher
+     than the starting range point, as in [z-a], is invalid.
+   If not set, then when ending range point collates higher than the
+     starting range point, the range is ignored.  */
+#define RE_NO_EMPTY_RANGES (RE_NO_BK_VBAR << 1)
+
+/* If this bit is set, then an unmatched ) is ordinary.
+   If not set, then an unmatched ) is invalid.  */
+#define RE_UNMATCHED_RIGHT_PAREN_ORD (RE_NO_EMPTY_RANGES << 1)
+
+/* If this bit is set, succeed as soon as we match the whole pattern,
+   without further backtracking.  */
+#define RE_NO_POSIX_BACKTRACKING (RE_UNMATCHED_RIGHT_PAREN_ORD << 1)
+
+/* If this bit is set, do not process the GNU regex operators.
+   If not set, then the GNU regex operators are recognized. */
+#define RE_NO_GNU_OPS (RE_NO_POSIX_BACKTRACKING << 1)
+
+/* If this bit is set, turn on internal regex debugging.
+   If not set, and debugging was on, turn it off.
+   This only works if regex.c is compiled -DDEBUG.
+   We define this bit always, so that all that's needed to turn on
+   debugging is to recompile regex.c; the calling code can always have
+   this bit set, and it won't affect anything in the normal case. */
+#define RE_DEBUG (RE_NO_GNU_OPS << 1)
+
+/* This global variable defines the particular regexp syntax to use (for
+   some interfaces).  When a regexp is compiled, the syntax used is
+   stored in the pattern buffer, so changing this does not affect
+   already-compiled regexps.  */
+extern reg_syntax_t re_syntax_options;
+
+/* Define combinations of the above bits for the standard possibilities.
+   (The [[[ comments delimit what gets put into the Texinfo file, so
+   don't delete them!)  */
+/* [[[begin syntaxes]]] */
+#define RE_SYNTAX_EMACS 0
+
+#define RE_SYNTAX_AWK							\
+  (RE_BACKSLASH_ESCAPE_IN_LISTS   | RE_DOT_NOT_NULL			\
+   | RE_NO_BK_PARENS              | RE_NO_BK_REFS			\
+   | RE_NO_BK_VBAR                | RE_NO_EMPTY_RANGES			\
+   | RE_DOT_NEWLINE		  | RE_CONTEXT_INDEP_ANCHORS		\
+   | RE_UNMATCHED_RIGHT_PAREN_ORD | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GNU_AWK						\
+  ((RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS | RE_DEBUG)	\
+   & ~(RE_DOT_NOT_NULL | RE_INTERVALS | RE_CONTEXT_INDEP_OPS))
+
+#define RE_SYNTAX_POSIX_AWK 						\
+  (RE_SYNTAX_POSIX_EXTENDED | RE_BACKSLASH_ESCAPE_IN_LISTS		\
+   | RE_INTERVALS	    | RE_NO_GNU_OPS)
+
+#define RE_SYNTAX_GREP							\
+  (RE_BK_PLUS_QM              | RE_CHAR_CLASSES				\
+   | RE_HAT_LISTS_NOT_NEWLINE | RE_INTERVALS				\
+   | RE_NEWLINE_ALT)
+
+#define RE_SYNTAX_EGREP							\
+  (RE_CHAR_CLASSES        | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS | RE_HAT_LISTS_NOT_NEWLINE			\
+   | RE_NEWLINE_ALT       | RE_NO_BK_PARENS				\
+   | RE_NO_BK_VBAR)
+
+#define RE_SYNTAX_POSIX_EGREP						\
+  (RE_SYNTAX_EGREP | RE_INTERVALS | RE_NO_BK_BRACES)
+
+/* P1003.2/D11.2, section 4.20.7.1, lines 5078ff.  */
+#define RE_SYNTAX_ED RE_SYNTAX_POSIX_BASIC
+
+#define RE_SYNTAX_SED RE_SYNTAX_POSIX_BASIC
+
+/* Syntax bits common to both basic and extended POSIX regex syntax.  */
+#define _RE_SYNTAX_POSIX_COMMON						\
+  (RE_CHAR_CLASSES | RE_DOT_NEWLINE      | RE_DOT_NOT_NULL		\
+   | RE_INTERVALS  | RE_NO_EMPTY_RANGES)
+
+#define RE_SYNTAX_POSIX_BASIC						\
+  (_RE_SYNTAX_POSIX_COMMON | RE_BK_PLUS_QM)
+
+/* Differs from ..._POSIX_BASIC only in that RE_BK_PLUS_QM becomes
+   RE_LIMITED_OPS, i.e., \? \+ \| are not recognized.  Actually, this
+   isn't minimal, since other operators, such as \`, aren't disabled.  */
+#define RE_SYNTAX_POSIX_MINIMAL_BASIC					\
+  (_RE_SYNTAX_POSIX_COMMON | RE_LIMITED_OPS)
+
+#define RE_SYNTAX_POSIX_EXTENDED					\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INDEP_OPS   | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_VBAR				\
+   | RE_CONTEXT_INVALID_OPS | RE_UNMATCHED_RIGHT_PAREN_ORD)
+
+/* Differs from ..._POSIX_EXTENDED in that RE_CONTEXT_INDEP_OPS is
+   removed and RE_NO_BK_REFS is added.  */
+#define RE_SYNTAX_POSIX_MINIMAL_EXTENDED				\
+  (_RE_SYNTAX_POSIX_COMMON  | RE_CONTEXT_INDEP_ANCHORS			\
+   | RE_CONTEXT_INVALID_OPS | RE_NO_BK_BRACES				\
+   | RE_NO_BK_PARENS        | RE_NO_BK_REFS				\
+   | RE_NO_BK_VBAR	    | RE_UNMATCHED_RIGHT_PAREN_ORD)
+/* [[[end syntaxes]]] */
+
+/* Maximum number of duplicates an interval can allow.  Some systems
+   (erroneously) define this in other header files, but we want our
+   value, so remove any previous define.  */
+#ifdef RE_DUP_MAX
+# undef RE_DUP_MAX
+#endif
+/* If sizeof(int) == 2, then ((1 << 15) - 1) overflows.  */
+#define RE_DUP_MAX (0x7fff)
+
+
+/* POSIX `cflags' bits (i.e., information for `regcomp').  */
+
+/* If this bit is set, then use extended regular expression syntax.
+   If not set, then use basic regular expression syntax.  */
+#define REG_EXTENDED 1
+
+/* If this bit is set, then ignore case when matching.
+   If not set, then case is significant.  */
+#define REG_ICASE (REG_EXTENDED << 1)
+
+/* If this bit is set, then anchors do not match at newline
+     characters in the string.
+   If not set, then anchors do match at newlines.  */
+#define REG_NEWLINE (REG_ICASE << 1)
+
+/* If this bit is set, then report only success or fail in regexec.
+   If not set, then returns differ between not matching and errors.  */
+#define REG_NOSUB (REG_NEWLINE << 1)
+
+
+/* POSIX `eflags' bits (i.e., information for regexec).  */
+
+/* If this bit is set, then the beginning-of-line operator doesn't match
+     the beginning of the string (presumably because it's not the
+     beginning of a line).
+   If not set, then the beginning-of-line operator does match the
+     beginning of the string.  */
+#define REG_NOTBOL 1
+
+/* Like REG_NOTBOL, except for the end-of-line.  */
+#define REG_NOTEOL (1 << 1)
+
+
+/* If any error codes are removed, changed, or added, update the
+   `re_error_msg' table in regex.c.  */
+typedef enum
+{
+#ifdef _XOPEN_SOURCE
+  REG_ENOSYS = -1,	/* This will never happen for this implementation.  */
+#endif
+
+  REG_NOERROR = 0,	/* Success.  */
+  REG_NOMATCH,		/* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+  REG_BADPAT,		/* Invalid pattern.  */
+  REG_ECOLLATE,		/* Not implemented.  */
+  REG_ECTYPE,		/* Invalid character class name.  */
+  REG_EESCAPE,		/* Trailing backslash.  */
+  REG_ESUBREG,		/* Invalid back reference.  */
+  REG_EBRACK,		/* Unmatched left bracket.  */
+  REG_EPAREN,		/* Parenthesis imbalance.  */
+  REG_EBRACE,		/* Unmatched \{.  */
+  REG_BADBR,		/* Invalid contents of \{\}.  */
+  REG_ERANGE,		/* Invalid range end.  */
+  REG_ESPACE,		/* Ran out of memory.  */
+  REG_BADRPT,		/* No preceding re for repetition op.  */
+
+  /* Error codes we've added.  */
+  REG_EEND,		/* Premature end.  */
+  REG_ESIZE,		/* Compiled pattern bigger than 2^16 bytes.  */
+  REG_ERPAREN		/* Unmatched ) or \); not returned from regcomp. */
+} reg_errcode_t;
+
+/* This data structure represents a compiled pattern.  Before calling
+   the pattern compiler, the fields `buffer', `allocated', `fastmap',
+   `translate', and `no_sub' can be set.  After the pattern has been
+   compiled, the `re_nsub' field is available.  All other fields are
+   private to the regex routines.  */
+
+#ifndef RE_TRANSLATE_TYPE
+# define RE_TRANSLATE_TYPE char *
+#endif
+
+struct re_pattern_buffer
+{
+/* [[[begin pattern_buffer]]] */
+	/* Space that holds the compiled pattern.  It is declared as
+          `unsigned char *' because its elements are
+           sometimes used as array indexes.  */
+  unsigned char *buffer;
+
+	/* Number of bytes to which `buffer' points.  */
+  unsigned long int allocated;
+
+	/* Number of bytes actually used in `buffer'.  */
+  unsigned long int used;
+
+        /* Syntax setting with which the pattern was compiled.  */
+  reg_syntax_t syntax;
+
+        /* Pointer to a fastmap, if any, otherwise zero.  re_search uses
+           the fastmap, if there is one, to skip over impossible
+           starting points for matches.  */
+  char *fastmap;
+
+        /* Either a translate table to apply to all characters before
+           comparing them, or zero for no translation.  The translation
+           is applied to a pattern when it is compiled and to a string
+           when it is matched.  */
+  RE_TRANSLATE_TYPE translate;
+
+	/* Number of subexpressions found by the compiler.  */
+  size_t re_nsub;
+
+        /* Zero if this pattern cannot match the empty string, one else.
+           Well, in truth it's used only in `re_search_2', to see
+           whether or not we should use the fastmap, so we don't set
+           this absolutely perfectly; see `re_compile_fastmap' (the
+           `duplicate' case).  */
+  unsigned can_be_null : 1;
+
+        /* If REGS_UNALLOCATED, allocate space in the `regs' structure
+             for `max (RE_NREGS, re_nsub + 1)' groups.
+           If REGS_REALLOCATE, reallocate space if necessary.
+           If REGS_FIXED, use what's there.  */
+#define REGS_UNALLOCATED 0
+#define REGS_REALLOCATE 1
+#define REGS_FIXED 2
+  unsigned regs_allocated : 2;
+
+        /* Set to zero when `regex_compile' compiles a pattern; set to one
+           by `re_compile_fastmap' if it updates the fastmap.  */
+  unsigned fastmap_accurate : 1;
+
+        /* If set, `re_match_2' does not return information about
+           subexpressions.  */
+  unsigned no_sub : 1;
+
+        /* If set, a beginning-of-line anchor doesn't match at the
+           beginning of the string.  */
+  unsigned not_bol : 1;
+
+        /* Similarly for an end-of-line anchor.  */
+  unsigned not_eol : 1;
+
+        /* If true, an anchor at a newline matches.  */
+  unsigned newline_anchor : 1;
+
+/* [[[end pattern_buffer]]] */
+};
+
+typedef struct re_pattern_buffer regex_t;
+
+/* Type for byte offsets within the string.  POSIX mandates this.  */
+typedef int regoff_t;
+
+
+/* This is the structure we store register match data in.  See
+   regex.texinfo for a full description of what registers match.  */
+struct re_registers
+{
+  unsigned num_regs;
+  regoff_t *start;
+  regoff_t *end;
+};
+
+
+/* If `regs_allocated' is REGS_UNALLOCATED in the pattern buffer,
+   `re_match_2' returns information about at least this many registers
+   the first time a `regs' structure is passed.  */
+#ifndef RE_NREGS
+# define RE_NREGS 30
+#endif
+
+
+/* POSIX specification for registers.  Aside from the different names than
+   `re_registers', POSIX uses an array of structures, instead of a
+   structure of arrays.  */
+typedef struct
+{
+  regoff_t rm_so;  /* Byte offset from string's start to substring's start.  */
+  regoff_t rm_eo;  /* Byte offset from string's start to substring's end.  */
+} regmatch_t;
+
+/* Declarations for routines.  */
+
+/* To avoid duplicating every routine declaration -- once with a
+   prototype (if we are ANSI), and once without (if we aren't) -- we
+   use the following macro to declare argument types.  This
+   unfortunately clutters up the declarations a bit, but I think it's
+   worth it.  */
+
+#if __STDC__
+
+# define _RE_ARGS(args) args
+
+#else /* not __STDC__ */
+
+# define _RE_ARGS(args) ()
+
+#endif /* not __STDC__ */
+
+/* Sets the current default syntax to SYNTAX, and return the old syntax.
+   You can also simply assign to the `re_syntax_options' variable.  */
+extern reg_syntax_t re_set_syntax _RE_ARGS ((reg_syntax_t syntax));
+
+/* Compile the regular expression PATTERN, with length LENGTH
+   and syntax given by the global `re_syntax_options', into the buffer
+   BUFFER.  Return NULL if successful, and an error string if not.  */
+extern const char *re_compile_pattern
+  _RE_ARGS ((const char *pattern, size_t length,
+             struct re_pattern_buffer *buffer));
+
+
+/* Compile a fastmap for the compiled pattern in BUFFER; used to
+   accelerate searches.  Return 0 if successful and -2 if was an
+   internal error.  */
+extern int re_compile_fastmap _RE_ARGS ((struct re_pattern_buffer *buffer));
+
+
+/* Search in the string STRING (with length LENGTH) for the pattern
+   compiled into BUFFER.  Start searching at position START, for RANGE
+   characters.  Return the starting position of the match, -1 for no
+   match, or -2 for an internal error.  Also return register
+   information in REGS (if REGS and BUFFER->no_sub are nonzero).  */
+extern int re_search
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+            int length, int start, int range, struct re_registers *regs));
+
+
+/* Like `re_search', but search in the concatenation of STRING1 and
+   STRING2.  Also, stop searching at index START + STOP.  */
+extern int re_search_2
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+             int length1, const char *string2, int length2,
+             int start, int range, struct re_registers *regs, int stop));
+
+
+/* Like `re_search', but return how many characters in STRING the regexp
+   in BUFFER matched, starting at position START.  */
+extern int re_match
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string,
+             int length, int start, struct re_registers *regs));
+
+
+/* Relates to `re_match' as `re_search_2' relates to `re_search'.  */
+extern int re_match_2
+  _RE_ARGS ((struct re_pattern_buffer *buffer, const char *string1,
+             int length1, const char *string2, int length2,
+             int start, struct re_registers *regs, int stop));
+
+
+/* Set REGS to hold NUM_REGS registers, storing them in STARTS and
+   ENDS.  Subsequent matches using BUFFER and REGS will use this memory
+   for recording register information.  STARTS and ENDS must be
+   allocated with malloc, and must each be at least `NUM_REGS * sizeof
+   (regoff_t)' bytes long.
+
+   If NUM_REGS == 0, then subsequent matches should allocate their own
+   register data.
+
+   Unless this function is called, the first search or match using
+   PATTERN_BUFFER will allocate its own register data, without
+   freeing the old data.  */
+extern void re_set_registers
+  _RE_ARGS ((struct re_pattern_buffer *buffer, struct re_registers *regs,
+             unsigned num_regs, regoff_t *starts, regoff_t *ends));
+
+#if defined _REGEX_RE_COMP || defined _LIBC
+# ifndef _CRAY
+/* 4.2 bsd compatibility.  */
+extern char *re_comp _RE_ARGS ((const char *));
+extern int re_exec _RE_ARGS ((const char *));
+# endif
+#endif
+
+/* GCC 2.95 and later have "__restrict"; C99 compilers have
+   "restrict", and "configure" may have defined "restrict".  */
+#ifndef __restrict
+# if ! (2 < __GNUC__ || (2 == __GNUC__ && 95 <= __GNUC_MINOR__))
+#  if defined restrict || 199901L <= __STDC_VERSION__
+#   define __restrict restrict
+#  else
+#   define __restrict
+#  endif
+# endif
+#endif
+/* For now unconditionally define __restrict_arr to expand to nothing.
+   Ideally we would have a test for the compiler which allows defining
+   it to restrict.  */
+#define __restrict_arr
+
+/* POSIX compatibility.  */
+extern int regcomp _RE_ARGS ((regex_t *__restrict __preg,
+			      const char *__restrict __pattern,
+			      int __cflags));
+
+extern int regexec _RE_ARGS ((const regex_t *__restrict __preg,
+			      const char *__restrict __string, size_t __nmatch,
+			      regmatch_t __pmatch[__restrict_arr],
+			      int __eflags));
+
+extern size_t regerror _RE_ARGS ((int __errcode, const regex_t *__preg,
+				  char *__errbuf, size_t __errbuf_size));
+
+extern void regfree _RE_ARGS ((regex_t *__preg));
+
+#ifdef __cplusplus
+}
+#endif	/* C++ */
+
+#endif /* regex.h */
+
+/*
+Local variables:
+make-backup-files: t
+version-control: t
+trim-versions-without-asking: nil
+End:
+*/
+
+#else	/* !defined(USE_LIB_REGEX) */
+#include <regex.h>
+#endif	/* defined(USE_LIB_REGEX) */
diff --git a/lsof_4.85/lsof_4.85_src/scripts/00MANIFEST b/lsof_4.85/lsof_4.85_src/scripts/00MANIFEST
new file mode 100644
index 0000000..79d6fb3
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/00MANIFEST
@@ -0,0 +1,58 @@
+The scripts in this subdirectory give examples of using lsof's
+field output.
+
+big_brother.perl5	Perl 5 script, contributed by Lionel Cons
+			<Lionel.Cons@cern.ch>, that watches for new
+			network connections.
+
+count_pf.perl		Perl 4 or 5 script that runs lsof in repeat
+			mode, gathering process, file, TCP, and UDP
+			counts
+
+count_pf.perl5		Perl 5 script that runs lsof in repeat mode,
+			gathering process, file, TCP, and UDP counts
+
+			This script uses NUL terminated lsof field
+			output.
+
+identd.perl5            Perl 5 script, contributed by Kapil Chowksey
+			<kchowksey@hss.hns.com> that implements an
+			identd server. (Thanks, Kapil!)
+
+idrlogin.perl           Perl 4 script that identifies the shell and
+			network source address of users who have logged
+			on from remote locations via rlogin, ssh, or
+			telnet
+
+idrlogin.perl5		Perl 5 script that identifies the shell and
+			network source address of users who have logged
+			on from remote locations via rlogin, ssh, or
+			telnet
+
+list_NULf.perl5		Perl 5 script that prints lsof's NUL terminated
+			field output
+
+list_fields.awk		AWK script that prints lsof's field output
+
+list_fields.perl	Perl 4 or 5 script that prints lsof's field
+			output
+
+shared.perl5		Perl 5 script that uses +ffn output to produce
+			a list of file descriptors or files shared by
+			processes.
+
+sort_res.perl5		Perl 5 script, contributed by Fabian Frederick
+			<fabian.frederick@gmx.fr>, to display top resource
+			usage.
+
+watch_a_file.perl	Perl 4 or 5 script that watches the use of a
+			named file
+
+xusers.awk		an AWK (actually NAWK) script, written by
+			Dan A. Mercer <damercer@mmm.com> that, "Prints
+			list of users and applications signed on X
+			workstations."  This script was developed
+			and is used with lsof on HP-UX systems.
+
+Vic Abell
+December 28, 1998
diff --git a/lsof_4.85/lsof_4.85_src/scripts/00README b/lsof_4.85/lsof_4.85_src/scripts/00README
new file mode 100644
index 0000000..3cfb9e6
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/00README
@@ -0,0 +1,55 @@
+
+	    Notes on Using the Scripts in This Subdirectory
+
+The scripts in this subdirectory are examples of post-processing
+lsof field output.  Some are contributed by lsof users and are
+reproduced substantially as written by those users.  Since the
+scripts are examples, they are not guaranteed to work on all UNIX
+dialects.  Use them to learn about processing field output, don't
+expect them to be ready for production, and expect to be required
+to modify them to make them work.
+
+If you want to do field output post-processing in a C program, take
+a look at the test suite C library in ../tests/LTlib.c.  You may
+be able to adapt it to your needs.
+
+The scripts are written in AWK, Perl 4 (4.036), and Perl 5 (5.001e
+through 5.006).  AWK scripts have a suffix of ``.awk''; Perl 4
+(which will work under Perl 5) scripts have a ``.perl4'' suffix;
+and Perl 5 scripts, ``.perl''.
+
+Supply AWK scripts to your AWK interpreter with its -f option.  Supply
+lsof field output via a pipe -- e.g.,
+
+	lsof -F | awk -f list_fields.awk
+
+The Perl scripts use the Unix command interpreter line feature to
+specify the location of Perl -- i.e., the first line begins with
+``#!'' and the path to the Perl interpreter follows.  If your system
+supports the command interpreter feature, but your Perl interpreters
+have different paths to them, just change the interpreter lines in
+the scripts.  These scripts assume:
+
+	Path to:	Is:
+	=======		==
+
+	Perl 4		/usr/local/bin/perl4
+
+	Perl 5		/usr/local/bin/perl
+
+If your system doesn't support the command interpreter feature,
+you'll have to supply the scripts to your Perl interpreter on its
+command line -- e.g.,
+
+	lsof -F | /<path_to_your_perl_4> list_fields.perl
+
+The Perl scripts attempt to establish a path to lsof, putting their
+result in the $LSOF variable.  Assuming you'll run them from the
+scripts subdirectory, they look there first, then in the directories
+of the PATH environment variable.  If that proves unsuitable, modify
+the &isexec() subroutine calls in the scripts to suit your lsof
+location.
+
+
+Vic Abell
+April 4, 2002
diff --git a/lsof_4.85/lsof_4.85_src/scripts/big_brother.perl5 b/lsof_4.85/lsof_4.85_src/scripts/big_brother.perl5
new file mode 100755
index 0000000..14c67a8
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/big_brother.perl5
@@ -0,0 +1,210 @@
+#!/usr/local/bin/perl -w
+#+##############################################################################
+#                                                                              #
+# File: big_brother.perl                                                       #
+#                                                                              #
+# Description: check the network sockets with lsof to detect new connections   #
+#									       #
+# Contributed by Lionel Cons <Lionel.Cons@cern.ch>			       #
+#                                                                              #
+#-##############################################################################
+
+# @(#)big_brother	1.12 08/14/96 Written by Lionel.Cons@cern.ch
+
+# no waranty! use this at your own risks!
+
+#
+# init & setup
+#
+$verbose = 1;
+$lsof_opt = "-itcp -iudp -Di -FcLPn -r 5";
+$SIG{'HUP'} = \&hangup;
+chop($hostname = `/bin/hostname`);
+$fq_hostname = (gethostbyname($hostname))[0];
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+#
+# spy forever...
+#
+$| = 1;
+die "$LSOF is not executable\n" unless -x $LSOF;
+while (1) {
+    $lsof_pid = open(PIPE, "$LSOF $lsof_opt 2>&1 |")
+	|| die "can't start $LSOF: $!\n";
+    print "# ", &timestamp, " $LSOF $lsof_opt, pid=$lsof_pid\n"
+	if $verbose;
+    print "#COMMAND     PID     USER P NAME\n";
+    $printed = $hanguped = $pid = $proto = 0;
+    while (<PIPE>) {
+	if (/^lsof: PID \d+, /) {
+	    # fatal error message?
+	    print "*** $_";
+	    last;
+	} elsif (/^lsof: /) {
+	    # warning
+	    warn "* $_";
+	} elsif (/^p(\d+)$/) {
+	    &flush;
+	    $pid = $1;
+	    $proto = 0;
+	} elsif (/^c(.*)$/) {
+	    $command = $1;
+	} elsif (/^L(.*)$/) {
+	    $user = $1;
+	} elsif (/^P(.*)$/) {
+	    &flush;
+	    $proto = $1;
+	} elsif (/^n(.*)$/) {
+	    $name = $1;
+	    # replace local hostname by 'localhost'
+	    $name =~ s/\Q$fq_hostname\E/localhost/g;
+	    $name =~ s/[0-9hms]+ ago//g;
+	} elsif (/^m$/) {
+	    &flush;
+	    &clean;
+	} else {
+	    warn "* bad output ignored: $_";
+	}
+    }
+    kill('INT',  $lsof_pid);
+    kill('KILL', $lsof_pid);
+    close(PIPE);
+}
+
+sub hangup {
+    $hanguped = 1;
+    $SIG{'HUP'} = \&hangup;
+}
+
+sub flush {
+    return unless $pid && $proto;
+    return if &skip;
+    $tag = sprintf("%-9s %5d %8s %1s %s", $command, $pid, $user,
+		   substr($proto, 0, 1), $name);
+    unless (defined($seen{$tag})) {
+	print "+$tag\n";
+	$printed++;
+    }
+    $seen{$tag} = 1;
+}
+
+sub clean {
+    my(@to_delete, $tag);
+
+    if ($hanguped) {
+	$hanguped = 0;
+	@to_delete = keys(%seen);
+	print "# ", &timestamp, " hangup received, rescanning all connections\n"
+	    if $verbose;
+    } else {
+	@to_delete = ();
+	foreach $tag (keys(%seen)) {
+	    if ($seen{$tag} == 0) {
+		# not seen this time: delete it
+		push(@to_delete, $tag);
+		print "-$tag\n";
+		$printed++;
+	    } else {
+		# seen this time: reset the flag
+		$seen{$tag} = 0;
+	    }
+	}
+    }
+    grep(delete($seen{$_}), @to_delete);
+    if ($printed > 10) {
+	print "# ", &timestamp, "\n" if $verbose;
+	$printed = 0;
+    }
+}
+
+sub skip {
+    #
+    # put stuff here to ignore some connections, for instance:
+    #
+
+    # what we get when the socket gets created...
+    return(1) if $name eq '*:0';
+    return(1) if $name =~ /^localhost:(\d+)$/ && $1 > 1000;
+#
+# UDP & TCP stuff
+#
+    #
+    # ignore common daemons
+    #
+    if ($name =~ /^\*:/ && $user eq 'root' && $pid < 300) {
+	return(1) if $command =~ /^inetd(\.afs)?$/;
+	return(1) if $command =~ /^rpc\.(stat|lock)d$/;
+	return(1) if $command eq 'syslogd' && $name eq '*:syslog';
+    }
+    #
+    # forking beasts: portmap, ypbind, inetd
+    #
+    if ($command eq 'portmap' && $user eq 'daemon') {
+	return(1) if $name =~ /^\*:/;
+    } elsif ($command eq 'ypbind') {
+	return(1) if $name =~ /^\*:\d+$/;
+    }
+#
+# TCP-only stuff
+#
+    return(0) unless $proto eq 'TCP';
+    #
+    # outgoing commands: ftp, telnet, r*
+    #
+    if ($command eq 'ftp') {
+	return(1) if $name =~ /:ftp(-data)?$/;
+    } elsif ($command eq 'telnet') {
+	return(1) if $name =~ /:telnet$/;
+    } elsif ($command eq 'remsh') {
+	if ($name =~ /:(\d?\d\d\d)->.+:(\d?\d\d\d)$/) {
+	    return(1) if $1 < 1024 && $1 > 990 && $2 < 1024 && $2 > 990;
+	} elsif ($name =~ /:(\d?\d\d\d)->.+:(shell|ta-rauth)$/) {
+	    return(1) if $1 < 1024 && $1 > 990;
+	} elsif ($name =~ /^\*:(\d?\d\d\d)$/) {
+	    return(1) if $1 < 1024 && $1 > 990;
+	}
+    }
+    return(0);
+}
+
+sub timestamp {
+    my($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst);
+
+    ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
+    sprintf("%d/%02d/%02d-%02d:%02d:%02d", $year + 1900, $mon+1, $mday,
+      $hour, $min, $sec);
+}
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/count_pf.perl b/lsof_4.85/lsof_4.85_src/scripts/count_pf.perl
new file mode 100755
index 0000000..f063697
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/count_pf.perl
@@ -0,0 +1,68 @@
+#!/usr/local/bin/perl
+#
+# count_pf.perl-- run lsof in repeat mode and count processes and
+#		  files
+
+sub interrupt { print "\n"; exit 0; }
+
+$RPT = 15;				# lsof repeat time
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# Read lsof -nPF output repeatedly from a pipe.
+
+$| = 1;					# unbuffer output
+$SIG{'INT'} = 'interrupt';		# catch interrupt
+$proc = $files = $proto{'TCP'} = $proto{'UDP'} = 0;
+$progress="/";				# used to show "progress"
+open(P, "$LSOF -nPF -r $RPT|") || die "can't open pipe to $LSOF\n";
+
+while (<P>) {
+    chop;
+    if (/^m/) {
+
+    # A marker line signals the end of an lsof repetition.
+
+	printf "%s  Processes: %5d,  Files: %6d,  TCP: %6d, UDP: %6d\r",
+	    $progress, $proc, $files, $proto{'TCP'}, $proto{'UDP'};
+	$proc = $files = $proto{'TCP'} = $proto{'UDP'} = 0;
+	if ($progress eq "/") { $progress = "\\"; } else { $progress = "/"; }
+	next;
+    }
+    if (/^p/) { $proc++; next; }		# Count processes.
+    if (/^f/) { $files++; next; }		# Count files.
+    if (/^P(.*)/) { $proto{$1}++; next; }	# Count protocols.
+}
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/count_pf.perl5 b/lsof_4.85/lsof_4.85_src/scripts/count_pf.perl5
new file mode 100755
index 0000000..6b87f78
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/count_pf.perl5
@@ -0,0 +1,94 @@
+#!/usr/local/bin/perl
+#
+# count_pf.perl5 -- run lsof in repeat mode and count processes and
+#		    files
+
+sub interrupt { print "\n"; exit 0; }
+
+$RPT = 15;				# lsof repeat time
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# Read lsof -nPF0 output repeatedly from a pipe.
+
+$| = 1;					# unbuffer output
+$SIG{'INT'} = 'interrupt';		# catch interrupt
+$proc = $files = $tcp = $udp = 0;
+$progress="/";
+open(P, "$LSOF -nPF0 -r $RPT|") || die "can't open pipe to $LSOF\n";
+
+LSOF_LINE:
+
+while (<P>) {
+    chop;
+    if (/^m/) {
+
+    # A marker line signals the end of an lsof repetition.
+
+	printf "%s  Processes: %5d,  Files: %6d,  TCP: %6d, UDP: %6d\r",
+	    $progress, $proc, $files, $tcp, $udp;
+	$proc = $files = $tcp = $udp = 0;
+	if ($progress eq "/") { $progress = "\\"; } else { $progress = "/"; }
+	next LSOF_LINE;
+    }
+    if (/^p/) {
+
+    # Count process.
+
+	$proc++;
+	next LSOF_LINE;
+    }
+    if (/^f/) {
+
+    # Count files.
+
+	$files++;
+	@F = split("\0", $_, 999);
+	foreach $i (0 .. ($#F - 1)) {
+
+	# Search for protocol field.
+
+	    if ($F[$i] =~ /^P(.*)/) {
+
+	    # Count instances of TCP and UDP protocols.
+
+		if ($1 eq "TCP") { $tcp++; }
+		elsif ($1 eq "UDP") { $udp++; }
+		next LSOF_LINE;
+	    }
+	}
+    }
+}
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/identd.perl5 b/lsof_4.85/lsof_4.85_src/scripts/identd.perl5
new file mode 100755
index 0000000..32626d8
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/identd.perl5
@@ -0,0 +1,131 @@
+#!/usr/local/bin/perl
+###################################################################
+# identd.perl5 : An implementation of RFC 1413 Ident Server
+#                using Vic Abell's lsof.
+#
+# - Started from inetd with 'nowait' option. This entry in 
+#   /etc/inetd.conf will suffice :
+#
+#   ident   stream  tcp     nowait  root    /usr/local/bin/identd.perl5 -t200
+#
+# - Multiple instances of the server are not a performance penalty
+#   since they shall use lsof's cacheing mechanism. (compare with
+#   Peter Eriksson's pidentd)
+# - assumes 'lsof' binary in /usr/local/sbin
+# - Command line arguments :
+#   -t TIMEOUT Number of seconds to wait for a query before aborting.
+#              Default is 120.
+#
+# Kapil Chowksey <kchowksey@hss.hns.com>
+###################################################################
+
+use Socket;
+require 'getopts.pl';
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# redirect lsof's warnings/errors to /dev/null
+close(STDERR);
+open(STDERR, ">/dev/null");
+
+$Timeout = "120";
+
+&Getopts('t:');
+if ($opt_t) {
+    $Timeout = $opt_t;
+}
+
+($port, $iaddr) = sockaddr_in(getpeername(STDIN));
+$peer_addr = inet_ntoa($iaddr);
+
+# read ident-query from socket (STDIN) with a timeout.
+$timeout = int($Timeout);
+eval {
+    local $SIG{ALRM} = sub { die "alarm\n" };
+    alarm $timeout;
+    $query = <STDIN>;
+    alarm 0;
+};
+die if $@ && $@ ne "alarm\n";
+if ($@) {
+    # timed out
+    exit;
+}
+
+# remove all white-spaces from query
+$query =~ s/\s//g;
+
+$serv_port = "";
+$cli_port = "";
+($serv_port,$cli_port) = split(/,/,$query);
+
+if ($serv_port =~ /^[0-9]+$/) {
+    if (int($serv_port) < 1 || int($serv_port) > 65535) {
+        print $query." : ERROR : INVALID-PORT"."\n";
+        exit;
+    }
+} else {
+    print $query." : ERROR : INVALID-PORT"."\n";
+    exit;
+}
+
+if ($cli_port =~ /^[0-9]+$/) {
+    if (int($cli_port) < 1 || int($cli_port) > 65535) {
+        print $query." : ERROR : INVALID-PORT"."\n";
+        exit;
+    }
+} else {
+    print $query." : ERROR : INVALID-PORT"."\n";
+    exit;
+}
+
+open(LSOFP,"$LSOF -nPDi -T -FLn -iTCP@".$peer_addr.":".$cli_port."|");
+
+$user = "UNKNOWN";
+while ($a_line = <LSOFP>) {
+    # extract user name.
+    if ($a_line =~ /^L.*/) {
+        ($user) = ($a_line =~ /^L(.*)/);
+    }
+
+    # make sure local port matches.
+    if ($a_line =~ /^n.*:\Q$serv_port->/) {
+        print $serv_port.", ".$cli_port." : USERID : UNIX :".$user."\n";
+        exit;
+    }
+}
+
+print $serv_port.", ".$cli_port." : ERROR : NO-USER"."\n";
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/idrlogin.perl b/lsof_4.85/lsof_4.85_src/scripts/idrlogin.perl
new file mode 100755
index 0000000..d244dc7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/idrlogin.perl
@@ -0,0 +1,201 @@
+#!/usr/local/bin/perl
+#
+# $Id: idrlogin.perl,v 1.5 2001/11/18 12:20:46 abe Exp $
+#
+# idrlogin.perl -- sample Perl script to identify the network source of a
+#		   network (remote) login via rlogind, sshd, or telnetd 
+
+
+# IMPORTANT DEFINITIONS
+# =====================
+#
+# 1.  Set the interpreter line of this script to the local path of the
+#     Perl executable.
+
+
+#
+# Copyright 1997 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.
+
+# Initialize variables.
+
+$dev = $name = $proto = "";					# fd variables
+$fdst = 0;							# fd state
+$pidst = 0;							# process state
+$cmd = $login = $pid = $ppid = "";				# process var.
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# Open a pipe from lsof.
+
+open(P, "$LSOF -R -FcDfLpPRn|") || die "Can't pipe from $LSOF\n";
+
+# Process the ``lsof -FcDfLpPRn'' output a line at a time
+
+while (<P>) {
+    chop;
+    if (/^p(.*)/) {
+
+# A process set begins with a PID field whose ID character is `p'.
+
+	$tpid = $1;
+	if ($pidst && $fdst) { &save_proc }
+	$pidst = 1;
+	$pid = $tpid;
+	$cmd = $login = $ppid = "";
+	$fdst = 0;
+	$dev = $name = $proto = "";
+	next;
+    }
+
+# Save process-related values.
+
+    if (/^c(.*)/) { $cmd = $1; next; }
+    if (/^L(.*)/) { $login = $1; next; }
+    if (/^R(.*)/) { $ppid = $1; next; }
+
+# A file set begins with a file descriptor field.
+
+    if (/^f/) {
+	if ($pidst && $fdst) { &save_proc }
+	$fdst = 0;
+	$dev = $name = $proto = "";
+	next;
+    }
+
+# Accumulate file information.
+
+    if (/^D(.*)/) { $dev = $1; next; }
+    if (/^P(.*)/) { $proto = $1; next; }
+    if (/^n(.*)/) { $name = $1; $fdst = 1; next; }
+}
+
+# Flush any stored file or process output.
+
+if ($pidst && $fdst) { &save_proc }
+
+# List the shell processes that have rlogind/sshd//telnetd parents.
+
+$hdr = 0;
+foreach $pid (sort keys(%shcmd)) {
+    $p = $pid;
+    if (!defined($raddr{$pid})) {
+        for ($ff = 0; !$ff && defined($Ppid{$p}); ) {
+	    $p = $Ppid{$p};
+	    if ($p < 2 || defined($raddr{$p})) { $ff = 1; }
+        }
+    } else { $ff = 2; }
+    if ($ff && defined($raddr{$p})) {
+	if (!$hdr) {
+	    printf "%-8.8s %-8.8s %6s %-10.10s %6s %-10.10s %s\n",
+		"Login", "Shell", "PID", "Via", "PID", "TTY", "From";
+	    $hdr = 1;
+	}
+	printf "%-8.8s %-8.8s %6d %-10.10s %6s %-10.10s %s\n",
+	    $shlogin{$pid}, $shcmd{$pid}, $pid,
+	    ($ff == 2) ? "(direct)" : $rcmd{$p},
+	    ($ff == 2) ? "" : $p,
+	    ($shtty{$pid} eq "") ? "(unknown)" : $shtty{$pid},
+	    $raddr{$p};
+    }
+}
+exit(0);
+
+
+# save_proc -- save process information
+#	       Values are stored inelegantly in global variables.
+
+sub save_proc {
+    if ($cmd eq ""
+    ||  $login eq ""
+    ||  $ppid eq ""
+    ||  $pid eq ""
+    ||  $name eq ""
+    ) { return; }
+    if (!defined($Ppid{$pid})) { $Ppid{$pid} = $ppid; }
+    if ($proto eq "TCP"
+    && (($cmd =~ /rlogind/) || ($cmd =~ /sshd/) || ($cmd =~ /telnetd/))) {
+	if (defined($raddr{$pid})) { return; }
+	if (($name =~ /[^:]*:[^-]*->([^:]*):.*/)) {
+	    $raddr{$pid} = $1;
+	    $rcmd{$pid} = $cmd;
+	    return;
+	}
+    }
+    if (($cmd =~ /.*sh$/)) {
+	if (defined($shcmd{$pid})) { return; }
+	if ($proto eq "TCP") {
+	    if (defined($raddr{$pid})) { return; }
+	    if (($name =~ /[^:]*:[^-]*->([^:]*):.*/)) {
+		$raddr{$pid} = $1;
+		$shcmd{$pid} = $cmd;
+		$shlogin{$pid} = $login;
+	    }
+	}
+	if (($name =~ m#/dev.*ty.*#)) {
+	    ($tty) = ($name =~ m#/dev.*/(.*)#);
+	} elsif (($name =~ m#/dev/(pts/\d+)#)) {
+	    $tty = $1;
+	} elsif (($name =~ m#/dev.*pts.*#)) {
+	    $d = oct($dev);
+	    $tty = sprintf("pts/%d", $d & 0xffff);
+	} else { return; }
+    } else { return; }
+    $shcmd{$pid} = $cmd;
+    $shtty{$pid} = $tty;
+    $shlogin{$pid} = $login;
+}
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/idrlogin.perl5 b/lsof_4.85/lsof_4.85_src/scripts/idrlogin.perl5
new file mode 100755
index 0000000..5e7e4bf
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/idrlogin.perl5
@@ -0,0 +1,197 @@
+#!/usr/local/bin/perl
+#
+# $Id: idrlogin.perl5,v 1.5 2001/11/18 12:20:46 abe Exp $
+#
+# idrlogin.perl5 -- sample Perl 5 script to identify the network source of a
+#		    network (remote) login via rlogind, sshd, or telnetd 
+
+
+# IMPORTANT DEFINITIONS
+# =====================
+#
+# 1.  Set the interpreter line of this script to the local path of the
+#     Perl 5 executable.
+
+
+# Copyright 1997 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.
+
+# Initialize variables.
+
+$dev = $faddr = $tty = "";					# fd variables
+$pidst = 0;							# process state
+$cmd = $login = $pgrp = $pid = $ppid = "";			# process var.
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# Open a pipe from lsof
+
+if (! -x "$LSOF") { die "Can't execute $LSOF\n"; }
+open (P, "$LSOF -R -FcDfLpPRn0|") || die "Can't pipe from $LSOF\n";
+
+# Process the lsof output a line at a time
+
+while (<P>) {
+    chop;
+    @F = split('\0', $_, 999);
+    if ($F[0] =~ /^p/) {
+
+# A process set begins with a PID field whose ID character is `p'.
+
+	if ($pidst) { &save_proc }
+	foreach $i (0 .. ($#F - 1)) {
+
+	    PROC: {
+		if ($F[$i] =~ /^c(.*)/) { $cmd = $1; last PROC }
+		if ($F[$i] =~ /^p(.*)/) { $pid = $1; last PROC }
+		if ($F[$i] =~ /^R(.*)/) { $ppid = $1; last PROC }
+		if ($F[$i] =~ /^L(.*)/) { $login = $1; last PROC }
+	    }
+	}
+	$pidst = 1;
+	next;
+    }
+
+# A file descriptor set begins with a file descriptor field whose ID
+# character is `f'.
+
+    if ($F[0] =~ /^f/) {
+	if ($faddr ne "") { next; }
+	$proto = $name = "";
+	foreach $i (0 .. ($#F - 1)) {
+
+	    FD: {
+		if ($F[$i] =~ /^P(.*)/) { $proto = $1; last FD; }
+		if ($F[$i] =~ /^n(.*)/) { $name = $1; last FD; }
+		if ($F[$i] =~ /^D(.*)/) { $dev = $1; last FD; }
+	    }
+	}
+	if ($proto eq "TCP"
+	&&  $faddr eq ""
+	&&  (($cmd =~ /rlogind/) || ($cmd =~ /sshd/) || ($cmd =~ /telnetd/))) {
+	    if (($name =~ /[^:]*:[^-]*->([^:]*):.*/)) {
+		$faddr = $1;
+	    }
+	} elsif ($tty eq "" && ($cmd =~ /.*sh$/)) {
+	    if (($name =~ m#/dev.*ty.*#)) {
+		($tty) = ($name =~ m#/dev.*/(.*)#);
+	    } elsif (($name =~ m#/dev/(pts/\d+)#)) {
+		$tty = $1;
+	    } elsif (($name =~ m#/dev.*pts.*#)) {
+		$d = oct($dev);
+		$tty = sprintf("pts/%d", $d & 0xffff);
+	    }
+	}
+	next;
+    }
+}
+
+# Flush any stored file or process output.
+
+if ($pidst) { &save_proc }
+
+# List the shell processes that have rlogind/sshd/telnetd parents.
+
+$hdr = 0;
+foreach $pid (sort keys(%shcmd)) {
+    $p = $pid;
+    if (!defined($raddr{$pid})) {
+        for ($ff = 0; !$ff && defined($Ppid{$p}); ) {
+	    $p = $Ppid{$p};
+	    if ($p < 2 || defined($raddr{$p})) { $ff = 1; }
+        }
+    } else { $ff = 2; }
+    if ($ff && defined($raddr{$p})) {
+	if (!$hdr) {
+	    printf "%-8.8s %-8.8s %6s %-10.10s %6s %-10.10s %s\n",
+		"Login", "Shell", "PID", "Via", "PID", "TTY", "From";
+	    $hdr = 1;
+	}
+	printf "%-8.8s %-8.8s %6d %-10.10s %6s %-10.10s %s\n",
+	    $shlogin{$pid}, $shcmd{$pid}, $pid,
+	    ($ff == 2) ? "(direct)" : $rcmd{$p},
+	    ($ff == 2) ? "" : $p,
+	    ($shtty{$pid} eq "") ? "(unknown)" : $shtty{$pid},
+	    $raddr{$p};
+    }
+}
+exit(0);
+
+
+# save_proc -- save process information
+#	       Values are stored inelegantly in global variables.
+
+sub save_proc {
+    if (!defined($Ppid{$pid})) { $Ppid{$pid} = $ppid; }
+    if ($faddr ne "") {
+	$raddr{$pid} = $faddr;
+	if (($cmd =~ /.*sh$/)) {
+	    $shcmd{$pid} = $cmd;
+	    $shlogin{$pid} = $login;
+	} else { $rcmd{$pid} = $cmd; }
+    }
+    if ($tty ne "") {
+	$shcmd{$pid} = $cmd;
+	$shtty{$pid} = $tty;
+	$shlogin{$pid} = $login;
+    }
+
+# Clear variables.
+
+    $cmd = $dev = $faddr = $pgrp = $pid = $ppid = $tty = "";
+    $pidst = 0;
+}
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/list_NULf.perl5 b/lsof_4.85/lsof_4.85_src/scripts/list_NULf.perl5
new file mode 100755
index 0000000..a9cdbed
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/list_NULf.perl5
@@ -0,0 +1,161 @@
+#!/usr/local/bin/perl
+#
+# $Id: list_NULf.perl5,v 1.5 2000/07/14 17:03:37 abe Exp $
+#
+# list_NULf.perl5 -- sample Perl 5 script to list lsof NUL-terminated
+#		     full field output (i.e., -F0 output)
+#
+# This script has been tested under perl version 5.001e.
+#
+# 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.
+
+# Initialize variables.
+
+$fhdr = 0;							# fd hdr. flag
+$fdst = 0;							# fd state
+$access = $devch = $devn = $fd = $inode = $lock = $name = "";	# | file descr.
+$offset = $proto = $size = $state = $stream = $type = "";	# | variables
+$pidst = 0;							# process state
+$cmd = $login = $pgrp = $pid = $ppid = $uid = "";		# process var.
+
+# Process the ``lsof -F'' output a line at a time, gathering
+# the variables for a process together before printing them;
+# then gathering the variables for each file descriptor
+# together before printing them.
+
+while (<>) {
+    chop;
+    @F = split('\0', $_, 999);
+    if ($F[0] =~ /^p/) {
+
+# A process set begins with a PID field whose ID character is `p'.
+
+	if ($pidst) { &list_proc }
+	if ($fdst) { &list_fd; $fdst = 0; }
+	foreach $i (0 .. ($#F - 1)) {
+
+	    PROC: {
+		if ($F[$i] =~ /^c(.*)/) { $cmd = $1; last PROC }
+		if ($F[$i] =~ /^g(.*)/) { $pgrp = $1; last PROC }
+		if ($F[$i] =~ /^p(.*)/) { $pid = $1; last PROC }
+		if ($F[$i] =~ /^u(.*)/) { $uid = $1; last PROC }
+		if ($F[$i] =~ /^L(.*)/) { $login = $1; last PROC }
+		if ($F[$i] =~ /^R(.*)/) { $ppid = $1; last PROC }
+		print "ERROR: unrecognized process field: \"$F[$i]\"\n";
+	    }
+	}
+	$pidst = 1;
+	next;
+    }
+
+# A file descriptor set begins with a file descriptor field whose ID
+# character is `f'.
+
+    if ($F[0] =~ /^f/) {
+	if ($pidst) { &list_proc }
+	if ($fdst) { &list_fd }
+	foreach $i (0 .. ($#F - 1)) {
+
+	    FD: {
+		if ($F[$i] =~ /^a(.*)/) { $access = $1; last FD; }
+		if ($F[$i] =~ /^C(.*)/) { last FD; }
+		if ($F[$i] =~ /^f(.*)/) { $fd = $1; last FD; }
+		if ($F[$i] =~ /^F(.*)/) { last FD; }
+		if ($F[$i] =~ /^d(.*)/) { $devch = $1; last FD; }
+		if ($F[$i] =~ /^D(.*)/) { $devn = $1; last FD; }
+		if ($F[$i] =~ /^G(.*)/) { last FD; }
+		if ($F[$i] =~ /^i(.*)/) { $inode = $1; last FD; }
+		if ($F[$i] =~ /^k(.*)/) { last FD; }
+		if ($F[$i] =~ /^l(.*)/) { $lock = $1; last FD; }
+		if ($F[$i] =~ /^N(.*)/) { last FD; }
+		if ($F[$i] =~ /^o(.*)/) { $offset = $1; last FD; }
+		if ($F[$i] =~ /^P(.*)/) { $proto = $1; last FD; }
+		if ($F[$i] =~ /^s(.*)/) { $size = $1; last FD; }
+		if ($F[$i] =~ /^S(.*)/) { $stream = $1; last FD; }
+		if ($F[$i] =~ /^t(.*)/) { $type = $1; last FD; }
+		if ($F[$i] =~ /^T(.*)/) {
+		    if ($state eq "") { $state = "(" . $1; }
+		    else { $state = $state . " " . $1; }
+		    last FD;
+		}
+		if ($F[$i] =~ /^n(.*)/) { $name = $1; last FD; }
+		print "ERROR: unrecognized file set field: \"$F[$i]\"\n";
+	    }
+	}
+	$fdst = 1;
+	next;
+    }
+    print "ERROR: unrecognized: \"$_\"\n";
+}
+
+# Flush any stored file or process output.
+
+if ($fdst) { &list_fd }
+if ($pidst) { &list_proc }
+exit(0);
+
+
+## list_fd -- list file descriptor information
+#	      Values are stored inelegantly in global variables.
+
+sub list_fd {
+    if ( ! $fhdr) {
+
+    # Print header once.
+
+	print "      FD   TYPE      DEVICE   SIZE/OFF      INODE  NAME\n";
+	$fhdr = 1;
+    }
+    printf "    %4s%1.1s%1.1s %4.4s", $fd, $access, $lock, $type;
+    $tmp = $devn; if ($devch ne "") { $tmp = $devch }
+    printf "  %10.10s", $tmp;
+    $tmp = $size; if ($offset ne "") { $tmp = $offset }
+    printf " %10.10s", $tmp;
+    $tmp = $inode; if ($proto ne "") { $tmp = $proto }
+    printf " %10.10s", $tmp;
+    $tmp = $stream; if ($name ne "") { $tmp = $name }
+    print "  ", $tmp;
+    if ($state ne "") { printf " %s)\n", $state; } else { print "\n"; }
+
+# Clear variables.
+
+    $access = $devch = $devn = $fd = $inode = $lock = "";
+    $name = $offset = $proto = $size = $state = $stream = $type = "";
+}
+
+
+# list_proc -- list process information
+#	       Values are stored inelegantly in global variables.
+
+sub list_proc {
+    print "COMMAND       PID    PGRP    PPID  USER\n";
+    $tmp = $uid; if ($login ne "") {$tmp = $login }
+    printf "%-9.9s  %6d  %6d  %6d  %s\n", $cmd, $pid, $pgrp, $ppid, $tmp;
+
+# Clear variables.
+
+    $cmd = $login = $pgrp = $pid = $uid = "";
+    $fhdr = $pidst = 0;
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/list_fields.awk b/lsof_4.85/lsof_4.85_src/scripts/list_fields.awk
new file mode 100644
index 0000000..d8fbbb4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/list_fields.awk
@@ -0,0 +1,198 @@
+# $Id: list_fields.awk,v 1.3 97/09/23 09:32:38 abe Exp $
+#
+# list_fields.awk -- sample awk script to list lsof full field output
+#		     (i.e., -F output without -0)
+#
+# NB: this is not particularly elegant awk; several sections were
+#     replicated, perhaps unnecessarily, to produce a sample quickly
+#     and simply.
+#
+#
+# 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.
+
+# Clear file and process status.
+
+BEGIN {
+  fhdr = fdst = pidst = 0;
+  access = dev = devch = fd = inode = lock = name = offset = "";
+  proto = size = state = stream = type = "";
+  cmd = login = pgrp = pid = ppid = uid = "";
+}
+
+# Start a new process.
+
+/^p/ {
+  val = substr($0, 2);
+  if (pidst) {
+
+  # Print a previously accumulated process set.
+
+    printf "COMMAND       PID    PGRP    PPID  USER\n";
+    printf "%-9.9s  %6d  %6d  %6d", cmd, pid, pgrp, ppid;
+    if (login != "") { printf "  %s\n", login }
+    else { printf "  %s\n", uid }
+    pidst = 0;
+    cmd = login = pgrp = pid = uid = "";
+  }
+  if (fdst) {
+
+  # Print a previously accumulated file set.
+
+    if (fhdr == 0) {
+      printf "      FD   TYPE      DEVICE   SIZE/OFF      INODE  NAME\n";
+    }
+    printf "    %4.4s%1.1s%1.1s %4.4s", fd, access, lock, type;
+    t = dev; if (devch != "") { t = devch }
+    printf("  %10.10s", t);
+    t = size; if (offset != "") { t = offset }
+    printf " %10.10s", t;
+    t = inode; if (proto != "") { t = proto }
+    printf " %10.10s", t;
+    t = stream; if (name != "") {t = name }
+    printf "  %s", t;
+    if (state != "") { printf " %s)\n", state } else { printf "\n" }
+    access = dev = devch = fd = inode = lock = name = offset = "";
+    proto = size = state = stream = type = "";
+    fdst = fhdr = 0
+  }
+
+# Record a new process.
+
+  pidst = 1;
+  pid = val;
+}
+
+/^g|^c|^u|^L|^R/ {
+
+# Save process set information.
+
+  id = substr($0, 1, 1);
+  val = substr($0, 2);
+  if (id == "g") { pgrp = val; next }		# PGRP
+  if (id == "c") { cmd = val; next }		# command
+  if (id == "u") { uid = val; next }		# UID
+  if (id == "L") { login = val; next }		# login name
+  if (id == "R") { ppid = val; next }		# PPID
+}
+
+/^f|^a|^l|^t|^d|^D|^s|^o|^i|^P|^S|^T|^n/ {
+
+# Save file set information.
+
+  id = substr($0, 1, 1);
+  val = substr($0, 2);
+  if (id == "f") {
+    if (pidst) {
+
+    # Print a previously accumulated process set.
+
+      printf "COMMAND       PID    PGRP    PPID  USER\n";
+      printf "%-9.9s  %6d  %6d  %6d", cmd, pid, pgrp, ppid;
+      if (login != "") { printf "  %s\n", login }
+      else { printf "  %s\n", uid }
+      pidst = 0;
+      cmd = login = pgrp = pid = uid = "";
+    }
+    if (fdst) {
+
+      # Print a previously accumulated file set.
+
+	if (fhdr == 0) {
+	  printf "      FD   TYPE      DEVICE   SIZE/OFF      INODE  NAME\n";
+	}
+	fhdr = 1;
+	printf "    %4.4s%1.1s%1.1s %4.4s", fd, access, lock, type;
+	t = dev; if (devch != "") { t = devch }
+	printf("  %10.10s", t);
+	t = size; if (offset != "") { t = offset }
+	printf " %10.10s", t;
+	t = inode; if (proto != "") { t = proto }
+	printf " %10.10s", t;
+	t = stream; if (name != "") {t = name }
+	printf "  %s", t;
+	if (state != "") { printf " %s)\n", state } else { printf "\n" }
+	access = dev = devch = fd = inode = lock = name = offset = "";
+	proto = size = state = stream = type = "";
+    }
+
+  # Start an new file set.
+
+    fd = val;
+    fdst = 1;
+    next;
+  }
+
+# Save file set information.
+
+  if (id == "a") { access = val; next }		# access
+  if (id == "l") { lock = val; next }		# lock
+  if (id == "t") { type = val; next }		# type
+  if (id == "d") { devch = val; next }		# device characters
+  if (id == "D") { dev = val; next }		# device major/minor numbers
+  if (id == "s") { size = val; next }		# size
+  if (id == "o") { offset = val; next }		# offset
+  if (id == "i") { inode = val; next }		# inode number
+  if (id == "P") { proto = val; next }		# protocol
+  if (id == "S") { stream = val; next }		# stream name
+  if (id == "T") {				# TCP/TPI state
+    if (state == "") {
+      state = sprintf("(%s", val);
+    } else {
+      state = sprintf("%s %s", state, val);
+    }
+    next
+  }
+  if (id == "n") { name = val; next }		# name, comment, etc.
+}
+
+END {
+  if (pidst) {
+
+  # Print last process set.
+
+    printf "COMMAND       PID    PGRP    PPID  USER\n";
+    printf "%-9.9s  %6d  %6d  %6d", cmd, pid, pgrp, ppid;
+    if (login != "") { printf "  %s\n", login }
+    else { printf "  %s\n", uid }
+  }
+  if (fdst) {
+
+  # Print last file set.
+
+    if (fhdr == 0) {
+      printf "      FD   TYPE      DEVICE   SIZE/OFF      INODE  NAME\n";
+    }
+    printf "    %4.4s%1.1s%1.1s %4.4s", fd, access, lock, type;
+    t = dev; if (devch != "") { t = devch }
+    printf("  %10.10s", t);
+    t = size; if (offset != "") { t = offset }
+    printf " %10.10s", t;
+    t = inode; if (proto != "") { t = proto }
+    printf " %10.10s", t;
+    t = stream; if (name != "") {t = name }
+    printf "  %s", t;
+    if (state != "") { printf " %s)\n", state; } else { printf "\n"; }
+  }
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/list_fields.perl b/lsof_4.85/lsof_4.85_src/scripts/list_fields.perl
new file mode 100755
index 0000000..41bd3e4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/list_fields.perl
@@ -0,0 +1,156 @@
+#!/usr/local/bin/perl4
+#
+# $Id: list_fields.perl,v 1.5 2000/07/14 17:03:37 abe Exp $
+#
+# list_fields.perl -- sample Perl script to list lsof full field output
+#		      (i.e., -F output without -0)
+#
+# This script has been tested under perl versions 4.036 and 5.001e.
+#
+# 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.
+
+# Initialize variables.
+
+$fhdr = 0;							# fd hdr. flag
+$fdst = 0;							# fd state
+$access = $devch = $devn = $fd = $inode = $lock = $name = "";	# | file descr.
+$offset = $proto = $size = $state = $stream = $type = "";	# | variables
+$pidst = 0;							# process state
+$cmd = $login = $pgrp = $pid = $ppid = $uid = "";		# process var.
+
+# Process the ``lsof -F'' output a line at a time, gathering
+# the variables for a process together before printing them;
+# then gathering the variables for each file descriptor
+# together before printing them.
+
+while (<>) {
+    chop;
+    if (/^p(.*)/) {
+
+# A process set begins with a PID field whose ID character is `p'.
+
+	$tpid = $1;
+	if ($pidst) { &list_proc }
+	$pidst = 1;
+	$pid = $tpid;
+	if ($fdst) { &list_fd; $fdst = 0; }
+	next;
+    }
+
+# Save process-related values.
+
+    if (/^g(.*)/) { $pgrp = $1; next; }
+    if (/^c(.*)/) { $cmd = $1; next; }
+    if (/^u(.*)/) { $uid = $1; next; }
+    if (/^L(.*)/) { $login = $1; next; }
+    if (/^R(.*)/) { $ppid = $1; next; }
+
+# A file descriptor set begins with a file descriptor field whose ID
+# character is `f'.
+
+    if (/^f(.*)/) {
+	$tfd = $1;
+	if ($pidst) { &list_proc }
+	if ($fdst) { &list_fd }
+	$fd = $tfd;
+	$fdst = 1;
+	next;
+    }
+
+# Save file set information.
+
+    if (/^a(.*)/) { $access = $1; next; }
+    if (/^C(.*)/) { next; }
+    if (/^d(.*)/) { $devch = $1; next; }
+    if (/^D(.*)/) { $devn = $1; next; }
+    if (/^F(.*)/) { next; }
+    if (/^G(.*)/) { next; }
+    if (/^i(.*)/) { $inode = $1; next; }
+    if (/^k(.*)/) { next; }
+    if (/^l(.*)/) { $lock = $1; next; }
+    if (/^N(.*)/) { next; }
+    if (/^o(.*)/) { $offset = $1; next; }
+    if (/^P(.*)/) { $proto = $1; next; }
+    if (/^s(.*)/) { $size = $1; next; }
+    if (/^S(.*)/) { $stream = $1; next; }
+    if (/^t(.*)/) { $type = $1; next; }
+    if (/^T(.*)/) {
+	if ($state eq "") { $state = "(" . $1; }
+	else { $state = $state . " " . $1; }
+	next;
+    }
+    if (/^n(.*)/) { $name = $1; next; }
+    print "ERROR: unrecognized: \"$_\"\n";
+}
+
+# Flush any stored file or process output.
+
+if ($fdst) { &list_fd }
+if ($pidst) { &list_proc }
+exit(0);
+
+
+## list_fd -- list file descriptor information
+#	      Values are stored inelegantly in global variables.
+
+sub list_fd {
+    if ( ! $fhdr) {
+
+    # Print header once.
+
+	print "      FD   TYPE      DEVICE   SIZE/OFF      INODE  NAME\n";
+	$fhdr = 1;
+    }
+    printf "    %4s%1.1s%1.1s %4.4s", $fd, $access, $lock, $type;
+    $tmp = $devn; if ($devch ne "") { $tmp = $devch }
+    printf "  %10.10s", $tmp;
+    $tmp = $size; if ($offset ne "") { $tmp = $offset }
+    printf " %10.10s", $tmp;
+    $tmp = $inode; if ($proto ne "") { $tmp = $proto }
+    printf " %10.10s", $tmp;
+    $tmp = $stream; if ($name ne "") { $tmp = $name }
+    print "  ", $tmp;
+    if ($state ne "") { printf " %s)\n", $state; } else { print "\n"; }
+
+# Clear variables.
+
+    $access = $devch = $devn = $fd = $inode = $lock = $name = "";
+    $offset = $proto = $size = $state = $stream = $type = "";
+}
+
+
+# list_proc -- list process information
+#	       Values are stored inelegantly in global variables.
+
+sub list_proc {
+    print "COMMAND       PID    PGRP    PPID  USER\n";
+    $tmp = $uid; if ($login ne "") {$tmp = $login }
+    printf "%-9.9s  %6d  %6d  %6d  %s\n", $cmd, $pid, $pgrp, $ppid, $tmp;
+
+# Clear variables.
+
+    $cmd = $login = $pgrp = $pid = $uid = "";
+    $fhdr = $pidst = 0;
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/shared.perl5 b/lsof_4.85/lsof_4.85_src/scripts/shared.perl5
new file mode 100755
index 0000000..2721413
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/shared.perl5
@@ -0,0 +1,409 @@
+#!/usr/local/bin/perl
+#
+# $Id: shared.perl5,v 1.4 2001/11/18 12:20:46 abe Exp $
+#
+# shared.perl5 -- sample Perl 5 script to list processes that share
+#		  file descriptors or files, using `lsof +ffn -F..."
+#		  output
+#
+# Usage:	shared [fd|file]
+#
+# where:	fd to list file descriptors (default)
+#
+#		file to list files
+#
+# This script has been tested under perl version 5.001e.
+
+
+# IMPORTANT DEFINITIONS
+# =====================
+#
+# 1.  Set the interpreter line of this script to the local path of the
+#     Perl5 executable.
+
+
+# Copyright 1998 Purdue Research Foundation, West Lafayette, Indiana
+# 47907.  All rights reserved.
+#
+# Written by Victor A. Abell <abe@purdue.edu>
+#
+# 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.
+
+# Initialize variables.
+
+$Access = $Devch = $Devn = $Fd = $Fsa = $Inode = $Lock =	# file
+	  $Na = $Name = "";					# | descriptor
+$Cmd = $Login = $Pgrp = $Pid = $Ppid = $Uid = "";		# process var.
+$Fdst = 0;							# fd state
+$Hdr = 0;							# header state
+$Offset = $Proto = $Size = $State = $Stream = $Type = "";	# | variables
+$Pidst = 0;							# process state
+$Pn = "shared";
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# Define print field constants.
+
+$CmdTtl = "CMD";
+$CmdW = length($CmdTtl);
+$DevTtl = "DEVICE";
+$DevW = length($DevTtl);
+$FdTtl = "FD";
+$FdW = length($FdTtl);
+$InoTtl = "NODE";
+$InoW = length($InoTtl);
+$KeyTtl = "FILEADDR";
+$KeyW = length($KeyTtl);
+$PidTtl = "PID";
+$PidW = length($PidTtl);
+$PpidTtl = "PPID";
+$PpidW = length(PpidTtl);
+
+# Process one (optional) argument.
+
+if ($#ARGV >= 0) {
+    $err = 0;
+    if ($#ARGV > 1) { $err = 1; }
+    elsif ($ARGV[0] eq "fd") {
+	$KeyTtl = "FILEADDR";
+	$Shfd = 1;
+	$Shfile = 0;
+    } elsif ($ARGV[0] eq "file") {
+	$KeyTtl = "NODEID";
+	$Shfd = 0;
+	$Shfile = 1;
+    } else { $err = 1; }
+    if ($err) { die "$Pn: usage [fd|file]\n"; }
+    shift;
+} else { $Shfd = 1; $Shfile = 0; }
+$KeyW = length($KeyTtl);
+
+# Open a pipe from lsof.
+
+if (!open(LSOF_PIPE, "$LSOF -R +ffn -F0pcRDfFinN |")) {
+    die "$Pn: can't open pipe to: $LSOF\n";
+}
+
+# Process the lsof output a line at a time, gathering the variables for
+# processes and files.
+
+while (<LSOF_PIPE>) {
+    chop;
+    @F = split('\0', $_, 999);
+    if ($F[0] =~ /^p/) {
+
+# A process set begins with a PID field whose ID character is `p'.
+
+	if ($Fdst) { &End_fd }
+	if ($Pidst) { &End_proc }
+	foreach $i (0 .. ($#F - 1)) {
+
+	    PROC: {
+		if ($F[$i] =~ /^c(.*)/) { $Cmd = $1; last PROC }
+		if ($F[$i] =~ /^g(.*)/) { $Pgrp = $1; last PROC }
+		if ($F[$i] =~ /^p(.*)/) { $Pid = $1; last PROC }
+		if ($F[$i] =~ /^u(.*)/) { $Uid = $1; last PROC }
+		if ($F[$i] =~ /^L(.*)/) { $Login = $1; last PROC }
+		if ($F[$i] =~ /^R(.*)/) { $Ppid = $1; last PROC }
+		print "ERROR: unrecognized process field: \"$F[$i]\"\n";
+	    }
+	}
+	$Pidst = 1;
+	next;
+    }
+
+# A file descriptor set begins with a file descriptor field whose ID
+# character is `f'.
+
+    if ($F[0] =~ /^f/) {
+	if ($Fdst) { &End_fd }
+	foreach $i (0 .. ($#F - 1)) {
+
+	    FD: {
+		if ($F[$i] =~ /^a(.*)/) { $Access = $1; last FD; }
+		if ($F[$i] =~ /^f(.*)/) { $Fd = $1; last FD; }
+		if ($F[$i] =~ /^F(.*)/) { $Fsa = $1; last FD; }
+		if ($F[$i] =~ /^l(.*)/) { $Lock = $1; last FD; }
+		if ($F[$i] =~ /^t(.*)/) { $Type = $1; last FD; }
+		if ($F[$i] =~ /^d(.*)/) { $Devch = $1; last FD; }
+		if ($F[$i] =~ /^D(.*)/) { $Devn = $1; last FD; }
+		if ($F[$i] =~ /^s(.*)/) { $Size = $1; last FD; }
+		if ($F[$i] =~ /^o(.*)/) { $Offset = $1; last FD; }
+		if ($F[$i] =~ /^i(.*)/) { $Inode = $1; last FD; }
+		if ($F[$i] =~ /^P(.*)/) { $Proto = $1; last FD; }
+		if ($F[$i] =~ /^S(.*)/) { $Stream = $1; last FD; }
+		if ($F[$i] =~ /^T(.*)/) {
+		    if ($State eq "") { $State = "(" . $1; }
+		    else { $State = $State . " " . $1; }
+		    last FD;
+		}
+		if ($F[$i] =~ /^n(.*)/) { $Name = $1; last FD; }
+		if ($F[$i] =~ /^N(.*)/) { $Na = $1; last FD; }
+		print "ERROR: unrecognized file set field: \"$F[$i]\"\n";
+	    }
+	}
+	$Fdst = 1;
+	next;
+    }
+    print "ERROR: unrecognized: \"$_\"\n";
+}
+close(LSOF_PIPE);
+if ($Fdst) { &End_fd }
+if ($Pidst) { &End_proc }
+
+# List matching files or file descriptors.
+
+for ($pass = 0; $pass < 2; $pass++) {
+    foreach $key (sort keys(%Fds)) {
+	@Praw = split(' ', $Fds{$key}, 999);
+	if ($#Praw < 1) { next; }
+	if ($Shfd) { @P = sort Sort_by_FD_and_PID @Praw; }
+	else { @P = sort Sort_by_PID_and_FD @Praw; }
+
+    # Accumulate and print blocks of (key, PID, FD) triplets.
+
+	for ($i = 0; $i < $#P; $i++) {
+	    if ($Shfile) {
+		for ($n = 0; $n <= $#P; $n++) {
+		    ($pid, $fd) = split(",", $P[$n], 999);
+		    $PrtPid[$n] = $pid;
+		    $PrtFd[$n] = $fd;
+		}
+		$i = $n;
+	    } else {
+		($pid, $fd) = split(",", $P[$i], 999);
+		$PrtFd[0] = $fd;
+		$PrtPid[0] = $pid;
+		for ($n = 1; $i < $#P; $i++, $n++) {
+		    ($nxtpid, $nxtfd) = split(",", $P[$i + 1], 999);
+		    if ($fd ne $nxtfd) { last; }
+		    $PrtFd[$n] = $nxtfd;
+		    $PrtPid[$n] = $nxtpid;
+		}
+	    }
+	    if ($n > 1) { &Print_block($key, $n, $pass); }
+	}
+    }
+}
+exit(0);
+
+
+## End_fd() -- process end of file descriptor
+
+sub End_fd {
+
+    local ($key);
+
+    if ($Fdst && $Pidst && $Pid ne "") {
+	if ($Cmd ne "") { $Cmds{$Pid} = $Cmd; }
+	if ($Ppid ne "") { $Ppids{$Pid} = $Ppid; }
+	$key = $Shfd ? $Fsa : $Na;
+	if ($key ne "") {
+	    if (!defined($Fds{$key})) { $Fds{$key} = "$Pid,$Fd"; }
+	    else { $Fds{$key} .= " $Pid,$Fd"; }
+	    if ($Name ne "" && !defined($Name{$key})) { $Name{$key} = $Name }
+	    if ($Inode ne "" && !defined($Inodes{$key})) {
+		$Inodes{$key} = $Inode;
+	    }
+	    if ($Devn ne "" && !defined($Devns{$key})) {
+		$Devns{$key} = $Devn;
+	    }
+	}
+    }
+
+# Clear variables.
+
+    $Access = $Devch = $Devn = $Fd = $Fsa = $Inode = $Lock = "";
+    $Na = $Name = $Offset = $Proto = $Size = $State = $Stream = $Type = "";
+    $Fdst = 0;
+}
+
+
+## End_proc() -- process end of process
+
+sub End_proc {
+
+# Clear variables.
+
+    $Cmd = $Login = $Pgrp = $Pid = $Ppid = $Uid = "";
+    $Fdst = $Pidst = 0;
+}
+
+
+## Print_block() -- print a block of entries
+#
+# entry:
+#
+#	@_[0] = block's key
+#	@_[1] = number of entries in the block
+#	@_[2] = print pass status (1 == print)
+
+sub Print_block {
+
+    my ($key, $n, $pass) = @_;
+
+    local ($fd, $i, $pid, $t, $tW);
+
+    if ($pass) {
+	if (!$Hdr) {
+	    printf "%${KeyW}.${KeyW}s", $KeyTtl;
+	    printf " %${PidW}.${PidW}s", $PidTtl;
+	    printf " %${PpidW}.${PpidW}s", $PpidTtl;
+	    printf " %-${CmdW}.${CmdW}s", $CmdTtl;
+	    printf " %${FdW}.${FdW}s", $FdTtl;
+	    printf " %${DevW}.${DevW}s", $DevTtl;
+	    printf " %${InoW}.${InoW}s", $InoTtl;
+	    printf " NAME\n";
+	    $Hdr = 1;
+	} else { print "\n"; }
+    }
+
+# Loop through block.  During a non-print pass, caclulate maximum field widths.
+
+    for ($i = 0; $i < $n; $i++) {
+	$fd = $PrtFd[$i];
+	$pid = $PrtPid[$i];
+
+    # Process key.
+
+	if (!$pass) {
+	    $tW = length(sprintf("%s", $key));
+	    if ($tW > $KeyW) { $KeyW = $tW; }
+	} else { printf "%s", $key; }
+
+    # Process PID.
+
+	if (!$pass) {
+	    $tW = length(sprintf(" %s", $pid));
+	    if ($tW > $PidW) { $PidW = $tW; }
+	} else { printf " %${PidW}.${PidW}s", $pid; }
+
+    # Process parent PID.
+
+	$t = defined($Ppids{$pid}) ? $Ppids{$pid} : "";
+	if (!$pass) {
+	    $tW = length(sprintf(" %s", $t));
+	    if ($tW > $PpidW) { $PpidW = $tW; }
+	} else { printf " %${PpidW}.${PpidW}s", $t; }
+
+    # Process command name.
+
+	$t = defined($Cmds{$pid}) ? $Cmds{$pid} : "";
+	if (!$pass) {
+	    $tW = length(sprintf(" %s", $t));
+	    if ($tW > $CmdW) { $CmdW = $tW; }
+	} else { printf " %-${CmdW}.${CmdW}s", $t; }
+
+    # Process file descriptor.
+
+	if (!$pass) {
+	    $tW = length(sprintf(" %s", $fd));
+	    if ($tW > $FdW) { $FdW = $tW; }
+	} else { printf " %${FdW}.${FdW}s", $fd; }
+
+    # Process device number.
+
+	$t = defined($Devns{$key}) ? $Devns{$key} : "";
+	if (!$pass) {
+	    $tW = length(sprintf(" %s", $t));
+	    if ($tW > $DevW) { $DevW = $tW; }
+	} else { printf " %${DevW}.${DevW}s", $t; }
+
+    # Process node number.
+
+	$t = defined($Inodes{$key}) ? $Inodes{$key} : $t;
+	if (!$pass) {
+	    $tW = length(sprintf (" %s", $t));
+	    if ($tW > $InoW) { $InoW = $tW; }
+	} else { printf " %${InoW}.${InoW}s", $t; }
+
+    # Print name and line terminater, if this is a print pass.
+
+	if ($pass) {
+	    if (defined($Name{$key})) { print " $Name{$key}\n"; }
+	    else { print "\n"; }
+	}
+    }
+}
+
+
+## Sort_by_FD_and_PID() -- sort (PID,FD) doublets by FD first, then PID
+
+sub Sort_by_FD_and_PID {
+
+    local ($pida, $pidb, $fda, $fdj, $rv);
+
+    ($pida, $fda) = split(",", $a);
+    ($pidb, $fdb) = split(",", $b);
+    if ($fda < $fdb) { return(-1); }
+    if ($fda > $fdb) { return(1); }
+    if ($pida < $pidb) { return(-1); }
+    if ($pida > $pidb) { return(1); }
+    return(0);
+}
+
+
+## Sort_by_PID_and_FD() -- sort (PID,FD) doublets by PID first, then FD
+
+sub Sort_by_PID_and_FD {
+
+    local ($pida, $pidb, $fda, $fdj, $rv);
+
+    ($pida, $fda) = split(",", $a);
+    ($pidb, $fdb) = split(",", $b);
+    if ($pida < $pidb) { return(-1); }
+    if ($pida > $pidb) { return(1); }
+    if ($fda < $fdb) { return(-1); }
+    return(0);
+    if ($fda > $fdb) { return(1); }
+}
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/sort_res.perl5 b/lsof_4.85/lsof_4.85_src/scripts/sort_res.perl5
new file mode 100755
index 0000000..cf11950
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/sort_res.perl5
@@ -0,0 +1,135 @@
+#!/usr/bin/perl
+# sort_res.perl5 - Script to group & sort lsof output by resource
+#
+# Copyright (c) 2004, 2005 - Fabian Frederick <fabian.frederick@gmx.fr>
+#
+# This program/include file is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as published
+# by the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program/include file is distributed in the hope that it will be
+# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
+# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program (in the main directory of the Linux-NTFS
+# distribution in the file COPYING); if not, write to the Free Software
+# Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+#
+# Note : 
+#	-This script uses lsof released by Victor A. Abell
+#	-lsof path recovery comes from standard perl scripts in there.
+#
+# Usage :
+#	perl sort_res.perl5 -> display used resources + size
+#	or perl sort_res.perl5 <program name>
+#
+# 12/2005 (FabF) 
+#	-size reset in loop (script was broken in 4.76)
+#	-isexec looking in .. (like other scripts)
+#	-display for one or all processes
+#	-removing unuseful line number arg.
+#	-display global size
+
+require 'getopts.pl';
+my @args = @_;
+
+# Set path to lsof.
+if (($LSOF = &isexec("../lsof")) eq "") {    # Some distros use lsof
+						    # out of $PATH
+    if (($LSOF = &isexec("lsof")) eq "") {	    # Then try . and $PATH
+	if (($LSOF = &isexec("../lsof")) eq "") {    # Then try ..
+	    print "can't execute $LSOF\n"; exit 1
+	}
+    }
+}
+
+if ($ARGV[0] ne ""){
+    $cmd="$LSOF -nPl -Fcns -c".$ARGV[0]."|";
+}else{
+    $cmd="$LSOF -nPl -Fcns|";	
+}
+
+#Parse lsof output to gather command, resource name, pid and size
+#Some extradata stand to keep script genericity 
+$i=0;
+if (open(FILE, $cmd)){
+    while (defined ($line=<FILE>)){
+	$cline=$line;
+	$cline =~ s"^(.)"";
+	$cline =~ s/^\s+|\s+$//g;
+	if($line=~m/^p/){
+	    $pid=$cline;
+	}else{
+	    if($line=~/^s/){
+		$size = $cline;
+	    }else{
+		if($line=~/^c/){
+		    $command = $cline;
+		}else{
+		    if($line=~/^n/){
+			$name = $cline;
+			$data{$i} = { command => $command, name => $name,
+				      pid => $pid , size => $size};
+			$size=0;
+			$i = $i+1;
+		    }
+		}
+	    }
+	}
+    }
+}
+
+#Resource name sorting
+sub byresname { $data{$a}{name} cmp $data{$b}{name}}
+@ks=sort byresname (keys %data);
+
+#Resource grouping
+$i=0;
+$cname="a";
+foreach $k (@ks){
+    if ($data{$k}{name} ne $cname){
+	$dgroup{$i} = { name => $data{$k}{name}, size => $data{$k}{size}};
+	$cname = $data{$k}{name};
+	$i++;
+    }	
+}
+
+#Size sort on resource hash
+sub bysize { $dgroup{$a}{size} <=> $dgroup{$b}{size} }
+@ks=sort bysize (keys %dgroup);
+$gsize=0;
+printf("  -- KB --  -- Resource --\n", );
+foreach $k (@ks){
+	printf("%10d  %s\n", $dgroup{$k}{size}/1024, $dgroup{$k}{name});
+	$gsize+=$dgroup{$k}{size};
+}
+
+printf("Total KB : %10d\n", $gsize/1024);
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/watch_a_file.perl b/lsof_4.85/lsof_4.85_src/scripts/watch_a_file.perl
new file mode 100755
index 0000000..c1cd782
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/watch_a_file.perl
@@ -0,0 +1,94 @@
+#!/usr/local/bin/perl
+#
+# watch_a_file.perl -- use lsof -F output to watch a specific file
+#		       (or file system)
+#
+# usage:	watch_a_file.perl file_name
+
+## Interrupt handler
+
+sub interrupt { wait; print "\n"; exit 0; }
+
+
+## Start main program
+
+$Pn = "watch_a_file";
+# Check file argument.
+
+if ($#ARGV != 0) { print "$#ARGV\n"; die "$Pn usage: file_name\n"; }
+$fnm = $ARGV[0];
+if (! -r $fnm) { die "$Pn: can't read $fnm\n"; }
+
+# Do setup.
+
+$RPT = 15;				# lsof repeat time
+$| = 1;					# unbuffer output
+$SIG{'INT'} = 'interrupt';		# catch interrupt
+
+# Set path to lsof.
+
+if (($LSOF = &isexec("../lsof")) eq "") {	# Try .. first
+    if (($LSOF = &isexec("lsof")) eq "") {	# Then try . and $PATH
+	print "can't execute $LSOF\n"; exit 1
+    }
+}
+
+# Read lsof -nPF output from a pipe and gather the PIDs of the processes
+# and file descriptors to watch.
+
+open(P, "$LSOF -nPFpf $fnm|") || die "$Pn: can't pipe to $LSOF\n";
+
+$curpid = -1;
+$pids = "";
+while (<P>) {
+    chop;
+    if (/^p(.*)/) { $curpid = $1; next; }	# Identify process.
+    if (/^f/) {
+	if ($curpid > 0) {
+	    if ($pids eq "") { $pids = $curpid; }
+	    else { $pids = $pids . "," . $curpid; }
+	    $curpid = -1;
+	}
+    }
+}
+close(P);
+wait;
+if ($pids eq "") { die "$Pn: no processes using $fnm located.\n"; }
+print "watch_file: $fnm being used by processes:\n\t$pids\n\n";
+
+# Read repeated lsof output from a pipe and display.
+
+$pipe = "$LSOF -ap $pids -r $RPT $fnm";
+open(P, "$pipe|") || die "$Pn: can't pipe: $pipe\n";
+
+while (<P>) { print $_; }
+close(P);
+print "$Pn: unexpected EOF from \"$pipe\"\n";
+exit 1;
+
+
+## isexec($path) -- is $path executable
+#
+# $path   = absolute or relative path to file to test for executabiity.
+#	    Paths that begin with neither '/' nor '.' that arent't found as
+#	    simple references are also tested with the path prefixes of the
+#	    PATH environment variable.  
+
+sub
+isexec {
+    my ($path) = @_;
+    my ($i, @P, $PATH);
+
+    $path =~ s/^\s+|\s+$//g;
+    if ($path eq "") { return(""); }
+    if (($path =~ m#^[\/\.]#)) {
+	if (-x $path) { return($path); }
+	return("");
+    }
+    $PATH = $ENV{PATH};
+    @P = split(":", $PATH);
+    for ($i = 0; $i <= $#P; $i++) {
+	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
+    }
+    return("");
+}
diff --git a/lsof_4.85/lsof_4.85_src/scripts/xusers.awk b/lsof_4.85/lsof_4.85_src/scripts/xusers.awk
new file mode 100755
index 0000000..ac818b4
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/scripts/xusers.awk
@@ -0,0 +1,137 @@
+#!/usr/bin/awk -f
+################################################################
+#  
+#  Program Name  :  xusers
+#  Date Created  :  02-27-97
+#  Author        :  Dan A. Mercer
+#  Email         :  damercer@mmm.com
+#                :
+#  Description   : Print list of users and applications signed on
+#                : X workstations
+################################################################
+# standard help message
+function help(hlpmsg) {
+basename = ARGV[0]
+sub(/.*\//,"",basename)
+printf "Format:  %s [o=[hi]] [s=cdlp] [pattern]\n", basename
+print  "Print list of users and applications signed on X workstations"
+print  "NOTE: applicationname is truncated to 9 chars"
+print  "Arguments:"
+print  "           o=[h|i]      - Options"
+print  "              h         - help - print this message"
+print  "              i         - case insensitive pattern search"
+print  "           s=[c|d|l|p]  - Sort Options"
+print  "              c         - sort by command"
+print  "              d         - sort by display name"
+print  "              l         - sort by login name"
+print  "              p         - sort by pid"
+print  "           pattern      - regex pattern to search commands against"
+
+if (length(hlpmsg)) print hlpmsg
+exit
+}
+BEGIN {
+# process command line
+for (i=1;i<ARGC;i++) {
+   if (ARGV[i] ~ /^o=/) {
+      if (options)
+         help("duplicate option string")
+      options = ARGV[i]
+      sub(/^o=/,"",options)
+      if (options !~ /^[hi]$/)
+         help("Invalid options " options)
+      if ("h" == options)
+         help("")
+      else
+         igncase = 1
+      }
+   else if (ARGV[i] ~ /^s=/) {
+      if (sortorder)
+         help("duplicate sort order string")
+      sortorder = ARGV[i]
+      sub(/^s=/,"",sortorder)
+      if (sortorder !~ /^[cdlp]$/)
+         help("Invalid sort order: '" sortorder "'")
+      if ("p" == sortorder) {
+         sort = "sort -kn2"
+         }
+      else if ("c" == sortorder) {
+         # the 'b' option means ignore leading blanks
+         sort = "sort -kb3"
+         }
+      else if ("l" == sortorder) {
+         sort = "sort -kb1"
+         }
+      else {
+         sort = "sort -kb4"
+         }
+      }
+   else {
+      if (pattern)
+         help("duplicate pattern string")
+      pattern = ARGV[i]
+      }
+   }
+
+# default is to sort by pid
+sort = (sort) ? sort : "sort -kn2"
+
+# check for igncase
+if (pattern && igncase)
+   pattern = tolower(pattern)
+
+# set default pattern
+pattern = (pattern) ? pattern : ".*"
+
+cmd = "lsof -FpLcn  -awP -iTCP:6000"
+#            ||||| ||||  |
+#            ||||| ||||  X servers use port 6000
+#            ||||| |||don't list port names
+#            ||||| ||suppress warning messages
+#            ||||| |and all conditions
+#            ||||| |options
+#            |||||
+#            ||||Internet addresses
+#            |||command name
+#            ||login name
+#            |process id
+#            Format string
+# Output consists of one record per pid,  followed by newline
+# delimited fields for command, Login name, and network address
+# The pid is preceded by a 'p',  command by a 'c',
+# Login name by an L, and network connection by an 'n'.  There may
+# be multiple 'n' entries (for instance for vuewm)
+
+while ((cmd | getline field) > 0) {
+   type = substr(field,1,1)
+   sub("^.","",field)
+   if ("p" == type) {
+      # always output first
+      pid = field
+      PID[pid] = ++ct
+      }
+   else if ("c" == type) {
+      # always output second
+      XAPPL[pid] = field
+      }
+   else if ("L" == type) {
+      # always output fourth
+      USER[pid] = field
+      }
+   else if ("n" == type) {
+      # may be multiple instances - we just use the last
+      gsub(".*->|:6000","",field)
+      DPY[pid] = field
+      }
+   }
+close(cmd)
+
+printf "%8s  %5s  %-9s  %s\n","USER","PID","COMMAND","DISPLAY"
+for (pid in PID) {
+   if (((igncase) ? tolower(XAPPL[pid]) : XAPPL[pid]) ~ pattern)
+      printf "%8s  %5d  %-9s  %s\n", USER[pid],pid,XAPPL[pid],DPY[pid] | sort
+   }
+
+close(sort)
+exit
+}
diff --git a/lsof_4.85/lsof_4.85_src/store.c b/lsof_4.85/lsof_4.85_src/store.c
new file mode 100644
index 0000000..8254436
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/store.c
@@ -0,0 +1,385 @@
+/*
+ * store.c - common global storage 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: store.c,v 1.40 2011/09/07 19:13:49 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+
+
+/*
+ * Global storage definitions
+ */
+
+#if	defined(HASBLKDEV)
+struct l_dev *BDevtp = (struct l_dev *)NULL;
+				/* block device table pointer */
+int BNdev = 0;			/* number of entries in BDevtp[] */
+struct l_dev **BSdev = (struct l_dev **)NULL;
+				/* pointer to BDevtp[] pointers, sorted
+				 * by device */
+#endif	/* defined(HASBLKDEV) */
+
+int CkPasswd = 0;		/* time to check /etc/passwd for change */
+
+#if	defined(HAS_STD_CLONE)
+struct clone *Clone = (struct clone *)NULL;
+				/* clone device list */
+#endif	/* defined(HAS_STD_CLONE) */
+
+int CmdColW;			/* COMMAND column width */
+struct str_lst *Cmdl = (struct str_lst *)NULL;
+				/* command names selected with -c */
+int CmdLim = CMDL;		/* COMMAND column width limit */
+int Cmdni = 0;			/* command name inclusions selected with -c */
+int Cmdnx = 0;			/* command name exclusions selected with -c */
+lsof_rx_t *CmdRx = (lsof_rx_t *)NULL;
+				/* command regular expression table */
+
+#if	defined(HASSELINUX)
+cntxlist_t *CntxArg = (cntxlist_t *)NULL;
+				/* security context arguments supplied with
+				 * -Z */
+int CntxColW;			/* security context column width */
+int CntxStatus = 0;		/* security context status: 0 == disabled,
+				 * 1 == enabled */
+#endif	/* defined(HASSELINUX) */
+
+#if	defined(HASDCACHE)
+unsigned DCcksum;		/* device cache file checksum */
+int DCfd = -1;			/* device cache file descriptor */
+FILE *DCfs = (FILE *)NULL;	/* stream pointer for DCfd */
+char *DCpathArg = (char *)NULL;	/* device cache path from -D[b|r|u]<path> */
+char *DCpath[] = {		/* device cache paths, indexed by DCpathX
+				 *when it's >= 0 */
+	(char *)NULL, (char *)NULL, (char *)NULL, (char *)NULL
+};
+int DCpathX = -1;		/* device cache path index:
+				 *	-1 = path not defined
+				 *	 0 = defined via -D
+				 *	 1 = defined via HASENVDC
+				 *	 2 = defined via HASSYSDC
+				 *	 3 = defined via HASPERSDC and
+				 *	     HASPERSDCPATH */
+int DCrebuilt = 0;		/* an unsafe device cache file has been
+				 * rebuilt */
+int DCstate = 3;		/* device cache state:
+				 *	0 = ignore (-Di)
+				 *	1 = build (-Db[path])
+				 *	2 = read; don't rebuild (-Dr[path])
+				 *	3 = update; read and rebuild if
+				 *	    necessary (-Du[path])
+				 */
+int DCunsafe = 0;		/* device cache file is potentially unsafe,
+				 * (The [cm]time check failed.) */
+#endif	/* defined(HASDCACHE) */
+
+int DChelp = 0;			/* -D? status */
+
+int DevColW;			/* DEVICE column width */
+dev_t DevDev;			/* device number of /dev or its equivalent */
+struct l_dev *Devtp = (struct l_dev *)NULL;
+				/* device table pointer */
+
+
+/*
+ * Externals for a stkdir(), dumbed-down for older AIX compilers.
+ */
+
+char **Dstk = (char **)NULL;	/* the directory stack */
+int Dstkx = 0;			/* Dstk[] index */
+int Dstkn = 0;			/* Dstk[] entries allocated */
+efsys_list_t *Efsysl = (efsys_list_t *)NULL;
+				/* file systems for which kernel blocks are
+				 * to be eliminated */
+int ErrStat = 0;		/* path stat() error count */
+uid_t Euid;			/* effective UID of this lsof process */
+int Fand = 0;			/* -a option status */
+int Fblock = 0;			/* -b option status */
+int FcColW;			/* FCT column width */
+int Fcntx = 0;			/* -Z option status */
+int FdColW;			/* FD column width */
+int Ffilesys = 0;		/* -f option status:
+				 *    0 = paths may be file systems
+				 *    1 = paths are just files
+				 *    2 = paths must be file systems */
+
+#if	defined(HASNCACHE)
+int Fncache = 1;		/* -C option status */
+int NcacheReload = 1;		/* 1 == call ncache_load() */
+#endif	/* defined(HASNCACHE) */
+
+int Ffield = 0;			/* -f and -F status */
+int FgColW;			/* FILE-FLAG column width */
+int Fhelp = 0;			/* -h option status */
+int Fhost = 1;			/* -H option status */
+int Fnet = 0;			/* -i option status: 0==none
+				 *		     1==find all
+				 *		     2==some found*/
+int FnetTy = 0;			/* Fnet type request: 0==all
+				 *		      4==IPv4
+				 *		      6==IPv6 */
+int Fnfs = 0;			/* -N option status: 0==none, 1==find all,
+				 * 2==some found*/
+int Fnlink = 0;			/* -L option status */
+int Foffset = 0;		/* -o option status */
+int Fovhd = 0;			/* -O option status */
+int Fport = 1;			/* -P option status */
+
+#if	!defined(HASNORPC_H)
+# if	defined(HASPMAPENABLED)
+int FportMap = 1;		/* +|-M option status */
+# else	/* !defined(HASPMAPENABLED) */
+int FportMap = 0;		/* +|-M option status */
+# endif	/* defined(HASPMAPENABLED) */
+#endif	/* !defined(HASNORPC_H) */
+
+int Fpgid = 0;			/* -g option status */
+int Fppid = 0;			/* -R option status */
+int Fsize = 0;			/* -s option status */
+int FsColW;			/* FSTR-ADDR column width */
+int Fsv = FSV_DEFAULT;		/* file struct value selections */
+int FsvByf = 0;			/* Fsv was set by +f */
+int FsvFlagX = 0;		/* hex format status for FSV_FG */
+int Ftask = 0;			/* -K option value */
+int NiColW;			/* NODE-ID column width */
+char *NiTtl = NITTL;		/* NODE-ID column title */
+int Ftcptpi = TCPTPI_STATE;	/* -T option status */
+int Fterse = 0;			/* -t option status */
+int Funix = 0;			/* -U option status */
+int Futol = 1;			/* -l option status */
+int Fverbose = 0;		/* -V option status */
+
+#if	defined(WARNINGSTATE)
+int Fwarn = 1;			/* +|-w option status */
+#else	/* !defined(WARNINGSTATE) */
+int Fwarn = 0;			/* +|-w option status */
+#endif	/* defined(WARNINGSTATE) */
+
+#if	defined(HASXOPT_VALUE)
+int Fxopt = HASXOPT_VALUE;	/* -X option status */
+#endif	/* defined(HASXOPT_VALUE) */
+
+int Fxover = 0;			/* -x option value */
+int Fzone = 0;			/* -z option status */
+
+struct fd_lst *Fdl = (struct fd_lst *)NULL;
+				/* file descriptors selected with -d */
+int FdlTy = -1;			/* Fdl[] type: -1 == none
+				 *		0 == include
+				 *		1 == exclude */
+
+struct fieldsel FieldSel[] = {
+    { LSOF_FID_ACCESS, 0,  LSOF_FNM_ACCESS, NULL,     0		 }, /*  0 */
+    { LSOF_FID_CMD,    0,  LSOF_FNM_CMD,    NULL,     0		 }, /*  1 */
+    { LSOF_FID_CT,     0,  LSOF_FNM_CT,     &Fsv,     FSV_CT 	 }, /*  2 */
+    { LSOF_FID_DEVCH,  0,  LSOF_FNM_DEVCH,  NULL,     0		 }, /*  3 */
+    { LSOF_FID_DEVN,   0,  LSOF_FNM_DEVN,   NULL,     0		 }, /*  4 */
+    { LSOF_FID_FD,     0,  LSOF_FNM_FD,     NULL,     0		 }, /*  5 */
+    { LSOF_FID_FA,     0,  LSOF_FNM_FA,     &Fsv,     FSV_FA	 }, /*  6 */
+    { LSOF_FID_FG,     0,  LSOF_FNM_FG,     &Fsv,     FSV_FG	 }, /*  7 */
+    { LSOF_FID_INODE,  0,  LSOF_FNM_INODE,  NULL,     0		 }, /*  8 */
+    { LSOF_FID_NLINK,  0,  LSOF_FNM_NLINK,  &Fnlink,  1		 }, /*  9 */
+    { LSOF_FID_TID,    0,  LSOF_FNM_TID,    NULL,     0		 }, /* 11 */
+    { LSOF_FID_LOCK,   0,  LSOF_FNM_LOCK,   NULL,     0		 }, /* 11 */
+    { LSOF_FID_LOGIN,  0,  LSOF_FNM_LOGIN,  NULL,     0		 }, /* 12 */
+    { LSOF_FID_MARK,   1,  LSOF_FNM_MARK,   NULL,     0		 }, /* 13 */
+    { LSOF_FID_NAME,   0,  LSOF_FNM_NAME,   NULL,     0		 }, /* 14 */
+    { LSOF_FID_NI,     0,  LSOF_FNM_NI,     &Fsv,     FSV_NI	 }, /* 15 */
+    { LSOF_FID_OFFSET, 0,  LSOF_FNM_OFFSET, NULL,     0		 }, /* 16 */
+    { LSOF_FID_PID,    1,  LSOF_FNM_PID,    NULL,     0		 }, /* 17 */
+    { LSOF_FID_PGID,   0,  LSOF_FNM_PGID,   &Fpgid,   1		 }, /* 18 */
+    { LSOF_FID_PROTO,  0,  LSOF_FNM_PROTO,  NULL,     0		 }, /* 19 */
+    { LSOF_FID_RDEV,   0,  LSOF_FNM_RDEV,   NULL,     0		 }, /* 20 */
+    { LSOF_FID_PPID,   0,  LSOF_FNM_PPID,   &Fppid,   1		 }, /* 21 */
+    { LSOF_FID_SIZE,   0,  LSOF_FNM_SIZE,   NULL,     0		 }, /* 22 */
+    { LSOF_FID_STREAM, 0,  LSOF_FNM_STREAM, NULL,     0		 }, /* 23 */
+    { LSOF_FID_TYPE,   0,  LSOF_FNM_TYPE,   NULL,     0		 }, /* 24 */
+    { LSOF_FID_TCPTPI, 0,  LSOF_FNM_TCPTPI, &Ftcptpi, TCPTPI_ALL }, /* 25 */
+    { LSOF_FID_UID,    0,  LSOF_FNM_UID,    NULL,     0		 }, /* 26 */
+    { LSOF_FID_ZONE,   0,  LSOF_FNM_ZONE,   &Fzone,   1		 }, /* 27 */
+    { LSOF_FID_CNTX,   0,  LSOF_FNM_CNTX,   &Fcntx,   1		 }, /* 28 */
+    { LSOF_FID_TERM,   0,  LSOF_FNM_TERM,   NULL,     0		 }, /* 29 */
+    { ' ',	       0,  NULL,	    NULL,     0		 }
+};
+
+int Hdr = 0;			/* header print status */
+char *InodeFmt_d = (char *) NULL;
+				/* INODETYPE decimal printf specification */
+char *InodeFmt_x = (char *) NULL;
+				/* INODETYPE hexadecimal printf specification */
+struct lfile *Lf = (struct lfile *)NULL;
+				/* current local file structure */
+struct lproc *Lp = (struct lproc *)NULL;
+				/* current local process table entry */
+struct lproc *Lproc = (struct lproc *)NULL;
+				/* local process table */
+char *Memory = (char *)NULL;	/* core file path */
+int MntSup = 0;			/* mount supplement state: 0 == none
+				 *			   1 == create
+				 *			   2 == read */
+char *MntSupP = (char *)NULL;	/* mount supplement path -- if MntSup == 2 */
+
+#if	defined(HASPROCFS)
+struct mounts *Mtprocfs = (struct mounts *)NULL;
+				/* /proc mount entry */
+#endif	/* defined(HASPROCFS) */
+
+int Mxpgid = 0;			/* maximum process group ID table entries */
+int Mxpid = 0;			/* maximum PID table entries */
+int Mxuid = 0;			/* maximum UID table entries */
+gid_t Mygid;			/* real GID of this lsof process */
+int Mypid;			/* lsof's process ID */
+uid_t Myuid;			/* real UID of this lsof process */
+char *Namech = (char *)NULL;	/* name characters for printing */
+size_t Namechl = (size_t)0;	/* sizeof(Namech) */
+int NCmdRxU = 0;		/* number of CmdRx[] entries */
+int Ndev = 0;			/* number of entries in Devtp[] */
+
+#if	defined(HASNLIST)
+struct NLIST_TYPE *Nl = (struct NLIST_TYPE *)NULL;
+				/* kernel name list */
+int Nll = 0;			/* Nl calloc'd length */
+#endif	/* defined(HASNLIST) */
+
+long Nlink = 0l;		/* report nlink values below this number
+				 * (0 = report all nlink values) */
+int Nlproc = 0;			/* number of entries in Lproc[] */
+int NlColW;			/* NLINK column width */
+int NmColW;			/* NAME column width */
+char *Nmlst = (char *)NULL;	/* namelist file path */
+int NodeColW;			/* NODE column width */
+int Npgid = 0;			/* -g option count */
+int Npgidi = 0;			/* -g option inclusion count */
+int Npgidx = 0;			/* -g option exclusion count */
+int Npid = 0;			/* -p option count */
+int Npidi = 0;			/* -p option inclusion count */
+int Npidx = 0;			/* -p option exclusion count */
+int Npuns;			/* number of unselected PIDs (starts at Npid) */
+int Ntype;			/* node type (see N_* symbols) */
+int Nuid = 0;			/* -u option count */
+int Nuidexcl = 0;		/* -u option count of UIDs excluded */
+int Nuidincl = 0;		/* -u option count of UIDs included */
+struct nwad *Nwad = (struct nwad *)NULL;
+				/* list of network addresses */
+int OffDecDig = OFFDECDIG;	/* offset decimal form (0t...) digit limit */
+int OffColW;			/* OFFSET column width */
+int PgidColW;			/* PGID column width */
+int PidColW;			/* PID column width */
+struct lfile *Plf = (struct lfile *)NULL;
+				/* previous local file structure */
+char *Pn;			/* program name */
+int PpidColW;			/* PPID column width */
+
+#if	defined(HASPROCFS)
+int Procfind = 0;		/* 1 when searching for an proc file system
+				 * file and one was found */
+struct procfsid *Procfsid = (struct procfsid *)NULL;
+				/* proc file system PID search table */
+int Procsrch = 0;		/* 1 if searching for any proc file system
+				 * file */
+#endif	/* defined(HASPROCFS) */
+
+int PrPass = 0;			/* print pass: 0 = compute column widths
+				 *	       1 = print */
+int RptTm = 0;			/* repeat time -- set by -r */
+struct l_dev **Sdev = (struct l_dev **)NULL;
+				/* pointer to Devtp[] pointers, sorted
+				 * by device */
+int Selall = 1;			/* all processes are selected (default) */
+int Selflags = 0;		/* selection flags -- see SEL* in lsof.h */
+int Setgid = 0;			/* setgid state */
+int Selinet = 0;		/* select only Internet socket files */
+int Setuidroot = 0;		/* setuid-root state */
+struct sfile *Sfile = (struct sfile *)NULL;
+				/* chain of files to search for */
+struct int_lst *Spgid = (struct int_lst *)NULL;
+				/* process group IDs to search for */
+struct int_lst *Spid = (struct int_lst *)NULL;
+				/* Process IDs to search for */
+struct seluid *Suid = (struct seluid *)NULL;
+				/* User IDs to include or exclude */
+int SzColW;			/* SIZE column width */
+int SzOffColW;			/* SIZE/OFF column width */
+char *SzOffFmt_0t = (char *)NULL;
+				/* SZOFFTYPE 0t%u printf specification */
+char *SzOffFmt_d = (char *)NULL;
+				/* SZOFFTYPE %d printf  specification */
+char *SzOffFmt_dv = (char *)NULL;
+				/* SZOFFTYPE %*d printf  specification */
+char *SzOffFmt_x = (char *)NULL;
+				/* SZOFFTYPE %#x printf  specification */
+int TaskPrtFl = 0;		/* task print flag */
+int TcpStAlloc = 0;		/* allocated (possibly unused) entries in TCP 
+				 * state tables */
+unsigned char *TcpStI = (unsigned char *)NULL;
+				/* included TCP states */
+int TcpStIn = 0;		/* number of entries in TcpStI[] */
+int TcpStOff = 0;		/* offset for TCP state number to adjust
+				 * negative numbers to an index into TcpSt[],
+				 * TcpStI[] and TcpStX[] */
+unsigned char *TcpStX = (unsigned char *)NULL;
+				/* excluded TCP states */
+int TcpStXn = 0;		/* number of entries in TcpStX[] */
+int TcpNstates = 0;		/* number of TCP states -- either in
+				 * tcpstates[] or TcpSt[] */
+char **TcpSt = (char **)NULL;	/* local TCP state names, indexed by system
+				 * state value */
+char Terminator = '\n';		/* output field terminator */
+int TidColW = 0;		/* TID column width */
+int TmLimit = TMLIMIT;		/* Readlink() and stat() timeout (seconds) */
+int TypeColW;			/* TYPE column width */
+int UdpStAlloc = 0;		/* allocated (possibly unused) entries in UDP 
+				 * state tables */
+unsigned char *UdpStI = (unsigned char *)NULL;
+				/* included UDP states */
+int UdpStIn = 0;		/* number of entries in UdpStI[] */
+int UdpStOff = 0;		/* offset for UDP state number to adjust
+				 * negative numbers to an index into UdpSt[],
+				 * UdpStI[] and UdpStX[] */
+unsigned char *UdpStX = (unsigned char *)NULL;
+				/* excluded UDP states */
+int UdpStXn = 0;		/* number of entries in UdpStX[] */
+int UdpNstates = 0;		/* number of UDP states  in UdpSt[] */
+char **UdpSt = (char **)NULL;	/* local UDP state names, indexed by system
+				 * state number */
+int UserColW;			/* USER column width */
+
+#if	defined(HASZONES)
+znhash_t **ZoneArg = (znhash_t **)NULL;
+				/* zone arguments supplied with -z */
+#endif	/* defined(HASZONES) */
+
+int ZoneColW;			/* ZONE column width */
diff --git a/lsof_4.85/lsof_4.85_src/tests/00README b/lsof_4.85/lsof_4.85_src/tests/00README
new file mode 100644
index 0000000..eee8e4d
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/00README
@@ -0,0 +1,102 @@
+
+		.../lsof_<version>/tests
+
+This sub-directory contains support for lsof's test suite.  Find
+more information about the test suite in the 00TESTS file of the
+lsof distribution, which should be in in the parent of this
+subdirectory.
+
+These tests can be activated from .. with:
+
+    $ make test
+
+They can be activated from this directory with:
+
+    $ make
+    $ make test
+    $ make all
+
+These tests are all written in C, so individual tests may be
+activated by executing them directly -- e.g.,
+
+    $ ./LTlock
+
+It may sometimes be necessary to use execution-time options
+alter test behavior.  (Some tests will suggest that when they
+encounter certain kinds of errors.)  See the 00FAQ and 00TEST files
+in .. for more information.
+
+These tests check lsof field output, not lsof text output.  There
+are no tests for lsof text output.
+
+Here is a brief description of the files in this subdirectory:
+
+    00README		this file
+
+    Add2TestDB          a script to add the identity of the current
+			test to TestDB
+
+    CkTestDB		a script to check the identity of this
+			dialect against the TestDB file
+
+    config.cc           a file prepared by ../Configure that contains
+			the name (and possibly the path) to the C
+			compiler for the programs of this sub-directory
+
+    config.cflags       a file prepared by ../Configure that contains
+			C compiler flags for the programs of this
+			sub-directory
+
+    config.libs		a file prepared by ../Configure that contains
+			library load specifications -- i.e, make(1)
+			LDFLAGS
+
+    config.xobj         a file prepared by ../Configure that contains
+			paths to any extra object files (*.o) needed
+			by the C programs in this directory
+
+    LsofTest.h		lsof test definitions for C programs
+
+    LTbasic.c		C source to basic lsof tests
+
+    LTbigf.c		C source to a program that tests large file
+			sizes and offsets on dialects that support
+			file sizes > 32 bits
+
+    LTdnlc.c            C source to a program that tests the
+			effectiveness of assembling path names from
+			the kernel's Dynamic Name Lookup Cache
+			(DNLC)
+
+    LTlib.c		a support library in C
+
+    LTlock.c		C source to a program that tests lock reporting
+
+    LTnfs		C source to a program that tests for open NFS
+			files
+
+    LTnlink.c           C source to a program that tests lsof's
+			reporting of open file link counts
+
+    LTsock.c            C source to program that tests the finding
+			of IPv4 sockets
+
+    LTszoff.c           C source to a program that tests file sizes
+			and offsets  -- see LTbigf.c for a large
+			file (size > 32 bits) test
+
+    LTunix.c		C source to a program that tests the finding
+			of UNIX domain sockets
+
+    Makefile		the make(1) control file
+
+			The Makefile clean rule will not remove
+			config.* files, but the spotless rule will.
+			One the spotless rule has been used,
+			../Configure must be re-run.
+
+    TestDB              a data base of dialects where the test
+			suite has been validated
+
+Vic Abell
+April 11, 2002
diff --git a/lsof_4.85/lsof_4.85_src/tests/Add2TestDB b/lsof_4.85/lsof_4.85_src/tests/Add2TestDB
new file mode 100755
index 0000000..48603f9
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/Add2TestDB
@@ -0,0 +1,83 @@
+#!/bin/sh
+#
+# Add2TestDB -- add the current test to the lsof test suite DB
+#
+# This script saves the current TestDB file in TestDB.old and adds
+# the words in config.cflags to it.  "-D" prefixes on the words are
+# removed, the words are sorted, and they are joint in a single
+# line that is catenated to TestDB if it isn't already there.
+#
+# $Id: Add2TestDB,v 1.2 2002/04/19 11:53:37 abe Exp $
+
+# Check for config.flags.
+
+if test ! -r config.cflags
+then
+  echo "$0: no ./config.cflags file"
+  exit 1
+fi
+
+# Check for a current data base file.
+
+if test ! -r TestDB
+then
+  echo "$0: no ./TestDB file"
+  exit 1
+fi
+
+# Form a new data base line.
+
+new=""
+for i in `sort < config.cflags`
+do
+  w=`echo $i | sed 's/^-D//'`
+  if test "X$new" = "X"
+  then
+    new=$w
+  else
+    new="$new $w"
+  fi
+done
+
+# See if the new line is already in the data base.
+
+grep "$new" TestDB > /dev/null 2>&1
+if test $? -eq 0
+then
+  echo "\"$new\" is already in TestDB."
+  exit 1
+fi
+
+# Build a new data base file.
+
+if test ! -w TestDB
+then
+  echo "$0: can't write the following to the end of TestDB:"
+  echo  "    \"$new\""
+  exit 1
+fi
+rm -f TestDB.new
+cp TestDB TestDB.new
+chmod 644 TestDB.new
+echo "$new" >> TestDB.new
+
+# Archive the current data base file, if possible.
+
+if test -d OLD
+then
+  dt=`date`
+  dtm="========== $dt =========="
+  if test -r OLD/TestDB
+  then
+    echo "$dtm" >> OLD/TestDB
+  else
+    echo "$dtm" > OLD/TestDB
+  fi
+  cat TestDB >> OLD/TestDB
+fi
+
+# Put the new data base file in place.
+
+mv TestDB.new TestDB
+echo "\"$new\" added to TestDB."
+exit 0
diff --git a/lsof_4.85/lsof_4.85_src/tests/CkTestDB b/lsof_4.85/lsof_4.85_src/tests/CkTestDB
new file mode 100755
index 0000000..80bee63
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/CkTestDB
@@ -0,0 +1,136 @@
+#!/bin/sh
+#
+# CkTestDB -- see if this dialect is has been tested
+#
+# This script builds a line from config.flags in the form of lines in
+# ./TestDB,  (See Add2TestDB.)
+#
+# It then compares the line to TestDB.  If the line is found, the script
+# exits.  if the line is not found, the script issues a warning and requests
+# a go-ahead confirmation.
+#
+# The script will exit 0 if the test line is in the DB or the go-ahead
+# confirmation is positive.
+#
+# $Id: CkTestDB,v 1.3 2010/01/18 19:02:21 abe Exp abe $
+
+# Check for config.flags.
+
+if test ! -r config.cflags
+then
+  echo "$0: no ./config.cflags file"
+  exit 1
+fi
+
+# Check for a current data base file.
+
+if test ! -r TestDB
+then
+  echo "$0: no ./TestDB file"
+  exit 1
+fi
+
+# Form a data base line.
+
+new=""
+for i in `LC_ALL=C sort < config.cflags`
+do
+  w=`echo $i | sed 's/^-D//'`
+  if test "X$new" = "X"
+  then
+    new=$w
+  else
+    new="$new $w"
+  fi
+done
+
+# See if the line is already in the data base.  Exit with success (0), if it is.
+
+grep "^$new\$" TestDB > /dev/null 2>&1
+if test $? -eq 0
+then
+  exit 0
+fi
+
+# This dialect may never have been validated with the test suite.
+
+# If the standard input is not a TTY, quit, because no interaction
+# is possible.
+
+tty -s > /dev/null 2>&1
+if test $? -ne 0
+then
+  echo ""
+  echo "This suite has not been validated on:"
+  echo ""
+  echo "     $new"
+  echo ""
+  exit 1
+fi
+
+# Establish trap and stty handling.
+
+ISIG=":"
+trap '$ISIG; exit 1'  1 2 3 15
+stty -a 2>&1 | grep isig > /dev/null
+if test $? -eq 0
+then
+  stty -a 2>&1 | egrep -e -isig > /dev/null
+  if test $? -eq 0
+  then
+    ISIG="stty -isig"
+    stty isig
+  fi
+fi
+
+# Establish echo type -- Berkeley or SYSV.
+
+j=`echo -n ""`
+if test "X$j" = "X-n "
+then
+  EC="\c"
+  EO=""
+else
+  EC=""
+  EO="-n"
+fi
+
+# Display a validation warning.
+
+cat << .CAT_MARK > /dev/tty
+
+==================================================================
+
+!!!WARNING!!!
+
+This dialect or its particular version may not have been validated
+with the lsof test suite.  Consequently some tests may fail or may
+not even compile.
+
+This is the computed identity of this dialect, not found in the
+test data base file, ./TestDB:
+
+.CAT_MARK
+echo "    $new" > /dev/tty
+END=0
+while test $END = 0
+do
+  echo "" > /dev/tty
+  echo $EO "Do you want to continue (y|n) [n]? $EC" > /dev/tty
+  read ANS EXCESS
+  if test "X$ANS" = "Xn" -o "X$ANS" = "XN"
+  then
+    exit 1
+  fi
+  if test "X$ANS" = "Xy" -o "X$ANS" = "XY"
+  then
+    exit 0
+  else
+    echo "Please answer y or n." > /dev/tty
+  fi
+done
+
+# Should never get here!
+
+echo "$0: unexpected failure!"
+exit 2
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTbasic.c b/lsof_4.85/lsof_4.85_src/tests/LTbasic.c
new file mode 100644
index 0000000..ce04705
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTbasic.c
@@ -0,0 +1,445 @@
+/*
+ * LTbasic.c -- Lsof Test basic tests
+ *
+ * The basic tests measure the finding by lsof of its own open CWD, open
+ * executable (when possible), and open /dev/kmem files.
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+
+/*
+ * Local definitions
+ */
+
+
+/*
+ * Globals
+ */
+
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *tstlsof,(char **texec, char **tkmem, char **tproc));
+
+
+/*
+ * Main program for dialects that support locking tests.
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    char *em;				/* error message pointer */
+    char *texec = (char *)NULL;		/* lsof executable test result */
+    char *tkmem = (char *)NULL;		/* /dev/kmem test result */
+    char *tproc = (char *)NULL;		/* lsof process test result */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "h", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h]", Pn);
+	PrtMsgX      ("       -h       print help (this panel)", Pn, cleanup,
+		      xv);
+    }
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Test lsof.
+ */
+    if ((em = tstlsof(&texec, &tkmem, &tproc)))
+	PrtMsg(em, Pn);
+    if (texec)
+	PrtMsg(texec, Pn);
+    if (tkmem)
+	PrtMsg(tkmem, Pn);
+    if (tproc)
+	PrtMsg(tproc, Pn);
+/*
+ * Compute exit value and exit.
+ */
+    if (em || texec || tkmem || tproc) {
+	if (strcmp(LT_DEF_LSOF_PATH, LsofPath)) {
+	    PrtMsg (" ", Pn);
+	    PrtMsg ("Hint: you used the LT_LSOF_PATH environment variable to",
+		Pn);
+	    PrtMsg ("  specify this path to the lsof executable:\n", Pn);
+	    (void) snprintf(buf, sizeof(buf) - 1, "      %s\n", LsofPath);
+	    buf[sizeof(buf) - 1] = '\0';
+	    PrtMsg (buf, Pn);
+	    PrtMsgX("  Make sure its revision is 4.63 or higher.",
+		Pn, cleanup, 1);
+	} else
+	    PrtMsgX("", Pn, cleanup, 1);
+    }
+    (void) PrtMsgX("OK", Pn, cleanup, 0);
+    return(0);
+}
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+}
+
+
+/*
+ * tstlsof() -- test for the lsof process
+ */
+
+static char *
+tstlsof(texec, tkmem, tproc)
+    char **texec;			/* result of the executable test */
+    char **tkmem;			/* result of the /dev/kmem test */
+    char **tproc;			/* result of the lsof process test */
+{
+    char buf[2048];			/* temporary buffer */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTdev_t cwddc;			/* CWD device components */
+    struct stat cwdsb;			/* CWD stat(2) buffer */
+    LTfldo_t *devp;			/* device pointer */
+    int execs = 0;			/* executable status */
+    int fdn;				/* FD is a number */
+    LTfldo_t *fdp;			/* file descriptor pointer */
+    LTfldo_t *fop;			/* field output pointer */
+    char ibuf[64];			/* inode string buffer */
+    LTfldo_t *inop;			/* inode number pointer */
+    LTdev_t kmemdc;			/* /dev/kmem device components */
+    int kmems = 0;			/* kmem status */
+    struct stat kmemsb;			/* /dev/kmem stat(2) buffer */
+    LTdev_t lsofdc;			/* lsof device components */
+    struct stat lsofsb;			/* lsof stat(2) buffer */
+    int nf;				/* number of fields */
+    char *opv[4];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    int procs = 0;			/* process status */
+    LTfldo_t *rdevp;			/* raw device pointer */
+    char *tcp;				/* temporary character pointer */
+    int ti;				/* temporary integer */
+    LTdev_t tmpdc;			/* temporary device components */
+    LTfldo_t *typ;			/* file type pointer */
+    int xwhile;				/* exit while() flag */
+
+/*
+ * Get lsof executable's stat(2) information.
+ */
+    if (stat(LsofPath, &lsofsb)) {
+	(void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  stat(%s): %s",
+	    LsofPath, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	cem = MkStrCpy(buf, &ti);
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	execs = 1;
+    } else if ((cem = ConvStatDev(&lsofsb.st_dev, &lsofdc))) {
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	execs = 1;
+    }
+
+#if	defined(LT_KMEM)
+/*
+ * Get /dev/kmem's stat(2) information.
+ */
+    if (stat("/dev/kmem", &kmemsb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't stat(2) /dev/kmem: %s", strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	cem = MkStrCpy(buf, &ti);
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	kmems = 1;
+    } else if ((cem = ConvStatDev(&kmemsb.st_rdev, &kmemdc))) {
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	kmems = 1;
+    }
+#else	/* !defined(LT_KMEM) */
+    kmems = 1;
+#endif	/* defined(LT_KMEM) */
+
+/*
+ * Get CWD's stat(2) information.
+ */
+    if (stat(".", &cwdsb)) {
+	(void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  stat(.): %s",
+	    strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	cem = MkStrCpy(buf, &ti);
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	procs = 1;
+    } else if ((cem = ConvStatDev(&cwdsb.st_dev, &cwddc))) {
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	procs = 1;
+    }
+
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    ti = 0;
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+#if	defined(USE_LSOF_X_OPT)
+    opv[ti++] = "-X";
+#endif	/* defined(USE_LSOF_X_OPT) */
+
+    opv[ti++] = "-clsof";
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv))) {
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	return(cem);
+    }
+/*
+ * Read lsof output.
+ */
+    xwhile = execs + kmems + procs;
+    while ((xwhile < 3) && (fop = RdFrLsof(&nf, &cem))) {
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = cem;
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != LsofPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Scan its fields.
+	 */
+	    if (!pids)
+		break;
+	    devp = inop = rdevp = typ = (LTfldo_t *)NULL;
+	    fdp = fop;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch(fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_RDEV:
+		    rdevp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * A file descriptor line has been processes.
+	 *
+	 * Set the descriptor's numeric status.
+	 *
+	 * Check descriptor by FD type.
+	 */
+
+	    for (fdn = 0, tcp = fdp->v; *tcp; tcp++) {
+		if (!isdigit((unsigned char)*tcp)) {
+		    fdn = -1;
+		    break;
+		}
+		fdn = (fdn * 10) + (int)(*tcp - '0');
+	    }
+	    if (!procs
+	    &&  (fdn == -1)
+	    &&  !strcasecmp(fdp->v, "cwd")
+	    &&  typ
+	    &&  (!strcasecmp(typ->v, "DIR") || !strcasecmp(typ->v, "VDIR"))
+	    ) {
+
+	    /*
+	     * This is the CWD for the process.  Make sure its information
+	     * matches what stat(2) said about the CWD.
+	     */
+		if (!devp || !inop)
+		    break;
+		if ((cem = ConvLsofDev(devp->v, &tmpdc))) {
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+		(void) snprintf(ibuf, sizeof(ibuf) - 1, "%u",
+		    (unsigned int)cwdsb.st_ino);
+		ibuf[sizeof(ibuf) - 1] = '\0';
+		if ((tmpdc.maj == cwddc.maj)
+		&&  (tmpdc.min == cwddc.min)
+		&&  (tmpdc.unit == cwddc.unit)
+		&&  !strcmp(inop->v, ibuf)
+		) {
+		    procs = 1;
+		    xwhile++;
+		}
+		break;
+	    }
+	    if (!kmems
+	    &&  (fdn >= 0)
+	    &&  typ
+	    &&  (!strcasecmp(typ->v, "CHR") || !strcasecmp(typ->v, "VCHR"))
+	    ) {
+
+	    /*
+	     * /dev/kmem hasn't been found and this is an open character device
+	     * file with a numeric descriptor.
+	     *
+	     * See if it is /dev/kmem.
+	     */
+		if (!inop || !rdevp)
+		    break;
+		if ((cem = ConvLsofDev(rdevp->v, &tmpdc))) {
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+		(void) snprintf(ibuf, sizeof(ibuf) - 1, "%u",
+		    (unsigned int)kmemsb.st_ino);
+		ibuf[sizeof(ibuf) - 1] = '\0';
+		if ((tmpdc.maj == kmemdc.maj)
+		&&  (tmpdc.min == kmemdc.min)
+		&&  (tmpdc.unit == kmemdc.unit)
+		&&  !strcmp(inop->v, ibuf)
+		) {
+		    kmems = 1;
+		    xwhile++;
+		}
+		break;
+	    }
+	    if (!execs
+	    &&  (fdn == -1)
+	    &&  typ
+	    &&  (!strcasecmp(typ->v, "REG") || !strcasecmp(typ->v, "VREG"))
+	    ) {
+
+	    /*
+	     * If this is a regular file with a non-numeric FD, it may be the
+	     * executable.
+	     */
+		if (!devp || !inop)
+		    break;
+	        if ((cem = ConvLsofDev(devp->v, &lsofdc))) {
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+		(void) snprintf(ibuf, sizeof(ibuf) - 1, "%u",
+		    (unsigned int)lsofsb.st_ino);
+		ibuf[sizeof(ibuf) - 1] = '\0';
+		if ((tmpdc.maj == lsofdc.maj)
+		&&  (tmpdc.min == lsofdc.min)
+		&&  (tmpdc.unit == lsofdc.unit)
+		&&  !strcmp(inop->v, ibuf)
+		) {
+		    execs = 1;
+		    xwhile++;
+		}
+	    }
+	}
+    }
+    (void) StopLsof();
+    if (!execs)
+	*texec = "ERROR!!!  open lsof executable wasn't found.";
+    if (!kmems)
+	*tkmem = "ERROR!!!  open lsof /dev/kmem usage wasn't found.";
+    if (!procs)
+	*tproc = "ERROR!!!  lsof process wasn't found.";
+    return(pem);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTbigf.c b/lsof_4.85/lsof_4.85_src/tests/LTbigf.c
new file mode 100644
index 0000000..ed740e7
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTbigf.c
@@ -0,0 +1,767 @@
+/*
+ * LTbigf.c -- Lsof Test big file size and offset tests
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+
+#if	!defined(LT_BIGF)
+
+/*
+ * Here begins the version of this program for dialects that don't support
+ * large files.
+ */
+
+
+/*
+ * Main program for dialects that don't support large files
+ */
+
+int
+main(argc, argv)
+	int argc;			/* argument count */
+	char *argv[];			/* arguments */
+{
+    char *pn;			/* program name */
+/*
+ * Get program name and issue start and exit message.
+ */
+    if ((pn = (char *)strrchr(argv[0], '/')))
+	    pn++;
+    else
+	    pn = argv[0];
+	
+    (void) printf("%s ... %s\n", pn, LT_DONT_DO_TEST);
+    return(0);
+}
+#else	/* defined(LT_BIGF) */
+
+/*
+ * Here begins the version of this program for dialects that support
+ * large files.
+ */
+
+#include "lsof_fields.h"
+
+
+/*
+ * Pre-definitions that may be changed by specific dialects
+ */
+
+#define	OFFTST_STAT	1		/* offset tests status */
+
+
+#if	defined(LT_DIAL_aix)
+/*
+ * AIX-specific definitions
+ */
+
+#define	OFFSET_T	off64_t		/* define offset type */
+#endif	/* defined(LT_DIAL_aix) */
+
+
+#if	defined(LT_DIAL_bsdi)
+/*
+ * BSDI-specific definitions
+ */
+
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+#endif	/* defined(LT_DIAL_bsdi) */
+
+
+#if	defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific definitions
+ */
+
+# if	LT_VERS>=900
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+# endif	/* LT_VERS>=900 */
+#endif	/* defined(LT_DIAL_darwin) */
+
+
+#if	defined(LT_DIAL_du)
+/*
+ * DEC_OSF/1|Digital_UNIX|Tru64_UNIX-specific items
+ */
+
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+#endif	/* defined(LT_DIAL_du) */
+
+
+#if	defined(LT_DIAL_freebsd)
+/*
+ * FreeBSD-specific definitions
+ */
+
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+#endif	/* defined(LT_DIAL_freebsd) */
+
+
+#if	defined(LT_DIAL_linux)
+/*
+ * Linux-specific definitions
+ */
+
+#undef	OFFTST_STAT
+#define	OFFTST_STAT	0		/* Linux lsof may not be able to report
+					 * offsets -- see the function
+					 * ck_Linux_offset_support() */
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+
+_PROTOTYPE(static int ck_Linux_offset_support,(void));
+#endif	/* defined(LT_DIAL_linux) */
+
+
+#if	defined(LT_DIAL_hpux)
+/*
+ * HP-UX-specific definitions
+ */
+
+#define	OFFSET_T	off64_t		/* define offset type */
+#endif	/* defined(LT_DIAL_hpux) */
+
+
+#if	defined(LT_DIAL_netbsd)
+/*
+ * NetBSD-specific definitions
+ */
+
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+#endif	/* defined(LT_DIAL_netbsd) */
+
+
+#if	defined(LT_DIAL_openbsd)
+/*
+ * OpenBSD-specific definitions
+ */
+
+#define	OFFSET_T	off_t		/* define offset type */
+#define	OPENF		open		/* define open function */
+#define	SEEKF		lseek		/* define seek function */
+#define	STATF		stat		/* define stat function */
+#define	STATS		struct stat	/* define stat structure */
+#endif	/* defined(LT_DIAL_openbsd) */
+
+
+#if	defined(LT_DIAL_ou)
+/*
+ * OpenUNIX-specific items
+ */
+
+#include <signal.h>
+
+#define	IGNORE_SIGXFSZ
+#define	OFFSET_T	off64_t		/* define offset type */
+#endif	/* defined(LT_DIAL_ou) */
+
+
+#if	defined(LT_DIAL_solaris)
+/*
+ * Solaris-specific definitions
+ */
+
+#define	OFFSET_T	off64_t		/* define offset type */
+#endif	/* defined(LT_DIAL_solaris) */
+
+
+#if	defined(LT_DIAL_uw)
+/*
+ * UnixWare-specific items
+ */
+
+#include <signal.h>
+
+#define	IGNORE_SIGXFSZ
+#define	OFFSET_T	off64_t		/* define offset type */
+#endif	/* defined(LT_DIAL_uw) */
+
+
+/*
+ * Local definitions
+ */
+
+#if	!defined(OPENF)
+#define	OPENF		open64		/* open() function */
+#endif	/* !defined(OPENF) */
+
+#if	!defined(OFFSET_T)
+#define	OFFSET_T unsigned long long	/* offset type */
+#endif	/* !defined(OFFSET_T) */
+
+#if	!defined(SEEKF)
+#define	SEEKF		lseek64		/* seek() function */
+# endif	/* !defined(SEEKF) */
+
+#if	!defined(STATF)
+#define	STATF		stat64		/* stat(2) structure */
+#endif	/* !defined(STATF) */
+
+#if	!defined(STATS)
+#define	STATS		struct stat64	/* stat(2) structure */
+#endif	/* !defined(STATS) */
+
+#define	TST_OFFT	0		/* test offset in 0t decimal*/
+#define	TST_OFFX	1		/* test offset in hex */
+#define	TST_SZ		2		/* test size */
+
+
+/*
+ * Globals
+ */
+
+int Fd = -1;			/* test file descriptor; open if >= 0 */
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Path = (char *)NULL;	/* test file path; none if NULL */
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static int tstwlsof,(int tt, char *opt, OFFSET_T sz));
+
+
+/*
+ * Main program for dialects that support large files
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    int do_offt = OFFTST_STAT;		/* do offset tests if == 1 */
+    char *em;				/* error message pointer */
+    int i;				/* temporary integer */
+    int len;				/* string length */
+    OFFSET_T sz = 0x140000000ll;	/* test file size */
+    char szbuf[64];			/* size buffer */
+    char *tcp;				/* temporary character pointer */
+    int tofft = 0;			/* 0t offset test result */
+    int toffx = 0;			/* 0x offset test result */
+    int tsz = 0;			/* size test result */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "hp:", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h] [-p path]", Pn);
+	PrtMsg       ("       -h       print help (this panel)", Pn);
+	PrtMsgX      ("       -p path  define test file path", Pn, cleanup, xv);
+    }
+
+#if	defined(LT_DIAL_linux)
+/*
+ * If this is Linux, see if lsof can report file offsets.
+ */
+	do_offt = ck_Linux_offset_support();
+#endif	/* defined(LT_DIAL_linux) */
+
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Construct the path.  If LT_BIGSZOFF_PATH is defined in the environment,
+ * use it. otherwise construct a path in the CWD. 
+ */
+    if (!(Path = LTopt_p)) {
+	(void) snprintf(buf, sizeof(buf), "./config.LTbigf%ld",
+	(long)MyPid);
+	buf[sizeof(buf) - 1] = '\0';
+	Path = MkStrCpy(buf, &len);
+    }
+/*
+ * Fill buffer for writing to the test file.
+ */
+    for (i = 0; i < sizeof(buf); i++) {
+	buf[i] = (char)(i & 0xff);
+    }
+
+#if	defined(IGNORE_SIGXFSZ)
+/*
+ * Ignore SIGXFSZ, if directed by a dialect-specific option.
+ */
+	(void) signal(SIGXFSZ, SIG_IGN);
+#endif	/* defined(IGNORE_SIGXFSZ) */
+
+/*
+ * Open a new test file at the specified path.
+ */
+    (void) unlink(Path);
+    if ((Fd = OPENF(Path, O_RDWR|O_CREAT, 0600)) < 0) {
+	(void) fprintf(stderr, "ERROR!!!  can't open %s\n", Path);
+
+print_hint:
+
+    /*
+     * Print a hint about the LT_BIGSZOFF_PATH environment variable.
+     */
+
+	MsgStat = 1;
+	(void) snprintf(buf, sizeof(buf) - 1, "      Errno %d: %s",
+	    errno, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsg(buf, Pn);
+	(void) PrtMsg("Hint: try using \"-p path\" to supply a path in a", Pn);
+	(void) PrtMsg("file system that has large file support enabled.\n", Pn);
+	(void) PrtMsg("Hint: try raising the process ulimit file block", Pn);
+	(void) PrtMsg("size to a value that will permit this test to", Pn);
+	(void) snprintf(szbuf, sizeof(szbuf) - 1, "%lld", (long long)sz);
+	szbuf[sizeof(szbuf) - 1] = '\0';
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "write a file whose size appears to be %s", szbuf);
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsg(buf, Pn);
+	(void) PrtMsg("bytes.  (The file really isn't that big -- it", Pn);
+	(void) PrtMsg("just has a large \"hole\" in its mid-section.)\n", Pn);
+	(void) PrtMsgX("See 00FAQ and 00TEST for more information.", Pn,
+		       cleanup, 1);
+    }
+/*
+ * Write a buffer load at the beginning of the file.
+ */
+    if (SEEKF(Fd, (OFFSET_T)0, SEEK_SET) < 0) {
+	(void) fprintf(stderr,
+	    "ERROR!!!  can't seek to the beginning of %s\n", Path);
+	goto print_hint;
+    }
+    if (write(Fd, buf, sizeof(buf)) != sizeof(buf)) {
+	(void) fprintf(stderr,
+	    "ERROR!!!  can't write %d bytes to the beginning of %s\n",
+	    (int)sizeof(buf), Path);
+	goto print_hint;
+    }
+/*
+ * Write a buffer load near the end of the file to bring it to the
+ * specified length.  Leave the file open so lsof can find it.
+ */
+    if (SEEKF(Fd, (OFFSET_T)(sz - sizeof(buf)), SEEK_SET) < 0) {
+	(void) snprintf(szbuf, sizeof(szbuf) - 1, "%lld",
+	    (unsigned long long)(sz - sizeof(buf)));
+	(void) fprintf(stderr, "ERROR!!!  can't seek to %s in %s\n", szbuf,
+	    Path);
+	goto print_hint;
+    }
+    if (write(Fd, buf, sizeof(buf)) != sizeof(buf)) {
+	(void) fprintf(stderr,
+	    "ERROR!!!  can't write %d bytes near the end of %s\n",
+	    (int)sizeof(buf), Path);
+	goto print_hint;
+    }
+/*
+ * Fsync() the file.
+ */
+    if (fsync(Fd)) {
+	(void) fprintf(stderr, "ERROR!!!  can't fsync %s\n", Path);
+	goto print_hint;
+    }
+
+/*
+ * If this dialect can't report offsets, disable the offset tests.
+ */
+    if (!do_offt) {
+	tofft = toffx = 1;
+	PrtMsg("WARNING!!!  lsof can't return file offsets for this dialect,",
+	    Pn);
+	PrtMsg("  so offset tests have been disabled.", Pn);
+    }
+/*
+ * Do file size test.
+ */
+    tsz = tstwlsof(TST_SZ, "-s", sz);
+/*
+ * If enabled, do offset tests.
+ */
+    if (!tofft)
+	tofft = tstwlsof(TST_OFFT, "-oo20", sz);
+    if (!toffx)
+	toffx = tstwlsof(TST_OFFX, "-oo2", sz);
+/*
+ * Compute exit value and exit.
+ */
+    if ((tsz != 1) || (tofft != 1) || (toffx != 1)) {
+	tcp = (char *)NULL;
+	xv = 1;
+    } else {
+	tcp = "OK";
+	xv = 0;
+    }
+    (void) PrtMsgX(tcp, Pn, cleanup, xv);
+    return(0);
+}
+
+
+#if	defined(LT_DIAL_linux)
+/*
+ * ck_Linux_offset_support() -- see if lsof can report offsets for this
+ *				Linux implementation
+ */
+
+static int
+ck_Linux_offset_support()
+{
+	char buf[1024];			/* lsof output line buffer */
+	int bufl = sizeof(buf);		/* size of buf[] */
+	char *opv[5];			/* option vector for lsof */
+	int rv = 1;			/* return value:
+					 *     0 == no lsof offset support
+					 *     1 == lsof offset support */
+/*
+ * Ask lsof to report the test's FD zero offset.
+ */
+	if (IsLsofExec())
+	    return(0);
+	opv[0] = "-o";
+	snprintf(buf, bufl - 1, "-p%d", (int)getpid());
+	opv[1] = buf;
+	opv[2] = "-ad0";
+	opv[3] = "+w";
+	opv[4] = (char *)NULL;
+	if (ExecLsof(opv))
+	    return(0);
+/*
+ * Read the lsof output.  Look for a line with "WARNING: can't report offset"
+ * in it.  If it is found, then this Linux lsof can't report offsets.
+ */
+	while(fgets(buf, bufl - 1, LsofFs)) {
+	    if (strstr(buf, "WARNING: can't report offset")) {
+		rv = 0;
+		break;
+	    }
+	}
+	(void) StopLsof();
+	return(rv);
+}
+#endif	/* defined(LT_DIAL_linux) */
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+    if (Fd >= 0) {
+/*
+ * Close the test file.
+ *
+ * But first unlink it to discourage some kernel file system implementations
+ * (e.g., HFS on Apple Darwin, aka Mac OS X) from trying to fill the file's
+ * large holes.  (Filling can take a long time.)
+ */
+	if (Path) {
+	    (void) unlink(Path);
+	    Path = (char *)NULL;
+	}
+	(void) close(Fd);
+	Fd = -1;
+    }
+}
+
+
+/*
+ * tstwlsof() -- test the open file with lsof
+ */
+
+static int
+tstwlsof(tt, opt, sz)
+    int tt;				/* test type -- i.e., TST_* */
+    char *opt;				/* additional lsof options */
+    OFFSET_T sz;			/* expected size (and offset) */
+{
+    char buf[2048], buf1[2048];		/* temporary buffers */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTfldo_t *devp;			/* device pointer */
+    char *em;				/* error message pointer */
+    int ff = 0;				/* file found status */
+    LTfldo_t *fop;			/* field output pointer */
+    LTfldo_t *inop;			/* inode number pointer */
+    LTdev_t lsofdc;			/* lsof device components */
+    int nf;				/* number of fields */
+    LTfldo_t *nmp;			/* file name pointer */
+    LTfldo_t *offp;			/* file offset pointer */
+    char *opv[4];			/* option vector for ExecLsof() */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    STATS sb;				/* stat(2) buffer */
+    LTdev_t stdc;			/* stat(2) device components */
+    LTfldo_t *szp;			/* file size pointer */
+    LTfldo_t *tfop;			/* temporary field output pointer */
+    int ti;				/* temporary index */
+    LTfldo_t *typ;			/* file type pointer */
+    int xv = 0;				/* exit value */
+/*
+ * Check the test type.
+ */
+    switch (tt) {
+    case TST_OFFT:
+    case TST_OFFX:
+    case TST_SZ:
+	break;
+    default:
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!! unknown test type: %d", tt);
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Get test file's information.
+ */
+    if (STATF(Path, &sb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!! can't stat(2) %s: %s", Path, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Extract components from test file's device number.
+ */
+    if ((em = ConvStatDev(&sb.st_dev, &stdc))) {
+	(void) PrtMsg(em, Pn);
+	return(0);
+    }
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    ti = 0;
+    if (opt && *opt)
+	opv[ti++] = opt;
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#else	/* !defined(USE_LSOF_C_OPT) */
+    opv[ti++] = "--";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    opv[ti++] = Path;
+    opv[ti] = (char *)NULL;
+    if ((em = ExecLsof(opv))) {
+	(void) PrtMsg(em, Pn);
+	return(0);
+    }
+/*
+ * Read lsof output.
+ */
+    while (!ff && (fop = RdFrLsof(&nf, &em))) {
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != MyPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.
+	 *
+	 * Scan for device number, inode number, name, offset, size, and type
+	 * fields.
+	 */
+	    if (!pids)
+		break;
+	    devp = inop = nmp = offp = szp = typ = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch(fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_NAME:
+		    nmp = fop;
+		    break;
+		case LSOF_FID_OFFSET:
+		    offp = fop;
+		    break;
+		case LSOF_FID_SIZE:
+		    szp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the results of the file descriptor field scan.
+	 *
+	 * (Don't compare path names because of symbolic link interference.)
+	 */
+	    if (!devp || !inop || !nmp || !typ)
+		break;
+	    if (strcasecmp(typ->v, "reg") && strcasecmp(typ->v, "vreg"))
+		break;
+	    if (ConvLsofDev(devp->v, &lsofdc))
+		break;
+	    if ((stdc.maj != lsofdc.maj)
+	    ||  (stdc.min != lsofdc.min)
+	    ||  (stdc.unit != lsofdc.unit))
+		break;
+	    (void) snprintf(buf, sizeof(buf) - 1, "%llu",
+		(unsigned long long)sb.st_ino);
+	    buf[sizeof(buf) - 1] = '\0';
+	    if (strcmp(inop->v, buf))
+		break;
+	/*
+	 * The specifed file has been located.  Check its size or offset,
+	 * according to the tt argument.
+	 */
+	    ff = 1;
+	    switch (tt) {
+	    case TST_OFFT:
+	    case TST_SZ:
+
+	    /*
+	     * Test the size as an offset in decimal with a leading "0t", or
+	     * test the size as a size in decimal.
+	     */
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    (tt == TST_SZ) ? "%llu" : "0t%llu",
+		    (unsigned long long)sz);
+		buf[sizeof(buf) - 1] = '\0';
+		tfop = (tt == TST_SZ) ? szp : offp;
+		if (!tfop || strcmp(tfop->v, buf)) {
+		    (void) snprintf(buf1, sizeof(buf1) - 1,
+			"%s mismatch: expected %s, got %s",
+			(tt == TST_SZ) ? "size" : "0t offset",
+			buf,
+			tfop ? tfop->v : "nothing");
+		    buf1[sizeof(buf1) - 1] = '\0';
+		    (void) PrtMsg(buf1, Pn);
+		    xv = 0;
+		} else
+		    xv = 1;
+		break;
+	    case TST_OFFX:
+
+	    /*
+	     * Test the size as an offset in hex.
+	     */
+		(void) snprintf(buf, sizeof(buf) - 1, "0x%llx",
+		    (unsigned long long)sz);
+		buf[sizeof(buf) - 1] = '\0';
+		if (!offp || strcmp(offp->v, buf)) {
+		    (void) snprintf(buf1, sizeof(buf1) - 1,
+			"0x offset mismatch: expected %s, got %s",
+			buf,
+			offp ? offp->v : "nothing");
+		    buf1[sizeof(buf1) - 1] = '\0';
+		    (void) PrtMsg(buf1, Pn);
+		    xv = 0;
+		} else
+		    xv = 1;
+	    }
+	    break;
+	}
+    }
+    (void) StopLsof();
+    if (em) {
+
+    /*
+     * RdFrLsof() encountered an error.
+     */
+	(void) PrtMsg(em, Pn);
+	xv = 0;
+    }
+    if (!ff) {
+	(void) snprintf(buf, sizeof(buf) - 1, "%s not found by lsof", Path);
+	buf[sizeof(buf) - 1] = '\0';
+	PrtMsg(buf, Pn);
+	xv = 0;
+    }
+    return(xv);
+}
+#endif	/* defined(LT_BIG) */
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTdnlc.c b/lsof_4.85/lsof_4.85_src/tests/LTdnlc.c
new file mode 100644
index 0000000..66c6262
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTdnlc.c
@@ -0,0 +1,426 @@
+/*
+ * LTdnlc.c -- Lsof Test Dynamic Name Lookup Cache test
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+
+/*
+ * Pre-definitions that may be revoked by specific dialects
+ */
+
+#define	DO_TEST				/* do the test */
+
+
+/*
+ * Dialect-specific items
+ */
+
+
+#if	defined(LT_DIAL_aix)
+/*
+ * AIX-specific items
+ */
+
+#undef	DO_TEST
+#endif	/* defined(LT_DIAL_aix) */
+
+
+#if   defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific items
+ */
+
+# if	LT_VERS<800
+#undef        DO_TEST
+# endif	/* LT_VERS<800 */
+#endif        /* defined(LT_DIAL_darwin) */
+
+
+/*
+ * Local definitions
+ */
+
+#define	ATTEMPT_CT	5		/* number of lsof CWD lookup attempts */
+#define	LSPATH		"/bin/ls"	/* path to ls(1) */
+#define	SUCCESS_THRESH	50.0		/* success threshold */
+
+
+/*
+ * Globals
+ */
+
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *FindLsofCwd,(int *ff, LTdev_t *cwddc, char *ibuf));
+
+
+/*
+ * Main program
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    char cwd[MAXPATHLEN + 1];		/* CWD */
+    LTdev_t cwddc;			/* CWD device components */
+    char *em;				/* error message pointer */
+    int ff;				/* FindFile() file-found flag */
+    int fpathct;			/* full path found count */
+    char ibuf[32];			/* inode buffer */
+    char lsbuf[2048 + MAXPATHLEN + 1];	/* ls(1) system() command */
+    double pct;				/* performance percentage */
+    struct stat sb;			/* CWD stat(2) results */
+    int ti;				/* temporary index */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "h", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h] [-p path]", Pn);
+	PrtMsgX("       -h       print help (this panel)", Pn, cleanup, xv);
+    }
+
+#if	!defined(DO_TEST)
+/*
+ * If the dialect has disabled the test, echo that result and exit with
+ * a successful return code.
+ */
+    (void) PrtMsgX(LT_DONT_DO_TEST, Pn, cleanup, 0);
+#endif	/* !defined(DO_TEST) */
+
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Get the CWD and form the ls(1) system() command.
+ */
+
+#if	defined(USE_GETCWD)
+    em = "getcwd";
+    if (!getcwd(cwd, sizeof(cwd)))
+#else	/* ! defined(USE_GETCWD) */
+    em = "getwd";
+    if (!getwd(cwd))
+#endif	/* defined(USE_GETCWD) */
+
+    {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  %s() error: %s", em, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+    (void) snprintf(lsbuf, sizeof(lsbuf) - 1, "%s %s > /dev/null 2>&1",
+	LSPATH, cwd);
+/*
+ * Get the CWD stat(2) results.
+ */
+    if (stat(cwd, &sb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  stat(%s) error: %s", cwd, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+    if ((em = ConvStatDev(&sb.st_dev, &cwddc)))
+	PrtMsgX(em, Pn, cleanup, 1);
+    (void) snprintf(ibuf, sizeof(ibuf) - 1, "%u", (unsigned int)sb.st_ino);
+    ibuf[sizeof(ibuf) - 1] = '\0';
+/*
+ * Loop ATTEMPT_CT times.
+ */
+    for (fpathct = ti = 0; ti < ATTEMPT_CT; ti++) {
+
+    /*
+     * Call ls(1) to list the CWD to /dev/null.
+     */
+	(void) system(lsbuf);
+    /*
+     * Call lsof to look up its own CWD -- i.e., this one.
+     */
+	if ((em = FindLsofCwd(&ff, &cwddc, ibuf))) {
+
+	/*
+	 * FindLsofCwd() returned a message.  Decode it via ff.
+	 */
+	    if (ff == -1)
+		PrtMsgX(em, Pn, cleanup, 1);
+	    else if (ff == 1) {
+
+	    /*
+	     * This shouldn't happen.  If FindLsof() found lsof's CWD, it
+	     * should set ff to one and return NULL.
+	     */
+		PrtMsgX("ERROR!!!  inconsistent FindLsofCwd() return", Pn,
+		    cleanup, 1);
+	    }
+	} else if (ff == 1) {
+	    fpathct++;
+	}
+    }
+/*
+ * Compute, display, and measure the success percentage.
+ */
+    pct = ((double)fpathct * (double)100.0) / (double)ATTEMPT_CT;
+    PrtMsg((char *)NULL, Pn);
+    (void) printf("%s found: %.2f%%\n", cwd, pct);	/* NeXT snpf.c has no
+							 * %f support */
+    MsgStat = 1;
+    if (pct < (double)SUCCESS_THRESH) {
+	PrtMsg("ERROR!!!  the find rate was too low.", Pn);
+	if (!fpathct) {
+	    (void) PrtMsg(
+		"Hint: since the find rate is zero, it may be that this file",
+		Pn);
+	    (void) PrtMsg(
+		"system does not fully participate in kernel DNLC processing",
+		Pn);
+	    (void) PrtMsg(
+		"-- e.g., NFS file systems often do not, /tmp file systems",
+		Pn);
+	    (void) PrtMsg(
+		"sometimes do not, Solaris loopback file systems do not.\n",
+		Pn);
+	    (void) PrtMsg(
+		"As a work-around rebuild and test lsof on a file system that",
+		Pn);
+	    (void) PrtMsg(
+		"fully participates in kernel DNLC processing.\n",
+		Pn);
+	    (void) PrtMsg("See 00FAQ and 00TEST for more information.", Pn);
+	}
+	exit(1);
+    }
+/*
+ * Exit successfully.
+ */
+    (void) PrtMsgX("OK", Pn, cleanup, 0);
+    return(0);
+}
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+}
+
+
+/*
+ * FindLsofCwd() -- find the lsof CWD
+ */
+
+static char *
+FindLsofCwd(ff, cwddc, ibuf)
+    int *ff;				/* file-found response receptor */
+    LTdev_t *cwddc;			/* CWD device components */
+    char *ibuf;				/* CWD inode number in ASCII */
+{
+    char *cp;				/* temporary character pointer */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTdev_t devdc;			/* devp->v device components */
+    LTfldo_t *devp;			/* device pointer */
+    LTfldo_t *fop;			/* field output pointer */
+    LTfldo_t *inop;			/* inode number pointer */
+    int nf;				/* number of fields */
+    LTfldo_t *nmp;			/* name pointer */
+    char *opv[3];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    int ti;				/* temporary integer */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Check the argument pointers.
+ *
+ * Set the file-found response false.
+ */
+    if (!ff || !cwddc || !ibuf)
+	(void) PrtMsgX("ERROR!!!  missing argument to FindFile()",
+		       Pn, cleanup, 1);
+    *ff = 0;
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    opv[0] = "-clsof";
+    opv[1] = "-adcwd";
+    opv[2] = (char *)NULL;
+    if ((cem = ExecLsof(opv))) {
+	*ff = -1;
+	return(cem);
+    }
+/*
+ * Read lsof output.
+ */
+    while (!*ff && (fop = RdFrLsof(&nf, &cem))) {
+	if (cem) {
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    *ff = -1;
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != LsofPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Make sure it's for the expected
+	 * PID and its type is "cwd".
+	 */
+	    if (!pids)
+		break;
+	    if (strcasecmp(fop->v, "cwd"))
+		break;
+	/*
+	 * Scan for device, inode, name, and type fields.
+	 */
+	    devp = inop = nmp = typ = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_NAME:
+		    nmp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the device, inode, and type of the file.
+	 */
+	    if (!devp || !inop || !nmp || !typ)
+		break;
+	    if (strcasecmp(typ->v, "dir") && strcasecmp(typ->v, "vdir"))
+		break;
+	    if ((cem = ConvLsofDev(devp->v, &devdc))) {
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if ((cwddc->maj != devdc.maj)
+	    ||  (cwddc->min != devdc.min)
+	    ||  (cwddc->unit != devdc.unit)
+	    ||  strcmp(inop->v, ibuf)
+	    ) {
+		break;
+	    }
+	/*
+	 * Check the name for spaces.  If it has none, set a file-found
+	 * response.
+	 */
+	    if (!(cp = strchr(nmp->v, ' ')))
+		*ff = 1;
+	    else {
+
+	    /*
+	     * If a parenthesized file system name follows the space in the
+	     * file's name, it probably is an NFS file system name and can
+	     * be ignored.  Accordingly set a file-found response.
+	     */
+		if ((*(cp + 1) == '(') && *(cp + 2) && !strchr(cp + 2, ' ')) {
+		    if ((cp = strchr(cp + 2, ')')) && !*(cp + 1))
+			*ff = 1;
+		}
+	    }
+	}
+    }
+/*
+ * Clean up and return.
+ */
+    (void) StopLsof();
+    if (pem) {
+	*ff = -1;
+	return(pem);
+    }
+    return((char *)NULL);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTlib.c b/lsof_4.85/lsof_4.85_src/tests/LTlib.c
new file mode 100644
index 0000000..be15af1
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTlib.c
@@ -0,0 +1,1104 @@
+/*
+ * LTlib.c -- the lsof test library
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+
+
+/*
+ * Pre-defintions that may be changed by a specific dialect
+ */
+
+#define	X2DEV_T		unsigned int	/* cast for result of x2dev() */
+#define	XDINDEV		8		/* number of hex digits in an lsof
+					 * device field -- should be
+					 * 2 X sizeof(X2DEV_T) */
+
+
+#if	defined(LT_DIAL_aix)
+/*
+ * AIX-specific items
+ */
+
+#include <sys/sysmacros.h>
+
+# if	defined(LT_AIXA) && LT_AIXA>=1
+
+/*
+ * Note: the DEVNO64 and ISDEVNO54 #define's come from <sys/sysmacros.h>, but
+ * only when _KERNEL is #define'd.
+ */
+
+#undef	DEVNO64
+#define	DEVNO64		0x8000000000000000LL
+#undef	ISDEVNO64
+#define	ISDEVNO64(d)	(((ulong)(d) & DEVNO64) ? 1 : 0)
+
+/*
+ * Define major and minor extraction macros that work on 64 bit AIX
+ * architectures.
+ */
+ 
+#define	major_S(d)	(ISDEVNO64(d) ? major64(d) : minor(d & ~SDEV_REMOTE))
+#define	minor_S(d)	(ISDEVNO64(d) ? (minor64(d) & ~SDEV_REMOTE) : minor(d))
+#undef	X2DEV_T
+#define	X2DEV_T		unsigned long long
+#undef	XDINDEV
+#define	XDINDEV		16
+#define	major_X(dp, em)	major_S(x2dev(dp, em))
+#define	minor_X(dp, em)	minor_S(x2dev(dp, em))
+# endif	/* defined(LT_AIXA) && LT_AIXA>=1 */
+
+#endif	/* defined(LT_DIAL_aix) */
+
+
+#if	defined(LT_DIAL_bsdi)
+/*
+ * BSDI-specific items
+ */
+
+#define	minor_S(dev)	dv_subunit(dev)
+#define	unit_S(dev)	dv_unit(dev)
+#define	minor_X(dp, em)	dv_subunit(x2dev(dp, em))
+#define	unit_X(dp, em)	dv_unit(x2dev(dp, em))	
+#endif	/* defined(LT_DIAL_bsdi) */
+
+
+#if	defined(LT_DIAL_osr)
+/*
+ * OpenUNIX-specific items
+ */
+
+#include <sys/sysmacros.h>
+#endif	/* defined(LT_DIAL_osr) */
+
+
+#if	defined(LT_DIAL_ou)
+/*
+ * OpenUNIX-specific items
+ */
+
+#include <sys/mkdev.h>
+#endif	/* defined(LT_DIAL_ou) */
+
+
+#if	defined(LT_DIAL_solaris)
+/*
+ * Solaris-specific items
+ */
+
+#include <sys/sysmacros.h>
+
+
+/*
+ * Define maximum major device number in a stat(2) dev_t
+ */
+
+# if	LT_VERS>=20501
+#define LT_MJX	L_MAXMAJ	/* Get maximum major device number from
+				 * <sys/sysmacros.h>. */
+# else	/* LT_VERS<20501 */
+#define	LT_MJX	0x3fff		/* Avoid <sys/sysmacros.h> when
+				 * Solaris < 2.5.1. */
+# endif /* LT_VERS>=20501 */
+
+#define	major_S(dev)	((int)((dev >> L_BITSMINOR) & LT_MJX))
+#define	minor_S(dev)	((int)(dev & L_MAXMIN))
+
+# if	defined(LT_K64)
+
+/*
+ * Solaris 64 bit kernel
+ */
+
+#undef	X2DEV_T
+#define	X2DEV_T		unsigned long long
+#undef	XDINDEV
+#define	XDINDEV		16
+
+#define	major_X(dp, em)	((int)((x2dev(dp, em) >> 32) & 0xffffffff))
+#define	minor_X(dp, em) ((int)(x2dev(dp, em) & 0xffffffff))
+# else	/* !defined(LT_K64) */
+
+/*
+ * Solaris 32 bit kernel
+ */
+
+#define	major_X(dp, em)	((int)((x2dev(dp, em) >> L_BITSMINOR) & LT_MJX))
+#define	minor_X(dp, em)	((int)(x2dev(dp, em) & L_MAXMIN))
+# endif	/* LT_K64 */
+#endif	/* defined(LT_DIAL_solaris) */
+
+
+#if	defined(LT_DIAL_uw)
+/*
+ * UnixWare-specific items
+ */
+
+#include <sys/mkdev.h>
+#endif	/* defined(LT_DIAL_uw) */
+
+
+/*
+ * Global variables
+ */
+
+int LsofFd = -1;			/* lsof pipe FD */
+FILE *LsofFs = (FILE *)NULL;		/* stream for lsof pipe FD */
+char *LsofPath = (char *)NULL;		/* path to lsof executable */
+pid_t LsofPid = (pid_t)0;		/* PID of lsof child process */
+int LTopt_h = 0;			/* "-h" option's switch value */
+char *LTopt_p = (char *)NULL;		/* "-p path" option's path value */
+int MsgStat = 0;			/* message status: 1 means prefix needs
+					 * to be issued */
+
+
+/*
+ * Local static variables
+ */
+
+static int Afo = 0;			/* Fo[] structures allocated */
+static char *GOv = (char *)NULL;	/* option `:' value pointer */
+static int GOx1 = 1;			/* first opt[][] index */
+static int GOx2 = 0;			/* second opt[][] index */
+static LTfldo_t *Fo = (LTfldo_t *)NULL;	/* allocated LTfldo_t structures */
+static int Ufo = 0;			/* Fo[] structures used */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void closepipe,(void));
+_PROTOTYPE(static void getlsofpath,(void));
+_PROTOTYPE(static int GetOpt,(int ct, char *opt[], char *rules, char **em,
+			 char *pn));
+_PROTOTYPE(static X2DEV_T x2dev,(char *x, char **em));
+
+
+/*
+ * Default major, minor, and unit macros.
+ */
+
+#if	!defined(major_S)
+#define	major_S		major
+#endif	/* defined(major_S) */
+
+#if	!defined(minor_S)
+#define	minor_S		minor
+#endif	/* defined(minor_S) */
+
+#if	!defined(unit_S)
+#define	unit_S(x)	0
+#endif	/* defined(unit_S) */
+
+#if	!defined(major_X)
+#define	major_X(dp, em)	major(x2dev(dp, em))
+#endif	/* defined(major_X) */
+
+#if	!defined(minor_X)
+#define	minor_X(dp, em)	minor(x2dev(dp, em))
+#endif	/* defined(minor_X) */
+
+#if	!defined(unit_X)
+#define	unit_X(dp, em)	0
+#endif	/* defined(unit_X) */
+
+
+/*
+ * CanRdKmem() -- can lsof read kernel memory devices?
+ */
+
+char *
+CanRdKmem()
+{
+
+#if	defined(LT_KMEM)
+    char buf[2048];			/* temporary buffer */
+    char *dn;				/* memory device name */
+    char *em;				/* error message pointer */
+    int fd;				/* temporary file descriptor */
+    struct stat sb;			/* memory device stat(2) buffer */
+    int ti;				/* temporary integer */
+/*
+ * Get the lsof path.  If it is not the default, check no further.
+ */
+    (void) getlsofpath();
+    if (!strcmp(LsofPath, LT_DEF_LSOF_PATH))
+	return((char *)NULL);
+/*
+ * Check /dev/kmem access.
+ */
+    dn = "/dev/kmem";
+    if (stat(dn, &sb)) {
+	em = "stat";
+
+kmem_error:
+
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't %s(%s): %s\n", em, dn, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+    if ((fd = open(dn, O_RDONLY, 0)) < 0) {
+	em = "open";
+	goto kmem_error;
+    }
+    (void) close(fd);
+/*
+ * Check /dev/mem access.
+ */
+    dn = "/dev/mem";
+    if (stat(dn, &sb)) {
+
+    /*
+     * If /dev/mem can't be found, ignore the error.
+     */
+	return((char *)NULL);
+    }
+    if ((fd = open(dn, O_RDONLY, 0)) < 0) {
+	em = "open";
+	goto kmem_error;
+    }
+    (void) close(fd);
+#endif	/* defined(LT_KMEM) */
+
+    return((char *)NULL);
+}
+
+
+/*
+ * closepipe() -- close pipe from lsof
+ */
+
+static void
+closepipe()
+{
+    if (LsofFd >= 0) {
+
+    /*
+     * A pipe from lsof is open.  Close it and the associated stream.
+     */
+	if (LsofFs) {
+	    (void) fclose(LsofFs);
+	    LsofFs = (FILE *)NULL;
+	}
+	(void) close(LsofFd);
+	LsofFd = -1;
+    }
+}
+
+
+/*
+ * ConvLsofDev() -- convert lsof device string
+ *
+ * Note: this function is dialect-specific.
+ */
+
+char *
+ConvLsofDev(dev, ldev)
+    char *dev;			/* lsof device string -- the value to the
+				 * LSOF_FID_DEVN field of a LSOF_FID_FD block
+				 * (see lsof_fields.h) */
+    LTdev_t *ldev;		/* results are returned to this structure */
+{
+    char *dp;			/* device pointer */
+    char *em;			/* error message pointer */
+    int tlen;			/* temporary length */
+/*
+ * Check function arguments.
+ *
+ * Establish values for decoding the device string.
+ */
+    if (!dev)
+	return("ERROR!!!  no ConvLsofDev() device");
+    if (!ldev)
+	return("ERROR!!!  no ConvLsofDev() result pointer");
+    if (strncmp(dev, "0x", 2))
+	return("ERROR!!!  no leading 0x in ConvLsofDev() device");
+    dp = dev + 2;
+    if (((tlen = (int)strlen(dp)) < 1) || (tlen > XDINDEV))
+	return("ERROR!!!  bad ConvLsofDev() device length");
+/*
+ * Use the pre-defined *_X() macros to do the decomposition.
+ */
+    ldev->maj = (unsigned int)major_X(dp, &em);
+    if (em)
+	return(em);
+    ldev->min = (unsigned int)minor_X(dp, &em);
+    if (em)
+	return(em);
+    ldev->unit = (unsigned int)unit_X(dp, &em);
+    return(em);
+}
+
+
+/*
+ * ConvStatDev() -- convert stat(2) device number
+ *
+ * Note: this function is dialect-specific.
+ */
+
+char *
+ConvStatDev(dev, ldev)
+    dev_t *dev;			/* device number to be converted */
+    LTdev_t *ldev;		/* results are returned to this structure */
+{
+
+/*
+ * Check function arguments.
+ */
+    if (!dev)
+	return("ERROR!!!  no ConvStatDev() device");
+    if (!ldev)
+	return("ERROR!!!  no ConvStatDev() result pointer");
+/*
+ * Use the pre-defined *_S() macros to do the decomposition.
+ */
+    ldev->maj = (unsigned int)major_S(*dev);    
+    ldev->min = (unsigned int)minor_S(*dev);
+    ldev->unit = (unsigned int)unit_S(*dev);
+    return((char *)NULL);
+}
+
+
+/*
+ * ExecLsof() -- execute lsof with full field output and a NUL field terminator
+ *		 in a child process
+ */
+
+char *
+ExecLsof(opt)
+    char **opt;				/* lsof options -- a pointer to an
+					 * array of character pointers,
+					 * terminated by a NULL pointer */
+{
+    static char **av = (char **)NULL;	/* lsof argument vector, dynamically
+					 * allocated */
+    static int ava = 0;			/* **av entries allocated */
+    char buf[2048];			/* temporary buffer */
+    char *em;				/* error message pointer */
+    int fd;				/* temporary file descriptor */
+    int optc;				/* option count */
+    int nf;				/* number of files */
+    int p[2];				/* pipe FDs */
+    char **tcpp;			/* temporary character pointer
+					 * pointer */
+    int ti;				/* temporary integer */
+    int tlen;				/* temporary length */
+    pid_t tpid;				/* temporary PID holder */
+/*
+ * It's an error if lsof is already in execution or if no lsof options
+ * were supplied.
+ */
+    (void) getlsofpath();
+    if (LsofPid)
+	return("ERROR!!!  ExecLsof() says lsof is already in execution");
+    if (!opt)
+	return("ERROR!!!  no ExecLsof() option list");
+    for (optc = 0, tcpp = opt; *tcpp; optc++, tcpp++)
+	;
+/*
+ * Make sure lsof is executable.
+ */
+    if ((em = IsLsofExec()))
+	return(em);
+/*
+ * Open a pipe through which lsof can return output.
+ */
+    if (pipe(p)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't open pipe: %s", strerror(errno));
+	return(MkStrCpy(buf, &ti));
+    }
+/*
+ * Allocate and build an argument vector.  The first entry will be set
+ * to "lsof", the second to "-wFr", and the third to "-F0".  Additional
+ * entries will be set as supplied by the caller.
+ */
+    if ((optc + 4) > ava) {
+	tlen = (int)(sizeof(char *) * (optc + 4));
+	if (!av)
+	    av = (char **)malloc(tlen);
+	else
+	    av = (char **)realloc((void *)av, tlen);
+	if (!av) {
+	    (void) snprintf(buf, sizeof(buf) - 1,
+		"LTlib: ExecLsof() can't allocat pointers for %d arguments",
+		optc + 4);
+	    return(MkStrCpy(buf, &ti));
+	}
+	ava = optc + 4;
+    }
+    for (ti = 0, tcpp = opt; ti < (optc + 3); ti++) {
+	switch(ti) {
+	case 0:
+	    av[ti] = "lsof";
+	    break;
+	case 1:
+	    av[ti] = "-wFr";
+	    break;
+	case 2:
+	    av[ti] = "-F0";
+	    break;
+	default:
+	    av[ti] = *tcpp;
+	    tcpp++;
+	}
+    }
+    av[ti] = (char *)NULL;
+/*
+ * Fork a child process to run lsof.
+ */
+    switch((tpid = fork())) {
+    case (pid_t)0:
+
+    /*
+     * This is the child process.
+     *
+     * First close all file descriptors except the output side of the pipe.
+     *
+     * Make the output side of the pipe STDOUT and STDERR.
+     */
+	for (fd = 0, nf = getdtablesize(); fd < nf; fd++) {
+	    if (fd == p[1])
+		continue;
+	    (void) close(fd);
+	}
+	if (p[1] != 1)
+	    (void) dup2(p[1], 1);
+	if (p[1] != 2)
+	    (void) dup2(p[1], 2);
+	if ((p[1] != 1) && (p[1] != 2))
+	    (void) close(p[1]);
+    /*
+     * Execute lsof.
+     */
+	(void) execv(LsofPath, av);
+	_exit(0);				/* (Shouldn't get here.) */
+    case (pid_t)-1:
+
+    /*
+     * A fork error occurred.  Form and return a message.
+     */
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  ExecLsof() can't fork: %s", strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    default:
+
+    /*
+     * This is the parent.
+     *
+     * Save the lsof child PID.
+     *
+     * Close the output side of the pipe.
+     *
+     * Save the input side of the pipe as LsofFd; open a stream for it.
+     */
+	LsofPid = tpid;
+	(void) close(p[1]);
+	LsofFd = p[0];
+	if (!(LsofFs = fdopen(LsofFd, "r")))
+	    return("ERROR!!!  ExecLsof() can't open stream to lsof output FD");
+    }
+/*
+ * Wait a bit for lsof to start and put something in its pipe, then return
+ * an "All is well." response.
+ */
+    sleep(1);
+    return((char *)NULL);
+}
+
+
+/*
+ * getlsofpath() -- get lsof path, either from LT_LSOF_PATH in the environment
+ *		    or from LT_DEF_LSOF_PATH
+ */
+
+static void
+getlsofpath()
+{
+    char *tcp;				/* temporary character pointer */
+    int ti;				/* temporary integer */
+
+    if (LsofPath)
+	return;
+    if ((tcp = getenv("LT_LSOF_PATH")))
+	LsofPath = MkStrCpy(tcp, &ti);
+    else
+	LsofPath = LT_DEF_LSOF_PATH;
+}
+
+
+/*
+ * GetOpt() -- Local get option
+ *
+ * Borrowed from lsof's main.c source file.
+ *
+ * Liberally adapted from the public domain AT&T getopt() source,
+ * distributed at the 1985 UNIFORM conference in Dallas
+ *
+ * The modifications allow `?' to be an option character and allow
+ * the caller to decide that an option that may be followed by a
+ * value doesn't have one -- e.g., has a default instead.
+ */
+
+static int
+GetOpt(ct, opt, rules, em, pn)
+    int ct;				/* option count */
+    char *opt[];			/* options */
+    char *rules;			/* option rules */
+    char **em;				/* error message return */
+    char *pn;
+{
+    register int c;			/* character value */
+    register char *cp = (char *)NULL;	/* character pointer */
+    char embf[2048];			/* error message buffer */
+    int tlen;				/* temporary message length from
+					 * MkStrCpy() */
+
+    *em = (char *)NULL;
+    if (GOx2 == 0) {
+
+    /*
+     * Move to a new entry of the option array.
+     *
+     * EOF if:
+     *
+     *	Option list has been exhausted;
+     *	Next option doesn't start with `-' or `+';
+     *	Next option has nothing but `-' or `+';
+     *	Next option is ``--'' or ``++''.
+     */
+	if (GOx1 >= ct
+	||  (opt[GOx1][0] != '-' && opt[GOx1][0] != '+')
+	||  !opt[GOx1][1])
+	    return(EOF);
+	if (strcmp(opt[GOx1], "--") == 0 || strcmp(opt[GOx1], "++") == 0) {
+	    GOx1++;
+	    return(EOF);
+	}
+	GOx2 = 1;
+    }
+/*
+ * Flag `:' option character as an error.
+ *
+ * Check for a rule on this option character.
+ */
+    if ((c = opt[GOx1][GOx2]) == ':') {
+	(void) snprintf(embf, sizeof(embf) - 1,
+	    "ERROR!!!  colon is an illegal option character.");
+	embf[sizeof(embf) - 1] = '\0';
+	*em = MkStrCpy(embf, &tlen);
+    } else if (!(cp = strchr(rules, c))) {
+	(void) snprintf(embf, sizeof(embf) - 1,
+	    "ERROR!!!  illegal option character: %c", c);
+	embf[sizeof(embf) - 1] = '\0';
+	*em = MkStrCpy(embf, &tlen);
+    }
+    if (*em) {
+
+    /*
+     * An error was detected.
+     *
+     * Advance to the next option character.
+     *
+     * Return the character causing the error.
+     */
+	if (opt[GOx1][++GOx2] == '\0') {
+	    GOx1++;
+	    GOx2 = 0;
+	}
+	return(c);
+    }
+    if (*(cp + 1) == ':') {
+
+    /*
+     * The option may have a following value.  The caller decides if it does.
+     *
+     * Don't indicate that an option of ``--'' is a possible value.
+     *
+     * Finally, on the assumption that the caller will decide that the possible
+     * value belongs to the option, position to the option following the
+     * possible value, so that the next call to GetOpt() will find it.
+     */
+	if(opt[GOx1][GOx2 + 1] != '\0') {
+	    GOv = &opt[GOx1++][GOx2];
+	} else if (++GOx1 >= ct)
+	    GOv = (char *)NULL;
+	else {
+	    GOv = opt[GOx1];
+	    if (strcmp(GOv, "--") == 0)
+		GOv = (char *)NULL;
+	    else
+		GOx1++;
+	}
+	GOx2 = 0;
+     } else {
+
+    /*
+     * The option character stands alone with no following value.
+     *
+     * Advance to the next option character.
+     */
+	if (opt[GOx1][++GOx2] == '\0') {
+	    GOx2 = 0;
+	    GOx1++;
+	}
+	GOv = (char *)NULL;
+    }
+/*
+ * Return the option character.
+ */
+    return(c);
+}
+
+
+/*
+ * IsLsofExec() -- see if lsof is executable
+ */
+
+char *
+IsLsofExec()
+{
+    char buf[2048];			/* temporary buffer */
+    int len;				/* temporary length */
+
+    (void) getlsofpath();
+    if (access(LsofPath, X_OK) < 0) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't execute %s: %s", LsofPath, strerror(errno));
+        return(MkStrCpy(buf, &len));
+    }
+    return((char *)NULL);
+}
+
+
+/*
+ * LTlibClean() -- clean up LTlib resource accesses
+ */
+
+void
+LTlibClean()
+{
+    (void) StopLsof();
+}
+
+
+/*
+ * MkStrCpy() -- make string copy
+ */
+
+char *
+MkStrCpy(src, len)
+    char *src;			/* string source to copy */
+    int *len;			/* returned length allocation */
+{
+    char *rp;			/* return pointer */
+    int srclen;			/* source string length */
+
+    if (!src) {
+	(void) fprintf(stderr, "ERROR!!!  no string supplied to MkStrCpy()\n");
+	exit(1);
+    }
+    srclen = (int)strlen(src);
+    *len = srclen++;
+    if (!(rp = (char *)malloc(srclen))) {
+	(void) fprintf(stderr, "ERROR!!!  MkStrCpy() -- no malloc() space");
+	exit(1);
+    }
+    (void) strcpy(rp, src);
+    return(rp);
+}
+
+
+/*
+ * PrtMsg() -- print message
+ */
+
+void
+PrtMsg(mp, pn)
+    char *mp;				/* message pointer -- may be NULL to
+					 * trigger space prefix initialization
+					 */
+    char *pn;				/* program name */
+{
+    static int pfxlen = -1;		/* prefix length, based on program */
+					/* name -- computed on first call
+					 * when pfxlen == -1 */
+    static char *pfx = (char *)NULL;	/* prefix (spaces) */
+    int ti;				/* temporary index */
+
+    if (pfxlen == -1) {
+
+    /*
+     * This is the first call.  Compute the prefix length and build the
+     * prefix.
+     */
+	if (!pn)
+	    pfxlen = 0;
+	else
+	    pfxlen = (int)(strlen(pn));
+	pfxlen += (int)strlen(" ... ");
+	if (!(pfx = (char *)malloc(pfxlen + 1))) {
+	    (void) printf( "ERROR!!!  not enough space for %d space prefix\n",
+		pfxlen);
+	    exit(1);
+	}
+	for (ti = 0; ti < pfxlen; ti++) {
+	    pfx[ti] = ' ';
+	}
+	pfx[pfxlen] = '\0';
+	MsgStat = 0;
+    }
+/*
+ * Process the message.
+ */
+    if (MsgStat)
+	(void) printf("%s", pfx);
+    if (mp && *mp) {
+	(void) printf("%s\n", mp);
+	MsgStat = 1;
+    }
+}
+
+
+/*
+ * PrtMsgX() -- print message and exit
+ */
+
+void
+PrtMsgX(mp, pn, f, xv)
+    char *mp;				/* message pointer */
+    char *pn;				/* program name */
+    void (*f)();			/* clean-up function pointer */
+    int xv;				/* exit value */
+{
+    if (mp)
+	PrtMsg(mp, pn);
+    if (f)
+	(void) (*f)();
+    (void) LTlibClean();
+    exit(xv);
+}
+
+
+/*
+ * RdFrLsof() -- read from lsof
+ */
+
+LTfldo_t *
+RdFrLsof(nf, em)
+    int *nf;				/* number of fields receiver */
+    char **em;				/* error message pointer receiver */
+{
+    char buf[2048];			/* temporary buffer */
+    int bufl = (int)sizeof(buf);	/* size of buf[] */
+    char *blim = &buf[bufl - 1];	/* buf[] limit (last character
+					 * address) */
+    char *fsp;				/* field start pointer */
+    char *tcp;				/* temporary character pointer */
+    LTfldo_t *tfop;			/* temporary field output pointer */
+    int ti;				/* temporary index */
+    int tlen;				/* remporary length */
+    char *vp;				/* value character pointer */
+/*
+ * Check for errors.
+ */
+    if (!em)
+	return((LTfldo_t *)NULL);
+    if (!nf) {
+	*em = "ERROR!!!  RdFrLsof() not given a count return pointer";
+	return((LTfldo_t *)NULL);
+    }
+    *em = (char *)NULL;
+    *nf = 0;
+/*
+ * If fields are in use, release their resources.
+ */
+    for (ti = 0, tfop = Fo; (ti < Ufo); ti++, tfop++) {
+	if (tfop->v)
+	    (void) free((void *)tfop->v);
+    }
+    Ufo = 0;
+/*
+ * Read a line from lsof.
+ */
+    if (!fgets(buf, bufl - 2, LsofFs)) {
+
+    /*
+     * An lsof pipe EOF has been reached.  Indicate that with a NULL
+     * pointer return, coupled with a NULL error message return pointer
+     * (set above), and a field count of zero (set above).
+     */
+	return((LTfldo_t *)NULL);
+    }
+/*
+ * Parse the lsof line, allocating field output structures as appropriate.
+ *
+ * It is expected that fields will end in a NUL ('\0') or a NL ('\0') and
+ * that a NL ends all fields in the lsof line.
+ */
+    for (tcp = buf, Ufo = 0; (*tcp != '\n') && (tcp < blim); tcp++) {
+
+    /*
+     * Start a new field.  The first character is the LSOF_FID_*.
+     *
+     * First allocate an LTfldo_t structure.
+     */
+	if (Ufo >= Afo) {
+
+	/*
+	 * More LTfldo_t space is required.
+	 */
+	     Afo += LT_FLDO_ALLOC;
+	     tlen = (int)(Afo * sizeof(LTfldo_t));
+	     if (Fo)
+		Fo = (LTfldo_t *)realloc(Fo, tlen);
+	     else
+		Fo = (LTfldo_t *)malloc(tlen);
+	    if (!Fo) {
+
+	    /*
+	     * A serious error has occurred; no LTfldo_t space is available.
+	     */
+		(void) snprintf(buf, bufl,
+		    "ERROR!!!  RdFrLsof() can't allocate %d pointer bytes",
+		    tlen);
+		*em = MkStrCpy(buf, &ti);
+		*nf = -1;
+		return((LTfldo_t *)NULL);
+	    }
+	}
+	tfop = Fo + Ufo;
+	tfop->v = (char *)NULL;
+	Ufo++;
+    /*
+     * Save the LSOF_FID_* character.  Then compute the field value length,
+     * and make a copy of it.
+     */
+	tfop->ft = *tcp++;
+	fsp = tcp;
+	tlen = 0;
+	while (*tcp && (*tcp != '\n') && (tcp < blim)) {
+	     tcp++;
+	     tlen++;
+	}
+	if (!(vp = (char *)malloc(tlen + 1))) {
+
+	/*
+	 * A serious error has occurred; there's no space for the field value.
+	 */
+	    (void) snprintf(buf, bufl,
+		"ERROR!!!  RdFrLsof() can't allocate %d field bytes", tlen + 1);
+	    *em = MkStrCpy(buf, &ti);
+	    *nf = -1;
+	    return((LTfldo_t *)NULL);
+	}
+	(void) memcpy((void *)vp, (void *)fsp, tlen);
+	vp[tlen] = '\0';
+	tfop->v = vp;
+	if (*tcp == '\n')
+	    break;
+	if (tcp >= blim) {
+
+	/*
+	 * The lsof line has no NL terminator; that's an error.
+	 */
+	    *em = "ERROR!!! RdFrLsof() didn't find a NL";
+	    *nf = -1;
+	    return((LTfldo_t *)NULL);
+	}
+    }
+/*
+ * The end of the lsof line has been reached.  If no fields were assembled,
+ * return an error indicate.  Otherwise return the fields and their count.
+ */
+    if (!Ufo) {
+	*em = "ERROR!!! RdFrLsof() read an empty lsof line";
+	*nf = -1;
+	return((LTfldo_t *)NULL);
+    }
+    *nf = Ufo;
+    *em = (char *)NULL;
+    return(Fo);
+}
+
+
+/*
+ * ScanArg() -- scan arguments
+ */
+
+int
+ScanArg(ac, av, opt, pn)
+    int ac;				/* argument count */
+    char *av[];				/* argument pointers */
+    char *opt;				/* option string */
+    char *pn;				/* program name */
+{
+    char *em;				/* pointer to error message returned by
+					 * GetOpt() */
+    char embf[2048];			/* error message buffer */
+    int rv = 0;				/* return value */
+    int tc;				/* temporary character value */
+/*
+ * Preset possible argument values.
+ */
+    LTopt_h = 0;
+    if (LTopt_p) {
+	(void) free((void *)LTopt_p);
+	LTopt_p = (char *)NULL;
+    }
+/*
+ * Process the options according to the supplied option string.
+ */
+    while ((tc = GetOpt(ac, av, opt, &em, pn)) != EOF) {
+	if (em) {
+	    rv = 1;
+	    PrtMsg(em, pn);
+	    continue;
+	}
+	switch (tc) {
+	case 'h':
+	    LTopt_h = 1;
+	    break;
+	case 'p':
+	    if (!GOv || *GOv == '-' || *GOv == '+') {
+		rv = 1;
+		(void) PrtMsg("ERROR!!!  -p not followed by a path", pn);
+	    } else
+		LTopt_p = GOv;
+	    break;
+	default:
+	    rv = 1;
+	    (void) snprintf(embf, sizeof(embf) - 1,
+		"ERROR!!!  unknown option: %c", tc);
+	    PrtMsg(embf, pn);
+	}
+    }
+    for (; GOx1 < ac; GOx1++) {
+
+    /*
+     * Report extraneous arguments.
+     */
+	rv = 1;
+	(void) snprintf(embf, sizeof(embf) - 1,
+	    "ERROR!!!  extraneous option: \"%s\"", av[GOx1]);
+	PrtMsg(embf, pn);
+    }
+    return(rv);
+}
+
+
+/*
+ * StopLsof() -- stop a running lsof process and close the pipe from it
+ */
+
+void
+StopLsof()
+{
+    pid_t pid;
+
+    if (LsofPid) {
+
+    /*
+     * An lsof child process may be active.  Wait for (or kill) it.
+     */
+	pid = wait3(NULL, WNOHANG, NULL);
+	if (pid != LsofPid) {
+	    (void) kill(LsofPid, SIGKILL);
+	    sleep(2);
+	    pid = wait3(NULL, WNOHANG, NULL);
+	}
+	LsofPid = (pid_t)0;
+    }
+    (void) closepipe();
+}
+
+
+/*
+ * x2dev() -- convert hex string to device number
+ */
+
+static X2DEV_T
+x2dev(x, em)
+    char *x;				/* hex string */
+    char **em;				/* error message receiver */
+{
+    char buf[2048];			/* temporary message buffer */
+    int c;				/* character holder */
+    X2DEV_T dev;			/* device number result */
+    char *wx;				/* working hex string pointer */
+    int xl;				/* hex string length */
+
+    if (!x || !*x) {
+	*em = "ERROR!!!  no hex string supplied to x2dev()";
+	return(0);
+    }
+    wx = strncasecmp(x, "0x", 2) ? x : (x + 2);
+    if (((xl = (int)strlen(wx)) < 1) || (xl > XDINDEV)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  x2dev(\"%s\") bad length: %d", x, xl + 2);
+	buf[sizeof(buf) - 1] = '\0';
+	*em = MkStrCpy(buf, &c);
+	return(0);
+    }
+/*
+ * Assemble the device number result from the hex string.
+ */
+    for (dev = (X2DEV_T)0; *wx; wx++) {
+	if (isdigit((unsigned char)*wx)) {
+	    dev = (dev << 4) | (unsigned int)(((int)*wx - (int)'0') & 0xf);
+	    continue;
+	}
+	c = (int) tolower((unsigned char)*wx);
+	if ((c >= (int)'a') && (c <= (int)'f')) {
+	    dev = (dev << 4) | (unsigned int)((c - 'a' + 10) & 0xf);
+	    continue;
+	}
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  x2dev(\"%s\") non-hex character: %c", x, c);
+	*em = MkStrCpy(buf, &c);
+    }
+/*
+ * Return result and no error indication.
+ */
+    *em = (char *)NULL;
+    return(dev);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTlock.c b/lsof_4.85/lsof_4.85_src/tests/LTlock.c
new file mode 100644
index 0000000..04bf649
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTlock.c
@@ -0,0 +1,769 @@
+/*
+ * LTlock.c -- Lsof Test locking tests
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+
+#if	defined(LT_DIAL_aix)
+/*
+ * AIX-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_aix) */
+
+
+#if	defined(LT_DIAL_bsdi)
+/*
+ * BSDI-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_bsdi) */
+
+
+#if	defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific items
+ */
+
+/*
+ * There is no Darwin USE_* definition, because lock support in lsof for
+ * Darwin is inadequate for this test.
+ */
+#endif	/* defined(LT_DIAL_darwin) */
+
+
+#if	defined(LT_DIAL_du)
+/*
+ * DEC_OSF/1|Digital_UNIX|Tru64_UNIX-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_du) */
+
+
+#if	defined(LT_DIAL_freebsd)
+/*
+ * FreeBSD-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_freebsd) */
+
+
+#if	defined(LT_DIAL_linux)
+/*
+ * Linux-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_linux) */
+
+
+#if	defined(LT_DIAL_netbsd)
+/*
+ * NetBSD-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_netbsd) */
+
+
+#if	defined(LT_DIAL_openbsd)
+/*
+ * OpenBSD-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_openbsd) */
+
+
+#if	defined(LT_DIAL_hpux)
+/*
+ * HP-UX-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_hpux) */
+
+
+#if	defined(LT_DIAL_ns)
+/*
+ * NEXTSTEP-specific items
+ */
+
+#define	USE_FLOCK
+#endif	/* defined(LT_DIAL_ns) */
+
+
+#if	defined(LT_DIAL_osr)
+/*
+ * OSR-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_osr) */
+
+
+#if	defined(LT_DIAL_ou)
+/*
+ * OpenUNIX-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_ou) */
+
+
+#if	defined(LT_DIAL_openbsd)
+/*
+ * OpenBSD-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_openbsd) */
+
+
+#if	defined(LT_DIAL_solaris)
+/*
+ * Solaris-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(solaris) */
+
+
+#if	defined(LT_DIAL_uw)
+/*
+ * UnixWare-specific items
+ */
+
+#define	USE_FCNTL
+#endif	/* defined(LT_DIAL_uw) */
+
+
+#if	!defined(USE_FLOCK) && !defined(USE_FCNTL)
+/*
+ * Here begins the version of this program for dialects that don't support
+ * flock() or fcntl() locking.
+ */
+
+
+/*
+ * Main program for dialects that don't support flock() of fcntl() locking.
+ */
+
+int
+main(argc, argv)
+	int argc;			/* argument count */
+	char *argv[];			/* arguments */
+{
+    char *pn;			/* program name */
+/*
+ * Get program name and issue error message.
+ */
+    if ((pn = (char *)strrchr(argv[0], '/')))
+	pn++;
+    else
+	pn = argv[0];
+    (void) printf("%s ... %s\n", pn, LT_DONT_DO_TEST);
+    return(0);
+}
+#else	/* defined(USE_FLOCK) || defined(USE_FCNTL) */
+
+
+/*
+ * Local definitions
+ */
+
+#define	FULL_EX_LOCK	0	/* get a full file exclusive lock */
+#define	FULL_SH_LOCK	1	/* get a full file shared lock */
+#define	PART_EX_LOCK	2	/* get a partial file exclusive lock */
+#define	PART_SH_LOCK	3	/* get a partial file shared lock */
+
+
+/*
+ * Globals
+ */
+
+int Fd = -1;			/* test file descriptor; open if >= 0 */
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Path = (char *)NULL;	/* test file path; none if NULL */
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *lkfile,(int ty));
+_PROTOTYPE(static char *tstwlsof,(char *opt, char *xlk));
+_PROTOTYPE(static char *unlkfile,(int ty));
+
+
+/*
+ * Main program for dialects that support locking tests.
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    char *em;				/* error message pointer */
+    int ti;				/* temporary index */
+    char *tcp;				/* temporary character pointer */
+    int tlen;				/* temporary length -- e.g., as
+					 * returned by MkStrCpy() */
+    char *tstR = (char *)NULL;		/* "R" lock test result */
+    char *tstr = (char *)NULL;		/* "r" lock test result */
+    char *tstW = (char *)NULL;		/* "W" lock test result */
+    char *tstw = (char *)NULL;		/* "w" lock test result */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    (void) PrtMsg((char *)NULL, Pn);
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "hp:", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg ("usage: [-h] [-p path]", Pn);
+	(void) PrtMsg ("       -h       print help (this panel)", Pn);
+	(void) PrtMsgX("       -p path  define test file path", Pn, cleanup,
+		       xv);
+    }
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * If a path was supplied in an "-p path" option, use it.  Otherwise construct
+ * a path in the CWD.
+ */
+    if (!(Path = LTopt_p)) {
+	(void) snprintf(buf, sizeof(buf), "./config.LTlock%ld",
+	(long)MyPid);
+	buf[sizeof(buf) - 1] = '\0';
+	Path = MkStrCpy(buf, &tlen);
+    }
+/*
+ * Fill buffer for writing to the test file.
+ */
+    for (ti = 0; ti < sizeof(buf); ti++) {
+	buf[ti] = (char)(ti & 0xff);
+    }
+/*
+ * Open a new test file at the specified path.
+ */
+    (void) unlink(Path);
+    if ((Fd = open(Path, O_RDWR|O_CREAT, 0600)) < 0) {
+	(void) fprintf(stderr, "ERROR!!!  can't open %s\n", Path);
+
+print_file_error:
+
+	MsgStat = 1;
+	(void) snprintf(buf, sizeof(buf) - 1, "      Errno %d: %s",
+	    errno, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Write a buffer load at the beginning of the file.
+ */
+    if (write(Fd, buf, sizeof(buf)) != sizeof(buf)) {
+	(void) fprintf(stderr,
+	    "ERROR!!!  can't write %d bytes to the beginning of %s\n",
+	    (int)sizeof(buf), Path);
+	goto print_file_error;
+    }
+/*
+ * Fsync() the file.
+ */
+    if (fsync(Fd)) {
+	(void) fprintf(stderr, "ERROR!!!  can't fsync %s\n", Path);
+	goto print_file_error;
+    }
+/*
+ * Quit (with a hint) if the test file is on an NFS file system.
+ */
+    if (!tstwlsof("-wNa", " ")) {
+	(void) printf("ERROR!!!  %s is NFS-mounted.\n", Path);
+	MsgStat = 1;
+	(void) PrtMsg ("Lsof can't report lock information on files that", Pn);
+	(void) PrtMsg ("are located on file systems mounted from a remote", Pn);
+	(void) PrtMsg ("NFS server.\n", Pn);
+        (void) PrtMsg ("Hint: try using \"-p path\" to supply a path in a", Pn);
+        (void) PrtMsg ("non-NFS file system.\n", Pn);
+	(void) PrtMsgX("See 00FAQ and 00TEST for more information.", Pn,
+		       cleanup, 1);
+    }
+/*
+ * Get an exclusive lock on the entire file and test it with lsof.
+ */
+    if ((em = lkfile(FULL_EX_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((tstW = tstwlsof("-w", "W")))
+	(void) PrtMsg(tstW, Pn);
+/*
+ * Get a shared lock on the entire file and test it with lsof.
+ */
+    if ((em = unlkfile(FULL_EX_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = lkfile(FULL_SH_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((tstR = tstwlsof("-w", "R")))
+	(void) PrtMsg(tstR, Pn);
+
+# if	defined(USE_FLOCK)
+/*
+ * If using flock(), skip the byte lock tests.
+ */
+    tstr = tstw = (char *)NULL;
+# endif	/* defined(USE_FLOCK) */
+
+# if	defined(USE_FCNTL)
+/*
+ * If using fcntl(), do exclusive and shared byte lock tests,
+ */
+    if ((em = unlkfile(FULL_SH_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = lkfile(PART_EX_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((tstw = tstwlsof("-w", "w")))
+	(void) PrtMsg(tstw, Pn);
+    if ((em = unlkfile(PART_EX_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = lkfile(PART_SH_LOCK)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((tstr = tstwlsof("-w", "r")))
+	(void) PrtMsg(tstr, Pn);
+# endif	/* defined(USE_FCNTL) */
+
+/*
+ * Compute exit value and exit.
+ */
+    if (tstr || tstR || tstw || tstW) {
+	tcp = (char *)NULL;
+	xv = 1;
+    } else {
+	tcp = "OK";
+	xv = 0;
+    }
+    (void) PrtMsgX(tcp, Pn, cleanup, xv);
+    return(0);
+}
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+    if (Fd >= 0) {
+	(void) close(Fd);
+	Fd = -1;
+	if (Path) {
+	    (void) unlink(Path);
+	    Path = (char *)NULL;
+	}
+    }
+}
+
+
+/* 
+ * lkfile() -- lock the test file
+ */
+
+static char *
+lkfile(ty)
+    int ty;				/* a *_*_LOCK requested */
+{
+    char buf[2048];			/* temporary buffer */
+    int ti;				/* temporary integer */
+
+# if	defined(USE_FLOCK)
+    int flf;				/* flock() function */
+# endif	/* defined(USE_FLOCK) */
+
+# if	defined(USE_FCNTL)
+    struct flock fl;			/* flock control structure */
+/*
+ * Check fcntl() lock request.
+ */
+    (void) memset((void *)&fl, 0, sizeof(fl));
+    switch(ty) {
+    case FULL_EX_LOCK:
+	fl.l_type = F_WRLCK;
+	break;
+    case FULL_SH_LOCK:
+	fl.l_type = F_RDLCK;
+	break;
+    case PART_EX_LOCK:
+	fl.l_type = F_WRLCK;
+	fl.l_len = (off_t)1;
+	break;
+    case PART_SH_LOCK:
+	fl.l_type = F_RDLCK;
+	fl.l_len = (off_t)1;
+	break;
+    default:
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  unknown lock type: %d", ty);
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+/*
+ * Lock test file with fcntl().
+ */
+    if (fcntl(Fd, F_SETLK, &fl) != -1)
+	return((char *)NULL);
+    (void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  fcntl() lock error: %s",
+	strerror(errno));
+    buf[sizeof(buf) - 1] = '\0';
+    return(MkStrCpy(buf, &ti));
+# endif	/* defined(USE_FCNTL) */
+
+# if	defined(USE_FLOCK)
+/*
+ * Check flock() lock request.
+ */
+    switch(ty) {
+    case FULL_EX_LOCK:
+	flf = LOCK_EX;
+	break;
+    case FULL_SH_LOCK:
+	flf = LOCK_SH;
+	break;
+    case PART_EX_LOCK:
+    case PART_SH_LOCK:
+	return("ERROR!!!  flock() doesn't support partial locks");
+	break;
+    default:
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  unknown flock() type: %d", ty);
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+/*
+ * Acquire lock.
+ */
+    if (!flock(Fd, flf))
+	return((char *)NULL);
+    (void) snprintf(buf, sizeof(buf) - 1,
+	"ERROR!!!  flock() %s lock failed: %s",
+	(flf == LOCK_EX) ? "exclusive" : "shared",
+	strerror(errno));
+    buf[sizeof(buf) - 1] = '\0';
+    return(MkStrCpy(buf, &ti));
+# endif	/* defined(USE_FLOCK) */
+
+}
+
+
+/*
+ * tstwlsof() -- test the open file with lsof
+ */
+
+static char *
+tstwlsof(opt, xlk)
+    char *opt;				/* extra lsof options */
+    char *xlk;				/* expected lock value */
+{
+    char buf[2048];			/* temporary buffer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTfldo_t *devp;			/* device pointer */
+    char *cem;				/* current error message pointer */
+    int ff = 0;				/* file found status */
+    LTfldo_t *fop;			/* field output pointer */
+    LTfldo_t *inop;			/* inode number pointer */
+    LTfldo_t *lkp;			/* lock pointer */
+    LTdev_t lsofdc;			/* lsof device components */
+    int nf;				/* number of fields */
+    LTfldo_t *nmp;			/* file name pointer */
+    char *opv[4];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    struct stat sb;			/* stat(2) buffer */
+    LTdev_t stdc;			/* stat(2) device components */
+    char *tcp;				/* temporary character pointer */
+    int ti;				/* temporary integer */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Make sure there is an expected lock value.
+ */
+    if (!xlk || !*xlk)
+	(void) PrtMsgX("ERROR!!!  no expected lock value", Pn, cleanup, 1);
+/*
+ * Get test file's information.
+ */
+    if (stat(Path, &sb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't stat(2) %s: %s", Path, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Extract components from test file's device number.
+ */
+    if ((cem = ConvStatDev(&sb.st_dev, &stdc)))
+	(void) PrtMsgX(cem, Pn, cleanup, 1);
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    ti = 0;
+    if (opt && *opt)
+	opv[ti++] = opt;
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    opv[ti++] = Path;
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv)))
+	return(cem);
+/*
+ * Read lsof output.
+ */
+    while (!ff && (fop = RdFrLsof(&nf, &cem))) {
+	if (cem) {
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != MyPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Make sure its number matches the
+	 * test file's descriptor number.
+	 *
+	 * Scan for lock and name fields.
+	 */
+	    if (!pids)
+		break;
+	    for (ti = 0, tcp = fop->v; *tcp; tcp++) {
+
+	    /*
+	     * Convert file descriptor to a number.
+	     */
+		if (*tcp == ' ')
+		    continue;
+		if (((int)*tcp < (int)'0') || ((int)*tcp > (int)'9')) {
+		    ti = -1;
+		    break;
+		}
+		ti = (ti * 10) + (int)*tcp - (int)'0'; 
+	    }
+	    if (Fd != ti)
+		break;
+	    devp = inop = lkp = nmp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch(fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_LOCK:
+		    lkp = fop;
+		    break;
+		case LSOF_FID_NAME:
+		    nmp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the results of the file descriptor field scan.
+	 *
+	 * (Don't compare path names because of symbolic link interference.)
+	 */
+	    if (!devp || !inop || !nmp || !typ)
+		break;
+	    if (strcasecmp(typ->v, "reg") && strcasecmp(typ->v, "vreg"))
+		break;
+	    if (ConvLsofDev(devp->v, &lsofdc))
+		break;
+	    if ((stdc.maj != lsofdc.maj)
+	    ||  (stdc.min != lsofdc.min)
+	    ||  (stdc.unit != lsofdc.unit))
+		break;
+	    (void) snprintf(buf, sizeof(buf) - 1, "%u",
+		(unsigned int)sb.st_ino);
+	    buf[sizeof(buf) - 1] = '\0';
+	    if (strcmp(inop->v, buf))
+		break;
+	/*
+	 * The specified file has been located.  Check its lock status.
+	 */
+	    ff = 1;
+	    if (!lkp || strcmp(lkp->v, xlk)) {
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "lock mismatch: expected %s, got \"%s\"", xlk,
+		    lkp ? lkp->v : "(none)");
+		pem = MkStrCpy(buf, &ti);
+	    }
+	    break;
+	}
+    }
+    (void) StopLsof();
+    if (!ff) {
+	if (pem)
+	   (void) PrtMsg(pem, Pn);
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "lock test file %s not found by lsof", Path);
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+    return(pem);
+}
+
+
+/*
+ * unlkfile() -- unlock the test file
+ */
+
+static char *
+unlkfile(ty)
+    int ty;				/* current *_*_LOCK lock typ */
+{
+    char buf[2048];			/* temporary buffer */
+    int ti;				/* temporary integer */
+
+# if	defined(USE_FCNTL)
+    struct flock fl;			/* flock control structure */
+/*
+ * Check current fcntl() lock type.
+ */
+    (void) memset((void *)&fl, 0, sizeof(fl));
+    switch(ty) {
+    case FULL_EX_LOCK:
+    case FULL_SH_LOCK:
+	break;
+    case PART_EX_LOCK:
+    case PART_SH_LOCK:
+	fl.l_len = (off_t)1;
+	break;
+    default:
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  unknown unlock type: %d", ty);
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+/*
+ * Unlock test file with fcntl().
+ */
+    fl.l_type = F_UNLCK;
+    if (fcntl(Fd, F_SETLK, &fl) != -1)
+	return((char *)NULL);
+    (void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  fcntl() unlock error: %s",
+	strerror(errno));
+    buf[sizeof(buf) - 1] = '\0';
+    return(MkStrCpy(buf, &ti));
+# endif	/* defined(USE_FCNTL) */
+
+# if	defined(USE_FLOCK)
+/*
+ * Check current flock() lock type.
+ */
+    switch(ty) {
+    case FULL_EX_LOCK:
+    case FULL_SH_LOCK:
+	break;
+    default:
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!   unknown unlock type: %s", ty);
+	buf[sizeof(buf) - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+/*
+ * Unlock file with flock().
+ */
+    if (!flock(Fd, LOCK_UN))
+	return((char *)NULL);
+    (void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  flock() unlock error: %s",
+	strerror(errno));
+    return(MkStrCpy(buf, &ti));
+# endif	/* defined(USE_FLOCK) */
+
+}
+#endif	/* !defined(USE_FLOCK) && !defined(USE_FCNTL) */
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTnfs.c b/lsof_4.85/lsof_4.85_src/tests/LTnfs.c
new file mode 100644
index 0000000..1d20b1b
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTnfs.c
@@ -0,0 +1,531 @@
+/*
+ * LTnfs.c -- Lsof Test NFS tests
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+
+/*
+ * Pre-definitions that may be revoked by specific dialects
+ */
+
+#define	DO_TEST				/* do the test */
+
+
+#if	defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific items
+ */
+
+# if LT_VERS<800
+#undef	DO_TEST
+# endif	/* LT_VERS<800 */
+#endif	/* defined(LT_DIAL_darwin) */
+
+
+/*
+ * Globals
+ */
+
+int Fd = -1;			/* test file descriptor; open if >= 0 */
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+int NFstat = 0;			/* NFS file status: 0 == closed
+				 *		    1 == not created by this
+				 *			 these and must not be
+				 *			 unlinked
+				 *		    2 == created by this test
+				 *			 and must be unlinked
+				 */
+char *Path = (char *)NULL;	/* test file path; none if NULL */
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *FindNFSfile,(int *ff, char *szbuf));
+
+
+/*
+ * Main program
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    char *em;				/* error message pointer */
+    int ff;				/* FindNFSfile() file-found flag */
+    int sz;				/* file size (if created) */
+    char szbuf[32];			/* created test file size in ASCII */
+    int ti;				/* temporary index */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+
+#if	!defined(DO_TEST)
+/*
+ * If the dialect has disabled the test, echo that result and exit with
+ * a successful return code.
+ */
+    (void) PrtMsgX(LT_DONT_DO_TEST, Pn, cleanup, 0);
+#endif	/* !defined(DO_TEST) */
+
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "hp:", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h] [-p path]", Pn);
+	PrtMsg       ("       -h       print help (this panel)", Pn);
+	PrtMsgX      ("       -p path  define test file path", Pn, cleanup, xv);
+    }
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Process the file path and open it.
+ */
+    if ((Path = LTopt_p)) {
+
+    /*
+     * The file path was supplied.  Open the file read-only.
+     */
+	if ((Fd = open(Path, O_RDONLY, 0400)) < 0) {
+	    (void) fprintf(stderr, "ERROR!!!  can't read-only open %s\n",
+		Path);
+	    goto print_file_error;
+	}
+    /*
+     * Record that an existing file is being used.  Clear its ASCII size.
+     */
+	NFstat = 1;
+	szbuf[0] = '\0';
+    } else {
+
+    /*
+     * The file path wasn't supplied with -p, so generate one.
+     */
+	(void) snprintf(buf, sizeof(buf) - 1, "./config.LTnfs%ld",
+	    (long)MyPid);
+	buf[sizeof(buf) - 1] = '\0';
+	Path = MkStrCpy(buf, &ti);
+    /*
+     * Open a new test file at the specified path.
+     */
+	(void) unlink(Path);
+	if ((Fd = open(Path, O_RDWR|O_CREAT, 0600)) < 0) {
+	    (void) fprintf(stderr, "ERROR!!!  can't create %s\n", Path);
+
+print_file_error:
+
+	    MsgStat = 1;
+	    (void) snprintf(buf, sizeof(buf) - 1, "      Errno %d: %s",
+		errno, strerror(errno));
+	    buf[sizeof(buf) - 1] = '\0';
+	    (void) PrtMsgX(buf, Pn, cleanup, 1);
+	}
+	NFstat = 2;
+    /*
+     * Write the test file to its expected size.
+     */
+	sz = sizeof(buf);
+	for (ti = 0; ti < sz; ti++) {
+	    buf[ti] = (char)(ti & 0xff);
+	}
+	if (write(Fd, buf, sz) != sz) {
+	    (void) fprintf(stderr, "ERROR!!!  can't write %d bytes to %s\n",
+		sz, Path);
+	    goto print_file_error;
+	}
+    /*
+     * Fsync() the file.
+     */
+	if (fsync(Fd)) {
+	    (void) fprintf(stderr, "ERROR!!!  can't fsync %s\n", Path);
+	    goto print_file_error;
+	}
+   /*
+    * Convert the file size to ASCII.
+    */
+	(void) snprintf(szbuf, sizeof(szbuf) - 1, "%d", sz);
+	szbuf[sizeof(szbuf) - 1] = '\0';
+    }
+/*
+ * Make sure the test file can be found on an NFS file system.
+ */
+    if ((em = FindNFSfile(&ff, szbuf))) {
+
+    /*
+     * Print the error message returned by FindNFSfile().
+     */
+	(void) PrtMsg(em, Pn);
+	if (!ff) {
+
+	/*
+	 * If the file couldn't be found, print hints.
+	 */
+	    if (NFstat == 1) {
+		(void) PrtMsg(
+		    "Hint: this test must be able to open for read access",
+		    Pn);
+		(void) PrtMsg(
+		    "the file at the path supplied with the -p option and",
+		    Pn);
+		(void) PrtMsg(
+		    "that file must be a regular file (not a directory) on",
+		    Pn);
+		(void) PrtMsg(
+		    "an NFS file system.\n",
+		    Pn);
+		(void) PrtMsgX(
+		    "See 00FAQ and 00TEST for more information.",
+		    Pn, cleanup, 1);
+	    } else if (NFstat == 2) {
+		(void) PrtMsg(
+		    "Hint: the temporary path generated by this test might",
+		    Pn);
+		(void) PrtMsg(
+		    "not be on an NFS file system, or this test might be",
+		    Pn);
+		(void) PrtMsg(
+		    "unable to create a file on the NFS file system.\n",
+		    Pn);
+		(void) PrtMsg(
+		    "As a work-around use the -p option to specify a path to",
+		    Pn);
+		(void) PrtMsg(
+		    "a regular file (not a directory) on an NFS file system",
+		    Pn);
+		(void) PrtMsg(
+		    "to which this test will have read access.\n",
+		    Pn);
+		(void) PrtMsgX(
+		    "See 00FAQ and 00TEST for more information.",
+		    Pn, cleanup, 1);
+	    }
+	}
+    }
+/*
+ * Exit successfully.
+ */
+    (void) PrtMsgX("OK", Pn, cleanup, 0);
+    return(0);
+}
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+    if (Fd >= 0) {
+	(void) close(Fd);
+	Fd = -1;
+	if (Path) {
+	    if (NFstat == 2)
+		(void) unlink(Path);
+	    Path = (char *)NULL;
+	}
+    }
+}
+
+
+/*
+ * FindNFSfile() -- find the NFS file with lsof
+ */
+
+static char *
+FindNFSfile(ff, szbuf)
+    int *ff;				/* file-found response receptor */
+    char *szbuf;			/* expected file size in ASCII (if
+					 * the file was created by this test */
+{
+    char buf[2048];			/* temporary buffer */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTfldo_t *devp;			/* device pointer */
+    LTfldo_t *fop;			/* field output pointer */
+    char ibuf[64];			/* inode number buffer */
+    LTfldo_t *inop;			/* inode number pointer */
+    LTdev_t lsofdc;			/* lsof device components */
+    int nf;				/* number of fields */
+    char nlkbuf[32];			/* link count buffer */
+    LTfldo_t *nlkp;			/* nlink pointer */
+    char *opv[5];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    struct stat sb;			/* stat(2) buffer */
+    LTdev_t stdc;			/* stat(2) device components */
+    LTfldo_t *szp;			/* size pointer */
+    char *tcp;				/* temporary character pointer */
+    int ti;				/* temporary integer */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Check the argument pointers.
+ *
+ * Set the file-found response false.
+ */
+    if (!ff || !szbuf)
+	(void) PrtMsgX("ERROR!!!  missing argument to FindNFSfile()",
+		       Pn, cleanup, 1);
+    *ff = 0;
+/*
+ * Get test file's information.
+ */
+    if (stat(Path, &sb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't stat(2) %s: %s", Path, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Extract components from test file's stat buffer.
+ */
+    if ((cem = ConvStatDev(&sb.st_dev, &stdc)))
+	PrtMsgX(cem, Pn, cleanup, 1);
+    (void) snprintf(ibuf, sizeof(ibuf) - 1, "%u", (unsigned int)sb.st_ino);
+    ibuf[sizeof(ibuf) - 1] = '\0';
+    (void) snprintf(nlkbuf, sizeof(nlkbuf) - 1, "%d", (int)sb.st_nlink);
+    nlkbuf[sizeof(nlkbuf) - 1] = '\0';
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    ti = 0;
+    opv[ti++] = "-s";
+    opv[ti++] = "-Na";
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    opv[ti++] = Path;
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv)))
+	return(cem);
+/*
+ * Read lsof output.
+ */
+    while (!*ff && (fop = RdFrLsof(&nf, &cem))) {
+	if (cem) {
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != MyPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Make sure its number matches the
+	 * test file's descriptor number.
+	 */
+	    if (!pids)
+		break;
+	    for (ti = 0, tcp = fop->v; *tcp; tcp++) {
+
+	    /*
+	     * Convert file descriptor to a number.
+	     */
+		if (*tcp == ' ')
+		    continue;
+		if (((int)*tcp < (int)'0') || ((int)*tcp > (int)'9')) {
+		    ti = -1;
+		    break;
+		}
+		ti = (ti * 10) + (int)*tcp - (int)'0'; 
+	    }
+	    if (Fd != ti)
+		break;
+	/*
+	 * Scan for device, inode, nlink, offset, size and type fields.
+	 */
+	    devp = inop = nlkp, szp = typ = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_NLINK:
+		    nlkp = fop;
+		    break;
+		case LSOF_FID_OFFSET:
+		    break;
+		case LSOF_FID_SIZE:
+		    szp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the device, inode, and type of the file.
+	 */
+	    if (!devp || !inop || !typ)
+		break;
+	    if (strcasecmp(typ->v, "reg") && strcasecmp(typ->v, "vreg"))
+		break;
+	    if ((cem = ConvLsofDev(devp->v, &lsofdc))) {
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if ((stdc.maj != lsofdc.maj)
+	    ||  (stdc.min != lsofdc.min)
+	    ||  (stdc.unit != lsofdc.unit)
+	    ||  strcmp(inop->v, ibuf)
+	    ) {
+		break;
+	    }
+	/*
+	 * Indicate the file was found.
+	 */
+	    *ff = 1;
+	/*
+	 * Check the link count.
+	 */
+	    if (!nlkp) {
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "ERROR!!!  lsof didn't report a link count for %s", Path);
+		buf[sizeof(buf) - 1] = '\0';
+		cem = MkStrCpy(buf, &ti);
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if (strcmp(nlkp->v, nlkbuf)) {
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "ERROR!!!  wrong link count: expected %s, got %s",
+		    nlkbuf, nlkp->v);
+		buf[sizeof(buf) - 1] = '\0';
+		cem = MkStrCpy(buf, &ti);
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	/*
+	 * If the file was created by this test, check its size.
+	 */
+	    if (NFstat == 2) {
+		if (!szp) {
+		    (void) snprintf(buf, sizeof(buf) - 1,
+			"ERROR!!!  lsof didn't report a size for %s", Path);
+		    buf[sizeof(buf) - 1] = '\0';
+		    cem = MkStrCpy(buf, &ti);
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+		if (strcmp(szp->v, szbuf)) {
+		    (void) snprintf(buf, sizeof(buf) - 1,
+			"ERROR!!!  wrong file size: expected %s, got %s",
+			szbuf, szp->v);
+		    buf[sizeof(buf) - 1] = '\0';
+		    cem = MkStrCpy(buf, &ti);
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+	    }
+	/*
+	 * The requested file was located.  Return the previous error message
+	 * pointer.  (It will be NULL if no error was detected.)
+	 */
+	    (void) StopLsof();
+	    return(pem);
+	}
+    }
+/*
+ * The test file wasn't found.
+ */
+    (void) StopLsof();
+    if (pem)
+	(void) PrtMsg(pem, Pn);
+    (void) snprintf(buf, sizeof(buf) - 1,
+	"ERROR!!!  test file %s not found by lsof", Path);
+    buf[sizeof(buf) - 1] = '\0';
+    return(MkStrCpy(buf, &ti));
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTnlink.c b/lsof_4.85/lsof_4.85_src/tests/LTnlink.c
new file mode 100644
index 0000000..7f12e86
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTnlink.c
@@ -0,0 +1,586 @@
+/*
+ * LTnlink.c -- Lsof Test nlink tests
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+
+/*
+ * Pre-definitions that may be changed by specific dialects
+ */
+
+#define	DO_TEST			/* do the test */
+
+
+/*
+ * Dialect-specific items
+ */
+
+
+#if	defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific items
+ */
+
+# if	defined(LT_KMEM)
+#undef	DO_TEST
+# endif	/* defined(LT_KMEM) */
+
+#endif	/* defined(LT_DIAL_darwin) */
+
+/*
+ * Globals
+ */
+
+int Fd = -1;			/* test file descriptor; open if >= 0 */
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Path = (char *)NULL;	/* test file path; none if NULL */
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *FindFile,(char *opt, int *ff, int ie, LTdev_t *tfdc,
+				  char *ibuf, char *xlnk, char *szbuf));
+
+
+/*
+ * Main program
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    int do_unlink = 1;			/* do the unlink test section */
+    char *em;				/* error message pointer */
+    int ff;				/* FindFile() file-found flag */
+    char ibuf[32];			/* inode number in ASCII */
+    char *opt;				/* lsof option */
+    int sz;				/* file size */
+    char szbuf[32];			/* file size in ASCII */
+    LTdev_t tfdc;			/* device components */
+    struct stat tfsb;			/* test file stat(2) buffer */
+    int ti, tj;				/* temporary indexes */
+    char xlnk[32];			/* expected link count in ASCII */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+
+#if	!defined(DO_TEST)
+/*
+ * Quit if lsof for this dialect doesn't support adequate nlink reporting.
+ */
+    (void) PrtMsgX(LT_DONT_DO_TEST, Pn, cleanup, 0);
+#endif	/* !defined(DO_TEST) */
+
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "hp:", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h] [-p path]", Pn);
+	PrtMsg       ("       -h       print help (this panel)", Pn);
+	PrtMsgX      ("       -p path  define test file path", Pn, cleanup, xv);
+    }
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Process the file path.
+ */
+    if (!(Path = LTopt_p)) {
+
+    /*
+     * The file path was not supplied, so make one.
+     */
+	(void) snprintf(buf, sizeof(buf) - 1, "./config.LTnlink%ld",
+	    (long)MyPid);
+	buf[sizeof(buf) - 1] = '\0';
+	Path = MkStrCpy(buf, &ti);
+    }
+/*
+ * Create the test file.
+ */
+    (void) unlink(Path);
+    if ((Fd = open(Path, O_RDWR|O_CREAT, 0600)) < 0) {
+	(void) fprintf(stderr, "ERROR!!!  can't create %s\n", Path);
+
+print_file_error:
+
+	MsgStat = 1;
+	(void) snprintf(buf, sizeof(buf) - 1, "      Errno %d: %s",
+	    errno, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Write the test file to its expected size.
+ */
+    sz = sizeof(buf);
+    for (ti = 0; ti < sz; ti++) {
+	buf[ti] = (char)(ti & 0xff);
+    }
+    if (write(Fd, buf, sz) != sz) {
+	(void) fprintf(stderr, "ERROR!!!  can't write %d bytes to %s\n",
+	    sz, Path);
+	goto print_file_error;
+    }
+/*
+ * Fsync() the file.
+ */
+    if (fsync(Fd)) {
+	(void) fprintf(stderr, "ERROR!!!  can't fsync %s\n", Path);
+	goto print_file_error;
+    }
+/*
+ * Stat(2) the test file.
+ */
+    if (stat(Path, &tfsb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't stat(2) %s: %s", Path, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Set the test file status to open and linked.
+ *
+ * Get the test file's parameters:
+ *
+ *    * device paramters in LTdev_t form;
+ *    * inode number in ASCII;
+ *    * link count in ASCII;
+ *    * file size in ASCII.
+ */
+    if ((em = ConvStatDev(&tfsb.st_dev, &tfdc)))
+	PrtMsgX(em, Pn, cleanup, 1);
+    (void) snprintf(ibuf, sizeof(ibuf) - 1, "%u", (unsigned int)tfsb.st_ino);
+    ibuf[sizeof(szbuf) - 1] = '\0';
+    (void) snprintf(xlnk, sizeof(xlnk) - 1, "%d", (int)tfsb.st_nlink);
+    ibuf[sizeof(szbuf) - 1] = '\0';
+    (void) snprintf(szbuf, sizeof(szbuf) - 1, "%d", sz);
+    szbuf[sizeof(szbuf) - 1] = '\0';
+/*
+ * See if the file is on an NFS file system.
+ */
+    (void) FindFile("-Na", &ff, 1, &tfdc, ibuf, xlnk, szbuf);
+    if (ff) {
+
+    /*
+     * The file was found on an NFS file system.
+     */
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "WARNING!!!  Test file %s is NFS mounted.", Path);
+	(void) PrtMsg(buf, Pn);
+	(void) PrtMsg(
+	    "  As a result this test probably won't be able to unlink it and",
+	    Pn);
+	(void) PrtMsg(
+	    "  find its open and unlinked instance with lsof's +L option.",
+	    Pn);
+	(void) PrtMsg(
+	    "  Therefore, that section of this test has been disabled.\n",
+	    Pn);
+	(void) PrtMsg(
+	    "  Hint: supply a path with the -p option to a file in a non-NFS",
+	    Pn);
+	(void) PrtMsg(
+	    "  file system that this test can write and unlink.\n",
+	    Pn);
+	(void) PrtMsg(
+	    "  See 00FAQ and 00TEST for more information.",
+	    Pn);
+	do_unlink = 0;
+    }
+/*
+ * Find the test file.
+ */
+    if ((em = FindFile("+L", &ff, 0, &tfdc, ibuf, xlnk, szbuf)))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * If the unlink test is enabled, do it.
+ */
+    if (do_unlink) {
+	if (unlink(Path)) {
+	    (void) snprintf(buf, sizeof(buf) - 1,
+		"ERROR!!!  unlink(%s) failed: (%s).", Path, strerror(errno));
+	    buf[sizeof(buf) - 1] = '\0';
+	    (void) PrtMsg(buf, Pn);
+	    (void) snprintf(buf, sizeof(buf) - 1,
+		"  %s may be on a ZFS file system, where it", Path);
+	    buf[sizeof(buf) - 1] = '\0';
+	    (void) PrtMsg(buf, Pn);
+	    (void) snprintf(buf, sizeof(buf) - 1,
+	      "  is not possible for %s to unlink the file it has open.", Pn);
+	    buf[sizeof(buf) - 1] = '\0';
+	    (void) PrtMsg(buf, Pn);
+	    (void) snprintf(buf, sizeof(buf) - 1,
+	      "  To run the %s test, use the \"-p path\" option to specify",
+	      Pn);
+	    buf[sizeof(buf) - 1] = '\0';
+	    (void) PrtMsg(buf, Pn);
+	    (void) PrtMsg(
+	      "  a file on a file system -- e.g., UFS -- that supports unlink",
+	      Pn);
+	    (void) PrtMsg(
+	      "  while the file is open.  Usually /tmp can do that -- e.g.,",
+	      Pn);
+	    (void) snprintf(buf, sizeof(buf) - 1,
+	      "  run the test as \"./%s -p /tmp/<name>\".\n", Pn);
+	    buf[sizeof(buf) - 1] = '\0';
+	    (void) PrtMsg(buf, Pn);
+	    (void) PrtMsgX( "  See 00FAQ and 00TEST for more information.",
+	      Pn, cleanup, 1);
+	}
+	for (opt = "+L1", ti = 0, tj = 30; ti < tj; ti++) {
+
+	/*
+	 * Wait a while for the link count to be updated before concluding
+	 * lsof can't find the unlinked file.  Use "+L1" for only the first
+	 * third of the tries, then switch to "+L".
+	 */
+	    if ((ti + ti + ti) >= tj)
+		opt = "+L";
+	    if (!(em = FindFile(opt, &ff, 0, &tfdc, ibuf, "0", szbuf)))
+		break;
+	    if (ti)
+		(void) printf(".");
+	    else
+		(void) printf("waiting for link count update: .");
+	    (void) fflush(stdout);
+	    (void) sleep(2);
+	}
+	if (ti) {
+
+	/*
+	 * End the delay message.
+	 */
+	    printf("\n");
+	    (void) fflush(stdout);
+	    MsgStat = 1;
+	}
+	if (em)
+	    (void) PrtMsgX(em, Pn, cleanup, 1);
+    }
+/*
+ * Exit successfully.
+ */
+    (void) PrtMsgX("OK", Pn, cleanup, 0);
+    return(0);
+}
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+    if (Fd >= 0) {
+	(void) close(Fd);
+	Fd = -1;
+    }
+    if (Path)
+	(void) unlink(Path);
+}
+
+
+/*
+ * FindFile() -- find a file with lsof
+ */
+
+static char *
+FindFile(opt, ff, ie, tfdc, ibuf, xlnk, szbuf)
+    char *opt;				/* additional lsof options */
+    int *ff;				/* file-found response receptor */
+    int ie;				/* ignore errors if == 1 */
+    LTdev_t *tfdc;			/* test file device components */
+    char *ibuf;				/* inode number in ASCII */
+    char *xlnk;				/* expected link count */
+    char *szbuf;			/* file size in ASCII */
+{
+    char buf[2048];			/* temporary buffer */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTfldo_t *devp;			/* device pointer */
+    LTfldo_t *fop;			/* field output pointer */
+    LTfldo_t *inop;			/* inode number pointer */
+    LTdev_t lsofdc;			/* lsof device components */
+    int nf;				/* number of fields */
+    LTfldo_t *nlkp;			/* nlink pointer */
+    char *opv[4];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    LTfldo_t *szp;			/* size pointer */
+    char *tcp;				/* temporary character pointer */
+    int ti;				/* temporary integer */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Check the argument pointers.
+ *
+ * Set the file-found response false.
+ */
+    if (!ff || !ibuf || !szbuf || !tfdc || !xlnk)
+	(void) PrtMsgX("ERROR!!!  missing argument to FindFile()",
+		       Pn, cleanup, 1);
+    *ff = 0;
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    ti = 0;
+    if (opt && *opt)
+	opv[ti++] = opt;
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    if (strcmp(xlnk, "0"))
+	opv[ti++] = Path;
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv))) {
+ 	if (ie)
+	    return((char *)NULL);
+	return(cem);
+    }
+/*
+ * Read lsof output.
+ */
+    while (!*ff && (fop = RdFrLsof(&nf, &cem))) {
+	if (cem) {
+ 	    if (ie)
+		return((char *)NULL);
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != MyPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Make sure its number matches the
+	 * test file's descriptor number.
+	 */
+	    if (!pids)
+		break;
+	    for (ti = 0, tcp = fop->v; *tcp; tcp++) {
+
+	    /*
+	     * Convert file descriptor to a number.
+	     */
+		if (*tcp == ' ')
+		    continue;
+		if (((int)*tcp < (int)'0') || ((int)*tcp > (int)'9')) {
+		    ti = -1;
+		    break;
+		}
+		ti = (ti * 10) + (int)*tcp - (int)'0'; 
+	    }
+	    if (Fd != ti)
+		break;
+	/*
+	 * Scan for device, inode, nlink, size and type fields.
+	 */
+	    devp = inop = nlkp = szp = typ = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_NLINK:
+		    nlkp = fop;
+		    break;
+		case LSOF_FID_SIZE:
+		    szp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the device, inode, and type of the file.
+	 */
+	    if (!devp || !inop || !szp || !typ)
+		break;
+	    if (strcasecmp(typ->v, "reg") && strcasecmp(typ->v, "vreg"))
+		break;
+	    if ((cem = ConvLsofDev(devp->v, &lsofdc))) {
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if ((tfdc->maj != lsofdc.maj)
+	    ||  (tfdc->min != lsofdc.min)
+	    ||  (tfdc->unit != lsofdc.unit)
+	    ||  strcmp(inop->v, ibuf)
+	    ) {
+		break;
+	    }
+	/*
+	 * Indicate the file was found.
+	 */
+	    *ff = 1;
+	/*
+	 * Check the size and link count.
+	 */
+	    if (!szp) {
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "ERROR!!!  lsof didn't report a file size for %s", Path);
+		buf[sizeof(buf) - 1] = '\0';
+		cem = MkStrCpy(buf, &ti);
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if (strcmp(szp->v, szbuf)) {
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "ERROR!!!  wrong file size: expected %s, got %s",
+		    szbuf, szp->v);
+		buf[sizeof(buf) - 1] = '\0';
+		cem = MkStrCpy(buf, &ti);
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if (!nlkp) {
+		if (strcmp(xlnk, "0")) {
+
+		/*
+		 * If lsof returned no link count and the expected return is
+		 * not "0", it's an error.  Otherwise, interpret no link count
+		 * as equivalent to a "0" link count.
+		 */
+		    (void) snprintf(buf, sizeof(buf) - 1,
+			"ERROR!!!  lsof didn't report a link count for %s",
+			Path);
+		    buf[sizeof(buf) - 1] = '\0';
+		    cem = MkStrCpy(buf, &ti);
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+	    } else {
+		if (strcmp(nlkp->v, xlnk)) {
+		    (void) snprintf(buf, sizeof(buf) - 1,
+			"ERROR!!!  wrong link count: expected %s, got %s",
+			xlnk, nlkp->v);
+		    buf[sizeof(buf) - 1] = '\0';
+		    cem = MkStrCpy(buf, &ti);
+		    if (pem)
+			(void) PrtMsg(pem, Pn);
+		    pem = cem;
+		    break;
+		}
+	    }
+	/*
+	 * The requested file was located.  Return the previous error message
+	 * pointer unless errors are being ignored.  (The previous error
+	 * message pointer  will be NULL if no error was detected.)
+	 */
+	    (void) StopLsof();
+ 	    if (ie)
+		return((char *)NULL);
+	    return(pem);
+	}
+    }
+/*
+ * Clean up and return.
+ */
+    (void) StopLsof();
+    if (!*ff && !ie) {
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  %s test file %s not found by lsof",
+	    strcmp(xlnk, "0") ? "linked" : "unlinked",
+	    Path);
+	buf[sizeof(buf) - 1] = '\0';
+	pem = MkStrCpy(buf, &ti);
+    }
+    if (ie)
+	return((char *)NULL);
+    return(pem);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTsock.c b/lsof_4.85/lsof_4.85_src/tests/LTsock.c
new file mode 100644
index 0000000..16c1025
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTsock.c
@@ -0,0 +1,877 @@
+/*
+ * LTsock.c -- Lsof Test IPv4 sockets
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+#include <netdb.h>
+#include <signal.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <arpa/inet.h>
+
+
+/*
+ * Pre-definitions that make be changed or revoked by dialects
+ */
+
+#define SIGHANDLER_T	void		/* signal handler function type */
+#define	LT_SOCKLEN_T	int		/* socket length type */
+
+
+#if	defined(LT_DIAL_aix)
+/*
+ * AIX-specific items
+ */
+
+#undef	LT_SOCKLEN_T
+#define	LT_SOCKLEN_T	size_t
+#endif	/* defined(LT_DIAL_aix) */
+
+
+#if	defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific items
+ */
+
+# if	LT_VERS>=800
+#undef	LT_SOCKLEN_T
+#define	LT_SOCKLEN_T	socklen_t
+# endif	/* LT_VERS>=800 */
+#endif	/* defined(LT_DIAL_darwin) */
+
+
+#if	defined(LT_DIAL_hpux)
+/*
+ * HP-UX-specific items
+ */
+
+# if	LT_VERS>=1123 && defined(__GNUC__)
+#undef	LT_SOCKLEN_T
+#define	LT_SOCKLEN_T	size_t
+# endif	/* LT_VERS>=1123 && defined(__GNUC__) */
+#endif	/* defined(LT_DIAL_hpux) */
+
+
+#if	defined(LT_DIAL_ou)
+/*
+ * OpenUNIX-specific items
+ */
+
+#undef	LT_SOCKLEN_T
+#define	LT_SOCKLEN_T	size_t
+#endif	/* defined(LT_DIAL_ou) */
+
+
+#if	defined(LT_DIAL_uw)
+/*
+ * UnixWare-specific items
+ */
+
+#undef	LT_SOCKLEN_T
+#define	LT_SOCKLEN_T	size_t
+#endif	/* defined(LT_DIAL_uw) */
+
+
+/*
+ * Local definitions
+ */
+
+#define	ALARMTM		30		/* alarm timer */
+
+#define	LT_CLNT		0		/* child process index */
+#define	LT_SRVR		1		/* parent process index */
+
+#define	LT_FNF		0		/* file not found */
+#define LT_FBYIP	1		/* file found by IP address */
+#define	LT_FBYHN	2		/* file found by host name */
+#define	LT_FBYPORT	4		/* file found by port */
+
+#if	!defined(MAXHOSTNAMELEN)
+#define	MAXHOSTNAMELEN	256		/* maximum host name length */
+#endif	/* !defined(MAXHOSTNAMELEN) */
+
+#if	!defined(MAXPATHLEN)
+#define	MAXPATHLEN	1024		/* maximum path length */
+#endif	/* !defined(MAXPATHLEN) */
+
+
+/*
+ * Local structure definitions.
+ */
+
+
+typedef struct fdpara {		/* file descriptor parameters */
+    int fd;			/* FD */
+    char *fds;			/* FD in ASCII */
+    int ff;			/* file found flags (see LT_F*) */
+    char *host;			/* host name */
+    int hlen;			/* strlen(host) */
+    char *ipaddr;		/* dotted IP address */
+    int ilen;			/* strlen(ipaddr) */
+    pid_t pid;			/* PID of process */
+    char *port;			/* port in ASCII */
+    int plen;			/* strlen(port) */
+    struct sockaddr_in sa;	/* socket's address */
+} fdpara_t;
+
+
+/*
+ * Globals
+ */
+
+pid_t CPid = (pid_t)0;		/* client PID */
+fdpara_t FdPara[2];		/* file descriptor parameters */
+#define	NFDPARA	(sizeof(FdPara) /sizeof(fdpara_t))
+struct sockaddr_in Myad;	/* my (server) socket address */
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Pn = (char *)NULL;	/* program name */
+char *PtNm[] = { "client", "server" };
+				/* program type name */
+int Ssock = -1;			/* server socket */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void CleanupClnt,(void));
+_PROTOTYPE(static void CleanupSrvr,(void));
+_PROTOTYPE(static SIGHANDLER_T HandleClntAlarm,(int sig));
+_PROTOTYPE(static SIGHANDLER_T HandleSrvrAlarm,(int sig));
+_PROTOTYPE(static char *FindSock,(int fn));
+_PROTOTYPE(static void StartClnt,(struct sockaddr_in *cad));
+
+
+/*
+ * Main program
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    struct sockaddr_in aa;		/* accept address */
+    struct sockaddr_in ba;		/* bind address */
+    char buf[2048];			/* temporary buffer */
+    int bufl = sizeof(buf);		/* size of buf[] */
+    struct sockaddr_in ca;		/* connect address */
+    char *cem;				/* current error message pointer */
+    char *ep;				/* error message parameter */
+    char hnm[MAXHOSTNAMELEN + 1];	/* this host's name */
+    char *host;				/* host name */
+    struct hostent *hp;			/* this host's hostent structure */
+    char *ipaddr;			/* IP address */
+    char *pem = (char *)NULL;		/* previous error message */
+    char *port;				/* port */
+    LT_SOCKLEN_T sal;			/* socket address length */
+    char *tcp;				/* temporary character size */
+    int ti, tj, tk;			/* temporary indexes */
+    int tsfd;				/* temporary socket FD */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+/*
+ * Initalize the FdPara[] array before any CleanupClnt() call.
+ */
+    for (ti = 0; ti < NFDPARA; ti++) {
+	(void) memset((void *)&FdPara[ti], 0, sizeof(fdpara_t));
+	FdPara[ti].fd = -1;
+	FdPara[ti].ff = LT_FNF;
+    }
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "h", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h]", Pn);
+	PrtMsgX("       -h       print help (this panel)", Pn, CleanupSrvr,
+		xv);
+    }
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((cem = IsLsofExec()))
+	(void) PrtMsgX(cem, Pn, CleanupSrvr, 1);
+    if ((cem = CanRdKmem()))
+	(void) PrtMsgX(cem, Pn, CleanupSrvr, 1);
+/*
+ * Get the host name and its IP address.  Convert the IP address to dotted
+ * ASCII form.
+ */
+    if (gethostname(hnm, sizeof(hnm) - 1)) {
+	cem = "ERROR!!!  can't get this host's name";
+	goto print_errno;
+    }
+    hnm[sizeof(hnm) - 1] = '\0';
+    if (!(hp = gethostbyname(hnm))) {
+	(void) snprintf(buf, bufl - 1, "ERROR!!!  can't get IP address for %s",
+	    hnm);
+	buf[bufl - 1] = '\0';
+	cem = buf;
+	goto print_errno;
+    }
+    (void) memset((void *)&Myad, 0, sizeof(Myad));
+    if ((ti = hp->h_length) > sizeof(Myad.sin_addr))
+	ti = sizeof(Myad.sin_addr);
+    (void) memcpy((void *)&Myad.sin_addr, (void *)hp->h_addr, ti);
+    Myad.sin_family = hp->h_addrtype;
+/*
+ * Get INET domain socket FDs.
+ */
+    for (ti = 0; ti < NFDPARA; ti++) {
+	if ((tsfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
+	    ep = "socket";
+
+print_errno_by_ti:
+
+	/*
+	 * Report socket function error.
+	 *
+	 * Entry: ep   = function name
+	 *	  hnm  = this host's name
+	 *	  Myad = this host's IP address
+	 *	  ti   =  FdPara[] index
+	 */
+	    (void) snprintf(buf, bufl - 1, "ERROR!!!  %s %s() failure",
+		PtNm[ti], ep);
+	    buf[bufl - 1] = '\0';
+	    PrtMsg(buf, Pn);
+	    (void) snprintf(buf, bufl - 1, "    host: %s",
+		FdPara[ti].host ? FdPara[ti].host : hnm);
+	    buf[bufl - 1] = '\0';
+	    PrtMsg(buf, Pn);
+	    (void) snprintf(buf, bufl - 1, "    IP: %s",
+		FdPara[ti].ipaddr ? FdPara[ti].ipaddr
+				  : inet_ntoa(Myad.sin_addr));
+	    buf[bufl - 1] = '\0';
+	    cem = buf;
+
+print_errno:
+
+	/*
+	 * Report errno.
+	 *
+	 * Entry: errno = error number
+	 */
+	    PrtMsg(cem, Pn);
+	    (void) snprintf(buf, bufl - 1, "    Errno %d: %s", errno,
+		strerror(errno));
+	    buf[bufl - 1] = '\0';
+	    PrtMsgX(buf, Pn, CleanupSrvr, 1);
+	}
+    /*
+     * Put the FD just acquired in FdPara[ti].fd.
+     *
+     * Set the file-not-found to LT_FNF.
+     *
+     * Save the server socket if this FdPara[] is for it.
+     */
+	FdPara[ti].fd = tsfd;
+	(void) snprintf(buf, bufl - 1, "%d", tsfd);
+	buf[bufl - 1] = '\0';
+	FdPara[ti].fds = MkStrCpy(buf, &tj);
+	if (ti == LT_SRVR)
+	    Ssock = tsfd;
+    }
+/*
+ * Bind the host name to the server socket.
+ *
+ * Get and save the server's socket address.
+ *
+ * Initiate a listen with an address list of one.
+ */
+    (void) memcpy((void *)&ba, (void *)&Myad, sizeof(ba));
+    ti = LT_SRVR;
+    FdPara[ti].pid = MyPid;
+    if (bind(Ssock, (struct sockaddr *)&ba, sizeof(ba)) < 0) {
+	ep = "bind";
+	goto print_errno_by_ti;
+    }
+    sal = (LT_SOCKLEN_T)sizeof(ca);
+    if (getsockname(Ssock, (struct sockaddr *)&ca, &sal)) {
+	ep = "getsockname";
+	goto print_errno_by_ti;
+    }
+    (void) memcpy((void *)&FdPara[ti].sa, (void *)&ca, sizeof(FdPara[ti].sa));
+    if (listen(Ssock, 1) < 0) {
+	ep = "listen";
+	goto print_errno_by_ti;
+    }
+/*
+ * Fork a child process to run as the client.
+ */
+    switch ((CPid = (pid_t)fork())) {
+    case (pid_t)0:
+
+    /*
+     * This is the child.  Start the client.
+     */
+	StartClnt(&ca);
+	(void) PrtMsgX("ERROR!!!  unexpected client return", Pn, CleanupSrvr,
+		       1);
+    case (pid_t)-1:
+
+    /*
+     * This is a fork error.
+     */
+	cem = "ERROR!!! fork() error";
+	goto print_errno;
+    default:
+
+    /*
+     * This is the parent.
+     *
+     * Save the client's PID.
+     *
+     * Close the client's socket.
+     */
+	FdPara[LT_CLNT].pid = CPid;
+	if (FdPara[LT_CLNT].fd >= 0) {
+	    (void) close(FdPara[LT_CLNT].fd);
+	    FdPara[LT_CLNT].fd = -1;
+	}
+    }
+/*
+ * Set a SIGALRM, then accept() the connection from the client.
+ *
+ * Save the client's socket address.
+ *
+ * Replace the server's FD with the accepted one and close the original.
+ */
+    sal = (LT_SOCKLEN_T)sizeof(aa);
+    (void) alarm(0);
+    (void) signal(SIGALRM, HandleSrvrAlarm);
+    (void) alarm(ALARMTM);
+    tsfd = FdPara[LT_SRVR].fd = accept(Ssock, (struct sockaddr *)&aa, &sal);
+    (void) alarm(0);
+    (void) signal(SIGALRM, SIG_DFL);
+    if (tsfd < 0) {
+	ep = "accept";
+	goto print_errno_by_ti;
+    }
+    (void) snprintf(buf, bufl - 1, "%d", tsfd);
+    buf[bufl - 1] = '\0';
+    if (FdPara[LT_SRVR].fds)
+	(void) free((void *)FdPara[LT_SRVR].fds);
+    FdPara[LT_SRVR].fds = MkStrCpy(buf, &tj);
+    ti = LT_CLNT;
+    (void) memcpy((void *)&FdPara[ti].sa, (void *)&aa, sizeof(FdPara[ti].sa));
+    (void) close(Ssock);
+    Ssock = -1;
+/*
+ * Convert the client and server IP address to ASCII form.
+ *
+ * Look up the client and server host names for their IP addresses.
+ *
+ * Convert the port from the socket address to host form.
+ */
+    for (ti = 0; ti < NFDPARA; ti++) {
+	tcp = inet_ntoa(FdPara[ti].sa.sin_addr);
+	FdPara[ti].ipaddr = MkStrCpy(tcp, &FdPara[ti].ilen);
+	(void) snprintf(buf, bufl - 1, "%d",
+	    (int)ntohs(FdPara[ti].sa.sin_port));
+	buf[bufl - 1] = '\0';
+	FdPara[ti].port = MkStrCpy(buf, &FdPara[ti].plen);
+	if (!(hp = gethostbyaddr((char *)&FdPara[ti].sa.sin_addr,
+				 sizeof(FdPara[ti].sa.sin_addr),
+				 FdPara[ti].sa.sin_family))
+	) {
+	    ep = "gethostbyaddr";
+	    goto print_errno_by_ti;
+	}
+	if (hp->h_name)
+	    FdPara[ti].host = MkStrCpy(hp->h_name, &FdPara[ti].hlen);
+	else {
+
+	/*
+	 * The connected client's socket address can't be mapped to a host
+	 * name.
+	 */
+
+	    (void) snprintf(buf, bufl - 1,
+		"ERROR!!!  can't map %s (client) to a host name",
+		FdPara[ti].ipaddr);
+	    buf[bufl - 1] = '\0';
+	    PrtMsgX(buf, Pn, CleanupSrvr, 1);
+	}
+    }
+/*
+ * Call lsof three times to find the two sockets: 1) by host name and port;
+ * 2) by IP address and port; and 3) by port.
+ */
+    if ((cem = FindSock(LT_FBYHN)))
+	PrtMsgX(cem, Pn, CleanupSrvr, 1);
+    if ((cem = FindSock(LT_FBYIP)))
+	PrtMsgX(cem, Pn, CleanupSrvr, 1);
+    if ((cem = FindSock(LT_FBYPORT)))
+	PrtMsgX(cem, Pn, CleanupSrvr, 1);
+/*
+ * Check the FindSock() results.
+ */
+    for (pem = (char *)NULL, ti = 0; ti < NFDPARA; ti++) {
+	if ((tj = FdPara[ti].ff) != (LT_FBYHN | LT_FBYIP | LT_FBYPORT)) {
+	    host = FdPara[ti].host;
+	    ipaddr = FdPara[ti].ipaddr;
+	    port = FdPara[ti].port;
+
+	/*
+	 * This FD wasn't found by some search method.
+	 */
+	    if (!(tj & LT_FBYHN)) {
+
+	    /*
+	     * The search by host name and port failed.
+	     */
+		(void) snprintf(buf, bufl - 1,
+		    "ERROR!!!  no %s socket by host and port: %s@%s",
+		    PtNm[ti], host, port);
+		buf[bufl - 1] = '\0';
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = MkStrCpy(buf, &tk);
+	    }
+	    if (!(tj & LT_FBYIP)) {
+
+	    /*
+	     * The search by IP address and port failed.
+	     */
+		(void) snprintf(buf, bufl - 1,
+		    "ERROR!!!  no %s socket by IP and port: %s@%s",
+		    PtNm[ti], ipaddr, port);
+		buf[bufl - 1] = '\0';
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = MkStrCpy(buf, &tk);
+	    }
+	    if (!(tj & LT_FBYPORT)) {
+
+	    /*
+	     * The search by port number failed.
+	     */
+		(void) snprintf(buf, bufl - 1,
+		    "ERROR!!!  no %s socket by port: %s",
+		    PtNm[ti], port);
+		buf[bufl - 1] = '\0';
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = MkStrCpy(buf, &tk);
+	    }
+	}
+    }
+    if (pem)
+	(void) PrtMsgX(pem, Pn, CleanupSrvr, 1);
+/*
+ * Exit successfully.
+ */
+    (void) PrtMsgX("OK", Pn, CleanupSrvr, 0);
+    return(0);
+}
+
+
+/*
+ * ClntCleanup() -- release client resources
+ */
+
+static void
+CleanupClnt()
+{
+    int tfd;				/* temporary file descriptor */
+
+    if ((tfd = FdPara[LT_CLNT].fd) >= 0) {
+	(void) shutdown(tfd, 2);
+	(void) close(tfd);
+	FdPara[LT_CLNT].fd = -1;
+    }
+}
+
+
+/*
+ * CleanupSrvr() -- release server resources
+ */
+
+static void
+CleanupSrvr()
+{
+    int tfd;				/* temporary file descriptor */
+    int ti;				/* temporary index */
+    pid_t wpid;				/* wait() PID */
+
+    if ((Ssock >= 0) && (Ssock != FdPara[LT_SRVR].fd)) {
+	(void) shutdown(Ssock, 2);
+	(void) close(Ssock);
+	Ssock = -1;
+    }
+    for (ti = 0; ti < NFDPARA; ti++) {
+	if ((tfd = FdPara[ti].fd) >= 0) {
+	    (void) shutdown(tfd, 2);
+	    (void) close(tfd);
+	    FdPara[ti].fd = -1;
+	}
+    }
+    if (CPid > 0) {
+	wpid = wait3(NULL, WNOHANG, NULL);
+	if (wpid != CPid) {
+	    kill(CPid, SIGKILL);
+	    (void) wait3(NULL, WNOHANG, NULL);
+	}
+	CPid = (pid_t)0;
+    }
+}
+
+
+/*
+ * FindSock() -- find sockets with lsof
+ */
+
+static char *
+FindSock(fn)
+    int fn;				/* function -- an LT_FBY* value */
+{
+    char buf[2048];			/* temporary buffer */
+    int bufl = sizeof(buf);		/* size of buf[] */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTfldo_t *fop;			/* field output pointer */
+    int nf;				/* number of fields */
+    int nl;				/* name length */
+    LTfldo_t *nmp;			/* name pointer */
+    char *opv[5];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    int pl;				/* port length */
+    int px;				/* process index -- LT_CLNT or
+					 * LT_SRVR */
+    char *tcp, *tcp1;			/* temporary character pointers */
+    int ti, tj;				/* temporary integers */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Check the function and determine the first lsof option from it.
+ */
+    ti = 0;
+    switch (fn) {
+    case LT_FBYHN:
+	opv[ti++] = "-P";
+	for (tj = 0; tj < NFDPARA; tj++) {
+	    (void) snprintf(buf, bufl - 1, "-i@%s:%s", FdPara[tj].host,
+		FdPara[tj].port);
+	    buf[bufl - 1] = '\0';
+	    opv[ti++] = MkStrCpy(buf, &pl);
+	}
+	break;
+    case LT_FBYIP:
+	opv[ti++] = "-Pn";
+	for (tj = 0; tj < NFDPARA; tj++) {
+	    (void) snprintf(buf, bufl - 1, "-i@%s:%s", FdPara[tj].ipaddr,
+		FdPara[tj].port);
+	    buf[bufl - 1] = '\0';
+	    opv[ti++] = MkStrCpy(buf, &pl);
+	}
+	break;
+    case LT_FBYPORT:
+	opv[ti++] = "-P";
+	for (tj = 0; tj < NFDPARA; tj++) {
+	    (void) snprintf(buf, bufl - 1, "-i:%s", FdPara[tj].port);
+	    buf[bufl - 1] = '\0';
+	    opv[ti++] = MkStrCpy(buf, &pl);
+	}
+	break;
+    default:
+	(void) snprintf(buf, bufl - 1,
+	    "ERROR!!!  illegal FindSock() function: %d", fn);
+	buf[bufl - 1] = '\0';
+	return(MkStrCpy(buf, &ti));
+    }
+/*
+ * Complete the option vector and start lsof execution.
+ */
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv)))
+	return(cem);
+/*
+ * Read lsof output.
+ */
+    while ((((FdPara[LT_CLNT].ff & fn) == 0)
+    ||	    ((FdPara[LT_SRVR].ff & fn) == 0))
+    &&	   (fop = RdFrLsof(&nf, &cem))
+    ) {
+	if (cem) {
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || ((pid != CPid) && (pid != MyPid)))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.
+	 *
+	 * Identify the process -- client or server.
+	 */
+	    if (!pids)
+		break;
+	    if (pid == CPid)
+		px = LT_CLNT;
+	    else if (pid == MyPid)
+		px = LT_SRVR;
+	    else
+		break;
+	/*
+	 * Make sure the FD matches the identified process.
+	 */
+	    if (strcmp(fop->v, FdPara[px].fds))
+		break;
+	/*
+	 * Scan for name and type.
+	 */
+	    nmp = typ  = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_NAME:
+		    nmp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the type of the file.
+	 */
+	    if (!typ
+	    ||  (strcasecmp(typ->v, "inet") && strcasecmp(typ->v, "ipv4"))
+	    ) {
+		break;
+	    }
+	/*
+	 * Check the addess in the name, based on the calling function.
+	 */
+	    if (!nmp)
+		break;
+	    tcp = nmp->v;
+	    switch (fn) {
+	    case LT_FBYHN:
+		if (((nl = FdPara[px].hlen) <= 0)
+		||  !(tcp1 = FdPara[px].host)
+		||  strncasecmp(tcp, tcp1, nl)
+		) {
+		    break;
+		}
+		tcp += nl;
+		if ((*tcp++ != ':')
+		||  !(tcp1 = FdPara[px].port)
+		||  ((pl = FdPara[px].plen) <= 0)
+		||  strncmp(tcp, tcp1, pl)
+		) {
+		    break;
+		}
+		tcp += pl;
+		if ((*tcp == '-') || (*tcp == ' ') || !*tcp) {
+		    FdPara[px].ff |= LT_FBYHN;
+		}
+		break;
+	    case LT_FBYIP:
+		if (((nl = FdPara[px].ilen) <= 0)
+		||  !(tcp1 = FdPara[px].ipaddr)
+		||  strncasecmp(tcp, tcp1, nl)
+		) {
+		    break;
+		}
+		tcp += nl;
+		if ((*tcp++ != ':')
+		||  !(tcp1 = FdPara[px].port)
+		||  ((pl = FdPara[px].plen) <= 0)
+		||  strncmp(tcp, tcp1, pl)
+		) {
+		    break;
+		}
+		tcp += pl;
+		if ((*tcp == '-') || (*tcp == ' ') || !*tcp) {
+		    FdPara[px].ff |= LT_FBYIP;
+		}
+		break;
+	    case LT_FBYPORT:
+		if (!(tcp = strchr(tcp, ':')))
+		    break;
+		tcp++;
+		if (!(tcp1 = FdPara[px].port)
+		||  ((pl = FdPara[px].plen) <= 0)
+		||  strncmp(tcp, tcp1, pl)
+		) {
+		    break;
+		}
+		tcp += pl;
+		if ((*tcp == '-') || (*tcp == ' ') || !*tcp) {
+		    FdPara[px].ff |= LT_FBYPORT;
+		}
+		break;
+	    }
+	}
+    }
+/*
+ * Clean up and return.
+ */
+    (void) StopLsof();
+    return(pem);
+}
+
+
+/*
+ * HandleClntAlarm() -- handle client alarm
+ */
+
+static SIGHANDLER_T
+HandleClntAlarm(sig)
+    int sig;				/* the signal (SIGALRM) */
+{
+    (void) PrtMsgX("ERROR!!!  client caught an alarm signal", Pn,
+	CleanupClnt, 1);
+}
+
+
+/*
+ * Handle SrvrAlarm() -- handle server alarm
+ */
+
+static SIGHANDLER_T
+HandleSrvrAlarm(sig)
+    int sig;				/* the signal (SIGALRM) */
+{
+    (void) PrtMsgX("ERROR!!!  server caught an alarm signal.", Pn,
+	CleanupSrvr, 1);
+}
+
+
+/*
+ * StartClnt() -- start network client
+ */
+
+static void
+StartClnt(cad)
+    struct sockaddr_in *cad;		/* connection address */
+{
+    struct sockaddr_in ba;		/* bind address */
+    int br;				/* bytes read */
+    char buf[2048];			/* temporary buffer */
+    int bufl = sizeof(buf);		/* size of buf[] */
+    int cr;				/* connect() reply */
+    char *em;				/* error message pointer */
+    int fd = FdPara[LT_CLNT].fd;	/* client's socket FD */
+/*
+ * Close the server's sockets.
+ */
+    if ((Ssock >= 0) && (Ssock != FdPara[LT_SRVR].fd)) {
+	(void) close(Ssock);
+	Ssock = -1;
+    }
+    if (FdPara[LT_SRVR].fd >= 0) {
+	(void) close(FdPara[LT_SRVR].fd);
+	FdPara[LT_SRVR].fd = -1;
+    }
+/*
+ * Bind to the local address.
+ */
+    (void) memcpy((void *)&ba, (void *)&Myad, sizeof(ba));
+    if (bind(fd, (struct sockaddr *)&ba, sizeof(ba)) < 0) {
+	em = "bind";
+
+client_errno:
+
+	(void) snprintf(buf, bufl - 1,
+	    "ERROR!!!  client %s error: %s", em, strerror(errno));
+	buf[bufl - 1] = '\0';
+	(void) PrtMsgX(em, Pn, CleanupClnt, 1);
+    }
+/*
+ * Set an alarm timeout and connect to the server.
+ */
+    (void) signal(SIGALRM, HandleClntAlarm);
+    (void) alarm(ALARMTM);
+    cr = connect(fd, (struct sockaddr *)cad, sizeof(struct sockaddr_in));
+    (void) alarm(0);
+    (void) signal(SIGALRM, SIG_DFL);
+    if (cr) {
+	em = "connect";
+	goto client_errno;
+    }
+/*
+ * Sleep until the socket closes or the parent kills the process.
+ */
+    for (br = 0; br >= 0;) {
+	sleep(1);
+	br = read(fd, buf, bufl);
+    }
+    (void) CleanupClnt();
+    exit(0);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTszoff.c b/lsof_4.85/lsof_4.85_src/tests/LTszoff.c
new file mode 100644
index 0000000..090e752
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTszoff.c
@@ -0,0 +1,509 @@
+/*
+ * LTszoff.c -- Lsof Test small file (< 32 bits) size and offset tests
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+
+/*
+ * Pre-definitions that might be undefined by dialects
+ */
+
+#define	OFFTST_STAT	1		/* offset tests status */
+
+
+#if	defined(LT_DIAL_linux)
+/*
+ * Linux-specific items
+ */
+
+#undef	OFFTST_STAT
+#define	OFFTST_STAT	0		/* Linux lsof may not be able to report
+					 * offsets -- see the function
+					 * ck_Linux_offset_support() */
+
+_PROTOTYPE(static int ck_Linux_offset_support,(void));
+#endif	/* defined(LT_DIAL_linux) */
+
+
+/*
+ * Local definitions
+ */
+
+#define	TYTST_SZ	0	/* size test type */
+#define	TYTST_0to	1	/* 0t offset test type */
+#define	TYTST_0xo	2	/* 0x offset test type */
+#define TSTFSZ		32768	/* test file size */
+
+
+/*
+ * Globals
+ */
+
+int Fd = -1;			/* test file descriptor; open if >= 0 */
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Path = (char *)NULL;	/* test file path; none if NULL */
+char *Pn = (char *)NULL;	/* program name */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *testlsof,(int tt, char *opt, char *xval));
+
+
+/*
+ * Main program
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    int do_offt = OFFTST_STAT;		/* do offset tests if == 1 */
+    char *em;				/* error message pointer */
+    int ti;				/* temporary index */
+    char *tcp;				/* temporary character pointer */
+    char *tstsz = (char *)NULL;		/* size test status */
+    char *tst0to = (char *)NULL;	/* offset 0t form test */
+    char *tst0xo = (char *)NULL;	/* offset 0x form test */
+    int xv = 0;				/* exit value */
+    char xbuf[64];			/* expected value buffer */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "hp:", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h] [-p path]", Pn);
+	PrtMsg       ("       -h       print help (this panel)", Pn);
+	PrtMsgX      ("       -p path  define test file path", Pn, cleanup, xv);
+    }
+
+#if	defined(LT_DIAL_linux)
+/*
+ * If this is Linux, see if lsof can report file offsets.
+ */
+	do_offt = ck_Linux_offset_support();
+#endif	/* defined(LT_DIAL_linux) */
+
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * If a path was supplied in an "-p path" option, use it.  Otherwise construct
+ * a path in the CWD.
+ */
+    if (!(Path = LTopt_p)) {
+	(void) snprintf(buf, sizeof(buf) - 1, "./config.LTszoff%ld",
+	(long)MyPid);
+	buf[sizeof(buf) - 1] = '\0';
+	Path = MkStrCpy(buf, &ti);
+    }
+/*
+ * Open a new test file at the specified path.
+ */
+    (void) unlink(Path);
+    if ((Fd = open(Path, O_RDWR|O_CREAT, 0600)) < 0) {
+	(void) fprintf(stderr, "ERROR!!!  can't open %s\n", Path);
+
+print_file_error:
+
+	MsgStat = 1;
+	(void) snprintf(buf, sizeof(buf) - 1, "      Errno %d: %s",
+	    errno, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Write the test file to its expected size.
+ */
+    for (ti = 0; ti < sizeof(buf); ti++) {
+	buf[ti] = (char)(ti & 0xff);
+    }
+    for (ti = 0; ti < TSTFSZ; ti += sizeof(buf)) {
+	if (write(Fd, buf, sizeof(buf)) != sizeof(buf)) {
+	    (void) fprintf(stderr, "ERROR!!!  can't write %d bytes to %s\n",
+		(int)sizeof(buf), Path);
+	     goto print_file_error;
+	}
+    }
+/*
+ * Fsync() the file.
+ */
+    if (fsync(Fd)) {
+	(void) fprintf(stderr, "ERROR!!!  can't fsync %s\n", Path);
+	goto print_file_error;
+    }
+/*
+ * Do the tests.  Skip offset tests as indicated.
+ */
+    (void) snprintf(xbuf, sizeof(xbuf) - 1, "%d", TSTFSZ);
+    xbuf[sizeof(xbuf) - 1] = '\0';
+    if ((tstsz = testlsof(TYTST_SZ, "-s", xbuf)))
+	(void) PrtMsg(tstsz, Pn);
+    if (do_offt) {
+	(void) snprintf(xbuf, sizeof(xbuf) - 1, "0t%d", TSTFSZ);
+	xbuf[sizeof(xbuf) - 1] = '\0';
+	if ((tst0to = testlsof(TYTST_0to, "-o", xbuf)))
+	    (void) PrtMsg(tst0to, Pn);
+	(void) snprintf(xbuf, sizeof(xbuf) - 1, "0x%x", TSTFSZ);
+	xbuf[sizeof(xbuf) - 1] = '\0';
+	if ((tst0xo = testlsof(TYTST_0xo, "-oo2", xbuf)))
+	    (void) PrtMsg(tst0to, Pn);
+    } else {
+	PrtMsg("WARNING!!!  lsof can't return file offsets for this dialect,",
+	   Pn);
+	PrtMsg("  so offset tests have been disabled.", Pn);
+    }
+/*
+ * Compute exit value and exit.
+ */
+    if (tstsz || tst0to || tst0xo) {
+	tcp = (char *)NULL;
+	xv = 1;
+    } else {
+	tcp = "OK";
+	xv = 0;
+    }
+    (void) PrtMsgX(tcp, Pn, cleanup, xv);
+    return(0);
+}
+
+
+#if	defined(LT_DIAL_linux)
+/*
+ * ck_Linux_offset_support() -- see if lsof can report offsets for this
+ *				Linux implementation
+ */
+
+static int
+ck_Linux_offset_support()
+{
+	char buf[1024];			/* lsof output line buffer */
+	int bufl = sizeof(buf);		/* size of buf[] */
+	char *opv[5];			/* option vector for lsof */
+	int rv = 1;			/* return value:
+					 *     0 == no lsof offset support
+					 *     1 == lsof offset support */
+/*
+ * Ask lsof to report the test's FD zero offset.
+ */
+	if (IsLsofExec())
+	    return(0);
+	opv[0] = "-o";
+	snprintf(buf, bufl - 1, "-p%d", (int)getpid());
+	opv[1] = buf;
+	opv[2] = "-ad0";
+	opv[3] = "+w";
+	opv[4] = (char *)NULL;
+	if (ExecLsof(opv))
+	    return(0);
+/*
+ * Read the lsof output.  Look for a line with "WARNING: can't report offset"
+ * in it.  If it is found, then this Linux lsof can't report offsets.
+ */
+	while(fgets(buf, bufl - 1, LsofFs)) {
+	    if (strstr(buf, "WARNING: can't report offset")) {
+		rv = 0;
+		break;
+	    }
+	}
+	(void) StopLsof();
+	return(rv);
+}
+#endif	/* defined(LT_DIAL_linux) */
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+    if (Fd >= 0) {
+	(void) close(Fd);
+	Fd = -1;
+	if (Path) {
+	    (void) unlink(Path);
+	    Path = (char *)NULL;
+	}
+    }
+}
+
+
+/*
+ * testlsof() -- test the open file with lsof
+ */
+
+static char *
+testlsof(tt, opt, xval)
+    int tt;				/* test type -- TYTST_* symbol */
+    char *opt;				/* extra lsof options */
+    char *xval;				/* expected value */
+{
+    char buf[2048];			/* temporary buffer */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    LTfldo_t *devp;			/* device pointer */
+    int ff = 0;				/* file found status */
+    LTfldo_t *fop;			/* field output pointer */
+    char ibuf[64];			/* inode number buffer */
+    LTfldo_t *inop;			/* inode number pointer */
+    LTdev_t lsofdc;			/* lsof device components */
+    int nf;				/* number of fields */
+    LTfldo_t *offp;			/* offset pointer */
+    char *opv[4];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    struct stat sb;			/* stat(2) buffer */
+    LTdev_t stdc;			/* stat(2) device components */
+    LTfldo_t *szp;			/* size pointer */
+    char *tcp;				/* temporary character pointer */
+    int ti;				/* temporary integer */
+    char *tnm1, *tnm2;			/* test names */
+    int ts = 0;				/* test status flag */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Check the test type.
+ */
+    switch (tt) {
+    case TYTST_SZ:
+	tnm1 = "";
+	tnm2 = " size";
+	break;
+    case TYTST_0to:
+	tnm1 = " 0t";
+	tnm2 = " offset";
+	break;
+    case TYTST_0xo:
+	tnm1 = " 0x";
+	tnm2 = " offset";
+	break;
+    default:
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  illegal test type: %d", tt);
+	buf[sizeof(buf) - 1] = '\0';
+	(void) PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Get test file's information.
+ */
+    if (stat(Path, &sb)) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  can't stat(2) %s: %s", Path, strerror(errno));
+	buf[sizeof(buf) - 1] = '\0';
+	PrtMsgX(buf, Pn, cleanup, 1);
+    }
+/*
+ * Extract components from test file's stat buffer.
+ */
+    if ((cem = ConvStatDev(&sb.st_dev, &stdc)))
+	PrtMsgX(buf, Pn, cleanup, 1);
+    (void) snprintf(ibuf, sizeof(ibuf) - 1, "%u", (unsigned int)sb.st_ino);
+    ibuf[sizeof(ibuf) - 1] = '\0';
+/*
+ * Complete the option vector and start lsof execution.
+ */
+    ti = 0;
+    if (opt && *opt)
+	opv[ti++] = opt;
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#else	/* !defined(USE_LSOF_C_OPT) */
+    opv[ti++] = "--";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    opv[ti++] = Path;
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv)))
+	return(cem);
+/*
+ * Read lsof output.
+ */
+    while (!ff && !cem && (fop = RdFrLsof(&nf, &cem))) {
+	if (cem) {
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != MyPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Make sure its number matches the
+	 * test file's descriptor number.
+	 */
+	    if (!pids)
+		break;
+	    for (ti = 0, tcp = fop->v; *tcp; tcp++) {
+
+	    /*
+	     * Convert file descriptor to a number.
+	     */
+		if (*tcp == ' ')
+		    continue;
+		if (((int)*tcp < (int)'0') || ((int)*tcp > (int)'9')) {
+		    ti = -1;
+		    break;
+		}
+		ti = (ti * 10) + (int)*tcp - (int)'0'; 
+	    }
+	    if (Fd != ti)
+		break;
+	/*
+	 * Scan for device, inode, offset, size and type fields.
+	 */
+	    devp = inop = offp = szp = typ = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_DEVN:
+		    devp = fop;
+		    break;
+		case LSOF_FID_INODE:
+		    inop = fop;
+		    break;
+		case LSOF_FID_OFFSET:
+		    offp = fop;
+		    break;
+		case LSOF_FID_SIZE:
+		    szp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the results of the file descriptor field scan.
+	 */
+	    if (!devp || !inop || !typ)
+		break;
+	    if (strcasecmp(typ->v, "reg") && strcasecmp(typ->v, "vreg"))
+		break;
+	    if ((cem = ConvLsofDev(devp->v, &lsofdc))) {
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+		break;
+	    }
+	    if ((stdc.maj != lsofdc.maj)
+	    ||  (stdc.min != lsofdc.min)
+	    ||  (stdc.unit != lsofdc.unit)
+	    ||  strcmp(inop->v, ibuf)
+	    ) {
+		break;
+	    }
+	/*
+	 * The specified file has been located.  Do the specified test.
+	 */
+	    ff = 1;
+	    fop = (tt == TYTST_SZ) ? szp : offp;
+	    if (!fop) {
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "ERROR!!! %s%s test, but no lsof%s", tnm1, tnm2, tnm2);
+		ts = 1;
+	    } else if (strcmp(fop->v, xval)) {
+		(void) snprintf(buf, sizeof(buf) - 1,
+		    "ERROR!!! %s%s mismatch: expected %s, got %s",
+		    tnm1, tnm2, xval, fop->v);
+		ts = 1;
+	    }
+	    if (ts) {
+		buf[sizeof(buf) - 1] = '\0';
+		cem = MkStrCpy(buf, &ti);
+		if (pem)
+		    (void) PrtMsg(pem, Pn);
+		pem = cem;
+	    }
+	    break;
+	}
+    }
+    (void) StopLsof();
+    if (!ff) {
+	(void) snprintf(buf, sizeof(buf) - 1,
+	    "ERROR!!!  test file %s not found by lsof", Path);
+	buf[sizeof(buf) - 1] = '\0';
+	cem = MkStrCpy(buf, &ti);
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	return(cem);
+    }
+    return(pem);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LTunix.c b/lsof_4.85/lsof_4.85_src/tests/LTunix.c
new file mode 100644
index 0000000..6e12c33
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LTunix.c
@@ -0,0 +1,364 @@
+/*
+ * LTunix.c -- Lsof Test UNIX domain socket test
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2002 Purdue Research Foundation, West Lafayette, Indiana
+ * 47907.  All rights reserved.
+ *
+ * Written by V. 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2002 Purdue Research Foundation.\nAll rights reserved.\n";
+#endif
+
+#include "LsofTest.h"
+#include "lsof_fields.h"
+
+#include <sys/socket.h>
+#include <sys/un.h>
+
+
+/*
+ * Local definitions
+ */
+
+#if	!defined(MAXPATHLEN)
+#define	MAXPATHLEN	1024		/* maximum path length */
+#endif	/* !defined(MAXPATHLEN) */
+
+
+/*
+ * Globals
+ */
+
+pid_t MyPid = (pid_t)0;		/* PID of this process */
+char *Pn = (char *)NULL;	/* program name */
+int SpFd[2] = {-1,-1};		/* socket pair FDs */
+char *Path[2] = {(char *)NULL, (char *)NULL};
+				/* socket pair paths */
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static void cleanup,(void));
+_PROTOTYPE(static char *FindUsocks,(void));
+
+
+/*
+ * Main program
+ */
+
+int
+main(argc, argv)
+    int argc;				/* argument count */
+    char *argv[];			/* arguments */
+{
+    char buf[2048];			/* temporary buffer */
+    char cwd[MAXPATHLEN + 1];		/* CWD buffer */
+    char *em;				/* error message pointer */
+    int ti, tj;				/* temporary indexes */
+    struct sockaddr_un ua;		/* UNIX socket address */
+    int xv = 0;				/* exit value */
+/*
+ * Get program name and PID, issue start message, and build space prefix.
+ */
+    if ((Pn = strrchr(argv[0], '/')))
+	Pn++;
+    else
+	Pn = argv[0];
+    MyPid = getpid();
+    (void) printf("%s ... ", Pn);
+    (void) fflush(stdout);
+    PrtMsg((char *)NULL, Pn);
+/*
+ * Process arguments.
+ */
+    if (ScanArg(argc, argv, "h", Pn))
+	xv = 1;
+    if (xv || LTopt_h) {
+	(void) PrtMsg("usage: [-h]", Pn);
+	PrtMsgX("       -h       print help (this panel)", Pn, cleanup, xv);
+    }
+/*
+ * See if lsof can be executed and can access kernel memory.
+ */
+    if ((em = IsLsofExec()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+    if ((em = CanRdKmem()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Construct the socket paths.
+ */
+
+#if	defined(USE_GETCWD)
+    if (!getcwd(cwd, sizeof(cwd)))
+#else	/* ! defined(USE_GETCWD) */
+    if (!getwd(cwd))
+#endif	/* defined(USE_GETCWD) */
+
+    {
+	em = "ERROR!!!  can't get CWD";
+	goto print_errno;
+    }
+    cwd[sizeof(cwd) - 1] = '\0';
+    if ((strlen(cwd) + strlen("/config.LT#U9223372036854775807") + 1)
+    > sizeof(ua.sun_path))
+    {
+	strncpy(cwd, "/tmp", sizeof(cwd) - 1);
+    }
+    for (ti = 0; ti < 2; ti++) {
+	(void) snprintf(buf, sizeof(buf) - 1, "%s/config.LT%dU%ld", cwd, ti,
+	    (long)MyPid);
+	buf[sizeof(buf) - 1] = '\0';
+	Path[ti] = MkStrCpy(buf, &tj);
+	(void) unlink(Path[ti]);
+    }
+/*
+ * Get two UNIX domain socket FDs.
+ */
+    for (ti = 0; ti < 2; ti++) {
+	if ((SpFd[ti] = socket(AF_UNIX, SOCK_STREAM, PF_UNSPEC)) < 0) {
+	    em = "socket";
+
+print_errno_by_ti:
+
+	    (void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  %s(%s) failure",
+		em, Path[ti]);
+	    buf[sizeof(buf) - 1] = '\0';
+	    em = buf;
+
+print_errno:
+
+	    PrtMsg(em, Pn);
+	    (void) snprintf(buf, sizeof(buf) - 1, "    Errno %d: %s", errno,
+		strerror(errno));
+	    buf[sizeof(buf) - 1] = '\0';
+	    PrtMsgX(buf, Pn, cleanup, 1);
+	}
+    }
+/*
+ * Bind file system names to the sockets.
+ */
+    for (ti = 0; ti < 2; ti++) {
+	(void) memset((void *)&ua, 0, sizeof(ua));
+	ua.sun_family = AF_UNIX;
+	(void) strncpy(ua.sun_path, Path[ti], sizeof(ua.sun_path));
+	ua.sun_path[sizeof(ua.sun_path) - 1] = '\0';
+	if (bind(SpFd[ti], (struct sockaddr *)&ua, sizeof(ua)) < 0) {
+	    em = "bind";
+	    goto print_errno_by_ti;
+	}
+    }
+/*
+ * Look for the open UNIX domain socket files with lsof.
+ */
+    if ((em = FindUsocks()))
+	(void) PrtMsgX(em, Pn, cleanup, 1);
+/*
+ * Exit successfully.
+ */
+    (void) PrtMsgX("OK", Pn, cleanup, 0);
+    return(0);
+}
+
+
+/*
+ * cleanup() -- release resources
+ */
+
+static void
+cleanup()
+{
+    int ti;
+
+    for (ti = 0; ti < 2; ti++) {
+	if (SpFd[ti] >= 0) {
+	    (void) close(SpFd[ti]);
+	    SpFd[ti] = -1;
+	}
+	if (Path[ti]) {
+	    (void) unlink(Path[ti]);
+	    (void) free((void *)Path[ti]);
+	    Path[ti] = (char *)NULL;
+	}
+    }
+}
+
+
+/*
+ * FindUsocks() -- find UNIX sockets with lsof
+ */
+
+static char *
+FindUsocks()
+{
+    char buf[2048];			/* temporary buffer */
+    char *cem;				/* current error message pointer */
+    LTfldo_t *cmdp;			/* command pointer */
+    int ff[2];				/* file-found flags */
+    LTfldo_t *fop;			/* field output pointer */
+    int nf;				/* number of fields */
+    int nl;				/* name length */
+    LTfldo_t *nmp;			/* name pointer */
+    char *opv[5];			/* option vector for ExecLsof() */
+    char *pem = (char *)NULL;		/* previous error message pointer */
+    pid_t pid;				/* PID */
+    int pids = 0;			/* PID found status */
+    char *tcp;				/* temporary character pointer */
+    int ti, tj;				/* temporary integers */
+    LTfldo_t *typ;			/* file type pointer */
+/*
+ * Build the option vector and start lsof execution.
+ */
+    ff[0] = ff[1] = ti = 0;
+    opv[ti++] = "-aU";
+    opv[ti++] = "-p";
+    (void) snprintf(buf, sizeof(buf) - 1, "%ld", (long)MyPid);
+    buf[sizeof(buf) - 1] = '\0';
+    opv[ti++] = MkStrCpy(buf, &tj);
+
+#if	defined(USE_LSOF_C_OPT)
+    opv[ti++] = "-C";
+#endif	/* defined(USE_LSOF_C_OPT) */
+
+    opv[ti] = (char *)NULL;
+    if ((cem = ExecLsof(opv)))
+	return(cem);
+/*
+ * Read lsof output.
+ */
+    while (((ff[0] + ff[1]) < 2) && (fop = RdFrLsof(&nf, &cem))) {
+	if (cem) {
+	    if (pem)
+		(void) PrtMsg(pem, Pn);
+	    return(cem);
+	}
+	switch (fop->ft) {
+	case LSOF_FID_PID:
+
+	/*
+	 * This is a process information line.
+	 */
+	    pid = (pid_t)atoi(fop->v);
+	    pids = 1;
+	    cmdp = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_CMD:
+		    cmdp = fop;
+		    break;
+		}
+	    }
+	    if (!cmdp || (pid != MyPid))
+		pids = 0;
+	    break;
+	case LSOF_FID_FD:
+
+	/*
+	 * This is a file descriptor line.  Make sure its number matches a
+	 * test file descriptor number.
+	 */
+	    if (!pids)
+		break;
+	    for (ti = 0, tcp = fop->v; *tcp; tcp++) {
+
+	    /*
+	     * Convert file descriptor to a number.
+	     */
+		if (*tcp == ' ')
+		    continue;
+		if (((int)*tcp < (int)'0') || ((int)*tcp > (int)'9')) {
+		    ti = -1;
+		    break;
+		}
+		ti = (ti * 10) + (int)*tcp - (int)'0'; 
+	    }
+	    for (tj = 0; tj < 2; tj++) {
+		if (ff[tj])
+		    continue;
+		if (SpFd[tj] == ti)
+		    break;
+	    }
+	    if (tj >= 2)
+		break;
+	/*
+	 * Scan for name and type.
+	 */
+	    nmp = typ  = (LTfldo_t *)NULL;
+	    for (fop++, ti = 1; ti < nf; fop++, ti++) {
+		switch (fop->ft) {
+		case LSOF_FID_NAME:
+		    nmp = fop;
+		    break;
+		case LSOF_FID_TYPE:
+		    typ = fop;
+		    break;
+		}
+	    }
+	/*
+	 * Check the type of the file.
+	 */
+	    if (!typ || strcasecmp(typ->v, "unix"))
+		break;
+	/*
+	 * Look for the name.
+	 */
+	    if (!nmp)
+		break;
+	    nl = strlen(Path[tj]);
+	    for (tcp = nmp->v; tcp; tcp = strchr(tcp + 1, '/')) {
+		if (!strncmp(tcp, Path[tj], nl)) {
+
+		/*
+		 * Mark a file as found.
+		 */
+		    ff[tj] = 1;
+		    break;
+		}
+	    }
+	}
+    }
+/*
+ * Clean up and return.
+ */
+    (void) StopLsof();
+    for (ti = 0; ti < 2; ti++) {
+	if (ff[tj])
+	    continue;
+	(void) snprintf(buf, sizeof(buf) - 1, "ERROR!!!  not found: %s",
+	    Path[ti]);
+	buf[sizeof(buf) - 1] = '\0';
+	if (pem)
+	    (void) PrtMsg(pem, Pn);
+	pem = MkStrCpy(buf, &tj);
+    }
+    return(pem);
+}
diff --git a/lsof_4.85/lsof_4.85_src/tests/LsofTest.h b/lsof_4.85/lsof_4.85_src/tests/LsofTest.h
new file mode 100644
index 0000000..e1d149c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/LsofTest.h
@@ -0,0 +1,360 @@
+/*
+ * LsofTest.h -- header file for lsof tests
+ */
+
+
+/*
+ * Copyright 2002 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: LsofTest.h,v 1.12 2008/07/05 16:21:07 abe Exp $
+ */
+
+
+#if	!defined(LSOF_TEST_H)
+#define	LSOF_TEST_H	1
+
+
+/*
+ * The _PROTOTYPE macro provides strict ANSI C prototypes if __STDC__
+ * is defined, and old-style K&R prototypes otherwise.
+ *
+ * (With thanks to Andy Tanenbaum)
+ */
+
+# if	defined(__STDC__)
+#define	_PROTOTYPE(function, params)	function params
+# else	/* !defined(__STDC__) */
+#define	_PROTOTYPE(function, params)	function()
+# endif /* defined(__STDC__) */
+
+
+/*
+ * The following define keeps gcc>=2.7 from complaining about the failure
+ * of the Exit() function to return.
+ *
+ * Paul Eggert <eggert@twinsun.com> supplied it.
+ */
+
+# if	defined(__GNUC__) && !(__GNUC__<2 || (__GNUC__==2 && __GNUC_MINOR__<7))
+#define	exiting	__attribute__((__noreturn__))
+# else	/* !gcc || gcc<2.7 */
+#define	exiting
+# endif	/* gcc && gcc>=2.7 */
+
+
+/*
+ * Necessary header files.
+ */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <errno.h>
+#include <signal.h>
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/stat.h>
+
+
+/*
+ * Definitions that may be revoked by a particular dialect.
+ */
+
+#define	USE_GETCWD			/* use the POSIX getcwd() function in
+					 * place of getwd() */
+#define	USE_LSOF_C_OPT			/* use lsof's -C option */
+#undef	USE_LSOF_X_OPT			/* don't use lsof's -X option */
+
+
+# if	defined(LT_DIAL_aix)
+/*
+ * AIX-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/access.h>
+#undef	USE_LSOF_C_OPT
+#define	USE_LSOF_X_OPT
+# endif	/* defined(LT_DIAL_aix) */
+
+
+# if	defined(LT_DIAL_bsdi)
+/*
+ * OpenBSD-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+# endif	/* defined(LT_DIAL_bsdi) */
+
+
+# if	defined(LT_DIAL_darwin)
+/*
+ * Darwin-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#undef	USE_LSOF_C_OPT
+# endif	/* defined(LT_DIAL_darwin) */
+
+
+# if	defined(LT_DIAL_du)
+/*
+ * DEC_OSF/1|Digital_UNIX|Tru64_UNIX-specific items
+ */
+
+#include <fcntl.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+# if	LT_VERS<50000
+#define	snprintf	snpf		/* use lsof's snpf() */
+# endif	/* LT_VERS<50000 */
+# endif	/* defined(LT_DIAL_du) */
+
+
+# if	defined(LT_DIAL_freebsd)
+/*
+ * FreeBSD-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+# endif	/* defined(LT_DIAL_freebsd) */
+
+
+# if	defined(LT_DIAL_linux)
+/*
+ * Linux-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+#undef	USE_LSOF_C_OPT
+# endif	/* defined(LT_DIAL_linux) */
+
+
+# if	defined(LT_DIAL_hpux)
+/*
+ * HP-UX-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+# endif	/* defined(LT_DIAL_hpux) */
+
+
+# if	defined(LT_DIAL_netbsd)
+/*
+ * NetBSD-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+# endif	/* defined(LT_DIAL_netbsd) */
+
+
+# if	defined(LT_DIAL_openbsd)
+/*
+ * OpenBSD-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+#include <sys/wait.h>
+# endif	/* defined(LT_DIAL_openbsd) */
+
+
+# if	defined(LT_DIAL_ou)
+/*
+ * OpenUNIX-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+# endif	/* defined(LT_DIAL_ou) */
+
+
+# if	defined(LT_DIAL_osr)
+/*
+ * OSR-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+# endif	/* defined(LT_DIAL_osr) */
+
+
+# if	defined(LT_DIAL_ns)
+/*
+ * NEXTSTEP-specific items
+ */
+
+#include <stdlib.h>
+#include <string.h>
+#include <sys/file.h>
+#include <sys/wait.h>
+
+typedef int		pid_t;
+#define	snprintf	snpf
+
+#undef	USE_GETCWD
+# endif	/* defined(LT_DIAL_ns) */
+
+
+# if	defined(LT_DIAL_solaris)
+/*
+ * Solaris-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <unistd.h>
+#include <sys/wait.h>
+
+# if	defined(LT_VPATH)
+#undef	USE_LSOF_C_OPT
+#endif	/* defined(LT_VPATH) */
+# endif	/* defined(LT_DIAL_solaris) */
+
+
+# if	defined(LT_DIAL_uw)
+/*
+ * UnixWare-specific items
+ */
+
+#include <fcntl.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+# endif	/* defined(LT_DIAL_uw) */
+
+
+/*
+ * Local definitions, including ones may have been left undefined by
+ * dialect-specific header files
+ */
+
+#define	LT_DONT_DO_TEST		"this test does not run on this dialect."
+#define	LT_DEF_LSOF_PATH	"../lsof"
+
+# if	!defined(MAXPATHLEN)
+#define	MAXPATHLEN	1024
+# endif	/* !defined(MAXPATHLEN) */
+
+
+/*
+ * Local structure definitions
+ */
+
+typedef struct LTdev {			/* local device parameters */
+    unsigned int maj;			/* major device number */
+    unsigned int min;			/* minor device number */
+    unsigned int unit;			/* unit number (where applicable) */
+} LTdev_t;
+
+typedef struct LTfldo {			/* lsof field output information */
+    char ft;				/* field identifier (see the LSOF_FID_*
+					 * definitions in ../lsof_fields.h) */
+    char *v;				/* field value character string */
+} LTfldo_t;
+#define	LT_FLDO_ALLOC		16	/* LTfldo_t allocation increment */
+
+
+/*
+ * Lsof test library global variable external declarations:
+ *
+ *	these global variables may be found in LTlib.c.
+ */
+
+extern int LsofFd;			/* lsof pipe FD */
+extern FILE *LsofFs;			/* stream for lsof pipe FD */
+extern char *LsofPath;			/* path to lsof executable */
+extern pid_t LsofPid;			/* PID of lsof child process */
+extern int LTopt_h;			/* "-h" option's switch value */
+extern char *LTopt_p;			/* "-p path" option's path value */
+extern int MsgStat;			/* message status */
+
+
+/*
+ * External declarations
+ */
+
+extern int errno;			/* error number */
+
+
+/*
+ * Lsof test library function prototypes:
+ *
+ *	these functions may be found in LTlib.c.
+ */
+
+_PROTOTYPE(extern char *CanRdKmem,(void));
+_PROTOTYPE(extern char *ConvStatDev,(dev_t *dev, LTdev_t *ldev));
+_PROTOTYPE(extern char *ConvLsofDev,(char *dev, LTdev_t *ldev));
+_PROTOTYPE(extern char *ExecLsof,(char **opt));
+_PROTOTYPE(extern char *IsLsofExec,(void));
+_PROTOTYPE(extern void LTlibClean,(void));
+_PROTOTYPE(extern char *MkStrCpy,(char *src, int *len));
+_PROTOTYPE(extern LTfldo_t *RdFrLsof,(int *nf, char **em));
+_PROTOTYPE(extern void PrtMsg,(char *mp, char *pn));
+_PROTOTYPE(extern void PrtMsgX,(char *mp, char *pn, void (*f)(), int xv));
+_PROTOTYPE(extern int ScanArg,(int ac, char *av[], char *opt, char *pn));
+_PROTOTYPE(extern void StopLsof,(void));
+
+#endif	/* LSOF_TEST_H */
diff --git a/lsof_4.85/lsof_4.85_src/tests/Makefile b/lsof_4.85/lsof_4.85_src/tests/Makefile
new file mode 100644
index 0000000..08574a0
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/Makefile
@@ -0,0 +1,159 @@
+# Makefile for testing lsof
+#
+# V. Abell
+# Purdue University
+#
+# $Id: Makefile,v 1.17 2005/05/17 00:40:53 abe Exp abe $
+
+DEBUG=
+CFLAGS=	${DEBUG} -I. -I..
+
+HDR=	LsofTest.h
+
+CKTSTDB= CkTestDB
+CONFCFL= ./config.cflags
+CONFIG=	./config.cc ${CONFCFL} ./config.xobj
+LTOBJ=	LTlib.o
+LTSRC=	LTlib.c
+LIBOBJ=	${LTOBJ}
+
+BASTST=	LTbasic
+STDTST=	LTnlink LTsock LTszoff LTunix
+OPTTST=	LTbigf LTdnlc LTlock LTnfs 
+
+all:	${CKTSTDB} ${BASTST} ${STDTST} FRC
+	@./${CKTSTDB}; xv=$$?; \
+	if [ $$xv -ne 0 ]; then \
+	  exit 1 ;\
+	fi
+	@rm -f config.LT*
+	-@err=0; \
+	echo ""; \
+	echo "Basic test:"; \
+	./${BASTST}; \
+	if [ $$? -ne 0 ]; then \
+	  exit 1; \
+	fi; \
+	echo ""; \
+	echo "Standard tests:"; \
+	for i in ${STDTST}; do \
+	  ./$$i; \
+	  if [ $$? -ne 0 ]; then \
+	    err=`expr $$err + 1`; \
+	  fi; \
+	done; \
+	if [ $$err -ne 0 ]; then \
+	  echo "Failed tests: $$err"; \
+	  echo ""; \
+	  echo "See 00FAQ and 00TEST for more information."; \
+	else \
+	  echo "All standard tests succeeded."; \
+	  echo ""; \
+	  grep LT_DIAL_darwin ${CONFCFL} > /dev/null 2>&1; \
+	  if [ $$? -ne 0 ]; then \
+	    echo "Suggestion: try the optional tests: \"make opt\""; \
+	    echo ""; \
+	  fi; \
+	fi;
+	@rm -f config.LT*
+
+auto:	ckDB silent FRC
+
+ckDB:	${CKTSTDB} FRC
+	@echo "" | ./${CKTSTDB}; xv=$$?; \
+	if [ $$xv -ne 0 ]; then \
+	  exit 1 ;\
+	fi
+
+clean:	FRC
+	rm -f ${BASTST} ${STDTST} ${OPTTST} *.o *.err *.out config.LT*
+
+FRC:
+
+LTbasic: LTbasic.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTbasic.c \
+	${LIBOBJ} `cat config.xobj` -o LTbasic
+
+LTbigf: LTbigf.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTbigf.c \
+	${LIBOBJ} `cat config.xobj` -o LTbigf
+
+LTdnlc: LTdnlc.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTdnlc.c \
+	${LIBOBJ} `cat config.xobj` -o LTdnlc
+
+LTlock: LTlock.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTlock.c \
+	${LIBOBJ} `cat config.xobj` -o LTlock
+
+${LTOBJ}: ${HDR} ${LTSRC} config.cflags config.cc
+	`cat config.cc` ${CFLAGS} `cat config.cflags` -c ${LTSRC} \
+	-o ${LTOBJ}
+
+LTnfs:	LTnfs.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTnfs.c \
+	${LIBOBJ} `cat config.xobj` -o LTnfs
+
+LTnlink: LTnlink.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTnlink.c \
+	${LIBOBJ} `cat config.xobj` -o LTnlink
+
+LTsock: LTsock.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTsock.c \
+	${LIBOBJ} `cat config.xobj` -o LTsock `cat config.ldflags`
+
+LTszoff: LTszoff.c ${CONFIG} ${LIBOBJ} ${HDR}
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTszoff.c \
+	${LIBOBJ} `cat config.xobj` -o LTszoff
+
+LTunix: LTunix.c ${CONFIG} ${LIBOBJ} ${HDR} config.ldflags
+	`cat config.cc` ${CFLAGS} `cat config.cflags` LTunix.c \
+	${LIBOBJ} `cat config.xobj` -o LTunix `cat config.ldflags`
+
+opt:	${CKTSTDB} ${OPTTST} FRC
+	@rm -f config.LT*
+	-@err=0; \
+	echo ""; \
+	echo "Optional tests:"; \
+	for i in ${OPTTST}; do \
+	  ./$$i; \
+	  if [ $$? -ne 0 ]; then \
+	    err=`expr $$err + 1`; \
+	  fi; \
+	done; \
+	if [ $$err -ne 0 ]; then \
+	  echo "Failed tests: $$err"; \
+	else \
+	  echo "All optional tests succeeded."; \
+	fi; \
+	echo "";
+	@rm -f config.LT*
+
+optional: opt
+
+silent:	${BASTST} ${STDTST} FRC
+	@rm -f config.LT*
+	@err=0; \
+	./${BASTST} > /dev/null 2>&1; \
+	if [ $$? -ne 0 ]; then \
+	  exit 1; \
+	fi; \
+	for i in ${STDTST}; do \
+	  ./$$i > /dev/null 2>&1; \
+	  if [ $$? -ne 0 ]; then \
+	    err=`expr $$err + 1`; \
+	  fi; \
+	done; \
+	rm -f config.LT*; \
+	if [ $$err -ne 0 ]; then \
+	  exit 1; \
+	fi
+
+spotless: clean
+	rm -f config.*
+
+standard: all
+
+std: all
+
+test: all
diff --git a/lsof_4.85/lsof_4.85_src/tests/TestDB b/lsof_4.85/lsof_4.85_src/tests/TestDB
new file mode 100644
index 0000000..8e96b61
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/tests/TestDB
@@ -0,0 +1,130 @@
+# TestDB -- lsof test suite data base
+#
+# This file contains the sorted words from config.cflags, less any leading "-D"
+# strings, joined on one line.
+#
+# See Add2TestDB for a script that will build a line for this file.
+#
+# $Id: TestDB,v 1.37 2011/09/27 17:36:16 abe Exp $
+
+LT_AIXA=0 LT_BIGF LT_CC LT_DIAL_aix LT_KMEM LT_VERS=4320
+LT_AIXA=0 LT_BIGF LT_CC LT_DIAL_aix LT_KMEM LT_VERS=4330
+LT_AIXA=1 LT_BIGF LT_CC LT_DIAL_aix LT_K64 LT_KMEM LT_VERS=5000
+LT_AIXA=0 LT_BIGF LT_CC LT_DIAL_aix LT_KMEM LT_VERS=5100
+LT_AIXA=0 LT_BIGF LT_DIAL_aix LT_GCC LT_KMEM LT_VERS=5100
+LT_AIXA=1 LT_BIGF LT_CC LT_DIAL_aix LT_K64 LT_KMEM LT_VERS=5100
+LT_AIXA=0 LT_BIGF LT_CC LT_DIAL_aix LT_KMEM LT_VERS=5200
+LT_AIXA=0 LT_BIGF LT_DIAL_aix LT_GCC LT_KMEM LT_VERS=5200
+LT_AIXA=1 LT_BIGF LT_CC LT_DIAL_aix LT_K64 LT_KMEM LT_VERS=5200
+LT_AIXA=1 LT_BIGF LT_DIAL_aix LT_GCC LT_K64 LT_KMEM LT_VERS=5200
+LT_AIXA=1 LT_BIGF LT_CC LT_DIAL_aix LT_K64 LT_KMEM LT_VERS=5300
+LT_BIGF LT_DIAL_bsdi LT_GCC LT_KMEM LT_VERS=40100
+LT_BIGF LT_DIAL_bsdi LT_GCC LT_KMEM LT_VERS=40300
+LT_CC LT_DIAL_darwin LT_KMEM LT_VERS=140
+LT_CC LT_DIAL_darwin LT_KMEM LT_VERS=530
+LT_CC LT_DIAL_darwin LT_KMEM LT_VERS=600
+LT_CC LT_DIAL_darwin LT_KMEM LT_VERS=700
+LT_CC LT_DIAL_darwin LT_KMEM LT_VERS=800
+LT_CC LT_DIAL_darwin LT_VERS=800
+LT_BIGF LT_CC LT_DIAL_darwin LT_KMEM LT_VERS=800
+LT_CC LT_DIAL_darwin LT_VERS=900
+LT_BIGF LT_CC LT_DIAL_darwin LT_VERS=900
+LT_BIGF LT_CC LT_DIAL_darwin LT_VERS=1000
+LT_BIGF LT_CC LT_DIAL_du LT_K64 LT_KMEM LT_VERS=40000
+LT_BIGF LT_CC LT_DIAL_du LT_K64 LT_KMEM LT_VERS=50000
+LT_BIGF LT_CC LT_DIAL_du LT_K64 LT_KMEM LT_VERS=50100
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4050
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4060
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4070
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4080
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4090
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4100
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=4110
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=5000
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=5010
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=5020
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=5030
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=5040
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=5050
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=6000
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=6010
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=6020
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=6040
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=7000
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=7010
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=7020
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=7030
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=7040
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=8000
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=8020
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=9000
+LT_BIGF LT_CC LT_DIAL_hpux LT_KMEM LT_VERS=1020 _LARGEFILE64_SOURCE
+LT_BIGF LT_DIAL_hpux LT_GCC LT_KMEM LT_VERS=1020 _LARGEFILE64_SOURCE
+LT_BIGF LT_CC LT_DIAL_hpux LT_KMEM LT_VERS=1100 _LARGEFILE64_SOURCE
+LT_BIGF LT_CC LT_DIAL_hpux LT_K64 LT_KMEM LT_VERS=1100 _LARGEFILE64_SOURCE
+LT_BIGF LT_CC LT_DIAL_hpux LT_K64 LT_VERS=1111 _LARGEFILE64_SOURCE
+LT_BIGF LT_CC LT_DIAL_hpux LT_K64 LT_VERS=1123 _LARGEFILE64_SOURCE
+LT_BIGF LT_DIAL_hpux LT_GCC LT_K64 LT_VERS=1123 _LARGEFILE64_SOURCE
+LT_BIGF LT_CC LT_DIAL_hpux LT_K64 LT_VERS=1131 _LARGEFILE64_SOURCE
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24012 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24018 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24021 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24023 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24024 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24025 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24026 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24027 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24028 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24029 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=24030 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=26000 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=26018 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=26022 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=26032 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=26038 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=1005000
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=1006000
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=2000000
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=2099009
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=2099010
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=2099011
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=2099012
+LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=3099000
+LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=1040
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3000
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3010
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3020
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3030
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3040
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3050
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3060
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3070
+LT_BIGF LT_CC LT_DIAL_openbsd LT_KMEM LT_VERS=3090
+LT_CC LT_DIAL_osr LT_KMEM LT_VERS=504
+LT_CC LT_DIAL_osr LT_KMEM LT_VERS=506
+LT_DIAL_ns LT_GCC LT_KMEM LT_VERS=31
+LT_CC LT_DIAL_ns LT_KMEM LT_VERS=42
+LT_CC LT_DIAL_solaris LT_KMEM LT_VERS=20600
+LT_DIAL_solaris LT_GCC LT_KMEM LT_VERS=20600
+LT_BIGF LT_CC LT_DIAL_solaris LT_KMEM LT_VERS=70000
+LT_BIGF LT_CC LT_DIAL_solaris LT_K64 LT_KMEM LT_VERS=70000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_KMEM LT_VERS=70000
+LT_BIGF LT_CC LT_DIAL_solaris LT_KMEM LT_VERS=80000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_KMEM LT_VERS=80000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_K64 LT_KMEM LT_VERS=80000
+LT_BIGF LT_CC LT_DIAL_solaris LT_K64 LT_KMEM LT_VERS=80000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_KMEM LT_VERS=90000
+LT_BIGF LT_CC LT_DIAL_solaris LT_K64 LT_KMEM LT_VERS=90000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_K64 LT_KMEM LT_VERS=90000
+LT_BIGF LT_CC LT_DIAL_solaris LT_KMEM LT_VERS=100000
+LT_BIGF LT_CC LT_DIAL_solaris LT_K64 LT_KMEM LT_VERS=100000 LT_VPATH
+LT_BIGF LT_DIAL_solaris LT_GCC LT_KMEM LT_VERS=100000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_KMEM LT_VERS=100000 LT_VPATH
+LT_BIGF LT_CC LT_DIAL_solaris LT_K64 LT_KMEM LT_VERS=100000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_K64 LT_KMEM LT_VERS=100000
+LT_BIGF LT_DIAL_solaris LT_GCC LT_K64 LT_KMEM LT_VERS=100000 LT_VPATH
+LT_BIGF LT_CC LT_DIAL_solaris LT_K64 LT_KMEM LT_VERS=110000 LT_VPATH
+LT_BIGF LT_DIAL_solaris LT_GCC LT_K64 LT_KMEM LT_VERS=110000 LT_VPATH
+LT_BIGF LT_CC LT_DIAL_uw LT_KMEM LT_VERS=70101
+LT_BIGF LT_CC LT_DIAL_uw LT_KMEM LT_VERS=70103
+LT_BIGF LT_CC LT_DIAL_uw LT_KMEM LT_VERS=70104
diff --git a/lsof_4.85/lsof_4.85_src/usage.c b/lsof_4.85/lsof_4.85_src/usage.c
new file mode 100644
index 0000000..a4f4187
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/usage.c
@@ -0,0 +1,965 @@
+/*
+ * usage.c - usage functions for lsof
+ */
+
+
+/*
+ * Copyright 1998 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.
+ */
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 1998 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: usage.c,v 1.30 2011/09/07 19:13:49 abe Exp $";
+#endif
+
+
+#include "lsof.h"
+#include "version.h"
+
+
+/*
+ * Local function prototypes
+ */
+
+_PROTOTYPE(static char *isnullstr,(char *s));
+_PROTOTYPE(static int print_in_col,(int col, char *cp));
+_PROTOTYPE(static void report_HASDCACHE,(int type, char *ttl, char *det));
+_PROTOTYPE(static void report_HASKERNIDCK,(char *pfx, char *verb));
+_PROTOTYPE(static void report_SECURITY,(char *pfx, char *punct));
+_PROTOTYPE(static void report_WARNDEVACCESS,(char *pfx, char *verb,
+					     char *punct));
+
+
+/*
+ * isnullstr() - is it a null string?
+ */
+
+static char *
+isnullstr(s)
+	char *s;			/* string pointer */
+{
+	if (!s)
+		return((char *)NULL);
+	while (*s) {
+		if (*s != ' ')
+			return(s);
+		s++;
+	}
+	return((char *)NULL);
+}
+
+
+/*
+ * print_in_col() -- print character string in help column
+ */
+
+static int
+print_in_col(col, cp)
+	int col;				/* column number */
+	char *cp;				/* what to print */
+{
+	if (cp && *cp) {
+	    switch (col) {
+	    case 1:
+		(void) fprintf(stderr, "  %-23.23s", cp);
+		break;
+	    case 2:
+		(void) fprintf(stderr, "  %-25.25s", cp);
+		break;
+	    default:
+		(void) fprintf(stderr, "  %s\n", cp);
+		col = 0;
+	    }
+	    col++;
+	}
+	return(col);
+}
+
+
+/*
+ * report_HASDCACHE() -- report device cache file state
+ */
+
+static void
+report_HASDCACHE(type, ttl, det)
+	int type;				/* type: 0 == read path report
+						 *       1 == full report */
+	char *ttl;				/* title lines prefix
+						 * (NULL if none) */
+	char *det;				/* detail lines prefix
+						 * (NULL if none) */
+{
+
+#if	defined(HASDCACHE)
+	char *cp;
+	int dx;
+
+# if	defined(WILLDROPGID)
+	int saved_Setgid = Setgid;
+
+	Setgid = 0;
+# endif	/* defined(WILLDROPGID) */
+
+	if (type) {
+
+	/*
+	 * Report full device cache information.
+	 */
+	    (void) fprintf(stderr, "%sDevice cache file read-only paths:\n",
+		ttl ? ttl : "");
+	    if ((dx = dcpath(1, 0)) < 0)
+		(void) fprintf(stderr, "%snone\n", det ? det : "");
+	    else {
+		(void) fprintf(stderr, "%sNamed via -D: %s\n",
+		    det ? det : "",
+		    DCpath[0] ? DCpath[0] : "none");
+
+# if	defined(HASENVDC)
+		(void) fprintf(stderr,
+		    "%sNamed in environment variable %s: %s\n",
+		    det ? det : "",
+		    HASENVDC, DCpath[1] ? DCpath[1] : "none");
+# endif	/* defined(HASENVDC) */
+
+# if	defined(HASSYSDC)
+		if (DCpath[2])
+		    (void) fprintf(stderr,
+			"%sSystem-wide device cache: %s\n",
+			det ? det : "",
+			DCpath[2]);
+# endif	/* defined(HASSYSDC) */
+
+# if	defined(HASPERSDC)
+		(void) fprintf(stderr,
+		    "%sPersonal path format (HASPERSDC): \"%s\"\n",
+		    det ? det : "",
+		    HASPERSDC);
+#  if	defined(HASPERSDCPATH)
+		(void) fprintf(stderr,
+		    "%sModified personal path environment variable: %s\n",
+		    det ? det : "",
+		    HASPERSDCPATH);
+		cp = getenv(HASPERSDCPATH);
+		(void) fprintf(stderr, "%s%s value: %s\n",
+		    det ? det : "",
+		    HASPERSDCPATH, cp ? cp : "none");
+#  endif	/* defined(HASPERSDCPATH) */
+		(void) fprintf(stderr, "%sPersonal path: %s\n",
+		    det ? det : "",
+		    DCpath[3] ? DCpath[3] : "none");
+# endif	/* defined(HASPERSDC) */
+	    }
+	    (void) fprintf(stderr, "%sDevice cache file write paths:\n",
+		ttl ? ttl : "");
+	    if ((dx = dcpath(2, 0)) < 0)
+		(void) fprintf(stderr, "%snone\n", det ? det : "");
+	    else {
+		(void) fprintf(stderr, "%sNamed via -D: %s\n",
+		    det ? det : "",
+		    DCstate == 2 ? "none"
+				 : DCpath[0] ? DCpath[0] : "none");
+
+# if	defined(HASENVDC)
+		(void) fprintf(stderr,
+		    "%sNamed in environment variable %s: %s\n",
+		    det ? det : "",
+		    HASENVDC, DCpath[1] ? DCpath[1] : "none");
+# endif	/* defined(HASENVDC) */
+
+# if	defined(HASPERSDC)
+		(void) fprintf(stderr,
+		    "%sPersonal path format (HASPERSDC): \"%s\"\n",
+		    det ? det : "",
+		    HASPERSDC);
+#  if	defined(HASPERSDCPATH)
+		(void) fprintf(stderr,
+		    "%sModified personal path environment variable: %s\n",
+		    det ? det : "",
+		    HASPERSDCPATH);
+		cp = getenv(HASPERSDCPATH);
+		(void) fprintf(stderr, "%s%s value: %s\n",
+		    det ? det : "",
+		    HASPERSDCPATH, cp ? cp : "none");
+#  endif	/* defined(HASPERSDCPATH) */
+		 (void) fprintf(stderr, "%sPersonal path: %s\n",
+		    det ? det : "",
+		    DCpath[3] ? DCpath[3] : "none");
+# endif	/* defined(HASPERSDC) */
+	    }
+	} else {
+
+	/*
+	 * Report device cache read file path.
+	 */
+
+# if	defined(HASENVDC) || defined(HASPERSDC) || defined(HASSYSDC)
+	    cp = NULL;
+#  if	defined(HASENVDC)
+	    if ((dx = dcpath(1, 0)) >= 0)
+		cp = DCpath[1];
+#  endif	/* defined(HASENVDC) */
+#  if	defined(HASSYSDC)
+	    if (!cp)
+		cp = HASSYSDC;
+#  endif	/* defined(HASSYSDC) */
+#  if	defined(HASPERSDC)
+	    if (!cp && dx != -1 && (dx = dcpath(1, 0)) >= 0)
+		cp = DCpath[3];
+#  endif	/* defined(HASPERSDC) */
+	    if (cp)
+		(void) fprintf(stderr,
+		    "%s%s is the default device cache file read path.\n",
+		    ttl ? ttl : "",
+		    cp
+		);
+# endif    /* defined(HASENVDC) || defined(HASPERSDC) || defined(HASSYSDC) */
+	}
+
+# if	defined(WILLDROPGID)
+	Setgid = saved_Setgid;
+# endif	/* defined(WILLDROPGID) */
+
+#endif	/* defined(HASDCACHE) */
+
+}
+
+
+/*
+ * report_HASKERNIDCK() -- report HASKERNIDCK state
+ */
+
+static void
+report_HASKERNIDCK(pfx, verb)
+	char *pfx;				/* prefix (NULL if none) */
+	char *verb;				/* verb (NULL if none) */
+{
+	(void) fprintf(stderr, "%sernel ID check %s%s%s.\n",
+	    pfx ? pfx : "",
+	    verb ? verb : "",
+	    verb ? " " : "",
+
+#if	defined(HASKERNIDCK)
+		"enabled"
+#else	/* !defined(HASKERNIDCK) */
+		"disabled"
+#endif	/* defined(HASKERNIDCK) */
+
+	    );
+}
+
+
+/*
+ * report_SECURITY() -- report *SECURITY states
+ */
+
+static void
+report_SECURITY(pfx, punct)
+	char *pfx;				/* prefix (NULL if none) */
+	char *punct;				/* short foem punctuation
+						 * (NULL if none) */
+{
+	fprintf(stderr, "%s%s can list all files%s",
+	    pfx ? pfx : "",
+
+#if	defined(HASSECURITY)
+	    "Only root",
+# if	defined(HASNOSOCKSECURITY)
+	    ", but anyone can list socket files.\n"
+# else	/* !defined(HASNOSOCKSECURITY) */
+	    punct ? punct : ""
+# endif	/* defined(HASNOSOCKSECURITY) */
+#else	/* !defined(HASSECURITY) */
+	    "Anyone",
+	    punct ? punct : ""
+#endif	/* defined(HASSECURITY) */
+
+	);
+}
+
+
+/*
+ * report_WARNDEVACCESS() -- report WEARNDEVACCESS state
+ */
+
+static void
+report_WARNDEVACCESS(pfx, verb, punct)
+	char *pfx;				/* prefix (NULL if none) */
+	char *verb;				/* verb (NULL if none) */
+	char *punct;				/* punctuation */
+{
+	(void) fprintf(stderr, "%s/dev warnings %s%s%s%s",
+	    pfx ? pfx : "",
+	    verb ? verb : "",
+	    verb ? " " : "",
+
+#if	defined(WARNDEVACCESS)
+	    "enabled",
+#else	/* !defined(WARNDEVACCESS) */
+	    "disabled",
+#endif	/* defined(WARNDEVACCESS) */
+
+	    punct);
+}
+
+
+/*
+ * usage() - display usage and exit
+ */
+
+void
+usage(xv, fh, version)
+	int xv;				/* exit value */
+	int fh;				/* ``-F ?'' status */
+	int version;			/* ``-v'' status */
+{
+	char buf[MAXPATHLEN+1], *cp, *cp1, *cp2;
+	int col, i;
+
+	if (Fhelp || xv) {
+	    (void) fprintf(stderr, "%s %s\n latest revision: %s\n",
+		Pn, LSOF_VERSION, LSOF_URL);
+	    (void) fprintf(stderr, " latest FAQ: %sFAQ\n", LSOF_URL);
+	    (void) fprintf(stderr, " latest man page: %slsof_man\n", LSOF_URL);
+	    (void) fprintf(stderr,
+		" usage: [-?ab%sh%slnNoOP%s%stUvV%s]",
+
+#if	defined(HASNCACHE)
+		"C",
+#else	/* !defined(HASNCACHE) */
+		"",
+#endif	/* defined(HASNCACHE) */
+
+#if	defined(HASTASKS)
+		"K",
+#else	/* !defined(HASTASKS) */
+		"",
+#endif	/* defined(HASTASKS) */
+
+#if	defined(HASPPID)
+		"R",
+#else	/* !defined(HASPPID) */
+		"",
+#endif	/* defined(HASPPID) */
+
+#if	defined(HASTCPUDPSTATE)
+		"",
+#else	/* !defined(HASTCPUDPSTATE) */
+		"s",
+#endif	/* defined(HASTCPUDPSTATE) */
+
+#if	defined(HASXOPT)
+# if	defined(HASXOPT_ROOT)
+		(Myuid == 0) ? "X" : ""
+# else	/* !defined(HASXOPT_ROOT) */
+		"X"
+# endif	/* defined(HASXOPT_ROOT) */
+#else	/* !defined(HASXOPT) */
+		""
+#endif	/* defined(HASXOPT) */
+
+	    );
+
+#if	defined(HAS_AFS) && defined(HASAOPT)
+	    (void) fprintf(stderr, " [-A A]");
+#endif	/* defined(HAS_AFS) && defined(HASAOPT) */
+
+	    (void) fprintf(stderr, " [+|-c c] [+|-d s] [+%sD D]",
+
+#if	defined(HASDCACHE)
+		"|-"
+#else	/* !defined(HASDCACHE) */
+		""
+#endif	/* defined(HASDCACHE) */
+
+		);
+
+	    (void) fprintf(stderr,
+		" [+|-f%s%s%s%s%s%s]%s\n [-F [f]] [-g [s]] [-i [i]]",
+
+#if	defined(HASFSTRUCT)
+		"[",
+
+# if	defined(HASNOFSCOUNT)
+		"",
+# else	/* !defined(HASNOFSCOUNT) */
+		"c",
+# endif	/* defined(HASNOFSCOUNT) */
+
+# if	defined(HASNOFSADDR)
+		"",
+# else	/* !defined(HASNOFSADDR) */
+		"f",
+# endif	/* defined(HASNOFSADDR) */
+
+# if	defined(HASNOFSFLAGS)
+		"",
+# else	/* !defined(HASNOFSFLAGS) */
+		"gG",
+# endif	/* defined(HASNOFSFLAGS) */
+
+# if	defined(HASNOFSNADDR)
+		"",
+# else	/* !defined(HASNOFSNADDR) */
+		"n",
+# endif	/* defined(HASNOFSNADDR) */
+
+		"]",
+#else	/* !defined(HASFSTRUCT) */
+		"", "", "", "", "", "",
+#endif	/* defined(HASFSTRUCT) */
+
+#if	defined(HASEOPT)
+		" [+|-e s]"
+#else	/* !defined(HASEOPT) */
+		""
+#endif	/* defined(HASEOPT) */
+
+		);
+
+#if	defined(HASKOPT)
+	    (void) fprintf(stderr, " [-k k]");
+#endif	/* defined(HASKOPT) */
+
+	    (void) fprintf(stderr, " [+|-L [l]]");
+
+#if	defined(HASMOPT) || defined(HASMNTSUP)
+	    (void) fprintf(stderr,
+# if	defined(HASMOPT)
+#  if	defined(HASMNTSUP)
+		" [+|-m [m]]"
+#  else	/* !defined(HASMNTSUP) */
+		" [-m m]"
+#  endif	/* defined(HASMNTSUP) */
+# else	/* !defined(HASMOPT) */
+		" [+m [m]]"
+# endif	/* defined(HASMOPT) */
+		);
+#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */
+
+#if	!defined(HASNORPC_H)
+	    (void) fprintf(stderr, " [+|-M]");
+#endif	/* !defined(HASNORPC_H) */
+
+	    (void) fprintf(stderr,
+		" [-o [o]] [-p s]\n[+|-r [t]]%s [-S [t]] [-T [t]]",
+
+#if	defined(HASTCPUDPSTATE)
+		" [-s [p:s]]"
+#else	/* !defined(HASTCPUDPSTATE) */
+		""
+#endif	/* defined(HASTCPUDPSTATE) */
+
+		);
+	    (void) fprintf(stderr, " [-u s] [+|-w] [-x [fl]]");
+
+#if	defined(HASZONES)
+	    (void) fprintf(stderr, " [-z [z]]");
+#else	/* !defined(HASZONES) */
+# if	defined(HASSELINUX)
+	    if (CntxStatus)
+		(void) fprintf(stderr, " [-Z [Z]]");
+# endif	/* defined(HASSELINUX) */
+#endif	/* defined(HASZONES) */
+
+	    (void) fprintf(stderr, " [--] [names]\n");
+	}
+	if (xv && !Fhelp) {
+	    (void) fprintf(stderr,
+		"Use the ``-h'' option to get more help information.\n");
+	    if (!fh)
+    		Exit(xv);
+	}
+	if (Fhelp) {
+	    (void) fprintf(stderr,
+		"Defaults in parentheses; comma-separated set (s) items;");
+	    (void) fprintf(stderr, " dash-separated ranges.\n");
+	    col = print_in_col(1, "-?|-h list help");
+	    col = print_in_col(col, "-a AND selections (OR)");
+	    col = print_in_col(col, "-b avoid kernel blocks");
+	    col = print_in_col(col,  "-c c  cmd c ^c /c/[bix]");
+	    (void) snpf(buf, sizeof(buf), "+c w  COMMAND width (%d)", CMDL);
+	    col = print_in_col(col, buf);
+
+#if	defined(HASNCACHE)
+	   col = print_in_col(col, "-C no kernel name cache");
+#endif	/* defined(HASNCACHE) */
+
+	    col = print_in_col(col, "+d s  dir s files");
+	    col = print_in_col(col,  "-d s  select by FD set");
+	    col = print_in_col(col,  "+D D  dir D tree *SLOW?*");
+
+#if	defined(HASDCACHE)
+	    if (Setuidroot)
+		cp = "?|i|r";
+
+# if	!defined(WILLDROPGID)
+	    else if (Myuid)
+		cp = "?|i|r<path>";
+# endif	/* !defined(WILLDROPGID) */
+
+	    else
+		cp = "?|i|b|r|u[path]";
+	    (void) snpf(buf, sizeof(buf), "-D D  %s", cp);
+#else	/* !defined(HASDCACHE) */
+	    buf[0] = '\0';
+#endif	/* defined(HASDCACHE) */
+
+	    col = print_in_col(col, buf);
+
+#if	defined(HASEOPT)
+	    col = print_in_col(col, "+|-e s  exempt s *RISKY*");
+#endif	/* defined(HASEOPT) */
+
+	    (void) snpf(buf, sizeof(buf), "-i select IPv%s files",
+
+#if	defined(HASIPv6)
+			  "[46]"
+#else	/* !defined(HASIPv6) */
+			  "4"
+#endif	/* defined(HASIPv6) */
+
+			  );
+	    col = print_in_col(col, buf);
+
+#if	defined(HASTASKS)
+	    col = print_in_col(col, "-K list tasKs");
+#endif	/* defined(HASTASKS) */
+
+	    col = print_in_col(col, "-l list UID numbers");
+	    col = print_in_col(col, "-n no host names");
+	    col = print_in_col(col, "-N select NFS files");
+	    col = print_in_col(col, "-o list file offset");
+	    col = print_in_col(col, "-O no overhead *RISKY*");
+	    col = print_in_col(col, "-P no port names");
+
+#if	defined(HASPPID)
+	     col = print_in_col(col, "-R list paRent PID");
+#endif	/* defined(HASPPID) */
+
+	    col = print_in_col(col,  "-s list file size");
+	    col = print_in_col(col,  "-t terse listing");
+	    col = print_in_col(col,  "-T disable TCP/TPI info");
+	    col = print_in_col(col,  "-U select Unix socket");
+	    col = print_in_col(col,  "-v list version info");
+	    col = print_in_col(col,  "-V verbose search");
+	    (void) snpf(buf, sizeof(buf), "+|-w  Warnings (%s)",
+
+#if	defined(WARNINGSTATE)
+		"-");
+#else	/* !defined(WARNINGSTATE) */
+		"+");
+#endif	/* defined(WARNINGSTATE) */
+
+	    col = print_in_col(col, buf);
+
+#if	defined(HASXOPT)
+# if	defined(HASXOPT_ROOT)
+	    if (Myuid == 0)
+		(void) snpf(buf, sizeof(buf), "-X %s", HASXOPT);
+	    else
+		buf[0] = '\0';
+# else	/* !defined(HASXOPT_ROOT) */
+	    (void) snpf(buf, sizeof(buf), "-X %s", HASXOPT);
+# endif	/* defined(HASXOPT_ROOT) */
+# else	/* !defined(HASXOPT) */
+	    buf[0] = '\0';
+#endif	/* defined(HASXOPT) */
+
+	    col = print_in_col(col, buf);
+
+#if	defined(HASZONES)
+	    col = print_in_col(col, "-z z  zone [z]");
+#endif	/* defined(HASZONES) */
+
+#if	defined(HASSELINUX)
+	    col = print_in_col(col, "-Z Z  context [Z]");
+#endif	/* defined(HASSELINUX) */
+
+	    col = print_in_col(col, "-- end option scan");
+	    if (col != 1)
+		(void) fprintf(stderr, "\n");
+	    (void) fprintf(stderr, "  %-36.36s",
+		"+f|-f  +filesystem or -file names");
+
+#if	defined(HASFSTRUCT)
+	    (void) fprintf(stderr,
+		"  +|-f[%s%s%s%s]%s%s%s%s %s%s%s%s%s%s%s\n",
+
+# if	defined(HASNOFSCOUNT)
+		"",
+# else	/* !defined(HASNOFSCOUNT) */
+		"c",
+# endif	/* defined(HASNOFSCOUNT) */
+
+# if	defined(HASNOFSADDR)
+		"",
+# else	/* !defined(HASNOFSADDR) */
+		"f",
+# endif	/* defined(HASNOFSADDR) */
+
+# if	defined(HASNOFSFLAGS)
+		"",
+# else	/* !defined(HASNOFSFLAGS) */
+		"gG",
+# endif	/* defined(HASNOFSFLAGS) */
+
+# if	defined(HASNOFSNADDR)
+		"",
+# else	/* !defined(HASNOFSNADDR) */
+		"n",
+# endif	/* defined(HASNOFSNADDR) */
+
+# if	defined(HASNOFSCOUNT)
+		"",
+# else	/* !defined(HASNOFSCOUNT) */
+		" Ct",
+# endif	/* defined(HASNOFSCOUNT) */
+
+# if	defined(HASNOFSADDR)
+		"",
+# else	/* !defined(HASNOFSADDR) */
+		" Fstr",
+# endif	/* defined(HASNOFSADDR) */
+
+# if	defined(HASNOFSFLAGS)
+		"",
+# else	/* !defined(HASNOFSFLAGS) */
+		" flaGs",
+# endif	/* defined(HASNOFSFLAGS) */
+
+# if	defined(HASNOFSNADDR)
+		"",
+# else	/* !defined(HASNOFSNADDR) */
+		" Node",
+# endif	/* defined(HASNOFSNADDR) */
+
+		Fsv ? "(" : "",
+		(Fsv & FSV_CT) ? "C" : "",
+		(Fsv & FSV_FA) ? "F" : "",
+		((Fsv & FSV_FG) && FsvFlagX)  ? "g" : "",
+		((Fsv & FSV_FG) && !FsvFlagX) ? "G" : "",
+		(Fsv & FSV_NI) ? "N" : "",
+		Fsv ? ")" : "");
+#else	/* !defined(HASFSTRUCT) */
+	    putc('\n', stderr);
+#endif	/* defined(HASFSTRUCT) */
+
+	    (void) fprintf(stderr, "  %-36.36s",
+		"-F [f] select fields; -F? for help");
+
+#if	defined(HASKOPT)
+	    (void) fprintf(stderr,
+		"  -k k   kernel symbols (%s)\n",
+		Nmlst ? Nmlst
+# if	defined(N_UNIX)
+		      : N_UNIX
+# else	/* !defined(N_UNIX) */
+		      : (Nmlst = get_nlist_path(1)) ? Nmlst
+						    : "none found"
+# endif	/* defined(N_UNIX) */
+
+	    );
+#else	/* !defined(HASKOPT) */
+	    putc('\n', stderr);
+#endif	/* defined(HASKOPT) */
+
+	    (void) fprintf(stderr,
+		"  +|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)\n");
+
+#if	defined(HASMOPT) || defined(HASMNTSUP)
+# if	defined(HASMOPT)
+	    (void) snpf(buf, sizeof(buf), "-m m   kernel memory (%s)", KMEM);
+# else	/* !defined(HASMOPT) */
+	    buf[0] = '\0';
+# endif	/* defined(HASMOPT) */
+
+	    (void) fprintf(stderr, "  %-36.36s", buf);
+
+# if	defined(HASMNTSUP)
+	    (void) fprintf(stderr, "  +m [m] use|create mount supplement\n");
+# else	/* !defined(HASMNTSUP) */
+	    (void) fprintf(stderr, "\n");
+# endif	/* defined(HASMNTSUP) */
+#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */
+
+#if	!defined(HASNORPC_H)
+	    (void) snpf(buf, sizeof(buf), "+|-M   portMap registration (%s)",
+
+# if	defined(HASPMAPENABLED)
+		"+"
+# else	/* !defined(HASPMAPENABLED) */
+		"-"
+# endif	/* defined(HASPMAPENABLED) */
+
+	    );
+#else	/* defined(HASNORPC_H) */
+	    buf[0] = '\0';
+#endif	/* !defined(HASNORPC_H) */
+
+	    (void) fprintf(stderr, "  %-36.36s", buf);
+	    (void) snpf(buf, sizeof(buf), "-o o   o 0t offset digits (%d)",
+		OFFDECDIG);
+	    (void) fprintf(stderr, "  %s\n", buf);
+	    (void) fprintf(stderr, "  %-36.36s",
+		"-p s   exclude(^)|select PIDs");
+	    (void) fprintf(stderr, "  -S [t] t second stat timeout (%d)\n",
+		TMLIMIT);
+	    (void) snpf(buf, sizeof(buf),
+		"-T %s%ss%s TCP/TPI %s%sSt%s (s) info",
+
+#if	defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
+		"f",
+#else	/* !defined(HASSOOPT) && !defined(HASSOSTATE) && !defined(HASTCPOPT)*/
+		"",
+#endif	/* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)*/
+
+#if 	defined(HASTCPTPIQ)
+		"q",
+#else	/* !defined(HASTCPTPIQ) */
+		" ",
+#endif	/* defined(HASTCPTPIQ) */
+
+#if 	defined(HASTCPTPIW)
+		"w",
+#else	/* !defined(HASTCPTPIW) */
+		"",
+#endif	/* defined(HASTCPTPIW) */
+
+#if	defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
+		"Fl,",
+#else	/* !defined(HASSOOPT) && !defined(HASSOSTATE) && !defined(HASTCPOPT)*/
+		"",
+#endif	/* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)*/
+
+#if 	defined(HASTCPTPIQ)
+		"Q,",
+#else	/* !defined(HASTCPTPIQ) */
+		"",
+#endif	/* defined(HASTCPTPIQ) */
+
+#if 	defined(HASTCPTPIW)
+		",Win"
+#else	/* !defined(HASTCPTPIW) */
+		""
+#endif	/* defined(HASTCPTPIW) */
+
+	    );
+	    (void) fprintf(stderr, "  %s\n", buf);
+
+#if	defined(HAS_AFS) && defined(HASAOPT)
+	    (void) fprintf(stderr,
+		"  -A A   AFS name list file (%s)\n", AFSAPATHDEF);
+#endif	/* defined(HAS_AFS) && defined(HASAOPT) */
+
+	    (void) fprintf(stderr,
+		"  -g [s] exclude(^)|select and print process group IDs\n");
+	    (void) fprintf(stderr, "  -i i   select by IPv%s address:",
+
+#if	defined(HASIPv6)
+			  "[46]"
+#else	/* !defined(HASIPv6) */
+			  "4"
+#endif	/* defined(HASIPv6) */
+
+			  );
+	    (void) fprintf(stderr,
+		" [%s][proto][@host|addr][:svc_list|port_list]\n",
+
+#if	defined(HASIPv6)
+		"46"
+#else	/* !defined(HASIPv6) */
+		"4"
+#endif	/* defined(HASIPv6) */
+
+		);
+
+	    (void) fprintf(stderr,
+		"  +|-r [%s] repeat every t seconds (%d); %s",
+
+#if	defined(HAS_STRFTIME)
+		"t[m<fmt>]",
+#else	/* !defined(has_STRFTIME) */
+		"t",
+#endif	/* defined(HAS_STRFTIME) */
+
+		RPTTM,
+		" + until no files, - forever.\n");
+
+#if	defined(HAS_STRFTIME)
+	    (void) fprintf(stderr,
+		"       An optional suffix to t is m<fmt>; m must separate %s",
+		"t from <fmt> and\n");
+	    (void) fprintf(stderr, "      <fmt> is an strftime(3) format %s",
+		"for the marker line.\n");
+#endif	/* defined(HAS_STRFTIME) */
+
+#if	defined(HASTCPUDPSTATE)
+	    (void) fprintf(stderr,
+		"  -s p:s  exclude(^)|select protocol (p = TCP|UDP) states");
+	    (void) fprintf(stderr, " by name(s).\n");
+#endif	/* defined(HASTCPUDPSTATE) */
+
+	    (void) fprintf(stderr,
+		"  -u s   exclude(^)|select login|UID set s\n");
+	    (void) fprintf(stderr,
+		"  -x [fl] cross over +d|+D File systems or symbolic Links\n");
+	    (void) fprintf(stderr,
+		"  names  select named files or files on named file systems\n");
+	    (void) report_SECURITY(NULL, "; ");
+	    (void) report_WARNDEVACCESS(NULL, NULL, ";");
+	    (void) report_HASKERNIDCK(" k", NULL);
+	    (void) report_HASDCACHE(0, NULL, NULL);
+
+#if	defined(DIALECT_WARNING)
+	    (void) fprintf(stderr, "WARNING: %s\n", DIALECT_WARNING);
+#endif	/* defined(DIALECT_WARNING) */
+
+	}
+	if (fh) {
+	    (void) fprintf(stderr, "%s:\tID    field description\n", Pn);
+	    for (i = 0; FieldSel[i].nm; i++) {
+
+#if	!defined(HASPPID)
+		if (FieldSel[i].id == LSOF_FID_PPID)
+		    continue;
+#endif	/* !defined(HASPPID) */
+
+#if	!defined(HASFSTRUCT)
+		if (FieldSel[i].id == LSOF_FID_FA
+		||  FieldSel[i].id == LSOF_FID_CT
+		||  FieldSel[i].id == LSOF_FID_FG
+		||  FieldSel[i].id == LSOF_FID_NI)
+		    continue;
+#else	/* defined(HASFSTRUCT) */
+# if	defined(HASNOFSADDR)
+		if (FieldSel[i].id == LSOF_FID_FA)
+		    continue;
+# endif	/* defined(HASNOFSADDR) */
+
+# if	defined(HASNOFSCOUNT)
+		if (FieldSel[i].id == LSOF_FID_CT)
+		    continue;
+# endif	/* !defined(HASNOFSCOUNT) */
+
+# if	defined(HASNOFSFLAGS)
+		if (FieldSel[i].id == LSOF_FID_FG)
+		    continue;
+# endif	/* defined(HASNOFSFLAGS) */
+
+# if	defined(HASNOFSNADDR)
+		if (FieldSel[i].id == LSOF_FID_NI)
+		    continue;
+# endif	/* defined(HASNOFSNADDR) */
+#endif	/* !defined(HASFSTRUCT) */
+
+#if	!defined(HASZONES)
+		if (FieldSel[i].id == LSOF_FID_ZONE)
+		    continue;
+#endif	/* !defined(HASZONES) */
+ 
+#if	defined(HASSELINUX)
+		if ((FieldSel[i].id == LSOF_FID_CNTX) && !CntxStatus)
+		    continue;
+#else	/* !defined(HASSELINUX) */
+		if (FieldSel[i].id == LSOF_FID_CNTX)
+		    continue;
+#endif	/* !defined(HASSELINUX) */
+
+		(void) fprintf(stderr, "\t %c    %s\n",
+		    FieldSel[i].id, FieldSel[i].nm);
+	    }
+	}
+
+#if	defined(HASDCACHE)
+	if (DChelp)
+	    report_HASDCACHE(1, NULL, "    ");
+#endif	/* defined(HASDCACHE) */
+
+	if (version) {
+
+	/*
+	 * Display version information in reponse to ``-v''.
+	 */
+	    (void) fprintf(stderr, "%s version information:\n", Pn);
+	    (void) fprintf(stderr, "    revision: %s\n", LSOF_VERSION);
+	    (void) fprintf(stderr, "    latest revision: %s\n", LSOF_URL);
+	    (void) fprintf(stderr, "    latest FAQ: %sFAQ\n",
+		LSOF_URL);
+	    (void) fprintf(stderr, "    latest man page: %slsof_man\n",
+		LSOF_URL);
+
+#if	defined(LSOF_CINFO)
+	    if ((cp = isnullstr(LSOF_CINFO)))
+		(void) fprintf(stderr, "    configuration info: %s\n", cp);
+#endif	/* defined(LSOF_CINFO) */
+
+	    if ((cp = isnullstr(LSOF_CCDATE)))
+		(void) fprintf(stderr, "    constructed: %s\n", cp);
+	    cp = isnullstr(LSOF_HOST);
+	    if (!(cp1 = isnullstr(LSOF_LOGNAME)))
+		cp1 = isnullstr(LSOF_USER);
+	    if (cp || cp1) {
+		if (cp && cp1)
+		    cp2 = "by and on";
+		else if (cp)
+		    cp2 = "on";
+		else
+		    cp2 = "by";
+		(void) fprintf(stderr, "    constructed %s: %s%s%s\n",
+		    cp2,
+		    cp1 ? cp1 : "",
+		    (cp && cp1) ? "@" : "",
+		    cp  ? cp  : ""
+		);
+	    }
+
+#if	defined(LSOF_BLDCMT)
+	    if ((cp = isnullstr(LSOF_BLDCMT)))
+		(void) fprintf(stderr, "    builder's comment: %s\n", cp);
+#endif	/* defined(LSOF_BLDCMT) */
+
+	    if ((cp = isnullstr(LSOF_CC)))
+		(void) fprintf(stderr, "    compiler: %s\n", cp);
+	    if ((cp = isnullstr(LSOF_CCV)))
+		(void) fprintf(stderr, "    compiler version: %s\n", cp);
+	    if ((cp = isnullstr(LSOF_CCFLAGS)))
+		(void) fprintf(stderr, "    compiler flags: %s\n", cp);
+	    if ((cp = isnullstr(LSOF_LDFLAGS)))
+		(void) fprintf(stderr, "    loader flags: %s\n", cp);
+	    if ((cp = isnullstr(LSOF_SYSINFO)))
+		(void) fprintf(stderr, "    system info: %s\n", cp);
+	    (void) report_SECURITY("    ", ".\n");
+	    (void) report_WARNDEVACCESS("    ", "are", ".\n");
+	    (void) report_HASKERNIDCK("    K", "is");
+
+#if	defined(DIALECT_WARNING)
+	    (void) fprintf(stderr, "    WARNING: %s\n", DIALECT_WARNING);
+#endif	/* defined(DIALECT_WARNING) */
+
+	    (void) report_HASDCACHE(1, "    ", "\t");
+	}
+	Exit(xv);
+}
diff --git a/lsof_4.85/lsof_4.85_src/util.c b/lsof_4.85/lsof_4.85_src/util.c
new file mode 100644
index 0000000..bdb1d2c
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/util.c
@@ -0,0 +1,73 @@
+/*
+ * dutil.c - AIX utility functions whose compilation conflicts with the
+ *	     general header file tree defined by lsof.h and dlsof.h -- e.g.,
+ *	     the conflict between <time.h> and <sys/time.h> for the time(2)
+ *	     and localtime(3) functions
+ *
+ * V. Abell
+ * Purdue University
+ */
+
+
+/*
+ * Copyright 2008 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.
+ */
+
+
+#ifndef lint
+static char copyright[] =
+"@(#) Copyright 2008 Purdue Research Foundation.\nAll rights reserved.\n";
+static char *rcsid = "$Id: util.c,v 1.1 2008/04/01 11:56:53 abe Exp $";
+#endif
+
+#if	defined(HAS_STRFTIME)
+#include <time.h>
+#endif	/* defined(HAS_STRFTIME) */
+
+
+/*
+ * util_strftime() -- utility function to call strftime(3) without header
+ *		      file distractions
+ */
+
+int
+util_strftime(fmtr, fmtl, fmt)
+	char *fmtr;			/* format output receiver */
+	int fmtl;			/* sizeof(*fmtr) */
+	char *fmt;			/* format */
+{
+
+#if	defined(HAS_STRFTIME)
+	struct tm *lt;
+	time_t tm;
+
+	tm = time((time_t *)NULL);
+	lt = localtime(&tm);
+	return(strftime(fmtr, fmtl, fmt, lt));
+#else	/* !defined(HAS_STRFTIME) */
+	return(0);
+#endif	/* defined(HAS_STRFTIME) */
+
+}
diff --git a/lsof_4.85/lsof_4.85_src/version b/lsof_4.85/lsof_4.85_src/version
new file mode 100644
index 0000000..06fd4bd
--- /dev/null
+++ b/lsof_4.85/lsof_4.85_src/version
@@ -0,0 +1 @@
+.ds VN 4.85
