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:
parent
38c3beac1a
commit
c89d6b9b63
4 changed files with 102 additions and 34 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
24
src/nix-store/serve-protocol.hh
Normal file
24
src/nix-store/serve-protocol.hh
Normal 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;
|
||||
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue