From ff9fbd971bdebf8eca22446139803a2647dbcf5a Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Thu, 2 May 2002 12:53:29 +0000
Subject: Tim's Changes

---
 cursor.c      | 13 +++++++------
 font.c        |  8 ++++----
 httpd.c       |  4 ++--
 main.c        | 21 ++++++++++++++++++---
 rfb.h         | 25 +++++++++++++++----------
 rfbserver.c   |  7 +++++--
 sockets.c     | 21 +++++++++++----------
 sraRegion.c   |  3 ---
 stats.c       |  2 +-
 tableinit24.c |  2 +-
 tight.c       |  4 ++--
 translate.c   |  4 ++--
 12 files changed, 68 insertions(+), 46 deletions(-)

diff --git a/cursor.c b/cursor.c
index bf2167d..b83c8be 100644
--- a/cursor.c
+++ b/cursor.c
@@ -230,18 +230,18 @@ rfbCursorPtr rfbMakeXCursor(int width,int height,char* cursorString,char* maskSt
    /*cursor->backRed=cursor->backGreen=cursor->backBlue=0xffff;*/
    cursor->foreRed=cursor->foreGreen=cursor->foreBlue=0xffff;
    
-   cursor->source = (char*)calloc(w,height);
+   cursor->source = (unsigned char*)calloc(w,height);
    for(j=0,cp=cursorString;j<height;j++)
       for(i=0,bit=0x80;i<width;i++,bit=(bit&1)?0x80:bit>>1,cp++)
 	if(*cp!=' ') cursor->source[j*w+i/8]|=bit;
 
    if(maskString) {
-      cursor->mask = (char*)calloc(w,height);
+      cursor->mask = (unsigned char*)calloc(w,height);
       for(j=0,cp=maskString;j<height;j++)
 	for(i=0,bit=0x80;i<width;i++,bit=(bit&1)?0x80:bit>>1,cp++)
 	  if(*cp!=' ') cursor->mask[j*w+i/8]|=bit;
    } else
-     cursor->mask = rfbMakeMaskForXCursor(width,height,cursor->source);
+     cursor->mask = (unsigned char*)rfbMakeMaskForXCursor(width,height,cursor->source);
 
    return(cursor);
 }
@@ -291,7 +291,7 @@ void MakeXCursorFromRichCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor)
    char *back=(char*)&background;
    unsigned char bit;
    
-   cursor->source=(char*)calloc(w,cursor->height);
+   cursor->source=(unsigned char*)calloc(w,cursor->height);
    
    if(format->bigEndian)
       back+=4-bpp;
@@ -310,10 +310,11 @@ void MakeRichCursorFromXCursor(rfbScreenInfoPtr rfbScreen,rfbCursorPtr cursor)
    rfbPixelFormat* format=&rfbScreen->rfbServerFormat;
    int i,j,w=(cursor->width+7)/8,bpp=format->bitsPerPixel/8;
    CARD32 background,foreground;
-   char *cp,*back=(char*)&background,*fore=(char*)&foreground;
+   char *back=(char*)&background,*fore=(char*)&foreground;
+   unsigned char *cp;
    unsigned char bit;
 
-   cp=cursor->richSource=(char*)calloc(cursor->width*bpp,cursor->height);
+   cp=cursor->richSource=(unsigned char*)calloc(cursor->width*bpp,cursor->height);
    
    if(format->bigEndian) {
       back+=4-bpp;
diff --git a/font.c b/font.c
index 4bebe44..b9d68d0 100644
--- a/font.c
+++ b/font.c
@@ -34,7 +34,7 @@ int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
 }
 
 void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
-		   int x,int y,const unsigned char* string,Pixel colour)
+		   int x,int y,const char* string,Pixel colour)
 {
   while(*string) {
     x+=rfbDrawChar(rfbScreen,font,x,y,*string,colour);
@@ -100,7 +100,7 @@ int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
 }
 
 void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
-			   int x,int y,const unsigned char* string,
+			   int x,int y,const char* string,
 			   int x1,int y1,int x2,int y2,
 			   Pixel colour,Pixel backColour)
 {
@@ -111,7 +111,7 @@ void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,
   }
 }
 
-int rfbWidthOfString(rfbFontDataPtr font,const unsigned char* string)
+int rfbWidthOfString(rfbFontDataPtr font,const char* string)
 {
   int i=0;
   while(*string) {
@@ -166,7 +166,7 @@ rfbFontDataPtr rfbLoadConsoleFont(char *filename)
   if(!f) return(0);
 
   p=(rfbFontDataPtr)malloc(sizeof(rfbFontData));
-  p->data=(char*)malloc(4096);
+  p->data=(unsigned char*)malloc(4096);
   if(1!=fread(p->data,4096,1,f)) {
     free(p->data);
     free(p);
diff --git a/httpd.c b/httpd.c
index 7a738a4..8f6aa01 100644
--- a/httpd.c
+++ b/httpd.c
@@ -113,7 +113,7 @@ httpCheckFds(rfbScreenInfoPtr rfbScreen)
     fd_set fds;
     struct timeval tv;
     struct sockaddr_in addr;
-    int addrlen = sizeof(addr);
+    socklen_t addrlen = sizeof(addr);
 
     if (!rfbScreen->httpDir)
 	return;
@@ -196,7 +196,7 @@ static void
 httpProcessInput(rfbScreenInfoPtr rfbScreen)
 {
     struct sockaddr_in addr;
-    int addrlen = sizeof(addr);
+    socklen_t addrlen = sizeof(addr);
     char fullFname[256];
     char *fname;
     unsigned int maxFnameLen;
diff --git a/main.c b/main.c
index b534ea3..13ad416 100644
--- a/main.c
+++ b/main.c
@@ -34,11 +34,21 @@
 
 MUTEX(logMutex);
 
+int rfbEnableLogging=1;
+
 /* we cannot compare to _LITTLE_ENDIAN, because some systems
    (as Solaris) assume little endian if _LITTLE_ENDIAN is
    defined, even if _BYTE_ORDER is not _LITTLE_ENDIAN */
 char rfbEndianTest = (_BYTE_ORDER == 1234);
 
+/* from rfbserver.c */
+void rfbIncrClientRef(rfbClientPtr cl);
+void rfbDecrClientRef(rfbClientPtr cl);
+
+void rfbLogEnable(int enabled) {
+  rfbEnableLogging=enabled;
+}
+
 /*
  * rfbLog prints a time-stamped message to the log file (stderr).
  */
@@ -50,6 +60,9 @@ rfbLog(const char *format, ...)
     char buf[256];
     time_t log_clock;
 
+    if(!rfbEnableLogging)
+      return;
+
     LOCK(logMutex);
     va_start(args, format);
 
@@ -259,7 +272,9 @@ clientOutput(void *data)
         UNLOCK(cl->updateMutex);
 
         /* Now actually send the update. */
+	rfbIncrClientRef(cl);
         rfbSendFramebufferUpdate(cl, updateRegion);
+	rfbDecrClientRef(cl);
 
 	sraRgnDestroy(updateRegion);
     }
@@ -300,7 +315,7 @@ listenerRun(void *data)
     int client_fd;
     struct sockaddr_in peer;
     rfbClientPtr cl;
-    int len;
+    socklen_t len;
 
     len = sizeof(peer);
 
@@ -397,7 +412,7 @@ rfbCursorPtr defaultGetCursorPtr(rfbClientPtr cl)
 }
 
 /* response is cl->authChallenge vncEncrypted with passwd */
-Bool defaultPasswordCheck(rfbClientPtr cl,char* response,int len)
+Bool defaultPasswordCheck(rfbClientPtr cl,const char* response,int len)
 {
   int i;
   char *passwd=vncDecryptPasswdFromFile(cl->screen->rfbAuthPasswdData);
@@ -427,7 +442,7 @@ Bool defaultPasswordCheck(rfbClientPtr cl,char* response,int len)
 
 /* for this method, rfbAuthPasswdData is really a pointer to an array
    of char*'s, where the last pointer is 0. */
-Bool rfbCheckPasswordByList(rfbClientPtr cl,char* response,int len)
+Bool rfbCheckPasswordByList(rfbClientPtr cl,const char* response,int len)
 {
   char **passwds;
 
diff --git a/rfb.h b/rfb.h
index e4e873e..e5cff59 100644
--- a/rfb.h
+++ b/rfb.h
@@ -47,6 +47,9 @@ typedef unsigned long KeySym;
 #define SIGNED signed
 /* for some strange reason, "typedef signed char Bool;" yields a four byte
    signed int on IRIX, but only for rfbserver.o!!! */
+#ifdef Bool
+#undef Bool
+#endif
 #define Bool signed char
 #undef FALSE
 #define FALSE 0
@@ -179,7 +182,7 @@ typedef void (*PtrAddEventProcPtr) (int buttonMask, int x, int y, struct _rfbCli
 typedef void (*SetXCutTextProcPtr) (char* str,int len, struct _rfbClientRec* cl);
 typedef struct rfbCursor* (*GetCursorProcPtr) (struct _rfbClientRec* pScreen);
 typedef Bool (*SetTranslateFunctionProcPtr)(struct _rfbClientRec* cl);
-typedef Bool (*PasswordCheckProcPtr)(struct _rfbClientRec* cl,char* encryptedPassWord,int len);
+typedef Bool (*PasswordCheckProcPtr)(struct _rfbClientRec* cl,const char* encryptedPassWord,int len);
 typedef enum rfbNewClientAction (*NewClientHookPtr)(struct _rfbClientRec* cl);
 typedef void (*DisplayHookPtr)(struct _rfbClientRec* cl);
 
@@ -261,7 +264,7 @@ typedef struct _rfbScreenInfo
 
     rfbPixelFormat rfbServerFormat;
     rfbColourMap colourMap; /* set this if rfbServerFormat.trueColour==FALSE */
-    char* desktopName;
+    const char* desktopName;
     char rfbThisHost[255];
 
     Bool autoPort;
@@ -560,7 +563,8 @@ extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen);
 extern void rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen);
 extern void rfbCloseClient(rfbClientPtr cl);
 extern int ReadExact(rfbClientPtr cl, char *buf, int len);
-extern int WriteExact(rfbClientPtr cl, char *buf, int len);
+extern int ReadExactTimeout(rfbClientPtr cl, char *buf, int len,int timeout);
+extern int WriteExact(rfbClientPtr cl, const char *buf, int len);
 extern void rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec);
 extern int rfbConnect(rfbScreenInfoPtr rfbScreen, char* host, int port);
 extern int ConnectToTcpAddr(char* host, int port);
@@ -623,8 +627,8 @@ extern void rfbSetClientColourMaps(rfbScreenInfoPtr rfbScreen, int firstColour,
 extern int httpPort;
 extern char *httpDir;
 
-extern void httpInitSockets();
-extern void httpCheckFds();
+extern void httpInitSockets(rfbScreenInfoPtr rfbScreen);
+extern void httpCheckFds(rfbScreenInfoPtr rfbScreen);
 
 
 
@@ -722,11 +726,11 @@ typedef struct rfbFontData {
 } rfbFontData,* rfbFontDataPtr;
 
 int rfbDrawChar(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,Pixel colour);
-void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const unsigned char* string,Pixel colour);
+void rfbDrawString(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,Pixel colour);
 /* if colour==backColour, background is transparent */
 int rfbDrawCharWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,unsigned char c,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour);
-void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const unsigned char* string,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour);
-int rfbWidthOfString(rfbFontDataPtr font,const unsigned char* string);
+void rfbDrawStringWithClip(rfbScreenInfoPtr rfbScreen,rfbFontDataPtr font,int x,int y,const char* string,int x1,int y1,int x2,int y2,Pixel colour,Pixel backColour);
+int rfbWidthOfString(rfbFontDataPtr font,const char* string);
 int rfbWidthOfChar(rfbFontDataPtr font,unsigned char c);
 void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int* y2);
 /* this returns the smallest box enclosing any character of font. */
@@ -759,13 +763,14 @@ extern int rfbSelectBox(rfbScreenInfoPtr rfbScreen,
 
 /* cargs.c */
 
-extern void rfbUsage();
+extern void rfbUsage(void);
 extern void rfbPurgeArguments(int* argc,int* position,int count,char *argv[]);
 extern void rfbProcessArguments(rfbScreenInfoPtr rfbScreen,int* argc, char *argv[]);
 extern void rfbProcessSizeArguments(int* width,int* height,int* bpp,int* argc, char *argv[]);
 
 /* main.c */
 
+extern void rfbLogEnable(int enabled);
 extern void rfbLog(const char *format, ...);
 extern void rfbLogPerror(const char *str);
 
@@ -781,7 +786,7 @@ void doNothingWithClient(rfbClientPtr cl);
 enum rfbNewClientAction defaultNewClientHook(rfbClientPtr cl);
 
 /* to check against plain passwords */
-Bool rfbCheckPasswordByList(rfbClientPtr cl,char* response,int len);
+Bool rfbCheckPasswordByList(rfbClientPtr cl,const char* response,int len);
 
 /* functions to make a vnc server */
 extern rfbScreenInfoPtr rfbGetScreen(int* argc,char** argv,
diff --git a/rfbserver.c b/rfbserver.c
index 913ee54..f936ccc 100644
--- a/rfbserver.c
+++ b/rfbserver.c
@@ -71,6 +71,9 @@ void rfbDecrClientRef(rfbClientPtr cl)
     TSIGNAL(cl->deleteCond);
   UNLOCK(cl->refCountMutex);
 }
+#else
+void rfbIncrClientRef(rfbClientPtr cl) {}
+void rfbDecrClientRef(rfbClientPtr cl) {}
 #endif
 
 MUTEX(rfbClientListMutex);
@@ -190,7 +193,7 @@ rfbNewTCPOrUDPClient(rfbScreen,sock,isUDP)
     rfbClientIteratorPtr iterator;
     rfbClientPtr cl,cl_;
     struct sockaddr_in addr;
-    int addrlen = sizeof(struct sockaddr_in);
+    socklen_t addrlen = sizeof(struct sockaddr_in);
     int i;
 
     cl = (rfbClientPtr)calloc(sizeof(rfbClientRec),1);
@@ -529,7 +532,7 @@ rfbProcessClientInitMessage(cl)
     si->format.blueMax = Swap16IfLE(si->format.blueMax);
 
     if (strlen(cl->screen->desktopName) > 128)      /* sanity check on desktop name len */
-        cl->screen->desktopName[128] = 0;
+        ((char*)cl->screen->desktopName)[128] = 0;
 
     strcpy(buf + sz_rfbServerInitMsg, cl->screen->desktopName);
     len = strlen(buf + sz_rfbServerInitMsg);
diff --git a/sockets.c b/sockets.c
index 7164904..350ff44 100644
--- a/sockets.c
+++ b/sockets.c
@@ -180,7 +180,7 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
     fd_set fds;
     struct timeval tv;
     struct sockaddr_in addr;
-    int addrlen = sizeof(addr);
+    socklen_t addrlen = sizeof(addr);
     char buf[6];
     const int one = 1;
     int sock;
@@ -311,6 +311,7 @@ rfbCloseClient(cl)
     LOCK(cl->updateMutex);
     if (cl->sock != -1) {
       FD_CLR(cl->sock,&(cl->screen->allFds));
+      shutdown(cl->sock,SHUT_RDWR);
       close(cl->sock);
       cl->sock = -1;
     }
@@ -369,10 +370,7 @@ rfbConnect(rfbScreen, host, port)
  */
 
 int
-ReadExact(cl, buf, len)
-     rfbClientPtr cl;
-     char *buf;
-     int len;
+ReadExactTimeout(rfbClientPtr cl, char* buf, int len, int timeout)
 {
     int sock = cl->sock;
     int n;
@@ -401,8 +399,8 @@ ReadExact(cl, buf, len)
 
             FD_ZERO(&fds);
             FD_SET(sock, &fds);
-            tv.tv_sec = rfbMaxClientWait / 1000;
-            tv.tv_usec = (rfbMaxClientWait % 1000) * 1000;
+            tv.tv_sec = timeout / 1000;
+            tv.tv_usec = (timeout % 1000) * 1000;
             n = select(sock+1, &fds, NULL, &fds, &tv);
             if (n < 0) {
                 rfbLogPerror("ReadExact: select");
@@ -417,7 +415,10 @@ ReadExact(cl, buf, len)
     return 1;
 }
 
-
+int ReadExact(rfbClientPtr cl,char* buf,int len)
+{
+  return(ReadExactTimeout(cl,buf,len,rfbMaxClientWait));
+}
 
 /*
  * WriteExact writes an exact number of bytes to a client.  Returns 1 if
@@ -428,7 +429,7 @@ ReadExact(cl, buf, len)
 int
 WriteExact(cl, buf, len)
      rfbClientPtr cl;
-     char *buf;
+     const char *buf;
      int len;
 {
     int sock = cl->sock;
@@ -535,7 +536,7 @@ ConnectToTcpAddr(host, port)
     addr.sin_family = AF_INET;
     addr.sin_port = htons(port);
 
-    if ((addr.sin_addr.s_addr = inet_addr(host)) == -1)
+    if ((addr.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
     {
 	if (!(hp = gethostbyname(host))) {
 	    errno = EINVAL;
diff --git a/sraRegion.c b/sraRegion.c
index 5f5f2d6..f94f4d4 100755
--- a/sraRegion.c
+++ b/sraRegion.c
@@ -172,9 +172,6 @@ sraSpanListMakeEmpty(sraSpanList *list) {
   list->back._next = NULL;
 }
 
-int sraMax(int a, int b) {return (a>b)?a:b;}
-int sraMin(int a, int b) {return (a<b)?a:b;}
-
 Bool
 sraSpanListEqual(const sraSpanList *s1, const sraSpanList *s2) {
   sraSpan *sp1, *sp2;
diff --git a/stats.c b/stats.c
index b6fcf62..7774d2f 100644
--- a/stats.c
+++ b/stats.c
@@ -27,7 +27,7 @@
 #include <stdlib.h>
 #include "rfb.h"
 
-static char* encNames[] = {
+static const char* encNames[] = {
     "raw", "copyRect", "RRE", "[encoding 3]", "CoRRE", "hextile",
     "zlib", "tight", "[encoding 8]", "[encoding 9]"
 };
diff --git a/tableinit24.c b/tableinit24.c
index ece8623..f1e63a5 100644
--- a/tableinit24.c
+++ b/tableinit24.c
@@ -34,7 +34,7 @@ rfbInitColourMapSingleTable24(char **table, rfbPixelFormat *in,
     CARD32 i, r, g, b, outValue;
     CARD8 *t;
     CARD8 c;
-    int nEntries = 1 << in->bitsPerPixel;
+    unsigned int nEntries = 1 << in->bitsPerPixel;
     int shift = colourMap->is16?16:8;
 
     if (*table) free(*table);
diff --git a/tight.c b/tight.c
index f9f20f5..8b57f82 100644
--- a/tight.c
+++ b/tight.c
@@ -449,9 +449,9 @@ CheckSolidTile(cl, x, y, w, h, colorPtr, needSameColor)
 #define DEFINE_CHECK_SOLID_FUNCTION(bpp)                                      \
                                                                               \
 static Bool                                                                   \
-CheckSolidTile##bpp(cl, x, y, w, h, colorPtr, needSameColor)                      \
+CheckSolidTile##bpp(cl, x, y, w, h, colorPtr, needSameColor)                  \
     rfbClientPtr cl;  \
-    int x, y;                                                                 \
+    int x, y, w, h;                                                           \
     CARD32 *colorPtr;                                                         \
     Bool needSameColor;                                                       \
 {                                                                             \
diff --git a/translate.c b/translate.c
index f9e121d..d6021d5 100644
--- a/translate.c
+++ b/translate.c
@@ -29,7 +29,7 @@
 #include "sraRegion.h"
 
 static void PrintPixelFormat(rfbPixelFormat *pf);
-static Bool rfbSetClientColourMapBGR233();
+static Bool rfbSetClientColourMapBGR233(rfbClientPtr cl);
 
 Bool rfbEconomicTranslate = FALSE;
 
@@ -38,7 +38,7 @@ Bool rfbEconomicTranslate = FALSE;
  */
 
 static const rfbPixelFormat BGR233Format = {
-    8, 8, 0, 1, 7, 7, 3, 0, 3, 6
+    8, 8, 0, 1, 7, 7, 3, 0, 3, 6, 0, 0
 };
 
 
-- 
cgit v1.2.3

