+
+void vfatal(const char *fmt, va_list al) {
+ progress("");
+ fputs("\n\nFatal error: ",stderr);
+ vfprintf(stderr,fmt,al);
+ fflush(stderr);
+ fputs("\n\n",stderr);
+ _exit(4);
+}
+
+void sysassert_fail(const char *file, int line, const char *what) {
+ int e= errno;
+ progress("");
+ fprintf(stderr,
+ "\nfatal operational error:\n"
+ " unsuccessful execution of: %s\n"
+ " %s:%d: %s\n\n",
+ what, file,line, strerror(e));
+ _exit(16);
+}
+
+void waitpid_check_exitstatus(pid_t pid, const char *what) {
+ pid_t got;
+ int st;
+ for (;;) {
+ got= waitpid(pid, &st, 0);
+ if (pid==-1) { sysassert(errno==EINTR); continue; }
+ break;
+ }
+ sysassert( got==pid );
+
+ if (WIFEXITED(st)) {
+ if (WEXITSTATUS(st))
+ fatal("%s failed with nonzero exit status %d",
+ what, WEXITSTATUS(st));
+ } else if (WIFSIGNALED(st)) {
+ fatal("%s died due to signal %s%s", what,
+ strsignal(WTERMSIG(st)), WCOREDUMP(st)?" (core dumped)":"");
+ } else {
+ fatal("%s gave strange wait status %d", what, st);
+ }
+}