about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libstore/remote-store.cc1
-rw-r--r--src/nix-store/nix-store.cc37
-rw-r--r--src/nix-store/serve-protocol.hh2
3 files changed, 35 insertions, 5 deletions
diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc
index 3b021bb2a50c..f566ccf53122 100644
--- a/src/libstore/remote-store.cc
+++ b/src/libstore/remote-store.cc
@@ -35,6 +35,7 @@ template<class T> T readStorePaths(Source & from)
 }
 
 template PathSet readStorePaths(Source & from);
+template Paths readStorePaths(Source & from);
 
 
 RemoteStore::RemoteStore()
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index f31eb0e29a36..0196c2fc1873 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -928,7 +928,6 @@ static void opServe(Strings opFlags, Strings opArgs)
                 }
 
                 writeStrings(store->queryValidPaths(paths), out);
-                out.flush();
                 break;
             }
 
@@ -947,17 +946,15 @@ static void opServe(Strings opFlags, Strings opArgs)
                     writeLongLong(info.narSize, out);
                 }
                 writeString("", out);
-                out.flush();
                 break;
             }
 
             case cmdDumpStorePath:
                 dumpPath(readStorePath(in), out);
-                out.flush();
                 break;
 
             case cmdImportPaths: {
-                if (!writeAllowed) throw Error("importing paths not allowed");
+                if (!writeAllowed) throw Error("importing paths is not allowed");
                 string compression = readString(in);
 
                 if (compression != "") {
@@ -986,7 +983,6 @@ static void opServe(Strings opFlags, Strings opArgs)
                     store->importPaths(false, in);
 
                 writeInt(1, out); // indicate success
-                out.flush();
 
                 /* The decompressor will have left stdin in an
                    undefined state, so we can't continue. */
@@ -995,9 +991,40 @@ static void opServe(Strings opFlags, Strings opArgs)
                 break;
             }
 
+            case cmdExportPaths: {
+                exportPaths(*store, readStorePaths<Paths>(in), false, out);
+                break;
+            }
+
+            case cmdBuildPaths: {
+                /* Used by build-remote.pl. */
+                if (!writeAllowed) throw Error("building paths is not allowed");
+                PathSet paths = readStorePaths<PathSet>(in);
+
+                // FIXME: changing options here doesn't work if we're
+                // building through the daemon.
+                verbosity = lvlError;
+                settings.keepLog = false;
+                settings.useSubstitutes = false;
+                settings.maxSilentTime = readInt(in);
+                settings.buildTimeout = readInt(in);
+
+                int res = 0;
+                try {
+                    store->buildPaths(paths);
+                } catch (Error & e) {
+                    printMsg(lvlError, format("error: %1%") % e.msg());
+                    res = e.status;
+                }
+                writeInt(res, out);
+                break;
+            }
+
             default:
                 throw Error(format("unknown serve command %1%") % cmd);
         }
+
+        out.flush();
     }
 }
 
diff --git a/src/nix-store/serve-protocol.hh b/src/nix-store/serve-protocol.hh
index 07ff4f7a7cc4..eb13b46e51bd 100644
--- a/src/nix-store/serve-protocol.hh
+++ b/src/nix-store/serve-protocol.hh
@@ -14,6 +14,8 @@ typedef enum {
     cmdQueryPathInfos = 2,
     cmdDumpStorePath = 3,
     cmdImportPaths = 4,
+    cmdExportPaths = 5,
+    cmdBuildPaths = 6,
 } ServeCommand;
 
 }