Project import
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",