From d14cc5361f7db7016b7cbb1cc59d8500101d9f27 Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Tue, 5 Jul 2016 10:16:00 +0200 Subject: doc/_attic_/: Introduce an "_attic_" folder. Move diffs between NoMachine's nx-X11 3.5 and X.org 6.9 here. --- .../nx-X11_lib_X11_XlibInt.c.X.original | 1165 -------------------- 1 file changed, 1165 deletions(-) delete mode 100644 doc/nx-X11_vs_XOrg69_patches/nx-X11_lib_X11_XlibInt.c.X.original (limited to 'doc/nx-X11_vs_XOrg69_patches/nx-X11_lib_X11_XlibInt.c.X.original') diff --git a/doc/nx-X11_vs_XOrg69_patches/nx-X11_lib_X11_XlibInt.c.X.original b/doc/nx-X11_vs_XOrg69_patches/nx-X11_lib_X11_XlibInt.c.X.original deleted file mode 100644 index b76e169ee..000000000 --- a/doc/nx-X11_vs_XOrg69_patches/nx-X11_lib_X11_XlibInt.c.X.original +++ /dev/null @@ -1,1165 +0,0 @@ ---- ./nx-X11/lib/X11/XlibInt.c.X.original 2015-02-13 14:03:44.624443872 +0100 -+++ ./nx-X11/lib/X11/XlibInt.c 2015-02-10 19:13:12.800723493 +0100 -@@ -26,6 +26,24 @@ - from The Open Group. - - */ -+ -+/**************************************************************************/ -+/* */ -+/* Copyright (c) 2001, 2011 NoMachine, http://www.nomachine.com/. */ -+/* */ -+/* NX-X11, NX protocol compression and NX extensions to this software */ -+/* are copyright of NoMachine. Redistribution and use of the present */ -+/* software is allowed according to terms specified in the file LICENSE */ -+/* which comes in the source distribution. */ -+/* */ -+/* Check http://www.nomachine.com/licensing.html for applicability. */ -+/* */ -+/* NX and NoMachine are trademarks of Medialogic S.p.A. */ -+/* */ -+/* All rights reserved. */ -+/* */ -+/**************************************************************************/ -+ - /* $XFree86: xc/lib/X11/XlibInt.c,v 3.38 2003/10/30 21:55:05 alanh Exp $ */ - - /* -@@ -100,6 +118,34 @@ - - #endif /* XTHREADS else */ - -+#include "NX.h" -+ -+#ifdef NX_TRANS_SOCKET -+ -+#include "NX.h" -+#include "NXvars.h" -+ -+static struct timeval retry; -+ -+/* -+ * From Xtranssock.c. Presently the congestion state -+ * is reported by the proxy to the application, by -+ * invoking the callback directly. The function will -+ * be possibly used in the future, to be able to track -+ * the bandwidth usage even when the NX transport is -+ * not running. Note that in this sample implementation -+ * the congestion state is checked very often and can -+ * be surely optimized. -+ */ -+ -+#ifdef NX_TRANS_CHANGE -+ -+extern int _X11TransSocketCongestionChange(XtransConnInfo, int *); -+ -+#endif -+ -+#endif /* #ifdef NX_TRANS_SOCKET */ -+ - /* check for both EAGAIN and EWOULDBLOCK, because some supposedly POSIX - * systems are broken and return EWOULDBLOCK when they should return EAGAIN - */ -@@ -219,6 +265,100 @@ - 0, 0, 0 - }; - -+#ifdef NX_TRANS_SOCKET -+ -+/* -+ * Replace the standard Select with a version giving NX a -+ * chance to check its own descriptors. This doesn't cover -+ * the cases where the system is using poll or when system- -+ * specific defines override the Select definition (OS/2). -+ */ -+ -+int _XSelect(int maxfds, fd_set *readfds, fd_set *writefds, -+ fd_set *exceptfds, struct timeval *timeout) -+{ -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XSelect: Called with [%d][%p][%p][%p][%p].\n", -+ maxfds, (void *) readfds, (void *) writefds, (void *) exceptfds, -+ (void *) timeout); -+#endif -+ -+ if (NXTransRunning(NX_FD_ANY)) -+ { -+ fd_set t_readfds, t_writefds; -+ struct timeval t_timeout; -+ -+ int n, r, e; -+ -+#ifdef NX_TRANS_TEST -+ -+ if (exceptfds != NULL) -+ { -+ fprintf(stderr, "_XSelect: WARNING! Can't handle exception fds in select.\n"); -+ } -+ -+#endif -+ -+ if (readfds == NULL) -+ { -+ FD_ZERO(&t_readfds); -+ -+ readfds = &t_readfds; -+ } -+ -+ if (writefds == NULL) -+ { -+ FD_ZERO(&t_writefds); -+ -+ writefds = &t_writefds; -+ } -+ -+ if (timeout == NULL) -+ { -+ t_timeout.tv_sec = 10; -+ t_timeout.tv_usec = 0; -+ -+ timeout = &t_timeout; -+ } -+ -+ n = maxfds; -+ -+ /* -+ * If the transport is gone avoid -+ * sleeping until the timeout. -+ */ -+ -+ if (NXTransPrepare(&n, readfds, writefds, timeout) != 0) -+ { -+ NXTransSelect(&r, &e, &n, readfds, writefds, timeout); -+ -+ NXTransExecute(&r, &e, &n, readfds, writefds, timeout); -+ -+ errno = e; -+ -+ return r; -+ } -+ else -+ { -+ return 0; -+ } -+ } -+ else -+ { -+ return select(maxfds, readfds, writefds, exceptfds, timeout); -+ } -+} -+ -+#else /* #ifdef NX_TRANS_SOCKET */ -+ -+int _XSelect(int maxfds, fd_set *readfds, fd_set *writefds, -+ fd_set *exceptfds, struct timeval *timeout) -+{ -+ return select(maxfds, readfds, writefds, exceptfds, timeout); -+} -+ -+#endif /* #ifdef NX_TRANS_SOCKET */ -+ - /* - * This is an OS dependent routine which: - * 1) returns as soon as the connection can be written on.... -@@ -242,6 +382,18 @@ - #endif - int nfound; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ int congestion; -+#endif -+ -+#ifdef NX_TRANS_SOCKET -+ -+ if (_XGetIOError(dpy)) { -+ return; -+ } -+ -+#endif -+ - #ifdef USE_POLL - filedes.fd = dpy->fd; - filedes.events = 0; -@@ -276,6 +428,8 @@ - (!dpy->lock->reply_awaiters || - dpy->lock->reply_awaiters->cv == cv))) - #endif -+ -+#ifndef NX_TRANS_SOCKET - #ifdef USE_POLL - filedes.events = POLLIN; - filedes.events |= POLLOUT; -@@ -283,17 +437,109 @@ - FD_SET(dpy->fd, &r_mask); - FD_SET(dpy->fd, &w_mask); - #endif -+#endif /* #ifndef NX_TRANS_SOCKET */ - - do { -+#ifdef NX_TRANS_SOCKET -+ /* -+ * Give a chance to the registered client to perform -+ * any needed operation before entering the select. -+ */ -+ -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XWaitForWritable: WAIT! Waiting for the display to become writable.\n"); -+#endif -+ NXTransFlush(dpy->fd); -+ -+ if (_NXDisplayBlockFunction != NULL) { -+ (*_NXDisplayBlockFunction)(dpy, NXBlockWrite); -+ } -+ -+ /* -+ * Need to set again the descriptors as we could have -+ * run multiple selects before having the possibility -+ * to read or write to the X connection. -+ */ -+ -+#ifdef USE_POLL -+ filedes.events = POLLIN; -+ filedes.events |= POLLOUT; -+#else -+ FD_SET(dpy->fd, &r_mask); -+ FD_SET(dpy->fd, &w_mask); -+#endif -+#endif /* #ifdef NX_TRANS_SOCKET */ -+ - UnlockDisplay(dpy); - #ifdef USE_POLL -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XWaitForWritable: Calling poll().\n"); -+#endif - nfound = poll (&filedes, 1, -1); - #else -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XWaitForWritable: Calling select() after [%ld] ms.\n", -+ NXTransTime()); -+#endif -+#ifdef NX_TRANS_SOCKET -+ /* -+ * Give a chance to the callback to detect -+ * the failure of the display even if we -+ * miss the interrupt inside the select. -+ */ -+ -+ if (_NXDisplayErrorFunction != NULL) { -+ retry.tv_sec = 5; -+ retry.tv_usec = 0; -+ nfound = Select (dpy->fd + 1, &r_mask, &w_mask, NULL, &retry); -+ } else { -+ nfound = Select (dpy->fd + 1, &r_mask, &w_mask, NULL, NULL); -+ } -+#else - nfound = Select (dpy->fd + 1, &r_mask, &w_mask, NULL, NULL); - #endif -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XWaitForWritable: Out of select() with [%d] after [%ld] ms.\n", -+ nfound, NXTransTime()); -+ -+ if (FD_ISSET(dpy->fd, &r_mask)) -+ { -+ BytesReadable_t pend; -+ -+ _X11TransBytesReadable(dpy->trans_conn, &pend); -+ -+ fprintf(stderr, "_XWaitForWritable: Descriptor [%d] is ready with [%ld] bytes to read.\n", -+ dpy->fd, pend); -+ } -+ -+ if (FD_ISSET(dpy->fd, &w_mask)) -+ { -+ fprintf(stderr, "_XWaitForWritable: Descriptor [%d] has become writable.\n\n", -+ dpy->fd); -+ } -+#endif -+#endif - InternalLockDisplay(dpy, cv != NULL); -- if (nfound < 0 && !ECHECK(EINTR)) -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ if (_NXDisplayCongestionFunction != NULL && -+ _X11TransSocketCongestionChange(dpy->trans_conn, &congestion) == 1) { -+ (*_NXDisplayCongestionFunction)(dpy, congestion); -+ } -+#endif -+ -+#ifdef NX_TRANS_SOCKET -+ if (nfound <= 0) { -+ if ((nfound == -1 && !ECHECK(EINTR)) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return; -+ } -+ } -+#else -+ if (nfound < 0 && !ECHECK(EINTR)) - _XIOError(dpy); -+#endif - } while (nfound <= 0); - - if ( -@@ -311,7 +557,15 @@ - - /* find out how much data can be read */ - if (_X11TransBytesReadable(dpy->trans_conn, &pend) < 0) -+#ifdef NX_TRANS_SOCKET -+ { -+ _XIOError(dpy); -+ -+ return; -+ } -+#else - _XIOError(dpy); -+#endif - len = pend; - - /* must read at least one xEvent; if none is pending, then -@@ -464,6 +718,15 @@ - int highest_fd = fd; - #endif - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ int congestion; -+#endif -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ return -1; -+ } -+#endif -+ - #ifdef USE_POLL - if (dpy->im_fd_length + 1 > POLLFD_CACHE_SIZE - && !(dpy->flags & XlibDisplayProcConni)) { -@@ -495,16 +758,68 @@ - #endif - UnlockDisplay(dpy); - #ifdef USE_POLL -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XWaitForReadable: Calling poll().\n"); -+#endif - result = poll(filedes, - (dpy->flags & XlibDisplayProcConni) ? 1 : 1+dpy->im_fd_length, - -1); - #else -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XWaitForReadable: Calling select().\n"); -+#endif -+#ifdef NX_TRANS_SOCKET -+ /* -+ * Give a chance to the registered application -+ * to perform any needed operation. -+ */ -+ -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XWaitForReadable: WAIT! Waiting for the display to become readable.\n"); -+#endif -+ NXTransFlush(dpy->fd); -+ -+ if (_NXDisplayBlockFunction != NULL) { -+ (*_NXDisplayBlockFunction)(dpy, NXBlockRead); -+ } -+ -+ if (_NXDisplayErrorFunction != NULL) { -+ retry.tv_sec = 5; -+ retry.tv_usec = 0; -+ result = Select(highest_fd + 1, &r_mask, NULL, NULL, &retry); -+ } else { -+ result = Select(highest_fd + 1, &r_mask, NULL, NULL, NULL); -+ } -+#else - result = Select(highest_fd + 1, &r_mask, NULL, NULL, NULL); - #endif -+#endif -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XWaitForReadable: Out of select with result [%d] and errno [%d].\n", -+ result, (result < 0 ? errno : 0)); -+#endif - InternalLockDisplay(dpy, dpy->flags & XlibDisplayReply); -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ if (_NXDisplayCongestionFunction != NULL && -+ _X11TransSocketCongestionChange(dpy->trans_conn, &congestion) == 1) { -+ (*_NXDisplayCongestionFunction)(dpy, congestion); -+ } -+#endif -+#ifdef NX_TRANS_SOCKET -+ if (result <= 0) { -+ if ((result == -1 && !ECHECK(EINTR)) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return -1; -+ } -+ continue; -+ } -+#else - if (result == -1 && !ECHECK(EINTR)) _XIOError(dpy); - if (result <= 0) - continue; -+#endif - #ifdef USE_POLL - if (filedes[0].revents & (POLLIN|POLLHUP|POLLERR)) - #else -@@ -562,6 +877,19 @@ - xGetInputFocusReply rep; - register xReq *req; - -+#ifdef NX_TRANS_SOCKET -+#ifdef NX_TRANS_DEBUG -+ fprintf(stderr, "_XSeqSyncFunction: Going to synchronize the display.\n"); -+#endif -+ if (dpy->flags & XlibDisplayIOError) -+ { -+#ifdef NX_TRANS_DEBUG -+ fprintf(stderr, "_XSeqSyncFunction: Returning 0 with I/O error detected.\n"); -+#endif -+ return 0; -+ } -+#endif -+ - LockDisplay(dpy); - if ((dpy->request - dpy->last_request_read) >= (BUFSIZE / SIZEOF(xReq))) { - GetEmptyReq(GetInputFocus, req); -@@ -611,7 +939,14 @@ - register int write_stat; - register char *bufindex; - _XExtension *ext; -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ int congestion; -+#endif - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XFlushInt: Entering flush with [%d] bytes to write.\n", -+ (dpy->bufptr - dpy->buffer)); -+#endif - /* This fix resets the bufptr to the front of the buffer so - * additional appends to the bufptr will not corrupt memory. Since - * the server is down, these appends are no-op's anyway but -@@ -619,13 +954,23 @@ - */ - if (dpy->flags & XlibDisplayIOError) - { -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XFlushInt: Returning with I/O error detected.\n"); -+#endif - dpy->bufptr = dpy->buffer; - dpy->last_req = (char *)&_dummy_request; - return; - } - - #ifdef XTHREADS -+#ifdef NX_TRANS_SOCKET -+ while (dpy->flags & XlibDisplayWriting) { -+ if (_XGetIOError(dpy)) { -+ return; -+ } -+#else - while (dpy->flags & XlibDisplayWriting) { -+#endif - if (dpy->lock) { - ConditionWait(dpy, dpy->lock->writers); - } else { -@@ -653,6 +998,17 @@ - write_stat = _X11TransWrite(dpy->trans_conn, - bufindex, (int) todo); - if (write_stat >= 0) { -+#ifdef NX_TRANS_SOCKET -+ if (_NXDisplayWriteFunction != NULL) { -+ (*_NXDisplayWriteFunction)(dpy, write_stat); -+ } -+#ifdef NX_TRANS_CHANGE -+ if (_NXDisplayCongestionFunction != NULL && -+ _X11TransSocketCongestionChange(dpy->trans_conn, &congestion) == 1) { -+ (*_NXDisplayCongestionFunction)(dpy, congestion); -+ } -+#endif -+#endif - size -= write_stat; - todo = size; - bufindex += write_stat; -@@ -682,11 +1038,25 @@ - ); - } - #endif -+#ifdef NX_TRANS_SOCKET -+ } else if (!ECHECK(EINTR) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return; -+ } -+#else - } else if (!ECHECK(EINTR)) { - /* Write failed! */ - /* errno set by write system call. */ - _XIOError(dpy); - } -+#endif -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ return; -+ } -+#endif - } - dpy->last_req = (char *)&_dummy_request; - if ((dpy->request - dpy->last_request_read) >= SEQLIMIT && -@@ -727,6 +1097,12 @@ - if (dpy->qlen) - return(dpy->qlen); - } -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ if (dpy->flags & XlibDisplayIOError) { -+ fprintf(stderr, "_XEventsQueued: Returning [%d] after display failure.\n", -+ dpy->qlen); -+ } -+#endif - if (dpy->flags & XlibDisplayIOError) return(dpy->qlen); - - #ifdef XTHREADS -@@ -767,8 +1143,19 @@ - } - #endif /* XTHREADS*/ - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XEventsQueued: Checking bytes readable.\n"); -+#endif - if (_X11TransBytesReadable(dpy->trans_conn, &pend) < 0) -+#ifdef NX_TRANS_SOCKET -+ { -+ _XIOError(dpy); -+ -+ return (dpy->qlen); -+ } -+#else - _XIOError(dpy); -+#endif - #ifdef XCONN_CHECK_FREQ - /* This is a crock, required because FIONREAD or equivalent is - * not guaranteed to detect a broken connection. -@@ -785,10 +1172,16 @@ - - dpy->conn_checker = 0; - #ifdef USE_POLL -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XEventsQueued: Calling poll().\n"); -+#endif - filedes.fd = dpy->fd; - filedes.events = POLLIN; - if ((result = poll(&filedes, 1, 0))) - #else -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XEventsQueued: Calling select().\n"); -+#endif - FD_ZERO(&r_mask); - FD_SET(dpy->fd, &r_mask); - if ((result = Select(dpy->fd + 1, &r_mask, NULL, NULL, &zero_time))) -@@ -797,13 +1190,32 @@ - if (result > 0) - { - if (_X11TransBytesReadable(dpy->trans_conn, &pend) < 0) -+#ifdef NX_TRANS_SOCKET -+ { -+ _XIOError(dpy); -+ -+ return (dpy->qlen); -+ } -+#else - _XIOError(dpy); -+#endif - /* we should not get zero, if we do, force a read */ - if (!pend) - pend = SIZEOF(xReply); - } -+#ifdef NX_TRANS_SOCKET -+ if (result <= 0) { -+ if ((result == -1 && !ECHECK(EINTR)) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return (dpy->qlen); -+ } -+ } -+#else - else if (result < 0 && !ECHECK(EINTR)) - _XIOError(dpy); -+#endif - } - } - #endif /* XCONN_CHECK_FREQ */ -@@ -815,6 +1227,10 @@ - { - UnlockNextEventReader(dpy); - } -+ -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XEventsQueued: Returning [%d].\n", dpy->qlen); -+#endif - return(dpy->qlen); - } - /* Force a read if there is not enough data. Otherwise, -@@ -847,6 +1263,11 @@ - - (void) _XRead (dpy, read_buf, (long) len); - -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ return(dpy->qlen); -+ } -+#endif - #ifdef XTHREADS - /* what did we actually read: reply or event? */ - if (dpy->lock && dpy->lock->reply_awaiters) { -@@ -945,7 +1366,15 @@ - #endif /* XTHREADS */ - /* find out how much data can be read */ - if (_X11TransBytesReadable(dpy->trans_conn, &pend) < 0) -+#ifdef NX_TRANS_SOCKET -+ { -+ _XIOError(dpy); -+ -+ return; -+ } -+#else - _XIOError(dpy); -+#endif - len = pend; - - /* must read at least one xEvent; if none is pending, then -@@ -995,6 +1424,15 @@ - dpy->flags |= XlibDisplayReadEvents; - i = _XRead (dpy, read_buf, (long) len); - dpy->flags &= ~XlibDisplayReadEvents; -+#ifdef NX_TRANS_SOCKET -+ if (dpy->flags & XlibDisplayIOError) -+ { -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XReadEvents: Returning with I/O error detected.\n"); -+#endif -+ return; -+ } -+#endif - if (i == -2) { - /* special flag from _XRead to say that internal connection has - done XPutBackEvent. Which we can use so we're done. */ -@@ -1065,12 +1503,33 @@ - #ifdef XTHREADS - int original_size = size; - #endif -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ int congestion; -+#endif - - if ((dpy->flags & XlibDisplayIOError) || size == 0) - return 0; - ESET(0); -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ while (1) { -+ /* -+ * Need to check the congestion state -+ * after the read so split the statement -+ * in multiple blocks. -+ */ -+ -+ bytes_read = _X11TransRead(dpy->trans_conn, data, (int)size); -+ if (_NXDisplayCongestionFunction != NULL && -+ _X11TransSocketCongestionChange(dpy->trans_conn, &congestion) == 1) { -+ (*_NXDisplayCongestionFunction)(dpy, congestion); -+ } -+ if (bytes_read == size) { -+ break; -+ } -+#else - while ((bytes_read = _X11TransRead(dpy->trans_conn, data, (int)size)) - != size) { -+#endif - - if (bytes_read > 0) { - size -= bytes_read; -@@ -1090,14 +1549,34 @@ - else if (bytes_read == 0) { - /* Read failed because of end of file! */ - ESET(EPIPE); -+#ifdef NX_TRANS_SOCKET -+ _XIOError(dpy); -+ -+ return -1; -+#else - _XIOError(dpy); -+#endif - } - - else /* bytes_read is less than 0; presumably -1 */ { - /* If it's a system call interrupt, it's not an error. */ -+#ifdef NX_TRANS_SOCKET -+ if (!ECHECK(EINTR) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return -1; -+ } -+#else - if (!ECHECK(EINTR)) - _XIOError(dpy); -+#endif - } -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ return -1; -+ } -+#endif - } - #ifdef XTHREADS - if (dpy->lock && dpy->lock->reply_bytes_left > 0) -@@ -1268,6 +1747,9 @@ - #ifdef XTHREADS - int original_size; - #endif -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ int congestion; -+#endif - - if ((dpy->flags & XlibDisplayIOError) || size == 0) return; - iov[0].iov_len = (int)size; -@@ -1285,7 +1767,19 @@ - original_size = size; - #endif - ESET(0); -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ while (1) { -+ bytes_read = _X11TransReadv (dpy->trans_conn, iov, 2); -+ if (_NXDisplayCongestionFunction != NULL && -+ _X11TransSocketCongestionChange(dpy->trans_conn, &congestion) == 1) { -+ (*_NXDisplayCongestionFunction)(dpy, congestion); -+ } -+ if (bytes_read == size) { -+ break; -+ } -+#else - while ((bytes_read = _X11TransReadv (dpy->trans_conn, iov, 2)) != size) { -+#endif - - if (bytes_read > 0) { - size -= bytes_read; -@@ -1313,14 +1807,34 @@ - else if (bytes_read == 0) { - /* Read failed because of end of file! */ - ESET(EPIPE); -+#ifdef NX_TRANS_SOCKET -+ _XIOError(dpy); -+ -+ return; -+#else - _XIOError(dpy); -+#endif - } - - else /* bytes_read is less than 0; presumably -1 */ { - /* If it's a system call interrupt, it's not an error. */ -+#ifdef NX_TRANS_SOCKET -+ if (!ECHECK(EINTR) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return; -+ } -+#else - if (!ECHECK(EINTR)) - _XIOError(dpy); -+#endif - } -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ return; -+ } -+#endif - } - #ifdef XTHREADS - if (dpy->lock && dpy->lock->reply_bytes_left > 0) -@@ -1351,8 +1865,31 @@ - - long skip, dbufsize, padsize, total, todo; - _XExtension *ext; -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_CHANGE) -+ int congestion; -+#endif -+ -+#ifdef NX_TRANS_SOCKET -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XSend: Sending data with [%d] bytes to write.\n", -+ (dpy->bufptr - dpy->buffer)); -+#endif -+ if (!size || (dpy->flags & XlibDisplayIOError)) -+ { -+ if (dpy->flags & XlibDisplayIOError) -+ { -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XSend: Returning with I/O error detected.\n"); -+#endif -+ dpy->bufptr = dpy->buffer; -+ dpy->last_req = (char *)&_dummy_request; -+ } - -+ return; -+ } -+#else - if (!size || (dpy->flags & XlibDisplayIOError)) return; -+#endif - dbufsize = dpy->bufptr - dpy->buffer; - #ifdef XTHREADS - dpy->flags |= XlibDisplayWriting; -@@ -1418,6 +1955,17 @@ - - ESET(0); - if ((len = _X11TransWritev(dpy->trans_conn, iov, i)) >= 0) { -+#ifdef NX_TRANS_SOCKET -+ if (_NXDisplayWriteFunction != NULL) { -+ (*_NXDisplayWriteFunction)(dpy, len); -+ } -+#ifdef NX_TRANS_CHANGE -+ if (_NXDisplayCongestionFunction != NULL && -+ _X11TransSocketCongestionChange(dpy->trans_conn, &congestion) == 1) { -+ (*_NXDisplayCongestionFunction)(dpy, congestion); -+ } -+#endif -+#endif - skip += len; - total -= len; - todo = total; -@@ -1447,9 +1995,23 @@ - ); - } - #endif -+#ifdef NX_TRANS_SOCKET -+ } else if (!ECHECK(EINTR) || -+ (_NXDisplayErrorFunction != NULL && -+ (*_NXDisplayErrorFunction)(dpy, _XGetIOError(dpy)))) { -+ _XIOError(dpy); -+ return; -+ } -+#else - } else if (!ECHECK(EINTR)) { - _XIOError(dpy); - } -+#endif -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ return; -+ } -+#endif - } - dpy->last_req = (char *) & _dummy_request; - if ((dpy->request - dpy->last_request_read) >= SEQLIMIT && -@@ -1640,10 +2202,31 @@ - if (newseq < lastseq) { - newseq += 0x10000; - if (newseq > dpy->request) { -+ -+#ifdef NX_TRANS_SOCKET -+ -+ if (_NXLostSequenceFunction != NULL) -+ { -+ (*_NXLostSequenceFunction)(dpy, newseq, dpy->request, -+ (unsigned int) rep->type); -+ } -+ else -+ { -+ (void) fprintf (stderr, -+ "Xlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n", -+ newseq, dpy->request, -+ (unsigned int) rep->type); -+ } -+ -+#else /* #ifdef NX_TRANS_SOCKET */ -+ - (void) fprintf (stderr, - "Xlib: sequence lost (0x%lx > 0x%lx) in reply type 0x%x!\n", - newseq, dpy->request, - (unsigned int) rep->type); -+ -+#endif /* #ifdef NX_TRANS_SOCKET */ -+ - newseq -= 0x10000; - } - } -@@ -1671,9 +2254,22 @@ - #ifdef XTHREADS - struct _XCVList *cvl; - #endif -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XReply: Going to wait for an X reply.\n"); -+#endif - -+#ifdef NX_TRANS_SOCKET -+ if (dpy->flags & XlibDisplayIOError) -+ { -+#ifdef NX_TRANS_DEBUG -+ fprintf(stderr, "_XReply: Returning 0 with I/O error detected.\n"); -+#endif -+ return 0; -+ } -+#else - if (dpy->flags & XlibDisplayIOError) - return 0; -+#endif - - #ifdef XTHREADS - /* create our condition variable and append to list */ -@@ -1689,6 +2285,9 @@ - XThread_Self(), cvl); - #endif - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XReply: Going to flush the display buffer.\n"); -+#endif - _XFlushInt(dpy, cvl ? cvl->cv : NULL); - /* if it is not our turn to read a reply off the wire, - * wait til we're at head of list. if there is an event waiter, -@@ -1704,6 +2303,20 @@ - _XFlush(dpy); - #endif - -+#ifdef NX_TRANS_SOCKET -+ /* -+ * We are going to block waiting for the remote -+ * X server. Be sure that the proxy has flushed -+ * all the data. -+ */ -+ -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XReply: Requesting a flush of the NX transport.\n"); -+#endif -+ -+ NXTransFlush(dpy->fd); -+#endif -+ - for (;;) { - #ifdef XTHREADS - /* Did another thread's _XReadEvents get our reply by accident? */ -@@ -1767,6 +2380,12 @@ - ((long) rep->generic.length) << 2); - dpy->flags &= ~XlibDisplayReply; - UnlockNextReplyReader(dpy); -+#ifdef NX_TRANS_SOCKET -+ /* -+ * The original code has provision -+ * for returning already. -+ */ -+#endif - _XIOError (dpy); - return (0); - -@@ -1830,6 +2449,12 @@ - #endif - break; - } -+#ifdef NX_TRANS_SOCKET -+ if (_XGetIOError(dpy)) { -+ UnlockNextReplyReader(dpy); -+ return 0; -+ } -+#endif - } - } - -@@ -1849,6 +2474,14 @@ - (void) _XSetLastRequestRead(dpy, &rep->generic); - len = SIZEOF(xReply) + (rep->generic.length << 2); - if (len < SIZEOF(xReply)) { -+#ifdef NX_TRANS_SOCKET -+ -+ /* -+ * The original code has provision -+ * for returning already. -+ */ -+ -+#endif - _XIOError (dpy); - buf += *lenp; - *lenp = 0; -@@ -1876,6 +2509,14 @@ - } - if (len < SIZEOF(xReply)) - { -+#ifdef NX_TRANS_SOCKET -+ -+ /* -+ * The original code has provision -+ * for returning already. -+ */ -+ -+#endif - _XIOError (dpy); - buf += *lenp; - *lenp = 0; -@@ -1944,6 +2585,10 @@ - struct _XConnWatchInfo *watchers; - XPointer *wd; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XRegisterInternalConnection: Got called.\n"); -+#endif -+ - new_conni = (struct _XConnectionInfo*)Xmalloc(sizeof(struct _XConnectionInfo)); - if (!new_conni) - return 0; -@@ -1991,6 +2636,10 @@ - struct _XConnWatchInfo *watch; - XPointer *wd; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XUnregisterInternalConnection: Got called.\n"); -+#endif -+ - for (prev = &dpy->im_fd_info; (info_list = *prev); - prev = &info_list->next) { - if (info_list->fd == fd) { -@@ -2030,6 +2679,10 @@ - struct _XConnectionInfo *info_list; - int *fd_list; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "XInternalConnectionNumbers: Got called.\n"); -+#endif -+ - LockDisplay(dpy); - count = 0; - for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next) -@@ -2088,6 +2741,10 @@ - { - struct _XConnectionInfo *info_list; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "XProcessInternalConnection: Got called.\n"); -+#endif -+ - LockDisplay(dpy); - for (info_list=dpy->im_fd_info; info_list; info_list=info_list->next) { - if (info_list->fd == fd) { -@@ -2116,6 +2773,10 @@ - struct _XConnectionInfo *info_list; - XPointer *wd_array; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "XAddConnectionWatch: Got called.\n"); -+#endif -+ - LockDisplay(dpy); - - /* allocate new watch data */ -@@ -2172,6 +2833,10 @@ - struct _XConnectionInfo *conni; - int counter = 0; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "XRemoveConnectionWatch: Got called.\n"); -+#endif -+ - LockDisplay(dpy); - for (watch=dpy->conn_watchers; watch; watch=watch->next) { - if (watch->fn == callback && watch->client_data == client_data) { -@@ -2209,6 +2874,10 @@ - #define SCRATCHSIZE 2048 - char buf[SCRATCHSIZE]; - -+#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_DEBUG) -+ fprintf(stderr, "_XEatData: Going to eat [%ld] bytes of data from descriptor [%d].\n", -+ n, dpy->fd); -+#endif - while (n > 0) { - register long bytes_read = (n > SCRATCHSIZE) ? SCRATCHSIZE : n; - (void) _XRead (dpy, buf, bytes_read); -@@ -2237,7 +2906,13 @@ - (_XQEvent *) Xmalloc((unsigned)sizeof(_XQEvent))) == NULL) { - /* Malloc call failed! */ - ESET(ENOMEM); -+#ifdef NX_TRANS_SOCKET -+ _XIOError(dpy); -+ -+ return; -+#else - _XIOError(dpy); -+#endif - } - qelt->next = NULL; - /* go call through display to find proper event reformatter */ -@@ -2710,7 +3385,29 @@ - QLength(dpy)); - - } -- exit(1); -+#ifdef NX_TRANS_SOCKET -+ if (_NXHandleDisplayError == 1) -+ { -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XDefaultIOError: Going to return from the error handler.\n"); -+#endif -+ return 0; -+ } -+ else -+ { -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XDefaultIOError: Going to exit from the program.\n"); -+#endif -+#ifdef NX_TRANS_EXIT -+ NXTransExit(1); -+#else -+ exit(1); -+#endif -+ } -+#else -+ exit(1); -+#endif /* #ifdef NX_TRANS_SOCKET */ -+ - return(0); /* dummy - function should never return */ - } - -@@ -2911,7 +3608,48 @@ - (*_XIOErrorFunction)(dpy); - else - _XDefaultIOError(dpy); -+#ifdef NX_TRANS_SOCKET -+ /* -+ * Check if we are supposed to return in the case -+ * of a display failure. The client which originated -+ * the X operation will have to check the value of -+ * the XlibDisplayIOError flag and handle appropria- -+ * tely the display disconnection. -+ */ -+ -+ if (_NXHandleDisplayError == 0) -+ { -+#ifdef NX_TRANS_EXIT -+ NXTransExit(1); -+#else -+ exit(1); -+#endif -+ } -+ -+ /* -+ * We are going to return. Reset the display -+ * buffers. Further writes will be discarded. -+ */ -+ -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XIOError: Resetting the display buffer.\n"); -+#endif -+ -+ dpy->bufptr = dpy->buffer; -+ dpy->last_req = (char *) &_dummy_request; -+ -+#ifdef NX_TRANS_TEST -+ fprintf(stderr, "_XIOError: Resetting the display flags.\n"); -+#endif -+ -+ dpy->flags &= ~XlibDisplayProcConni; -+ dpy->flags &= ~XlibDisplayPrivSync; -+ dpy->flags &= ~XlibDisplayReadEvents; -+ dpy->flags &= ~XlibDisplayWriting; -+ dpy->flags &= ~XlibDisplayReply; -+#else - exit (1); -+#endif - return 0; - } - -- cgit v1.2.3