From 8a529f590fcb84d2d966397f886be0192afafd7c Mon Sep 17 00:00:00 2001 From: John Baldwin Date: Thu, 8 Nov 2007 22:31:28 +0000 Subject: [PATCH] Teach ps(1) to parse pts TT values (i.e. '0', '1') for the -t flag. MFC after: 1 week Reported by: kris --- bin/ps/ps.c | 32 +++++++++++++++++++++++--------- 1 file changed, 23 insertions(+), 9 deletions(-) diff --git a/bin/ps/ps.c b/bin/ps/ps.c index 7ced4f49816..dc5f08da69e 100644 --- a/bin/ps/ps.c +++ b/bin/ps/ps.c @@ -74,6 +74,8 @@ __FBSDID("$FreeBSD$"); #include "ps.h" +#define _PATH_PTS "/dev/pts/" + #define W_SEP " \t" /* "Whitespace" list separators */ #define T_SEP "," /* "Terminate-element" list separators */ @@ -706,9 +708,9 @@ addelem_pid(struct listinfo *inf, const char *elem) /*- * The user can specify a device via one of three formats: - * 1) fully qualified, e.g.: /dev/ttyp0 /dev/console - * 2) missing "/dev", e.g.: ttyp0 console - * 3) two-letters, e.g.: p0 co + * 1) fully qualified, e.g.: /dev/ttyp0 /dev/console /dev/pts/0 + * 2) missing "/dev", e.g.: ttyp0 console pts/0 + * 3) two-letters, e.g.: p0 co 0 * (matching letters that would be seen in the "TT" column) */ static int @@ -716,10 +718,11 @@ addelem_tty(struct listinfo *inf, const char *elem) { const char *ttypath; struct stat sb; - char pathbuf[PATH_MAX], pathbuf2[PATH_MAX]; + char pathbuf[PATH_MAX], pathbuf2[PATH_MAX], pathbuf3[PATH_MAX]; ttypath = NULL; pathbuf2[0] = '\0'; + pathbuf3[0] = '\0'; switch (*elem) { case '/': ttypath = elem; @@ -736,6 +739,8 @@ addelem_tty(struct listinfo *inf, const char *elem) ttypath = pathbuf; if (strncmp(pathbuf, _PATH_TTY, strlen(_PATH_TTY)) == 0) break; + if (strncmp(pathbuf, _PATH_PTS, strlen(_PATH_PTS)) == 0) + break; if (strcmp(pathbuf, _PATH_CONSOLE) == 0) break; /* Check to see if /dev/tty${elem} exists */ @@ -746,21 +751,30 @@ addelem_tty(struct listinfo *inf, const char *elem) ttypath = NULL; break; } + /* Check to see if /dev/pts/${elem} exists */ + strlcpy(pathbuf3, _PATH_PTS, sizeof(pathbuf3)); + strlcat(pathbuf3, elem, sizeof(pathbuf3)); + if (stat(pathbuf3, &sb) == 0 && S_ISCHR(sb.st_mode)) { + /* No need to repeat stat() && S_ISCHR() checks */ + ttypath = NULL; + break; + } break; } if (ttypath) { if (stat(ttypath, &sb) == -1) { - if (pathbuf2[0] != '\0') - warn("%s and %s", pathbuf2, ttypath); + if (pathbuf3[0] != '\0') + warn("%s, %s, and %s", pathbuf3, pathbuf2, + ttypath); else warn("%s", ttypath); optfatal = 1; return (0); } if (!S_ISCHR(sb.st_mode)) { - if (pathbuf2[0] != '\0') - warnx("%s and %s: Not a terminal", pathbuf2, - ttypath); + if (pathbuf3[0] != '\0') + warnx("%s, %s, and %s: Not a terminal", + pathbuf3, pathbuf2, ttypath); else warnx("%s: Not a terminal", ttypath); optfatal = 1; -- 2.45.0