xref: /csrg-svn/usr.bin/who/who.c (revision 1165)
1*1165Sbill static char *sccsid = "@(#)who.c	4.1 (Berkeley) 10/01/80";
2*1165Sbill /*
3*1165Sbill  * who
4*1165Sbill  */
5*1165Sbill 
6*1165Sbill #include <stdio.h>
7*1165Sbill #include <utmp.h>
8*1165Sbill #include <pwd.h>
9*1165Sbill 
10*1165Sbill #define NMAX sizeof(utmp.ut_name)
11*1165Sbill #define LMAX sizeof(utmp.ut_line)
12*1165Sbill 
13*1165Sbill struct utmp utmp;
14*1165Sbill struct passwd *pw;
15*1165Sbill struct passwd *getpwuid();
16*1165Sbill 
17*1165Sbill char *ttyname(), *rindex(), *ctime(), *strcpy();
18*1165Sbill main(argc, argv)
19*1165Sbill char **argv;
20*1165Sbill {
21*1165Sbill 	register char *tp, *s;
22*1165Sbill 	register FILE *fi;
23*1165Sbill 	extern char _sobuf[];
24*1165Sbill 
25*1165Sbill 	setbuf(stdout, _sobuf);
26*1165Sbill 	s = "/etc/utmp";
27*1165Sbill 	if(argc == 2)
28*1165Sbill 		s = argv[1];
29*1165Sbill 	if (argc==3) {
30*1165Sbill 		tp = ttyname(0);
31*1165Sbill 		if (tp)
32*1165Sbill 			tp = rindex(tp, '/') + 1;
33*1165Sbill 		else {	/* no tty - use best guess from passwd file */
34*1165Sbill 			pw = getpwuid(getuid());
35*1165Sbill 			strcpy(utmp.ut_name, pw?pw->pw_name: "?");
36*1165Sbill 			strcpy(utmp.ut_line, "tty??");
37*1165Sbill 			time(&utmp.ut_time);
38*1165Sbill 			putline();
39*1165Sbill 			exit(0);
40*1165Sbill 		}
41*1165Sbill 	}
42*1165Sbill 	if ((fi = fopen(s, "r")) == NULL) {
43*1165Sbill 		puts("who: cannot open utmp");
44*1165Sbill 		exit(1);
45*1165Sbill 	}
46*1165Sbill 	while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) {
47*1165Sbill 		if(argc==3) {
48*1165Sbill 			if (strcmp(utmp.ut_line, tp))
49*1165Sbill 				continue;
50*1165Sbill #ifdef vax
51*1165Sbill 			printf("(Vax) ");
52*1165Sbill #endif
53*1165Sbill 			putline();
54*1165Sbill 			exit(0);
55*1165Sbill 		}
56*1165Sbill 		if(utmp.ut_name[0] == '\0' && argc==1)
57*1165Sbill 			continue;
58*1165Sbill 		putline();
59*1165Sbill 	}
60*1165Sbill }
61*1165Sbill 
62*1165Sbill putline()
63*1165Sbill {
64*1165Sbill 	register char *cbuf;
65*1165Sbill 
66*1165Sbill 	printf("%-*.*s %-*.*s", NMAX, NMAX, utmp.ut_name, LMAX, LMAX, utmp.ut_line);
67*1165Sbill 	cbuf = ctime(&utmp.ut_time);
68*1165Sbill 	printf("%.12s\n", cbuf+4);
69*1165Sbill }
70