X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/b899e9ac6d34a879cef5b7b2918a74eb6ec1cd9d..1c15e88899094343f75aeba04122cd96a96b428e:/usr/src/usr.bin/who/who.c diff --git a/usr/src/usr.bin/who/who.c b/usr/src/usr.bin/who/who.c index 7d6df0b320..6d56161507 100644 --- a/usr/src/usr.bin/who/who.c +++ b/usr/src/usr.bin/who/who.c @@ -1,80 +1,121 @@ -#ifndef lint -static char *sccsid = "@(#)who.c 4.5 (Berkeley) %G%"; -#endif /* - * who + * Copyright (c) 1989 The Regents of the University of California. + * All rights reserved. + * + * This code is derived from software contributed to Berkeley by + * Michael Fischbein. + * + * Redistribution and use in source and binary forms are permitted provided + * that: (1) source distributions retain this entire copyright notice and + * comment, and (2) distributions including binaries display the following + * acknowledgement: ``This product includes software developed by the + * University of California, Berkeley and its contributors'' in the + * documentation or other materials provided with the distribution and in + * all advertising materials mentioning features or use of this software. + * Neither the name of the University nor the names of its contributors may + * be used to endorse or promote products derived from this software without + * specific prior written permission. + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ -#include -#include -#include -#include - -#define NMAX sizeof(utmp.ut_name) -#define LMAX sizeof(utmp.ut_line) -#define HMAX sizeof(utmp.ut_host) +#ifndef lint +char copyright[] = +"@(#) Copyright (c) 1989 The Regents of the University of California.\n\ + All rights reserved.\n"; +#endif /* not lint */ -struct utmp utmp; -struct passwd *pw; -struct passwd *getpwuid(); -char hostname[32]; +#ifndef lint +static char sccsid[] = "@(#)who.c 5.11 (Berkeley) 6/1/90"; +#endif /* not lint */ -char *ttyname(), *rindex(), *ctime(), *strcpy(); +#include +#include +#include +#include +#include +#include main(argc, argv) int argc; char **argv; { - register char *tp, *s; - register FILE *fi; - extern char _sobuf[]; + register char *p; + struct utmp usr; + struct passwd *pw; + FILE *ufp, *file(); + char *t, *rindex(), *strcpy(), *strncpy(), *ttyname(); + time_t time(); - setbuf(stdout, _sobuf); - s = "/etc/utmp"; - if(argc == 2) - s = argv[1]; - if (argc == 3) { - tp = ttyname(0); - if (tp) - tp = rindex(tp, '/') + 1; - else { /* no tty - use best guess from passwd file */ - pw = getpwuid(getuid()); - strcpy(utmp.ut_name, pw?pw->pw_name: "?"); - strcpy(utmp.ut_line, "tty??"); - time(&utmp.ut_time); - putline(); - exit(0); - } - } - if ((fi = fopen(s, "r")) == NULL) { - puts("who: cannot open utmp"); + switch (argc) { + case 1: /* who */ + ufp = file(_PATH_UTMP); + /* only entries with both name and line fields */ + while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1) + if (*usr.ut_name && *usr.ut_line) + output(&usr); + break; + case 2: /* who utmp_file */ + ufp = file(argv[1]); + /* all entries */ + while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1) + output(&usr); + break; + case 3: /* who am i */ + ufp = file(_PATH_UTMP); + + /* search through the utmp and find an entry for this tty */ + if (p = ttyname(0)) { + /* strip any directory component */ + if (t = rindex(p, '/')) + p = t + 1; + while (fread((char *)&usr, sizeof(usr), 1, ufp) == 1) + if (usr.ut_name && !strcmp(usr.ut_line, p)) { + output(&usr); + exit(0); + } + /* well, at least we know what the tty is */ + (void)strncpy(usr.ut_line, p, UT_LINESIZE); + } else + (void)strcpy(usr.ut_line, "tty??"); + pw = getpwuid(getuid()); + (void)strncpy(usr.ut_name, pw ? pw->pw_name : "?", UT_NAMESIZE); + (void)time(&usr.ut_time); + *usr.ut_host = '\0'; + output(&usr); + break; + default: + (void)fprintf(stderr, "usage: who [ file ]\n who am i\n"); exit(1); } - while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) { - if (argc == 3) { - gethostname(hostname, sizeof (hostname)); - if (strcmp(utmp.ut_line, tp)) - continue; - printf("%s!", hostname); - putline(); - exit(0); - } - if (utmp.ut_name[0] == '\0' && argc == 1) - continue; - putline(); - } + exit(0); } -putline() +output(up) + struct utmp *up; { - register char *cbuf; + char *ctime(); + + (void)printf("%-*.*s %-*.*s", UT_NAMESIZE, UT_NAMESIZE, up->ut_name, + UT_LINESIZE, UT_LINESIZE, up->ut_line); + (void)printf("%.12s", ctime(&up->ut_time) + 4); + if (*up->ut_host) + printf("\t(%.*s)", UT_HOSTSIZE, up->ut_host); + (void)putchar('\n'); +} - printf("%-*.*s %-*.*s", - NMAX, NMAX, utmp.ut_name, - LMAX, LMAX, utmp.ut_line); - cbuf = ctime(&utmp.ut_time); - printf("%.12s", cbuf+4); - if (utmp.ut_host[0]) - printf("\t(%.*s)", HMAX, utmp.ut_host); - putchar('\n'); +FILE * +file(name) + char *name; +{ + extern int errno; + FILE *ufp; + char *strerror(); + + if (!(ufp = fopen(name, "r"))) { + (void)fprintf(stderr, "who: %s: %s.\n", name, strerror(errno)); + exit(1); + } + return(ufp); }