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