#pragma once ///@file #include "remote-store.hh" #include "remote-store-connection.hh" #include "indirect-root-store.hh" namespace nix { struct UDSRemoteStoreConfig : virtual LocalFSStoreConfig, virtual RemoteStoreConfig { UDSRemoteStoreConfig(const Params & params) : StoreConfig(params) , LocalFSStoreConfig(params) , RemoteStoreConfig(params) { } const std::string name() override { return "Local Daemon Store"; } std::string doc() override; }; class UDSRemoteStore : public virtual UDSRemoteStoreConfig , public virtual IndirectRootStore , public virtual RemoteStore { public: UDSRemoteStore(const Params & params); UDSRemoteStore(const std::string scheme, std::string path, const Params & params); std::string getUri() override; static std::set uriSchemes() { return {"unix"}; } ref getFSAccessor() override { return LocalFSStore::getFSAccessor(); } WireFormatGenerator narFromPath(const StorePath & path) override { return LocalFSStore::narFromPath(path); } /** * Implementation of `IndirectRootStore::addIndirectRoot()` which * delegates to the remote store. * * The idea is that the client makes the direct symlink, so it is * owned managed by the client's user account, and the server makes * the indirect symlink. */ void addIndirectRoot(const Path & path) override; private: struct Connection : RemoteStore::Connection { AutoCloseFD fd; void closeWrite() override; }; ref openConnection() override; std::optional path; }; void registerUDSRemoteStore(); }