Fixed unwanted recvfrom() with signal handler logs
diff --git a/CHANGES b/CHANGES
index 090e222..1594fb8 100644
--- a/CHANGES
+++ b/CHANGES
@@ -56,6 +56,9 @@
 
 	Procan tries to find out VSOCK CID only when running as root
 
+	The mechanism for deferring logs from signal handlers had an issue that
+	caused lots of unwanted recvfrom() calls.
+
 Features:
 	VSOCK, VSOCK-L support options pf, socktype, prototype (currently
 	useless)
diff --git a/error.c b/error.c
index f38abf1..bb3f91d 100644
--- a/error.c
+++ b/error.c
@@ -58,9 +58,9 @@
 		 int level, int exitcode, int handler, const char *text);
 static void _msg(int level, const char *buff, const char *syslp);
 
-sig_atomic_t diag_in_handler;	/* !=0 indicates to msg() that in signal handler */
-sig_atomic_t diag_immediate_msg;	/* !=0 prints messages even from within signal handler instead of deferring them */
-sig_atomic_t diag_immediate_exit;	/* !=0 calls exit() from diag_exit() even when in signal handler. For system() */
+volatile sig_atomic_t diag_in_handler;	/* !=0 indicates to msg() that in signal handler */
+volatile sig_atomic_t diag_immediate_msg;	/* !=0 prints messages even from within signal handler instead of deferring them */
+volatile sig_atomic_t diag_immediate_exit;	/* !=0 calls exit() from diag_exit() even when in signal handler. For system() */
 
 static struct wordent facilitynames[] = {
    {"auth",     (void *)LOG_AUTH},
@@ -108,7 +108,7 @@
 static int diaginitialized;
 static int diag_sock_send = -1;
 static int diag_sock_recv = -1;
-static int diag_msg_avail = 0;	/* !=0: messages from within signal handler may be waiting */
+static volatile sig_atomic_t diag_msg_avail = 0;	/* !=0: messages from within signal handler may be waiting */
 
 
 static int diag_sock_pair(void) {
@@ -278,7 +278,6 @@
    /* in normal program flow (not in signal handler) */
    /* first flush the queue of datagrams from the socket */
    if (diag_msg_avail && !diag_in_handler) {
-      diag_msg_avail = 0;	/* _before_ flush to prevent inconsistent state when signal occurs inbetween */
       diag_flush();
    }
 
@@ -418,6 +417,11 @@
    struct diag_dgram recv_dgram;
    char exitmsg[20];
 
+   if (diag_msg_avail == 0) {
+      return;
+   }
+   diag_msg_avail = 0;
+
    if (!diagopts.signalsafe) {
       return;
    }
@@ -500,6 +504,7 @@
 	   |MSG_NOSIGNAL
 #endif
 	   );
+      diag_msg_avail = 1;
       return;
    }
    _diag_exit(status);
diff --git a/error.h b/error.h
index 32e5a59..9853f8a 100644
--- a/error.h
+++ b/error.h
@@ -228,9 +228,9 @@
    char text[TEXTLEN];
 } ;
 
-extern sig_atomic_t diag_in_handler;
-extern sig_atomic_t diag_immediate_msg;
-extern sig_atomic_t diag_immediate_exit;
+extern volatile sig_atomic_t diag_in_handler;
+extern volatile sig_atomic_t diag_immediate_msg;
+extern volatile sig_atomic_t diag_immediate_exit;
 
 extern void diag_set(char what, const char *arg);
 extern void diag_set_int(char what, int arg);
diff --git a/socat.c b/socat.c
index 9e7b34a..b2600b4 100644
--- a/socat.c
+++ b/socat.c
@@ -85,7 +85,6 @@
 
 bool havelock;
 
-
 int main(int argc, const char *argv[]) {
    const char **arg1, *a;
    char *mainwaitstring;