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