1: #ifndef lint
2: static char *sccsid = "@(#)lastcomm.c 4.3 (Berkeley) 12/14/80";
3: #endif
4: #
5:
6: /*
7: * last command
8: */
9:
10: # include <stdio.h>
11: # include <sys/types.h>
12: # include <sys/acct.h>
13: # include <signal.h>
14: # include <pwd.h>
15: # include <stat.h>
16:
17: # define N_USER 1000
18:
19: struct acct acct_buff [BUFSIZ / sizeof (struct acct)];
20:
21: char yes = 1,
22: no = 0,
23:
24: user_list [N_USER][9];
25:
26: time_t expand ();
27:
28: struct passwd
29: *passwd,
30: *getpwent ();
31:
32: struct stat stat_buff;
33:
34: main (argc, argv)
35: char **argv;
36: {
37: char acct_desc,
38: *p;
39:
40: long i,
41: j,
42: i_block,
43: n_blocks,
44: n_byte,
45: n_entry;
46:
47: float x;
48:
49: /*
50: * set up user names
51: */
52: while (passwd = getpwent ())
53: {
54: if (passwd->pw_uid > N_USER)
55: {
56: printf ("lastcomm:Too large of a user id number\n");
57: return;
58: }
59: if (user_list[passwd->pw_uid][0]==0)
60: move (passwd->pw_name, user_list [passwd->pw_uid]);
61: }
62:
63: acct_desc = open ("/usr/adm/acct", 0);
64: if (acct_desc < 0)
65: {
66: perror ("/usr/adm/acct");
67: return;
68: }
69: fstat (acct_desc, &stat_buff);
70: n_blocks = (stat_buff.st_size + BUFSIZ - 1) / BUFSIZ;
71:
72: /*
73: * read one block's worth
74: */
75: for (i_block = n_blocks - 1; i_block >= 0; i_block--)
76: {
77: lseek (acct_desc, i_block * BUFSIZ, 0);
78: n_byte = read (acct_desc, (char *)acct_buff, BUFSIZ);
79: n_entry = n_byte / sizeof acct_buff [0];
80: for (i = n_entry - 1; i >= 0; i--)
81: {
82: if (acct_buff [i].ac_uid >= N_USER)
83: {
84: printf (
85: "lastcomm:Too large of a user id number\n");
86: return;
87: }
88: if (!*user_list [acct_buff [i].ac_uid]) continue;
89: /*
90: * get the times
91: */
92: x = expand (acct_buff [i].ac_utime)
93: +
94: expand (acct_buff [i].ac_stime);
95: /*
96: * null terminate the command name
97: */
98: acct_buff [i].ac_comm [10] = 0;
99: /*
100: * replace missing command names with question marks
101: */
102: if (!*acct_buff [i].ac_comm)
103: {
104: move ("?", acct_buff [i].ac_comm);
105: }
106: /*
107: * replace control characters with question marks
108: */
109: for (p = acct_buff [i].ac_comm; *p; p++)
110: {
111: if (*p < '!' || '~' < *p) *p = '?';
112: }
113: for (j = 1; j < argc; j++)
114: {
115: if
116: (
117: equal (acct_buff [i].ac_comm, argv [j])
118: ||
119: equal
120: (
121: user_list [acct_buff [i].ac_uid],
122: argv [j]
123: )
124: )
125: {
126: break;
127: }
128: }
129: if (argc == 1 || j != argc)
130: {
131: printf
132: (
133: "%-10s %-8s %6.2f %.16s\n",
134: acct_buff [i].ac_comm,
135: user_list [acct_buff [i].ac_uid],
136: x / 60.0,
137: ctime (&acct_buff [i].ac_btime)
138: );
139: }
140: }
141: }
142: }
143:
144: time_t
145: expand (t)
146: comp_t t;
147: {
148: register time_t nt;
149:
150: nt = t & 017777;
151: t >>= 13;
152: while (t)
153: {
154: t--;
155: nt <<= 3;
156: }
157: return (nt);
158: }
159:
160: move (a, b)
161: register char *a, *b;
162: {
163: while (*b++ = *a++);
164: }
165:
166: equal (a, b)
167: register char *a, *b;
168: {
169: for (;; a++, b++)
170: {
171: if (*a != *b) return no;
172: if (!*a) return yes;
173: }
174: }
Defined functions
main
defined in line
34;
never used
move
defined in line
160; used 2 times
Defined variables
sccsid
defined in line
2;
never used
yes
defined in line
21; used 1 times
Defined macros