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]|_|\\)/
94 length $1 eq 1 ? $1 : sprintf '%c', hex $1
99 defined($c= fork) or die $!;
102 open STDOUT, "> $newf" or die "$of $newf $!";
103 exec './gpt','config','files/'.$if; die $!;
105 $!=0; waitpid($c,0)==$c or die $!;
108 $perms= exists $fileperms{$of} ? $fileperms{$of} : 00666&~$umask;
109 chmod $perms, $newf or die $!;
111 if (stat $home.$of) {
112 -f _ or die "$of is not a file!";
113 $nowperms= (stat _)[2] & 07777;
115 if ($nowperms != $perms) {
116 would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
118 system 'diff','-u',$home.$of,$newf;
119 $?==0 or $?==256 or die $?;
122 would($of, sprintf 'create %04o', $perms);
125 rename $newf,$home.$of or die $!;
128 delete $fileperms{$of};
130 closedir D or die $!;
132 die join(', ', keys %fileperms) if %fileperms;
134 foreach $dir (keys %dirperms) {
139 my ($obj,$what) = @_;
140 return if $would_done{$obj}++;
141 print STDOUT "*** $what $obj\n" or die $!;
144 close STDOUT or die $!;