xref: /original-bsd/usr.bin/who/who.c (revision 6c57d260)
1 static char *sccsid = "@(#)who.c	4.3 (Berkeley) 03/11/81";
2 /*
3  * who
4  */
5 
6 #include <stdio.h>
7 #include <utmp.h>
8 #include <pwd.h>
9 #include <whoami.h>
10 #include <ctype.h>
11 
12 #define NMAX sizeof(utmp.ut_name)
13 #define LMAX sizeof(utmp.ut_line)
14 
15 struct utmp utmp;
16 struct passwd *pw;
17 struct passwd *getpwuid();
18 
19 char *ttyname(), *rindex(), *ctime(), *strcpy();
20 main(argc, argv)
21 char **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) {
50 			static char myname[]=sysname;
51 			if (strcmp(utmp.ut_line, tp))
52 				continue;
53 			printf("%s!",myname);
54 			putline();
55 			exit(0);
56 		}
57 		if(utmp.ut_name[0] == '\0' && argc==1)
58 			continue;
59 		putline();
60 	}
61 }
62 
63 putline()
64 {
65 	register char *cbuf;
66 
67 	printf("%-*.*s %-*.*s", NMAX, NMAX, utmp.ut_name, LMAX, LMAX, utmp.ut_line);
68 	cbuf = ctime(&utmp.ut_time);
69 	printf("%.12s\n", cbuf+4);
70 }
71