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