* Handle the case where a symlink in /etc needs to change into a

directory.  This happened with /etc/polkit-1, which used to be a
  symlink to /etc/static/polkit-1, which was itself a symlink but now
  is a directory.  Not handling this correctly led to /etc/static
  being clobbered with symlinks pointing to themselves.

svn path=/nixos/trunk/; revision=29061
This commit is contained in:
Eelco Dolstra 2011-09-06 12:32:07 +00:00
parent 4a65eb6830
commit ed1bc1e180
2 changed files with 25 additions and 21 deletions

View File

@ -20,3 +20,4 @@ for ((i = 0; i < ${#targets_[@]}; i++)); do
echo "${modes_[$i]}" > $out/etc/${targets_[$i]}.mode
fi
done

View File

@ -22,6 +22,30 @@ sub atomicSymlink {
atomicSymlink $etc, $static or die;
# Remove dangling symlinks that point to /etc/static. These are
# configuration files that existed in a previous configuration but not
# in the current one. For efficiency, don't look under /etc/nixos
# (where all the NixOS sources live).
sub cleanup {
if ($File::Find::name eq "/etc/nixos") {
$File::Find::prune = 1;
return;
}
if (-l $_) {
my $target = readlink $_;
if (substr($target, 0, length $static) eq $static) {
my $x = "/etc/static/" . substr($File::Find::name, length "/etc/");
unless (-l $x) {
print STDERR "removing obsolete symlink $File::Find::name...\n";
unlink "$_";
}
}
}
}
find(\&cleanup, "/etc");
# For every file in the etc tree, create a corresponding symlink in
# /etc to /etc/static. The indirection through /etc/static is to make
# switching to a new configuration somewhat more atomic.
@ -42,24 +66,3 @@ sub link {
}
find(\&link, $etc);
# Remove dangling symlinks that point to /etc/static. These are
# configuration files that existed in a previous configuration but not
# in the current one. For efficiency, don't look under /etc/nixos
# (where all the NixOS sources live).
sub cleanup {
if ($File::Find::name eq "/etc/nixos") {
$File::Find::prune = 1;
return;
}
if (-l $_) {
my $target = readlink $_;
if (substr($target, 0, length $static) eq $static) {
my $x = "/etc/static/" . substr($File::Find::name, length "/etc/");
unlink "$_" unless -e "$x";
}
}
}
find(\&cleanup, "/etc");