Ensure we're writing to stderr in the builder
http://hydra.nixos.org/build/17862041
This commit is contained in:
		
							parent
							
								
									5a2d451648
								
							
						
					
					
						commit
						28f22b4653
					
				
					 6 changed files with 21 additions and 19 deletions
				
			
		|  | @ -2166,7 +2166,7 @@ void DerivationGoal::runChild() | ||||||
|         restoreSIGPIPE(); |         restoreSIGPIPE(); | ||||||
| 
 | 
 | ||||||
|         /* Indicate that we managed to set up the build environment. */ |         /* Indicate that we managed to set up the build environment. */ | ||||||
|         writeToStderr("\n"); |         writeFull(STDERR_FILENO, "\n"); | ||||||
| 
 | 
 | ||||||
|         /* Execute the program.  This should not return. */ |         /* Execute the program.  This should not return. */ | ||||||
|         execve(program.c_str(), (char * *) &args[0], (char * *) envArr); |         execve(program.c_str(), (char * *) &args[0], (char * *) envArr); | ||||||
|  | @ -2174,7 +2174,7 @@ void DerivationGoal::runChild() | ||||||
|         throw SysError(format("executing ‘%1%’") % drv.builder); |         throw SysError(format("executing ‘%1%’") % drv.builder); | ||||||
| 
 | 
 | ||||||
|     } catch (std::exception & e) { |     } catch (std::exception & e) { | ||||||
|         writeToStderr("while setting up the build environment: " + string(e.what()) + "\n"); |         writeFull(STDERR_FILENO, "while setting up the build environment: " + string(e.what()) + "\n"); | ||||||
|         _exit(1); |         _exit(1); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -2487,7 +2487,7 @@ void DerivationGoal::handleChildOutput(int fd, const string & data) | ||||||
|             BZ2_bzWrite(&err, bzLogFile, (unsigned char *) data.data(), data.size()); |             BZ2_bzWrite(&err, bzLogFile, (unsigned char *) data.data(), data.size()); | ||||||
|             if (err != BZ_OK) throw Error(format("cannot write to compressed log file (BZip2 error = %1%)") % err); |             if (err != BZ_OK) throw Error(format("cannot write to compressed log file (BZip2 error = %1%)") % err); | ||||||
|         } else if (fdLogFile != -1) |         } else if (fdLogFile != -1) | ||||||
|             writeFull(fdLogFile, (unsigned char *) data.data(), data.size()); |             writeFull(fdLogFile, data); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     if (hook && fd == hook->fromHook.readSide) |     if (hook && fd == hook->fromHook.readSide) | ||||||
|  |  | ||||||
|  | @ -191,7 +191,7 @@ void LocalStore::addTempRoot(const Path & path) | ||||||
|     lockFile(fdTempRoots, ltWrite, true); |     lockFile(fdTempRoots, ltWrite, true); | ||||||
| 
 | 
 | ||||||
|     string s = path + '\0'; |     string s = path + '\0'; | ||||||
|     writeFull(fdTempRoots, (const unsigned char *) s.data(), s.size()); |     writeFull(fdTempRoots, s); | ||||||
| 
 | 
 | ||||||
|     /* Downgrade to a read lock. */ |     /* Downgrade to a read lock. */ | ||||||
|     debug(format("downgrading to read lock on ‘%1%’") % fnTempRoots); |     debug(format("downgrading to read lock on ‘%1%’") % fnTempRoots); | ||||||
|  | @ -231,7 +231,7 @@ static void readTempRoots(PathSet & tempRoots, FDs & fds) | ||||||
|         if (lockFile(*fd, ltWrite, false)) { |         if (lockFile(*fd, ltWrite, false)) { | ||||||
|             printMsg(lvlError, format("removing stale temporary roots file ‘%1%’") % path); |             printMsg(lvlError, format("removing stale temporary roots file ‘%1%’") % path); | ||||||
|             unlink(path.c_str()); |             unlink(path.c_str()); | ||||||
|             writeFull(*fd, (const unsigned char *) "d", 1); |             writeFull(*fd, "d"); | ||||||
|             continue; |             continue; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -33,7 +33,7 @@ void deleteLockFile(const Path & path, int fd) | ||||||
|        other processes waiting on this lock that the lock is stale |        other processes waiting on this lock that the lock is stale | ||||||
|        (deleted). */ |        (deleted). */ | ||||||
|     unlink(path.c_str()); |     unlink(path.c_str()); | ||||||
|     writeFull(fd, (const unsigned char *) "d", 1); |     writeFull(fd, "d"); | ||||||
|     /* Note that the result of unlink() is ignored; removing the lock
 |     /* Note that the result of unlink() is ignored; removing the lock
 | ||||||
|        file is an optimisation, not a necessity. */ |        file is an optimisation, not a necessity. */ | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -265,7 +265,7 @@ void writeFile(const Path & path, const string & s) | ||||||
|     AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT, 0666); |     AutoCloseFD fd = open(path.c_str(), O_WRONLY | O_TRUNC | O_CREAT, 0666); | ||||||
|     if (fd == -1) |     if (fd == -1) | ||||||
|         throw SysError(format("opening file ‘%1%’") % path); |         throw SysError(format("opening file ‘%1%’") % path); | ||||||
|     writeFull(fd, (unsigned char *) s.data(), s.size()); |     writeFull(fd, s); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -292,7 +292,7 @@ string readLine(int fd) | ||||||
| void writeLine(int fd, string s) | void writeLine(int fd, string s) | ||||||
| { | { | ||||||
|     s += '\n'; |     s += '\n'; | ||||||
|     writeFull(fd, (const unsigned char *) s.data(), s.size()); |     writeFull(fd, s); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -483,18 +483,13 @@ void warnOnce(bool & haveWarned, const FormatOrString & fs) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| static void defaultWriteToStderr(const unsigned char * buf, size_t count) |  | ||||||
| { |  | ||||||
|     writeFull(STDERR_FILENO, buf, count); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| void writeToStderr(const string & s) | void writeToStderr(const string & s) | ||||||
| { | { | ||||||
|     try { |     try { | ||||||
|         auto p = _writeToStderr; |         if (_writeToStderr) | ||||||
|         if (!p) p = defaultWriteToStderr; |             _writeToStderr((const unsigned char *) s.data(), s.size()); | ||||||
|         p((const unsigned char *) s.data(), s.size()); |         else | ||||||
|  |             writeFull(STDERR_FILENO, s); | ||||||
|     } catch (SysError & e) { |     } catch (SysError & e) { | ||||||
|         /* Ignore failing writes to stderr if we're in an exception
 |         /* Ignore failing writes to stderr if we're in an exception
 | ||||||
|            handler, otherwise throw an exception.  We need to ignore |            handler, otherwise throw an exception.  We need to ignore | ||||||
|  | @ -506,7 +501,7 @@ void writeToStderr(const string & s) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void (*_writeToStderr) (const unsigned char * buf, size_t count) = defaultWriteToStderr; | void (*_writeToStderr) (const unsigned char * buf, size_t count) = 0; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| void readFull(int fd, unsigned char * buf, size_t count) | void readFull(int fd, unsigned char * buf, size_t count) | ||||||
|  | @ -540,6 +535,12 @@ void writeFull(int fd, const unsigned char * buf, size_t count) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | void writeFull(int fd, const string & s) | ||||||
|  | { | ||||||
|  |     writeFull(fd, (const unsigned char *) s.data(), s.size()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| string drainFD(int fd) | string drainFD(int fd) | ||||||
| { | { | ||||||
|     string result; |     string result; | ||||||
|  |  | ||||||
|  | @ -171,6 +171,7 @@ extern void (*_writeToStderr) (const unsigned char * buf, size_t count); | ||||||
|    requested number of bytes. */ |    requested number of bytes. */ | ||||||
| void readFull(int fd, unsigned char * buf, size_t count); | void readFull(int fd, unsigned char * buf, size_t count); | ||||||
| void writeFull(int fd, const unsigned char * buf, size_t count); | void writeFull(int fd, const unsigned char * buf, size_t count); | ||||||
|  | void writeFull(int fd, const string & s); | ||||||
| 
 | 
 | ||||||
| MakeError(EndOfFile, Error) | MakeError(EndOfFile, Error) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -488,7 +488,7 @@ static void opReadLog(Strings opFlags, Strings opArgs) | ||||||
|             if (pathExists(logPath)) { |             if (pathExists(logPath)) { | ||||||
|                 /* !!! Make this run in O(1) memory. */ |                 /* !!! Make this run in O(1) memory. */ | ||||||
|                 string log = readFile(logPath); |                 string log = readFile(logPath); | ||||||
|                 writeFull(STDOUT_FILENO, (const unsigned char *) log.data(), log.size()); |                 writeFull(STDOUT_FILENO, log); | ||||||
|                 found = true; |                 found = true; | ||||||
|                 break; |                 break; | ||||||
|             } |             } | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue