aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/store.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-02-14 21:44:18 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-02-14 21:44:18 +0000
commit76c0e85929dc747288a8fe66a7bb77673cf2aa7e (patch)
treea470529f9acd56ac6af84bf426628c33a8affebf /src/libstore/store.cc
parent6f5a5ea5ea7fa80bc709c4a2b14ea4395ebe7469 (diff)
* The environment variable NIX_ROOT can now be set to execute Nix in a
chroot() environment. * A operation `--validpath' to register path validity. Useful for bootstrapping in a pure Nix environment. * Safety checks: ensure that files involved in store operations are in the store.
Diffstat (limited to 'src/libstore/store.cc')
-rw-r--r--src/libstore/store.cc38
1 files changed, 29 insertions, 9 deletions
diff --git a/src/libstore/store.cc b/src/libstore/store.cc
index 4cd77796e..d85b0608f 100644
--- a/src/libstore/store.cc
+++ b/src/libstore/store.cc
@@ -157,6 +157,22 @@ void copyPath(const Path & src, const Path & dst)
}
+static bool isInStore(const Path & path)
+{
+ return path[0] == '/'
+ && Path(path, 0, nixStore.size()) == nixStore
+ && path.size() > nixStore.size() + 1
+ && path[nixStore.size()] == '/';
+}
+
+
+static void assertStorePath(const Path & path)
+{
+ if (!isInStore(path))
+ throw Error(format("path `%1%' is not in the Nix store") % path);
+}
+
+
static bool isValidPathTxn(const Path & path, const Transaction & txn)
{
string s;
@@ -182,6 +198,9 @@ static bool isUsablePathTxn(const Path & path, const Transaction & txn)
void registerSuccessor(const Transaction & txn,
const Path & srcPath, const Path & sucPath)
{
+ assertStorePath(srcPath);
+ assertStorePath(sucPath);
+
if (!isUsablePathTxn(sucPath, txn)) throw Error(
format("path `%1%' cannot be a successor, since it is not usable")
% sucPath);
@@ -223,6 +242,9 @@ Paths queryPredecessors(const Path & sucPath)
void registerSubstitute(const Path & srcPath, const Path & subPath)
{
+ assertStorePath(srcPath);
+ assertStorePath(subPath);
+
if (!isValidPathTxn(subPath, noTxn)) throw Error(
format("path `%1%' cannot be a substitute, since it is not valid")
% subPath);
@@ -262,6 +284,7 @@ Paths querySubstitutes(const Path & srcPath)
void registerValidPath(const Transaction & txn, const Path & _path)
{
Path path(canonPath(_path));
+ assertStorePath(path);
debug(format("registering path `%1%'") % path);
nixDB.setString(txn, dbValidPaths, path, "");
}
@@ -312,13 +335,6 @@ static void invalidatePath(const Path & path, Transaction & txn)
}
-static bool isInPrefix(const string & path, const string & _prefix)
-{
- string prefix = canonPath(_prefix + "/");
- return string(path, 0, prefix.size()) == prefix;
-}
-
-
Path addToStore(const Path & _srcPath)
{
Path srcPath(absPath(_srcPath));
@@ -355,6 +371,8 @@ Path addToStore(const Path & _srcPath)
void addTextToStore(const Path & dstPath, const string & s)
{
+ assertStorePath(dstPath);
+
if (!isValidPath(dstPath)) {
PathSet lockPaths;
@@ -378,8 +396,7 @@ void deleteFromStore(const Path & _path)
{
Path path(canonPath(_path));
- if (!isInPrefix(path, nixStore))
- throw Error(format("path `%1%' is not in the store") % path);
+ assertStorePath(path);
Transaction txn(nixDB);
invalidatePath(path, txn);
@@ -402,6 +419,9 @@ void verifyStore()
if (!pathExists(path)) {
printMsg(lvlError, format("path `%1%' disappeared") % path);
invalidatePath(path, txn);
+ } else if (!isInStore(path)) {
+ printMsg(lvlError, format("path `%1%' is not in the Nix store") % path);
+ invalidatePath(path, txn);
} else
validPaths.insert(path);
}