diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc index 937dbc7f9bacd7f28b8451b63f6a8381226fa9a6..29a6c339cb158dcd9a779d49bbc9668b6cd9a235 100644 --- a/src/libstore/normalise.cc +++ b/src/libstore/normalise.cc @@ -497,14 +497,8 @@ void NormalisationGoal::buildDone() /* Check the exit status. */ if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { deleteTmpDir(false); - if (WIFEXITED(status)) - throw Error(format("builder for `%1%' failed with exit code %2%") - % nePath % WEXITSTATUS(status)); - else if (WIFSIGNALED(status)) - throw Error(format("builder for `%1%' failed due to signal %2%") - % nePath % WTERMSIG(status)); - else - throw Error(format("builder for `%1%' failed died abnormally") % nePath); + throw Error(format("builder for `%1%' %2%") + % nePath % statusToString(status)); } deleteTmpDir(true); @@ -1425,17 +1419,9 @@ void SubstitutionGoal::finished() debug(format("substitute for `%1%' finished") % storePath); /* Check the exit status. */ - /* !!! cut & paste */ - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { - if (WIFEXITED(status)) - throw Error(format("builder for `%1%' failed with exit code %2%") - % storePath % WEXITSTATUS(status)); - else if (WIFSIGNALED(status)) - throw Error(format("builder for `%1%' failed due to signal %2%") - % storePath % WTERMSIG(status)); - else - throw Error(format("builder for `%1%' failed died abnormally") % storePath); - } + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) + throw Error(format("builder for `%1%' %2%") + % storePath % statusToString(status)); if (!pathExists(storePath)) throw Error(format("substitute did not produce path `%1%'") % storePath); diff --git a/src/libstore/store.cc b/src/libstore/store.cc index 73c09b27442fb3dfa431fc01ef0593851a61a5ed..59d4430fd6929bcb078d4b72ee85a0d8a200635f 100644 --- a/src/libstore/store.cc +++ b/src/libstore/store.cc @@ -164,7 +164,8 @@ void copyPath(const Path & src, const Path & dst) throw SysError("waiting for child"); if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) - throw Error("cannot copy file: child died"); + throw Error(format("cannot copy `%1% to `%2%': child %3%") + % src % dst % statusToString(status)); } diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 2cfada35450a6e5a45163a3dd4e73294d0687eaf..d3446d38a6d8cad569336fbd50d2bc1a94506486 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -491,3 +491,16 @@ Strings unpackStrings(const string & s) return strings; } + + +string statusToString(int status) +{ + if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) { + if (WIFEXITED(status)) + return (format("failed with exit code %2%") % WEXITSTATUS(status)).str(); + else if (WIFSIGNALED(status)) + return (format("failed due to signal %2%") % WTERMSIG(status)).str(); + else + return "died abnormally"; + } else return "succeeded"; +} diff --git a/src/libutil/util.hh b/src/libutil/util.hh index e808f4e1b50b77a1022d9f3fc8477bf228b70fa8..21c6774b9d078d7a1952a3a22c853157a90953f1 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -221,4 +221,9 @@ string packStrings(const Strings & strings); Strings unpackStrings(const string & s); +/* Convert the exit status of a child as returned by wait() into an + error string. */ +string statusToString(int status); + + #endif /* !__UTIL_H */