mirror of
https://codeberg.org/guix/guix.git
synced 2025-10-02 02:15:12 +00:00
daemon: 'guix substitute' replies on FD 4.
This avoids the situation where error messages would unintentionally go
to stderr and be wrongfully interpreted as a reply by the daemon.
Fixes <https://bugs.gnu.org/46362>.
This is a followup to ee3226e9d5
.
* guix/scripts/substitute.scm (display-narinfo-data): Add 'port'
parameter and honor it.
(process-query): Likewise.
(process-substitution): Likewise.
(%error-to-file-descriptor-4?, with-redirected-error-port): Remove.
(%reply-file-descriptor): New variable.
(guix-substitute): Remove use of 'with-redirected-error-port'. Define
'reply-port' and pass it to 'process-query' and 'process-substitution'.
* nix/libstore/build.cc (SubstitutionGoal::handleChildOutput): Swap
'builderOut' and 'fromAgent'.
* nix/libstore/local-store.cc (LocalStore::getLineFromSubstituter):
Likewise.
* tests/substitute.scm <top level>: Set '%reply-file-descriptor'
rather than '%error-to-file-descriptor-4?'.
This commit is contained in:
parent
ccff338086
commit
2d73086262
4 changed files with 95 additions and 108 deletions
|
@ -3158,13 +3158,13 @@ void SubstitutionGoal::finished()
|
|||
void SubstitutionGoal::handleChildOutput(int fd, const string & data)
|
||||
{
|
||||
if (verbosity >= settings.buildVerbosity
|
||||
&& fd == substituter->builderOut.readSide) {
|
||||
&& fd == substituter->fromAgent.readSide) {
|
||||
writeToStderr(data);
|
||||
/* Don't write substitution output to a log file for now. We
|
||||
probably should, though. */
|
||||
}
|
||||
|
||||
if (fd == substituter->fromAgent.readSide) {
|
||||
if (fd == substituter->builderOut.readSide) {
|
||||
/* DATA may consist of several lines. Process them one by one. */
|
||||
string input = data;
|
||||
while (!input.empty()) {
|
||||
|
|
|
@ -780,8 +780,8 @@ Path LocalStore::queryPathFromHashPart(const string & hashPart)
|
|||
});
|
||||
}
|
||||
|
||||
/* Read a line from the substituter's stdout, while also processing
|
||||
its stderr. */
|
||||
/* Read a line from the substituter's reply file descriptor, while also
|
||||
processing its stderr. */
|
||||
string LocalStore::getLineFromSubstituter(Agent & run)
|
||||
{
|
||||
string res, err;
|
||||
|
@ -802,9 +802,9 @@ string LocalStore::getLineFromSubstituter(Agent & run)
|
|||
}
|
||||
|
||||
/* Completely drain stderr before dealing with stdout. */
|
||||
if (FD_ISSET(run.builderOut.readSide, &fds)) {
|
||||
if (FD_ISSET(run.fromAgent.readSide, &fds)) {
|
||||
char buf[4096];
|
||||
ssize_t n = read(run.builderOut.readSide, (unsigned char *) buf, sizeof(buf));
|
||||
ssize_t n = read(run.fromAgent.readSide, (unsigned char *) buf, sizeof(buf));
|
||||
if (n == -1) {
|
||||
if (errno == EINTR) continue;
|
||||
throw SysError("reading from substituter's stderr");
|
||||
|
@ -822,9 +822,9 @@ string LocalStore::getLineFromSubstituter(Agent & run)
|
|||
}
|
||||
|
||||
/* Read from stdout until we get a newline or the buffer is empty. */
|
||||
else if (FD_ISSET(run.fromAgent.readSide, &fds)) {
|
||||
else if (FD_ISSET(run.builderOut.readSide, &fds)) {
|
||||
unsigned char c;
|
||||
readFull(run.fromAgent.readSide, (unsigned char *) &c, 1);
|
||||
readFull(run.builderOut.readSide, (unsigned char *) &c, 1);
|
||||
if (c == '\n') {
|
||||
if (!err.empty()) printMsg(lvlError, "substitute: " + err);
|
||||
return res;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue