#!/usr/bin/perl
# sort_res.perl5 - Script to group & sort lsof output by resource
#
# Copyright (c) 2004, 2005 - Fabian Frederick <fabian.frederick@gmx.fr>
#
# This program/include file is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License as published
# by the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program/include file is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty
# of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program (in the main directory of the Linux-NTFS
# distribution in the file COPYING); if not, write to the Free Software
# Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
# Note : 
#	-This script uses lsof released by Victor A. Abell
#	-lsof path recovery comes from standard perl scripts in there.
#
# Usage :
#	perl sort_res.perl5 -> display used resources + size
#	or perl sort_res.perl5 <program name>
#
# 12/2005 (FabF) 
#	-size reset in loop (script was broken in 4.76)
#	-isexec looking in .. (like other scripts)
#	-display for one or all processes
#	-removing unuseful line number arg.
#	-display global size

require 'getopts.pl';
my @args = @_;

# Set path to lsof.
if (($LSOF = &isexec("../lsof")) eq "") {    # Some distros use lsof
						    # out of $PATH
    if (($LSOF = &isexec("lsof")) eq "") {	    # Then try . and $PATH
	if (($LSOF = &isexec("../lsof")) eq "") {    # Then try ..
	    print "can't execute $LSOF\n"; exit 1
	}
    }
}

if ($ARGV[0] ne ""){
    $cmd="$LSOF -nPl -Fcns -c".$ARGV[0]."|";
}else{
    $cmd="$LSOF -nPl -Fcns|";	
}

#Parse lsof output to gather command, resource name, pid and size
#Some extradata stand to keep script genericity 
$i=0;
if (open(FILE, $cmd)){
    while (defined ($line=<FILE>)){
	$cline=$line;
	$cline =~ s"^(.)"";
	$cline =~ s/^\s+|\s+$//g;
	if($line=~m/^p/){
	    $pid=$cline;
	}else{
	    if($line=~/^s/){
		$size = $cline;
	    }else{
		if($line=~/^c/){
		    $command = $cline;
		}else{
		    if($line=~/^n/){
			$name = $cline;
			$data{$i} = { command => $command, name => $name,
				      pid => $pid , size => $size};
			$size=0;
			$i = $i+1;
		    }
		}
	    }
	}
    }
}

#Resource name sorting
sub byresname { $data{$a}{name} cmp $data{$b}{name}}
@ks=sort byresname (keys %data);

#Resource grouping
$i=0;
$cname="a";
foreach $k (@ks){
    if ($data{$k}{name} ne $cname){
	$dgroup{$i} = { name => $data{$k}{name}, size => $data{$k}{size}};
	$cname = $data{$k}{name};
	$i++;
    }	
}

#Size sort on resource hash
sub bysize { $dgroup{$a}{size} <=> $dgroup{$b}{size} }
@ks=sort bysize (keys %dgroup);
$gsize=0;
printf("  -- KB --  -- Resource --\n", );
foreach $k (@ks){
	printf("%10d  %s\n", $dgroup{$k}{size}/1024, $dgroup{$k}{name});
	$gsize+=$dgroup{$k}{size};
}

printf("Total KB : %10d\n", $gsize/1024);
## isexec($path) -- is $path executable
#
# $path   = absolute or relative path to file to test for executabiity.
#	    Paths that begin with neither '/' nor '.' that arent't found as
#	    simple references are also tested with the path prefixes of the
#	    PATH environment variable.  

sub
isexec {
    my ($path) = @_;
    my ($i, @P, $PATH);

    $path =~ s/^\s+|\s+$//g;
    if ($path eq "") { return(""); }
    if (($path =~ m#^[\/\.]#)) {
	if (-x $path) { return($path); }
	return("");
    }
    $PATH = $ENV{PATH};
    @P = split(":", $PATH);
    for ($i = 0; $i <= $#P; $i++) {
	if (-x "$P[$i]/$path") { return("$P[$i]/$path"); }
    }
    return("");
}
