Blame main.c

Packit Service 603f59
/*
Packit Service 603f59
 * main.c - common main function for lsof
Packit Service 603f59
 *
Packit Service 603f59
 * V. Abell, Purdue University
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * Copyright 1994 Purdue Research Foundation, West Lafayette, Indiana
Packit Service 603f59
 * 47907.  All rights reserved.
Packit Service 603f59
 *
Packit Service 603f59
 * Written by Victor A. Abell
Packit Service 603f59
 *
Packit Service 603f59
 * This software is not subject to any license of the American Telephone
Packit Service 603f59
 * and Telegraph Company or the Regents of the University of California.
Packit Service 603f59
 *
Packit Service 603f59
 * Permission is granted to anyone to use this software for any purpose on
Packit Service 603f59
 * any computer system, and to alter it and redistribute it freely, subject
Packit Service 603f59
 * to the following restrictions:
Packit Service 603f59
 *
Packit Service 603f59
 * 1. Neither the authors nor Purdue University are responsible for any
Packit Service 603f59
 *    consequences of the use of this software.
Packit Service 603f59
 *
Packit Service 603f59
 * 2. The origin of this software must not be misrepresented, either by
Packit Service 603f59
 *    explicit claim or by omission.  Credit to the authors and Purdue
Packit Service 603f59
 *    University must appear in documentation and sources.
Packit Service 603f59
 *
Packit Service 603f59
 * 3. Altered versions must be plainly marked as such, and must not be
Packit Service 603f59
 *    misrepresented as being the original software.
Packit Service 603f59
 *
Packit Service 603f59
 * 4. This notice may not be removed or altered.
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
#ifndef lint
Packit Service 603f59
static char copyright[] =
Packit Service 603f59
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
Packit Service 603f59
static char *rcsid = "$Id: main.c,v 1.59 2018/03/26 21:50:45 abe Exp $";
Packit Service 603f59
#endif
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
#include "lsof.h"
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * Local definitions
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
static int GObk[] = { 1, 1 };		/* option backspace values */
Packit Service 603f59
static char GOp;			/* option prefix -- '+' or '-' */
Packit Service 603f59
static char *GOv = (char *)NULL;	/* option `:' value pointer */
Packit Service 603f59
static int GOx1 = 1;			/* first opt[][] index */
Packit Service 603f59
static int GOx2 = 0;			/* second opt[][] index */
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
_PROTOTYPE(static int GetOpt,(int ct, char *opt[], char *rules, int *err));
Packit Service 603f59
_PROTOTYPE(static char *sv_fmt_str,(char *f));
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * main() - main function for lsof
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
int
Packit Service 603f59
main(argc, argv)
Packit Service 603f59
	int argc;
Packit Service 603f59
	char *argv[];
Packit Service 603f59
{
Packit Service 603f59
	int ad, c, i, n, rv, se1, se2, ss;
Packit Service 603f59
	char *cp;
Packit Service 603f59
	int err = 0;
Packit Service 603f59
	int ev = 0;
Packit Service 603f59
	int fh = 0;
Packit Service 603f59
	char *fmtr = (char *)NULL;
Packit Service 603f59
	long l;
Packit Service 603f59
	MALLOC_S len;
Packit Service 603f59
	struct lfile *lf;
Packit Service 603f59
	struct nwad *np, *npn;
Packit Service 603f59
	char options[128];
Packit Service 603f59
	int rc = 0;
Packit Service 603f59
	struct stat sb;
Packit Service 603f59
	struct sfile *sfp;
Packit Service 603f59
	struct lproc **slp = (struct lproc **)NULL;
Packit Service 603f59
	int sp = 0;
Packit Service 603f59
	struct str_lst *str, *strt;
Packit Service 603f59
	int version = 0;
Packit Service 603f59
	int xover = 0;
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_STRFTIME)
Packit Service 603f59
	char *fmt = (char *)NULL;
Packit Service 603f59
	size_t fmtl = (size_t)0;
Packit Service 603f59
#endif	/* defined(HAS_STRFTIME) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASZONES)
Packit Service 603f59
	znhash_t *zp;
Packit Service 603f59
#endif	/* defined(HASZONES) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASSELINUX)
Packit Service 603f59
/*
Packit Service 603f59
 * This stanza must be immediately before the "Save progam name." code, since
Packit Service 603f59
 * it contains code itself.
Packit Service 603f59
 */
Packit Service 603f59
	cntxlist_t *cntxp;
Packit Service 603f59
Packit Service 603f59
	CntxStatus = is_selinux_enabled() ? 1 : 0;
Packit Service 603f59
#endif	/* defined(HASSELINUX) */
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * Save program name.
Packit Service 603f59
 */
Packit Service 603f59
	if ((Pn = strrchr(argv[0], '/')))
Packit Service 603f59
	    Pn++;
Packit Service 603f59
	else
Packit Service 603f59
	    Pn = argv[0];
Packit Service 603f59
/*
Packit Service 603f59
 * Close enough file descriptors above 2 that library functions will have
Packit Service 603f59
 * open descriptors.
Packit Service 603f59
 *
Packit Service 603f59
 * Make sure stderr, stdout, and stdin are open descriptors.  Open /dev/null
Packit Service 603f59
 * for ones that aren't.  Be terse.
Packit Service 603f59
 *
Packit Service 603f59
 * Make sure umask allows lsof to define its own file permissions.
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
	if ((MaxFd = (int) GET_MAX_FD()) < 53)
Packit Service 603f59
	    MaxFd = 53;
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_CLOSEFROM)
Packit Service 603f59
	(void) closefrom(3);
Packit Service 603f59
#else	/* !defined(HAS_CLOSEFROM) */
Packit Service 603f59
	for (i = 3; i < MaxFd; i++)
Packit Service 603f59
	    (void) close(i);
Packit Service 603f59
#endif	/* !defined(HAS_CLOSEFROM) */
Packit Service 603f59
Packit Service 603f59
	while (((i = open("/dev/null", O_RDWR, 0)) >= 0) && (i < 2))
Packit Service 603f59
	    ;
Packit Service 603f59
	if (i < 0)
Packit Service 603f59
	    Exit(1);
Packit Service 603f59
	if (i > 2)
Packit Service 603f59
	    (void) close(i);
Packit Service 603f59
	(void) umask(0);
Packit Service 603f59
Packit Service 603f59
#if	defined(HASSETLOCALE)
Packit Service 603f59
/*
Packit Service 603f59
 * Set locale to environment's definition.
Packit Service 603f59
 */
Packit Service 603f59
	(void) setlocale(LC_CTYPE, "");
Packit Service 603f59
#endif	/* defined(HASSETLOCALE) */
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * Common initialization.
Packit Service 603f59
 */
Packit Service 603f59
	Mypid = getpid();
Packit Service 603f59
	if ((Mygid = (gid_t)getgid()) != getegid())
Packit Service 603f59
	    Setgid = 1;
Packit Service 603f59
	Euid = geteuid();
Packit Service 603f59
	if ((Myuid = (uid_t)getuid()) && !Euid)
Packit Service 603f59
	    Setuidroot = 1;
Packit Service 603f59
	if (!(Namech = (char *)malloc(MAXPATHLEN + 1))) {
Packit Service 603f59
	    (void) fprintf(stderr, "%s: no space for name buffer\n", Pn);
Packit Service 603f59
	    Exit(1);
Packit Service 603f59
	}
Packit Service 603f59
	Namechl = (size_t)(MAXPATHLEN + 1);
Packit Service 603f59
/*
Packit Service 603f59
 * Create option mask.
Packit Service 603f59
 */
Packit Service 603f59
	(void) snpf(options, sizeof(options),
Packit Service 603f59
	    "?a%sbc:%sD:d:%s%sf:F:g:hi:%s%slL:%s%snNo:Op:Pr:%ss:S:tT:u:UvVwx:%s%s%s",
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_AFS) && defined(HASAOPT)
Packit Service 603f59
	    "A:",
Packit Service 603f59
#else	/* !defined(HAS_AFS) || !defined(HASAOPT) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HAS_AFS) && defined(HASAOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASNCACHE)
Packit Service 603f59
	    "C",
Packit Service 603f59
#else	/* !defined(HASNCACHE) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASNCACHE) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEOPT)
Packit Service 603f59
	    "e:",
Packit Service 603f59
#else	/* !defined(HASEOPT) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASEOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEPTOPTS)
Packit Service 603f59
	    "E",
Packit Service 603f59
#else	/* !defined(HASEPTOPTS) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASEPTOPTS) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASKOPT)
Packit Service 603f59
	    "k:",
Packit Service 603f59
#else	/* !defined(HASKOPT) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASKOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTASKS)
Packit Service 603f59
	    "K:",
Packit Service 603f59
#else	/* !defined(HASTASKS) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASMOPT) || defined(HASMNTSUP)
Packit Service 603f59
	    "m:",
Packit Service 603f59
#else	/* !defined(HASMOPT) && !defined(HASMNTSUP) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASNORPC_H)
Packit Service 603f59
	    "",
Packit Service 603f59
#else	/* !defined(HASNORPC_H) */
Packit Service 603f59
	    "M",
Packit Service 603f59
#endif	/* defined(HASNORPC_H) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASPPID)
Packit Service 603f59
	    "R",
Packit Service 603f59
#else	/* !defined(HASPPID) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASPPID) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASXOPT)
Packit Service 603f59
# if	defined(HASXOPT_ROOT)
Packit Service 603f59
	    (Myuid == 0) ? "X" : "",
Packit Service 603f59
# else	/* !defined(HASXOPT_ROOT) */
Packit Service 603f59
	    "X",
Packit Service 603f59
# endif	/* defined(HASXOPT_ROOT) */
Packit Service 603f59
#else	/* !defined(HASXOPT) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASXOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASZONES)
Packit Service 603f59
	    "z:",
Packit Service 603f59
#else	/* !defined(HASZONES) */
Packit Service 603f59
	    "",
Packit Service 603f59
#endif	/* defined(HASZONES) */
Packit Service 603f59
 
Packit Service 603f59
#if	defined(HASSELINUX)
Packit Service 603f59
	    "Z:"
Packit Service 603f59
#else	/* !defined(HASSELINUX) */
Packit Service 603f59
	    ""
Packit Service 603f59
#endif	/* defined(HASSELINUX) */
Packit Service 603f59
Packit Service 603f59
	    );
Packit Service 603f59
/*
Packit Service 603f59
 * Loop through options.
Packit Service 603f59
 */
Packit Service 603f59
	while ((c = GetOpt(argc, argv, options, &rv)) != EOF) {
Packit Service 603f59
	    if (rv) {
Packit Service 603f59
		err = 1;
Packit Service 603f59
		continue;
Packit Service 603f59
	    }
Packit Service 603f59
	    switch (c) {
Packit Service 603f59
	    case 'a':
Packit Service 603f59
		Fand = 1;
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_AFS) && defined(HASAOPT)
Packit Service 603f59
	    case 'A':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    (void) fprintf(stderr, "%s: -A not followed by path\n", Pn);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		} else
Packit Service 603f59
		    AFSApath = GOv;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HAS_AFS) && defined(HASAOPT) */
Packit Service 603f59
Packit Service 603f59
	    case 'b':
Packit Service 603f59
		Fblock = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'c':
Packit Service 603f59
		if (GOp == '+') {
Packit Service 603f59
		    if (!GOv || (*GOv == '-') || (*GOv == '+')
Packit Service 603f59
		    ||  !isdigit((int)*GOv))
Packit Service 603f59
		    {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: +c not followed by width number\n", Pn);
Packit Service 603f59
			err = 1;
Packit Service 603f59
			if (GOv) {
Packit Service 603f59
			    GOx1 = GObk[0];
Packit Service 603f59
			    GOx2 = GObk[1];
Packit Service 603f59
			}
Packit Service 603f59
		    } else {
Packit Service 603f59
			CmdLim = TaskCmdLim = atoi(GOv);
Packit Service 603f59
Packit Service 603f59
#if	defined(MAXSYSCMDL)
Packit Service 603f59
			if (CmdLim > MAXSYSCMDL) {
Packit Service 603f59
			    (void) fprintf(stderr,
Packit Service 603f59
				"%s: +c %d > what system provides (%d)\n",
Packit Service 603f59
				Pn, CmdLim, MAXSYSCMDL);
Packit Service 603f59
			    err = 1;
Packit Service 603f59
			}
Packit Service 603f59
#endif	/* defined(MAXSYSCMDL) */
Packit Service 603f59
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		if (GOv && (*GOv == '/')) {
Packit Service 603f59
		    if (enter_cmd_rx(GOv))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		} else {
Packit Service 603f59
		    if (enter_str_lst("-c", GOv, &Cmdl, &Cmdni, &Cmdnx))
Packit Service 603f59
			err = 1;
Packit Service 603f59
Packit Service 603f59
#if	defined(MAXSYSCMDL)
Packit Service 603f59
		    else if (Cmdl->len > MAXSYSCMDL) {
Packit Service 603f59
			(void) fprintf(stderr, "%s: \"-c ", Pn);
Packit Service 603f59
			(void) safestrprt(Cmdl->str, stderr, 2);
Packit Service 603f59
			(void) fprintf(stderr, "\" length (%d) > what system",
Packit Service 603f59
			    Cmdl->len);
Packit Service 603f59
			(void) fprintf(stderr, " provides (%d)\n",
Packit Service 603f59
			    MAXSYSCMDL);
Packit Service 603f59
			Cmdl->len = 0;	/* (to avoid later error report) */
Packit Service 603f59
			err = 1;
Packit Service 603f59
		    }
Packit Service 603f59
#endif	/* defined(MAXSYSCMDL) */
Packit Service 603f59
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASNCACHE)
Packit Service 603f59
	    case 'C':
Packit Service 603f59
		Fncache = (GOp == '-') ? 0 : 1;
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#endif	/* defined(HASNCACHE) */
Packit Service 603f59
	    case 'd':
Packit Service 603f59
		if (GOp == '+') {
Packit Service 603f59
		    if (enter_dir(GOv, 0))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		    else {
Packit Service 603f59
			Selflags |= SELNM;
Packit Service 603f59
			xover = 1;
Packit Service 603f59
		    }
Packit Service 603f59
		} else {
Packit Service 603f59
		    if (enter_fd(GOv))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'D':
Packit Service 603f59
		if (GOp == '+') {
Packit Service 603f59
		    if (enter_dir(GOv, 1))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		    else {
Packit Service 603f59
			Selflags |= SELNM;
Packit Service 603f59
			xover = 1;
Packit Service 603f59
		    }
Packit Service 603f59
		} else {
Packit Service 603f59
Packit Service 603f59
#if	defined(HASDCACHE)
Packit Service 603f59
		    if (ctrl_dcache(GOv))
Packit Service 603f59
			err = 1;
Packit Service 603f59
#else	/* !defined(HASDCACHE) */
Packit Service 603f59
		    (void) fprintf(stderr, "%s: unsupported option: -D\n", Pn);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
#endif	/* defined(HASDCACHE) */
Packit Service 603f59
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEOPT)
Packit Service 603f59
	    case 'e':
Packit Service 603f59
		if (enter_efsys(GOv, ((GOp == '+') ? 1 : 0)))
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASEOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEPTOPTS)
Packit Service 603f59
	    case 'E':
Packit Service 603f59
		FeptE = (GOp == '+') ? 2 : 1;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASEPTOPTS) */
Packit Service 603f59
Packit Service 603f59
	    case 'f':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Ffilesys = (GOp == '+') ? 2 : 1;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
Packit Service 603f59
#if	defined(HASFSTRUCT)
Packit Service 603f59
		for (; *GOv; GOv++) {
Packit Service 603f59
		    switch (*GOv) {
Packit Service 603f59
Packit Service 603f59
# if	!defined(HASNOFSCOUNT)
Packit Service 603f59
		    case 'c':
Packit Service 603f59
		    case 'C':
Packit Service 603f59
			if (GOp == '+') {
Packit Service 603f59
			    Fsv |= FSV_CT;
Packit Service 603f59
			    FsvByf = 1;
Packit Service 603f59
			} else
Packit Service 603f59
			    Fsv &= (unsigned char)~FSV_CT;
Packit Service 603f59
			break;
Packit Service 603f59
# endif	/* !defined(HASNOFSCOUNT) */
Packit Service 603f59
Packit Service 603f59
# if	!defined(HASNOFSADDR)
Packit Service 603f59
		    case 'f':
Packit Service 603f59
		    case 'F':
Packit Service 603f59
			if (GOp == '+') {
Packit Service 603f59
			    Fsv |= FSV_FA;
Packit Service 603f59
			    FsvByf = 1;
Packit Service 603f59
			} else
Packit Service 603f59
			    Fsv &= (unsigned char)~FSV_FA;
Packit Service 603f59
			break;
Packit Service 603f59
# endif	/* !defined(HASNOFSADDR) */
Packit Service 603f59
Packit Service 603f59
# if	!defined(HASNOFSFLAGS)
Packit Service 603f59
		    case 'g':
Packit Service 603f59
		    case 'G':
Packit Service 603f59
			if (GOp == '+') {
Packit Service 603f59
			    Fsv |= FSV_FG;
Packit Service 603f59
			    FsvByf = 1;
Packit Service 603f59
			} else
Packit Service 603f59
			    Fsv &= (unsigned char)~FSV_FG;
Packit Service 603f59
			FsvFlagX = (*GOv == 'G') ? 1 : 0;
Packit Service 603f59
			break;
Packit Service 603f59
# endif	/* !defined(HASNOFSFLAGS) */
Packit Service 603f59
Packit Service 603f59
# if	!defined(HASNOFSNADDR)
Packit Service 603f59
		    case 'n':
Packit Service 603f59
		    case 'N':
Packit Service 603f59
			if (GOp == '+') {
Packit Service 603f59
			    Fsv |= FSV_NI;
Packit Service 603f59
			    FsvByf = 1;
Packit Service 603f59
			} else
Packit Service 603f59
			    Fsv &= (unsigned char)~FSV_NI;
Packit Service 603f59
			break;
Packit Service 603f59
# endif	/* !defined(HASNOFSNADDR */
Packit Service 603f59
Packit Service 603f59
		    default:
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: unknown file struct option: %c\n", Pn, *GOv);
Packit Service 603f59
			err++;
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
#else	/* !defined(HASFSTRUCT) */
Packit Service 603f59
		(void) fprintf(stderr,
Packit Service 603f59
		    "%s: unknown string for %cf: %s\n", Pn, GOp, GOv);
Packit Service 603f59
		err++;
Packit Service 603f59
#endif	/* defined(HASFSTRUCT) */
Packit Service 603f59
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'F':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+'
Packit Service 603f59
		||  strcmp(GOv, "0") == 0) {
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			if (*GOv == '-' || *GOv == '+') {
Packit Service 603f59
			    GOx1 = GObk[0];
Packit Service 603f59
			    GOx2 = GObk[1];
Packit Service 603f59
			} else if (*GOv == '0')
Packit Service 603f59
			    Terminator = '\0';
Packit Service 603f59
		    }
Packit Service 603f59
		    for (i = 0; FieldSel[i].nm; i++) {
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASPPID)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_PPID)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASPPID) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASTASKS)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_TCMD)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASFSTRUCT)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_CT
Packit Service 603f59
			||  FieldSel[i].id == LSOF_FID_FA
Packit Service 603f59
			||  FieldSel[i].id == LSOF_FID_FG
Packit Service 603f59
			||  FieldSel[i].id == LSOF_FID_NI)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASFSTRUCT) */
Packit Service 603f59
 
Packit Service 603f59
#if	defined(HASSELINUX)
Packit Service 603f59
			if ((FieldSel[i].id == LSOF_FID_CNTX) && !CntxStatus)
Packit Service 603f59
			    continue;
Packit Service 603f59
#else	/* !defined(HASSELINUX) */
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_CNTX)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASSELINUX) */
Packit Service 603f59
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_RDEV)
Packit Service 603f59
			    continue;	/* for compatibility */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASTASKS)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_TID)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASZONES)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_ZONE)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASZONES) */
Packit Service 603f59
Packit Service 603f59
			FieldSel[i].st = 1;
Packit Service 603f59
			if (FieldSel[i].opt && FieldSel[i].ov)
Packit Service 603f59
			    *(FieldSel[i].opt) |= FieldSel[i].ov;
Packit Service 603f59
		    }
Packit Service 603f59
Packit Service 603f59
#if	defined(HASFSTRUCT)
Packit Service 603f59
		    Ffield = FsvFlagX = 1;
Packit Service 603f59
#else	/* !defined(HASFSTRUCT) */
Packit Service 603f59
		    Ffield = 1;
Packit Service 603f59
#endif	/* defined(HASFSTRUCT) */
Packit Service 603f59
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		if (strcmp(GOv, "?") == 0) {
Packit Service 603f59
		    fh = 1;
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		for (; *GOv; GOv++) {
Packit Service 603f59
		    for (i = 0; FieldSel[i].nm; i++) {
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASPPID)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_PPID)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASPPID) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASTASKS)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_TCMD)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASFSTRUCT)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_CT
Packit Service 603f59
			||  FieldSel[i].id == LSOF_FID_FA
Packit Service 603f59
			||  FieldSel[i].id == LSOF_FID_FG
Packit Service 603f59
			||  FieldSel[i].id == LSOF_FID_NI)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASFSTRUCT) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASTASKS)
Packit Service 603f59
			if (FieldSel[i].id == LSOF_FID_TID)
Packit Service 603f59
			    continue;
Packit Service 603f59
#endif	/* !defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
			if (FieldSel[i].id == *GOv) {
Packit Service 603f59
			    FieldSel[i].st = 1;
Packit Service 603f59
			    if (FieldSel[i].opt && FieldSel[i].ov)
Packit Service 603f59
				*(FieldSel[i].opt) |= FieldSel[i].ov;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASFSTRUCT)
Packit Service 603f59
			    if (i == LSOF_FIX_FG)
Packit Service 603f59
				FsvFlagX = 1;
Packit Service 603f59
#endif	/* defined(HASFSTRUCT) */
Packit Service 603f59
Packit Service 603f59
			    if (i == LSOF_FIX_TERM)
Packit Service 603f59
				Terminator = '\0';
Packit Service 603f59
			    break;
Packit Service 603f59
			}
Packit Service 603f59
		    }
Packit Service 603f59
		    if ( ! FieldSel[i].nm) {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: unknown field: %c\n", Pn, *GOv);
Packit Service 603f59
			err++;
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
		Ffield = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'g':
Packit Service 603f59
		if (GOv) {
Packit Service 603f59
		    if (*GOv == '-' || *GOv == '+') {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    } else if (enter_id(PGID, GOv))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		}
Packit Service 603f59
		Fpgid = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'h':
Packit Service 603f59
	    case '?':
Packit Service 603f59
		Fhelp = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'i':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Fnet = 1;
Packit Service 603f59
		    FnetTy = 0;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		if (enter_network_address(GOv))
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASKOPT)
Packit Service 603f59
	    case 'k':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    (void) fprintf(stderr, "%s: -k not followed by path\n", Pn);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		} else
Packit Service 603f59
		    Nmlst = GOv;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASKOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTASKS)
Packit Service 603f59
	    case 'K':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Ftask = 1;
Packit Service 603f59
		    IgnTasks = 0;
Packit Service 603f59
		    Selflags |= SELTASK;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		} else {
Packit Service 603f59
		    if (!strcasecmp(GOv, "i")) {
Packit Service 603f59
			Ftask = 0;
Packit Service 603f59
			IgnTasks = 1;
Packit Service 603f59
			Selflags &= ~SELTASK;
Packit Service 603f59
		   } else {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: -K not followed by i (but by %s)\n", Pn, GOv);
Packit Service 603f59
			err = 1;
Packit Service 603f59
		   }
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
	    case 'l':
Packit Service 603f59
		Futol = 0;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'L':
Packit Service 603f59
		Fnlink = (GOp == '+') ? 1 : 0;
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Nlink = 0l;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		for (cp = GOv, l = 0l, n = 0; *cp; cp++) {
Packit Service 603f59
		    if (!isdigit((unsigned char)*cp))
Packit Service 603f59
			break;
Packit Service 603f59
		    l = (l * 10l) + ((long)*cp - (long)'0');
Packit Service 603f59
		    n++;
Packit Service 603f59
		}
Packit Service 603f59
		if (n) {
Packit Service 603f59
		    if (GOp != '+') {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: no number may follow -L\n", Pn);
Packit Service 603f59
			err = 1;
Packit Service 603f59
		    } else {
Packit Service 603f59
			Nlink = l;
Packit Service 603f59
			Selflags |= SELNLINK;
Packit Service 603f59
		    }
Packit Service 603f59
		} else
Packit Service 603f59
		    Nlink = 0l;
Packit Service 603f59
		if (*cp) {
Packit Service 603f59
		    GOx1 = GObk[0];
Packit Service 603f59
		    GOx2 = GObk[1] + n;
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASMOPT) || defined(HASMNTSUP)
Packit Service 603f59
	    case 'm':
Packit Service 603f59
		if (GOp == '-') {
Packit Service 603f59
Packit Service 603f59
# if	defined(HASMOPT)
Packit Service 603f59
		    if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: -m not followed by path\n", Pn);
Packit Service 603f59
			err = 1;
Packit Service 603f59
			if (GOv) {
Packit Service 603f59
			    GOx1 = GObk[0];
Packit Service 603f59
			    GOx2 = GObk[1];
Packit Service 603f59
			}
Packit Service 603f59
		    } else
Packit Service 603f59
			Memory = GOv;
Packit Service 603f59
# else	/* !defined(HASMOPT) */
Packit Service 603f59
		    (void) fprintf(stderr, "%s: -m not supported\n", Pn);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
# endif	/* defined(HASMOPT) */
Packit Service 603f59
Packit Service 603f59
		} else if (GOp == '+') {
Packit Service 603f59
Packit Service 603f59
# if	defined(HASMNTSUP)
Packit Service 603f59
		    if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
			MntSup = 1;
Packit Service 603f59
			if (GOv) {
Packit Service 603f59
			    GOx1 = GObk[0];
Packit Service 603f59
			    GOx2 = GObk[1];
Packit Service 603f59
			}
Packit Service 603f59
		    } else {
Packit Service 603f59
			MntSup = 2;
Packit Service 603f59
			MntSupP = GOv;
Packit Service 603f59
		    }
Packit Service 603f59
# else	/* !defined(HASMNTSUP) */
Packit Service 603f59
		    (void) fprintf(stderr, "%s: +m not supported\n", Pn);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
# endif	/* defined(HASMNTSUP) */
Packit Service 603f59
Packit Service 603f59
		} else {
Packit Service 603f59
		    (void) fprintf(stderr, "%s: %cm not supported\n", Pn, GOp);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASMOPT) || defined(HASMNTSUP) */
Packit Service 603f59
Packit Service 603f59
#if	!defined(HASNORPC_H)
Packit Service 603f59
	    case 'M':
Packit Service 603f59
		FportMap = (GOp == '+') ? 1 : 0;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* !defined(HASNORPC_H) */
Packit Service 603f59
Packit Service 603f59
	    case 'n':
Packit Service 603f59
		Fhost = (GOp == '-') ? 0 : 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'N':
Packit Service 603f59
		Fnfs = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'o':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Foffset = 1;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		for (cp = GOv, i = n = 0; *cp; cp++) {
Packit Service 603f59
		    if (!isdigit((unsigned char)*cp))
Packit Service 603f59
			break;
Packit Service 603f59
		    i = (i * 10) + ((int)*cp - '0');
Packit Service 603f59
		    n++;
Packit Service 603f59
		}
Packit Service 603f59
		if (n)
Packit Service 603f59
		    OffDecDig = i;
Packit Service 603f59
		else
Packit Service 603f59
		    Foffset = 1;
Packit Service 603f59
		if (*cp) {
Packit Service 603f59
		    GOx1 = GObk[0];
Packit Service 603f59
		    GOx2 = GObk[1] + n;
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'O':
Packit Service 603f59
		Fovhd = (GOp == '-') ? 1 : 0;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'p':
Packit Service 603f59
		if (enter_id(PID, GOv))
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'P':
Packit Service 603f59
		Fport = (GOp == '-') ? 0 : 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'r':
Packit Service 603f59
		if (GOp == '+')
Packit Service 603f59
		    ev = rc = 1;
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    RptTm = RPTTM;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		for (cp = GOv, i = n = 0; *cp; cp++) {
Packit Service 603f59
		    if (!isdigit((unsigned char)*cp))
Packit Service 603f59
			break;
Packit Service 603f59
		    i = (i * 10) + ((int)*cp - '0');
Packit Service 603f59
		    n++;
Packit Service 603f59
		}
Packit Service 603f59
		if (n)
Packit Service 603f59
		    RptTm = i;
Packit Service 603f59
		else
Packit Service 603f59
		    RptTm = RPTTM;
Packit Service 603f59
		if (!*cp)
Packit Service 603f59
		     break;
Packit Service 603f59
		while(*cp && (*cp == ' '))
Packit Service 603f59
		    cp++;
Packit Service 603f59
		if (*cp != LSOF_FID_MARK) {
Packit Service 603f59
		    GOx1 = GObk[0];
Packit Service 603f59
		    GOx2 = GObk[1] + n;
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_STRFTIME)
Packit Service 603f59
Packit Service 603f59
	    /*
Packit Service 603f59
	     * Collect the strftime(3) format and test it.
Packit Service 603f59
	     */
Packit Service 603f59
		cp++;
Packit Service 603f59
		if ((fmtl = strlen(cp) + 1) < 1) {
Packit Service 603f59
		    (void) fprintf(stderr, "%s: <fmt> too short: \"%s\"\n",
Packit Service 603f59
			Pn, cp);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		} else {
Packit Service 603f59
		    fmt = cp;
Packit Service 603f59
		    fmtl = (fmtl * 8) + 1;
Packit Service 603f59
		    if (!(fmtr = (char *)malloc((MALLOC_S)fmtl))) {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: no space (%d) for <fmt> result: \"%s\"\n",
Packit Service 603f59
			    Pn, (int)fmtl, cp);
Packit Service 603f59
			    Exit(1);
Packit Service 603f59
		    }
Packit Service 603f59
		    if (util_strftime(fmtr, fmtl - 1, fmt) < 1) {
Packit Service 603f59
			(void) fprintf(stderr, "%s: illegal <fmt>: \"%s\"\n",
Packit Service 603f59
			    Pn, fmt);
Packit Service 603f59
			err = 1;
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
Packit Service 603f59
#else	/* !defined(HAS_STRFTIME) */
Packit Service 603f59
		(void) fprintf(stderr, "%s: m<fmt> not supported: \"%s\"\n",
Packit Service 603f59
		    Pn, cp);
Packit Service 603f59
		err = 1;
Packit Service 603f59
#endif	/* defined(HAS_STRFTIME) */
Packit Service 603f59
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASPPID)
Packit Service 603f59
	    case 'R':
Packit Service 603f59
		Fppid = 1;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASPPID) */
Packit Service 603f59
Packit Service 603f59
	    case 's':
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTCPUDPSTATE)
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Fsize = 1;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		} else {
Packit Service 603f59
		    if (enter_state_spec(GOv))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		}
Packit Service 603f59
#else	/* !defined(HASTCPUDPSTATE) */
Packit Service 603f59
		Fsize = 1;
Packit Service 603f59
#endif	/* defined(HASTCPUDPSTATE) */
Packit Service 603f59
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'S':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    TmLimit = TMLIMIT;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		for (cp = GOv, i = n = 0; *cp; cp++) {
Packit Service 603f59
		    if (!isdigit((unsigned char)*cp))
Packit Service 603f59
			break;
Packit Service 603f59
		    i = (i * 10) + ((int)*cp - '0');
Packit Service 603f59
		    n++;
Packit Service 603f59
		}
Packit Service 603f59
		if (n)
Packit Service 603f59
		    TmLimit = i;
Packit Service 603f59
		else
Packit Service 603f59
		    TmLimit = TMLIMIT;
Packit Service 603f59
		if (*cp) {
Packit Service 603f59
		    GOx1 = GObk[0];
Packit Service 603f59
		    GOx2 = GObk[1] + n;
Packit Service 603f59
		}
Packit Service 603f59
		if (TmLimit < TMLIMMIN) {
Packit Service 603f59
		    (void) fprintf(stderr,
Packit Service 603f59
			"%s: WARNING: -S time (%d) changed to %d\n",
Packit Service 603f59
			Pn, TmLimit, TMLIMMIN);
Packit Service 603f59
		    TmLimit = TMLIMMIN;
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
	    case 't':
Packit Service 603f59
		Fterse = Fwarn = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'T':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Ftcptpi = (GOp == '-') ? 0 : TCPTPI_STATE;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		}
Packit Service 603f59
		for (Ftcptpi = 0; *GOv; GOv++) {
Packit Service 603f59
		    switch (*GOv) {
Packit Service 603f59
Packit Service 603f59
#if	defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT)
Packit Service 603f59
		    case 'f':
Packit Service 603f59
			Ftcptpi |= TCPTPI_FLAGS;
Packit Service 603f59
			break;
Packit Service 603f59
#endif	/* defined(HASSOOPT) || defined(HASSOSTATE) || defined(HASTCPOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTCPTPIQ)
Packit Service 603f59
		    case 'q':
Packit Service 603f59
			Ftcptpi |= TCPTPI_QUEUES;
Packit Service 603f59
			break;
Packit Service 603f59
#endif	/* defined(HASTCPTPIQ) */
Packit Service 603f59
Packit Service 603f59
		    case 's':
Packit Service 603f59
			Ftcptpi |= TCPTPI_STATE;
Packit Service 603f59
			break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTCPTPIW)
Packit Service 603f59
		    case 'w':
Packit Service 603f59
			Ftcptpi |= TCPTPI_WINDOWS;
Packit Service 603f59
			break;
Packit Service 603f59
#endif	/* defined(HASTCPTPIW) */
Packit Service 603f59
Packit Service 603f59
		    default:
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			"%s: unsupported TCP/TPI info selection: %c\n",
Packit Service 603f59
			    Pn, *GOv);
Packit Service 603f59
			err = 1;
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'u':
Packit Service 603f59
		if (enter_uid(GOv))
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'U':
Packit Service 603f59
		Funix = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'v':
Packit Service 603f59
		version = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'V':
Packit Service 603f59
		Fverbose = 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'w':
Packit Service 603f59
		Fwarn = (GOp == '+') ? 0 : 1;
Packit Service 603f59
		break;
Packit Service 603f59
	    case 'x':
Packit Service 603f59
		if (!GOv || *GOv == '-' || *GOv == '+') {
Packit Service 603f59
		    Fxover = XO_ALL;
Packit Service 603f59
		    if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		    break;
Packit Service 603f59
		} else {
Packit Service 603f59
		    for (; *GOv; GOv++) {
Packit Service 603f59
			switch (*GOv) {
Packit Service 603f59
			case 'f':
Packit Service 603f59
			    Fxover |= XO_FILESYS;
Packit Service 603f59
			    break;
Packit Service 603f59
			case 'l':
Packit Service 603f59
			    Fxover |= XO_SYMLINK;
Packit Service 603f59
			    break;
Packit Service 603f59
			default:
Packit Service 603f59
			    (void) fprintf(stderr,
Packit Service 603f59
				"%s: unknown cross-over option: %c\n",
Packit Service 603f59
				Pn, *GOv);
Packit Service 603f59
			    err++;
Packit Service 603f59
			}
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASXOPT)
Packit Service 603f59
	    case 'X':
Packit Service 603f59
		Fxopt = Fxopt ? 0 : 1;
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASXOPT) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASZONES)
Packit Service 603f59
	    case 'z':
Packit Service 603f59
		Fzone = 1;
Packit Service 603f59
		if (GOv && (*GOv != '-') && (*GOv != '+')) {
Packit Service 603f59
Packit Service 603f59
		/*
Packit Service 603f59
		 * Add to the zone name argument hash.
Packit Service 603f59
		 */
Packit Service 603f59
		    if (enter_zone_arg(GOv))
Packit Service 603f59
			err = 1;
Packit Service 603f59
		} else if (GOv) {
Packit Service 603f59
		    GOx1 = GObk[0];
Packit Service 603f59
		    GOx2 = GObk[1];
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASZONES) */
Packit Service 603f59
 
Packit Service 603f59
#if	defined(HASSELINUX)
Packit Service 603f59
	    case 'Z':
Packit Service 603f59
		if (!CntxStatus) {
Packit Service 603f59
		   (void) fprintf(stderr, "%s: -Z limited to SELinux\n", Pn);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		} else {
Packit Service 603f59
		    Fcntx = 1;
Packit Service 603f59
		    if (GOv && (*GOv != '-') && (*GOv != '+')) {
Packit Service 603f59
Packit Service 603f59
		    /*
Packit Service 603f59
		     * Add to the context name argument hash.
Packit Service 603f59
		     */
Packit Service 603f59
			if (enter_cntx_arg(GOv))
Packit Service 603f59
			    err = 1;
Packit Service 603f59
		    } else if (GOv) {
Packit Service 603f59
			GOx1 = GObk[0];
Packit Service 603f59
			GOx2 = GObk[1];
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
		break;
Packit Service 603f59
#endif	/* defined(HASSELINUX) */
Packit Service 603f59
Packit Service 603f59
	    default:
Packit Service 603f59
		(void) fprintf(stderr, "%s: unknown option (%c)\n", Pn, c);
Packit Service 603f59
		err = 1;
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
/*
Packit Service 603f59
 * If IgnTasks is set, remove SELTASK from SelAll and SelProc.
Packit Service 603f59
 */
Packit Service 603f59
	SelAll = IgnTasks ? (SELALL & ~SELTASK) : SELALL;
Packit Service 603f59
	SelProc = IgnTasks ? (SELPROC & ~SELTASK) : SELPROC;
Packit Service 603f59
/*
Packit Service 603f59
 * Check for argument consistency.
Packit Service 603f59
 */
Packit Service 603f59
	if (Cmdnx && Cmdni) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check for command inclusion/exclusion conflicts.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (str = Cmdl; str; str = str->next) {
Packit Service 603f59
		if (str->x) {
Packit Service 603f59
		    for (strt = Cmdl; strt; strt = strt->next) {
Packit Service 603f59
			if (!strt->x) {
Packit Service 603f59
			    if (!strcmp(str->str, strt->str)) {
Packit Service 603f59
				(void) fprintf(stderr,
Packit Service 603f59
				    "%s: -c^%s and -c%s conflict.\n",
Packit Service 603f59
				    Pn, str->str, strt->str);
Packit Service 603f59
				err++;
Packit Service 603f59
			    }
Packit Service 603f59
			}
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTCPUDPSTATE)
Packit Service 603f59
	if (TcpStXn && TcpStIn) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check for excluded and included TCP states.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (i = 0; i < TcpNstates; i++) {
Packit Service 603f59
		if (TcpStX[i] && TcpStI[i]) {
Packit Service 603f59
		    (void) fprintf(stderr,
Packit Service 603f59
			"%s: can't include and exclude TCP state: %s\n",
Packit Service 603f59
			Pn, TcpSt[i]);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	if (UdpStXn && UdpStIn) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check for excluded and included UDP states.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (i = 0; i < UdpNstates; i++) {
Packit Service 603f59
		if (UdpStX[i] && UdpStI[i]) {
Packit Service 603f59
		    (void) fprintf(stderr,
Packit Service 603f59
			"%s: can't include and exclude UDP state: %s\n",
Packit Service 603f59
			Pn, UdpSt[i]);
Packit Service 603f59
		    err = 1;
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASTCPUDPSTATE) */
Packit Service 603f59
Packit Service 603f59
	if (Fsize && Foffset) {
Packit Service 603f59
	    (void) fprintf(stderr, "%s: -o and -s are mutually exclusive\n",
Packit Service 603f59
		Pn);
Packit Service 603f59
	    err++;
Packit Service 603f59
	}
Packit Service 603f59
	if (Ffield) {
Packit Service 603f59
	    if (Fterse) {
Packit Service 603f59
		(void) fprintf(stderr,
Packit Service 603f59
		    "%s: -F and -t are mutually exclusive\n", Pn);
Packit Service 603f59
		err++;
Packit Service 603f59
	    }
Packit Service 603f59
	    FieldSel[LSOF_FIX_PID].st = 1;
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_STRFTIME)
Packit Service 603f59
	    if (fmtr) {
Packit Service 603f59
Packit Service 603f59
	    /*
Packit Service 603f59
	     * The field output marker format can't contain "%n" new line
Packit Service 603f59
	     * requests.
Packit Service 603f59
	     */
Packit Service 603f59
		for (cp = strchr(fmt, '%'); cp; cp = strchr(cp, '%')) {
Packit Service 603f59
		    if (*++cp  == 'n') {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: %%n illegal in -r m<fmt> when -F has", Pn);
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    " been specified: \"%s\"\n", fmt);
Packit Service 603f59
			err++;
Packit Service 603f59
			break;
Packit Service 603f59
		    } else if (*cp == '%')
Packit Service 603f59
			cp++;
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
#endif	/* defined(HAS_STRFTIME) */
Packit Service 603f59
Packit Service 603f59
	}
Packit Service 603f59
	if (Fxover && !xover) {
Packit Service 603f59
	    (void) fprintf(stderr, "%s: -x must accompany +d or +D\n", Pn);
Packit Service 603f59
	    err++;
Packit Service 603f59
	}
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEOPT)
Packit Service 603f59
	if (Efsysl) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * If there are file systems specified by -e options, check them.
Packit Service 603f59
	 */
Packit Service 603f59
	    efsys_list_t *ep;		/* Efsysl pointer */
Packit Service 603f59
	    struct mounts *mp, *mpw;	/* local mount table pointers */
Packit Service 603f59
Packit Service 603f59
	    if ((mp = readmnt())) {
Packit Service 603f59
		for (ep = Efsysl; ep; ep = ep->next) {
Packit Service 603f59
		    for (mpw = mp; mpw; mpw = mpw->next) {
Packit Service 603f59
			if (!strcmp(mpw->dir, ep->path)) {
Packit Service 603f59
			    ep->mp = mpw;
Packit Service 603f59
			    break;
Packit Service 603f59
			}
Packit Service 603f59
		    }
Packit Service 603f59
		    if (!ep->mp) {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: \"-e %s\" is not a mounted file system.\n",
Packit Service 603f59
			    Pn, ep->path);
Packit Service 603f59
			err++;
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASEOPT) */
Packit Service 603f59
Packit Service 603f59
	if (DChelp || err || Fhelp || fh || version)
Packit Service 603f59
	    usage(err ? 1 : 0, fh, version);
Packit Service 603f59
/*
Packit Service 603f59
 * Reduce the size of Suid[], if necessary.
Packit Service 603f59
 */
Packit Service 603f59
	if (Suid && Nuid && Nuid < Mxuid) {
Packit Service 603f59
	    if (!(Suid = (struct seluid *)realloc((MALLOC_P *)Suid,
Packit Service 603f59
			 (MALLOC_S)(sizeof(struct seluid) * Nuid))))
Packit Service 603f59
	    {
Packit Service 603f59
		(void) fprintf(stderr, "%s: can't realloc UID table\n", Pn);
Packit Service 603f59
		Exit(1);
Packit Service 603f59
	    }
Packit Service 603f59
	    Mxuid = Nuid;
Packit Service 603f59
	}
Packit Service 603f59
/*
Packit Service 603f59
 * Compute the selection flags.
Packit Service 603f59
 */
Packit Service 603f59
	if ((Cmdl && Cmdni) || CmdRx)
Packit Service 603f59
	    Selflags |= SELCMD;
Packit Service 603f59
 
Packit Service 603f59
#if	defined(HASSELINUX)
Packit Service 603f59
	if (CntxArg)
Packit Service 603f59
	    Selflags |= SELCNTX;
Packit Service 603f59
#endif	/* defined(HASSELINUX) */
Packit Service 603f59
Packit Service 603f59
	if (Fdl)
Packit Service 603f59
	    Selflags |= SELFD;
Packit Service 603f59
	if (Fnet)
Packit Service 603f59
	    Selflags |= SELNET;
Packit Service 603f59
	if (Fnfs)
Packit Service 603f59
	    Selflags |= SELNFS;
Packit Service 603f59
	if (Funix)
Packit Service 603f59
	    Selflags |= SELUNX;
Packit Service 603f59
	if (Npgid && Npgidi)
Packit Service 603f59
	    Selflags |= SELPGID;
Packit Service 603f59
	if (Npid && Npidi)
Packit Service 603f59
	    Selflags |= SELPID;
Packit Service 603f59
	if (Nuid && Nuidincl)
Packit Service 603f59
	    Selflags |= SELUID;
Packit Service 603f59
	if (Nwad)
Packit Service 603f59
	    Selflags |= SELNA;
Packit Service 603f59
Packit Service 603f59
#if	defined(HASZONES)
Packit Service 603f59
	if (ZoneArg)
Packit Service 603f59
	    Selflags |= SELZONE;
Packit Service 603f59
#endif	/* defined(HASZONES) */
Packit Service 603f59
Packit Service 603f59
	if (GOx1 < argc)
Packit Service 603f59
	    Selflags |= SELNM;
Packit Service 603f59
	if (Selflags == 0) {
Packit Service 603f59
	    if (Fand) {
Packit Service 603f59
		(void) fprintf(stderr,
Packit Service 603f59
		    "%s: no select options to AND via -a\n", Pn);
Packit Service 603f59
		usage(1, 0, 0);
Packit Service 603f59
	    }
Packit Service 603f59
	    Selflags = SelAll;
Packit Service 603f59
	} else {
Packit Service 603f59
	    if (GOx1 >= argc && (Selflags & (SELNA|SELNET)) != 0
Packit Service 603f59
	    &&  (Selflags & ~(SELNA|SELNET)) == 0)
Packit Service 603f59
		Selinet = 1;
Packit Service 603f59
	    AllProc = 0;
Packit Service 603f59
	}
Packit Service 603f59
/*
Packit Service 603f59
 * Get the device for DEVDEV_PATH.
Packit Service 603f59
 */
Packit Service 603f59
	if (stat(DEVDEV_PATH, &sb)) {
Packit Service 603f59
	    se1 = errno;
Packit Service 603f59
 	    if ((ad = strcmp(DEVDEV_PATH, "/dev"))) {
Packit Service 603f59
		if ((ss = stat("/dev", &sb)))
Packit Service 603f59
		    se2 = errno;
Packit Service 603f59
		else
Packit Service 603f59
		    se2 = 0;
Packit Service 603f59
	    } else {
Packit Service 603f59
		se2 = 0;
Packit Service 603f59
		ss = 1;
Packit Service 603f59
	    }
Packit Service 603f59
	    if (ss) {
Packit Service 603f59
		(void) fprintf(stderr, "%s: can't stat(%s): %s\n", Pn,
Packit Service 603f59
		    DEVDEV_PATH, strerror(se1));
Packit Service 603f59
		if (ad) {
Packit Service 603f59
		    (void) fprintf(stderr, "%s: can't stat(/dev): %s\n", Pn,
Packit Service 603f59
		    strerror(se2));
Packit Service 603f59
		}
Packit Service 603f59
		Exit(1);
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	DevDev = sb.st_dev;
Packit Service 603f59
/*
Packit Service 603f59
 * Process the file arguments.
Packit Service 603f59
 */
Packit Service 603f59
	if (GOx1 < argc) {
Packit Service 603f59
	    if (ck_file_arg(GOx1, argc, argv, Ffilesys, 0, (struct stat *)NULL))
Packit Service 603f59
		usage(1, 0, 0);
Packit Service 603f59
	}
Packit Service 603f59
/*
Packit Service 603f59
 * Do dialect-specific initialization.
Packit Service 603f59
 */
Packit Service 603f59
	initialize();
Packit Service 603f59
	if (Sfile)
Packit Service 603f59
	    (void) hashSfile();
Packit Service 603f59
Packit Service 603f59
#if	defined(WILLDROPGID)
Packit Service 603f59
/*
Packit Service 603f59
 * If this process isn't setuid(root), but it is setgid(not_real_gid),
Packit Service 603f59
 * relinquish the setgid power.  (If it hasn't already been done.)
Packit Service 603f59
 */
Packit Service 603f59
	(void) dropgid();
Packit Service 603f59
#endif	/* defined(WILLDROPGID) */
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
#if	defined(HASDCACHE)
Packit Service 603f59
/*
Packit Service 603f59
 * If there is a device cache, prepare the device table.
Packit Service 603f59
 */
Packit Service 603f59
	if (DCstate)
Packit Service 603f59
	    readdev(0);
Packit Service 603f59
#endif	/* defined(HASDCACHE) */
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * Define the size and offset print formats.
Packit Service 603f59
 */
Packit Service 603f59
	(void) snpf(options, sizeof(options), "%%%su", INODEPSPEC);
Packit Service 603f59
	InodeFmt_d = sv_fmt_str(options);
Packit Service 603f59
	(void) snpf(options, sizeof(options), "%%#%sx", INODEPSPEC);
Packit Service 603f59
	InodeFmt_x = sv_fmt_str(options);
Packit Service 603f59
	(void) snpf(options, sizeof(options), "0t%%%su", SZOFFPSPEC);
Packit Service 603f59
	SzOffFmt_0t = sv_fmt_str(options);
Packit Service 603f59
	(void) snpf(options, sizeof(options), "%%%su", SZOFFPSPEC);
Packit Service 603f59
	SzOffFmt_d = sv_fmt_str(options);
Packit Service 603f59
	(void) snpf(options, sizeof(options), "%%*%su", SZOFFPSPEC);
Packit Service 603f59
	SzOffFmt_dv = sv_fmt_str(options);
Packit Service 603f59
	(void) snpf(options, sizeof(options), "%%#%sx", SZOFFPSPEC);
Packit Service 603f59
	SzOffFmt_x = sv_fmt_str(options);
Packit Service 603f59
Packit Service 603f59
#if	defined(HASMNTSUP)
Packit Service 603f59
/*
Packit Service 603f59
 * Report mount supplement information, as requested.
Packit Service 603f59
 */
Packit Service 603f59
	if (MntSup == 1) {
Packit Service 603f59
	    (void) readmnt();
Packit Service 603f59
	    Exit(0);
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASMNTSUP) */
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * Gather and report process information every RptTm seconds.
Packit Service 603f59
 */
Packit Service 603f59
	if (RptTm)
Packit Service 603f59
	    CkPasswd = 1;
Packit Service 603f59
	do {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Gather information about processes.
Packit Service 603f59
	 */
Packit Service 603f59
	    gather_proc_info();
Packit Service 603f59
	/*
Packit Service 603f59
	 * If the local process table has more than one entry, sort it by PID.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (Nlproc > 1) {
Packit Service 603f59
		if (Nlproc > sp) {
Packit Service 603f59
		    len = (MALLOC_S)(Nlproc * sizeof(struct lproc *));
Packit Service 603f59
		    sp = Nlproc;
Packit Service 603f59
		    if (!slp)
Packit Service 603f59
			slp = (struct lproc **)malloc(len);
Packit Service 603f59
		    else
Packit Service 603f59
			slp = (struct lproc **)realloc((MALLOC_P *)slp, len);
Packit Service 603f59
		    if (!slp) {
Packit Service 603f59
			(void) fprintf(stderr,
Packit Service 603f59
			    "%s: no space for %d sort pointers\n", Pn, Nlproc);
Packit Service 603f59
			Exit(1);
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
		for (i = 0; i < Nlproc; i++) {
Packit Service 603f59
		    slp[i] = &Lproc[i];
Packit Service 603f59
		}
Packit Service 603f59
		(void) qsort((QSORT_P *)slp, (size_t)Nlproc,
Packit Service 603f59
			     (size_t)sizeof(struct lproc *), comppid);
Packit Service 603f59
	    }
Packit Service 603f59
	    if ((n = Nlproc)) {
Packit Service 603f59
Packit Service 603f59
#if	defined(HASNCACHE)
Packit Service 603f59
	    /*
Packit Service 603f59
	     * If using the kernel name cache, force its reloading.
Packit Service 603f59
	     */
Packit Service 603f59
		NcacheReload = 1;
Packit Service 603f59
#endif	/* defined(HASNCACHE) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEPTOPTS)
Packit Service 603f59
	    /*
Packit Service 603f59
	     * If endpoint info has been requested, make sure it is coded for
Packit Service 603f59
	     * printing.
Packit Service 603f59
	     *
Packit Service 603f59
	     * Lf contents must be preserved, since they may point to a
Packit Service 603f59
	     * malloc()'d area, and since Lf is used throughout the printing
Packit Service 603f59
	     * of the selected processes.
Packit Service 603f59
	     */
Packit Service 603f59
		if (FeptE) {
Packit Service 603f59
		    lf = Lf;
Packit Service 603f59
		/*
Packit Service 603f59
		 * Scan all selected processes.
Packit Service 603f59
		 */
Packit Service 603f59
		    for (i = 0; i < Nlproc; i++) {
Packit Service 603f59
			Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
Packit Service 603f59
Packit Service 603f59
			/*
Packit Service 603f59
			 * For processes that have been selected for printing
Packit Service 603f59
			 * and have files that are the end point(s) of pipe(s),
Packit Service 603f59
			 * process the file endpoints.
Packit Service 603f59
			 */
Packit Service 603f59
			    if (Lp->pss && (Lp->ept & EPT_PIPE))
Packit Service 603f59
				(void) process_pinfo(0);
Packit Service 603f59
Packit Service 603f59
# if	defined(HASUXSOCKEPT)
Packit Service 603f59
			/*
Packit Service 603f59
			 * For processes that have been selected for printing
Packit Service 603f59
			 * and have files that are the end point(s) of UNIX
Packit Service 603f59
			 * socket(s), process the file endpoints.
Packit Service 603f59
			 */
Packit Service 603f59
			    if (Lp->pss && (Lp->ept & EPT_UXS))
Packit Service 603f59
				(void) process_uxsinfo(0);
Packit Service 603f59
# endif	/* defined(HASUXSOCKEPT) */
Packit Service 603f59
Packit Service 603f59
# if	defined(HASPTYEPT)
Packit Service 603f59
			/*
Packit Service 603f59
			 * For processes that have been selected for printing
Packit Service 603f59
			 * and have files that are the end point(s) of pseudo-
Packit Service 603f59
			 * terminal files(s), process the file endpoints.
Packit Service 603f59
			 */
Packit Service 603f59
			    if (Lp->pss && (Lp->ept & EPT_PTY))
Packit Service 603f59
				(void) process_ptyinfo(0);
Packit Service 603f59
# endif	/* defined(HASPTYEPT) */
Packit Service 603f59
Packit Service 603f59
		    }
Packit Service 603f59
		/*
Packit Service 603f59
		 * In a second pass, look for unselected endpoint files,
Packit Service 603f59
		 * possibly selecting them for printing.
Packit Service 603f59
		 */
Packit Service 603f59
		    for (i = 0; i < Nlproc; i++) {
Packit Service 603f59
			Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
Packit Service 603f59
Packit Service 603f59
			/*
Packit Service 603f59
			 * Process pipe endpoints.
Packit Service 603f59
			 */
Packit Service 603f59
			    if (Lp->ept & EPT_PIPE_END)
Packit Service 603f59
				(void) process_pinfo(1);
Packit Service 603f59
Packit Service 603f59
# if	defined(HASUXSOCKEPT)
Packit Service 603f59
			/*
Packit Service 603f59
			 * Process UNIX socket endpoints.
Packit Service 603f59
			 */
Packit Service 603f59
			    if (Lp->ept & EPT_UXS_END)
Packit Service 603f59
				(void) process_uxsinfo(1);
Packit Service 603f59
# endif	/* defined(HASUXSOCKEPT) */
Packit Service 603f59
Packit Service 603f59
# if	defined(HASPTYEPT)
Packit Service 603f59
			/*
Packit Service 603f59
			 * Process pseudo-terminal endpoints.
Packit Service 603f59
			 */
Packit Service 603f59
			    if (Lp->ept & EPT_PTY_END)
Packit Service 603f59
				(void) process_ptyinfo(1);
Packit Service 603f59
# endif	/* defined(HASPTYEPT) */
Packit Service 603f59
Packit Service 603f59
		    }
Packit Service 603f59
		    Lf = lf;
Packit Service 603f59
		}
Packit Service 603f59
#endif	/* defined(HASEPTOPTS) */
Packit Service 603f59
Packit Service 603f59
	    /*
Packit Service 603f59
	     * Print the selected processes and count them.
Packit Service 603f59
	     *
Packit Service 603f59
	     * Lf contents must be preserved, since they may point to a
Packit Service 603f59
	     * malloc()'d area, and since Lf is used throughout the print
Packit Service 603f59
	     * process.
Packit Service 603f59
	     */
Packit Service 603f59
		for (lf = Lf, print_init(); PrPass < 2; PrPass++) {
Packit Service 603f59
		    for (i = n = 0; i < Nlproc; i++) {
Packit Service 603f59
			Lp = (Nlproc > 1) ? slp[i] : &Lproc[i];
Packit Service 603f59
			if (Lp->pss) {
Packit Service 603f59
			    if (print_proc())
Packit Service 603f59
				n++;
Packit Service 603f59
			}
Packit Service 603f59
			if (RptTm && PrPass)
Packit Service 603f59
			    (void) free_lproc(Lp);
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
		Lf = lf;
Packit Service 603f59
	    }
Packit Service 603f59
	/*
Packit Service 603f59
	 * If a repeat time is set, sleep for the specified time.
Packit Service 603f59
	 *
Packit Service 603f59
	 * If conditional repeat mode is in effect, see if it's time to exit.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (RptTm) {
Packit Service 603f59
Packit Service 603f59
#if	defined(HASEPTOPTS)
Packit Service 603f59
		(void) clear_pinfo();
Packit Service 603f59
Packit Service 603f59
# if	defined(HASUXSOCKEPT)
Packit Service 603f59
		(void) clear_uxsinfo();
Packit Service 603f59
# endif	/* defined(HASUXSOCKEPT) */
Packit Service 603f59
Packit Service 603f59
# if	defined(HASPTYEPT)
Packit Service 603f59
		(void) clear_ptyinfo();
Packit Service 603f59
# endif	/* defined(HASPTYEPT) */
Packit Service 603f59
#endif	/* defined(HASEPTOPTS) */
Packit Service 603f59
Packit Service 603f59
		if (rc) {
Packit Service 603f59
		    if (!n)
Packit Service 603f59
			break;
Packit Service 603f59
		    else
Packit Service 603f59
			ev = 0;
Packit Service 603f59
		}
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_STRFTIME)
Packit Service 603f59
		if (fmt && fmtr) {
Packit Service 603f59
Packit Service 603f59
		/*
Packit Service 603f59
		 * Format the marker line.
Packit Service 603f59
		 */
Packit Service 603f59
		    (void) util_strftime(fmtr, fmtl - 1, fmt);
Packit Service 603f59
		    fmtr[fmtl - 1] = '\0';
Packit Service 603f59
		}
Packit Service 603f59
#endif	/* defined(HAS_STRFTIME) */
Packit Service 603f59
Packit Service 603f59
		if (Ffield) {
Packit Service 603f59
		    putchar(LSOF_FID_MARK);
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_STRFTIME)
Packit Service 603f59
		    if (fmtr)
Packit Service 603f59
	    	        (void) printf("%s", fmtr);
Packit Service 603f59
#endif	/* defined(HAS_STRFTIME) */
Packit Service 603f59
Packit Service 603f59
		    putchar(Terminator);
Packit Service 603f59
		    if (Terminator != '\n')
Packit Service 603f59
			putchar('\n');
Packit Service 603f59
		} else {
Packit Service 603f59
Packit Service 603f59
#if	defined(HAS_STRFTIME)
Packit Service 603f59
		    if (fmtr)
Packit Service 603f59
			cp = fmtr;
Packit Service 603f59
		    else
Packit Service 603f59
#endif	/* defined(HAS_STRFTIME) */
Packit Service 603f59
Packit Service 603f59
			cp = "=======";
Packit Service 603f59
		    puts(cp);
Packit Service 603f59
		}
Packit Service 603f59
		(void) fflush(stdout);
Packit Service 603f59
		(void) childx();
Packit Service 603f59
		(void) sleep(RptTm);
Packit Service 603f59
		Hdr = Nlproc = 0;
Packit Service 603f59
		CkPasswd = 1;
Packit Service 603f59
	    }
Packit Service 603f59
	} while (RptTm);
Packit Service 603f59
/*
Packit Service 603f59
 * See if all requested information was displayed.  Return zero if it
Packit Service 603f59
 * was; one, if not.  If -V was specified, report what was not displayed.
Packit Service 603f59
 */
Packit Service 603f59
	(void) childx();
Packit Service 603f59
	rv = 0;
Packit Service 603f59
	for (str = Cmdl; str; str = str->next) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check command specifications.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (str->f)
Packit Service 603f59
		continue;
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose) {
Packit Service 603f59
		(void) printf("%s: command not located: ", Pn);
Packit Service 603f59
		safestrprt(str->str, stdout, 1);
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	for (i = 0; i < NCmdRxU; i++) {
Packit Service 603f59
	
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check command regular expressions.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (CmdRx[i].mc)
Packit Service 603f59
		continue;
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose) {
Packit Service 603f59
		(void) printf("%s: no command found for regex: ", Pn);
Packit Service 603f59
		safestrprt(CmdRx[i].exp, stdout, 1);
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	for (sfp = Sfile; sfp; sfp = sfp->next) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check file specifications.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (sfp->f)
Packit Service 603f59
		continue;
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose) {
Packit Service 603f59
		(void) printf("%s: no file%s use located: ", Pn,
Packit Service 603f59
		    sfp->type ? "" : " system");
Packit Service 603f59
		safestrprt(sfp->aname, stdout, 1);
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
Packit Service 603f59
#if	defined(HASPROCFS)
Packit Service 603f59
	/*
Packit Service 603f59
	 * Report on proc file system search results.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (Procsrch && !Procfind) {
Packit Service 603f59
		rv = 1;
Packit Service 603f59
		if (Fverbose) {
Packit Service 603f59
		    (void) printf("%s: no file system use located: ", Pn);
Packit Service 603f59
		    safestrprt(Mtprocfs ? Mtprocfs->dir : HASPROCFS, stdout, 1);
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	    {
Packit Service 603f59
		struct procfsid *pfi;
Packit Service 603f59
Packit Service 603f59
		for (pfi = Procfsid; pfi; pfi = pfi->next) {
Packit Service 603f59
		    if (!pfi->f) {
Packit Service 603f59
			rv = 1;
Packit Service 603f59
			if (Fverbose) {
Packit Service 603f59
			    (void) printf("%s: no file use located: ", Pn);
Packit Service 603f59
			    safestrprt(pfi->nm, stdout, 1);
Packit Service 603f59
			}
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
#endif	/* defined(HASPROCFS) */
Packit Service 603f59
Packit Service 603f59
	if ((np = Nwad)) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check Internet address specifications.
Packit Service 603f59
	 *
Packit Service 603f59
	 * If any Internet address derived from the same argument was found,
Packit Service 603f59
	 * consider all derivations found.  If no derivation from the same
Packit Service 603f59
	 * argument was found, report only the first failure.
Packit Service 603f59
	 *
Packit Service 603f59
	 */
Packit Service 603f59
	    for (; np; np = np->next) {
Packit Service 603f59
		if (!(cp = np->arg))
Packit Service 603f59
		    continue;
Packit Service 603f59
		for (npn = np->next; npn; npn = npn->next) {
Packit Service 603f59
		    if (!npn->arg)
Packit Service 603f59
			continue;
Packit Service 603f59
		    if (!strcmp(cp, npn->arg)) {
Packit Service 603f59
Packit Service 603f59
		    /*
Packit Service 603f59
		     * If either of the duplicate specifications was found,
Packit Service 603f59
		     * mark them both found.  If neither was found, mark all
Packit Service 603f59
		     * but the first one found.
Packit Service 603f59
		     */
Packit Service 603f59
			if (np->f)
Packit Service 603f59
			    npn->f = np->f;
Packit Service 603f59
			else if (npn->f)
Packit Service 603f59
			    np->f = npn->f;
Packit Service 603f59
			else
Packit Service 603f59
			    npn->f = 1;
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	    for (np = Nwad; np; np = np->next) {
Packit Service 603f59
		if (!np->f && (cp = np->arg)) {
Packit Service 603f59
		    rv = 1;
Packit Service 603f59
		    if (Fverbose) {
Packit Service 603f59
			(void) printf("%s: Internet address not located: ", Pn);
Packit Service 603f59
			safestrprt(cp ? cp : "(unknown)", stdout, 1);
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	if (Fnet && Fnet < 2) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Report no Internet files located.
Packit Service 603f59
	 */
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose)
Packit Service 603f59
		(void) printf("%s: no Internet files located\n", Pn);
Packit Service 603f59
	}
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTCPUDPSTATE)
Packit Service 603f59
	if (TcpStIn) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check for included TCP states not located.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (i = 0; i < TcpNstates; i++) {
Packit Service 603f59
		if (TcpStI[i] == 1) {
Packit Service 603f59
		    rv = 1;
Packit Service 603f59
		    if (Fverbose)
Packit Service 603f59
			(void) printf("%s: TCP state not located: %s\n",
Packit Service 603f59
			    Pn, TcpSt[i]);
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	if (UdpStIn) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check for included UDP states not located.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (i = 0; i < UdpNstates; i++) {
Packit Service 603f59
		if (UdpStI[i] == 1) {
Packit Service 603f59
		    rv = 1;
Packit Service 603f59
		    if (Fverbose)
Packit Service 603f59
			(void) printf("%s: UDP state not located: %s\n",
Packit Service 603f59
			    Pn, UdpSt[i]);
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASTCPUDPSTATE) */
Packit Service 603f59
Packit Service 603f59
	if (Fnfs && Fnfs < 2) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Report no NFS files located.
Packit Service 603f59
	 */
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose)
Packit Service 603f59
		(void) printf("%s: no NFS files located\n", Pn);
Packit Service 603f59
	}
Packit Service 603f59
	for (i = 0; i < Npid; i++) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check inclusionary process ID specifications.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (Spid[i].f || Spid[i].x)
Packit Service 603f59
		continue;
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose)
Packit Service 603f59
		(void) printf("%s: process ID not located: %d\n",
Packit Service 603f59
		    Pn, Spid[i].i);
Packit Service 603f59
	}
Packit Service 603f59
Packit Service 603f59
#if	defined(HASTASKS)
Packit Service 603f59
	if (Ftask && Ftask < 2) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Report no tasks located.
Packit Service 603f59
	 */
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose)
Packit Service 603f59
		(void) printf("%s: no tasks located\n", Pn);
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASTASKS) */
Packit Service 603f59
Packit Service 603f59
#if	defined(HASZONES)
Packit Service 603f59
	if (ZoneArg) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check zone argument results.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (i = 0; i < HASHZONE; i++) {
Packit Service 603f59
		for (zp = ZoneArg[i]; zp; zp = zp->next) {
Packit Service 603f59
		    if (!zp->f) {
Packit Service 603f59
			rv = 1;
Packit Service 603f59
			if (Fverbose) {
Packit Service 603f59
			    (void) printf("%s: zone not located: ", Pn);
Packit Service 603f59
			    safestrprt(zp->zn, stdout, 1);
Packit Service 603f59
			}
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASZONES) */
Packit Service 603f59
 
Packit Service 603f59
#if	defined(HASSELINUX)
Packit Service 603f59
	if (CntxArg) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check context argument results.
Packit Service 603f59
	 */
Packit Service 603f59
	    for (cntxp = CntxArg; cntxp; cntxp = cntxp->next) {
Packit Service 603f59
		if (!cntxp->f) {
Packit Service 603f59
		    rv = 1;
Packit Service 603f59
		    if (Fverbose) {
Packit Service 603f59
			(void) printf("%s: context not located: ", Pn);
Packit Service 603f59
			safestrprt(cntxp->cntx, stdout, 1);
Packit Service 603f59
		    }
Packit Service 603f59
		}
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
#endif	/* defined(HASSELINUX) */
Packit Service 603f59
Packit Service 603f59
	for (i = 0; i < Npgid; i++) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check inclusionary process group ID specifications.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (Spgid[i].f || Spgid[i].x)
Packit Service 603f59
		continue;
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose)
Packit Service 603f59
		(void) printf("%s: process group ID not located: %d\n",
Packit Service 603f59
		    Pn, Spgid[i].i);
Packit Service 603f59
	}
Packit Service 603f59
	for (i = 0; i < Nuid; i++) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Check inclusionary user ID specifications.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (Suid[i].excl || Suid[i].f)
Packit Service 603f59
		continue;
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	    if (Fverbose) {
Packit Service 603f59
		if (Suid[i].lnm) {
Packit Service 603f59
		    (void) printf("%s: login name (UID %lu) not located: ",
Packit Service 603f59
			Pn, (unsigned long)Suid[i].uid);
Packit Service 603f59
		    safestrprt(Suid[i].lnm, stdout, 1);
Packit Service 603f59
		} else
Packit Service 603f59
		    (void) printf("%s: user ID not located: %lu\n", Pn,
Packit Service 603f59
			(unsigned long)Suid[i].uid);
Packit Service 603f59
	    }
Packit Service 603f59
	}
Packit Service 603f59
	if (!rv && rc)
Packit Service 603f59
	    rv = ev;
Packit Service 603f59
	if (!rv && ErrStat)
Packit Service 603f59
	    rv = 1;
Packit Service 603f59
	Exit(rv);
Packit Service 603f59
	return(rv);		/* to make code analyzers happy */
Packit Service 603f59
}
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * GetOpt() -- Local get option
Packit Service 603f59
 *
Packit Service 603f59
 * Liberally adapted from the public domain AT&T getopt() source,
Packit Service 603f59
 * distributed at the 1985 UNIFORM conference in Dallas
Packit Service 603f59
 *
Packit Service 603f59
 * The modifications allow `?' to be an option character and allow
Packit Service 603f59
 * the caller to decide that an option that may be followed by a
Packit Service 603f59
 * value doesn't have one -- e.g., has a default instead.
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
static int
Packit Service 603f59
GetOpt(ct, opt, rules, err)
Packit Service 603f59
	int ct;				/* option count */
Packit Service 603f59
	char *opt[];			/* options */
Packit Service 603f59
	char *rules;			/* option rules */
Packit Service 603f59
	int *err;			/* error return */
Packit Service 603f59
{
Packit Service 603f59
	register int c;
Packit Service 603f59
	register char *cp = (char *)NULL;
Packit Service 603f59
Packit Service 603f59
	if (GOx2 == 0) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * Move to a new entry of the option array.
Packit Service 603f59
	 *
Packit Service 603f59
	 * EOF if:
Packit Service 603f59
	 *
Packit Service 603f59
	 *	Option list has been exhausted;
Packit Service 603f59
	 *	Next option doesn't start with `-' or `+';
Packit Service 603f59
	 *	Next option has nothing but `-' or `+';
Packit Service 603f59
	 *	Next option is ``--'' or ``++''.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (GOx1 >= ct
Packit Service 603f59
	    ||  (opt[GOx1][0] != '-' && opt[GOx1][0] != '+')
Packit Service 603f59
	    ||  !opt[GOx1][1])
Packit Service 603f59
		 return(EOF);
Packit Service 603f59
	    if (strcmp(opt[GOx1], "--") == 0 || strcmp(opt[GOx1], "++") == 0) {
Packit Service 603f59
		GOx1++;
Packit Service 603f59
		return(EOF);
Packit Service 603f59
	    }
Packit Service 603f59
	    GOp = opt[GOx1][0];
Packit Service 603f59
	    GOx2 = 1;
Packit Service 603f59
	}
Packit Service 603f59
/*
Packit Service 603f59
 * Flag `:' option character as an error.
Packit Service 603f59
 *
Packit Service 603f59
 * Check for a rule on this option character.
Packit Service 603f59
 */
Packit Service 603f59
	*err = 0;
Packit Service 603f59
	if ((c = opt[GOx1][GOx2]) == ':') {
Packit Service 603f59
	    (void) fprintf(stderr,
Packit Service 603f59
		"%s: colon is an illegal option character.\n", Pn);
Packit Service 603f59
	    *err = 1;
Packit Service 603f59
	} else if (!(cp = strchr(rules, c))) {
Packit Service 603f59
	    (void) fprintf(stderr, "%s: illegal option character: %c\n", Pn, c);
Packit Service 603f59
	    *err = 2;
Packit Service 603f59
	}
Packit Service 603f59
	if (*err) {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * An error was detected.
Packit Service 603f59
	 *
Packit Service 603f59
	 * Advance to the next option character.
Packit Service 603f59
	 *
Packit Service 603f59
	 * Return the character causing the error.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (opt[GOx1][++GOx2] == '\0') {
Packit Service 603f59
		GOx1++;
Packit Service 603f59
		GOx2 = 0;
Packit Service 603f59
	    }
Packit Service 603f59
	    return(c);
Packit Service 603f59
	}
Packit Service 603f59
	if (*(cp + 1) == ':') {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * The option may have a following value.  The caller decides
Packit Service 603f59
	 * if it does.
Packit Service 603f59
	 *
Packit Service 603f59
	 * Save the position of the possible value in case the caller
Packit Service 603f59
	 * decides it does not belong to the option and wants it
Packit Service 603f59
	 * reconsidered as an option character.  The caller does that
Packit Service 603f59
	 * with:
Packit Service 603f59
	 *		GOx1 = GObk[0]; GOx2 = GObk[1];
Packit Service 603f59
	 *
Packit Service 603f59
	 * Don't indicate that an option of ``--'' is a possible value.
Packit Service 603f59
	 *
Packit Service 603f59
	 * Finally, on the assumption that the caller will decide that
Packit Service 603f59
	 * the possible value belongs to the option, position to the
Packit Service 603f59
	 * option following the possible value, so that the next call
Packit Service 603f59
	 * to GetOpt() will find it.
Packit Service 603f59
	 */
Packit Service 603f59
	    if(opt[GOx1][GOx2 + 1] != '\0') {
Packit Service 603f59
		GObk[0] = GOx1;
Packit Service 603f59
		GObk[1] = ++GOx2;
Packit Service 603f59
		GOv = &opt[GOx1++][GOx2];
Packit Service 603f59
	    } else if (++GOx1 >= ct)
Packit Service 603f59
		GOv = (char *)NULL;
Packit Service 603f59
	    else {
Packit Service 603f59
		GObk[0] = GOx1;
Packit Service 603f59
		GObk[1] = 0;
Packit Service 603f59
		GOv = opt[GOx1];
Packit Service 603f59
		if (strcmp(GOv, "--") == 0)
Packit Service 603f59
		    GOv = (char *)NULL;
Packit Service 603f59
		else
Packit Service 603f59
		    GOx1++;
Packit Service 603f59
	    }
Packit Service 603f59
	    GOx2 = 0;
Packit Service 603f59
	} else {
Packit Service 603f59
Packit Service 603f59
	/*
Packit Service 603f59
	 * The option character stands alone with no following value.
Packit Service 603f59
	 *
Packit Service 603f59
	 * Advance to the next option character.
Packit Service 603f59
	 */
Packit Service 603f59
	    if (opt[GOx1][++GOx2] == '\0') {
Packit Service 603f59
		GOx2 = 0;
Packit Service 603f59
		GOx1++;
Packit Service 603f59
	    }
Packit Service 603f59
	    GOv = (char *)NULL;
Packit Service 603f59
	}
Packit Service 603f59
/*
Packit Service 603f59
 * Return the option character.
Packit Service 603f59
 */
Packit Service 603f59
	return(c);
Packit Service 603f59
}
Packit Service 603f59
Packit Service 603f59
Packit Service 603f59
/*
Packit Service 603f59
 * sv_fmt_str() - save format string
Packit Service 603f59
 */
Packit Service 603f59
Packit Service 603f59
static char *
Packit Service 603f59
sv_fmt_str(f)
Packit Service 603f59
	char *f;			/* format string */
Packit Service 603f59
{
Packit Service 603f59
	char *cp;
Packit Service 603f59
	MALLOC_S l;
Packit Service 603f59
Packit Service 603f59
	l = (MALLOC_S)(strlen(f) + 1);
Packit Service 603f59
	if (!(cp = (char *)malloc(l))) {
Packit Service 603f59
	    (void) fprintf(stderr,
Packit Service 603f59
		"%s: can't allocate %d bytes for format: %s\n", Pn, (int)l, f);
Packit Service 603f59
	    Exit(1);
Packit Service 603f59
	}
Packit Service 603f59
	(void) snpf(cp, l, "%s", f);
Packit Service 603f59
	return(cp);
Packit Service 603f59
}