diff options
Diffstat (limited to 'nix')
| -rw-r--r-- | nix/libstore/build.cc | 63 | ||||
| -rw-r--r-- | nix/libstore/builtins.cc | 4 | ||||
| -rw-r--r-- | nix/libstore/gc.cc | 11 | ||||
| -rw-r--r-- | nix/libstore/globals.cc | 2 | ||||
| -rw-r--r-- | nix/libstore/globals.hh | 11 | ||||
| -rw-r--r-- | nix/libstore/local-store.cc | 100 | ||||
| -rw-r--r-- | nix/libstore/local-store.hh | 12 | ||||
| -rw-r--r-- | nix/local.mk | 16 | ||||
| -rw-r--r-- | nix/nix-daemon/guix-daemon.cc | 20 | ||||
| -rw-r--r-- | nix/nix-daemon/nix-daemon.cc | 17 | ||||
| -rw-r--r-- | nix/scripts/authenticate.in | 11 | ||||
| -rw-r--r-- | nix/scripts/download.in | 11 | ||||
| -rw-r--r-- | nix/scripts/list-runtime-roots.in | 147 | ||||
| -rw-r--r-- | nix/scripts/offload.in | 11 | ||||
| -rw-r--r-- | nix/scripts/substitute.in | 11 | 
15 files changed, 111 insertions, 336 deletions
| diff --git a/nix/libstore/build.cc b/nix/libstore/build.cc index fe7bf79069..ad53b81413 100644 --- a/nix/libstore/build.cc +++ b/nix/libstore/build.cc @@ -614,9 +614,7 @@ HookInstance::HookInstance()  {      debug("starting build hook"); -    Path buildHook = getEnv("NIX_BUILD_HOOK"); -    if (string(buildHook, 0, 1) != "/") buildHook = settings.nixLibexecDir + "/nix/" + buildHook; -    buildHook = canonPath(buildHook); +    const Path &buildHook = settings.guixProgram;      /* Create a pipe to get the output of the child. */      fromHook.create(); @@ -642,13 +640,14 @@ HookInstance::HookInstance()          if (dup2(builderOut.writeSide, 4) == -1)              throw SysError("dupping builder's stdout/stderr"); -        execl(buildHook.c_str(), buildHook.c_str(), settings.thisSystem.c_str(), +        execl(buildHook.c_str(), buildHook.c_str(), "offload", +	    settings.thisSystem.c_str(),              (format("%1%") % settings.maxSilentTime).str().c_str(),              (format("%1%") % settings.printBuildTrace).str().c_str(),              (format("%1%") % settings.buildTimeout).str().c_str(),              NULL); -        throw SysError(format("executing `%1%'") % buildHook); +        throw SysError(format("executing `%1% offload'") % buildHook);      });      pid.setSeparatePG(true); @@ -1581,7 +1580,7 @@ void DerivationGoal::buildDone()  HookReply DerivationGoal::tryBuildHook()  { -    if (!settings.useBuildHook || getEnv("NIX_BUILD_HOOK") == "") return rpDecline; +    if (!settings.useBuildHook) return rpDecline;      if (!worker.hook)          worker.hook = std::shared_ptr<HookInstance>(new HookInstance); @@ -2864,15 +2863,6 @@ private:      /* The store path that should be realised through a substitute. */      Path storePath; -    /* The remaining substituters. */ -    Paths subs; - -    /* The current substituter. */ -    Path sub; - -    /* Whether any substituter can realise this path */ -    bool hasSubstitute; -      /* Path info returned by the substituter's query info operation. */      SubstitutablePathInfo info; @@ -2898,6 +2888,8 @@ private:      typedef void (SubstitutionGoal::*GoalState)();      GoalState state; +    void tryNext(); +  public:      SubstitutionGoal(const Path & storePath, Worker & worker, bool repair = false);      ~SubstitutionGoal(); @@ -2915,7 +2907,6 @@ public:      /* The states. */      void init(); -    void tryNext();      void gotInfo();      void referencesValid();      void tryToRun(); @@ -2931,7 +2922,6 @@ public:  SubstitutionGoal::SubstitutionGoal(const Path & storePath, Worker & worker, bool repair)      : Goal(worker) -    , hasSubstitute(false)      , repair(repair)  {      this->storePath = storePath; @@ -2981,37 +2971,31 @@ void SubstitutionGoal::init()      if (settings.readOnlyMode)          throw Error(format("cannot substitute path `%1%' - no write access to the store") % storePath); -    subs = settings.substituters; -      tryNext();  }  void SubstitutionGoal::tryNext()  { -    trace("trying next substituter"); +    trace("trying substituter"); -    if (subs.size() == 0) { +    SubstitutablePathInfos infos; +    PathSet dummy(singleton<PathSet>(storePath)); +    worker.store.querySubstitutablePathInfos(dummy, infos); +    SubstitutablePathInfos::iterator k = infos.find(storePath); +    if (k == infos.end()) {          /* None left.  Terminate this goal and let someone else deal             with it. */          debug(format("path `%1%' is required, but there is no substituter that can build it") % storePath);          /* Hack: don't indicate failure if there were no substituters.             In that case the calling derivation should just do a             build. */ -        amDone(hasSubstitute ? ecFailed : ecNoSubstituters); -        return; +        amDone(ecNoSubstituters); +	return;      } -    sub = subs.front(); -    subs.pop_front(); - -    SubstitutablePathInfos infos; -    PathSet dummy(singleton<PathSet>(storePath)); -    worker.store.querySubstitutablePathInfos(sub, dummy, infos); -    SubstitutablePathInfos::iterator k = infos.find(storePath); -    if (k == infos.end()) { tryNext(); return; } +    /* Found a substitute.  */      info = k->second; -    hasSubstitute = true;      /* To maintain the closure invariant, we first have to realise the         paths referenced by this one. */ @@ -3099,7 +3083,8 @@ void SubstitutionGoal::tryToRun()      /* Fill in the arguments. */      Strings args; -    args.push_back(baseNameOf(sub)); +    args.push_back("guix"); +    args.push_back("substitute");      args.push_back("--substitute");      args.push_back(storePath);      args.push_back(destPath); @@ -3112,9 +3097,9 @@ void SubstitutionGoal::tryToRun()          if (dup2(outPipe.writeSide, STDOUT_FILENO) == -1)              throw SysError("cannot dup output pipe into stdout"); -        execv(sub.c_str(), stringsToCharPtrs(args).data()); +        execv(settings.guixProgram.c_str(), stringsToCharPtrs(args).data()); -        throw SysError(format("executing `%1%'") % sub); +        throw SysError(format("executing `%1% substitute'") % settings.guixProgram);      });      pid.setSeparatePG(true); @@ -3127,7 +3112,9 @@ void SubstitutionGoal::tryToRun()      state = &SubstitutionGoal::finished;      if (settings.printBuildTrace) -        printMsg(lvlError, format("@ substituter-started %1% %2%") % storePath % sub); +	/* The second element in the message used to be the name of the +	   substituter but we're left with only one.  */ +        printMsg(lvlError, format("@ substituter-started %1% substitute") % storePath);  } @@ -3193,9 +3180,7 @@ void SubstitutionGoal::finished()                  % storePath % status % e.msg());          } -        /* Try the next substitute. */ -        state = &SubstitutionGoal::tryNext; -        worker.wakeUp(shared_from_this()); +	amDone(ecFailed);          return;      } diff --git a/nix/libstore/builtins.cc b/nix/libstore/builtins.cc index f7c7d42484..4111ac4760 100644 --- a/nix/libstore/builtins.cc +++ b/nix/libstore/builtins.cc @@ -39,7 +39,7 @@ static void builtinDownload(const Derivation &drv,      const char *const argv[] =        { -	"download", drvPath.c_str(), output.c_str(), NULL +	  "guix", "perform-download", drvPath.c_str(), output.c_str(), NULL        };      /* Tell the script what the store file name is, so that @@ -50,7 +50,7 @@ static void builtinDownload(const Derivation &drv,      /* Tell it about options such as "print-extended-build-trace".  */      setenv("_NIX_OPTIONS", settings.pack().c_str(), 1); -    const string program = settings.nixLibexecDir + "/download"; +    const string program = settings.guixProgram;      execv(program.c_str(), (char *const *) argv);      throw SysError(format("failed to run download program '%1%'") % program); diff --git a/nix/libstore/gc.cc b/nix/libstore/gc.cc index 46171e116c..c466996668 100644 --- a/nix/libstore/gc.cc +++ b/nix/libstore/gc.cc @@ -339,14 +339,11 @@ Roots LocalStore::findRoots()  static void addAdditionalRoots(StoreAPI & store, PathSet & roots)  { -    Path rootFinder = getEnv("NIX_ROOT_FINDER", -        settings.nixLibexecDir + "/list-runtime-roots"); +    debug(format("executing `%1% gc --list-busy' to find additional roots") +	  % settings.guixProgram); -    if (rootFinder.empty()) return; - -    debug(format("executing `%1%' to find additional roots") % rootFinder); - -    string result = runProgram(rootFinder); +    const Strings args = { "gc", "--list-busy" }; +    string result = runProgram(settings.guixProgram, false, args);      StringSet paths = tokenizeString<StringSet>(result, "\n"); diff --git a/nix/libstore/globals.cc b/nix/libstore/globals.cc index 6df20e7a52..0cc001fbe4 100644 --- a/nix/libstore/globals.cc +++ b/nix/libstore/globals.cc @@ -70,9 +70,9 @@ void Settings::processEnvironment()      nixStateDir = canonPath(getEnv("GUIX_STATE_DIRECTORY", NIX_STATE_DIR));      nixDBPath = getEnv("GUIX_DATABASE_DIRECTORY", nixStateDir + "/db");      nixConfDir = canonPath(getEnv("GUIX_CONFIGURATION_DIRECTORY", GUIX_CONFIGURATION_DIRECTORY)); -    nixLibexecDir = canonPath(getEnv("NIX_LIBEXEC_DIR", NIX_LIBEXEC_DIR));      nixBinDir = canonPath(getEnv("NIX_BIN_DIR", NIX_BIN_DIR));      nixDaemonSocketFile = canonPath(nixStateDir + DEFAULT_SOCKET_PATH); +    guixProgram = canonPath(getEnv("GUIX", nixBinDir + "/guix"));  } diff --git a/nix/libstore/globals.hh b/nix/libstore/globals.hh index b073f724b6..27616a2283 100644 --- a/nix/libstore/globals.hh +++ b/nix/libstore/globals.hh @@ -57,15 +57,15 @@ struct Settings {      /* The directory where configuration files are stored. */      Path nixConfDir; -    /* The directory where internal helper programs are stored. */ -    Path nixLibexecDir; -      /* The directory where the main programs are stored. */      Path nixBinDir;      /* File name of the socket the daemon listens to.  */      Path nixDaemonSocketFile; +    /* Absolute file name of the 'guix' program.  */ +    Path guixProgram; +      /* Whether to keep temporary directories of failed builds. */      bool keepFailed; @@ -112,11 +112,6 @@ struct Settings {         means infinity.  */      time_t buildTimeout; -    /* The substituters.  There are programs that can somehow realise -       a store path without building, e.g., by downloading it or -       copying it from a CD. */ -    Paths substituters; -      /* Whether to use build hooks (for distributed builds).  Sometimes         users want to disable this from the command-line. */      bool useBuildHook; diff --git a/nix/libstore/local-store.cc b/nix/libstore/local-store.cc index 892d9300b1..3b08492c64 100644 --- a/nix/libstore/local-store.cc +++ b/nix/libstore/local-store.cc @@ -184,13 +184,15 @@ LocalStore::LocalStore(bool reserveSpace)  LocalStore::~LocalStore()  {      try { -        foreach (RunningSubstituters::iterator, i, runningSubstituters) { -            if (i->second.disabled) continue; -            i->second.to.close(); -            i->second.from.close(); -            i->second.error.close(); -            if (i->second.pid != -1) -                i->second.pid.wait(true); +	if (runningSubstituter) { +	    RunningSubstituter &i = *runningSubstituter; +            if (!i.disabled) { +		i.to.close(); +		i.from.close(); +		i.error.close(); +		if (i.pid != -1) +		    i.pid.wait(true); +	    }          }      } catch (...) {          ignoreException(); @@ -808,11 +810,12 @@ void LocalStore::setSubstituterEnv()  } -void LocalStore::startSubstituter(const Path & substituter, RunningSubstituter & run) +void LocalStore::startSubstituter(RunningSubstituter & run)  {      if (run.disabled || run.pid != -1) return; -    debug(format("starting substituter program `%1%'") % substituter); +    debug(format("starting substituter program `%1% substitute'") +	  % settings.guixProgram);      Pipe toPipe, fromPipe, errorPipe; @@ -829,11 +832,10 @@ void LocalStore::startSubstituter(const Path & substituter, RunningSubstituter &              throw SysError("dupping stdout");          if (dup2(errorPipe.writeSide, STDERR_FILENO) == -1)              throw SysError("dupping stderr"); -        execl(substituter.c_str(), substituter.c_str(), "--query", NULL); -        throw SysError(format("executing `%1%'") % substituter); +        execl(settings.guixProgram.c_str(), "guix", "substitute", "--query", NULL); +        throw SysError(format("executing `%1%'") % settings.guixProgram);      }); -    run.program = baseNameOf(substituter);      run.to = toPipe.writeSide.borrow();      run.from = run.fromBuf.fd = fromPipe.readSide.borrow();      run.error = errorPipe.readSide.borrow(); @@ -889,13 +891,14 @@ string LocalStore::getLineFromSubstituter(RunningSubstituter & run)                  if (errno == EINTR) continue;                  throw SysError("reading from substituter's stderr");              } -            if (n == 0) throw EndOfFile(format("substituter `%1%' died unexpectedly") % run.program); +            if (n == 0) throw EndOfFile(format("`%1% substitute' died unexpectedly") +					% settings.guixProgram);              err.append(buf, n);              string::size_type p;              while (((p = err.find('\n')) != string::npos)  		   || ((p = err.find('\r')) != string::npos)) {  	        string thing(err, 0, p + 1); -	        writeToStderr(run.program + ": " + thing); +	        writeToStderr("substitute: " + thing);                  err = string(err, p + 1);              }          } @@ -907,7 +910,7 @@ string LocalStore::getLineFromSubstituter(RunningSubstituter & run)                  unsigned char c;                  run.fromBuf(&c, 1);                  if (c == '\n') { -                    if (!err.empty()) printMsg(lvlError, run.program + ": " + err); +                    if (!err.empty()) printMsg(lvlError, "substitute: " + err);                      return res;                  }                  res += c; @@ -930,38 +933,47 @@ PathSet LocalStore::querySubstitutablePaths(const PathSet & paths)  {      PathSet res; -    if (!settings.useSubstitutes) return res; +    if (!settings.useSubstitutes || paths.empty()) return res; -    foreach (Paths::iterator, i, settings.substituters) { -        if (res.size() == paths.size()) break; -        RunningSubstituter & run(runningSubstituters[*i]); -        startSubstituter(*i, run); -        if (run.disabled) continue; -        string s = "have "; -        foreach (PathSet::const_iterator, j, paths) -            if (res.find(*j) == res.end()) { s += *j; s += " "; } -        writeLine(run.to, s); -        while (true) { -            /* FIXME: we only read stderr when an error occurs, so -               substituters should only write (short) messages to -               stderr when they fail.  I.e. they shouldn't write debug -               output. */ -            Path path = getLineFromSubstituter(run); -            if (path == "") break; -            res.insert(path); -        } +    if (!runningSubstituter) { +	std::unique_ptr<RunningSubstituter>fresh(new RunningSubstituter); +	runningSubstituter.swap(fresh); +    } + +    RunningSubstituter & run = *runningSubstituter; +    startSubstituter(run); + +    if (!run.disabled) { +	string s = "have "; +	foreach (PathSet::const_iterator, j, paths) +	    if (res.find(*j) == res.end()) { s += *j; s += " "; } +	writeLine(run.to, s); +	while (true) { +	    /* FIXME: we only read stderr when an error occurs, so +	       substituters should only write (short) messages to +	       stderr when they fail.  I.e. they shouldn't write debug +	       output. */ +	    Path path = getLineFromSubstituter(run); +	    if (path == "") break; +	    res.insert(path); +	}      } +      return res;  } -void LocalStore::querySubstitutablePathInfos(const Path & substituter, -    PathSet & paths, SubstitutablePathInfos & infos) +void LocalStore::querySubstitutablePathInfos(PathSet & paths, SubstitutablePathInfos & infos)  {      if (!settings.useSubstitutes) return; -    RunningSubstituter & run(runningSubstituters[substituter]); -    startSubstituter(substituter, run); +    if (!runningSubstituter) { +	std::unique_ptr<RunningSubstituter>fresh(new RunningSubstituter); +	runningSubstituter.swap(fresh); +    } + +    RunningSubstituter & run = *runningSubstituter; +    startSubstituter(run);      if (run.disabled) return;      string s = "info "; @@ -993,10 +1005,9 @@ void LocalStore::querySubstitutablePathInfos(const Path & substituter,  void LocalStore::querySubstitutablePathInfos(const PathSet & paths,      SubstitutablePathInfos & infos)  { -    PathSet todo = paths; -    foreach (Paths::iterator, i, settings.substituters) { -        if (todo.empty()) break; -        querySubstitutablePathInfos(*i, todo, infos); +    if (!paths.empty()) { +	PathSet todo = paths; +	querySubstitutablePathInfos(todo, infos);      }  } @@ -1224,8 +1235,9 @@ static void checkSecrecy(const Path & path)  static std::string runAuthenticationProgram(const Strings & args)  { -    return runProgram(settings.nixLibexecDir + "/authenticate", -		      false, args); +    Strings fullArgs = { "authenticate" }; +    fullArgs.insert(fullArgs.end(), args.begin(), args.end()); // append +    return runProgram(settings.guixProgram, false, fullArgs);  }  void LocalStore::exportPath(const Path & path, bool sign, diff --git a/nix/libstore/local-store.hh b/nix/libstore/local-store.hh index 4e6b4cfc1d..4113fafcb5 100644 --- a/nix/libstore/local-store.hh +++ b/nix/libstore/local-store.hh @@ -40,7 +40,6 @@ struct OptimiseStats  struct RunningSubstituter  { -    Path program;      Pid pid;      AutoCloseFD to, from, error;      FdSource fromBuf; @@ -52,8 +51,8 @@ struct RunningSubstituter  class LocalStore : public StoreAPI  {  private: -    typedef std::map<Path, RunningSubstituter> RunningSubstituters; -    RunningSubstituters runningSubstituters; +    /* The currently running substituter or empty.  */ +    std::unique_ptr<RunningSubstituter> runningSubstituter;      Path linksDir; @@ -93,8 +92,8 @@ public:      PathSet querySubstitutablePaths(const PathSet & paths); -    void querySubstitutablePathInfos(const Path & substituter, -        PathSet & paths, SubstitutablePathInfos & infos); +    void querySubstitutablePathInfos(PathSet & paths, +        SubstitutablePathInfos & infos);      void querySubstitutablePathInfos(const PathSet & paths,          SubstitutablePathInfos & infos); @@ -261,8 +260,7 @@ private:      void removeUnusedLinks(const GCState & state); -    void startSubstituter(const Path & substituter, -        RunningSubstituter & runningSubstituter); +    void startSubstituter(RunningSubstituter & runningSubstituter);      string getLineFromSubstituter(RunningSubstituter & run); diff --git a/nix/local.mk b/nix/local.mk index 6d7e60e9fb..dc5a8398b2 100644 --- a/nix/local.mk +++ b/nix/local.mk @@ -110,7 +110,6 @@ libstore_a_CPPFLAGS =				\    -DNIX_STATE_DIR=\"$(localstatedir)/guix\"	\    -DNIX_LOG_DIR=\"$(localstatedir)/log/guix\"	\    -DGUIX_CONFIGURATION_DIRECTORY=\"$(sysconfdir)/guix\"		\ -  -DNIX_LIBEXEC_DIR=\"$(libexecdir)/guix\"	\    -DNIX_BIN_DIR=\"$(bindir)\"			\    -DDEFAULT_CHROOT_DIRS="\"\"" @@ -154,21 +153,6 @@ noinst_HEADERS =						\  	         (lambda (in)					\  	           (write (get-string-all in) out)))))" -nodist_pkglibexec_SCRIPTS =			\ -  %D%/scripts/list-runtime-roots		\ -  %D%/scripts/substitute			\ -  %D%/scripts/download - -if BUILD_DAEMON_OFFLOAD - -nodist_pkglibexec_SCRIPTS +=			\ -  %D%/scripts/offload - -endif BUILD_DAEMON_OFFLOAD - -nodist_pkglibexec_SCRIPTS +=			\ -  %D%/scripts/authenticate -  # The '.service' files for systemd.  systemdservicedir = $(libdir)/systemd/system  nodist_systemdservice_DATA = etc/guix-daemon.service etc/guix-publish.service diff --git a/nix/nix-daemon/guix-daemon.cc b/nix/nix-daemon/guix-daemon.cc index f47d142612..6f9c404c8d 100644 --- a/nix/nix-daemon/guix-daemon.cc +++ b/nix/nix-daemon/guix-daemon.cc @@ -466,23 +466,15 @@ main (int argc, char *argv[])      {        settings.processEnvironment (); -      /* Use our substituter by default.  */ -      settings.substituters.clear (); +      /* Enable substitutes by default.  */        settings.set ("build-use-substitutes", "true");        /* Use our substitute server by default.  */        settings.set ("substitute-urls", GUIX_SUBSTITUTE_URLS);  #ifdef HAVE_DAEMON_OFFLOAD_HOOK -      /* Use our build hook for distributed builds by default.  */ +      /* Use 'guix offload' for distributed builds by default.  */        settings.useBuildHook = true; -      if (getenv ("NIX_BUILD_HOOK") == NULL) -	{ -	  std::string build_hook; - -	  build_hook = settings.nixLibexecDir + "/offload"; -	  setenv ("NIX_BUILD_HOOK", build_hook.c_str (), 1); -	}  #else        /* We are not installing any build hook, so disable it.  */        settings.useBuildHook = false; @@ -497,14 +489,6 @@ main (int argc, char *argv[])        printMsg(lvlDebug,  	       format ("build log compression: %1%") % settings.logCompression); -      if (settings.useSubstitutes) -	settings.substituters.push_back (settings.nixLibexecDir -					 + "/substitute"); -      else -	/* Clear the substituter list to make sure nothing ever gets -	   substituted, regardless of the client's settings.  */ -	settings.substituters.clear (); -        if (geteuid () == 0 && settings.buildUsersGroup.empty ())  	fprintf (stderr, _("warning: daemon is running as root, so \  using `--build-users-group' is highly recommended\n")); diff --git a/nix/nix-daemon/nix-daemon.cc b/nix/nix-daemon/nix-daemon.cc index 56137701a1..1163a249d1 100644 --- a/nix/nix-daemon/nix-daemon.cc +++ b/nix/nix-daemon/nix-daemon.cc @@ -1,3 +1,4 @@ +#include "config.h"  #include "shared.hh"  #include "local-store.hh"  #include "util.hh" @@ -580,8 +581,14 @@ static void performOp(bool trusted, unsigned int clientVersion,              settings.set("build-max-silent-time", std::to_string(readInt(from)));          } -        if (GET_PROTOCOL_MINOR(clientVersion) >= 2) +        if (GET_PROTOCOL_MINOR(clientVersion) >= 2) { +#ifdef HAVE_DAEMON_OFFLOAD_HOOK              settings.useBuildHook = readInt(from) != 0; +#else +	    readInt(from);			  // ignore the user's setting +#endif +	} +          if (GET_PROTOCOL_MINOR(clientVersion) >= 4) {              settings.buildVerbosity = (Verbosity) readInt(from);              logType = (LogType) readInt(from); @@ -590,8 +597,12 @@ static void performOp(bool trusted, unsigned int clientVersion,          if (GET_PROTOCOL_MINOR(clientVersion) >= 6              && GET_PROTOCOL_MINOR(clientVersion) < 0x61)              settings.set("build-cores", std::to_string(readInt(from))); -        if (GET_PROTOCOL_MINOR(clientVersion) >= 10) -            settings.set("build-use-substitutes", readInt(from) ? "true" : "false"); +        if (GET_PROTOCOL_MINOR(clientVersion) >= 10) { +	    if (settings.useSubstitutes) +		settings.set("build-use-substitutes", readInt(from) ? "true" : "false"); +	    else +		readInt(from);			// substitutes remain disabled +	}          if (GET_PROTOCOL_MINOR(clientVersion) >= 12) {              unsigned int n = readInt(from);              for (unsigned int i = 0; i < n; i++) { diff --git a/nix/scripts/authenticate.in b/nix/scripts/authenticate.in deleted file mode 100644 index 5ce57915f0..0000000000 --- a/nix/scripts/authenticate.in +++ /dev/null @@ -1,11 +0,0 @@ -#!@SHELL@ -# A shorthand for "guix authenticate", for use by the daemon. - -if test "x$GUIX_UNINSTALLED" = "x" -then -    prefix="@prefix@" -    exec_prefix="@exec_prefix@" -    exec "@bindir@/guix" authenticate "$@" -else -    exec guix authenticate "$@" -fi diff --git a/nix/scripts/download.in b/nix/scripts/download.in deleted file mode 100644 index 4d7088a993..0000000000 --- a/nix/scripts/download.in +++ /dev/null @@ -1,11 +0,0 @@ -#!@SHELL@ -# A shorthand for "guix perform-download", for use by the daemon. - -if test "x$GUIX_UNINSTALLED" = "x" -then -    prefix="@prefix@" -    exec_prefix="@exec_prefix@" -    exec "@bindir@/guix" perform-download "$@" -else -    exec guix perform-download "$@" -fi diff --git a/nix/scripts/list-runtime-roots.in b/nix/scripts/list-runtime-roots.in deleted file mode 100644 index 5f2660fb5e..0000000000 --- a/nix/scripts/list-runtime-roots.in +++ /dev/null @@ -1,147 +0,0 @@ -#!@GUILE@ -ds -!# -;;; GNU Guix --- Functional package management for GNU -;;; Copyright © 2012, 2013, 2014, 2017 Ludovic Courtès <ludo@gnu.org> -;;; -;;; This file is part of GNU Guix. -;;; -;;; GNU Guix is free software; you can redistribute it and/or modify it -;;; under the terms of the GNU General Public License as published by -;;; the Free Software Foundation; either version 3 of the License, or (at -;;; your option) any later version. -;;; -;;; GNU Guix is distributed in the hope that it will be useful, but -;;; WITHOUT ANY WARRANTY; without even the implied warranty of -;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -;;; GNU General Public License for more details. -;;; -;;; You should have received a copy of the GNU General Public License -;;; along with GNU Guix.  If not, see <http://www.gnu.org/licenses/>. - -;;; -;;; List files being used at run time; these files are garbage collector -;;; roots.  This is equivalent to `find-runtime-roots.pl' in Nix. -;;; - -(use-modules (ice-9 ftw) -             (ice-9 regex) -             (ice-9 rdelim) -             (ice-9 match) -             (srfi srfi-1) -             (srfi srfi-26) -             (rnrs io ports)) - -(define %proc-directory -  ;; Mount point of Linuxish /proc file system. -  "/proc") - -(define %store-directory -  (or (getenv "NIX_STORE_DIR") -      "@storedir@")) - -(define (proc-file-roots dir file) -  "Return a one-element list containing the file pointed to by DIR/FILE, -or the empty list." -  (or (and=> (false-if-exception (readlink (string-append dir "/" file))) -             list) -      '())) - -(define proc-exe-roots (cut proc-file-roots <> "exe")) -(define proc-cwd-roots (cut proc-file-roots <> "cwd")) - -(define (proc-fd-roots dir) -  "Return the list of store files referenced by DIR, which is a -/proc/XYZ directory." -  (let ((dir (string-append dir "/fd"))) -    (filter-map (lambda (file) -                  (let ((target (false-if-exception -                                 (readlink (string-append dir "/" file))))) -                    (and target -                         (string-prefix? "/" target) -                         target))) -                (or (scandir dir string->number) '())))) - -(define (proc-maps-roots dir) -  "Return the list of store files referenced by DIR, which is a -/proc/XYZ directory." -  (define %file-mapping-line -    (make-regexp "^.*[[:blank:]]+/([^ ]+)$")) - -  (call-with-input-file (string-append dir "/maps") -    (lambda (maps) -      (let loop ((line  (read-line maps)) -                 (roots '())) -        (cond ((eof-object? line) -               roots) -              ((regexp-exec %file-mapping-line line) -               => -               (lambda (match) -                 (let ((file (string-append "/" -                                            (match:substring match 1)))) -                   (loop (read-line maps) -                         (cons file roots))))) -              (else -               (loop (read-line maps) roots))))))) - -(define (proc-environ-roots dir) -  "Return the list of store files referenced by DIR/environ, where DIR is a -/proc/XYZ directory." -  (define split-on-nul -    (cute string-tokenize <> -          (char-set-complement (char-set #\nul)))) - -  (define (rhs-file-names str) -    (let ((equal (string-index str #\=))) -      (if equal -          (let* ((str (substring str (+ 1 equal))) -                 (rx  (string-append (regexp-quote %store-directory) -                                     "/[0-9a-z]{32}-[a-zA-Z0-9\\._+-]+"))) -            (map match:substring (list-matches rx str))) -          '()))) - -  (define environ -    (string-append dir "/environ")) - -  (append-map rhs-file-names -              (split-on-nul -               (call-with-input-file environ -                 get-string-all)))) - -(define (referenced-files) -  "Return the list of referenced store items." -  (append-map (lambda (pid) -                (let ((proc (string-append %proc-directory "/" pid))) -                  (catch 'system-error -                    (lambda () -                      (append (proc-exe-roots proc) -                              (proc-cwd-roots proc) -                              (proc-fd-roots proc) -                              (proc-maps-roots proc) -                              (proc-environ-roots proc))) -                    (lambda args -                      (let ((err (system-error-errno args))) -                        (if (or (= ENOENT err)    ;TOCTTOU race -                                (= ESRCH err)     ;ditto -                                (= EACCES err))   ;not running as root -                            '() -                            (apply throw args))))))) -              (scandir %proc-directory string->number -                       (lambda (a b) -                         (< (string->number a) (string->number b)))))) - -(define canonicalize-store-item -  (let* ((store  (string-append %store-directory "/")) -         (prefix (string-length store))) -    (lambda (file) -      "Return #f if FILE is not a store item; otherwise, return the store file -name without any sub-directory components." -      (and (string-prefix? store file) -           (string-append store -                          (let ((base (string-drop file prefix))) -                            (match (string-index base #\/) -                              (#f    base) -                              (slash (string-take base slash))))))))) - -(for-each (cut simple-format #t "~a~%" <>) -          (delete-duplicates -           (filter-map canonicalize-store-item (referenced-files)))) diff --git a/nix/scripts/offload.in b/nix/scripts/offload.in deleted file mode 100644 index 50faed31c0..0000000000 --- a/nix/scripts/offload.in +++ /dev/null @@ -1,11 +0,0 @@ -#!@SHELL@ -# A shorthand for "guix offload", for use by the daemon. - -if test "x$GUIX_UNINSTALLED" = "x" -then -    prefix="@prefix@" -    exec_prefix="@exec_prefix@" -    exec "@bindir@/guix" offload "$@" -else -    exec guix offload "$@" -fi diff --git a/nix/scripts/substitute.in b/nix/scripts/substitute.in deleted file mode 100644 index 5a2eeb7259..0000000000 --- a/nix/scripts/substitute.in +++ /dev/null @@ -1,11 +0,0 @@ -#!@SHELL@ -# A shorthand for "guix substitute", for use by the daemon. - -if test "x$GUIX_UNINSTALLED" = "x" -then -    prefix="@prefix@" -    exec_prefix="@exec_prefix@" -    exec "@bindir@/guix" substitute "$@" -else -    exec guix substitute "$@" -fi | 
