From a68287bbb125af7da3cabb699af6c95a92392a26 Mon Sep 17 00:00:00 2001 From: semarie Date: Wed, 7 Oct 2015 16:11:40 +0000 Subject: [PATCH] enable tame(2) in who(1). some refactor to grab ttyname(0) early and use it later. gradually drop tame requests when no more needed. "ioctl" is used for grab ttyname(0) "rpath" is for -T and -u flag, that used stat(2) to get terminal status initial patch from deraadt with help from guenther ok deraadt@ --- usr.bin/who/who.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/usr.bin/who/who.c b/usr.bin/who/who.c index 3506affc337..63dc95c83b4 100644 --- a/usr.bin/who/who.c +++ b/usr.bin/who/who.c @@ -1,4 +1,4 @@ -/* $OpenBSD: who.c,v 1.20 2013/08/22 04:43:41 guenther Exp $ */ +/* $OpenBSD: who.c,v 1.21 2015/10/07 16:11:40 semarie Exp $ */ /* $NetBSD: who.c,v 1.4 1994/12/07 04:28:49 jtc Exp $ */ /* @@ -62,16 +62,26 @@ int show_quick; /* quick, names only */ #define HOST_WIDTH 45 int hostwidth = HOST_WIDTH; +char *mytty; int main(int argc, char *argv[]) { struct utmp usr; FILE *ufp; + char *t; int c; setlocale(LC_ALL, ""); + if (tame("stdio getpw rpath ioctl", NULL) == -1) + err(1, "tame"); + + mytty = ttyname(0); + /* strip any directory component */ + if ((t = strrchr(mytty, '/'))) + mytty = t + 1; + only_current_term = show_term = show_idle = show_labels = 0; show_quick = 0; while ((c = getopt(argc, argv, "HmqTu")) != -1) { @@ -179,21 +189,16 @@ who_am_i(FILE *ufp) { struct utmp usr; struct passwd *pw; - char *p; - char *t; /* search through the utmp and find an entry for this tty */ - if ((p = ttyname(0))) { - /* strip any directory component */ - if ((t = strrchr(p, '/'))) - p = t + 1; + if (mytty) { while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1) - if (*usr.ut_name && !strcmp(usr.ut_line, p)) { + if (*usr.ut_name && !strcmp(usr.ut_line, mytty)) { output(&usr); return; } /* well, at least we know what the tty is */ - (void)strncpy(usr.ut_line, p, UT_LINESIZE); + (void)strncpy(usr.ut_line, mytty, UT_LINESIZE); } else (void)strncpy(usr.ut_line, "tty??", UT_LINESIZE); @@ -284,6 +289,13 @@ file(char *name) err(1, "%s", name); /* NOTREACHED */ } + if (show_term || show_idle) { + if (tame("stdio getpw rpath", NULL) == -1) + err(1, "tame"); + } else { + if (tame("stdio getpw", NULL) == -1) + err(1, "tame"); + } return(ufp); } -- 2.20.1