aboutsummaryrefslogtreecommitdiff
path: root/src/nix-store
diff options
context:
space:
mode:
authorShea Levy <shea@shealevy.com>2014-02-10 07:43:13 -0500
committerShea Levy <shea@shealevy.com>2014-02-10 07:43:13 -0500
commitc89d6b9b63b629ff936a56855be5689523910c58 (patch)
tree056638f53ad9590c8f8da3cf5ac264a41521c5f4 /src/nix-store
parent38c3beac1a8ac9ddf4fdbbcafd400dabcf195076 (diff)
nix-store --serve: Use a versioned protocol
Signed-off-by: Shea Levy <shea@shealevy.com>
Diffstat (limited to 'src/nix-store')
-rw-r--r--src/nix-store/nix-store.cc82
-rw-r--r--src/nix-store/serve-protocol.hh24
2 files changed, 79 insertions, 27 deletions
diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc
index 68ad90267..638d24498 100644
--- a/src/nix-store/nix-store.cc
+++ b/src/nix-store/nix-store.cc
@@ -6,6 +6,7 @@
#include "xmlgraph.hh"
#include "local-store.hh"
#include "util.hh"
+#include "serve-protocol.hh"
#include <iostream>
#include <algorithm>
@@ -843,34 +844,61 @@ static void opServe(Strings opFlags, Strings opArgs)
FdSource in(STDIN_FILENO);
FdSink out(STDOUT_FILENO);
- string cmd = readString(in);
- if (cmd == "query") {
- for (cmd = readString(in); !cmd.empty(); cmd = readString(in)) {
- PathSet paths = readStrings<PathSet>(in);
- if (cmd == "have") {
- writeStrings(store->queryValidPaths(paths), out);
- } else if (cmd == "info") {
- // !!! Maybe we want a queryPathInfos?
- foreach (PathSet::iterator, i, paths) {
- if (!store->isValidPath(*i))
- continue;
- ValidPathInfo info = store->queryPathInfo(*i);
- writeString(info.path, out);
- writeString(info.deriver, out);
- writeStrings(info.references, out);
- // !!! Maybe we want compression?
- writeLongLong(info.narSize, out); // downloadSize
- writeLongLong(info.narSize, out);
+ /* Exchange the greeting. */
+ unsigned int magic = readInt(in);
+ if (magic != SERVE_MAGIC_1) throw Error("protocol mismatch");
+ writeInt(SERVE_MAGIC_2, out);
+ writeInt(SERVE_PROTOCOL_VERSION, out);
+ out.flush();
+ readInt(in); // Client version, unused for now
+
+ ServeCommand cmd = (ServeCommand) readInt(in);
+ switch (cmd) {
+ case cmdQuery:
+ while (true) {
+ QueryCommand qCmd;
+ try {
+ qCmd = (QueryCommand) readInt(in);
+ } catch (EndOfFile & e) {
+ break;
}
- writeString("", out);
- } else
- throw Error(format("Unknown serve query `%1%'") % cmd);
- out.flush();
- }
- } else if (cmd == "substitute")
- dumpPath(readString(in), out);
- else
- throw Error(format("Unknown serve command `%1%'") % cmd);
+ switch (qCmd) {
+ case qCmdHave:
+ {
+ PathSet paths = readStrings<PathSet>(in);
+ writeStrings(store->queryValidPaths(paths), out);
+ }
+ break;
+ case qCmdInfo:
+ {
+ PathSet paths = readStrings<PathSet>(in);
+ // !!! Maybe we want a queryPathInfos?
+ foreach (PathSet::iterator, i, paths) {
+ if (!store->isValidPath(*i))
+ continue;
+ ValidPathInfo info = store->queryPathInfo(*i);
+ writeString(info.path, out);
+ writeString(info.deriver, out);
+ writeStrings(info.references, out);
+ // !!! Maybe we want compression?
+ writeLongLong(info.narSize, out); // downloadSize
+ writeLongLong(info.narSize, out);
+ }
+ writeString("", out);
+ }
+ break;
+ default:
+ throw Error(format("Unknown serve query `%1%'") % cmd);
+ }
+ out.flush();
+ }
+ break;
+ case cmdSubstitute:
+ dumpPath(readString(in), out);
+ break;
+ default:
+ throw Error(format("Unknown serve command `%1%'") % cmd);
+ }
}
diff --git a/src/nix-store/serve-protocol.hh b/src/nix-store/serve-protocol.hh
new file mode 100644
index 000000000..69277bc1b
--- /dev/null
+++ b/src/nix-store/serve-protocol.hh
@@ -0,0 +1,24 @@
+#pragma once
+
+namespace nix {
+
+
+#define SERVE_MAGIC_1 0x390c9deb
+#define SERVE_MAGIC_2 0x5452eecb
+
+#define SERVE_PROTOCOL_VERSION 0x101
+#define GET_PROTOCOL_MAJOR(x) ((x) & 0xff00)
+#define GET_PROTOCOL_MINOR(x) ((x) & 0x00ff)
+
+
+typedef enum {
+ cmdQuery = 0,
+ cmdSubstitute = 1,
+} ServeCommand;
+
+typedef enum {
+ qCmdHave = 0,
+ qCmdInfo = 1,
+} QueryCommand;
+
+}