diff --git a/src/libstore/normalise.cc b/src/libstore/normalise.cc index 937dbc7f9..29a6c339c 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 73c09b274..59d4430fd 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 2cfada354..d3446d38a 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 e808f4e1b..21c6774b9 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 */