#!/usr/bin/perl sub read_utmp { # type pid line id user host termination exit session sec usec addr pad my $UTMP_TEMPLATE = "i i A32 A4 A32 A256 s s I I I I4 A20"; # size of "struct utmp" my $UTMP_LENGTH = 384; my ($fname) = shift; my $buf, @data; if(!open(UTMP, $fname)) { print STDERR "$fname: cannot open.\n"; return 0; } while(read(UTMP, $buf, $UTMP_LENGTH) == $UTMP_LENGTH) { @data = unpack($UTMP_TEMPLATE, $buf); printf("type=%d pid=%d line=%s id=%s user=%s\n", $data[0], $data[1], $data[2], $data[3], $data[4]); printf("\thost=%s exit=%d/%d session=%d\n", $data[5], $data[6], $data[7], $data[8]); printf("\ttime=%d.%06d (" . localtime($data[9]) . ")\n", $data[9], $data[10]); } close UTMP; } ### MAIN my $fname = "/var/log/wtmp"; if($ARGV[0]) { while($fname = shift) { &read_utmp($fname); } } else { &read_utmp($fname); }