#!/afs/athena/contrib/perl/perl

$ifmt=oct(170000);
$ifdir=oct(40000);
$ifchr=oct(20000);
$ifblk=oct(60000);
$ifreg=oct(100000);
$iflnk=oct(120000);
$ifsoc=oct(140000);
$ifexec=oct(100);

@dirs = ($#ARGV == -1)?("."):@ARGV;

foreach $dirname (@dirs) {
  if (-d $dirname) {
    opendir(CURDIR,$dirname) || die "Couldn't catalog $dirname.\n";
    @dirlist=readdir(CURDIR);
    closedir(CURDIR);
    print "CATALOG DIRECTORY $dirname\n";
    $flag=0;
  }
  else {
    @dirlist='';
    $flag=1;
    print "CATALOG FILE $dirname\n";
  }
  foreach $file (@dirlist) {
    $filename=$dirname.'/'.$file;
    if (!open(FILE,$filename)) {
      print "Couldn't stat $filename\n";
      next;
    }
    ($dev,$ino,$mode,$nlink,$uid,$gid,$rdev,$size)=stat(FILE);
    close(FILE);
    $c="?";
    $spif=$mode & $ifmt;
    $c="D" if ($spif==$ifdir);
    $c="X" if ($spif==$ifchr);
    $c="Y" if ($spif==$ifblk);
    $c="L" if ($spif==$iflnk);
    $c="S" if ($spif==$ifsoc);
    $c="T" if ($spif==$ifreg && !($mode&$ifexec));
    $c="B" if ($spif==$ifreg && ($mode&$ifexec));
    printf (" %s %03d %-72s\n",$c,$size/256,$flag?$dirname:$file);
  }
}

