/*
 * usage.c - usage functions for lsof
 */


/*
 * Copyright 1998 Purdue Research Foundation, West Lafayette, Indiana
 * 47907.  All rights reserved.
 *
 * Written by Victor A. Abell
 *
 * This software is not subject to any license of the American Telephone
 * and Telegraph Company or the Regents of the University of California.
 *
 * Permission is granted to anyone to use this software for any purpose on
 * any computer system, and to alter it and redistribute it freely, subject
 * to the following restrictions:
 *
 * 1. Neither the authors nor Purdue University are responsible for any
 *    consequences of the use of this software.
 *
 * 2. The origin of this software must not be misrepresented, either by
 *    explicit claim or by omission.  Credit to the authors and Purdue
 *    University must appear in documentation and sources.
 *
 * 3. Altered versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 *
 * 4. This notice may not be removed or altered.
 */

#ifndef lint
static char copyright[] =
"@(#) Copyright 1998 Purdue Research Foundation.\nAll rights reserved.\n";
static char *rcsid = "$Id: usage.c,v 1.30 2011/09/07 19:13:49 abe Exp $";
#endif


#include "lsof.h"
#include "version.h"


/*
 * Local function prototypes
 */

_PROTOTYPE(static char *isnullstr,(char *s));
_PROTOTYPE(static int print_in_col,(int col, char *cp));
_PROTOTYPE(static void report_HASDCACHE,(int type, char *ttl, char *det));
_PROTOTYPE(static void report_HASKERNIDCK,(char *pfx, char *verb));
_PROTOTYPE(static void report_SECURITY,(char *pfx, char *punct));
_PROTOTYPE(static void report_WARNDEVACCESS,(char *pfx, char *verb,
					     char *punct));


/*
 * isnullstr() - is it a null string?
 */

static char *
isnullstr(s)
	char *s;			/* string pointer */
{
	if (!s)
		return((char *)NULL);
	while (*s) {
		if (*s != ' ')
			return(s);
		s++;
	}
	return((char *)NULL);
}


/*
 * print_in_col() -- print character string in help column
 */

static int
print_in_col(col, cp)
	int col;				/* column number */
	char *cp;				/* what to print */
{
	if (cp && *cp) {
	    switch (col) {
	    case 1:
		(void) fprintf(stderr, "  %-23.23s", cp);
		break;
	    case 2:
		(void) fprintf(stderr, "  %-25.25s", cp);
		break;
	    default:
		(void) fprintf(stderr, "  %s\n", cp);
		col = 0;
	    }
	    col++;
	}
	return(col);
}


/*
 * report_HASDCACHE() -- report device cache file state
 */

static void
report_HASDCACHE(type, ttl, det)
	int type;				/* type: 0 == read path report
						 *       1 == full report */
	char *ttl;				/* title lines prefix
						 * (NULL if none) */
	char *det;				/* detail lines prefix
						 * (NULL if none) */
{

#if	defined(HASDCACHE)
	char *cp;
	int dx;

# if	defined(WILLDROPGID)
	int saved_Setgid = Setgid;

	Setgid = 0;
# endif	/* defined(WILLDROPGID) */

	if (type) {

	/*
	 * Report full device cache information.
	 */
	    (void) fprintf(stderr, "%sDevice cache file read-only paths:\n",
		ttl ? ttl : "");
	    if ((dx = dcpath(1, 0)) < 0)
		(void) fprintf(stderr, "%snone\n", det ? det : "");
	    else {
		(void) fprintf(stderr, "%sNamed via -D: %s\n",
		    det ? det : "",
		    DCpath[0] ? DCpath[0] : "none");

# if	defined(HASENVDC)
		(void) fprintf(stderr,
		    "%sNamed in environment variable %s: %s\n",
		    det ? det : "",
		    HASENVDC, DCpath[1] ? DCpath[1] : "none");
# endif	/* defined(HASENVDC) */

# if	defined(HASSYSDC)
		if (DCpath[2])
		    (void) fprintf(stderr,
			"%sSystem-wide device cache: %s\n",
			det ? det : "",
			DCpath[2]);
# endif	/* defined(HASSYSDC) */

# if	defined(HASPERSDC)
		(void) fprintf(stderr,
		    "%sPersonal path format (HASPERSDC): \"%s\"\n",
		    det ? det : "",
		    HASPERSDC);
#  if	defined(HASPERSDCPATH)
		(void) fprintf(stderr,
		    "%sModified personal path environment variable: %s\n",
		    det ? det : "",
		    HASPERSDCPATH);
		cp = getenv(HASPERSDCPATH);
		(void) fprintf(stderr, "%s%s value: %s\n",
		    det ? det : "",
		    HASPERSDCPATH, cp ? cp : "none");
#  endif	/* defined(HASPERSDCPATH) */
		(void) fprintf(stderr, "%sPersonal path: %s\n",
		    det ? det : "",
		    DCpath[3] ? DCpath[3] : "none");
# endif	/* defined(HASPERSDC) */
	    }
	    (void) fprintf(stderr, "%sDevice cache file write paths:\n",
		ttl ? ttl : "");
	    if ((dx = dcpath(2, 0)) < 0)
		(void) fprintf(stderr, "%snone\n", det ? det : "");
	    else {
		(void) fprintf(stderr, "%sNamed via -D: %s\n",
		    det ? det : "",
		    DCstate == 2 ? "none"
				 : DCpath[0] ? DCpath[0] : "none");

# if	defined(HASENVDC)
		(void) fprintf(stderr,
		    "%sNamed in environment variable %s: %s\n",
		    det ? det : "",
		    HASENVDC, DCpath[1] ? DCpath[1] : "none");
# endif	/* defined(HASENVDC) */

# if	defined(HASPERSDC)
		(void) fprintf(stderr,
		    "%sPersonal path format (HASPERSDC): \"%s\"\n",
		    det ? det : "",
		    HASPERSDC);
#  if	defined(HASPERSDCPATH)
		(void) fprintf(stderr,
		    "%sModified personal path environment variable: %s\n",
		    det ? det : "",
		    HASPERSDCPATH);
		cp = getenv(HASPERSDCPATH);
		(void) fprintf(stderr, "%s%s value: %s\n",
		    det ? det : "",
		    HASPERSDCPATH, cp ? cp : "none");
#  endif	/* defined(HASPERSDCPATH) */
		 (void) fprintf(stderr, "%sPersonal path: %s\n",
		    det ? det : "",
		    DCpath[3] ? DCpath[3] : "none");
# endif	/* defined(HASPERSDC) */
	    }
	} else {

	/*
	 * Report device cache read file path.
	 */

# if	defined(HASENVDC) || defined(HASPERSDC) || defined(HASSYSDC)
	    cp = NULL;
#  if	defined(HASENVDC)
	    if ((dx = dcpath(1, 0)) >= 0)
		cp = DCpath[1];
#  endif	/* defined(HASENVDC) */
#  if	defined(HASSYSDC)
	    if (!cp)
		cp = HASSYSDC;
#  endif	/* defined(HASSYSDC) */
#  if	defined(HASPERSDC)
	    if (!cp && dx != -1 && (dx = dcpath(1, 0)) >= 0)
		cp = DCpath[3];
#  endif	/* defined(HASPERSDC) */
	    if (cp)
		(void) fprintf(stderr,
		    "%s%s is the default device cache file read path.\n",
		    ttl ? ttl : "",
		    cp
		);
# endif    /* defined(HASENVDC) || defined(HASPERSDC) || defined(HASSYSDC) */
	}

# if	defined(WILLDROPGID)
	Setgid = saved_Setgid;
# endif	/* defined(WILLDROPGID) */

#endif	/* defined(HASDCACHE) */

}


/*
 * report_HASKERNIDCK() -- report HASKERNIDCK state
 */

static void
report_HASKERNIDCK(pfx, verb)
	char *pfx;				/* prefix (NULL if none) */
	char *verb;				/* verb (NULL if none) */
{
	(void) fprintf(stderr, "%sernel ID check %s%s%s.\n",
	    pfx ? pfx : "",
	    verb ? verb : "",
	    verb ? " " : "",

#if	defined(HASKERNIDCK)
		"enabled"
#else	/* !defined(HASKERNIDCK) */
		"disabled"
#endif	/* defined(HASKERNIDCK) */

	    );
}


/*
 * report_SECURITY() -- report *SECURITY states
 */

static void
report_SECURITY(pfx, punct)
	char *pfx;				/* prefix (NULL if none) */
	char *punct;				/* short foem punctuation
						 * (NULL if none) */
{
	fprintf(stderr, "%s%s can list all files%s",
	    pfx ? pfx : "",

#if	defined(HASSECURITY)
	    "Only root",
# if	defined(HASNOSOCKSECURITY)
	    ", but anyone can list socket files.\n"
# else	/* !defined(HASNOSOCKSECURITY) */
	    punct ? punct : ""
# endif	/* defined(HASNOSOCKSECURITY) */
#else	/* !defined(HASSECURITY) */
	    "Anyone",
	    punct ? punct : ""
#endif	/* defined(HASSECURITY) */

	);
}


/*
 * report_WARNDEVACCESS() -- report WEARNDEVACCESS state
 */

static void
report_WARNDEVACCESS(pfx, verb, punct)
	char *pfx;				/* prefix (NULL if none) */
	char *verb;				/* verb (NULL if none) */
	char *punct;				/* punctuation */
{
	(void) fprintf(stderr, "%s/dev warnings %s%s%s%s",
	    pfx ? pfx : "",
	    verb ? verb : "",
	    verb ? " " : "",

#if	defined(WARNDEVACCESS)
	    "enabled",
#else	/* !defined(WARNDEVACCESS) */
	    "disabled",
#endif	/* defined(WARNDEVACCESS) */

	    punct);
}


/*
 * usage() - display usage and exit
 */

void
usage(xv, fh, version)
	int xv;				/* exit value */
	int fh;				/* ``-F ?'' status */
	int version;			/* ``-v'' status */
{
	char buf[MAXPATHLEN+1], *cp, *cp1, *cp2;
	int col, i;

	if (Fhelp || xv) {
	    (void) fprintf(stderr, "%s %s\n latest revision: %s\n",
		Pn, LSOF_VERSION, LSOF_URL);
	    (void) fprintf(stderr, " latest FAQ: %sFAQ\n", LSOF_URL);
	    (void) fprintf(stderr, " latest man page: %slsof_man\n", LSOF_URL);
	    (void) fprintf(stderr,
		" usage: [-?ab%sh%slnNoOP%s%stUvV%s]",

#if	defined(HASNCACHE)
		"C",
#else	/* !defined(HASNCACHE) */
		"",
#endif	/* defined(HASNCACHE) */

#if	defined(HASTASKS)
		"K",
#else	/* !defined(HASTASKS) */
		"",
#endif	/* defined(HASTASKS) */

#if	defined(HASPPID)
		"R",
#else	/* !defined(HASPPID) */
		"",
#endif	/* defined(HASPPID) */

#if	defined(HASTCPUDPSTATE)
		"",
#else	/* !defined(HASTCPUDPSTATE) */
		"s",
#endif	/* defined(HASTCPUDPSTATE) */

#if	defined(HASXOPT)
# if	defined(HASXOPT_ROOT)
		(Myuid == 0) ? "X" : ""
# else	/* !defined(HASXOPT_ROOT) */
		"X"
# endif	/* defined(HASXOPT_ROOT) */
#else	/* !defined(HASXOPT) */
		""
#endif	/* defined(HASXOPT) */

	    );

#if	defined(HAS_AFS) && defined(HASAOPT)
	    (void) fprintf(stderr, " [-A A]");
#endif	/* defined(HAS_AFS) && defined(HASAOPT) */

	    (void) fprintf(stderr, " [+|-c c] [+|-d s] [+%sD D]",

#if	defined(HASDCACHE)
		"|-"
#else	/* !defined(HASDCACHE) */
		""
#endif	/* defined(HASDCACHE) */

		);

	    (void) fprintf(stderr,
		" [+|-f%s%s%s%s%s%s]%s\n [-F [f]] [-g [s]] [-i [i]]",

#if	defined(HASFSTRUCT)
		"[",

# if	defined(HASNOFSCOUNT)
		"",
# else	/* !defined(HASNOFSCOUNT) */
		"c",
# endif	/* defined(HASNOFSCOUNT) */

# if	defined(HASNOFSADDR)
		"",
# else	/* !defined(HASNOFSADDR) */
		"f",
# endif	/* defined(HASNOFSADDR) */

# if	defined(HASNOFSFLAGS)
		"",
# else	/* !defined(HASNOFSFLAGS) */
		"gG",
# endif	/* defined(HASNOFSFLAGS) */

# if	defined(HASNOFSNADDR)
		"",
# else	/* !defined(HASNOFSNADDR) */
		"n",
# endif	/* defined(HASNOFSNADDR) */

		"]",
#else	/* !defined(HASFSTRUCT) */
		"", "", "", "", "", "",
#endif	/* defined(HASFSTRUCT) */

#if	defined(HASEOPT)
		" [+|-e s]"
#else	/* !defined(HASEOPT) */
		""
#endif	/* defined(HASEOPT) */

		);

#if	defined(HASKOPT)
	    (void) fprintf(stderr, " [-k k]");
#endif	/* defined(HASKOPT) */

	    (void) fprintf(stderr, " [+|-L [l]]");

#if	defined(HASMOPT) || defined(HASMNTSUP)
	    (void) fprintf(stderr,
# if	defined(HASMOPT)
#  if	defined(HASMNTSUP)
		" [+|-m [m]]"
#  else	/* !defined(HASMNTSUP) */
		" [-m m]"
#  endif	/* defined(HASMNTSUP) */
# else	/* !defined(HASMOPT) */
		" [+m [m]]"
# endif	/* defined(HASMOPT) */
		);
#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */

#if	!defined(HASNORPC_H)
	    (void) fprintf(stderr, " [+|-M]");
#endif	/* !defined(HASNORPC_H) */

	    (void) fprintf(stderr,
		" [-o [o]] [-p s]\n[+|-r [t]]%s [-S [t]] [-T [t]]",

#if	defined(HASTCPUDPSTATE)
		" [-s [p:s]]"
#else	/* !defined(HASTCPUDPSTATE) */
		""
#endif	/* defined(HASTCPUDPSTATE) */

		);
	    (void) fprintf(stderr, " [-u s] [+|-w] [-x [fl]]");

#if	defined(HASZONES)
	    (void) fprintf(stderr, " [-z [z]]");
#else	/* !defined(HASZONES) */
# if	defined(HASSELINUX)
	    if (CntxStatus)
		(void) fprintf(stderr, " [-Z [Z]]");
# endif	/* defined(HASSELINUX) */
#endif	/* defined(HASZONES) */

	    (void) fprintf(stderr, " [--] [names]\n");
	}
	if (xv && !Fhelp) {
	    (void) fprintf(stderr,
		"Use the ``-h'' option to get more help information.\n");
	    if (!fh)
    		Exit(xv);
	}
	if (Fhelp) {
	    (void) fprintf(stderr,
		"Defaults in parentheses; comma-separated set (s) items;");
	    (void) fprintf(stderr, " dash-separated ranges.\n");
	    col = print_in_col(1, "-?|-h list help");
	    col = print_in_col(col, "-a AND selections (OR)");
	    col = print_in_col(col, "-b avoid kernel blocks");
	    col = print_in_col(col,  "-c c  cmd c ^c /c/[bix]");
	    (void) snpf(buf, sizeof(buf), "+c w  COMMAND width (%d)", CMDL);
	    col = print_in_col(col, buf);

#if	defined(HASNCACHE)
	   col = print_in_col(col, "-C no kernel name cache");
#endif	/* defined(HASNCACHE) */

	    col = print_in_col(col, "+d s  dir s files");
	    col = print_in_col(col,  "-d s  select by FD set");
	    col = print_in_col(col,  "+D D  dir D tree *SLOW?*");

#if	defined(HASDCACHE)
	    if (Setuidroot)
		cp = "?|i|r";

# if	!defined(WILLDROPGID)
	    else if (Myuid)
		cp = "?|i|r<path>";
# endif	/* !defined(WILLDROPGID) */

	    else
		cp = "?|i|b|r|u[path]";
	    (void) snpf(buf, sizeof(buf), "-D D  %s", cp);
#else	/* !defined(HASDCACHE) */
	    buf[0] = '\0';
#endif	/* defined(HASDCACHE) */

	    col = print_in_col(col, buf);

#if	defined(HASEOPT)
	    col = print_in_col(col, "+|-e s  exempt s *RISKY*");
#endif	/* defined(HASEOPT) */

	    (void) snpf(buf, sizeof(buf), "-i select IPv%s files",

#if	defined(HASIPv6)
			  "[46]"
#else	/* !defined(HASIPv6) */
			  "4"
#endif	/* defined(HASIPv6) */

			  );
	    col = print_in_col(col, buf);

#if	defined(HASTASKS)
	    col = print_in_col(col, "-K list tasKs");
#endif	/* defined(HASTASKS) */

	    col = print_in_col(col, "-l list UID numbers");
	    col = print_in_col(col, "-n no host names");
	    col = print_in_col(col, "-N select NFS files");
	    col = print_in_col(col, "-o list file offset");
	    col = print_in_col(col, "-O no overhead *RISKY*");
	    col = print_in_col(col, "-P no port names");

#if	defined(HASPPID)
	     col = print_in_col(col, "-R list paRent PID");
#endif	/* defined(HASPPID) */

	    col = print_in_col(col,  "-s list file size");
	    col = print_in_col(col,  "-t terse listing");
	    col = print_in_col(col,  "-T disable TCP/TPI info");
	    col = print_in_col(col,  "-U select Unix socket");
	    col = print_in_col(col,  "-v list version info");
	    col = print_in_col(col,  "-V verbose search");
	    (void) snpf(buf, sizeof(buf), "+|-w  Warnings (%s)",

#if	defined(WARNINGSTATE)
		"-");
#else	/* !defined(WARNINGSTATE) */
		"+");
#endif	/* defined(WARNINGSTATE) */

	    col = print_in_col(col, buf);

#if	defined(HASXOPT)
# if	defined(HASXOPT_ROOT)
	    if (Myuid == 0)
		(void) snpf(buf, sizeof(buf), "-X %s", HASXOPT);
	    else
		buf[0] = '\0';
# else	/* !defined(HASXOPT_ROOT) */
	    (void) snpf(buf, sizeof(buf), "-X %s", HASXOPT);
# endif	/* defined(HASXOPT_ROOT) */
# else	/* !defined(HASXOPT) */
	    buf[0] = '\0';
#endif	/* defined(HASXOPT) */

	    col = print_in_col(col, buf);

#if	defined(HASZONES)
	    col = print_in_col(col, "-z z  zone [z]");
#endif	/* defined(HASZONES) */

#if	defined(HASSELINUX)
	    col = print_in_col(col, "-Z Z  context [Z]");
#endif	/* defined(HASSELINUX) */

	    col = print_in_col(col, "-- end option scan");
	    if (col != 1)
		(void) fprintf(stderr, "\n");
	    (void) fprintf(stderr, "  %-36.36s",
		"+f|-f  +filesystem or -file names");

#if	defined(HASFSTRUCT)
	    (void) fprintf(stderr,
		"  +|-f[%s%s%s%s]%s%s%s%s %s%s%s%s%s%s%s\n",

# if	defined(HASNOFSCOUNT)
		"",
# else	/* !defined(HASNOFSCOUNT) */
		"c",
# endif	/* defined(HASNOFSCOUNT) */

# if	defined(HASNOFSADDR)
		"",
# else	/* !defined(HASNOFSADDR) */
		"f",
# endif	/* defined(HASNOFSADDR) */

# if	defined(HASNOFSFLAGS)
		"",
# else	/* !defined(HASNOFSFLAGS) */
		"gG",
# endif	/* defined(HASNOFSFLAGS) */

# if	defined(HASNOFSNADDR)
		"",
# else	/* !defined(HASNOFSNADDR) */
		"n",
# endif	/* defined(HASNOFSNADDR) */

# if	defined(HASNOFSCOUNT)
		"",
# else	/* !defined(HASNOFSCOUNT) */
		" Ct",
# endif	/* defined(HASNOFSCOUNT) */

# if	defined(HASNOFSADDR)
		"",
# else	/* !defined(HASNOFSADDR) */
		" Fstr",
# endif	/* defined(HASNOFSADDR) */

# if	defined(HASNOFSFLAGS)
		"",
# else	/* !defined(HASNOFSFLAGS) */
		" flaGs",
# endif	/* defined(HASNOFSFLAGS) */

# if	defined(HASNOFSNADDR)
		"",
# else	/* !defined(HASNOFSNADDR) */
		" Node",
# endif	/* defined(HASNOFSNADDR) */

		Fsv ? "(" : "",
		(Fsv & FSV_CT) ? "C" : "",
		(Fsv & FSV_FA) ? "F" : "",
		((Fsv & FSV_FG) && FsvFlagX)  ? "g" : "",
		((Fsv & FSV_FG) && !FsvFlagX) ? "G" : "",
		(Fsv & FSV_NI) ? "N" : "",
		Fsv ? ")" : "");
#else	/* !defined(HASFSTRUCT) */
	    putc('\n', stderr);
#endif	/* defined(HASFSTRUCT) */

	    (void) fprintf(stderr, "  %-36.36s",
		"-F [f] select fields; -F? for help");

#if	defined(HASKOPT)
	    (void) fprintf(stderr,
		"  -k k   kernel symbols (%s)\n",
		Nmlst ? Nmlst
# if	defined(N_UNIX)
		      : N_UNIX
# else	/* !defined(N_UNIX) */
		      : (Nmlst = get_nlist_path(1)) ? Nmlst
						    : "none found"
# endif	/* defined(N_UNIX) */

	    );
#else	/* !defined(HASKOPT) */
	    putc('\n', stderr);
#endif	/* defined(HASKOPT) */

	    (void) fprintf(stderr,
		"  +|-L [l] list (+) suppress (-) link counts < l (0 = all; default = 0)\n");

#if	defined(HASMOPT) || defined(HASMNTSUP)
# if	defined(HASMOPT)
	    (void) snpf(buf, sizeof(buf), "-m m   kernel memory (%s)", KMEM);
# else	/* !defined(HASMOPT) */
	    buf[0] = '\0';
# endif	/* defined(HASMOPT) */

	    (void) fprintf(stderr, "  %-36.36s", buf);

# if	defined(HASMNTSUP)
	    (void) fprintf(stderr, "  +m [m] use|create mount supplement\n");
# else	/* !defined(HASMNTSUP) */
	    (void) fprintf(stderr, "\n");
# endif	/* defined(HASMNTSUP) */
#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */

#if	!defined(HASNORPC_H)
	    (void) snpf(buf, sizeof(buf), "+|-M   portMap registration (%s)",

# if	defined(HASPMAPENABLED)
		"+"
# else	/* !defined(HASPMAPENABLED) */
		"-"
# endif	/* defined(HASPMAPENABLED) */

	    );
#else	/* defined(HASNORPC_H) */
	    buf[0] = '\0';
#endif	/* !defined(HASNORPC_H) */

	    (void) fprintf(stderr, "  %-36.36s", buf);
	    (void) snpf(buf, sizeof(buf), "-o o   o 0t offset digits (%d)",
		OFFDECDIG);
	    (void) fprintf(stderr, "  %s\n", buf);
	    (void) fprintf(stderr, "  %-36.36s",
		"-p s   exclude(^)|select PIDs");
	    (void) fprintf(stderr, "  -S [t] t second stat timeout (%d)\n",
		TMLIMIT);
	    (void) snpf(buf, sizeof(buf),
		"-T %s%ss%s TCP/TPI %s%sSt%s (s) info",

#if	defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
		"f",
#else	/* !defined(HASSOOPT) && !defined(HASSOSTATE) && !defined(HASTCPOPT)*/
		"",
#endif	/* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)*/

#if 	defined(HASTCPTPIQ)
		"q",
#else	/* !defined(HASTCPTPIQ) */
		" ",
#endif	/* defined(HASTCPTPIQ) */

#if 	defined(HASTCPTPIW)
		"w",
#else	/* !defined(HASTCPTPIW) */
		"",
#endif	/* defined(HASTCPTPIW) */

#if	defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
		"Fl,",
#else	/* !defined(HASSOOPT) && !defined(HASSOSTATE) && !defined(HASTCPOPT)*/
		"",
#endif	/* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)*/

#if 	defined(HASTCPTPIQ)
		"Q,",
#else	/* !defined(HASTCPTPIQ) */
		"",
#endif	/* defined(HASTCPTPIQ) */

#if 	defined(HASTCPTPIW)
		",Win"
#else	/* !defined(HASTCPTPIW) */
		""
#endif	/* defined(HASTCPTPIW) */

	    );
	    (void) fprintf(stderr, "  %s\n", buf);

#if	defined(HAS_AFS) && defined(HASAOPT)
	    (void) fprintf(stderr,
		"  -A A   AFS name list file (%s)\n", AFSAPATHDEF);
#endif	/* defined(HAS_AFS) && defined(HASAOPT) */

	    (void) fprintf(stderr,
		"  -g [s] exclude(^)|select and print process group IDs\n");
	    (void) fprintf(stderr, "  -i i   select by IPv%s address:",

#if	defined(HASIPv6)
			  "[46]"
#else	/* !defined(HASIPv6) */
			  "4"
#endif	/* defined(HASIPv6) */

			  );
	    (void) fprintf(stderr,
		" [%s][proto][@host|addr][:svc_list|port_list]\n",

#if	defined(HASIPv6)
		"46"
#else	/* !defined(HASIPv6) */
		"4"
#endif	/* defined(HASIPv6) */

		);

	    (void) fprintf(stderr,
		"  +|-r [%s] repeat every t seconds (%d); %s",

#if	defined(HAS_STRFTIME)
		"t[m<fmt>]",
#else	/* !defined(has_STRFTIME) */
		"t",
#endif	/* defined(HAS_STRFTIME) */

		RPTTM,
		" + until no files, - forever.\n");

#if	defined(HAS_STRFTIME)
	    (void) fprintf(stderr,
		"       An optional suffix to t is m<fmt>; m must separate %s",
		"t from <fmt> and\n");
	    (void) fprintf(stderr, "      <fmt> is an strftime(3) format %s",
		"for the marker line.\n");
#endif	/* defined(HAS_STRFTIME) */

#if	defined(HASTCPUDPSTATE)
	    (void) fprintf(stderr,
		"  -s p:s  exclude(^)|select protocol (p = TCP|UDP) states");
	    (void) fprintf(stderr, " by name(s).\n");
#endif	/* defined(HASTCPUDPSTATE) */

	    (void) fprintf(stderr,
		"  -u s   exclude(^)|select login|UID set s\n");
	    (void) fprintf(stderr,
		"  -x [fl] cross over +d|+D File systems or symbolic Links\n");
	    (void) fprintf(stderr,
		"  names  select named files or files on named file systems\n");
	    (void) report_SECURITY(NULL, "; ");
	    (void) report_WARNDEVACCESS(NULL, NULL, ";");
	    (void) report_HASKERNIDCK(" k", NULL);
	    (void) report_HASDCACHE(0, NULL, NULL);

#if	defined(DIALECT_WARNING)
	    (void) fprintf(stderr, "WARNING: %s\n", DIALECT_WARNING);
#endif	/* defined(DIALECT_WARNING) */

	}
	if (fh) {
	    (void) fprintf(stderr, "%s:\tID    field description\n", Pn);
	    for (i = 0; FieldSel[i].nm; i++) {

#if	!defined(HASPPID)
		if (FieldSel[i].id == LSOF_FID_PPID)
		    continue;
#endif	/* !defined(HASPPID) */

#if	!defined(HASFSTRUCT)
		if (FieldSel[i].id == LSOF_FID_FA
		||  FieldSel[i].id == LSOF_FID_CT
		||  FieldSel[i].id == LSOF_FID_FG
		||  FieldSel[i].id == LSOF_FID_NI)
		    continue;
#else	/* defined(HASFSTRUCT) */
# if	defined(HASNOFSADDR)
		if (FieldSel[i].id == LSOF_FID_FA)
		    continue;
# endif	/* defined(HASNOFSADDR) */

# if	defined(HASNOFSCOUNT)
		if (FieldSel[i].id == LSOF_FID_CT)
		    continue;
# endif	/* !defined(HASNOFSCOUNT) */

# if	defined(HASNOFSFLAGS)
		if (FieldSel[i].id == LSOF_FID_FG)
		    continue;
# endif	/* defined(HASNOFSFLAGS) */

# if	defined(HASNOFSNADDR)
		if (FieldSel[i].id == LSOF_FID_NI)
		    continue;
# endif	/* defined(HASNOFSNADDR) */
#endif	/* !defined(HASFSTRUCT) */

#if	!defined(HASZONES)
		if (FieldSel[i].id == LSOF_FID_ZONE)
		    continue;
#endif	/* !defined(HASZONES) */
 
#if	defined(HASSELINUX)
		if ((FieldSel[i].id == LSOF_FID_CNTX) && !CntxStatus)
		    continue;
#else	/* !defined(HASSELINUX) */
		if (FieldSel[i].id == LSOF_FID_CNTX)
		    continue;
#endif	/* !defined(HASSELINUX) */

		(void) fprintf(stderr, "\t %c    %s\n",
		    FieldSel[i].id, FieldSel[i].nm);
	    }
	}

#if	defined(HASDCACHE)
	if (DChelp)
	    report_HASDCACHE(1, NULL, "    ");
#endif	/* defined(HASDCACHE) */

	if (version) {

	/*
	 * Display version information in reponse to ``-v''.
	 */
	    (void) fprintf(stderr, "%s version information:\n", Pn);
	    (void) fprintf(stderr, "    revision: %s\n", LSOF_VERSION);
	    (void) fprintf(stderr, "    latest revision: %s\n", LSOF_URL);
	    (void) fprintf(stderr, "    latest FAQ: %sFAQ\n",
		LSOF_URL);
	    (void) fprintf(stderr, "    latest man page: %slsof_man\n",
		LSOF_URL);

#if	defined(LSOF_CINFO)
	    if ((cp = isnullstr(LSOF_CINFO)))
		(void) fprintf(stderr, "    configuration info: %s\n", cp);
#endif	/* defined(LSOF_CINFO) */

	    if ((cp = isnullstr(LSOF_CCDATE)))
		(void) fprintf(stderr, "    constructed: %s\n", cp);
	    cp = isnullstr(LSOF_HOST);
	    if (!(cp1 = isnullstr(LSOF_LOGNAME)))
		cp1 = isnullstr(LSOF_USER);
	    if (cp || cp1) {
		if (cp && cp1)
		    cp2 = "by and on";
		else if (cp)
		    cp2 = "on";
		else
		    cp2 = "by";
		(void) fprintf(stderr, "    constructed %s: %s%s%s\n",
		    cp2,
		    cp1 ? cp1 : "",
		    (cp && cp1) ? "@" : "",
		    cp  ? cp  : ""
		);
	    }

#if	defined(LSOF_BLDCMT)
	    if ((cp = isnullstr(LSOF_BLDCMT)))
		(void) fprintf(stderr, "    builder's comment: %s\n", cp);
#endif	/* defined(LSOF_BLDCMT) */

	    if ((cp = isnullstr(LSOF_CC)))
		(void) fprintf(stderr, "    compiler: %s\n", cp);
	    if ((cp = isnullstr(LSOF_CCV)))
		(void) fprintf(stderr, "    compiler version: %s\n", cp);
	    if ((cp = isnullstr(LSOF_CCFLAGS)))
		(void) fprintf(stderr, "    compiler flags: %s\n", cp);
	    if ((cp = isnullstr(LSOF_LDFLAGS)))
		(void) fprintf(stderr, "    loader flags: %s\n", cp);
	    if ((cp = isnullstr(LSOF_SYSINFO)))
		(void) fprintf(stderr, "    system info: %s\n", cp);
	    (void) report_SECURITY("    ", ".\n");
	    (void) report_WARNDEVACCESS("    ", "are", ".\n");
	    (void) report_HASKERNIDCK("    K", "is");

#if	defined(DIALECT_WARNING)
	    (void) fprintf(stderr, "    WARNING: %s\n", DIALECT_WARNING);
#endif	/* defined(DIALECT_WARNING) */

	    (void) report_HASDCACHE(1, "    ", "\t");
	}
	Exit(xv);
}
