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