keyword.c revision 173100
112891Swpaul/*-
212891Swpaul * Copyright (c) 1990, 1993, 1994
312891Swpaul *	The Regents of the University of California.  All rights reserved.
433300Swpaul *
512891Swpaul * Redistribution and use in source and binary forms, with or without
612891Swpaul * modification, are permitted provided that the following conditions
712891Swpaul * are met:
812891Swpaul * 1. Redistributions of source code must retain the above copyright
912891Swpaul *    notice, this list of conditions and the following disclaimer.
1012891Swpaul * 2. Redistributions in binary form must reproduce the above copyright
1112891Swpaul *    notice, this list of conditions and the following disclaimer in the
1212891Swpaul *    documentation and/or other materials provided with the distribution.
1312891Swpaul * 4. Neither the name of the University nor the names of its contributors
1412891Swpaul *    may be used to endorse or promote products derived from this software
1512891Swpaul *    without specific prior written permission.
1612891Swpaul *
1712891Swpaul * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
1812891Swpaul * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1912891Swpaul * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2012891Swpaul * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2112891Swpaul * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2212891Swpaul * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2312891Swpaul * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2412891Swpaul * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2512891Swpaul * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2612891Swpaul * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2712891Swpaul * SUCH DAMAGE.
2812891Swpaul */
2912891Swpaul
3012891Swpaul#if 0
3112891Swpaul#ifndef lint
3219161Swpaulstatic char sccsid[] = "@(#)keyword.c	8.5 (Berkeley) 4/2/94";
3319161Swpaul#endif /* not lint */
3419161Swpaul#endif
3519161Swpaul#include <sys/cdefs.h>
3619161Swpaul__FBSDID("$FreeBSD: head/bin/ps/keyword.c 173100 2007-10-28 17:10:36Z julian $");
3719161Swpaul
3819161Swpaul#include <sys/param.h>
3919161Swpaul#include <sys/time.h>
4019161Swpaul#include <sys/resource.h>
4119161Swpaul#include <sys/proc.h>
4219161Swpaul#include <sys/sysctl.h>
4312891Swpaul#include <sys/user.h>
4412891Swpaul
4512891Swpaul#include <err.h>
4612891Swpaul#include <stddef.h>
4712891Swpaul#include <stdio.h>
4812891Swpaul#include <stdlib.h>
4912891Swpaul#include <string.h>
5015426Swpaul
5133100Swpaul#include "ps.h"
5212891Swpaul
5312891Swpaulstatic VAR *findvar(char *, int, char **header);
5412891Swpaulstatic int  vcmp(const void *, const void *);
5517220Sadam
5617220Sadam/* Compute offset in common structures. */
5712891Swpaul#define	KOFF(x)	offsetof(struct kinfo_proc, x)
5815426Swpaul#define	ROFF(x)	offsetof(struct rusage, x)
5913398Swpaul
6013896Swpaul#define	EMULLEN	13		/* enough for "FreeBSD ELF32" */
6112891Swpaul#define	LWPFMT	"d"
6213896Swpaul#define	LWPLEN	6
6313896Swpaul#define	NLWPFMT	"d"
6413896Swpaul#define	NLWPLEN	4
6512891Swpaul#define	UIDFMT	"u"
6633100Swpaul#define	UIDLEN	5
6712891Swpaul#define	PIDFMT	"d"
6817220Sadam#define	PIDLEN	5
6917220Sadam#define USERLEN (MAXLOGNAME - 1)
7015426Swpaul
7115426Swpaul/* PLEASE KEEP THE TABLE BELOW SORTED ALPHABETICALLY!!! */
7212891Swpaulstatic VAR var[] = {
7331110Swpaul	{"%cpu", "%CPU", NULL, 0, pcpu, NULL, 4, 0, CHAR, NULL, 0},
7412891Swpaul	{"%mem", "%MEM", NULL, 0, pmem, NULL, 4, 0, CHAR, NULL, 0},
7531110Swpaul	{"acflag", "ACFLG", NULL, 0, kvar, NULL, 3, KOFF(ki_acflag), USHORT,
7631110Swpaul		"x", 0},
7731110Swpaul	{"acflg", "", "acflag", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
7812891Swpaul	{"args", "COMMAND", NULL, COMM|LJUST|USER, arguments, NULL, 16, 0,
7912891Swpaul		CHAR, NULL, 0},
8012891Swpaul	{"blocked", "", "sigmask", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
8112891Swpaul	{"caught", "", "sigcatch", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
8212891Swpaul	{"comm", "COMMAND", NULL, LJUST, ucomm, NULL, MAXCOMLEN, 0, CHAR,
8312891Swpaul		NULL, 0},
8412891Swpaul	{"command", "COMMAND", NULL, COMM|LJUST|USER, command, NULL, 16, 0,
8512891Swpaul		CHAR, NULL, 0},
8612891Swpaul	{"cpu", "CPU", NULL, 0, kvar, NULL, 3, KOFF(ki_estcpu), UINT, "d",
8712891Swpaul		0},
8812891Swpaul	{"cputime", "", "time", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
8912891Swpaul	{"emul", "EMUL", NULL, LJUST, emulname, NULL, EMULLEN, 0, CHAR,
9012891Swpaul		NULL, 0},
9112891Swpaul	{"etime", "ELAPSED", NULL, USER, elapsed, NULL, 12, 0, CHAR, NULL, 0},
9212891Swpaul	{"f", "F", NULL, 0, kvar, NULL, 7, KOFF(ki_flag), INT, "x", 0},
9312891Swpaul	{"flags", "", "f", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
9412891Swpaul	{"ignored", "", "sigignore", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
9512891Swpaul	{"inblk", "INBLK", NULL, USER, rvar, NULL, 4, ROFF(ru_inblock), LONG,
9612891Swpaul		"ld", 0},
9712891Swpaul	{"inblock", "", "inblk", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
9812891Swpaul	{"jid", "JID", NULL, 0, kvar, NULL, 6, KOFF(ki_jid), INT, "d", 0},
9912891Swpaul	{"jobc", "JOBC", NULL, 0, kvar, NULL, 4, KOFF(ki_jobc), SHORT, "d",
10012891Swpaul		0},
10112891Swpaul	{"ktrace", "KTRACE", NULL, 0, kvar, NULL, 8, KOFF(ki_traceflag), INT,
10212891Swpaul		"x", 0},
10312891Swpaul	{"label", "LABEL", NULL, LJUST|DSIZ, label, s_label, SHRT_MAX, 0, CHAR,
10412891Swpaul	    NULL, 0},
10512891Swpaul	{"lim", "LIM", NULL, 0, maxrss, NULL, 5, 0, CHAR, NULL, 0},
10612891Swpaul	{"lockname", "LOCK", NULL, LJUST, lockname, NULL, 6, 0, CHAR, NULL,
10712891Swpaul		0},
10812891Swpaul	{"login", "LOGIN", NULL, LJUST, logname, NULL, MAXLOGNAME-1, 0, CHAR,
10915426Swpaul		NULL, 0},
11015426Swpaul	{"logname", "", "login", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
11112891Swpaul	{"lstart", "STARTED", NULL, LJUST|USER, lstarted, NULL, 28, 0, CHAR,
11212891Swpaul		NULL, 0},
11312891Swpaul	{"lwp", "LWP", NULL, 0, kvar, NULL, LWPLEN, KOFF(ki_tid), UINT,
11412891Swpaul		LWPFMT, 0},
11512891Swpaul	{"majflt", "MAJFLT", NULL, USER, rvar, NULL, 4, ROFF(ru_majflt),
11612891Swpaul		LONG, "ld", 0},
11712891Swpaul	{"minflt", "MINFLT", NULL, USER, rvar, NULL, 4, ROFF(ru_minflt),
11812891Swpaul		LONG, "ld", 0},
11916732Swpaul	{"msgrcv", "MSGRCV", NULL, USER, rvar, NULL, 4, ROFF(ru_msgrcv),
12017266Speter		LONG, "ld", 0},
12112891Swpaul	{"msgsnd", "MSGSND", NULL, USER, rvar, NULL, 4, ROFF(ru_msgsnd),
12231110Swpaul		LONG, "ld", 0},
12331110Swpaul	{"mwchan", "MWCHAN", NULL, LJUST, mwchan, NULL, 6, 0, CHAR, NULL, 0},
12431110Swpaul	{"ni", "", "nice", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
12531110Swpaul	{"nice", "NI", NULL, 0, kvar, NULL, 2, KOFF(ki_nice), CHAR, "d",
12631110Swpaul		0},
12731110Swpaul	{"nivcsw", "NIVCSW", NULL, USER, rvar, NULL, 5, ROFF(ru_nivcsw),
12831110Swpaul		LONG, "ld", 0},
12931110Swpaul	{"nlwp", "NLWP", NULL, 0, kvar, NULL, NLWPLEN, KOFF(ki_numthreads),
13031110Swpaul		UINT, NLWPFMT, 0},
13131110Swpaul	{"nsignals", "", "nsigs", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
13231110Swpaul	{"nsigs", "NSIGS", NULL, USER, rvar, NULL, 4, ROFF(ru_nsignals),
13331110Swpaul		LONG, "ld", 0},
13431110Swpaul	{"nswap", "NSWAP", NULL, USER, rvar, NULL, 4, ROFF(ru_nswap),
13531110Swpaul		LONG, "ld", 0},
13631110Swpaul	{"nvcsw", "NVCSW", NULL, USER, rvar, NULL, 5, ROFF(ru_nvcsw),
13731110Swpaul		LONG, "ld", 0},
13831110Swpaul	{"nwchan", "NWCHAN", NULL, LJUST, nwchan, NULL, 8, 0, CHAR, NULL, 0},
13931110Swpaul	{"oublk", "OUBLK", NULL, USER, rvar, NULL, 4, ROFF(ru_oublock),
14031110Swpaul		LONG, "ld", 0},
14131110Swpaul	{"oublock", "", "oublk", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
14231110Swpaul	{"paddr", "PADDR", NULL, 0, kvar, NULL, 8, KOFF(ki_paddr), KPTR,
14331110Swpaul		"lx", 0},
14431110Swpaul	{"pagein", "PAGEIN", NULL, USER, pagein, NULL, 6, 0, CHAR, NULL, 0},
14531110Swpaul	{"pcpu", "", "%cpu", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
14631110Swpaul	{"pending", "", "sig", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
14731110Swpaul	{"pgid", "PGID", NULL, 0, kvar, NULL, PIDLEN, KOFF(ki_pgid), UINT,
14831110Swpaul		PIDFMT, 0},
14931110Swpaul	{"pid", "PID", NULL, 0, kvar, NULL, PIDLEN, KOFF(ki_pid), UINT,
15031110Swpaul		PIDFMT, 0},
15131110Swpaul	{"pmem", "", "%mem", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
15231110Swpaul	{"ppid", "PPID", NULL, 0, kvar, NULL, PIDLEN, KOFF(ki_ppid), UINT,
15331110Swpaul		PIDFMT, 0},
15431110Swpaul	{"pri", "PRI", NULL, 0, pri, NULL, 3, 0, CHAR, NULL, 0},
15531110Swpaul	{"re", "RE", NULL, INF127, kvar, NULL, 3, KOFF(ki_swtime), UINT, "d",
15631110Swpaul		0},
15731110Swpaul	{"rgid", "RGID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_rgid),
15831110Swpaul		UINT, UIDFMT, 0},
15931110Swpaul	{"rgroup", "RGROUP", NULL, LJUST|DSIZ, rgroupname, s_rgroupname,
16031110Swpaul		USERLEN, 0, CHAR, NULL, 0},
16131110Swpaul	{"rss", "RSS", NULL, 0, kvar, NULL, 5, KOFF(ki_rssize), PGTOK, "ld", 0},
16231110Swpaul	{"rtprio", "RTPRIO", NULL, 0, priorityr, NULL, 7, KOFF(ki_pri), CHAR,
16331110Swpaul		NULL, 0},
16431110Swpaul	{"ruid", "RUID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_ruid),
16531110Swpaul		UINT, UIDFMT, 0},
16631110Swpaul	{"ruser", "RUSER", NULL, LJUST|DSIZ, runame, s_runame, USERLEN,
16731110Swpaul		0, CHAR, NULL, 0},
16831110Swpaul	{"sid", "SID", NULL, 0, kvar, NULL, PIDLEN, KOFF(ki_sid), UINT,
16912891Swpaul		PIDFMT, 0},
17012891Swpaul	{"sig", "PENDING", NULL, 0, kvar, NULL, 8, KOFF(ki_siglist), INT,
17113896Swpaul		"x", 0},
17212891Swpaul	{"sigcatch", "CAUGHT", NULL, 0, kvar, NULL, 8, KOFF(ki_sigcatch),
17312891Swpaul		UINT, "x", 0},
17431110Swpaul	{"sigignore", "IGNORED", NULL, 0, kvar, NULL, 8, KOFF(ki_sigignore),
17512891Swpaul		UINT, "x", 0},
17612891Swpaul	{"sigmask", "BLOCKED", NULL, 0, kvar, NULL, 8, KOFF(ki_sigmask),
17712891Swpaul		UINT, "x", 0},
17812891Swpaul	{"sl", "SL", NULL, INF127, kvar, NULL, 3, KOFF(ki_slptime), UINT, "d",
17912891Swpaul		0},
18012891Swpaul	{"start", "STARTED", NULL, LJUST|USER, started, NULL, 7, 0, CHAR, NULL,
18112891Swpaul		0},
18212891Swpaul	{"stat", "", "state", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
18312891Swpaul	{"state", "STAT", NULL, 0, state, NULL, 4, 0, CHAR, NULL, 0},
18412891Swpaul	{"svgid", "SVGID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_svgid),
18512891Swpaul		UINT, UIDFMT, 0},
18612891Swpaul	{"svuid", "SVUID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_svuid),
18712891Swpaul		UINT, UIDFMT, 0},
18812891Swpaul	{"tdev", "TDEV", NULL, 0, tdev, NULL, 4, 0, CHAR, NULL, 0},
18915426Swpaul	{"tdnam", "TDNAM", NULL, LJUST, tdnam, NULL, COMMLEN, 0, CHAR, NULL, 0},
19012891Swpaul	{"time", "TIME", NULL, USER, cputime, NULL, 9, 0, CHAR, NULL, 0},
19112891Swpaul	{"tpgid", "TPGID", NULL, 0, kvar, NULL, 4, KOFF(ki_tpgid), UINT,
19212891Swpaul		PIDFMT, 0},
19316118Swpaul	{"tsid", "TSID", NULL, 0, kvar, NULL, PIDLEN, KOFF(ki_tsid), UINT,
19416118Swpaul		PIDFMT, 0},
19516118Swpaul	{"tsiz", "TSIZ", NULL, 0, kvar, NULL, 4, KOFF(ki_tsize), PGTOK, "ld", 0},
19616118Swpaul	{"tt", "TT ", NULL, 0, tname, NULL, 4, 0, CHAR, NULL, 0},
19716118Swpaul	{"tty", "TTY", NULL, LJUST, longtname, NULL, 8, 0, CHAR, NULL, 0},
19816118Swpaul	{"ucomm", "UCOMM", NULL, LJUST, ucomm, NULL, MAXCOMLEN, 0, CHAR, NULL,
19916118Swpaul		0},
20016118Swpaul	{"uid", "UID", NULL, 0, kvar, NULL, UIDLEN, KOFF(ki_uid), UINT,
20116118Swpaul		UIDFMT, 0},
20216118Swpaul	{"upr", "UPR", NULL, 0, upr, NULL, 3, 0, CHAR, NULL, 0},
20316118Swpaul	{"uprocp", "UPROCP", NULL, 0, kvar, NULL, 8, KOFF(ki_paddr), KPTR,
20416118Swpaul		"lx", 0},
20516118Swpaul	{"user", "USER", NULL, LJUST|DSIZ, uname, s_uname, USERLEN, 0, CHAR,
20616118Swpaul		NULL, 0},
20731110Swpaul	{"usrpri", "", "upr", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
20831110Swpaul	{"vsize", "", "vsz", 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
20931110Swpaul	{"vsz", "VSZ", NULL, 0, vsize, NULL, 5, 0, CHAR, NULL, 0},
21031110Swpaul	{"wchan", "WCHAN", NULL, LJUST, wchan, NULL, 6, 0, CHAR, NULL, 0},
21131110Swpaul	{"xstat", "XSTAT", NULL, 0, kvar, NULL, 4, KOFF(ki_xstat), USHORT,
21231110Swpaul		"x", 0},
21331110Swpaul	{"", NULL, NULL, 0, NULL, NULL, 0, 0, CHAR, NULL, 0},
21431110Swpaul};
21531110Swpaul
21631110Swpaulvoid
21731110Swpaulshowkey(void)
21831110Swpaul{
21931110Swpaul	VAR *v;
22031110Swpaul	int i;
22131110Swpaul	const char *p, *sep;
22231110Swpaul
22315426Swpaul	i = 0;
22415426Swpaul	sep = "";
22517220Sadam	for (v = var; *(p = v->name); ++v) {
22617481Sadam		int len = strlen(p);
22733100Swpaul		if (termwidth && (i += len + 1) > termwidth) {
22833100Swpaul			i = len;
22915426Swpaul			sep = "\n";
23016044Swpaul		}
23116044Swpaul		(void) printf("%s%s", sep, p);
23212891Swpaul		sep = " ";
23315426Swpaul	}
23412891Swpaul	(void) printf("\n");
23512891Swpaul}
23612891Swpaul
23732775Sstevevoid
23833100Swpaulparsefmt(const char *p, int user)
23933100Swpaul{
24015426Swpaul	char *tempstr, *tempstr1;
24112891Swpaul
24212891Swpaul#define		FMTSEP	" \t,\n"
24312891Swpaul	tempstr1 = tempstr = strdup(p);
24415426Swpaul	while (tempstr && *tempstr) {
24512891Swpaul		char *cp, *hp;
24612891Swpaul		VAR *v;
24731110Swpaul		struct varent *vent;
24831110Swpaul
24931110Swpaul		/*
25012891Swpaul		 * If an item contains an equals sign, it specifies a column
25132775Ssteve		 * header, may contain embedded separator characters and
25212891Swpaul		 * is always the last item.
25333100Swpaul		 */
25415426Swpaul		if (tempstr[strcspn(tempstr, "="FMTSEP)] != '=')
25517268Speter			while ((cp = strsep(&tempstr, FMTSEP)) != NULL &&
25612891Swpaul			    *cp == '\0')
25731110Swpaul				/* void */;
25812891Swpaul		else {
25912891Swpaul			cp = tempstr;
26012891Swpaul			tempstr = NULL;
26131110Swpaul		}
26231110Swpaul		if (cp == NULL || !(v = findvar(cp, user, &hp)))
26331110Swpaul			continue;
26412891Swpaul		if (!user) {
26532775Ssteve			/*
26612891Swpaul			 * If the user is NOT adding this field manually,
26733100Swpaul			 * get on with our lives if this VAR is already
26815426Swpaul			 * represented in the list.
26912891Swpaul			 */
27012891Swpaul			vent = find_varentry(v);
27131110Swpaul			if (vent != NULL)
27212891Swpaul				continue;
27312891Swpaul		}
27412891Swpaul		if ((vent = malloc(sizeof(struct varent))) == NULL)
27512891Swpaul			errx(1, "malloc failed");
27631110Swpaul		vent->header = v->header;
27731110Swpaul		if (hp) {
27831110Swpaul			hp = strdup(hp);
27912891Swpaul			if (hp)
28032775Ssteve				vent->header = hp;
28112891Swpaul		}
28233100Swpaul		vent->var = malloc(sizeof(*vent->var));
28315426Swpaul		if (vent->var == NULL)
28412891Swpaul			errx(1, "malloc failed");
28512891Swpaul		memcpy(vent->var, v, sizeof(*vent->var));
28631110Swpaul		STAILQ_INSERT_TAIL(&varlist, vent, next_ve);
28712891Swpaul	}
28812891Swpaul	free(tempstr1);
28912891Swpaul	if (STAILQ_EMPTY(&varlist)) {
29012891Swpaul		warnx("no valid keywords; valid keywords:");
29131110Swpaul		showkey();
29231110Swpaul		exit(1);
29331110Swpaul	}
29412891Swpaul}
29532775Ssteve
29612891Swpaulstatic VAR *
29733100Swpaulfindvar(char *p, int user, char **header)
29815426Swpaul{
29912891Swpaul	size_t rflen;
30012891Swpaul	VAR *v, key;
30112891Swpaul	char *hp, *realfmt;
30231110Swpaul
30312891Swpaul	hp = strchr(p, '=');
30412891Swpaul	if (hp)
30512891Swpaul		*hp++ = '\0';
30612891Swpaul
30731110Swpaul	key.name = p;
30831110Swpaul	v = bsearch(&key, var, sizeof(var)/sizeof(VAR) - 1, sizeof(VAR), vcmp);
30931110Swpaul
31012891Swpaul	if (v && v->alias) {
31132775Ssteve		/*
31212891Swpaul		 * If the user specified an alternate-header for this
31333100Swpaul		 * (aliased) format-name, then we need to copy that
31415426Swpaul		 * alternate-header when making the recursive call to
31512891Swpaul		 * process the alias.
31612891Swpaul		 */
31731110Swpaul		if (hp == NULL)
31812891Swpaul			parsefmt(v->alias, user);
31912891Swpaul		else {
32012891Swpaul			/*
32112891Swpaul			 * XXX - This processing will not be correct for
32231110Swpaul			 * any alias which expands into a list of format
32331110Swpaul			 * keywords.  Presently there are no aliases
32431110Swpaul			 * which do that.
32512891Swpaul			 */
32632775Ssteve			rflen = strlen(v->alias) + strlen(hp) + 2;
32712891Swpaul			realfmt = malloc(rflen);
32833100Swpaul			snprintf(realfmt, rflen, "%s=%s", v->alias, hp);
32915426Swpaul			parsefmt(realfmt, user);
33012891Swpaul		}
33112891Swpaul		return ((VAR *)NULL);
33231110Swpaul	}
33312891Swpaul	if (!v) {
33412891Swpaul		warnx("%s: keyword not found", p);
33512891Swpaul		eval = 1;
33612891Swpaul	}
33712891Swpaul	if (header)
33832775Ssteve		*header = hp;
33919785Swpaul	return (v);
34033100Swpaul}
34115426Swpaul
34212891Swpaulstatic int
34312891Swpaulvcmp(const void *a, const void *b)
34412891Swpaul{
34512891Swpaul        return (strcmp(((const VAR *)a)->name, ((const VAR *)b)->name));
34615426Swpaul}
34712891Swpaul