#!/usr/bin/perl -w
#
# $Revision: 1.3 $ $Date: 2012-07-26 16:57:56-04 $
# $Source: /home/vogelke/bin/RCS/getperm,v $
# $Host: sys7.com $
# $UUID: ad36ee74-654e-3e11-8566-49e1a8ca4dd2 $
#
#<getperm: print UID, GID, modtime and filemode for files read from stdin.
# use Memoize to cache results from getpw/getgr functions.
# usage: find . -print | getperm > permissions

use Memoize;
use strict;
my ($file, $mode, $uid, $usr, $gid, $grp, $mtime);

# Cache results from password/group file lookups.
memoize('saveusr');
memoize('savegrp');

sub saveusr {
    my $u = shift;
    return getpwuid($u) || $u;
}

sub savegrp {
    my $g = shift;
    return getgrgid($g) || $g;
}

# Stat each file, print user-group-mode-modtime-filename.
# Skip the file if stat fails.
while (<>) {
    chomp;
    $file = $_;
    ($mode, $uid, $gid, $mtime) = (stat($file))[2, 4, 5, 9];

    if (defined $mode) {
        $usr   = saveusr($uid);
        $grp   = savegrp($gid);
        $mode &= 07777;
        printf "%s|%s|0%o|%d|%s\n", $usr, $grp, $mode, $mtime, $file;
    }
    else {
        warn "$file: stat failed: $!\n";
    }
}

exit(0);
