xref: /original-bsd/usr.bin/who/who.c (revision 55330032)
1 static char *sccsid = "@(#)who.c	4.2 (Berkeley) 11/01/80";
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 			if (islower(*myname))
54 				*myname = toupper(*myname);
55 			printf("(%s) ",myname);
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