From 48029a3a0b854c50ef1b5e0b1cb27ba5f6220d9d Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Thu, 31 Jul 2003 16:48:23 +0000
Subject: rfbLog can be overridden; EINTR on read/write means just try again

---
 main.c    | 4 +++-
 rfb/rfb.h | 3 ++-
 sockets.c | 6 ++++++
 3 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/main.c b/main.c
index a5607b0..58619ba 100644
--- a/main.c
+++ b/main.c
@@ -59,7 +59,7 @@ void rfbLogEnable(int enabled) {
  */
 
 void
-rfbLog(const char *format, ...)
+rfbDefaultLog(const char *format, ...)
 {
     va_list args;
     char buf[256];
@@ -82,6 +82,8 @@ rfbLog(const char *format, ...)
     UNLOCK(logMutex);
 }
 
+rfbLogProc rfbLog=rfbDefaultLog;
+
 void rfbLogPerror(const char *str)
 {
     rfbLog("%s: %s\n", str, strerror(errno));
diff --git a/rfb/rfb.h b/rfb/rfb.h
index 171b076..8c22ce1 100644
--- a/rfb/rfb.h
+++ b/rfb/rfb.h
@@ -729,7 +729,8 @@ extern rfbBool rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc
 /* main.c */
 
 extern void rfbLogEnable(int enabled);
-extern void rfbLog(const char *format, ...);
+typedef void (*rfbLogProc)(const char *format, ...);
+extern rfbLogProc rfbLog;
 extern void rfbLogPerror(const char *str);
 
 void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
diff --git a/sockets.c b/sockets.c
index 5cb833f..0c6173f 100644
--- a/sockets.c
+++ b/sockets.c
@@ -415,6 +415,9 @@ ReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
 #ifdef WIN32
 			errno = WSAGetLastError();
 #endif
+	    if (errno == EINTR)
+		continue;
+
             if (errno != EWOULDBLOCK && errno != EAGAIN) {
                 return n;
             }
@@ -478,6 +481,9 @@ WriteExact(cl, buf, len)
 #ifdef WIN32
 			errno = WSAGetLastError();
 #endif
+	    if (errno == EINTR)
+		continue;
+
             if (errno != EWOULDBLOCK && errno != EAGAIN) {
 	        UNLOCK(cl->outputMutex);
                 return n;
-- 
cgit v1.2.3

