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-arch" 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>
