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
135
136
137
138
139
140
141
142
143
144
|
#include "serialise.hh"
#include "util.hh"
#include "remote-store.hh"
#include "worker-protocol.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(WORKER_MAGIC_1, to);
unsigned int magic = readInt(from);
if (magic != WORKER_MAGIC_2) throw Error("protocol mismatch");
}
RemoteStore::~RemoteStore()
{
writeInt(wopQuit, to);
readInt(from);
child.wait(true);
}
bool RemoteStore::isValidPath(const Path & path)
{
writeInt(wopIsValidPath, to);
writeString(path, to);
unsigned int reply = readInt(from);
return reply != 0;
}
Substitutes RemoteStore::querySubstitutes(const Path & srcPath)
{
// writeInt(wopQuerySubstitutes);
// throw Error("not implemented 2");
return Substitutes();
}
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");
}
}
|