From 67094d7c281993497decb1459ea1663765a760eb Mon Sep 17 00:00:00 2001
From: dscho <dscho>
Date: Thu, 11 Oct 2001 15:44:58 +0000
Subject: replaced xalloc with malloc functions, udp input support (untested),
 fixed http

---
 auth.c                |  20 ++----
 corre.c               |   8 +--
 httpd.c               |   6 +-
 main.c                |  12 +++-
 rfb.h                 | 162 ++++++++++++++++------------------------------
 rfbserver.c           | 176 ++++++++++++++++++++++++++++----------------------
 rre.c                 |   8 +--
 sockets.c             |  12 ++--
 sraRegion.c           |   4 +-
 tableinit24.c         |   4 +-
 tableinittctemplate.c |   4 +-
 tight.c               |  16 ++---
 zlib.c                |   8 +--
 13 files changed, 204 insertions(+), 236 deletions(-)

diff --git a/auth.c b/auth.c
index 3e23ada..4244cd6 100644
--- a/auth.c
+++ b/auth.c
@@ -30,10 +30,6 @@
 #include <stdlib.h>
 #include "rfb.h"
 
-
-char *rfbAuthPasswdFile = NULL;
-
-
 /*
  * rfbAuthNewClient is called when we reach the point of authenticating
  * a new client.  If authentication isn't being used then we simply send
@@ -49,15 +45,12 @@ rfbAuthNewClient(cl)
 
     cl->state = RFB_AUTHENTICATION;
 
-    if (rfbAuthPasswdFile && !cl->reverseConnection) {
-
+    if (cl->screen->rfbAuthPasswdData && !cl->reverseConnection) {
         *(CARD32 *)buf = Swap32IfLE(rfbVncAuth);
         vncRandomBytes(cl->authChallenge);
         memcpy(&buf[4], (char *)cl->authChallenge, CHALLENGESIZE);
         len = 4 + CHALLENGESIZE;
-
     } else {
-
         *(CARD32 *)buf = Swap32IfLE(rfbNoAuth);
         len = 4;
         cl->state = RFB_INITIALISATION;
@@ -80,7 +73,7 @@ void
 rfbAuthProcessClientMessage(cl)
     rfbClientPtr cl;
 {
-    char *passwd;
+    char passwd[1024];
     int i, n;
     CARD8 response[CHALLENGESIZE];
     CARD32 authResult;
@@ -92,14 +85,9 @@ rfbAuthProcessClientMessage(cl)
         return;
     }
 
-    passwd = vncDecryptPasswdFromFile(rfbAuthPasswdFile);
-
-    if (passwd == NULL) {
-        rfbLog("rfbAuthProcessClientMessage: could not get password from %s\n",
-               rfbAuthPasswdFile);
-
+    if(!cl->screen->getPassword(cl,passwd,MAXPWLEN)) {
+        rfbLog("rfbAuthProcessClientMessage: could not get password\n");
         authResult = Swap32IfLE(rfbVncAuthFailed);
-
         if (WriteExact(cl, (char *)&authResult, 4) < 0) {
             rfbLogPerror("rfbAuthProcessClientMessage: write");
         }
diff --git a/corre.c b/corre.c
index 5797efb..d6329a1 100644
--- a/corre.c
+++ b/corre.c
@@ -105,17 +105,17 @@ rfbSendSmallRectEncodingCoRRE(cl, x, y, w, h)
     if (rreBeforeBufSize < maxRawSize) {
         rreBeforeBufSize = maxRawSize;
         if (rreBeforeBuf == NULL)
-            rreBeforeBuf = (char *)xalloc(rreBeforeBufSize);
+            rreBeforeBuf = (char *)malloc(rreBeforeBufSize);
         else
-            rreBeforeBuf = (char *)xrealloc(rreBeforeBuf, rreBeforeBufSize);
+            rreBeforeBuf = (char *)realloc(rreBeforeBuf, rreBeforeBufSize);
     }
 
     if (rreAfterBufSize < maxRawSize) {
         rreAfterBufSize = maxRawSize;
         if (rreAfterBuf == NULL)
-            rreAfterBuf = (char *)xalloc(rreAfterBufSize);
+            rreAfterBuf = (char *)malloc(rreAfterBufSize);
         else
-            rreAfterBuf = (char *)xrealloc(rreAfterBuf, rreAfterBufSize);
+            rreAfterBuf = (char *)realloc(rreAfterBuf, rreAfterBufSize);
     }
 
     (*cl->translateFn)(cl->translateLookupTable,&(cl->screen->rfbServerFormat),
diff --git a/httpd.c b/httpd.c
index 7d92812..fd00ec2 100644
--- a/httpd.c
+++ b/httpd.c
@@ -45,7 +45,7 @@
     "<HEAD><TITLE>File Not Found</TITLE></HEAD>\n" \
     "<BODY><H1>File Not Found</H1></BODY>\n"
 
-#define OK_STR "HTTP/1.0 200 OK\n\n"
+#define OK_STR "HTTP/1.0 200 OK\nContent-Type: text/html\n\n"
 
 static void httpProcessInput();
 static Bool compareAndSkip(char **ptr, const char *str);
@@ -273,7 +273,7 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
 
     /* Open the file */
 
-    if ((fd = fopen(fullFname, O_RDONLY)) < 0) {
+    if ((fd = fopen(fullFname, "r")) <= 0) {
 	rfbLogPerror("httpProcessInput: open");
 	WriteExact(&cl, NOT_FOUND_STR, strlen(NOT_FOUND_STR));
 	httpCloseSock(rfbScreen);
@@ -283,7 +283,7 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen)
     WriteExact(&cl, OK_STR, strlen(OK_STR));
 
     while (1) {
-	int n = fread(buf, BUF_SIZE-1, 1, fd);
+	int n = fread(buf, 1, BUF_SIZE-1, fd);
 	if (n < 0) {
 	    rfbLogPerror("httpProcessInput: read");
 	    fclose(fd);
diff --git a/main.c b/main.c
index 478d8d8..7191a9f 100644
--- a/main.c
+++ b/main.c
@@ -326,7 +326,7 @@ processArguments(rfbScreenInfoPtr rfbScreen,int argc, char *argv[])
 	   rfbScreen->rfbMaxClientWait = atoi(argv[++i]);
         } else if (strcmp(argv[i], "-rfbauth") == 0) {  /* -rfbauth passwd-file */
             if (i + 1 >= argc) usage();
-            rfbScreen->rfbAuthPasswdFile = argv[++i];
+            rfbScreen->rfbAuthPasswdData = argv[++i];
         } else if (strcmp(argv[i], "-desktop") == 0) {  /* -desktop desktop-name */
             if (i + 1 >= argc) usage();
             rfbScreen->desktopName = argv[++i];
@@ -400,6 +400,15 @@ rfbCursorPtr defaultGetCursorPtr(rfbClientPtr cl)
    return(cl->screen->cursor);
 }
 
+Bool defaultGetPassword(rfbClientPtr cl,char* passwd,int len)
+{
+  char *pwd=vncDecryptPasswdFromFile(cl->screen->rfbAuthPasswdData);
+  if(!pwd)
+    return(FALSE);
+  strncpy(passwd,pwd,MAXPWLEN);
+  return(TRUE);
+}
+
 void doNothingWithClient(rfbClientPtr cl)
 {
 }
@@ -511,6 +520,7 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv,
    rfbScreen->setXCutText = defaultSetXCutText;
    rfbScreen->getCursorPtr = defaultGetCursorPtr;
    rfbScreen->setTranslateFunction = rfbSetTranslateFunction;
+   rfbScreen->getPassword = defaultGetPassword;
    rfbScreen->newClientHook = doNothingWithClient;
    rfbScreen->displayHook = 0;
 
diff --git a/rfb.h b/rfb.h
index ae9660e..d138620 100644
--- a/rfb.h
+++ b/rfb.h
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
+#include <zlib.h>
 #include "keysym.h"
 
 /* TODO: this stuff has to go into autoconf */
@@ -35,19 +36,13 @@ typedef unsigned int CARD32;
 typedef CARD32 Pixel;
 typedef CARD32 KeySym;
 /* for some strange reason, "typedef signed char Bool;" yields a four byte
-   signed int on an SGI, but only for rfbserver.o!!! */
+   signed int on IRIX, but only for rfbserver.o!!! */
 #define Bool signed char
 #undef FALSE
 #define FALSE 0
 #undef TRUE
 #define TRUE -1
 
-#define xalloc malloc
-#define xrealloc realloc
-#define xfree free
-
-#include <zlib.h>
-
 #include "rfbproto.h"
 
 #ifdef __linux__
@@ -84,7 +79,6 @@ typedef CARD32 KeySym;
 
 #ifdef WIN32
 #include <winsock.h>
-//#define sockaddr_in sockaddr*
 #undef SOCKET
 #define SOCKET int
 #else
@@ -134,6 +128,18 @@ int max(int,int);
 #define IF_PTHREADS(x)
 #endif
 
+/* end of stuff for autoconf */
+
+/* if you use pthreads, but don't define HAVE_PTHREADS, the structs
+   get all mixed up. So this gives a linker error reminding you to compile
+   the library and your application (at least the parts including rfb.h)
+   with the same support for pthreads. */
+#ifdef HAVE_PTHREADS
+#define rfbInitServer rfbInitServerWithPthreads
+#else
+#define rfbInitServer rfbInitServerWithoutPthreads
+#endif
+
 #define MAX_ENCODINGS 10
 
 struct rfbClientRec;
@@ -146,6 +152,7 @@ typedef void (*PtrAddEventProcPtr) (int buttonMask, int x, int y, struct rfbClie
 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 (*GetPasswordProcPtr)(struct rfbClientRec* cl,char* passWord,int len);
 typedef void (*NewClientHookPtr)(struct rfbClientRec* cl);
 typedef void (*DisplayHookPtr)(struct rfbClientRec* cl);
 
@@ -158,26 +165,10 @@ typedef struct {
   } data; /* there have to be count*3 entries */
 } rfbColourMap;
 
-/* this is why windows and it's programs are so huge:
-	You can't do something like
-#define MUTEX(m)
-	struct {
-		int i;
-		MUTEX(m);	// this evaluates to ";", and that is not acceptable
-					// to Visual C++
-	}
-*/
-
-#ifdef WIN32
-#undef MUTEX
-#define MUTEX(mutex) char dummy##mutex
-#undef COND
-#define COND(cond) char dummy##cond
-#endif
-
 /*
- * Per-screen (framebuffer) structure.  There is only one of these, since we
- * don't allow the X server to have multiple screens.
+ * Per-screen (framebuffer) structure.  There can be as many as you wish,
+ * each serving different clients. However, you have to call
+ * rfbProcessEvents for each of these.
  */
 
 typedef struct
@@ -245,21 +236,26 @@ typedef struct
     rfbColourMap colourMap; /* set this if rfbServerFormat.trueColour==FALSE */
     char* desktopName;
     char rfbThisHost[255];
+
     int rfbPort;
-    Bool socketInitDone;
-    SOCKET inetdSock;
+    SOCKET rfbListenSock;
     int maxSock;
     int maxFd;
-	SOCKET rfbListenSock;
+    fd_set allFds;
+
+    Bool socketInitDone;
+    SOCKET inetdSock;
+    Bool inetdInitDone;
+
     int udpPort;
     SOCKET udpSock;
     struct rfbClientRec* udpClient;
     Bool udpSockConnected;
     struct sockaddr_in udpRemoteAddr;
-    Bool inetdInitDone;
-    fd_set allFds;
+
     int rfbMaxClientWait;
-  /* http stuff */
+
+    /* http stuff */
     Bool httpInitDone;
     int httpPort;
     char* httpDir;
@@ -267,7 +263,9 @@ typedef struct
     SOCKET httpSock;
     FILE* httpFP;
 
-    char* rfbAuthPasswdFile;
+    GetPasswordProcPtr getPassword;
+    char* rfbAuthPasswdData;
+
     int rfbDeferUpdateTime;
     char* rfbScreen;
     Bool rfbAlwaysShared;
@@ -295,8 +293,8 @@ typedef struct
     /* displayHook is called just before a frame buffer update */
     DisplayHookPtr displayHook;
 
-    MUTEX(cursorMutex);
 #ifdef HAVE_PTHREADS
+    MUTEX(cursorMutex);
     Bool backgroundLoop;
 #endif
 
@@ -345,6 +343,8 @@ typedef struct rfbClientRec {
     /* private data. You should put any application client specific data
      * into a struct and let clientData point to it. Don't forget to
      * free the struct via clientGoneHook!
+     *
+     * This is useful if the IO functions have to behave client specific.
      */
     void* clientData;
     ClientGoneHookPtr clientGoneHook;
@@ -360,15 +360,12 @@ typedef struct rfbClientRec {
     } state;
 
     Bool reverseConnection;
-
     Bool readyForSetColourMapEntries;
-   
     Bool useCopyRect;
     int preferredEncoding;
     int correMaxWidth, correMaxHeight;
 
     /* The following member is only used during VNC authentication */
-
     CARD8 authChallenge[CHALLENGESIZE];
 
     /* The following members represent the update needed to get the client's
@@ -397,7 +394,6 @@ typedef struct rfbClientRec {
     sraRegionPtr copyRegion;	/* the destination region of the copy */
     int copyDX, copyDY;		/* the translation by which the copy happens */
 
-
     sraRegionPtr modifiedRegion;
 
     /* As part of the FramebufferUpdateRequest, a client can express interest
@@ -407,31 +403,25 @@ typedef struct rfbClientRec {
 
     sraRegionPtr requestedRegion;
 
+    /* TODO: */
     /* The following members represent the state of the "deferred update" timer
        - when the framebuffer is modified and the client is ready, in most
        cases it is more efficient to defer sending the update by a few
        milliseconds so that several changes to the framebuffer can be combined
        into a single update. */
 
-  /* no deferred timer here; server has to do it alone */
-
-  /* Bool deferredUpdateScheduled;
-     OsTimerPtr deferredUpdateTimer; */
-
     /* translateFn points to the translation function which is used to copy
        and translate a rectangle from the framebuffer to an output buffer. */
 
     rfbTranslateFnType translateFn;
-
     char *translateLookupTable;
-
     rfbPixelFormat format;
 
-/*
- * UPDATE_BUF_SIZE must be big enough to send at least one whole line of the
- * framebuffer.  So for a max screen width of say 2K with 32-bit pixels this
- * means 8K minimum.
- */
+    /*
+     * UPDATE_BUF_SIZE must be big enough to send at least one whole line of the
+     * framebuffer.  So for a max screen width of say 2K with 32-bit pixels this
+     * means 8K minimum.
+     */
 
 #define UPDATE_BUF_SIZE 30000
 
@@ -455,7 +445,6 @@ typedef struct rfbClientRec {
 
     struct z_stream_s compStream;
     Bool compStreamInited;
-
     CARD32 zlibCompressLevel;
 
     /* tight encoding -- preserve zlib streams' state for each client */
@@ -476,7 +465,8 @@ typedef struct rfbClientRec {
 
 #ifdef HAVE_PTHREADS
     /* whenever a client is referenced, the refCount has to be incremented
-       and afterwards decremented.
+       and afterwards decremented, so that the client is not cleaned up
+       while being referenced.
        Use the functions rfbIncrClientRef(cl) and rfbDecrClientRef(cl);
     */
     int refCount;
@@ -490,7 +480,6 @@ typedef struct rfbClientRec {
 
 } rfbClientRec, *rfbClientPtr;
 
-
 /*
  * This macro is used to test whether there is a framebuffer update needing to
  * be sent to the client.
@@ -501,28 +490,6 @@ typedef struct rfbClientRec {
      ((cl)->enableCursorShapeUpdates && (cl)->cursorWasChanged) ||      \
      !sraRgnEmpty((cl)->copyRegion) || !sraRgnEmpty((cl)->modifiedRegion))
 
-      //REGION_NOTEMPTY(&((cl)->screenInfo->screen),&(cl)->copyRegion) ||  
-      //REGION_NOTEMPTY(&((cl)->screenInfo->screen),&(cl)->modifiedRegion))
-
-/*
- * This macro creates an empty region (ie. a region with no areas) if it is
- * given a rectangle with a width or height of zero. It appears that 
- * REGION_INTERSECT does not quite do the right thing with zero-width
- * rectangles, but it should with completely empty regions.
- */
-
-#define SAFE_REGION_INIT(pscreen, preg, rect, size)          \
-{                                                            \
-      if ( ( (rect) ) &&                                     \
-           ( ( (rect)->x2 == (rect)->x1 ) ||                 \
-             ( (rect)->y2 == (rect)->y1 ) ) ) {              \
-          REGION_INIT( (pscreen), (preg), NullBox, 0 );      \
-      } else {                                               \
-          REGION_INIT( (pscreen), (preg), (rect), (size) );  \
-      }                                                      \
-}
-
-
 /*
  * Macros for endian swapping.
  */
@@ -544,22 +511,12 @@ static const int rfbEndianTest = (_BYTE_ORDER == _LITTLE_ENDIAN);
 #define Swap24IfLE(l) (rfbEndianTest ? Swap24(l) : (l))
 #define Swap32IfLE(l) (rfbEndianTest ? Swap32(l) : (l))
 
-/* main.c */
-
-extern void rfbLog(char *format, ...);
-extern void rfbLogPerror(char *str);
-
-void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
-void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy);
-
-void rfbDoCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
-void rfbDoCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy);
-
-
 /* sockets.c */
 
 extern int rfbMaxClientWait;
 
+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);
@@ -585,12 +542,13 @@ extern void rfbReleaseClientIterator(rfbClientIteratorPtr iterator);
 
 extern void rfbNewClientConnection(rfbScreenInfoPtr rfbScreen,int sock);
 extern rfbClientPtr rfbNewClient(rfbScreenInfoPtr rfbScreen,int sock);
+extern rfbClientPtr rfbNewUDPClient(rfbScreenInfoPtr rfbScreen);
 extern rfbClientPtr rfbReverseConnection(rfbScreenInfoPtr rfbScreen,char *host, int port);
 extern void rfbClientConnectionGone(rfbClientPtr cl);
 extern void rfbProcessClientMessage(rfbClientPtr cl);
 extern void rfbClientConnFailed(rfbClientPtr cl, char *reason);
 extern void rfbNewUDPConnection(rfbScreenInfoPtr rfbScreen,int sock);
-extern void rfbProcessUDPInput(rfbClientPtr cl);
+extern void rfbProcessUDPInput(rfbScreenInfoPtr rfbScreen);
 extern Bool rfbSendFramebufferUpdate(rfbClientPtr cl, sraRegionPtr updateRegion);
 extern Bool rfbSendRectEncodingRaw(rfbClientPtr cl, int x,int y,int w,int h);
 extern Bool rfbSendUpdateBuf(rfbClientPtr cl);
@@ -628,8 +586,6 @@ extern void httpCheckFds();
 /* auth.c */
 
 extern char *rfbAuthPasswdFile;
-extern Bool rfbAuthenticating;
-
 extern void rfbAuthNewClient(rfbClientPtr cl);
 extern void rfbAuthProcessClientMessage(rfbClientPtr cl);
 
@@ -709,11 +665,6 @@ extern void defaultPtrAddEvent(int buttonMask,int x,int y,rfbClientPtr cl);
 extern void rfbResetStats(rfbClientPtr cl);
 extern void rfbPrintStats(rfbClientPtr cl);
 
-/* socket.c */
-
-extern void rfbInitSockets(rfbScreenInfoPtr rfbScreen);
-extern void rfbDisconnectUDPSock(rfbScreenInfoPtr cl);
-
 /* font.c */
 
 typedef struct rfbFontData {
@@ -734,20 +685,19 @@ void rfbFontBBox(rfbFontDataPtr font,unsigned char c,int* x1,int* y1,int* x2,int
 
 /* main.c */
 
+extern void rfbLog(char *format, ...);
+extern void rfbLogPerror(char *str);
+
+void rfbScheduleCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
+void rfbScheduleCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy);
+
+void rfbDoCopyRect(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2,int dx,int dy);
+void rfbDoCopyRegion(rfbScreenInfoPtr rfbScreen,sraRegionPtr copyRegion,int dx,int dy);
+
 void rfbMarkRectAsModified(rfbScreenInfoPtr rfbScreen,int x1,int y1,int x2,int y2);
 void rfbMarkRegionAsModified(rfbScreenInfoPtr rfbScreen,sraRegionPtr modRegion);
 void doNothingWithClient(rfbClientPtr cl);
 
-/* if you use pthreads, but don't define HAVE_PTHREADS, the structs
-   get all mixed up. So this gives a linker error reminding you to compile
-   the library and your application (at least the parts including rfb.h)
-   with the same support for pthreads. */
-#ifdef HAVE_PTHREADS
-#define rfbInitServer rfbInitServerWithPthreads
-#else
-#define rfbInitServer rfbInitServerWithoutPthreads
-#endif
-
 /* functions to make a vnc server */
 extern rfbScreenInfoPtr rfbGetScreen(int argc,char** argv,
  int width,int height,int bitsPerSample,int samplesPerPixel,
diff --git a/rfbserver.c b/rfbserver.c
index 51daae4..bd22a70 100644
--- a/rfbserver.c
+++ b/rfbserver.c
@@ -173,108 +173,128 @@ rfbReverseConnection(rfbScreen,host, port)
  */
 
 rfbClientPtr
-rfbNewClient(rfbScreen,sock)
+rfbNewTCPOrUDPClient(rfbScreen,sock,isUDP)
     rfbScreenInfoPtr rfbScreen;
     int sock;
+    Bool isUDP;
 {
     rfbProtocolVersionMsg pv;
     rfbClientIteratorPtr iterator;
-    rfbClientPtr cl;
+    rfbClientPtr cl,cl_;
     struct sockaddr_in addr;
     int addrlen = sizeof(struct sockaddr_in);
     int i;
 
-    rfbLog("  other clients:\n");
-    iterator = rfbGetClientIterator(rfbScreen);
-    while ((cl = rfbClientIteratorNext(iterator)) != NULL) {
-        rfbLog("     %s\n",cl->host);
-    }
-    rfbReleaseClientIterator(iterator);
-
-    cl = (rfbClientPtr)xalloc(sizeof(rfbClientRec));
+    cl = (rfbClientPtr)malloc(sizeof(rfbClientRec));
 
-    FD_SET(sock,&(rfbScreen->allFds));
     cl->screen = rfbScreen;
     cl->sock = sock;
-    getpeername(sock, (struct sockaddr *)&addr, &addrlen);
-    cl->host = strdup(inet_ntoa(addr.sin_addr));
+    rfbResetStats(cl);
 
-    INIT_MUTEX(cl->outputMutex);
-    INIT_MUTEX(cl->refCountMutex);
-    INIT_COND(cl->deleteCond);
+    if(isUDP) {
+      rfbLog(" accepted UDP client\n");
+    } else {
+      getpeername(sock, (struct sockaddr *)&addr, &addrlen);
+      cl->host = strdup(inet_ntoa(addr.sin_addr));
 
-    cl->state = RFB_PROTOCOL_VERSION;
+      rfbLog("  other clients:\n");
+      iterator = rfbGetClientIterator(rfbScreen);
+      while ((cl_ = rfbClientIteratorNext(iterator)) != NULL) {
+        rfbLog("     %s\n",cl_->host);
+      }
+      rfbReleaseClientIterator(iterator);
 
-    cl->reverseConnection = FALSE;
-    cl->readyForSetColourMapEntries = FALSE;
-    cl->useCopyRect = FALSE;
-    cl->preferredEncoding = rfbEncodingRaw;
-    cl->correMaxWidth = 48;
-    cl->correMaxHeight = 48;
+      FD_SET(sock,&(rfbScreen->allFds));
+      INIT_MUTEX(cl->outputMutex);
+      INIT_MUTEX(cl->refCountMutex);
+      INIT_COND(cl->deleteCond);
 
-    cl->copyRegion = sraRgnCreate();
-    cl->copyDX = 0;
-    cl->copyDY = 0;
+      cl->state = RFB_PROTOCOL_VERSION;
+
+      cl->reverseConnection = FALSE;
+      cl->readyForSetColourMapEntries = FALSE;
+      cl->useCopyRect = FALSE;
+      cl->preferredEncoding = rfbEncodingRaw;
+      cl->correMaxWidth = 48;
+      cl->correMaxHeight = 48;
+
+      cl->copyRegion = sraRgnCreate();
+      cl->copyDX = 0;
+      cl->copyDY = 0;
    
-    cl->modifiedRegion =
-      sraRgnCreateRect(0,0,rfbScreen->width,rfbScreen->height);
+      cl->modifiedRegion =
+	sraRgnCreateRect(0,0,rfbScreen->width,rfbScreen->height);
 
-    INIT_MUTEX(cl->updateMutex);
-    INIT_COND(cl->updateCond);
+      INIT_MUTEX(cl->updateMutex);
+      INIT_COND(cl->updateCond);
 
-    cl->requestedRegion = sraRgnCreate();
+      cl->requestedRegion = sraRgnCreate();
 
-    cl->format = cl->screen->rfbServerFormat;
-    cl->translateFn = rfbTranslateNone;
-    cl->translateLookupTable = NULL;
+      cl->format = cl->screen->rfbServerFormat;
+      cl->translateFn = rfbTranslateNone;
+      cl->translateLookupTable = NULL;
 
-    LOCK(rfbClientListMutex);
+      LOCK(rfbClientListMutex);
 
-    IF_PTHREADS(cl->refCount = 0);
-    cl->next = rfbScreen->rfbClientHead;
-    cl->prev = NULL;
-    if (rfbScreen->rfbClientHead)
+      IF_PTHREADS(cl->refCount = 0);
+      cl->next = rfbScreen->rfbClientHead;
+      cl->prev = NULL;
+      if (rfbScreen->rfbClientHead)
         rfbScreen->rfbClientHead->prev = cl;
 
-    rfbScreen->rfbClientHead = cl;
-    UNLOCK(rfbClientListMutex);
+      rfbScreen->rfbClientHead = cl;
+      UNLOCK(rfbClientListMutex);
 
-    cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
-    cl->tightQualityLevel = -1;
-    for (i = 0; i < 4; i++)
+      cl->tightCompressLevel = TIGHT_DEFAULT_COMPRESSION;
+      cl->tightQualityLevel = -1;
+      for (i = 0; i < 4; i++)
         cl->zsActive[i] = FALSE;
 
-    cl->enableCursorShapeUpdates = FALSE;
-    cl->useRichCursorEncoding = FALSE;
-    cl->enableLastRectEncoding = FALSE;
+      cl->enableCursorShapeUpdates = FALSE;
+      cl->useRichCursorEncoding = FALSE;
+      cl->enableLastRectEncoding = FALSE;
 
-    rfbResetStats(cl);
+      cl->compStreamInited = FALSE;
+      cl->compStream.total_in = 0;
+      cl->compStream.total_out = 0;
+      cl->compStream.zalloc = Z_NULL;
+      cl->compStream.zfree = Z_NULL;
+      cl->compStream.opaque = Z_NULL;
 
-    cl->compStreamInited = FALSE;
-    cl->compStream.total_in = 0;
-    cl->compStream.total_out = 0;
-    cl->compStream.zalloc = Z_NULL;
-    cl->compStream.zfree = Z_NULL;
-    cl->compStream.opaque = Z_NULL;
+      cl->zlibCompressLevel = 5;
 
-    cl->zlibCompressLevel = 5;
+      sprintf(pv,rfbProtocolVersionFormat,rfbProtocolMajorVersion,
+	      rfbProtocolMinorVersion);
 
-    sprintf(pv,rfbProtocolVersionFormat,rfbProtocolMajorVersion,
-            rfbProtocolMinorVersion);
-
-    cl->clientData = NULL;
-    cl->clientGoneHook = doNothingWithClient;
-    cl->screen->newClientHook(cl);
-
-    if (WriteExact(cl, pv, sz_rfbProtocolVersionMsg) < 0) {
+      if (WriteExact(cl, pv, sz_rfbProtocolVersionMsg) < 0) {
         rfbLogPerror("rfbNewClient: write");
         rfbCloseClient(cl);
         return NULL;
+      }
     }
 
+    cl->clientData = NULL;
+    cl->clientGoneHook = doNothingWithClient;
+    cl->screen->newClientHook(cl);
+
     return cl;
 }
 
+rfbClientPtr
+rfbNewClient(rfbScreen,sock)
+    rfbScreenInfoPtr rfbScreen;
+    int sock;
+{
+  return(rfbNewTCPOrUDPClient(rfbScreen,sock,FALSE));
+}
+
+rfbClientPtr
+rfbNewUDPClient(rfbScreen)
+     rfbScreenInfoPtr rfbScreen;
+{
+  return((rfbScreen->udpClient=
+	  rfbNewTCPOrUDPClient(rfbScreen,rfbScreen->udpSock,TRUE)));
+}
 
 /*
  * rfbClientConnectionGone is called from sockets.c just after a connection
@@ -342,7 +362,7 @@ rfbClientConnectionGone(cl)
 
     rfbPrintStats(cl);
 
-    xfree(cl);
+    free(cl);
 }
 
 
@@ -434,14 +454,14 @@ rfbClientConnFailed(cl, reason)
     char *buf;
     int len = strlen(reason);
 
-    buf = (char *)xalloc(8 + len);
+    buf = (char *)malloc(8 + len);
     ((CARD32 *)buf)[0] = Swap32IfLE(rfbConnFailed);
     ((CARD32 *)buf)[1] = Swap32IfLE(len);
     memcpy(buf + 8, reason, len);
 
     if (WriteExact(cl, buf, 8 + len) < 0)
         rfbLogPerror("rfbClientConnFailed: write");
-    xfree(buf);
+    free(buf);
     rfbCloseClient(cl);
 }
 
@@ -808,19 +828,19 @@ rfbProcessClientNormalMessage(cl)
 
         msg.cct.length = Swap32IfLE(msg.cct.length);
 
-        str = (char *)xalloc(msg.cct.length);
+        str = (char *)malloc(msg.cct.length);
 
         if ((n = ReadExact(cl, str, msg.cct.length)) <= 0) {
             if (n != 0)
                 rfbLogPerror("rfbProcessClientNormalMessage: read");
-            xfree(str);
+            free(str);
             rfbCloseClient(cl);
             return;
         }
 
         cl->screen->setXCutText(str, msg.cct.length, cl);
 
-        xfree(str);
+        free(str);
         return;
 
 
@@ -1388,18 +1408,21 @@ rfbNewUDPConnection(rfbScreen,sock)
  * number of bytes we can possibly get.
  */
 
-#if 0
 void
-rfbProcessUDPInput(rfbClientPtr cl)
+rfbProcessUDPInput(rfbScreenInfoPtr rfbScreen)
 {
     int n;
+    rfbClientPtr cl=rfbScreen->udpClient;
     rfbClientToServerMsg msg;
 
-    if ((n = read(cl->udpSock, (char *)&msg, sizeof(msg))) <= 0) {
+    if(!cl)
+      return;
+
+    if ((n = read(rfbScreen->udpSock, (char *)&msg, sizeof(msg))) <= 0) {
 	if (n < 0) {
 	    rfbLogPerror("rfbProcessUDPInput: read");
 	}
-	rfbDisconnectUDPSock(cl);
+	rfbDisconnectUDPSock(rfbScreen);
 	return;
     }
 
@@ -1408,7 +1431,7 @@ rfbProcessUDPInput(rfbClientPtr cl)
     case rfbKeyEvent:
 	if (n != sz_rfbKeyEventMsg) {
 	    rfbLog("rfbProcessUDPInput: key event incorrect length\n");
-	    rfbDisconnectUDPSock(cl);
+	    rfbDisconnectUDPSock(rfbScreen);
 	    return;
 	}
 	cl->screen->kbdAddEvent(msg.ke.down, (KeySym)Swap32IfLE(msg.ke.key), cl);
@@ -1417,7 +1440,7 @@ rfbProcessUDPInput(rfbClientPtr cl)
     case rfbPointerEvent:
 	if (n != sz_rfbPointerEventMsg) {
 	    rfbLog("rfbProcessUDPInput: ptr event incorrect length\n");
-	    rfbDisconnectUDPSock(cl);
+	    rfbDisconnectUDPSock(rfbScreen);
 	    return;
 	}
 	cl->screen->ptrAddEvent(msg.pe.buttonMask,
@@ -1427,7 +1450,6 @@ rfbProcessUDPInput(rfbClientPtr cl)
     default:
 	rfbLog("rfbProcessUDPInput: unknown message type %d\n",
 	       msg.type);
-	rfbDisconnectUDPSock(cl);
+	rfbDisconnectUDPSock(rfbScreen);
     }
 }
-#endif
diff --git a/rre.c b/rre.c
index d228642..9a552cb 100644
--- a/rre.c
+++ b/rre.c
@@ -71,17 +71,17 @@ rfbSendRectEncodingRRE(cl, x, y, w, h)
     if (rreBeforeBufSize < maxRawSize) {
         rreBeforeBufSize = maxRawSize;
         if (rreBeforeBuf == NULL)
-            rreBeforeBuf = (char *)xalloc(rreBeforeBufSize);
+            rreBeforeBuf = (char *)malloc(rreBeforeBufSize);
         else
-            rreBeforeBuf = (char *)xrealloc(rreBeforeBuf, rreBeforeBufSize);
+            rreBeforeBuf = (char *)realloc(rreBeforeBuf, rreBeforeBufSize);
     }
 
     if (rreAfterBufSize < maxRawSize) {
         rreAfterBufSize = maxRawSize;
         if (rreAfterBuf == NULL)
-            rreAfterBuf = (char *)xalloc(rreAfterBufSize);
+            rreAfterBuf = (char *)malloc(rreAfterBufSize);
         else
-            rreAfterBuf = (char *)xrealloc(rreAfterBuf, rreAfterBufSize);
+            rreAfterBuf = (char *)realloc(rreAfterBuf, rreAfterBufSize);
     }
 
     (*cl->translateFn)(cl->translateLookupTable,
diff --git a/sockets.c b/sockets.c
index 776fc49..7134468 100644
--- a/sockets.c
+++ b/sockets.c
@@ -214,15 +214,14 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
     }
 
     if ((rfbScreen->udpSock != -1) && FD_ISSET(rfbScreen->udpSock, &fds)) {
-
+        if(!rfbScreen->udpClient)
+	    rfbNewUDPClient(rfbScreen);
 	if (recvfrom(rfbScreen->udpSock, buf, 1, MSG_PEEK,
 		     (struct sockaddr *)&addr, &addrlen) < 0) {
-
 	    rfbLogPerror("rfbCheckFds: UDP: recvfrom");
 	    rfbDisconnectUDPSock(rfbScreen);
-
+	    rfbScreen->udpSockConnected = FALSE;
 	} else {
-
 	    if (!rfbScreen->udpSockConnected ||
 		(memcmp(&addr, &rfbScreen->udpRemoteAddr, addrlen) != 0))
 	    {
@@ -242,8 +241,7 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
 		rfbNewUDPConnection(rfbScreen,rfbScreen->udpSock);
 	    }
 
-	    /* TODO: UDP also needs a client
-	       rfbProcessUDPInput(rfbScreen,rfbScreen->udpSock); */
+	    rfbProcessUDPInput(rfbScreen);
 	}
 
 	FD_CLR(rfbScreen->udpSock, &fds);
@@ -263,7 +261,7 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec)
 void
 rfbDisconnectUDPSock(rfbScreenInfoPtr rfbScreen)
 {
-    rfbScreen->udpSockConnected = FALSE;
+  rfbScreen->udpSockConnected = FALSE;
 }
 
 
diff --git a/sraRegion.c b/sraRegion.c
index 4d52086..a70d521 100755
--- a/sraRegion.c
+++ b/sraRegion.c
@@ -76,7 +76,7 @@ sraSpanRemove(sraSpan *span) {
 void
 sraSpanDestroy(sraSpan *span) {
   if (span->subspan) sraSpanListDestroy(span->subspan);
-  xfree(span);
+  free(span);
 }
 
 void
@@ -153,7 +153,7 @@ sraSpanListDestroy(sraSpanList *list) {
     sraSpanDestroy(curr);
     curr = next;
   }
-  xfree(list);
+  free(list);
 }
 
 void
diff --git a/tableinit24.c b/tableinit24.c
index 144d3a3..ece8623 100644
--- a/tableinit24.c
+++ b/tableinit24.c
@@ -82,7 +82,7 @@ rfbInitTrueColourSingleTable24 (char **table, rfbPixelFormat *in,
     int nEntries = 1 << in->bitsPerPixel;
 
     if (*table) free(*table);
-    *table = (char *)xalloc(nEntries * 3 + 1);
+    *table = (char *)malloc(nEntries * 3 + 1);
     t = (CARD8 *)*table;
 
     for (i = 0; i < nEntries; i++) {
@@ -121,7 +121,7 @@ rfbInitTrueColourRGBTables24 (char **table, rfbPixelFormat *in,
     CARD8 *blueTable;
 
     if (*table) free(*table);
-    *table = (char *)xalloc((in->redMax + in->greenMax + in->blueMax + 3)
+    *table = (char *)malloc((in->redMax + in->greenMax + in->blueMax + 3)
                             * 3 + 1);
     redTable = (CARD8 *)*table;
     greenTable = redTable + 3*(in->redMax + 1);
diff --git a/tableinittctemplate.c b/tableinittctemplate.c
index e5f94d5..93223d9 100644
--- a/tableinittctemplate.c
+++ b/tableinittctemplate.c
@@ -66,7 +66,7 @@ rfbInitTrueColourSingleTableOUT (char **table, rfbPixelFormat *in,
     int nEntries = 1 << in->bitsPerPixel;
 
     if (*table) free(*table);
-    *table = (char *)xalloc(nEntries * sizeof(OUT_T));
+    *table = (char *)malloc(nEntries * sizeof(OUT_T));
     t = (OUT_T *)*table;
 
     for (i = 0; i < nEntries; i++) {
@@ -104,7 +104,7 @@ rfbInitTrueColourRGBTablesOUT (char **table, rfbPixelFormat *in,
     OUT_T *blueTable;
 
     if (*table) free(*table);
-    *table = (char *)xalloc((in->redMax + in->greenMax + in->blueMax + 3)
+    *table = (char *)malloc((in->redMax + in->greenMax + in->blueMax + 3)
                             * sizeof(OUT_T));
     redTable = (OUT_T *)*table;
     greenTable = redTable + in->redMax + 1;
diff --git a/tight.c b/tight.c
index 0893fc2..cae797d 100644
--- a/tight.c
+++ b/tight.c
@@ -241,9 +241,9 @@ rfbSendRectEncodingTight(cl, x, y, w, h)
     if (tightBeforeBufSize < 4) {
         tightBeforeBufSize = 4;
         if (tightBeforeBuf == NULL)
-            tightBeforeBuf = (char *)xalloc(tightBeforeBufSize);
+            tightBeforeBuf = (char *)malloc(tightBeforeBufSize);
         else
-            tightBeforeBuf = (char *)xrealloc(tightBeforeBuf,
+            tightBeforeBuf = (char *)realloc(tightBeforeBuf,
                                               tightBeforeBufSize);
     }
 
@@ -503,18 +503,18 @@ SendRectSimple(cl, x, y, w, h)
     if (tightBeforeBufSize < maxBeforeSize) {
         tightBeforeBufSize = maxBeforeSize;
         if (tightBeforeBuf == NULL)
-            tightBeforeBuf = (char *)xalloc(tightBeforeBufSize);
+            tightBeforeBuf = (char *)malloc(tightBeforeBufSize);
         else
-            tightBeforeBuf = (char *)xrealloc(tightBeforeBuf,
+            tightBeforeBuf = (char *)realloc(tightBeforeBuf,
                                               tightBeforeBufSize);
     }
 
     if (tightAfterBufSize < maxAfterSize) {
         tightAfterBufSize = maxAfterSize;
         if (tightAfterBuf == NULL)
-            tightAfterBuf = (char *)xalloc(tightAfterBufSize);
+            tightAfterBuf = (char *)malloc(tightAfterBufSize);
         else
-            tightAfterBuf = (char *)xrealloc(tightAfterBuf,
+            tightAfterBuf = (char *)realloc(tightAfterBuf,
                                              tightAfterBufSize);
     }
 
@@ -844,7 +844,7 @@ SendGradientRect(cl, w, h)
     }
 
     if (prevRowBuf == NULL)
-        prevRowBuf = (int *)xalloc(2048 * 3 * sizeof(int));
+        prevRowBuf = (int *)malloc(2048 * 3 * sizeof(int));
 
     cl->updateBuf[cl->ublen++] = (streamId | rfbTightExplicitFilter) << 4;
     cl->updateBuf[cl->ublen++] = rfbTightFilterGradient;
@@ -1645,7 +1645,7 @@ SendJpegRect(cl, x, y, w, h, quality)
     if (cl->screen->rfbServerFormat.bitsPerPixel == 8)
         return SendFullColorRect(cl, w, h);
 
-    srcBuf = (CARD8 *)xalloc(w * 3);
+    srcBuf = (CARD8 *)malloc(w * 3);
     if (srcBuf == NULL) {
         return SendFullColorRect(cl, w, h);
     }
diff --git a/zlib.c b/zlib.c
index 74e12d0..1eac366 100644
--- a/zlib.c
+++ b/zlib.c
@@ -75,9 +75,9 @@ rfbSendOneRectEncodingZlib(cl, x, y, w, h)
     if (zlibBeforeBufSize < maxRawSize) {
 	zlibBeforeBufSize = maxRawSize;
 	if (zlibBeforeBuf == NULL)
-	    zlibBeforeBuf = (char *)xalloc(zlibBeforeBufSize);
+	    zlibBeforeBuf = (char *)malloc(zlibBeforeBufSize);
 	else
-	    zlibBeforeBuf = (char *)xrealloc(zlibBeforeBuf, zlibBeforeBufSize);
+	    zlibBeforeBuf = (char *)realloc(zlibBeforeBuf, zlibBeforeBufSize);
     }
 
     /* zlib compression is not useful for very small data sets.
@@ -115,9 +115,9 @@ rfbSendOneRectEncodingZlib(cl, x, y, w, h)
     if (zlibAfterBufSize < maxCompSize) {
 	zlibAfterBufSize = maxCompSize;
 	if (zlibAfterBuf == NULL)
-	    zlibAfterBuf = (char *)xalloc(zlibAfterBufSize);
+	    zlibAfterBuf = (char *)malloc(zlibAfterBufSize);
 	else
-	    zlibAfterBuf = (char *)xrealloc(zlibAfterBuf, zlibAfterBufSize);
+	    zlibAfterBuf = (char *)realloc(zlibAfterBuf, zlibAfterBufSize);
     }
 
     /* 
-- 
cgit v1.2.3

