
		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.
