From: semarie Date: Wed, 7 Oct 2015 16:11:40 +0000 (+0000) Subject: enable tame(2) in who(1). X-Git-Url: http://artulab.com/gitweb/?a=commitdiff_plain;h=a68287bbb125af7da3cabb699af6c95a92392a26;p=openbsd 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@ --- 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); }