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 close P; die "$?" if $?;
40 $!=0; defined($_=<P>) or die $!;
41 chomp; s/^\s+//; s/\s+$//;
42 next if m/^\#/; next unless m/\S/;
44 if (m/(.*\S)\s+\-\>\s+(\S.*)/) {
46 } elsif (m/^(.*\S)\s+\-\-$/) {
48 } elsif (m/^(.*\S)\s+(\S+)$/) {
50 $isdir= $of =~ s,/$,,;
51 if ($pe =~ m/^[0-7]+$/) {
53 } elsif ($pe eq '+x') {
55 } elsif ($pe eq '/') {
60 ($isdir ? $dirperms{$of} : $fileperms{$of}) = $pe;
67 $parent =~ s,/[^/]+$,, or return;
71 sub maybe_chmod ($$$) {
72 my ($nowperms,$perms,$obj) = @_;
73 return if $nowperms==$perms;
75 chmod $perms, $home.$obj or die $!;
77 would($obj, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
84 $perms= exists $dirperms{$dir} ? $dirperms{$dir} : 02777&~$umask;
85 if (stat $home.$dir) {
86 -d _ or die "$dir is not a directory!";
87 $nowperms= (stat _)[2] & 07777;
88 maybe_chmod($nowperms,$perms,$dir);
90 die $! unless $!==&ENOENT;
92 mkdir $home.$dir, $perms or die $!;
94 would($dir, sprintf 'mkdir %04o', $perms);
99 -d 'new' or mkdir 'new', 02700 or die $!;
104 defined($c= fork) or die $!;
107 open STDOUT, "> $newf" or die "$newf $!";
108 exec './gpt','config',$if; die $!;
110 $!=0; waitpid($c,0)==$c or die $!;
114 opendir D, "files" or die $!;
115 while ($if=readdir D) {
116 next unless $if =~ m/^[_a-z0-9\\]/;
121 $of =~ s/\\([0-9a-f][0-9a-f]|_|\\)/
122 length $1 eq 1 ? $1 : sprintf '%c', hex $1
125 next if $exclude{$of};
129 prep_proc('files/'.$if,$newf);
131 $perms= exists $fileperms{$of} ? $fileperms{$of} : 00666&~$umask;
132 chmod $perms, $newf or die $!;
134 if (stat $home.$of) {
135 -f _ or die "$of is not a file!";
136 $nowperms= (stat _)[2] & 07777;
137 if ($nowperms != $perms) {
138 would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
140 system 'diff','-u',$home.$of,$newf;
141 $?==0 or $?==256 or die $?;
144 die unless $!==&ENOENT;
145 would($of, sprintf 'create %04o', $perms);
148 rename $newf,$home.$of or die $!;
151 delete $fileperms{$of};
153 closedir D or die $!;
155 die join(', ', keys %fileperms) if %fileperms;
157 foreach $link (keys %linktargs) {
159 $targ= $linktargs{$link};
160 if (lstat $home.$link) {
161 -l _ or die "$link is not a link!";
162 defined($rl= readlink $home.$link) or die $!;
164 die unless $!==&ENOENT;
168 would($link, "symlink $targ <-");
170 unlink $home.$link if defined $rl;
171 symlink $targ,$home.$link or die $!;
176 foreach $dir (keys %dirperms) {
181 my ($obj,$what) = @_;
182 return if $would_done{$obj}++;
183 print STDOUT "*** $what $obj\n" or die $!;
188 print STDOUT "=== $changes changes\n" or die $!;
190 print STDOUT "=== no changes\n" or die $!;
193 prep_proc('execute','new/,execute');
195 chmod 0700,'new/,execute' or die $!;
196 system 'new/,execute'; $? and die $?;
199 close STDOUT or die $!;