Commit | Line | Data |
---|---|---|
aba4c79c BJ |
1 | static char *sccsid = "@(#)who.c 4.1 (Berkeley) %G%"; |
2 | /* | |
3 | * who | |
4 | */ | |
5 | ||
6 | #include <stdio.h> | |
7 | #include <utmp.h> | |
8 | #include <pwd.h> | |
9 | ||
10 | #define NMAX sizeof(utmp.ut_name) | |
11 | #define LMAX sizeof(utmp.ut_line) | |
12 | ||
13 | struct utmp utmp; | |
14 | struct passwd *pw; | |
15 | struct passwd *getpwuid(); | |
16 | ||
17 | char *ttyname(), *rindex(), *ctime(), *strcpy(); | |
18 | main(argc, argv) | |
19 | char **argv; | |
20 | { | |
21 | register char *tp, *s; | |
22 | register FILE *fi; | |
23 | extern char _sobuf[]; | |
24 | ||
25 | setbuf(stdout, _sobuf); | |
26 | s = "/etc/utmp"; | |
27 | if(argc == 2) | |
28 | s = argv[1]; | |
29 | if (argc==3) { | |
30 | tp = ttyname(0); | |
31 | if (tp) | |
32 | tp = rindex(tp, '/') + 1; | |
33 | else { /* no tty - use best guess from passwd file */ | |
34 | pw = getpwuid(getuid()); | |
35 | strcpy(utmp.ut_name, pw?pw->pw_name: "?"); | |
36 | strcpy(utmp.ut_line, "tty??"); | |
37 | time(&utmp.ut_time); | |
38 | putline(); | |
39 | exit(0); | |
40 | } | |
41 | } | |
42 | if ((fi = fopen(s, "r")) == NULL) { | |
43 | puts("who: cannot open utmp"); | |
44 | exit(1); | |
45 | } | |
46 | while (fread((char *)&utmp, sizeof(utmp), 1, fi) == 1) { | |
47 | if(argc==3) { | |
48 | if (strcmp(utmp.ut_line, tp)) | |
49 | continue; | |
50 | #ifdef vax | |
51 | printf("(Vax) "); | |
52 | #endif | |
53 | putline(); | |
54 | exit(0); | |
55 | } | |
56 | if(utmp.ut_name[0] == '\0' && argc==1) | |
57 | continue; | |
58 | putline(); | |
59 | } | |
60 | } | |
61 | ||
62 | putline() | |
63 | { | |
64 | register char *cbuf; | |
65 | ||
66 | printf("%-*.*s %-*.*s", NMAX, NMAX, utmp.ut_name, LMAX, LMAX, utmp.ut_line); | |
67 | cbuf = ctime(&utmp.ut_time); | |
68 | printf("%.12s\n", cbuf+4); | |
69 | } |