diff --git a/README b/README index 654a97a..158be5b 100644 --- a/README +++ b/README @@ -291,6 +291,80 @@ There is the possibility to set a password, which is also negotiated by the RFB protocol, but IT IS NOT SECURE. Anybody sniffing your net can get the password. You really should tunnel through SSH. +Windows or: why do you do that to me? +-------------------------------------------- + +If you love products from Redmod, you better skip this paragraph. +I am always amazed how people react whenever Microsoft(tm) puts in some +features into their products which were around for a long time. Especially +reporters seem to not know dick about what they are reporting about! But +what is everytime annoying again, is that they don't do it right. Every +concept has it's new name (remember what enumerators used to be until +Mickeysoft(tm) claimed that enumerators are what we thought were iterators. +Yeah right, enumerators are also containers. They are not separate. Muddy.) + +There are three packages you want to get hold of: zlib, jpeg and pthreads. +The latter is not strictly necessary, but when you put something like this +into your source: + +#define MUTEX(s) + struct { + int something; + MUTEX(latex); + } + +Microsoft's C++ compiler doesn't do it. It complains that this is an error. + +You can find the packages at +http://www.gimp.org/win32/extralibs-dev-20001007.zip + +Thanks go to all the GIMP team! + +Why I don't feel bad about GPL +------------------------------ + +At the beginning of this projects I would have liked to make it a BSD +license. However, it is based on plenty of GPL'ed code, so it has to be +a GPL. I hear BeeGee complaining: "but that's invasive, every derivative +work, even just linking, makes my software GPL!" + +Yeah. That's right. It is because there are nasty jarheads out there who +would take anybody's work and claim it their own, selling it for much too +much money, stealing freedom and innovation from others, saying they were +the maintainers of innovation, lying, making money with that. + +The people at AT&T worked really well to produce something as clean and lean +as VNC. The managers decided that for their fame, they would release the +program for free. But not only that! They realized that by releasing also +the code for free, VNC would become an evolving little child, conquering +new worlds, making it's parents very proud. As well they can be! To protect +this innovation, they decided to make it GPL, not BSD. The principal +difference is: You can make closed source programs deriving from BSD, not +from GPL. You have to give proper credit with both. + +Now, why not BSD? Well, imagine your child being some famous actor. Along +comes a manager who exploits your child exclusively, that is: nobody else +can profit from the child, it itself included. Got it? + +What reason do you have now to use this library commercially? + +Several: You don't have to give away your product. Then you have effectively +circumvented the GPL, because you have the benefits of other's work and you +don't give back anything and you will be in hell for that. In fact, this +library, as my other projects, is a payback for all the free software I can +use (and sometimes, make better). For example, just now, I am using XEmacs +on top X11, all running under Linux. + +Better: Use a concept like MySQL. This is free software, however, they make +money with it. If you want something implemented, you have the choice: +Ask them to do it (and pay a fair price), or do it yourself, normally giving +back your enhancements to the free world of computing. + +Learn from it: If you like the style this is written, learn how to imitate +it. If you don't like the style, learn how to avoid those things you don't +like. I learnt so much, just from looking at code like Linux, XEmacs, +LilyPond, STL, etc. + License ------- diff --git a/d3des.c b/d3des.c index 60e6473..4994afb 100644 --- a/d3des.c +++ b/d3des.c @@ -181,14 +181,14 @@ static void unscrun(outof, into) register unsigned long *outof; register unsigned char *into; { - *into++ = (*outof >> 24) & 0xffL; - *into++ = (*outof >> 16) & 0xffL; - *into++ = (*outof >> 8) & 0xffL; - *into++ = *outof++ & 0xffL; - *into++ = (*outof >> 24) & 0xffL; - *into++ = (*outof >> 16) & 0xffL; - *into++ = (*outof >> 8) & 0xffL; - *into = *outof & 0xffL; + *into++ = (unsigned char)((*outof >> 24) & 0xffL); + *into++ = (unsigned char)((*outof >> 16) & 0xffL); + *into++ = (unsigned char)((*outof >> 8) & 0xffL); + *into++ = (unsigned char)( *outof++ & 0xffL); + *into++ = (unsigned char)((*outof >> 24) & 0xffL); + *into++ = (unsigned char)((*outof >> 16) & 0xffL); + *into++ = (unsigned char)((*outof >> 8) & 0xffL); + *into = (unsigned char)( *outof & 0xffL); return; } diff --git a/example.c b/example.c index 1348c49..9ed6846 100644 --- a/example.c +++ b/example.c @@ -21,11 +21,16 @@ * USA. */ +#ifdef WIN32 +#define sleep Sleep +#else #include +#endif + #ifdef __IRIX__ #include #endif -#define XK_MISCELLANY + #include "rfb.h" #include "keysym.h" @@ -121,7 +126,7 @@ void doptr(int buttonMask,int x,int y,rfbClientPtr cl) for(i=x1*bpp;iscreen->frameBuffer[j*w+i]=0xff; + cl->screen->frameBuffer[j*w+i]=(char)0xff; rfbMarkRectAsModified(cl->screen,x1,y1,x2-1,y2-1); } @@ -157,8 +162,8 @@ void dokey(Bool down,KeySym key,rfbClientPtr cl) int x1=cd->oldx,y1=cd->oldy,x2,y2; if(cl->screen->cursorIsDrawn) rfbUndrawCursor(cl->screen); - cd->oldx+=rfbDrawChar(cl->screen,&radonFont,cd->oldx,cd->oldy,key,0xffffff); - rfbFontBBox(&radonFont,key,&x1,&y1,&x2,&y2); + cd->oldx+=rfbDrawChar(cl->screen,&radonFont,cd->oldx,cd->oldy,(char)key,0x00ffffff); + rfbFontBBox(&radonFont,(char)key,&x1,&y1,&x2,&y2); rfbMarkRectAsModified(cl->screen,x1,y1,x2-1,y2-1); } } diff --git a/example.dsp b/example.dsp new file mode 100644 index 0000000..ebabc4a --- /dev/null +++ b/example.dsp @@ -0,0 +1,80 @@ +# Microsoft Developer Studio Project File - Name="example" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 + +# TARGTYPE "Win32 (x86) Console Application" 0x0103 + +CFG=example - Win32 Debug +!MESSAGE "example - Win32 Release" (based on "Win32 (x86) Console Application") +!MESSAGE "example - Win32 Debug" (based on "Win32 (x86) Console Application") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "example - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 + +!ELSEIF "$(CFG)" == "example - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept +# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib wsock32.lib libvncserver.lib libjpeg.a libz.a /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "example - Win32 Release" +# Name "example - Win32 Debug" +# Begin Group "Sources" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Source File + +SOURCE=.\example.c +# End Source File +# End Group +# End Target +# End Project diff --git a/httpd.c b/httpd.c index a80c44d..7d92812 100644 --- a/httpd.c +++ b/httpd.c @@ -23,16 +23,21 @@ #include #include +#ifdef WIN32 +#include +#define close closesocket +#else #include #include #include #include #include -#include -#include #include #include #include +#endif +#include +#include #include "rfb.h" @@ -120,6 +125,9 @@ httpCheckFds(rfbScreenInfoPtr rfbScreen) return; } if (nfds < 0) { +#ifdef WIN32 + errno = WSAGetLastError(); +#endif rfbLogPerror("httpCheckFds: select"); return; } @@ -170,12 +178,14 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) int addrlen = sizeof(addr); char fullFname[256]; char *fname; - int maxFnameLen; - int fd; + unsigned int maxFnameLen; + FILE* fd; Bool gotGet = FALSE; Bool performSubstitutions = FALSE; char str[256]; +#ifndef WIN32 struct passwd *user = getpwuid(getuid());; +#endif cl.sock=rfbScreen->httpSock; @@ -263,7 +273,7 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) /* Open the file */ - if ((fd = open(fullFname, O_RDONLY)) < 0) { + if ((fd = fopen(fullFname, O_RDONLY)) < 0) { rfbLogPerror("httpProcessInput: open"); WriteExact(&cl, NOT_FOUND_STR, strlen(NOT_FOUND_STR)); httpCloseSock(rfbScreen); @@ -273,10 +283,10 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) WriteExact(&cl, OK_STR, strlen(OK_STR)); while (1) { - int n = read(fd, buf, BUF_SIZE-1); + int n = fread(buf, BUF_SIZE-1, 1, fd); if (n < 0) { rfbLogPerror("httpProcessInput: read"); - close(fd); + fclose(fd); httpCloseSock(rfbScreen); return; } @@ -335,20 +345,19 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) WriteExact(&cl, str, strlen(str)); } else if (compareAndSkip(&ptr, "$USER")) { - +#ifndef WIN32 if (user) { WriteExact(&cl, user->pw_name, strlen(user->pw_name)); - } else { + } else +#endif WriteExact(&cl, "?", 1); - } - } else { if (!compareAndSkip(&ptr, "$$")) ptr++; if (WriteExact(&cl, "$", 1) < 0) { - close(fd); + fclose(fd); httpCloseSock(rfbScreen); return; } @@ -366,7 +375,7 @@ httpProcessInput(rfbScreenInfoPtr rfbScreen) } } - close(fd); + fclose(fd); httpCloseSock(rfbScreen); } diff --git a/kbdptr.c b/kbdptr.c deleted file mode 100644 index 8c2d678..0000000 --- a/kbdptr.c +++ /dev/null @@ -1,31 +0,0 @@ -/* - * kbdptr.c - deal with keyboard and pointer device over TCP & UDP. - * - * - */ - -/* - * OSXvnc Copyright (C) 2001 Dan McGuirk . - * Original Xvnc code Copyright (C) 1999 AT&T Laboratories Cambridge. - * All Rights Reserved. - * - * This is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This software is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this software; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, - * USA. - */ - -#include -#include -#include "rfb.h" - diff --git a/libvncserver.dsp b/libvncserver.dsp new file mode 100644 index 0000000..1ff5d1e --- /dev/null +++ b/libvncserver.dsp @@ -0,0 +1,188 @@ +# Microsoft Developer Studio Project File - Name="libvncserver" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** NICHT BEARBEITEN ** + +# TARGTYPE "Win32 (x86) Static Library" 0x0104 + +CFG=libvncserver - Win32 Debug +!MESSAGE "libvncserver - Win32 Release" (based on "Win32 (x86) Static Library") +!MESSAGE "libvncserver - Win32 Debug" (based on "Win32 (x86) Static Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +RSC=rc.exe + +!IF "$(CFG)" == "libvncserver - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c +# ADD BASE RSC /l 0x407 /d "NDEBUG" +# ADD RSC /l 0x407 /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ELSEIF "$(CFG)" == "libvncserver - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "libvncserver___Win32_Debug" +# PROP BASE Intermediate_Dir "libvncserver___Win32_Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "libvncserver___Win32_Debug" +# PROP Intermediate_Dir "libvncserver___Win32_Debug" +# PROP Target_Dir "" +# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c +# ADD BASE RSC /l 0x407 /d "_DEBUG" +# ADD RSC /l 0x407 /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LIB32=link.exe -lib +# ADD BASE LIB32 /nologo +# ADD LIB32 /nologo + +!ENDIF + +# Begin Target + +# Name "libvncserver - Win32 Release" +# Name "libvncserver - Win32 Debug" +# Begin Group "Sources" + +# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" +# Begin Group "auth" +# Begin Source File + +SOURCE=.\auth.c +# End Source File +# Begin Source File + +SOURCE=.\d3des.c +# End Source File +# Begin Source File + +SOURCE=.\storepasswd.c +# End Source File +# Begin Source File + +SOURCE=.\vncauth.c +# End Source File +# End Group +# Begin Source File + +SOURCE=.\corre.c +# End Source File +# Begin Source File + +SOURCE=.\cursor.c +# End Source File +# Begin Source File + +SOURCE=.\cutpaste.c +# End Source File +# Begin Source File + +SOURCE=.\font.c +# End Source File +# Begin Source File + +SOURCE=.\hextile.c +# End Source File +# Begin Source File + +SOURCE=.\httpd.c +# End Source File +# Begin Source File + +SOURCE=.\main.c +# End Source File +# Begin Source File + +SOURCE=.\rfbserver.c +# End Source File +# Begin Source File + +SOURCE=.\rre.c +# End Source File +# Begin Source File + +SOURCE=.\sockets.c +# End Source File +# Begin Source File + +SOURCE=.\sraRegion.c +# End Source File +# Begin Source File + +SOURCE=.\stats.c +# End Source File +# Begin Source File + +SOURCE=.\tight.c +# End Source File +# Begin Source File + +SOURCE=.\translate.c +# End Source File +# Begin Source File + +SOURCE=.\zlib.c +# End Source File +# End Group +# Begin Group "Headers" + +# PROP Default_Filter "h;hpp;hxx;hm;inl" +# Begin Group "auth" +# Begin Source File + +SOURCE=.\d3des.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\keysym.h +# End Source File +# Begin Source File + +SOURCE=.\radon.h +# End Source File +# Begin Source File + +SOURCE=.\region.h +# End Source File +# Begin Source File + +SOURCE=.\rfb.h +# End Source File +# Begin Source File + +SOURCE=.\rfbproto.h +# End Source File +# Begin Source File + +SOURCE=.\sraRegion.h +# End Source File +# End Group +# End Target +# End Project diff --git a/libvncserver.dsw b/libvncserver.dsw new file mode 100644 index 0000000..93b60c1 --- /dev/null +++ b/libvncserver.dsw @@ -0,0 +1,59 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNUNG: DIESE ARBEITSBEREICHSDATEI DARF NICHT BEARBEITET ODER GELÖSCHT WERDEN! + +############################################################################### + +Project: "example"=.\example.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libvncserver + End Project Dependency +}}} + +############################################################################### + +Project: "libvncserver"=.\libvncserver.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Project: "rdp2vnc"=..\rdp2vnc\rdp2vnc.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ + Begin Project Dependency + Project_Dep_Name libvncserver + End Project Dependency +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/main.c b/main.c index 305645e..2c682af 100644 --- a/main.c +++ b/main.c @@ -21,9 +21,11 @@ #endif #include +#ifndef WIN32 #include #include #include +#endif #include #include @@ -354,11 +356,22 @@ void defaultSetXCutText(char* text, int len, rfbClientPtr cl) /* TODO: add a nice VNC or RFB cursor */ +#ifdef WIN32 +static rfbCursor myCursor = +{ + "\000\102\044\030\044\102\000", + "\347\347\176\074\176\347\347", + 8, 7, 3, 3, + 0, 0, 0, + 0xffff, 0xffff, 0xffff, + 0 +}; +#else static rfbCursor myCursor = { - width: 8, height: 7, xhot: 3, yhot: 3, source: "\000\102\044\030\044\102\000", mask: "\347\347\176\074\176\347\347", + width: 8, height: 7, xhot: 3, yhot: 3, /* width: 8, height: 7, xhot: 0, yhot: 0, source: "\000\074\176\146\176\074\000", @@ -368,6 +381,7 @@ static rfbCursor myCursor = backRed: 0xffff, backGreen: 0xffff, backBlue: 0xffff, richSource: 0 }; +#endif rfbCursorPtr defaultGetCursorPtr(rfbClientPtr cl) { @@ -422,7 +436,15 @@ rfbScreenInfoPtr rfbGetScreen(int argc,char** argv, rfbScreen->width = width; rfbScreen->height = height; rfbScreen->bitsPerPixel = rfbScreen->depth = 8*bytesPerPixel; +#ifdef WIN32 + { + DWORD dummy=255; + GetComputerName(rfbScreen->rfbThisHost,&dummy); + } +#else gethostname(rfbScreen->rfbThisHost, 255); +#endif + rfbScreen->paddedWidthInBytes = width*bytesPerPixel; /* format */ @@ -498,6 +520,10 @@ void rfbScreenCleanup(rfbScreenInfoPtr rfbScreen) void rfbInitServer(rfbScreenInfoPtr rfbScreen) { +#ifdef WIN32 + WSADATA trash; + int i=WSAStartup(MAKEWORD(2,2),&trash); +#endif rfbInitSockets(rfbScreen); httpInitSockets(rfbScreen); } @@ -506,7 +532,7 @@ void rfbProcessEvents(rfbScreenInfoPtr rfbScreen,long usec) { rfbClientIteratorPtr i; - rfbClientPtr cl; + rfbClientPtr cl,clPrev; rfbCheckFds(rfbScreen,usec); httpCheckFds(rfbScreen); @@ -515,11 +541,14 @@ rfbProcessEvents(rfbScreenInfoPtr rfbScreen,long usec) #endif i = rfbGetClientIterator(rfbScreen); - while((cl=rfbClientIteratorNext(i))) { + cl=rfbClientIteratorNext(i); + while(cl) { if(cl->sock>=0 && FB_UPDATE_PENDING(cl)) rfbSendFramebufferUpdate(cl,cl->modifiedRegion); - if(cl->sock==-1) - rfbClientConnectionGone(cl); + clPrev=cl; + cl=rfbClientIteratorNext(i); + if(clPrev->sock==-1) + rfbClientConnectionGone(clPrev); } rfbReleaseClientIterator(i); } diff --git a/rfb.h b/rfb.h index c0ca7a9..26dde36 100644 --- a/rfb.h +++ b/rfb.h @@ -46,22 +46,18 @@ typedef CARD32 KeySym; #define xrealloc realloc #define xfree free -int max(int,int); - #include -#include +#include "rfbproto.h" #ifdef __linux__ #include -#else -#if defined(__APPLE__) || defined(__FreeBSD__) +#elif defined(__APPLE__) || defined(__FreeBSD__) #include #include #define _BYTE_ORDER BYTE_ORDER #define _LITTLE_ENDIAN LITTLE_ENDIAN -#else -#ifdef sparc +#elif sparc #define _LITTLE_ENDIAN 1234 #define _BYTE_ORDER _LITTLE_ENDIAN #undef Bool @@ -69,11 +65,14 @@ int max(int,int); #include /* typedef unsigned int pthread_t; */ /* SUN cc seems to have problems with inclusion of sys/types! */ +#elif defined(WIN32) +#define _LITTLE_ENDIAN 1234 +#define _BYTE_ORDER _LITTLE_ENDIAN +#undef Bool +#define Bool int #else #include #endif -#endif -#endif #ifndef _BYTE_ORDER #define _BYTE_ORDER __BYTE_ORDER @@ -83,11 +82,20 @@ int max(int,int); #define _LITTLE_ENDIAN __LITTLE_ENDIAN #endif +#ifdef WIN32 +#include +//#define sockaddr_in sockaddr* +#undef SOCKET +#define SOCKET int +#else +int max(int,int); #include +#define SOCKET int +#endif #ifdef HAVE_PTHREADS #include -#if 0 +#if 0 /* debugging */ #define LOCK(mutex) fprintf(stderr,"%s:%d LOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)) #define UNLOCK(mutex) fprintf(stderr,"%s:%d UNLOCK(%s,0x%x)\n",__FILE__,__LINE__,#mutex,&(mutex)) #define MUTEX(mutex) int mutex @@ -141,7 +149,7 @@ typedef Bool (*SetTranslateFunctionProcPtr)(struct rfbClientRec* cl); typedef void (*NewClientHookPtr)(struct rfbClientRec* cl); typedef struct { - int count; + CARD32 count; Bool is16; /* is the data format short? */ union { CARD8* bytes; @@ -149,6 +157,23 @@ 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(cont) 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. @@ -221,12 +246,12 @@ typedef struct char rfbThisHost[255]; int rfbPort; Bool socketInitDone; - int inetdSock; + SOCKET inetdSock; int maxSock; int maxFd; - int rfbListenSock; + SOCKET rfbListenSock; int udpPort; - int udpSock; + SOCKET udpSock; struct rfbClientRec* udpClient; Bool udpSockConnected; struct sockaddr_in udpRemoteAddr; @@ -237,8 +262,8 @@ typedef struct Bool httpInitDone; int httpPort; char* httpDir; - int httpListenSock; - int httpSock; + SOCKET httpListenSock; + SOCKET httpSock; FILE* httpFP; char* rfbAuthPasswdFile; @@ -255,8 +280,10 @@ typedef struct Bool dontConvertRichCursorToXCursor; struct rfbCursor* cursor; MUTEX(cursorMutex); - - IF_PTHREADS(Bool backgroundLoop); + +#ifdef HAVE_PTHREADS + Bool backgroundLoop; +#endif /* the following members have to be supplied by the serving process */ char* frameBuffer; @@ -319,7 +346,7 @@ typedef struct rfbClientRec { void* clientData; ClientGoneHookPtr clientGoneHook; - int sock; + SOCKET sock; char *host; /* Possible client states: */ enum { diff --git a/rfbserver.c b/rfbserver.c index 2460130..6c20323 100644 --- a/rfbserver.c +++ b/rfbserver.c @@ -27,12 +27,16 @@ #include #include "rfb.h" #include "sraRegion.h" +#ifdef WIN32 +#define write(sock,buf,len) send(sock,buf,len,0) +#else #include #include -#include #include #include #include +#endif +#include #ifdef CORBA #include @@ -984,8 +988,8 @@ rfbSendFramebufferUpdate(cl, givenUpdateRegion) fu->type = rfbFramebufferUpdate; if (nUpdateRegionRects != 0xFFFF) { - fu->nRects = Swap16IfLE(sraRgnCountRects(updateCopyRegion) - + nUpdateRegionRects + !!sendCursorShape); + fu->nRects = Swap16IfLE((CARD16)(sraRgnCountRects(updateCopyRegion) + + nUpdateRegionRects + !!sendCursorShape)); } else { fu->nRects = 0xFFFF; } @@ -1277,7 +1281,7 @@ rfbSendSetColourMapEntries(cl, firstColour, nColours) len = sz_rfbSetColourMapEntriesMsg; for (i = 0; i < nColours; i++) { - if(icount) { + if(i<(int)cm->count) { if(cm->is16) { rgb[i*3] = Swap16IfLE(cm->data.shorts[i*3]); rgb[i*3+1] = Swap16IfLE(cm->data.shorts[i*3+1]); diff --git a/sockets.c b/sockets.c index 3882147..83b747e 100644 --- a/sockets.c +++ b/sockets.c @@ -41,7 +41,22 @@ #include #include +#ifdef WIN32 +#pragma warning (disable: 4018 4761) +#define close closesocket +#define read(sock,buf,len) recv(sock,buf,len,0) +#define EWOULDBLOCK WSAEWOULDBLOCK +#define ETIMEDOUT WSAETIMEDOUT +#define write(sock,buf,len) send(sock,buf,len,0) +#else #include +#include +#include +#include +#include +#include +#include +#endif #if defined(__linux__) && defined(NEED_TIMEVAL) struct timeval { @@ -49,18 +64,14 @@ struct timeval } ; #endif -#include -#include -#include -#include #include #include -#include -#include #include "rfb.h" +#ifndef WIN32 int max(int i,int j) { return(iinetdSock != -1) { const int one = 1; +#ifndef WIN32 if (fcntl(rfbScreen->inetdSock, F_SETFL, O_NONBLOCK) < 0) { rfbLogPerror("fcntl"); exit(1); } +#endif if (setsockopt(rfbScreen->inetdSock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) { @@ -117,7 +130,7 @@ rfbInitSockets(rfbScreenInfoPtr rfbScreen) exit(1); } FD_SET(rfbScreen->udpSock, &(rfbScreen->allFds)); - rfbScreen->maxFd = max(rfbScreen->udpSock,rfbScreen->maxFd); + rfbScreen->maxFd = max((int)rfbScreen->udpSock,rfbScreen->maxFd); } } @@ -156,6 +169,9 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec) return; } if (nfds < 0) { +#ifdef WIN32 + errno = WSAGetLastError(); +#endif rfbLogPerror("rfbCheckFds: select"); return; } @@ -168,11 +184,13 @@ rfbCheckFds(rfbScreenInfoPtr rfbScreen,long usec) return; } +#ifndef WIN32 if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) { rfbLogPerror("rfbCheckFds: fcntl"); close(sock); return; } +#endif if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) { @@ -282,11 +300,13 @@ rfbConnect(rfbScreen, host, port) return -1; } +#ifndef WIN32 if (fcntl(sock, F_SETFL, O_NONBLOCK) < 0) { rfbLogPerror("fcntl failed"); close(sock); return -1; } +#endif if (setsockopt(sock, IPPROTO_TCP, TCP_NODELAY, (char *)&one, sizeof(one)) < 0) { @@ -332,6 +352,9 @@ ReadExact(cl, buf, len) return 0; } else { +#ifdef WIN32 + errno = WSAGetLastError(); +#endif if (errno != EWOULDBLOCK && errno != EAGAIN) { return n; } @@ -389,6 +412,9 @@ WriteExact(cl, buf, len) exit(1); } else { +#ifdef WIN32 + errno = WSAGetLastError(); +#endif if (errno != EWOULDBLOCK && errno != EAGAIN) { UNLOCK(cl->outputMutex); return n; diff --git a/tableinitcmtemplate.c b/tableinitcmtemplate.c index b8144ea..2d10ea5 100644 --- a/tableinitcmtemplate.c +++ b/tableinitcmtemplate.c @@ -48,7 +48,7 @@ rfbInitColourMapSingleTableOUT(char **table, rfbPixelFormat *in, { CARD32 i, r, g, b; OUT_T *t; - int nEntries = 1 << in->bitsPerPixel; + CARD32 nEntries = 1 << in->bitsPerPixel; int shift = colourMap->is16?16:8; if (*table) free(*table); diff --git a/tight.c b/tight.c index db0d382..0893fc2 100644 --- a/tight.c +++ b/tight.c @@ -24,8 +24,15 @@ * USA. */ -#include +//#include #include "rfb.h" + +#ifdef WIN32 +#define XMD_H +#undef FAR +#define NEEDFAR_POINTERS +#endif + #include @@ -1433,7 +1440,7 @@ DetectSmoothImage (cl, fmt, w, h) rfbPixelFormat *fmt; int w, h; { - unsigned long avgError; + long avgError; if ( cl->screen->rfbServerFormat.bitsPerPixel == 8 || fmt->bitsPerPixel == 8 || w < DETECT_MIN_WIDTH || h < DETECT_MIN_HEIGHT ) { diff --git a/translate.c b/translate.c index 5efc52c..8d78b99 100644 --- a/translate.c +++ b/translate.c @@ -63,6 +63,9 @@ static const rfbPixelFormat BGR233Format = { #define CONCAT4(a,b,c,d) a##b##c##d #define CONCAT4E(a,b,c,d) CONCAT4(a,b,c,d) +#undef OUT +#undef IN + #define OUT 8 #include "tableinitcmtemplate.c" #include "tableinittctemplate.c" diff --git a/vncauth.c b/vncauth.c index 75f1cc3..1014291 100644 --- a/vncauth.c +++ b/vncauth.c @@ -26,7 +26,13 @@ #include #include #include +#ifdef WIN32 +#include +#define srandom srand +#define random rand +#else #include +#endif #include "rfb.h" #include "d3des.h" @@ -49,12 +55,15 @@ int vncEncryptAndStorePasswd(char *passwd, char *fname) { FILE *fp; - int i; + unsigned int i; unsigned char encryptedPasswd[8]; if ((fp = fopen(fname,"w")) == NULL) return 1; + /* windows security sux */ +#ifndef WIN32 chmod(fname, S_IRUSR|S_IWUSR); +#endif /* pad password with nulls */ @@ -142,7 +151,7 @@ void vncEncryptBytes(unsigned char *bytes, char *passwd) { unsigned char key[8]; - int i; + unsigned int i; /* key is simply password padded with nulls */