chiark / gitweb /
In signal handler, crash if write() fails in an unexpected way
[innduct.git] / statemc.c
index 3ce00f483a6d35e6e825ec538b832a1571778120..b068722a15e339f81e7639341110c2ab977f433e 100644 (file)
--- a/statemc.c
+++ b/statemc.c
@@ -232,11 +232,11 @@ static void notice_processed_counts(Counts *counts, int completed,
 #define CNT(art,rc) (counts->results[art_##art][RC_##rc])
 
   char *inprog= ipf_xtra && !completed
-    ? xasprintf(" inprogress=%ld", ipf_xtra->inprogress)
-    : xasprintf("%s",""); /* GCC produces a stupid warning for printf("") ! */
+    ? masprintf(" inprogress=%ld", ipf_xtra->inprogress)
+    : masprintf("%s",""); /* GCC produces a stupid warning for printf("") ! */
   char *autodefer= ipf_xtra && ipf_xtra->autodefer >= 0
-    ? xasprintf(" autodeferred=%ld", ipf_xtra->autodefer)
-    : xasprintf("%s","");
+    ? masprintf(" autodeferred=%ld", ipf_xtra->autodefer)
+    : masprintf("%s","");
 
   notice("%s %s read=%d (+bl=%d,+err=%d)%s%s"
        " missing=%d offered=%d (ch=%d,nc=%d) accepted=%d (ch=%d,nc=%d)"
@@ -536,6 +536,7 @@ static void *sigarrived_event(oop_source *lp, int fd, oop_event e, void *u) {
 }
 
 static void sigarrived_handler(int signum) {
+  int esave = errno;
   static char x;
   switch (signum) {
   case SIGTERM:
@@ -545,7 +546,9 @@ static void sigarrived_handler(int signum) {
   default:
     abort();
   }
-  write(signal_self_pipe[1],&x,1);
+  int r = write(signal_self_pipe[1],&x,1);
+  if (!(r==1 || isewouldblock(errno))) abort();
+  errno = esave;
 }
 
 void init_signals(void) {