|
|
1.1 ! root 1: static char *sccsid = "@(#)who.c 4.2 (Berkeley) 11/1/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.