diff --git a/src/libstore/remote-store.cc b/src/libstore/remote-store.cc index bcae21bf7..2391fd9e8 100644 --- a/src/libstore/remote-store.cc +++ b/src/libstore/remote-store.cc @@ -98,7 +98,10 @@ bool RemoteStore::hasSubstitutes(const Path & path) Hash RemoteStore::queryPathHash(const Path & path) { - throw Error("not implemented 3"); + writeInt(wopQueryPathHash, to); + writeString(path, to); + string hash = readString(from); + return parseHash(htSHA256, hash); } diff --git a/src/nix-worker/Makefile.am b/src/nix-worker/Makefile.am index 6f10efff5..46568e9e1 100644 --- a/src/nix-worker/Makefile.am +++ b/src/nix-worker/Makefile.am @@ -4,6 +4,11 @@ nix_worker_SOURCES = main.cc nix_worker_LDADD = ../libmain/libmain.la ../libstore/libstore.la ../libutil/libutil.la \ ../boost/format/libformat.la ${bdb_lib} ${aterm_lib} +main.o: help.txt.hh + +%.txt.hh: %.txt + ../bin2c/bin2c helpText < $< > $@ || (rm $@ && exit 1) + AM_CXXFLAGS = \ -I$(srcdir)/.. ${bdb_include} $(aterm_include) -I$(srcdir)/../libutil \ -I$(srcdir)/../libstore -I$(srcdir)/../libmain diff --git a/src/nix-worker/help.txt b/src/nix-worker/help.txt new file mode 100644 index 000000000..b4583cb7e --- /dev/null +++ b/src/nix-worker/help.txt @@ -0,0 +1,10 @@ +Usage: nix-worker [OPTIONS...] [--daemon | --slave] + +`nix-worker' is a helper program used to implement secure, multi-user +Nix stores. In `--daemon' mode, it goes into the background and waits +for incoming connections on a Unix domain socket, and forks a process +for each connection to perform the Nix store operations requested by +the caller. In `--slave' mode, `nix-worker' is called directly, and +the caller and the worker communicate with each other over +stdin/stdout. In this mode, the `nix-worker' program should have +appropriate setuid privileges. diff --git a/src/nix-worker/main.cc b/src/nix-worker/main.cc index 6d6571536..95077e653 100644 --- a/src/nix-worker/main.cc +++ b/src/nix-worker/main.cc @@ -5,6 +5,8 @@ #include "worker-protocol.hh" #include "archive.hh" +#include + using namespace nix; @@ -48,12 +50,13 @@ void processConnection(Source & from, Sink & to) switch (op) { - case wopQuit: + case wopQuit: { /* Close the database. */ store.reset((StoreAPI *) 0); writeInt(1, to); quit = true; break; + } case wopIsValidPath: { Path path = readStorePath(from); @@ -67,6 +70,12 @@ void processConnection(Source & from, Sink & to) break; } + case wopQueryPathHash: { + Path path = readStorePath(from); + writeString(printHash(store->queryPathHash(path)), to); + break; + } + case wopQueryReferences: case wopQueryReferrers: { Path path = readStorePath(from); @@ -153,8 +162,11 @@ void run(Strings args) } +#include "help.txt.hh" + void printHelp() { + std::cout << string((char *) helpText, sizeof helpText); }