Yves Christophe
Richard Chycoski
A. Channing Clark
+ Jorn Clausen
Axel Clauberg
John Clear
David Clissold
Casper Dik
John DiMarco
Don Draper
+ Bryan Drewery
Michel Dubois
Eric Dumazet
Dick Dunbar
Chaskiel Grundman
Armin Gruner
David Gutierrez
+ Mateusz Guzik
Robert Hall
Garner Halloran
Adam Hammer
Andrew Merril
Richard van Meurs
Jim Mewes
+ Conrad Meyer
Gary Millen
Timothy Miller
Davin Milun
Gerry Singleton
Leonard Sitongia
Kevin Smallwood
+ Gleb Smirnoff
Curt Smith
Ben Smithurst
Douglas R. Smith
Diana Stockdale
Andreas Stolcke
Jeff Stoner
+ Kristna Streitov
Sushila Subramanian
Jan Ole Suhr
Mike Sullivan
Vic Abell <abe@purdue.edu>
-July 7, 2015
+February 14, 2018
AIX 5.[12] and 5.3-ML1
FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems
- FreeBSD 5.x, [6789].x and 10 for Alpha, AMD64 and Sparc64-a
+ FreeBSD 5.x, [6789].x and 1[012].x for Alpha, AMD64 and Sparc64
based systems
HP-UX 11.00
NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based
Vic Abell <abe@purdue.edu>
-October 13, 2014
+February 14, 2018
Apple Darwin 9 and Mac OS X 10.[567]
- FreeBSD 8.[234], 9.0, 10.0 and 11.0 for AMD64-based systems
+ FreeBSD 8.[234], 9.0 and 1[012].0 for AMD64-based systems
Linux 2.1.72 and above for x86-based systems
Solaris 9, 10 and 11
4.87, January 2, 2013
4.88, October 13, 2014
4.89, July 7, 2015
+ 4.90, February 14, 2018
Dialects Supported
been tested on:
Apple Darwin 9 and Mac OS X 10.[567]
- FreeBSD 8.[234], 9.0, 10.0 and 11.0 for AMD64-based systems
- Linux 2.1.72 and above for x86-based systems
- Solaris 9, 10 and 11
+ FreeBSD 10.3, 11.0 and 12.0 for AMD64-based systems
+ Solaris 9
(The pub/tools/unix/lsof/contrib directory on lsof.itap.purdue.edu
contains information on other ports.)
5.2-CURRENT. Refined it for 5.2.1-RELEASE with testing
help from Scott Ellentuch <tuc@ttsg.com>.
- Added support for FreeBSD 4.10. Larry Rosenmann
+ Added support for FreeBSD 4.10. Larry Rosenman
<ler@lerctr.org> kindly provided a test system.
Added support for NetBSD 2.0 with patches supplied by
visible to lsof on FreeBSD 11 after a system header file change
hid them.
+4.90 February 14, 2018
+
+ !!!NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+ ! !
+ ! It is likely that this is the last lsof revision I !
+ ! will issue, unless serious bugs are detected, Stay !
+ ! tuned to lsof-l for information about future support !
+ ! of lsof. !
+ ! !
+ ! I thank all the many contributors to lsof over the !
+ ! many years (20+?) I have been distributing lsof !
+ ! versions 1, 2, 3 and 4. !
+ ! !
+ ! Vic Abell <abe@purdue.edu> !
+ ! !
+ !!!NOTE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+ Taught the Configure script to create a dummy opt_random.h
+ for FreeBSD systems whose <sys/random.h> includes it.
+
+ Added support for the FreeBSD ZFUSE file system.
+
+ Corrected the quoting in a Darwin putchar() statement in the
+ dfile.c source file. Andrew Janke <floss@apjanke.net> reported
+ my error.
+
+ Added support for the FreeBSD DTYPE_PTS file descriptor and
+ for unknown descriptors that reference the kernel's badfileops
+ operation switch. Enabled FreeBSD 12.0 support. Tested the
+ changes on systems provided by Larry Rosenman <ler@lerctr.org>.
+
+ Enhanced -K option with the form "-K i" to direct lsof to
+ (i)gnore tasks. A query from Rachel Kroll <rkroll@fb.com>
+ suggested this option. Linux task reports now include both
+ process and task command names, making lsof's "-c <name>"
+ option work correctly.
+
+ Added a patch to prevent NFS blocking in Linux supplied by
+ Kristna Streitov <kstreitova@suse.com>.
+
+ Installed a FreeBSD patch that prevents examining a TCP state
+ structure during a race condition. The patch was supplied by
+ Bryan Drewery <bdrewery@FreeBSD.org>.
+
+ Updated FreeBSD for new UFS inode structure that lacks an i_dev
+ member in the most recent 12.0-CURRENT. Larry Rosenman
+ <ler@lerctr.org> reported the problem and provided a test
+ system.
+
+ Added "#define KLD_MODULE" to dlsof.h and dnode2.c to prevent
+ <machine/cpuconf.h> from generating an "ARM_NARCH is 0" error.
+ This is needed so lsof can access kernel structures. Larry
+ Rosenman supplied the addition.
+
+ Added recognition of the FreeBSD 11 file system name "nullfs".
+ Jamie Landeg-Jones <jamie@catflap.org> supplied the fix.
+
+ Added a patch from Larry Rosenman <ler@lerctr.org> that is
+ needed on FreeBSD 12 so the lsof compilation can obtain the
+ inpcb and tcpcb structures from their respective header files.
+
+ Updated FreeBSD dmnt.c for the ino64 changes.
+
+ Inserted a patch for Solaris 12.x to avoid compilation errors
+ from <sys/aio_req.h>, based on information provided by Jorn
+ Clausen <joern.clausen@uni-bielefeld.de>. Jorn tested the
+ patch.
+
+ Added performance enhancement that uses the FreeBSD closefrom()
+ and dup2() C library functions when available. The enhancement
+ was supplied by Conrad Meyer <cem@freebsd.org>.
+
+ Corrected FreeBSD lsof's gathering of ZFS file device numbers.
+ Updated lsof test library for FreeBSD.
+
+ Updated socket optons information collection from the socket
+ structure per changes supplied by Gleb Smirnoff
+ <glebius@FreeBSD.org>.
+
+ Added patch to dlsof.h that avoids a _KERNEL conflict with
+ bzero. Mateusz Guzik <mjguzik@gmail.com> supplied the patch.
+
+ Corrected test library to handle 64 bit FreeBSD device numbers.
+
+ Added #defines for FreeBSD 12, src r324225, from Gleb Smirnoff
+ <glebius@FreeBSD.org>.
+
+ Incorporated Linux pseudoterminal endpoint processing (+|-E)
+ provided by Masatake YAMATO <yamato@redhat.com> with access to
+ test systems provided by Peter Schiffer <pschiffe@redhat.com>.
+
+ Corrected Linux command extraction for commands that include
+ parentheses -- e.g., "(sd-pam)".
+
Vic Abell <abe@purdue.edu>
-July 7, 2015
+February 14, 2018
The Lsof Mailing List, lsof-l
Information on lsof is available via a GNU Mailman mailing list, named
-lsof-l. The server is located on the host rcac.purdue.edu.
+lsof-l. The server is located on the host lists.purdue.edu.
Subscribing
You may subscribe to the lsof-l mailing list by sending e-mail to:
- lsof-l-subscribe@rcac.purdue.edu
+ lsof-l-subscribe@lists.purdue.edu
The body of your e-mail may be empty. You will receive a confirmation
reply, explaining one further step you must take to complete your
Get Help
========
-More information about the rcac.purdue.edu GNU Mailman server is
-available by sending e-mail to lsof-l-request@rcac.purdue.edu with
+More information about the lists.purdue.edu GNU Mailman server is
+available by sending e-mail to lsof-l-request@lists.purdue.edu with
"help" in the subject line. The body of your e-mail may be empty.
The other information will be delivered by return e-mail.
There is a web interface at:
- https://lists.rcac.purdue.edu/listinfo/lsof-l
+ https://lists.purdue.edu/mailman/listinfo/lsof-l
You can use it to manage your lsof-l list entry.
that your subscription was accepted), you may post messages to the list
by sending e-mail directly to:
- lsof-l@rcac.purdue.edu
+ lsof-l@lists.purdue.edu
I moderate the lsof-l mailing list and try to keep its traffic low,
mainly limiting it to announcements of new revisions, patches and
You can unsubscribe from lsof-l by sending e-mail to:
- lsof-l-unsubscribe@rcac.purdue.edu
+ lsof-l-unsubscribe@lists.purdue.edu
The body of your e-mail may be empty. You will receive a confirmation
reply, explaining one further step you must take to complete the
There is an archive; use the link:
- https://lists.rcac.purdue.edu/listinfo/lsof-l
+ https://lists.purdue.edu/mailman/private/lsof-l
The archive link is the first one on the web page. You will need the
password you received or set when you subscribed, or later set via
Vic Abell <abe@purdue.edu>
-May 8, 2008
+September 16, 2015
USE_LIB_PROCESS_FILE selects it.
FILEPTR, DTYPE_PIPE, HASPIPEFN, DTYPE_GNODE,
- DTYPE_INODE, DTYPE_PORT, DTYPE_VNODE,
+ DTYPE_INODE, DTYPE_PORT, DTYPE_VNODE, DTYPE_PTS,
HASF_VNODE, HASKQUEUE, HASPRIVFILETYPE,
- HASPSXSHM and HASPSXSEM customize it.
+ HASPSXSHM, HASPSXSEM and HASPTSFN customize it.
ptti.c print_tcptpi() function
HAS_AFS enables AFS support code for the dialect.
+ HAS_AIO_REQ_STRUCT is defined for Solaris 10 and above systems that
+ have the aio_req structure definition.
+
HAS_ATOMIC_T indicates the Linux version has an
<asm/atomic.h> header file and it contains
"typedef struct .* atomic_t;"
HASCDRNODE enables/disables readcdrnode() in node.c.
+ HAS_CLOSEFROM is defined when the FreeBSD C library contains the
+ closefrom() function.
+
HAS_CONN_NEW indicates the Solaris version has the new form
of the conn_s structure, introduced in b134 of
Solaris 11. This will always accompany the
<sys/dnlc.h> has a name character pointer
rather than a name character array.
+ HAS_DUP2 is defined when the FreeBSD C library contains the
+ dup2() function.
+
HASEFFNLINK indicates the *BSD system has the i_effnlink
member in the inode structure.
See also the RMNT_EXPDEV and RMNT_FSTYPE
documentation in lib/rmnt.c
+ HASFUSEFS is defined when the FreeBSD system has FUSE file system
+ support.
+
HASGETBOOTFILE indicates the NetBSD or OpenBSD dialect has
a getbootfile() function.
HAS_NO_6PPCB is defined if the FreeBSD in_pcb.h has no in6p_ppcb
definition.
+ HAS_NO_IDEV indicates the FreeBSD system's inode has no i_dev
+ member.
+
HAS_NO_ISO_DEV indicates the FreeBSD 6 and higher system has
no i_dev member in its iso_node structure.
HASPSXSHM indicates the dialect has support for the POSIX
shared memory file type.
+ HASPTSFN indicates the dialect has a DNODE_PTS file descriptor
+ type and defines the function that processes it.
+
+ HASPTYEPT indicates the Linux dialect has support for the
+ pseudoterminal endpoint option.
+
HASPTYFS indicates the *BSD dialect has a ptyfs file system.
HASRNODE enables/disables readrnode() in node.c.
Vic Abell <abe@purdue.edu>
-July 7, 2015
+February 14, 2018
The FreeBSD distribution header files are augmented by header files
in the dialects/freebsd/include directory.
-David O'Brien maintains the lsof FreeBSD port package.
+Larry Rosenman maintains the lsof FreeBSD port package.
HP-UX
AIX 4.1.[45], 4.2[.1], and 4.3[.123]
Apple Darwin 7.x for Power Macintosh systems
DEC OSF/1, Digital UNIX, Tru64 UNIX 2.0, 3.2, 4.0, and 5.[01]
- FreeBSD 2.1.6, 2.2[.x], 3.x, 4.x, 5.x and [67].x
- /dev/kmem-based 11.00
+ FreeBSD 2.1.6, 2.2[.x], 3.x, 4.x, 5.x, [6789].x and 1[012].x
NetBSD 1.[456], 2.x and 3.x
NEXTSTEP 3.[13]
OpenBSD 2.[89] and 3.[0-9]
Vic Abell <abe@purdue.edu>
-January 2, 2013
+February 14, 2018
-DLT_CC is present if the lsof compiler is cc.
+ -DLT_DEV64 is present if the FreeBSD dialect uses a 64
+ devite type.
+
+
-DLT_DIAL_<abbr> always ends in (the <abbr> part) the
"canonical" -- i.e., usually the most
common abbreviation by which the dialect
10.0 Amd64, gcc
10.0 Amd64, clang
11.0 Amd64, clang
+ 12.0 Amd64, clang
DEC OSF/1 4.0, cc
HP-UX 10.20, cc LTbigf
10.20, gcc (1) LTbigf
2.6.38-686
3.10.004
3.10.08
+ 4.14.14
3.10.0-229.1.2.el7
NEXTSTEP 3.1, gcc LTnfs
NetBSD 1.4.1, Alpha, gcc LTnfs
Vic Abell <abe@purdue.edu>
-May 11, 2015
+February 14, 2018
# shell script, named $LSOF_MK, that places its source modules in this
# directory.
#
-# $Id: Configure,v 1.164 2015/07/07 20:16:58 abe Exp $
+# $Id: Configure,v 1.165 2018/02/14 14:18:48 abe Exp $
# LSOF_CFLAGS_OVERRIDE=1 may be introduced through the environment to cause
# the library Makefile's CFLAGS definition to override any in the
echo "rm -rf AFSHeaders AFSVersion solaris11 version.h vnode_if.h"
rm -f ${LSOF_HLP_BASE}* cd9660_node.h lockf_owner.h fbsd_minor.h
echo "rm -f ${LSOF_HLP_BASE}* cd9660_node.h lockf_owner.h fbsd_minor.h"
- rm -f opt_kdtrace.h
- echo "rm -f opt_kdtrace.h"
+ rm -f opt_kdtrace.h opt_random.h
+ echo "rm -f opt_kdtrace.h opt_random.h"
rm -f dialects/aix/aix5/j2/j2_snapshot.h
echo "rm -f dialects/aix/aix5/j2/j2_snapshot.h"
rm -f dialects/sun/solaris10 # DEBUG -- for s10_44
LSOF_TSTBIGF=" "
LSOF_VERS=11000
;;
+ 12*)
+ LSOF_TSTBIGF=" "
+ LSOF_VERS=12000
+ ;;
*)
echo Unknown FreeBSD release: `uname -r`
rm -f $LSOF_HLP
# Clear LSOF_UNSUP message for supported versions of FreeBSD.
case $LSOF_VERS in # {
- 4090|8020|8030|8040|9000|10000|11000)
+ 4090|8020|8030|8040|9000|10000|11000|12000)
LSOF_UNSUP=""
;;
esac # }
fi # }
fi # }
+ # Check the C library for closefrom and dup2.
+
+ if test -r /usr/lib/libc.a # {
+ then
+ nm /usr/lib/libc.a | grep -q "W dup2"
+ if test $? -eq 0 # {
+ then
+ LSOF_CFGF="$LSOF_CFGF -DHAS_DUP2"
+ fi # }
+ nm /usr/lib/libc.a | grep -q "W closefrom"
+ if test $? -eq 0 # {
+ then
+ LSOF_CFGF="$LSOF_CFGF -DHAS_CLOSEFROM"
+ fi # }
+ fi # }
+
# Do FreeBSD version-specific stuff.
case $LSOF_VERS in # {
# Do FreeBSD 6.0 and higher version-specific stuff.
+ if test -r ${LSOF_INCLUDE}/sys/_types.h # {
+ then
+ grep __dev_t ${LSOF_INCLUDE}/sys/_types.h | grep -q 64
+ if test $? -eq 0 # {
+ then
+ if test "X$LSOF_TSTDFLG" = "X" # {
+ then
+ LSOF_TSTDFLG="-DLT_DEV64"
+ else
+ LSOF_TSTDFLG="$LSOF_TSTDFLG -DLT_DEV64"
+ fi # }
+ fi # }
+ fi # }
if test -r ${LSOF_INCLUDE}/ufs/ufs/inode.h # {
then
grep -q i_din2 ${LSOF_INCLUDE}/ufs/ufs/inode.h
then
LSOF_CFGF="$LSOF_CFGF -DHAS_UFS1_2"
fi # }
+ grep -q i_dev ${LSOF_INCLUDE}/ufs/ufs/inode.h
+ if test $? -ne 0 # {
+ then
+ LSOF_CFGF="$LSOF_CFGF -DHAS_NO_IDEV"
+ fi # }
fi # }
if test -r ${LSOF_INCLUDE}/sys/conf.h # {
then
LSOF_CFGF="$LSOF_CFGF -DHAS_SYS_SX_H"
fi # }
+ # Do FUSE file system test,
+
+ if test -r ${FREEBSD_SYS}/fs/fuse/fuse_node.h # {
+ then
+ LSOF_CFGF="$LSOF_CFGF -DHASFUSEFS"
+ fi # }
# Do ZFS test. Try for the newer OpenSolaris files first -- i.e.,
# the ones in ${FREEBSD_SYS}/cddl/contrib/opensolaris. If that fails,
# try for the older ones in ${FREEBSD}/contrib/opensolaris.
LSOF_FBSD_ZFS_CFGF="$LSOF_FBSD_ZFS_CFGF -DHAS_CV_TIMEDWAIT_SBT"
fi # }
fi #}
+ if test -r /usr/include/sys/random.h # {
+ then
+ grep -q opt_random.h /usr/include/sys/random.h
+ if test $? -eq 0 # {
+ then
+ rm -f opt_random.h
+ touch opt_random.h
+ fi # }
+ fi # }
fi # }
if test -r ${LSOF_INCLUDE}/sys/vnode.h # {
then
then
LSOF_CFGF="$LSOF_CFGF -DHASUXSOCKEPT"
fi # }
+
+ # Test for pseudoterminal endpoint support.
+
+ if test -r ${LSOF_INCLUDE}/linux/major.h # {
+ then
+ grep -q TTYAUX_MAJOR ${LSOF_INCLUDE}/linux/major.h
+ if test $? -eq 0 # {
+ then
+ LSOF_CFGF="$LSOF_CFGF -DHASPTYEPT"
+ fi # }
+ fi # }
LSOF_DIALECT_DIR="linux"
LSOF_CFGF="$LSOF_CFGF -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE"
;;
LSOF_CFGF="$LSOF_CFGF -DHAS_PC_DIRENTPERSEC"
fi # }
fi # }
+ if test -r ${LSOF_INCLUDE}/sys/aio_req.h # {
+ then
+ grep "struct[ ]aio_req" ${LSOF_INCLUDE}/sys/aio_req.h > /dev/null 2>&1
+ if test $? -eq 0 # {
+ then
+ LSOF_CFGF="$LSOF_CFGF -DHAS_AIO_REQ_STRUCT"
+ fi # }
+ fi # }
fi # }
if test -r ${LSOF_INCLUDE}/sys/zone.h # {
then
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dproc.c,v 1.26 2008/10/21 16:14:18 abe Exp $";
+static char *rcsid = "$Id: dproc.c,v 1.27 2018/02/14 14:23:27 abe Exp $";
#endif
* If only ORed process selection options have been specified,
* enable conditional file skipping and socket file only checking.
*/
- if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+ if ((Selflags & SELFILE) || !(Selflags & SelProc))
cckreg = ckscko = 0;
else
cckreg = ckscko = 1;
* socket file only checking, based on the process' selection
* status.
*/
- ckscko = (sf & SELPROC) ? 0 : 1;
+ ckscko = (sf & SelProc) ? 0 : 1;
}
#else /* AIXV>=4300 */
* socket file only checking, based on the process' selection
* status.
*/
- ckscko = (sf & SELPROC) ? 0 : 1;
+ ckscko = (sf & SelProc) ? 0 : 1;
}
if (!fds) {
if (!(fds = (struct FDSINFO *)malloc((MALLOC_S)FDSINFOSIZE)))
# Darwin libproc-based lsof Makefile
#
-# $Id: Makefile,v 1.7 2009/03/25 19:21:37 abe Exp abe $
+# $Id: Makefile,v 1.8 2018/02/14 14:27:57 abe Exp $
PROG= lsof
#ifndef lint
static char copyright[] =
"@(#) Copyright 2005-2007 Apple Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dfile.c,v 1.8 2012/04/10 16:41:04 abe Exp abe $";
+static char *rcsid = "$Id: dfile.c,v 1.9 2018/02/14 14:27:57 abe Exp $";
#endif
#include "lsof.h"
+#if defined(PROC_FP_GUARDED)
+#extern struct pff_tab Pgf_tab[];
+#endif /* defined(PROC_FP_GUARDED) */
+
/*
* enter_file_info() -- enter file information
#if defined(PROC_FP_GUARDED)
if (extra > 1)
- putchar(`,');
+ putchar(',');
if (lf->guardflags) {
struct pff_tab *tp;
long gf;
#ifndef lint
static char copyright[] =
"@(#) Copyright 2005-2007 Apple Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dproc.c,v 1.9 2013/01/02 17:03:05 abe Exp $";
+static char *rcsid = "$Id: dproc.c,v 1.10 2018/02/14 14:27:57 abe Exp $";
#endif
#include "lsof.h"
* If only ORed process selection options have been specified,
* enable conditional file skipping and socket file only checking.
*/
- if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+ if ((Selflags & SELFILE) || !(Selflags & SelProc))
cckreg = ckscko = 0;
else
cckreg = ckscko = 1;
* socket file only checking, based on the process' selection
* status.
*/
- ckscko = (sf & SELPROC) ? 0 : 1;
+ ckscko = (sf & SelProc) ? 0 : 1;
}
/*
* Get root and current directory information.
#ifndef lint
static char copyright[] =
"@(#) Copyright 2005 Apple Computer, Inc. and Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dstore.c,v 1.4 2008/10/21 16:15:16 abe Exp abe $";
+static char *rcsid = "$Id: dstore.c,v 1.5 2018/02/14 14:27:57 abe Exp $";
#endif
/*
- * $Id: machine.h,v 1.10 2013/01/02 17:03:05 abe Exp abe $
+ * $Id: machine.h,v 1.11 2018/02/14 14:27:57 abe Exp $
*/
/*
- * $Id: dlsof.h,v 1.47 2015/07/07 20:23:43 abe Exp $
+ * $Id: dlsof.h,v 1.48 2018/02/14 14:26:03 abe Exp $
*/
#define boolean_t int
# endif /* defined(NEEDS_BOOLEAN_T) */
+/*
+ * Define KLD_MODULE to avoid the error "ARM_NMMUS is 0" from ARM's
+ * <machine/cpuconf.h>.
+ */
+
+#define KLD_MODULE
+
+
#include <sys/conf.h>
# if defined(HAS_VM_MEMATTR_T)
#include <rpc/types.h>
#include <sys/protosw.h>
#include <sys/socket.h>
+#define _WANT_SOCKET
#include <sys/socketvar.h>
#include <sys/un.h>
+#define _WANT_UNPCB
#include <sys/unpcb.h>
# if FREEBSDV>=3000
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <net/route.h>
+#define _WANT_INPCB /* for FreeBSD 12 and above */
#include <netinet/in_pcb.h>
#include <netinet/ip_var.h>
#include <netinet/tcp.h>
#include <netinet/tcpip.h>
#include <netinet/tcp_fsm.h>
#include <netinet/tcp_timer.h>
+#define _WANT_TCPCB /* for FreeBSD 12 and above */
#include <netinet/tcp_var.h>
#include <sys/ucred.h>
#include <sys/uio.h>
# endif /* FREEBSDV<5000 */
# endif /* FREEBSDV>=2020 */
+#undef bzero /* avoid _KERNEL conflict */
#include <string.h>
struct mounts *next; /* forward link */
};
+#define X_BADFILEOPS "badfileops"
+extern KA_T X_bfopsa;
#define X_NCACHE "ncache"
#define X_NCSIZE "ncsize"
#define NL_NAME n_name
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dmnt.c,v 1.17 2013/01/02 17:01:43 abe Exp $";
+static char *rcsid = "$Id: dmnt.c,v 1.18 2018/02/14 14:26:03 abe Exp $";
#endif
sb.st_mode = S_IFDIR | 0777;
if (!Fwarn) {
(void) fprintf(stderr,
- " assuming \"dev=%x\" from mount table\n",
- sb.st_dev);
+ " assuming \"dev=%lx\" from mount table\n",
+ (unsigned long)sb.st_dev);
}
}
/*
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dnode.c,v 1.44 2015/07/07 20:23:43 abe Exp $";
+static char *rcsid = "$Id: dnode.c,v 1.45 2018/02/14 14:26:03 abe Exp $";
#endif
#endif /* defined(HASFDESCFS) && HASFDESCFS==1 */
+#if defined(HASPTSFN) && defined(DTYPE_PTS)
+#include <sys/tty.h>
+#endif /* defined(HASPTSFN) && defined(DTYPE_PTS) */
+
+
#if defined(HAS_TMPFS)
#define _KERNEL
#include <fs/tmpfs/tmpfs.h>
/*
- * get_lock_state() -- get the lock state
+ * get_lock_state() - get the lock state
*/
static void
#if defined(HASKQUEUE)
/*
- * process_kqueue() -- process kqueue file
+ * process_kqueue() - process kqueue file
*
* Strictly speaking this function should appear in dfile.c, because it is
* a file processing function. However, the Net and Open BSD sources don't
struct nfsnode *n;
size_t sz;
char *ty;
+ unsigned char ums;
enum vtype type;
struct vnode *v, vb;
struct l_vfs *vfs;
#endif /* defined(HASFDESCFS) */
+#if defined(HASFUSEFS)
+ dev_t fuse_dev;
+ int fuse_dev_def, fuse_stat;
+ INODETYPE fuse_ino;
+ long fuse_links;
+ SZOFFTYPE fuse_sz;
+#endif /* defined(HASFUSEFS) */
+
#if FREEBSDV>=5000
# if defined(HAS_UFS1_2)
int ufst;
struct devfs_dirent *d;
char vtbuf[32];
char *vtbp;
- enum vtagtype { VT_DEVFS, VT_FDESC, VT_ISOFS, VT_PSEUDOFS, VT_NFS,
- VT_NULL, VT_TMPFS, VT_UFS, VT_ZFS, VT_UNKNOWN
+ enum vtagtype { VT_DEVFS, VT_FDESC, VT_FUSEFS, VT_ISOFS, VT_PSEUDOFS,
+ VT_NFS, VT_NULL, VT_TMPFS, VT_UFS, VT_ZFS, VT_UNKNOWN
};
# if defined(HAS_TMPFS)
* Initialize miscellaneous variables. This is done so that processing an
* overlaid node will be a fresh start.
*/
- devs = rdevs = 0;
+ devs = rdevs = ums = 0;
i = (struct inode *)NULL;
n = (struct nfsnode *)NULL;
Namech[0] = '\0';
f = (struct fdescnode *)NULL;
#endif /* defined(HASFDESCFS) */
+#if defined(HASFUSEFS)
+ fuse_dev_def = fuse_stat = 0;
+#endif /* defined(HASFUSEFS) */
+
#if FREEBSDV<5000
m = (struct mfsnode *)NULL;
#else /* FREEBSDV>=5000 */
vtag = VT_ISOFS;
else if (!strcmp(vtbuf, "pseudofs"))
vtag = VT_PSEUDOFS;
+ else if (!strcmp(vtbuf, "nullfs"))
+ vtag = VT_NULL;
else if (!strcmp(vtbuf, "null"))
vtag = VT_NULL;
else if (!strcmp(vtbuf, "fdesc"))
vtag = VT_FDESC;
+ else if (!strcmp(vtbuf, "fuse"))
+ vtag = VT_FUSEFS;
else if (!strcmp(vtbuf, "tmpfs"))
vtag = VT_TMPFS;
} else
# endif /* FREEBSDV<2000 */
#endif /* defined(HASFDESCFS) */
+#if defined(HASFUSEFS)
+ case VT_FUSEFS:
+ if (read_fuse_node(v, &fuse_dev, &fuse_dev_def, &fuse_ino,
+ &fuse_links, &fuse_sz))
+ {
+ (void) snpf(Namech, Namechl, "no fuse node: %s",
+ print_kptr((KA_T)v->v_data, (char *)NULL, 0));
+ enter_nm(Namech);
+ return;
+ }
+ fuse_stat = 1;
+ break;
+#endif /* defined(HASFUSEFS) */
+
#if defined(HAS9660FS)
case VT_ISOFS:
if (read_iso_node(v, &iso_dev, &iso_dev_def, &iso_ino, &iso_links,
# if defined(HAS_UFS1_2)
if (i->i_ump && !kread((KA_T)i->i_ump, (char *)&um, sizeof(um))) {
+ ums = 1;
if (um.um_fstype == UFS1) {
if (i->i_din1
&& !kread((KA_T)i->i_din1, (char *)&d1, sizeof(d1)))
} else if (i) {
#if FREEBSDV>=4000
+# if defined(HAS_NO_IDEV)
+ if (ums) {
+ dev = Dev2Udev((KA_T)um.um_dev);
+ devs = 1;
+ }
+# else /* !defined(HAS_NO_IDEV) */
if (i->i_dev
-# if !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
+# if !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV)
&& !kread((KA_T)i->i_dev, (char *)&si, sizeof(si))
-# endif /* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+# endif/* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
) {
-# if defined(HAS_NO_SI_UDEV)
-# if defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
+# if defined(HAS_NO_SI_UDEV)
+# if defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV)
dev = Dev2Udev((KA_T)i->i_dev);
-# else /* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
+# else /* !defined(HAS_CONF_MINOR) && !defined(HAS_CDEV2PRIV) */
dev = Dev2Udev(&si);
-# endif /* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
-# else /* !defined(HAS_NO_SI_UDEV) */
+# endif /* defined(HAS_CONF_MINOR) || defined(HAS_CDEV2PRIV) */
+# else /* !defined(HAS_NO_SI_UDEV) */
dev = si.si_udev;
-# endif /* defined(HAS_NO_SI_UDEV) */
+# endif /* defined(HAS_NO_SI_UDEV) */
devs = 1;
}
+# endif /* defined(HAS_NO_IDEV) */
#else /* FREEBSDV<4000 */
dev = i->i_dev;
devs = 1;
* Record information returned by readzfsnode().
*/
if (vfs) {
- dev = vfs->fsid.val[0];
+ union {
+ int32_t val[2];
+ dev_t dev;
+ } vfs_fsid;
+
+ vfs_fsid.val[0] = vfs->fsid.val[0];
+ vfs_fsid.val[1] = vfs->fsid.val[1];
+ dev = vfs_fsid.dev;
devs = 1;
}
if ((type == VCHR) || (type == VBLK)) {
# if HASFDESCFS==1
else
-# endif /* HASFDESFS==1 */
+# endif /* HASFDESCFS==1 */
# endif /* defined(HASFDLINK) */
# if HASFDESCFS==1
devs = Lf->inp_ty = 1;
}
}
-# endif /* HASFDESFS==1 */
+# endif /* HASFDESCFS==1 */
}
#endif /* defined(HASFDESCFS) && (defined(HASFDLINK) || HASFDESCFS==1) */
}
#endif /* defined(HAS9660FS) */
+#if defined(HASFUSEFS)
+ else if (fuse_stat && fuse_dev_def) {
+ dev = fuse_dev;
+ devs = Lf->inp_ty = 1;
+ }
+#endif /* defined(HASFUSEFS) */
+
#if FREEBSDV>=5000
else if (d) {
if (vfs) {
}
#endif /* defined(HAS9660FS) */
+#if defined(HASFUSEFS)
+ else if (fuse_stat) {
+ Lf->inode = fuse_ino;
+ Lf->inp_ty = 1;
+ }
+#endif /* defined(HASFUSEFS) */
+
#if defined(HASPROCFS)
# if FREEBSDV>=2000
else if (p) {
Lf->sz = (SZOFFTYPE)iso_sz;
Lf->sz_def = 1;
}
+
#endif /* defined(HAS9660FS) */
+#if defined(HASFUSEFS)
+ else if (fuse_stat) {
+ Lf->sz = (SZOFFTYPE)fuse_sz;
+ Lf->sz_def = 1;
+ }
+#endif /* defined(HASFUSEFS) */
+
}
else if ((type == VCHR || type == VBLK) && !Fsize)
Lf->off_def = 1;
}
#endif /* defined(HAS9660FS) */
+#if defined(HASFUSEFS)
+ else if (fuse_stat) {
+ Lf->nlink = fuse_links;
+ Lf->nlink_def = 1;
+ }
+#endif /* defined(HASFUSEFS) */
+
#if FREEBSDV>=5000
else if (d) {
Lf->nlink = d->de_links;
enter_nm(Namech);
}
#endif /* FREEBSDV>=2020 */
+
+
+#if defined(HASPTSFN) && defined(DTYPE_PTS)
+/*
+ * process_pts - process a file structure whose type is DTYPE_PTS
+ */
+
+void process_pts(tp)
+ KA_T tp; /* f_data pointer to tty structure */
+{
+ dev_t dev; /* IFCHR device number */
+ struct tty t; /* tty structure */
+
+ (void) snpf(Lf->type, sizeof(Lf->type), "PTS");
+/*
+ * Read the tty structure. Quit if it can't be read.
+ */
+ if (!tp || kread(tp, (char *)&t, sizeof(t))) {
+ (void) snpf(Namech, Namechl,
+ "can't read DTYPE_PTS tty struct: %s",
+ print_kptr((KA_T)tp, (char *)NULL, 0));
+ enter_nm(Namech);
+ return;
+ }
+/*
+ * Convert the tty's cdev from kernel to user form.
+ *
+ * Set the device number to DevDev, the device number of /dev.
+ *
+ * Set the inode number to the device number.
+ *
+ * Set the file type to N_CHR for a character device (That's what a PTS is.)
+ *
+ * Force the use of offset from file structure.
+ *
+ * Set rdev to the converted device.
+ *
+ * Force the reloading of the device cache.
+ */
+ if ((dev = Dev2Udev((KA_T)t.t_dev)) == NODEV) {
+ (void) snpf(Namech, Namechl,
+ "can't convert device in DTYPE_PTS tty struct: %s",
+ print_kptr((KA_T)tp, (char *)NULL, 0));
+ enter_nm(Namech);
+ return;
+ }
+ Lf->dev = DevDev;
+ Lf->inode = (INODETYPE)dev;
+ Lf->inp_ty = Lf->dev_def = Lf->rdev_def = 1;
+ Lf->ntype = N_CHR;
+ Lf->off_def = 1;
+ Lf->rdev = dev;
+ DCunsafe = 1;
+}
+#endif /* defined(HASPTSFN) && defined(DTYPE_PTS) */
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dnode1.c,v 1.10 2008/10/21 16:16:06 abe Exp abe $";
+static char *rcsid = "$Id: dnode1.c,v 1.11 2018/02/14 14:26:03 abe Exp $";
#endif
return(0);
}
#endif /* defined(HAS9660FS) */
+
+
+#if defined(HASFUSEFS)
+#include <fs/fuse/fuse_node.h>
+/*
+ * read_fuse_node() -- read FUSE file system fuse_node
+ */
+
+int
+read_fuse_node(v, d, dd, ino, nl, sz)
+ struct vnode *v; /* containing vnode */
+ dev_t *d; /* returned device number */
+ int *dd; /* returned device-defined flag */
+ INODETYPE *ino; /* returned inode number */
+ long *nl; /* returned number of links */
+ SZOFFTYPE *sz; /* returned size */
+{
+ struct fuse_vnode_data fn; /* FUSE node */
+
+ if (!v->v_data
+ || kread((KA_T)v->v_data, (char *)&fn, sizeof(fn)))
+ return(1);
+ *d = fn.cached_attrs.va_fsid;
+ *dd = 1;
+ *ino = (INODETYPE)fn.cached_attrs.va_fileid;
+ *nl = (long)fn.cached_attrs.va_nlink;
+ *sz = (SZOFFTYPE)fn.cached_attrs.va_size;
+ return(0);
+}
+#endif /* defined(HASFUSEFS) */
#ifndef lint
static char copyright[] =
"@(#) Copyright 2008 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dnode2.c,v 1.6 2015/07/07 20:23:43 abe Exp $";
+static char *rcsid = "$Id: dnode2.c,v 1.7 2018/02/14 14:26:03 abe Exp $";
#endif
#define VOP_UNLOCK(vp, f) ((void)0)
# endif /* defined(__clang__) */
+#define KLD_MODULE /* for ARM: prevent "ARM_NARCH is 0 " error */
#include <sys/zfs_znode.h>
#undef _KERNEL
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dproc.c,v 1.19 2015/07/07 20:23:43 abe Exp $";
+static char *rcsid = "$Id: dproc.c,v 1.20 2018/02/14 14:26:03 abe Exp $";
#endif
#include "lsof.h"
* If only ORed process selection options have been specified,
* enable conditional file skipping and socket file only checking.
*/
- if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+ if ((Selflags & SELFILE) || !(Selflags & SelProc))
cckreg = ckscko = 0;
else
cckreg = ckscko = 1;
* socket file only checking, based on the process' selection
* status.
*/
- ckscko = (sf & SELPROC) ? 0 : 1;
+ ckscko = (sf & SelProc) ? 0 : 1;
}
alloc_lproc(p->P_PID, pgid, ppid, (UID_ARG)uid, p->P_COMM,
(int)pss, (int)sf);
Exit(1);
}
+#if defined(X_BADFILEOPS)
+/*
+ * Get kernel's badfileops address (for process_file()).
+ */
+ if (get_Nl_value(X_BADFILEOPS, (struct drive_Nl *)NULL, &X_bfopsa) < 0
+ || !X_bfopsa)
+ {
+ X_bfopsa = (KA_T)0;
+ }
+#endif /* defined(X_BADFILEOPS) */
+
#if defined(WILLDROPGID)
/*
* Drop setgid permission, if necessary.
/*
- * $Id: dproto.h,v 1.14 2009/03/25 19:23:06 abe Exp $
+ * $Id: dproto.h,v 1.15 2018/02/14 14:26:03 abe Exp $
*/
_PROTOTYPE(extern void process_socket,(KA_T sa));
_PROTOTYPE(extern struct l_vfs *readvfs,(KA_T vm));
+#if defined(HASPTSFN)
+_PROTOTYPE(extern void process_pts,(KA_T ta));
+#endif /* defined(HASPTSFN) */
+
#if defined(HASKQUEUE)
_PROTOTYPE(extern void process_kqueue,(KA_T ka));
#endif /* defined(HASKQUEUE) */
_PROTOTYPE(extern void process_pipe,(KA_T pa));
#endif /* FREEBSDV>=2020 */
+#if defined(HASFUSEFS)
+_PROTOTYPE(extern int read_fuse_node,(struct vnode *v, dev_t *d, int *dd, INODETYPE *ino, long *nl, SZOFFTYPE *sz));
+#endif /* defined(HASFUSEFS) */
+
#if defined(HAS9660FS)
_PROTOTYPE(extern int read_iso_node,(struct vnode *v, dev_t *d, int *dd, INODETYPE *ino, long *nl, SZOFFTYPE *sz));
#endif /* defined(HAS9660FS) */
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dsock.c,v 1.30 2015/07/07 20:23:43 abe Exp $";
+static char *rcsid = "$Id: dsock.c,v 1.31 2018/02/14 14:26:03 abe Exp $";
#endif
* Local function prototypes
*/
-_PROTOTYPE(static int ckstate,(KA_T ta, struct tcpcb *t, int fam));
+_PROTOTYPE(static int ckstate,(KA_T pcb, KA_T ta, struct tcpcb *t, int fam));
/*
*/
static int
-ckstate(ta, t, fam)
+ckstate(pcb, ta, t, fam)
+ KA_T pcb; /* PCB address */
KA_T ta; /* TCP control block address */
struct tcpcb *t; /* TCP control block receptor */
int fam; /* protocol family */
/*
* Read TCP control block.
*/
- if (kread(ta, (char *)t, sizeof(struct tcpcb)))
+ if (kread(ta, (char *)t, sizeof(struct tcpcb))
+ || (KA_T)t->t_inpcb != pcb)
+ {
return(-1);
+ }
if (TcpStXn || TcpStIn) {
/*
* If there are TCP state inclusions or exclusions, check them.
*/
- tsnx = (int)t->t_state + TcpStOff;
+ if ((tsnx = (int)t->t_state + TcpStOff) >= TcpNstates)
+ return(0);
if (TcpStXn) {
if (TcpStX[tsnx]) {
Lf->sf &= ~SELNET;
#if defined(HASSOOPT)
Lf->lts.ltm = (unsigned int)s.so_linger;
Lf->lts.opt = (unsigned int)s.so_options;
+
+# if __FreeBSD_version>=1200027
+ if (s.so_options & SO_ACCEPTCONN) {
+ Lf->lts.pqlen = (unsigned int)s.sol_incqlen;
+ Lf->lts.qlen = (unsigned int)s.sol_qlen;
+ Lf->lts.qlim = (unsigned int)s.sol_qlimit;
+ } else {
+ Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
+ Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+
+# if defined(HASSBSTATE)
+ Lf->lts.sbs_rcv = s.so_rcv.sb_state;
+ Lf->lts.sbs_snd = s.so_snd.sb_state;
+# endif /* defined(HASSBSTATE) */
+
+ }
+
+# else /* __FreeBSD_version<1200027 */
Lf->lts.pqlen = (unsigned int)s.so_incqlen;
Lf->lts.qlen = (unsigned int)s.so_qlen;
Lf->lts.qlim = (unsigned int)s.so_qlimit;
Lf->lts.rbsz = (unsigned long)s.so_rcv.sb_mbmax;
Lf->lts.sbsz = (unsigned long)s.so_snd.sb_mbmax;
+
+# if defined(HASSBSTATE)
+ Lf->lts.sbs_rcv = s.so_rcv.sb_state;
+ Lf->lts.sbs_snd = s.so_snd.sb_state;
+# endif /* defined(HASSBSTATE) */
+# endif /*__FreeBSD_version>=1200027 */
+
Lf->lts.pqlens = Lf->lts.qlens = Lf->lts.qlims = Lf->lts.rbszs
= Lf->lts.sbszs = (unsigned char)1;
-#endif /* defined(HASSOOPT) */
-#if defined(HASSOSTATE)
+# if defined(HASSOSTATE)
Lf->lts.ss = (unsigned int)s.so_state;
-# if defined(HASSBSTATE)
- Lf->lts.sbs_rcv = s.so_rcv.sb_state;
- Lf->lts.sbs_snd = s.so_snd.sb_state;
-# endif /* defined(HASSBSTATE) */
-#endif /* defined(HASSOSTATE) */
+# endif /* defined(HASSOSTATE) */
+#endif /* defined(HASSOPT) */
/*
* Process socket by the associated domain family.
*/
if (p.pr_protocol == IPPROTO_TCP) {
if (in6p.in6p_ppcb) {
- if ((ts = ckstate((KA_T)in6p.in6p_ppcb, &t, fam)) == 1)
+ if ((ts = ckstate((KA_T)s.so_pcb, (KA_T)in6p.in6p_ppcb,
+ &t, fam)) == 1)
+ {
return;
+ }
}
}
enter_dev_ch(print_kptr((KA_T)(in6p.in6p_ppcb ? in6p.in6p_ppcb
}
if (p.pr_protocol == IPPROTO_TCP) {
if (inp.inp_ppcb) {
- if ((ts = ckstate((KA_T)inp.inp_ppcb, &t, fam)) == 1)
+ if ((ts = ckstate((KA_T)s.so_pcb, (KA_T)inp.inp_ppcb,
+ &t, fam)) == 1)
+ {
return;
+ }
}
}
enter_dev_ch(print_kptr((KA_T)(inp.inp_ppcb ? inp.inp_ppcb
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dstore.c,v 1.8 2008/04/15 13:31:47 abe Exp $";
+static char *rcsid = "$Id: dstore.c,v 1.9 2018/02/14 14:26:03 abe Exp $";
#endif
struct drive_Nl Drive_Nl[] = {
+ { X_BADFILEOPS, "badfileops" },
+
#if FREEBSDV<2005
{ X_NCACHE, "_nchhead" },
#else /* FREEBSDV>=2005 */
{ (long)0, NULL }
};
#endif /* defined(HASFSTRUCT) */
+
+
+/*
+ * Kernel's bad file operations address
+ */
+
+KA_T X_bfopsa; /* badfileops kernel address */
/*
- * $Id: machine.h,v 1.39 2015/07/07 20:23:43 abe Exp $
+ * $Id: machine.h,v 1.40 2018/02/14 14:26:03 abe Exp $
*/
/*
+ * HASPTSFN is defined for dialects that have a DTYPE_PTS file descriptor
+ * type. The definition names the function that processes the type.
+ *
+ *
+ * NOTE: don't forget to define a prototype for this function in dproto.h.
+ */
+
+#define HASPTSFN process_pts
+
+
+/*
* HASRNODE is defined for those dialects that have rnodes.
*/
* If only ORed process selection options have been specified,
* enable conditional file skipping and socket file only checking.
*/
- if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+ if ((Selflags & SELFILE) || !(Selflags & SelProc))
cckreg = ckscko = 0;
else
cckreg = ckscko = 1;
* socket file only checking, based on the process' selection
* status.
*/
- ckscko = (sf & SELPROC) ? 0 : 1;
+ ckscko = (sf & SelProc) ? 0 : 1;
}
alloc_lproc((int)p->pst_pid, (int)p->pst_pgrp, (int)p->pst_ppid,
(UID_ARG)p->pst_uid, p->pst_ucomm, (int)pss, (int)sf);
#ifndef lint
static char copyright[] =
"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dmnt.c,v 1.20 2015/07/07 19:47:31 abe Exp $";
+static char *rcsid = "$Id: dmnt.c,v 1.21 2018/02/14 14:26:38 abe Exp $";
#endif
if ((nfs = strcasecmp(fp[2], "nfs3")))
nfs = strcasecmp(fp[2], "nfs4");
}
+ if (!nfs && !HasNFS)
+ HasNFS = 1;
if (mp) {
/*
#ifndef lint
static char copyright[] =
"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dnode.c,v 1.25 2015/07/07 19:46:33 abe Exp $";
+static char *rcsid = "$Id: dnode.c,v 1.26 2018/02/14 14:26:38 abe Exp $";
#endif
#include "lsof.h"
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+#include <linux/major.h>
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
/*
* Local definitions
*/
#if defined(HASEPTOPTS)
-static pxinfo_t **Pinfo = (pxinfo_t **)NULL;
+static pxinfo_t **Pinfo = (pxinfo_t **)NULL; /* pipe endpoint hash buckets */
+# if defined(HASPTYEPT)
+static pxinfo_t **PtyInfo = (pxinfo_t **)NULL; /* pseudoterminal endpoint hash
+ * buckets */
+# endif /* defined(HASPTYEPT) */
#endif /* defined(HASEPTOPTS) */
}
+#if defined(HASPTYEPT)
+
+
+/*
+ * clear_ptyinfo() -- clear allocated pseudoterminal info
+ */
+
+void
+clear_ptyinfo()
+{
+ int h; /* hash index */
+ pxinfo_t *pi, *pp; /* temporary pointers */
+
+ if (!PtyInfo)
+ return;
+ for (h = 0; h < PINFOBUCKS; h++) {
+ if ((pi = PtyInfo[h])) {
+ do {
+ pp = pi->next;
+ (void) free((FREE_P *)pi);
+ pi = pp;
+ } while (pi);
+ PtyInfo[h] = (pxinfo_t *)NULL;
+ }
+ }
+}
+
+
+/*
+ * enter_ptmxi() -- enter pty info
+ *
+ * entry Lf = local file structure pointer
+ * Lp = local process structure pointer
+ */
+
+void
+enter_ptmxi(mn)
+ int mn; /* minor number of device */
+{
+ int h; /* hash result */
+ struct lfile *lf; /* local file structure pointer */
+ struct lproc *lp; /* local proc structure pointer */
+ pxinfo_t *np, *pi, *pe; /* inode hash pointers */
+
+ if (!PtyInfo) {
+
+ /*
+ * Allocate pipe info hash buckets (but used for pty).
+ */
+ if (!(PtyInfo = (pxinfo_t **)calloc(PINFOBUCKS,
+ sizeof(pxinfo_t *))))
+ {
+ (void) fprintf(stderr,
+ "%s: no space for %d pty info buckets\n", Pn, PINFOBUCKS);
+ Exit(1);
+ }
+ }
+ /*
+ * Make sure this is a unique entry.
+ */
+ for (h = HASHPINFO(mn), pi = PtyInfo[h], pe = (pxinfo_t *)NULL;
+ pi;
+ pe = pi, pi = pi->next
+ ) {
+ lf = pi->lf;
+ lp = &Lproc[pi->lpx];
+ if (pi->ino == mn) {
+ if ((lp->pid == Lp->pid) && !strcmp(lf->fd, Lf->fd))
+ return;
+ }
+ }
+ /*
+ * Allocate, fill and link a new pipe info structure used for pty
+ * to the end of the pty device hash chain.
+ */
+ if (!(np = (pxinfo_t *)malloc(sizeof(pxinfo_t)))) {
+ (void) fprintf(stderr,
+ "%s: no space for pipeinfo for pty, PID %d, FD %s\n",
+ Pn, Lp->pid, Lf->fd);
+ Exit(1);
+ }
+ np->ino = mn;
+ np->lf = Lf;
+ np->lpx = Lp - Lproc;
+ np->next = (pxinfo_t *)NULL;
+ if (pe)
+ pe->next = np;
+ else
+ PtyInfo[h] = np;
+}
+
+
+/*
+ * find_ptyepti() -- find pseudoterminal end point info
+ */
+
+pxinfo_t *
+find_ptyepti(lf, m, pp)
+ struct lfile *lf; /* pseudoterminal's lfile */
+ int m; /* minor number type:
+ * 0 == use tty_index
+ * 1 == use minor device */
+ pxinfo_t *pp; /* previous pseudoterminal info
+ * (NULL == none) */
+{
+ struct lfile *ef; /* pseudoterminal end local file */
+ int h; /* hash result */
+ INODETYPE mn; /* minor number */
+ pxinfo_t *pi; /* pseudoterminal info pointer */
+
+
+ mn = m ? GET_MIN_DEV(lf->rdev) : lf->tty_index;
+ if (PtyInfo) {
+ if (pp)
+ pi = pp;
+ else {
+ h = HASHPINFO(mn);
+ pi = PtyInfo[h];
+ }
+ while (pi) {
+ if (pi->ino == mn) {
+ ef = pi->lf;
+ if (((m && is_pty_ptmx(ef->rdev))
+ || ((!m) && is_pty_slave(GET_MAJ_DEV(ef->rdev))))
+ && strcmp(lf->fd, ef->fd)
+ ) {
+ return(pi);
+ }
+ }
+ pi = pi->next;
+ }
+ }
+ return((pxinfo_t *)NULL);
+}
+
+
/*
- * find_pendinfo() -- find pipe end info
+ * is_pty_slave() -- is a pseudoterminal a slave device
+ */
+
+int
+is_pty_slave(sm)
+ int sm; /* slave major device number */
+{
+ if ((UNIX98_PTY_SLAVE_MAJOR <= sm)
+ && (sm < (UNIX98_PTY_SLAVE_MAJOR + UNIX98_PTY_SLAVE_MAJOR))
+ ) {
+ return 1;
+ }
+ return 0;
+}
+
+
+/*
+ * is_pty_ptmx() -- is a pseudoterminal a master clone device
+ */
+
+int
+is_pty_ptmx(dev)
+ dev_t dev; /* device number */
+{
+ if ((GET_MAJ_DEV(dev) == TTYAUX_MAJOR) && (GET_MIN_DEV(dev) == 2))
+ return 1;
+ return 0;
+}
+#endif /* defined(HASPTYEPT) */
+
+
+/*
+ * find_pepti() -- find pipe end point info
*/
pxinfo_t *
-find_pendinfo(lf, pp)
+find_pepti(lf, pp)
struct lfile *lf; /* pipe's lfile */
pxinfo_t *pp; /* previous pipe info (NULL == none) */
{
if (ss & SB_RDEV) {
Lf->rdev = s->st_rdev;
Lf->rdev_def = 1;
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+ if ((Ntype == N_CHR)
+ && is_pty_slave(GET_MAJ_DEV(Lf->rdev))
+ ) {
+ enter_ptmxi(GET_MIN_DEV(Lf->rdev));
+ Lf->sf |= SELPTYINFO;
+ }
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
}
}
if (Ntype == N_REGLR && (HasNFS == 2)) {
#ifndef lint
static char copyright[] =
"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dproc.c,v 1.29 2015/07/07 19:46:33 abe Exp $";
+static char *rcsid = "$Id: dproc.c,v 1.30 2018/02/14 14:26:38 abe Exp $";
#endif
#include "lsof.h"
#define FDINFO_FLAGS 1 /* fdinfo flags available */
#define FDINFO_POS 2 /* fdinfo position available */
-#define FDINFO_ALL (FDINFO_FLAGS | FDINFO_POS)
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+#define FDINFO_TTY_INDEX 4 /* fdinfo tty-index available */
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+#define FDINFO_ALL (FDINFO_FLAGS | FDINFO_POS | FDINFO_TTY_INDEX)
+#else /* !(defined(HASEPTOPTS) && defined(HASPTYEPT)) */
+#define FDINFO_ALL (FDINFO_FLAGS | FDINFO_POS )
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
#define LSTAT_TEST_FILE "/"
#define LSTAT_TEST_SEEK 1
struct l_fdinfo {
int flags; /* flags: line value */
off_t pos; /* pos: line value */
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+ int tty_index; /* pty line index */
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
};
*/
_PROTOTYPE(static MALLOC_S alloc_cbf,(MALLOC_S len, char **cbf, MALLOC_S cbfa));
-_PROTOTYPE(static int get_fdinfo,(char *p, struct l_fdinfo *fi));
+_PROTOTYPE(static int get_fdinfo,(char *p, int msk, struct l_fdinfo *fi));
_PROTOTYPE(static int getlinksrc,(char *ln, char *src, int srcl, char **rest));
_PROTOTYPE(static int isefsys,(char *path, char *type, int l,
efsys_list_t **rep, struct lfile **lfr));
int *pgid));
_PROTOTYPE(static void process_proc_map,(char *p, struct stat *s, int ss));
_PROTOTYPE(static int process_id,(char *idp, int idpl, char *cmd, UID_ARG uid,
- int pid, int ppid, int pgid, int tid));
+ int pid, int ppid, int pgid, int tid,
+ char *tcmd));
_PROTOTYPE(static int statEx,(char *p, struct stat *s, int *ss));
gather_proc_info()
{
char *cmd, *tcmd;
+ char cmdbuf[MAXPATHLEN];
struct dirent *dp;
unsigned char ht, pidts;
- int n, nl, pgid, pid, ppid, rv, tid, tpgid, tppid, tx;
+ int n, nl, pgid, pid, ppid, prv, rv, tid, tpgid, tppid, tx;
static char *path = (char *)NULL;
static int pathl = 0;
static char *pidpath = (char *)NULL;
* If only ORed process selection options have been specified,
* enable conditional file skipping and socket file only checking.
*/
- if ((Selflags & SELFILE) || !(Selflags & SELPROC))
+ if ((Selflags & SELFILE) || !(Selflags & SelProc))
Cckreg = Ckscko = 0;
else
Cckreg = Ckscko = 1;
continue;
uid = (UID_ARG)sb.st_uid;
ht = pidts = 0;
+ /*
+ * Get the PID's command name.
+ */
+ (void) make_proc_path(pidpath, n, &path, &pathl, "stat");
+ if ((prv = read_id_stat(path, pid, &cmd, &ppid, &pgid)) < 0)
+ cmd = "(unknown)";
#if defined(HASTASKS)
/*
- * If task reporting is selected, check the tasks of the process first,
- * so that the "-p<PID> -aK" options work properly.
+ * Task reporting has been selected, so save the process' command
+ * string, so that task processing won't change it in the buffer of
+ * read_id_stat().
+ *
+ * Check the tasks of the process first, so that the "-p<PID> -aK"
+ * options work properly.
*/
- if ((Selflags & SELTASK)) {
+ else if (!IgnTasks && (Selflags & SELTASK)) {
+ strncpy(cmdbuf, cmd, sizeof(cmdbuf) - 1);
+ cmdbuf[sizeof(cmdbuf) - 1] = '\0';
+ cmd = cmdbuf;
(void) make_proc_path(pidpath, n, &taskpath, &taskpathl,
"task");
tx = n + 4;
/*
* Attempt to record the task.
*/
- if (!process_id(tidpath, (tx + 1 + nl+ 1), tcmd, uid,
- pid, tppid, tpgid, tid))
+ if (!process_id(tidpath, (tx + 1 + nl+ 1), cmd, uid,
+ pid, tppid, tpgid, tid, tcmd))
{
ht = 1;
}
/*
* If the main process is a task and task selection has been specified
* along with option ANDing, enter the main process temporarily as a
- * task, so that the "-aK" option set lists the main process along
+ * task, so that the "-aK" option set lists the main process along
* with its tasks.
*/
- (void) make_proc_path(pidpath, n, &path, &pathl, "stat");
- if (((rv = read_id_stat(path, pid, &cmd, &ppid, &pgid)) >= 0)
- && (rv != 1))
- {
- tid = (Fand && ht && pidts && (Selflags & SELTASK)) ? pid : 0;
- if ((!process_id(pidpath, n, cmd, uid, pid, ppid, pgid, tid))
+ if ((prv >= 0) && (prv != 1)) {
+ tid = (Fand && ht && pidts && !IgnTasks && (Selflags & SELTASK))
+ ? pid : 0;
+ if ((!process_id(pidpath, n, cmd, uid, pid, ppid, pgid, tid,
+ (char *)NULL))
&& tid)
{
Lp->tid = 0;
*/
static int
-get_fdinfo(p, fi)
+get_fdinfo(p, msk, fi)
char *p; /* path to fdinfo file */
+ int msk; /* mask for information type: e.g.,
+ * the FDINFO_* definition */
struct l_fdinfo *fi; /* pointer to local fdinfo values
* return structure */
{
*/
if (!fi)
return(0);
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+ fi->tty_index = -1;
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
if (!p || !*p || !(fs = fopen(p, "r")))
return(0);
/*
|| !ep || *ep)
continue;
fi->flags = (unsigned int)ul;
- if ((rv |= FDINFO_FLAGS) == FDINFO_ALL)
+ if ((rv |= FDINFO_FLAGS) == msk)
break;
} else if (!strcmp(fp[0], "pos:")) {
fi->pos = (off_t)ull;
if ((rv |= FDINFO_POS) == FDINFO_ALL)
break;
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+ } else if (!strcmp(fp[0], "tty-index:")) {
+
+ /*
+ * Process a "tty-index:" line.
+ */
+ ep = (char *)NULL;
+ if ((ul = strtoul(fp[1], &ep, 0)) == ULONG_MAX
+ || !ep || *ep)
+ continue;
+ fi->tty_index = (int)ul;
+ if (fi->tty_index < 0) {
+
+ /*
+ * Oops! If integer overflow occurred, reset the field.
+ */
+ fi->tty_index = -1;
+ }
+ if ((rv |= FDINFO_TTY_INDEX) == msk)
+ break;
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
}
}
fclose(fs);
if (!OffType) {
(void) snpf(path, sizeof(path), "%s/%d/fdinfo/%d", PROCFS,
Mypid, fd);
- if (get_fdinfo(path, &fi) & FDINFO_POS) {
+ if (get_fdinfo(path, FDINFO_POS, &fi) & FDINFO_POS) {
if (fi.pos == (off_t)LSTAT_TEST_SEEK)
OffType = 2;
}
*/
static int
-process_id(idp, idpl, cmd, uid, pid, ppid, pgid, tid)
+process_id(idp, idpl, cmd, uid, pid, ppid, pgid, tid, tcmd)
char *idp; /* pointer to ID's path */
int idpl; /* pointer to ID's path length */
char *cmd; /* pointer to ID's command */
int ppid; /* parent PID */
int pgid; /* parent GID */
int tid; /* task ID, if non-zero */
+ char *tcmd; /* task command, if non-NULL) */
{
- int av;
+ int av = 0;
static char *dpath = (char *)NULL;
static int dpathl = 0;
short efs, enls, enss, lnk, oty, pn, pss, sf;
* socket file only checking, based on the process' selection
* status.
*/
- Ckscko = (sf & SELPROC) ? 0 : 1;
+ Ckscko = (sf & SelProc) ? 0 : 1;
}
alloc_lproc(pid, pgid, ppid, uid, cmd, (int)pss, (int)sf);
- Lp->tid = tid;
Plf = (struct lfile *)NULL;
+
+#if defined(HASTASKS)
+/*
+ * Enter task information.
+ */
+ Lp->tid = tid;
+ if (tid && tcmd) {
+ if (!(Lp->tcmd = mkstrcpy(tcmd, (MALLOC_S *)NULL))) {
+ (void) fprintf(stderr,
+ "%s: PID %d, TID %d, no space for task name: ",
+ Pn, pid, tid);
+ safestrprt(tcmd, stderr, 1);
+ Exit(1);
+ }
+ }
+#endif /* defined(HASTASKS) */
+
/*
* Process the ID's current working directory info.
*/
if (oty) {
(void) make_proc_path(ipath, j, &pathi, &pathil,
fp->d_name);
- if ((av = get_fdinfo(pathi, &fi)) & FDINFO_POS) {
+ if ((av = get_fdinfo(pathi,FDINFO_ALL,&fi)) & FDINFO_POS) {
if (efs) {
if (Foffset) {
lfr->off = (SZOFFTYPE)fi.pos;
ls);
if ((Lf->ntype == N_ANON_INODE) && rest && *rest)
enter_nm(rest);
+
+#if defined(HASEPTOPTS) && defined(HASPTYEPT)
+ else if (Lf->rdev_def
+ && is_pty_ptmx(Lf->rdev)
+ && (av & FDINFO_TTY_INDEX)
+ ) {
+ enter_ptmxi(fi.tty_index);
+ Lf->tty_index = fi.tty_index;
+ Lf->sf |= SELPTYINFO;
+ }
+#endif /* defined(HASEPTOPTS) && defined(HASPTYEPT) */
+
if (Lf->sf)
link_lfile();
}
* type */
{
char buf[MAXPATHLEN], *cp, *cp1, **fp;
- int ch, cx, es, nf;
+ int ch, cx, es, nf, pc;
static char *cbf = (char *)NULL;
static MALLOC_S cbfa = 0;
FILE *fs;
if (!cp || (*cp != '('))
goto read_id_stat_exit;
cp++;
+ pc = 1; /* start the parenthesis balance count at 1 */
/*
* Enter the command characters safely. Supply them from the initial read
* of the stat file line, a '\n' if the initial read didn't yield a ')'
* command closure, or by reading the rest of the command a character at
- * a time from the stat file.
+ * a time from the stat file. Count embedded '(' characters and balance
+ * them with embedded ')' characters. The opening '(' starts the balance
+ * count at one.
*/
for (cx = es = 0;;) {
if (!es)
if ((ch = fgetc(fs)) == EOF)
goto read_id_stat_exit;
}
- if (ch == ')') /* ')' closes the command */
- break;
+ if (ch == '(') /* a '(' advances the balance count */
+ pc++;
+ if (ch == ')') {
+
+ /*
+ * Balance parentheses when a closure is encountered. When
+ * they are balanced, this is the end of the command.
+ */
+ pc--;
+ if (!pc)
+ break;
+ }
if ((cx + 2) > cbfa)
cbfa = alloc_cbf((cx + 2), &cbf, cbfa);
cbf[cx] = ch;
#ifndef lint
static char copyright[] =
"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: dsock.c,v 1.41 2015/07/07 19:46:33 abe Exp $";
+static char *rcsid = "$Id: dsock.c,v 1.42 2018/02/14 14:26:38 abe Exp $";
#endif
/*
+ * clear_uxsinfo -- clear allocated UNIX socket info
+ */
+
+void
+clear_uxsinfo()
+{
+ int h; /* hash index */
+ uxsin_t *ui, *up; /* remporary pointers */
+
+ if (!Uxsin)
+ return;
+ for (h = 0; h < INOBUCKS; h++) {
+ if ((ui = Uxsin[h])) {
+ do {
+ up = ui->next;
+ (void) free((FREE_P *)ui);
+ ui = up;
+ } while (ui);
+ Uxsin[h] = (uxsin_t *)NULL;
+ }
+ }
+}
+
+
+/*
* get_ax25() - get /proc/net/ax25 info
*/
/*
- * $Id: machine.h,v 1.47 2011/09/07 19:16:00 abe Exp $
+ * $Id: machine.h,v 1.48 2018/02/14 14:24:07 abe Exp $
*/
#if !defined(LSOF_MACHINE_H)
# if solaris>=100000
+# if !defined(HAS_AIO_REQ_STRUCT)
/*
- * Define a dummy aio_req structure for Solaris >= 10, because #include'ing
- * <sys/aio_req.h> with _KERNEL defined creates too many problems.
+ * When <sys.aio_req.h> lacks one, define a dummy aio_req structure for
+ * Solaris >= 10 systems.
+ *
+ * If this definition causes compilation errors for <sys/vnode.h>, especially
+ * with Solaris 11, it may be necessary to comment out the following structure
+ * definition. I don't know a test that will determine the possibility of
+ * compilation errors.
*/
typedef struct aio_req { int dummy; } aio_req_t;
+# endif /* !defined(HAS_AIO_REQ_STRUCT) */
+
/*
* Include <sys/utsname.h> so it won't be corrupted for 32 bit compilations
* when _KERNEL is defined for some include files in dlsof.h.
# if !defined(lint)
static char copyright[] =
"@(#) Copyright 1998 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: ckkv.c,v 1.3 2008/10/21 16:12:36 abe Exp $";
+static char *rcsid = "$Id: ckkv.c,v 1.3 2008/10/21 16:12:36 abe Exp abe $";
# endif /* !defined(lint) */
#include "../lsof.h"
# if !defined(lint)
static char copyright[] =
"@(#) Copyright 1997 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: prfp.c,v 1.14 2008/10/21 16:12:36 abe Exp $";
+static char *rcsid = "$Id: prfp.c,v 1.15 2018/02/14 14:21:08 abe Exp $";
# endif /* !defined(lint) */
#include "../lsof.h"
return;
#endif /* defined(DTYPE_PIPE) */
+#if defined(DTYPE_PTS)
+ case DTYPE_PTS:
+# if defined(HASPTSFN)
+ HASPTSFN((KA_T)f.f_data);
+# endif /* defined(HASPTSFN) */
+ return;
+#endif /* defined(DTYPE_PIPE) */
+
+#if defined(DTYPE_FIFO)
+ case DTYPE_FIFO:
+#endif /* defined(DTYPE_FIFO) */
+
#if defined(DTYPE_GNODE)
case DTYPE_GNODE:
#endif /* defined(DTYPE_GNODE) */
#endif /* defined(HASPRIVFILETYPE) */
default:
+
+#if defined(X_BADFILEOPS)
+ if (X_bfopsa && f.f_ops && (X_bfopsa == (KA_T)f.f_ops)) {
+ (void) snpf(Namech, Namechl,
+ "no more information; ty=%d file may be closing",
+ (int)f.f_type);
+ enter_nm(Namech);
+ return;
+ }
+#endif /* defined(X_BADFILEOPS) */
+
if (f.f_type || f.f_ops) {
(void) snpf(Namech, Namechl,
- "%s file struct, ty=%#x, op=%s",
+ "%s file struct, ty=%d, op=%s",
print_kptr(fp, tbuf, sizeof(tbuf)), (int)f.f_type,
print_kptr((KA_T)f.f_ops, (char *)NULL, 0));
enter_nm(Namech);
-.ds VN 4.89
+.ds VN 4.90
.TH LSOF 8 Revision-\*(VN
\" Register )P is used neither by this file nor any groff macro. However,
\" some versions of nroff require it.
.SH SYNOPSIS
.B lsof
[
-.B \-?abChKlnNOPRtUvVX
+.B \-?abChlnNOPRtUvVX
] [
.BI -A " A"
] [
] [
.BI \-k " k"
] [
+.BI \-K " k"
+] [
.BI +|\-L " [l]"
] [
.BI +|\-m " m"
.PP
.nf
Apple Darwin 9 and Mac OS X 10.[567]
- FreeBSD 8.[234], 9.0, 10.0 and 11.0 for AMD64-based systems
+ FreeBSD 8.[234], 9.0 and 1[012].0 for AMD64-based systems
Linux 2.1.72 and above for x86-based systems
Solaris 9, 10 and 11
.fi
.TP \w'names'u+4
.B +|-E
.B +E
-specifies that Linux pipe and Linux UNIX socket files should be displayed with
-endpoint information and the files of the endpoints should also be
-displayed.
-Note: UNIX socket file endpoint information is available only when the
+specifies that Linux pipe, Linux UNIX socket and Linux pseudoterminal files
+should be displayed with endpoint information and the files of the endpoints should also be displayed.
+Note: UNIX socket file endpoint information is only available when the
compile flags line of
.B \-v
-output contains HASUXSOCKEPT.
+output contains HASUXSOCKEPT, and psudoterminal endpoint information is only
+available when the compile flags line contains HASPTYEPT.
.IP
Pipe endpoint information is displayed in the NAME column in the
form ``\fIPID,cmd,FDmode\fP'', where
.I mode
is the endpoint file's access mode.
.IP
+Pseudoterminal
+endpoint information is displayed in the NAME column as
+``->/dev/pts\fImin\fP\ \fIPID,cmd,FDmode\fP'' or ``\fIPID,cmd,FDmode\fP''.
+The first form is for a master device; the second, for a slave device.
+.I min
+is a slave device's minor device number; and
+.I "PID, cmd, FD"
+and
+.I mode
+are the same as with pipe endpoint information.
+Note: psudoterminal endpoint information is only available when the compile
+flags line of
+.B \-V
+output contains HASPTYEPT.
+.IP
UNIX socket file endpoint information is displayed in the NAME column
in the form
.br
.I INODE
is the i-node number of the connected socket;
and
-.I "PID, cmd, FD,"
+.I "PID, cmd, FD"
and
.I mode
are the same as with pipe endpoint information.
:time \- either TCP, UDP or UDPLITE time service port
.fi
.TP \w'names'u+4
-.B \-K
+.BI \-K " k"
selects the listing of tasks (threads) of processes, on dialects
where task (thread) reporting is supported.
(If help output \- i.e., the output of the
options \- shows this option, then task (thread) reporting is
supported by the dialect.)
.IP
+If
+.B \-K
+is followed by a value,
+.IR k ,
+it must be ``i''. That causes
+.I lsof
+to ignore tasks, particularly in the default, list\-everything case
+when no other options are specified.
+.IP
When
.B \-K
and
state name(s) are in the list (\fIs\fP) preceded by a `^'; or
included if their name(s) are not preceded by a `^'.
.IP
+Dialects that support this option may support only one protocol.
+When an unsupported protocol is specified, a message will be
+displayed indicating state names for the protocol are unavailable.
+.IP
When an inclusion list is defined, only network files with state
names in the list will be present in the
.I lsof
.IP
A blank TID column in Linux indicates a process \- i.e., a non\-task.
.TP
+TASKCMD
+is the task command name.
+Generally this will be the same as the process named in the COMMAND
+column, but some task implementations (e.g., Linux) permit a task to
+change its command name.
+.IP
+The TASKCMD column width is subject to the same size limitation as the
+COMMAND column.
+.TP
ZONE
is the Solaris 10 and higher zone name.
This column must be selected with the
.IP
or ``PSXSHM'' for a POSIX shared memory file;
.IP
+or ``PTS'' for a
+.I /dev/pts
+file;
+.IP
or ``PUSG'' for a
.I /proc/usage
file;
l file's lock status
L process login name
m marker between repeated output
+ M the task comMand name
n file name, comment, Internet address
N node identifier (ox<hexadecimal>
o file's offset (decimal)
AIX 5.[12] and 5.3-ML1
Apple Darwin 7.x Power Macintosh systems
FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems
- FreeBSD 5.x and [6789].x for Alpha, AMD64 and Sparc64-based
- systems
+ FreeBSD 5.x, [6789].x and 1[012].8for Alpha, AMD64 and Sparc64
+ based systems
HP\-UX 11.00
NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based
systems
/*
- * $Id: lsof.h,v 1.68 2015/07/07 20:16:58 abe Exp $
+ * $Id: lsof.h,v 1.69 2018/02/14 14:19:25 abe Exp $
*/
*/
#define CHEND_PIPE 1 /* pipe endpoint ID */
+#define CHEND_PTY 4 /* pseudoterminal endpoint ID */
#define EPT_PIPE 1 /* process has pipe file */
#define EPT_PIPE_END 2 /* process has pipe end point file */
+#define EPT_PTY 8 /* process has a pseudoterminal file */
+#define EPT_PTY_END 16 /* process has a pseudoterminal end
+ * point file */
# if defined(HASUXSOCKEPT)
#define CHEND_UXS 2 /* UNIX socket endpoint ID */
#define RPTTM 15 /* default repeat seconds */
#define RTD " rtd" /* root directory fd name */
+#define TASKCMDL 9 /* maximum number of characters from
+ * command name to print in TASKCMD
+ * column */
#define TCPTPI_FLAGS 0x0001 /* report TCP/TPI socket options and
* state, and TCP_NODELAY state */
#define TCPTPI_QUEUES 0x0002 /* report TCP/TPI queue lengths */
#define SZTTL "SIZE"
#define SZOFFTTL "SIZE/OFF"
extern int SzOffColW;
-#define TIDTTL "TID"
-extern int TidColW;
+#define TASKCMDTTL "TASKCMD"
+extern int TaskCmdColW;
+#define TASKTIDTTL "TID"
+extern int TaskTidColW;
#define TYPETTL "TYPE"
extern int TypeColW;
#define USERTTL "USER"
#define SELTASK 0x4000 /* select tasks (-K) */
#define SELPINFO 0x8000 /* selected for pipe info (cleared in
* link_lfile() */
-#define SELUXSINFO 0x10000 /* selected for UNIX socket info
+#define SELUXSINFO 0x10000 /* selected for UNIX socket info;
+ * cleared in link_lfile() */
+#define SELPTYINFO 0x20000 /* selected for pseudoterminal info;
* cleared in link_lfile() */
#define SELALL (SELCMD|SELCNTX|SELFD|SELNA|SELNET|SELNM|SELNFS|SELPID|SELUID|SELUNX|SELZONE|SELTASK)
#define SELPROC (SELCMD|SELCNTX|SELPGID|SELPID|SELUID|SELZONE|SELTASK)
};
# endif /* defined(HAS_AFS) */
+extern int AllProc;
+
# if defined(HAS_STD_CLONE)
struct clone {
int dx; /* index of device entry in Devtp[] */
# endif /* defined(HASFSTRUCT) */
# if defined(HASEPTOPTS)
-typedef struct pxinfo { /* hashed pipe or UNIX socket inode
- * information */
+typedef struct pxinfo { /* hashed pipe, UNIX socket or pseudo-
+ * terminal inode information */
INODETYPE ino; /* file's inode */
struct lfile *lf; /* connected peer file */
int lpx; /* connected process index */
extern int Hdr;
enum IDType {PGID, PID};
+extern int IgnTasks;
extern char *InodeFmt_d;
extern char *InodeFmt_x;
extern int LastPid;
# if defined(HASEPTOPTS)
unsigned char chend; /* communication channel endpoint
* file */
+# if defined(HASPTYEPT)
+ int tty_index; /* pseudoterminal index of slave side
+ * (if this is the master side) */
+# endif /* defined(HASPTYEPT) */
# endif /* defined(HASEPTOPTS) */
unsigned char rdev_def; /* rdev definition status */
# if defined(HASTASKS)
int tid; /* task ID */
+ char *tcmd; /* task command name */
# endif /* HASTASKS */
int pgid; /* process group ID */
extern int PrPass;
extern int RptTm;
extern struct l_dev **Sdev;
-extern int Selall;
+extern int SelAll;
extern int Selflags;
+extern int SelProc;
extern int Setgid;
extern int Selinet;
extern int Setuidroot;
extern char *SzOffFmt_d;
extern char *SzOffFmt_dv;
extern char *SzOffFmt_x;
-extern int TaskPrtFl;
+extern int TaskCmdLim;
+extern int TaskPrtCmd;
+extern int TaskPrtTid;
extern int TcpStAlloc;
extern unsigned char *TcpStI;
extern int TcpStIn;
lsof - list open files
SYNOPSIS
- lsof [ -?abChKlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [
- +|-d d ] [ +|-D D ] [ +|-e s ] [ +|-E ] [ +|-f [cfgGn] ] [
- -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m
- m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [ -s
- [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ]
- [ -z [z] ] [ -Z [Z] ] [ -- ] [names]
+ lsof [ -?abChlnNOPRtUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d
+ d ] [ +|-D D ] [ +|-e s ] [ +|-E ] [ +|-f [cfgGn] ] [ -F [f]
+ ] [ -g [s] ] [ -i [i] ] [ -k k ] [ -K k ] [ +|-L [l] ] [
+ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t[m<fmt>]] ] [
+ -s [p:s] ] [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl]
+ ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]
DESCRIPTION
- Lsof revision 4.89 lists on its standard output file infor-
+ Lsof revision 4.90 lists on its standard output file infor-
mation about files opened by processes for the following
UNIX dialects:
Apple Darwin 9 and Mac OS X 10.[567]
- FreeBSD 8.[234], 9.0, 10.0 and 11.0 for AMD64-based systems
+ FreeBSD 8.[234], 9.0 and 1[012].0 for AMD64-based systems
Linux 2.1.72 and above for x86-based systems
Solaris 9, 10 and 11
-SunOS 5.9 Last change: Revision-4.89 1
+SunOS 5.9 Last change: Revision-4.90 1
-SunOS 5.9 Last change: Revision-4.89 2
+SunOS 5.9 Last change: Revision-4.90 2
-SunOS 5.9 Last change: Revision-4.89 3
+SunOS 5.9 Last change: Revision-4.90 3
-SunOS 5.9 Last change: Revision-4.89 4
+SunOS 5.9 Last change: Revision-4.90 4
-SunOS 5.9 Last change: Revision-4.89 5
+SunOS 5.9 Last change: Revision-4.90 5
-SunOS 5.9 Last change: Revision-4.89 6
+SunOS 5.9 Last change: Revision-4.90 6
-SunOS 5.9 Last change: Revision-4.89 7
+SunOS 5.9 Last change: Revision-4.90 7
information might be made available via the +|-m m
option.)
- +|-E +E specifies that Linux pipe and Linux UNIX socket
- files should be displayed with endpoint information
- and the files of the endpoints should also be
- displayed. Note: UNIX socket file endpoint infor-
- mation is available only when the compile flags
- line of -v output contains HASUXSOCKEPT.
+ +|-E +E specifies that Linux pipe, Linux UNIX socket and
+ Linux pseudoterminal files should be displayed with
+ endpoint information and the files of the endpoints
+ should also be displayed. Note: UNIX socket file
+ endpoint information is only available when the
+ compile flags line of -v output contains HASUX-
+ SOCKEPT, and psudoterminal endpoint information is
+ only available when the compile flags line contains
+ HASPTYEPT.
Pipe endpoint information is displayed in the NAME
column in the form ``PID,cmd,FDmode'', where PID is
cess command; FD is the endpoint file's descriptor;
and mode is the endpoint file's access mode.
+ Pseudoterminal endpoint information is displayed in
+ the NAME column as ``->/dev/ptsmin PID,cmd,FDmode''
+ or ``PID,cmd,FDmode''. The first form is for a
+ master device; the second, for a slave device. min
+ is a slave device's minor device number; and PID,
+ cmd, FD and mode are the same as with pipe endpoint
+ information. Note: psudoterminal endpoint informa-
+ tion is only available when the compile flags line
+ of -V output contains HASPTYEPT.
+
UNIX socket file endpoint information is displayed
in the NAME column in the form
``type=TYPE ->INO=INODE PID,cmd,FDmode'', where
TYPE is the socket type; INODE is the i-node number
- of the connected socket; and PID, cmd, FD, and mode
+ of the connected socket; and PID, cmd, FD and mode
are the same as with pipe endpoint information.
Note: UNIX socket file endpoint information is
available only when the compile flags line of -v
- output contains HASUXSOCKEPT.
- Multiple occurrences of this information can appear
- in a file's NAME column.
- -E specfies that Linux pipe and Linux UNIX socket
- files should be displayed with endpoint informa-
- tion, but not the files of the endpoints.
- +|-f [cfgGn]
- f by itself clarifies how path name arguments are
- to be interpreted. When followed by c, f, g, G, or
- n in any combination it specifies that the listing
+SunOS 5.9 Last change: Revision-4.90 8
-SunOS 5.9 Last change: Revision-4.89 8
+Maintenance Procedures LSOF(8)
-Maintenance Procedures LSOF(8)
+ output contains HASUXSOCKEPT.
+ Multiple occurrences of this information can appear
+ in a file's NAME column.
+ -E specfies that Linux pipe and Linux UNIX socket
+ files should be displayed with endpoint informa-
+ tion, but not the files of the endpoints.
+ +|-f [cfgGn]
+ f by itself clarifies how path name arguments are
+ to be interpreted. When followed by c, f, g, G, or
+ n in any combination it specifies that the listing
of kernel file structure information is to be
enabled (`+') or inhibited (`-').
structure information:
- c file structure use count (not Linux)
- f file structure address (not Linux)
- g file flag abbreviations (Linux 2.6.22 and up)
- G file flags in hexadecimal (Linux 2.6.22 and up)
- n file structure node address (not Linux)
- When the prefix is minus (`-') the same characters
- disable the listing of the indicated values.
- File structure addresses, use counts, flags, and
- node addresses may be used to detect more readily
- identical files inherited by child processes and
- identical files in use by different processes.
+SunOS 5.9 Last change: Revision-4.90 9
-SunOS 5.9 Last change: Revision-4.89 9
+Maintenance Procedures LSOF(8)
-Maintenance Procedures LSOF(8)
+ c file structure use count (not Linux)
+ f file structure address (not Linux)
+ g file flag abbreviations (Linux 2.6.22 and up)
+ G file flags in hexadecimal (Linux 2.6.22 and up)
+ n file structure node address (not Linux)
+ When the prefix is minus (`-') the same characters
+ disable the listing of the indicated values.
+ File structure addresses, use counts, flags, and
+ node addresses may be used to detect more readily
+ identical files inherited by child processes and
+ identical files in use by different processes.
Lsof column output can be sorted by output columns
holding the values and listed to identify identical
file use, or lsof field output can be parsed by an
When the field selection character list contains
the single character `?', lsof will display a help
- list of the field identification characters.
- (Escape the `?' character as your shell requires.)
- -g [s] excludes or selects the listing of files for the
- processes whose optional process group IDentifica-
- tion (PGID) numbers are in the comma-separated set
- s - e.g., ``123'' or ``123,^456''. (There should
- be no spaces in the set.)
- PGID numbers that begin with `^' (negation)
- represent exclusions.
- Multiple PGID numbers are joined in a single ORed
+SunOS 5.9 Last change: Revision-4.90 10
-SunOS 5.9 Last change: Revision-4.89 10
+Maintenance Procedures LSOF(8)
-Maintenance Procedures LSOF(8)
+ list of the field identification characters.
+ (Escape the `?' character as your shell requires.)
+ -g [s] excludes or selects the listing of files for the
+ processes whose optional process group IDentifica-
+ tion (PGID) numbers are in the comma-separated set
+ s - e.g., ``123'' or ``123,^456''. (There should
+ be no spaces in the set.)
+ PGID numbers that begin with `^' (negation)
+ represent exclusions.
+ Multiple PGID numbers are joined in a single ORed
set before participating in AND option selection.
However, PGID exclusions are applied without ORing
or ANDing and take effect before other selection
46 specifies the IP version, IPv4 or IPv6
that applies to the following address.
'6' may be be specified only if the UNIX
- dialect supports IPv6. If neither '4' nor
- '6' is specified, the following address
- applies to all IP versions.
- protocol is a protocol name - TCP, UDP
- hostname is an Internet host name. Unless a
- specific IP version is specified, open
- network files associated with host names
- of all versions will be selected.
- hostaddr is a numeric Internet IPv4 address in
- dot form; or an IPv6 numeric address in
- colon form, enclosed in brackets, if the
- UNIX dialect supports IPv6. When an IP
- version is selected, only its numeric
-SunOS 5.9 Last change: Revision-4.89 11
+SunOS 5.9 Last change: Revision-4.90 11
+ dialect supports IPv6. If neither '4' nor
+ '6' is specified, the following address
+ applies to all IP versions.
+ protocol is a protocol name - TCP, UDP
+ hostname is an Internet host name. Unless a
+ specific IP version is specified, open
+ network files associated with host names
+ of all versions will be selected.
+ hostaddr is a numeric Internet IPv4 address in
+ dot form; or an IPv6 numeric address in
+ colon form, enclosed in brackets, if the
+ UNIX dialect supports IPv6. When an IP
+ version is selected, only its numeric
addresses may be specified.
service is an /etc/services name - e.g., smtp -
or a list of them.
signs. There may be no embedded spaces, and all
service names must belong to the specified proto-
col. Since service names may contain embedded
- minus signs, the starting entry of a range can't be
- a service name; it can be a port number, however.
- Here are some sample addresses:
- -i6 - IPv6 only
- TCP:25 - TCP and port 25
- @1.2.3.4 - Internet IPv4 host address 1.2.3.4
- @[3ffe:1ebc::1]:1234 - Internet IPv6 host address
- 3ffe:1ebc::1, port 1234
- UDP:who - UDP who service port
- TCP@lsof.itap:513 - TCP, port 513 and host name lsof.itap
- tcp@foo:1-10,smtp,99 - TCP, ports 1 through 10,
+SunOS 5.9 Last change: Revision-4.90 12
-SunOS 5.9 Last change: Revision-4.89 12
+Maintenance Procedures LSOF(8)
-Maintenance Procedures LSOF(8)
+ minus signs, the starting entry of a range can't be
+ a service name; it can be a port number, however.
+ Here are some sample addresses:
+ -i6 - IPv6 only
+ TCP:25 - TCP and port 25
+ @1.2.3.4 - Internet IPv4 host address 1.2.3.4
+ @[3ffe:1ebc::1]:1234 - Internet IPv6 host address
+ 3ffe:1ebc::1, port 1234
+ UDP:who - UDP who service port
+ TCP@lsof.itap:513 - TCP, port 513 and host name lsof.itap
+ tcp@foo:1-10,smtp,99 - TCP, ports 1 through 10,
service name smtp, port 99, host name foo
tcp@bar:1-smtp - TCP, ports 1 through smtp, host bar
:time - either TCP, UDP or UDPLITE time service port
- -K selects the listing of tasks (threads) of
+ -K k selects the listing of tasks (threads) of
processes, on dialects where task (thread) report-
ing is supported. (If help output - i.e., the out-
put of the -h or -? options - shows this option,
then task (thread) reporting is supported by the
dialect.)
+ If -K is followed by a value, k, it must be ``i''.
+ That causes lsof to ignore tasks, particularly in
+ the default, list-everything case when no other
+ options are specified.
+
When -K and -a are both specified on Linux, and the
tasks of a main process are selected by other
options, the main process will also be listed as
names. It is also useful when login name lookup is
working improperly or slowly.
+
+
+
+SunOS 5.9 Last change: Revision-4.90 13
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
+|-L [l] enables (`+') or disables (`-') the listing of file
link counts, where they are available - e.g., they
aren't available for sockets, or most FIFOs and
files on the specified file system.
For other link count comparisons, use field output
-
-
-
-SunOS 5.9 Last change: Revision-4.89 13
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
(-F) and a post-processing script or program.
+|-m m specifies an alternate kernel memory file or
-h or -? options to see if the +m and +m m options
are available.
+
+
+
+SunOS 5.9 Last change: Revision-4.90 14
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
+|-M Enables (+) or disables (-) the reporting of port-
mapper registrations for local TCP, UDP and UDPLITE
ports, where port mapping is supported. (See the
or enabling it when already enabled is acceptable.
When portmapper registration reporting is enabled,
lsof displays the portmapper registration (if any)
-
-
-
-SunOS 5.9 Last change: Revision-4.89 14
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
for local TCP, UDP or UDPLITE ports in square
brackets immediately following the port numbers or
service names - e.g., ``:1234[name]'' or
tration reporting issues.
Portmapper registration reporting is supported only
+
+
+
+SunOS 5.9 Last change: Revision-4.90 15
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
on dialects that have RPC header files. (Some
Linux distributions with GlibC 2.14 do not have
them.) When portmapper registration reporting is
changed to OFFSET. Note: on some UNIX dialects
lsof can't obtain accurate or consistent file
offset information from its kernel data sources,
-
-
-
-SunOS 5.9 Last change: Revision-4.89 15
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
sometimes just for particular kinds of files (e.g.,
socket files.) Consult the lsof FAQ (The FAQ sec-
tion gives its location.) for more information.
option in the output of the -h or -? option to
determine the default that is in effect.
+
+
+SunOS 5.9 Last change: Revision-4.90 16
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
-O directs lsof to bypass the strategy it uses to
avoid being blocked by some kernel operations -
i.e., doing them in forked child processes. See
e.g., ``123'' or ``123,^456''. (There should be no
spaces in the set.)
-
-
-SunOS 5.9 Last change: Revision-4.89 16
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
PID numbers that begin with `^' (negation)
represent exclusions.
zero if any open files were ever listed; one, if
none were ever listed.
+
+
+
+SunOS 5.9 Last change: Revision-4.90 17
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
Lsof marks the end of each listing: if field out-
put is in progress (the -F, option has been speci-
fied), the default marker is `m'; otherwise the
format, ``%n''. Note also that when <fmt> contains
spaces or other characters that affect the shell's
interpretation of arguments, <fmt> must be quoted
-
-
-
-SunOS 5.9 Last change: Revision-4.89 17
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
appropriately.
Repeat mode reduces lsof startup overhead, so it is
a colon (`:') and a comma-separated protocol state
name list, the option causes open TCP and UDP files
to be excluded if their state name(s) are in the
- list (s) preceded by a `^'; or included if their
- name(s) are not preceded by a `^'.
- When an inclusion list is defined, only network
- files with state names in the list will be present
- in the lsof output. Thus, specifying one state
- name means that only network files with that lone
- state name will be listed.
- Case is unimportant in the protocol or state names,
- but there may be no spaces and the colon (`:')
- separating the protocol name (p) and the state name
- list (s) is required.
- If only TCP and UDP files are to be listed, as con-
- trolled by the specified exclusions and inclusions,
- the -i option must be specified, too. If only a
- single protocol's files are to be listed, add its
+SunOS 5.9 Last change: Revision-4.90 18
-SunOS 5.9 Last change: Revision-4.89 18
+Maintenance Procedures LSOF(8)
-Maintenance Procedures LSOF(8)
+ list (s) preceded by a `^'; or included if their
+ name(s) are not preceded by a `^'.
+
+ Dialects that support this option may support only
+ one protocol. When an unsupported protocol is
+ specified, a message will be displayed indicating
+ state names for the protocol are unavailable.
+ When an inclusion list is defined, only network
+ files with state names in the list will be present
+ in the lsof output. Thus, specifying one state
+ name means that only network files with that lone
+ state name will be listed.
+ Case is unimportant in the protocol or state names,
+ but there may be no spaces and the colon (`:')
+ separating the protocol name (p) and the state name
+ list (s) is required.
+ If only TCP and UDP files are to be listed, as con-
+ trolled by the specified exclusions and inclusions,
+ the -i option must be specified, too. If only a
+ single protocol's files are to be listed, add its
name as an argument to the -i option.
For example, to list only network files with TCP
The -o (without a following decimal digit count)
and -s option (without a following protocol and
state name list) are mutually exclusive; they can't
+
+
+
+SunOS 5.9 Last change: Revision-4.90 19
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
both be specified. When neither is specified, lsof
displays whatever value - size or offset - is
appropriate and available for the type of file.
addresses. In normal output the information
appears in parentheses, each item except TCP or TPI
state name identified by a keyword, followed by
-
-
-
-SunOS 5.9 Last change: Revision-4.89 19
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
`=', separated from others by a single space:
f selects reporting of socket options,
states and values, and TCP flags and
+
+
+
+SunOS 5.9 Last change: Revision-4.90 20
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
values.
q selects queue length reporting.
s selects connection state reporting.
TCP flags and one TCP value may be reported (when
available in the UNIX dialect) in the form of the
names that commonly appear after SO_, so_, SS_,
-
-
-
-SunOS 5.9 Last change: Revision-4.89 20
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
TCP_ and TF_ in the dialect's header files - most
often <sys/socket.h>, <sys/socketvar.h> and
<netinet/tcp_var.h>. Consult those header files
SNDBUF send buffer length (SO_SNDBUF)
Details on what socket options and values, socket
+
+
+
+SunOS 5.9 Last change: Revision-4.90 21
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
states, and TCP flags and values may be displayed
for particular UNIX dialects may be found in the
answer to the ``Why doesn't lsof report socket
in a single ORed set before participating in AND
option selection.
-
-
-SunOS 5.9 Last change: Revision-4.89 21
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
If a login name or user ID is preceded by a `^', it
becomes a negation - i.e., files of processes owned
by the login name or user ID will never be listed.
names, Internet addresses or files, login names,
NFS files, PIDs, PGIDs, and UIDs.
+
+
+
+SunOS 5.9 Last change: Revision-4.90 22
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
When other options are ANDed to search options, or
compile-time options restrict the listing of some
files, lsof may not report that it failed to find a
when they are already disabled or enabling them
when already enabled is acceptable.
-
-
-SunOS 5.9 Last change: Revision-4.89 22
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
The -t option selects the -w option.
-x [fl] may accompany the +d and +D options to direct their
reporting of executed text file and shared library
references.
+
+
+
+SunOS 5.9 Last change: Revision-4.90 23
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
WARNING: because this option uses the kernel
readx() function, its use on a busy AIX system
might cause an application process to hang so com-
an AIX kernel directory search kernel error, known
as the Stale Segment ID bug.
-
-
-SunOS 5.9 Last change: Revision-4.89 23
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
The readx() function, used by lsof or any other
program to access some sections of kernel virtual
memory, can trigger the Stale Segment ID bug. It
has an extremely large number of open TCP, UDP and
UDPLITE files, the processing of whose information
in the /proc/net/tcp* and /proc/net/udp* files
+
+
+
+SunOS 5.9 Last change: Revision-4.90 24
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
would take lsof a long time, and whose reporting is
not of interest.
-z [z] specifies how Solaris 10 and higher zone informa-
tion is to be handled.
-
-
-
-SunOS 5.9 Last change: Revision-4.89 24
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
Without a following argument - e.g., NO z - the
option specifies that zone names are to be listed
in the ZONE output column.
The -Z option may be followed by a wildcard secu-
rity context name, Z. That causes lsof to list
- only open files for processes in that security con-
- text. Multiple -Z Z option and argument pairs may
- be specified to form a list of security contexts.
- Any open file of any process in any of the security
- contexts will be listed, subject to other condi-
- tions specified by other options and arguments.
- Note that Z can be A:B:C or *:B:C or A:B:* or *:*:C
- to match against the A:B:C context.
+ only open files for processes in that security
+
+
+
+SunOS 5.9 Last change: Revision-4.90 25
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
+ context. Multiple -Z Z option and argument pairs
+ may be specified to form a list of security con-
+ texts. Any open file of any process in any of the
+ security contexts will be listed, subject to other
+ conditions specified by other options and argu-
+ ments. Note that Z can be A:B:C or *:B:C or A:B:*
+ or *:*:C to match against the A:B:C context.
-- The double minus sign option is a marker that sig-
nals the end of the keyed options. It may be used,
list all the files open on the file system. To be
considered a file system, the name must match a
mounted-on directory name in mount(8) output, or
-
-
-
-SunOS 5.9 Last change: Revision-4.89 25
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
match the name of a block device associated with a
mounted-on directory name. The +|-f option may be
used to force lsof to consider a name a file system
in the kernel socket structure. (See the next
paragraph for an exception to that rule for Linux.)
Specifying a relative path - e.g., ./file - in
+
+
+
+SunOS 5.9 Last change: Revision-4.90 26
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
place of the file's absolute path - e.g., /tmp/file
- won't work because lsof must match the characters
you specify with what it finds in the kernel UNIX
open files whose device and inode match that of the
specified path name.
-
-
-
-SunOS 5.9 Last change: Revision-4.89 26
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
If you have also specified the -b option, the only
names you may safely specify are file systems for
which your mount table supplies alternate device
Lsof may have trouble identifying all aspects of AFS files
in supported dialects when AFS kernel support is implemented
+
+
+
+SunOS 5.9 Last change: Revision-4.90 27
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
via dynamic modules whose addresses do not appear in the
kernel's variable name list. In that case, lsof may have to
guess at the identity of AFS files, and might not be able to
Lsof has three features that may cause security concerns.
First, its default compilation mode allows anyone to list
all open files with it. Second, by default it creates a
-
-
-
-SunOS 5.9 Last change: Revision-4.89 27
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
user-readable and user-writable device cache file in the
home directory of the real user ID that executes lsof. (The
list-all-open-files and device cache features may be dis-
gives the status of the HASSECURITY and HASNOSOCKSECURITY
definitions.
+
+
+
+
+SunOS 5.9 Last change: Revision-4.90 28
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
See the Security section of the 00README file of the lsof
distribution for information on building lsof with the
HASSECURITY and HASNOSOCKSECURITY options enabled.
of the lsof distribution and the lsof FAQ (The FAQ section
gives its location.)
-
-
-SunOS 5.9 Last change: Revision-4.89 28
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
WHEN IN DOUBT, YOU CAN TEMPORARILY DISABLE THE USE OF THE
DEVICE CACHE FILE WITH THE -Di OPTION.
form (e.g., ``\xab''). Space is non-printable in the COM-
MAND column (``\x20'') and printable elsewhere.
+
+
+
+
+SunOS 5.9 Last change: Revision-4.90 29
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
For some dialects - if HASSETLOCALE is defined in the
dialect's machine.h header file - lsof will print the
extended 8 bit characters of a language locale. The lsof
tions in the lsof FAQ (The FAQ section gives its location.)
for more information.
-
-
-SunOS 5.9 Last change: Revision-4.89 29
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
Lsof dynamically sizes the output columns each time it runs,
guaranteeing that each column is a minimum size. It also
guarantees that each column is separated from its predeces-
If a zero w value is specified to the +c w
option, the column contains all the characters of
the name of the UNIX command associated with the
+
+
+
+SunOS 5.9 Last change: Revision-4.90 30
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
process.
All command name characters maintained by the
A blank TID column in Linux indicates a process -
i.e., a non-task.
+ TASKCMD is the task command name. Generally this will be
+ the same as the process named in the COMMAND
+ column, but some task implementations (e.g.,
+ Linux) permit a task to change its command name.
+
+ The TASKCMD column width is subject to the same
+ size limitation as the COMMAND column.
+
ZONE is the Solaris 10 and higher zone name. This
column must be selected with the -z option.
the -Z option is inhibited when SELinux is dis-
abled in the running Linux kernel.
-
-
-SunOS 5.9 Last change: Revision-4.89 30
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
PPID is the Parent Process IDentification number of
the process. It is only displayed when the -R
option has been specified.
reported by ps(1). However, on Linux USER is the
user ID number or login that owns the directory
in /proc where lsof finds information about the
+
+
+
+SunOS 5.9 Last change: Revision-4.90 31
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
process. Usually that is the same value reported
by ps(1), but may differ when the process has
changed its effective user ID. (See the -l
lock characters, describing the type of lock
applied to the file:
-
-
-
-SunOS 5.9 Last change: Revision-4.89 31
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
entire file;
space if there is no lock.
+
+
+
+SunOS 5.9 Last change: Revision-4.90 32
+
+
+
+
+
+
+Maintenance Procedures LSOF(8)
+
+
+
See the LOCKS section for more information on the
lock information character.
or ``DOOR'' for a VDOOR file;
+ or ``FIFO'' for a FIFO special file;
+
+ or ``KQUEUE'' for a BSD style kernel event queue
+ file;
+ or ``LINK'' for a symbolic link file;
-SunOS 5.9 Last change: Revision-4.89 32
+ or ``MPB'' for a multiplexed block file;
+ or ``MPC'' for a multiplexed character file;
+ or ``NOFD'' for a Linux /proc/<PID>/fd directory
+SunOS 5.9 Last change: Revision-4.90 33
-Maintenance Procedures LSOF(8)
- or ``FIFO'' for a FIFO special file;
- or ``KQUEUE'' for a BSD style kernel event queue
- file;
- or ``LINK'' for a symbolic link file;
+Maintenance Procedures LSOF(8)
- or ``MPB'' for a multiplexed block file;
- or ``MPC'' for a multiplexed character file;
- or ``NOFD'' for a Linux /proc/<PID>/fd directory
that can't be opened -- the directory path
appears in the NAME column, followed by an error
message;
or ``PLDR'' for a /proc/lpw directory;
+ or ``PLDT'' for a /proc/ldt file;
+ or ``PLPI'' for a /proc/lpsinfo file;
+ or ``PLST'' for a /proc/lstatus file;
-SunOS 5.9 Last change: Revision-4.89 33
+ or ``PLU'' for a /proc/lusage file;
+ or ``PLWG'' for a /proc/gwindows file;
+ or ``PLWI'' for a /proc/lwpsinfo file;
-Maintenance Procedures LSOF(8)
+SunOS 5.9 Last change: Revision-4.90 34
- or ``PLDT'' for a /proc/ldt file;
- or ``PLPI'' for a /proc/lpsinfo file;
- or ``PLST'' for a /proc/lstatus file;
- or ``PLU'' for a /proc/lusage file;
+Maintenance Procedures LSOF(8)
- or ``PLWG'' for a /proc/gwindows file;
- or ``PLWI'' for a /proc/lwpsinfo file;
or ``PLWS'' for a /proc/lwpstatus file;
or ``PSXSEM'' for a POSIX semaphore file;
+ or ``PSXSHM'' for a POSIX shared memory file;
+
+ or ``PTS'' for a /dev/pts file;
+ or ``PUSG'' for a /proc/usage file;
+ or ``PW'' for a /proc/watch file;
-SunOS 5.9 Last change: Revision-4.89 34
+ or ``PXMP'' for a /proc/xmap file;
+ or ``REG'' for a regular file;
+SunOS 5.9 Last change: Revision-4.90 35
-Maintenance Procedures LSOF(8)
- or ``PSXSHM'' for a POSIX shared memory file;
- or ``PUSG'' for a /proc/usage file;
- or ``PW'' for a /proc/watch file;
+Maintenance Procedures LSOF(8)
- or ``PXMP'' for a /proc/xmap file;
- or ``REG'' for a regular file;
or ``SMT'' for a shared memory transport file;
BAS block, test, and set in use
BKIU block if in use
BL use block offsets
+ BSK block seek
+ CA copy avoid
+ CIO concurrent I/O
+ CLON clone
+ CLRD CL read
+ CR create
+ DF defer
+ DFI defer IND
+ DFLU data flush
+ DIR direct
-SunOS 5.9 Last change: Revision-4.89 35
+SunOS 5.9 Last change: Revision-4.90 36
- BSK block seek
- CA copy avoid
- CIO concurrent I/O
- CLON clone
- CLRD CL read
- CR create
- DF defer
- DFI defer IND
- DFLU data flush
- DIR direct
DLY delay
DOCL do clone
DSYN data-only integrity
REV revoked
RSH shared read
RSYN read synchronization
+ RW read and write access
+ SL shared lock
+ SNAP cooked snapshot
+ SOCK socket
+ SQSH Sequent shared set on open
+ SQSV Sequent SVM set on open
+ SQR Sequent set repair on open
+ SQS1 Sequent full shared open
+ SQS2 Sequent partial shared open
+ STPI stop I/O
-SunOS 5.9 Last change: Revision-4.89 36
+SunOS 5.9 Last change: Revision-4.90 37
- RW read and write access
- SL shared lock
- SNAP cooked snapshot
- SOCK socket
- SQSH Sequent shared set on open
- SQSV Sequent SVM set on open
- SQR Sequent set repair on open
- SQS1 Sequent full shared open
- SQS2 Sequent partial shared open
- STPI stop I/O
SWR synchronous read
SYN file integrity while writing
TCPM avoid TCP collision
ally a concatenation of device and node number)
when n has been specified to +f;
+ DEVICE contains the device numbers, separated by commas,
+ for a character special, block special, regular,
+ directory or NFS file;
+ or ``memory'' for a memory file system node under
+ Tru64 UNIX;
+ or the address of the private data area of a
+ Solaris socket stream;
-SunOS 5.9 Last change: Revision-4.89 37
+SunOS 5.9 Last change: Revision-4.90 38
-Maintenance Procedures LSOF(8)
- DEVICE contains the device numbers, separated by commas,
- for a character special, block special, regular,
- directory or NFS file;
+Maintenance Procedures LSOF(8)
- or ``memory'' for a memory file system node under
- Tru64 UNIX;
- or the address of the private data area of a
- Solaris socket stream;
or a kernel reference address that identifies the
file (The kernel reference address may be used
and an offset (i.e., its title is SIZE/OFF).
If the -o option is specified, lsof always
+ displays the file offset (or nothing if no offset
+ is available) and labels the column OFFSET. The
+ offset always begins with ``0t'' or ``0x'' as
+ described above.
+ The lsof user can control the switch from ``0t''
+ to ``0x'' with the -o o option. Consult its
+ description for more information.
+ If the -s option is specified, lsof always
-SunOS 5.9 Last change: Revision-4.89 38
+SunOS 5.9 Last change: Revision-4.90 39
-Maintenance Procedures LSOF(8)
+Maintenance Procedures LSOF(8)
- displays the file offset (or nothing if no offset
- is available) and labels the column OFFSET. The
- offset always begins with ``0t'' or ``0x'' as
- described above.
- The lsof user can control the switch from ``0t''
- to ``0x'' with the -o o option. Consult its
- description for more information.
- If the -s option is specified, lsof always
displays the file size (or nothing if no size is
available) and labels the column SIZE. The -o
and -s options are mutually exclusive; they can't
network file; the local host name or IP number is
followed by a colon (':'), the port, ``->'', and
the two-part remote address; IP addresses may be
+ reported as numbers or names, depending on the
+ +|-M, -n, and -P options; colon-separated IPv6
+ numbers are enclosed in square brackets; IPv4
+ INADDR_ANY and IPv6 IN6_IS_ADDR_UNSPECIFIED
+ addresses, and zero port numbers are represented
+ by an asterisk ('*'); a UDP destination address
+ may be followed by the amount of time elapsed
+ since the last packet was sent to the destina-
+ tion; TCP, UDP and UDPLITE remote addresses may
+ be followed by TCP/TPI information in parentheses
-SunOS 5.9 Last change: Revision-4.89 39
+SunOS 5.9 Last change: Revision-4.90 40
- reported as numbers or names, depending on the
- +|-M, -n, and -P options; colon-separated IPv6
- numbers are enclosed in square brackets; IPv4
- INADDR_ANY and IPv6 IN6_IS_ADDR_UNSPECIFIED
- addresses, and zero port numbers are represented
- by an asterisk ('*'); a UDP destination address
- may be followed by the amount of time elapsed
- since the last packet was sent to the destina-
- tion; TCP, UDP and UDPLITE remote addresses may
- be followed by TCP/TPI information in parentheses
- state (e.g., ``(ESTABLISHED)'', ``(Unbound)''),
queue sizes, and window sizes (not all dialects)
- in a fashion similar to what netstat(1)
followed by fourteen comma-separated bytes of a
non-Internet raw socket address;
+ or the HP-UX x.25 local address, followed by the
+ virtual connection number (if any), followed by
+ the remote address (if any);
+
+ or ``(dead)'' for disassociated Tru64 UNIX files
+ - typically terminal files that have been flagged
+ with the TIOCNOTTY ioctl and closed by daemons;
+ or ``rd=<offset>'' and ``wr=<offset>'' for the
-SunOS 5.9 Last change: Revision-4.89 40
+SunOS 5.9 Last change: Revision-4.90 41
-Maintenance Procedures LSOF(8)
+Maintenance Procedures LSOF(8)
- or the HP-UX x.25 local address, followed by the
- virtual connection number (if any), followed by
- the remote address (if any);
- or ``(dead)'' for disassociated Tru64 UNIX files
- - typically terminal files that have been flagged
- with the TIOCNOTTY ioctl and closed by daemons;
- or ``rd=<offset>'' and ``wr=<offset>'' for the
values of the read and write offsets of a FIFO;
or ``clone n:/dev/event'' for SCO OpenServer file
vnode addresses. <direction> will be ``<-'' if <address2>
has been fattach'ed to this vnode whose address is
<address1>; and ``->'' if <address1>, the vnode address of
+ this vnode, has been fattach'ed to <address2>. <address1>
+ may be omitted if it already appears in the DEVICE column.
+
+ Lsof may add two parenthetical notes to the NAME column for
+ open Solaris 10 files: ``(?)'' if lsof considers the path
+ name of questionable accuracy; and ``(deleted)'' if the -X
+ option has been specified and lsof detects the open file's
+ path name has been deleted. Consult the lsof FAQ (The FAQ
+ section gives its location.) for more information on these
-SunOS 5.9 Last change: Revision-4.89 41
+SunOS 5.9 Last change: Revision-4.90 42
- this vnode, has been fattach'ed to <address2>. <address1>
- may be omitted if it already appears in the DEVICE column.
-
- Lsof may add two parenthetical notes to the NAME column for
- open Solaris 10 files: ``(?)'' if lsof considers the path
- name of questionable accuracy; and ``(deleted)'' if the -X
- option has been specified and lsof detects the open file's
- path name has been deleted. Consult the lsof FAQ (The FAQ
- section gives its location.) for more information on these
NAME column additions.
LOCKS
It is possible to think of field output as process and file
sets. A process set begins with a field whose identifier is
`p' (for process IDentifier (PID)). It extends to the
+ beginning of the next PID field or the beginning of the
+ first file set of the process, whichever comes first.
+ Included in the process set are fields that identify the
+ command, the process group IDentification (PGID) number, the
+ task (thread) ID (TID), and the user ID (UID) number or
+ login name.
+
+ A file set begins with a field whose identifier is `f' (for
+ file descriptor). It is followed by lines that describe the
-SunOS 5.9 Last change: Revision-4.89 42
+SunOS 5.9 Last change: Revision-4.90 43
- beginning of the next PID field or the beginning of the
- first file set of the process, whichever comes first.
- Included in the process set are fields that identify the
- command, the process group IDentification (PGID) number, the
- task (thread) ID (TID), and the user ID (UID) number or
- login name.
-
- A file set begins with a field whose identifier is `f' (for
- file descriptor). It is followed by lines that describe the
file's access mode, lock state, type, device, size, offset,
inode, protocol, name and stream module names. It extends
to the beginning of the next file or process set, whichever
K tasK ID
k link count
l file's lock status
+ L process login name
+ m marker between repeated output
+ M the task comMand name
+ n file name, comment, Internet address
+ N node identifier (ox<hexadecimal>
+ o file's offset (decimal)
+ p process ID (always selected)
+ P protocol name
+ r raw device number (0x<hexadecimal>)
-SunOS 5.9 Last change: Revision-4.89 43
+SunOS 5.9 Last change: Revision-4.90 44
- L process login name
- m marker between repeated output
- n file name, comment, Internet address
- N node identifier (ox<hexadecimal>
- o file's offset (decimal)
- p process ID (always selected)
- P protocol name
- r raw device number (0x<hexadecimal>)
R parent process ID
s file's size (decimal)
S file's stream identification
device numbers; file inode number and protocol name; file
name and stream identification; file size and offset. One
or the other member of these mutually exclusive sets will
+ appear in field output, but not both.
+
+ Normally lsof ends each field with a NL (012) character.
+ The 0 (zero) field identifier character may be specified to
+ change the field terminator character to a NUL (000). A NUL
+ terminator may be easier to process with xargs (1), for
+ example, or with programs whose quoting mechanisms may not
+ easily cope with the range of characters in the field
-SunOS 5.9 Last change: Revision-4.89 44
+SunOS 5.9 Last change: Revision-4.90 45
- appear in field output, but not both.
-
- Normally lsof ends each field with a NL (012) character.
- The 0 (zero) field identifier character may be specified to
- change the field terminator character to a NUL (000). A NUL
- terminator may be easier to process with xargs (1), for
- example, or with programs whose quoting mechanisms may not
- easily cope with the range of characters in the field out-
- put. When the NUL field terminator is in use, lsof ends
+ output. When the NUL field terminator is in use, lsof ends
each process and file set with a NL (012).
Three aids to producing programs that can process lsof field
file system information, it normally continues, although
with less information available to display about open files.
+ Lsof can also be directed to avoid the protection of timers
+ and child processes when using the kernel functions that
+ might block by specifying the -O option. While this will
+ allow lsof to start up with less overhead, it exposes lsof
+ completely to the kernel situations that might block it.
+ Use this option cautiously.
+
-SunOS 5.9 Last change: Revision-4.89 45
+SunOS 5.9 Last change: Revision-4.90 46
-Maintenance Procedures LSOF(8)
+Maintenance Procedures LSOF(8)
- Lsof can also be directed to avoid the protection of timers
- and child processes when using the kernel functions that
- might block by specifying the -O option. While this will
- allow lsof to start up with less overhead, it exposes lsof
- completely to the kernel situations that might block it.
- Use this option cautiously.
AVOIDING KERNEL BLOCKS
You can use the -b option to tell lsof to avoid using kernel
lsof will report the device number it obtained. (You can
suppress the report by specifying the -w option.)
+ You can assist this process if your mount table is supported
+ with an /etc/mtab or /etc/mnttab file that contains an
+ options field by adding a ``dev=xxxx'' field for mount
+ points that do not have one in their options strings. Note:
+ you must be able to edit the file - i.e., some mount tables
+ like recent Solaris /etc/mnttab or Linux /proc/mounts are
+ read-only and can't be modified.
-SunOS 5.9 Last change: Revision-4.89 46
+SunOS 5.9 Last change: Revision-4.90 47
- You can assist this process if your mount table is supported
- with an /etc/mtab or /etc/mnttab file that contains an
- options field by adding a ``dev=xxxx'' field for mount
- points that do not have one in their options strings. Note:
- you must be able to edit the file - i.e., some mount tables
- like recent Solaris /etc/mnttab or Linux /proc/mounts are
- read-only and can't be modified.
-
You may also be able to supply device numbers using the +m
and +m m options, provided they are supported by your
dialect. Check the output of lsof's -h or -? options to see
Look for standard error file warning messages that begin
``assuming "dev=xxxx" from ...''.
-KERNEL NAME CACHE
+KERNEL NAME CACHE
+ Lsof is able to examine the kernel's name cache or use other
+ kernel facilities (e.g., the ADVFS 4.x tag_to_path() func-
+ tion under Tru64 UNIX) on some dialects for most file system
+ types, excluding AFS, and extract recently used path name
+ components from it. (AFS file system path lookups don't use
+ the kernel's name cache; some Solaris VxFS file system
+ operations apparently don't use it, either.)
+
-SunOS 5.9 Last change: Revision-4.89 47
+SunOS 5.9 Last change: Revision-4.90 48
- Lsof is able to examine the kernel's name cache or use other
- kernel facilities (e.g., the ADVFS 4.x tag_to_path() func-
- tion under Tru64 UNIX) on some dialects for most file system
- types, excluding AFS, and extract recently used path name
- components from it. (AFS file system path lookups don't use
- the kernel's name cache; some Solaris VxFS file system
- operations apparently don't use it, either.)
-
Lsof reports the complete paths it finds in the NAME column.
If lsof can't report all components in a path, it reports in
the NAME column the file system name, followed by a space,
If you want to know why lsof can't report path name com-
ponents for some dialects, see the lsof FAQ (The FAQ section
+ gives its location.)
+DEVICE CACHE FILE
+ Examining all members of the /dev (or /devices) node tree
+ with stat(2) functions can be time consuming. What's more,
+ the information that lsof needs - device number, inode
+ number, and path - rarely changes.
-SunOS 5.9 Last change: Revision-4.89 48
+SunOS 5.9 Last change: Revision-4.90 49
-Maintenance Procedures LSOF(8)
+Maintenance Procedures LSOF(8)
- gives its location.)
-DEVICE CACHE FILE
- Examining all members of the /dev (or /devices) node tree
- with stat(2) functions can be time consuming. What's more,
- the information that lsof needs - device number, inode
- number, and path - rarely changes.
Consequently, lsof normally maintains an ASCII text file of
cached /dev (or /devices) information (exception: the
When a new device is added to the system, the device cache
file may need to be recreated. Since lsof compares the
mtime of the device cache file with the mtime and ctime of
+ the /dev (or /devices) directory, it usually detects that a
+ new device has been added; in that case lsof issues a warn-
+ ing message and attempts to rebuild the device cache file.
+ Whenever lsof writes a device cache file, it sets its owner-
+ ship to the real UID of the executing process, and its per-
+ mission modes to 0600, this restricting its reading and
+ writing to the file's owner.
-SunOS 5.9 Last change: Revision-4.89 49
-
+SunOS 5.9 Last change: Revision-4.90 50
-Maintenance Procedures LSOF(8)
+Maintenance Procedures LSOF(8)
- the /dev (or /devices) directory, it usually detects that a
- new device has been added; in that case lsof issues a warn-
- ing message and attempts to rebuild the device cache file.
- Whenever lsof writes a device cache file, it sets its owner-
- ship to the real UID of the executing process, and its per-
- mission modes to 0600, this restricting its reading and
- writing to the file's owner.
LSOF PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS
Two permissions of the lsof executable affect its ability to
AIX 5.[12] and 5.3-ML1
Apple Darwin 7.x Power Macintosh systems
FreeBSD 4.x, 4.1x, 5.x and [6789].x for x86-based systems
- FreeBSD 5.x and [6789].x for Alpha, AMD64 and Sparc64-based
- systems
+ FreeBSD 5.x, [6789].x and 1[012].8for Alpha, AMD64 and Sparc64
+ based systems
HP-UX 11.00
NetBSD 1.[456], 2.x and 3.x for Alpha, x86, and SPARC-based
systems
Solaris 2.6, 8, 9 and 10
Tru64 UNIX 5.1
+ (Note: lsof for AIX 5L and above needs setuid-root permis-
+ sion if its -X option is used.)
+ Lsof for these dialects does not support a device cache, so
+ the permissions given to the executable don't apply to the
+ device cache file.
+ Linux
-SunOS 5.9 Last change: Revision-4.89 50
+SunOS 5.9 Last change: Revision-4.90 51
-Maintenance Procedures LSOF(8)
- (Note: lsof for AIX 5L and above needs setuid-root permis-
- sion if its -X option is used.)
+Maintenance Procedures LSOF(8)
- Lsof for these dialects does not support a device cache, so
- the permissions given to the executable don't apply to the
- device cache file.
- Linux
DEVICE CACHE FILE PATH FROM THE -D OPTION
The -D option provides limited means for specifying the dev-
only to a path it considers legitimate for the lsof process
effective and real UIDs.
+DEVICE CACHE PATH FROM AN ENVIRONMENT VARIABLE
+ Lsof's second choice for the device cache file is the con-
+ tents of the LSOFDEVCACHE environment variable. It avoids
+ this choice if the lsof process is setuid-root, or the real
+ UID of the process is root.
+ A further restriction applies to a device cache file path
+ taken from the LSOFDEVCACHE environment variable: lsof will
+ not write a device cache file to the path if the lsof pro-
+ cess doesn't surrender its setgid permission. (See the LSOF
-SunOS 5.9 Last change: Revision-4.89 51
+SunOS 5.9 Last change: Revision-4.90 52
-DEVICE CACHE PATH FROM AN ENVIRONMENT VARIABLE
- Lsof's second choice for the device cache file is the con-
- tents of the LSOFDEVCACHE environment variable. It avoids
- this choice if the lsof process is setuid-root, or the real
- UID of the process is root.
-
- A further restriction applies to a device cache file path
- taken from the LSOFDEVCACHE environment variable: lsof will
- not write a device cache file to the path if the lsof pro-
- cess doesn't surrender its setgid permission. (See the LSOF
PERMISSIONS THAT AFFECT DEVICE CACHE FILE ACCESS section for
information on implementations that don't surrender their
setgid permission.)
cache file. This is the only time lsof uses two paths when
reading the device cache file.
+ The hostname part of the second component is the base name
+ of the executing host, as returned by gethostname(2). The
+ base name is defined to be the characters preceding the
+ first `.' in the gethostname(2) output, or all the gethost-
+ name(2) output if it contains no `.'.
+
+ The device cache file belongs to the user ID and is readable
+ and writable by the user ID alone - i.e., its modes are
+ 0600. Each distinct real user ID on a given host that exe-
+ cutes lsof has a distinct device cache file. The hostname
-SunOS 5.9 Last change: Revision-4.89 52
+SunOS 5.9 Last change: Revision-4.90 53
- The hostname part of the second component is the base name
- of the executing host, as returned by gethostname(2). The
- base name is defined to be the characters preceding the
- first `.' in the gethostname(2) output, or all the gethost-
- name(2) output if it contains no `.'.
-
- The device cache file belongs to the user ID and is readable
- and writable by the user ID alone - i.e., its modes are
- 0600. Each distinct real user ID on a given host that exe-
- cutes lsof has a distinct device cache file. The hostname
part of the path distinguishes device cache files in an
NFS-mounted home directory into which device cache files are
written from several different hosts.
lsof process is setuid-root or when the real UID of the pro-
cess is root.
+ Lsof will not write to a modified personal device cache file
+ path if the lsof process doesn't surrender setgid permis-
+ sion. (See the LSOF PERMISSIONS THAT AFFECT DEVICE CACHE
+ FILE ACCESS section for a list of implementations that nor-
+ mally don't surrender their setgid permission.)
+
+ If, for example, you want to create a sub-directory of per-
+ sonal device cache file paths by using the LSOFPERSDCPATH
+ environment variable to name it, and lsof doesn't surrender
+ its setgid permission, you will have to allow lsof to create
-SunOS 5.9 Last change: Revision-4.89 53
+SunOS 5.9 Last change: Revision-4.90 54
- Lsof will not write to a modified personal device cache file
- path if the lsof process doesn't surrender setgid permis-
- sion. (See the LSOF PERMISSIONS THAT AFFECT DEVICE CACHE
- FILE ACCESS section for a list of implementations that nor-
- mally don't surrender their setgid permission.)
-
- If, for example, you want to create a sub-directory of per-
- sonal device cache file paths by using the LSOFPERSDCPATH
- environment variable to name it, and lsof doesn't surrender
- its setgid permission, you will have to allow lsof to create
device cache files at the standard personal path and move
them to your subdirectory with shell commands.
definition. In this case, the output from the help options
will include the message:
+ Inaccessible /dev warnings are disabled.
+ Inaccessible device warning messages usually disappear after
+ lsof has created a working device cache file.
+EXAMPLES
+ For a more extensive set of examples, documented more fully,
+ see the 00QUICKSTART file of the lsof distribution.
-
-SunOS 5.9 Last change: Revision-4.89 54
+ To list all open files, use:
+SunOS 5.9 Last change: Revision-4.90 55
-Maintenance Procedures LSOF(8)
- Inaccessible /dev warnings are disabled.
- Inaccessible device warning messages usually disappear after
- lsof has created a working device cache file.
+Maintenance Procedures LSOF(8)
-EXAMPLES
- For a more extensive set of examples, documented more fully,
- see the 00QUICKSTART file of the lsof distribution.
- To list all open files, use:
lsof
lsof /u/abe/foo
+ To send a SIGHUP to the processes that have /u/abe/bar open,
+ use:
+ kill -HUP `lsof -t /u/abe/bar`
+ To find any open file, including an open UNIX domain socket
+ file, with the name /dev/log, use:
-SunOS 5.9 Last change: Revision-4.89 55
+ lsof /dev/log
+SunOS 5.9 Last change: Revision-4.90 56
-Maintenance Procedures LSOF(8)
- To send a SIGHUP to the processes that have /u/abe/bar open,
- use:
- kill -HUP `lsof -t /u/abe/bar`
- To find any open file, including an open UNIX domain socket
- file, with the name /dev/log, use:
+Maintenance Procedures LSOF(8)
+
- lsof /dev/log
To find processes with open files on the NFS file system
named /nfs/mount/point whose server is inaccessible, and
To find an IP version 6 socket file (when the UNIX dialect
supports IPv6) by its associated numeric colon-form address,
+ use:
+ lsof -i@[0:1:2:3:4:5:6:7]
+ To find an IP version 6 socket file (when the UNIX dialect
+ supports IPv6) by an associated numeric colon-form address
+ that has a run of zeroes in it - e.g., the loop-back address
+ - use:
-SunOS 5.9 Last change: Revision-4.89 56
-
+ lsof -i@[::1]
+SunOS 5.9 Last change: Revision-4.90 57
-Maintenance Procedures LSOF(8)
- use:
- lsof -i@[0:1:2:3:4:5:6:7]
+Maintenance Procedures LSOF(8)
- To find an IP version 6 socket file (when the UNIX dialect
- supports IPv6) by an associated numeric colon-form address
- that has a run of zeroes in it - e.g., the loop-back address
- - use:
- lsof -i@[::1]
To obtain a repeat mode marker line that contains the
current time, use:
The support for /proc file systems is available only for BSD
and Tru64 UNIX dialects, Linux, and dialects derived from
+ SYSV R4 - e.g., FreeBSD, NetBSD, OpenBSD, Solaris, UnixWare.
+ Some /proc file items - device number, inode number, and
+ file size - are unavailable in some dialects. Searching for
+ files in a /proc file system may require that the full path
+ name be specified.
-
-SunOS 5.9 Last change: Revision-4.89 57
+ No text (txt) file descriptors are displayed for Linux
+ processes. All entries for files other than the current
+ working directory, the root directory, and numerical file
+ descriptors are labeled mem descriptors.
+SunOS 5.9 Last change: Revision-4.90 58
-Maintenance Procedures LSOF(8)
- SYSV R4 - e.g., FreeBSD, NetBSD, OpenBSD, Solaris, UnixWare.
+Maintenance Procedures LSOF(8)
- Some /proc file items - device number, inode number, and
- file size - are unavailable in some dialects. Searching for
- files in a /proc file system may require that the full path
- name be specified.
- No text (txt) file descriptors are displayed for Linux
- processes. All entries for files other than the current
- working directory, the root directory, and numerical file
- descriptors are labeled mem descriptors.
Lsof can't search for Tru64 UNIX named pipes by name,
because their kernel implementation of lstat(2) returns an
Frequently-asked questions and their answers (an FAQ) are
available in the 00FAQ file of the lsof distribution.
+ That file is also available via anonymous ftp from
+ lsof.itap.purdue.edu at pub/tools/unix/lsofFAQ. The URL is:
+ ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
-SunOS 5.9 Last change: Revision-4.89 58
+FILES
+ /dev/kmem kernel virtual memory device
+ /dev/mem physical memory device
+ /dev/swap system paging device
+SunOS 5.9 Last change: Revision-4.90 59
-Maintenance Procedures LSOF(8)
- That file is also available via anonymous ftp from
- lsof.itap.purdue.edu at pub/tools/unix/lsofFAQ. The URL is:
- ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
-FILES
- /dev/kmem kernel virtual memory device
+Maintenance Procedures LSOF(8)
- /dev/mem physical memory device
- /dev/swap system paging device
.lsof_hostname lsof's device cache file (The suffix,
hostname, is the first component of the
README.lsof_<version> and the other 00* files of the distri-
bution before sending questions to the author.
-
-
-
-SunOS 5.9 Last change: Revision-4.89 59
-
-
-
-
-
-
-Maintenance Procedures LSOF(8)
-
-
-
SEE ALSO
Not all the following manual pages may exist in every UNIX
dialect to which lsof has been ported.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-SunOS 5.9 Last change: Revision-4.89 60
+SunOS 5.9 Last change: Revision-4.90 60
/*
- * $Id: lsof_fields.h,v 1.13 2014/10/13 22:36:20 abe Exp $
+ * $Id: lsof_fields.h,v 1.14 2018/02/14 14:19:25 abe Exp $
*/
#define LSOF_FIX_MARK 13
#define LSOF_FNM_MARK "marker between repeated output"
+#define LSOF_FID_TCMD 'M'
+#define LSOF_FIX_TCMD 14
+#define LSOF_FNM_TCMD "task comMand name"
+
#define LSOF_FID_NAME 'n'
-#define LSOF_FIX_NAME 14
+#define LSOF_FIX_NAME 15
#define LSOF_FNM_NAME "comment, name, Internet addresses"
#define LSOF_FID_NI 'N'
-#define LSOF_FIX_NI 15
+#define LSOF_FIX_NI 16
#define LSOF_FNM_NI "file struct node ID as 0x<hex>"
#define LSOF_FID_OFFSET 'o'
-#define LSOF_FIX_OFFSET 16
+#define LSOF_FIX_OFFSET 17
#define LSOF_FNM_OFFSET "file offset as 0t<dec> or 0x<hex>"
#define LSOF_FID_PID 'p'
-#define LSOF_FIX_PID 17
+#define LSOF_FIX_PID 18
#define LSOF_FNM_PID "process ID (PID)"
#define LSOF_FID_PGID 'g'
-#define LSOF_FIX_PGID 18
+#define LSOF_FIX_PGID 19
#define LSOF_FNM_PGID "process group ID (PGID)"
#define LSOF_FID_PROTO 'P'
-#define LSOF_FIX_PROTO 19
+#define LSOF_FIX_PROTO 20
#define LSOF_FNM_PROTO "protocol name"
#define LSOF_FID_RDEV 'r'
-#define LSOF_FIX_RDEV 20
+#define LSOF_FIX_RDEV 21
#define LSOF_FNM_RDEV "raw device number as 0x<hex>"
#define LSOF_FID_PPID 'R'
-#define LSOF_FIX_PPID 21
+#define LSOF_FIX_PPID 22
#define LSOF_FNM_PPID "paRent PID"
#define LSOF_FID_SIZE 's'
-#define LSOF_FIX_SIZE 22
+#define LSOF_FIX_SIZE 23
#define LSOF_FNM_SIZE "file size"
#define LSOF_FID_STREAM 'S'
-#define LSOF_FIX_STREAM 23
+#define LSOF_FIX_STREAM 24
#define LSOF_FNM_STREAM "stream module and device names"
#define LSOF_FID_TYPE 't'
-#define LSOF_FIX_TYPE 24
+#define LSOF_FIX_TYPE 25
#define LSOF_FNM_TYPE "file type"
#define LSOF_FID_TCPTPI 'T'
-#define LSOF_FIX_TCPTPI 25
+#define LSOF_FIX_TCPTPI 26
#define LSOF_FNM_TCPTPI "TCP/TPI info"
#define LSOF_FID_UID 'u'
-#define LSOF_FIX_UID 26
+#define LSOF_FIX_UID 27
#define LSOF_FNM_UID "user ID (UID)"
#define LSOF_FID_ZONE 'z'
-#define LSOF_FIX_ZONE 27
+#define LSOF_FIX_ZONE 28
#define LSOF_FNM_ZONE "zone name"
#define LSOF_FID_CNTX 'Z'
-#define LSOF_FIX_CNTX 28
+#define LSOF_FIX_CNTX 29
#define LSOF_FNM_CNTX "security context"
#define LSOF_FID_TERM '0'
-#define LSOF_FIX_TERM 29
+#define LSOF_FIX_TERM 30
#define LSOF_FNM_TERM "(zero) use NUL field terminator instead of NL"
#endif /* !defined(LSOF_FORMAT_H) */
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: main.c,v 1.57 2015/07/07 20:16:58 abe Exp $";
+static char *rcsid = "$Id: main.c,v 1.58 2018/02/14 14:20:14 abe Exp $";
#endif
*
* Make sure umask allows lsof to define its own file permissions.
*/
+
if ((MaxFd = (int) GET_MAX_FD()) < 53)
MaxFd = 53;
+
+#if defined(HAS_CLOSEFROM)
+ (void) closefrom(3);
+#else /* !defined(HAS_CLOSEFROM) */
for (i = 3; i < MaxFd; i++)
(void) close(i);
+#endif /* !defined(HAS_CLOSEFROM) */
+
while (((i = open("/dev/null", O_RDWR, 0)) >= 0) && (i < 2))
;
if (i < 0)
#endif /* defined(HASKOPT) */
#if defined(HASTASKS)
- "K",
+ "K:",
#else /* !defined(HASTASKS) */
"",
#endif /* defined(HASTASKS) */
GOx2 = GObk[1];
}
} else {
- CmdLim = atoi(GOv);
+ CmdLim = TaskCmdLim = atoi(GOv);
#if defined(MAXSYSCMDL)
if (CmdLim > MAXSYSCMDL) {
continue;
#endif /* !defined(HASPPID) */
+#if !defined(HASTASKS)
+ if (FieldSel[i].id == LSOF_FID_TCMD)
+ continue;
+#endif /* !defined(HASTASKS) */
+
#if !defined(HASFSTRUCT)
if (FieldSel[i].id == LSOF_FID_CT
|| FieldSel[i].id == LSOF_FID_FA
continue;
#endif /* !defined(HASPPID) */
+#if !defined(HASTASKS)
+ if (FieldSel[i].id == LSOF_FID_TCMD)
+ continue;
+#endif /* !defined(HASTASKS) */
+
#if !defined(HASFSTRUCT)
if (FieldSel[i].id == LSOF_FID_CT
|| FieldSel[i].id == LSOF_FID_FA
#endif /* defined(HASKOPT) */
#if defined(HASTASKS)
- case 'K':
+ case 'K':
+ if (!GOv || *GOv == '-' || *GOv == '+') {
Ftask = 1;
+ IgnTasks = 0;
Selflags |= SELTASK;
- break;
+ if (GOv) {
+ GOx1 = GObk[0];
+ GOx2 = GObk[1];
+ }
+ } else {
+ if (!strcasecmp(GOv, "i")) {
+ Ftask = 0;
+ IgnTasks = 1;
+ Selflags &= ~SELTASK;
+ } else {
+ (void) fprintf(stderr,
+ "%s: -K not followed by i (but by %s)\n", Pn, GOv);
+ err = 1;
+ }
+ }
+ break;
#endif /* defined(HASTASKS) */
case 'l':
}
}
/*
+ * If IgnTasks is set, remove SELTASK from SelAll and SelProc.
+ */
+ SelAll = IgnTasks ? (SELALL & ~SELTASK) : SELALL;
+ SelProc = IgnTasks ? (SELPROC & ~SELTASK) : SELPROC;
+/*
* Check for argument consistency.
*/
if (Cmdnx && Cmdni) {
"%s: no select options to AND via -a\n", Pn);
usage(1, 0, 0);
}
- Selflags = SELALL;
+ Selflags = SelAll;
} else {
if (GOx1 >= argc && (Selflags & (SELNA|SELNET)) != 0
&& (Selflags & ~(SELNA|SELNET)) == 0)
Selinet = 1;
- Selall = 0;
+ AllProc = 0;
}
/*
* Get the device for DEVDEV_PATH.
* printing.
*
* Lf contents must be preserved, since they may point to a
- * malloc()'d area, and since Lf is used throughout the print
+ * malloc()'d area, and since Lf is used throughout the printing
+ * of the selected processes.
*/
if (FeptE) {
lf = Lf;
-
/*
- * Check the files that have been selected for printing by
- * by some selection criterion other than being a pipe.
+ * Scan all selected processes.
*/
for (i = 0; i < Nlproc; i++) {
Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
- if (Lp->pss && (Lp->ept & EPT_PIPE))
- (void) process_pinfo(0);
+
+ /*
+ * For processes that have been selected for printing
+ * and have files that are the end point(s) of pipe(s),
+ * process the file endpoints.
+ */
+ if (Lp->pss && (Lp->ept & EPT_PIPE))
+ (void) process_pinfo(0);
+
+# if defined(HASUXSOCKEPT)
+ /*
+ * For processes that have been selected for printing
+ * and have files that are the end point(s) of UNIX
+ * socket(s), process the file endpoints.
+ */
+ if (Lp->pss && (Lp->ept & EPT_UXS))
+ (void) process_uxsinfo(0);
+# endif /* defined(HASUXSOCKEPT) */
+
+# if defined(HASPTYEPT)
+ /*
+ * For processes that have been selected for printing
+ * and have files that are the end point(s) of pseudo-
+ * terminal files(s), process the file endpoints.
+ */
+ if (Lp->pss && (Lp->ept & EPT_PTY))
+ (void) process_ptyinfo(0);
+# endif /* defined(HASPTYEPT) */
+
}
/*
- * In a second pass, process unselected endpoint files,
+ * In a second pass, look for unselected endpoint files,
* possibly selecting them for printing.
*/
for (i = 0; i < Nlproc; i++) {
Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
- if (Lp->ept & EPT_PIPE_END)
- (void) process_pinfo(1);
- }
+
+ /*
+ * Process pipe endpoints.
+ */
+ if (Lp->ept & EPT_PIPE_END)
+ (void) process_pinfo(1);
# if defined(HASUXSOCKEPT)
- /*
- * Process UNIX socket endpoint files in a similar fashion.
- */
- for (i = 0; i < Nlproc; i++) {
- Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
- if (Lp->pss && (Lp->ept & EPT_UXS))
- (void) process_uxsinfo(0);
- }
- for (i = 0; i < Nlproc; i++) {
- Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
- if (Lp->ept & EPT_UXS_END) {
- (void) process_uxsinfo(1);
- }
- }
+ /*
+ * Process UNIX socket endpoints.
+ */
+ if (Lp->ept & EPT_UXS_END)
+ (void) process_uxsinfo(1);
# endif /* defined(HASUXSOCKEPT) */
+# if defined(HASPTYEPT)
+ /*
+ * Process pseudo-terminal endpoints.
+ */
+ if (Lp->ept & EPT_PTY_END)
+ (void) process_ptyinfo(1);
+# endif /* defined(HASPTYEPT) */
+
+ }
Lf = lf;
}
#endif /* defined(HASEPTOPTS) */
#if defined(HASEPTOPTS)
(void) clear_pinfo();
+
+# if defined(HASUXSOCKEPT)
+ (void) clear_uxsinfo();
+# endif /* defined(HASUXSOCKEPT) */
+
+# if defined(HASEPTOPTS)
+ (void) clear_ptyinfo();
+# endif /* defined(HASEPTOPTS) */
#endif /* defined(HASEPTOPTS) */
if (rc) {
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: misc.c,v 1.28 2014/10/13 22:36:20 abe Exp $";
+static char *rcsid = "$Id: misc.c,v 1.29 2018/02/14 14:20:14 abe Exp $";
#endif
int rbln; /* response buffer length */
{
int en, rv;
+
/*
* Check reply buffer size.
*/
* Begin the child process.
*/
- int fd, r_al, r_rbln;
+ int r_al, r_rbln;
char r_arg[MAXPATHLEN+1], r_rbuf[MAXPATHLEN+1];
int (*r_fn)();
/*
* Close sufficient open file descriptors except Pipes[0] and
* Pipes[3].
*/
+
+#if defined(HAS_DUP2) && defined(HAS_CLOSEFROM)
+ int rc;
+
+ rc = dup2(Pipes[0], 0);
+ if (rc < 0) {
+ (void) fprintf(stderr,
+ "%s: can't dup Pipes[0] to fd 0: %s\n",
+ Pn, strerror(errno));
+ Exit(1);
+ }
+ Pipes[0] = 0;
+ rc = dup2(Pipes[3], 1);
+ if (rc < 0) {
+ (void) fprintf(stderr,
+ "%s: can't dup Pipes.[3] to fd 1: %s\n",
+ Pn, strerror(errno));
+ Exit(1);
+ }
+ Pipes[3] = 1;
+ (void) closefrom(2);
+ Pipes[1] = -1;
+ Pipes[2] = -1;
+
+#else /* !defined(HAS_DUP2) && !defined(HAS_CLOSEFROM) */
+ int fd;
+
for (fd = 0; fd < MaxFd; fd++) {
if (fd == Pipes[0] || fd == Pipes[3])
continue;
(void) close(Pipes[2]);
Pipes[2] = -1;
}
+#endif /* defined(HAS_DUP2) && defined(HAS_CLOSEFROM) */
+
/*
* Read function requests, process them, and return replies.
*/
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: print.c,v 1.55 2013/01/02 17:14:59 abe Exp $";
+static char *rcsid = "$Id: print.c,v 1.56 2018/02/14 14:20:14 abe Exp $";
#endif
PIDTTL);
#if defined(HASTASKS)
- if (TaskPrtFl)
- (void) printf(" %*s", TidColW, TIDTTL);
+ if (TaskPrtTid)
+ (void) printf(" %*s", TaskTidColW, TASKTIDTTL);
+ if (TaskPrtCmd)
+ (void) printf(" %-*.*s", TaskCmdColW, TaskCmdColW, TASKCMDTTL);
#endif /* defined(HASTASKS) */
#if defined(HASZONES)
#if defined(HASTASKS)
/*
- * Size or print task ID.
+ * Size or print task ID and command name.
*/
if (!PrPass) {
+ if ((cp = Lp->tcmd)) {
+ len = safestrlen(cp, 2);
+ if (TaskCmdLim && (len > TaskCmdLim))
+ len = TaskCmdLim;
+ if (len > TaskCmdColW)
+ TaskCmdColW = len;
+ TaskPrtCmd = 1;
+ }
if (Lp->tid) {
(void) snpf(buf, sizeof(buf), "%d", Lp->tid);
- if ((len = strlen(buf)) > TidColW)
- TidColW = len;
- TaskPrtFl = 1;
+ if ((len = strlen(buf)) >TaskTidColW)
+ TaskTidColW = len;
+ TaskPrtTid = 1;
+ }
+ } else {
+ if (TaskPrtTid) {
+ if (Lp->tid)
+ (void) printf(" %*d", TaskTidColW, Lp->tid);
+ else
+ (void) printf(" %*s", TaskTidColW, "");
+ }
+ if (TaskPrtCmd) {
+ cp = Lp->tcmd ? Lp->tcmd : "";
+ printf(" ");
+ safestrprtn(cp, TaskCmdColW, stdout, 2);
}
- } else if (TaskPrtFl) {
- if (Lp->tid)
- (void) printf(" %*d", TidColW, Lp->tid);
- else
- (void) printf(" %*s", TidColW, "");
}
#endif /* defined(HASTASKS) */
*/
PrPass = (Ffield || Fterse) ? 1 : 0;
LastPid = -1;
- TaskPrtFl = 0;
+ TaskPrtCmd = TaskPrtTid = 0;
/*
* Size columns by their titles.
*/
SzOffColW = strlen(SZOFFTTL);
#if defined(HASTASKS)
- TidColW = strlen(TIDTTL);
+ TaskCmdColW = strlen(TASKCMDTTL);
+ TaskTidColW = strlen(TASKTIDTTL);
#endif /* defined(HASTASKS) */
TypeColW = strlen(TYPETTL);
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: proc.c,v 1.49 2015/07/07 20:16:58 abe Exp $";
+static char *rcsid = "$Id: proc.c,v 1.50 2018/02/14 14:20:14 abe Exp $";
#endif
#include "lsof.h"
+#if defined(HASPTYEPT)
+_PROTOTYPE(static void prt_ptyinfo,(pxinfo_t *pp, int prt_edev, int ps));
+#endif /* defined(HASPTYEPT) */
+
/*
* add_nma() - add to NAME column addition
#if defined(HASTASKS)
Lp->tid = 0;
+ Lp->tcmd = (char *)NULL;
#endif /* defined(HASTASKS) */
Lp->pgid = pgid;
* o listing is selected by an ANDed option set (not all options)
* that includes a single PID selection -- this one.
*/
- if ((Lp->sf & SELPID) && !Selall) {
+ if ((Lp->sf & SELPID) && !AllProc) {
if ((Selflags == SELPID)
|| (Fand && (Selflags & SELPID))) {
sbp = 1;
(void) free((FREE_P *)lp->cmd);
lp->cmd = (char *)NULL;
}
+
+#if defined(HASTASKS)
+ if (lp->tcmd) {
+ (void) free((FREE_P *)lp->tcmd);
+ lp->tcmd = (char *)NULL;
+ }
+#endif /* defined(HASTASKS) */
+
}
}
#endif /* defined(HASSECURITY) && defined(HASNOSOCKSECURITY) */
- if (Selall)
+ if (AllProc)
return(1);
if (Fand && ((lf->sf & Selflags) != Selflags))
return(0);
* network selections from the file flags, so that the tests in is_file_sel()
* work as expected.
*/
- if (Selall) {
+ if (AllProc) {
*pss = PS_PRI;
#if defined(HASSECURITY) && defined(HASNOSOCKSECURITY)
- *sf = SELALL & ~(SELNA | SELNET);
+ *sf = SelAll & ~(SELNA | SELNET);
#else /* !defined(HASSECURITY) || !defined(HASNOSOCKSECURITY) */
- *sf = SELALL;
+ *sf = SelAll;
#endif /* defined(HASSECURITY) && defined(HASNOSOCKSECURITY) */
return(0);
}
# endif /* defined(HASUXSOCKEPT) */
+# if defined(HASPTYEPT)
+/*
+ * Process pseudoterminal endpoint files the same way by clearing the SELPINFO
+ * flag and setting the EPT_PTY flag, letting a later call to process_ptyinfo()
+ * set selection flags.
+ */
+ if (Lf->sf & SELPTYINFO) {
+ Lp->ept |= EPT_PTY;
+ Lf->sf &= ~SELPTYINFO;
+ }
+# endif /* defined(HASPTYEPT) */
+
}
#endif /* defined(HASEPTOPTS) */
* its being a pipe. Look up the pipe's endpoints.
*/
do {
- if ((pp = find_pendinfo(Lf, pp))) {
+ if ((pp = find_pepti(Lf, pp))) {
/*
* This pipe endpoint is linked to the selected pipe
Lf->sf = Selflags;
Lp->pss |= PS_SEC;
do {
- if ((pp = find_pendinfo(Lf, pp))) {
+ if ((pp = find_pepti(Lf, pp))) {
ep = &Lproc[pp->lpx];
ef = pp->lf;
for (i = 0; i < (FDLEN - 1); i++) {
#if defined(HASTASKS)
if (FieldSel[LSOF_FIX_TID].st && Lp->tid)
(void) printf("%c%d%c", LSOF_FID_TID, Lp->tid, Terminator);
+ if (FieldSel[LSOF_FIX_TCMD].st && Lp->tcmd)
+ (void) printf("%c%s%c", LSOF_FID_TCMD, Lp->tcmd, Terminator);
#endif /* defined(HASTASKS) */
#if defined(HASZONES)
}
return(rv);
}
+
+
+#if defined(HASPTYEPT)
+/*
+ * process_ptyinfo() -- process pseudoterminal info, adding it to selected files and
+ * selecting pseudoterminal end files (if requested)
+ */
+
+void
+process_ptyinfo(f)
+ int f; /* function:
+ * 0 == process selected pseudoterminal
+ * 1 == process end point */
+{
+ pxinfo_t *pp; /* previous pseudoterminal info */
+ int mos; /* master or slave indicator
+ * 0 == slave; 1 == master */
+ int pc; /* print count */
+
+ if (!FeptE)
+ return;
+ for (Lf = Lp->file; Lf; Lf = Lf->next) {
+ if (Lf->rdev_def && is_pty_ptmx(Lf->rdev))
+ mos = 1;
+ else if (Lf->rdev_def && is_pty_slave(GET_MAJ_DEV(Lf->rdev)))
+ mos = 0;
+ else
+ continue;
+
+ pp = (pxinfo_t *)NULL;
+ switch(f) {
+ case 0:
+
+ /*
+ * Process already selected pseudoterminal file.
+ */
+ if (is_file_sel(Lp, Lf)) {
+
+ /*
+ * This file has been selected by some criterion other than
+ * its being a pseudoterminal. Look up the pseudoterminal's
+ * endpoints.
+ */
+ pc = 1;
+ do {
+ if ((pp = find_ptyepti(Lf, !mos, pp))) {
+
+ /*
+ * This pseudoterminal endpoint is linked to the
+ * selected pseudoterminal file. Add its PID, FD and
+ * access mode to the name column addition.
+ */
+ prt_ptyinfo(pp, (mos && pc), (FeptE == 2));
+ pp = pp->next;
+ pc = 0;
+ }
+ } while (pp);
+ }
+ break;
+ case 1:
+ if (!is_file_sel(Lp, Lf) && (Lf->chend & CHEND_PTY)) {
+
+ /*
+ * This is an unselected end point file. Select it and add
+ * its end point information to its name column addition.
+ */
+ Lf->sf = Selflags;
+ Lp->pss |= PS_SEC;
+ pc = 1;
+ do {
+ if ((pp = find_ptyepti(Lf, !mos, pp))) {
+ prt_ptyinfo(pp, (mos && pc), 0);
+ pp = pp->next;
+ pc = 0;
+ }
+ } while (pp);
+ }
+ break;
+ }
+ }
+}
+
+
+/*
+ * prt_ptyinfo() -- print pseudoterminal information
+ */
+
+static void
+prt_ptyinfo(pp, prt_edev, ps)
+ pxinfo_t *pp; /* peer info */
+ int prt_edev; /* print the end point device file */
+ int ps; /* processing status:
+ * 0 == process immediately
+ * 1 == process later */
+{
+ struct lproc *ep; /* pseudoterminal endpoint process */
+ struct lfile *ef; /* pseudoterminal endpoint file */
+ int i; /* temporary index */
+ char nma[1024]; /* name addition buffer */
+
+ ep = &Lproc[pp->lpx];
+ ef = pp->lf;
+ for (i = 0; i < (FDLEN - 1); i++) {
+ if (ef->fd[i] != ' ')
+ break;
+ }
+ if (prt_edev) {
+ (void) snpf(nma, sizeof(nma) - 1, "->/dev/pts/%d %d,%.*s,%s%c",
+ Lf->tty_index,
+ ep->pid, CmdLim, ep->cmd, &ef->fd[i],
+ ef->access);
+ } else {
+ (void) snpf(nma, sizeof(nma) - 1, "%d,%.*s,%s%c",
+ ep->pid, CmdLim, ep->cmd, &ef->fd[i],
+ ef->access);
+ }
+ (void) add_nma(nma, strlen(nma));
+ if (ps) {
+
+ /*
+ * Endpoint files have been selected, so mark this
+ * one for selection later. Set the type to PTY.
+ */
+ ef->chend = CHEND_PTY;
+ ep->ept |= EPT_PTY_END;
+ }
+}
+#endif /* defined(HASPTYEPT) */
/*
- * $Id: proto.h,v 1.38 2015/07/07 20:16:58 abe Exp $
+ * $Id: proto.h,v 1.39 2018/02/14 14:20:14 abe Exp $
*/
# if defined(HASEPTOPTS)
_PROTOTYPE(extern void clear_pinfo,(void));
-_PROTOTYPE(extern pxinfo_t *find_pendinfo,(struct lfile *lf, pxinfo_t *pp));
+_PROTOTYPE(extern pxinfo_t *find_pepti,(struct lfile *lf, pxinfo_t *pp));
_PROTOTYPE(extern void process_pinfo,(int f));
# if defined(HASUXSOCKEPT)
+_PROTOTYPE(extern void clear_uxsinfo,(void));
_PROTOTYPE(extern struct uxsin *find_uxsepti,(struct lfile *lf));
_PROTOTYPE(extern void process_uxsinfo,(int f));
# endif /* defined(HASUXSOCKEPT) */
+# if defined(HASPTYEPT)
+_PROTOTYPE(extern void clear_ptyinfo,(void));
+_PROTOTYPE(extern void enter_ptmxi,(int mn));
+_PROTOTYPE(extern pxinfo_t *find_ptyepti,(struct lfile *lf,int m,pxinfo_t *pp));
+_PROTOTYPE(extern int is_pty_slave,(int sm));
+_PROTOTYPE(extern int is_pty_ptmx,(dev_t dev));
+_PROTOTYPE(extern void process_ptyinfo,(int f));
+# endif /* defined(HASPTYEPT) */
# endif /* defined(HASEPTOPTS) */
_PROTOTYPE(extern void free_lproc,(struct lproc *lp));
_PROTOTYPE(extern void hashSfile,(void));
_PROTOTYPE(extern void initialize,(void));
_PROTOTYPE(extern int is_cmd_excl,(char *cmd, short *pss, short *sf));
+_PROTOTYPE(extern int is_file_sel,(struct lproc *lp, struct lfile *lf));
_PROTOTYPE(extern int is_nw_addr,(unsigned char *ia, int p, int af));
#if defined(HASTASKS)
#ifndef lint
static char copyright[] =
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: store.c,v 1.43 2015/07/07 20:16:58 abe Exp $";
+static char *rcsid = "$Id: store.c,v 1.44 2018/02/14 14:20:14 abe Exp $";
#endif
* Global storage definitions
*/
+int AllProc = 1; /* all processes are selected (default) */
+
#if defined(HASBLKDEV)
struct l_dev *BDevtp = (struct l_dev *)NULL;
/* block device table pointer */
{ LSOF_FID_LOCK, 0, LSOF_FNM_LOCK, NULL, 0 }, /* 11 */
{ LSOF_FID_LOGIN, 0, LSOF_FNM_LOGIN, NULL, 0 }, /* 12 */
{ LSOF_FID_MARK, 1, LSOF_FNM_MARK, NULL, 0 }, /* 13 */
- { LSOF_FID_NAME, 0, LSOF_FNM_NAME, NULL, 0 }, /* 14 */
- { LSOF_FID_NI, 0, LSOF_FNM_NI, &Fsv, FSV_NI }, /* 15 */
- { LSOF_FID_OFFSET, 0, LSOF_FNM_OFFSET, NULL, 0 }, /* 16 */
- { LSOF_FID_PID, 1, LSOF_FNM_PID, NULL, 0 }, /* 17 */
- { LSOF_FID_PGID, 0, LSOF_FNM_PGID, &Fpgid, 1 }, /* 18 */
- { LSOF_FID_PROTO, 0, LSOF_FNM_PROTO, NULL, 0 }, /* 19 */
- { LSOF_FID_RDEV, 0, LSOF_FNM_RDEV, NULL, 0 }, /* 20 */
- { LSOF_FID_PPID, 0, LSOF_FNM_PPID, &Fppid, 1 }, /* 21 */
- { LSOF_FID_SIZE, 0, LSOF_FNM_SIZE, NULL, 0 }, /* 22 */
- { LSOF_FID_STREAM, 0, LSOF_FNM_STREAM, NULL, 0 }, /* 23 */
- { LSOF_FID_TYPE, 0, LSOF_FNM_TYPE, NULL, 0 }, /* 24 */
- { LSOF_FID_TCPTPI, 0, LSOF_FNM_TCPTPI, &Ftcptpi, TCPTPI_ALL }, /* 25 */
- { LSOF_FID_UID, 0, LSOF_FNM_UID, NULL, 0 }, /* 26 */
- { LSOF_FID_ZONE, 0, LSOF_FNM_ZONE, &Fzone, 1 }, /* 27 */
- { LSOF_FID_CNTX, 0, LSOF_FNM_CNTX, &Fcntx, 1 }, /* 28 */
- { LSOF_FID_TERM, 0, LSOF_FNM_TERM, NULL, 0 }, /* 29 */
+ { LSOF_FID_TCMD, 0, LSOF_FNM_TCMD, NULL, 0 }, /* 14 */
+ { LSOF_FID_NAME, 0, LSOF_FNM_NAME, NULL, 0 }, /* 15 */
+ { LSOF_FID_NI, 0, LSOF_FNM_NI, &Fsv, FSV_NI }, /* 16 */
+ { LSOF_FID_OFFSET, 0, LSOF_FNM_OFFSET, NULL, 0 }, /* 17 */
+ { LSOF_FID_PID, 1, LSOF_FNM_PID, NULL, 0 }, /* 18 */
+ { LSOF_FID_PGID, 0, LSOF_FNM_PGID, &Fpgid, 1 }, /* 19 */
+ { LSOF_FID_PROTO, 0, LSOF_FNM_PROTO, NULL, 0 }, /* 20 */
+ { LSOF_FID_RDEV, 0, LSOF_FNM_RDEV, NULL, 0 }, /* 21 */
+ { LSOF_FID_PPID, 0, LSOF_FNM_PPID, &Fppid, 1 }, /* 22 */
+ { LSOF_FID_SIZE, 0, LSOF_FNM_SIZE, NULL, 0 }, /* 23 */
+ { LSOF_FID_STREAM, 0, LSOF_FNM_STREAM, NULL, 0 }, /* 24 */
+ { LSOF_FID_TYPE, 0, LSOF_FNM_TYPE, NULL, 0 }, /* 25 */
+ { LSOF_FID_TCPTPI, 0, LSOF_FNM_TCPTPI, &Ftcptpi, TCPTPI_ALL }, /* 26 */
+ { LSOF_FID_UID, 0, LSOF_FNM_UID, NULL, 0 }, /* 27 */
+ { LSOF_FID_ZONE, 0, LSOF_FNM_ZONE, &Fzone, 1 }, /* 28 */
+ { LSOF_FID_CNTX, 0, LSOF_FNM_CNTX, &Fcntx, 1 }, /* 29 */
+ { LSOF_FID_TERM, 0, LSOF_FNM_TERM, NULL, 0 }, /* 30 */
{ ' ', 0, NULL, NULL, 0 }
};
int Hdr = 0; /* header print status */
+int IgnTasks = 0; /* ignore tasks when non-zero */
char *InodeFmt_d = (char *) NULL;
/* INODETYPE decimal printf specification */
char *InodeFmt_x = (char *) NULL;
struct l_dev **Sdev = (struct l_dev **)NULL;
/* pointer to Devtp[] pointers, sorted
* by device */
-int Selall = 1; /* all processes are selected (default) */
+int SelAll = 0; /* SELALL flags, modified by IgnTasks */
int Selflags = 0; /* selection flags -- see SEL* in lsof.h */
+int SelProc = 0; /* SELPROC flags, modified by IgnTasks */
int Setgid = 0; /* setgid state */
int Selinet = 0; /* select only Internet socket files */
int Setuidroot = 0; /* setuid-root state */
/* SZOFFTYPE %*d printf specification */
char *SzOffFmt_x = (char *)NULL;
/* SZOFFTYPE %#x printf specification */
-int TaskPrtFl = 0; /* task print flag */
+int TaskCmdColW = 0; /* task command column width */
+int TaskCmdLim = TASKCMDL; /* TASKCMD column width limit (same as
+ * CmdLim) */
+int TaskPrtCmd = 0; /* task print task command flag */
+int TaskPrtTid = 0; /* task print TID flag */
int TcpStAlloc = 0; /* allocated (possibly unused) entries in TCP
* state tables */
unsigned char *TcpStI = (unsigned char *)NULL;
char **TcpSt = (char **)NULL; /* local TCP state names, indexed by system
* state value */
char Terminator = '\n'; /* output field terminator */
-int TidColW = 0; /* TID column width */
+int TaskTidColW = 0; /* task TID column width */
int TmLimit = TMLIMIT; /* Readlink() and stat() timeout (seconds) */
int TypeColW; /* TYPE column width */
int UdpStAlloc = 0; /* allocated (possibly unused) entries in UDP
#endif /* defined(LT_DIAL_bsdi) */
+#if defined(LT_DIAL_freebsd)
+/*
+ *FreeBSD-specific items
+*/
+
+#undef XDINDEV
+#define XDINDEV 16
+# if defined(LT_DEV64)
+#undef X2DEV_T
+#define X2DEV_T unsigned long long
+#define major_X(dp, em) ((int)((x2dev(dp, em) >> 32) & 0xffffffff))
+# endif /* defined(LT_DEV64) */
+#endif /* defined(LT_DIAL_freebsd) */
+
+
#if defined(LT_DIAL_osr)
/*
* OpenUNIX-specific items
/*
- * $Id: LsofTest.h,v 1.12 2008/07/05 16:21:07 abe Exp $
+ * $Id: LsofTest.h,v 1.13 2018/02/14 14:21:44 abe Exp $
*/
#include <signal.h>
#include <sys/types.h>
+
+#if defined(LT_DIAL_linux) && LT_VERS>=414014
+#undef major
+#include <sys/sysmacros.h>
+#endif /* defined(LT_DIAL_linux) && LT_VERS>=414014 */
+
#include <sys/param.h>
#include <sys/stat.h>
#
# See Add2TestDB for a script that will build a line for this file.
#
-# $Id: TestDB,v 1.40 2015/07/07 20:22:07 abe Exp $
+# $Id: TestDB,v 1.41 2018/02/14 14:21:44 abe Exp $
LT_AIXA=0 LT_BIGF LT_CC LT_DIAL_aix LT_KMEM LT_VERS=4320
LT_AIXA=0 LT_BIGF LT_CC LT_DIAL_aix LT_KMEM LT_VERS=4330
LT_BIGF LT_DIAL_freebsd LT_GCC LT_KMEM LT_VERS=10000
LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=11000
LT_BIGF LT_DIAL_freebsd LT_GCC LT_KMEM LT_VERS=11000
+LT_BIGF LT_CC LT_DIAL_freebsd LT_KMEM LT_VERS=12000
+LT_BIGF LT_CC LT_DEV64 LT_DIAL_freebsd LT_KMEM LT_VERS=12000
LT_BIGF LT_CC LT_DIAL_hpux LT_KMEM LT_VERS=1020 _LARGEFILE64_SOURCE
LT_BIGF LT_DIAL_hpux LT_GCC LT_KMEM LT_VERS=1020 _LARGEFILE64_SOURCE
LT_BIGF LT_CC LT_DIAL_hpux LT_KMEM LT_VERS=1100 _LARGEFILE64_SOURCE
LT_BIGF LT_CC LT_DIAL_linux LT_VERS=310000 _FILE_OFFSET_BITS=64
LT_BIGF LT_CC LT_DIAL_linux LT_VERS=310004 _FILE_OFFSET_BITS=64
LT_BIGF LT_CC LT_DIAL_linux LT_VERS=31008 _FILE_OFFSET_BITS=64
+LT_BIGF LT_CC LT_DIAL_linux LT_VERS=414014 _FILE_OFFSET_BITS=64
LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=1005000
LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=1006000
LT_BIGF LT_CC LT_DIAL_netbsd LT_KMEM LT_VERS=2000000
#ifndef lint
static char copyright[] =
"@(#) Copyright 1998 Purdue Research Foundation.\nAll rights reserved.\n";
-static char *rcsid = "$Id: usage.c,v 1.32 2014/10/13 22:36:20 abe Exp $";
+static char *rcsid = "$Id: usage.c,v 1.33 2018/02/14 14:20:14 abe Exp $";
#endif
col = print_in_col(col, buf);
#if defined(HASTASKS)
- col = print_in_col(col, "-K list tasKs (threads)");
+/* DEBUG col = print_in_col(col, "-K list tasKs (threads)"); */
+ col = print_in_col(col, "-K [i] list|(i)gn tasKs");
#endif /* defined(HASTASKS) */
col = print_in_col(col, "-l list UID numbers");
-.ds VN 4.89
+.ds VN 4.90