- my $fname="/proc/interrupts";
- local *F;
- open F,$fname or die "open \"$fname\": $!";
- <F> or die "header \"$fname\"";;
- my $r=0;
- while (<F>) {
- chomp;
- my @f=split;
- last if $f[0]=~/^[A-Z]{3}:$/; # NMI/LOC/ERR/MIS
- $f[0]=~/^\s*\d+:$/ or die $f[0];
- next if $f[$#f] ne "i8042";
- for (1..$#f-2) {
- $_=$f[$_];
- /^\d+$/ or die $_;
- $r+=$_;
- }
+ my %valid_users=map(($_=>1),@ValidUsers);
+ my($idlebest,$linebest);
+ for my $utmp (User::Utmp::getut()) {
+ local $_;
+ next if defined($_=$utmp->{"ut_type"}) && $_!=&User::Utmp::USER_PROCESS();
+ next if defined($_=$utmp->{"ut_user"}) && !$valid_users{$_};
+ my $line="/dev/".$utmp->{"ut_line"};
+ my $atime=(stat $line)[8];
+ my $what="user \"".($utmp->{"ut_user"} || "<local>")."\", line \"$line\"";
+ warn "Unable to stat $what" and next if !$atime;
+ my $idle=time()-$atime;
+ warn "atime in future for $what" and next if $idle<0;
+ next if defined $idlebest && $idlebest<=$idle;
+ $idlebest=$idle;
+ $linebest=$line;