*** empty log message ***
authorroot <root>
Sun, 25 Dec 2005 15:30:29 +0000 (15:30 +0000)
committerroot <root>
Sun, 25 Dec 2005 15:30:29 +0000 (15:30 +0000)
Changes
src/rxvtdaemon.C

diff --git a/Changes b/Changes
index bc4416f..fbca761 100644 (file)
--- a/Changes
+++ b/Changes
@@ -10,6 +10,8 @@ WISH: meta-tagging of data by regex/master process (my dream project)
 WISH: OnTheSpot editing, or maybe switch to miiiiiiif
 WISH: just for fun, do shade and tint with XRender.
 
+       - workaround for possible linux-kernel bug, details pending.
+
 6.0  Sat Dec 24 13:58:56 CET 2005
        - make it compile without SMART_RESIZE again.
         - enable slow link support by default.
index 27cdece..a7c5dd1 100644 (file)
 
 #include <inttypes.h>
 #include <unistd.h>
+#include <errno.h>
+#include <sys/types.h>
 #include <sys/utsname.h>
 #include <limits.h>
 
 #include "rxvtdaemon.h"
 
+// works around linux kernel bug, returns EAGAIN on a blocking socket
+static ssize_t
+read_ (int fd, void *buf, size_t count)
+{
+  int ret;
+
+  do
+    ret = read (fd, buf, count);
+  while (ret < 0 && errno == EAGAIN);
+
+  return ret;
+}
+
 char *rxvt_connection::unix_sockname ()
 {
   char name[PATH_MAX];
@@ -72,7 +87,7 @@ bool rxvt_connection::recv (auto_str &data, int *len)
   uint8_t s[2];
   int l;
 
-  if (read (fd, s, 2) != 2)
+  if (read_ (fd, s, 2) != 2)
     return false;
 
   l = (s[0] << 8) + s[1];
@@ -87,7 +102,7 @@ bool rxvt_connection::recv (auto_str &data, int *len)
   if (!data)
     return false;
 
-  if (read (fd, data, l) != l)
+  if (read_ (fd, data, l) != l)
     return false;
 
   data[l] = 0;
@@ -108,7 +123,7 @@ bool rxvt_connection::recv (int &data)
 {
   uint8_t s[4];
 
-  if (read (fd, s, 4) != 4)
+  if (read_ (fd, s, 4) != 4)
     return false;
 
   data = (((((s[0] << 8) | s[1]) << 8) | s[2]) << 8) | s[3];