From 67094d7c281993497decb1459ea1663765a760eb Mon Sep 17 00:00:00 2001 From: dscho Date: Thu, 11 Oct 2001 15:44:58 +0000 Subject: [PATCH] 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 #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 @@ "File Not Found\n" \ "

File Not Found

\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 #include #include +#include #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 - #include "rfbproto.h" #ifdef __linux__ @@ -84,7 +79,6 @@ typedef CARD32 KeySym; #ifdef WIN32 #include -//#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); } /*