From f47bfce584b81ba84aa78617d1bede441cfff570 Mon Sep 17 00:00:00 2001 From: danbst Date: Wed, 23 Jan 2019 22:19:50 +0200 Subject: make back /etc/static absolute symlink --- nixos/modules/system/etc/setup-etc.pl | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'nixos/modules/system/etc/setup-etc.pl') diff --git a/nixos/modules/system/etc/setup-etc.pl b/nixos/modules/system/etc/setup-etc.pl index 6cbf0e17793d..82ef49a2a27e 100644 --- a/nixos/modules/system/etc/setup-etc.pl +++ b/nixos/modules/system/etc/setup-etc.pl @@ -13,18 +13,26 @@ sub atomicSymlink { my ($source, $target) = @_; my $tmp = "$target.tmp"; unlink $tmp; - # Create relative symlinks, so that the links can be followed if - # the NixOS installation is not mounted as filesystem root. - # Absolute symlinks violate the os-release format - # at https://www.freedesktop.org/software/systemd/man/os-release.html - # and break e.g. systemd-nspawn and os-prober. + symlink $source, $tmp or return 0; + rename $tmp, $target or return 0; + return 1; +} + +# Create relative symlinks, so that the links can be followed if +# the NixOS installation is not mounted as filesystem root. +# Absolute symlinks violate the os-release format +# at https://www.freedesktop.org/software/systemd/man/os-release.html +# and break e.g. systemd-nspawn and os-prober. +sub atomicRelativeSymlink { + my ($source, $target) = @_; + my $tmp = "$target.tmp"; + unlink $tmp; my $rel = File::Spec->abs2rel($source, dirname $target); symlink $rel, $tmp or return 0; rename $tmp, $target or return 0; return 1; } - # Atomically update /etc/static to point at the etc files of the # current configuration. atomicSymlink $etc, $static or die; @@ -37,8 +45,7 @@ sub isStatic { if (-l $path) { my $target = readlink $path; - my $rel = File::Spec->abs2rel("/etc/static", dirname $path); - return substr($target, 0, length $rel) eq $rel; + return substr($target, 0, length "/etc/static/") eq "/etc/static/"; } if (-d $path) { @@ -111,7 +118,7 @@ sub link { if (-e "$_.mode") { my $mode = read_file("$_.mode"); chomp $mode; if ($mode eq "direct-symlink") { - atomicSymlink readlink("$static/$fn"), $target or warn; + atomicRelativeSymlink readlink("$static/$fn"), $target or warn; } else { my $uid = read_file("$_.uid"); chomp $uid; my $gid = read_file("$_.gid"); chomp $gid; @@ -125,7 +132,7 @@ sub link { push @copied, $fn; print CLEAN "$fn\n"; } elsif (-l "$_") { - atomicSymlink "$static/$fn", $target or warn; + atomicRelativeSymlink "$static/$fn", $target or warn; } } -- cgit 1.4.1