Blame print.c

Packit 6f02de
/*
Packit 6f02de
 * print.c - common print support functions for lsof
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * Copyright 1994 Purdue Research Foundation, West Lafayette, Indiana
Packit 6f02de
 * 47907.  All rights reserved.
Packit 6f02de
 *
Packit 6f02de
 * Written by Victor A. Abell
Packit 6f02de
 *
Packit 6f02de
 * This software is not subject to any license of the American Telephone
Packit 6f02de
 * and Telegraph Company or the Regents of the University of California.
Packit 6f02de
 *
Packit 6f02de
 * Permission is granted to anyone to use this software for any purpose on
Packit 6f02de
 * any computer system, and to alter it and redistribute it freely, subject
Packit 6f02de
 * to the following restrictions:
Packit 6f02de
 *
Packit 6f02de
 * 1. Neither the authors nor Purdue University are responsible for any
Packit 6f02de
 *    consequences of the use of this software.
Packit 6f02de
 *
Packit 6f02de
 * 2. The origin of this software must not be misrepresented, either by
Packit 6f02de
 *    explicit claim or by omission.  Credit to the authors and Purdue
Packit 6f02de
 *    University must appear in documentation and sources.
Packit 6f02de
 *
Packit 6f02de
 * 3. Altered versions must be plainly marked as such, and must not be
Packit 6f02de
 *    misrepresented as being the original software.
Packit 6f02de
 *
Packit 6f02de
 * 4. This notice may not be removed or altered.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
#ifndef lint
Packit 6f02de
static char copyright[] =
Packit 6f02de
"@(#) Copyright 1994 Purdue Research Foundation.\nAll rights reserved.\n";
Packit 6f02de
static char *rcsid = "$Id: print.c,v 1.56 2018/02/14 14:20:14 abe Exp $";
Packit 6f02de
#endif
Packit 6f02de
Packit 6f02de
Packit 6f02de
#include "lsof.h"
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * Local definitions, structures and function prototypes
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
#define HCINC		64		/* host cache size increase chunk */
Packit 6f02de
#define PORTHASHBUCKETS	128		/* port hash bucket count
Packit 6f02de
					 * !!MUST BE A POWER OF 2!! */
Packit 6f02de
#define	PORTTABTHRESH	10		/* threshold at which we will switch
Packit 6f02de
					 * from using getservbyport() to
Packit 6f02de
					 * getservent() -- see lkup_port()
Packit 6f02de
					 * and fill_porttab() */
Packit 6f02de
Packit 6f02de
struct hostcache {
Packit 6f02de
	unsigned char a[MAX_AF_ADDR];	/* numeric address */
Packit 6f02de
	int af;				/* address family -- e.g., AF_INET
Packit 6f02de
					 * or AF_INET6 */
Packit 6f02de
	char *name;			/* name */
Packit 6f02de
};
Packit 6f02de
Packit 6f02de
struct porttab {
Packit 6f02de
	int port;
Packit 6f02de
	MALLOC_S nl;			/* name length (excluding '\0') */
Packit 6f02de
	int ss;				/* service name status, 0 = lookup not
Packit 6f02de
					 * yet performed */
Packit 6f02de
	char *name;
Packit 6f02de
	struct porttab *next;
Packit 6f02de
};
Packit 6f02de
Packit 6f02de
Packit 6f02de
#if	defined(HASNORPC_H)
Packit 6f02de
static struct porttab **Pth[2] = { NULL, NULL };
Packit 6f02de
						/* port hash buckets:
Packit 6f02de
						 * Pth[0] for TCP service names
Packit 6f02de
						 * Pth[1] for UDP service names
Packit 6f02de
						 */
Packit 6f02de
#else	/* !defined(HASNORPC_H) */
Packit 6f02de
static struct porttab **Pth[4] = { NULL, NULL, NULL, NULL };
Packit 6f02de
						/* port hash buckets:
Packit 6f02de
						 * Pth[0] for TCP service names
Packit 6f02de
						 * Pth[1] for UDP service names
Packit 6f02de
						 * Pth[2] for TCP portmap info
Packit 6f02de
						 * Pth[3] for UDP portmap info
Packit 6f02de
						 */
Packit 6f02de
#endif	/* defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
#define HASHPORT(p)	(((((int)(p)) * 31415) >> 3) & (PORTHASHBUCKETS - 1))
Packit 6f02de
Packit 6f02de
Packit 6f02de
#if	!defined(HASNORPC_H)
Packit 6f02de
_PROTOTYPE(static void fill_portmap,(void));
Packit 6f02de
_PROTOTYPE(static void update_portmap,(struct porttab *pt, char *pn));
Packit 6f02de
#endif	/* !defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
_PROTOTYPE(static void fill_porttab,(void));
Packit 6f02de
_PROTOTYPE(static char *lkup_port,(int p, int pr, int src));
Packit 6f02de
_PROTOTYPE(static char *lkup_svcnam,(int h, int p, int pr, int ss));
Packit 6f02de
_PROTOTYPE(static int printinaddr,(void));
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * endnm() - locate end of Namech
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
char *
Packit 6f02de
endnm(sz)
Packit 6f02de
	size_t *sz;			/* returned remaining size */
Packit 6f02de
{
Packit 6f02de
	register char *s;
Packit 6f02de
	register size_t tsz;
Packit 6f02de
Packit 6f02de
	for (s = Namech, tsz = Namechl; *s; s++, tsz--)
Packit 6f02de
		;
Packit 6f02de
	*sz = tsz;
Packit 6f02de
	return(s);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
#if !defined(HASNORPC_H)
Packit 6f02de
/*
Packit 6f02de
 * fill_portmap() -- fill the RPC portmap program name table via a conversation
Packit 6f02de
 *		     with the portmapper
Packit 6f02de
 *
Packit 6f02de
 * The following copyright notice acknowledges that this function was adapted
Packit 6f02de
 * from getrpcportnam() of the source code of the OpenBSD netstat program.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
* Copyright (c) 1983, 1988, 1993
Packit 6f02de
*      The Regents of the University of California.  All rights reserved.
Packit 6f02de
*
Packit 6f02de
* Redistribution and use in source and binary forms, with or without
Packit 6f02de
* modification, are permitted provided that the following conditions
Packit 6f02de
* are met:
Packit 6f02de
* 1. Redistributions of source code must retain the above copyright
Packit 6f02de
*    notice, this list of conditions and the following disclaimer.
Packit 6f02de
* 2. Redistributions in binary form must reproduce the above copyright
Packit 6f02de
*    notice, this list of conditions and the following disclaimer in the
Packit 6f02de
*    documentation and/or other materials provided with the distribution.
Packit 6f02de
* 3. All advertising materials mentioning features or use of this software
Packit 6f02de
*    must display the following acknowledgement:
Packit 6f02de
*      This product includes software developed by the University of
Packit 6f02de
*      California, Berkeley and its contributors.
Packit 6f02de
* 4. Neither the name of the University nor the names of its contributors
Packit 6f02de
*    may be used to endorse or promote products derived from this software
Packit 6f02de
*    without specific prior written permission.
Packit 6f02de
*
Packit 6f02de
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
Packit 6f02de
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Packit 6f02de
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
Packit 6f02de
* ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
Packit 6f02de
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Packit 6f02de
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
Packit 6f02de
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
Packit 6f02de
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
Packit 6f02de
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
Packit 6f02de
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
Packit 6f02de
* SUCH DAMAGE.
Packit 6f02de
*/
Packit 6f02de
Packit 6f02de
static void
Packit 6f02de
fill_portmap()
Packit 6f02de
{
Packit 6f02de
	char buf[128], *cp, *nm;
Packit 6f02de
	CLIENT *c;
Packit 6f02de
	int h, port, pr;
Packit 6f02de
	MALLOC_S nl;
Packit 6f02de
	struct pmaplist *p = (struct pmaplist *)NULL;
Packit 6f02de
	struct porttab *pt;
Packit 6f02de
	struct rpcent *r;
Packit 6f02de
	struct TIMEVAL_LSOF tm;
Packit 6f02de
Packit 6f02de
#if	!defined(CAN_USE_CLNT_CREATE)
Packit 6f02de
	struct hostent *he;
Packit 6f02de
	struct sockaddr_in ia;
Packit 6f02de
	int s = RPC_ANYSOCK;
Packit 6f02de
#endif	/* !defined(CAN_USE_CLNT_CREATE) */
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * Construct structures for communicating with the portmapper.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
#if	!defined(CAN_USE_CLNT_CREATE)
Packit 6f02de
	zeromem(&ia, sizeof(ia));
Packit 6f02de
	ia.sin_family = AF_INET;
Packit 6f02de
	if ((he = gethostbyname("localhost")))
Packit 6f02de
	    MEMMOVE((caddr_t)&ia.sin_addr, he->h_addr, he->h_length);
Packit 6f02de
	ia.sin_port = htons(PMAPPORT);
Packit 6f02de
#endif	/* !defined(CAN_USE_CLNT_CREATE) */
Packit 6f02de
Packit 6f02de
	tm.tv_sec = 60;
Packit 6f02de
	tm.tv_usec = 0;
Packit 6f02de
/*
Packit 6f02de
 * Get an RPC client handle.  Then ask for a dump of the port map.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
#if	defined(CAN_USE_CLNT_CREATE)
Packit 6f02de
	if (!(c = clnt_create("localhost", PMAPPROG, PMAPVERS, "tcp")))
Packit 6f02de
#else	/* !defined(CAN_USE_CLNT_CREATE) */
Packit 6f02de
	if (!(c = clnttcp_create(&ia, PMAPPROG, PMAPVERS, &s, 0, 0)))
Packit 6f02de
#endif	/* defined(CAN_USE_CLNT_CREATE) */
Packit 6f02de
Packit 6f02de
	    return;
Packit 6f02de
	if (clnt_call(c, PMAPPROC_DUMP, XDR_VOID, NULL, XDR_PMAPLIST,
Packit 6f02de
		      (caddr_t)&p, tm)
Packit 6f02de
	!= RPC_SUCCESS) {
Packit 6f02de
	    clnt_destroy(c);
Packit 6f02de
	    return;
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Loop through the port map dump, creating portmap table entries from TCP
Packit 6f02de
 * and UDP members.
Packit 6f02de
 */
Packit 6f02de
	for (; p; p = p->pml_next) {
Packit 6f02de
	
Packit 6f02de
	/*
Packit 6f02de
	 * Determine the port map entry's protocol; ignore all but TCP and UDP.
Packit 6f02de
	 */
Packit 6f02de
	    if (p->pml_map.pm_prot == IPPROTO_TCP)
Packit 6f02de
		pr = 2;
Packit 6f02de
	    else if (p->pml_map.pm_prot == IPPROTO_UDP)
Packit 6f02de
		pr = 3;
Packit 6f02de
	    else
Packit 6f02de
		continue;
Packit 6f02de
	/*
Packit 6f02de
	 * See if there's already a portmap entry for this port.  If there is,
Packit 6f02de
	 * ignore this entry.
Packit 6f02de
	 */
Packit 6f02de
	    h = HASHPORT((port = (int)p->pml_map.pm_port));
Packit 6f02de
	    for (pt = Pth[pr][h]; pt; pt = pt->next) {
Packit 6f02de
		if (pt->port == port)
Packit 6f02de
		    break;
Packit 6f02de
	    }
Packit 6f02de
	    if (pt)
Packit 6f02de
		continue;
Packit 6f02de
	/*
Packit 6f02de
	 * Save the registration name or number.
Packit 6f02de
	 */
Packit 6f02de
	    cp = (char *)NULL;
Packit 6f02de
	    if ((r = (struct rpcent *)getrpcbynumber(p->pml_map.pm_prog))) {
Packit 6f02de
		if (r->r_name && strlen(r->r_name))
Packit 6f02de
		    cp = r->r_name;
Packit 6f02de
	    }
Packit 6f02de
	    if (!cp) {
Packit 6f02de
		(void) snpf(buf, sizeof(buf), "%lu",
Packit 6f02de
			    (unsigned long)p->pml_map.pm_prog);
Packit 6f02de
		cp = buf;
Packit 6f02de
	    }
Packit 6f02de
	    if (!strlen(cp))
Packit 6f02de
		continue;
Packit 6f02de
	/*
Packit 6f02de
	 * Allocate space for the portmap name entry and copy it there.
Packit 6f02de
	 */
Packit 6f02de
	    if (!(nm = mkstrcpy(cp, &nl))) {
Packit 6f02de
		(void) fprintf(stderr,
Packit 6f02de
		    "%s: can't allocate space for portmap entry: ", Pn);
Packit 6f02de
		safestrprt(cp, stderr, 1);
Packit 6f02de
		Exit(1);
Packit 6f02de
	    }
Packit 6f02de
	    if (!nl) {
Packit 6f02de
		(void) free((FREE_P *)nm);
Packit 6f02de
		continue;
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * Allocate and fill a porttab struct entry for the portmap table.
Packit 6f02de
	 * Link it to the head of its hash bucket, and make it the new head.
Packit 6f02de
	 */
Packit 6f02de
	    if (!(pt = (struct porttab *)malloc(sizeof(struct porttab)))) {
Packit 6f02de
		(void) fprintf(stderr,
Packit 6f02de
		    "%s: can't allocate porttab entry for portmap: ", Pn);
Packit 6f02de
		safestrprt(nm, stderr, 1);
Packit 6f02de
		Exit(1);
Packit 6f02de
	    }
Packit 6f02de
	    pt->name = nm;
Packit 6f02de
	    pt->nl = nl;
Packit 6f02de
	    pt->port = port;
Packit 6f02de
	    pt->next = Pth[pr][h];
Packit 6f02de
	    pt->ss = 0;
Packit 6f02de
	    Pth[pr][h] = pt;
Packit 6f02de
	}
Packit 6f02de
	clnt_destroy(c);
Packit 6f02de
}
Packit 6f02de
#endif	/* !defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * fill_porttab() -- fill the TCP and UDP service name port table with a
Packit 6f02de
 *		     getservent() scan
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
static void
Packit 6f02de
fill_porttab()
Packit 6f02de
{
Packit 6f02de
	int h, p, pr;
Packit 6f02de
	MALLOC_S nl;
Packit 6f02de
	char *nm;
Packit 6f02de
	struct porttab *pt;
Packit 6f02de
	struct servent *se;
Packit 6f02de
Packit 6f02de
	(void) endservent();
Packit 6f02de
/*
Packit 6f02de
 * Scan the services data base for TCP and UDP entries that have a non-null
Packit 6f02de
 * name associated with them.
Packit 6f02de
 */
Packit 6f02de
	(void) setservent(1);
Packit 6f02de
	while ((se = getservent())) {
Packit 6f02de
	    if (!se->s_name || !se->s_proto)
Packit 6f02de
		continue;
Packit 6f02de
	    if (strcasecmp(se->s_proto, "TCP") == 0)
Packit 6f02de
		pr = 0;
Packit 6f02de
	    else if (strcasecmp(se->s_proto, "UDP") == 0)
Packit 6f02de
		pr = 1;
Packit 6f02de
	    else
Packit 6f02de
		continue;
Packit 6f02de
	    if (!se->s_name || !strlen(se->s_name))
Packit 6f02de
		continue;
Packit 6f02de
	    p = ntohs(se->s_port);
Packit 6f02de
	/*
Packit 6f02de
	 * See if a port->service entry is already cached for this port and
Packit 6f02de
	 * prototcol.  If it is, leave it alone.
Packit 6f02de
	 */
Packit 6f02de
	    h = HASHPORT(p);
Packit 6f02de
	    for (pt = Pth[pr][h]; pt; pt = pt->next) {
Packit 6f02de
		if (pt->port == p)
Packit 6f02de
		    break;
Packit 6f02de
	    }
Packit 6f02de
	    if (pt)
Packit 6f02de
		continue;
Packit 6f02de
	/*
Packit 6f02de
	 * Add a new entry to the cache for this port and protocol.
Packit 6f02de
	 */
Packit 6f02de
	    if (!(nm = mkstrcpy(se->s_name, &nl))) {
Packit 6f02de
		(void) fprintf(stderr,
Packit 6f02de
		    "%s: can't allocate %d bytes for port %d name: %s\n",
Packit 6f02de
		    Pn, (int)(nl + 1), p, se->s_name);
Packit 6f02de
		Exit(1);
Packit 6f02de
	    }
Packit 6f02de
	    if (!nl) {
Packit 6f02de
		(void) free((FREE_P *)nm);
Packit 6f02de
		continue;
Packit 6f02de
	    }
Packit 6f02de
	    if (!(pt = (struct porttab *)malloc(sizeof(struct porttab)))) {
Packit 6f02de
		(void) fprintf(stderr,
Packit 6f02de
		    "%s: can't allocate porttab entry for port %d: %s\n",
Packit 6f02de
		    Pn, p, se->s_name);
Packit 6f02de
		Exit(1);
Packit 6f02de
	    }
Packit 6f02de
	    pt->name = nm;
Packit 6f02de
	    pt->nl = nl - 1;
Packit 6f02de
	    pt->port = p;
Packit 6f02de
	    pt->next = Pth[pr][h];
Packit 6f02de
	    pt->ss = 0;
Packit 6f02de
	    Pth[pr][h] = pt;
Packit 6f02de
	}
Packit 6f02de
	(void) endservent();
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * gethostnm() - get host name
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
char *
Packit 6f02de
gethostnm(ia, af)
Packit 6f02de
	unsigned char *ia;		/* Internet address */
Packit 6f02de
	int af;				/* address family -- e.g., AF_INET
Packit 6f02de
					 * or AF_INET6 */
Packit 6f02de
{
Packit 6f02de
	int al = MIN_AF_ADDR;
Packit 6f02de
	char hbuf[256];
Packit 6f02de
	static struct hostcache *hc = (struct hostcache *)NULL;
Packit 6f02de
	static int hcx = 0;
Packit 6f02de
	char *hn, *np;
Packit 6f02de
	struct hostent *he = (struct hostent *)NULL;
Packit 6f02de
	int i, j;
Packit 6f02de
	MALLOC_S len;
Packit 6f02de
	static int nhc = 0;
Packit 6f02de
/*
Packit 6f02de
 * Search cache.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
#if	defined(HASIPv6)
Packit 6f02de
	if (af == AF_INET6)
Packit 6f02de
	    al = MAX_AF_ADDR;
Packit 6f02de
#endif	/* defined(HASIPv6) */
Packit 6f02de
Packit 6f02de
	for (i = 0; i < hcx; i++) {
Packit 6f02de
	    if (af != hc[i].af)
Packit 6f02de
		continue;
Packit 6f02de
	    for (j = 0; j < al; j++) {
Packit 6f02de
		if (ia[j] != hc[i].a[j])
Packit 6f02de
		    break;
Packit 6f02de
	    }
Packit 6f02de
	    if (j >= al)
Packit 6f02de
		return(hc[i].name);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * If -n has been specified, construct a numeric address.  Otherwise, look up
Packit 6f02de
 * host name by address.  If that fails, or if there is no name in the returned
Packit 6f02de
 * hostent structure, construct a numeric version of the address.
Packit 6f02de
 */
Packit 6f02de
	if (Fhost)
Packit 6f02de
	    he = gethostbyaddr((char *)ia, al, af);
Packit 6f02de
	if (!he || !he->h_name) {
Packit 6f02de
Packit 6f02de
#if	defined(HASIPv6)
Packit 6f02de
	    if (af == AF_INET6) {
Packit 6f02de
Packit 6f02de
	    /*
Packit 6f02de
	     * Since IPv6 numeric addresses use `:' as a separator, enclose
Packit 6f02de
	     * them in brackets.
Packit 6f02de
	     */
Packit 6f02de
		hbuf[0] = '[';
Packit 6f02de
		if (!inet_ntop(af, ia, hbuf + 1, sizeof(hbuf) - 3)) {
Packit 6f02de
		    (void) snpf(&hbuf[1], (sizeof(hbuf) - 1),
Packit 6f02de
			"can't format IPv6 address]");
Packit 6f02de
		} else {
Packit 6f02de
		    len = strlen(hbuf);
Packit 6f02de
		    (void) snpf(&hbuf[len], sizeof(hbuf) - len, "]");
Packit 6f02de
		}
Packit 6f02de
	    } else
Packit 6f02de
#endif	/* defined(HASIPv6) */
Packit 6f02de
Packit 6f02de
	    if (af == AF_INET)
Packit 6f02de
		(void) snpf(hbuf, sizeof(hbuf), "%u.%u.%u.%u", ia[0], ia[1],
Packit 6f02de
			    ia[2], ia[3]);
Packit 6f02de
	    else
Packit 6f02de
		(void) snpf(hbuf, sizeof(hbuf), "(unknown AF value: %d)", af);
Packit 6f02de
	    hn = hbuf;
Packit 6f02de
	} else
Packit 6f02de
	    hn = (char *)he->h_name;
Packit 6f02de
/*
Packit 6f02de
 * Allocate space for name and copy name to it.
Packit 6f02de
 */
Packit 6f02de
	if (!(np = mkstrcpy(hn, (MALLOC_S *)NULL))) {
Packit 6f02de
	    (void) fprintf(stderr, "%s: no space for host name: ", Pn);
Packit 6f02de
	    safestrprt(hn, stderr, 1);
Packit 6f02de
	    Exit(1);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Add address/name entry to cache.  Allocate cache space in HCINC chunks.
Packit 6f02de
 */
Packit 6f02de
	if (hcx >= nhc) {
Packit 6f02de
	    nhc += HCINC;
Packit 6f02de
	    len = (MALLOC_S)(nhc * sizeof(struct hostcache));
Packit 6f02de
	    if (!hc)
Packit 6f02de
		hc = (struct hostcache *)malloc(len);
Packit 6f02de
	    else
Packit 6f02de
		hc = (struct hostcache *)realloc((MALLOC_P *)hc, len);
Packit 6f02de
	    if (!hc) {
Packit 6f02de
		(void) fprintf(stderr, "%s: no space for host cache\n", Pn);
Packit 6f02de
		Exit(1);
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
	hc[hcx].af = af;
Packit 6f02de
	for (i = 0; i < al; i++) {
Packit 6f02de
	    hc[hcx].a[i] = ia[i];
Packit 6f02de
	}
Packit 6f02de
	hc[hcx++].name = np;
Packit 6f02de
	return(np);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * lkup_port() - look up port for protocol
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
static char *
Packit 6f02de
lkup_port(p, pr, src)
Packit 6f02de
	int p;				/* port number */
Packit 6f02de
	int pr;				/* protocol index: 0 = tcp, 1 = udp */
Packit 6f02de
	int src;			/* port source: 0 = local
Packit 6f02de
					 *		1 = foreign */
Packit 6f02de
{
Packit 6f02de
	int h, nh;
Packit 6f02de
	MALLOC_S nl;
Packit 6f02de
	char *nm, *pn;
Packit 6f02de
	static char pb[128];
Packit 6f02de
	static int pm = 0;
Packit 6f02de
	struct porttab *pt;
Packit 6f02de
/*
Packit 6f02de
 * If the hash buckets haven't been allocated, do so.
Packit 6f02de
 */
Packit 6f02de
	if (!Pth[0]) {
Packit 6f02de
Packit 6f02de
#if	defined(HASNORPC_H)
Packit 6f02de
	    nh = 2;
Packit 6f02de
#else	/* !defined(HASNORPC_H) */
Packit 6f02de
	    nh = FportMap ? 4 : 2;
Packit 6f02de
#endif	/* defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
	    for (h = 0; h < nh; h++) {
Packit 6f02de
		if (!(Pth[h] = (struct porttab **)calloc(PORTHASHBUCKETS,
Packit 6f02de
				sizeof(struct porttab *))))
Packit 6f02de
		{
Packit 6f02de
		    (void) fprintf(stderr,
Packit 6f02de
		      "%s: can't allocate %d bytes for %s %s hash buckets\n",
Packit 6f02de
		      Pn,
Packit 6f02de
		      (int)(2 * (PORTHASHBUCKETS * sizeof(struct porttab *))),
Packit 6f02de
		      (h & 1) ? "UDP" : "TCP",
Packit 6f02de
		      (h > 1) ? "portmap" : "port");
Packit 6f02de
		    Exit(1);
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
Packit 6f02de
#if	!defined(HASNORPC_H)
Packit 6f02de
/*
Packit 6f02de
 * If we're looking up program names for portmapped ports, make sure the
Packit 6f02de
 * portmap table has been loaded.
Packit 6f02de
 */
Packit 6f02de
	if (FportMap && !pm) {
Packit 6f02de
	    (void) fill_portmap();
Packit 6f02de
	    pm++;
Packit 6f02de
	}
Packit 6f02de
#endif	/* !defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * Hash the port and see if its name has been cached.  Look for a local
Packit 6f02de
 * port first in the portmap, if portmap searching is enabled.
Packit 6f02de
 */
Packit 6f02de
	h = HASHPORT(p);
Packit 6f02de
Packit 6f02de
#if	!defined(HASNORPC_H)
Packit 6f02de
	if (!src && FportMap) {
Packit 6f02de
	    for (pt = Pth[pr+2][h]; pt; pt = pt->next) {
Packit 6f02de
		if (pt->port != p)
Packit 6f02de
		    continue;
Packit 6f02de
		if (!pt->ss) {
Packit 6f02de
		    pn = Fport ? lkup_svcnam(h, p, pr, 0) : (char *)NULL;
Packit 6f02de
		    if (!pn) {
Packit 6f02de
			(void) snpf(pb, sizeof(pb), "%d", p);
Packit 6f02de
			pn = pb;
Packit 6f02de
		    }
Packit 6f02de
		    (void) update_portmap(pt, pn);
Packit 6f02de
		}
Packit 6f02de
		return(pt->name);
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
#endif	/* !defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
	for (pt = Pth[pr][h]; pt; pt = pt->next) {
Packit 6f02de
	    if (pt->port == p)
Packit 6f02de
		return(pt->name);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Search for a possible service name, unless the -P option has been specified.
Packit 6f02de
 *
Packit 6f02de
 * If there is no service name, return a %d conversion.
Packit 6f02de
 *
Packit 6f02de
 * Don't cache %d conversions; a zero port number is a %d conversion that
Packit 6f02de
 * is represented by "*".
Packit 6f02de
 */
Packit 6f02de
	pn = Fport ? lkup_svcnam(h, p, pr, 1) : (char *)NULL;
Packit 6f02de
	if (!pn || !strlen(pn)) {
Packit 6f02de
	    if (p) {
Packit 6f02de
		(void) snpf(pb, sizeof(pb), "%d", p);
Packit 6f02de
		return(pb);
Packit 6f02de
	    } else
Packit 6f02de
		return("*");
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Allocate a new porttab entry for the TCP or UDP service name.
Packit 6f02de
 */
Packit 6f02de
	if (!(pt = (struct porttab *)malloc(sizeof(struct porttab)))) {
Packit 6f02de
	    (void) fprintf(stderr,
Packit 6f02de
		"%s: can't allocate porttab entry for port %d\n", Pn, p);
Packit 6f02de
	    Exit(1);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Allocate space for the name; copy it to the porttab entry; and link the
Packit 6f02de
 * porttab entry to its hash bucket.
Packit 6f02de
 *
Packit 6f02de
 * Return a pointer to the name.
Packit 6f02de
 */
Packit 6f02de
	if (!(nm = mkstrcpy(pn, &nl))) {
Packit 6f02de
	    (void) fprintf(stderr,
Packit 6f02de
		"%s: can't allocate space for port name: ", Pn);
Packit 6f02de
	    safestrprt(pn, stderr, 1);
Packit 6f02de
	    Exit(1);
Packit 6f02de
	}
Packit 6f02de
	pt->name = nm;
Packit 6f02de
	pt->nl = nl;
Packit 6f02de
	pt->port = p;
Packit 6f02de
	pt->next = Pth[pr][h];
Packit 6f02de
	pt->ss = 0;
Packit 6f02de
	Pth[pr][h] = pt;
Packit 6f02de
	return(nm);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * lkup_svcnam() - look up service name for port
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
static char *
Packit 6f02de
lkup_svcnam(h, p, pr, ss)
Packit 6f02de
	int h;				/* porttab hash index */
Packit 6f02de
	int p;				/* port number */
Packit 6f02de
	int pr;				/* protocol: 0 = TCP, 1 = UDP */
Packit 6f02de
	int ss;				/* search status: 1 = Pth[pr][h]
Packit 6f02de
					 *		  already searched */
Packit 6f02de
{
Packit 6f02de
	static int fl[PORTTABTHRESH];
Packit 6f02de
	static int fln = 0;
Packit 6f02de
	static int gsbp = 0;
Packit 6f02de
	int i;
Packit 6f02de
	struct porttab *pt;
Packit 6f02de
	static int ptf = 0;
Packit 6f02de
	struct servent *se;
Packit 6f02de
/*
Packit 6f02de
 * Do nothing if -P has been specified.
Packit 6f02de
 */
Packit 6f02de
	if (!Fport)
Packit 6f02de
	    return((char *)NULL);
Packit 6f02de
Packit 6f02de
	for (;;) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Search service name cache, if it hasn't already been done.
Packit 6f02de
	 * Return the name of a match.
Packit 6f02de
	 */
Packit 6f02de
	    if (!ss) {
Packit 6f02de
		for (pt = Pth[pr][h]; pt; pt = pt->next) {
Packit 6f02de
		    if (pt->port == p)
Packit 6f02de
			return(pt->name);
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
/*
Packit 6f02de
 * If fill_porttab() has been called, there is no service name.
Packit 6f02de
 *
Packit 6f02de
 * Do PORTTABTHRES getservbport() calls, remembering the failures, so they
Packit 6f02de
 * won't be repeated.
Packit 6f02de
 *
Packit 6f02de
 * After PORTABTHRESH getservbyport() calls, call fill_porttab() once,
Packit 6f02de
 */
Packit 6f02de
	    if (ptf)
Packit 6f02de
		break;
Packit 6f02de
	    if (gsbp < PORTTABTHRESH) {
Packit 6f02de
		for (i = 0; i < fln; i++) {
Packit 6f02de
		    if (fl[i] == p)
Packit 6f02de
			return((char *)NULL);
Packit 6f02de
		}
Packit 6f02de
		gsbp++;
Packit 6f02de
		if ((se = getservbyport(htons(p), pr ? "udp" : "tcp")))
Packit 6f02de
		    return(se->s_name);
Packit 6f02de
		if (fln < PORTTABTHRESH)
Packit 6f02de
		    fl[fln++] = p;
Packit 6f02de
		return((char *)NULL);
Packit 6f02de
	    }
Packit 6f02de
	    (void) fill_porttab();
Packit 6f02de
	    ptf++;
Packit 6f02de
	    ss = 0;
Packit 6f02de
	}
Packit 6f02de
	return((char *)NULL);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * print_file() - print file
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
void
Packit 6f02de
print_file()
Packit 6f02de
{
Packit 6f02de
	char buf[128];
Packit 6f02de
	char *cp = (char *)NULL;
Packit 6f02de
	dev_t dev;
Packit 6f02de
	int devs, len;
Packit 6f02de
Packit 6f02de
	if (PrPass && !Hdr) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Print the header line if this is the second pass and the
Packit 6f02de
	 * header hasn't already been printed.
Packit 6f02de
	 */
Packit 6f02de
	    (void) printf("%-*.*s %*s", CmdColW, CmdColW, CMDTTL, PidColW,
Packit 6f02de
		PIDTTL);
Packit 6f02de
Packit 6f02de
#if	defined(HASTASKS)
Packit 6f02de
	    if (TaskPrtTid)
Packit 6f02de
		(void) printf(" %*s", TaskTidColW, TASKTIDTTL);
Packit 6f02de
	    if (TaskPrtCmd)
Packit 6f02de
		(void) printf(" %-*.*s", TaskCmdColW, TaskCmdColW, TASKCMDTTL);
Packit 6f02de
#endif	/* defined(HASTASKS) */
Packit 6f02de
Packit 6f02de
#if	defined(HASZONES)
Packit 6f02de
	    if (Fzone)
Packit 6f02de
		(void) printf(" %-*s", ZoneColW, ZONETTL);
Packit 6f02de
#endif	/* defined(HASZONES) */
Packit 6f02de
Packit 6f02de
#if	defined(HASSELINUX)
Packit 6f02de
	    if (Fcntx)
Packit 6f02de
		(void) printf(" %-*s", CntxColW, CNTXTTL);
Packit 6f02de
#endif /* defined(HASSELINUX) */
Packit 6f02de
Packit 6f02de
#if	defined(HASPPID)
Packit 6f02de
	    if (Fppid)
Packit 6f02de
	 	(void) printf(" %*s", PpidColW, PPIDTTL);
Packit 6f02de
#endif	/* defined(HASPPID) */
Packit 6f02de
Packit 6f02de
	    if (Fpgid)
Packit 6f02de
		(void) printf(" %*s", PgidColW, PGIDTTL);
Packit 6f02de
	    (void) printf(" %*s %*s   %*s",
Packit 6f02de
		UserColW, USERTTL,
Packit 6f02de
		FdColW - 2, FDTTL,
Packit 6f02de
		TypeColW, TYPETTL);
Packit 6f02de
Packit 6f02de
#if	defined(HASFSTRUCT)
Packit 6f02de
	    if (Fsv) {
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSADDR)
Packit 6f02de
		if (Fsv & FSV_FA)
Packit 6f02de
		    (void) printf(" %*s", FsColW, FSTTL);
Packit 6f02de
# endif	/* !defined(HASNOFSADDR) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSCOUNT)
Packit 6f02de
		if (Fsv & FSV_CT)
Packit 6f02de
		    (void) printf(" %*s", FcColW, FCTTL);
Packit 6f02de
# endif	/* !defined(HASNOFSCOUNT) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSFLAGS)
Packit 6f02de
		if (Fsv & FSV_FG)
Packit 6f02de
		    (void) printf(" %*s", FgColW, FGTTL);
Packit 6f02de
# endif	/* !defined(HASNOFSFLAGS) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSNADDR)
Packit 6f02de
		if (Fsv & FSV_NI)
Packit 6f02de
		    (void) printf(" %*s", NiColW, NiTtl);
Packit 6f02de
# endif	/* !defined(HASNOFSNADDR) */
Packit 6f02de
Packit 6f02de
	    }
Packit 6f02de
#endif	/* defined(HASFSTRUCT) */
Packit 6f02de
Packit 6f02de
	    (void) printf(" %*s", DevColW, DEVTTL);
Packit 6f02de
	    if (Foffset)
Packit 6f02de
		(void) printf(" %*s", SzOffColW, OFFTTL);
Packit 6f02de
	    else if (Fsize)
Packit 6f02de
		(void) printf(" %*s", SzOffColW, SZTTL);
Packit 6f02de
	    else
Packit 6f02de
		(void) printf(" %*s", SzOffColW, SZOFFTTL);
Packit 6f02de
	    if (Fnlink)
Packit 6f02de
		(void) printf(" %*s", NlColW, NLTTL);
Packit 6f02de
	    (void) printf(" %*s %s\n", NodeColW, NODETTL, NMTTL);
Packit 6f02de
	    Hdr++;
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Size or print the command.
Packit 6f02de
 */
Packit 6f02de
	cp = (Lp->cmd && *Lp->cmd != '\0') ? Lp->cmd : "(unknown)";
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    len = safestrlen(cp, 2);
Packit 6f02de
	    if (CmdLim && (len > CmdLim))
Packit 6f02de
		len = CmdLim;
Packit 6f02de
	    if (len > CmdColW)
Packit 6f02de
		CmdColW = len;
Packit 6f02de
	} else
Packit 6f02de
	    safestrprtn(cp, CmdColW, stdout, 2);
Packit 6f02de
/*
Packit 6f02de
 * Size or print the process ID.
Packit 6f02de
 */
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    (void) snpf(buf, sizeof(buf), "%d", Lp->pid);
Packit 6f02de
	    if ((len = strlen(buf)) > PidColW)
Packit 6f02de
		PidColW = len;
Packit 6f02de
	} else
Packit 6f02de
	    (void) printf(" %*d", PidColW, Lp->pid);
Packit 6f02de
Packit 6f02de
#if	defined(HASTASKS)
Packit 6f02de
/*
Packit 6f02de
 * Size or print task ID and command name.
Packit 6f02de
 */
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    if ((cp = Lp->tcmd)) {
Packit 6f02de
		len = safestrlen(cp, 2);
Packit 6f02de
		if (TaskCmdLim && (len > TaskCmdLim))
Packit 6f02de
		    len = TaskCmdLim;
Packit 6f02de
		if (len > TaskCmdColW)
Packit 6f02de
		    TaskCmdColW = len;
Packit 6f02de
		TaskPrtCmd = 1;
Packit 6f02de
	    }
Packit 6f02de
	    if (Lp->tid) {
Packit 6f02de
		(void) snpf(buf, sizeof(buf), "%d", Lp->tid);
Packit 6f02de
		if ((len = strlen(buf)) >TaskTidColW)
Packit 6f02de
		    TaskTidColW = len;
Packit 6f02de
		TaskPrtTid = 1;
Packit 6f02de
	    }
Packit 6f02de
	} else {
Packit 6f02de
	    if (TaskPrtTid) {
Packit 6f02de
		if (Lp->tid)
Packit 6f02de
		    (void) printf(" %*d", TaskTidColW, Lp->tid);
Packit 6f02de
		else
Packit 6f02de
		    (void) printf(" %*s", TaskTidColW, "");
Packit 6f02de
	    }
Packit 6f02de
	    if (TaskPrtCmd) {
Packit 6f02de
		cp = Lp->tcmd ? Lp->tcmd : "";
Packit 6f02de
		printf(" ");
Packit 6f02de
		safestrprtn(cp, TaskCmdColW, stdout, 2);
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
#endif	/* defined(HASTASKS) */
Packit 6f02de
Packit 6f02de
#if	defined(HASZONES)
Packit 6f02de
/*
Packit 6f02de
 * Size or print the zone.
Packit 6f02de
 */
Packit 6f02de
	if (Fzone) {
Packit 6f02de
	    if (!PrPass) {
Packit 6f02de
		if (Lp->zn) {
Packit 6f02de
		    if ((len = strlen(Lp->zn)) > ZoneColW)
Packit 6f02de
			ZoneColW = len;
Packit 6f02de
		}
Packit 6f02de
	    } else
Packit 6f02de
		(void) printf(" %-*s", ZoneColW, Lp->zn ? Lp->zn : "");
Packit 6f02de
	}
Packit 6f02de
#endif	/* defined(HASZONES) */
Packit 6f02de
Packit 6f02de
#if	defined(HASSELINUX)
Packit 6f02de
/*
Packit 6f02de
 * Size or print the context.
Packit 6f02de
 */
Packit 6f02de
	if (Fcntx) {
Packit 6f02de
	    if (!PrPass) {
Packit 6f02de
		if (Lp->cntx) {
Packit 6f02de
		    if ((len = strlen(Lp->cntx)) > CntxColW)
Packit 6f02de
			CntxColW = len;
Packit 6f02de
		}
Packit 6f02de
	    } else
Packit 6f02de
		(void) printf(" %-*s", CntxColW, Lp->cntx ? Lp->cntx : "");
Packit 6f02de
	}
Packit 6f02de
#endif	/* defined(HASSELINUX) */
Packit 6f02de
Packit 6f02de
#if	defined(HASPPID)
Packit 6f02de
	if (Fppid) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Size or print the parent process ID.
Packit 6f02de
	 */
Packit 6f02de
	    if (!PrPass) {
Packit 6f02de
		(void) snpf(buf, sizeof(buf), "%d", Lp->ppid);
Packit 6f02de
		if ((len = strlen(buf)) > PpidColW)
Packit 6f02de
		    PpidColW = len;
Packit 6f02de
	    } else
Packit 6f02de
		(void) printf(" %*d", PpidColW, Lp->ppid);
Packit 6f02de
	}
Packit 6f02de
#endif	/* defined(HASPPID) */
Packit 6f02de
Packit 6f02de
	if (Fpgid) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Size or print the process group ID.
Packit 6f02de
	 */
Packit 6f02de
	    if (!PrPass) {
Packit 6f02de
		(void) snpf(buf, sizeof(buf), "%d", Lp->pgid);
Packit 6f02de
		if ((len = strlen(buf)) > PgidColW)
Packit 6f02de
		    PgidColW = len;
Packit 6f02de
	    } else
Packit 6f02de
		(void) printf(" %*d", PgidColW, Lp->pgid);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Size or print the user ID or login name.
Packit 6f02de
 */
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    if ((len = strlen(printuid((UID_ARG)Lp->uid, NULL))) > UserColW)
Packit 6f02de
		UserColW = len;
Packit 6f02de
	} else
Packit 6f02de
	    (void) printf(" %*.*s", UserColW, UserColW,
Packit 6f02de
		printuid((UID_ARG)Lp->uid, NULL));
Packit 6f02de
/*
Packit 6f02de
 * Size or print the file descriptor, access mode and lock status.
Packit 6f02de
 */
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    (void) snpf(buf, sizeof(buf), "%s%c%c",
Packit 6f02de
		Lf->fd,
Packit 6f02de
		(Lf->lock == ' ') ? Lf->access
Packit 6f02de
				  : (Lf->access == ' ') ? '-'
Packit 6f02de
							: Lf->access,
Packit 6f02de
		Lf->lock);
Packit 6f02de
	    if ((len = strlen(buf)) > FdColW)
Packit 6f02de
		FdColW = len;
Packit 6f02de
	} else
Packit 6f02de
	    (void) printf(" %*.*s%c%c", FdColW - 2, FdColW - 2, Lf->fd,
Packit 6f02de
		(Lf->lock == ' ') ? Lf->access
Packit 6f02de
				  : (Lf->access == ' ') ? '-'
Packit 6f02de
							: Lf->access,
Packit 6f02de
		Lf->lock);
Packit 6f02de
/*
Packit 6f02de
 * Size or print the type.
Packit 6f02de
 */
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    if ((len = strlen(Lf->type)) > TypeColW)
Packit 6f02de
		TypeColW = len;
Packit 6f02de
	} else
Packit 6f02de
	    (void) printf(" %*.*s", TypeColW, TypeColW, Lf->type);
Packit 6f02de
Packit 6f02de
#if	defined(HASFSTRUCT)
Packit 6f02de
/*
Packit 6f02de
 * Size or print the file structure address, file usage count, and node
Packit 6f02de
 * ID (address).
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
	if (Fsv) {
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSADDR)
Packit 6f02de
	    if (Fsv & FSV_FA) {
Packit 6f02de
		cp =  (Lf->fsv & FSV_FA) ? print_kptr(Lf->fsa, buf, sizeof(buf))
Packit 6f02de
					 : "";
Packit 6f02de
		if (!PrPass) {
Packit 6f02de
		    if ((len = strlen(cp)) > FsColW)
Packit 6f02de
			FsColW = len;
Packit 6f02de
		} else
Packit 6f02de
		    (void) printf(" %*.*s", FsColW, FsColW, cp);
Packit 6f02de
		    
Packit 6f02de
	    }
Packit 6f02de
# endif	/* !defined(HASNOFSADDR) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSCOUNT)
Packit 6f02de
	    if (Fsv & FSV_CT) {
Packit 6f02de
		if (Lf->fsv & FSV_CT) {
Packit 6f02de
		    (void) snpf(buf, sizeof(buf), "%ld", Lf->fct);
Packit 6f02de
		    cp = buf;
Packit 6f02de
		} else
Packit 6f02de
		    cp = "";
Packit 6f02de
		if (!PrPass) {
Packit 6f02de
		    if ((len = strlen(cp)) > FcColW)
Packit 6f02de
			FcColW = len;
Packit 6f02de
		} else
Packit 6f02de
		    (void) printf(" %*.*s", FcColW, FcColW, cp);
Packit 6f02de
	    }
Packit 6f02de
# endif	/* !defined(HASNOFSCOUNT) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSFLAGS)
Packit 6f02de
	    if (Fsv & FSV_FG) {
Packit 6f02de
		if ((Lf->fsv & FSV_FG) && (FsvFlagX || Lf->ffg || Lf->pof))
Packit 6f02de
		    cp = print_fflags(Lf->ffg, Lf->pof);
Packit 6f02de
		else
Packit 6f02de
		    cp = "";
Packit 6f02de
		if (!PrPass) {
Packit 6f02de
		    if ((len = strlen(cp)) > FgColW)
Packit 6f02de
			FgColW = len;
Packit 6f02de
		} else
Packit 6f02de
		    (void) printf(" %*.*s", FgColW, FgColW, cp);
Packit 6f02de
	    }
Packit 6f02de
# endif	/* !defined(HASNOFSFLAGS) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSNADDR)
Packit 6f02de
	    if (Fsv & FSV_NI) {
Packit 6f02de
		cp = (Lf->fsv & FSV_NI) ? print_kptr(Lf->fna, buf, sizeof(buf))
Packit 6f02de
					: "";
Packit 6f02de
		if (!PrPass) {
Packit 6f02de
		    if ((len = strlen(cp)) > NiColW)
Packit 6f02de
			NiColW = len;
Packit 6f02de
		} else
Packit 6f02de
		    (void) printf(" %*.*s", NiColW, NiColW, cp);
Packit 6f02de
	    }
Packit 6f02de
# endif	/* !defined(HASNOFSNADDR) */
Packit 6f02de
Packit 6f02de
	}
Packit 6f02de
#endif	/* defined(HASFSTRUCT) */
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * Size or print the device information.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
	if (Lf->rdev_def) {
Packit 6f02de
	    dev = Lf->rdev;
Packit 6f02de
	    devs = 1;
Packit 6f02de
	} else if (Lf->dev_def) {
Packit 6f02de
	    dev = Lf->dev;
Packit 6f02de
	    devs = 1;
Packit 6f02de
	} else
Packit 6f02de
	    devs = 0;
Packit 6f02de
	if (devs) {
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTDEV)
Packit 6f02de
	    cp = HASPRINTDEV(Lf, &dev;;
Packit 6f02de
#else	/* !defined(HASPRINTDEV) */
Packit 6f02de
	    (void) snpf(buf, sizeof(buf), "%u,%u", GET_MAJ_DEV(dev),
Packit 6f02de
		GET_MIN_DEV(dev));
Packit 6f02de
	    cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTDEV) */
Packit 6f02de
Packit 6f02de
	}
Packit 6f02de
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    if (devs)
Packit 6f02de
		len = strlen(cp);
Packit 6f02de
	    else if (Lf->dev_ch)
Packit 6f02de
		len = strlen(Lf->dev_ch);
Packit 6f02de
	    else
Packit 6f02de
		len = 0;
Packit 6f02de
	    if (len > DevColW)
Packit 6f02de
		DevColW = len;
Packit 6f02de
	} else {
Packit 6f02de
	    if (devs)
Packit 6f02de
		(void) printf(" %*.*s", DevColW, DevColW, cp);
Packit 6f02de
	    else {
Packit 6f02de
		if (Lf->dev_ch)
Packit 6f02de
		    (void) printf(" %*.*s", DevColW, DevColW, Lf->dev_ch);
Packit 6f02de
		else
Packit 6f02de
		    (void) printf(" %*.*s", DevColW, DevColW, "");
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Size or print the size or offset.
Packit 6f02de
 */
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    if (Lf->sz_def) {
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTSZ)
Packit 6f02de
		cp = HASPRINTSZ(Lf);
Packit 6f02de
#else	/* !defined(HASPRINTSZ) */
Packit 6f02de
		(void) snpf(buf, sizeof(buf), SzOffFmt_d, Lf->sz);
Packit 6f02de
		cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTSZ) */
Packit 6f02de
Packit 6f02de
		len = strlen(cp);
Packit 6f02de
	    } else if (Lf->off_def) {
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTOFF)
Packit 6f02de
		cp = HASPRINTOFF(Lf, 0);
Packit 6f02de
#else	/* !defined(HASPRINTOFF) */
Packit 6f02de
		(void) snpf(buf, sizeof(buf), SzOffFmt_0t, Lf->off);
Packit 6f02de
		cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTOFF) */
Packit 6f02de
Packit 6f02de
		len = strlen(cp);
Packit 6f02de
		if (OffDecDig && len > (OffDecDig + 2)) {
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTOFF)
Packit 6f02de
		    cp = HASPRINTOFF(Lf, 1);
Packit 6f02de
#else	/* !defined(HASPRINTOFF) */
Packit 6f02de
		    (void) snpf(buf, sizeof(buf), SzOffFmt_x, Lf->off);
Packit 6f02de
		    cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTOFF) */
Packit 6f02de
Packit 6f02de
		    len = strlen(cp);
Packit 6f02de
		}
Packit 6f02de
	    } else
Packit 6f02de
		len = 0;
Packit 6f02de
	    if (len > SzOffColW)
Packit 6f02de
		SzOffColW = len;
Packit 6f02de
	} else {
Packit 6f02de
	    putchar(' ');
Packit 6f02de
	    if (Lf->sz_def)
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTSZ)
Packit 6f02de
		(void) printf("%*.*s", SzOffColW, SzOffColW, HASPRINTSZ(Lf));
Packit 6f02de
#else	/* !defined(HASPRINTSZ) */
Packit 6f02de
		(void) printf(SzOffFmt_dv, SzOffColW, Lf->sz);
Packit 6f02de
#endif	/* defined(HASPRINTSZ) */
Packit 6f02de
Packit 6f02de
	    else if (Lf->off_def) {
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTOFF)
Packit 6f02de
		cp = HASPRINTOFF(Lf, 0);
Packit 6f02de
#else	/* !defined(HASPRINTOFF) */
Packit 6f02de
		(void) snpf(buf, sizeof(buf), SzOffFmt_0t, Lf->off);
Packit 6f02de
		cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTOFF) */
Packit 6f02de
Packit 6f02de
		if (OffDecDig && (int)strlen(cp) > (OffDecDig + 2)) {
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTOFF)
Packit 6f02de
		    cp = HASPRINTOFF(Lf, 1);
Packit 6f02de
#else	/* !defined(HASPRINTOFF) */
Packit 6f02de
		    (void) snpf(buf, sizeof(buf), SzOffFmt_x, Lf->off);
Packit 6f02de
		    cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTOFF) */
Packit 6f02de
Packit 6f02de
		}
Packit 6f02de
		(void) printf("%*.*s", SzOffColW, SzOffColW, cp);
Packit 6f02de
	    } else
Packit 6f02de
		(void) printf("%*.*s", SzOffColW, SzOffColW, "");
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Size or print the link count.
Packit 6f02de
 */
Packit 6f02de
	if (Fnlink) {
Packit 6f02de
	    if (Lf->nlink_def) {
Packit 6f02de
		(void) snpf(buf, sizeof(buf), " %ld", Lf->nlink);
Packit 6f02de
		cp = buf;
Packit 6f02de
	   } else
Packit 6f02de
		cp = "";
Packit 6f02de
	    if (!PrPass) {
Packit 6f02de
		if ((len = strlen(cp)) > NlColW)
Packit 6f02de
		    NlColW = len;
Packit 6f02de
	    } else
Packit 6f02de
		(void) printf(" %*s", NlColW, cp);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Size or print the inode information.
Packit 6f02de
 */
Packit 6f02de
	switch (Lf->inp_ty) {
Packit 6f02de
	case 1:
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTINO)
Packit 6f02de
	    cp = HASPRINTINO(Lf);
Packit 6f02de
#else	/* !defined(HASPRINTINO) */
Packit 6f02de
	    (void) snpf(buf, sizeof(buf), InodeFmt_d, Lf->inode);
Packit 6f02de
	    cp = buf;
Packit 6f02de
#endif	/* defined(HASPRINTINO) */
Packit 6f02de
Packit 6f02de
	    break;
Packit 6f02de
	case 2:
Packit 6f02de
	    if (Lf->iproto[0])
Packit 6f02de
		cp = Lf->iproto;
Packit 6f02de
	    else
Packit 6f02de
		cp = "";
Packit 6f02de
	    break;
Packit 6f02de
	case 3:
Packit 6f02de
	    (void) snpf(buf, sizeof(buf), InodeFmt_x, Lf->inode);
Packit 6f02de
	    cp = buf;
Packit 6f02de
	    break;
Packit 6f02de
	default:
Packit 6f02de
	    cp = "";
Packit 6f02de
	}
Packit 6f02de
	if (!PrPass) {
Packit 6f02de
	    if ((len = strlen(cp)) > NodeColW)
Packit 6f02de
		NodeColW = len;
Packit 6f02de
	} else {
Packit 6f02de
	    (void) printf(" %*.*s", NodeColW, NodeColW, cp);
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * If this is the second pass, print the name column.  (It doesn't need
Packit 6f02de
 * to be sized.)
Packit 6f02de
 */
Packit 6f02de
	if (PrPass) {
Packit 6f02de
	    putchar(' ');
Packit 6f02de
Packit 6f02de
#if	defined(HASPRINTNM)
Packit 6f02de
	    HASPRINTNM(Lf);
Packit 6f02de
#else	/* !defined(HASPRINTNM) */
Packit 6f02de
	    printname(1);
Packit 6f02de
#endif	/* defined(HASPRINTNM) */
Packit 6f02de
Packit 6f02de
	}
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * printinaddr() - print Internet addresses
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
static int
Packit 6f02de
printinaddr()
Packit 6f02de
{
Packit 6f02de
	int i, len, src;
Packit 6f02de
	char *host, *port;
Packit 6f02de
	int nl = Namechl - 1;
Packit 6f02de
	char *np = Namech;
Packit 6f02de
	char pbuf[32];
Packit 6f02de
/*
Packit 6f02de
 * Process local network address first.  If there's a foreign address,
Packit 6f02de
 * separate it from the local address with "->".
Packit 6f02de
 */
Packit 6f02de
	for (i = 0, *np = '\0'; i < 2; i++) {
Packit 6f02de
	    if (!Lf->li[i].af)
Packit 6f02de
		continue;
Packit 6f02de
	    host = port = (char *)NULL;
Packit 6f02de
	    if (i) {
Packit 6f02de
Packit 6f02de
	    /*
Packit 6f02de
	     * If this is the foreign address, insert the separator.
Packit 6f02de
	     */
Packit 6f02de
		if (nl < 2)
Packit 6f02de
Packit 6f02de
addr_too_long:
Packit 6f02de
Packit 6f02de
		    {
Packit 6f02de
			(void) snpf(Namech, Namechl,
Packit 6f02de
			    "network addresses too long");
Packit 6f02de
			return(1);
Packit 6f02de
		    }
Packit 6f02de
		(void) snpf(np, nl, "->");
Packit 6f02de
		np += 2;
Packit 6f02de
		nl -= 2;
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * Convert the address to a host name.
Packit 6f02de
	 */
Packit 6f02de
Packit 6f02de
#if	defined(HASIPv6)
Packit 6f02de
	    if ((Lf->li[i].af == AF_INET6
Packit 6f02de
	    &&   IN6_IS_ADDR_UNSPECIFIED(&Lf->li[i].ia.a6))
Packit 6f02de
	    ||  (Lf->li[i].af == AF_INET
Packit 6f02de
	    &&    Lf->li[i].ia.a4.s_addr == INADDR_ANY))
Packit 6f02de
		host ="*";
Packit 6f02de
	    else
Packit 6f02de
		host = gethostnm((unsigned char *)&Lf->li[i].ia, Lf->li[i].af);
Packit 6f02de
#else /* !defined(HASIPv6) */
Packit 6f02de
	    if (Lf->li[i].ia.a4.s_addr == INADDR_ANY)
Packit 6f02de
		host ="*";
Packit 6f02de
	    else
Packit 6f02de
		host = gethostnm((unsigned char *)&Lf->li[i].ia, Lf->li[i].af);
Packit 6f02de
#endif	/* defined(HASIPv6) */
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Process the port number.
Packit 6f02de
	 */
Packit 6f02de
	    if (Lf->li[i].p > 0) {
Packit 6f02de
Packit 6f02de
		if (Fport
Packit 6f02de
Packit 6f02de
#if	!defined(HASNORPC_H)
Packit 6f02de
		||  FportMap
Packit 6f02de
#endif	/* defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
		) {
Packit 6f02de
Packit 6f02de
		/*
Packit 6f02de
		 * If converting port numbers to service names, or looking
Packit 6f02de
		 * up portmap program names and numbers, do so by protocol.
Packit 6f02de
		 *
Packit 6f02de
		 * Identify the port source as local if: 1) it comes from the
Packit 6f02de
		 * local entry (0) of the file's Internet address array; or
Packit 6f02de
		 * 2) it comes from  the foreign entry (1), and the foreign
Packit 6f02de
		 * Internet address matches the local one; or 3) it is the
Packit 6f02de
		 * loopback address 127.0.0.1.  (Test 2 may not always work
Packit 6f02de
		 * -- e.g., on hosts with multiple interfaces.)
Packit 6f02de
		 */
Packit 6f02de
#if	!defined(HASNORPC_H)
Packit 6f02de
		    if ((src = i) && FportMap) {
Packit 6f02de
Packit 6f02de
# if	defined(HASIPv6)
Packit 6f02de
			if (Lf->li[0].af == AF_INET6) {
Packit 6f02de
			    if (IN6_IS_ADDR_LOOPBACK(&Lf->li[i].ia.a6)
Packit 6f02de
			    ||  IN6_ARE_ADDR_EQUAL(&Lf->li[0].ia.a6,
Packit 6f02de
						   &Lf->li[1].ia.a6)
Packit 6f02de
			    )
Packit 6f02de
				src = 0;
Packit 6f02de
			} else
Packit 6f02de
# endif	/* defined(HASIPv6) */
Packit 6f02de
Packit 6f02de
			if (Lf->li[0].af == AF_INET) {
Packit 6f02de
			    if (Lf->li[i].ia.a4.s_addr == htonl(INADDR_LOOPBACK)
Packit 6f02de
			    ||  Lf->li[0].ia.a4.s_addr == Lf->li[1].ia.a4.s_addr
Packit 6f02de
			    )
Packit 6f02de
				src = 0;
Packit 6f02de
			}
Packit 6f02de
		    }
Packit 6f02de
#endif	/* !defined(HASNORPC_H) */
Packit 6f02de
Packit 6f02de
		    if (strcasecmp(Lf->iproto, "TCP") == 0)
Packit 6f02de
			port = lkup_port(Lf->li[i].p, 0, src);
Packit 6f02de
		    else if (strcasecmp(Lf->iproto, "UDP") == 0)
Packit 6f02de
			port = lkup_port(Lf->li[i].p, 1, src);
Packit 6f02de
		}
Packit 6f02de
		if (!port) {
Packit 6f02de
		    (void) snpf(pbuf, sizeof(pbuf), "%d", Lf->li[i].p);
Packit 6f02de
		    port = pbuf;
Packit 6f02de
		}
Packit 6f02de
	    } else if (Lf->li[i].p == 0)
Packit 6f02de
		port = "*";
Packit 6f02de
	/*
Packit 6f02de
	 * Enter the host name.
Packit 6f02de
	 */
Packit 6f02de
	    if (host) {
Packit 6f02de
		if ((len = strlen(host)) > nl)
Packit 6f02de
		    goto addr_too_long;
Packit 6f02de
		if (len) {
Packit 6f02de
		    (void) snpf(np, nl, "%s", host);
Packit 6f02de
		    np += len;
Packit 6f02de
		    nl -= len;
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * Enter the port number, preceded by a colon.
Packit 6f02de
	 */
Packit 6f02de
	    if (port) {
Packit 6f02de
		if (((len = strlen(port)) + 1) >= nl)
Packit 6f02de
		    goto addr_too_long;
Packit 6f02de
		(void) snpf(np, nl, ":%s", port);
Packit 6f02de
		np += len + 1;
Packit 6f02de
		nl -= len - 1;
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
	if (Namech[0]) {
Packit 6f02de
	    safestrprt(Namech, stdout, 0);
Packit 6f02de
	    return(1);
Packit 6f02de
	}
Packit 6f02de
	return(0);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * print_init() - initialize for printing
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
void
Packit 6f02de
print_init()
Packit 6f02de
{
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * Preset standard values.
Packit 6f02de
 */
Packit 6f02de
	PrPass = (Ffield || Fterse) ? 1 : 0;
Packit 6f02de
	LastPid = -1;
Packit 6f02de
	TaskPrtCmd = TaskPrtTid = 0;
Packit 6f02de
/*
Packit 6f02de
 * Size columns by their titles.
Packit 6f02de
 */
Packit 6f02de
	CmdColW = strlen(CMDTTL);
Packit 6f02de
	DevColW = strlen(DEVTTL);
Packit 6f02de
	FdColW = strlen(FDTTL);
Packit 6f02de
	if (Fnlink)
Packit 6f02de
	    NlColW = strlen(NLTTL);
Packit 6f02de
	NmColW = strlen(NMTTL);
Packit 6f02de
	NodeColW = strlen(NODETTL);
Packit 6f02de
	PgidColW = strlen(PGIDTTL);
Packit 6f02de
	PidColW = strlen(PIDTTL);
Packit 6f02de
	PpidColW = strlen(PPIDTTL);
Packit 6f02de
	if (Fsize)
Packit 6f02de
	    SzOffColW = strlen(SZTTL);
Packit 6f02de
	else if (Foffset)
Packit 6f02de
	    SzOffColW = strlen(OFFTTL);
Packit 6f02de
	else
Packit 6f02de
	    SzOffColW = strlen(SZOFFTTL);
Packit 6f02de
Packit 6f02de
#if	defined(HASTASKS)
Packit 6f02de
	TaskCmdColW = strlen(TASKCMDTTL);
Packit 6f02de
	TaskTidColW = strlen(TASKTIDTTL);
Packit 6f02de
#endif	/* defined(HASTASKS) */
Packit 6f02de
Packit 6f02de
	TypeColW = strlen(TYPETTL);
Packit 6f02de
	UserColW = strlen(USERTTL);
Packit 6f02de
Packit 6f02de
#if	defined(HASFSTRUCT)
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSADDR)
Packit 6f02de
	FsColW = strlen(FSTTL);
Packit 6f02de
# endif	/* !defined(HASNOFSADDR) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSCOUNT)
Packit 6f02de
	FcColW = strlen(FCTTL);
Packit 6f02de
# endif	/* !defined(HASNOFSCOUNT) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSFLAGS)
Packit 6f02de
	FgColW = strlen(FGTTL);
Packit 6f02de
# endif	/* !defined(HASNOFSFLAGS) */
Packit 6f02de
Packit 6f02de
# if	!defined(HASNOFSNADDR)
Packit 6f02de
	NiColW = strlen(NiTtl);
Packit 6f02de
# endif	/* !defined(HASNOFSNADDR) */
Packit 6f02de
#endif	/* defined(HASFSTRUCT) */
Packit 6f02de
Packit 6f02de
#if	defined(HASSELINUX)
Packit 6f02de
	if (Fcntx)
Packit 6f02de
	    CntxColW = strlen(CNTXTTL);
Packit 6f02de
#endif	/* defined(HASSELINUX) */
Packit 6f02de
Packit 6f02de
#if	defined(HASZONES)
Packit 6f02de
	if (Fzone)
Packit 6f02de
	    ZoneColW = strlen(ZONETTL);
Packit 6f02de
#endif	/* defined(HASZONES) */
Packit 6f02de
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
#if	!defined(HASPRIVPRIPP)
Packit 6f02de
/*
Packit 6f02de
 * printiproto() - print Internet protocol name
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
void
Packit 6f02de
printiproto(p)
Packit 6f02de
	int p;				/* protocol number */
Packit 6f02de
{
Packit 6f02de
	int i;
Packit 6f02de
	static int m = -1;
Packit 6f02de
	char *s;
Packit 6f02de
Packit 6f02de
	switch (p) {
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TCP)
Packit 6f02de
	case IPPROTO_TCP:
Packit 6f02de
	    s = "TCP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TCP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_UDP)
Packit 6f02de
	case IPPROTO_UDP:
Packit 6f02de
	    s = "UDP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_UDP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IP)
Packit 6f02de
# if	!defined(IPPROTO_HOPOPTS) || IPPROTO_IP!=IPPROTO_HOPOPTS
Packit 6f02de
	case IPPROTO_IP:
Packit 6f02de
	    s = "IP";
Packit 6f02de
	    break;
Packit 6f02de
# endif	/* !defined(IPPROTO_HOPOPTS) || IPPROTO_IP!=IPPROTO_HOPOPTS */
Packit 6f02de
#endif	/* defined(IPPROTO_IP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ICMP)
Packit 6f02de
	case IPPROTO_ICMP:
Packit 6f02de
	    s = "ICMP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ICMP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ICMPV6)
Packit 6f02de
	case IPPROTO_ICMPV6:
Packit 6f02de
	    s = "ICMPV6";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ICMPV6) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IGMP)
Packit 6f02de
	case IPPROTO_IGMP:
Packit 6f02de
	    s = "IGMP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IGMP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_GGP)
Packit 6f02de
	case IPPROTO_GGP:
Packit 6f02de
	    s = "GGP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_GGP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_EGP)
Packit 6f02de
	case IPPROTO_EGP:
Packit 6f02de
	    s = "EGP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_EGP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_PUP)
Packit 6f02de
	case IPPROTO_PUP:
Packit 6f02de
	    s = "PUP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_PUP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IDP)
Packit 6f02de
	case IPPROTO_IDP:
Packit 6f02de
	    s = "IDP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IDP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ND)
Packit 6f02de
	case IPPROTO_ND:
Packit 6f02de
	    s = "ND";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ND) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RAW)
Packit 6f02de
	case IPPROTO_RAW:
Packit 6f02de
	    s = "RAW";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RAW) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_HELLO)
Packit 6f02de
	case IPPROTO_HELLO:
Packit 6f02de
	    s = "HELLO";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_HELLO) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_PXP)
Packit 6f02de
	case IPPROTO_PXP:
Packit 6f02de
	    s = "PXP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_PXP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RAWIP)
Packit 6f02de
	case IPPROTO_RAWIP:
Packit 6f02de
	    s = "RAWIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RAWIP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RAWIF)
Packit 6f02de
	case IPPROTO_RAWIF:
Packit 6f02de
	    s = "RAWIF";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RAWIF) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_HOPOPTS)
Packit 6f02de
	case IPPROTO_HOPOPTS:
Packit 6f02de
	    s = "HOPOPTS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_HOPOPTS) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IPIP)
Packit 6f02de
	case IPPROTO_IPIP:
Packit 6f02de
	    s = "IPIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IPIP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ST)
Packit 6f02de
	case IPPROTO_ST:
Packit 6f02de
	    s = "ST";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ST) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_PIGP)
Packit 6f02de
	case IPPROTO_PIGP:
Packit 6f02de
	    s = "PIGP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_PIGP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RCCMON)
Packit 6f02de
	case IPPROTO_RCCMON:
Packit 6f02de
	    s = "RCCMON";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RCCMON) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_NVPII)
Packit 6f02de
	case IPPROTO_NVPII:
Packit 6f02de
	    s = "NVPII";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_NVPII) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ARGUS)
Packit 6f02de
	case IPPROTO_ARGUS:
Packit 6f02de
	    s = "ARGUS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ARGUS) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_EMCON)
Packit 6f02de
	case IPPROTO_EMCON:
Packit 6f02de
	    s = "EMCON";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_EMCON) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_XNET)
Packit 6f02de
	case IPPROTO_XNET:
Packit 6f02de
	    s = "XNET";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_XNET) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_CHAOS)
Packit 6f02de
	case IPPROTO_CHAOS:
Packit 6f02de
	    s = "CHAOS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_CHAOS) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_MUX)
Packit 6f02de
	case IPPROTO_MUX:
Packit 6f02de
	    s = "MUX";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_MUX) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_MEAS)
Packit 6f02de
	case IPPROTO_MEAS:
Packit 6f02de
	    s = "MEAS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_MEAS) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_HMP)
Packit 6f02de
	case IPPROTO_HMP:
Packit 6f02de
	    s = "HMP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_HMP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_PRM)
Packit 6f02de
	case IPPROTO_PRM:
Packit 6f02de
	    s = "PRM";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_PRM) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TRUNK1)
Packit 6f02de
	case IPPROTO_TRUNK1:
Packit 6f02de
	    s = "TRUNK1";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TRUNK1) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TRUNK2)
Packit 6f02de
	case IPPROTO_TRUNK2:
Packit 6f02de
	    s = "TRUNK2";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TRUNK2) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_LEAF1)
Packit 6f02de
	case IPPROTO_LEAF1:
Packit 6f02de
	    s = "LEAF1";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_LEAF1) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_LEAF2)
Packit 6f02de
	case IPPROTO_LEAF2:
Packit 6f02de
	    s = "LEAF2";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_LEAF2) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RDP)
Packit 6f02de
	case IPPROTO_RDP:
Packit 6f02de
	    s = "RDP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RDP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IRTP)
Packit 6f02de
	case IPPROTO_IRTP:
Packit 6f02de
	    s = "IRTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IRTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TP)
Packit 6f02de
	case IPPROTO_TP:
Packit 6f02de
	    s = "TP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_BLT)
Packit 6f02de
	case IPPROTO_BLT:
Packit 6f02de
	    s = "BLT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_BLT) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_NSP)
Packit 6f02de
	case IPPROTO_NSP:
Packit 6f02de
	    s = "NSP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_NSP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_INP)
Packit 6f02de
	case IPPROTO_INP:
Packit 6f02de
	    s = "INP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_INP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SEP)
Packit 6f02de
	case IPPROTO_SEP:
Packit 6f02de
	    s = "SEP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SEP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_3PC)
Packit 6f02de
	case IPPROTO_3PC:
Packit 6f02de
	    s = "3PC";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_3PC) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IDPR)
Packit 6f02de
	case IPPROTO_IDPR:
Packit 6f02de
	    s = "IDPR";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IDPR) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_XTP)
Packit 6f02de
	case IPPROTO_XTP:
Packit 6f02de
	    s = "XTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_XTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_DDP)
Packit 6f02de
	case IPPROTO_DDP:
Packit 6f02de
	    s = "DDP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_DDP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_CMTP)
Packit 6f02de
	case IPPROTO_CMTP:
Packit 6f02de
	    s = "CMTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_CMTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TPXX)
Packit 6f02de
	case IPPROTO_TPXX:
Packit 6f02de
	    s = "TPXX";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TPXX) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IL)
Packit 6f02de
	case IPPROTO_IL:
Packit 6f02de
	    s = "IL";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IL) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IPV6)
Packit 6f02de
	case IPPROTO_IPV6:
Packit 6f02de
	    s = "IPV6";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IPV6) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SDRP)
Packit 6f02de
	case IPPROTO_SDRP:
Packit 6f02de
	    s = "SDRP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SDRP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ROUTING)
Packit 6f02de
	case IPPROTO_ROUTING:
Packit 6f02de
	    s = "ROUTING";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ROUTING) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_FRAGMENT)
Packit 6f02de
	case IPPROTO_FRAGMENT:
Packit 6f02de
	    s = "FRAGMNT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_FRAGMENT) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IDRP)
Packit 6f02de
	case IPPROTO_IDRP:
Packit 6f02de
	    s = "IDRP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IDRP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RSVP)
Packit 6f02de
	case IPPROTO_RSVP:
Packit 6f02de
	    s = "RSVP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RSVP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_GRE)
Packit 6f02de
	case IPPROTO_GRE:
Packit 6f02de
	    s = "GRE";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_GRE) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_MHRP)
Packit 6f02de
	case IPPROTO_MHRP:
Packit 6f02de
	    s = "MHRP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_MHRP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_BHA)
Packit 6f02de
	case IPPROTO_BHA:
Packit 6f02de
	    s = "BHA";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_BHA) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ESP)
Packit 6f02de
	case IPPROTO_ESP:
Packit 6f02de
	    s = "ESP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ESP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_AH)
Packit 6f02de
	case IPPROTO_AH:
Packit 6f02de
	    s = "AH";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_AH) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_INLSP)
Packit 6f02de
	case IPPROTO_INLSP:
Packit 6f02de
	    s = "INLSP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_INLSP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SWIPE)
Packit 6f02de
	case IPPROTO_SWIPE:
Packit 6f02de
	    s = "SWIPE";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SWIPE) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_NHRP)
Packit 6f02de
	case IPPROTO_NHRP:
Packit 6f02de
	    s = "NHRP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_NHRP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_NONE)
Packit 6f02de
	case IPPROTO_NONE:
Packit 6f02de
	    s = "NONE";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_NONE) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_DSTOPTS)
Packit 6f02de
	case IPPROTO_DSTOPTS:
Packit 6f02de
	    s = "DSTOPTS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_DSTOPTS) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_AHIP)
Packit 6f02de
	case IPPROTO_AHIP:
Packit 6f02de
	    s = "AHIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_AHIP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_CFTP)
Packit 6f02de
	case IPPROTO_CFTP:
Packit 6f02de
	    s = "CFTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_CFTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SATEXPAK)
Packit 6f02de
	case IPPROTO_SATEXPAK:
Packit 6f02de
	    s = "SATEXPK";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SATEXPAK) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_KRYPTOLAN)
Packit 6f02de
	case IPPROTO_KRYPTOLAN:
Packit 6f02de
	    s = "KRYPTOL";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_KRYPTOLAN) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_RVD)
Packit 6f02de
	case IPPROTO_RVD:
Packit 6f02de
	    s = "RVD";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_RVD) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IPPC)
Packit 6f02de
	case IPPROTO_IPPC:
Packit 6f02de
	    s = "IPPC";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IPPC) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ADFS)
Packit 6f02de
	case IPPROTO_ADFS:
Packit 6f02de
	    s = "ADFS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ADFS) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SATMON)
Packit 6f02de
	case IPPROTO_SATMON:
Packit 6f02de
	    s = "SATMON";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SATMON) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_VISA)
Packit 6f02de
	case IPPROTO_VISA:
Packit 6f02de
	    s = "VISA";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_VISA) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IPCV)
Packit 6f02de
	case IPPROTO_IPCV:
Packit 6f02de
	    s = "IPCV";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IPCV) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_CPNX)
Packit 6f02de
	case IPPROTO_CPNX:
Packit 6f02de
	    s = "CPNX";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_CPNX) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_CPHB)
Packit 6f02de
	case IPPROTO_CPHB:
Packit 6f02de
	    s = "CPHB";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_CPHB) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_WSN)
Packit 6f02de
	case IPPROTO_WSN:
Packit 6f02de
	    s = "WSN";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_WSN) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_PVP)
Packit 6f02de
	case IPPROTO_PVP:
Packit 6f02de
	    s = "PVP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_PVP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_BRSATMON)
Packit 6f02de
	case IPPROTO_BRSATMON:
Packit 6f02de
	    s = "BRSATMN";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_BRSATMON) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_WBMON)
Packit 6f02de
	case IPPROTO_WBMON:
Packit 6f02de
	    s = "WBMON";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_WBMON) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_WBEXPAK)
Packit 6f02de
	case IPPROTO_WBEXPAK:
Packit 6f02de
	    s = "WBEXPAK";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_WBEXPAK) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_EON)
Packit 6f02de
	case IPPROTO_EON:
Packit 6f02de
	    s = "EON";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_EON) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_VMTP)
Packit 6f02de
	case IPPROTO_VMTP:
Packit 6f02de
	    s = "VMTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_VMTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SVMTP)
Packit 6f02de
	case IPPROTO_SVMTP:
Packit 6f02de
	    s = "SVMTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SVMTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_VINES)
Packit 6f02de
	case IPPROTO_VINES:
Packit 6f02de
	    s = "VINES";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_VINES) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TTP)
Packit 6f02de
	case IPPROTO_TTP:
Packit 6f02de
	    s = "TTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IGP)
Packit 6f02de
	case IPPROTO_IGP:
Packit 6f02de
	    s = "IGP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IGP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_DGP)
Packit 6f02de
	case IPPROTO_DGP:
Packit 6f02de
	    s = "DGP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_DGP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_TCF)
Packit 6f02de
	case IPPROTO_TCF:
Packit 6f02de
	    s = "TCF";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_TCF) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IGRP)
Packit 6f02de
	case IPPROTO_IGRP:
Packit 6f02de
	    s = "IGRP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IGRP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_OSPFIGP)
Packit 6f02de
	case IPPROTO_OSPFIGP:
Packit 6f02de
	    s = "OSPFIGP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_OSPFIGP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SRPC)
Packit 6f02de
	case IPPROTO_SRPC:
Packit 6f02de
	    s = "SRPC";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SRPC) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_LARP)
Packit 6f02de
	case IPPROTO_LARP:
Packit 6f02de
	    s = "LARP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_LARP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_MTP)
Packit 6f02de
	case IPPROTO_MTP:
Packit 6f02de
	    s = "MTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_MTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_AX25)
Packit 6f02de
	case IPPROTO_AX25:
Packit 6f02de
	    s = "AX25";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_AX25) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_IPEIP)
Packit 6f02de
	case IPPROTO_IPEIP:
Packit 6f02de
	    s = "IPEIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_IPEIP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_MICP)
Packit 6f02de
	case IPPROTO_MICP:
Packit 6f02de
	    s = "MICP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_MICP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_SCCSP)
Packit 6f02de
	case IPPROTO_SCCSP:
Packit 6f02de
	    s = "SCCSP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_SCCSP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ETHERIP)
Packit 6f02de
	case IPPROTO_ETHERIP:
Packit 6f02de
	    s = "ETHERIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_ETHERIP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_ENCAP)
Packit 6f02de
# if	!defined(IPPROTO_IPIP) || IPPROTO_IPIP!=IPPROTO_ENCAP
Packit 6f02de
	case IPPROTO_ENCAP:
Packit 6f02de
	    s = "ENCAP";
Packit 6f02de
	    break;
Packit 6f02de
# endif	/* !defined(IPPROTO_IPIP) || IPPROTO_IPIP!=IPPROTO_ENCAP */
Packit 6f02de
#endif	/* defined(IPPROTO_ENCAP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_APES)
Packit 6f02de
	case IPPROTO_APES:
Packit 6f02de
	    s = "APES";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_APES) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_GMTP)
Packit 6f02de
	case IPPROTO_GMTP:
Packit 6f02de
	    s = "GMTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_GMTP) */
Packit 6f02de
Packit 6f02de
#if	defined(IPPROTO_DIVERT)
Packit 6f02de
	case IPPROTO_DIVERT:
Packit 6f02de
	    s = "DIVERT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(IPPROTO_DIVERT) */
Packit 6f02de
Packit 6f02de
	default:
Packit 6f02de
	    s = (char *)NULL;
Packit 6f02de
	}
Packit 6f02de
	if (s)
Packit 6f02de
	    (void) snpf(Lf->iproto, sizeof(Lf->iproto), "%.*s", IPROTOL-1, s);
Packit 6f02de
	else {	
Packit 6f02de
	    if (m < 0) {
Packit 6f02de
		for (i = 0, m = 1; i < IPROTOL-2; i++)
Packit 6f02de
		    m *= 10;
Packit 6f02de
	    }
Packit 6f02de
	    if (m > p)
Packit 6f02de
		(void) snpf(Lf->iproto, sizeof(Lf->iproto), "%d?", p);
Packit 6f02de
	    else
Packit 6f02de
		(void) snpf(Lf->iproto, sizeof(Lf->iproto), "*%d?", p % (m/10));
Packit 6f02de
	}
Packit 6f02de
}
Packit 6f02de
#endif	/* !defined(HASPRIVPRIPP) */
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * printname() - print output name field
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
void
Packit 6f02de
printname(nl)
Packit 6f02de
	int nl;				/* NL status */
Packit 6f02de
{
Packit 6f02de
Packit 6f02de
#if	defined(HASNCACHE)
Packit 6f02de
	char buf[MAXPATHLEN];
Packit 6f02de
	char *cp;
Packit 6f02de
	int fp;
Packit 6f02de
#endif	/* defined(HASNCACHE) */
Packit 6f02de
Packit 6f02de
	int ps = 0;
Packit 6f02de
Packit 6f02de
	if (Lf->nm && Lf->nm[0]) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Print the name characters, if there are some.
Packit 6f02de
	 */
Packit 6f02de
	    safestrprt(Lf->nm, stdout, 0);
Packit 6f02de
	    ps++;
Packit 6f02de
	    if (!Lf->li[0].af && !Lf->li[1].af)
Packit 6f02de
		goto print_nma;
Packit 6f02de
	}
Packit 6f02de
	if (Lf->li[0].af || Lf->li[1].af) {
Packit 6f02de
	    if (ps)
Packit 6f02de
		putchar(' ');
Packit 6f02de
	/*
Packit 6f02de
	 * If the file has Internet addresses, print them.
Packit 6f02de
	 */
Packit 6f02de
	    if (printinaddr())
Packit 6f02de
		ps++;
Packit 6f02de
	    goto print_nma;
Packit 6f02de
	}
Packit 6f02de
	if (((Lf->ntype == N_BLK) || (Lf->ntype == N_CHR))
Packit 6f02de
	&&  Lf->dev_def && Lf->rdev_def
Packit 6f02de
	&&  printdevname(&Lf->dev, &Lf->rdev, 0, Lf->ntype))
Packit 6f02de
	{
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * If this is a block or character device and it has a name, print it.
Packit 6f02de
	 */
Packit 6f02de
	    ps++;
Packit 6f02de
	    goto print_nma;
Packit 6f02de
	}
Packit 6f02de
	if (Lf->is_com) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * If this is a common node, print that fact.
Packit 6f02de
	 */
Packit 6f02de
	    (void) fputs("COMMON: ", stdout);
Packit 6f02de
	    ps++;
Packit 6f02de
	    goto print_nma;
Packit 6f02de
	}
Packit 6f02de
Packit 6f02de
#if	defined(HASPRIVNMCACHE)
Packit 6f02de
	if (HASPRIVNMCACHE(Lf)) {
Packit 6f02de
	    ps++;
Packit 6f02de
	    goto print_nma;
Packit 6f02de
	}
Packit 6f02de
#endif	/* defined(HASPRIVNMCACHE) */
Packit 6f02de
Packit 6f02de
	if (Lf->lmi_srch) {
Packit 6f02de
	    struct mounts *mp;
Packit 6f02de
	/*
Packit 6f02de
	 * Do a deferred local mount info table search for the file system
Packit 6f02de
	 * (mounted) directory name and inode number, and mounted device name.
Packit 6f02de
	 */
Packit 6f02de
	    for (mp = readmnt(); mp; mp = mp->next) {
Packit 6f02de
		if (Lf->dev == mp->dev) {
Packit 6f02de
		    Lf->fsdir = mp->dir;
Packit 6f02de
		    Lf->fsdev = mp->fsname;
Packit 6f02de
Packit 6f02de
#if	defined(HASFSINO)
Packit 6f02de
		    Lf->fs_ino = mp->inode;
Packit 6f02de
#endif	/* defined(HASFSINO) */
Packit 6f02de
Packit 6f02de
		    break;
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	    Lf->lmi_srch = 0;
Packit 6f02de
	}
Packit 6f02de
	if (Lf->fsdir || Lf->fsdev) {
Packit 6f02de
Packit 6f02de
	/*
Packit 6f02de
	 * Print the file system directory name, device name, and
Packit 6f02de
	 * possible path name components.
Packit 6f02de
	 */
Packit 6f02de
Packit 6f02de
#if	!defined(HASNCACHE) || HASNCACHE<2
Packit 6f02de
	    if (Lf->fsdir) {
Packit 6f02de
		safestrprt(Lf->fsdir, stdout, 0);
Packit 6f02de
		ps++;
Packit 6f02de
	    }
Packit 6f02de
#endif	/* !defined(HASNCACHE) || HASNCACHE<2 */
Packit 6f02de
Packit 6f02de
#if	defined(HASNCACHE)
Packit 6f02de
Packit 6f02de
# if	HASNCACHE<2
Packit 6f02de
	    if (Lf->na) {
Packit 6f02de
		if (NcacheReload) {
Packit 6f02de
Packit 6f02de
#  if	defined(NCACHELDPFX)
Packit 6f02de
		    NCACHELDPFX
Packit 6f02de
#  endif	/* defined(NCACHELDPFX) */
Packit 6f02de
Packit 6f02de
		    (void) ncache_load();
Packit 6f02de
Packit 6f02de
#  if	defined(NCACHELDSFX)
Packit 6f02de
		    NCACHELDSFX
Packit 6f02de
#  endif	/* defined(NCACHELDSFX) */
Packit 6f02de
Packit 6f02de
		    NcacheReload = 0;
Packit 6f02de
		}
Packit 6f02de
		if ((cp = ncache_lookup(buf, sizeof(buf), &fp))) {
Packit 6f02de
		    char *cp1; 
Packit 6f02de
Packit 6f02de
		    if (*cp == '\0')
Packit 6f02de
			goto print_nma;
Packit 6f02de
		    if (fp && Lf->fsdir) {
Packit 6f02de
			if (*cp != '/') {
Packit 6f02de
			    cp1 = strrchr(Lf->fsdir, '/');
Packit 6f02de
			    if (cp1 == (char *)NULL ||  *(cp1 + 1) != '\0')
Packit 6f02de
				putchar('/');
Packit 6f02de
			    }
Packit 6f02de
		    } else
Packit 6f02de
			(void) fputs(" -- ", stdout);
Packit 6f02de
		    safestrprt(cp, stdout, 0);
Packit 6f02de
		    ps++;
Packit 6f02de
		    goto print_nma;
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
# else	/* HASNCACHE>1 */
Packit 6f02de
	    if (NcacheReload) {
Packit 6f02de
Packit 6f02de
#  if	defined(NCACHELDPFX)
Packit 6f02de
		    NCACHELDPFX
Packit 6f02de
#  endif	/* defined(NCACHELDPFX) */
Packit 6f02de
Packit 6f02de
		(void) ncache_load();
Packit 6f02de
Packit 6f02de
#  if	defined(NCACHELDSFX)
Packit 6f02de
		    NCACHELDSFX
Packit 6f02de
#  endif	/* defined(NCACHELDSFX) */
Packit 6f02de
Packit 6f02de
		NcacheReload = 0;
Packit 6f02de
	    }
Packit 6f02de
	    if ((cp = ncache_lookup(buf, sizeof(buf), &fp))) {
Packit 6f02de
		if (fp) {
Packit 6f02de
		    safestrprt(cp, stdout, 0);
Packit 6f02de
		    ps++;
Packit 6f02de
		} else {
Packit 6f02de
		    if (Lf->fsdir) {
Packit 6f02de
			safestrprt(Lf->fsdir, stdout, 0);
Packit 6f02de
			ps++;
Packit 6f02de
		    }
Packit 6f02de
		    if (*cp) {
Packit 6f02de
			(void) fputs(" -- ", stdout);
Packit 6f02de
			safestrprt(cp, stdout, 0);
Packit 6f02de
			ps++;
Packit 6f02de
		    }
Packit 6f02de
		}
Packit 6f02de
		goto print_nma;
Packit 6f02de
	    }
Packit 6f02de
	    if (Lf->fsdir) {
Packit 6f02de
		safestrprt(Lf->fsdir, stdout, 0);
Packit 6f02de
		ps++;
Packit 6f02de
	    }
Packit 6f02de
# endif	/* HASNCACHE<2 */
Packit 6f02de
#endif	/* defined(HASNCACHE) */
Packit 6f02de
Packit 6f02de
	    if (Lf->fsdev) {
Packit 6f02de
		if (Lf->fsdir)
Packit 6f02de
		    (void) fputs(" (", stdout);
Packit 6f02de
		else
Packit 6f02de
		    (void) putchar('(');
Packit 6f02de
		safestrprt(Lf->fsdev, stdout, 0);
Packit 6f02de
		(void) putchar(')');
Packit 6f02de
		ps++;
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Print the NAME column addition, if there is one.  If there isn't
Packit 6f02de
 * make sure a NL is printed, as requested.
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
print_nma:
Packit 6f02de
Packit 6f02de
	if (Lf->nma) {
Packit 6f02de
	    if (ps)
Packit 6f02de
		putchar(' ');
Packit 6f02de
	    safestrprt(Lf->nma, stdout, 0);
Packit 6f02de
	    ps++;
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * If this file has TCP/IP state information, print it.
Packit 6f02de
 */
Packit 6f02de
	if (!Ffield && Ftcptpi
Packit 6f02de
	&&  (Lf->lts.type >= 0
Packit 6f02de
Packit 6f02de
#if	defined(HASTCPTPIQ)
Packit 6f02de
	||   ((Ftcptpi & TCPTPI_QUEUES) && (Lf->lts.rqs || Lf->lts.sqs))
Packit 6f02de
#endif	/* defined(HASTCPTPIQ) */
Packit 6f02de
Packit 6f02de
#if	defined(HASTCPTPIW)
Packit 6f02de
	||   ((Ftcptpi & TCPTPI_WINDOWS) && (Lf->lts.rws || Lf->lts.wws))
Packit 6f02de
#endif	/* defined(HASTCPTPIW) */
Packit 6f02de
Packit 6f02de
	)) {
Packit 6f02de
	    if (ps)
Packit 6f02de
		putchar(' ');
Packit 6f02de
	    (void) print_tcptpi(0);
Packit 6f02de
	}
Packit 6f02de
	if (nl)
Packit 6f02de
	    putchar('\n');
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * printrawaddr() - print raw socket address
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
void
Packit 6f02de
printrawaddr(sa)
Packit 6f02de
	struct sockaddr *sa;		/* socket address */
Packit 6f02de
{
Packit 6f02de
	char *ep;
Packit 6f02de
	size_t sz;
Packit 6f02de
Packit 6f02de
	ep = endnm(&sz);
Packit 6f02de
	(void) snpf(ep, sz, "%u/%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u,%u",
Packit 6f02de
	    sa->sa_family,
Packit 6f02de
	    (unsigned char)sa->sa_data[0],
Packit 6f02de
	    (unsigned char)sa->sa_data[1],
Packit 6f02de
	    (unsigned char)sa->sa_data[2],
Packit 6f02de
	    (unsigned char)sa->sa_data[3],
Packit 6f02de
	    (unsigned char)sa->sa_data[4],
Packit 6f02de
	    (unsigned char)sa->sa_data[5],
Packit 6f02de
	    (unsigned char)sa->sa_data[6],
Packit 6f02de
	    (unsigned char)sa->sa_data[7],
Packit 6f02de
	    (unsigned char)sa->sa_data[8],
Packit 6f02de
	    (unsigned char)sa->sa_data[9],
Packit 6f02de
	    (unsigned char)sa->sa_data[10],
Packit 6f02de
	    (unsigned char)sa->sa_data[11],
Packit 6f02de
	    (unsigned char)sa->sa_data[12],
Packit 6f02de
	    (unsigned char)sa->sa_data[13]);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * printsockty() - print socket type
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
char *
Packit 6f02de
printsockty(ty)
Packit 6f02de
	int ty;				/* socket type -- e.g., from so_type */
Packit 6f02de
{
Packit 6f02de
	static char buf[64];
Packit 6f02de
	char *cp;
Packit 6f02de
Packit 6f02de
	switch (ty) {
Packit 6f02de
Packit 6f02de
#if	defined(SOCK_STREAM)
Packit 6f02de
	case SOCK_STREAM:
Packit 6f02de
	    cp = "STREAM";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(SOCK_STREAM) */
Packit 6f02de
Packit 6f02de
#if	defined(SOCK_STREAM)
Packit 6f02de
	case SOCK_DGRAM:
Packit 6f02de
	    cp = "DGRAM";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(SOCK_DGRAM) */
Packit 6f02de
Packit 6f02de
#if	defined(SOCK_RAW)
Packit 6f02de
	case SOCK_RAW:
Packit 6f02de
	    cp = "RAW";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(SOCK_RAW) */
Packit 6f02de
Packit 6f02de
#if	defined(SOCK_RDM)
Packit 6f02de
	case SOCK_RDM:
Packit 6f02de
	    cp = "RDM";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(SOCK_RDM) */
Packit 6f02de
Packit 6f02de
#if	defined(SOCK_SEQPACKET)
Packit 6f02de
	case SOCK_SEQPACKET:
Packit 6f02de
	    cp = "SEQPACKET";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(SOCK_SEQPACKET) */
Packit 6f02de
Packit 6f02de
	default:
Packit 6f02de
	    (void) snpf(buf, sizeof(buf), "SOCK_%#x", ty);
Packit 6f02de
	    return(buf);
Packit 6f02de
	}
Packit 6f02de
	(void) snpf(buf, sizeof(buf), "SOCK_%s", cp);
Packit 6f02de
	return(buf);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * printuid() - print User ID or login name
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
char *
Packit 6f02de
printuid(uid, ty)
Packit 6f02de
	UID_ARG uid;			/* User IDentification number */
Packit 6f02de
	int *ty;			/* returned UID type pointer (NULL
Packit 6f02de
					 * (if none wanted).  If non-NULL
Packit 6f02de
					 * then: *ty = 0 = login name
Packit 6f02de
					 *	     = 1 = UID number */
Packit 6f02de
{
Packit 6f02de
	int i;
Packit 6f02de
	struct passwd *pw;
Packit 6f02de
	struct stat sb;
Packit 6f02de
	static struct stat sbs;
Packit 6f02de
	static struct uidcache {
Packit 6f02de
	    uid_t uid;
Packit 6f02de
	    char nm[LOGINML+1];
Packit 6f02de
	    struct uidcache *next;
Packit 6f02de
	} **uc = (struct uidcache **)NULL;
Packit 6f02de
	struct uidcache *up, *upn;
Packit 6f02de
	static char user[USERPRTL+1];
Packit 6f02de
Packit 6f02de
	if (Futol) {
Packit 6f02de
	    if (CkPasswd) {
Packit 6f02de
Packit 6f02de
	    /*
Packit 6f02de
	     * Get the mtime and ctime of /etc/passwd, as required.
Packit 6f02de
	     */
Packit 6f02de
		if (stat("/etc/passwd", &sb) != 0) {
Packit 6f02de
		    (void) fprintf(stderr, "%s: can't stat(/etc/passwd): %s\n",
Packit 6f02de
			Pn, strerror(errno));
Packit 6f02de
		    Exit(1);
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * Define the UID cache, if necessary.
Packit 6f02de
	 */
Packit 6f02de
	    if (!uc) {
Packit 6f02de
		if (!(uc = (struct uidcache **)calloc(UIDCACHEL,
Packit 6f02de
						sizeof(struct uidcache *))))
Packit 6f02de
		{
Packit 6f02de
		    (void) fprintf(stderr,
Packit 6f02de
			"%s: no space for %d byte UID cache hash buckets\n",
Packit 6f02de
			Pn, (int)(UIDCACHEL * (sizeof(struct uidcache *))));
Packit 6f02de
		    Exit(1);
Packit 6f02de
		}
Packit 6f02de
		if (CkPasswd) {
Packit 6f02de
		    sbs = sb;
Packit 6f02de
		    CkPasswd = 0;
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * If it's time to check /etc/passwd and if its the mtime/ctime has
Packit 6f02de
	 * changed, destroy the existing UID cache.
Packit 6f02de
	 */
Packit 6f02de
	    if (CkPasswd) {
Packit 6f02de
		if (sbs.st_mtime != sb.st_mtime || sbs.st_ctime != sb.st_ctime)
Packit 6f02de
		{
Packit 6f02de
		    for (i = 0; i < UIDCACHEL; i++) {
Packit 6f02de
			if ((up = uc[i])) {
Packit 6f02de
			    do {
Packit 6f02de
				upn = up->next;
Packit 6f02de
				(void) free((FREE_P *)up);
Packit 6f02de
			    } while ((up = upn) != (struct uidcache *)NULL);
Packit 6f02de
			    uc[i] = (struct uidcache *)NULL;
Packit 6f02de
			}
Packit 6f02de
		    }
Packit 6f02de
		    sbs = sb;
Packit 6f02de
		}
Packit 6f02de
		CkPasswd = 0;
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * Search the UID cache.
Packit 6f02de
	 */
Packit 6f02de
	    i = (int)((((unsigned long)uid * 31415L) >> 7) & (UIDCACHEL - 1));
Packit 6f02de
	    for (up = uc[i]; up; up = up->next) {
Packit 6f02de
		if (up->uid == (uid_t)uid) {
Packit 6f02de
		    if (ty)
Packit 6f02de
			*ty = 0;
Packit 6f02de
		    return(up->nm);
Packit 6f02de
		}
Packit 6f02de
	    }
Packit 6f02de
	/*
Packit 6f02de
	 * The UID is not in the cache.
Packit 6f02de
	 *
Packit 6f02de
	 * Look up the login name from the UID for a new cache entry.
Packit 6f02de
	 */
Packit 6f02de
	    if (!(pw = getpwuid((uid_t)uid))) {
Packit 6f02de
		if (!Fwarn) {
Packit 6f02de
		    (void) fprintf(stderr, "%s: no pwd entry for UID %lu\n",
Packit 6f02de
			Pn, (unsigned long)uid);
Packit 6f02de
		}
Packit 6f02de
	    } else {
Packit 6f02de
Packit 6f02de
	    /*
Packit 6f02de
	     * Allocate and fill a new cache entry.  Link it to its hash bucket.
Packit 6f02de
	     */
Packit 6f02de
		if (!(upn = (struct uidcache *)malloc(sizeof(struct uidcache))))
Packit 6f02de
		{
Packit 6f02de
		    (void) fprintf(stderr,
Packit 6f02de
			"%s: no space for UID cache entry for: %lu, %s)\n",
Packit 6f02de
			Pn, (unsigned long)uid, pw->pw_name);
Packit 6f02de
		    Exit(1);
Packit 6f02de
		}
Packit 6f02de
		(void) strncpy(upn->nm, pw->pw_name, LOGINML);
Packit 6f02de
		upn->nm[LOGINML] = '\0';
Packit 6f02de
		upn->uid = (uid_t)uid;
Packit 6f02de
		upn->next = uc[i];
Packit 6f02de
		uc[i] = upn;
Packit 6f02de
		if (ty)
Packit 6f02de
		    *ty = 0;
Packit 6f02de
		return(upn->nm);
Packit 6f02de
	    }
Packit 6f02de
	}
Packit 6f02de
/*
Packit 6f02de
 * Produce a numeric conversion of the UID.
Packit 6f02de
 */
Packit 6f02de
	(void) snpf(user, sizeof(user), "%*lu", USERPRTL, (unsigned long)uid);
Packit 6f02de
	if (ty)
Packit 6f02de
	    *ty = 1;
Packit 6f02de
	return(user);
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
/*
Packit 6f02de
 * printunkaf() - print unknown address family
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
void
Packit 6f02de
printunkaf(fam, ty)
Packit 6f02de
	int fam;			/* unknown address family */
Packit 6f02de
	int ty;				/* output type: 0 = terse; 1 = full */
Packit 6f02de
{
Packit 6f02de
	char *p, *s;
Packit 6f02de
Packit 6f02de
	p = "";
Packit 6f02de
	switch (fam) {
Packit 6f02de
Packit 6f02de
#if	defined(AF_UNSPEC)
Packit 6f02de
	case AF_UNSPEC:
Packit 6f02de
	    s = "UNSPEC";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_UNSPEC) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_UNIX)
Packit 6f02de
	case AF_UNIX:
Packit 6f02de
	    s = "UNIX";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_UNIX) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_INET)
Packit 6f02de
	case AF_INET:
Packit 6f02de
	    s = "INET";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_INET) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_INET6)
Packit 6f02de
	case AF_INET6:
Packit 6f02de
	    s = "INET6";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_INET6) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_IMPLINK)
Packit 6f02de
	case AF_IMPLINK:
Packit 6f02de
	    s = "IMPLINK";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_IMPLINK) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_PUP)
Packit 6f02de
	case AF_PUP:
Packit 6f02de
	    s = "PUP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_PUP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_CHAOS)
Packit 6f02de
	case AF_CHAOS:
Packit 6f02de
	    s = "CHAOS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_CHAOS) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NS)
Packit 6f02de
	case AF_NS:
Packit 6f02de
	    s = "NS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_NS) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_ISO)
Packit 6f02de
	case AF_ISO:
Packit 6f02de
	    s = "ISO";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_ISO) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NBS)
Packit 6f02de
# if	!defined(AF_ISO) || AF_NBS!=AF_ISO
Packit 6f02de
	case AF_NBS:
Packit 6f02de
	    s = "NBS";
Packit 6f02de
	    break;
Packit 6f02de
# endif	/* !defined(AF_ISO) || AF_NBS!=AF_ISO */
Packit 6f02de
#endif	/* defined(AF_NBS) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_ECMA)
Packit 6f02de
	case AF_ECMA:
Packit 6f02de
	    s = "ECMA";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_ECMA) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_DATAKIT)
Packit 6f02de
	case AF_DATAKIT:
Packit 6f02de
	    s = "DATAKIT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_DATAKIT) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_CCITT)
Packit 6f02de
	case AF_CCITT:
Packit 6f02de
	    s = "CCITT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_CCITT) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_SNA)
Packit 6f02de
	case AF_SNA:
Packit 6f02de
	    s = "SNA";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_SNA) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_DECnet)
Packit 6f02de
	case AF_DECnet:
Packit 6f02de
	    s = "DECnet";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_DECnet) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_DLI)
Packit 6f02de
	case AF_DLI:
Packit 6f02de
	    s = "DLI";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_DLI) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_LAT)
Packit 6f02de
	case AF_LAT:
Packit 6f02de
	    s = "LAT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_LAT) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_HYLINK)
Packit 6f02de
	case AF_HYLINK:
Packit 6f02de
	    s = "HYLINK";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_HYLINK) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_APPLETALK)
Packit 6f02de
	case AF_APPLETALK:
Packit 6f02de
	    s = "APPLETALK";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_APPLETALK) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_BSC)
Packit 6f02de
	case AF_BSC:
Packit 6f02de
	    s = "BSC";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_BSC) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_DSS)
Packit 6f02de
	case AF_DSS:
Packit 6f02de
	    s = "DSS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_DSS) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_ROUTE)
Packit 6f02de
	case AF_ROUTE:
Packit 6f02de
	    s = "ROUTE";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_ROUTE) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_RAW)
Packit 6f02de
	case AF_RAW:
Packit 6f02de
	    s = "RAW";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_RAW) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_LINK)
Packit 6f02de
	case AF_LINK:
Packit 6f02de
	    s = "LINK";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_LINK) */
Packit 6f02de
Packit 6f02de
#if	defined(pseudo_AF_XTP)
Packit 6f02de
	case pseudo_AF_XTP:
Packit 6f02de
	    p = "pseudo_";
Packit 6f02de
	    s = "XTP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(pseudo_AF_XTP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_RMP)
Packit 6f02de
	case AF_RMP:
Packit 6f02de
	    s = "RMP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_RMP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_COIP)
Packit 6f02de
	case AF_COIP:
Packit 6f02de
	    s = "COIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_COIP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_CNT)
Packit 6f02de
	case AF_CNT:
Packit 6f02de
	    s = "CNT";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_CNT) */
Packit 6f02de
Packit 6f02de
#if	defined(pseudo_AF_RTIP)
Packit 6f02de
	case pseudo_AF_RTIP:
Packit 6f02de
	    p = "pseudo_";
Packit 6f02de
	    s = "RTIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(pseudo_AF_RTIP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NETMAN)
Packit 6f02de
	case AF_NETMAN:
Packit 6f02de
	    s = "NETMAN";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_NETMAN) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_INTF)
Packit 6f02de
	case AF_INTF:
Packit 6f02de
	    s = "INTF";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_INTF) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NETWARE)
Packit 6f02de
	case AF_NETWARE:
Packit 6f02de
	    s = "NETWARE";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_NETWARE) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NDD)
Packit 6f02de
	case AF_NDD:
Packit 6f02de
	    s = "NDD";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_NDD) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NIT)
Packit 6f02de
# if	!defined(AF_ROUTE) || AF_ROUTE!=AF_NIT
Packit 6f02de
	case AF_NIT:
Packit 6f02de
	    s = "NIT";
Packit 6f02de
	    break;
Packit 6f02de
# endif	/* !defined(AF_ROUTE) || AF_ROUTE!=AF_NIT */
Packit 6f02de
#endif	/* defined(AF_NIT) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_802)
Packit 6f02de
# if	!defined(AF_RAW) || AF_RAW!=AF_802
Packit 6f02de
	case AF_802:
Packit 6f02de
	    s = "802";
Packit 6f02de
	    break;
Packit 6f02de
# endif	/* !defined(AF_RAW) || AF_RAW!=AF_802 */
Packit 6f02de
#endif	/* defined(AF_802) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_X25)
Packit 6f02de
	case AF_X25:
Packit 6f02de
	    s = "X25";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_X25) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_CTF)
Packit 6f02de
	case AF_CTF:
Packit 6f02de
	    s = "CTF";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_CTF) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_WAN)
Packit 6f02de
	case AF_WAN:
Packit 6f02de
	    s = "WAN";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_WAN) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_OSINET)
Packit 6f02de
# if	defined(AF_INET) && AF_INET!=AF_OSINET
Packit 6f02de
	case AF_OSINET:
Packit 6f02de
	    s = "OSINET";
Packit 6f02de
	    break;
Packit 6f02de
# endif	/* defined(AF_INET) && AF_INET!=AF_OSINET */
Packit 6f02de
#endif	/* defined(AF_OSINET) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_GOSIP)
Packit 6f02de
	case AF_GOSIP:
Packit 6f02de
	    s = "GOSIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_GOSIP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_SDL)
Packit 6f02de
	case AF_SDL:
Packit 6f02de
	    s = "SDL";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_SDL) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_IPX)
Packit 6f02de
	case AF_IPX:
Packit 6f02de
	    s = "IPX";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_IPX) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_SIP)
Packit 6f02de
	case AF_SIP:
Packit 6f02de
	    s = "SIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_SIP) */
Packit 6f02de
Packit 6f02de
#if	defined(psuedo_AF_PIP)
Packit 6f02de
	case psuedo_AF_PIP:
Packit 6f02de
	    p = "pseudo_";
Packit 6f02de
	    s = "PIP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(psuedo_AF_PIP) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_OTS)
Packit 6f02de
	case AF_OTS:
Packit 6f02de
	    s = "OTS";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_OTS) */
Packit 6f02de
Packit 6f02de
#if	defined(pseudo_AF_BLUE)
Packit 6f02de
	case pseudo_AF_BLUE:	/* packets for Blue box */
Packit 6f02de
	    p = "pseudo_";
Packit 6f02de
	    s = "BLUE";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(pseudo_AF_BLUE) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NDRV)	/* network driver raw access */
Packit 6f02de
	case AF_NDRV:
Packit 6f02de
	    s = "NDRV";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_NDRV) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_SYSTEM)	/* kernel event messages */
Packit 6f02de
	case AF_SYSTEM:
Packit 6f02de
	    s = "SYSTEM";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_SYSTEM) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_USER)
Packit 6f02de
	case AF_USER:
Packit 6f02de
	    s = "USER";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_USER) */
Packit 6f02de
Packit 6f02de
#if	defined(pseudo_AF_KEY)
Packit 6f02de
	case pseudo_AF_KEY:
Packit 6f02de
	    p = "pseudo_";
Packit 6f02de
	    s = "KEY";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(pseudo_AF_KEY) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_KEY)		/* Security Association DB socket */
Packit 6f02de
	case AF_KEY:			
Packit 6f02de
	    s = "KEY";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_KEY) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_NCA)		/* NCA socket */
Packit 6f02de
	case AF_NCA:			
Packit 6f02de
	    s = "NCA";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_NCA) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_POLICY)		/* Security Policy DB socket */
Packit 6f02de
	case AF_POLICY:
Packit 6f02de
	    s = "POLICY";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_POLICY) */
Packit 6f02de
Packit 6f02de
#if	defined(AF_PPP)		/* PPP socket */
Packit 6f02de
	case AF_PPP:			
Packit 6f02de
	    s = "PPP";
Packit 6f02de
	    break;
Packit 6f02de
#endif	/* defined(AF_PPP) */
Packit 6f02de
Packit 6f02de
	default:
Packit 6f02de
	    if (!ty)
Packit 6f02de
		(void) snpf(Namech, Namechl, "%#x", fam);
Packit 6f02de
	    else
Packit 6f02de
		(void) snpf(Namech, Namechl,
Packit 6f02de
		    "no further information on family %#x", fam);
Packit 6f02de
	    return;
Packit 6f02de
	}
Packit 6f02de
	if (!ty)
Packit 6f02de
	    (void) snpf(Namech, Namechl, "%sAF_%s", p, s);
Packit 6f02de
	else
Packit 6f02de
	    (void) snpf(Namech, Namechl, "no further information on %sAF_%s",
Packit 6f02de
		p, s);
Packit 6f02de
	return;
Packit 6f02de
}
Packit 6f02de
Packit 6f02de
Packit 6f02de
#if	!defined(HASNORPC_H)
Packit 6f02de
/*
Packit 6f02de
 * update_portmap() - update a portmap entry with its port number or service
Packit 6f02de
 *		      name
Packit 6f02de
 */
Packit 6f02de
Packit 6f02de
static void
Packit 6f02de
update_portmap(pt, pn)
Packit 6f02de
	struct porttab *pt;		/* porttab entry */
Packit 6f02de
	char *pn;			/* port name */
Packit 6f02de
{
Packit 6f02de
	MALLOC_S al, nl;
Packit 6f02de
	char *cp;
Packit 6f02de
Packit 6f02de
	if (pt->ss)
Packit 6f02de
	    return;
Packit 6f02de
	if (!(al = strlen(pn))) {
Packit 6f02de
	    pt->ss = 1;
Packit 6f02de
	    return;
Packit 6f02de
	}
Packit 6f02de
	nl = al + pt->nl + 2;
Packit 6f02de
	if (!(cp = (char *)malloc(nl + 1))) {
Packit 6f02de
	    (void) fprintf(stderr,
Packit 6f02de
		"%s: can't allocate %d bytes for portmap name: %s[%s]\n",
Packit 6f02de
		Pn, (int)(nl + 1), pn, pt->name);
Packit 6f02de
	    Exit(1);
Packit 6f02de
	}
Packit 6f02de
	(void) snpf(cp, nl + 1, "%s[%s]", pn, pt->name);
Packit 6f02de
	(void) free((FREE_P *)pt->name);
Packit 6f02de
	pt->name = cp;
Packit 6f02de
	pt->nl = nl;
Packit 6f02de
	pt->ss = 1;
Packit 6f02de
}
Packit 6f02de
#endif	/* !defined(HASNORPC_H) */