#!/usr/bin/perl -w
#
# $Revision: 1.3+1 $ $Date: 2012-07-26 16:58:19-04 $
# $Source: /home/vogelke/bin/RCS/setperm,v $
# $Host: sys7.com $
# $UUID: 781fbf6b-5607-396f-8e53-65c0c90ee407 $
#
#<setperm: read UID, GID, filemode, and modtime from getperm output,
# set them accordingly for each file.
# use Memoize to cache results from getpw/getgr functions.
# usage: setperm < permissions

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

# Cache results from password/group file lookups.
memoize('saveuid');
memoize('savegid');

sub saveuid {
    my $u = shift;
    return $u if $u =~ /^\d\d*$/;
    return getpwnam($u) || $u;
}

sub savegid {
    my $g = shift;
    return $g if $g =~ /^\d\d*$/;
    return getgrnam($g) || $g;
}

# Read "user|group|mode|mtime|file", split into fields.
# Set user, group, mode, and modtime.
while (<>) {
    chomp;
    ($usr, $grp, $mode, $mtime, $file) = split(/\|/, $_, 5);
    $mode = oct($mode);      # read in as a string!
    $uid  = saveuid($usr);
    $gid  = savegid($grp);

    chown($uid, $gid, $file)     or warn "chown $file: $!\n";
    chmod($mode, $file)          or warn "chmod $file: $!\n";
    utime($mtime, $mtime, $file) or warn "utime $file: $!\n";
}

exit(0);
