1
0
Fork 0
mirror of https://github.com/NixOS/nix synced 2025-07-04 11:21:47 +02:00

nix-store --serve: Use a versioned protocol

Signed-off-by: Shea Levy <shea@shealevy.com>
This commit is contained in:
Shea Levy 2014-02-10 07:43:13 -05:00
parent 38c3beac1a
commit c89d6b9b63
4 changed files with 102 additions and 34 deletions

View file

@ -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);
}
}

View file

@ -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;
}