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