aboutsummaryrefslogtreecommitdiff
path: root/nx-X11/lib/xtrans
diff options
context:
space:
mode:
authorMike Gabriel <mike.gabriel@das-netzwerkteam.de>2017-07-21 12:31:09 +0200
committerMike Gabriel <mike.gabriel@das-netzwerkteam.de>2017-08-25 10:06:49 +0200
commitc350873c7c977efe5210484f04160be45f84ba7e (patch)
tree717d33eb315f4def1307d65108d14715696cd5cf /nx-X11/lib/xtrans
parent1472e7e37838f17b7ed948fa206e8c3434a9d346 (diff)
downloadnx-libs-c350873c7c977efe5210484f04160be45f84ba7e.tar.gz
nx-libs-c350873c7c977efe5210484f04160be45f84ba7e.tar.bz2
nx-libs-c350873c7c977efe5210484f04160be45f84ba7e.zip
Convert nx-X11/lib/ build flow from imake to autotools.
Diffstat (limited to 'nx-X11/lib/xtrans')
-rw-r--r--nx-X11/lib/xtrans/Imakefile19
-rw-r--r--nx-X11/lib/xtrans/Xtrans.c1367
-rw-r--r--nx-X11/lib/xtrans/Xtrans.h426
-rw-r--r--nx-X11/lib/xtrans/Xtransint.h433
-rw-r--r--nx-X11/lib/xtrans/Xtranslcl.c2486
-rw-r--r--nx-X11/lib/xtrans/Xtranssock.c3554
-rw-r--r--nx-X11/lib/xtrans/Xtransutil.c639
-rw-r--r--nx-X11/lib/xtrans/transport.c74
8 files changed, 0 insertions, 8998 deletions
diff --git a/nx-X11/lib/xtrans/Imakefile b/nx-X11/lib/xtrans/Imakefile
deleted file mode 100644
index 70716bb90..000000000
--- a/nx-X11/lib/xtrans/Imakefile
+++ /dev/null
@@ -1,19 +0,0 @@
-#define IncSubdir nx-X11
-
-all::
-
-DEFINES = $(FAILDEFINES)
-
-# Since xtrans source is #include'd into software that uses it, we install
-# the .c files as if they were headers.
-HEADERS = \
- Xtrans.h \
- Xtrans.c \
- Xtransint.h \
- Xtranslcl.c \
- Xtranssock.c \
- Xtransutil.c \
- transport.c
-
-DependTarget()
-BuildIncludes($(HEADERS),IncSubdir/Xtrans,../..)
diff --git a/nx-X11/lib/xtrans/Xtrans.c b/nx-X11/lib/xtrans/Xtrans.c
deleted file mode 100644
index 328a970b1..000000000
--- a/nx-X11/lib/xtrans/Xtrans.c
+++ /dev/null
@@ -1,1367 +0,0 @@
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <ctype.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_SYSTEMD_DAEMON
-#include <systemd/sd-daemon.h>
-#endif
-
-/*
- * The transport table contains a definition for every transport (protocol)
- * family. All operations that can be made on the transport go through this
- * table.
- *
- * Each transport is assigned a unique transport id.
- *
- * New transports can be added by adding an entry in this table.
- * For compatiblity, the transport ids should never be renumbered.
- * Always add to the end of the list.
- */
-
-#define TRANS_TLI_INET_INDEX 1
-#define TRANS_TLI_TCP_INDEX 2
-#define TRANS_TLI_TLI_INDEX 3
-#define TRANS_SOCKET_UNIX_INDEX 4
-#define TRANS_SOCKET_LOCAL_INDEX 5
-#define TRANS_SOCKET_INET_INDEX 6
-#define TRANS_SOCKET_TCP_INDEX 7
-#define TRANS_DNET_INDEX 8
-#define TRANS_LOCAL_LOCAL_INDEX 9
-#define TRANS_LOCAL_PTS_INDEX 10
-#define TRANS_LOCAL_NAMED_INDEX 11
-/* 12 used to be ISC, but that's gone. */
-#define TRANS_LOCAL_SCO_INDEX 13
-#define TRANS_SOCKET_INET6_INDEX 14
-#define TRANS_LOCAL_PIPE_INDEX 15
-
-
-static
-Xtransport_table Xtransports[] = {
-#if defined(TCPCONN)
- { &TRANS(SocketTCPFuncs), TRANS_SOCKET_TCP_INDEX },
-#if defined(IPv6) && defined(AF_INET6)
- { &TRANS(SocketINET6Funcs), TRANS_SOCKET_INET6_INDEX },
-#endif /* IPv6 */
- { &TRANS(SocketINETFuncs), TRANS_SOCKET_INET_INDEX },
-#endif /* TCPCONN */
-#if defined(UNIXCONN)
-#if !defined(LOCALCONN)
- { &TRANS(SocketLocalFuncs), TRANS_SOCKET_LOCAL_INDEX },
-#endif /* !LOCALCONN */
- { &TRANS(SocketUNIXFuncs), TRANS_SOCKET_UNIX_INDEX },
-#endif /* UNIXCONN */
-#if defined(LOCALCONN)
- { &TRANS(LocalFuncs), TRANS_LOCAL_LOCAL_INDEX },
-#ifndef __sun
- { &TRANS(PTSFuncs), TRANS_LOCAL_PTS_INDEX },
-#endif /* __sun */
-#if defined(SVR4) || defined(__SVR4)
- { &TRANS(NAMEDFuncs), TRANS_LOCAL_NAMED_INDEX },
-#endif
-#ifdef __sun
- { &TRANS(PIPEFuncs), TRANS_LOCAL_PIPE_INDEX },
-#endif /* __sun */
-#if defined(__SCO__) || defined(__UNIXWARE__)
- { &TRANS(SCOFuncs), TRANS_LOCAL_SCO_INDEX },
-#endif /* __SCO__ || __UNIXWARE__ */
-#endif /* LOCALCONN */
-};
-
-#define NUMTRANS (sizeof(Xtransports)/sizeof(Xtransport_table))
-
-
-#ifdef WIN32
-#define ioctl ioctlsocket
-#endif
-
-
-
-/*
- * These are a few utility function used by the public interface functions.
- */
-
-void
-TRANS(FreeConnInfo) (XtransConnInfo ciptr)
-
-{
- prmsg (3,"FreeConnInfo(%p)\n", (void *) ciptr);
-
- if (ciptr->addr)
- free (ciptr->addr);
-
- if (ciptr->peeraddr)
- free (ciptr->peeraddr);
-
- if (ciptr->port)
- free (ciptr->port);
-
- free (ciptr);
-}
-
-
-#define PROTOBUFSIZE 20
-
-static Xtransport *
-TRANS(SelectTransport) (const char *protocol)
-
-{
- char protobuf[PROTOBUFSIZE];
- int i;
-
- prmsg (3,"SelectTransport(%s)\n", protocol);
-
- /*
- * Force Protocol to be lowercase as a way of doing
- * a case insensitive match.
- */
-
- strncpy (protobuf, protocol, PROTOBUFSIZE - 1);
- protobuf[PROTOBUFSIZE-1] = '\0';
-
- for (i = 0; i < PROTOBUFSIZE && protobuf[i] != '\0'; i++)
- if (isupper ((unsigned char)protobuf[i]))
- protobuf[i] = tolower ((unsigned char)protobuf[i]);
-
- /* Look at all of the configured protocols */
-
- for (i = 0; i < NUMTRANS; i++)
- {
- if (!strcmp (protobuf, Xtransports[i].transport->TransName))
- return Xtransports[i].transport;
- }
-
- return NULL;
-}
-
-#ifndef TEST_t
-static
-#endif /* TEST_t */
-int
-TRANS(ParseAddress) (const char *address,
- char **protocol, char **host, char **port)
-
-{
- /*
- * For the font library, the address is a string formatted
- * as "protocol/host:port[/catalogue]". Note that the catologue
- * is optional. At this time, the catologue info is ignored, but
- * we have to parse it anyways.
- *
- * Other than fontlib, the address is a string formatted
- * as "protocol/host:port".
- *
- * If the protocol part is missing, then assume TCP.
- * If the protocol part and host part are missing, then assume local.
- * If a "::" is found then assume DNET.
- */
-
- char *mybuf, *tmpptr;
- const char *_protocol;
- char *_host, *_port;
- char hostnamebuf[256];
- int _host_len;
-
- prmsg (3,"ParseAddress(%s)\n", address);
-
- /* Copy the string so it can be changed */
-
- tmpptr = mybuf = strdup (address);
-
- /* Parse the string to get each component */
-
- /* Get the protocol part */
-
- _protocol = mybuf;
-
-
- if ( ((mybuf = strchr (mybuf,'/')) == NULL) &&
- ((mybuf = strrchr (tmpptr,':')) == NULL) )
- {
- /* address is in a bad format */
- *protocol = NULL;
- *host = NULL;
- *port = NULL;
- free (tmpptr);
- return 0;
- }
-
- if (*mybuf == ':')
- {
- /*
- * If there is a hostname, then assume tcp, otherwise
- * it must be local.
- */
- if (mybuf == tmpptr)
- {
- /* There is neither a protocol or host specified */
- _protocol = "local";
- }
- else
- {
- /* There is a hostname specified */
- _protocol = "tcp";
- mybuf = tmpptr; /* reset to the begining of the host ptr */
- }
- }
- else
- {
- /* *mybuf == '/' */
-
- *mybuf ++= '\0'; /* put a null at the end of the protocol */
-
- if (strlen(_protocol) == 0)
- {
- /*
- * If there is a hostname, then assume tcp, otherwise
- * it must be local.
- */
- if (*mybuf != ':')
- _protocol = "tcp";
- else
- _protocol = "local";
- }
- }
-
- /* Get the host part */
-
- _host = mybuf;
-
- if ((mybuf = strrchr (mybuf,':')) == NULL)
- {
- *protocol = NULL;
- *host = NULL;
- *port = NULL;
- free (tmpptr);
- return 0;
- }
-
- *mybuf ++= '\0';
-
- _host_len = strlen(_host);
- if (_host_len == 0)
- {
- TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf));
- _host = hostnamebuf;
- }
-#if defined(IPv6) && defined(AF_INET6)
- /* hostname in IPv6 [numeric_addr]:0 form? */
- else if ( (_host_len > 3) &&
- ((strcmp(_protocol, "tcp") == 0) || (strcmp(_protocol, "inet6") == 0))
- && (*_host == '[') && (*(_host + _host_len - 1) == ']') ) {
- struct sockaddr_in6 sin6;
-
- *(_host + _host_len - 1) = '\0';
-
- /* Verify address is valid IPv6 numeric form */
- if (inet_pton(AF_INET6, _host + 1, &sin6) == 1) {
- /* It is. Use it as such. */
- _host++;
- _protocol = "inet6";
- } else {
- /* It's not, restore it just in case some other code can use it. */
- *(_host + _host_len - 1) = ']';
- }
- }
-#endif
-
-
- /* Get the port */
-
- _port = mybuf;
-
-#if defined(FONT_t) || defined(FS_t)
- /*
- * Is there an optional catalogue list?
- */
-
- if ((mybuf = strchr (mybuf,'/')) != NULL)
- *mybuf ++= '\0';
-
- /*
- * The rest, if any, is the (currently unused) catalogue list.
- *
- * _catalogue = mybuf;
- */
-#endif
-
-#ifdef HAVE_LAUNCHD
- /* launchd sockets will look like 'local//tmp/launch-XgkNns/:0' */
- if(address != NULL && strlen(address)>8 && (!strncmp(address,"local//",7))) {
- _protocol="local";
- _host="";
- _port=address+6;
- }
-#endif
-
- /*
- * Now that we have all of the components, allocate new
- * string space for them.
- */
-
- if ((*protocol = strdup (_protocol)) == NULL)
- {
- /* Malloc failed */
- *port = NULL;
- *host = NULL;
- *protocol = NULL;
- free (tmpptr);
- return 0;
- }
-
- if ((*host = strdup (_host)) == NULL)
- {
- /* Malloc failed */
- *port = NULL;
- *host = NULL;
- free (*protocol);
- *protocol = NULL;
- free (tmpptr);
- return 0;
- }
-
- if ((*port = strdup (_port)) == NULL)
- {
- /* Malloc failed */
- *port = NULL;
- free (*host);
- *host = NULL;
- free (*protocol);
- *protocol = NULL;
- free (tmpptr);
- return 0;
- }
-
- free (tmpptr);
-
- return 1;
-}
-
-
-/*
- * TRANS(Open) does all of the real work opening a connection. The only
- * funny part about this is the type parameter which is used to decide which
- * type of open to perform.
- */
-
-static XtransConnInfo
-TRANS(Open) (int type, const char *address)
-
-{
- char *protocol = NULL, *host = NULL, *port = NULL;
- XtransConnInfo ciptr = NULL;
- Xtransport *thistrans;
-
- prmsg (2,"Open(%d,%s)\n", type, address);
-
-#if defined(WIN32) && defined(TCPCONN)
- if (TRANS(WSAStartup)())
- {
- prmsg (1,"Open: WSAStartup failed\n");
- return NULL;
- }
-#endif
-
- /* Parse the Address */
-
- if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
- {
- prmsg (1,"Open: Unable to Parse address %s\n", address);
- return NULL;
- }
-
- /* Determine the transport type */
-
- if ((thistrans = TRANS(SelectTransport) (protocol)) == NULL)
- {
- prmsg (1,"Open: Unable to find transport for %s\n",
- protocol);
-
- free (protocol);
- free (host);
- free (port);
- return NULL;
- }
-
- /* Open the transport */
-
- switch (type)
- {
- case XTRANS_OPEN_COTS_CLIENT:
-#ifdef TRANS_CLIENT
- ciptr = thistrans->OpenCOTSClient(thistrans, protocol, host, port);
-#endif /* TRANS_CLIENT */
- break;
- case XTRANS_OPEN_COTS_SERVER:
-#ifdef TRANS_SERVER
- ciptr = thistrans->OpenCOTSServer(thistrans, protocol, host, port);
-#endif /* TRANS_SERVER */
- break;
- default:
- prmsg (1,"Open: Unknown Open type %d\n", type);
- }
-
- if (ciptr == NULL)
- {
- if (!(thistrans->flags & TRANS_DISABLED))
- {
- prmsg (1,"Open: transport open failed for %s/%s:%s\n",
- protocol, host, port);
- }
- free (protocol);
- free (host);
- free (port);
- return NULL;
- }
-
- ciptr->transptr = thistrans;
- ciptr->port = port; /* We need this for TRANS(Reopen) */
-
- free (protocol);
- free (host);
-
- return ciptr;
-}
-
-
-#ifdef TRANS_REOPEN
-
-/*
- * We might want to create an XtransConnInfo object based on a previously
- * opened connection. For example, the font server may clone itself and
- * pass file descriptors to the parent.
- */
-
-static XtransConnInfo
-TRANS(Reopen) (int type, int trans_id, int fd, const char *port)
-
-{
- XtransConnInfo ciptr = NULL;
- Xtransport *thistrans = NULL;
- char *save_port;
- int i;
-
- prmsg (2,"Reopen(%d,%d,%s)\n", trans_id, fd, port);
-
- /* Determine the transport type */
-
- for (i = 0; i < NUMTRANS; i++)
- if (Xtransports[i].transport_id == trans_id)
- {
- thistrans = Xtransports[i].transport;
- break;
- }
-
- if (thistrans == NULL)
- {
- prmsg (1,"Reopen: Unable to find transport id %d\n",
- trans_id);
-
- return NULL;
- }
-
- if ((save_port = strdup (port)) == NULL)
- {
- prmsg (1,"Reopen: Unable to malloc port string\n");
-
- return NULL;
- }
-
- /* Get a new XtransConnInfo object */
-
- switch (type)
- {
- case XTRANS_OPEN_COTS_SERVER:
- ciptr = thistrans->ReopenCOTSServer(thistrans, fd, port);
- break;
- default:
- prmsg (1,"Reopen: Bad Open type %d\n", type);
- }
-
- if (ciptr == NULL)
- {
- prmsg (1,"Reopen: transport open failed\n");
- free (save_port);
- return NULL;
- }
-
- ciptr->transptr = thistrans;
- ciptr->port = save_port;
-
- return ciptr;
-}
-
-#endif /* TRANS_REOPEN */
-
-
-
-/*
- * These are the public interfaces to this Transport interface.
- * These are the only functions that should have knowledge of the transport
- * table.
- */
-
-#ifdef TRANS_CLIENT
-
-XtransConnInfo
-TRANS(OpenCOTSClient) (const char *address)
-
-{
- prmsg (2,"OpenCOTSClient(%s)\n", address);
- return TRANS(Open) (XTRANS_OPEN_COTS_CLIENT, address);
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-XtransConnInfo
-TRANS(OpenCOTSServer) (const char *address)
-
-{
- prmsg (2,"OpenCOTSServer(%s)\n", address);
- return TRANS(Open) (XTRANS_OPEN_COTS_SERVER, address);
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_REOPEN
-
-XtransConnInfo
-TRANS(ReopenCOTSServer) (int trans_id, int fd, const char *port)
-
-{
- prmsg (2,"ReopenCOTSServer(%d, %d, %s)\n", trans_id, fd, port);
- return TRANS(Reopen) (XTRANS_OPEN_COTS_SERVER, trans_id, fd, port);
-}
-
-int
-TRANS(GetReopenInfo) (XtransConnInfo ciptr,
- int *trans_id, int *fd, char **port)
-
-{
- int i;
-
- for (i = 0; i < NUMTRANS; i++)
- if (Xtransports[i].transport == ciptr->transptr)
- {
- *trans_id = Xtransports[i].transport_id;
- *fd = ciptr->fd;
-
- if ((*port = strdup (ciptr->port)) == NULL)
- return 0;
- else
- return 1;
- }
-
- return 0;
-}
-
-#endif /* TRANS_REOPEN */
-
-
-int
-TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
-
-{
- int fd = ciptr->fd;
- int ret = 0;
-
- prmsg (2,"SetOption(%d,%d,%d)\n", fd, option, arg);
-
- /*
- * For now, all transport type use the same stuff for setting options.
- * As long as this is true, we can put the common code here. Once a more
- * complicated transport such as shared memory or an OSI implementation
- * that uses the session and application libraries is implemented, this
- * code may have to move to a transport dependent function.
- *
- * ret = ciptr->transptr->SetOption (ciptr, option, arg);
- */
-
- switch (option)
- {
- case TRANS_NONBLOCKING:
- switch (arg)
- {
- case 0:
- /* Set to blocking mode */
- break;
- case 1: /* Set to non-blocking mode */
-
-#if defined(O_NONBLOCK) && !defined(SCO325)
- ret = fcntl (fd, F_GETFL, 0);
- if (ret != -1)
- ret = fcntl (fd, F_SETFL, ret | O_NONBLOCK);
-#else
-#ifdef FIOSNBIO
- {
- int arg;
- arg = 1;
- ret = ioctl (fd, FIOSNBIO, &arg);
- }
-#else
-#if defined(WIN32)
- {
-#ifdef WIN32
- u_long arg;
-#else
- int arg;
-#endif
- arg = 1;
-/* IBM TCP/IP understands this option too well: it causes TRANS(Read) to fail
- * eventually with EWOULDBLOCK */
- ret = ioctl (fd, FIONBIO, &arg);
- }
-#else
- ret = fcntl (fd, F_GETFL, 0);
-#ifdef FNDELAY
- ret = fcntl (fd, F_SETFL, ret | FNDELAY);
-#else
- ret = fcntl (fd, F_SETFL, ret | O_NDELAY);
-#endif
-#endif /* WIN32 */
-#endif /* FIOSNBIO */
-#endif /* O_NONBLOCK */
- break;
- default:
- /* Unknown option */
- break;
- }
- break;
- case TRANS_CLOSEONEXEC:
-#ifdef F_SETFD
-#ifdef FD_CLOEXEC
- ret = fcntl (fd, F_SETFD, FD_CLOEXEC);
-#else
- ret = fcntl (fd, F_SETFD, 1);
-#endif /* FD_CLOEXEC */
-#endif /* F_SETFD */
- break;
- }
-
- return ret;
-}
-
-#ifdef TRANS_SERVER
-
-int
-TRANS(CreateListener) (XtransConnInfo ciptr, const char *port, unsigned int flags)
-
-{
- return ciptr->transptr->CreateListener (ciptr, port, flags);
-}
-
-int
-TRANS(Received) (const char * protocol)
-
-{
- Xtransport *trans;
- int i = 0, ret = 0;
-
- prmsg (5, "Received(%s)\n", protocol);
-
- if ((trans = TRANS(SelectTransport)(protocol)) == NULL)
- {
- prmsg (1,"Received: unable to find transport: %s\n",
- protocol);
-
- return -1;
- }
- if (trans->flags & TRANS_ALIAS) {
- if (trans->nolisten)
- while (trans->nolisten[i]) {
- ret |= TRANS(Received)(trans->nolisten[i]);
- i++;
- }
- }
-
- trans->flags |= TRANS_RECEIVED;
- return ret;
-}
-
-int
-TRANS(NoListen) (const char * protocol)
-
-{
- Xtransport *trans;
- int i = 0, ret = 0;
-
- if ((trans = TRANS(SelectTransport)(protocol)) == NULL)
- {
- prmsg (1,"TransNoListen: unable to find transport: %s\n",
- protocol);
-
- return -1;
- }
- if (trans->flags & TRANS_ALIAS) {
- if (trans->nolisten)
- while (trans->nolisten[i]) {
- ret |= TRANS(NoListen)(trans->nolisten[i]);
- i++;
- }
- }
-
- trans->flags |= TRANS_NOLISTEN;
- return ret;
-}
-
-int
-TRANS(Listen) (const char * protocol)
-{
- Xtransport *trans;
- int i = 0, ret = 0;
-
- if ((trans = TRANS(SelectTransport)(protocol)) == NULL)
- {
- prmsg (1,"TransListen: unable to find transport: %s\n",
- protocol);
-
- return -1;
- }
- if (trans->flags & TRANS_ALIAS) {
- if (trans->nolisten)
- while (trans->nolisten[i]) {
- ret |= TRANS(Listen)(trans->nolisten[i]);
- i++;
- }
- }
-
- trans->flags &= ~TRANS_NOLISTEN;
- return ret;
-}
-
-int
-TRANS(IsListening) (const char * protocol)
-{
- Xtransport *trans;
-
- if ((trans = TRANS(SelectTransport)(protocol)) == NULL)
- {
- prmsg (1,"TransIsListening: unable to find transport: %s\n",
- protocol);
-
- return 0;
- }
-
- return !(trans->flags & TRANS_NOLISTEN);
-}
-
-int
-TRANS(ResetListener) (XtransConnInfo ciptr)
-
-{
- if (ciptr->transptr->ResetListener)
- return ciptr->transptr->ResetListener (ciptr);
- else
- return TRANS_RESET_NOOP;
-}
-
-
-XtransConnInfo
-TRANS(Accept) (XtransConnInfo ciptr, int *status)
-
-{
- XtransConnInfo newciptr;
-
- prmsg (2,"Accept(%d)\n", ciptr->fd);
-
- newciptr = ciptr->transptr->Accept (ciptr, status);
-
- if (newciptr)
- newciptr->transptr = ciptr->transptr;
-
- return newciptr;
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_CLIENT
-
-int
-TRANS(Connect) (XtransConnInfo ciptr, const char *address)
-
-{
- char *protocol;
- char *host;
- char *port;
- int ret;
-
- prmsg (2,"Connect(%d,%s)\n", ciptr->fd, address);
-
- if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
- {
- prmsg (1,"Connect: Unable to Parse address %s\n",
- address);
- return -1;
- }
-
-#ifdef HAVE_LAUNCHD
- if (!host) host=strdup("");
-#endif
-
- if (!port || !*port)
- {
- prmsg (1,"Connect: Missing port specification in %s\n",
- address);
- if (protocol) free (protocol);
- if (host) free (host);
- return -1;
- }
-
- ret = ciptr->transptr->Connect (ciptr, host, port);
-
- if (protocol) free (protocol);
- if (host) free (host);
- if (port) free (port);
-
- return ret;
-}
-
-#endif /* TRANS_CLIENT */
-
-
-int
-TRANS(BytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
-
-{
- return ciptr->transptr->BytesReadable (ciptr, pend);
-}
-
-int
-TRANS(Read) (XtransConnInfo ciptr, char *buf, int size)
-
-{
- return ciptr->transptr->Read (ciptr, buf, size);
-}
-
-int
-TRANS(Write) (XtransConnInfo ciptr, char *buf, int size)
-
-{
- return ciptr->transptr->Write (ciptr, buf, size);
-}
-
-int
-TRANS(Readv) (XtransConnInfo ciptr, struct iovec *buf, int size)
-
-{
- return ciptr->transptr->Readv (ciptr, buf, size);
-}
-
-int
-TRANS(Writev) (XtransConnInfo ciptr, struct iovec *buf, int size)
-
-{
- return ciptr->transptr->Writev (ciptr, buf, size);
-}
-
-#if XTRANS_SEND_FDS
-int
-TRANS(SendFd) (XtransConnInfo ciptr, int fd, int do_close)
-{
- return ciptr->transptr->SendFd(ciptr, fd, do_close);
-}
-
-int
-TRANS(RecvFd) (XtransConnInfo ciptr)
-{
- return ciptr->transptr->RecvFd(ciptr);
-}
-#endif
-
-int
-TRANS(Disconnect) (XtransConnInfo ciptr)
-
-{
- return ciptr->transptr->Disconnect (ciptr);
-}
-
-int
-TRANS(Close) (XtransConnInfo ciptr)
-
-{
- int ret;
-
- prmsg (2,"Close(%d)\n", ciptr->fd);
-
- ret = ciptr->transptr->Close (ciptr);
-
- TRANS(FreeConnInfo) (ciptr);
-
- return ret;
-}
-
-int
-TRANS(CloseForCloning) (XtransConnInfo ciptr)
-
-{
- int ret;
-
- prmsg (2,"CloseForCloning(%d)\n", ciptr->fd);
-
- ret = ciptr->transptr->CloseForCloning (ciptr);
-
- TRANS(FreeConnInfo) (ciptr);
-
- return ret;
-}
-
-int
-TRANS(IsLocal) (XtransConnInfo ciptr)
-
-{
- return (ciptr->family == AF_UNIX);
-}
-
-#ifdef NX_TRANS_SOCKET
-/* this is needed for pre-xcb X11 as we have in NX */
-int
-TRANS(GetMyAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp,
- Xtransaddr **addrp)
-
-{
- prmsg (2,"GetMyAddr(%d)\n", ciptr->fd);
-
- *familyp = ciptr->family;
- *addrlenp = ciptr->addrlen;
-
- if ((*addrp = (Xtransaddr *) malloc (ciptr->addrlen)) == NULL)
- {
- prmsg (1,"GetMyAddr: malloc failed\n");
- return -1;
- }
- memcpy(*addrp, ciptr->addr, ciptr->addrlen);
-
- return 0;
-}
-#endif
-
-int
-TRANS(GetPeerAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp,
- Xtransaddr **addrp)
-
-{
- prmsg (2,"GetPeerAddr(%d)\n", ciptr->fd);
-
- *familyp = ciptr->family;
- *addrlenp = ciptr->peeraddrlen;
-
- if ((*addrp = malloc (ciptr->peeraddrlen)) == NULL)
- {
- prmsg (1,"GetPeerAddr: malloc failed\n");
- return -1;
- }
- memcpy(*addrp, ciptr->peeraddr, ciptr->peeraddrlen);
-
- return 0;
-}
-
-
-int
-TRANS(GetConnectionNumber) (XtransConnInfo ciptr)
-
-{
- return ciptr->fd;
-}
-
-
-/*
- * These functions are really utility functions, but they require knowledge
- * of the internal data structures, so they have to be part of the Transport
- * Independant API.
- */
-
-#ifdef TRANS_SERVER
-
-static int
-complete_network_count (void)
-
-{
- int count = 0;
- int found_local = 0;
- int i;
-
- /*
- * For a complete network, we only need one LOCALCONN transport to work
- */
-
- for (i = 0; i < NUMTRANS; i++)
- {
- if (Xtransports[i].transport->flags & TRANS_ALIAS
- || Xtransports[i].transport->flags & TRANS_NOLISTEN)
- continue;
-
- if (Xtransports[i].transport->flags & TRANS_LOCAL)
- found_local = 1;
- else
- count++;
- }
-
- return (count + found_local);
-}
-
-
-static int
-receive_listening_fds(const char* port, XtransConnInfo* temp_ciptrs,
- int* count_ret)
-
-{
-#ifdef HAVE_SYSTEMD_DAEMON
- XtransConnInfo ciptr;
- int i, systemd_listen_fds;
-
- systemd_listen_fds = sd_listen_fds(1);
- if (systemd_listen_fds < 0)
- {
- prmsg (1, "receive_listening_fds: sd_listen_fds error: %s\n",
- strerror(-systemd_listen_fds));
- return -1;
- }
-
- for (i = 0; i < systemd_listen_fds && *count_ret < NUMTRANS; i++)
- {
- struct sockaddr_storage a;
- int ti;
- const char* tn;
- socklen_t al;
-
- al = sizeof(a);
- if (getsockname(i + SD_LISTEN_FDS_START, (struct sockaddr*)&a, &al) < 0) {
- prmsg (1, "receive_listening_fds: getsockname error: %s\n",
- strerror(errno));
- return -1;
- }
-
- switch (a.ss_family)
- {
- case AF_UNIX:
- ti = TRANS_SOCKET_UNIX_INDEX;
- if (*((struct sockaddr_un*)&a)->sun_path == '\0' &&
- al > sizeof(sa_family_t))
- tn = "local";
- else
- tn = "unix";
- break;
- case AF_INET:
- ti = TRANS_SOCKET_INET_INDEX;
- tn = "inet";
- break;
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6:
- ti = TRANS_SOCKET_INET6_INDEX;
- tn = "inet6";
- break;
-#endif /* IPv6 */
- default:
- prmsg (1, "receive_listening_fds:"
- "Got unknown socket address family\n");
- return -1;
- }
-
- ciptr = TRANS(ReopenCOTSServer)(ti, i + SD_LISTEN_FDS_START, port);
- if (!ciptr)
- {
- prmsg (1, "receive_listening_fds:"
- "Got NULL while trying to reopen socket received from systemd.\n");
- return -1;
- }
-
- prmsg (5, "receive_listening_fds: received listener for %s, %d\n",
- tn, ciptr->fd);
- temp_ciptrs[(*count_ret)++] = ciptr;
- TRANS(Received)(tn);
- }
-#endif /* HAVE_SYSTEMD_DAEMON */
- return 0;
-}
-
-#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
-extern int xquartz_launchd_fd;
-#endif
-
-int
-TRANS(MakeAllCOTSServerListeners) (const char *port, int *partial,
- int *count_ret, XtransConnInfo **ciptrs_ret)
-
-{
- char buffer[256]; /* ??? What size ?? */
- XtransConnInfo ciptr, temp_ciptrs[NUMTRANS];
- int status, i, j;
-
-#if defined(IPv6) && defined(AF_INET6)
- int ipv6_succ = 0;
-#endif
- prmsg (2,"MakeAllCOTSServerListeners(%s,%p)\n",
- port ? port : "NULL", (void *) ciptrs_ret);
-
- *count_ret = 0;
-
-#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
- fprintf(stderr, "Launchd socket fd: %d\n", xquartz_launchd_fd);
- if(xquartz_launchd_fd != -1) {
- if((ciptr = TRANS(ReopenCOTSServer(TRANS_SOCKET_LOCAL_INDEX,
- xquartz_launchd_fd, getenv("DISPLAY"))))==NULL)
- fprintf(stderr,"Got NULL while trying to Reopen launchd port\n");
- else
- temp_ciptrs[(*count_ret)++] = ciptr;
- }
-#endif
-
- if (receive_listening_fds(port, temp_ciptrs, count_ret) < 0)
- return -1;
-
- for (i = 0; i < NUMTRANS; i++)
- {
- Xtransport *trans = Xtransports[i].transport;
- unsigned int flags = 0;
-
- if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN ||
- trans->flags&TRANS_RECEIVED)
- continue;
-
- snprintf(buffer, sizeof(buffer), "%s/:%s",
- trans->TransName, port ? port : "");
-
- prmsg (5,"MakeAllCOTSServerListeners: opening %s\n",
- buffer);
-
- if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL)
- {
- if (trans->flags & TRANS_DISABLED)
- continue;
-
- prmsg (1,
- "MakeAllCOTSServerListeners: failed to open listener for %s\n",
- trans->TransName);
- continue;
- }
-#if defined(IPv6) && defined(AF_INET6)
- if ((Xtransports[i].transport_id == TRANS_SOCKET_INET_INDEX
- && ipv6_succ))
- flags |= ADDR_IN_USE_ALLOWED;
-#endif
-
- if ((status = TRANS(CreateListener (ciptr, port, flags))) < 0)
- {
- if (status == TRANS_ADDR_IN_USE)
- {
- /*
- * We failed to bind to the specified address because the
- * address is in use. It must be that a server is already
- * running at this address, and this function should fail.
- */
-
- prmsg (1,
- "MakeAllCOTSServerListeners: server already running\n");
-
- for (j = 0; j < *count_ret; j++)
- TRANS(Close) (temp_ciptrs[j]);
-
- *count_ret = 0;
- *ciptrs_ret = NULL;
- *partial = 0;
- return -1;
- }
- else
- {
- prmsg (1,
- "MakeAllCOTSServerListeners: failed to create listener for %s\n",
- trans->TransName);
-
- continue;
- }
- }
-
-#if defined(IPv6) && defined(AF_INET6)
- if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX)
- ipv6_succ = 1;
-#endif
-
- prmsg (5,
- "MakeAllCOTSServerListeners: opened listener for %s, %d\n",
- trans->TransName, ciptr->fd);
-
- temp_ciptrs[*count_ret] = ciptr;
- (*count_ret)++;
- }
-
- *partial = (*count_ret < complete_network_count());
-
- prmsg (5,
- "MakeAllCOTSServerListeners: partial=%d, actual=%d, complete=%d \n",
- *partial, *count_ret, complete_network_count());
-
- if (*count_ret > 0)
- {
- if ((*ciptrs_ret = malloc (
- *count_ret * sizeof (XtransConnInfo))) == NULL)
- {
- return -1;
- }
-
- for (i = 0; i < *count_ret; i++)
- {
- (*ciptrs_ret)[i] = temp_ciptrs[i];
- }
- }
- else
- *ciptrs_ret = NULL;
-
- return 0;
-}
-
-#endif /* TRANS_SERVER */
-
-
-
-/*
- * These routines are not part of the X Transport Interface, but they
- * may be used by it.
- */
-
-
-#ifdef WIN32
-
-/*
- * emulate readv
- */
-
-static int TRANS(ReadV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt)
-
-{
- int i, len, total;
- char *base;
-
- ESET(0);
- for (i = 0, total = 0; i < iovcnt; i++, iov++) {
- len = iov->iov_len;
- base = iov->iov_base;
- while (len > 0) {
- register int nbytes;
- nbytes = TRANS(Read) (ciptr, base, len);
- if (nbytes < 0 && total == 0) return -1;
- if (nbytes <= 0) return total;
- ESET(0);
- len -= nbytes;
- total += nbytes;
- base += nbytes;
- }
- }
- return total;
-}
-
-
-/*
- * emulate writev
- */
-
-static int TRANS(WriteV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt)
-
-{
- int i, len, total;
- char *base;
-
- ESET(0);
- for (i = 0, total = 0; i < iovcnt; i++, iov++) {
- len = iov->iov_len;
- base = iov->iov_base;
- while (len > 0) {
- register int nbytes;
- nbytes = TRANS(Write) (ciptr, base, len);
- if (nbytes < 0 && total == 0) return -1;
- if (nbytes <= 0) return total;
- ESET(0);
- len -= nbytes;
- total += nbytes;
- base += nbytes;
- }
- }
- return total;
-}
-
-#endif /* WIN32 */
-
-
-#if defined(_POSIX_SOURCE) || defined(USG) || defined(SVR4) || defined(__SVR4) || defined(__SCO__)
-#ifndef NEED_UTSNAME
-#define NEED_UTSNAME
-#endif
-#include <sys/utsname.h>
-#endif
-
-/*
- * TRANS(GetHostname) - similar to gethostname but allows special processing.
- */
-
-int TRANS(GetHostname) (char *buf, int maxlen)
-
-{
- int len;
-
-#ifdef NEED_UTSNAME
- struct utsname name;
-
- uname (&name);
- len = strlen (name.nodename);
- if (len >= maxlen) len = maxlen - 1;
- strncpy (buf, name.nodename, len);
- buf[len] = '\0';
-#else
- buf[0] = '\0';
- (void) gethostname (buf, maxlen);
- buf [maxlen - 1] = '\0';
- len = strlen(buf);
-#endif /* NEED_UTSNAME */
- return len;
-}
diff --git a/nx-X11/lib/xtrans/Xtrans.h b/nx-X11/lib/xtrans/Xtrans.h
deleted file mode 100644
index 54b2a1425..000000000
--- a/nx-X11/lib/xtrans/Xtrans.h
+++ /dev/null
@@ -1,426 +0,0 @@
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _XTRANS_H_
-#define _XTRANS_H_
-
-#include <nx-X11/Xfuncproto.h>
-#include <nx-X11/Xos.h>
-#include <nx-X11/Xmd.h>
-
-#ifndef WIN32
-#include <sys/socket.h>
-#endif
-
-#ifdef __clang__
-/* Not all clients make use of all provided statics */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-function"
-#endif
-
-/*
- * Set the functions names according to where this code is being compiled.
- */
-
-#ifdef X11_t
-#define TRANS(func) _X11Trans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_X11Trans";
-#endif
-#endif /* X11_t */
-
-#ifdef XSERV_t
-#define TRANS(func) _XSERVTrans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_XSERVTrans";
-#endif
-#define X11_t
-#endif /* XSERV_t */
-
-#ifdef XIM_t
-#define TRANS(func) _XimXTrans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_XimTrans";
-#endif
-#endif /* XIM_t */
-
-#ifdef FS_t
-#define TRANS(func) _FSTrans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_FSTrans";
-#endif
-#endif /* FS_t */
-
-#ifdef FONT_t
-#define TRANS(func) _FontTrans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_FontTrans";
-#endif
-#endif /* FONT_t */
-
-#ifdef ICE_t
-#define TRANS(func) _IceTrans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_IceTrans";
-#endif
-#endif /* ICE_t */
-
-#if !defined(TRANS)
-#define TRANS(func) _XTrans##func
-#ifdef XTRANSDEBUG
-static const char *__xtransname = "_XTrans";
-#endif
-#endif /* !TRANS */
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-/*
- * Create a single address structure that can be used wherever
- * an address structure is needed. struct sockaddr is not big enough
- * to hold a sockadd_un, so we create this definition to have a single
- * structure that is big enough for all the structures we might need.
- *
- * This structure needs to be independent of the socket/TLI interface used.
- */
-
-#if defined(IPv6) && defined(AF_INET6)
-typedef struct sockaddr_storage Xtransaddr;
-#else
-#define XTRANS_MAX_ADDR_LEN 128 /* large enough to hold sun_path */
-
-typedef struct {
- unsigned char addr[XTRANS_MAX_ADDR_LEN];
-} Xtransaddr;
-#endif
-
-#ifdef LONG64
-typedef int BytesReadable_t;
-#else
-typedef long BytesReadable_t;
-#endif
-
-
-#if defined(WIN32) || defined(USG)
-
-/*
- * TRANS(Readv) and TRANS(Writev) use struct iovec, normally found
- * in Berkeley systems in <sys/uio.h>. See the readv(2) and writev(2)
- * manual pages for details.
- */
-
-struct iovec {
- caddr_t iov_base;
- int iov_len;
-};
-
-#else
-#include <sys/uio.h>
-#endif
-
-typedef struct _XtransConnInfo *XtransConnInfo;
-
-
-/*
- * Transport Option definitions
- */
-
-#define TRANS_NONBLOCKING 1
-#define TRANS_CLOSEONEXEC 2
-
-
-/*
- * Return values of Connect (0 is success)
- */
-
-#define TRANS_CONNECT_FAILED -1
-#define TRANS_TRY_CONNECT_AGAIN -2
-#define TRANS_IN_PROGRESS -3
-
-
-/*
- * Return values of CreateListener (0 is success)
- */
-
-#define TRANS_CREATE_LISTENER_FAILED -1
-#define TRANS_ADDR_IN_USE -2
-
-
-/*
- * Return values of Accept (0 is success)
- */
-
-#define TRANS_ACCEPT_BAD_MALLOC -1
-#define TRANS_ACCEPT_FAILED -2
-#define TRANS_ACCEPT_MISC_ERROR -3
-
-
-/*
- * ResetListener return values
- */
-
-#define TRANS_RESET_NOOP 1
-#define TRANS_RESET_NEW_FD 2
-#define TRANS_RESET_FAILURE 3
-
-
-/*
- * Function prototypes for the exposed interface
- */
-
-void TRANS(FreeConnInfo) (
- XtransConnInfo /* ciptr */
-);
-
-#ifdef TRANS_CLIENT
-
-XtransConnInfo TRANS(OpenCOTSClient)(
- const char * /* address */
-);
-
-#endif /* TRANS_CLIENT */
-
-#ifdef TRANS_SERVER
-
-XtransConnInfo TRANS(OpenCOTSServer)(
- const char * /* address */
-);
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_REOPEN
-
-XtransConnInfo TRANS(ReopenCOTSServer)(
- int, /* trans_id */
- int, /* fd */
- const char * /* port */
-);
-
-int TRANS(GetReopenInfo)(
- XtransConnInfo, /* ciptr */
- int *, /* trans_id */
- int *, /* fd */
- char ** /* port */
-);
-
-#endif /* TRANS_REOPEN */
-
-
-int TRANS(SetOption)(
- XtransConnInfo, /* ciptr */
- int, /* option */
- int /* arg */
-);
-
-#ifdef TRANS_SERVER
-
-int TRANS(CreateListener)(
- XtransConnInfo, /* ciptr */
- const char *, /* port */
- unsigned int /* flags */
-);
-
-int TRANS(Received) (
- const char* /* protocol*/
-);
-
-int TRANS(NoListen) (
- const char* /* protocol*/
-);
-
-int TRANS(Listen) (
- const char* /* protocol*/
-);
-
-int TRANS(IsListening) (
- const char* /* protocol*/
-);
-
-int TRANS(ResetListener)(
- XtransConnInfo /* ciptr */
-);
-
-XtransConnInfo TRANS(Accept)(
- XtransConnInfo, /* ciptr */
- int * /* status */
-);
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_CLIENT
-
-int TRANS(Connect)(
- XtransConnInfo, /* ciptr */
- const char * /* address */
-);
-
-#endif /* TRANS_CLIENT */
-
-int TRANS(BytesReadable)(
- XtransConnInfo, /* ciptr */
- BytesReadable_t * /* pend */
-);
-
-int TRANS(Read)(
- XtransConnInfo, /* ciptr */
- char *, /* buf */
- int /* size */
-);
-
-int TRANS(Write)(
- XtransConnInfo, /* ciptr */
- char *, /* buf */
- int /* size */
-);
-
-int TRANS(Readv)(
- XtransConnInfo, /* ciptr */
- struct iovec *, /* buf */
- int /* size */
-);
-
-int TRANS(Writev)(
- XtransConnInfo, /* ciptr */
- struct iovec *, /* buf */
- int /* size */
-);
-
-int TRANS(SendFd) (XtransConnInfo ciptr, int fd, int do_close);
-
-int TRANS(RecvFd) (XtransConnInfo ciptr);
-
-int TRANS(Disconnect)(
- XtransConnInfo /* ciptr */
-);
-
-int TRANS(Close)(
- XtransConnInfo /* ciptr */
-);
-
-int TRANS(CloseForCloning)(
- XtransConnInfo /* ciptr */
-);
-
-int TRANS(IsLocal)(
- XtransConnInfo /* ciptr */
-);
-
-#ifdef NX_TRANS_SOCKET
-/* needed for pre-xcb libX11 as we have in NX */
-int TRANS(GetMyAddr)(
- XtransConnInfo, /* ciptr */
- int *, /* familyp */
- int *, /* addrlenp */
- Xtransaddr ** /* addrp */
-);
-#endif
-
-int TRANS(GetPeerAddr)(
- XtransConnInfo, /* ciptr */
- int *, /* familyp */
- int *, /* addrlenp */
- Xtransaddr ** /* addrp */
-);
-
-int TRANS(GetConnectionNumber)(
- XtransConnInfo /* ciptr */
-);
-
-#ifdef TRANS_SERVER
-
-int TRANS(MakeAllCOTSServerListeners)(
- const char *, /* port */
- int *, /* partial */
- int *, /* count_ret */
- XtransConnInfo ** /* ciptrs_ret */
-);
-
-#endif /* TRANS_SERVER */
-
-
-/*
- * Function Prototypes for Utility Functions.
- */
-
-#ifdef X11_t
-
-int TRANS(ConvertAddress)(
- int *, /* familyp */
- int *, /* addrlenp */
- Xtransaddr ** /* addrp */
-);
-
-#endif /* X11_t */
-
-#ifdef ICE_t
-
-char *
-TRANS(GetMyNetworkId)(
- XtransConnInfo /* ciptr */
-);
-
-char *
-TRANS(GetPeerNetworkId)(
- XtransConnInfo /* ciptr */
-);
-
-#endif /* ICE_t */
-
-int
-TRANS(GetHostname) (
- char * /* buf */,
- int /* maxlen */
-);
-
-#if defined(WIN32) && defined(TCPCONN)
-int TRANS(WSAStartup)();
-#endif
-
-#endif /* _XTRANS_H_ */
diff --git a/nx-X11/lib/xtrans/Xtransint.h b/nx-X11/lib/xtrans/Xtransint.h
deleted file mode 100644
index f7e07687b..000000000
--- a/nx-X11/lib/xtrans/Xtransint.h
+++ /dev/null
@@ -1,433 +0,0 @@
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _XTRANSINT_H_
-#define _XTRANSINT_H_
-
-/*
- * XTRANSDEBUG will enable the PRMSG() macros used in the X Transport
- * Interface code. Each use of the PRMSG macro has a level associated with
- * it. XTRANSDEBUG is defined to be a level. If the invocation level is =<
- * the value of XTRANSDEBUG, then the message will be printed out to stderr.
- * Recommended levels are:
- *
- * XTRANSDEBUG=1 Error messages
- * XTRANSDEBUG=2 API Function Tracing
- * XTRANSDEBUG=3 All Function Tracing
- * XTRANSDEBUG=4 printing of intermediate values
- * XTRANSDEBUG=5 really detailed stuff
-#define XTRANSDEBUG 2
- *
- * Defining XTRANSDEBUGTIMESTAMP will cause printing timestamps with each
- * message.
- */
-
-#if !defined(XTRANSDEBUG) && defined(XTRANS_TRANSPORT_C)
-# define XTRANSDEBUG 1
-#endif
-
-#ifdef WIN32
-# define _WILLWINSOCK_
-#endif
-
-#include "Xtrans.h"
-
-#ifndef _X_UNUSED /* Defined in Xfuncproto.h in xproto >= 7.0.22 */
-# define _X_UNUSED /* */
-#endif
-
-#ifdef XTRANSDEBUG
-# include <stdio.h>
-#endif /* XTRANSDEBUG */
-
-#include <errno.h>
-
-#ifndef WIN32
-# include <sys/socket.h>
-# include <netinet/in.h>
-# include <arpa/inet.h>
-
-/*
- * Moved the setting of NEED_UTSNAME to this header file from Xtrans.c,
- * to avoid a race condition. JKJ (6/5/97)
- */
-
-# if defined(_POSIX_SOURCE) || defined(USG) || defined(SVR4) || defined(__SVR4) || defined(__SCO__)
-# ifndef NEED_UTSNAME
-# define NEED_UTSNAME
-# endif
-# include <sys/utsname.h>
-# endif
-
-# define ESET(val) errno = val
-# define EGET() errno
-
-#else /* WIN32 */
-
-# include <limits.h> /* for USHRT_MAX */
-
-# define ESET(val) WSASetLastError(val)
-# define EGET() WSAGetLastError()
-
-#endif /* WIN32 */
-
-#include <stddef.h>
-
-#ifdef X11_t
-#define X_TCP_PORT 6000
-#endif
-
-#if XTRANS_SEND_FDS
-
-struct _XtransConnFd {
- struct _XtransConnFd *next;
- int fd;
- int do_close;
-};
-
-#endif
-
-struct _XtransConnInfo {
- struct _Xtransport *transptr;
- int index;
- char *priv;
- int flags;
- int fd;
- char *port;
- int family;
- char *addr;
- int addrlen;
- char *peeraddr;
- int peeraddrlen;
- struct _XtransConnFd *recv_fds;
- struct _XtransConnFd *send_fds;
-};
-
-#define XTRANS_OPEN_COTS_CLIENT 1
-#define XTRANS_OPEN_COTS_SERVER 2
-
-typedef struct _Xtransport {
- const char *TransName;
- int flags;
-
-#ifdef TRANS_CLIENT
-
- XtransConnInfo (*OpenCOTSClient)(
- struct _Xtransport *, /* transport */
- const char *, /* protocol */
- const char *, /* host */
- const char * /* port */
- );
-
-#endif /* TRANS_CLIENT */
-
-#ifdef TRANS_SERVER
- const char ** nolisten;
- XtransConnInfo (*OpenCOTSServer)(
- struct _Xtransport *, /* transport */
- const char *, /* protocol */
- const char *, /* host */
- const char * /* port */
- );
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_REOPEN
-
- XtransConnInfo (*ReopenCOTSServer)(
- struct _Xtransport *, /* transport */
- int, /* fd */
- const char * /* port */
- );
-
-#endif /* TRANS_REOPEN */
-
-
- int (*SetOption)(
- XtransConnInfo, /* connection */
- int, /* option */
- int /* arg */
- );
-
-#ifdef TRANS_SERVER
-/* Flags */
-# define ADDR_IN_USE_ALLOWED 1
-
- int (*CreateListener)(
- XtransConnInfo, /* connection */
- const char *, /* port */
- unsigned int /* flags */
- );
-
- int (*ResetListener)(
- XtransConnInfo /* connection */
- );
-
- XtransConnInfo (*Accept)(
- XtransConnInfo, /* connection */
- int * /* status */
- );
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_CLIENT
-
- int (*Connect)(
- XtransConnInfo, /* connection */
- const char *, /* host */
- const char * /* port */
- );
-
-#endif /* TRANS_CLIENT */
-
- int (*BytesReadable)(
- XtransConnInfo, /* connection */
- BytesReadable_t * /* pend */
- );
-
- int (*Read)(
- XtransConnInfo, /* connection */
- char *, /* buf */
- int /* size */
- );
-
- int (*Write)(
- XtransConnInfo, /* connection */
- char *, /* buf */
- int /* size */
- );
-
- int (*Readv)(
- XtransConnInfo, /* connection */
- struct iovec *, /* buf */
- int /* size */
- );
-
- int (*Writev)(
- XtransConnInfo, /* connection */
- struct iovec *, /* buf */
- int /* size */
- );
-
-#if XTRANS_SEND_FDS
- int (*SendFd)(
- XtransConnInfo, /* connection */
- int, /* fd */
- int /* do_close */
- );
-
- int (*RecvFd)(
- XtransConnInfo /* connection */
- );
-#endif
-
- int (*Disconnect)(
- XtransConnInfo /* connection */
- );
-
- int (*Close)(
- XtransConnInfo /* connection */
- );
-
- int (*CloseForCloning)(
- XtransConnInfo /* connection */
- );
-
-} Xtransport;
-
-
-typedef struct _Xtransport_table {
- Xtransport *transport;
- int transport_id;
-} Xtransport_table;
-
-
-/*
- * Flags for the flags member of Xtransport.
- */
-
-#define TRANS_ALIAS (1<<0) /* record is an alias, don't create server */
-#define TRANS_LOCAL (1<<1) /* local transport */
-#define TRANS_DISABLED (1<<2) /* Don't open this one */
-#define TRANS_NOLISTEN (1<<3) /* Don't listen on this one */
-#define TRANS_NOUNLINK (1<<4) /* Don't unlink transport endpoints */
-#define TRANS_ABSTRACT (1<<5) /* Use abstract sockets if available */
-#define TRANS_NOXAUTH (1<<6) /* Don't verify authentication (because it's secure some other way at the OS layer) */
-#define TRANS_RECEIVED (1<<7) /* The fd for this has already been opened by someone else. */
-
-/* Flags to preserve when setting others */
-#define TRANS_KEEPFLAGS (TRANS_NOUNLINK|TRANS_ABSTRACT)
-
-#ifdef XTRANS_TRANSPORT_C /* only provide static function prototypes when
- building the transport.c file that has them in */
-
-#ifdef __clang__
-/* Not all clients make use of all provided statics */
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wunused-function"
-#endif
-
-/*
- * readv() and writev() don't exist or don't work correctly on some
- * systems, so they may be emulated.
- */
-
-#ifdef WIN32
-
-#define READV(ciptr, iov, iovcnt) TRANS(ReadV)(ciptr, iov, iovcnt)
-
-static int TRANS(ReadV)(
- XtransConnInfo, /* ciptr */
- struct iovec *, /* iov */
- int /* iovcnt */
-);
-
-#else
-
-#define READV(ciptr, iov, iovcnt) readv(ciptr->fd, iov, iovcnt)
-
-#endif /* WIN32 */
-
-
-#ifdef WIN32
-
-#define WRITEV(ciptr, iov, iovcnt) TRANS(WriteV)(ciptr, iov, iovcnt)
-
-static int TRANS(WriteV)(
- XtransConnInfo, /* ciptr */
- struct iovec *, /* iov */
- int /* iovcnt */
-);
-
-#else
-
-#define WRITEV(ciptr, iov, iovcnt) writev(ciptr->fd, iov, iovcnt)
-
-#endif /* WIN32 */
-
-#if defined(X11_t)
-static int is_numeric (
- const char * /* str */
-);
-#endif
-
-#ifdef TRANS_SERVER
-static int trans_mkdir (
- const char *, /* path */
- int /* mode */
-);
-#endif
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif
-
-/*
- * Some XTRANSDEBUG stuff
- */
-
-#ifdef XTRANSDEBUG
-#include <stdarg.h>
-
-/*
- * The X server provides ErrorF() & VErrorF(), for other software that uses
- * xtrans, we provide our own simple versions.
- */
-# if defined(XSERV_t) && defined(TRANS_SERVER)
-# include "os.h"
-# else
-static inline void _X_ATTRIBUTE_PRINTF(1, 0)
-VErrorF(const char *f, va_list args)
-{
- vfprintf(stderr, f, args);
- fflush(stderr);
-}
-
-static inline void _X_ATTRIBUTE_PRINTF(1, 2)
-ErrorF(const char *f, ...)
-{
- va_list args;
-
- va_start(args, f);
- VErrorF(f, args);
- va_end(args);
-}
-# endif /* xserver */
-#endif /* XTRANSDEBUG */
-
-static inline void _X_ATTRIBUTE_PRINTF(2, 3)
-prmsg(int lvl, const char *f, ...)
-{
-#ifdef XTRANSDEBUG
- va_list args;
-
- va_start(args, f);
- if (lvl <= XTRANSDEBUG) {
- int saveerrno = errno;
-
- ErrorF("%s", __xtransname);
- VErrorF(f, args);
-
-# ifdef XTRANSDEBUGTIMESTAMP
- {
- struct timeval tp;
- gettimeofday(&tp, 0);
- ErrorF("timestamp (ms): %d\n",
- tp.tv_sec * 1000 + tp.tv_usec / 1000);
- }
-# endif
- errno = saveerrno;
- }
- va_end(args);
-#endif /* XTRANSDEBUG */
-}
-
-#endif /* XTRANS_TRANSPORT_C */
-
-#endif /* _XTRANSINT_H_ */
diff --git a/nx-X11/lib/xtrans/Xtranslcl.c b/nx-X11/lib/xtrans/Xtranslcl.c
deleted file mode 100644
index 7231d2a83..000000000
--- a/nx-X11/lib/xtrans/Xtranslcl.c
+++ /dev/null
@@ -1,2486 +0,0 @@
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- *
- * The connection code/ideas in lib/X and server/os for SVR4/Intel
- * environments was contributed by the following companies/groups:
- *
- * MetroLink Inc
- * NCR
- * Pittsburgh Powercomputing Corporation (PPc)/Quarterdeck Office Systems
- * SGCS
- * Unix System Laboratories (USL) / Novell
- * XFree86
- *
- * The goal is to have common connection code among all SVR4/Intel vendors.
- *
- * ALL THE ABOVE COMPANIES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
- * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
- * IN NO EVENT SHALL THESE COMPANIES * BE LIABLE FOR ANY SPECIAL, INDIRECT
- * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
- * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
- * OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <errno.h>
-#include <ctype.h>
-#include <sys/signal.h>
-#include <sys/ioctl.h>
-#include <sys/stat.h>
-#if defined(SVR4) || defined(__SVR4)
-#include <sys/filio.h>
-#endif
-#ifdef __sun
-# include <stropts.h>
-#else
-#include <sys/stropts.h>
-#endif
-#include <sys/wait.h>
-#include <sys/types.h>
-
-/*
- * The local transports should be treated the same as a UNIX domain socket
- * wrt authentication, etc. Because of this, we will use struct sockaddr_un
- * for the address format. This will simplify the code in other places like
- * The X Server.
- */
-
-#include <sys/socket.h>
-#ifndef X_NO_SYS_UN
-#include <sys/un.h>
-#endif
-
-
-/* Types of local connections supported:
- * - PTS
- * - named pipes
- * - SCO
- */
-#if !defined(__sun)
-# define LOCAL_TRANS_PTS
-#endif
-#if defined(SVR4) || defined(__SVR4)
-# define LOCAL_TRANS_NAMED
-#endif
-#if defined(__SCO__) || defined(__UNIXWARE__)
-# define LOCAL_TRANS_SCO
-#endif
-
-static int TRANS(LocalClose)(XtransConnInfo ciptr);
-
-/*
- * These functions actually implement the local connection mechanisms.
- */
-
-/* Type Not Supported */
-
-static int
-TRANS(OpenFail)(XtransConnInfo ciptr _X_UNUSED, const char *port _X_UNUSED)
-
-{
- return -1;
-}
-
-#ifdef TRANS_REOPEN
-
-static int
-TRANS(ReopenFail)(XtransConnInfo ciptr _X_UNUSED, int fd _X_UNUSED,
- const char *port _X_UNUSED)
-
-{
- return 0;
-}
-
-#endif /* TRANS_REOPEN */
-
-#if XTRANS_SEND_FDS
-static int
-TRANS(LocalRecvFdInvalid)(XtransConnInfo ciptr)
-{
- errno = EINVAL;
- return -1;
-}
-
-static int
-TRANS(LocalSendFdInvalid)(XtransConnInfo ciptr, int fd, int do_close)
-{
- errno = EINVAL;
- return -1;
-}
-#endif
-
-
-static int
-TRANS(FillAddrInfo)(XtransConnInfo ciptr,
- const char *sun_path, const char *peer_sun_path)
-
-{
- struct sockaddr_un *sunaddr;
- struct sockaddr_un *p_sunaddr;
-
- ciptr->family = AF_UNIX;
- ciptr->addrlen = sizeof (struct sockaddr_un);
-
- if ((sunaddr = malloc (ciptr->addrlen)) == NULL)
- {
- prmsg(1,"FillAddrInfo: failed to allocate memory for addr\n");
- return 0;
- }
-
- sunaddr->sun_family = AF_UNIX;
-
- if (strlen(sun_path) > sizeof(sunaddr->sun_path) - 1) {
- prmsg(1, "FillAddrInfo: path too long\n");
- free((char *) sunaddr);
- return 0;
- }
- strcpy (sunaddr->sun_path, sun_path);
-#if defined(BSD44SOCKETS)
- sunaddr->sun_len = strlen (sunaddr->sun_path);
-#endif
-
- ciptr->addr = (char *) sunaddr;
-
- ciptr->peeraddrlen = sizeof (struct sockaddr_un);
-
- if ((p_sunaddr = malloc (ciptr->peeraddrlen)) == NULL)
- {
- prmsg(1,
- "FillAddrInfo: failed to allocate memory for peer addr\n");
- free (sunaddr);
- ciptr->addr = NULL;
-
- return 0;
- }
-
- p_sunaddr->sun_family = AF_UNIX;
-
- if (strlen(peer_sun_path) > sizeof(p_sunaddr->sun_path) - 1) {
- prmsg(1, "FillAddrInfo: peer path too long\n");
- free((char *) p_sunaddr);
- return 0;
- }
- strcpy (p_sunaddr->sun_path, peer_sun_path);
-#if defined(BSD44SOCKETS)
- p_sunaddr->sun_len = strlen (p_sunaddr->sun_path);
-#endif
-
- ciptr->peeraddr = (char *) p_sunaddr;
-
- return 1;
-}
-
-
-
-#ifdef LOCAL_TRANS_PTS
-/* PTS */
-
-#if defined(SYSV) && !defined(__SCO__)
-#define SIGNAL_T int
-#else
-#define SIGNAL_T void
-#endif /* SYSV */
-
-typedef SIGNAL_T (*PFV)();
-
-extern PFV signal();
-
-extern char *ptsname(
- int
-);
-
-static void _dummy(int sig _X_UNUSED)
-
-{
-}
-#endif /* LOCAL_TRANS_PTS */
-
-#ifndef __sun
-#define X_STREAMS_DIR "/dev/X"
-#define DEV_SPX "/dev/spx"
-#else
-#ifndef X11_t
-#define X_STREAMS_DIR "/dev/X"
-#else
-#define X_STREAMS_DIR "/tmp/.X11-pipe"
-#endif
-#endif
-
-#define DEV_PTMX "/dev/ptmx"
-
-#if defined(X11_t)
-
-#define PTSNODENAME "/dev/X/server."
-#ifdef __sun
-#define NAMEDNODENAME "/tmp/.X11-pipe/X"
-#else
-#define NAMEDNODENAME "/dev/X/Nserver."
-
-#define SCORNODENAME "/dev/X%1sR"
-#define SCOSNODENAME "/dev/X%1sS"
-#endif /* !__sun */
-#endif
-#if defined(XIM_t)
-#ifdef __sun
-#define NAMEDNODENAME "/tmp/.XIM-pipe/XIM"
-#else
-#define PTSNODENAME "/dev/X/XIM."
-#define NAMEDNODENAME "/dev/X/NXIM."
-#define SCORNODENAME "/dev/XIM.%sR"
-#define SCOSNODENAME "/dev/XIM.%sS"
-#endif
-#endif
-#if defined(FS_t) || defined (FONT_t)
-#ifdef __sun
-#define NAMEDNODENAME "/tmp/.font-pipe/fs"
-#else
-/*
- * USL has already defined something here. We need to check with them
- * and see if their choice is usable here.
- */
-#define PTSNODENAME "/dev/X/fontserver."
-#define NAMEDNODENAME "/dev/X/Nfontserver."
-#define SCORNODENAME "/dev/fontserver.%sR"
-#define SCOSNODENAME "/dev/fontserver.%sS"
-#endif
-#endif
-#if defined(ICE_t)
-#ifdef __sun
-#define NAMEDNODENAME "/tmp/.ICE-pipe/"
-#else
-#define PTSNODENAME "/dev/X/ICE."
-#define NAMEDNODENAME "/dev/X/NICE."
-#define SCORNODENAME "/dev/ICE.%sR"
-#define SCOSNODENAME "/dev/ICE.%sS"
-#endif
-#endif
-#if defined(TEST_t)
-#ifdef __sun
-#define NAMEDNODENAME "/tmp/.Test-unix/test"
-#endif
-#define PTSNODENAME "/dev/X/transtest."
-#define NAMEDNODENAME "/dev/X/Ntranstest."
-#define SCORNODENAME "/dev/transtest.%sR"
-#define SCOSNODENAME "/dev/transtest.%sS"
-#endif
-
-
-
-#ifdef LOCAL_TRANS_PTS
-#ifdef TRANS_CLIENT
-
-static int
-TRANS(PTSOpenClient)(XtransConnInfo ciptr, const char *port)
-
-{
-#ifdef PTSNODENAME
- int fd,server,exitval,alarm_time,ret;
- char server_path[64];
- char *slave, namelen;
- char buf[20]; /* MAX_PATH_LEN?? */
- PFV savef;
- pid_t saved_pid;
-#endif
-
- prmsg(2,"PTSOpenClient(%s)\n", port);
-
-#if !defined(PTSNODENAME)
- prmsg(1,"PTSOpenClient: Protocol is not supported by a pts connection\n");
- return -1;
-#else
- if (port && *port ) {
- if( *port == '/' ) { /* A full pathname */
- snprintf(server_path, sizeof(server_path), "%s", port);
- } else {
- snprintf(server_path, sizeof(server_path), "%s%s",
- PTSNODENAME, port);
- }
- } else {
- snprintf(server_path, sizeof(server_path), "%s%d",
- PTSNODENAME, getpid());
- }
-
-
- /*
- * Open the node the on which the server is listening.
- */
-
- if ((server = open (server_path, O_RDWR)) < 0) {
- prmsg(1,"PTSOpenClient: failed to open %s\n", server_path);
- return -1;
- }
-
-
- /*
- * Open the streams based pipe that will be this connection.
- */
-
- if ((fd = open(DEV_PTMX, O_RDWR)) < 0) {
- prmsg(1,"PTSOpenClient: failed to open %s\n", DEV_PTMX);
- close(server);
- return(-1);
- }
-
- (void) grantpt(fd);
- (void) unlockpt(fd);
-
- slave = ptsname(fd); /* get name */
-
- if( slave == NULL ) {
- prmsg(1,"PTSOpenClient: failed to get ptsname()\n");
- close(fd);
- close(server);
- return -1;
- }
-
- /*
- * This is neccesary for the case where a program is setuid to non-root.
- * grantpt() calls /usr/lib/pt_chmod which is set-uid root. This program will
- * set the owner of the pt device incorrectly if the uid is not restored
- * before it is called. The problem is that once it gets restored, it
- * cannot be changed back to its original condition, hence the fork().
- */
-
- if(!(saved_pid=fork())) {
- uid_t saved_euid;
-
- saved_euid = geteuid();
- /** sets the euid to the actual/real uid **/
- if (setuid( getuid() ) == -1) {
- exit(1);
- }
- if( chown( slave, saved_euid, -1 ) < 0 ) {
- exit( 1 );
- }
-
- exit( 0 );
- }
-
- waitpid(saved_pid, &exitval, 0);
- if (WIFEXITED(exitval) && WEXITSTATUS(exitval) != 0) {
- close(fd);
- close(server);
- prmsg(1, "PTSOpenClient: cannot set the owner of %s\n",
- slave);
- return(-1);
- }
- if (chmod(slave, 0666) < 0) {
- close(fd);
- close(server);
- prmsg(1,"PTSOpenClient: Cannot chmod %s\n", slave);
- return(-1);
- }
-
- /*
- * write slave name to server
- */
-
- namelen = strlen(slave);
- buf[0] = namelen;
- (void) sprintf(&buf[1], slave);
- (void) write(server, buf, namelen+1);
- (void) close(server);
-
- /*
- * wait for server to respond
- */
-
- savef = signal(SIGALRM, _dummy);
- alarm_time = alarm (30); /* CONNECT_TIMEOUT */
-
- ret = read(fd, buf, 1);
-
- (void) alarm(alarm_time);
- (void) signal(SIGALRM, savef);
-
- if (ret != 1) {
- prmsg(1,
- "PTSOpenClient: failed to get acknoledgement from server\n");
- (void) close(fd);
- fd = -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- if (TRANS(FillAddrInfo) (ciptr, slave, server_path) == 0)
- {
- prmsg(1,"PTSOpenClient: failed to fill in addr info\n");
- close(fd);
- return -1;
- }
-
- return(fd);
-
-#endif /* !PTSNODENAME */
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-static int
-TRANS(PTSOpenServer)(XtransConnInfo ciptr, const char *port)
-
-{
-#ifdef PTSNODENAME
- int fd, server;
- char server_path[64], *slave;
- int mode;
-#endif
-
- prmsg(2,"PTSOpenServer(%s)\n", port);
-
-#if !defined(PTSNODENAME)
- prmsg(1,"PTSOpenServer: Protocol is not supported by a pts connection\n");
- return -1;
-#else
- if (port && *port ) {
- if( *port == '/' ) { /* A full pathname */
- (void) sprintf(server_path, "%s", port);
- } else {
- (void) sprintf(server_path, "%s%s", PTSNODENAME, port);
- }
- } else {
- (void) sprintf(server_path, "%s%d", PTSNODENAME, getpid());
- }
-
-#ifdef HAS_STICKY_DIR_BIT
- mode = 01777;
-#else
- mode = 0777;
-#endif
- if (trans_mkdir(X_STREAMS_DIR, mode) == -1) {
- prmsg (1, "PTSOpenServer: mkdir(%s) failed, errno = %d\n",
- X_STREAMS_DIR, errno);
- return(-1);
- }
-
-#if 0
- if( (fd=open(server_path, O_RDWR)) >= 0 ) {
- /*
- * This doesn't prevent the server from starting up, and doesn't
- * prevent clients from trying to connect to the in-use PTS (which
- * is often in use by something other than another server).
- */
- prmsg(1, "PTSOpenServer: A server is already running on port %s\n", port);
- prmsg(1, "PTSOpenServer: Remove %s if this is incorrect.\n", server_path);
- close(fd);
- return(-1);
- }
-#else
- /* Just remove the old path (which is what happens with UNIXCONN) */
-#endif
-
- unlink(server_path);
-
- if( (fd=open(DEV_PTMX, O_RDWR)) < 0) {
- prmsg(1, "PTSOpenServer: Unable to open %s\n", DEV_PTMX);
- return(-1);
- }
-
- grantpt(fd);
- unlockpt(fd);
-
- if( (slave=ptsname(fd)) == NULL) {
- prmsg(1, "PTSOpenServer: Unable to get slave device name\n");
- close(fd);
- return(-1);
- }
-
- if( link(slave,server_path) < 0 ) {
- prmsg(1, "PTSOpenServer: Unable to link %s to %s\n", slave, server_path);
- close(fd);
- return(-1);
- }
-
- if( chmod(server_path, 0666) < 0 ) {
- prmsg(1, "PTSOpenServer: Unable to chmod %s to 0666\n", server_path);
- close(fd);
- return(-1);
- }
-
- if( (server=open(server_path, O_RDWR)) < 0 ) {
- prmsg(1, "PTSOpenServer: Unable to open server device %s\n", server_path);
- close(fd);
- return(-1);
- }
-
- close(server);
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
- {
- prmsg(1,"PTSOpenServer: failed to fill in addr info\n");
- close(fd);
- return -1;
- }
-
- return fd;
-
-#endif /* !PTSNODENAME */
-}
-
-static int
-TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
-
-{
- int newfd;
- int in;
- unsigned char length;
- char buf[256];
- struct sockaddr_un *sunaddr;
-
- prmsg(2,"PTSAccept(%x->%d)\n",ciptr,ciptr->fd);
-
- if( (in=read(ciptr->fd,&length,1)) <= 0 ){
- if( !in ) {
- prmsg(2,
- "PTSAccept: Incoming connection closed\n");
- }
- else {
- prmsg(1,
- "PTSAccept: Error reading incoming connection. errno=%d \n",
- errno);
- }
- *status = TRANS_ACCEPT_MISC_ERROR;
- return -1;
- }
-
- if( (in=read(ciptr->fd,buf,length)) <= 0 ){
- if( !in ) {
- prmsg(2,
- "PTSAccept: Incoming connection closed\n");
- }
- else {
- prmsg(1,
-"PTSAccept: Error reading device name for new connection. errno=%d \n",
- errno);
- }
- *status = TRANS_ACCEPT_MISC_ERROR;
- return -1;
- }
-
- buf[length] = '\0';
-
- if( (newfd=open(buf,O_RDWR)) < 0 ) {
- prmsg(1, "PTSAccept: Failed to open %s\n",buf);
- *status = TRANS_ACCEPT_MISC_ERROR;
- return -1;
- }
-
- write(newfd,"1",1);
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- newciptr->addrlen=ciptr->addrlen;
- if( (newciptr->addr = malloc(newciptr->addrlen)) == NULL ) {
- prmsg(1,"PTSAccept: failed to allocate memory for peer addr\n");
- close(newfd);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return -1;
- }
-
- memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen);
-
- newciptr->peeraddrlen=sizeof(struct sockaddr_un);
- if( (sunaddr = malloc(newciptr->peeraddrlen)) == NULL ) {
- prmsg(1,"PTSAccept: failed to allocate memory for peer addr\n");
- free(newciptr->addr);
- close(newfd);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return -1;
- }
-
- sunaddr->sun_family=AF_UNIX;
- strcpy(sunaddr->sun_path,buf);
-#if defined(BSD44SOCKETS)
- sunaddr->sun_len=strlen(sunaddr->sun_path);
-#endif
-
- newciptr->peeraddr=(char *)sunaddr;
-
- *status = 0;
-
- return newfd;
-}
-
-#endif /* TRANS_SERVER */
-#endif /* LOCAL_TRANS_PTS */
-
-
-#ifdef LOCAL_TRANS_NAMED
-
-/* NAMED */
-
-#ifdef TRANS_CLIENT
-
-static int
-TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, const char *port)
-
-{
-#ifdef NAMEDNODENAME
- int fd;
- char server_path[64];
- struct stat filestat;
-# ifndef __sun
- extern int isastream(int);
-# endif
-#endif
-
- prmsg(2,"NAMEDOpenClient(%s)\n", port);
-
-#if !defined(NAMEDNODENAME)
- prmsg(1,"NAMEDOpenClient: Protocol is not supported by a NAMED connection\n");
- return -1;
-#else
- if ( port && *port ) {
- if( *port == '/' ) { /* A full pathname */
- (void) snprintf(server_path, sizeof(server_path), "%s", port);
- } else {
- (void) snprintf(server_path, sizeof(server_path), "%s%s", NAMEDNODENAME, port);
- }
- } else {
- (void) snprintf(server_path, sizeof(server_path), "%s%ld", NAMEDNODENAME, (long)getpid());
- }
-
- if ((fd = open(server_path, O_RDWR)) < 0) {
- prmsg(1,"NAMEDOpenClient: Cannot open %s for NAMED connection\n", server_path);
- return -1;
- }
-
- if (fstat(fd, &filestat) < 0 ) {
- prmsg(1,"NAMEDOpenClient: Cannot stat %s for NAMED connection\n", server_path);
- (void) close(fd);
- return -1;
- }
-
- if ((filestat.st_mode & S_IFMT) != S_IFIFO) {
- prmsg(1,"NAMEDOpenClient: Device %s is not a FIFO\n", server_path);
- /* Is this really a failure? */
- (void) close(fd);
- return -1;
- }
-
-
- if (isastream(fd) <= 0) {
- prmsg(1,"NAMEDOpenClient: %s is not a streams device\n", server_path);
- (void) close(fd);
- return -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
- {
- prmsg(1,"NAMEDOpenClient: failed to fill in addr info\n");
- close(fd);
- return -1;
- }
-
- return(fd);
-
-#endif /* !NAMEDNODENAME */
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-
-#ifdef NAMEDNODENAME
-static int
-TRANS(NAMEDOpenPipe)(const char *server_path)
-{
- int fd, pipefd[2];
- struct stat sbuf;
- int mode;
-
- prmsg(2,"NAMEDOpenPipe(%s)\n", server_path);
-
-#ifdef HAS_STICKY_DIR_BIT
- mode = 01777;
-#else
- mode = 0777;
-#endif
- if (trans_mkdir(X_STREAMS_DIR, mode) == -1) {
- prmsg (1, "NAMEDOpenPipe: mkdir(%s) failed, errno = %d\n",
- X_STREAMS_DIR, errno);
- return(-1);
- }
-
- if(stat(server_path, &sbuf) != 0) {
- if (errno == ENOENT) {
- if ((fd = creat(server_path, (mode_t)0666)) == -1) {
- prmsg(1, "NAMEDOpenPipe: Can't open %s\n", server_path);
- return(-1);
- }
- close(fd);
- if (chmod(server_path, (mode_t)0666) < 0) {
- prmsg(1, "NAMEDOpenPipe: Can't open %s\n", server_path);
- return(-1);
- }
- } else {
- prmsg(1, "NAMEDOpenPipe: stat on %s failed\n", server_path);
- return(-1);
- }
- }
-
- if( pipe(pipefd) != 0) {
- prmsg(1, "NAMEDOpenPipe: pipe() failed, errno=%d\n",errno);
- return(-1);
- }
-
- if( ioctl(pipefd[0], I_PUSH, "connld") != 0) {
- prmsg(1, "NAMEDOpenPipe: ioctl(I_PUSH,\"connld\") failed, errno=%d\n",errno);
- close(pipefd[0]);
- close(pipefd[1]);
- return(-1);
- }
-
- if( fattach(pipefd[0], server_path) != 0) {
- prmsg(1, "NAMEDOpenPipe: fattach(%s) failed, errno=%d\n", server_path,errno);
- close(pipefd[0]);
- close(pipefd[1]);
- return(-1);
- }
-
- return(pipefd[1]);
-}
-#endif
-
-static int
-TRANS(NAMEDOpenServer)(XtransConnInfo ciptr, const char *port)
-{
-#ifdef NAMEDNODENAME
- int fd;
- char server_path[64];
-#endif
-
- prmsg(2,"NAMEDOpenServer(%s)\n", port);
-
-#if !defined(NAMEDNODENAME)
- prmsg(1,"NAMEDOpenServer: Protocol is not supported by a NAMED connection\n");
- return -1;
-#else
- if ( port && *port ) {
- if( *port == '/' ) { /* A full pathname */
- (void) snprintf(server_path, sizeof(server_path), "%s", port);
- } else {
- (void) snprintf(server_path, sizeof(server_path), "%s%s",
- NAMEDNODENAME, port);
- }
- } else {
- (void) snprintf(server_path, sizeof(server_path), "%s%ld",
- NAMEDNODENAME, (long)getpid());
- }
-
- fd = TRANS(NAMEDOpenPipe)(server_path);
- if (fd < 0) {
- return -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
- {
- prmsg(1,"NAMEDOpenServer: failed to fill in addr info\n");
- TRANS(LocalClose)(ciptr);
- return -1;
- }
-
- return fd;
-
-#endif /* !NAMEDNODENAME */
-}
-
-static int
-TRANS(NAMEDResetListener) (XtransConnInfo ciptr)
-
-{
- struct sockaddr_un *sockname=(struct sockaddr_un *) ciptr->addr;
- struct stat statb;
-
- prmsg(2,"NAMEDResetListener(%p, %d)\n", ciptr, ciptr->fd);
-
- if (ciptr->fd != -1) {
- /*
- * see if the pipe has disappeared
- */
-
- if (stat (sockname->sun_path, &statb) == -1 ||
- (statb.st_mode & S_IFMT) != S_IFIFO) {
- prmsg(3, "Pipe %s trashed, recreating\n", sockname->sun_path);
- TRANS(LocalClose)(ciptr);
- ciptr->fd = TRANS(NAMEDOpenPipe)(sockname->sun_path);
- if (ciptr->fd >= 0)
- return TRANS_RESET_NEW_FD;
- else
- return TRANS_CREATE_LISTENER_FAILED;
- }
- }
- return TRANS_RESET_NOOP;
-}
-
-static int
-TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
-
-{
- struct strrecvfd str;
-
- prmsg(2,"NAMEDAccept(%p->%d)\n", ciptr, ciptr->fd);
-
- if( ioctl(ciptr->fd, I_RECVFD, &str ) < 0 ) {
- prmsg(1, "NAMEDAccept: ioctl(I_RECVFD) failed, errno=%d\n", errno);
- *status = TRANS_ACCEPT_MISC_ERROR;
- return(-1);
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
- newciptr->family=ciptr->family;
- newciptr->addrlen=ciptr->addrlen;
- if( (newciptr->addr = malloc(newciptr->addrlen)) == NULL ) {
- prmsg(1,
- "NAMEDAccept: failed to allocate memory for pipe addr\n");
- close(str.fd);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return -1;
- }
-
- memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen);
-
- newciptr->peeraddrlen=newciptr->addrlen;
- if( (newciptr->peeraddr = malloc(newciptr->peeraddrlen)) == NULL ) {
- prmsg(1,
- "NAMEDAccept: failed to allocate memory for peer addr\n");
- free(newciptr->addr);
- close(str.fd);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return -1;
- }
-
- memcpy(newciptr->peeraddr,newciptr->addr,newciptr->peeraddrlen);
-
- *status = 0;
-
- return str.fd;
-}
-
-#endif /* TRANS_SERVER */
-
-#endif /* LOCAL_TRANS_NAMED */
-
-
-
-#if defined(LOCAL_TRANS_SCO)
-
-/*
- * connect_spipe is used by the SCO connection type.
- */
-static int
-connect_spipe(int fd1, int fd2)
-{
- long temp;
- struct strfdinsert sbuf;
-
- sbuf.databuf.maxlen = -1;
- sbuf.databuf.len = -1;
- sbuf.databuf.buf = NULL;
- sbuf.ctlbuf.maxlen = sizeof(long);
- sbuf.ctlbuf.len = sizeof(long);
- sbuf.ctlbuf.buf = (caddr_t)&temp;
- sbuf.offset = 0;
- sbuf.fildes = fd2;
- sbuf.flags = 0;
-
- if( ioctl(fd1, I_FDINSERT, &sbuf) < 0 )
- return(-1);
-
- return(0);
-}
-
-/*
- * named_spipe is used by the SCO connection type.
- */
-
-static int
-named_spipe(int fd, char *path)
-
-{
- int oldUmask, ret;
- struct stat sbuf;
-
- oldUmask = umask(0);
-
- (void) fstat(fd, &sbuf);
- ret = mknod(path, 0020666, sbuf.st_rdev);
-
- umask(oldUmask);
-
- if (ret < 0) {
- ret = -1;
- } else {
- ret = fd;
- }
-
- return(ret);
-}
-
-#endif /* defined(LOCAL_TRANS_SCO) */
-
-
-
-
-#ifdef LOCAL_TRANS_SCO
-/* SCO */
-
-/*
- * 2002-11-09 (jkj@sco.com)
- *
- * This code has been modified to match what is in the actual SCO X server.
- * This greatly helps inter-operability between X11R6 and X11R5 (the native
- * SCO server). Mainly, it relies on streams nodes existing in /dev, not
- * creating them or unlinking them, which breaks the native X server.
- *
- * However, this is only for the X protocol. For all other protocols, we
- * do in fact create the nodes, as only X11R6 will use them, and this makes
- * it possible to have both types of clients running, otherwise we get all
- * kinds of nasty errors on startup for anything that doesnt use the X
- * protocol (like SM, when KDE starts up).
- */
-
-#ifdef TRANS_CLIENT
-
-static int
-TRANS(SCOOpenClient)(XtransConnInfo ciptr, const char *port)
-{
-#ifdef SCORNODENAME
- int fd, server, fl, ret;
- char server_path[64];
- struct strbuf ctlbuf;
- unsigned long alarm_time;
- void (*savef)();
- long temp;
- extern int getmsg(), putmsg();
-#endif
-
- prmsg(2,"SCOOpenClient(%s)\n", port);
- if (!port || !port[0])
- port = "0";
-
-#if !defined(SCORNODENAME)
- prmsg(2,"SCOOpenClient: Protocol is not supported by a SCO connection\n");
- return -1;
-#else
- (void) sprintf(server_path, SCORNODENAME, port);
-
- if ((server = open(server_path, O_RDWR)) < 0) {
- prmsg(1,"SCOOpenClient: failed to open %s\n", server_path);
- return -1;
- }
-
- if ((fd = open(DEV_SPX, O_RDWR)) < 0) {
- prmsg(1,"SCOOpenClient: failed to open %s\n", DEV_SPX);
- close(server);
- return -1;
- }
-
- (void) write(server, &server, 1);
- ctlbuf.len = 0;
- ctlbuf.maxlen = sizeof(long);
- ctlbuf.buf = (caddr_t)&temp;
- fl = 0;
-
- savef = signal(SIGALRM, _dummy);
- alarm_time = alarm(10);
-
- ret = getmsg(server, &ctlbuf, 0, &fl);
-
- (void) alarm(alarm_time);
- (void) signal(SIGALRM, savef);
-
- if (ret < 0) {
- prmsg(1,"SCOOpenClient: error from getmsg\n");
- close(fd);
- close(server);
- return -1;
- }
-
- /* The msg we got via getmsg is the result of an
- * I_FDINSERT, so if we do a putmsg with whatever
- * we recieved, we're doing another I_FDINSERT ...
- */
- (void) putmsg(fd, &ctlbuf, 0, 0);
- (void) fcntl(fd,F_SETFL,fcntl(fd,F_GETFL,0)|O_NDELAY);
-
- (void) close(server);
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
-#if defined(X11_t) && defined(__SCO__)
- ciptr->flags |= TRANS_NOUNLINK;
-#endif
- if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
- {
- prmsg(1,"SCOOpenClient: failed to fill addr info\n");
- close(fd);
- return -1;
- }
-
- return(fd);
-
-#endif /* !SCORNODENAME */
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-static int
-TRANS(SCOOpenServer)(XtransConnInfo ciptr, const char *port)
-{
-#ifdef SCORNODENAME
- char serverR_path[64];
- char serverS_path[64];
- struct flock mylock;
- int fdr = -1;
- int fds = -1;
-#endif
-
- prmsg(2,"SCOOpenServer(%s)\n", port);
- if (!port || !port[0])
- port = "0";
-
-#if !defined(SCORNODENAME)
- prmsg(1,"SCOOpenServer: Protocol is not supported by a SCO connection\n");
- return -1;
-#else
- (void) sprintf(serverR_path, SCORNODENAME, port);
- (void) sprintf(serverS_path, SCOSNODENAME, port);
-
-#if !defined(X11_t) || !defined(__SCO__)
- unlink(serverR_path);
- unlink(serverS_path);
-
- if ((fds = open(DEV_SPX, O_RDWR)) < 0 ||
- (fdr = open(DEV_SPX, O_RDWR)) < 0 ) {
- prmsg(1,"SCOOpenServer: failed to open %s\n", DEV_SPX);
- if (fds >= 0)
- close(fds);
- if (fdr >= 0)
- close(fdr);
- return -1;
- }
-
- if (named_spipe (fds, serverS_path) == -1) {
- prmsg(1,"SCOOpenServer: failed to create %s\n", serverS_path);
- close (fdr);
- close (fds);
- return -1;
- }
-
- if (named_spipe (fdr, serverR_path) == -1) {
- prmsg(1,"SCOOpenServer: failed to create %s\n", serverR_path);
- close (fdr);
- close (fds);
- return -1;
- }
-#else /* X11_t */
-
- fds = open (serverS_path, O_RDWR | O_NDELAY);
- if (fds < 0) {
- prmsg(1,"SCOOpenServer: failed to open %s\n", serverS_path);
- return -1;
- }
-
- /*
- * Lock the connection device for the duration of the server.
- * This resolves multiple server starts especially on SMP machines.
- */
- mylock.l_type = F_WRLCK;
- mylock.l_whence = 0;
- mylock.l_start = 0;
- mylock.l_len = 0;
- if (fcntl (fds, F_SETLK, &mylock) < 0) {
- prmsg(1,"SCOOpenServer: failed to lock %s\n", serverS_path);
- close (fds);
- return -1;
- }
-
- fdr = open (serverR_path, O_RDWR | O_NDELAY);
- if (fdr < 0) {
- prmsg(1,"SCOOpenServer: failed to open %s\n", serverR_path);
- close (fds);
- return -1;
- }
-#endif /* X11_t */
-
- if (connect_spipe(fds, fdr)) {
- prmsg(1,"SCOOpenServer: ioctl(I_FDINSERT) failed on %s\n",
- serverS_path);
- close (fdr);
- close (fds);
- return -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
-#if defined(X11_t) && defined(__SCO__)
- ciptr->flags |= TRANS_NOUNLINK;
-#endif
- if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0) {
- prmsg(1,"SCOOpenServer: failed to fill in addr info\n");
- close(fds);
- close(fdr);
- return -1;
- }
-
- return(fds);
-
-#endif /* !SCORNODENAME */
-}
-
-static int
-TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
-{
- char c;
- int fd;
-
- prmsg(2,"SCOAccept(%d)\n", ciptr->fd);
-
- if (read(ciptr->fd, &c, 1) < 0) {
- prmsg(1,"SCOAccept: can't read from client\n");
- *status = TRANS_ACCEPT_MISC_ERROR;
- return(-1);
- }
-
- if( (fd = open(DEV_SPX, O_RDWR)) < 0 ) {
- prmsg(1,"SCOAccept: can't open \"%s\"\n",DEV_SPX);
- *status = TRANS_ACCEPT_MISC_ERROR;
- return(-1);
- }
-
- if (connect_spipe (ciptr->fd, fd) < 0) {
- prmsg(1,"SCOAccept: ioctl(I_FDINSERT) failed\n");
- close (fd);
- *status = TRANS_ACCEPT_MISC_ERROR;
- return -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- newciptr->addrlen=ciptr->addrlen;
- if( (newciptr->addr = malloc(newciptr->addrlen)) == NULL ) {
- prmsg(1,
- "SCOAccept: failed to allocate memory for peer addr\n");
- close(fd);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return -1;
- }
-
- memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen);
-#if defined(__SCO__)
- newciptr->flags |= TRANS_NOUNLINK;
-#endif
-
- newciptr->peeraddrlen=newciptr->addrlen;
- if( (newciptr->peeraddr = malloc(newciptr->peeraddrlen)) == NULL ) {
- prmsg(1,
- "SCOAccept: failed to allocate memory for peer addr\n");
- free(newciptr->addr);
- close(fd);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return -1;
- }
-
- memcpy(newciptr->peeraddr,newciptr->addr,newciptr->peeraddrlen);
-
- *status = 0;
-
- return(fd);
-}
-
-#endif /* TRANS_SERVER */
-#endif /* LOCAL_TRANS_SCO */
-
-
-
-#ifdef TRANS_REOPEN
-#ifdef LOCAL_TRANS_PTS
-
-static int
-TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, const char *port)
-
-{
-#ifdef PTSNODENAME
- char server_path[64];
-#endif
-
- prmsg(2,"PTSReopenServer(%d,%s)\n", fd, port);
-
-#if !defined(PTSNODENAME)
- prmsg(1,"PTSReopenServer: Protocol is not supported by a pts connection\n");
- return 0;
-#else
- if (port && *port ) {
- if( *port == '/' ) { /* A full pathname */
- snprintf(server_path, sizeof(server_path), "%s", port);
- } else {
- snprintf(server_path, sizeof(server_path), "%s%s",
- PTSNODENAME, port);
- }
- } else {
- snprintf(server_path, sizeof(server_path), "%s%ld",
- PTSNODENAME, (long)getpid());
- }
-
- if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
- {
- prmsg(1,"PTSReopenServer: failed to fill in addr info\n");
- return 0;
- }
-
- return 1;
-
-#endif /* !PTSNODENAME */
-}
-
-#endif /* LOCAL_TRANS_PTS */
-
-#ifdef LOCAL_TRANS_NAMED
-
-static int
-TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd _X_UNUSED, const char *port)
-
-{
-#ifdef NAMEDNODENAME
- char server_path[64];
-#endif
-
- prmsg(2,"NAMEDReopenServer(%s)\n", port);
-
-#if !defined(NAMEDNODENAME)
- prmsg(1,"NAMEDReopenServer: Protocol is not supported by a NAMED connection\n");
- return 0;
-#else
- if ( port && *port ) {
- if( *port == '/' ) { /* A full pathname */
- snprintf(server_path, sizeof(server_path),"%s", port);
- } else {
- snprintf(server_path, sizeof(server_path), "%s%s",
- NAMEDNODENAME, port);
- }
- } else {
- snprintf(server_path, sizeof(server_path), "%s%ld",
- NAMEDNODENAME, (long)getpid());
- }
-
- if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
- {
- prmsg(1,"NAMEDReopenServer: failed to fill in addr info\n");
- return 0;
- }
-
- return 1;
-
-#endif /* !NAMEDNODENAME */
-}
-
-#endif /* LOCAL_TRANS_NAMED */
-
-
-#ifdef LOCAL_TRANS_SCO
-static int
-TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, const char *port)
-
-{
-#ifdef SCORNODENAME
- char serverR_path[64], serverS_path[64];
-#endif
-
- prmsg(2,"SCOReopenServer(%s)\n", port);
- if (!port || !port[0])
- port = "0";
-
-#if !defined(SCORNODENAME)
- prmsg(2,"SCOReopenServer: Protocol is not supported by a SCO connection\n");
- return 0;
-#else
- (void) sprintf(serverR_path, SCORNODENAME, port);
- (void) sprintf(serverS_path, SCOSNODENAME, port);
-
-#if defined(X11_t) && defined(__SCO__)
- ciptr->flags |= TRANS_NOUNLINK;
-#endif
- if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0)
- {
- prmsg(1, "SCOReopenServer: failed to fill in addr info\n");
- return 0;
- }
-
- return 1;
-
-#endif /* SCORNODENAME */
-}
-
-#endif /* LOCAL_TRANS_SCO */
-
-#endif /* TRANS_REOPEN */
-
-
-
-/*
- * This table contains all of the entry points for the different local
- * connection mechanisms.
- */
-
-typedef struct _LOCALtrans2dev {
- const char *transname;
-
-#ifdef TRANS_CLIENT
-
- int (*devcotsopenclient)(
- XtransConnInfo, const char * /*port*/
-);
-
-#endif /* TRANS_CLIENT */
-
-#ifdef TRANS_SERVER
-
- int (*devcotsopenserver)(
- XtransConnInfo, const char * /*port*/
-);
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_CLIENT
-
- int (*devcltsopenclient)(
- XtransConnInfo, const char * /*port*/
-);
-
-#endif /* TRANS_CLIENT */
-
-#ifdef TRANS_SERVER
-
- int (*devcltsopenserver)(
- XtransConnInfo, const char * /*port*/
-);
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_REOPEN
-
- int (*devcotsreopenserver)(
- XtransConnInfo,
- int, /* fd */
- const char * /* port */
-);
-
- int (*devcltsreopenserver)(
- XtransConnInfo,
- int, /* fd */
- const char * /* port */
-);
-
-#endif /* TRANS_REOPEN */
-
-#ifdef TRANS_SERVER
-
- int (*devreset)(
- XtransConnInfo /* ciptr */
-);
-
- int (*devaccept)(
- XtransConnInfo, XtransConnInfo, int *
-);
-
-#endif /* TRANS_SERVER */
-
-} LOCALtrans2dev;
-
-static LOCALtrans2dev LOCALtrans2devtab[] = {
-#ifdef LOCAL_TRANS_PTS
-{"",
-#ifdef TRANS_CLIENT
- TRANS(PTSOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(PTSOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(PTSReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- NULL, /* ResetListener */
- TRANS(PTSAccept)
-#endif /* TRANS_SERVER */
-},
-
-{"local",
-#ifdef TRANS_CLIENT
- TRANS(PTSOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(PTSOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(PTSReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- NULL, /* ResetListener */
- TRANS(PTSAccept)
-#endif /* TRANS_SERVER */
-},
-
-{"pts",
-#ifdef TRANS_CLIENT
- TRANS(PTSOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(PTSOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(PTSReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- NULL, /* ResetListener */
- TRANS(PTSAccept)
-#endif /* TRANS_SERVER */
-},
-#else /* !LOCAL_TRANS_PTS */
-{"",
-#ifdef TRANS_CLIENT
- TRANS(NAMEDOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(NAMEDOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(NAMEDReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- TRANS(NAMEDResetListener),
- TRANS(NAMEDAccept)
-#endif /* TRANS_SERVER */
-},
-
-{"local",
-#ifdef TRANS_CLIENT
- TRANS(NAMEDOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(NAMEDOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(NAMEDReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- TRANS(NAMEDResetListener),
- TRANS(NAMEDAccept)
-#endif /* TRANS_SERVER */
-},
-#endif /* !LOCAL_TRANS_PTS */
-
-#ifdef LOCAL_TRANS_NAMED
-{"named",
-#ifdef TRANS_CLIENT
- TRANS(NAMEDOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(NAMEDOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(NAMEDReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- TRANS(NAMEDResetListener),
- TRANS(NAMEDAccept)
-#endif /* TRANS_SERVER */
-},
-
-#ifdef __sun /* Alias "pipe" to named, since that's what Solaris called it */
-{"pipe",
-#ifdef TRANS_CLIENT
- TRANS(NAMEDOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(NAMEDOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(NAMEDReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- TRANS(NAMEDResetListener),
- TRANS(NAMEDAccept)
-#endif /* TRANS_SERVER */
-},
-#endif /* __sun */
-#endif /* LOCAL_TRANS_NAMED */
-
-
-#ifdef LOCAL_TRANS_SCO
-{"sco",
-#ifdef TRANS_CLIENT
- TRANS(SCOOpenClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(SCOOpenServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(OpenFail),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- TRANS(OpenFail),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(SCOReopenServer),
- TRANS(ReopenFail),
-#endif
-#ifdef TRANS_SERVER
- NULL, /* ResetListener */
- TRANS(SCOAccept)
-#endif /* TRANS_SERVER */
-},
-#endif /* LOCAL_TRANS_SCO */
-};
-
-#define NUMTRANSPORTS (sizeof(LOCALtrans2devtab)/sizeof(LOCALtrans2dev))
-
-static const char *XLOCAL=NULL;
-static char *workingXLOCAL=NULL;
-static char *freeXLOCAL=NULL;
-
-#if defined(__SCO__)
-#define DEF_XLOCAL "SCO:UNIX:PTS"
-#elif defined(__UNIXWARE__)
-#define DEF_XLOCAL "UNIX:PTS:NAMED:SCO"
-#elif defined(__sun)
-#define DEF_XLOCAL "UNIX:NAMED"
-#else
-#define DEF_XLOCAL "UNIX:PTS:NAMED:SCO"
-#endif
-
-static void
-TRANS(LocalInitTransports)(const char *protocol)
-
-{
- prmsg(3,"LocalInitTransports(%s)\n", protocol);
-
- if( strcmp(protocol,"local") && strcmp(protocol,"LOCAL") )
- {
- workingXLOCAL = freeXLOCAL = strdup (protocol);
- }
- else {
- XLOCAL=(char *)getenv("XLOCAL");
- if(XLOCAL==NULL)
- XLOCAL=DEF_XLOCAL;
- workingXLOCAL = freeXLOCAL = strdup (XLOCAL);
- }
-}
-
-static void
-TRANS(LocalEndTransports)(void)
-
-{
- prmsg(3,"LocalEndTransports()\n");
- free(freeXLOCAL);
-}
-
-#define TYPEBUFSIZE 32
-
-#ifdef TRANS_CLIENT
-
-static LOCALtrans2dev *
-TRANS(LocalGetNextTransport)(void)
-
-{
- int i,j;
- char *typetocheck;
- char typebuf[TYPEBUFSIZE];
- prmsg(3,"LocalGetNextTransport()\n");
-
- while(1)
- {
- if( workingXLOCAL == NULL || *workingXLOCAL == '\0' )
- return NULL;
-
- typetocheck=workingXLOCAL;
- workingXLOCAL=strchr(workingXLOCAL,':');
- if(workingXLOCAL && *workingXLOCAL)
- *workingXLOCAL++='\0';
-
- for(i=0;i<NUMTRANSPORTS;i++)
- {
- /*
- * This is equivalent to a case insensitive strcmp(),
- * but should be more portable.
- */
- strncpy(typebuf,typetocheck,TYPEBUFSIZE);
- for(j=0;j<TYPEBUFSIZE;j++)
- if (isupper(typebuf[j]))
- typebuf[j]=tolower(typebuf[j]);
-
- /* Now, see if they match */
- if(!strcmp(LOCALtrans2devtab[i].transname,typebuf))
- return &LOCALtrans2devtab[i];
- }
- }
-#if 0
- /*NOTREACHED*/
- return NULL;
-#endif
-}
-
-#ifdef NEED_UTSNAME
-#include <sys/utsname.h>
-#endif
-
-/*
- * Make sure 'host' is really local.
- */
-
-static int
-HostReallyLocal (const char *host)
-
-{
- /*
- * The 'host' passed to this function may have been generated
- * by either uname() or gethostname(). We try both if possible.
- */
-
-#ifdef NEED_UTSNAME
- struct utsname name;
-#endif
- char buf[256];
-
-#ifdef NEED_UTSNAME
- if (uname (&name) >= 0 && strcmp (host, name.nodename) == 0)
- return (1);
-#endif
-
- buf[0] = '\0';
- (void) gethostname (buf, 256);
- buf[255] = '\0';
-
- if (strcmp (host, buf) == 0)
- return (1);
-
- return (0);
-}
-
-
-static XtransConnInfo
-TRANS(LocalOpenClient)(int type, const char *protocol,
- const char *host, const char *port)
-
-{
- LOCALtrans2dev *transptr;
- XtransConnInfo ciptr;
- int index;
-
- prmsg(3,"LocalOpenClient()\n");
-
- /*
- * Make sure 'host' is really local. If not, we return failure.
- * The reason we make this check is because a process may advertise
- * a "local" address for which it can accept connections, but if a
- * process on a remote machine tries to connect to this address,
- * we know for sure it will fail.
- */
-
- if (strcmp (host, "unix") != 0 && !HostReallyLocal (host))
- {
- prmsg (1,
- "LocalOpenClient: Cannot connect to non-local host %s\n",
- host);
- return NULL;
- }
-
-
-#if defined(X11_t)
- /*
- * X has a well known port, that is transport dependant. It is easier
- * to handle it here, than try and come up with a transport independent
- * representation that can be passed in and resolved the usual way.
- *
- * The port that is passed here is really a string containing the idisplay
- * from ConnectDisplay(). Since that is what we want for the local transports,
- * we don't have to do anything special.
- */
-#endif /* X11_t */
-
- if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
- {
- prmsg(1,"LocalOpenClient: calloc(1,%lu) failed\n",
- sizeof(struct _XtransConnInfo));
- return NULL;
- }
-
- ciptr->fd = -1;
-
- TRANS(LocalInitTransports)(protocol);
-
- index = 0;
- for(transptr=TRANS(LocalGetNextTransport)();
- transptr!=NULL;transptr=TRANS(LocalGetNextTransport)(), index++)
- {
- switch( type )
- {
- case XTRANS_OPEN_COTS_CLIENT:
- ciptr->fd=transptr->devcotsopenclient(ciptr,port);
- break;
- case XTRANS_OPEN_COTS_SERVER:
- prmsg(1,
- "LocalOpenClient: Should not be opening a server with this function\n");
- break;
- default:
- prmsg(1,
- "LocalOpenClient: Unknown Open type %d\n",
- type);
- }
- if( ciptr->fd >= 0 )
- break;
- }
-
- TRANS(LocalEndTransports)();
-
- if( ciptr->fd < 0 )
- {
- free(ciptr);
- return NULL;
- }
-
- ciptr->priv=(char *)transptr;
- ciptr->index = index;
-
- return ciptr;
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-static XtransConnInfo
-TRANS(LocalOpenServer)(int type, const char *protocol,
- const char *host _X_UNUSED, const char *port)
-
-{
- int i;
- XtransConnInfo ciptr;
-
- prmsg(2,"LocalOpenServer(%d,%s,%s)\n", type, protocol, port);
-
-#if defined(X11_t)
- /*
- * For X11, the port will be in the format xserverN where N is the
- * display number. All of the local connections just need to know
- * the display number because they don't do any name resolution on
- * the port. This just truncates port to the display portion.
- */
-#endif /* X11_t */
-
- if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
- {
- prmsg(1,"LocalOpenServer: calloc(1,%lu) failed\n",
- sizeof(struct _XtransConnInfo));
- return NULL;
- }
-
- for(i=1;i<NUMTRANSPORTS;i++)
- {
- if( strcmp(protocol,LOCALtrans2devtab[i].transname) != 0 )
- continue;
- switch( type )
- {
- case XTRANS_OPEN_COTS_CLIENT:
- prmsg(1,
- "LocalOpenServer: Should not be opening a client with this function\n");
- break;
- case XTRANS_OPEN_COTS_SERVER:
- ciptr->fd=LOCALtrans2devtab[i].devcotsopenserver(ciptr,port);
- break;
- default:
- prmsg(1,"LocalOpenServer: Unknown Open type %d\n",
- type );
- }
- if( ciptr->fd >= 0 ) {
- ciptr->priv=(char *)&LOCALtrans2devtab[i];
- ciptr->index=i;
- ciptr->flags = 1 | (ciptr->flags & TRANS_KEEPFLAGS);
- return ciptr;
- }
- }
-
- free(ciptr);
- return NULL;
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_REOPEN
-
-static XtransConnInfo
-TRANS(LocalReopenServer)(int type, int index, int fd, const char *port)
-
-{
- XtransConnInfo ciptr;
- int stat = 0;
-
- prmsg(2,"LocalReopenServer(%d,%d,%d)\n", type, index, fd);
-
- if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
- {
- prmsg(1,"LocalReopenServer: calloc(1,%lu) failed\n",
- sizeof(struct _XtransConnInfo));
- return NULL;
- }
-
- ciptr->fd = fd;
-
- switch( type )
- {
- case XTRANS_OPEN_COTS_SERVER:
- stat = LOCALtrans2devtab[index].devcotsreopenserver(ciptr,fd,port);
- break;
- default:
- prmsg(1,"LocalReopenServer: Unknown Open type %d\n",
- type );
- }
-
- if( stat > 0 ) {
- ciptr->priv=(char *)&LOCALtrans2devtab[index];
- ciptr->index=index;
- ciptr->flags = 1 | (ciptr->flags & TRANS_KEEPFLAGS);
- return ciptr;
- }
-
- free(ciptr);
- return NULL;
-}
-
-#endif /* TRANS_REOPEN */
-
-
-
-/*
- * This is the Local implementation of the X Transport service layer
- */
-
-#ifdef TRANS_CLIENT
-
-static XtransConnInfo
-TRANS(LocalOpenCOTSClient)(Xtransport *thistrans _X_UNUSED, const char *protocol,
- const char *host, const char *port)
-
-{
- prmsg(2,"LocalOpenCOTSClient(%s,%s,%s)\n",protocol,host,port);
-
- return TRANS(LocalOpenClient)(XTRANS_OPEN_COTS_CLIENT, protocol, host, port);
-}
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-static XtransConnInfo
-TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, const char *protocol,
- const char *host, const char *port)
-
-{
- char *typetocheck = NULL;
- int found = 0;
- char typebuf[TYPEBUFSIZE];
-
- prmsg(2,"LocalOpenCOTSServer(%s,%s,%s)\n",protocol,host,port);
-
- /* Check if this local type is in the XLOCAL list */
- TRANS(LocalInitTransports)("local");
- typetocheck = workingXLOCAL;
- while (typetocheck && !found) {
- int j;
-
- workingXLOCAL = strchr(workingXLOCAL, ':');
- if (workingXLOCAL && *workingXLOCAL)
- *workingXLOCAL++ = '\0';
- strncpy(typebuf, typetocheck, TYPEBUFSIZE);
- for (j = 0; j < TYPEBUFSIZE; j++)
- if (isupper(typebuf[j]))
- typebuf[j] = tolower(typebuf[j]);
- if (!strcmp(thistrans->TransName, typebuf))
- found = 1;
- typetocheck = workingXLOCAL;
- }
- TRANS(LocalEndTransports)();
-
- if (!found) {
- prmsg(3,"LocalOpenCOTSServer: disabling %s\n",thistrans->TransName);
- thistrans->flags |= TRANS_DISABLED;
- return NULL;
- }
-
- return TRANS(LocalOpenServer)(XTRANS_OPEN_COTS_SERVER, protocol, host, port);
-}
-
-#endif /* TRANS_SERVER */
-
-#ifdef TRANS_REOPEN
-
-static XtransConnInfo
-TRANS(LocalReopenCOTSServer)(Xtransport *thistrans, int fd, const char *port)
-
-{
- int index;
-
- prmsg(2,"LocalReopenCOTSServer(%d,%s)\n", fd, port);
-
- for(index=1;index<NUMTRANSPORTS;index++)
- {
- if( strcmp(thistrans->TransName,
- LOCALtrans2devtab[index].transname) == 0 )
- break;
- }
-
- if (index >= NUMTRANSPORTS)
- {
- return (NULL);
- }
-
- return TRANS(LocalReopenServer)(XTRANS_OPEN_COTS_SERVER,
- index, fd, port);
-}
-
-#endif /* TRANS_REOPEN */
-
-
-
-static int
-TRANS(LocalSetOption)(XtransConnInfo ciptr, int option, int arg)
-
-{
- prmsg(2,"LocalSetOption(%d,%d,%d)\n",ciptr->fd,option,arg);
-
- return -1;
-}
-
-
-#ifdef TRANS_SERVER
-
-static int
-TRANS(LocalCreateListener)(XtransConnInfo ciptr, const char *port,
- unsigned int flags _X_UNUSED)
-
-{
- prmsg(2,"LocalCreateListener(%p->%d,%s)\n",ciptr,ciptr->fd,port);
-
- return 0;
-}
-
-static int
-TRANS(LocalResetListener)(XtransConnInfo ciptr)
-
-{
- LOCALtrans2dev *transptr;
-
- prmsg(2,"LocalResetListener(%p)\n",ciptr);
-
- transptr=(LOCALtrans2dev *)ciptr->priv;
- if (transptr->devreset != NULL) {
- return transptr->devreset(ciptr);
- }
- return TRANS_RESET_NOOP;
-}
-
-
-static XtransConnInfo
-TRANS(LocalAccept)(XtransConnInfo ciptr, int *status)
-
-{
- XtransConnInfo newciptr;
- LOCALtrans2dev *transptr;
-
- prmsg(2,"LocalAccept(%p->%d)\n", ciptr, ciptr->fd);
-
- transptr=(LOCALtrans2dev *)ciptr->priv;
-
- if( (newciptr = calloc(1,sizeof(struct _XtransConnInfo)))==NULL )
- {
- prmsg(1,"LocalAccept: calloc(1,%lu) failed\n",
- sizeof(struct _XtransConnInfo));
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
-
- newciptr->fd=transptr->devaccept(ciptr,newciptr,status);
-
- if( newciptr->fd < 0 )
- {
- free(newciptr);
- return NULL;
- }
-
- newciptr->priv=(char *)transptr;
- newciptr->index = ciptr->index;
-
- *status = 0;
-
- return newciptr;
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_CLIENT
-
-static int
-TRANS(LocalConnect)(XtransConnInfo ciptr,
- const char *host _X_UNUSED, const char *port)
-
-{
- prmsg(2,"LocalConnect(%p->%d,%s)\n", ciptr, ciptr->fd, port);
-
- return 0;
-}
-
-#endif /* TRANS_CLIENT */
-
-
-static int
-TRANS(LocalBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend )
-
-{
- prmsg(2,"LocalBytesReadable(%p->%d,%p)\n", ciptr, ciptr->fd, pend);
-
-#if defined(SCO325)
- return ioctl(ciptr->fd, I_NREAD, (char *)pend);
-#else
- return ioctl(ciptr->fd, FIONREAD, (char *)pend);
-#endif
-}
-
-static int
-TRANS(LocalRead)(XtransConnInfo ciptr, char *buf, int size)
-
-{
- prmsg(2,"LocalRead(%d,%p,%d)\n", ciptr->fd, buf, size );
-
- return read(ciptr->fd,buf,size);
-}
-
-static int
-TRANS(LocalWrite)(XtransConnInfo ciptr, char *buf, int size)
-
-{
- prmsg(2,"LocalWrite(%d,%p,%d)\n", ciptr->fd, buf, size );
-
- return write(ciptr->fd,buf,size);
-}
-
-static int
-TRANS(LocalReadv)(XtransConnInfo ciptr, struct iovec *buf, int size)
-
-{
- prmsg(2,"LocalReadv(%d,%p,%d)\n", ciptr->fd, buf, size );
-
- return READV(ciptr,buf,size);
-}
-
-static int
-TRANS(LocalWritev)(XtransConnInfo ciptr, struct iovec *buf, int size)
-
-{
- prmsg(2,"LocalWritev(%d,%p,%d)\n", ciptr->fd, buf, size );
-
- return WRITEV(ciptr,buf,size);
-}
-
-static int
-TRANS(LocalDisconnect)(XtransConnInfo ciptr)
-
-{
- prmsg(2,"LocalDisconnect(%p->%d)\n", ciptr, ciptr->fd);
-
- return 0;
-}
-
-static int
-TRANS(LocalClose)(XtransConnInfo ciptr)
-
-{
- struct sockaddr_un *sockname=(struct sockaddr_un *) ciptr->addr;
- int ret;
-
- prmsg(2,"LocalClose(%p->%d)\n", ciptr, ciptr->fd );
-
- ret=close(ciptr->fd);
-
- if(ciptr->flags
- && sockname
- && sockname->sun_family == AF_UNIX
- && sockname->sun_path[0] )
- {
- if (!(ciptr->flags & TRANS_NOUNLINK))
- unlink(sockname->sun_path);
- }
-
- return ret;
-}
-
-static int
-TRANS(LocalCloseForCloning)(XtransConnInfo ciptr)
-
-{
- int ret;
-
- prmsg(2,"LocalCloseForCloning(%p->%d)\n", ciptr, ciptr->fd );
-
- /* Don't unlink path */
-
- ret=close(ciptr->fd);
-
- return ret;
-}
-
-
-/*
- * MakeAllCOTSServerListeners() will go through the entire Xtransports[]
- * array defined in Xtrans.c and try to OpenCOTSServer() for each entry.
- * We will add duplicate entries to that table so that the OpenCOTSServer()
- * function will get called once for each type of local transport.
- *
- * The TransName is in lowercase, so it will never match during a normal
- * call to SelectTransport() in Xtrans.c.
- */
-
-#ifdef TRANS_SERVER
-static const char * local_aliases[] = {
-# ifdef LOCAL_TRANS_PTS
- "pts",
-# endif
- "named",
-# ifdef __sun
- "pipe", /* compatibility with Solaris Xlib */
-# endif
-# ifdef LOCAL_TRANS_SCO
- "sco",
-# endif
- NULL };
-#endif
-
-Xtransport TRANS(LocalFuncs) = {
- /* Local Interface */
- "local",
- TRANS_ALIAS | TRANS_LOCAL,
-#ifdef TRANS_CLIENT
- TRANS(LocalOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- local_aliases,
- TRANS(LocalOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(LocalReopenCOTSServer),
-#endif
- TRANS(LocalSetOption),
-#ifdef TRANS_SERVER
- TRANS(LocalCreateListener),
- TRANS(LocalResetListener),
- TRANS(LocalAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(LocalConnect),
-#endif /* TRANS_CLIENT */
- TRANS(LocalBytesReadable),
- TRANS(LocalRead),
- TRANS(LocalWrite),
- TRANS(LocalReadv),
- TRANS(LocalWritev),
-#if XTRANS_SEND_FDS
- TRANS(LocalSendFdInvalid),
- TRANS(LocalRecvFdInvalid),
-#endif
- TRANS(LocalDisconnect),
- TRANS(LocalClose),
- TRANS(LocalCloseForCloning),
-};
-
-#ifdef LOCAL_TRANS_PTS
-
-Xtransport TRANS(PTSFuncs) = {
- /* Local Interface */
- "pts",
- TRANS_LOCAL,
-#ifdef TRANS_CLIENT
- TRANS(LocalOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(LocalOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(LocalReopenCOTSServer),
-#endif
- TRANS(LocalSetOption),
-#ifdef TRANS_SERVER
- TRANS(LocalCreateListener),
- TRANS(LocalResetListener),
- TRANS(LocalAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(LocalConnect),
-#endif /* TRANS_CLIENT */
- TRANS(LocalBytesReadable),
- TRANS(LocalRead),
- TRANS(LocalWrite),
- TRANS(LocalReadv),
- TRANS(LocalWritev),
-#if XTRANS_SEND_FDS
- TRANS(LocalSendFdInvalid),
- TRANS(LocalRecvFdInvalid),
-#endif
- TRANS(LocalDisconnect),
- TRANS(LocalClose),
- TRANS(LocalCloseForCloning),
-};
-
-#endif /* LOCAL_TRANS_PTS */
-
-#ifdef LOCAL_TRANS_NAMED
-
-Xtransport TRANS(NAMEDFuncs) = {
- /* Local Interface */
- "named",
- TRANS_LOCAL,
-#ifdef TRANS_CLIENT
- TRANS(LocalOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(LocalOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(LocalReopenCOTSServer),
-#endif
- TRANS(LocalSetOption),
-#ifdef TRANS_SERVER
- TRANS(LocalCreateListener),
- TRANS(LocalResetListener),
- TRANS(LocalAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(LocalConnect),
-#endif /* TRANS_CLIENT */
- TRANS(LocalBytesReadable),
- TRANS(LocalRead),
- TRANS(LocalWrite),
- TRANS(LocalReadv),
- TRANS(LocalWritev),
-#if XTRANS_SEND_FDS
- TRANS(LocalSendFdInvalid),
- TRANS(LocalRecvFdInvalid),
-#endif
- TRANS(LocalDisconnect),
- TRANS(LocalClose),
- TRANS(LocalCloseForCloning),
-};
-
-#ifdef __sun
-Xtransport TRANS(PIPEFuncs) = {
- /* Local Interface */
- "pipe",
- TRANS_ALIAS | TRANS_LOCAL,
-#ifdef TRANS_CLIENT
- TRANS(LocalOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(LocalOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(LocalReopenCOTSServer),
-#endif
- TRANS(LocalSetOption),
-#ifdef TRANS_SERVER
- TRANS(LocalCreateListener),
- TRANS(LocalResetListener),
- TRANS(LocalAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(LocalConnect),
-#endif /* TRANS_CLIENT */
- TRANS(LocalBytesReadable),
- TRANS(LocalRead),
- TRANS(LocalWrite),
- TRANS(LocalReadv),
- TRANS(LocalWritev),
-#if XTRANS_SEND_FDS
- TRANS(LocalSendFdInvalid),
- TRANS(LocalRecvFdInvalid),
-#endif
- TRANS(LocalDisconnect),
- TRANS(LocalClose),
- TRANS(LocalCloseForCloning),
-};
-#endif /* __sun */
-#endif /* LOCAL_TRANS_NAMED */
-
-
-#ifdef LOCAL_TRANS_SCO
-Xtransport TRANS(SCOFuncs) = {
- /* Local Interface */
- "sco",
- TRANS_LOCAL,
-#ifdef TRANS_CLIENT
- TRANS(LocalOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(LocalOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(LocalReopenCOTSServer),
-#endif
- TRANS(LocalSetOption),
-#ifdef TRANS_SERVER
- TRANS(LocalCreateListener),
- TRANS(LocalResetListener),
- TRANS(LocalAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(LocalConnect),
-#endif /* TRANS_CLIENT */
- TRANS(LocalBytesReadable),
- TRANS(LocalRead),
- TRANS(LocalWrite),
- TRANS(LocalReadv),
- TRANS(LocalWritev),
-#if XTRANS_SEND_FDS
- TRANS(LocalSendFdInvalid),
- TRANS(LocalRecvFdInvalid),
-#endif
- TRANS(LocalDisconnect),
- TRANS(LocalClose),
- TRANS(LocalCloseForCloning),
-};
-#endif /* LOCAL_TRANS_SCO */
diff --git a/nx-X11/lib/xtrans/Xtranssock.c b/nx-X11/lib/xtrans/Xtranssock.c
deleted file mode 100644
index dff217e9d..000000000
--- a/nx-X11/lib/xtrans/Xtranssock.c
+++ /dev/null
@@ -1,3554 +0,0 @@
-/**************************************************************************/
-/* */
-/* Copyright (c) 2001, 2011 NoMachine (http://www.nomachine.com) */
-/* Copyright (c) 2008-2014 Oleksandr Shneyder <o.shneyder@phoca-gmbh.de> */
-/* Copyright (c) 2011-2016 Mike Gabriel <mike.gabriel@das-netzwerkteam.de>*/
-/* Copyright (c) 2014-2016 Mihai Moldovan <ionic@ionic.de> */
-/* Copyright (c) 2014-2016 Ulrich Sibiller <uli42@gmx.de> */
-/* Copyright (c) 2015-2016 Qindel Group (http://www.qindel.com) */
-/* */
-/* nx-X11, NX protocol compression and NX extensions to this software */
-/* are copyright of the aforementioned persons and companies. */
-/* */
-/* Redistribution and use of the present software is allowed according */
-/* to terms specified in the file LICENSE which comes in the source */
-/* distribution. */
-/* */
-/* All rights reserved. */
-/* */
-/* NOTE: This software has received contributions from various other */
-/* contributors, only the core maintainers and supporters are listed as */
-/* copyright holders. Please contact us, if you feel you should be listed */
-/* as copyright holder, as well. */
-/* */
-/**************************************************************************/
-
-/*
- * Copyright (c) 2002, Oracle and/or its affiliates. All rights reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- */
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of the copyright holders shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from the copyright holders.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifdef NX_TRANS_SOCKET
-
-#ifdef NX_TRANS_DEBUG
-#define XTRANSDEBUG 5
-#endif
-
-#ifndef PF_LOCAL
-#define PF_LOCAL PF_UNIX
-#endif
-
-#endif
-
-#include <ctype.h>
-#ifdef XTHREADS
-#include <nx-X11/Xthreads.h>
-#endif
-
-#ifndef WIN32
-
-#if defined(TCPCONN) || defined(UNIXCONN)
-#include <sys/socket.h>
-#include <netinet/in.h>
-#include <arpa/inet.h>
-#endif
-
-#if defined(TCPCONN) || defined(UNIXCONN)
-#define X_INCLUDE_NETDB_H
-#define XOS_USE_NO_LOCKING
-#include <nx-X11/Xos_r.h>
-#endif
-
-#ifdef UNIXCONN
-#ifndef X_NO_SYS_UN
-#include <sys/un.h>
-#endif
-#include <sys/stat.h>
-#endif
-
-
-#ifndef NO_TCP_H
-#if defined(linux) || defined(__GLIBC__)
-#include <sys/param.h>
-#endif /* linux || __GLIBC__ */
-#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
-#include <sys/param.h>
-#include <machine/endian.h>
-#endif /* __NetBSD__ || __OpenBSD__ || __FreeBSD__ || __DragonFly__ */
-#include <netinet/tcp.h>
-#endif /* !NO_TCP_H */
-
-#include <sys/ioctl.h>
-#if defined(SVR4) || defined(__SVR4)
-#include <sys/filio.h>
-#endif
-
-#include <unistd.h>
-
-#else /* !WIN32 */
-
-#include <nx-X11/Xwinsock.h>
-#include <nx-X11/Xwindows.h>
-#include <nx-X11/Xw32defs.h>
-#undef close
-#define close closesocket
-#define ECONNREFUSED WSAECONNREFUSED
-#define EADDRINUSE WSAEADDRINUSE
-#define EPROTOTYPE WSAEPROTOTYPE
-#undef EWOULDBLOCK
-#define EWOULDBLOCK WSAEWOULDBLOCK
-#define EINPROGRESS WSAEINPROGRESS
-#undef EINTR
-#define EINTR WSAEINTR
-#define X_INCLUDE_NETDB_H
-#define XOS_USE_MTSAFE_NETDBAPI
-#include <nx-X11/Xos_r.h>
-#endif /* WIN32 */
-
-#if defined(SO_DONTLINGER) && defined(SO_LINGER)
-#undef SO_DONTLINGER
-#endif
-
-/* others don't need this */
-#define SocketInitOnce() /**/
-
-#ifdef linux
-#define HAVE_ABSTRACT_SOCKETS
-#endif
-
-#define MIN_BACKLOG 128
-#ifdef SOMAXCONN
-#if SOMAXCONN > MIN_BACKLOG
-#define BACKLOG SOMAXCONN
-#endif
-#endif
-#ifndef BACKLOG
-#define BACKLOG MIN_BACKLOG
-#endif
-
-/*
- * This is the Socket implementation of the X Transport service layer
- *
- * This file contains the implementation for both the UNIX and INET domains,
- * and can be built for either one, or both.
- *
- */
-
-typedef struct _Sockettrans2dev {
- const char *transname;
- int family;
- int devcotsname;
- int devcltsname;
- int protocol;
-} Sockettrans2dev;
-
-static Sockettrans2dev Sockettrans2devtab[] = {
-#ifdef TCPCONN
- {"inet",AF_INET,SOCK_STREAM,SOCK_DGRAM,0},
-#if !defined(IPv6) || !defined(AF_INET6)
- {"tcp",AF_INET,SOCK_STREAM,SOCK_DGRAM,0},
-#else /* IPv6 */
- {"tcp",AF_INET6,SOCK_STREAM,SOCK_DGRAM,0},
- {"tcp",AF_INET,SOCK_STREAM,SOCK_DGRAM,0}, /* fallback */
- {"inet6",AF_INET6,SOCK_STREAM,SOCK_DGRAM,0},
-#endif
-#endif /* TCPCONN */
-#ifdef UNIXCONN
- {"unix",AF_UNIX,SOCK_STREAM,SOCK_DGRAM,0},
-#if !defined(LOCALCONN)
- {"local",AF_UNIX,SOCK_STREAM,SOCK_DGRAM,0},
-#endif /* !LOCALCONN */
-#endif /* UNIXCONN */
-};
-
-#define NUMSOCKETFAMILIES (sizeof(Sockettrans2devtab)/sizeof(Sockettrans2dev))
-
-#ifdef TCPCONN
-static int TRANS(SocketINETClose) (XtransConnInfo ciptr);
-#endif
-
-#ifdef UNIXCONN
-
-
-#if defined(X11_t)
-#define UNIX_PATH "/tmp/.X11-unix/X"
-#define UNIX_DIR "/tmp/.X11-unix"
-#endif /* X11_t */
-#if defined(XIM_t)
-#define UNIX_PATH "/tmp/.XIM-unix/XIM"
-#define UNIX_DIR "/tmp/.XIM-unix"
-#endif /* XIM_t */
-#if defined(FS_t) || defined(FONT_t)
-#define UNIX_PATH "/tmp/.font-unix/fs"
-#define UNIX_DIR "/tmp/.font-unix"
-#endif /* FS_t || FONT_t */
-#if defined(ICE_t)
-#define UNIX_PATH "/tmp/.ICE-unix/"
-#define UNIX_DIR "/tmp/.ICE-unix"
-#endif /* ICE_t */
-
-
-#endif /* UNIXCONN */
-
-#define PORTBUFSIZE 32
-
-#ifndef MAXHOSTNAMELEN
-#define MAXHOSTNAMELEN 255
-#endif
-
-#if defined HAVE_SOCKLEN_T || (defined(IPv6) && defined(AF_INET6))
-# define SOCKLEN_T socklen_t
-#elif defined(SVR4) || defined(__SVR4) || defined(__SCO__)
-# define SOCKLEN_T size_t
-#else
-# define SOCKLEN_T int
-#endif
-
-#ifndef X11_t
-
-/*
- * No NX changes if this is not
- * compiled as a X11 transport.
- */
-
-#undef NX_TRANS_SOCKET
-
-#endif
-
-#ifdef NX_TRANS_SOCKET
-
-#if XTRANS_SEND_FDS
- #error XTRANS_SEND_FDS is unsupported for NX!
-#endif
-
-#ifdef TRANS_CLIENT
-
-#include <nx/NX.h>
-
-typedef struct
-{
- XtransConnInfo info;
- int local;
- int remote;
- int congestion;
-
-} _NXProxyConnInfo;
-
-#define NX_PROXY_CONN_LIMIT 256
-
-static _NXProxyConnInfo *_NXProxyConnInfoTab[NX_PROXY_CONN_LIMIT];
-
-#endif /* #ifdef TRANS_CLIENT */
-
-static char *_NXGetUnixDir(char *dir);
-static char *_NXGetUnixPath(char *path);
-
-/*
- * Forcibly close any connection attempt on the
- * listening socket. Need this to avoid loopback
- * connections to the agent server.
- */
-
-#ifdef TRANS_SERVER
-
-void TRANS(SocketRejectConnection) (XtransConnInfo ciptr)
-{
- socklen_t sa_l = sizeof(struct sockaddr);
- struct sockaddr sa;
- fd_set fs;
- struct timeval t;
- int f;
-
- prmsg (3, "SocketRejectConnection(%p)\n", (void *) ciptr);
-
- FD_ZERO(&fs);
- FD_SET(ciptr -> fd, &fs);
-
- t.tv_sec = 0;
- t.tv_usec = 0;
-
- /*
- * Check if there is an awaiting connection.
- */
-
- if (select(ciptr -> fd + 1, &fs, NULL, NULL, &t) == 1)
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketRejectConnection: Accepting connection attempt on fd [%d].\n",
- ciptr -> fd);
-#endif
- /*
- * If there is one, close it.
- */
-
- if ((f = accept(ciptr -> fd, &sa, &sa_l)) >= 0)
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketRejectConnection: Closing connection attempt on fd [%d].\n",
- ciptr -> fd);
-#endif
- close(f);
- }
- }
-}
-
-#endif /* #ifdef TRANS_SERVER */
-
-#ifdef TRANS_CLIENT
-
-void *TRANS(SocketProxyConnInfo) (XtransConnInfo ciptr)
-{
- if (_NXProxyConnInfoTab[ciptr->fd] != NULL)
- {
- return ciptr->priv;
- }
-
- return NULL;
-}
-
-static XtransConnInfo TRANS(SocketCreateConnInfo) ()
-{
- XtransConnInfo ciptr;
-
- int fds[2];
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCreateConnInfo: Going to create the NX connection info.\n");
-#endif
-
- if ((ciptr = (XtransConnInfo) calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
- {
- prmsg (1, "SocketCreateConnInfo: malloc failed\n");
- return NULL;
- }
-
- /*
- * Create a pair of sockets. We'll communicate with
- * the NX proxy by reading and writing to our end.
- */
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCreateConnInfo: Going to create the NX socketpair.\n");
-#endif
-
- if (socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0)
- {
- prmsg (1, "SocketCreateConnInfo: socketpair() failed.\n");
- free ((char *) ciptr);
- return NULL;
- }
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCreateConnInfo: X socket end is [%d] NX proxy end is [%d].\n",
- fds[0], fds[1]);
-#endif
-
- /*
- * Save in _NXProxyConnInfoTab the local and remote end of
- * the socketpair. The remote end will be used by the proxy.
- * When the memory-to-memory transport is activated, the
- * agent and the proxy don't read or write to the real des-
- * criptors but the communication takes place by reading
- * and writing to the proxy's buffers.
- */
-
- ciptr->fd = fds[0];
-
- if (ciptr->fd >= NX_PROXY_CONN_LIMIT)
- {
- prmsg (1, "SocketCreateConnInfo: No space for a new _NXProxyConnInfo for [%d].\n",
- ciptr->fd);
- free ((char *) ciptr);
- return NULL;
- }
- else if (_NXProxyConnInfoTab[ciptr->fd] != NULL)
- {
- prmsg (1, "SocketCreateConnInfo: _NXProxyConnInfo for [%d] is not NULL. Exiting.\n",
- ciptr->fd);
- exit(1);
- }
-
- _NXProxyConnInfoTab[ciptr->fd] = (_NXProxyConnInfo *) calloc(1, sizeof(_NXProxyConnInfo));
-
- if (_NXProxyConnInfoTab[ciptr->fd] == NULL)
- {
- prmsg (1, "SocketCreateConnInfo: Alloc of _NXProxyConnInfo failed.\n");
- free ((char *) ciptr);
- return NULL;
- }
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCreateConnInfo: Allocated new _NXProxyConnInfo for [%d].\n",
- ciptr->fd);
-#endif
-
- _NXProxyConnInfoTab[ciptr->fd]->info = ciptr;
- _NXProxyConnInfoTab[ciptr->fd]->local = fds[0];
- _NXProxyConnInfoTab[ciptr->fd]->remote = fds[1];
- _NXProxyConnInfoTab[ciptr->fd]->congestion = 0;
-
- ciptr->priv = (char *) _NXProxyConnInfoTab[ciptr->fd];
-
- return ciptr;
-}
-
-static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, const char *host, const char *port)
-{
- int fds[2];
- char display[1024];
-
- _NXProxyConnInfo *proxy_conn;
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketConnectConnInfo: Going to connect NX fd [%d] to host [%s] port [%s].\n",
- ciptr->fd, host, port);
-#endif
-
- /*
- * We should have already created the socket pair.
- */
-
- proxy_conn = (_NXProxyConnInfo *) ciptr->priv;
-
- if (proxy_conn == NULL)
- {
- prmsg (1, "SocketConnectConnInfo: Pointer to _NXProxyConnInfo is NULL. Exiting.\n");
-
- exit(1);
- }
- else if (_NXProxyConnInfoTab[ciptr->fd] != (_NXProxyConnInfo *) ciptr->priv)
- {
- prmsg (1, "SocketConnectConnInfo: Can't find _NXProxyConnInfo in table. Exiting.\n");
-
- exit(1);
- }
-
- if (strlen(host) + strlen(port) + 1 >= 1023)
- {
- prmsg (1, "SocketConnectConnInfo: Length of NX display string '%s:%s' would exceed %d characters.\n",
- host, port, 1023);
-
- return TRANS_CONNECT_FAILED;
- }
-
- sprintf(display, "%s:%s", host, port);
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketConnectConnInfo: Setting close-on-exec flag on local NX descriptor [%d].\n",
- proxy_conn -> local);
-#endif
-
-#ifdef F_SETFD
-#ifdef FD_CLOEXEC
- if (fcntl(proxy_conn -> local, F_SETFD, FD_CLOEXEC) != 0)
-#else
- if (fcntl(proxy_conn -> local, F_SETFD, 1) != 0)
-#endif
-#endif
- {
- prmsg (1, "SocketConnectConnInfo: Cannot set close-on-exec on local NX descriptor [%d].\n",
- proxy_conn -> local);
-
- return TRANS_CONNECT_FAILED;
- }
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketConnectConnInfo: Creating the NX transport with display [%s].\n",
- display);
-#endif
-
- if (NXTransCreate(NX_FD_ANY, NX_MODE_CLIENT, display) < 0)
- {
- prmsg (1, "SocketConnectConnInfo: Cannot create the NX transport.\n");
-
- return TRANS_CONNECT_FAILED;
- }
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketConnectConnInfo: Starting the NX agent with descriptor [%d].\n",
- proxy_conn -> remote);
-#endif
-
- fds[0] = proxy_conn -> local;
- fds[1] = proxy_conn -> remote;
-
- NXTransAgent(fds);
-
- return 0;
-}
-
-static void TRANS(SocketCloseConnInfo) (XtransConnInfo ciptr)
-{
- _NXProxyConnInfo *proxy_conn;
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCloseConnInfo: Going to close the NX fd [%d].\n", ciptr->fd);
-#endif
-
- proxy_conn = (_NXProxyConnInfo *) ciptr->priv;
-
- if (proxy_conn == NULL)
- {
- prmsg (1, "SocketCloseConnInfo: Pointer to _NXProxyConnInfo is NULL. Exiting.\n");
-
- exit(1);
- }
- else if (ciptr->fd >= NX_PROXY_CONN_LIMIT ||
- _NXProxyConnInfoTab[ciptr->fd] != (_NXProxyConnInfo *) ciptr->priv)
- {
- prmsg (1, "SocketCloseConnInfo: Can't find _NXProxyConnInfo in table. Exiting.\n");
- exit(1);
- }
- else if (_NXProxyConnInfoTab[ciptr->fd] -> info != ciptr ||
- _NXProxyConnInfoTab[ciptr->fd] -> local != ciptr->fd)
- {
- prmsg (1, "SocketCloseConnInfo: Invalid _NXProxyConnInfo structure for [%d]. Exiting.\n",
- ciptr->fd);
- exit(1);
- }
- else if (proxy_conn->local < 0 || proxy_conn->remote < 0)
- {
- prmsg (1, "SocketCloseConnInfo: Invalid socket pair in NX connection for [%d]. Exiting.\n",
- ciptr->fd);
- exit(1);
- }
-
- NXTransClose(ciptr->fd);
-
- /*
- * Get rid of the _NXProxyConnInfo structure.
- */
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCloseConnInfo: Freeing _NXProxyConnInfo structure for [%d].\n",
- ciptr->fd);
-#endif
-
- free((char *) _NXProxyConnInfoTab[ciptr->fd]);
-
- _NXProxyConnInfoTab[ciptr->fd] = NULL;
-
- ciptr->priv = NULL;
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCloseConnInfo: Should now close the local descriptor [%d].\n",
- ciptr->fd);
-#endif
-}
-
-#endif /* #ifdef TRANS_CLIENT */
-
-#if defined(TRANS_CLIENT) && defined(NX_TRANS_CHANGE)
-
-/*
- * Check the congestion state of the NX transport
- * and return 1 if there has been a change. This
- * can be extended by adding a few counters track-
- * ing the bandwidth usage of the X11 connection.
- */
-
-int TRANS(SocketCongestionChange) (XtransConnInfo ciptr, int *state)
-{
- int congestion;
-
- _NXProxyConnInfo *proxy_conn;
-
- prmsg (3, "SocketCongestionChange(%p)\n", (void *) ciptr);
-
- proxy_conn = (_NXProxyConnInfo *) ciptr->priv;
-
- if (proxy_conn == NULL)
- {
-#ifdef NX_TRANS_DEBUG
- fprintf(stderr, "SocketCongestionChange: Descriptor [%d] doesn't appear to be a NX connection.\n",
- ciptr->fd);
-#endif
- return 0;
- }
-
-#ifdef NX_TRANS_DEBUG
- fprintf(stderr, "SocketCongestionChange: Checking congestion on fd [%d] with old state [%d].\n",
- ciptr->fd, proxy_conn->congestion);
-#endif
-
- congestion = NXTransCongestion(ciptr->fd);
-
- if (congestion != proxy_conn->congestion)
- {
- proxy_conn->congestion = congestion;
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCongestionChange: Change detected on fd [%d] with new state [%d].\n",
- ciptr->fd, proxy_conn->congestion);
-#endif
- return 1;
- }
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketCongestionChange: No change on fd [%d] with current state [%d].\n",
- ciptr->fd, congestion);
-#endif
- return 0;
-}
-
-#endif /* #if defined(TRANS_CLIENT) && defined(NX_TRANS_CHANGE) */
-
-#endif /* #ifdef NX_TRANS_SOCKET */
-
-/*
- * These are some utility function used by the real interface function below.
- */
-
-static int
-TRANS(SocketSelectFamily) (int first, const char *family)
-
-{
- int i;
-
- prmsg (3,"SocketSelectFamily(%s)\n", family);
-
- for (i = first + 1; i < NUMSOCKETFAMILIES;i++)
- {
- if (!strcmp (family, Sockettrans2devtab[i].transname))
- return i;
- }
-
- return (first == -1 ? -2 : -1);
-}
-
-
-/*
- * This function gets the local address of the socket and stores it in the
- * XtransConnInfo structure for the connection.
- */
-
-static int
-TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
-
-{
-#if defined(IPv6) && defined(AF_INET6)
- struct sockaddr_storage socknamev6;
-#else
- struct sockaddr_in socknamev4;
-#endif
- void *socknamePtr;
- SOCKLEN_T namelen;
-
- prmsg (3,"SocketINETGetAddr(%p)\n", (void *) ciptr);
-
-#if defined(IPv6) && defined(AF_INET6)
- namelen = sizeof(socknamev6);
- socknamePtr = &socknamev6;
-#else
- namelen = sizeof(socknamev4);
- socknamePtr = &socknamev4;
-#endif
-
- bzero(socknamePtr, namelen);
-
- if (getsockname (ciptr->fd,(struct sockaddr *) socknamePtr,
- (void *)&namelen) < 0)
- {
-#ifdef WIN32
- errno = WSAGetLastError();
-#endif
- prmsg (1,"SocketINETGetAddr: getsockname() failed: %d\n",
- EGET());
- return -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- if ((ciptr->addr = malloc (namelen)) == NULL)
- {
- prmsg (1,
- "SocketINETGetAddr: Can't allocate space for the addr\n");
- return -1;
- }
-
-#if defined(IPv6) && defined(AF_INET6)
- ciptr->family = ((struct sockaddr *)socknamePtr)->sa_family;
-#else
- ciptr->family = socknamev4.sin_family;
-#endif
- ciptr->addrlen = namelen;
- memcpy (ciptr->addr, socknamePtr, ciptr->addrlen);
-
- return 0;
-}
-
-
-/*
- * This function gets the remote address of the socket and stores it in the
- * XtransConnInfo structure for the connection.
- */
-
-static int
-TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr)
-
-{
-#if defined(IPv6) && defined(AF_INET6)
- struct sockaddr_storage socknamev6;
-#endif
- struct sockaddr_in socknamev4;
- void *socknamePtr;
- SOCKLEN_T namelen;
-
-#if defined(IPv6) && defined(AF_INET6)
- if (ciptr->family == AF_INET6)
- {
- namelen = sizeof(socknamev6);
- socknamePtr = &socknamev6;
- }
- else
-#endif
- {
- namelen = sizeof(socknamev4);
- socknamePtr = &socknamev4;
- }
-
- bzero(socknamePtr, namelen);
-
- prmsg (3,"SocketINETGetPeerAddr(%p)\n", (void *) ciptr);
-
- if (getpeername (ciptr->fd, (struct sockaddr *) socknamePtr,
- (void *)&namelen) < 0)
- {
-#ifdef WIN32
- errno = WSAGetLastError();
-#endif
- prmsg (1,"SocketINETGetPeerAddr: getpeername() failed: %d\n",
- EGET());
- return -1;
- }
-
- /*
- * Everything looks good: fill in the XtransConnInfo structure.
- */
-
- if ((ciptr->peeraddr = malloc (namelen)) == NULL)
- {
- prmsg (1,
- "SocketINETGetPeerAddr: Can't allocate space for the addr\n");
- return -1;
- }
-
- ciptr->peeraddrlen = namelen;
- memcpy (ciptr->peeraddr, socknamePtr, ciptr->peeraddrlen);
-
- return 0;
-}
-
-
-static XtransConnInfo
-TRANS(SocketOpen) (int i, int type)
-
-{
- XtransConnInfo ciptr;
-
- prmsg (3,"SocketOpen(%d,%d)\n", i, type);
-
- if ((ciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
- {
- prmsg (1, "SocketOpen: malloc failed\n");
- return NULL;
- }
-
- if ((ciptr->fd = socket(Sockettrans2devtab[i].family, type,
- Sockettrans2devtab[i].protocol)) < 0
-#ifndef WIN32
-#if (defined(X11_t) && !defined(USE_POLL)) || defined(FS_t) || defined(FONT_t)
- || ciptr->fd >= sysconf(_SC_OPEN_MAX)
-#endif
-#endif
- ) {
-#ifdef WIN32
- errno = WSAGetLastError();
-#endif
- prmsg (2, "SocketOpen: socket() failed for %s\n",
- Sockettrans2devtab[i].transname);
-
- free (ciptr);
- return NULL;
- }
-
-#ifdef TCP_NODELAY
- if (Sockettrans2devtab[i].family == AF_INET
-#if defined(IPv6) && defined(AF_INET6)
- || Sockettrans2devtab[i].family == AF_INET6
-#endif
- )
- {
- /*
- * turn off TCP coalescence for INET sockets
- */
-
- int tmp = 1;
- setsockopt (ciptr->fd, IPPROTO_TCP, TCP_NODELAY,
- (char *) &tmp, sizeof (int));
- }
-#endif
-
- /*
- * Some systems provide a really small default buffer size for
- * UNIX sockets. Bump it up a bit such that large transfers don't
- * proceed at glacial speed.
- */
-#ifdef SO_SNDBUF
- if (Sockettrans2devtab[i].family == AF_UNIX)
- {
- SOCKLEN_T len = sizeof (int);
- int val;
-
- if (getsockopt (ciptr->fd, SOL_SOCKET, SO_SNDBUF,
- (char *) &val, &len) == 0 && val < 64 * 1024)
- {
- val = 64 * 1024;
- setsockopt (ciptr->fd, SOL_SOCKET, SO_SNDBUF,
- (char *) &val, sizeof (int));
- }
- }
-#endif
-
- return ciptr;
-}
-
-
-#ifdef TRANS_REOPEN
-
-static XtransConnInfo
-TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, const char *port)
-
-{
- XtransConnInfo ciptr;
- int portlen;
- struct sockaddr *addr;
- size_t addrlen;
-
- prmsg (3,"SocketReopen(%d,%d,%s)\n", type, fd, port);
-
- if (port == NULL) {
- prmsg (1, "SocketReopen: port was null!\n");
- return NULL;
- }
-
- portlen = strlen(port) + 1; // include space for trailing null
-#ifdef SOCK_MAXADDRLEN
- if (portlen < 0 || portlen > (SOCK_MAXADDRLEN + 2)) {
- prmsg (1, "SocketReopen: invalid portlen %d\n", portlen);
- return NULL;
- }
- if (portlen < 14) portlen = 14;
-#else
- if (portlen < 0 || portlen > 14) {
- prmsg (1, "SocketReopen: invalid portlen %d\n", portlen);
- return NULL;
- }
-#endif /*SOCK_MAXADDRLEN*/
-
- if ((ciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
- {
- prmsg (1, "SocketReopen: malloc(ciptr) failed\n");
- return NULL;
- }
-
- ciptr->fd = fd;
-
- addrlen = portlen + offsetof(struct sockaddr, sa_data);
- if ((addr = calloc (1, addrlen)) == NULL) {
- prmsg (1, "SocketReopen: malloc(addr) failed\n");
- free (ciptr);
- return NULL;
- }
- ciptr->addr = (char *) addr;
- ciptr->addrlen = addrlen;
-
- if ((ciptr->peeraddr = calloc (1, addrlen)) == NULL) {
- prmsg (1, "SocketReopen: malloc(portaddr) failed\n");
- free (addr);
- free (ciptr);
- return NULL;
- }
- ciptr->peeraddrlen = addrlen;
-
- /* Initialize ciptr structure as if it were a normally-opened unix socket */
- ciptr->flags = TRANS_LOCAL | TRANS_NOUNLINK;
-#ifdef BSD44SOCKETS
- addr->sa_len = addrlen;
-#endif
- addr->sa_family = AF_UNIX;
-#if defined(HAVE_STRLCPY) || defined(HAS_STRLCPY)
- strlcpy(addr->sa_data, port, portlen);
-#else
- strncpy(addr->sa_data, port, portlen);
-#endif
- ciptr->family = AF_UNIX;
- memcpy(ciptr->peeraddr, ciptr->addr, addrlen);
- ciptr->port = rindex(addr->sa_data, ':');
- if (ciptr->port == NULL) {
- if (is_numeric(addr->sa_data)) {
- ciptr->port = addr->sa_data;
- }
- } else if (ciptr->port[0] == ':') {
- ciptr->port++;
- }
- /* port should now point to portnum or NULL */
- return ciptr;
-}
-
-#endif /* TRANS_REOPEN */
-
-
-/*
- * These functions are the interface supplied in the Xtransport structure
- */
-
-#ifdef TRANS_CLIENT
-
-static XtransConnInfo
-TRANS(SocketOpenCOTSClientBase) (const char *transname, const char *protocol,
- const char *host, const char *port, int previndex)
-{
- XtransConnInfo ciptr;
- int i = previndex;
-
- prmsg (2, "SocketOpenCOTSClient(%s,%s,%s)\n",
- protocol, host, port);
-
- SocketInitOnce();
-
- while ((i = TRANS(SocketSelectFamily) (i, transname)) >= 0) {
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- if ((!strcmp(protocol, "local") || !strcmp(protocol, "nx")) &&
- (!strcasecmp(host, "nx") || !strncasecmp(host, "nx,", 3)))
- {
- ciptr = TRANS(SocketCreateConnInfo) ();
-
- if (ciptr == NULL)
- {
- prmsg (1, "SocketOpenCOTSClient: Unable to create the NX connection info for %s.\n",
- transname);
-
- return NULL;
- }
-
- ciptr->index = i;
-
- return ciptr;
- }
-
-#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-
- if ((ciptr = TRANS(SocketOpen) (
- i, Sockettrans2devtab[i].devcotsname)) != NULL) {
- /* Save the index for later use */
-
- ciptr->index = i;
- break;
- }
- }
- if (i < 0) {
- if (i == -1)
- prmsg (1,"SocketOpenCOTSClient: Unable to open socket for %s\n",
- transname);
- else
- prmsg (1,"SocketOpenCOTSClient: Unable to determine socket type for %s\n",
- transname);
- return NULL;
- }
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- ciptr->priv = NULL;
-
-#endif
-
- return ciptr;
-}
-
-static XtransConnInfo
-TRANS(SocketOpenCOTSClient) (Xtransport *thistrans, const char *protocol,
- const char *host, const char *port)
-{
- return TRANS(SocketOpenCOTSClientBase)(
- thistrans->TransName, protocol, host, port, -1);
-}
-
-
-#endif /* TRANS_CLIENT */
-
-
-#ifdef TRANS_SERVER
-
-static XtransConnInfo
-TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, const char *protocol,
- const char *host, const char *port)
-
-{
- XtransConnInfo ciptr;
- int i = -1;
-
- prmsg (2,"SocketOpenCOTSServer(%s,%s,%s)\n", protocol, host, port);
-
- SocketInitOnce();
-
- while ((i = TRANS(SocketSelectFamily) (i, thistrans->TransName)) >= 0) {
- if ((ciptr = TRANS(SocketOpen) (
- i, Sockettrans2devtab[i].devcotsname)) != NULL)
- break;
- }
- if (i < 0) {
- if (i == -1)
- prmsg (1,"SocketOpenCOTSServer: Unable to open socket for %s\n",
- thistrans->TransName);
- else
- prmsg (1,"SocketOpenCOTSServer: Unable to determine socket type for %s\n",
- thistrans->TransName);
- return NULL;
- }
-
- /*
- * Using this prevents the bind() check for an existing server listening
- * on the same port, but it is required for other reasons.
- */
-#ifdef SO_REUSEADDR
-
- /*
- * SO_REUSEADDR only applied to AF_INET && AF_INET6
- */
-
- if (Sockettrans2devtab[i].family == AF_INET
-#if defined(IPv6) && defined(AF_INET6)
- || Sockettrans2devtab[i].family == AF_INET6
-#endif
- )
- {
- int one = 1;
- setsockopt (ciptr->fd, SOL_SOCKET, SO_REUSEADDR,
- (char *) &one, sizeof (int));
- }
-#endif
-#ifdef IPV6_V6ONLY
- if (Sockettrans2devtab[i].family == AF_INET6)
- {
- int one = 1;
- setsockopt(ciptr->fd, IPPROTO_IPV6, IPV6_V6ONLY, &one, sizeof(int));
- }
-#endif
- /* Save the index for later use */
-
- ciptr->index = i;
-
- return ciptr;
-}
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_REOPEN
-
-static XtransConnInfo
-TRANS(SocketReopenCOTSServer) (Xtransport *thistrans, int fd, const char *port)
-
-{
- XtransConnInfo ciptr;
- int i = -1;
-
- prmsg (2,
- "SocketReopenCOTSServer(%d, %s)\n", fd, port);
-
- SocketInitOnce();
-
- while ((i = TRANS(SocketSelectFamily) (i, thistrans->TransName)) >= 0) {
- if ((ciptr = TRANS(SocketReopen) (
- i, Sockettrans2devtab[i].devcotsname, fd, port)) != NULL)
- break;
- }
- if (i < 0) {
- if (i == -1)
- prmsg (1,"SocketReopenCOTSServer: Unable to open socket for %s\n",
- thistrans->TransName);
- else
- prmsg (1,"SocketReopenCOTSServer: Unable to determine socket type for %s\n",
- thistrans->TransName);
- return NULL;
- }
-
- /* Save the index for later use */
-
- ciptr->index = i;
-
- return ciptr;
-}
-
-#endif /* TRANS_REOPEN */
-
-
-static int
-TRANS(SocketSetOption) (XtransConnInfo ciptr, int option, int arg)
-
-{
- prmsg (2,"SocketSetOption(%d,%d,%d)\n", ciptr->fd, option, arg);
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "SocketSetOption: WARNING! Not setting option [%d] with value [%d] on descriptor [%d].\n",
- option, arg, ciptr -> fd);
-#endif
-
- return -1;
-}
-
-#ifdef UNIXCONN
-static int
-set_sun_path(const char *port, const char *upath, char *path, int abstract)
-{
- struct sockaddr_un s;
- int maxlen = sizeof(s.sun_path) - 1;
- const char *at = "";
-
- if (!port || !*port || !path)
- return -1;
-
-#ifdef HAVE_ABSTRACT_SOCKETS
- if (port[0] == '@')
- upath = "";
- else if (abstract)
- at = "@";
-#endif
-
- if (*port == '/') /* a full pathname */
- upath = "";
-
- if (strlen(port) + strlen(upath) > maxlen)
- return -1;
- snprintf(path, sizeof(s.sun_path), "%s%s%s", at, upath, port);
- return 0;
-}
-#endif
-
-#ifdef TRANS_SERVER
-
-static int
-TRANS(SocketCreateListener) (XtransConnInfo ciptr,
- struct sockaddr *sockname,
- int socknamelen, unsigned int flags)
-
-{
- SOCKLEN_T namelen = socknamelen;
- int fd = ciptr->fd;
- int retry;
-
- prmsg (3, "SocketCreateListener(%p,%d)\n", (void *) ciptr, fd);
-
- if (Sockettrans2devtab[ciptr->index].family == AF_INET
-#if defined(IPv6) && defined(AF_INET6)
- || Sockettrans2devtab[ciptr->index].family == AF_INET6
-#endif
- )
- retry = 20;
- else
- retry = 0;
-
-#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
- fprintf(stderr, "SocketCreateListener: Creating listener for ciptr at [%p] on path [%s].\n",
- (void *) ciptr, ((struct sockaddr_un *) sockname)->sun_family == AF_UNIX ?
- ((struct sockaddr_un *) sockname)->sun_path : "TCP");
-#endif
- while (bind (fd, (struct sockaddr *) sockname, namelen) < 0)
- {
- if (errno == EADDRINUSE) {
- if (flags & ADDR_IN_USE_ALLOWED)
- break;
- else
- return TRANS_ADDR_IN_USE;
- }
-
- if (retry-- == 0) {
- prmsg (1, "SocketCreateListener: failed to bind listener\n");
- close (fd);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-#ifdef SO_REUSEADDR
- sleep (1);
-#else
- sleep (10);
-#endif /* SO_REUSEDADDR */
- }
-
- if (Sockettrans2devtab[ciptr->index].family == AF_INET
-#if defined(IPv6) && defined(AF_INET6)
- || Sockettrans2devtab[ciptr->index].family == AF_INET6
-#endif
- ) {
-#ifdef SO_DONTLINGER
- setsockopt (fd, SOL_SOCKET, SO_DONTLINGER, (char *) NULL, 0);
-#else
-#ifdef SO_LINGER
- {
- static int linger[2] = { 0, 0 };
- setsockopt (fd, SOL_SOCKET, SO_LINGER,
- (char *) linger, sizeof (linger));
- }
-#endif
-#endif
-}
-
- if (listen (fd, BACKLOG) < 0)
- {
- prmsg (1, "SocketCreateListener: listen() failed\n");
- close (fd);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- /* Set a flag to indicate that this connection is a listener */
-
- ciptr->flags = 1 | (ciptr->flags & TRANS_KEEPFLAGS);
-
-#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
- fprintf(stderr, "SocketCreateListener: Set flags to [%d] for ciptr [%p].\n",
- ciptr->flags, (void *) ciptr);
-#endif
-
- return 0;
-}
-
-#ifdef TCPCONN
-static int
-TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, const char *port,
- unsigned int flags)
-
-{
-#if defined(IPv6) && defined(AF_INET6)
- struct sockaddr_storage sockname;
-#else
- struct sockaddr_in sockname;
-#endif
- unsigned short sport;
- SOCKLEN_T namelen = sizeof(sockname);
- int status;
- long tmpport;
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgetservbynameparams sparams;
-#endif
- struct servent *servp;
-
-#ifdef X11_t
- char portbuf[PORTBUFSIZE];
-#endif
-
- prmsg (2, "SocketINETCreateListener(%s)\n", port);
-
-#ifdef X11_t
- /*
- * X has a well known port, that is transport dependent. It is easier
- * to handle it here, than try and come up with a transport independent
- * representation that can be passed in and resolved the usual way.
- *
- * The port that is passed here is really a string containing the idisplay
- * from ConnectDisplay().
- */
-
- if (is_numeric (port))
- {
- /* fixup the server port address */
- tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
- snprintf (portbuf, sizeof(portbuf), "%lu", tmpport);
- port = portbuf;
- }
-#endif
-
- if (port && *port)
- {
- /* Check to see if the port string is just a number (handles X11) */
-
- if (!is_numeric (port))
- {
- if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL)
- {
- prmsg (1,
- "SocketINETCreateListener: Unable to get service for %s\n",
- port);
- return TRANS_CREATE_LISTENER_FAILED;
- }
- /* we trust getservbyname to return a valid number */
- sport = servp->s_port;
- }
- else
- {
- tmpport = strtol (port, (char**)NULL, 10);
- /*
- * check that somehow the port address isn't negative or in
- * the range of reserved port addresses. This can happen and
- * be very bad if the server is suid-root and the user does
- * something (dumb) like `X :60049`.
- */
- if (tmpport < 1024 || tmpport > USHRT_MAX)
- return TRANS_CREATE_LISTENER_FAILED;
-
- sport = (unsigned short) tmpport;
- }
- }
- else
- sport = 0;
-
- bzero(&sockname, sizeof(sockname));
-#if defined(IPv6) && defined(AF_INET6)
- if (Sockettrans2devtab[ciptr->index].family == AF_INET) {
- namelen = sizeof (struct sockaddr_in);
-#ifdef BSD44SOCKETS
- ((struct sockaddr_in *)&sockname)->sin_len = namelen;
-#endif
- ((struct sockaddr_in *)&sockname)->sin_family = AF_INET;
- ((struct sockaddr_in *)&sockname)->sin_port = htons(sport);
- ((struct sockaddr_in *)&sockname)->sin_addr.s_addr = htonl(INADDR_ANY);
- } else {
- namelen = sizeof (struct sockaddr_in6);
-#ifdef SIN6_LEN
- ((struct sockaddr_in6 *)&sockname)->sin6_len = sizeof(sockname);
-#endif
- ((struct sockaddr_in6 *)&sockname)->sin6_family = AF_INET6;
- ((struct sockaddr_in6 *)&sockname)->sin6_port = htons(sport);
- ((struct sockaddr_in6 *)&sockname)->sin6_addr = in6addr_any;
- }
-#else
-#ifdef BSD44SOCKETS
- sockname.sin_len = sizeof (sockname);
-#endif
- sockname.sin_family = AF_INET;
- sockname.sin_port = htons (sport);
- sockname.sin_addr.s_addr = htonl (INADDR_ANY);
-#endif
-
- if ((status = TRANS(SocketCreateListener) (ciptr,
- (struct sockaddr *) &sockname, namelen, flags)) < 0)
- {
- prmsg (1,
- "SocketINETCreateListener: ...SocketCreateListener() failed\n");
- return status;
- }
-
- if (TRANS(SocketINETGetAddr) (ciptr) < 0)
- {
- prmsg (1,
- "SocketINETCreateListener: ...SocketINETGetAddr() failed\n");
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- return 0;
-}
-
-#endif /* TCPCONN */
-
-
-#ifdef UNIXCONN
-
-static int
-TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, const char *port,
- unsigned int flags)
-
-{
- struct sockaddr_un sockname;
- int namelen;
- int oldUmask;
- int status;
- unsigned int mode;
- char tmpport[108];
-
- int abstract = 0;
-#ifdef HAVE_ABSTRACT_SOCKETS
- abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
-#endif
-
- prmsg (2, "SocketUNIXCreateListener(%s)\n",
- port ? port : "NULL");
-
- /* Make sure the directory is created */
-
- oldUmask = umask (0);
-
-#ifdef UNIX_DIR
-#ifdef HAS_STICKY_DIR_BIT
- mode = 01777;
-#else
- mode = 0777;
-#endif
-#ifdef NX_TRANS_SOCKET
- if (!abstract && trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) {
- prmsg (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n",
- _NXGetUnixDir(UNIX_DIR), errno);
-#else
- if (!abstract && trans_mkdir(UNIX_DIR, mode) == -1) {
- prmsg (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n",
- UNIX_DIR, errno);
-#endif
- (void) umask (oldUmask);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-#endif
-
- memset(&sockname, 0, sizeof(sockname));
- sockname.sun_family = AF_UNIX;
-
- if (!(port && *port)) {
- snprintf (tmpport, sizeof(tmpport), "%s%ld", UNIX_PATH, (long)getpid());
- port = tmpport;
- }
-#ifdef NX_TRANS_SOCKET
- if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path, abstract) != 0) {
-#else
- if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) {
-#endif
- prmsg (1, "SocketUNIXCreateListener: path too long\n");
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
-#if (defined(BSD44SOCKETS) || defined(__UNIXWARE__))
- sockname.sun_len = strlen(sockname.sun_path);
-#endif
-
-#if defined(BSD44SOCKETS) || defined(SUN_LEN)
- namelen = SUN_LEN(&sockname);
-#else
- namelen = strlen(sockname.sun_path) + offsetof(struct sockaddr_un, sun_path);
-#endif
-
-#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
- fprintf(stderr, "SocketUNIXCreateListener: Unlinking path [%s] for ciptr at [%p].\n",
- sockname.sun_path, (void *) ciptr);
-#endif
- if (abstract) {
- sockname.sun_path[0] = '\0';
- namelen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&sockname.sun_path[1]);
- }
- else
- unlink (sockname.sun_path);
-
- if ((status = TRANS(SocketCreateListener) (ciptr,
- (struct sockaddr *) &sockname, namelen, flags)) < 0)
- {
- prmsg (1,
- "SocketUNIXCreateListener: ...SocketCreateListener() failed\n");
- (void) umask (oldUmask);
- return status;
- }
-
- /*
- * Now that the listener is esablished, create the addr info for
- * this connection. getpeername() doesn't work for UNIX Domain Sockets
- * on some systems (hpux at least), so we will just do it manually, instead
- * of calling something like TRANS(SocketUNIXGetAddr).
- */
-
- namelen = sizeof (sockname); /* this will always make it the same size */
-
- if ((ciptr->addr = malloc (namelen)) == NULL)
- {
- prmsg (1,
- "SocketUNIXCreateListener: Can't allocate space for the addr\n");
- (void) umask (oldUmask);
- return TRANS_CREATE_LISTENER_FAILED;
- }
-
- if (abstract)
- sockname.sun_path[0] = '@';
-
- ciptr->family = sockname.sun_family;
- ciptr->addrlen = namelen;
- memcpy (ciptr->addr, &sockname, ciptr->addrlen);
-
- (void) umask (oldUmask);
-
- return 0;
-}
-
-
-static int
-TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr)
-
-{
- /*
- * See if the unix domain socket has disappeared. If it has, recreate it.
- */
-
- struct sockaddr_un *unsock = (struct sockaddr_un *) ciptr->addr;
- struct stat statb;
- int status = TRANS_RESET_NOOP;
- unsigned int mode;
- int abstract = 0;
-#ifdef HAVE_ABSTRACT_SOCKETS
- abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
-#endif
-
- prmsg (3, "SocketUNIXResetListener(%p,%d)\n", (void *) ciptr, ciptr->fd);
-
- if (!abstract && (
- stat (unsock->sun_path, &statb) == -1 ||
- ((statb.st_mode & S_IFMT) !=
-#if defined(NCR) || defined(SCO325) || !defined(S_IFSOCK)
- S_IFIFO
-#else
- S_IFSOCK
-#endif
- )))
- {
- int oldUmask = umask (0);
-
-#ifdef UNIX_DIR
-#ifdef HAS_STICKY_DIR_BIT
- mode = 01777;
-#else
- mode = 0777;
-#endif
-#ifdef NX_TRANS_SOCKET
- if (trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) {
- prmsg (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n",
- _NXGetUnixDir(UNIX_DIR), errno);
-#else
- if (trans_mkdir(UNIX_DIR, mode) == -1) {
- prmsg (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n",
- UNIX_DIR, errno);
-#endif
- (void) umask (oldUmask);
- return TRANS_RESET_FAILURE;
- }
-#endif
-
- close (ciptr->fd);
- unlink (unsock->sun_path);
-
- if ((ciptr->fd = socket (AF_UNIX, SOCK_STREAM, 0)) < 0)
- {
- TRANS(FreeConnInfo) (ciptr);
- (void) umask (oldUmask);
- return TRANS_RESET_FAILURE;
- }
-
- if (bind (ciptr->fd, (struct sockaddr *) unsock, ciptr->addrlen) < 0)
- {
- close (ciptr->fd);
- TRANS(FreeConnInfo) (ciptr);
- return TRANS_RESET_FAILURE;
- }
-
- if (listen (ciptr->fd, BACKLOG) < 0)
- {
- close (ciptr->fd);
- TRANS(FreeConnInfo) (ciptr);
- (void) umask (oldUmask);
- return TRANS_RESET_FAILURE;
- }
-
- umask (oldUmask);
-
- status = TRANS_RESET_NEW_FD;
- }
-
- return status;
-}
-
-#endif /* UNIXCONN */
-
-
-#ifdef TCPCONN
-
-static XtransConnInfo
-TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status)
-
-{
- XtransConnInfo newciptr;
- struct sockaddr_in sockname;
- SOCKLEN_T namelen = sizeof(sockname);
-
- prmsg (2, "SocketINETAccept(%p,%d)\n", (void *) ciptr, ciptr->fd);
-
- if ((newciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
- {
- prmsg (1, "SocketINETAccept: malloc failed\n");
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
-
- if ((newciptr->fd = accept (ciptr->fd,
- (struct sockaddr *) &sockname, (void *)&namelen)) < 0)
- {
-#ifdef WIN32
- errno = WSAGetLastError();
-#endif
- prmsg (1, "SocketINETAccept: accept() failed\n");
- free (newciptr);
- *status = TRANS_ACCEPT_FAILED;
- return NULL;
- }
-
-#ifdef TCP_NODELAY
- {
- /*
- * turn off TCP coalescence for INET sockets
- */
-
- int tmp = 1;
- setsockopt (newciptr->fd, IPPROTO_TCP, TCP_NODELAY,
- (char *) &tmp, sizeof (int));
- }
-#endif
-
- /*
- * Get this address again because the transport may give a more
- * specific address now that a connection is established.
- */
-
- if (TRANS(SocketINETGetAddr) (newciptr) < 0)
- {
- prmsg (1,
- "SocketINETAccept: ...SocketINETGetAddr() failed:\n");
- close (newciptr->fd);
- free (newciptr);
- *status = TRANS_ACCEPT_MISC_ERROR;
- return NULL;
- }
-
- if (TRANS(SocketINETGetPeerAddr) (newciptr) < 0)
- {
- prmsg (1,
- "SocketINETAccept: ...SocketINETGetPeerAddr() failed:\n");
- close (newciptr->fd);
- if (newciptr->addr) free (newciptr->addr);
- free (newciptr);
- *status = TRANS_ACCEPT_MISC_ERROR;
- return NULL;
- }
-
- *status = 0;
-
- return newciptr;
-}
-
-#endif /* TCPCONN */
-
-
-#ifdef UNIXCONN
-static XtransConnInfo
-TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
-
-{
- XtransConnInfo newciptr;
- struct sockaddr_un sockname;
- SOCKLEN_T namelen = sizeof sockname;
-
- prmsg (2, "SocketUNIXAccept(%p,%d)\n", (void *) ciptr, ciptr->fd);
-
- if ((newciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
- {
- prmsg (1, "SocketUNIXAccept: malloc() failed\n");
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
-
- if ((newciptr->fd = accept (ciptr->fd,
- (struct sockaddr *) &sockname, (void *)&namelen)) < 0)
- {
- prmsg (1, "SocketUNIXAccept: accept() failed\n");
- free (newciptr);
- *status = TRANS_ACCEPT_FAILED;
- return NULL;
- }
-
- ciptr->addrlen = namelen;
- /*
- * Get the socket name and the peer name from the listener socket,
- * since this is unix domain.
- */
-
- if ((newciptr->addr = malloc (ciptr->addrlen)) == NULL)
- {
- prmsg (1,
- "SocketUNIXAccept: Can't allocate space for the addr\n");
- close (newciptr->fd);
- free (newciptr);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
-
- /*
- * if the socket is abstract, we already modified the address to have a
- * @ instead of the initial NUL, so no need to do that again here.
- */
-
- newciptr->addrlen = ciptr->addrlen;
- memcpy (newciptr->addr, ciptr->addr, newciptr->addrlen);
-
- if ((newciptr->peeraddr = malloc (ciptr->addrlen)) == NULL)
- {
- prmsg (1,
- "SocketUNIXAccept: Can't allocate space for the addr\n");
- close (newciptr->fd);
- if (newciptr->addr) free (newciptr->addr);
- free (newciptr);
- *status = TRANS_ACCEPT_BAD_MALLOC;
- return NULL;
- }
-
- newciptr->peeraddrlen = ciptr->addrlen;
- memcpy (newciptr->peeraddr, ciptr->addr, newciptr->addrlen);
-
- newciptr->family = AF_UNIX;
-
- *status = 0;
-
- return newciptr;
-}
-
-#endif /* UNIXCONN */
-
-#endif /* TRANS_SERVER */
-
-
-#ifdef TRANS_CLIENT
-
-#ifdef TCPCONN
-
-#if defined(IPv6) && defined(AF_INET6)
-struct addrlist {
- struct addrinfo * addr;
- struct addrinfo * firstaddr;
- char port[PORTBUFSIZE];
- char host[MAXHOSTNAMELEN];
-};
-static struct addrlist *addrlist = NULL;
-#endif
-
-
-static int
-TRANS(SocketINETConnect) (XtransConnInfo ciptr,
- const char *host, const char *port)
-
-{
- struct sockaddr * socketaddr = NULL;
- int socketaddrlen = 0;
- int res;
-#if defined(IPv6) && defined(AF_INET6)
- struct addrinfo hints;
- char ntopbuf[INET6_ADDRSTRLEN];
- int resetonce = 0;
-#else
- struct sockaddr_in sockname;
- struct hostent *hostp;
- struct servent *servp;
- unsigned long tmpaddr;
-#endif
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
- _Xgetservbynameparams sparams;
-#endif
-#ifdef X11_t
- char portbuf[PORTBUFSIZE];
-#endif
-
- char hostnamebuf[256]; /* tmp space */
-
- prmsg (2,"SocketINETConnect(%d,%s,%s)\n", ciptr->fd, host, port);
-
- if (!host)
- {
- hostnamebuf[0] = '\0';
- (void) TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf);
- host = hostnamebuf;
- }
-
-#ifdef X11_t
- /*
- * X has a well known port, that is transport dependent. It is easier
- * to handle it here, than try and come up with a transport independent
- * representation that can be passed in and resolved the usual way.
- *
- * The port that is passed here is really a string containing the idisplay
- * from ConnectDisplay().
- */
-
- if (is_numeric (port))
- {
- long tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
- snprintf (portbuf, sizeof(portbuf), "%lu", tmpport);
- port = portbuf;
- }
-#endif
-
-#if defined(IPv6) && defined(AF_INET6)
- {
- if (addrlist != NULL) {
- if (strcmp(host,addrlist->host) || strcmp(port,addrlist->port)) {
- if (addrlist->firstaddr)
- freeaddrinfo(addrlist->firstaddr);
- addrlist->firstaddr = NULL;
- }
- } else {
- addrlist = malloc(sizeof(struct addrlist));
- addrlist->firstaddr = NULL;
- }
-
- if (addrlist->firstaddr == NULL) {
- strncpy(addrlist->port, port, sizeof(addrlist->port));
- addrlist->port[sizeof(addrlist->port) - 1] = '\0';
- strncpy(addrlist->host, host, sizeof(addrlist->host));
- addrlist->host[sizeof(addrlist->host) - 1] = '\0';
-
- bzero(&hints,sizeof(hints));
- hints.ai_socktype = Sockettrans2devtab[ciptr->index].devcotsname;
-
- res = getaddrinfo(host,port,&hints,&addrlist->firstaddr);
- if (res != 0) {
- prmsg (1, "SocketINETConnect() can't get address "
- "for %s:%s: %s\n", host, port, gai_strerror(res));
- ESET(EINVAL);
- return TRANS_CONNECT_FAILED;
- }
- for (res = 0, addrlist->addr = addrlist->firstaddr;
- addrlist->addr ; res++) {
- addrlist->addr = addrlist->addr->ai_next;
- }
- prmsg(4,"Got New Address list with %d addresses\n", res);
- res = 0;
- addrlist->addr = NULL;
- }
-
- while (socketaddr == NULL) {
- if (addrlist->addr == NULL) {
- if (resetonce) {
- /* Already checked entire list - no usable addresses */
- prmsg (1, "SocketINETConnect() no usable address "
- "for %s:%s\n", host, port);
- return TRANS_CONNECT_FAILED;
- } else {
- /* Go back to beginning of list */
- resetonce = 1;
- addrlist->addr = addrlist->firstaddr;
- }
- }
-
- socketaddr = addrlist->addr->ai_addr;
- socketaddrlen = addrlist->addr->ai_addrlen;
-
- if (addrlist->addr->ai_family == AF_INET) {
- struct sockaddr_in *sin = (struct sockaddr_in *) socketaddr;
-
- prmsg (4,"SocketINETConnect() sockname.sin_addr = %s\n",
- inet_ntop(addrlist->addr->ai_family,&sin->sin_addr,
- ntopbuf,sizeof(ntopbuf)));
-
- prmsg (4,"SocketINETConnect() sockname.sin_port = %d\n",
- ntohs(sin->sin_port));
-
- if (Sockettrans2devtab[ciptr->index].family == AF_INET6) {
- if (strcmp(Sockettrans2devtab[ciptr->index].transname,
- "tcp") == 0) {
- XtransConnInfo newciptr;
-
- /*
- * Our socket is an IPv6 socket, but the address is
- * IPv4. Close it and get an IPv4 socket. This is
- * needed for IPv4 connections to work on platforms
- * that don't allow IPv4 over IPv6 sockets.
- */
- TRANS(SocketINETClose)(ciptr);
- newciptr = TRANS(SocketOpenCOTSClientBase)(
- "tcp", "tcp", host, port, ciptr->index);
- if (newciptr)
- ciptr->fd = newciptr->fd;
- if (!newciptr ||
- Sockettrans2devtab[newciptr->index].family !=
- AF_INET) {
- socketaddr = NULL;
- prmsg (4,"SocketINETConnect() Cannot get IPv4 "
- " socketfor IPv4 address\n");
- }
- if (newciptr)
- free(newciptr);
- } else {
- socketaddr = NULL;
- prmsg (4,"SocketINETConnect Skipping IPv4 address\n");
- }
- }
- } else if (addrlist->addr->ai_family == AF_INET6) {
- struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) socketaddr;
-
- prmsg (4,"SocketINETConnect() sockname.sin6_addr = %s\n",
- inet_ntop(addrlist->addr->ai_family,
- &sin6->sin6_addr,ntopbuf,sizeof(ntopbuf)));
- prmsg (4,"SocketINETConnect() sockname.sin6_port = %d\n",
- ntohs(sin6->sin6_port));
-
- if (Sockettrans2devtab[ciptr->index].family == AF_INET) {
- if (strcmp(Sockettrans2devtab[ciptr->index].transname,
- "tcp") == 0) {
- XtransConnInfo newciptr;
-
- /*
- * Close the IPv4 socket and try to open an IPv6 socket.
- */
- TRANS(SocketINETClose)(ciptr);
- newciptr = TRANS(SocketOpenCOTSClientBase)(
- "tcp", "tcp", host, port, -1);
- if (newciptr)
- ciptr->fd = newciptr->fd;
- if (!newciptr ||
- Sockettrans2devtab[newciptr->index].family !=
- AF_INET6) {
- socketaddr = NULL;
- prmsg (4,"SocketINETConnect() Cannot get IPv6 "
- "socket for IPv6 address\n");
- }
- if (newciptr)
- free(newciptr);
- }
- else
- {
- socketaddr = NULL;
- prmsg (4,"SocketINETConnect() Skipping IPv6 address\n");
- }
- }
- } else {
- socketaddr = NULL; /* Unsupported address type */
- }
- if (socketaddr == NULL) {
- addrlist->addr = addrlist->addr->ai_next;
- }
- }
- }
-#else
- {
- /*
- * Build the socket name.
- */
-
-#ifdef BSD44SOCKETS
- sockname.sin_len = sizeof (struct sockaddr_in);
-#endif
- sockname.sin_family = AF_INET;
-
- /*
- * fill in sin_addr
- */
-
-#ifndef INADDR_NONE
-#define INADDR_NONE ((in_addr_t) 0xffffffff)
-#endif
-
- /* check for ww.xx.yy.zz host string */
-
- if (isascii (host[0]) && isdigit (host[0])) {
- tmpaddr = inet_addr (host); /* returns network byte order */
- } else {
- tmpaddr = INADDR_NONE;
- }
-
- prmsg (4,"SocketINETConnect() inet_addr(%s) = %x\n", host, tmpaddr);
-
- if (tmpaddr == INADDR_NONE) {
- if ((hostp = _XGethostbyname(host,hparams)) == NULL) {
- prmsg (1,"SocketINETConnect: Can't get address for %s\n",
- host);
- ESET(EINVAL);
- return TRANS_CONNECT_FAILED;
- }
- if (hostp->h_addrtype != AF_INET) { /* is IP host? */
- prmsg (1,"SocketINETConnect: not INET host%s\n", host);
- ESET(EPROTOTYPE);
- return TRANS_CONNECT_FAILED;
- }
-
- memcpy ((char *) &sockname.sin_addr, (char *) hostp->h_addr,
- sizeof (sockname.sin_addr));
-
- } else {
- sockname.sin_addr.s_addr = tmpaddr;
- }
-
- /*
- * fill in sin_port
- */
-
- /* Check for number in the port string */
-
- if (!is_numeric (port)) {
- if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL) {
- prmsg (1,"SocketINETConnect: can't get service for %s\n",
- port);
- return TRANS_CONNECT_FAILED;
- }
- sockname.sin_port = htons (servp->s_port);
- } else {
- long tmpport = strtol (port, (char**)NULL, 10);
- if (tmpport < 1024 || tmpport > USHRT_MAX)
- return TRANS_CONNECT_FAILED;
- sockname.sin_port = htons (((unsigned short) tmpport));
- }
-
- prmsg (4,"SocketINETConnect: sockname.sin_port = %d\n",
- ntohs(sockname.sin_port));
- socketaddr = (struct sockaddr *) &sockname;
- socketaddrlen = sizeof(sockname);
- }
-#endif
-
- /*
- * Turn on socket keepalive so the client process will eventually
- * be notified with a SIGPIPE signal if the display server fails
- * to respond to a periodic transmission of messages
- * on the connected socket.
- * This is useful to avoid hung application processes when the
- * processes are not spawned from the xdm session and
- * the display server terminates abnormally.
- * (Someone turned off the power switch.)
- */
-
- {
- int tmp = 1;
- setsockopt (ciptr->fd, SOL_SOCKET, SO_KEEPALIVE,
- (char *) &tmp, sizeof (int));
- }
-
- /*
- * Do the connect()
- */
-
- if (connect (ciptr->fd, socketaddr, socketaddrlen ) < 0)
- {
-#ifdef WIN32
- int olderrno = WSAGetLastError();
-#else
- int olderrno = errno;
-#endif
-
- /*
- * If the error was ECONNREFUSED, the server may be overloaded
- * and we should try again.
- *
- * If the error was EWOULDBLOCK or EINPROGRESS then the socket
- * was non-blocking and we should poll using select
- *
- * If the error was EINTR, the connect was interrupted and we
- * should try again.
- *
- * If multiple addresses are found for a host then we should
- * try to connect again with a different address for a larger
- * number of errors that made us quit before, since those
- * could be caused by trying to use an IPv6 address to contact
- * a machine with an IPv4-only server or other reasons that
- * only affect one of a set of addresses.
- */
-
- if (olderrno == ECONNREFUSED || olderrno == EINTR
-#if defined(IPv6) && defined(AF_INET6)
- || (((addrlist->addr->ai_next != NULL) ||
- (addrlist->addr != addrlist->firstaddr)) &&
- (olderrno == ENETUNREACH || olderrno == EAFNOSUPPORT ||
- olderrno == EADDRNOTAVAIL || olderrno == ETIMEDOUT
-#if defined(EHOSTDOWN)
- || olderrno == EHOSTDOWN
-#endif
- ))
-#endif
- )
- res = TRANS_TRY_CONNECT_AGAIN;
- else if (olderrno == EWOULDBLOCK || olderrno == EINPROGRESS)
- res = TRANS_IN_PROGRESS;
- else
- {
- prmsg (2,"SocketINETConnect: Can't connect: errno = %d\n",
- olderrno);
-
- res = TRANS_CONNECT_FAILED;
- }
- } else {
- res = 0;
-
-
- /*
- * Sync up the address fields of ciptr.
- */
-
- if (TRANS(SocketINETGetAddr) (ciptr) < 0)
- {
- prmsg (1,
- "SocketINETConnect: ...SocketINETGetAddr() failed:\n");
- res = TRANS_CONNECT_FAILED;
- }
-
- else if (TRANS(SocketINETGetPeerAddr) (ciptr) < 0)
- {
- prmsg (1,
- "SocketINETConnect: ...SocketINETGetPeerAddr() failed:\n");
- res = TRANS_CONNECT_FAILED;
- }
- }
-
-#if defined(IPv6) && defined(AF_INET6)
- if (res != 0) {
- addrlist->addr = addrlist->addr->ai_next;
- }
-#endif
-
- return res;
-}
-
-#endif /* TCPCONN */
-
-
-
-#ifdef UNIXCONN
-
-/*
- * Make sure 'host' is really local.
- */
-
-static int
-UnixHostReallyLocal (const char *host)
-
-{
- char hostnamebuf[256];
-
- TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf));
-
- if (strcmp (hostnamebuf, host) == 0)
- {
- return (1);
- } else {
-#if defined(IPv6) && defined(AF_INET6)
- struct addrinfo *localhostaddr;
- struct addrinfo *otherhostaddr;
- struct addrinfo *i, *j;
- int equiv = 0;
-
- if (getaddrinfo(hostnamebuf, NULL, NULL, &localhostaddr) != 0)
- return 0;
- if (getaddrinfo(host, NULL, NULL, &otherhostaddr) != 0) {
- freeaddrinfo(localhostaddr);
- return 0;
- }
-
- for (i = localhostaddr; i != NULL && equiv == 0; i = i->ai_next) {
- for (j = otherhostaddr; j != NULL && equiv == 0; j = j->ai_next) {
- if (i->ai_family == j->ai_family) {
- if (i->ai_family == AF_INET) {
- struct sockaddr_in *sinA
- = (struct sockaddr_in *) i->ai_addr;
- struct sockaddr_in *sinB
- = (struct sockaddr_in *) j->ai_addr;
- struct in_addr *A = &sinA->sin_addr;
- struct in_addr *B = &sinB->sin_addr;
-
- if (memcmp(A,B,sizeof(struct in_addr)) == 0) {
- equiv = 1;
- }
- } else if (i->ai_family == AF_INET6) {
- struct sockaddr_in6 *sinA
- = (struct sockaddr_in6 *) i->ai_addr;
- struct sockaddr_in6 *sinB
- = (struct sockaddr_in6 *) j->ai_addr;
- struct in6_addr *A = &sinA->sin6_addr;
- struct in6_addr *B = &sinB->sin6_addr;
-
- if (memcmp(A,B,sizeof(struct in6_addr)) == 0) {
- equiv = 1;
- }
- }
- }
- }
- }
-
- freeaddrinfo(localhostaddr);
- freeaddrinfo(otherhostaddr);
- return equiv;
-#else
- /*
- * A host may have more than one network address. If any of the
- * network addresses of 'host' (specified to the connect call)
- * match any of the network addresses of 'hostname' (determined
- * by TRANS(GetHostname)), then the two hostnames are equivalent,
- * and we know that 'host' is really a local host.
- */
- char specified_local_addr_list[10][4];
- int scount, equiv, i, j;
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
-#endif
- struct hostent *hostp;
-
- if ((hostp = _XGethostbyname (host,hparams)) == NULL)
- return (0);
-
- scount = 0;
- while (hostp->h_addr_list[scount] && scount <= 8)
- {
- /*
- * The 2nd call to gethostname() overrides the data
- * from the 1st call, so we must save the address list.
- */
-
- specified_local_addr_list[scount][0] =
- hostp->h_addr_list[scount][0];
- specified_local_addr_list[scount][1] =
- hostp->h_addr_list[scount][1];
- specified_local_addr_list[scount][2] =
- hostp->h_addr_list[scount][2];
- specified_local_addr_list[scount][3] =
- hostp->h_addr_list[scount][3];
- scount++;
- }
- if ((hostp = _XGethostbyname (hostnamebuf,hparams)) == NULL)
- return (0);
-
- equiv = 0;
- i = 0;
-
- while (i < scount && !equiv)
- {
- j = 0;
-
- while (hostp->h_addr_list[j])
- {
- if ((specified_local_addr_list[i][0] ==
- hostp->h_addr_list[j][0]) &&
- (specified_local_addr_list[i][1] ==
- hostp->h_addr_list[j][1]) &&
- (specified_local_addr_list[i][2] ==
- hostp->h_addr_list[j][2]) &&
- (specified_local_addr_list[i][3] ==
- hostp->h_addr_list[j][3]))
- {
- /* They're equal, so we're done */
-
- equiv = 1;
- break;
- }
-
- j++;
- }
-
- i++;
- }
- return (equiv);
-#endif
- }
-}
-
-static int
-TRANS(SocketUNIXConnect) (XtransConnInfo ciptr,
- const char *host, const char *port)
-
-{
- struct sockaddr_un sockname;
- SOCKLEN_T namelen;
-
-
- int abstract = 0;
-#ifdef HAVE_ABSTRACT_SOCKETS
- abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
-#endif
-
- prmsg (2,"SocketUNIXConnect(%d,%s,%s)\n", ciptr->fd, host, port);
-
- /*
- * Make sure 'host' is really local. If not, we return failure.
- * The reason we make this check is because a process may advertise
- * a "local" network ID for which it can accept connections, but if
- * a process on a remote machine tries to connect to this network ID,
- * we know for sure it will fail.
- */
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
- if (host && *host && host[0]!='/' && strcmp(host, "unix") != 0 && strcasecmp(host, "nx") != 0 &&
- strncasecmp(host, "nx,", 3) != 0 && !UnixHostReallyLocal (host))
-#else
- if (host && *host && host[0]!='/' && strcmp (host, "unix") != 0 && !UnixHostReallyLocal (host))
-#endif
- {
- prmsg (1,
- "SocketUNIXConnect: Cannot connect to non-local host %s\n",
- host);
- return TRANS_CONNECT_FAILED;
- }
-
-
- /*
- * Check the port.
- */
-
- if (!port || !*port)
- {
- prmsg (1,"SocketUNIXConnect: Missing port specification\n");
- return TRANS_CONNECT_FAILED;
- }
-
- /*
- * Build the socket name.
- */
-
- sockname.sun_family = AF_UNIX;
-
-#ifdef NX_TRANS_SOCKET
- if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path, abstract) != 0) {
-#else
- if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) {
-#endif
- prmsg (1, "SocketUNIXConnect: path too long\n");
- return TRANS_CONNECT_FAILED;
- }
-
-#if (defined(BSD44SOCKETS) || defined(__UNIXWARE__))
- sockname.sun_len = strlen (sockname.sun_path);
-#endif
-
-#if defined(BSD44SOCKETS) || defined(SUN_LEN)
- namelen = SUN_LEN (&sockname);
-#else
- namelen = strlen (sockname.sun_path) + offsetof(struct sockaddr_un, sun_path);
-#endif
-
-
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- if (ciptr->priv != NULL)
- {
- if (TRANS(SocketConnectConnInfo) (ciptr, host, port) != 0)
- {
- return TRANS_CONNECT_FAILED;
- }
-
- goto SocketUNIXConnectPost;
- }
-
-#endif
-
- /*
- * Adjust the socket path if using abstract sockets.
- * Done here because otherwise all the strlen() calls above would fail.
- */
-
- if (abstract) {
- sockname.sun_path[0] = '\0';
- }
-
- /*
- * Do the connect()
- */
-
- if (connect (ciptr->fd, (struct sockaddr *) &sockname, namelen) < 0)
- {
- int olderrno = errno;
- int connected = 0;
-
- if (!connected)
- {
- errno = olderrno;
-
- /*
- * If the error was ENOENT, the server may be starting up; we used
- * to suggest to try again in this case with
- * TRANS_TRY_CONNECT_AGAIN, but this introduced problems for
- * processes still referencing stale sockets in their environment.
- * Hence, we now return a hard error, TRANS_CONNECT_FAILED, and it
- * is suggested that higher level stacks handle retries on their
- * level when they face a slow starting server.
- *
- * If the error was EWOULDBLOCK or EINPROGRESS then the socket
- * was non-blocking and we should poll using select
- *
- * If the error was EINTR, the connect was interrupted and we
- * should try again.
- */
-
- if (olderrno == EWOULDBLOCK || olderrno == EINPROGRESS)
- return TRANS_IN_PROGRESS;
- else if (olderrno == EINTR)
- return TRANS_TRY_CONNECT_AGAIN;
- else if (olderrno == ENOENT || olderrno == ECONNREFUSED) {
- /* If opening as abstract socket failed, try again normally */
- if (abstract) {
- ciptr->transptr->flags &= ~(TRANS_ABSTRACT);
- return TRANS_TRY_CONNECT_AGAIN;
- } else {
- return TRANS_CONNECT_FAILED;
- }
- } else {
- prmsg (2,"SocketUNIXConnect: Can't connect: errno = %d\n",
- EGET());
-
- return TRANS_CONNECT_FAILED;
- }
- }
- }
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
-SocketUNIXConnectPost:
-
-#endif
-
- /*
- * Get the socket name and the peer name from the connect socket,
- * since this is unix domain.
- */
-
- if ((ciptr->addr = malloc(namelen)) == NULL ||
- (ciptr->peeraddr = malloc(namelen)) == NULL)
- {
- prmsg (1,
- "SocketUNIXCreateListener: Can't allocate space for the addr\n");
- return TRANS_CONNECT_FAILED;
- }
-
- if (abstract)
- sockname.sun_path[0] = '@';
-
- ciptr->family = AF_UNIX;
- ciptr->addrlen = namelen;
- ciptr->peeraddrlen = namelen;
- memcpy (ciptr->addr, &sockname, ciptr->addrlen);
- memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen);
-
- return 0;
-}
-
-#endif /* UNIXCONN */
-
-#endif /* TRANS_CLIENT */
-
-
-static int
-TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
-
-{
- prmsg (2,"SocketBytesReadable(%p,%d,%p)\n",
- (void *) ciptr, ciptr->fd, (void *) pend);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- if (ciptr->priv)
- {
- if (NXTransRunning(ciptr->fd) == 0)
- {
- /*
- * Force the application to shut down the
- * socket if the NX transport is gone. We
- * may probably save this additional call.
- */
-
-#ifdef NX_TRANS_DEBUG
- fprintf(stderr, "SocketBytesReadable: NX transport not running for descriptor [%d].\n",
- ciptr->fd);
-#endif
- ESET(EPIPE);
-
- return -1;
- }
- else
- {
- /*
- * Emulate BytesReadable. Some X applications may use the system
- * select() in their main loop, instead of the _XSelect() that is
- * replaced by NX. Still these applications use _XEventsQueued to
- * poll events from the X connection, and _XEventsQueued uses the
- * NX _XSelect(), so it is generally possible to let the client
- * yield the control to NX and let it handle the I/O on the proxy
- * descriptors even if the application is not explicitly designed
- * to work as a NX agent.
- */
-
-#ifdef NX_TRANS_DEBUG
-
- int result;
-
- result = NXTransReadable(ciptr->fd, (int *) pend);
-
- fprintf(stderr, "SocketBytesReadable: Descriptor [%d] result [%d] readable [%ld].\n",
- ciptr->fd, result, *pend);
-
- return result;
-#else
- return NXTransReadable(ciptr->fd, (int *) pend);
-#endif
- }
- }
-
-#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-
-#ifdef WIN32
- {
- int ret = ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend);
- if (ret == SOCKET_ERROR) errno = WSAGetLastError();
- return ret;
- }
-#else
- return ioctl (ciptr->fd, FIONREAD, (char *) pend);
-#endif /* WIN32 */
-}
-
-#if XTRANS_SEND_FDS
-
-static void
-appendFd(struct _XtransConnFd **prev, int fd, int do_close)
-{
- struct _XtransConnFd *cf, *new;
-
- new = malloc (sizeof (struct _XtransConnFd));
- if (!new) {
- /* XXX mark connection as broken */
- close(fd);
- return;
- }
- new->next = 0;
- new->fd = fd;
- new->do_close = do_close;
- /* search to end of list */
- for (; (cf = *prev); prev = &(cf->next));
- *prev = new;
-}
-
-static int
-removeFd(struct _XtransConnFd **prev)
-{
- struct _XtransConnFd *cf;
- int fd;
-
- if ((cf = *prev)) {
- *prev = cf->next;
- fd = cf->fd;
- free(cf);
- } else
- fd = -1;
- return fd;
-}
-
-static void
-discardFd(struct _XtransConnFd **prev, struct _XtransConnFd *upto, int do_close)
-{
- struct _XtransConnFd *cf, *next;
-
- for (cf = *prev; cf != upto; cf = next) {
- next = cf->next;
- if (do_close || cf->do_close)
- close(cf->fd);
- free(cf);
- }
- *prev = upto;
-}
-
-static void
-cleanupFds(XtransConnInfo ciptr)
-{
- /* Clean up the send list but don't close the fds */
- discardFd(&ciptr->send_fds, NULL, 0);
- /* Clean up the recv list and *do* close the fds */
- discardFd(&ciptr->recv_fds, NULL, 1);
-}
-
-static int
-nFd(struct _XtransConnFd **prev)
-{
- struct _XtransConnFd *cf;
- int n = 0;
-
- for (cf = *prev; cf; cf = cf->next)
- n++;
- return n;
-}
-
-static int
-TRANS(SocketRecvFd) (XtransConnInfo ciptr)
-{
- prmsg (2, "SocketRecvFd(%d)\n", ciptr->fd);
- return removeFd(&ciptr->recv_fds);
-}
-
-static int
-TRANS(SocketSendFd) (XtransConnInfo ciptr, int fd, int do_close)
-{
- appendFd(&ciptr->send_fds, fd, do_close);
- return 0;
-}
-
-static int
-TRANS(SocketRecvFdInvalid)(XtransConnInfo ciptr)
-{
- errno = EINVAL;
- return -1;
-}
-
-static int
-TRANS(SocketSendFdInvalid)(XtransConnInfo ciptr, int fd, int do_close)
-{
- errno = EINVAL;
- return -1;
-}
-
-#define MAX_FDS 128
-
-union fd_pass {
- struct cmsghdr cmsghdr;
- char buf[CMSG_SPACE(MAX_FDS * sizeof(int))];
-};
-
-#endif /* XTRANS_SEND_FDS */
-
-static int
-TRANS(SocketRead) (XtransConnInfo ciptr, char *buf, int size)
-
-{
- prmsg (2,"SocketRead(%d,%p,%d)\n", ciptr->fd, (void *) buf, size);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- /*
- * If we have a valid priv pointer then this
- * is an internal connection to the proxy.
- * In this case we should emulate the read.
- */
-
- if (ciptr->priv)
- {
- int result;
-
- result = NXTransRead(ciptr->fd, buf, size);
-
-#ifdef NX_TRANS_DEBUG
- if (result < 0 && EGET() == EAGAIN)
- {
- fprintf(stderr, "SocketRead: Read from descriptor [%d] would block.\n",
- ciptr->fd);
- }
- else
- {
- fprintf(stderr, "SocketRead: Read [%d] bytes from descriptor [%d].\n",
- result, ciptr->fd);
- }
-#endif
- return result;
- }
- else
- {
- /* FIXME: same code as below, should be possible without duplication */
-#if XTRANS_SEND_FDS
- struct iovec iov = {
- .iov_base = buf,
- .iov_len = size
- };
- union fd_pass cmsgbuf;
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = &iov,
- .msg_iovlen = 1,
- .msg_control = cmsgbuf.buf,
- .msg_controllen = CMSG_LEN(MAX_FDS * sizeof(int))
- };
-
- size = recvmsg(ciptr->fd, &msg, 0);
- if (size >= 0) {
- struct cmsghdr *hdr;
-
- for (hdr = CMSG_FIRSTHDR(&msg); hdr; hdr = CMSG_NXTHDR(&msg, hdr)) {
- if (hdr->cmsg_level == SOL_SOCKET && hdr->cmsg_type == SCM_RIGHTS) {
- int nfd = (hdr->cmsg_len - CMSG_LEN(0)) / sizeof (int);
- int i;
- int *fd = (int *) CMSG_DATA(hdr);
-
- for (i = 0; i < nfd; i++)
- appendFd(&ciptr->recv_fds, fd[i], 0);
- }
- }
- }
- return size;
-#else
- return read (ciptr->fd, buf, size);
-#endif /* XTRANS_SEND_FDS */
- }
-
-#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-
-#if defined(WIN32)
- {
- int ret = recv ((SOCKET)ciptr->fd, buf, size, 0);
-#ifdef WIN32
- if (ret == SOCKET_ERROR) errno = WSAGetLastError();
-#endif
- return ret;
- }
-#else
-#if XTRANS_SEND_FDS
- {
- struct iovec iov = {
- .iov_base = buf,
- .iov_len = size
- };
- union fd_pass cmsgbuf;
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = &iov,
- .msg_iovlen = 1,
- .msg_control = cmsgbuf.buf,
- .msg_controllen = CMSG_LEN(MAX_FDS * sizeof(int))
- };
-
- size = recvmsg(ciptr->fd, &msg, 0);
- if (size >= 0) {
- struct cmsghdr *hdr;
-
- for (hdr = CMSG_FIRSTHDR(&msg); hdr; hdr = CMSG_NXTHDR(&msg, hdr)) {
- if (hdr->cmsg_level == SOL_SOCKET && hdr->cmsg_type == SCM_RIGHTS) {
- int nfd = (hdr->cmsg_len - CMSG_LEN(0)) / sizeof (int);
- int i;
- int *fd = (int *) CMSG_DATA(hdr);
-
- for (i = 0; i < nfd; i++)
- appendFd(&ciptr->recv_fds, fd[i], 0);
- }
- }
- }
- return size;
- }
-#else
- return read (ciptr->fd, buf, size);
-#endif /* XTRANS_SEND_FDS */
-#endif /* WIN32 */
-
-#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-}
-
-static int
-TRANS(SocketReadv) (XtransConnInfo ciptr, struct iovec *buf, int size)
-
-{
- prmsg (2,"SocketReadv(%d,%p,%d)\n", ciptr->fd, (void *) buf, size);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- /*
- * If we have a valid priv pointer then this
- * is an internal connection to the proxy.
- * In this case we should emulate the readv.
- */
-
- if (ciptr->priv)
- {
- return NXTransReadVector(ciptr->fd, buf, size);
- }
- else
- {
- /* FIXME: same code as below, should be possible without duplication */
-#if XTRANS_SEND_FDS
- union fd_pass cmsgbuf;
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = buf,
- .msg_iovlen = size,
- .msg_control = cmsgbuf.buf,
- .msg_controllen = CMSG_LEN(MAX_FDS * sizeof(int))
- };
-
- size = recvmsg(ciptr->fd, &msg, 0);
- if (size >= 0) {
- struct cmsghdr *hdr;
-
- for (hdr = CMSG_FIRSTHDR(&msg); hdr; hdr = CMSG_NXTHDR(&msg, hdr)) {
- if (hdr->cmsg_level == SOL_SOCKET && hdr->cmsg_type == SCM_RIGHTS) {
- int nfd = (hdr->cmsg_len - CMSG_LEN(0)) / sizeof (int);
- int i;
- int *fd = (int *) CMSG_DATA(hdr);
-
- for (i = 0; i < nfd; i++)
- appendFd(&ciptr->recv_fds, fd[i], 0);
- }
- }
- }
- return size;
-#else
- return READV (ciptr, buf, size);
-#endif
- }
-
-#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-
-#if XTRANS_SEND_FDS
- {
- union fd_pass cmsgbuf;
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = buf,
- .msg_iovlen = size,
- .msg_control = cmsgbuf.buf,
- .msg_controllen = CMSG_LEN(MAX_FDS * sizeof(int))
- };
-
- size = recvmsg(ciptr->fd, &msg, 0);
- if (size >= 0) {
- struct cmsghdr *hdr;
-
- for (hdr = CMSG_FIRSTHDR(&msg); hdr; hdr = CMSG_NXTHDR(&msg, hdr)) {
- if (hdr->cmsg_level == SOL_SOCKET && hdr->cmsg_type == SCM_RIGHTS) {
- int nfd = (hdr->cmsg_len - CMSG_LEN(0)) / sizeof (int);
- int i;
- int *fd = (int *) CMSG_DATA(hdr);
-
- for (i = 0; i < nfd; i++)
- appendFd(&ciptr->recv_fds, fd[i], 0);
- }
- }
- }
- return size;
- }
-#else
- return READV (ciptr, buf, size);
-#endif
-
-#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-}
-
-
-static int
-TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size)
-
-{
- prmsg (2,"SocketWritev(%d,%p,%d)\n", ciptr->fd, (void *) buf, size);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- /*
- * If we have a valid priv pointer then this
- * is an internal connection to the proxy.
- * In this case we should emulate the writev.
- */
-
- if (ciptr->priv)
- {
- return NXTransWriteVector(ciptr->fd, buf, size);
- }
- else
- {
- /* FIXME: same code as below, should be possible without duplication */
-#if XTRANS_SEND_FDS
- if (ciptr->send_fds)
- {
- union fd_pass cmsgbuf;
- int nfd = nFd(&ciptr->send_fds);
- struct _XtransConnFd *cf = ciptr->send_fds;
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = buf,
- .msg_iovlen = size,
- .msg_control = cmsgbuf.buf,
- .msg_controllen = CMSG_LEN(nfd * sizeof(int))
- };
- struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg);
- int i;
- int *fds;
-
- hdr->cmsg_len = msg.msg_controllen;
- hdr->cmsg_level = SOL_SOCKET;
- hdr->cmsg_type = SCM_RIGHTS;
-
- fds = (int *) CMSG_DATA(hdr);
- /* Set up fds */
- for (i = 0; i < nfd; i++) {
- fds[i] = cf->fd;
- cf = cf->next;
- }
-
- i = sendmsg(ciptr->fd, &msg, 0);
- if (i > 0)
- discardFd(&ciptr->send_fds, cf, 0);
- return i;
- }
-#endif
- return WRITEV (ciptr, buf, size);
- }
-
-#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-
-#if XTRANS_SEND_FDS
- if (ciptr->send_fds)
- {
- union fd_pass cmsgbuf;
- int nfd = nFd(&ciptr->send_fds);
- struct _XtransConnFd *cf = ciptr->send_fds;
- struct msghdr msg = {
- .msg_name = NULL,
- .msg_namelen = 0,
- .msg_iov = buf,
- .msg_iovlen = size,
- .msg_control = cmsgbuf.buf,
- .msg_controllen = CMSG_LEN(nfd * sizeof(int))
- };
- struct cmsghdr *hdr = CMSG_FIRSTHDR(&msg);
- int i;
- int *fds;
-
- hdr->cmsg_len = msg.msg_controllen;
- hdr->cmsg_level = SOL_SOCKET;
- hdr->cmsg_type = SCM_RIGHTS;
-
- fds = (int *) CMSG_DATA(hdr);
- /* Set up fds */
- for (i = 0; i < nfd; i++) {
- fds[i] = cf->fd;
- cf = cf->next;
- }
-
- i = sendmsg(ciptr->fd, &msg, 0);
- if (i > 0)
- discardFd(&ciptr->send_fds, cf, 0);
- return i;
- }
-#endif
- return WRITEV (ciptr, buf, size);
-
-#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-}
-
-
-static int
-TRANS(SocketWrite) (XtransConnInfo ciptr, char *buf, int size)
-
-{
- prmsg (2,"SocketWrite(%d,%p,%d)\n", ciptr->fd, (void *) buf, size);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- /*
- * If we have a valid priv pointer then this
- * is an internal connection to the proxy.
- * In this case we should emulate the write.
- */
-
- if (ciptr->priv)
- {
- int result;
-
- result = NXTransWrite(ciptr->fd, buf, size);
-
-#ifdef NX_TRANS_DEBUG
- if (result < 0 && EGET() == EAGAIN)
- {
- fprintf(stderr, "SocketWrite: Write on descriptor [%d] would block.\n",
- ciptr->fd);
- }
- else
- {
- fprintf(stderr, "SocketWrite: Written [%d] bytes on descriptor [%d].\n",
- result, ciptr->fd);
- }
-#endif
- return result;
- }
- else
- {
- /* FIXME: same code as below, should be possible without duplication */
-#if XTRANS_SEND_FDS
- if (ciptr->send_fds)
- {
- struct iovec iov;
-
- iov.iov_base = buf;
- iov.iov_len = size;
- return TRANS(SocketWritev)(ciptr, &iov, 1);
- }
-#endif /* XTRANS_SEND_FDS */
- return write (ciptr->fd, buf, size);
- }
-
-#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-
-#if defined(WIN32)
- {
- int ret = send ((SOCKET)ciptr->fd, buf, size, 0);
-#ifdef WIN32
- if (ret == SOCKET_ERROR) errno = WSAGetLastError();
-#endif
- return ret;
- }
-#else
-#if XTRANS_SEND_FDS
- if (ciptr->send_fds)
- {
- struct iovec iov;
-
- iov.iov_base = buf;
- iov.iov_len = size;
- return TRANS(SocketWritev)(ciptr, &iov, 1);
- }
-#endif /* XTRANS_SEND_FDS */
- return write (ciptr->fd, buf, size);
-#endif /* WIN32 */
-
-#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
-}
-
-static int
-TRANS(SocketDisconnect) (XtransConnInfo ciptr)
-
-{
- prmsg (2,"SocketDisconnect(%p,%d)\n", (void *) ciptr, ciptr->fd);
-
-#ifdef WIN32
- {
- int ret = shutdown (ciptr->fd, 2);
- if (ret == SOCKET_ERROR) errno = WSAGetLastError();
- return ret;
- }
-#else
- return shutdown (ciptr->fd, 2); /* disallow further sends and receives */
-#endif
-}
-
-
-#ifdef TCPCONN
-static int
-TRANS(SocketINETClose) (XtransConnInfo ciptr)
-
-{
- prmsg (2,"SocketINETClose(%p,%d)\n", (void *) ciptr, ciptr->fd);
-
-#ifdef WIN32
- {
- int ret = close (ciptr->fd);
- if (ret == SOCKET_ERROR) errno = WSAGetLastError();
- return ret;
- }
-#else
- return close (ciptr->fd);
-#endif
-}
-
-#endif /* TCPCONN */
-
-
-#ifdef UNIXCONN
-static int
-TRANS(SocketUNIXClose) (XtransConnInfo ciptr)
-{
- /*
- * If this is the server side, then once the socket is closed,
- * it must be unlinked to completely close it
- */
-
- struct sockaddr_un *sockname = (struct sockaddr_un *) ciptr->addr;
- int ret;
-
- prmsg (2,"SocketUNIXClose(%p,%d)\n", (void *) ciptr, ciptr->fd);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- if (ciptr->priv)
- {
- TRANS(SocketCloseConnInfo) (ciptr);
- }
-
-#endif
-
-#if XTRANS_SEND_FDS
- cleanupFds(ciptr);
-#endif
- ret = close(ciptr->fd);
-
-#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
- fprintf(stderr, "SocketUNIXClose: Flags are [%d] for ciptr at [%p] check is [%d].\n",
- ciptr->flags, (void *) ciptr, (ciptr->flags && sockname
- && sockname->sun_family == AF_UNIX && sockname->sun_path[0]));
-#endif
-
- if (ciptr->flags
- && sockname
- && sockname->sun_family == AF_UNIX
- && sockname->sun_path[0])
- {
-#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
- if (!(ciptr->flags & TRANS_NOUNLINK
- || ciptr->transptr->flags & TRANS_ABSTRACT))
- {
- fprintf(stderr, "SocketUNIXClose: Unlinking path [%s] for ciptr at [%p].\n",
- sockname->sun_path, (void *) ciptr);
- unlink (sockname->sun_path);
- }
-#else
- if (!(ciptr->flags & TRANS_NOUNLINK
- || ciptr->transptr->flags & TRANS_ABSTRACT))
- unlink (sockname->sun_path);
-#endif
- }
-
- return ret;
-}
-
-static int
-TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr)
-
-{
- /*
- * Don't unlink path.
- */
-
- int ret;
-
- prmsg (2,"SocketUNIXCloseForCloning(%p,%d)\n",
- (void *) ciptr, ciptr->fd);
-
-#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
-
- if (ciptr->priv)
- {
- TRANS(SocketCloseConnInfo) (ciptr);
- }
-
-#endif
-
-#if XTRANS_SEND_FDS
- cleanupFds(ciptr);
-#endif
- ret = close(ciptr->fd);
-
- return ret;
-}
-
-#endif /* UNIXCONN */
-
-
-#ifdef TCPCONN
-# ifdef TRANS_SERVER
-static const char* tcp_nolisten[] = {
- "inet",
-#if defined(IPv6) && defined(AF_INET6)
- "inet6",
-#endif
- NULL
-};
-# endif
-
-Xtransport TRANS(SocketTCPFuncs) = {
- /* Socket Interface */
- "tcp",
- TRANS_ALIAS,
-#ifdef TRANS_CLIENT
- TRANS(SocketOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- tcp_nolisten,
- TRANS(SocketOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(SocketReopenCOTSServer),
-#endif
- TRANS(SocketSetOption),
-#ifdef TRANS_SERVER
- TRANS(SocketINETCreateListener),
- NULL, /* ResetListener */
- TRANS(SocketINETAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(SocketINETConnect),
-#endif /* TRANS_CLIENT */
- TRANS(SocketBytesReadable),
- TRANS(SocketRead),
- TRANS(SocketWrite),
- TRANS(SocketReadv),
- TRANS(SocketWritev),
-#if XTRANS_SEND_FDS
- TRANS(SocketSendFdInvalid),
- TRANS(SocketRecvFdInvalid),
-#endif
- TRANS(SocketDisconnect),
- TRANS(SocketINETClose),
- TRANS(SocketINETClose),
- };
-
-Xtransport TRANS(SocketINETFuncs) = {
- /* Socket Interface */
- "inet",
- 0,
-#ifdef TRANS_CLIENT
- TRANS(SocketOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(SocketOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(SocketReopenCOTSServer),
-#endif
- TRANS(SocketSetOption),
-#ifdef TRANS_SERVER
- TRANS(SocketINETCreateListener),
- NULL, /* ResetListener */
- TRANS(SocketINETAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(SocketINETConnect),
-#endif /* TRANS_CLIENT */
- TRANS(SocketBytesReadable),
- TRANS(SocketRead),
- TRANS(SocketWrite),
- TRANS(SocketReadv),
- TRANS(SocketWritev),
-#if XTRANS_SEND_FDS
- TRANS(SocketSendFdInvalid),
- TRANS(SocketRecvFdInvalid),
-#endif
- TRANS(SocketDisconnect),
- TRANS(SocketINETClose),
- TRANS(SocketINETClose),
- };
-
-#if defined(IPv6) && defined(AF_INET6)
-Xtransport TRANS(SocketINET6Funcs) = {
- /* Socket Interface */
- "inet6",
- 0,
-#ifdef TRANS_CLIENT
- TRANS(SocketOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(SocketOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(SocketReopenCOTSServer),
-#endif
- TRANS(SocketSetOption),
-#ifdef TRANS_SERVER
- TRANS(SocketINETCreateListener),
- NULL, /* ResetListener */
- TRANS(SocketINETAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(SocketINETConnect),
-#endif /* TRANS_CLIENT */
- TRANS(SocketBytesReadable),
- TRANS(SocketRead),
- TRANS(SocketWrite),
- TRANS(SocketReadv),
- TRANS(SocketWritev),
-#if XTRANS_SEND_FDS
- TRANS(SocketSendFdInvalid),
- TRANS(SocketRecvFdInvalid),
-#endif
- TRANS(SocketDisconnect),
- TRANS(SocketINETClose),
- TRANS(SocketINETClose),
- };
-#endif /* IPv6 */
-#endif /* TCPCONN */
-
-#ifdef UNIXCONN
-#if !defined(LOCALCONN)
-Xtransport TRANS(SocketLocalFuncs) = {
- /* Socket Interface */
- "local",
-#ifdef HAVE_ABSTRACT_SOCKETS
- TRANS_ABSTRACT,
-#else
- 0,
-#endif
-#ifdef TRANS_CLIENT
- TRANS(SocketOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
- NULL,
- TRANS(SocketOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(SocketReopenCOTSServer),
-#endif
- TRANS(SocketSetOption),
-#ifdef TRANS_SERVER
- TRANS(SocketUNIXCreateListener),
- TRANS(SocketUNIXResetListener),
- TRANS(SocketUNIXAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(SocketUNIXConnect),
-#endif /* TRANS_CLIENT */
- TRANS(SocketBytesReadable),
- TRANS(SocketRead),
- TRANS(SocketWrite),
- TRANS(SocketReadv),
- TRANS(SocketWritev),
-#if XTRANS_SEND_FDS
- TRANS(SocketSendFd),
- TRANS(SocketRecvFd),
-#endif
- TRANS(SocketDisconnect),
- TRANS(SocketUNIXClose),
- TRANS(SocketUNIXCloseForCloning),
- };
-#endif /* !LOCALCONN */
-# ifdef TRANS_SERVER
-# if !defined(LOCALCONN)
-static const char* unix_nolisten[] = { "local" , NULL };
-# endif
-# endif
-
-Xtransport TRANS(SocketUNIXFuncs) = {
- /* Socket Interface */
- "unix",
-#if !defined(LOCALCONN) && !defined(HAVE_ABSTRACT_SOCKETS)
- TRANS_ALIAS,
-#else
- 0,
-#endif
-#ifdef TRANS_CLIENT
- TRANS(SocketOpenCOTSClient),
-#endif /* TRANS_CLIENT */
-#ifdef TRANS_SERVER
-#if !defined(LOCALCONN)
- unix_nolisten,
-#else
- NULL,
-#endif
- TRANS(SocketOpenCOTSServer),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_REOPEN
- TRANS(SocketReopenCOTSServer),
-#endif
- TRANS(SocketSetOption),
-#ifdef TRANS_SERVER
- TRANS(SocketUNIXCreateListener),
- TRANS(SocketUNIXResetListener),
- TRANS(SocketUNIXAccept),
-#endif /* TRANS_SERVER */
-#ifdef TRANS_CLIENT
- TRANS(SocketUNIXConnect),
-#endif /* TRANS_CLIENT */
- TRANS(SocketBytesReadable),
- TRANS(SocketRead),
- TRANS(SocketWrite),
- TRANS(SocketReadv),
- TRANS(SocketWritev),
-#if XTRANS_SEND_FDS
- TRANS(SocketSendFd),
- TRANS(SocketRecvFd),
-#endif
- TRANS(SocketDisconnect),
- TRANS(SocketUNIXClose),
- TRANS(SocketUNIXCloseForCloning),
- };
-
-#endif /* UNIXCONN */
-
-#ifdef NX_TRANS_SOCKET
-/*
- * Override the UNIX_DIR and UNIX_PATH settings and
- * make them configurable, based on the NX_TEMP or
- * the TEMP environment.
- *
- * We must be careful as the same defines are used
- * for different directories, based on the subsystem
- * that is compiling this, while we want to override
- * only the '/tmp/.X11-unix' and '/tmp/.X11-unix/X'
- * settings.
- */
-
-static char _NXUnixDir[1024];
-static char _NXUnixPath[1024];
-
-static char *_NXGetUnixDir(char *dir)
-{
- const char *tempDir;
-
- prmsg (3, "_NXGetUnixDir(%s)\n", dir);
-
- if (strcmp(dir, UNIX_DIR) != 0)
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixDir: Returning other Unix directory [%s].\n", dir);
-#endif
- return dir;
- }
-
- /*
- * Check the environment only once.
- */
-
- if (*_NXUnixDir != '\0')
- {
- return _NXUnixDir;
- }
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixDir: Trying with the NX_TEMP environment.\n");
-#endif
-
- tempDir = getenv("NX_TEMP");
-
- if (tempDir == NULL || *tempDir == '\0')
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixDir: Trying with the TEMP environment.\n");
-#endif
-
- tempDir = getenv("TEMP");
- }
-
- if (tempDir != NULL && *tempDir != '\0')
- {
- if (strlen(tempDir) + strlen("/.X11-unix") + 1 > 1024)
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixDir: WARNING! Maximum length of X11 Unix directory exceeded.\n");
-#endif
- goto _NXGetUnixDirError;
- }
-
- strcpy(_NXUnixDir, tempDir);
- strcat(_NXUnixDir, "/.X11-unix");
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixDir: Using X11 Unix directory [%s].\n", _NXUnixDir);
-#endif
-
- return _NXUnixDir;
- }
-
-_NXGetUnixDirError:
-
- strcpy(_NXUnixDir, dir);
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixDir: Returning default X11 Unix directory [%s].\n", _NXUnixDir);
-#endif
-
- return _NXUnixDir;
-}
-
-static char *_NXGetUnixPath(char *path)
-{
- const char *unixDir;
-
- prmsg (3, "_NXGetUnixPath(%s)\n", path);
-
- if (strcmp(path, UNIX_PATH) != 0)
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixPath: Returning other X11 Unix path [%s].\n", path);
-#endif
- return path;
- }
-
- /*
- * Check the environment only once.
- */
-
- if (*_NXUnixPath != '\0')
- {
- return _NXUnixPath;
- }
-
- unixDir = _NXGetUnixDir(UNIX_DIR);
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixPath: Got X11 Unix directory [%s].\n", unixDir);
-#endif
-
- if (strlen(unixDir) + strlen("/X") + 1 > 1024)
- {
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixPath: WARNING! Maximum length of X11 Unix path exceeded.\n");
-#endif
-
- goto _NXGetUnixPathError;
- }
-
- strcpy(_NXUnixPath, unixDir);
- strcat(_NXUnixPath, "/X");
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixPath: Returning X11 Unix path [%s].\n", _NXUnixPath);
-#endif
-
- return _NXUnixPath;
-
-_NXGetUnixPathError:
-
- strcpy(_NXUnixPath, path);
-
-#ifdef NX_TRANS_TEST
- fprintf(stderr, "_NXGetUnixPath: Returning default X11 Unix path [%s].\n", _NXUnixPath);
-#endif
-
- return _NXUnixPath;
-}
-
-#endif /* NX_TRANS_SOCKET */
diff --git a/nx-X11/lib/xtrans/Xtransutil.c b/nx-X11/lib/xtrans/Xtransutil.c
deleted file mode 100644
index 0063e83d8..000000000
--- a/nx-X11/lib/xtrans/Xtransutil.c
+++ /dev/null
@@ -1,639 +0,0 @@
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCRS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/*
- * These are some utility functions created for convenience or to provide
- * an interface that is similar to an existing interface. These are built
- * only using the Transport Independant API, and have no knowledge of
- * the internal implementation.
- */
-
-#ifdef XTHREADS
-#include <X11/Xthreads.h>
-#endif
-#ifdef WIN32
-#include <X11/Xlibint.h>
-#include <X11/Xwinsock.h>
-#endif
-
-#ifdef X11_t
-
-/*
- * These values come from X.h and Xauth.h, and MUST match them. Some
- * of these values are also defined by the ChangeHost protocol message.
- */
-
-#define FamilyInternet 0 /* IPv4 */
-#define FamilyDECnet 1
-#define FamilyChaos 2
-#define FamilyInternet6 6
-#define FamilyAmoeba 33
-#define FamilyLocalHost 252
-#define FamilyKrb5Principal 253
-#define FamilyNetname 254
-#define FamilyLocal 256
-#define FamilyWild 65535
-
-/*
- * TRANS(ConvertAddress) converts a sockaddr based address to an
- * X authorization based address. Some of this is defined as part of
- * the ChangeHost protocol. The rest is just done in a consistent manner.
- */
-
-int
-TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
-
-{
-
- prmsg(2,"ConvertAddress(%d,%d,%p)\n",*familyp,*addrlenp,(void *) *addrp);
-
- switch( *familyp )
- {
-#if defined(TCPCONN)
- case AF_INET:
- {
- /*
- * Check for the BSD hack localhost address 127.0.0.1.
- * In this case, we are really FamilyLocal.
- */
-
- struct sockaddr_in saddr;
- int len = sizeof(saddr.sin_addr.s_addr);
- char *cp = (char *) &saddr.sin_addr.s_addr;
-
- memcpy (&saddr, *addrp, sizeof (struct sockaddr_in));
-
- if ((len == 4) && (cp[0] == 127) && (cp[1] == 0) &&
- (cp[2] == 0) && (cp[3] == 1))
- {
- *familyp=FamilyLocal;
- }
- else
- {
- *familyp=FamilyInternet;
- *addrlenp=len;
- memcpy(*addrp,&saddr.sin_addr,len);
- }
- break;
- }
-
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6:
- {
- struct sockaddr_in6 saddr6;
-
- memcpy (&saddr6, *addrp, sizeof (struct sockaddr_in6));
-
- if (IN6_IS_ADDR_LOOPBACK(&saddr6.sin6_addr))
- {
- *familyp=FamilyLocal;
- }
- else if (IN6_IS_ADDR_V4MAPPED(&(saddr6.sin6_addr))) {
- char *cp = (char *) &saddr6.sin6_addr.s6_addr[12];
-
- if ((cp[0] == 127) && (cp[1] == 0) &&
- (cp[2] == 0) && (cp[3] == 1))
- {
- *familyp=FamilyLocal;
- }
- else
- {
- *familyp=FamilyInternet;
- *addrlenp = sizeof (struct in_addr);
- memcpy(*addrp,cp,*addrlenp);
- }
- }
- else
- {
- *familyp=FamilyInternet6;
- *addrlenp=sizeof(saddr6.sin6_addr);
- memcpy(*addrp,&saddr6.sin6_addr,sizeof(saddr6.sin6_addr));
- }
- break;
- }
-#endif /* IPv6 */
-#endif /* defined(TCPCONN) */
-
-
-#if defined(UNIXCONN) || defined(LOCALCONN)
- case AF_UNIX:
- {
- *familyp=FamilyLocal;
- break;
- }
-#endif /* defined(UNIXCONN) || defined(LOCALCONN) */
-
-#if (defined(__SCO__) || defined(__UNIXWARE__)) && defined(LOCALCONN)
- case 0:
- {
- *familyp=FamilyLocal;
- break;
- }
-#endif
-
- default:
- prmsg(1,"ConvertAddress: Unknown family type %d\n",
- *familyp);
- return -1;
- }
-
-
- if (*familyp == FamilyLocal)
- {
- /*
- * In the case of a local connection, we need to get the
- * host name for authentication.
- */
-
- char hostnamebuf[256];
- int len = TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf);
-
- if (len > 0) {
- if (*addrp && *addrlenp < (len + 1))
- {
- free (*addrp);
- *addrp = NULL;
- }
- if (!*addrp)
- *addrp = malloc (len + 1);
- if (*addrp) {
- strcpy ((char *) *addrp, hostnamebuf);
- *addrlenp = len;
- } else {
- *addrlenp = 0;
- }
- }
- else
- {
- if (*addrp)
- free (*addrp);
- *addrp = NULL;
- *addrlenp = 0;
- }
- }
-
- return 0;
-}
-
-#endif /* X11_t */
-
-#ifdef ICE_t
-
-/* Needed for _XGethostbyaddr usage in TRANS(GetPeerNetworkId) */
-# if defined(TCPCONN) || defined(UNIXCONN)
-# define X_INCLUDE_NETDB_H
-# define XOS_USE_NO_LOCKING
-# include <X11/Xos_r.h>
-# endif
-
-#include <signal.h>
-
-char *
-TRANS(GetMyNetworkId) (XtransConnInfo ciptr)
-
-{
- int family = ciptr->family;
- char *addr = ciptr->addr;
- char hostnamebuf[256];
- char *networkId = NULL;
- const char *transName = ciptr->transptr->TransName;
-
- if (gethostname (hostnamebuf, sizeof (hostnamebuf)) < 0)
- {
- return (NULL);
- }
-
- switch (family)
- {
-#if defined(UNIXCONN) || defined(LOCALCONN)
- case AF_UNIX:
- {
- struct sockaddr_un *saddr = (struct sockaddr_un *) addr;
- networkId = malloc (3 + strlen (transName) +
- strlen (hostnamebuf) + strlen (saddr->sun_path));
- sprintf (networkId, "%s/%s:%s", transName,
- hostnamebuf, saddr->sun_path);
- break;
- }
-#endif /* defined(UNIXCONN) || defined(LOCALCONN) */
-
-#if defined(TCPCONN)
- case AF_INET:
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6:
-#endif
- {
- struct sockaddr_in *saddr = (struct sockaddr_in *) addr;
-#if defined(IPv6) && defined(AF_INET6)
- struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *) addr;
-#endif
- int portnum;
- char portnumbuf[10];
-
-
-#if defined(IPv6) && defined(AF_INET6)
- if (family == AF_INET6)
- portnum = ntohs (saddr6->sin6_port);
- else
-#endif
- portnum = ntohs (saddr->sin_port);
-
- snprintf (portnumbuf, sizeof(portnumbuf), "%d", portnum);
- networkId = malloc (3 + strlen (transName) +
- strlen (hostnamebuf) + strlen (portnumbuf));
- sprintf (networkId, "%s/%s:%s", transName, hostnamebuf, portnumbuf);
- break;
- }
-#endif /* defined(TCPCONN) */
-
-
- default:
- break;
- }
-
- return (networkId);
-}
-
-#include <setjmp.h>
-static jmp_buf env;
-
-#ifdef SIGALRM
-static volatile int nameserver_timedout = 0;
-
-static void
-nameserver_lost(int sig _X_UNUSED)
-{
- nameserver_timedout = 1;
- longjmp (env, -1);
- /* NOTREACHED */
-}
-#endif /* SIGALARM */
-
-
-char *
-TRANS(GetPeerNetworkId) (XtransConnInfo ciptr)
-
-{
- int family = ciptr->family;
- char *peer_addr = ciptr->peeraddr;
- char *hostname;
- char addrbuf[256];
- const char *addr = NULL;
-
- switch (family)
- {
- case AF_UNSPEC:
-#if defined(UNIXCONN) || defined(LOCALCONN)
- case AF_UNIX:
- {
- if (gethostname (addrbuf, sizeof (addrbuf)) == 0)
- addr = addrbuf;
- break;
- }
-#endif /* defined(UNIXCONN) || defined(LOCALCONN) */
-
-#if defined(TCPCONN)
- case AF_INET:
-#if defined(IPv6) && defined(AF_INET6)
- case AF_INET6:
-#endif
- {
- struct sockaddr_in *saddr = (struct sockaddr_in *) peer_addr;
-#if defined(IPv6) && defined(AF_INET6)
- struct sockaddr_in6 *saddr6 = (struct sockaddr_in6 *) peer_addr;
-#endif
- char *address;
- int addresslen;
-#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
- _Xgethostbynameparams hparams;
-#endif
- struct hostent * volatile hostp = NULL;
-
-#if defined(IPv6) && defined(AF_INET6)
- if (family == AF_INET6)
- {
- address = (char *) &saddr6->sin6_addr;
- addresslen = sizeof (saddr6->sin6_addr);
- }
- else
-#endif
- {
- address = (char *) &saddr->sin_addr;
- addresslen = sizeof (saddr->sin_addr);
- }
-
-#ifdef SIGALRM
- /*
- * gethostbyaddr can take a LONG time if the host does not exist.
- * Assume that if it does not respond in NAMESERVER_TIMEOUT seconds
- * that something is wrong and do not make the user wait.
- * gethostbyaddr will continue after a signal, so we have to
- * jump out of it.
- */
-
- nameserver_timedout = 0;
- signal (SIGALRM, nameserver_lost);
- alarm (4);
- if (setjmp(env) == 0) {
-#endif
- hostp = _XGethostbyaddr (address, addresslen, family, hparams);
-#ifdef SIGALRM
- }
- alarm (0);
-#endif
- if (hostp != NULL)
- addr = hostp->h_name;
- else
-#if defined(IPv6) && defined(AF_INET6)
- addr = inet_ntop (family, address, addrbuf, sizeof (addrbuf));
-#else
- addr = inet_ntoa (saddr->sin_addr);
-#endif
- break;
- }
-
-#endif /* defined(TCPCONN) */
-
-
- default:
- return (NULL);
- }
-
-
- hostname = malloc (strlen (ciptr->transptr->TransName) + strlen (addr) + 2);
- strcpy (hostname, ciptr->transptr->TransName);
- strcat (hostname, "/");
- if (addr)
- strcat (hostname, addr);
-
- return (hostname);
-}
-
-#endif /* ICE_t */
-
-
-#if defined(WIN32) && defined(TCPCONN)
-int
-TRANS(WSAStartup) (void)
-{
- static WSADATA wsadata;
-
- prmsg (2,"WSAStartup()\n");
-
- if (!wsadata.wVersion && WSAStartup(MAKEWORD(2,2), &wsadata))
- return 1;
- return 0;
-}
-#endif
-
-#include <ctype.h>
-
-#if defined(X11_t)
-static int
-is_numeric (const char *str)
-{
- int i;
-
- for (i = 0; i < (int) strlen (str); i++)
- if (!isdigit (str[i]))
- return (0);
-
- return (1);
-}
-#endif
-
-#ifdef TRANS_SERVER
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <errno.h>
-
-#if !defined(S_IFLNK) && !defined(S_ISLNK)
-#undef lstat
-#define lstat(a,b) stat(a,b)
-#endif
-
-#define FAIL_IF_NOMODE 1
-#define FAIL_IF_NOT_ROOT 2
-#define WARN_NO_ACCESS 4
-
-/*
- * We make the assumption that when the 'sticky' (t) bit is requested
- * it's not save if the directory has non-root ownership or the sticky
- * bit cannot be set and fail.
- */
-static int
-trans_mkdir(const char *path, int mode)
-{
- struct stat buf;
-
- if (lstat(path, &buf) != 0) {
- if (errno != ENOENT) {
- prmsg(1, "mkdir: ERROR: (l)stat failed for %s (%d)\n",
- path, errno);
- return -1;
- }
- /* Dir doesn't exist. Try to create it */
-
-#if !defined(WIN32) && !defined(__CYGWIN__)
- /*
- * 'sticky' bit requested: assume application makes
- * certain security implications. If effective user ID
- * is != 0: fail as we may not be able to meet them.
- */
- if (geteuid() != 0) {
- if (mode & 01000) {
- prmsg(1, "mkdir: ERROR: euid != 0,"
- "directory %s will not be created.\n",
- path);
-#ifdef FAIL_HARD
- return -1;
-#endif
- } else {
- prmsg(1, "mkdir: Cannot create %s with root ownership\n",
- path);
- }
- }
-#endif
-
-#ifndef WIN32
- if (mkdir(path, mode) == 0) {
- if (chmod(path, mode)) {
- prmsg(1, "mkdir: ERROR: Mode of %s should be set to %04o\n",
- path, mode);
-#ifdef FAIL_HARD
- return -1;
-#endif
- }
-#else
- if (mkdir(path) == 0) {
-#endif
- } else {
- prmsg(1, "mkdir: ERROR: Cannot create %s\n",
- path);
- return -1;
- }
-
- return 0;
-
- } else {
- if (S_ISDIR(buf.st_mode)) {
- int updateOwner = 0;
- int updateMode = 0;
- int updatedOwner = 0;
- int updatedMode = 0;
- int status = 0;
- /* Check if the directory's ownership is OK. */
- if (buf.st_uid != 0)
- updateOwner = 1;
-
- /*
- * Check if the directory's mode is OK. An exact match isn't
- * required, just a mode that isn't more permissive than the
- * one requested.
- */
- if ((~mode) & 0077 & buf.st_mode)
- updateMode = 1;
-
- /*
- * If the directory is not writeable not everybody may
- * be able to create sockets. Therefore warn if mode
- * cannot be fixed.
- */
- if ((~buf.st_mode) & 0022 & mode) {
- updateMode = 1;
- status |= WARN_NO_ACCESS;
- }
-
- /*
- * If 'sticky' bit is requested fail if owner isn't root
- * as we assume the caller makes certain security implications
- */
- if (mode & 01000) {
- status |= FAIL_IF_NOT_ROOT;
- if (!(buf.st_mode & 01000)) {
- status |= FAIL_IF_NOMODE;
- updateMode = 1;
- }
- }
-
-#ifdef HAS_FCHOWN
- /*
- * If fchown(2) and fchmod(2) are available, try to correct the
- * directory's owner and mode. Otherwise it isn't safe to attempt
- * to do this.
- */
- if (updateMode || updateOwner) {
- int fd = -1;
- struct stat fbuf;
- if ((fd = open(path, O_RDONLY)) != -1) {
- if (fstat(fd, &fbuf) == -1) {
- prmsg(1, "mkdir: ERROR: fstat failed for %s (%d)\n",
- path, errno);
- close(fd);
- return -1;
- }
- /*
- * Verify that we've opened the same directory as was
- * checked above.
- */
- if (!S_ISDIR(fbuf.st_mode) ||
- buf.st_dev != fbuf.st_dev ||
- buf.st_ino != fbuf.st_ino) {
- prmsg(1, "mkdir: ERROR: inode for %s changed\n",
- path);
- close(fd);
- return -1;
- }
- if (updateOwner && fchown(fd, 0, 0) == 0)
- updatedOwner = 1;
- if (updateMode && fchmod(fd, mode) == 0)
- updatedMode = 1;
- close(fd);
- }
- }
-#endif
-
- if (updateOwner && !updatedOwner) {
-#ifdef FAIL_HARD
- if (status & FAIL_IF_NOT_ROOT) {
- prmsg(1, "mkdir: ERROR: Owner of %s must be set to root\n",
- path);
- return -1;
- }
-#endif
-#if !defined(__APPLE_CC__) && !defined(__CYGWIN__)
- prmsg(1, "mkdir: Owner of %s should be set to root\n",
- path);
-#endif
- }
-
- if (updateMode && !updatedMode) {
-#ifdef FAIL_HARD
- if (status & FAIL_IF_NOMODE) {
- prmsg(1, "mkdir: ERROR: Mode of %s must be set to %04o\n",
- path, mode);
- return -1;
- }
-#endif
- prmsg(1, "mkdir: Mode of %s should be set to %04o\n",
- path, mode);
- if (status & WARN_NO_ACCESS) {
- prmsg(1, "mkdir: this may cause subsequent errors\n");
- }
- }
- return 0;
- }
- return -1;
- }
-
- /* In all other cases, fail */
- return -1;
-}
-
-#endif /* TRANS_SERVER */
diff --git a/nx-X11/lib/xtrans/transport.c b/nx-X11/lib/xtrans/transport.c
deleted file mode 100644
index b62fc7b64..000000000
--- a/nx-X11/lib/xtrans/transport.c
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
-
-Copyright 1993, 1994, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
-OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR
-OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
-ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
-OTHER DEALINGS IN THE SOFTWARE.
-
-Except as contained in this notice, the name of The Open Group shall
-not be used in advertising or otherwise to promote the sale, use or
-other dealings in this Software without prior written authorization
-from The Open Group.
-
- * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
- *
- * All Rights Reserved
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation for any purpose and without fee is hereby granted, provided
- * that the above copyright notice appear in all copies and that both that
- * copyright notice and this permission notice appear in supporting
- * documentation, and that the name NCR not be used in advertising
- * or publicity pertaining to distribution of the software without specific,
- * written prior permission. NCR makes no representations about the
- * suitability of this software for any purpose. It is provided "as is"
- * without express or implied warranty.
- *
- * NCR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
- * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
- * NO EVENT SHALL NCR BE LIABLE FOR ANY SPECIAL, INDIRECT OR
- * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
- * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
- * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
- * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include <stdlib.h>
-
-#define XTRANS_TRANSPORT_C /* used to flag Xtransint.h that it's being used
- here, not just #included in another file */
-
-#include "Xtransint.h"
-
-#ifdef __clang__
-#pragma clang diagnostic push
-#pragma clang diagnostic ignored "-Wformat-nonliteral"
-#pragma clang diagnostic ignored "-Wdeprecated-declarations"
-#endif
-
-#ifdef LOCALCONN
-#include "Xtranslcl.c"
-#endif
-#if defined(TCPCONN) || defined(UNIXCONN)
-#include "Xtranssock.c"
-#endif
-#include "Xtrans.c"
-#include "Xtransutil.c"
-
-#ifdef __clang__
-#pragma clang diagnostic pop
-#endif