On Tue, 30 Oct 2018 21:09:29 +0100, Klemens Nanni wrote:
> This introduces filteruser() and filterpid(), where the first one can
> now easily be extended to support matching numeric UIDs. The latter one
> is now used by the `highlight` command as well.
I really dislike the side-effect in filteruser(), see below.
Otherwise looks good.
- todd
> Index: top.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/top/top.c,v
> retrieving revision 1.94
> diff -u -p -r1.94 top.c
> --- top.c 5 Oct 2018 18:56:57 -0000 1.94
> +++ top.c 30 Oct 2018 19:56:07 -0000
> @@ -83,7 +83,7 @@ int no_command = Yes;
> int old_system = No;
> int old_threads = No;
> int show_args = No;
> -pid_t hlpid = -1;
> +pid_t hlpid = (pid_t)-1;
> int combine_cpus = 0;
>
> #if Default_TOPN == Infinity
> @@ -131,6 +131,46 @@ usage(void)
> __progname);
> }
>
> +static int
> +filteruser(char buf[])
> +{
> + char *bufp = buf;
> + uid_t *uidp;
> +
> + if (bufp[0] == '-') {
> + bufp++[0] = ' ';
Why is this needed, can't you just do "bufp++"?
> + uidp = &ps.huid;
> + ps.uid = (pid_t)-1;
> + } else {
> + uidp = &ps.uid;
> + ps.huid = (pid_t)-1;
> + }
> +
> + return uid_from_user(bufp, uidp);
> +}
> +
> +static int
> +filterpid(char buf[], int hl)
> +{
> + const char *errstr;
> + int pid;
> +
> + pid = strtonum(buf, 0, INT_MAX, &errstr);
> + if (errstr != NULL || !find_pid(pid))
> + return -1;
> +
> + if (hl == Yes)
> + hlpid = (pid_t)pid;
> + else {
> + if (ps.system == No)
> + old_system = No;
> + ps.pid = (pid_t)pid;
> + ps.system = Yes;
> + }
> +
> + return 0;
> +}
> +
> static void
> parseargs(int ac, char **av)
> {