6 defined($umask=umask) or die $!;
7 $home= $ENV{'HOME'}.'/';
9 while (@ARGV =~ m/^-/) {
15 } elsif (s/^-u([0-7]{3})/-/) {
30 defined($c= open P, "-|") or die $!;
31 if (!$c) { exec './gpt','config',$inputfile; die $!; }
34 $!=0; close P; die "$! $?" if $! or $?;
39 $!=0; defined($_=<P>) or die $!;
40 chomp; s/^\s+//; s/\s+$//;
41 next if m/^\#/; next unless m/\S/;
43 m/^(.*\S)\s+([0-7]+)$/ or die;
44 ($of,$pe)=($1,oct $2);
45 $isdir= $of =~ s,/$,,;
46 ($isdir ? $dirperms{$of} : $fileperms{$of}) = $pe;
52 $parent =~ s,/[^/]+$,, or return;
56 sub maybe_chmod ($$$) {
57 my ($nowperms,$perms,$obj) = @_;
58 return if $nowperms==$perms;
60 chmod $perms, $home.$obj or die $!;
62 would($obj, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
69 $perms= exists $dirperms{$dir} ? $dirperms{$dir} : 02777&~$umask;
70 if (stat $home.$dir) {
71 -d _ or die "$dir is not a directory!";
72 $nowperms= (stat _)[2] & 07777;
73 maybe_chmod($nowperms,$perms,$dir);
75 die $! unless $!==&ENOENT;
77 mkdir $home.$dir, $perms or die $!;
79 would($dir, sprintf 'mkdir %04o', $perms);
84 -d 'new' or mkdir 'new', 02700 or die $!;
86 opendir D, "files" or die $!;
87 while ($if=readdir D) {
88 next unless $if =~ m/^[:a-z0-9]/;
93 $of =~ s:\\([0-9a-f][0-9a-f]): sprintf '%c', hex $1 :ge;
97 defined($c= fork) or die $!;
100 open STDOUT, "> $newf" or die "$of $newf $!";
101 exec './gpt','config','files/'.$if; die $!;
103 $!=0; waitpid($c,0)==$c or die $!;
106 $perms= exists $fileperms{$of} ? $fileperms{$of} : 00666&~$umask;
107 chmod $perms, $newf or die $!;
109 if (stat $home.$of) {
110 -f _ or die "$of is not a file!";
111 $nowperms= (stat _)[2] & 07777;
113 if ($nowperms != $perms) {
114 would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
116 system 'diff','-u',$home.$of,$newf;
117 $?==0 or $?==256 or die $?;
120 would($of, sprintf 'create %04o', $perms);
123 rename $newf,$home.$of or die $!;
126 delete $fileperms{$of};
128 closedir D or die $!;
130 die join(', ', keys %fileperms) if %fileperms;
132 foreach $dir (keys %dirperms) {
137 my ($obj,$what) = @_;
138 return if $would_done{$obj}++;
139 print STDOUT "*** $what $obj\n" or die $!;
142 close STDOUT or die $!;