about summary refs log tree commit diff
path: root/src/libstore/remote-store.cc
blob: 6f3c110a3df8cadc81b8d69ae4a1d980593ede52 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "serialise.hh"
#include "util.hh"
#include "remote-store.hh"

#include <iostream>
#include <unistd.h>


namespace nix {


RemoteStore::RemoteStore()
{
    toChild.create();
    fromChild.create();


    /* Start the worker. */
    string worker = "nix-worker";

    child = fork();
    
    switch (child) {
        
    case -1:
        throw SysError("unable to fork");

    case 0:
        try { /* child */

            fromChild.readSide.close();
            if (dup2(fromChild.writeSide, STDOUT_FILENO) == -1)
                throw SysError("dupping write side");

            toChild.writeSide.close();
            if (dup2(toChild.readSide, STDIN_FILENO) == -1)
                throw SysError("dupping read side");

            execlp(worker.c_str(), worker.c_str(),
                "-vvv", "--slave", NULL);
            
            throw SysError(format("executing `%1%'") % worker);
            
        } catch (std::exception & e) {
            std::cerr << format("child error: %1%\n") % e.what();
        }
        quickExit(1);
    }

    fromChild.writeSide.close();
    toChild.readSide.close();

    from.fd = fromChild.readSide;
    to.fd = toChild.writeSide;

    
    /* Send the magic greeting, check for the reply. */
    writeInt(0x6e697864, to);
    
    unsigned int magic = readInt(from);
    if (magic != 0x6478696e) throw Error("protocol mismatch");
}


RemoteStore::~RemoteStore()
{
}


bool RemoteStore::isValidPath(const Path & path)
{
    throw Error("not implemented");
}


Substitutes RemoteStore::querySubstitutes(const Path & srcPath)
{
    throw Error("not implemented");
}


Hash RemoteStore::queryPathHash(const Path & path)
{
    throw Error("not implemented");
}


void RemoteStore::queryReferences(const Path & storePath,
    PathSet & references)
{
    throw Error("not implemented");
}


void RemoteStore::queryReferrers(const Path & storePath,
    PathSet & referrers)
{
    throw Error("not implemented");
}


Path RemoteStore::addToStore(const Path & srcPath)
{
    throw Error("not implemented");
}


Path RemoteStore::addToStoreFixed(bool recursive, string hashAlgo,
    const Path & srcPath)
{
    throw Error("not implemented");
}


Path RemoteStore::addTextToStore(const string & suffix, const string & s,
    const PathSet & references)
{
    throw Error("not implemented");
}


void RemoteStore::buildDerivations(const PathSet & drvPaths)
{
    throw Error("not implemented");
}


void RemoteStore::ensurePath(const Path & storePath)
{
    throw Error("not implemented");
}


}