1 /* 2 * Copyright (c) 1980 Regents of the University of California. 3 * All rights reserved. The Berkeley software License Agreement 4 * specifies the terms and conditions for redistribution. 5 */ 6 7 #ifndef lint 8 char copyright[] = 9 "@(#) Copyright (c) 1980 Regents of the University of California.\n\ 10 All rights reserved.\n"; 11 #endif not lint 12 13 #ifndef lint 14 static char sccsid[] = "@(#)who.c 5.3 (Berkeley) 04/06/87"; 15 #endif not lint 16 17 /* 18 * who 19 */ 20 21 #include <stdio.h> 22 #include <utmp.h> 23 #include <pwd.h> 24 #include <ctype.h> 25 26 #define NMAX sizeof(utmp.ut_name) 27 #define LMAX sizeof(utmp.ut_line) 28 #define HMAX sizeof(utmp.ut_host) 29 30 struct utmp utmp; 31 struct passwd *pw; 32 struct passwd *getpwuid(); 33 34 char *ttyname(), *rindex(), *ctime(), *strcpy(); 35 36 main(argc, argv) 37 int argc; 38 char **argv; 39 { 40 register char *tp, *s; 41 register FILE *fi; 42 43 s = "/etc/utmp"; 44 if(argc == 2) 45 s = argv[1]; 46 if (argc == 3) { 47 tp = ttyname(0); 48 if (tp) 49 tp = rindex(tp, '/') + 1; 50 else { /* no tty - use best guess from passwd file */ 51 strcpy(utmp.ut_line, "tty??"); 52 guess(); 53 exit(0); 54 } 55 } 56 if ((fi = fopen(s, "r")) == NULL) { 57 puts("who: cannot open utmp"); 58 exit(1); 59 } 60 while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) { 61 if (argc == 3) { 62 if (strcmp(utmp.ut_line, tp)) 63 continue; 64 putline(); 65 exit(0); 66 } 67 if (utmp.ut_name[0] == '\0' && argc == 1) 68 continue; 69 putline(); 70 } 71 if (argc == 3) { 72 strncpy(utmp.ut_line, tp, sizeof(utmp.ut_line)); 73 guess(); 74 } 75 exit(0); 76 } 77 78 putline() 79 { 80 register char *cbuf; 81 82 printf("%-*.*s %-*.*s", 83 NMAX, NMAX, utmp.ut_name, 84 LMAX, LMAX, utmp.ut_line); 85 cbuf = ctime(&utmp.ut_time); 86 printf("%.12s", cbuf+4); 87 if (utmp.ut_host[0]) 88 printf("\t(%.*s)", HMAX, utmp.ut_host); 89 putchar('\n'); 90 } 91 92 guess() 93 { 94 95 pw = getpwuid(getuid()); 96 strncpy(utmp.ut_name, pw ? pw->pw_name : "?", NMAX); 97 time(&utmp.ut_time); 98 putline(); 99 } 100