On Sun, Apr 16, 2023 at 01:37:30AM +0000, Klemens Nanni wrote: > ps(1) -U expects names, top(1) and pgrep(1) -U take numbers as well. > > With the new tree view, I start using 'ps -fU55' more often instead of > 'top -U55' to watch ports builds, but keep doing > > $ ps -fU55 > ps: p55: no such user > $ ps -fU_pbuild > ... > > The stray "p" in current error messages comes kludge_oldps_options() > treats numbers as PIDs, but that makes no sense for a mandatory -U > argument, imho, so exlucde -U here to make '-U55' work like '-U 55'. > > Make ps take both formats and use top's argument name/error message > for consistency. > > $ ./ojb/ps -fUnope > ps: nope: unknown user > $ ps -fU55 > ... > > Did I miss anything wrt. ps' old vs. new option parsing logic? > Feedback? Objection? OK?
Anyone? fstat(1) also takes both name and number. Index: ps.1 =================================================================== RCS file: /cvs/src/bin/ps/ps.1,v retrieving revision 1.129 diff -u -p -r1.129 ps.1 --- ps.1 13 Oct 2022 21:37:05 -0000 1.129 +++ ps.1 24 Apr 2023 11:19:22 -0000 @@ -47,7 +47,7 @@ .Op Fl o Ar fmt .Op Fl p Ar pid .Op Fl t Ar tty -.Op Fl U Ar username +.Op Fl U Ar user .Op Fl W Ar swap .Sh DESCRIPTION The @@ -150,9 +150,10 @@ with the standard input. .It Fl t Ar tty Display information about processes attached to the specified terminal device. -.It Fl U Ar username +.It Fl U Ar user Display the processes belonging to the specified -.Ar username . +username or UID +.Ar user . .It Fl u Display information associated with the following keywords: user, pid, %cpu, %mem, vsz, rss, tt, state, start, time, and command. Index: ps.c =================================================================== RCS file: /cvs/src/bin/ps/ps.c,v retrieving revision 1.79 diff -u -p -r1.79 ps.c --- ps.c 1 Sep 2022 21:15:54 -0000 1.79 +++ ps.c 24 Apr 2023 11:19:22 -0000 @@ -226,11 +226,24 @@ main(int argc, char *argv[]) ttydev = sb.st_rdev; break; } - case 'U': - if (uid_from_user(optarg, &uid) == -1) - errx(1, "%s: no such user", optarg); + case 'U': { + int found = 0; + + if (uid_from_user(optarg, &uid) == 0) + found = 1; + else { + const char *errstr; + + uid = strtonum(optarg, 0, UID_MAX, &errstr); + if (errstr == NULL && + user_from_uid(uid, 1) != NULL) + found = 1; + } + if (!found) + errx(1, "%s: unknown user", optarg); Uflag = xflg = 1; break; + } case 'u': parsefmt(ufmt); sortby = SORTCPU; @@ -480,11 +493,12 @@ kludge_oldps_options(char *s) memmove(ns, s, (size_t)(cp - s)); /* copy up to trailing number */ ns += cp - s; /* - * if there's a trailing number, and not a preceding 'p' (pid) or - * 't' (tty) flag, then assume it's a pid and insert a 'p' flag. + * if there's a trailing number, and not a preceding 'p' (pid), + * 't' (tty) or 'U' (user) flag, + * then assume it's a pid and insert a 'p' flag. */ if (isdigit((unsigned char)*cp) && - (cp == s || (cp[-1] != 't' && cp[-1] != 'p' && + (cp == s || (cp[-1] != 't' && cp[-1] != 'p' && cp[-1] != 'U' && (cp - 1 == s || cp[-2] != 't')))) *ns++ = 'p'; /* and append the number */ @@ -611,7 +625,7 @@ usage(void) { fprintf(stderr, "usage: %s [-AacefHhjkLlmrSTuvwx] [-M core] [-N system]" " [-O fmt] [-o fmt] [-p pid]\n", __progname); - fprintf(stderr, "%-*s[-t tty] [-U username] [-W swap]\n", + fprintf(stderr, "%-*s[-t tty] [-U user] [-W swap]\n", (int)strlen(__progname) + 8, ""); exit(1); }