xref: /original-bsd/usr.bin/who/who.c (revision d19c88bc)
1 static char *sccsid = "@(#)who.c	4.4 (Berkeley) 03/15/82";
2 /*
3  * who
4  */
5 
6 #include <stdio.h>
7 #include <utmp.h>
8 #include <pwd.h>
9 #include <ctype.h>
10 
11 #define NMAX sizeof(utmp.ut_name)
12 #define LMAX sizeof(utmp.ut_line)
13 
14 struct	utmp utmp;
15 struct	passwd *pw;
16 struct	passwd *getpwuid();
17 char	hostname[32];
18 
19 char	*ttyname(), *rindex(), *ctime(), *strcpy();
20 
21 main(argc, argv)
22 	int argc;
23 	char **argv;
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) {
52 			gethostname(hostname, sizeof (hostname));
53 			if (strcmp(utmp.ut_line, tp))
54 				continue;
55 			printf("%s!", hostname);
56 			putline();
57 			exit(0);
58 		}
59 		if(utmp.ut_name[0] == '\0' && argc==1)
60 			continue;
61 		putline();
62 	}
63 }
64 
65 putline()
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 }
73