From 094c69ad1943fd7bb605c19a0ab2813d19c46d60 Mon Sep 17 00:00:00 2001 From: Wouter den Breejen Date: Fri, 31 Aug 2007 15:19:55 +0000 Subject: [PATCH] --- install_full.sh | 3 +++ src/libstore/build.cc | 4 +++- src/libstore/remote-store.cc | 1 + src/libstore/store-api.cc | 6 ++++-- src/libstore/store-state.cc | 15 +++++++++------ src/libstore/worker-protocol.hh | 2 +- src/libutil/util.cc | 26 ++++++++++++++------------ src/libutil/util.hh | 3 ++- src/nix-env/nix-env.cc | 6 ++++-- 9 files changed, 41 insertions(+), 25 deletions(-) diff --git a/install_full.sh b/install_full.sh index 4d88ce283..79878fd6b 100755 --- a/install_full.sh +++ b/install_full.sh @@ -21,6 +21,9 @@ if [ "$1" = "full" ]; then nix-env-all-pkgs.sh -i gdb #optional for debugging nix-env-all-pkgs.sh -i gnupatch nix-env-all-pkgs.sh -i gnumake + nix-env-all-pkgs.sh -i ext3cow-tools + nix-env-all-pkgs.sh -i e3cfsprogs + fi if [ "$1" = "full" ] || [ "$1" = "auto" ]; then diff --git a/src/libstore/build.cc b/src/libstore/build.cc index d9bc7f536..969608235 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1829,7 +1829,9 @@ void DerivationGoal::computeClosure() } //If not shared: create the dir and set the rights else{ - setStatePathRights(statePath, queryCallingUsername(), "nixbld", "700"); + ensureDirExists(statePath); + setChown(statePath, queryCallingUsername(), "nixbld"); + setChmod(statePath, "700"); } } diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index 03af8a568..210546829 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -527,6 +527,7 @@ void RemoteStore::revertToRevision(const Path & componentPath, const Path & deri void RemoteStore::setSharedState(const Path & fromExisting, const Path & toNew) { + writeInt(wopSetSharedState, to); writeString(fromExisting, to); writeString(toNew, to); processStderr(); diff --git a/src/libstore/store-api.cc b/src/libstore/store-api.cc index b75e832f2..622fa2222 100644 --- a/src/libstore/store-api.cc +++ b/src/libstore/store-api.cc @@ -143,9 +143,11 @@ void checkStatePath(const Derivation & drv) string componentHash = drv.stateOutputs.find("state")->second.componentHash; string suffix = drv.env.find("name")->second; string stateIdentifier = drv.stateOutputs.find("state")->second.stateIdentifier; - Path calculatedPath = makeStatePath(componentHash, suffix, stateIdentifier); + Path calculatedPath = makeStatePath(componentHash, suffix, stateIdentifier); //TODO INCLUDE USER !!!!!!!!!!!! - printMsg(lvlError, format("Checking statePath validity: %1% %2%") % drvPath % calculatedPath); + //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! calculatedPath IS NOT CORRECT ANYMORE !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + + printMsg(lvlError, format("Checking statePath validity: %1% %2%") % drvPath % calculatedPath); if(drvPath != calculatedPath) Error(format("The statepath from the Derivation does not match the recalculated statepath, are u trying to spoof the statepath?")); diff --git a/src/libstore/store-state.cc b/src/libstore/store-state.cc index 7cca9ae3f..5f09aa8ac 100644 --- a/src/libstore/store-state.cc +++ b/src/libstore/store-state.cc @@ -50,20 +50,23 @@ void createSubStateDirsTxn(const Transaction & txn, const DerivationStateOutputD DerivationStateOutputDir d = i->second; string thisdir = d.path; - - //If it is a file: continue - if(thisdir.substr(thisdir.length() -1 , thisdir.length()) != "/") - continue; - Path fullstatedir = stateDir + "/" + thisdir; - setStatePathRights(fullstatedir, queryCallingUsername(), "nixbld"); + //If it is a file: continue + if(thisdir.substr(thisdir.length() -1 , thisdir.length()) != "/"){ + continue; + } + + ensureDirExists(fullstatedir); if(d.type == "interval"){ intervalPaths.insert(fullstatedir); } } + setChown(statePath, queryCallingUsername(), "nixbld", true); //Set all dirs in the statePath recursively to their owners + printMsg(lvlTalkative, format("Set CHOWN '%1%'") % (statePath + "-" + queryCallingUsername())); + //Initialize the counters for the statePaths that have an interval to 0 IntVector empty; setStatePathsIntervalTxn(txn, intervalPaths, empty, true); diff --git a/src/libstore/worker-protocol.hh b/src/libstore/worker-protocol.hh index f2b7203af..a386c42ca 100644 --- a/src/libstore/worker-protocol.hh +++ b/src/libstore/worker-protocol.hh @@ -24,7 +24,7 @@ typedef enum { wopQueryStateReferrers, wopAddToStore, wopAddTextToStore, - wopBuildDerivations, //TODO HANGS SOMETIMES !!!!! + wopBuildDerivations, //TODO !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! HANGS SOMETIMES !!!!! wopEnsurePath, wopAddTempRoot, wopAddIndirectRoot, diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 839201d29..759b667b6 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -259,7 +259,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed) struct stat st; if (lstat(path.c_str(), &st)) - throw SysError(format("getting attributes of path `%1%'") % path); + throw SysError(format("getting attributes of path `%1%'") % path); bytesFreed += st.st_size; @@ -269,7 +269,7 @@ static void _deletePath(const Path & path, unsigned long long & bytesFreed) /* Make the directory writable. */ if (!(st.st_mode & S_IWUSR)) { if (chmod(path.c_str(), st.st_mode | S_IWUSR) == -1) - throw SysError(format("making `%1%' writable") % path); + throw SysError(format("making `%1%' writable") % path); } for (Strings::iterator i = names.begin(); i != names.end(); ++i) @@ -1241,20 +1241,22 @@ void ensureDirExists(const Path & path) runProgram_AndPrintOutput("mkdir", true, p_args, "mkdir"); //TODO ensurePath } -void setStatePathRights(const Path & statePath, const string & user, const string & group, const string & chmod) +void setChown(const Path & pathOrFile, const string & user, const string & group, bool recursive) { - ensureDirExists(statePath); Strings p_args; + if(recursive) + p_args.push_back("-R"); p_args.push_back(user + "." + group); - p_args.push_back(statePath); + p_args.push_back(pathOrFile); runProgram_AndPrintOutput("chown", true, p_args, "chown"); - - if(chmod != "") { - p_args.clear(); - p_args.push_back(chmod); - p_args.push_back(statePath); - runProgram_AndPrintOutput("chmod", true, p_args, "chmod"); - } +} + +void setChmod(const Path & pathOrFile, const string & chmod) +{ + Strings p_args; + p_args.push_back(chmod); + p_args.push_back(pathOrFile); + runProgram_AndPrintOutput("chmod", true, p_args, "chmod"); } string padd(const string & s, char c , unsigned int size, bool front) diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 422823872..0160e01e9 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -322,7 +322,8 @@ void pathSets_difference(const PathSet & oldpaths, const PathSet & newpaths, Pat void ensureDirExists(const Path & path); /* TODO */ -void setStatePathRights(const Path & statePath, const string & user, const string & group, const string & chmod = ""); +void setChown(const Path & pathOrFile, const string & user, const string & group, bool recursive = false); +void setChmod(const Path & pathOrFile, const string & chmod); string padd(const string & s, char c , unsigned int size, bool front = false); diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc index 68eaa71a6..8cb829a08 100644 --- a/src/nix-env/nix-env.cc +++ b/src/nix-env/nix-env.cc @@ -572,7 +572,7 @@ static void installDerivations(Globals & globals, oldStatePath = oldDrv.stateOutputs.find("state")->second.statepath; //SharePaths - printMsg(lvlError, format("Sharing state from old to new component '%1%' --> '%2%'") % newStatePath % oldStatePath); + printMsg(lvlError, format("Sharing state from old <-- new component '%1%' <-- '%2%'") % oldStatePath % newStatePath); toBeShared[oldStatePath] = newStatePath; } else{ //If not equal, then we do not replace, so we push back (just like the else branch) @@ -601,7 +601,9 @@ static void installDerivations(Globals & globals, //After all components have been built succesfully, share their state paths with the old ones for (StringPairs::iterator i = toBeShared.begin(); i != toBeShared.end(); ++i){ - deletePathWrapped(i->second); //Remove contents of current new state path + printMsg(lvlError, format("Sharing state from old <-- new component '%1%' <-- '%2%'") % i->first % i->second); + + deletePath(i->second); //Remove contents of current new state path sharePath(i->first, i->second); //Share new statepath to the old statepath //Set in database