Porting changes for LynxOS 2.3.


git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@499 3789f03b-4d11-0410-bbf8-ca57d06f2519
diff --git a/network/TcpSocket.cxx b/network/TcpSocket.cxx
index 1d0de9f..035c7f2 100644
--- a/network/TcpSocket.cxx
+++ b/network/TcpSocket.cxx
@@ -48,6 +48,9 @@
 #ifndef INADDR_NONE
 #define INADDR_NONE ((unsigned long)-1)
 #endif
+#ifndef INADDR_LOOPBACK
+#define INADDR_LOOPBACK ((unsigned long)0x7F000001)
+#endif
 
 using namespace network;
 using namespace rdr;
@@ -118,12 +121,12 @@
   struct sockaddr_in addr;
   memset(&addr, 0, sizeof(addr));
   addr.sin_family = AF_INET;
-  addr.sin_addr.s_addr = inet_addr(host);
+  addr.sin_addr.s_addr = inet_addr((char *)host);
   addr.sin_port = htons(port);
   if ((int)addr.sin_addr.s_addr == -1) {
     // Host was not an IP address - try resolving as DNS name
     struct hostent *hostinfo;
-    hostinfo = gethostbyname(host);
+    hostinfo = gethostbyname((char *)host);
     if (hostinfo && hostinfo->h_addr) {
       addr.sin_addr.s_addr = ((struct in_addr *)hostinfo->h_addr)->s_addr;
     } else {
@@ -285,7 +288,7 @@
 
   int one = 1;
   if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
-		 (const char *)&one, sizeof(one)) < 0) {
+		 (char *)&one, sizeof(one)) < 0) {
     int e = errorNumber;
     closesocket(fd);
     throw SocketException("unable to create listening socket", e);
@@ -396,7 +399,7 @@
 
 static bool
 patternMatchIP(const TcpFilter::Pattern& pattern, const char* value) {
-  unsigned long address = inet_addr(value);
+  unsigned long address = inet_addr((char *)value);
   if (address == INADDR_NONE) return false;
   return ((pattern.address & pattern.mask) == (address & pattern.mask));
 }
diff --git a/rdr/FdInStream.cxx b/rdr/FdInStream.cxx
index f64f68e..2b11973 100644
--- a/rdr/FdInStream.cxx
+++ b/rdr/FdInStream.cxx
@@ -48,6 +48,11 @@
 #include <sys/select.h>
 #endif
 
+// XXX Lynx/OS 2.3: protos for gettimeofday(), select(), bzero()
+#ifdef Lynx
+#include <sys/proto.h>
+#endif
+
 #include <rdr/FdInStream.h>
 #include <rdr/Exception.h>
 
diff --git a/rdr/FdOutStream.cxx b/rdr/FdOutStream.cxx
index e65133d..07ac04c 100644
--- a/rdr/FdOutStream.cxx
+++ b/rdr/FdOutStream.cxx
@@ -33,6 +33,11 @@
 #include <sys/time.h>
 #endif
 
+// XXX Lynx/OS 2.3: protos for select(), bzero()
+#ifdef Lynx
+#include <sys/proto.h>
+#endif
+
 #include <rdr/FdOutStream.h>
 #include <rdr/Exception.h>
 
diff --git a/rfb/FileInfo.cxx b/rfb/FileInfo.cxx
index 5b151d9..21e18f2 100644
--- a/rfb/FileInfo.cxx
+++ b/rfb/FileInfo.cxx
@@ -20,6 +20,7 @@
  */
 
 #include <rfb/FileInfo.h>
+#include <rfb/util.h>
 
 #ifdef _WIN32
 #define strcasecmp _stricmp
diff --git a/rfb/FileManager.cxx b/rfb/FileManager.cxx
index 44d7890..c0403a7 100644
--- a/rfb/FileManager.cxx
+++ b/rfb/FileManager.cxx
@@ -70,4 +70,4 @@
 FileManager::isCreated()
 {
   if (m_pFile != NULL) return true; else return false;
-}
\ No newline at end of file
+}
diff --git a/rfb/PixelFormat.cxx b/rfb/PixelFormat.cxx
index d20be93..8809fb5 100644
--- a/rfb/PixelFormat.cxx
+++ b/rfb/PixelFormat.cxx
@@ -20,6 +20,7 @@
 #include <rdr/InStream.h>
 #include <rdr/OutStream.h>
 #include <rfb/PixelFormat.h>
+#include <rfb/util.h>
 
 #ifdef _WIN32
 #define strcasecmp _stricmp
diff --git a/rfb/encodings.cxx b/rfb/encodings.cxx
index db6e1e2..d3b0ccb 100644
--- a/rfb/encodings.cxx
+++ b/rfb/encodings.cxx
@@ -20,6 +20,7 @@
 #define strcasecmp _stricmp
 #endif
 #include <rfb/encodings.h>
+#include <rfb/util.h>
 
 int rfb::encodingNum(const char* name)
 {
diff --git a/rfb/util.cxx b/rfb/util.cxx
index 2dbc2df..94aa632 100644
--- a/rfb/util.cxx
+++ b/rfb/util.cxx
@@ -15,8 +15,114 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,
  * USA.
  */
+
+/*
+ * The following applies to stcasecmp and strncasecmp implementations:
+ *
+ * Copyright (c) 1987 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that this notice is preserved and that due credit is given
+ * to the University of California at Berkeley. The name of the University
+ * may not be used to endorse or promote products derived from this
+ * software without specific written prior permission. This software
+ * is provided ``as is'' without express or implied warranty.
+ */
+
 #include <rfb/util.h>
 
+// Provide strcasecmp() and/or strncasecmp() if absent on this system.
+
+#ifndef WIN32
+#if !defined(HAVE_STRCASECMP) || !defined(HAVE_STRNCASECMP)
+
+extern "C" {
+
+/*
+ * This array is designed for mapping upper and lower case letter
+ * together for a case independent comparison.  The mappings are
+ * based upon ascii character sequences.
+ */
+static unsigned char s_charmap[] = {
+	'\000', '\001', '\002', '\003', '\004', '\005', '\006', '\007',
+	'\010', '\011', '\012', '\013', '\014', '\015', '\016', '\017',
+	'\020', '\021', '\022', '\023', '\024', '\025', '\026', '\027',
+	'\030', '\031', '\032', '\033', '\034', '\035', '\036', '\037',
+	'\040', '\041', '\042', '\043', '\044', '\045', '\046', '\047',
+	'\050', '\051', '\052', '\053', '\054', '\055', '\056', '\057',
+	'\060', '\061', '\062', '\063', '\064', '\065', '\066', '\067',
+	'\070', '\071', '\072', '\073', '\074', '\075', '\076', '\077',
+	'\100', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\133', '\134', '\135', '\136', '\137',
+	'\140', '\141', '\142', '\143', '\144', '\145', '\146', '\147',
+	'\150', '\151', '\152', '\153', '\154', '\155', '\156', '\157',
+	'\160', '\161', '\162', '\163', '\164', '\165', '\166', '\167',
+	'\170', '\171', '\172', '\173', '\174', '\175', '\176', '\177',
+	'\200', '\201', '\202', '\203', '\204', '\205', '\206', '\207',
+	'\210', '\211', '\212', '\213', '\214', '\215', '\216', '\217',
+	'\220', '\221', '\222', '\223', '\224', '\225', '\226', '\227',
+	'\230', '\231', '\232', '\233', '\234', '\235', '\236', '\237',
+	'\240', '\241', '\242', '\243', '\244', '\245', '\246', '\247',
+	'\250', '\251', '\252', '\253', '\254', '\255', '\256', '\257',
+	'\260', '\261', '\262', '\263', '\264', '\265', '\266', '\267',
+	'\270', '\271', '\272', '\273', '\274', '\275', '\276', '\277',
+	'\300', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\333', '\334', '\335', '\336', '\337',
+	'\340', '\341', '\342', '\343', '\344', '\345', '\346', '\347',
+	'\350', '\351', '\352', '\353', '\354', '\355', '\356', '\357',
+	'\360', '\361', '\362', '\363', '\364', '\365', '\366', '\367',
+	'\370', '\371', '\372', '\373', '\374', '\375', '\376', '\377',
+};
+
+#ifndef HAVE_STRCASECMP
+int
+strcasecmp(const char *s1, const char *s2)
+{
+    unsigned char u1, u2;
+
+    for (;;) {
+	u1 = (unsigned char) *s1++;
+	u2 = (unsigned char) *s2++;
+	if (s_charmap[u1] != s_charmap[u2]) {
+	    return s_charmap[u1] - s_charmap[u2];
+	}
+	if (u1 == '\0') {
+	    return 0;
+	}
+    }
+}
+#endif // !defined(HAVE_STRCASECMP)
+
+#ifndef HAVE_STRNCASECMP
+int
+strncasecmp(const char *s1, const char *s2, size_t n)
+{
+    unsigned char u1, u2;
+
+    for (; n != 0; --n) {
+	u1 = (unsigned char) *s1++;
+	u2 = (unsigned char) *s2++;
+	if (s_charmap[u1] != s_charmap[u2]) {
+	    return s_charmap[u1] - s_charmap[u2];
+	}
+	if (u1 == '\0') {
+	    return 0;
+	}
+    }
+    return 0;
+}
+#endif // !defined(HAVE_STRNCASECMP)
+
+} // extern "C"
+
+#endif // !defined(HAVE_STRCASECMP) || !defined(HAVE_STRNCASECMP)
+#endif // defined(WIN32)
+
 namespace rfb {
 
   char* strDup(const char* s) {
diff --git a/rfb/util.h b/rfb/util.h
index b654170..02183d7 100644
--- a/rfb/util.h
+++ b/rfb/util.h
@@ -72,8 +72,21 @@
   // Copies src to dest, up to specified length-1, and guarantees termination
   void strCopy(char* dest, const char* src, int destlen);
 }
+
+// Declare strcasecmp() and/or strncasecmp() if absent on this system.
+
+#if !defined(WIN32) && !defined(HAVE_STRCASECMP)
+extern "C" {
+  int strcasecmp(const char *s1, const char *s2);
+}
+#endif
+#if !defined(WIN32) && !defined(HAVE_STRNCASECMP)
+extern "C" {
+  int strncasecmp(const char *s1, const char *s2, size_t n);
+}
 #endif
 
+#endif // __RFB_UTIL_H__
 
 // -=- PLATFORM SPECIFIC UTILITY FUNCTIONS/IMPLEMENTATIONS
 #ifdef WIN32
diff --git a/tx/TXImage.cxx b/tx/TXImage.cxx
index caaeec4..7801578 100644
--- a/tx/TXImage.cxx
+++ b/tx/TXImage.cxx
@@ -39,8 +39,11 @@
 static rfb::LogWriter vlog("TXImage");
 
 TXImage::TXImage(Display* d, int width, int height, Visual* vis_, int depth_)
-  : xim(0), dpy(d), vis(vis_), depth(depth_), shminfo(0), tig(0), cube(0)
+  : xim(0), dpy(d), vis(vis_), depth(depth_), tig(0), cube(0)
 {
+#ifdef HAVE_MITSHM
+  shminfo = 0;
+#endif
   width_ = width;
   height_ = height;
   for (int i = 0; i < 256; i++)
@@ -140,11 +143,13 @@
     tig->getImage(ximDataStart, r,
                   xim->bytes_per_line / (xim->bits_per_pixel / 8));
   }
+#ifdef HAVE_MITSHM
   if (usingShm()) {
     XShmPutImage(dpy, win, gc, xim, x, y, x, y, w, h, False);
-  } else {
-    XPutImage(dpy, win, gc, xim, x, y, x, y, w, h);
+    return;
   }
+#endif
+  XPutImage(dpy, win, gc, xim, x, y, x, y, w, h);
 }
 
 void TXImage::setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs)
@@ -168,7 +173,7 @@
   *b = colourMap[index].b;
 }
 
-
+#ifdef HAVE_MITSHM
 static bool caughtError = false;
 
 static int XShmAttachErrorHandler(Display *dpy, XErrorEvent *error)
@@ -187,10 +192,15 @@
 };
 
 static TXImageCleanup imageCleanup;
+#endif
 
 void TXImage::createXImage()
 {
-  if (XShmQueryExtension(dpy)) {
+#ifdef HAVE_MITSHM
+  int major, minor;
+  Bool pixmaps;
+
+  if (XShmQueryVersion(dpy, &major, &minor, &pixmaps)) {
     shminfo = new XShmSegmentInfo;
 
     xim = XShmCreateImage(dpy, vis, depth, ZPixmap,
@@ -240,6 +250,7 @@
     delete shminfo;
     shminfo = 0;
   }
+#endif
 
   xim = XCreateImage(dpy, vis, depth, ZPixmap,
                      0, 0, width(), height(), BitmapPad(dpy), 0);
@@ -253,6 +264,7 @@
 
 void TXImage::destroyXImage()
 {
+#ifdef HAVE_MITSHM
   if (shminfo) {
     vlog.debug("Freeing shared memory XImage");
     shmdt(shminfo->shmaddr);
@@ -261,6 +273,7 @@
     shminfo = 0;
     imageCleanup.images.remove(this);
   }
+#endif
   // XDestroyImage() will free(xim->data) if appropriate
   if (xim) XDestroyImage(xim);
   xim = 0;
diff --git a/tx/TXImage.h b/tx/TXImage.h
index a90a694..8185366 100644
--- a/tx/TXImage.h
+++ b/tx/TXImage.h
@@ -37,7 +37,9 @@
 #include <rfb/PixelBuffer.h>
 #include <rfb/ColourMap.h>
 #include <rfb/ColourCube.h>
+#ifdef HAVE_MITSHM
 #include <X11/extensions/XShm.h>
+#endif
 
 namespace rfb { class TransImageGetter; }
 
@@ -59,7 +61,11 @@
   void setColourMapEntries(int firstColour, int nColours, rdr::U16* rgbs);
   void updateColourMap();
 
+#ifdef HAVE_MITSHM
   bool usingShm() { return shminfo; }
+#else
+  bool usingShm() { return 0; }
+#endif
 
   // PixelBuffer methods
   // width(), height(), getPF() etc are inherited from PixelBuffer
@@ -79,7 +85,9 @@
   Display* dpy;
   Visual* vis;
   int depth;
+#ifdef HAVE_MITSHM
   XShmSegmentInfo* shminfo;
+#endif
   rfb::TransImageGetter* tig;
   rfb::Colour colourMap[256];
   rfb::PixelFormat nativePF;
diff --git a/tx/Timer.cxx b/tx/Timer.cxx
index 78cff1c..3acb631 100644
--- a/tx/Timer.cxx
+++ b/tx/Timer.cxx
@@ -19,6 +19,11 @@
 // Timer.cxx
 //
 
+// XXX Lynx/OS 2.3: get proto for gettimeofday()
+#ifdef Lynx
+#include <sys/proto.h>
+#endif
+
 #include "Timer.h"
 
 static Timer* timers;
diff --git a/x0vncserver/TimeMillis.cxx b/x0vncserver/TimeMillis.cxx
index b5054c9..059c043 100644
--- a/x0vncserver/TimeMillis.cxx
+++ b/x0vncserver/TimeMillis.cxx
@@ -22,6 +22,11 @@
 
 #include <x0vncserver/TimeMillis.h>
 
+// XXX Lynx/OS 2.3: get proto for gettimeofday()
+#ifdef Lynx
+#include <sys/proto.h>
+#endif
+
 TimeMillis::TimeMillis()
 {
   update();
diff --git a/x0vncserver/x0vncserver.cxx b/x0vncserver/x0vncserver.cxx
index a9b114f..ac65c0b 100644
--- a/x0vncserver/x0vncserver.cxx
+++ b/x0vncserver/x0vncserver.cxx
@@ -45,6 +45,11 @@
 #include <x0vncserver/PollingManager.h>
 #include <x0vncserver/PollingScheduler.h>
 
+// XXX Lynx/OS 2.3: protos for select(), bzero()
+#ifdef Lynx
+#include <sys/proto.h>
+#endif
+
 using namespace rfb;
 using namespace network;