diff options
author | Garance A Drosehn <gad@FreeBSD.org> | 2004-06-24 01:57:59 +0000 |
---|---|---|
committer | Garance A Drosehn <gad@FreeBSD.org> | 2004-06-24 01:57:59 +0000 |
commit | 23b8efad7adac4ab2149c688e20aa8c566d223d3 (patch) | |
tree | ded9fcf89b683f3914bdf0f5e8f9eeae0ae8ad72 /bin | |
parent | 30d577a014c96b5db1e22912ac996db31f6a4c31 (diff) | |
download | src-23b8efad7adac4ab2149c688e20aa8c566d223d3.tar.gz src-23b8efad7adac4ab2149c688e20aa8c566d223d3.zip |
Rework the logic for `-t <tty>', such that it accepts "ttyp0" and "console",
in addition to "/dev/ttyp0" or "p0" and "/dev/console" or "co".
Notes
Notes:
svn path=/head/; revision=131010
Diffstat (limited to 'bin')
-rw-r--r-- | bin/ps/ps.c | 58 |
1 files changed, 43 insertions, 15 deletions
diff --git a/bin/ps/ps.c b/bin/ps/ps.c index 7d091312f7c3..bae465f91fdf 100644 --- a/bin/ps/ps.c +++ b/bin/ps/ps.c @@ -703,6 +703,13 @@ addelem_pid(struct listinfo *inf, const char *elem) } #undef BSD_PID_MAX +/*- + * 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 + * (matching letters that would be seen in the "TT" column) + */ static int addelem_tty(struct listinfo *inf, const char *elem) { @@ -710,25 +717,46 @@ addelem_tty(struct listinfo *inf, const char *elem) struct stat sb; char pathbuf[PATH_MAX]; - if (strcmp(elem, "co") == 0) - ttypath = strdup(_PATH_CONSOLE); - else if (*elem == '/') + ttypath = NULL; + switch (*elem) { + case '/': ttypath = elem; - else { - strlcpy(pathbuf, _PATH_TTY, sizeof(pathbuf)); + break; + case 'c': + if (strcmp(elem, "co") == 0) { + ttypath = _PATH_CONSOLE; + break; + } + /* FALLTHROUGH */ + default: + strlcpy(pathbuf, _PATH_DEV, sizeof(pathbuf)); strlcat(pathbuf, elem, sizeof(pathbuf)); ttypath = pathbuf; + if (strncmp(pathbuf, _PATH_TTY, sizeof(_PATH_TTY)) == 0) + break; + if (strcmp(pathbuf, _PATH_CONSOLE) == 0) + break; + if (stat(pathbuf, &sb) == 0 && S_ISCHR(sb.st_mode)) { + /* No need to repeat stat() && S_ISCHR() checks */ + ttypath = NULL; + break; + } + /* /dev/${elem} does not exist, so try /dev/tty${elem} */ + strlcpy(pathbuf, _PATH_TTY, sizeof(pathbuf)); + strlcat(pathbuf, elem, sizeof(pathbuf)); + break; } - - if (stat(ttypath, &sb) == -1) { - warn("%s", ttypath); - optfatal = 1; - return (0); - } - if (!S_ISCHR(sb.st_mode)) { - warn("%s: Not a terminal", ttypath); - optfatal = 1; - return (0); + if (ttypath) { + if (stat(ttypath, &sb) == -1) { + warn("%s", ttypath); + optfatal = 1; + return (0); + } + if (!S_ISCHR(sb.st_mode)) { + warn("%s: Not a terminal", ttypath); + optfatal = 1; + return (0); + } } if (inf->count >= inf->maxcount) expand_list(inf); |