BSD 4 release
[unix-history] / usr / src / cmd / who.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)who.c 4.2 (Berkeley) 11/1/80";
aba4c79c
BJ
2/*
3 * who
4 */
5
6#include <stdio.h>
7#include <utmp.h>
8#include <pwd.h>
751509f1
BJ
9#include <whoami.h>
10#include <ctype.h>
aba4c79c
BJ
11
12#define NMAX sizeof(utmp.ut_name)
13#define LMAX sizeof(utmp.ut_line)
14
15struct utmp utmp;
16struct passwd *pw;
17struct passwd *getpwuid();
18
19char *ttyname(), *rindex(), *ctime(), *strcpy();
20main(argc, argv)
21char **argv;
22{
23 register char *tp, *s;
24 register FILE *fi;
25 extern char _sobuf[];
26
27 setbuf(stdout, _sobuf);
28 s = "/etc/utmp";
29 if(argc == 2)
30 s = argv[1];
31 if (argc==3) {
32 tp = ttyname(0);
33 if (tp)
34 tp = rindex(tp, '/') + 1;
35 else { /* no tty - use best guess from passwd file */
36 pw = getpwuid(getuid());
37 strcpy(utmp.ut_name, pw?pw->pw_name: "?");
38 strcpy(utmp.ut_line, "tty??");
39 time(&utmp.ut_time);
40 putline();
41 exit(0);
42 }
43 }
44 if ((fi = fopen(s, "r")) == NULL) {
45 puts("who: cannot open utmp");
46 exit(1);
47 }
48 while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) {
49 if(argc==3) {
751509f1 50 static char myname[]=sysname;
aba4c79c
BJ
51 if (strcmp(utmp.ut_line, tp))
52 continue;
751509f1
BJ
53 if (islower(*myname))
54 *myname = toupper(*myname);
55 printf("(%s) ",myname);
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}