diff options
author | Robin Gloster <mail@glob.in> | 2016-07-31 20:51:34 +0000 |
---|---|---|
committer | Robin Gloster <mail@glob.in> | 2016-07-31 20:51:34 +0000 |
commit | 63c7b4f9a7844f0bc84d008b810375eb0fba6b2f (patch) | |
tree | e351ecd702d87ab1c4fd03246383162ec19d6de2 /nixos/modules/system | |
parent | 43ba8d295f414ab985bd3fc5d5125421bd8bd0ad (diff) | |
parent | a629cd3f02c2ad071e58d5898c5f48fb0336a705 (diff) | |
download | nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.tar nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.tar.gz nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.tar.bz2 nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.tar.lz nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.tar.xz nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.tar.zst nixlib-63c7b4f9a7844f0bc84d008b810375eb0fba6b2f.zip |
Merge remote-tracking branch 'upstream/master' into hardened-stdenv
Diffstat (limited to 'nixos/modules/system')
-rw-r--r-- | nixos/modules/system/etc/setup-etc.pl | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/nixos/modules/system/etc/setup-etc.pl b/nixos/modules/system/etc/setup-etc.pl index 89a49b972ff9..efda74161ff8 100644 --- a/nixos/modules/system/etc/setup-etc.pl +++ b/nixos/modules/system/etc/setup-etc.pl @@ -22,6 +22,33 @@ sub atomicSymlink { # current configuration. atomicSymlink $etc, $static or die; +# Returns 1 if the argument points to the files in /etc/static. That +# means either argument is a symlink to a file in /etc/static or a +# directory with all children being static. +sub isStatic { + my $path = shift; + + if (-l $path) { + my $target = readlink $path; + return substr($target, 0, length "/etc/static/") eq "/etc/static/"; + } + + if (-d $path) { + opendir DIR, "$path" or return 0; + my @names = readdir DIR or die; + closedir DIR; + + foreach my $name (@names) { + next if $name eq "." || $name eq ".."; + unless (isStatic("$path/$name")) { + return 0; + } + } + return 1; + } + + return 0; +} # Remove dangling symlinks that point to /etc/static. These are # configuration files that existed in a previous configuration but not @@ -63,6 +90,16 @@ sub link { my $target = "/etc/$fn"; File::Path::make_path(dirname $target); $created{$fn} = 1; + + # Rename doesn't work if target is directory. + if (-l $_ && -d $target) { + if (isStatic $target) { + rmtree $target or warn; + } else { + warn "$target directory contains user files. Symlinking may fail."; + } + } + if (-e "$_.mode") { my $mode = read_file("$_.mode"); chomp $mode; if ($mode eq "direct-symlink") { |