#!/usr/bin/env perl
# IBM(c) 2007 EPL license http://www.eclipse.org/legal/epl-v10.html

#require 'open3.pl';

#This script is a modified version of mtime to be used as part of a sensor in the
#software managemnent system. This PERL script goes and finds the latest changed file via mtime
# It recurses the directory structure starting with the directory passed in via the command line
# (directory routine) and checks each file.
#
# Result is put to stdout

$mtime    = 0;
$startdir = @ARGV[0];
chomp($startdir);

if (-d $startdir) {    #directory
    &directory("/", *mtime);
}
elsif (-f $startdir) {    #file
    my ($dv, $in, $m, $nl, $u, $g, $rd, $siz, $at, $mtime1) = stat($startdir);
    $mtime = $mtime1;
}
else { exit 1; }          #not a recognized format

print $mtime;
exit 0;

#
# directory
#
# Goes through directory tree to find files we need to pay attention too.
# Each file is checked for mtime.
#
sub directory
{
    local ($dir, *mtime, $nlink) = @_;
    local ($dev, $ino, $mode, $subcount, $dirtry, $namedirtry, $name1, $name,
        $dir1, $mtime1, $dv, $in, $m, $nl, $u, $g, $rd, $siz, $at);

    ($dev, $ino, $nlink) = stat($dir) unless $nlink;

    $dirtry = $startdir;
    $dirtry .= $dir;

    $dir1 = substr($dir, 1);

    opendir(DIR, $dirtry);

    local (@filenames) = readdir(DIR);

    if ($nlink == 2) {
        for (@filenames) {
            next if $_ eq '.';
            next if $_ eq '..';
            #
            # Check to see if the mtime of this file is later than the current mtime
            #
            $name  = "$dir/$_";
            $name1 = "$dir1/$_";
            $name2 = "/$startdir/$name1";

            ($dv, $in, $m, $nl, $u, $g, $rd, $siz, $at, $mtime1) = stat($name2);

            if ($mtime1 > $mtime) {
                $mtime = $mtime1;
            }
        }
    }
    else {
        $subcount = $nlink - 2;
        for (@filenames) {
            next if $_ eq '.';
            next if $_ eq '..';

            #
            # Check to see if the mtime of this file is later than the current mtime
            #

            $name  = "$dir/$_";
            $name1 = "$dir1/$_";
            $name2 = "/$startdir/$name1";

            ($dev, $ino, $m, $nl, $u, $g, $rd, $siz, $at, $mtime1) = stat($name2);

            if ($mtime1 > $mtime && !(-d $name2)) {
                $mtime = $mtime1;
            }

            next if $subcount == 0;

            #
            # Recurse into next lower subdirectory
            #

            $namedirtry = "/$startdir/";
            $namedirtry .= $name;

            ($dev, $ino, $mode, $nlink) = lstat($namedirtry);

            #next unless -d _;
            next unless { $nlink > 1 }
              &directory($name, *mtime, $nlink);

            --$subcount;
        }
    }
}
