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 if (m/(.*\S)\s+\-\>\s+(\S.*)/) {
46 } elsif (m/^(.*\S)\s+(\S+)$/) {
48 $isdir= $of =~ s,/$,,;
49 if ($pe =~ m/^[0-7]+$/) {
51 } elsif ($pe eq '+x') {
53 } elsif ($pe eq '/') {
58 ($isdir ? $dirperms{$of} : $fileperms{$of}) = $pe;
65 $parent =~ s,/[^/]+$,, or return;
69 sub maybe_chmod ($$$) {
70 my ($nowperms,$perms,$obj) = @_;
71 return if $nowperms==$perms;
73 chmod $perms, $home.$obj or die $!;
75 would($obj, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
82 $perms= exists $dirperms{$dir} ? $dirperms{$dir} : 02777&~$umask;
83 if (stat $home.$dir) {
84 -d _ or die "$dir is not a directory!";
85 $nowperms= (stat _)[2] & 07777;
86 maybe_chmod($nowperms,$perms,$dir);
88 die $! unless $!==&ENOENT;
90 mkdir $home.$dir, $perms or die $!;
92 would($dir, sprintf 'mkdir %04o', $perms);
97 -d 'new' or mkdir 'new', 02700 or die $!;
102 defined($c= fork) or die $!;
105 open STDOUT, "> $newf" or die "$newf $!";
106 exec './gpt','config',$if; die $!;
108 $!=0; waitpid($c,0)==$c or die $!;
112 opendir D, "files" or die $!;
113 while ($if=readdir D) {
114 next unless $if =~ m/^[_a-z0-9\\]/;
119 $of =~ s/\\([0-9a-f][0-9a-f]|_|\\)/
120 length $1 eq 1 ? $1 : sprintf '%c', hex $1
125 prep_proc('files/'.$if,$newf);
127 $perms= exists $fileperms{$of} ? $fileperms{$of} : 00666&~$umask;
128 chmod $perms, $newf or die $!;
130 if (stat $home.$of) {
131 -f _ or die "$of is not a file!";
132 $nowperms= (stat _)[2] & 07777;
133 if ($nowperms != $perms) {
134 would($of, sprintf 'chmod %04o -> %04o', $nowperms, $perms);
136 system 'diff','-u',$home.$of,$newf;
137 $?==0 or $?==256 or die $?;
140 die unless $!==&ENOENT;
141 would($of, sprintf 'create %04o', $perms);
144 rename $newf,$home.$of or die $!;
147 delete $fileperms{$of};
149 closedir D or die $!;
151 die join(', ', keys %fileperms) if %fileperms;
153 foreach $link (keys %linktargs) {
155 $targ= $linktargs{$link};
156 if (lstat $home.$link) {
157 -l _ or die "$link is not a link!";
158 defined($rl= readlink $home.$link) or die $!;
160 die unless $!==&ENOENT;
164 would($link, "symlink $targ <-");
166 symlink $targ,$home.$link or die $!;
171 foreach $dir (keys %dirperms) {
176 my ($obj,$what) = @_;
177 return if $would_done{$obj}++;
178 print STDOUT "*** $what $obj\n" or die $!;
183 print STDOUT "=== $changes changes\n" or die $!;
185 print STDOUT "=== no changes\n" or die $!;
188 prep_proc('execute','new/,execute');
190 chmod 0700,'new/,execute' or die $!;
191 system 'new/,execute'; $? and die $?;
194 close STDOUT or die $!;