date and time created 80/10/01 17:29:35 by bill
[unix-history] / usr / src / usr.bin / who / who.c
CommitLineData
aba4c79c
BJ
1static char *sccsid = "@(#)who.c 4.1 (Berkeley) %G%";
2/*
3 * who
4 */
5
6#include <stdio.h>
7#include <utmp.h>
8#include <pwd.h>
9
10#define NMAX sizeof(utmp.ut_name)
11#define LMAX sizeof(utmp.ut_line)
12
13struct utmp utmp;
14struct passwd *pw;
15struct passwd *getpwuid();
16
17char *ttyname(), *rindex(), *ctime(), *strcpy();
18main(argc, argv)
19char **argv;
20{
21 register char *tp, *s;
22 register FILE *fi;
23 extern char _sobuf[];
24
25 setbuf(stdout, _sobuf);
26 s = "/etc/utmp";
27 if(argc == 2)
28 s = argv[1];
29 if (argc==3) {
30 tp = ttyname(0);
31 if (tp)
32 tp = rindex(tp, '/') + 1;
33 else { /* no tty - use best guess from passwd file */
34 pw = getpwuid(getuid());
35 strcpy(utmp.ut_name, pw?pw->pw_name: "?");
36 strcpy(utmp.ut_line, "tty??");
37 time(&utmp.ut_time);
38 putline();
39 exit(0);
40 }
41 }
42 if ((fi = fopen(s, "r")) == NULL) {
43 puts("who: cannot open utmp");
44 exit(1);
45 }
46 while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) {
47 if(argc==3) {
48 if (strcmp(utmp.ut_line, tp))
49 continue;
50#ifdef vax
51 printf("(Vax) ");
52#endif
53 putline();
54 exit(0);
55 }
56 if(utmp.ut_name[0] == '\0' && argc==1)
57 continue;
58 putline();
59 }
60}
61
62putline()
63{
64 register char *cbuf;
65
66 printf("%-*.*s %-*.*s", NMAX, NMAX, utmp.ut_name, LMAX, LMAX, utmp.ut_line);
67 cbuf = ctime(&utmp.ut_time);
68 printf("%.12s\n", cbuf+4);
69}