static char *sccsid
= "@(#)lastcomm.c 4.4 (Berkeley) 82/07/17";
# define N_USER 4000 /* highest alloc user # */
# define N_DEVS 43 /* hash value for device names */
# define NDEVS 500 /* max number of file names in /dev */
struct acct acct_buff
[BUFSIZ
/ sizeof (struct acct
)];
char user_list
[N_USER
][fldsiz(utmp
, ut_name
) + 1];
char dev_name
[fldsiz(utmp
, ut_line
) + 1];
struct devhash
* dev_nxt
;
# define HASH(d) (((int) d) % N_DEVS)
# define equal(a, b) (strcmp(a, b) == 0)
while (passwd
= getpwent ())
if (user_list
[passwd
->pw_uid
][0]==0)
move (passwd
->pw_name
, user_list
[passwd
->pw_uid
]);
* find dev numbers corresponding to names in /dev
acct_desc
= open ("/usr/adm/acct", 0);
perror ("/usr/adm/acct");
fstat (acct_desc
, &stat_buff
);
n_blocks
= (stat_buff
.st_size
+ BUFSIZ
- 1) / BUFSIZ
;
for (i_block
= n_blocks
- 1; i_block
>= 0; i_block
--)
lseek (acct_desc
, i_block
* BUFSIZ
, 0);
n_byte
= read (acct_desc
, acct_buff
, BUFSIZ
);
n_entry
= n_byte
/ sizeof acct_buff
[0];
for (i
= n_entry
- 1; i
>= 0; i
--)
if (!*user_list
[acct_buff
[i
].ac_uid
])
x
= expand (acct_buff
[i
].ac_utime
)
expand (acct_buff
[i
].ac_stime
);
* null terminate the command name
acct_buff
[i
].ac_comm
[10] = 0;
* replace missing command names with question marks
if (!*acct_buff
[i
].ac_comm
)
move ("?", acct_buff
[i
].ac_comm
);
* replace control characters with question marks
for (p
= acct_buff
[i
].ac_comm
; *p
; p
++)
if (*p
< '!' || '~' < *p
)
for (j
= 1; j
< argc
; j
++)
equal (acct_buff
[i
].ac_comm
, argv
[j
])
user_list
[acct_buff
[i
].ac_uid
],
tername(acct_buff
[i
].ac_tty
),
if (argc
== 1 || j
!= argc
)
"%-*s %s %-*s %-*s %6.2f %.16s\n"
, flagbits(acct_buff
[i
].ac_flag
)
, user_list
[acct_buff
[i
].ac_uid
]
, tername(acct_buff
[i
].ac_tty
)
, ctime (&acct_buff
[i
].ac_btime
)
# define BIT(flag, ch) flags[i++] = ( f & flag ) ? ch : ' '
register struct devhash
* hashtab
;
if ((fd
= opendir("/dev")) == NULL
) {
if ((hashtab
= (struct devhash
*)malloc(NDEVS
* sizeof(struct devhash
)))
== (struct devhash
*) 0) {
fprintf(stderr
, "No mem for dev table\n");
while (dp
= readdir(fd
)) {
if (dp
->d_name
[0] != 't' && strcmp(dp
->d_name
, "console"))
strncpy(hashtab
->dev_name
, dp
->d_name
, fldsiz(utmp
, ut_line
));
hashtab
->dev_name
[fldsiz(utmp
, ut_line
)] = 0;
hashtab
->dev_nxt
= dev_chain
;
register struct devhash
*hp
, *nhp
;
char name
[fldsiz(devhash
, dev_name
) + 6];
static dev_t lastdev
= (dev_t
) -1;
for (hp
= dev_hash
[HASH(dev
)]; hp
; hp
= hp
->dev_nxt
)
if (hp
->dev_dev
== dev
) {
return(lastname
= hp
->dev_name
);
for (hp
= dev_chain
; hp
; hp
= nhp
) {
strcat(name
, hp
->dev_name
);
if (stat(name
, &statb
) < 0) /* name truncated usually */
if ((statb
.st_mode
& S_IFMT
) != S_IFCHR
)
hp
->dev_dev
= statb
.st_rdev
;
hp
->dev_nxt
= dev_hash
[HASH(hp
->dev_dev
)];
dev_hash
[HASH(hp
->dev_dev
)] = hp
;
if (hp
->dev_dev
== dev
) {
return(lastname
= hp
->dev_name
);
dev_chain
= (struct devhash
*) 0;