From a686690d0700fd62d24f831c5e25e08510a299a8 Mon Sep 17 00:00:00 2001 From: Constantin Kaplinsky Date: Thu, 2 Mar 2006 12:03:30 +0000 Subject: [PATCH] Porting changes for LynxOS 2.3. git-svn-id: svn://svn.code.sf.net/p/tigervnc/code/trunk@499 3789f03b-4d11-0410-bbf8-ca57d06f2519 --- network/TcpSocket.cxx | 11 ++-- rdr/FdInStream.cxx | 5 ++ rdr/FdOutStream.cxx | 5 ++ rfb/FileInfo.cxx | 1 + rfb/FileManager.cxx | 2 +- rfb/PixelFormat.cxx | 1 + rfb/encodings.cxx | 1 + rfb/util.cxx | 106 ++++++++++++++++++++++++++++++++++++ rfb/util.h | 13 +++++ tx/TXImage.cxx | 23 ++++++-- tx/TXImage.h | 8 +++ tx/Timer.cxx | 5 ++ x0vncserver/TimeMillis.cxx | 5 ++ x0vncserver/x0vncserver.cxx | 5 ++ 14 files changed, 181 insertions(+), 10 deletions(-) diff --git a/network/TcpSocket.cxx b/network/TcpSocket.cxx index 1d0de9f2..035c7f26 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 @@ TcpSocket::TcpSocket(const char *host, int port) 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 @@ TcpListener::TcpListener(int port, bool localhostOnly, int sock, bool close_) 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 @@ TcpFilter::~TcpFilter() { 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 f64f68e1..2b119735 100644 --- a/rdr/FdInStream.cxx +++ b/rdr/FdInStream.cxx @@ -48,6 +48,11 @@ #include #endif +// XXX Lynx/OS 2.3: protos for gettimeofday(), select(), bzero() +#ifdef Lynx +#include +#endif + #include #include diff --git a/rdr/FdOutStream.cxx b/rdr/FdOutStream.cxx index e65133da..07ac04c2 100644 --- a/rdr/FdOutStream.cxx +++ b/rdr/FdOutStream.cxx @@ -33,6 +33,11 @@ #include #endif +// XXX Lynx/OS 2.3: protos for select(), bzero() +#ifdef Lynx +#include +#endif + #include #include diff --git a/rfb/FileInfo.cxx b/rfb/FileInfo.cxx index 5b151d96..21e18f24 100644 --- a/rfb/FileInfo.cxx +++ b/rfb/FileInfo.cxx @@ -20,6 +20,7 @@ */ #include +#include #ifdef _WIN32 #define strcasecmp _stricmp diff --git a/rfb/FileManager.cxx b/rfb/FileManager.cxx index 44d78906..c0403a78 100644 --- a/rfb/FileManager.cxx +++ b/rfb/FileManager.cxx @@ -70,4 +70,4 @@ bool 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 d20be93c..8809fb5d 100644 --- a/rfb/PixelFormat.cxx +++ b/rfb/PixelFormat.cxx @@ -20,6 +20,7 @@ #include #include #include +#include #ifdef _WIN32 #define strcasecmp _stricmp diff --git a/rfb/encodings.cxx b/rfb/encodings.cxx index db6e1e25..d3b0ccb9 100644 --- a/rfb/encodings.cxx +++ b/rfb/encodings.cxx @@ -20,6 +20,7 @@ #define strcasecmp _stricmp #endif #include +#include int rfb::encodingNum(const char* name) { diff --git a/rfb/util.cxx b/rfb/util.cxx index 2dbc2df4..94aa6327 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 +// 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 b6541700..02183d74 100644 --- a/rfb/util.h +++ b/rfb/util.h @@ -72,8 +72,21 @@ namespace rfb { // 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 caaeec43..7801578c 100644 --- a/tx/TXImage.cxx +++ b/tx/TXImage.cxx @@ -39,8 +39,11 @@ using namespace rfb; 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 @@ void TXImage::put(Window win, GC gc, const rfb::Rect& r) 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 @@ void TXImage::lookup(int index, int* r, int* g, int* b) *b = colourMap[index].b; } - +#ifdef HAVE_MITSHM static bool caughtError = false; static int XShmAttachErrorHandler(Display *dpy, XErrorEvent *error) @@ -187,10 +192,15 @@ public: }; 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 @@ void TXImage::createXImage() delete shminfo; shminfo = 0; } +#endif xim = XCreateImage(dpy, vis, depth, ZPixmap, 0, 0, width(), height(), BitmapPad(dpy), 0); @@ -253,6 +264,7 @@ void TXImage::createXImage() void TXImage::destroyXImage() { +#ifdef HAVE_MITSHM if (shminfo) { vlog.debug("Freeing shared memory XImage"); shmdt(shminfo->shmaddr); @@ -261,6 +273,7 @@ void TXImage::destroyXImage() 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 a90a6945..8185366a 100644 --- a/tx/TXImage.h +++ b/tx/TXImage.h @@ -37,7 +37,9 @@ #include #include #include +#ifdef HAVE_MITSHM #include +#endif namespace rfb { class TransImageGetter; } @@ -59,7 +61,11 @@ public: 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 @@ private: 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 78cff1c2..3acb631b 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 +#endif + #include "Timer.h" static Timer* timers; diff --git a/x0vncserver/TimeMillis.cxx b/x0vncserver/TimeMillis.cxx index b5054c91..059c043b 100644 --- a/x0vncserver/TimeMillis.cxx +++ b/x0vncserver/TimeMillis.cxx @@ -22,6 +22,11 @@ #include +// XXX Lynx/OS 2.3: get proto for gettimeofday() +#ifdef Lynx +#include +#endif + TimeMillis::TimeMillis() { update(); diff --git a/x0vncserver/x0vncserver.cxx b/x0vncserver/x0vncserver.cxx index a9b114f2..ac65c0be 100644 --- a/x0vncserver/x0vncserver.cxx +++ b/x0vncserver/x0vncserver.cxx @@ -45,6 +45,11 @@ #include #include +// XXX Lynx/OS 2.3: protos for select(), bzero() +#ifdef Lynx +#include +#endif + using namespace rfb; using namespace network; -- 2.39.5