6 defined($umask=umask) or die $!;
7 $home= $ENV{'HOME'}.'/';
9 while ($ARGV[0] =~ m/^-/) {
15 } elsif (s/^-u([0-7]{3})/-/) {
31 defined($c= open P, "-|") or die $!;
32 if (!$c) { exec './gpt','config',$inputfile; die $!; }
35 $!=0; close P; die "$! $?" if $! or $?;
40 $!=0; defined($_=<P>) or die $!;
41 chomp; s/^\s+//; s/\s+$//;
42 next if m/^\#/; next unless m/\S/;
44 m/^(.*\S)\s+([0-7]+)$/ or die;
45 ($of,$pe)=($1,oct $2);
46 $isdir= $of =~ s,/$,,;
47 ($isdir ? $dirperms{$of} : $fileperms{$of}) = $pe;
53 $parent =~ s,/[^/]+$,, or return;
57 sub maybe_chmod ($$$) {
58 my ($nowperms,$perms,$obj) = @_;
59 return if $nowperms==$perms;
61 chmod $perms, $home.$obj or die $!;
63 would($obj, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
70 $perms= exists $dirperms{$dir} ? $dirperms{$dir} : 02777&~$umask;
71 if (stat $home.$dir) {
72 -d _ or die "$dir is not a directory!";
73 $nowperms= (stat _)[2] & 07777;
74 maybe_chmod($nowperms,$perms,$dir);
76 die $! unless $!==&ENOENT;
78 mkdir $home.$dir, $perms or die $!;
80 would($dir, sprintf 'mkdir %04o', $perms);
85 -d 'new' or mkdir 'new', 02700 or die $!;
90 defined($c= fork) or die $!;
93 open STDOUT, "> $newf" or die "$newf $!";
94 exec './gpt','config',$if; die $!;
96 $!=0; waitpid($c,0)==$c or die $!;
100 opendir D, "files" or die $!;
101 while ($if=readdir D) {
102 next unless $if =~ m/^[_a-z0-9\\]/;
107 $of =~ s/\\([0-9a-f][0-9a-f]|_|\\)/
108 length $1 eq 1 ? $1 : sprintf '%c', hex $1
113 prep_proc('files/'.$if,$newf);
115 $perms= exists $fileperms{$of} ? $fileperms{$of} : 00666&~$umask;
116 chmod $perms, $newf or die $!;
118 if (stat $home.$of) {
119 -f _ or die "$of is not a file!";
120 $nowperms= (stat _)[2] & 07777;
121 if ($nowperms != $perms) {
122 would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
125 system 'diff','-u',$home.$of,$newf;
126 $?==0 or $?==256 or die $?;
130 would($of, sprintf 'create %04o', $perms);
133 rename $newf,$home.$of or die $!;
136 delete $fileperms{$of};
138 closedir D or die $!;
140 die join(', ', keys %fileperms) if %fileperms;
142 foreach $dir (keys %dirperms) {
147 my ($obj,$what) = @_;
148 return if $would_done{$obj}++;
149 print STDOUT "*** $what $obj\n" or die $!;
154 print STDOUT "=== $changes changes\n" or die $!;
156 print STDOUT "=== no changes\n" or die $!;
159 prep_proc('execute','new/,execute');
161 chmod 0700,'new/,execute' or die $!;
162 system 'new/,execute'; $? and die $?;
165 close STDOUT or die $!;