aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/libexpr/eval.cc2
-rw-r--r--src/libexpr/eval.hh2
-rw-r--r--src/libutil/util.cc11
-rw-r--r--src/nix-env/nix-env.cc1
4 files changed, 12 insertions, 4 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 96bda43a3..e55f28822 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -39,7 +39,7 @@ std::ostream & operator << (std::ostream & str, const Value & v)
str << v.path; // !!! escaping?
break;
case tNull:
- str << "true";
+ str << "null";
break;
case tAttrs: {
str << "{ ";
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 03bf43a3b..c7533479a 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -5,6 +5,7 @@
#include "nixexpr.hh"
#include "symbol-table.hh"
+#include "hash.hh"
typedef union _ATermList * ATermList;
@@ -12,7 +13,6 @@ typedef union _ATermList * ATermList;
namespace nix {
-class Hash;
class EvalState;
struct Env;
struct Value;
diff --git a/src/libutil/util.cc b/src/libutil/util.cc
index 2d26fc66d..e7c0700cf 100644
--- a/src/libutil/util.cc
+++ b/src/libutil/util.cc
@@ -481,7 +481,16 @@ void printMsg_(Verbosity level, const format & f)
else if (logType == ltEscapes && level != lvlInfo)
prefix = "\033[" + escVerbosity(level) + "s";
string s = (format("%1%%2%\n") % prefix % f.str()).str();
- writeToStderr((const unsigned char *) s.c_str(), s.size());
+ try {
+ writeToStderr((const unsigned char *) s.c_str(), s.size());
+ } catch (SysError & e) {
+ /* Ignore failing writes to stderr if we're in an exception
+ handler, otherwise throw an exception. We need to ignore
+ write errors in exception handlers to ensure that cleanup
+ code runs to completion if the other side of stderr has
+ been closed unexpectedly. */
+ if (!std::uncaught_exception()) throw;
+ }
}
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index a67ce243a..47dab0457 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -270,7 +270,6 @@ static DrvInfos filterBySelector(EvalState & state, const DrvInfos & allElems,
d = j->first.system == k->second.first.system ? 0 :
j->first.system == thisSystem ? 1 :
k->second.first.system == thisSystem ? -1 : 0;
- printMsg(lvlError, format("%1% %2% %3% %4%") % j->first.system % k->second.first.system % thisSystem % d);
if (d == 0)
d = comparePriorities(state, j->first, k->second.first);
if (d == 0)