Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 17 Jan 2003 20:34:27 -0800
From:      Juli Mallett <jmallett@FreeBSD.org>
To:        arch@FreeBSD.org
Cc:        standards@FreeBSD.org
Subject:   ps(1) printing the same variable a few times.
Message-ID:  <20030117203427.A18843@FreeBSD.org>

next in thread | raw e-mail | index | archive | help
The following prevents non-user-added-via-[oO] options from repeating
themselves.  This follows both POLA and BSD ps(1) mode of GNU ps in the
behaviour.  I'd just like a quick once-over to assure I'm not on the
crack.

Thanx,
juli.

%%%
Index: extern.h
===================================================================
RCS file: /home/ncvs/src/bin/ps/extern.h,v
retrieving revision 1.29
diff -d -u -r1.29 extern.h
--- extern.h	1 Nov 2002 23:26:20 -0000	1.29
+++ extern.h	18 Jan 2003 04:31:32 -0000
@@ -52,6 +52,7 @@
 void	 cputime(KINFO *, VARENT *);
 int	 donlist(void);
 void	 elapsed(KINFO *, VARENT *);
+VARENT	*find_varentry(VAR *);
 const	 char *fmt_argv(char **, char *, size_t);
 double	 getpcpu(const KINFO *);
 void	 kvar(KINFO *, VARENT *);
@@ -63,7 +64,7 @@
 void	 lockname(KINFO *, VARENT *);
 void	 mwchan(KINFO *, VARENT *);
 void	 pagein(KINFO *, VARENT *);
-void	 parsefmt(const char *);
+void	 parsefmt(const char *, int);
 void	 pcpu(KINFO *, VARENT *);
 void	 pmem(KINFO *, VARENT *);
 void	 pri(KINFO *, VARENT *);
Index: keyword.c
===================================================================
RCS file: /home/ncvs/src/bin/ps/keyword.c,v
retrieving revision 1.58
diff -d -u -r1.58 keyword.c
--- keyword.c	24 Oct 2002 00:00:57 -0000	1.58
+++ keyword.c	18 Jan 2003 04:31:32 -0000
@@ -54,7 +54,7 @@
 
 #include "ps.h"
 
-static VAR *findvar(char *);
+static VAR *findvar(char *, int);
 static int  vcmp(const void *, const void *);
 
 /* Compute offset in common structures. */
@@ -223,7 +223,7 @@
 }
 
 void
-parsefmt(const char *p)
+parsefmt(const char *p, int user)
 {
 	static struct varent *vtail;
 	char *tempstr, *tempstr1;
@@ -234,7 +234,7 @@
 		char *cp;
 		VAR *v;
 		struct varent *vent;
-
+again:
 		/*
 		 * If an item contains an equals sign, it specifies a column
 		 * header, may contain embedded separator characters and
@@ -248,8 +248,18 @@
 			cp = tempstr;
 			tempstr = NULL;
 		}
-		if (cp == NULL || !(v = findvar(cp)))
+		if (cp == NULL || !(v = findvar(cp, user)))
 			continue;
+		if (!user) {
+			/*
+			 * If the user is NOT adding this field manually,
+			 * get on with our lives if this VAR is already
+			 * represented in the list.
+			 */
+			vent = find_varentry(v);
+			if (vent != NULL)
+				continue;
+		}
 		if ((vent = malloc(sizeof(struct varent))) == NULL)
 			errx(1, "malloc failed");
 		vent->var = malloc(sizeof(*vent->var));
@@ -273,7 +283,7 @@
 }
 
 static VAR *
-findvar(char *p)
+findvar(char *p, int user)
 {
 	VAR *v, key;
 	char *hp;
@@ -290,7 +300,7 @@
 			warnx("%s: illegal keyword specification", p);
 			eval = 1;
 		}
-		parsefmt(v->alias);
+		parsefmt(v->alias, user);
 		return ((VAR *)NULL);
 	}
 	if (!v) {
Index: ps.c
===================================================================
RCS file: /home/ncvs/src/bin/ps/ps.c,v
retrieving revision 1.59
diff -d -u -r1.59 ps.c
--- ps.c	24 Oct 2002 00:00:57 -0000	1.59
+++ ps.c	18 Jan 2003 04:31:32 -0000
@@ -193,7 +193,7 @@
 			prtheader = ws.ws_row > 5 ? ws.ws_row : 22;
 			break;
 		case 'j':
-			parsefmt(jfmt);
+			parsefmt(jfmt, 0);
 			_fmt = 1;
 			jfmt[0] = '\0';
 			break;
@@ -201,7 +201,7 @@
 			showkey();
 			exit(0);
 		case 'l':
-			parsefmt(lfmt);
+			parsefmt(lfmt, 0);
 			_fmt = 1;
 			lfmt[0] = '\0';
 			break;
@@ -217,14 +217,14 @@
 			dropgid = 1;
 			break;
 		case 'O':
-			parsefmt(o1);
-			parsefmt(optarg);
-			parsefmt(o2);
+			parsefmt(o1, 1);
+			parsefmt(optarg, 1);
+			parsefmt(o2, 1);
 			o1[0] = o2[0] = '\0';
 			_fmt = 1;
 			break;
 		case 'o':
-			parsefmt(optarg);
+			parsefmt(optarg, 1);
 			_fmt = 1;
 			break;
 #if defined(LAZY_PS)
@@ -270,13 +270,13 @@
 			xflg++;		/* XXX: intuitive? */
 			break;
 		case 'u':
-			parsefmt(ufmt);
+			parsefmt(ufmt, 0);
 			sortby = SORTCPU;
 			_fmt = 1;
 			ufmt[0] = '\0';
 			break;
 		case 'v':
-			parsefmt(vfmt);
+			parsefmt(vfmt, 0);
 			sortby = SORTMEM;
 			_fmt = 1;
 			vfmt[0] = '\0';
@@ -292,7 +292,7 @@
 			xflg = 1;
 			break;
 		case 'Z':
-			parsefmt(Zfmt);
+			parsefmt(Zfmt, 0);
 			Zfmt[0] = '\0';
 			break;
 		case '?':
@@ -325,7 +325,7 @@
 		errx(1, "%s", errbuf);
 
 	if (!_fmt)
-		parsefmt(dfmt);
+		parsefmt(dfmt, 0);
 
 	/* XXX - should be cleaner */
 	if (!all && ttydev == NODEV && pid == -1 && !nuids) {
@@ -454,6 +454,18 @@
 		errx(1, "No users specified");
 
 	return uids;
+}
+
+VARENT *
+find_varentry(VAR *v)
+{
+	struct varent *vent;
+
+	for (vent = vhead; vent; vent = vent->next) {
+		if (strcmp(vent->var->name, v->name) == 0)
+			return vent;
+	}
+	return NULL;
 }
 
 static void
%%%
-- 
Juli Mallett <jmallett@FreeBSD.org>
AIM: BSDFlata -- IRC: juli on EFnet.
OpenDarwin, Mono, FreeBSD Developer.
ircd-hybrid Developer, EFnet addict.
FreeBSD on MIPS-Anything on FreeBSD.

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-standards" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030117203427.A18843>