* Register channels as roots of the garbage collector (in

$(localstatedir)/nix/gcroots/channels). 
* In setuid installations, create gcroots/tmp and gcroots/channels
  group-writable.
This commit is contained in:
Eelco Dolstra 2004-10-20 14:42:38 +00:00
parent 88888160d2
commit 2155c0a673
2 changed files with 22 additions and 3 deletions

View file

@ -16,6 +16,7 @@ install-data-local: init-state
if INIT_STATE if INIT_STATE
if SETUID_HACK if SETUID_HACK
INIT_FLAGS = -g @NIX_GROUP@ -o @NIX_USER@ INIT_FLAGS = -g @NIX_GROUP@ -o @NIX_USER@
GROUP_WRITABLE = -m 775
endif endif
init-state: init-state:
$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix $(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix
@ -23,7 +24,8 @@ init-state:
$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/log/nix $(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/log/nix
$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/profiles $(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/profiles
$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/gcroots $(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/gcroots
$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(localstatedir)/nix/gcroots/tmp $(INSTALL) $(INIT_FLAGS) $(GROUP_WRITABLE) -d $(DESTDIR)$(localstatedir)/nix/gcroots/tmp
$(INSTALL) $(INIT_FLAGS) $(GROUP_WRITABLE) -d $(DESTDIR)$(localstatedir)/nix/gcroots/channels
rm -f $(DESTDIR)$(localstatedir)/nix/gcroots/profiles rm -f $(DESTDIR)$(localstatedir)/nix/gcroots/profiles
ln -s $(localstatedir)/nix/profiles $(DESTDIR)$(localstatedir)/nix/gcroots/profiles ln -s $(localstatedir)/nix/profiles $(DESTDIR)$(localstatedir)/nix/gcroots/profiles
$(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(prefix)/store $(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(prefix)/store

View file

@ -2,6 +2,8 @@
use strict; use strict;
my $rootsDir = "@localstatedir@/nix/gcroots/channels";
# Figure out the name of the `.nix-channels' file to use. # Figure out the name of the `.nix-channels' file to use.
my $home = $ENV{"HOME"}; my $home = $ENV{"HOME"};
@ -79,18 +81,33 @@ sub update {
"(import @datadir@/nix/corepkgs/channels/unpack.nix) " . "(import @datadir@/nix/corepkgs/channels/unpack.nix) " .
"{inputs = $nixExpr; system = \"@system@\";}"; "{inputs = $nixExpr; system = \"@system@\";}";
# Instantiate and realise it. # Instantiate the Nix expression.
my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate -` my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate -`
or die "cannot instantiate Nix expression"; or die "cannot instantiate Nix expression";
chomp $storeExpr; chomp $storeExpr;
my $outPath = `nix-store -qnfB '$storeExpr'` # Register the store expression as a root of the garbage
# collector.
my $userName = getpwuid($<);
die "who ARE you? go away" unless defined $userName;
my $rootFile = "$rootsDir/$userName.gcroot";
my $tmpRootFile = "$rootsDir/$userName-tmp.gcroot";
open ROOT, ">$tmpRootFile" or die "cannot create `$tmpRootFile'";
print ROOT "$storeExpr";
close ROOT;
# Realise the store expression.
my $outPath = `nix-store -qnf '$storeExpr'`
or die "cannot realise store expression"; or die "cannot realise store expression";
chomp $outPath; chomp $outPath;
# Make it the default Nix expression for `nix-env'. # Make it the default Nix expression for `nix-env'.
system "@bindir@/nix-env --import '$outPath'"; system "@bindir@/nix-env --import '$outPath'";
die "cannot pull set default Nix expression to `$outPath'" if ($? != 0); die "cannot pull set default Nix expression to `$outPath'" if ($? != 0);
rename $tmpRootFile, $rootFile or die "cannot rename `$tmpRootFile' to `$rootFile'";
} }