#!/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;
    }
  }
}
