diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-10-20T14·42+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2004-10-20T14·42+0000 |
commit | 2155c0a673ee1d72a9961ec5e4a864b7c797ec44 (patch) | |
tree | d793176f2377644c7fcdc2297593c3543e406712 | |
parent | 88888160d239ed68118ba1d5f94cad0a0ca7521f (diff) |
* Register channels as roots of the garbage collector (in
$(localstatedir)/nix/gcroots/channels). * In setuid installations, create gcroots/tmp and gcroots/channels group-writable.
-rw-r--r-- | Makefile.am | 4 | ||||
-rwxr-xr-x | scripts/nix-channel.in | 21 |
2 files changed, 22 insertions, 3 deletions
diff --git a/Makefile.am b/Makefile.am index 9f9f9e0a9386..f65affaf4530 100644 --- a/Makefile.am +++ b/Makefile.am @@ -16,6 +16,7 @@ install-data-local: init-state if INIT_STATE if SETUID_HACK INIT_FLAGS = -g @NIX_GROUP@ -o @NIX_USER@ +GROUP_WRITABLE = -m 775 endif init-state: $(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)/nix/profiles $(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 ln -s $(localstatedir)/nix/profiles $(DESTDIR)$(localstatedir)/nix/gcroots/profiles $(INSTALL) $(INIT_FLAGS) -d $(DESTDIR)$(prefix)/store diff --git a/scripts/nix-channel.in b/scripts/nix-channel.in index f554380e2841..d05751512d62 100755 --- a/scripts/nix-channel.in +++ b/scripts/nix-channel.in @@ -2,6 +2,8 @@ use strict; +my $rootsDir = "@localstatedir@/nix/gcroots/channels"; + # Figure out the name of the `.nix-channels' file to use. my $home = $ENV{"HOME"}; @@ -79,18 +81,33 @@ sub update { "(import @datadir@/nix/corepkgs/channels/unpack.nix) " . "{inputs = $nixExpr; system = \"@system@\";}"; - # Instantiate and realise it. + # Instantiate the Nix expression. my $storeExpr = `echo '$nixExpr' | @bindir@/nix-instantiate -` or die "cannot instantiate Nix expression"; 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"; chomp $outPath; # Make it the default Nix expression for `nix-env'. system "@bindir@/nix-env --import '$outPath'"; die "cannot pull set default Nix expression to `$outPath'" if ($? != 0); + + rename $tmpRootFile, $rootFile or die "cannot rename `$tmpRootFile' to `$rootFile'"; } |