From 48029a3a0b854c50ef1b5e0b1cb27ba5f6220d9d Mon Sep 17 00:00:00 2001 From: dscho Date: Thu, 31 Jul 2003 16:48:23 +0000 Subject: [PATCH] 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;