diff options
Diffstat (limited to 'nx-X11/lib/xtrans')
-rw-r--r-- | nx-X11/lib/xtrans/Imakefile | 19 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/Xtrans.c | 1367 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/Xtrans.h | 426 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/Xtransint.h | 433 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/Xtranslcl.c | 2486 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/Xtranssock.c | 3554 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/Xtransutil.c | 639 | ||||
-rw-r--r-- | nx-X11/lib/xtrans/transport.c | 74 |
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 |