xref: /original-bsd/usr.bin/who/who.c (revision d25e1985)
1 static char *sccsid = "@(#)who.c	4.1 (Berkeley) 10/01/80";
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 
13 struct utmp utmp;
14 struct passwd *pw;
15 struct passwd *getpwuid();
16 
17 char *ttyname(), *rindex(), *ctime(), *strcpy();
18 main(argc, argv)
19 char **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 
62 putline()
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 }
70