|
|
1.1 ! root 1: #ifndef lint ! 2: static char *sccsid = "@(#)who.c 4.6 (Berkeley) 8/19/83"; ! 3: #endif ! 4: /* ! 5: * who ! 6: */ ! 7: ! 8: #include <stdio.h> ! 9: #include <utmp.h> ! 10: #include <pwd.h> ! 11: #include <ctype.h> ! 12: ! 13: #define NMAX sizeof(utmp.ut_name) ! 14: #define LMAX sizeof(utmp.ut_line) ! 15: #define HMAX sizeof(utmp.ut_host) ! 16: ! 17: struct utmp utmp; ! 18: struct passwd *pw; ! 19: struct passwd *getpwuid(); ! 20: char hostname[32]; ! 21: ! 22: char *ttyname(), *rindex(), *ctime(), *strcpy(); ! 23: ! 24: main(argc, argv) ! 25: int argc; ! 26: char **argv; ! 27: { ! 28: register char *tp, *s; ! 29: register FILE *fi; ! 30: extern char _sobuf[]; ! 31: ! 32: setbuf(stdout, _sobuf); ! 33: s = "/etc/utmp"; ! 34: if(argc == 2) ! 35: s = argv[1]; ! 36: if (argc == 3) { ! 37: tp = ttyname(0); ! 38: if (tp) ! 39: tp = rindex(tp, '/') + 1; ! 40: else { /* no tty - use best guess from passwd file */ ! 41: pw = getpwuid(getuid()); ! 42: strncpy(utmp.ut_name, pw ? pw->pw_name : "?", NMAX); ! 43: strcpy(utmp.ut_line, "tty??"); ! 44: time(&utmp.ut_time); ! 45: putline(); ! 46: exit(0); ! 47: } ! 48: } ! 49: if ((fi = fopen(s, "r")) == NULL) { ! 50: puts("who: cannot open utmp"); ! 51: exit(1); ! 52: } ! 53: while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) { ! 54: if (argc == 3) { ! 55: gethostname(hostname, sizeof (hostname)); ! 56: if (strcmp(utmp.ut_line, tp)) ! 57: continue; ! 58: printf("%s!", hostname); ! 59: putline(); ! 60: exit(0); ! 61: } ! 62: if (utmp.ut_name[0] == '\0' && argc == 1) ! 63: continue; ! 64: putline(); ! 65: } ! 66: } ! 67: ! 68: putline() ! 69: { ! 70: register char *cbuf; ! 71: ! 72: printf("%-*.*s %-*.*s", ! 73: NMAX, NMAX, utmp.ut_name, ! 74: LMAX, LMAX, utmp.ut_line); ! 75: cbuf = ctime(&utmp.ut_time); ! 76: printf("%.12s", cbuf+4); ! 77: if (utmp.ut_host[0]) ! 78: printf("\t(%.*s)", HMAX, utmp.ut_host); ! 79: putchar('\n'); ! 80: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.