#include "uds-remote-store.hh" #include "unix-domain-socket.hh" #include "worker-protocol.hh" #include #include #include #include #include #include #ifdef _WIN32 # include # include #else # include # include #endif namespace nix { std::string UDSRemoteStoreConfig::doc() { return #include "uds-remote-store.md" ; } UDSRemoteStore::UDSRemoteStore(const Params & params) : StoreConfig(params) , LocalFSStoreConfig(params) , RemoteStoreConfig(params) , UDSRemoteStoreConfig(params) , Store(params) , LocalFSStore(params) , RemoteStore(params) { } UDSRemoteStore::UDSRemoteStore( const std::string scheme, std::string socket_path, const Params & params) : UDSRemoteStore(params) { path.emplace(socket_path); } std::string UDSRemoteStore::getUri() { if (path) { return std::string("unix://") + *path; } else { return "daemon"; } } void UDSRemoteStore::Connection::closeWrite() { shutdown(toSocket(fd.get()), SHUT_WR); } ref UDSRemoteStore::openConnection() { auto conn = make_ref(); /* Connect to a daemon that does the privileged work for us. */ conn->fd = createUnixDomainSocket(); nix::connect(toSocket(conn->fd.get()), path ? *path : settings.nixDaemonSocketFile); conn->from.fd = conn->fd.get(); conn->to.fd = conn->fd.get(); conn->startTime = std::chrono::steady_clock::now(); return conn; } void UDSRemoteStore::addIndirectRoot(const Path & path) { auto conn(getConnection()); conn->to << WorkerProto::Op::AddIndirectRoot << path; conn.processStderr(); readInt(conn->from); } static RegisterStoreImplementation regUDSRemoteStore; }