summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--auth.c20
-rw-r--r--corre.c8
-rw-r--r--httpd.c6
-rw-r--r--main.c12
-rw-r--r--rfb.h162
-rw-r--r--rfbserver.c176
-rw-r--r--rre.c8
-rw-r--r--sockets.c12
-rwxr-xr-xsraRegion.c4
-rw-r--r--tableinit24.c4
-rw-r--r--tableinittctemplate.c4
-rw-r--r--tight.c16
-rw-r--r--zlib.c8
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);
}
/*