who.c (1206B)
1 /* See LICENSE file for copyright and license details. */ 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 #include <time.h> 6 #include <unistd.h> 7 #include <utmp.h> 8 9 #include "config.h" 10 #include "util.h" 11 12 static void 13 usage(void) 14 { 15 eprintf("usage: who [-ml]\n"); 16 } 17 18 int 19 main(int argc, char *argv[]) 20 { 21 struct utmp usr; 22 FILE *ufp; 23 char timebuf[sizeof "yyyy-mm-dd hh:mm"]; 24 char *tty, *ttmp; 25 int mflag = 0, lflag = 0; 26 time_t t; 27 28 ARGBEGIN { 29 case 'm': 30 mflag = 1; 31 tty = ttyname(0); 32 if (!tty) 33 eprintf("ttyname: stdin:"); 34 if ((ttmp = strrchr(tty, '/'))) 35 tty = ttmp+1; 36 break; 37 case 'l': 38 lflag = 1; 39 break; 40 default: 41 usage(); 42 } ARGEND; 43 44 if (argc > 0) 45 usage(); 46 47 if (!(ufp = fopen(UTMP_PATH, "r"))) 48 eprintf("fopen: %s:", UTMP_PATH); 49 50 while (fread(&usr, sizeof(usr), 1, ufp) == 1) { 51 if (!*usr.ut_name || !*usr.ut_line || 52 usr.ut_line[0] == '~') 53 continue; 54 if (mflag != 0 && strcmp(usr.ut_line, tty) != 0) 55 continue; 56 if (!!strcmp(usr.ut_name, "LOGIN") == lflag) 57 continue; 58 t = usr.ut_time; 59 strftime(timebuf, sizeof timebuf, "%Y-%m-%d %H:%M", localtime(&t)); 60 printf("%-8s %-12s %-16s\n", usr.ut_name, usr.ut_line, timebuf); 61 } 62 fclose(ufp); 63 return 0; 64 }