Unverified Commit 107e72b0 authored by Mike Gabriel's avatar Mike Gabriel

Merge branch 'uli42-pr/upgrade_xtrans' into 3.6.x

parents a9b145d4 6a186b92
...@@ -375,12 +375,6 @@ XCOMM the platform-specific parameters - edit site.def to change ...@@ -375,12 +375,6 @@ XCOMM the platform-specific parameters - edit site.def to change
#ifndef HasSockets #ifndef HasSockets
#define HasSockets YES #define HasSockets YES
#endif #endif
#ifndef HasStreams
#define HasStreams !HasSockets
#endif
#ifndef HasDECnet
#define HasDECnet NO
#endif
#ifndef HasPoll #ifndef HasPoll
#if SystemV || SystemV4 #if SystemV || SystemV4
#define HasPoll YES #define HasPoll YES
......
...@@ -53,7 +53,6 @@ Imake.tmpl provides defaults for the following variables: ...@@ -53,7 +53,6 @@ Imake.tmpl provides defaults for the following variables:
HasCodeCenter boolean for system has CodeCenter HasCodeCenter boolean for system has CodeCenter
HasCookieMaker boolean for system has xauth cookie generator HasCookieMaker boolean for system has xauth cookie generator
HasCplusplus system has a C++ compiler? HasCplusplus system has a C++ compiler?
HasDECnet system has DECnet?
HasFortran boolean for system has Fortran compiler HasFortran boolean for system has Fortran compiler
HasGcc boolean for system has GNU gcc compiler HasGcc boolean for system has GNU gcc compiler
HasGcc2 boolean for system has GNU gcc 2.x compiler HasGcc2 boolean for system has GNU gcc 2.x compiler
...@@ -78,7 +77,6 @@ Imake.tmpl provides defaults for the following variables: ...@@ -78,7 +77,6 @@ Imake.tmpl provides defaults for the following variables:
HasShm boolean for System V shared memory HasShm boolean for System V shared memory
HasSockets boolean for system has BSD sockets HasSockets boolean for system has BSD sockets
HasStrcasecmp boolean for system implements str[n]casecmp HasStrcasecmp boolean for system implements str[n]casecmp
HasStreams use STREAMS I/O interface?
HasSymLinks boolean for system has symbolic links HasSymLinks boolean for system has symbolic links
HasTestCenter boolean for system has TestCenter HasTestCenter boolean for system has TestCenter
HasVarDirectory boolean for system has /var HasVarDirectory boolean for system has /var
......
...@@ -334,8 +334,7 @@ XORGRELSTRING = XorgManVersionString ...@@ -334,8 +334,7 @@ XORGRELSTRING = XorgManVersionString
* NOTE: IPv6Flags could be tacked on to either ConnectionFlags or * NOTE: IPv6Flags could be tacked on to either ConnectionFlags or
* ExtraConnectionDefs. Here, we choose the later in order to * ExtraConnectionDefs. Here, we choose the later in order to
* maximise exposure of the IPv6 code (a number of <OS>.def files * maximise exposure of the IPv6 code (a number of <OS>.def files
* contain ConnectionFlags overrides). Mind you, this might not * contain ConnectionFlags overrides).
* the right thing to do when HasStreams is asserted.
*/ */
#ifndef BuildIPv6 /* If the OS also #define's AF_INET6 */ #ifndef BuildIPv6 /* If the OS also #define's AF_INET6 */
#define BuildIPv6 YES #define BuildIPv6 YES
...@@ -355,19 +354,8 @@ XORGRELSTRING = XorgManVersionString ...@@ -355,19 +354,8 @@ XORGRELSTRING = XorgManVersionString
#ifndef IPv6SocketsAlsoIPv4 #ifndef IPv6SocketsAlsoIPv4
#define IPv6SocketsAlsoIPv4 YES #define IPv6SocketsAlsoIPv4 YES
#endif #endif
#ifndef DECnetFlags
#if HasDECnet
#define DECnetFlags -DDNETCONN
#else
#define DECnetFlags
#endif
#endif
#ifndef ConnectionFlags #ifndef ConnectionFlags
#if HasStreams #define ConnectionFlags -DTCPCONN -DUNIXCONN
#define ConnectionFlags -DSTREAMSCONN
#else
#define ConnectionFlags -DTCPCONN -DUNIXCONN DECnetFlags
#endif
#endif #endif
#if HasStickyDirBit #if HasStickyDirBit
STICKY_DEFINES = -DHAS_STICKY_DIR_BIT STICKY_DEFINES = -DHAS_STICKY_DIR_BIT
......
...@@ -430,13 +430,6 @@ ...@@ -430,13 +430,6 @@
#endif /* #if defined(LinuxArchitecture) */ #endif /* #if defined(LinuxArchitecture) */
/* /*
* If you have Linux DECnet support, and want to build XFree86 with support
* for connections over DECnet, uncomment this.
*
#define HasDECnet YES
*/
/*
* To build static and shared libraries with debugging information, uncomment * To build static and shared libraries with debugging information, uncomment
* this. Assumes you have Gcc2. * this. Assumes you have Gcc2.
* (If you don't have Gcc2, you can use the DebugLib{X11,...} variables * (If you don't have Gcc2, you can use the DebugLib{X11,...} variables
......
...@@ -861,15 +861,8 @@ XCOMM binutils: (LinuxBinUtilsMajorVersion) ...@@ -861,15 +861,8 @@ XCOMM binutils: (LinuxBinUtilsMajorVersion)
#define PamMiscLibraries -lpam_misc #define PamMiscLibraries -lpam_misc
#endif #endif
#ifndef HasDECnet #define ConnectionFlags -DUNIXCONN -DTCPCONN
#define HasDECnet NO
#endif
#if HasDECnet
# define ConnectionFlags -DUNIXCONN -DTCPCONN -DDNETCONN
# define ExtraLibraries -ldnet
#else
# define ConnectionFlags -DUNIXCONN -DTCPCONN
#endif
/* Some of these man page defaults are overriden in the above OS sections */ /* Some of these man page defaults are overriden in the above OS sections */
#ifndef ManSuffix #ifndef ManSuffix
......
...@@ -276,13 +276,6 @@ ...@@ -276,13 +276,6 @@
#define HasXdmAuth YES #define HasXdmAuth YES
/* /*
* If you have Linux DECnet support, and want to build XFree86 with support
* for connections over DECnet, uncomment this.
*
#define HasDECnet YES
*/
/*
* To build static and shared libraries with debugging information, uncomment * To build static and shared libraries with debugging information, uncomment
* this. Assumes you have Gcc2. * this. Assumes you have Gcc2.
* (If you don't have Gcc2, you can use the DebugLib{X11,...} variables * (If you don't have Gcc2, you can use the DebugLib{X11,...} variables
......
...@@ -115,7 +115,7 @@ static char *copystring (const char *src, int len) ...@@ -115,7 +115,7 @@ static char *copystring (const char *src, int len)
#ifdef UNIXCONN #ifdef UNIXCONN
# define UNIX_TRANS "unix" # define UNIX_TRANS "unix"
#endif #endif
#if defined(LOCALCONN) || defined(OS2PIPECONN) || defined(UNIXCONN) #if defined(LOCALCONN) || defined(UNIXCONN)
# define LOCAL_TRANS "local" # define LOCAL_TRANS "local"
#endif #endif
...@@ -145,14 +145,15 @@ static char *copystring (const char *src, int len) ...@@ -145,14 +145,15 @@ static char *copystring (const char *src, int len)
* *
* [protocol/] [hostname] : [:] displaynumber [.screennumber] * [protocol/] [hostname] : [:] displaynumber [.screennumber]
* *
* A string with exactly two colons seperating hostname from the display * A string with exactly two colons seperating hostname from the
* indicates a DECnet style name. Colons in the hostname may occur if an * display indicates a (now unsupported) DECnet style name. Colons in
* IPv6 numeric address is used as the hostname. An IPv6 numeric address * the hostname may occur if an IPv6 numeric address is used as the
* may also end in a double colon, so three colons in a row indicates an * hostname. An IPv6 numeric address may also end in a double colon,
* IPv6 address ending in :: followed by :display. To make it easier for * so three colons in a row indicates an IPv6 address ending in ::
* people to read, an IPv6 numeric address hostname may be surrounded by * followed by :display. To make it easier for people to read, an
* [ ] in a similar fashion to the IPv6 numeric address URL syntax defined * IPv6 numeric address hostname may be surrounded by [ ] in a similar
* by IETF RFC 2732. * fashion to the IPv6 numeric address URL syntax defined by IETF RFC
* 2732.
* *
* If no hostname and no protocol is specified, the string is interpreted * If no hostname and no protocol is specified, the string is interpreted
* as the most efficient local connection to a server on the same machine. * as the most efficient local connection to a server on the same machine.
...@@ -188,7 +189,6 @@ _X11TransConnectDisplay ( ...@@ -188,7 +189,6 @@ _X11TransConnectDisplay (
char *phostname = NULL; /* start of host of display */ char *phostname = NULL; /* start of host of display */
char *pdpynum = NULL; /* start of dpynum of display */ char *pdpynum = NULL; /* start of dpynum of display */
char *pscrnum = NULL; /* start of screen of display */ char *pscrnum = NULL; /* start of screen of display */
Bool dnet = False; /* if true, then DECnet format */
int idisplay = 0; /* required display number */ int idisplay = 0; /* required display number */
int iscreen = 0; /* optional screen number */ int iscreen = 0; /* optional screen number */
/* int (*connfunc)(); */ /* method to create connection */ /* int (*connfunc)(); */ /* method to create connection */
...@@ -318,6 +318,7 @@ _X11TransConnectDisplay ( ...@@ -318,6 +318,7 @@ _X11TransConnectDisplay (
* or two colons in the case of DECnet (DECnet Phase V allows a single * or two colons in the case of DECnet (DECnet Phase V allows a single
* colon in the hostname). (See note above regarding IPv6 numeric * colon in the hostname). (See note above regarding IPv6 numeric
* addresses with triple colons or [] brackets.) * addresses with triple colons or [] brackets.)
* FIXME: we do not support DECnet anymore, so maybe remove these checks?
*/ */
lastp = p; lastp = p;
...@@ -335,16 +336,7 @@ _X11TransConnectDisplay ( ...@@ -335,16 +336,7 @@ _X11TransConnectDisplay (
) { ) {
/* DECnet display specified */ /* DECnet display specified */
#ifndef DNETCONN
goto bad; goto bad;
#else
dnet = True;
/* override the protocol specified */
if (pprotocol)
Xfree (pprotocol);
pprotocol = copystring ("dnet", 4);
hostlen = lastc - 1 - lastp;
#endif
} }
else else
hostlen = lastc - lastp; hostlen = lastc - lastp;
...@@ -482,7 +474,6 @@ _X11TransConnectDisplay ( ...@@ -482,7 +474,6 @@ _X11TransConnectDisplay (
* phostname hostname string or NULL * phostname hostname string or NULL
* idisplay display number * idisplay display number
* iscreen screen number * iscreen screen number
* dnet DECnet boolean
* *
* We can now decide which transport to use based on the ConnectionFlags * We can now decide which transport to use based on the ConnectionFlags
* build parameter the hostname string. If phostname is NULL or equals * build parameter the hostname string. If phostname is NULL or equals
...@@ -511,7 +502,7 @@ _X11TransConnectDisplay ( ...@@ -511,7 +502,7 @@ _X11TransConnectDisplay (
#endif #endif
#if defined(TCPCONN) || defined(UNIXCONN) || defined(LOCALCONN) || defined(MNX_TCPCONN) || defined(OS2PIPECONN) #if defined(TCPCONN) || defined(UNIXCONN) || defined(LOCALCONN) || defined(MNX_TCPCONN)
if (!pprotocol) { if (!pprotocol) {
#if defined(UNIXCONN) #if defined(UNIXCONN)
if (phostname && (strcmp (phostname, "unix") == 0)) { if (phostname && (strcmp (phostname, "unix") == 0)) {
...@@ -654,7 +645,7 @@ _X11TransConnectDisplay ( ...@@ -654,7 +645,7 @@ _X11TransConnectDisplay (
original_hostname = NULL; original_hostname = NULL;
} }
#endif #endif
len = ((phostname ? strlen(phostname) : 0) + 1 + (dnet ? 1 : 0) + len = ((phostname ? strlen(phostname) : 0) + 1 +
strlen(pdpynum) + 1 + (pscrnum ? strlen(pscrnum) : 1) + 1); strlen(pdpynum) + 1 + (pscrnum ? strlen(pscrnum) : 1) + 1);
*fullnamep = (char *) Xmalloc (len); *fullnamep = (char *) Xmalloc (len);
if (!*fullnamep) goto bad; if (!*fullnamep) goto bad;
...@@ -663,13 +654,13 @@ _X11TransConnectDisplay ( ...@@ -663,13 +654,13 @@ _X11TransConnectDisplay (
if (phostname && strlen(phostname) > 11 && !strncmp(phostname, "/tmp/launch", 11)) if (phostname && strlen(phostname) > 11 && !strncmp(phostname, "/tmp/launch", 11))
sprintf (*fullnamep, "%s%s%d", sprintf (*fullnamep, "%s%s%d",
(phostname ? phostname : ""), (phostname ? phostname : ""),
(dnet ? "::" : ":"), ":",
idisplay); idisplay);
else else
#endif #endif
sprintf (*fullnamep, "%s%s%d.%d", sprintf (*fullnamep, "%s%s%d.%d",
(phostname ? phostname : ""), (phostname ? phostname : ""),
(dnet ? "::" : ":"), ":",
idisplay, iscreen); idisplay, iscreen);
*dpynump = idisplay; *dpynump = idisplay;
...@@ -855,13 +846,6 @@ _XSendClientPrefix( ...@@ -855,13 +846,6 @@ _XSendClientPrefix(
} }
#ifdef STREAMSCONN
#ifdef SVR4
#include <tiuser.h>
#else
#undef HASXDMAUTH
#endif
#endif
#ifdef SECURE_RPC #ifdef SECURE_RPC
#include <rpc/rpc.h> #include <rpc/rpc.h>
...@@ -1419,13 +1403,6 @@ GetAuthorization( ...@@ -1419,13 +1403,6 @@ GetAuthorization(
break; break;
} }
#endif /* AF_UNIX */ #endif /* AF_UNIX */
#ifdef AF_DECnet
case AF_DECnet:
/*
* What is the defined encoding for this?
*/
break;
#endif /* AF_DECnet */
default: default:
/* /*
* Need to return some kind of errro status here. * Need to return some kind of errro status here.
......
...@@ -9,12 +9,9 @@ DEFINES = $(FAILDEFINES) ...@@ -9,12 +9,9 @@ DEFINES = $(FAILDEFINES)
HEADERS = \ HEADERS = \
Xtrans.h \ Xtrans.h \
Xtrans.c \ Xtrans.c \
Xtransdnet.c \
Xtransint.h \ Xtransint.h \
Xtranslcl.c \ Xtranslcl.c \
Xtransos2.c \
Xtranssock.c \ Xtranssock.c \
Xtranstli.c \
Xtransutil.c \ Xtransutil.c \
transport.c transport.c
......
...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from The Open Group. from The Open Group.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -50,6 +48,11 @@ from The Open Group. ...@@ -50,6 +48,11 @@ from The Open Group.
*/ */
#include <ctype.h> #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) * The transport table contains a definition for every transport (protocol)
...@@ -74,18 +77,14 @@ from The Open Group. ...@@ -74,18 +77,14 @@ from The Open Group.
#define TRANS_LOCAL_LOCAL_INDEX 9 #define TRANS_LOCAL_LOCAL_INDEX 9
#define TRANS_LOCAL_PTS_INDEX 10 #define TRANS_LOCAL_PTS_INDEX 10
#define TRANS_LOCAL_NAMED_INDEX 11 #define TRANS_LOCAL_NAMED_INDEX 11
#define TRANS_LOCAL_ISC_INDEX 12 /* 12 used to be ISC, but that's gone. */
#define TRANS_LOCAL_SCO_INDEX 13 #define TRANS_LOCAL_SCO_INDEX 13
#define TRANS_SOCKET_INET6_INDEX 14 #define TRANS_SOCKET_INET6_INDEX 14
#define TRANS_LOCAL_PIPE_INDEX 15
static static
Xtransport_table Xtransports[] = { Xtransport_table Xtransports[] = {
#if defined(STREAMSCONN)
{ &TRANS(TLITCPFuncs), TRANS_TLI_TCP_INDEX },
{ &TRANS(TLIINETFuncs), TRANS_TLI_INET_INDEX },
{ &TRANS(TLITLIFuncs), TRANS_TLI_TLI_INDEX },
#endif /* STREAMSCONN */
#if defined(TCPCONN) #if defined(TCPCONN)
{ &TRANS(SocketTCPFuncs), TRANS_SOCKET_TCP_INDEX }, { &TRANS(SocketTCPFuncs), TRANS_SOCKET_TCP_INDEX },
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
...@@ -93,32 +92,26 @@ Xtransport_table Xtransports[] = { ...@@ -93,32 +92,26 @@ Xtransport_table Xtransports[] = {
#endif /* IPv6 */ #endif /* IPv6 */
{ &TRANS(SocketINETFuncs), TRANS_SOCKET_INET_INDEX }, { &TRANS(SocketINETFuncs), TRANS_SOCKET_INET_INDEX },
#endif /* TCPCONN */ #endif /* TCPCONN */
#if defined(DNETCONN)
{ &TRANS(DNETFuncs), TRANS_DNET_INDEX },
#endif /* DNETCONN */
#if defined(UNIXCONN) #if defined(UNIXCONN)
#if !defined(LOCALCONN) #if !defined(LOCALCONN)
{ &TRANS(SocketLocalFuncs), TRANS_SOCKET_LOCAL_INDEX }, { &TRANS(SocketLocalFuncs), TRANS_SOCKET_LOCAL_INDEX },
#endif /* !LOCALCONN */ #endif /* !LOCALCONN */
{ &TRANS(SocketUNIXFuncs), TRANS_SOCKET_UNIX_INDEX }, { &TRANS(SocketUNIXFuncs), TRANS_SOCKET_UNIX_INDEX },
#endif /* UNIXCONN */ #endif /* UNIXCONN */
#if defined(OS2PIPECONN)
{ &TRANS(OS2LocalFuncs), TRANS_LOCAL_LOCAL_INDEX },
#endif /* OS2PIPECONN */
#if defined(LOCALCONN) #if defined(LOCALCONN)
{ &TRANS(LocalFuncs), TRANS_LOCAL_LOCAL_INDEX }, { &TRANS(LocalFuncs), TRANS_LOCAL_LOCAL_INDEX },
#ifndef sun #ifndef __sun
{ &TRANS(PTSFuncs), TRANS_LOCAL_PTS_INDEX }, { &TRANS(PTSFuncs), TRANS_LOCAL_PTS_INDEX },
#endif /* sun */ #endif /* __sun */
#ifdef SVR4 #if defined(SVR4) || defined(__SVR4)
{ &TRANS(NAMEDFuncs), TRANS_LOCAL_NAMED_INDEX }, { &TRANS(NAMEDFuncs), TRANS_LOCAL_NAMED_INDEX },
#endif #endif
#ifndef sun #ifdef __sun
#if !defined(__SCO__) && !defined(__UNIXWARE__) { &TRANS(PIPEFuncs), TRANS_LOCAL_PIPE_INDEX },
{ &TRANS(ISCFuncs), TRANS_LOCAL_ISC_INDEX }, #endif /* __sun */
#endif #if defined(__SCO__) || defined(__UNIXWARE__)
{ &TRANS(SCOFuncs), TRANS_LOCAL_SCO_INDEX }, { &TRANS(SCOFuncs), TRANS_LOCAL_SCO_INDEX },
#endif /* sun */ #endif /* __SCO__ || __UNIXWARE__ */
#endif /* LOCALCONN */ #endif /* LOCALCONN */
}; };
...@@ -139,7 +132,7 @@ void ...@@ -139,7 +132,7 @@ void
TRANS(FreeConnInfo) (XtransConnInfo ciptr) TRANS(FreeConnInfo) (XtransConnInfo ciptr)
{ {
PRMSG (3,"FreeConnInfo(%p)\n", ciptr, 0, 0); prmsg (3,"FreeConnInfo(%p)\n", ciptr);
if (ciptr->addr) if (ciptr->addr)
free (ciptr->addr); free (ciptr->addr);
...@@ -150,20 +143,20 @@ TRANS(FreeConnInfo) (XtransConnInfo ciptr) ...@@ -150,20 +143,20 @@ TRANS(FreeConnInfo) (XtransConnInfo ciptr)
if (ciptr->port) if (ciptr->port)
free (ciptr->port); free (ciptr->port);
free ((char *) ciptr); free (ciptr);
} }
#define PROTOBUFSIZE 20 #define PROTOBUFSIZE 20
static Xtransport * static Xtransport *
TRANS(SelectTransport) (char *protocol) TRANS(SelectTransport) (const char *protocol)
{ {
char protobuf[PROTOBUFSIZE]; char protobuf[PROTOBUFSIZE];
int i; int i;
PRMSG (3,"SelectTransport(%s)\n", protocol, 0, 0); prmsg (3,"SelectTransport(%s)\n", protocol);
/* /*
* Force Protocol to be lowercase as a way of doing * Force Protocol to be lowercase as a way of doing
...@@ -174,8 +167,8 @@ TRANS(SelectTransport) (char *protocol) ...@@ -174,8 +167,8 @@ TRANS(SelectTransport) (char *protocol)
protobuf[PROTOBUFSIZE-1] = '\0'; protobuf[PROTOBUFSIZE-1] = '\0';
for (i = 0; i < PROTOBUFSIZE && protobuf[i] != '\0'; i++) for (i = 0; i < PROTOBUFSIZE && protobuf[i] != '\0'; i++)
if (isupper (protobuf[i])) if (isupper ((unsigned char)protobuf[i]))
protobuf[i] = tolower (protobuf[i]); protobuf[i] = tolower ((unsigned char)protobuf[i]);
/* Look at all of the configured protocols */ /* Look at all of the configured protocols */
...@@ -192,7 +185,8 @@ TRANS(SelectTransport) (char *protocol) ...@@ -192,7 +185,8 @@ TRANS(SelectTransport) (char *protocol)
static static
#endif /* TEST_t */ #endif /* TEST_t */
int int
TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) TRANS(ParseAddress) (const char *address,
char **protocol, char **host, char **port)
{ {
/* /*
...@@ -210,19 +204,19 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -210,19 +204,19 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
*/ */
char *mybuf, *tmpptr; char *mybuf, *tmpptr;
char *_protocol, *_host, *_port; const char *_protocol;
char *_host, *_port;
char hostnamebuf[256]; char hostnamebuf[256];
int _host_len; int _host_len;
PRMSG (3,"ParseAddress(%s)\n", address, 0, 0); prmsg (3,"ParseAddress(%s)\n", address);
/* Copy the string so it can be changed */ /* Copy the string so it can be changed */
tmpptr = mybuf = (char *) malloc (strlen (address) + 1); tmpptr = mybuf = strdup (address);
strcpy (mybuf, address);
/* Parse the string to get each component */ /* Parse the string to get each component */
/* Get the protocol part */ /* Get the protocol part */
_protocol = mybuf; _protocol = mybuf;
...@@ -289,22 +283,6 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -289,22 +283,6 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
return 0; return 0;
} }
/* Check for DECnet */
if ((mybuf != _host) && (*(mybuf - 1) == ':')
#if defined(IPv6) && defined(AF_INET6)
/* An IPv6 address can end in :: so three : in a row is assumed to be
an IPv6 host and not a DECnet node with a : in it's name, unless
DECnet is specifically requested */
&& ( ((mybuf - 1) == _host) || (*(mybuf - 2) != ':') ||
((_protocol != NULL) && (strcmp(_protocol, "dnet") == 0)) )
#endif
)
{
_protocol = "dnet";
*(mybuf - 1) = '\0';
}
*mybuf ++= '\0'; *mybuf ++= '\0';
_host_len = strlen(_host); _host_len = strlen(_host);
...@@ -315,9 +293,9 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -315,9 +293,9 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
} }
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
/* hostname in IPv6 [numeric_addr]:0 form? */ /* hostname in IPv6 [numeric_addr]:0 form? */
else if ( (_host_len > 3) && else if ( (_host_len > 3) &&
((strcmp(_protocol, "tcp") == 0) || (strcmp(_protocol, "inet6") == 0)) ((strcmp(_protocol, "tcp") == 0) || (strcmp(_protocol, "inet6") == 0))
&& (*_host == '[') && (*(_host + _host_len - 1) == ']') ) { && (*_host == '[') && (*(_host + _host_len - 1) == ']') ) {
struct sockaddr_in6 sin6; struct sockaddr_in6 sin6;
*(_host + _host_len - 1) = '\0'; *(_host + _host_len - 1) = '\0';
...@@ -354,12 +332,21 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -354,12 +332,21 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
*/ */
#endif #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 * Now that we have all of the components, allocate new
* string space for them. * string space for them.
*/ */
if ((*protocol = (char *) malloc(strlen (_protocol) + 1)) == NULL) if ((*protocol = strdup (_protocol)) == NULL)
{ {
/* Malloc failed */ /* Malloc failed */
*port = NULL; *port = NULL;
...@@ -368,10 +355,8 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -368,10 +355,8 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
free (tmpptr); free (tmpptr);
return 0; return 0;
} }
else
strcpy (*protocol, _protocol);
if ((*host = (char *) malloc (strlen (_host) + 1)) == NULL) if ((*host = strdup (_host)) == NULL)
{ {
/* Malloc failed */ /* Malloc failed */
*port = NULL; *port = NULL;
...@@ -381,10 +366,8 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -381,10 +366,8 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
free (tmpptr); free (tmpptr);
return 0; return 0;
} }
else
strcpy (*host, _host);
if ((*port = (char *) malloc (strlen (_port) + 1)) == NULL) if ((*port = strdup (_port)) == NULL)
{ {
/* Malloc failed */ /* Malloc failed */
*port = NULL; *port = NULL;
...@@ -395,8 +378,6 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -395,8 +378,6 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
free (tmpptr); free (tmpptr);
return 0; return 0;
} }
else
strcpy (*port, _port);
free (tmpptr); free (tmpptr);
...@@ -411,19 +392,19 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port) ...@@ -411,19 +392,19 @@ TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
*/ */
static XtransConnInfo static XtransConnInfo
TRANS(Open) (int type, char *address) TRANS(Open) (int type, const char *address)
{ {
char *protocol = NULL, *host = NULL, *port = NULL; char *protocol = NULL, *host = NULL, *port = NULL;
XtransConnInfo ciptr = NULL; XtransConnInfo ciptr = NULL;
Xtransport *thistrans; Xtransport *thistrans;
PRMSG (2,"Open(%d,%s)\n", type, address, 0); prmsg (2,"Open(%d,%s)\n", type, address);
#if defined(WIN32) && (defined(TCPCONN) || defined(DNETCONN)) #if defined(WIN32) && defined(TCPCONN)
if (TRANS(WSAStartup)()) if (TRANS(WSAStartup)())
{ {
PRMSG (1,"Open: WSAStartup failed\n", 0, 0, 0); prmsg (1,"Open: WSAStartup failed\n");
return NULL; return NULL;
} }
#endif #endif
...@@ -432,7 +413,7 @@ TRANS(Open) (int type, char *address) ...@@ -432,7 +413,7 @@ TRANS(Open) (int type, char *address)
if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0) if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
{ {
PRMSG (1,"Open: Unable to Parse address %s\n", address, 0, 0); prmsg (1,"Open: Unable to Parse address %s\n", address);
return NULL; return NULL;
} }
...@@ -440,8 +421,8 @@ TRANS(Open) (int type, char *address) ...@@ -440,8 +421,8 @@ TRANS(Open) (int type, char *address)
if ((thistrans = TRANS(SelectTransport) (protocol)) == NULL) if ((thistrans = TRANS(SelectTransport) (protocol)) == NULL)
{ {
PRMSG (1,"Open: Unable to find transport for %s\n", prmsg (1,"Open: Unable to find transport for %s\n",
protocol, 0, 0); protocol);
free (protocol); free (protocol);
free (host); free (host);
...@@ -463,25 +444,15 @@ TRANS(Open) (int type, char *address) ...@@ -463,25 +444,15 @@ TRANS(Open) (int type, char *address)
ciptr = thistrans->OpenCOTSServer(thistrans, protocol, host, port); ciptr = thistrans->OpenCOTSServer(thistrans, protocol, host, port);
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
break; break;
case XTRANS_OPEN_CLTS_CLIENT:
#ifdef TRANS_CLIENT
ciptr = thistrans->OpenCLTSClient(thistrans, protocol, host, port);
#endif /* TRANS_CLIENT */
break;
case XTRANS_OPEN_CLTS_SERVER:
#ifdef TRANS_SERVER
ciptr = thistrans->OpenCLTSServer(thistrans, protocol, host, port);
#endif /* TRANS_SERVER */
break;
default: default:
PRMSG (1,"Open: Unknown Open type %d\n", type, 0, 0); prmsg (1,"Open: Unknown Open type %d\n", type);
} }
if (ciptr == NULL) if (ciptr == NULL)
{ {
if (!(thistrans->flags & TRANS_DISABLED)) if (!(thistrans->flags & TRANS_DISABLED))
{ {
PRMSG (1,"Open: transport open failed for %s/%s:%s\n", prmsg (1,"Open: transport open failed for %s/%s:%s\n",
protocol, host, port); protocol, host, port);
} }
free (protocol); free (protocol);
...@@ -509,7 +480,7 @@ TRANS(Open) (int type, char *address) ...@@ -509,7 +480,7 @@ TRANS(Open) (int type, char *address)
*/ */
static XtransConnInfo static XtransConnInfo
TRANS(Reopen) (int type, int trans_id, int fd, char *port) TRANS(Reopen) (int type, int trans_id, int fd, const char *port)
{ {
XtransConnInfo ciptr = NULL; XtransConnInfo ciptr = NULL;
...@@ -517,7 +488,7 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port) ...@@ -517,7 +488,7 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port)
char *save_port; char *save_port;
int i; int i;
PRMSG (2,"Reopen(%d,%d,%s)\n", trans_id, fd, port); prmsg (2,"Reopen(%d,%d,%s)\n", trans_id, fd, port);
/* Determine the transport type */ /* Determine the transport type */
...@@ -530,21 +501,19 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port) ...@@ -530,21 +501,19 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port)
if (thistrans == NULL) if (thistrans == NULL)
{ {
PRMSG (1,"Reopen: Unable to find transport id %d\n", prmsg (1,"Reopen: Unable to find transport id %d\n",
trans_id, 0, 0); trans_id);
return NULL; return NULL;
} }
if ((save_port = (char *) malloc (strlen (port) + 1)) == NULL) if ((save_port = strdup (port)) == NULL)
{ {
PRMSG (1,"Reopen: Unable to malloc port string\n", 0, 0, 0); prmsg (1,"Reopen: Unable to malloc port string\n");
return NULL; return NULL;
} }
strcpy (save_port, port);
/* Get a new XtransConnInfo object */ /* Get a new XtransConnInfo object */
switch (type) switch (type)
...@@ -552,16 +521,14 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port) ...@@ -552,16 +521,14 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port)
case XTRANS_OPEN_COTS_SERVER: case XTRANS_OPEN_COTS_SERVER:
ciptr = thistrans->ReopenCOTSServer(thistrans, fd, port); ciptr = thistrans->ReopenCOTSServer(thistrans, fd, port);
break; break;
case XTRANS_OPEN_CLTS_SERVER:
ciptr = thistrans->ReopenCLTSServer(thistrans, fd, port);
break;
default: default:
PRMSG (1,"Reopen: Bad Open type %d\n", type, 0, 0); prmsg (1,"Reopen: Bad Open type %d\n", type);
} }
if (ciptr == NULL) if (ciptr == NULL)
{ {
PRMSG (1,"Reopen: transport open failed\n", 0, 0, 0); prmsg (1,"Reopen: transport open failed\n");
free (save_port);
return NULL; return NULL;
} }
...@@ -584,10 +551,10 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port) ...@@ -584,10 +551,10 @@ TRANS(Reopen) (int type, int trans_id, int fd, char *port)
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
XtransConnInfo XtransConnInfo
TRANS(OpenCOTSClient) (char *address) TRANS(OpenCOTSClient) (const char *address)
{ {
PRMSG (2,"OpenCOTSClient(%s)\n", address, 0, 0); prmsg (2,"OpenCOTSClient(%s)\n", address);
return TRANS(Open) (XTRANS_OPEN_COTS_CLIENT, address); return TRANS(Open) (XTRANS_OPEN_COTS_CLIENT, address);
} }
...@@ -597,63 +564,28 @@ TRANS(OpenCOTSClient) (char *address) ...@@ -597,63 +564,28 @@ TRANS(OpenCOTSClient) (char *address)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
XtransConnInfo XtransConnInfo
TRANS(OpenCOTSServer) (char *address) TRANS(OpenCOTSServer) (const char *address)
{ {
PRMSG (2,"OpenCOTSServer(%s)\n", address, 0, 0); prmsg (2,"OpenCOTSServer(%s)\n", address);
return TRANS(Open) (XTRANS_OPEN_COTS_SERVER, address); return TRANS(Open) (XTRANS_OPEN_COTS_SERVER, address);
} }
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
XtransConnInfo
TRANS(OpenCLTSClient) (char *address)
{
PRMSG (2,"OpenCLTSClient(%s)\n", address, 0, 0);
return TRANS(Open) (XTRANS_OPEN_CLTS_CLIENT, address);
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
XtransConnInfo
TRANS(OpenCLTSServer) (char *address)
{
PRMSG (2,"OpenCLTSServer(%s)\n", address, 0, 0);
return TRANS(Open) (XTRANS_OPEN_CLTS_SERVER, address);
}
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
XtransConnInfo XtransConnInfo
TRANS(ReopenCOTSServer) (int trans_id, int fd, char *port) TRANS(ReopenCOTSServer) (int trans_id, int fd, const char *port)
{ {
PRMSG (2,"ReopenCOTSServer(%d, %d, %s)\n", trans_id, fd, port); prmsg (2,"ReopenCOTSServer(%d, %d, %s)\n", trans_id, fd, port);
return TRANS(Reopen) (XTRANS_OPEN_COTS_SERVER, trans_id, fd, port); return TRANS(Reopen) (XTRANS_OPEN_COTS_SERVER, trans_id, fd, port);
} }
XtransConnInfo
TRANS(ReopenCLTSServer) (int trans_id, int fd, char *port)
{
PRMSG (2,"ReopenCLTSServer(%d, %d, %s)\n", trans_id, fd, port);
return TRANS(Reopen) (XTRANS_OPEN_CLTS_SERVER, trans_id, fd, port);
}
int int
TRANS(GetReopenInfo) (XtransConnInfo ciptr, TRANS(GetReopenInfo) (XtransConnInfo ciptr,
int *trans_id, int *fd, char **port) int *trans_id, int *fd, char **port)
{ {
...@@ -665,13 +597,10 @@ TRANS(GetReopenInfo) (XtransConnInfo ciptr, ...@@ -665,13 +597,10 @@ TRANS(GetReopenInfo) (XtransConnInfo ciptr,
*trans_id = Xtransports[i].transport_id; *trans_id = Xtransports[i].transport_id;
*fd = ciptr->fd; *fd = ciptr->fd;
if ((*port = (char *) malloc (strlen (ciptr->port) + 1)) == NULL) if ((*port = strdup (ciptr->port)) == NULL)
return 0; return 0;
else else
{
strcpy (*port, ciptr->port);
return 1; return 1;
}
} }
return 0; return 0;
...@@ -687,7 +616,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg) ...@@ -687,7 +616,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
int fd = ciptr->fd; int fd = ciptr->fd;
int ret = 0; int ret = 0;
PRMSG (2,"SetOption(%d,%d,%d)\n", fd, option, arg); prmsg (2,"SetOption(%d,%d,%d)\n", fd, option, arg);
/* /*
* For now, all transport type use the same stuff for setting options. * For now, all transport type use the same stuff for setting options.
...@@ -709,7 +638,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg) ...@@ -709,7 +638,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
break; break;
case 1: /* Set to non-blocking mode */ case 1: /* Set to non-blocking mode */
#if defined(O_NONBLOCK) && (!defined(ultrix) && !defined(hpux) && !defined(AIXV3) && !defined(uniosu) && !defined(__UNIXOS2__) && !defined(SCO325)) && !defined(__QNX__) #if defined(O_NONBLOCK) && !defined(SCO325)
ret = fcntl (fd, F_GETFL, 0); ret = fcntl (fd, F_GETFL, 0);
if (ret != -1) if (ret != -1)
ret = fcntl (fd, F_SETFL, ret | O_NONBLOCK); ret = fcntl (fd, F_SETFL, ret | O_NONBLOCK);
...@@ -721,7 +650,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg) ...@@ -721,7 +650,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
ret = ioctl (fd, FIOSNBIO, &arg); ret = ioctl (fd, FIOSNBIO, &arg);
} }
#else #else
#if (defined(AIXV3) || defined(uniosu) || defined(WIN32) || defined(__UNIXOS2__) || defined(__QNX__)) && defined(FIONBIO) #if defined(WIN32)
{ {
#ifdef WIN32 #ifdef WIN32
u_long arg; u_long arg;
...@@ -731,11 +660,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg) ...@@ -731,11 +660,7 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
arg = 1; arg = 1;
/* IBM TCP/IP understands this option too well: it causes TRANS(Read) to fail /* IBM TCP/IP understands this option too well: it causes TRANS(Read) to fail
* eventually with EWOULDBLOCK */ * eventually with EWOULDBLOCK */
#ifndef __UNIXOS2__
ret = ioctl (fd, FIONBIO, &arg); ret = ioctl (fd, FIONBIO, &arg);
#else
/* ret = ioctl(fd, FIONBIO, &arg, sizeof(int));*/
#endif
} }
#else #else
ret = fcntl (fd, F_GETFL, 0); ret = fcntl (fd, F_GETFL, 0);
...@@ -763,30 +688,58 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg) ...@@ -763,30 +688,58 @@ TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
#endif /* F_SETFD */ #endif /* F_SETFD */
break; break;
} }
return ret; return ret;
} }
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
int int
TRANS(CreateListener) (XtransConnInfo ciptr, char *port, unsigned int flags) TRANS(CreateListener) (XtransConnInfo ciptr, const char *port, unsigned int flags)
{ {
return ciptr->transptr->CreateListener (ciptr, port, flags); return ciptr->transptr->CreateListener (ciptr, port, flags);
} }
int int
TRANS(NoListen) (char * protocol) 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; Xtransport *trans;
int i = 0, ret = 0; int i = 0, ret = 0;
if ((trans = TRANS(SelectTransport)(protocol)) == NULL) if ((trans = TRANS(SelectTransport)(protocol)) == NULL)
{ {
PRMSG (1,"TransNoListen: unable to find transport: %s\n", prmsg (1,"TransNoListen: unable to find transport: %s\n",
protocol, 0, 0); protocol);
return -1; return -1;
} }
...@@ -803,6 +756,47 @@ TRANS(NoListen) (char * protocol) ...@@ -803,6 +756,47 @@ TRANS(NoListen) (char * protocol)
} }
int 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) TRANS(ResetListener) (XtransConnInfo ciptr)
{ {
...@@ -819,7 +813,7 @@ TRANS(Accept) (XtransConnInfo ciptr, int *status) ...@@ -819,7 +813,7 @@ TRANS(Accept) (XtransConnInfo ciptr, int *status)
{ {
XtransConnInfo newciptr; XtransConnInfo newciptr;
PRMSG (2,"Accept(%d)\n", ciptr->fd, 0, 0); prmsg (2,"Accept(%d)\n", ciptr->fd);
newciptr = ciptr->transptr->Accept (ciptr, status); newciptr = ciptr->transptr->Accept (ciptr, status);
...@@ -835,7 +829,7 @@ TRANS(Accept) (XtransConnInfo ciptr, int *status) ...@@ -835,7 +829,7 @@ TRANS(Accept) (XtransConnInfo ciptr, int *status)
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
int int
TRANS(Connect) (XtransConnInfo ciptr, char *address) TRANS(Connect) (XtransConnInfo ciptr, const char *address)
{ {
char *protocol; char *protocol;
...@@ -843,19 +837,23 @@ TRANS(Connect) (XtransConnInfo ciptr, char *address) ...@@ -843,19 +837,23 @@ TRANS(Connect) (XtransConnInfo ciptr, char *address)
char *port; char *port;
int ret; int ret;
PRMSG (2,"Connect(%d,%s)\n", ciptr->fd, address, 0); prmsg (2,"Connect(%d,%s)\n", ciptr->fd, address);
if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0) if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
{ {
PRMSG (1,"Connect: Unable to Parse address %s\n", prmsg (1,"Connect: Unable to Parse address %s\n",
address, 0, 0); address);
return -1; return -1;
} }
#ifdef HAVE_LAUNCHD
if (!host) host=strdup("");
#endif
if (!port || !*port) if (!port || !*port)
{ {
PRMSG (1,"Connect: Missing port specification in %s\n", prmsg (1,"Connect: Missing port specification in %s\n",
address, 0, 0); address);
if (protocol) free (protocol); if (protocol) free (protocol);
if (host) free (host); if (host) free (host);
return -1; return -1;
...@@ -866,7 +864,7 @@ TRANS(Connect) (XtransConnInfo ciptr, char *address) ...@@ -866,7 +864,7 @@ TRANS(Connect) (XtransConnInfo ciptr, char *address)
if (protocol) free (protocol); if (protocol) free (protocol);
if (host) free (host); if (host) free (host);
if (port) free (port); if (port) free (port);
return ret; return ret;
} }
...@@ -908,6 +906,20 @@ TRANS(Writev) (XtransConnInfo ciptr, struct iovec *buf, int size) ...@@ -908,6 +906,20 @@ TRANS(Writev) (XtransConnInfo ciptr, struct iovec *buf, int size)
return ciptr->transptr->Writev (ciptr, buf, 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 int
TRANS(Disconnect) (XtransConnInfo ciptr) TRANS(Disconnect) (XtransConnInfo ciptr)
...@@ -921,7 +933,7 @@ TRANS(Close) (XtransConnInfo ciptr) ...@@ -921,7 +933,7 @@ TRANS(Close) (XtransConnInfo ciptr)
{ {
int ret; int ret;
PRMSG (2,"Close(%d)\n", ciptr->fd, 0, 0); prmsg (2,"Close(%d)\n", ciptr->fd);
ret = ciptr->transptr->Close (ciptr); ret = ciptr->transptr->Close (ciptr);
...@@ -936,7 +948,7 @@ TRANS(CloseForCloning) (XtransConnInfo ciptr) ...@@ -936,7 +948,7 @@ TRANS(CloseForCloning) (XtransConnInfo ciptr)
{ {
int ret; int ret;
PRMSG (2,"CloseForCloning(%d)\n", ciptr->fd, 0, 0); prmsg (2,"CloseForCloning(%d)\n", ciptr->fd);
ret = ciptr->transptr->CloseForCloning (ciptr); ret = ciptr->transptr->CloseForCloning (ciptr);
...@@ -952,40 +964,42 @@ TRANS(IsLocal) (XtransConnInfo ciptr) ...@@ -952,40 +964,42 @@ TRANS(IsLocal) (XtransConnInfo ciptr)
return (ciptr->family == AF_UNIX); return (ciptr->family == AF_UNIX);
} }
#ifdef NX_TRANS_SOCKET
/* this is needed for pre-xcb X11 as we have in NX */
int int
TRANS(GetMyAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp, TRANS(GetMyAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp,
Xtransaddr **addrp) Xtransaddr **addrp)
{ {
PRMSG (2,"GetMyAddr(%d)\n", ciptr->fd, 0, 0); prmsg (2,"GetMyAddr(%d)\n", ciptr->fd);
*familyp = ciptr->family; *familyp = ciptr->family;
*addrlenp = ciptr->addrlen; *addrlenp = ciptr->addrlen;
if ((*addrp = (Xtransaddr *) malloc (ciptr->addrlen)) == NULL) if ((*addrp = (Xtransaddr *) malloc (ciptr->addrlen)) == NULL)
{ {
PRMSG (1,"GetMyAddr: malloc failed\n", 0, 0, 0); prmsg (1,"GetMyAddr: malloc failed\n");
return -1; return -1;
} }
memcpy(*addrp, ciptr->addr, ciptr->addrlen); memcpy(*addrp, ciptr->addr, ciptr->addrlen);
return 0; return 0;
} }
#endif
int int
TRANS(GetPeerAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp, TRANS(GetPeerAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp,
Xtransaddr **addrp) Xtransaddr **addrp)
{ {
PRMSG (2,"GetPeerAddr(%d)\n", ciptr->fd, 0, 0); prmsg (2,"GetPeerAddr(%d)\n", ciptr->fd);
*familyp = ciptr->family; *familyp = ciptr->family;
*addrlenp = ciptr->peeraddrlen; *addrlenp = ciptr->peeraddrlen;
if ((*addrp = (Xtransaddr *) malloc (ciptr->peeraddrlen)) == NULL) if ((*addrp = malloc (ciptr->peeraddrlen)) == NULL)
{ {
PRMSG (1,"GetPeerAddr: malloc failed\n", 0, 0, 0); prmsg (1,"GetPeerAddr: malloc failed\n");
return -1; return -1;
} }
memcpy(*addrp, ciptr->peeraddr, ciptr->peeraddrlen); memcpy(*addrp, ciptr->peeraddr, ciptr->peeraddrlen);
...@@ -1038,45 +1052,138 @@ complete_network_count (void) ...@@ -1038,45 +1052,138 @@ complete_network_count (void)
} }
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 int
TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, TRANS(MakeAllCOTSServerListeners) (const char *port, int *partial,
XtransConnInfo **ciptrs_ret) int *count_ret, XtransConnInfo **ciptrs_ret)
{ {
char buffer[256]; /* ??? What size ?? */ char buffer[256]; /* ??? What size ?? */
XtransConnInfo ciptr, temp_ciptrs[NUMTRANS]; XtransConnInfo ciptr, temp_ciptrs[NUMTRANS];
int status, i, j; int status, i, j;
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
int ipv6_succ = 0; int ipv6_succ = 0;
#endif #endif
prmsg (2,"MakeAllCOTSServerListeners(%s,%p)\n",
PRMSG (2,"MakeAllCOTSServerListeners(%s,%p)\n", port ? port : "NULL", ciptrs_ret);
port ? port : "NULL", ciptrs_ret, 0);
*count_ret = 0; *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++) for (i = 0; i < NUMTRANS; i++)
{ {
Xtransport *trans = Xtransports[i].transport; Xtransport *trans = Xtransports[i].transport;
unsigned int flags = 0; unsigned int flags = 0;
if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN) if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN ||
trans->flags&TRANS_RECEIVED)
continue; continue;
sprintf(buffer,"%s/:%s", trans->TransName, port ? port : ""); snprintf(buffer, sizeof(buffer), "%s/:%s",
trans->TransName, port ? port : "");
PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n", prmsg (5,"MakeAllCOTSServerListeners: opening %s\n",
buffer, 0, 0); buffer);
if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL) if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL)
{ {
if (trans->flags & TRANS_DISABLED) if (trans->flags & TRANS_DISABLED)
continue; continue;
PRMSG (1, prmsg (1,
"MakeAllCOTSServerListeners: failed to open listener for %s\n", "MakeAllCOTSServerListeners: failed to open listener for %s\n",
trans->TransName, 0, 0); trans->TransName);
continue; continue;
} }
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
...@@ -1095,9 +1202,8 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, ...@@ -1095,9 +1202,8 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
* running at this address, and this function should fail. * running at this address, and this function should fail.
*/ */
PRMSG (1, prmsg (1,
"MakeAllCOTSServerListeners: server already running\n", "MakeAllCOTSServerListeners: server already running\n");
0, 0, 0);
for (j = 0; j < *count_ret; j++) for (j = 0; j < *count_ret; j++)
TRANS(Close) (temp_ciptrs[j]); TRANS(Close) (temp_ciptrs[j]);
...@@ -1109,9 +1215,9 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, ...@@ -1109,9 +1215,9 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
} }
else else
{ {
PRMSG (1, prmsg (1,
"MakeAllCOTSServerListeners: failed to create listener for %s\n", "MakeAllCOTSServerListeners: failed to create listener for %s\n",
trans->TransName, 0, 0); trans->TransName);
continue; continue;
} }
...@@ -1121,10 +1227,10 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, ...@@ -1121,10 +1227,10 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX) if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX)
ipv6_succ = 1; ipv6_succ = 1;
#endif #endif
PRMSG (5, prmsg (5,
"MakeAllCOTSServerListeners: opened listener for %s, %d\n", "MakeAllCOTSServerListeners: opened listener for %s, %d\n",
trans->TransName, ciptr->fd, 0); trans->TransName, ciptr->fd);
temp_ciptrs[*count_ret] = ciptr; temp_ciptrs[*count_ret] = ciptr;
(*count_ret)++; (*count_ret)++;
...@@ -1132,13 +1238,13 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, ...@@ -1132,13 +1238,13 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
*partial = (*count_ret < complete_network_count()); *partial = (*count_ret < complete_network_count());
PRMSG (5, prmsg (5,
"MakeAllCOTSServerListeners: partial=%d, actual=%d, complete=%d \n", "MakeAllCOTSServerListeners: partial=%d, actual=%d, complete=%d \n",
*partial, *count_ret, complete_network_count()); *partial, *count_ret, complete_network_count());
if (*count_ret > 0) if (*count_ret > 0)
{ {
if ((*ciptrs_ret = (XtransConnInfo *) malloc ( if ((*ciptrs_ret = malloc (
*count_ret * sizeof (XtransConnInfo))) == NULL) *count_ret * sizeof (XtransConnInfo))) == NULL)
{ {
return -1; return -1;
...@@ -1151,105 +1257,7 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret, ...@@ -1151,105 +1257,7 @@ TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
} }
else else
*ciptrs_ret = NULL; *ciptrs_ret = NULL;
return 0;
}
int
TRANS(MakeAllCLTSServerListeners) (char *port, int *partial, int *count_ret,
XtransConnInfo **ciptrs_ret)
{
char buffer[256]; /* ??? What size ?? */
XtransConnInfo ciptr, temp_ciptrs[NUMTRANS];
int status, i, j;
PRMSG (2,"MakeAllCLTSServerListeners(%s,%p)\n",
port ? port : "NULL", ciptrs_ret, 0);
*count_ret = 0;
for (i = 0; i < NUMTRANS; i++)
{
Xtransport *trans = Xtransports[i].transport;
if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)
continue;
sprintf(buffer,"%s/:%s", trans->TransName, port ? port : "");
PRMSG (5,"MakeAllCLTSServerListeners: opening %s\n",
buffer, 0, 0);
if ((ciptr = TRANS(OpenCLTSServer (buffer))) == NULL)
{
PRMSG (1,
"MakeAllCLTSServerListeners: failed to open listener for %s\n",
trans->TransName, 0, 0);
continue;
}
if ((status = TRANS(CreateListener (ciptr, port, 0))) < 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,
"MakeAllCLTSServerListeners: server already running\n",
0, 0, 0);
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,
"MakeAllCLTSServerListeners: failed to create listener for %s\n",
trans->TransName, 0, 0);
continue;
}
}
PRMSG (5,
"MakeAllCLTSServerListeners: opened listener for %s, %d\n",
trans->TransName, ciptr->fd, 0);
temp_ciptrs[*count_ret] = ciptr;
(*count_ret)++;
}
*partial = (*count_ret < complete_network_count());
PRMSG (5,
"MakeAllCLTSServerListeners: partial=%d, actual=%d, complete=%d \n",
*partial, *count_ret, complete_network_count());
if (*count_ret > 0)
{
if ((*ciptrs_ret = (XtransConnInfo *) 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; return 0;
} }
...@@ -1262,7 +1270,8 @@ TRANS(MakeAllCLTSServerListeners) (char *port, int *partial, int *count_ret, ...@@ -1262,7 +1270,8 @@ TRANS(MakeAllCLTSServerListeners) (char *port, int *partial, int *count_ret,
* may be used by it. * may be used by it.
*/ */
#if (defined(SYSV) && defined(i386) && !defined(__SCO__)) || defined(WIN32) || defined(__sxg__) || defined(__UNIXOS2__)
#ifdef WIN32
/* /*
* emulate readv * emulate readv
...@@ -1292,9 +1301,6 @@ static int TRANS(ReadV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt) ...@@ -1292,9 +1301,6 @@ static int TRANS(ReadV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt)
return total; return total;
} }
#endif /* SYSV && i386 || WIN32 || __sxg__ */
#if (defined(SYSV) && defined(i386) && !defined(__SCO__)) || defined(WIN32) || defined(__sxg__) || defined(__UNIXOS2__)
/* /*
* emulate writev * emulate writev
...@@ -1324,10 +1330,10 @@ static int TRANS(WriteV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt) ...@@ -1324,10 +1330,10 @@ static int TRANS(WriteV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt)
return total; return total;
} }
#endif /* SYSV && i386 || WIN32 || __sxg__ */ #endif /* WIN32 */
#if (defined(_POSIX_SOURCE) && !defined(AIXV3) && !defined(__QNX__)) || defined(hpux) || defined(USG) || defined(SVR4) || defined(__SCO__) #if defined(_POSIX_SOURCE) || defined(USG) || defined(SVR4) || defined(__SVR4) || defined(__SCO__)
#ifndef NEED_UTSNAME #ifndef NEED_UTSNAME
#define NEED_UTSNAME #define NEED_UTSNAME
#endif #endif
......
...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from The Open Group. from The Open Group.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -54,121 +52,75 @@ from The Open Group. ...@@ -54,121 +52,75 @@ from The Open Group.
#include <nx-X11/Xfuncproto.h> #include <nx-X11/Xfuncproto.h>
#include <nx-X11/Xos.h> #include <nx-X11/Xos.h>
#include <nx-X11/Xmd.h>
#ifndef WIN32 #ifndef WIN32
#ifndef Lynx
#include <sys/socket.h> #include <sys/socket.h>
#else
#include <socket.h>
#endif
#endif #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. * Set the functions names according to where this code is being compiled.
*/ */
#ifdef X11_t #ifdef X11_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _X11Trans##func #define TRANS(func) _X11Trans##func
#else
#define TRANS(func) _X11Trans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_X11Trans"; static const char *__xtransname = "_X11Trans";
#endif #endif
#endif /* X11_t */ #endif /* X11_t */
#ifdef XSERV_t #ifdef XSERV_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _XSERVTrans##func #define TRANS(func) _XSERVTrans##func
#else
#define TRANS(func) _XSERVTrans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_XSERVTrans"; static const char *__xtransname = "_XSERVTrans";
#endif #endif
#define X11_t #define X11_t
#endif /* XSERV_t */ #endif /* XSERV_t */
#ifdef XIM_t #ifdef XIM_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _XimXTrans##func #define TRANS(func) _XimXTrans##func
#else
#define TRANS(func) _XimXTrans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_XimTrans"; static const char *__xtransname = "_XimTrans";
#endif #endif
#endif /* XIM_t */ #endif /* XIM_t */
#ifdef FS_t #ifdef FS_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _FSTrans##func #define TRANS(func) _FSTrans##func
#else
#define TRANS(func) _FSTrans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_FSTrans"; static const char *__xtransname = "_FSTrans";
#endif #endif
#endif /* FS_t */ #endif /* FS_t */
#ifdef FONT_t #ifdef FONT_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _FontTrans##func #define TRANS(func) _FontTrans##func
#else
#define TRANS(func) _FontTrans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_FontTrans"; static const char *__xtransname = "_FontTrans";
#endif #endif
#endif /* FONT_t */ #endif /* FONT_t */
#ifdef ICE_t #ifdef ICE_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _IceTrans##func #define TRANS(func) _IceTrans##func
#else
#define TRANS(func) _IceTrans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_IceTrans"; static const char *__xtransname = "_IceTrans";
#endif #endif
#endif /* ICE_t */ #endif /* ICE_t */
#ifdef TEST_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _TESTTrans##func
#else
#define TRANS(func) _TESTTrans/**/func
#endif
#ifdef XTRANSDEBUG
static char* __xtransname = "_TESTTrans";
#endif
#endif /* TEST_t */
#ifdef LBXPROXY_t
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _LBXPROXYTrans##func
#else
#define TRANS(func) _LBXPROXYTrans/**/func
#endif
#define X11_t /* The server defines this - so should the LBX proxy */
#ifdef XTRANSDEBUG
static char* __xtransname = "_LBXPROXYTrans";
#endif
#endif /* LBXPROXY_t */
#if !defined(TRANS) #if !defined(TRANS)
#if !defined(UNIXCPP) || defined(ANSICPP)
#define TRANS(func) _XTrans##func #define TRANS(func) _XTrans##func
#else
#define TRANS(func) _XTrans/**/func
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
static char* __xtransname = "_XTrans"; static const char *__xtransname = "_XTrans";
#endif #endif
#endif /* !TRANS */ #endif /* !TRANS */
#ifdef __clang__
#pragma clang diagnostic pop
#endif
/* /*
* Create a single address structure that can be used wherever * Create a single address structure that can be used wherever
...@@ -196,7 +148,7 @@ typedef long BytesReadable_t; ...@@ -196,7 +148,7 @@ typedef long BytesReadable_t;
#endif #endif
#if defined(WIN32) || (defined(USG) && !defined(umips) && !defined(MOTOROLA) && !defined(uniosu) && !defined(__sxg__)) #if defined(WIN32) || defined(USG)
/* /*
* TRANS(Readv) and TRANS(Writev) use struct iovec, normally found * TRANS(Readv) and TRANS(Writev) use struct iovec, normally found
...@@ -210,11 +162,7 @@ struct iovec { ...@@ -210,11 +162,7 @@ struct iovec {
}; };
#else #else
#ifndef Lynx
#include <sys/uio.h> #include <sys/uio.h>
#else
#include <uio.h>
#endif
#endif #endif
typedef struct _XtransConnInfo *XtransConnInfo; typedef struct _XtransConnInfo *XtransConnInfo;
...@@ -274,7 +222,7 @@ void TRANS(FreeConnInfo) ( ...@@ -274,7 +222,7 @@ void TRANS(FreeConnInfo) (
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
XtransConnInfo TRANS(OpenCOTSClient)( XtransConnInfo TRANS(OpenCOTSClient)(
char * /* address */ const char * /* address */
); );
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
...@@ -282,23 +230,7 @@ XtransConnInfo TRANS(OpenCOTSClient)( ...@@ -282,23 +230,7 @@ XtransConnInfo TRANS(OpenCOTSClient)(
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
XtransConnInfo TRANS(OpenCOTSServer)( XtransConnInfo TRANS(OpenCOTSServer)(
char * /* address */ const char * /* address */
);
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
XtransConnInfo TRANS(OpenCLTSClient)(
char * /* address */
);
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
XtransConnInfo TRANS(OpenCLTSServer)(
char * /* address */
); );
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
...@@ -308,13 +240,7 @@ XtransConnInfo TRANS(OpenCLTSServer)( ...@@ -308,13 +240,7 @@ XtransConnInfo TRANS(OpenCLTSServer)(
XtransConnInfo TRANS(ReopenCOTSServer)( XtransConnInfo TRANS(ReopenCOTSServer)(
int, /* trans_id */ int, /* trans_id */
int, /* fd */ int, /* fd */
char * /* port */ const char * /* port */
);
XtransConnInfo TRANS(ReopenCLTSServer)(
int, /* trans_id */
int, /* fd */
char * /* port */
); );
int TRANS(GetReopenInfo)( int TRANS(GetReopenInfo)(
...@@ -337,12 +263,24 @@ int TRANS(SetOption)( ...@@ -337,12 +263,24 @@ int TRANS(SetOption)(
int TRANS(CreateListener)( int TRANS(CreateListener)(
XtransConnInfo, /* ciptr */ XtransConnInfo, /* ciptr */
char *, /* port */ const char *, /* port */
unsigned int /* flags */ unsigned int /* flags */
); );
int TRANS(Received) (
const char* /* protocol*/
);
int TRANS(NoListen) ( int TRANS(NoListen) (
char* /* protocol*/ const char* /* protocol*/
);
int TRANS(Listen) (
const char* /* protocol*/
);
int TRANS(IsListening) (
const char* /* protocol*/
); );
int TRANS(ResetListener)( int TRANS(ResetListener)(
...@@ -360,7 +298,7 @@ XtransConnInfo TRANS(Accept)( ...@@ -360,7 +298,7 @@ XtransConnInfo TRANS(Accept)(
int TRANS(Connect)( int TRANS(Connect)(
XtransConnInfo, /* ciptr */ XtransConnInfo, /* ciptr */
char * /* address */ const char * /* address */
); );
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
...@@ -394,6 +332,10 @@ int TRANS(Writev)( ...@@ -394,6 +332,10 @@ int TRANS(Writev)(
int /* size */ int /* size */
); );
int TRANS(SendFd) (XtransConnInfo ciptr, int fd, int do_close);
int TRANS(RecvFd) (XtransConnInfo ciptr);
int TRANS(Disconnect)( int TRANS(Disconnect)(
XtransConnInfo /* ciptr */ XtransConnInfo /* ciptr */
); );
...@@ -410,12 +352,15 @@ int TRANS(IsLocal)( ...@@ -410,12 +352,15 @@ int TRANS(IsLocal)(
XtransConnInfo /* ciptr */ XtransConnInfo /* ciptr */
); );
#ifdef NX_TRANS_SOCKET
/* needed for pre-xcb libX11 as we have in NX */
int TRANS(GetMyAddr)( int TRANS(GetMyAddr)(
XtransConnInfo, /* ciptr */ XtransConnInfo, /* ciptr */
int *, /* familyp */ int *, /* familyp */
int *, /* addrlenp */ int *, /* addrlenp */
Xtransaddr ** /* addrp */ Xtransaddr ** /* addrp */
); );
#endif
int TRANS(GetPeerAddr)( int TRANS(GetPeerAddr)(
XtransConnInfo, /* ciptr */ XtransConnInfo, /* ciptr */
...@@ -431,14 +376,7 @@ int TRANS(GetConnectionNumber)( ...@@ -431,14 +376,7 @@ int TRANS(GetConnectionNumber)(
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
int TRANS(MakeAllCOTSServerListeners)( int TRANS(MakeAllCOTSServerListeners)(
char *, /* port */ const char *, /* port */
int *, /* partial */
int *, /* count_ret */
XtransConnInfo ** /* ciptrs_ret */
);
int TRANS(MakeAllCLTSServerListeners)(
char *, /* port */
int *, /* partial */ int *, /* partial */
int *, /* count_ret */ int *, /* count_ret */
XtransConnInfo ** /* ciptrs_ret */ XtransConnInfo ** /* ciptrs_ret */
...@@ -475,13 +413,13 @@ TRANS(GetPeerNetworkId)( ...@@ -475,13 +413,13 @@ TRANS(GetPeerNetworkId)(
#endif /* ICE_t */ #endif /* ICE_t */
int int
TRANS(GetHostname) ( TRANS(GetHostname) (
char * /* buf */, char * /* buf */,
int /* maxlen */ int /* maxlen */
); );
#if defined(WIN32) && (defined(TCPCONN) || defined(DNETCONN)) #if defined(WIN32) && defined(TCPCONN)
int TRANS(WSAStartup)(); int TRANS(WSAStartup)();
#endif #endif
......
/*
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 and 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 WIN32
#include <netdnet/dn.h>
#include <netdnet/dnetdb.h>
#include <sys/ioctl.h>
#endif /* !WIN32 */
#include <stdio.h>
#ifdef WIN32
#define _WILLWINSOCK_
#define BOOL wBOOL
#undef Status
#define Status wStatus
#include <prgpre.h> /* PATHWORKS header normally in %MSTOOLS%\h\pathwork */
#undef Status
#define Status int
#undef BOOL
#include <nx-X11/Xw32defs.h>
#undef close
#define close closesocket
#endif /* WIN32 */
#if defined(X11_t)
#define DNETOBJ "X$X"
#endif
#if defined(XIM_t)
#define DNETOBJ "IMSERVER$"
#endif
#if defined(FS_t) || defined(FONT_t)
#define DNETOBJ "X$FONT"
#endif
#if defined(ICE_t)
#define DNETOBJ ""
#endif
#if defined(TEST_t)
#define DNETOBJ "X$TEST"
#endif
/*
* This is the DNET implementation of the X Transport service layer
*/
/*
* This function gets the local address of the socket and stores it in the
* XtransConnInfo structure for the connection.
*/
static int
TRANS(DNETGetAddr) (XtransConnInfo ciptr)
{
struct sockaddr_dn sockname;
int namelen = sizeof(sockname);
PRMSG (3,"DNETGetAddr(%x)\n", ciptr, 0, 0);
if (getsockname (ciptr->fd, (struct sockaddr *) &sockname, &namelen) < 0)
{
PRMSG (1,"DNETGetAddr: getsockname() failed: %d\n",
EGET(), 0, 0);
return -1;
}
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if ((ciptr->addr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "DNETGetAddr: Can't allocate space for the addr\n",
0, 0, 0);
return -1;
}
ciptr->family = sockname.sdn_family;
ciptr->addrlen = namelen;
memcpy (ciptr->addr, &sockname, 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(DNETGetPeerAddr) (XtransConnInfo ciptr)
{
struct sockaddr_dn sockname;
int namelen = sizeof(sockname);
PRMSG (3,"DNETGetPeerAddr(%x)\n", ciptr, 0, 0);
if (getpeername (ciptr->fd, (struct sockaddr *) &sockname, &namelen) < 0)
{
PRMSG (1,"DNETGetPeerAddr: getpeername() failed: %d\n",
EGET(), 0, 0);
return -1;
}
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if ((ciptr->peeraddr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1,
"DNETGetPeerAddr: Can't allocate space for the addr\n",
0, 0, 0);
return -1;
}
ciptr->peeraddrlen = namelen;
memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen);
return 0;
}
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(DNETOpenCOTSClient) (Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
PRMSG (2,"DNETOpenCOTSClient(%s,%s,%s)\n", protocol, host, port);
if ((ciptr = (XtransConnInfo) calloc (
1, sizeof(struct _XtransConnInfo))) == NULL)
{
PRMSG (1, "DNETOpenCOTSClient: malloc failed\n", 0, 0, 0);
return NULL;
}
ciptr->index = 0; /* only one form of DECnet */
/* nothing else to do here */
return ciptr;
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(DNETOpenCOTSServer) (Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
PRMSG (2,"DNETOpenCOTSServer(%s,%s,%s)\n", protocol, host, port);
if ((ciptr = (XtransConnInfo) calloc (
1, sizeof(struct _XtransConnInfo))) == NULL)
{
PRMSG (1, "DNETOpenCOTSServer: malloc failed\n", 0, 0, 0);
return NULL;
}
if ((ciptr->fd = socket (AF_DECnet, SOCK_STREAM, 0)) < 0)
{
free ((char *) ciptr);
return NULL;
}
ciptr->index = 0; /* only one form of DECnet */
return (ciptr);
}
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(DNETOpenCLTSClient) (Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
PRMSG (2,"DNETOpenCLTSClient(%s,%s,%s)\n", protocol, host, port);
if ((ciptr = (XtransConnInfo) calloc (
1, sizeof (struct _XtransConnInfo))) == NULL)
{
PRMSG (1, "DNETOpenCLTSClient: malloc failed\n", 0, 0, 0);
return NULL;
}
ciptr->index = 0; /* only one form of DECnet */
/* nothing else to do here */
return ciptr;
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(DNETOpenCLTSServer) (Xtransport *thistrans, char *protocol,
char *host, char *port)
{
/* NEED TO IMPLEMENT */
PRMSG (2,"DNETOpenCLTSServer(%s,%s,%s)\n", protocol, host, port);
return NULL;
}
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
static XtransConnInfo
TRANS(DNETReopenCOTSServer) (Xtransport *thistrans, int fd, char *port)
{
XtransConnInfo ciptr;
PRMSG (2,"DNETReopenCOTSServer(%d,%s)\n", fd, port, 0);
if ((ciptr = (XtransConnInfo) calloc (
1, sizeof(struct _XtransConnInfo))) == NULL)
{
PRMSG (1, "DNETReopenCOTSServer: malloc failed\n", 0, 0, 0);
return NULL;
}
ciptr->fd = fd;
ciptr->index = 0; /* only one form of DECnet */
return (ciptr);
}
static XtransConnInfo
TRANS(DNETReopenCLTSServer) (Xtransport *thistrans, int fd, char *port)
{
XtransConnInfo ciptr;
PRMSG (2,"DNETReopenCLTSServer(%d,%s)\n", fd, port, 0);
if ((ciptr = (XtransConnInfo) calloc (
1, sizeof(struct _XtransConnInfo))) == NULL)
{
PRMSG (1, "DNETReopenCLTSServer: malloc failed\n", 0, 0, 0);
return NULL;
}
ciptr->fd = fd;
ciptr->index = 0; /* only one form of DECnet */
return (ciptr);
}
#endif /* TRANS_REOPEN */
static int
TRANS(DNETSetOption) (XtransConnInfo ciptr, int option, int arg)
{
PRMSG (2,"DNETSetOption(%d,%d,%d)\n", ciptr->fd, option, arg);
return -1;
}
#ifdef TRANS_SERVER
static int
TRANS(DNETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int flags)
{
struct sockaddr_dn dnsock;
int fd = ciptr->fd;
PRMSG (3, "DNETCreateListener(%x,%d)\n", ciptr, fd, 0);
bzero ((char *) &dnsock, sizeof (dnsock));
dnsock.sdn_family = AF_DECnet;
if (port && *port )
sprintf (dnsock.sdn_objname, "%s%s", DNETOBJ, port);
else
#ifdef X11_t
return -1;
#else
sprintf (dnsock.sdn_objname, "%s%d", DNETOBJ, getpid ());
#endif
dnsock.sdn_objnamel = strlen (dnsock.sdn_objname);
if (bind (fd, (struct sockaddr *) &dnsock, sizeof (dnsock)))
{
close (fd);
return -1;
}
if (listen (fd, 5))
{
close (fd);
return (-1);
}
/* Set a flag to indicate that this connection is a listener */
ciptr->flags = 1 | (ciptr->flags & TRANS_KEEPFLAGS);
return 0;
}
static XtransConnInfo
TRANS(DNETAccept) (XtransConnInfo ciptr, int *status)
{
XtransConnInfo newciptr;
struct sockaddr_dn sockname;
int namelen = sizeof(sockname);
PRMSG (2, "DNETAccept(%x,%d)\n", ciptr, ciptr->fd, 0);
if ((newciptr = (XtransConnInfo) calloc(
1, sizeof (struct _XtransConnInfo))) == NULL)
{
PRMSG (1, "DNETAccept: malloc failed\n", 0, 0, 0);
*status = TRANS_ACCEPT_BAD_MALLOC;
return NULL;
}
if((newciptr->fd = accept (ciptr->fd,
(struct sockaddr *) &sockname, &namelen)) < 0)
{
PRMSG (1, "DNETAccept: accept() failed\n", 0, 0, 0);
free (newciptr);
*status = TRANS_ACCEPT_FAILED;
return NULL;
}
/*
* Get this address again because the transport may give a more
* specific address now that a connection is established.
*/
if (TRANS(DNETGetAddr) (newciptr) < 0)
{
PRMSG(1,
"DNETAccept: ...DNETGetAddr() failed:\n", 0, 0, 0);
close (newciptr->fd);
free (newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
if (TRANS(DNETGetPeerAddr) (newciptr) < 0)
{
PRMSG(1,
"DNETAccept: ...DNETGetPeerAddr() failed:\n", 0, 0, 0);
close (newciptr->fd);
if (newciptr->addr) free (newciptr->addr);
free (newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
*status = 0;
return newciptr;
}
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
#define OBJBUFSIZE 64
static int
TRANS(DNETConnect) (XtransConnInfo ciptr, char *host, char *port)
{
char objname[OBJBUFSIZE];
extern int dnet_conn();
PRMSG (2,"DNETConnect(%d,%s,%s)\n", ciptr->fd, host, 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))
{
short tmpport = (short) atoi (port);
sprintf (objname, "X$X%d", tmpport);
}
else
#endif
strncpy(objname, port, OBJBUFSIZE);
/*
* Do the connect
*/
if (!host) host = "0";
if ((ciptr->fd = dnet_conn (host, objname, SOCK_STREAM, 0, 0, 0, 0)) < 0)
{
return TRANS_CONNECT_FAILED;
}
/*
* Sync up the address fields of ciptr.
*/
if (TRANS(DNETGetAddr) (ciptr) < 0)
{
PRMSG (1,
"DNETConnect: ...DNETGetAddr() failed:\n", 0, 0, 0);
return TRANS_CONNECT_FAILED;
}
if (TRANS(DNETGetPeerAddr) (ciptr) < 0)
{
PRMSG (1,
"DNETConnect: ...DNETGetPeerAddr() failed:\n",
0, 0, 0);
return TRANS_CONNECT_FAILED;
}
return 0;
}
#endif /* TRANS_CLIENT */
static int
TRANS(DNETBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
{
PRMSG (2,"DNETBytesReadable(%x,%d,%x)\n", ciptr, ciptr->fd, pend);
#ifdef WIN32
{
int ret = ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend);
errno = WSAGetLastError();
return ret;
}
#else
return ioctl(ciptr->fd, FIONREAD, (char *)pend);
#endif /* WIN32 */
}
static int
TRANS(DNETRead) (XtransConnInfo ciptr, char *buf, int size)
{
PRMSG (2,"DNETRead(%d,%x,%d)\n", ciptr->fd, buf, size);
#ifdef WIN32
{
int ret = recv ((SOCKET)ciptr->fd, buf, size, 0);
errno = WSAGetLastError();
return ret;
}
#else
return read (ciptr->fd, buf, size);
#endif /* WIN32 */
}
static int
TRANS(DNETWrite) (XtransConnInfo ciptr, char *buf, int size)
{
PRMSG (2,"DNETWrite(%d,%x,%d)\n", ciptr->fd, buf, size);
#ifdef WIN32
{
int ret = send ((SOCKET)ciptr->fd, buf, size, 0);
errno = WSAGetLastError();
return ret;
}
#else
return write (ciptr->fd, buf, size);
#endif /* WIN32 */
}
static int
TRANS(DNETReadv) (XtransConnInfo ciptr, struct iovec *buf, int size)
{
PRMSG (2,"DNETReadv(%d,%x,%d)\n", ciptr->fd, buf, size);
return READV (ciptr, buf, size);
}
static int
TRANS(DNETWritev) (XtransConnInfo ciptr, struct iovec *buf, int size)
{
PRMSG (2,"DNETWritev(%d,%x,%d)\n", ciptr->fd, buf, size);
return WRITEV (ciptr, buf, size);
}
static int
TRANS(DNETDisconnect) (XtransConnInfo ciptr)
{
PRMSG (2,"DNETDisconnect(%x,%d)\n", ciptr, ciptr->fd, 0);
#ifdef WIN32
{
int ret = shutdown (ciptr->fd, 2);
errno = WSAGetLastError();
return ret;
}
#else
return shutdown (ciptr->fd, 2); /* disallow further sends and receives */
#endif
}
static int
TRANS(DNETClose) (XtransConnInfo ciptr)
{
PRMSG (2,"DNETClose(%x,%d)\n", ciptr, ciptr->fd, 0);
#ifdef WIN32
{
int ret = close (ciptr->fd);
errno = WSAGetLastError();
return ret;
}
#else
return close (ciptr->fd);
#endif
}
Xtransport TRANS(DNETFuncs) = {
/* DNET Interface */
"dnet",
0,
#ifdef TRANS_CLIENT
TRANS(DNETOpenCOTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(DNETOpenCOTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(DNETOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(DNETOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
TRANS(DNETReopenCOTSServer),
TRANS(DNETReopenCLTSServer),
#endif /* TRANS_REOPEN */
TRANS(DNETSetOption),
#ifdef TRANS_SERVER
TRANS(DNETCreateListener),
NULL, /* ResetListener */
TRANS(DNETAccept),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(DNETConnect),
#endif /* TRANS_CLIENT */
TRANS(DNETBytesReadable),
TRANS(DNETRead),
TRANS(DNETWrite),
TRANS(DNETReadv),
TRANS(DNETWritev),
TRANS(DNETDisconnect),
TRANS(DNETClose),
TRANS(DNETClose),
};
...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from The Open Group. from The Open Group.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -53,10 +51,10 @@ from The Open Group. ...@@ -53,10 +51,10 @@ from The Open Group.
#define _XTRANSINT_H_ #define _XTRANSINT_H_
/* /*
* XTRANSDEBUG will enable the PRMSG() macros used in the X Transport * XTRANSDEBUG will enable the PRMSG() macros used in the X Transport
* Interface code. Each use of the PRMSG macro has a level associated with * 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 =< * 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. * the value of XTRANSDEBUG, then the message will be printed out to stderr.
* Recommended levels are: * Recommended levels are:
* *
* XTRANSDEBUG=1 Error messages * XTRANSDEBUG=1 Error messages
...@@ -70,12 +68,8 @@ from The Open Group. ...@@ -70,12 +68,8 @@ from The Open Group.
* message. * message.
*/ */
#ifndef XTRANSDEBUG #if !defined(XTRANSDEBUG) && defined(XTRANS_TRANSPORT_C)
# ifndef __UNIXOS2__
# define XTRANSDEBUG 1
# else
# define XTRANSDEBUG 1 # define XTRANSDEBUG 1
# endif
#endif #endif
#ifdef WIN32 #ifdef WIN32
...@@ -84,6 +78,10 @@ from The Open Group. ...@@ -84,6 +78,10 @@ from The Open Group.
#include "Xtrans.h" #include "Xtrans.h"
#ifndef _X_UNUSED /* Defined in Xfuncproto.h in xproto >= 7.0.22 */
# define _X_UNUSED /* */
#endif
#ifdef XTRANSDEBUG #ifdef XTRANSDEBUG
# include <stdio.h> # include <stdio.h>
#endif /* XTRANSDEBUG */ #endif /* XTRANSDEBUG */
...@@ -91,87 +89,23 @@ from The Open Group. ...@@ -91,87 +89,23 @@ from The Open Group.
#include <errno.h> #include <errno.h>
#ifndef WIN32 #ifndef WIN32
# ifndef Lynx
# include <sys/socket.h> # include <sys/socket.h>
# else
# include <socket.h>
# endif
# include <netinet/in.h> # include <netinet/in.h>
# include <arpa/inet.h> # include <arpa/inet.h>
# ifdef __UNIXOS2__
# include <sys/ioctl.h>
# endif
/* /*
* Moved the setting of NEED_UTSNAME to this header file from Xtrans.c, * Moved the setting of NEED_UTSNAME to this header file from Xtrans.c,
* to avoid a race condition. JKJ (6/5/97) * to avoid a race condition. JKJ (6/5/97)
*/ */
# if (defined(_POSIX_SOURCE) && !defined(AIXV3) && !defined(__QNX__)) || defined(hpux) || defined(USG) || defined(SVR4) || defined(__SCO__) # if defined(_POSIX_SOURCE) || defined(USG) || defined(SVR4) || defined(__SVR4) || defined(__SCO__)
# ifndef NEED_UTSNAME # ifndef NEED_UTSNAME
# define NEED_UTSNAME # define NEED_UTSNAME
# endif # endif
# include <sys/utsname.h> # include <sys/utsname.h>
# endif # endif
/*
* makedepend screws up on #undef OPEN_MAX, so we define a new symbol
*/
# ifndef TRANS_OPEN_MAX
# ifndef X_NOT_POSIX
# ifdef _POSIX_SOURCE
# include <limits.h>
# else
# define _POSIX_SOURCE
# include <limits.h>
# undef _POSIX_SOURCE
# endif
# endif
# ifndef OPEN_MAX
# if defined(_SC_OPEN_MAX) && !defined(__UNIXOS2__)
# define OPEN_MAX (sysconf(_SC_OPEN_MAX))
# else
# ifdef SVR4
# define OPEN_MAX 256
# else
# include <sys/param.h>
# ifndef OPEN_MAX
# ifdef __OSF1__
# define OPEN_MAX 256
# else
# ifdef NOFILE
# define OPEN_MAX NOFILE
# else
# if !defined(__UNIXOS2__) && !defined(__QNX__)
# define OPEN_MAX NOFILES_MAX
# else
# define OPEN_MAX 256
# endif
# endif
# endif
# endif
# endif
# endif
# endif
# if defined(_SC_OPEN_MAX)
# define TRANS_OPEN_MAX OPEN_MAX
# else /* !__GNU__ */
# if OPEN_MAX > 256
# define TRANS_OPEN_MAX 256
# else
# define TRANS_OPEN_MAX OPEN_MAX
# endif
# endif /*__GNU__*/
# endif /* TRANS_OPEN_MAX */
# ifdef __UNIXOS2__
# define ESET(val)
# else
# define ESET(val) errno = val # define ESET(val) errno = val
# endif
# define EGET() errno # define EGET() errno
#else /* WIN32 */ #else /* WIN32 */
...@@ -189,6 +123,16 @@ from The Open Group. ...@@ -189,6 +123,16 @@ from The Open Group.
#define X_TCP_PORT 6000 #define X_TCP_PORT 6000
#endif #endif
#if XTRANS_SEND_FDS
struct _XtransConnFd {
struct _XtransConnFd *next;
int fd;
int do_close;
};
#endif
struct _XtransConnInfo { struct _XtransConnInfo {
struct _Xtransport *transptr; struct _Xtransport *transptr;
int index; int index;
...@@ -201,75 +145,45 @@ struct _XtransConnInfo { ...@@ -201,75 +145,45 @@ struct _XtransConnInfo {
int addrlen; int addrlen;
char *peeraddr; char *peeraddr;
int peeraddrlen; int peeraddrlen;
struct _XtransConnFd *recv_fds;
struct _XtransConnFd *send_fds;
}; };
#define XTRANS_OPEN_COTS_CLIENT 1 #define XTRANS_OPEN_COTS_CLIENT 1
#define XTRANS_OPEN_COTS_SERVER 2 #define XTRANS_OPEN_COTS_SERVER 2
#define XTRANS_OPEN_CLTS_CLIENT 3
#define XTRANS_OPEN_CLTS_SERVER 4
typedef struct _Xtransport { typedef struct _Xtransport {
char *TransName; const char *TransName;
int flags; int flags;
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
XtransConnInfo (*OpenCOTSClient)( XtransConnInfo (*OpenCOTSClient)(
struct _Xtransport *, /* transport */ struct _Xtransport *, /* transport */
char *, /* protocol */ const char *, /* protocol */
char *, /* host */ const char *, /* host */
char * /* port */ const char * /* port */
); );
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
char ** nolisten; const char ** nolisten;
XtransConnInfo (*OpenCOTSServer)( XtransConnInfo (*OpenCOTSServer)(
struct _Xtransport *, /* transport */ struct _Xtransport *, /* transport */
char *, /* protocol */ const char *, /* protocol */
char *, /* host */ const char *, /* host */
char * /* port */ const char * /* port */
);
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
XtransConnInfo (*OpenCLTSClient)(
struct _Xtransport *, /* transport */
char *, /* protocol */
char *, /* host */
char * /* port */
);
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
XtransConnInfo (*OpenCLTSServer)(
struct _Xtransport *, /* transport */
char *, /* protocol */
char *, /* host */
char * /* port */
); );
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
XtransConnInfo (*ReopenCOTSServer)( XtransConnInfo (*ReopenCOTSServer)(
struct _Xtransport *, /* transport */ struct _Xtransport *, /* transport */
int, /* fd */ int, /* fd */
char * /* port */ const char * /* port */
);
XtransConnInfo (*ReopenCLTSServer)(
struct _Xtransport *, /* transport */
int, /* fd */
char * /* port */
); );
#endif /* TRANS_REOPEN */ #endif /* TRANS_REOPEN */
...@@ -287,7 +201,7 @@ typedef struct _Xtransport { ...@@ -287,7 +201,7 @@ typedef struct _Xtransport {
int (*CreateListener)( int (*CreateListener)(
XtransConnInfo, /* connection */ XtransConnInfo, /* connection */
char *, /* port */ const char *, /* port */
unsigned int /* flags */ unsigned int /* flags */
); );
...@@ -306,8 +220,8 @@ typedef struct _Xtransport { ...@@ -306,8 +220,8 @@ typedef struct _Xtransport {
int (*Connect)( int (*Connect)(
XtransConnInfo, /* connection */ XtransConnInfo, /* connection */
char *, /* host */ const char *, /* host */
char * /* port */ const char * /* port */
); );
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
...@@ -341,6 +255,18 @@ typedef struct _Xtransport { ...@@ -341,6 +255,18 @@ typedef struct _Xtransport {
int /* size */ int /* size */
); );
#if XTRANS_SEND_FDS
int (*SendFd)(
XtransConnInfo, /* connection */
int, /* fd */
int /* do_close */
);
int (*RecvFd)(
XtransConnInfo /* connection */
);
#endif
int (*Disconnect)( int (*Disconnect)(
XtransConnInfo /* connection */ XtransConnInfo /* connection */
); );
...@@ -370,18 +296,29 @@ typedef struct _Xtransport_table { ...@@ -370,18 +296,29 @@ typedef struct _Xtransport_table {
#define TRANS_LOCAL (1<<1) /* local transport */ #define TRANS_LOCAL (1<<1) /* local transport */
#define TRANS_DISABLED (1<<2) /* Don't open this one */ #define TRANS_DISABLED (1<<2) /* Don't open this one */
#define TRANS_NOLISTEN (1<<3) /* Don't listen on this one */ #define TRANS_NOLISTEN (1<<3) /* Don't listen on this one */
#define TRANS_NOUNLINK (1<<4) /* Dont unlink transport endpoints */ #define TRANS_NOUNLINK (1<<4) /* Don't unlink transport endpoints */
#define TRANS_ABSTRACT (1<<5) /* Use abstract sockets if available */ #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 */ /* Flags to preserve when setting others */
#define TRANS_KEEPFLAGS (TRANS_NOUNLINK|TRANS_ABSTRACT) #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 * readv() and writev() don't exist or don't work correctly on some
* systems, so they may be emulated. * systems, so they may be emulated.
*/ */
#if (defined(SYSV) && defined(i386) && !defined(__SCO__)) || defined(WIN32) || defined(__sxg__) || defined(__UNIXOS2__) #ifdef WIN32
#define READV(ciptr, iov, iovcnt) TRANS(ReadV)(ciptr, iov, iovcnt) #define READV(ciptr, iov, iovcnt) TRANS(ReadV)(ciptr, iov, iovcnt)
...@@ -395,10 +332,10 @@ static int TRANS(ReadV)( ...@@ -395,10 +332,10 @@ static int TRANS(ReadV)(
#define READV(ciptr, iov, iovcnt) readv(ciptr->fd, iov, iovcnt) #define READV(ciptr, iov, iovcnt) readv(ciptr->fd, iov, iovcnt)
#endif /* (SYSV && i386) || WIN32 || __sxg__ || */ #endif /* WIN32 */
#if (defined(SYSV) && defined(i386) && !defined(__SCO__)) || defined(WIN32) || defined(__sxg__) || defined(__UNIXOS2__) #ifdef WIN32
#define WRITEV(ciptr, iov, iovcnt) TRANS(WriteV)(ciptr, iov, iovcnt) #define WRITEV(ciptr, iov, iovcnt) TRANS(WriteV)(ciptr, iov, iovcnt)
...@@ -412,72 +349,84 @@ static int TRANS(WriteV)( ...@@ -412,72 +349,84 @@ static int TRANS(WriteV)(
#define WRITEV(ciptr, iov, iovcnt) writev(ciptr->fd, iov, iovcnt) #define WRITEV(ciptr, iov, iovcnt) writev(ciptr->fd, iov, iovcnt)
#endif /* WIN32 || __sxg__ */ #endif /* WIN32 */
static int is_numeric ( static int is_numeric (
char * /* str */ const char * /* str */
); );
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static int trans_mkdir ( static int trans_mkdir (
char *, /* path */ const char *, /* path */
int /* mode */ int /* mode */
); );
#endif #endif
#ifdef __clang__
#pragma clang diagnostic pop
#endif
/* /*
* Some XTRANSDEBUG stuff * Some XTRANSDEBUG stuff
*/ */
#if defined(XTRANSDEBUG) #ifdef XTRANSDEBUG
/* add hack to the format string to avoid warnings about extra arguments #include <stdarg.h>
* to fprintf.
/*
* The X server provides ErrorF() & VErrorF(), for other software that uses
* xtrans, we provide our own simple versions.
*/ */
#ifdef XTRANSDEBUGTIMESTAMP # if defined(XSERV_t) && defined(TRANS_SERVER)
#if defined(XSERV_t) && defined(TRANS_SERVER) # include "os.h"
/* Use ErrorF() for the X server */ # else
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \ static inline void _X_ATTRIBUTE_PRINTF(1, 0)
int hack= 0, saveerrno=errno; \ VErrorF(const char *f, va_list args)
struct timeval tp;\ {
gettimeofday(&tp,0); \ vfprintf(stderr, f, args);
ErrorF("%s",__xtransname); \ fflush(stderr);
ErrorF(x+hack,a,b,c); \ }
ErrorF("timestamp (ms): %d\n",tp.tv_sec*1000+tp.tv_usec/1000); \
errno=saveerrno; \ static inline void _X_ATTRIBUTE_PRINTF(1, 2)
} else ((void)0) ErrorF(const char *f, ...)
#else {
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \ va_list args;
int hack= 0, saveerrno=errno; \
struct timeval tp;\ va_start(args, f);
gettimeofday(&tp,0); \ VErrorF(f, args);
fprintf(stderr, "%s",__xtransname); fflush(stderr); \ va_end(args);
fprintf(stderr, x+hack,a,b,c); fflush(stderr); \ }
fprintf(stderr, "timestamp (ms): %d\n",tp.tv_sec*1000+tp.tv_usec/1000); \ # endif /* xserver */
fflush(stderr); \ #endif /* XTRANSDEBUG */
errno=saveerrno; \
} else ((void)0) static inline void _X_ATTRIBUTE_PRINTF(2, 3)
#endif /* XSERV_t && TRANS_SERVER */ prmsg(int lvl, const char *f, ...)
#else /* XTRANSDEBUGTIMESTAMP */ {
#if defined(XSERV_t) && defined(TRANS_SERVER) #ifdef XTRANSDEBUG
/* Use ErrorF() for the X server */ va_list args;
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
int hack= 0, saveerrno=errno; \ va_start(args, f);
ErrorF("%s",__xtransname); \ if (lvl <= XTRANSDEBUG) {
ErrorF(x+hack,a,b,c); \ int saveerrno = errno;
errno=saveerrno; \
} else ((void)0) ErrorF("%s", __xtransname);
#else VErrorF(f, args);
#define PRMSG(lvl,x,a,b,c) if (lvl <= XTRANSDEBUG){ \
int hack= 0, saveerrno=errno; \ # ifdef XTRANSDEBUGTIMESTAMP
fprintf(stderr, "%s",__xtransname); fflush(stderr); \ {
fprintf(stderr, x+hack,a,b,c); fflush(stderr); \ struct timeval tp;
errno=saveerrno; \ gettimeofday(&tp, 0);
} else ((void)0) ErrorF("timestamp (ms): %d\n",
#endif /* XSERV_t && TRANS_SERVER */ tp.tv_sec * 1000 + tp.tv_usec / 1000);
#endif /* XTRANSDEBUGTIMESTAMP */ }
#else # endif
#define PRMSG(lvl,x,a,b,c) ((void)0) errno = saveerrno;
}
va_end(args);
#endif /* XTRANSDEBUG */ #endif /* XTRANSDEBUG */
}
#endif /* XTRANS_TRANSPORT_C */
#endif /* _XTRANSINT_H_ */ #endif /* _XTRANSINT_H_ */
...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from The Open Group. from The Open Group.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -51,7 +49,7 @@ from The Open Group. ...@@ -51,7 +49,7 @@ from The Open Group.
/* /*
* *
* The connection code/ideas in lib/X and server/os for SVR4/Intel * The connection code/ideas in lib/X and server/os for SVR4/Intel
* environments was contributed by the following companies/groups: * environments was contributed by the following companies/groups:
* *
* MetroLink Inc * MetroLink Inc
...@@ -63,12 +61,12 @@ from The Open Group. ...@@ -63,12 +61,12 @@ from The Open Group.
* *
* The goal is to have common connection code among all SVR4/Intel vendors. * The goal is to have common connection code among all SVR4/Intel vendors.
* *
* ALL THE ABOVE COMPANIES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS * ALL THE ABOVE COMPANIES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
* IN NO EVENT SHALL THESE COMPANIES * BE LIABLE FOR ANY SPECIAL, INDIRECT * IN NO EVENT SHALL THESE COMPANIES * BE LIABLE FOR ANY SPECIAL, INDIRECT
* OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS * OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE * 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 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
* OR PERFORMANCE OF THIS SOFTWARE. * OR PERFORMANCE OF THIS SOFTWARE.
*/ */
...@@ -77,15 +75,14 @@ from The Open Group. ...@@ -77,15 +75,14 @@ from The Open Group.
#include <sys/signal.h> #include <sys/signal.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <sys/stat.h> #include <sys/stat.h>
#if defined(SVR4) #if defined(SVR4) || defined(__SVR4)
#if !defined(DGUX)
#include <sys/filio.h> #include <sys/filio.h>
#else /* DGUX */
#include <sys/stream.h>
#include <sys/ptms.h>
#endif
#endif #endif
#ifdef __sun
# include <stropts.h>
#else
#include <sys/stropts.h> #include <sys/stropts.h>
#endif
#include <sys/wait.h> #include <sys/wait.h>
#include <sys/types.h> #include <sys/types.h>
...@@ -101,10 +98,23 @@ from The Open Group. ...@@ -101,10 +98,23 @@ from The Open Group.
#include <sys/un.h> #include <sys/un.h>
#endif #endif
#if defined(ISC) && !defined(_POSIX_SOURCE)
typedef unsigned short mode_t; /* Types of local connections supported:
/* POSIX needed for mode_t define in sys/types.h */ * - PTS
* - named pipes
* - SCO
*/
#if !defined(__sun)
# define LOCAL_TRANS_PTS
#endif #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. * These functions actually implement the local connection mechanisms.
...@@ -113,7 +123,7 @@ typedef unsigned short mode_t; ...@@ -113,7 +123,7 @@ typedef unsigned short mode_t;
/* Type Not Supported */ /* Type Not Supported */
static int static int
TRANS(OpenFail)(XtransConnInfo ciptr, char *port) TRANS(OpenFail)(XtransConnInfo ciptr _X_UNUSED, const char *port _X_UNUSED)
{ {
return -1; return -1;
...@@ -122,7 +132,8 @@ TRANS(OpenFail)(XtransConnInfo ciptr, char *port) ...@@ -122,7 +132,8 @@ TRANS(OpenFail)(XtransConnInfo ciptr, char *port)
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
static int static int
TRANS(ReopenFail)(XtransConnInfo ciptr, int fd, char *port) TRANS(ReopenFail)(XtransConnInfo ciptr _X_UNUSED, int fd _X_UNUSED,
const char *port _X_UNUSED)
{ {
return 0; return 0;
...@@ -130,10 +141,26 @@ TRANS(ReopenFail)(XtransConnInfo ciptr, int fd, char *port) ...@@ -130,10 +141,26 @@ TRANS(ReopenFail)(XtransConnInfo ciptr, int fd, char *port)
#endif /* TRANS_REOPEN */ #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 static int
TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path) TRANS(FillAddrInfo)(XtransConnInfo ciptr,
const char *sun_path, const char *peer_sun_path)
{ {
struct sockaddr_un *sunaddr; struct sockaddr_un *sunaddr;
...@@ -142,20 +169,21 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path) ...@@ -142,20 +169,21 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path)
ciptr->family = AF_UNIX; ciptr->family = AF_UNIX;
ciptr->addrlen = sizeof (struct sockaddr_un); ciptr->addrlen = sizeof (struct sockaddr_un);
if ((sunaddr = (struct sockaddr_un *) malloc (ciptr->addrlen)) == NULL) if ((sunaddr = malloc (ciptr->addrlen)) == NULL)
{ {
PRMSG(1,"FillAddrInfo: failed to allocate memory for addr\n", 0, 0, 0); prmsg(1,"FillAddrInfo: failed to allocate memory for addr\n");
return 0; return 0;
} }
sunaddr->sun_family = AF_UNIX; sunaddr->sun_family = AF_UNIX;
if (strlen(sun_path) > sizeof(sunaddr->sun_path) - 1) { if (strlen(sun_path) > sizeof(sunaddr->sun_path) - 1) {
PRMSG(1, "FillAddrInfo: path too long\n", 0, 0, 0); prmsg(1, "FillAddrInfo: path too long\n");
free((char *) sunaddr);
return 0; return 0;
} }
strcpy (sunaddr->sun_path, sun_path); strcpy (sunaddr->sun_path, sun_path);
#if defined(BSD44SOCKETS) && !defined(Lynx) #if defined(BSD44SOCKETS)
sunaddr->sun_len = strlen (sunaddr->sun_path); sunaddr->sun_len = strlen (sunaddr->sun_path);
#endif #endif
...@@ -163,13 +191,11 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path) ...@@ -163,13 +191,11 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path)
ciptr->peeraddrlen = sizeof (struct sockaddr_un); ciptr->peeraddrlen = sizeof (struct sockaddr_un);
if ((p_sunaddr = (struct sockaddr_un *) malloc ( if ((p_sunaddr = malloc (ciptr->peeraddrlen)) == NULL)
ciptr->peeraddrlen)) == NULL)
{ {
PRMSG(1, prmsg(1,
"FillAddrInfo: failed to allocate memory for peer addr\n", "FillAddrInfo: failed to allocate memory for peer addr\n");
0,0,0); free (sunaddr);
free ((char *) sunaddr);
ciptr->addr = NULL; ciptr->addr = NULL;
return 0; return 0;
...@@ -178,11 +204,12 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path) ...@@ -178,11 +204,12 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path)
p_sunaddr->sun_family = AF_UNIX; p_sunaddr->sun_family = AF_UNIX;
if (strlen(peer_sun_path) > sizeof(p_sunaddr->sun_path) - 1) { if (strlen(peer_sun_path) > sizeof(p_sunaddr->sun_path) - 1) {
PRMSG(1, "FillAddrInfo: peer path too long\n", 0, 0, 0); prmsg(1, "FillAddrInfo: peer path too long\n");
free((char *) p_sunaddr);
return 0; return 0;
} }
strcpy (p_sunaddr->sun_path, peer_sun_path); strcpy (p_sunaddr->sun_path, peer_sun_path);
#if defined(BSD44SOCKETS) && !defined(Lynx) #if defined(BSD44SOCKETS)
p_sunaddr->sun_len = strlen (p_sunaddr->sun_path); p_sunaddr->sun_len = strlen (p_sunaddr->sun_path);
#endif #endif
...@@ -193,9 +220,10 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path) ...@@ -193,9 +220,10 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr, char *sun_path, char *peer_sun_path)
#ifdef LOCAL_TRANS_PTS
/* PTS */ /* PTS */
#if defined(SYSV) && !defined(__SCO__) && !defined(ISC) #if defined(SYSV) && !defined(__SCO__)
#define SIGNAL_T int #define SIGNAL_T int
#else #else
#define SIGNAL_T void #define SIGNAL_T void
...@@ -209,12 +237,13 @@ extern char *ptsname( ...@@ -209,12 +237,13 @@ extern char *ptsname(
int int
); );
static void _dummy(int sig) static void _dummy(int sig _X_UNUSED)
{ {
} }
#endif /* LOCAL_TRANS_PTS */
#ifndef sun #ifndef __sun
#define X_STREAMS_DIR "/dev/X" #define X_STREAMS_DIR "/dev/X"
#define DEV_SPX "/dev/spx" #define DEV_SPX "/dev/spx"
#else #else
...@@ -225,39 +254,34 @@ static void _dummy(int sig) ...@@ -225,39 +254,34 @@ static void _dummy(int sig)
#endif #endif
#endif #endif
#ifdef _AIX
#define DEV_PTMX "/dev/ptc"
#else
#define DEV_PTMX "/dev/ptmx" #define DEV_PTMX "/dev/ptmx"
#endif
#if defined(X11_t) #if defined(X11_t)
#define PTSNODENAME "/dev/X/server." #define PTSNODENAME "/dev/X/server."
#ifndef sun #ifdef __sun
#define NAMEDNODENAME "/dev/X/Nserver."
#else
#define NAMEDNODENAME "/tmp/.X11-pipe/X" #define NAMEDNODENAME "/tmp/.X11-pipe/X"
#endif #else
#define NAMEDNODENAME "/dev/X/Nserver."
/*
* ISC is only defined for X11 since they are there for
* backwards binary compatability only.
*/
#define X_ISC_DIR "/dev/X/ISCCONN"
#define ISCDEVNODENAME "/dev/X/ISCCONN/X%s"
#define ISCTMPNODENAME "/tmp/.X11-unix/X%s"
#define SCORNODENAME "/dev/X%1sR" #define SCORNODENAME "/dev/X%1sR"
#define SCOSNODENAME "/dev/X%1sS" #define SCOSNODENAME "/dev/X%1sS"
#endif /* !__sun */
#endif #endif
#if defined(XIM_t) #if defined(XIM_t)
#ifdef __sun
#define NAMEDNODENAME "/tmp/.XIM-pipe/XIM"
#else
#define PTSNODENAME "/dev/X/XIM." #define PTSNODENAME "/dev/X/XIM."
#define NAMEDNODENAME "/dev/X/NXIM." #define NAMEDNODENAME "/dev/X/NXIM."
#define SCORNODENAME "/dev/XIM.%sR" #define SCORNODENAME "/dev/XIM.%sR"
#define SCOSNODENAME "/dev/XIM.%sS" #define SCOSNODENAME "/dev/XIM.%sS"
#endif #endif
#endif
#if defined(FS_t) || defined (FONT_t) #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 * USL has already defined something here. We need to check with them
* and see if their choice is usable here. * and see if their choice is usable here.
...@@ -267,13 +291,21 @@ static void _dummy(int sig) ...@@ -267,13 +291,21 @@ static void _dummy(int sig)
#define SCORNODENAME "/dev/fontserver.%sR" #define SCORNODENAME "/dev/fontserver.%sR"
#define SCOSNODENAME "/dev/fontserver.%sS" #define SCOSNODENAME "/dev/fontserver.%sS"
#endif #endif
#endif
#if defined(ICE_t) #if defined(ICE_t)
#ifdef __sun
#define NAMEDNODENAME "/tmp/.ICE-pipe/"
#else
#define PTSNODENAME "/dev/X/ICE." #define PTSNODENAME "/dev/X/ICE."
#define NAMEDNODENAME "/dev/X/NICE." #define NAMEDNODENAME "/dev/X/NICE."
#define SCORNODENAME "/dev/ICE.%sR" #define SCORNODENAME "/dev/ICE.%sR"
#define SCOSNODENAME "/dev/ICE.%sS" #define SCOSNODENAME "/dev/ICE.%sS"
#endif #endif
#endif
#if defined(TEST_t) #if defined(TEST_t)
#ifdef __sun
#define NAMEDNODENAME "/tmp/.Test-unix/test"
#endif
#define PTSNODENAME "/dev/X/transtest." #define PTSNODENAME "/dev/X/transtest."
#define NAMEDNODENAME "/dev/X/Ntranstest." #define NAMEDNODENAME "/dev/X/Ntranstest."
#define SCORNODENAME "/dev/transtest.%sR" #define SCORNODENAME "/dev/transtest.%sR"
...@@ -282,11 +314,11 @@ static void _dummy(int sig) ...@@ -282,11 +314,11 @@ static void _dummy(int sig)
#ifndef sun #ifdef LOCAL_TRANS_PTS
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
static int static int
TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) TRANS(PTSOpenClient)(XtransConnInfo ciptr, const char *port)
{ {
#ifdef PTSNODENAME #ifdef PTSNODENAME
...@@ -298,20 +330,22 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -298,20 +330,22 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
pid_t saved_pid; pid_t saved_pid;
#endif #endif
PRMSG(2,"PTSOpenClient(%s)\n", port, 0,0 ); prmsg(2,"PTSOpenClient(%s)\n", port);
#if !defined(PTSNODENAME) #if !defined(PTSNODENAME)
PRMSG(1,"PTSOpenClient: Protocol is not supported by a pts connection\n", 0,0,0); prmsg(1,"PTSOpenClient: Protocol is not supported by a pts connection\n");
return -1; return -1;
#else #else
if (port && *port ) { if (port && *port ) {
if( *port == '/' ) { /* A full pathname */ if( *port == '/' ) { /* A full pathname */
(void) sprintf(server_path, "%s", port); snprintf(server_path, sizeof(server_path), "%s", port);
} else { } else {
(void) sprintf(server_path, "%s%s", PTSNODENAME, port); snprintf(server_path, sizeof(server_path), "%s%s",
PTSNODENAME, port);
} }
} else { } else {
(void) sprintf(server_path, "%s%d", PTSNODENAME, getpid()); snprintf(server_path, sizeof(server_path), "%s%d",
PTSNODENAME, getpid());
} }
...@@ -320,7 +354,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -320,7 +354,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
*/ */
if ((server = open (server_path, O_RDWR)) < 0) { if ((server = open (server_path, O_RDWR)) < 0) {
PRMSG(1,"PTSOpenClient: failed to open %s\n", server_path, 0,0); prmsg(1,"PTSOpenClient: failed to open %s\n", server_path);
return -1; return -1;
} }
...@@ -330,7 +364,8 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -330,7 +364,8 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
*/ */
if ((fd = open(DEV_PTMX, O_RDWR)) < 0) { if ((fd = open(DEV_PTMX, O_RDWR)) < 0) {
PRMSG(1,"PTSOpenClient: failed to open %s\n", DEV_PTMX, 0,0); prmsg(1,"PTSOpenClient: failed to open %s\n", DEV_PTMX);
close(server);
return(-1); return(-1);
} }
...@@ -340,7 +375,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -340,7 +375,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
slave = ptsname(fd); /* get name */ slave = ptsname(fd); /* get name */
if( slave == NULL ) { if( slave == NULL ) {
PRMSG(1,"PTSOpenClient: failed to get ptsname()\n", 0,0,0); prmsg(1,"PTSOpenClient: failed to get ptsname()\n");
close(fd); close(fd);
close(server); close(server);
return -1; return -1;
...@@ -373,14 +408,14 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -373,14 +408,14 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
if (WIFEXITED(exitval) && WEXITSTATUS(exitval) != 0) { if (WIFEXITED(exitval) && WEXITSTATUS(exitval) != 0) {
close(fd); close(fd);
close(server); close(server);
PRMSG(1, "PTSOpenClient: cannot set the owner of %s\n", prmsg(1, "PTSOpenClient: cannot set the owner of %s\n",
slave, 0, 0); slave);
return(-1); return(-1);
} }
if (chmod(slave, 0666) < 0) { if (chmod(slave, 0666) < 0) {
close(fd); close(fd);
close(server); close(server);
PRMSG(1,"PTSOpenClient: Cannot chmod %s\n", slave, 0,0); prmsg(1,"PTSOpenClient: Cannot chmod %s\n", slave);
return(-1); return(-1);
} }
...@@ -407,8 +442,8 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -407,8 +442,8 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
(void) signal(SIGALRM, savef); (void) signal(SIGALRM, savef);
if (ret != 1) { if (ret != 1) {
PRMSG(1, prmsg(1,
"PTSOpenClient: failed to get acknoledgement from server\n", 0, 0, 0); "PTSOpenClient: failed to get acknoledgement from server\n");
(void) close(fd); (void) close(fd);
fd = -1; fd = -1;
} }
...@@ -419,7 +454,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -419,7 +454,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
if (TRANS(FillAddrInfo) (ciptr, slave, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, slave, server_path) == 0)
{ {
PRMSG(1,"PTSOpenClient: failed to fill in addr info\n", 0, 0, 0); prmsg(1,"PTSOpenClient: failed to fill in addr info\n");
close(fd); close(fd);
return -1; return -1;
} }
...@@ -435,7 +470,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -435,7 +470,7 @@ TRANS(PTSOpenClient)(XtransConnInfo ciptr, char *port)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static int static int
TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) TRANS(PTSOpenServer)(XtransConnInfo ciptr, const char *port)
{ {
#ifdef PTSNODENAME #ifdef PTSNODENAME
...@@ -444,10 +479,10 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -444,10 +479,10 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port)
int mode; int mode;
#endif #endif
PRMSG(2,"PTSOpenServer(%s)\n", port, 0,0 ); prmsg(2,"PTSOpenServer(%s)\n", port);
#if !defined(PTSNODENAME) #if !defined(PTSNODENAME)
PRMSG(1,"PTSOpenServer: Protocol is not supported by a pts connection\n", 0,0,0); prmsg(1,"PTSOpenServer: Protocol is not supported by a pts connection\n");
return -1; return -1;
#else #else
if (port && *port ) { if (port && *port ) {
...@@ -466,8 +501,8 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -466,8 +501,8 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port)
mode = 0777; mode = 0777;
#endif #endif
if (trans_mkdir(X_STREAMS_DIR, mode) == -1) { if (trans_mkdir(X_STREAMS_DIR, mode) == -1) {
PRMSG (1, "PTSOpenServer: mkdir(%s) failed, errno = %d\n", prmsg (1, "PTSOpenServer: mkdir(%s) failed, errno = %d\n",
X_STREAMS_DIR, errno, 0); X_STREAMS_DIR, errno);
return(-1); return(-1);
} }
...@@ -478,8 +513,8 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -478,8 +513,8 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port)
* prevent clients from trying to connect to the in-use PTS (which * prevent clients from trying to connect to the in-use PTS (which
* is often in use by something other than another server). * is often in use by something other than another server).
*/ */
PRMSG(1, "PTSOpenServer: A server is already running on port %s\n", port, 0,0 ); 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, 0,0 ); prmsg(1, "PTSOpenServer: Remove %s if this is incorrect.\n", server_path);
close(fd); close(fd);
return(-1); return(-1);
} }
...@@ -490,7 +525,7 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -490,7 +525,7 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port)
unlink(server_path); unlink(server_path);
if( (fd=open(DEV_PTMX, O_RDWR)) < 0) { if( (fd=open(DEV_PTMX, O_RDWR)) < 0) {
PRMSG(1, "PTSOpenServer: Unable to open %s\n", DEV_PTMX, 0,0 ); prmsg(1, "PTSOpenServer: Unable to open %s\n", DEV_PTMX);
return(-1); return(-1);
} }
...@@ -498,25 +533,25 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -498,25 +533,25 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port)
unlockpt(fd); unlockpt(fd);
if( (slave=ptsname(fd)) == NULL) { if( (slave=ptsname(fd)) == NULL) {
PRMSG(1, "PTSOpenServer: Unable to get slave device name\n", 0,0,0 ); prmsg(1, "PTSOpenServer: Unable to get slave device name\n");
close(fd); close(fd);
return(-1); return(-1);
} }
if( link(slave,server_path) < 0 ) { if( link(slave,server_path) < 0 ) {
PRMSG(1, "PTSOpenServer: Unable to link %s to %s\n", slave, server_path,0 ); prmsg(1, "PTSOpenServer: Unable to link %s to %s\n", slave, server_path);
close(fd); close(fd);
return(-1); return(-1);
} }
if( chmod(server_path, 0666) < 0 ) { if( chmod(server_path, 0666) < 0 ) {
PRMSG(1, "PTSOpenServer: Unable to chmod %s to 0666\n", server_path,0,0 ); prmsg(1, "PTSOpenServer: Unable to chmod %s to 0666\n", server_path);
close(fd); close(fd);
return(-1); return(-1);
} }
if( (server=open(server_path, O_RDWR)) < 0 ) { if( (server=open(server_path, O_RDWR)) < 0 ) {
PRMSG(1, "PTSOpenServer: Unable to open server device %s\n", server_path,0,0 ); prmsg(1, "PTSOpenServer: Unable to open server device %s\n", server_path);
close(fd); close(fd);
return(-1); return(-1);
} }
...@@ -529,7 +564,7 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -529,7 +564,7 @@ TRANS(PTSOpenServer)(XtransConnInfo ciptr, char *port)
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{ {
PRMSG(1,"PTSOpenServer: failed to fill in addr info\n", 0, 0, 0); prmsg(1,"PTSOpenServer: failed to fill in addr info\n");
close(fd); close(fd);
return -1; return -1;
} }
...@@ -549,17 +584,17 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -549,17 +584,17 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
char buf[256]; char buf[256];
struct sockaddr_un *sunaddr; struct sockaddr_un *sunaddr;
PRMSG(2,"PTSAccept(%x->%d)\n",ciptr,ciptr->fd,0); prmsg(2,"PTSAccept(%x->%d)\n",ciptr,ciptr->fd);
if( (in=read(ciptr->fd,&length,1)) <= 0 ){ if( (in=read(ciptr->fd,&length,1)) <= 0 ){
if( !in ) { if( !in ) {
PRMSG(2, prmsg(2,
"PTSAccept: Incoming connection closed\n",0,0,0); "PTSAccept: Incoming connection closed\n");
} }
else { else {
PRMSG(1, prmsg(1,
"PTSAccept: Error reading incoming connection. errno=%d \n", "PTSAccept: Error reading incoming connection. errno=%d \n",
errno,0,0); errno);
} }
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return -1; return -1;
...@@ -567,13 +602,13 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -567,13 +602,13 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
if( (in=read(ciptr->fd,buf,length)) <= 0 ){ if( (in=read(ciptr->fd,buf,length)) <= 0 ){
if( !in ) { if( !in ) {
PRMSG(2, prmsg(2,
"PTSAccept: Incoming connection closed\n",0,0,0); "PTSAccept: Incoming connection closed\n");
} }
else { else {
PRMSG(1, prmsg(1,
"PTSAccept: Error reading device name for new connection. errno=%d \n", "PTSAccept: Error reading device name for new connection. errno=%d \n",
errno,0,0); errno);
} }
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return -1; return -1;
...@@ -582,7 +617,7 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -582,7 +617,7 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
buf[length] = '\0'; buf[length] = '\0';
if( (newfd=open(buf,O_RDWR)) < 0 ) { if( (newfd=open(buf,O_RDWR)) < 0 ) {
PRMSG(1, "PTSAccept: Failed to open %s\n",buf,0,0); prmsg(1, "PTSAccept: Failed to open %s\n",buf);
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return -1; return -1;
} }
...@@ -594,9 +629,8 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -594,9 +629,8 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
*/ */
newciptr->addrlen=ciptr->addrlen; newciptr->addrlen=ciptr->addrlen;
if( (newciptr->addr=(char *)malloc(newciptr->addrlen)) == NULL ) { if( (newciptr->addr = malloc(newciptr->addrlen)) == NULL ) {
PRMSG(1,"PTSAccept: failed to allocate memory for peer addr\n", prmsg(1,"PTSAccept: failed to allocate memory for peer addr\n");
0,0,0);
close(newfd); close(newfd);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return -1; return -1;
...@@ -605,9 +639,8 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -605,9 +639,8 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen); memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen);
newciptr->peeraddrlen=sizeof(struct sockaddr_un); newciptr->peeraddrlen=sizeof(struct sockaddr_un);
if( (sunaddr=(struct sockaddr_un *)malloc(newciptr->peeraddrlen)) == NULL ) { if( (sunaddr = malloc(newciptr->peeraddrlen)) == NULL ) {
PRMSG(1,"PTSAccept: failed to allocate memory for peer addr\n", prmsg(1,"PTSAccept: failed to allocate memory for peer addr\n");
0,0,0);
free(newciptr->addr); free(newciptr->addr);
close(newfd); close(newfd);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
...@@ -616,7 +649,7 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -616,7 +649,7 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
sunaddr->sun_family=AF_UNIX; sunaddr->sun_family=AF_UNIX;
strcpy(sunaddr->sun_path,buf); strcpy(sunaddr->sun_path,buf);
#if defined(BSD44SOCKETS) && !defined(Lynx) #if defined(BSD44SOCKETS)
sunaddr->sun_len=strlen(sunaddr->sun_path); sunaddr->sun_len=strlen(sunaddr->sun_path);
#endif #endif
...@@ -628,60 +661,65 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -628,60 +661,65 @@ TRANS(PTSAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
} }
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#endif /* sun */ #endif /* LOCAL_TRANS_PTS */
#ifdef SVR4 #ifdef LOCAL_TRANS_NAMED
/* NAMED */ /* NAMED */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
static int static int
TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port) TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, const char *port)
{ {
#ifdef NAMEDNODENAME #ifdef NAMEDNODENAME
int fd; int fd;
char server_path[64]; char server_path[64];
struct stat filestat; struct stat filestat;
extern int isastream(); # ifndef __sun
extern int isastream(int);
# endif
#endif #endif
PRMSG(2,"NAMEDOpenClient(%s)\n", port, 0,0 ); prmsg(2,"NAMEDOpenClient(%s)\n", port);
#if !defined(NAMEDNODENAME) #if !defined(NAMEDNODENAME)
PRMSG(1,"NAMEDOpenClient: Protocol is not supported by a NAMED connection\n", 0,0,0); prmsg(1,"NAMEDOpenClient: Protocol is not supported by a NAMED connection\n");
return -1; return -1;
#else #else
if ( port && *port ) { if ( port && *port ) {
if( *port == '/' ) { /* A full pathname */ if( *port == '/' ) { /* A full pathname */
(void) sprintf(server_path, "%s", port); (void) snprintf(server_path, sizeof(server_path), "%s", port);
} else { } else {
(void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); (void) snprintf(server_path, sizeof(server_path), "%s%s", NAMEDNODENAME, port);
} }
} else { } else {
(void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); (void) snprintf(server_path, sizeof(server_path), "%s%ld", NAMEDNODENAME, (long)getpid());
} }
if (stat(server_path, &filestat) < 0 ) { if ((fd = open(server_path, O_RDWR)) < 0) {
PRMSG(1,"NAMEDOpenClient: No device %s for NAMED connection\n", server_path, 0,0 ); prmsg(1,"NAMEDOpenClient: Cannot open %s for NAMED connection\n", server_path);
return -1; return -1;
} }
if ((filestat.st_mode & S_IFMT) != S_IFIFO) { if (fstat(fd, &filestat) < 0 ) {
PRMSG(1,"NAMEDOpenClient: Device %s is not a FIFO\n", server_path, 0,0 ); prmsg(1,"NAMEDOpenClient: Cannot stat %s for NAMED connection\n", server_path);
/* Is this really a failure? */ (void) close(fd);
return -1; return -1;
} }
if ((fd = open(server_path, O_RDWR)) < 0) { if ((filestat.st_mode & S_IFMT) != S_IFIFO) {
PRMSG(1,"NAMEDOpenClient: Cannot open %s for NAMED connection\n", server_path, 0,0 ); prmsg(1,"NAMEDOpenClient: Device %s is not a FIFO\n", server_path);
/* Is this really a failure? */
(void) close(fd);
return -1; return -1;
} }
if (isastream(fd) <= 0) { if (isastream(fd) <= 0) {
PRMSG(1,"NAMEDOpenClient: %s is not a streams device\n", server_path, 0,0 ); prmsg(1,"NAMEDOpenClient: %s is not a streams device\n", server_path);
(void) close(fd); (void) close(fd);
return -1; return -1;
} }
...@@ -692,8 +730,7 @@ TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -692,8 +730,7 @@ TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port)
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{ {
PRMSG(1,"NAMEDOpenClient: failed to fill in addr info\n", prmsg(1,"NAMEDOpenClient: failed to fill in addr info\n");
0,0,0);
close(fd); close(fd);
return -1; return -1;
} }
...@@ -708,32 +745,16 @@ TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -708,32 +745,16 @@ TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, char *port)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static int
TRANS(NAMEDOpenServer)(XtransConnInfo ciptr, char *port)
{
#ifdef NAMEDNODENAME #ifdef NAMEDNODENAME
static int
TRANS(NAMEDOpenPipe)(const char *server_path)
{
int fd, pipefd[2]; int fd, pipefd[2];
char server_path[64];
struct stat sbuf; struct stat sbuf;
int mode; int mode;
#endif
PRMSG(2,"NAMEDOpenServer(%s)\n", port, 0,0 ); prmsg(2,"NAMEDOpenPipe(%s)\n", server_path);
#if !defined(NAMEDNODENAME)
PRMSG(1,"NAMEDOpenServer: Protocol is not supported by a NAMED connection\n", 0,0,0);
return -1;
#else
if ( port && *port ) {
if( *port == '/' ) { /* A full pathname */
(void) sprintf(server_path, "%s", port);
} else {
(void) sprintf(server_path, "%s%s", NAMEDNODENAME, port);
}
} else {
(void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid());
}
#ifdef HAS_STICKY_DIR_BIT #ifdef HAS_STICKY_DIR_BIT
mode = 01777; mode = 01777;
...@@ -741,72 +762,136 @@ TRANS(NAMEDOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -741,72 +762,136 @@ TRANS(NAMEDOpenServer)(XtransConnInfo ciptr, char *port)
mode = 0777; mode = 0777;
#endif #endif
if (trans_mkdir(X_STREAMS_DIR, mode) == -1) { if (trans_mkdir(X_STREAMS_DIR, mode) == -1) {
PRMSG (1, "NAMEDOpenServer: mkdir(%s) failed, errno = %d\n", prmsg (1, "NAMEDOpenPipe: mkdir(%s) failed, errno = %d\n",
X_STREAMS_DIR, errno, 0); X_STREAMS_DIR, errno);
return(-1); return(-1);
} }
if(stat(server_path, &sbuf) != 0) { if(stat(server_path, &sbuf) != 0) {
if (errno == ENOENT) { if (errno == ENOENT) {
if ((fd = creat(server_path, (mode_t)0666)) == -1) { if ((fd = creat(server_path, (mode_t)0666)) == -1) {
PRMSG(1, "NAMEDOpenServer: Can't open %s\n", server_path, 0,0 ); prmsg(1, "NAMEDOpenPipe: Can't open %s\n", server_path);
return(-1); return(-1);
} }
close(fd); close(fd);
if (chmod(server_path, (mode_t)0666) < 0) { if (chmod(server_path, (mode_t)0666) < 0) {
PRMSG(1, "NAMEDOpenServer: Can't open %s\n", server_path, 0,0 ); prmsg(1, "NAMEDOpenPipe: Can't open %s\n", server_path);
return(-1); return(-1);
} }
} else { } else {
PRMSG(1, "NAMEDOpenServer: stat on %s failed\n", server_path, 0,0 ); prmsg(1, "NAMEDOpenPipe: stat on %s failed\n", server_path);
return(-1); return(-1);
} }
} }
if( pipe(pipefd) != 0) { if( pipe(pipefd) != 0) {
PRMSG(1, "NAMEDOpenServer: pipe() failed, errno=%d\n",errno, 0,0 ); prmsg(1, "NAMEDOpenPipe: pipe() failed, errno=%d\n",errno);
return(-1); return(-1);
} }
if( ioctl(pipefd[0], I_PUSH, "connld") != 0) { if( ioctl(pipefd[0], I_PUSH, "connld") != 0) {
PRMSG(1, "NAMEDOpenServer: ioctl(I_PUSH,\"connld\") failed, errno=%d\n",errno, 0,0 ); prmsg(1, "NAMEDOpenPipe: ioctl(I_PUSH,\"connld\") failed, errno=%d\n",errno);
close(pipefd[0]); close(pipefd[0]);
close(pipefd[1]); close(pipefd[1]);
return(-1); return(-1);
} }
if( fattach(pipefd[0], server_path) != 0) { if( fattach(pipefd[0], server_path) != 0) {
PRMSG(1, "NAMEDOpenServer: fattach(%s) failed, errno=%d\n", server_path,errno, 0 ); prmsg(1, "NAMEDOpenPipe: fattach(%s) failed, errno=%d\n", server_path,errno);
close(pipefd[0]); close(pipefd[0]);
close(pipefd[1]); close(pipefd[1]);
return(-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. * Everything looks good: fill in the XtransConnInfo structure.
*/ */
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{ {
PRMSG(1,"NAMEDOpenServer: failed to fill in addr info\n", 0,0,0); prmsg(1,"NAMEDOpenServer: failed to fill in addr info\n");
TRANS(LocalClose)(ciptr);
return -1; return -1;
} }
return(pipefd[1]); return fd;
#endif /* !NAMEDNODENAME */ #endif /* !NAMEDNODENAME */
} }
static int 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) TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
{ {
struct strrecvfd str; struct strrecvfd str;
PRMSG(2,"NAMEDAccept(%x->%d)\n", ciptr, ciptr->fd, 0 ); prmsg(2,"NAMEDAccept(%p->%d)\n", ciptr, ciptr->fd);
if( ioctl(ciptr->fd, I_RECVFD, &str ) < 0 ) { if( ioctl(ciptr->fd, I_RECVFD, &str ) < 0 ) {
PRMSG(1, "NAMEDAccept: ioctl(I_RECVFD) failed, errno=%d\n", errno, 0,0 ); prmsg(1, "NAMEDAccept: ioctl(I_RECVFD) failed, errno=%d\n", errno);
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return(-1); return(-1);
} }
...@@ -814,12 +899,11 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -814,12 +899,11 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
/* /*
* Everything looks good: fill in the XtransConnInfo structure. * Everything looks good: fill in the XtransConnInfo structure.
*/ */
newciptr->family=ciptr->family;
newciptr->addrlen=ciptr->addrlen; newciptr->addrlen=ciptr->addrlen;
if( (newciptr->addr=(char *)malloc(newciptr->addrlen)) == NULL ) { if( (newciptr->addr = malloc(newciptr->addrlen)) == NULL ) {
PRMSG(1, prmsg(1,
"NAMEDAccept: failed to allocate memory for peer addr\n", "NAMEDAccept: failed to allocate memory for pipe addr\n");
0,0,0);
close(str.fd); close(str.fd);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return -1; return -1;
...@@ -828,10 +912,9 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -828,10 +912,9 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen); memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen);
newciptr->peeraddrlen=newciptr->addrlen; newciptr->peeraddrlen=newciptr->addrlen;
if( (newciptr->peeraddr=(char *)malloc(newciptr->peeraddrlen)) == NULL ) { if( (newciptr->peeraddr = malloc(newciptr->peeraddrlen)) == NULL ) {
PRMSG(1, prmsg(1,
"NAMEDAccept: failed to allocate memory for peer addr\n", "NAMEDAccept: failed to allocate memory for peer addr\n");
0,0,0);
free(newciptr->addr); free(newciptr->addr);
close(str.fd); close(str.fd);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
...@@ -847,14 +930,14 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -847,14 +930,14 @@ TRANS(NAMEDAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#endif /* SVR4 */ #endif /* LOCAL_TRANS_NAMED */
#ifndef sun #if defined(LOCAL_TRANS_SCO)
/* /*
* connect_spipe is used by the SCO and ISC connection types. * connect_spipe is used by the SCO connection type.
*/ */
static int static int
connect_spipe(int fd1, int fd2) connect_spipe(int fd1, int fd2)
...@@ -879,7 +962,7 @@ connect_spipe(int fd1, int fd2) ...@@ -879,7 +962,7 @@ connect_spipe(int fd1, int fd2)
} }
/* /*
* named_spipe is used by the SCO and ISC connection types. * named_spipe is used by the SCO connection type.
*/ */
static int static int
...@@ -905,294 +988,12 @@ named_spipe(int fd, char *path) ...@@ -905,294 +988,12 @@ named_spipe(int fd, char *path)
return(ret); return(ret);
} }
/* SCO doesnt use the ISC transport type - it causes problems */ #endif /* defined(LOCAL_TRANS_SCO) */
#if !defined(__SCO__) && !defined(__UNIXWARE__)
/* ISC */
#ifdef TRANS_CLIENT
static int
TRANS(ISCOpenClient)(XtransConnInfo ciptr, char *port)
{
#ifdef ISCDEVNODENAME
int fd,fds,server;
char server_path[64];
char server_dev_path[64];
struct strfdinsert buf;
long temp;
mode_t spmode;
struct stat filestat;
#endif
PRMSG(2,"ISCOpenClient(%s)\n", port, 0,0 );
#if !defined(ISCDEVNODENAME)
PRMSG(1,"ISCOpenClient: Protocol is not supported by a ISC connection\n", 0,0,0);
return -1;
#else
(void) sprintf(server_path, ISCTMPNODENAME, port);
(void) sprintf(server_dev_path, ISCDEVNODENAME, port);
fd = fds = server = -1;
if (stat(DEV_SPX, &filestat) == -1) {
PRMSG(1, "ISCOpenClient: stat(%s) failed, errno=%d\n", DEV_SPX, errno, 0 );
return(-1);
}
spmode = (filestat.st_mode & S_IFMT);
if (stat(server_path, &filestat) != -1) {
if ((filestat.st_mode & S_IFMT) == spmode) {
if ((server = open(server_path, O_RDWR)) < 0) {
PRMSG(1,"ISCOpenClient: failed to open %s\n",
server_path, 0,0 );
}
}
}
if (server < 0) {
/* try the alternate path */
if (stat(server_dev_path, &filestat) != -1) {
if ((filestat.st_mode & S_IFMT) == spmode) {
if ((server = open(server_dev_path, O_RDWR)) < 0) {
PRMSG(1,"ISCOpenClient: failed to open %s\n",
server_dev_path, 0,0 );
}
}
}
}
if (server < 0) {
PRMSG(1,"ISCOpenClient: can't open either device %s or %s\n",
server_path, server_dev_path, 0 );
return -1;
}
if ((fds = open(DEV_SPX, O_RDWR)) < 0 ||
(fd = open(DEV_SPX, O_RDWR)) < 0) {
/* Failed to open all of the devices */
PRMSG(1,"ISCOpenClient: can't open %s\n", DEV_SPX, 0,0 );
(void) close(server);
if (fds != -1)
(void) close(fds);
if (fd != -1)
(void) close(fd);
return -1;
}
/* make a STREAMS-pipe */
buf.databuf.maxlen = -1;
buf.databuf.len = -1;
buf.databuf.buf = NULL;
buf.ctlbuf.maxlen = sizeof(long);
buf.ctlbuf.len = sizeof(long);
buf.ctlbuf.buf = (caddr_t)&temp;
buf.offset = 0;
buf.fildes = fd;
buf.flags = 0;
if (ioctl(fds, I_FDINSERT, &buf) < 0 ||
ioctl(server, I_SENDFD, fds) < 0) {
PRMSG(1,"ISCOpenClient: ioctl(I_FDINSERT or I_SENDFD) failed\n",
0,0,0 );
(void) close(server);
(void) close(fds);
(void) close(fd);
return -1;
}
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{
PRMSG(1,"ISCOpenClient: failed to fill in addr info\n", 0, 0, 0);
close(fd);
return -1;
}
return (fd);
#endif /* !ISCDEVNODENAME */
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static int
TRANS(ISCOpenServer)(XtransConnInfo ciptr, char *port)
{
#ifdef ISCDEVNODENAME
int fd = -1,fds = -1;
char server_path[64],server_unix_path[64];
unsigned int mode = 0;
#endif
PRMSG(2,"ISCOpenServer(%s)\n", port, 0,0 );
#if !defined(ISCDEVNODENAME)
PRMSG(1,"ISCOpenServer: Protocol is not supported by a ISC connection\n", 0,0,0);
return -1;
#else
(void) sprintf(server_path, ISCDEVNODENAME, port);
(void) sprintf(server_unix_path, ISCTMPNODENAME, port);
#ifdef HAS_STICKY_DIR_BIT
mode = 01777;
#else
mode = 0777;
#endif
/* "/dev/X" */
if (trans_mkdir(X_STREAMS_DIR, mode) == -1) {
PRMSG (1, "ISCOpenServer: mkdir(%s) failed, errno = %d\n",
X_STREAMS_DIR, errno, 0);
return(-1);
}
/* "/dev/X/ISCCONN" */
if (trans_mkdir(X_ISC_DIR, mode) == -1) {
PRMSG (1, "ISCOpenServer: mkdir(%s) failed, errno = %d\n",
X_ISC_DIR, errno, 0);
return(-1);
}
unlink(server_path);
if( ((fds=open(DEV_SPX, O_RDWR)) < 0) ||
((fd =open(DEV_SPX, O_RDWR)) < 0)) {
PRMSG(1,"ISCOpenServer: failed to open %s\n", DEV_SPX, 0,0 );
return -1;
}
if( (connect_spipe(fds, fd) < 0) ||
(named_spipe(fds, server_path) < 0)) {
PRMSG(1,"ISCOpenServer: failed connect pipes\n", 0,0,0 );
close(fd);
close(fds);
return -1;
}
#if !defined(UNIXCONN)
/*
* If the UNIX Domain socket transport is not being used, then link this
* device to the path /tmp/.X11-unix/X path.
*/
#define X_UNIX_DIR "/tmp/.X11-unix"
if (trans_mkdir(X_UNIX_DIR, mode) == -1) {
PRMSG (1, "ISCOpenServer: mkdir(%s) failed, errno = %d\n",
X_UNIX_DIR, errno, 0);
return(-1);
}
unlink(server_unix_path);
#ifdef SVR4
/* we prefer symbolic links because hard links can't cross file systems */
if( symlink(server_path, server_unix_path) < 0 )
PRMSG(1,"ISCOpenServer: failed to link %s to %s\n",
server_path, server_unix_path, 0 );
/*
* Don't make this failure fatal since the listener
* is already established, and this just for compatability
*/
#else
#ifdef ISC40
/* catch SIGSYS on symlink for ISC40 compiled binaries running on ISC30 */
signal(SIGSYS,_dummy);
#endif
if( link(server_path, server_unix_path) < 0 )
#ifdef ISC40
if( symlink(server_path, server_unix_path) < 0 )
#endif
PRMSG(1,"ISCOpenServer: failed to link %s to %s\n",
server_path, server_unix_path, 0 );
/*
* Don't make this failure fatal since the listener
* is already established, and this just for compatability
*/
#endif /* SVR4 */
#endif /* !UNIXCONN */
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) #ifdef LOCAL_TRANS_SCO
{
PRMSG(1,"ISCOpenServer: failed to fill in addr info\n", 0, 0, 0);
close(fd);
return -1;
}
return fd;
#endif /* !ISCDEVNODENAME */
}
static int
TRANS(ISCAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
{
struct strrecvfd str;
PRMSG(2,"ISCAccept(%d)\n", ciptr->fd, 0,0 );
while (ioctl(ciptr->fd, I_RECVFD, &str) < 0) {
if (errno != EAGAIN) {
PRMSG(1,"ISCAccept: Can't read fildes", 0,0,0 );
*status = TRANS_ACCEPT_MISC_ERROR;
return(-1);
}
}
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
newciptr->addrlen=ciptr->addrlen;
if( (newciptr->addr=(char *)malloc(newciptr->addrlen)) == NULL ) {
PRMSG(1,
"ISCAccept: failed to allocate memory for peer addr\n",
0,0,0);
close(str.fd);
*status = TRANS_ACCEPT_BAD_MALLOC;
return -1;
}
memcpy(newciptr->addr,ciptr->addr,newciptr->addrlen);
newciptr->peeraddrlen=newciptr->addrlen;
if( (newciptr->peeraddr=(char *)malloc(newciptr->peeraddrlen)) == NULL ) {
PRMSG(1,
"ISCAccept: failed to allocate memory for peer addr\n",
0,0,0);
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 /* !__SCO__ && !__UNIXWARE__ */
/* SCO */ /* SCO */
/* /*
...@@ -1213,7 +1014,7 @@ TRANS(ISCAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -1213,7 +1014,7 @@ TRANS(ISCAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
static int static int
TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port) TRANS(SCOOpenClient)(XtransConnInfo ciptr, const char *port)
{ {
#ifdef SCORNODENAME #ifdef SCORNODENAME
int fd, server, fl, ret; int fd, server, fl, ret;
...@@ -1225,23 +1026,23 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -1225,23 +1026,23 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port)
extern int getmsg(), putmsg(); extern int getmsg(), putmsg();
#endif #endif
PRMSG(2,"SCOOpenClient(%s)\n", port, 0,0 ); prmsg(2,"SCOOpenClient(%s)\n", port);
if (!port || !port[0]) if (!port || !port[0])
port = "0"; port = "0";
#if !defined(SCORNODENAME) #if !defined(SCORNODENAME)
PRMSG(2,"SCOOpenClient: Protocol is not supported by a SCO connection\n", 0,0,0); prmsg(2,"SCOOpenClient: Protocol is not supported by a SCO connection\n");
return -1; return -1;
#else #else
(void) sprintf(server_path, SCORNODENAME, port); (void) sprintf(server_path, SCORNODENAME, port);
if ((server = open(server_path, O_RDWR)) < 0) { if ((server = open(server_path, O_RDWR)) < 0) {
PRMSG(1,"SCOOpenClient: failed to open %s\n", server_path, 0,0 ); prmsg(1,"SCOOpenClient: failed to open %s\n", server_path);
return -1; return -1;
} }
if ((fd = open(DEV_SPX, O_RDWR)) < 0) { if ((fd = open(DEV_SPX, O_RDWR)) < 0) {
PRMSG(1,"SCOOpenClient: failed to open %s\n", DEV_SPX, 0,0 ); prmsg(1,"SCOOpenClient: failed to open %s\n", DEV_SPX);
close(server); close(server);
return -1; return -1;
} }
...@@ -1261,7 +1062,7 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -1261,7 +1062,7 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port)
(void) signal(SIGALRM, savef); (void) signal(SIGALRM, savef);
if (ret < 0) { if (ret < 0) {
PRMSG(1,"SCOOpenClient: error from getmsg\n", 0,0,0 ); prmsg(1,"SCOOpenClient: error from getmsg\n");
close(fd); close(fd);
close(server); close(server);
return -1; return -1;
...@@ -1285,7 +1086,7 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -1285,7 +1086,7 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port)
#endif #endif
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{ {
PRMSG(1,"SCOOpenClient: failed to fill addr info\n", 0, 0, 0); prmsg(1,"SCOOpenClient: failed to fill addr info\n");
close(fd); close(fd);
return -1; return -1;
} }
...@@ -1301,7 +1102,7 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port) ...@@ -1301,7 +1102,7 @@ TRANS(SCOOpenClient)(XtransConnInfo ciptr, char *port)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static int static int
TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port) TRANS(SCOOpenServer)(XtransConnInfo ciptr, const char *port)
{ {
#ifdef SCORNODENAME #ifdef SCORNODENAME
char serverR_path[64]; char serverR_path[64];
...@@ -1311,12 +1112,12 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -1311,12 +1112,12 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port)
int fds = -1; int fds = -1;
#endif #endif
PRMSG(2,"SCOOpenServer(%s)\n", port, 0,0 ); prmsg(2,"SCOOpenServer(%s)\n", port);
if (!port || !port[0]) if (!port || !port[0])
port = "0"; port = "0";
#if !defined(SCORNODENAME) #if !defined(SCORNODENAME)
PRMSG(1,"SCOOpenServer: Protocol is not supported by a SCO connection\n", 0,0,0); prmsg(1,"SCOOpenServer: Protocol is not supported by a SCO connection\n");
return -1; return -1;
#else #else
(void) sprintf(serverR_path, SCORNODENAME, port); (void) sprintf(serverR_path, SCORNODENAME, port);
...@@ -1328,19 +1129,23 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -1328,19 +1129,23 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port)
if ((fds = open(DEV_SPX, O_RDWR)) < 0 || if ((fds = open(DEV_SPX, O_RDWR)) < 0 ||
(fdr = open(DEV_SPX, O_RDWR)) < 0 ) { (fdr = open(DEV_SPX, O_RDWR)) < 0 ) {
PRMSG(1,"SCOOpenServer: failed to open %s\n", DEV_SPX, 0,0 ); prmsg(1,"SCOOpenServer: failed to open %s\n", DEV_SPX);
if (fds >= 0)
close(fds);
if (fdr >= 0)
close(fdr);
return -1; return -1;
} }
if (named_spipe (fds, serverS_path) == -1) { if (named_spipe (fds, serverS_path) == -1) {
PRMSG(1,"SCOOpenServer: failed to create %s\n", serverS_path, 0, 0); prmsg(1,"SCOOpenServer: failed to create %s\n", serverS_path);
close (fdr); close (fdr);
close (fds); close (fds);
return -1; return -1;
} }
if (named_spipe (fdr, serverR_path) == -1) { if (named_spipe (fdr, serverR_path) == -1) {
PRMSG(1,"SCOOpenServer: failed to create %s\n", serverR_path, 0, 0); prmsg(1,"SCOOpenServer: failed to create %s\n", serverR_path);
close (fdr); close (fdr);
close (fds); close (fds);
return -1; return -1;
...@@ -1349,7 +1154,7 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -1349,7 +1154,7 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port)
fds = open (serverS_path, O_RDWR | O_NDELAY); fds = open (serverS_path, O_RDWR | O_NDELAY);
if (fds < 0) { if (fds < 0) {
PRMSG(1,"SCOOpenServer: failed to open %s\n", serverS_path, 0, 0); prmsg(1,"SCOOpenServer: failed to open %s\n", serverS_path);
return -1; return -1;
} }
...@@ -1362,22 +1167,22 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -1362,22 +1167,22 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port)
mylock.l_start = 0; mylock.l_start = 0;
mylock.l_len = 0; mylock.l_len = 0;
if (fcntl (fds, F_SETLK, &mylock) < 0) { if (fcntl (fds, F_SETLK, &mylock) < 0) {
PRMSG(1,"SCOOpenServer: failed to lock %s\n", serverS_path, 0, 0); prmsg(1,"SCOOpenServer: failed to lock %s\n", serverS_path);
close (fds); close (fds);
return -1; return -1;
} }
fdr = open (serverR_path, O_RDWR | O_NDELAY); fdr = open (serverR_path, O_RDWR | O_NDELAY);
if (fds < 0) { if (fdr < 0) {
PRMSG(1,"SCOOpenServer: failed to open %s\n", serverR_path, 0, 0); prmsg(1,"SCOOpenServer: failed to open %s\n", serverR_path);
close (fds); close (fds);
return -1; return -1;
} }
#endif /* X11_t */ #endif /* X11_t */
if (connect_spipe(fds, fdr)) { if (connect_spipe(fds, fdr)) {
PRMSG(1,"SCOOpenServer: ioctl(I_FDINSERT) failed on %s\n", prmsg(1,"SCOOpenServer: ioctl(I_FDINSERT) failed on %s\n",
serverS_path, 0, 0); serverS_path);
close (fdr); close (fdr);
close (fds); close (fds);
return -1; return -1;
...@@ -1391,7 +1196,7 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port) ...@@ -1391,7 +1196,7 @@ TRANS(SCOOpenServer)(XtransConnInfo ciptr, char *port)
ciptr->flags |= TRANS_NOUNLINK; ciptr->flags |= TRANS_NOUNLINK;
#endif #endif
if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0) { if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0) {
PRMSG(1,"SCOOpenServer: failed to fill in addr info\n", 0,0,0); prmsg(1,"SCOOpenServer: failed to fill in addr info\n");
close(fds); close(fds);
close(fdr); close(fdr);
return -1; return -1;
...@@ -1408,22 +1213,22 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -1408,22 +1213,22 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
char c; char c;
int fd; int fd;
PRMSG(2,"SCOAccept(%d)\n", ciptr->fd, 0,0 ); prmsg(2,"SCOAccept(%d)\n", ciptr->fd);
if (read(ciptr->fd, &c, 1) < 0) { if (read(ciptr->fd, &c, 1) < 0) {
PRMSG(1,"SCOAccept: can't read from client\n",0,0,0); prmsg(1,"SCOAccept: can't read from client\n");
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return(-1); return(-1);
} }
if( (fd = open(DEV_SPX, O_RDWR)) < 0 ) { if( (fd = open(DEV_SPX, O_RDWR)) < 0 ) {
PRMSG(1,"SCOAccept: can't open \"%s\"\n",DEV_SPX, 0,0 ); prmsg(1,"SCOAccept: can't open \"%s\"\n",DEV_SPX);
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return(-1); return(-1);
} }
if (connect_spipe (ciptr->fd, fd) < 0) { if (connect_spipe (ciptr->fd, fd) < 0) {
PRMSG(1,"SCOAccept: ioctl(I_FDINSERT) failed\n", 0, 0, 0); prmsg(1,"SCOAccept: ioctl(I_FDINSERT) failed\n");
close (fd); close (fd);
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
return -1; return -1;
...@@ -1434,10 +1239,9 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -1434,10 +1239,9 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
*/ */
newciptr->addrlen=ciptr->addrlen; newciptr->addrlen=ciptr->addrlen;
if( (newciptr->addr=(char *)malloc(newciptr->addrlen)) == NULL ) { if( (newciptr->addr = malloc(newciptr->addrlen)) == NULL ) {
PRMSG(1, prmsg(1,
"SCOAccept: failed to allocate memory for peer addr\n", "SCOAccept: failed to allocate memory for peer addr\n");
0,0,0);
close(fd); close(fd);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return -1; return -1;
...@@ -1449,10 +1253,9 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -1449,10 +1253,9 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
#endif #endif
newciptr->peeraddrlen=newciptr->addrlen; newciptr->peeraddrlen=newciptr->addrlen;
if( (newciptr->peeraddr=(char *)malloc(newciptr->peeraddrlen)) == NULL ) { if( (newciptr->peeraddr = malloc(newciptr->peeraddrlen)) == NULL ) {
PRMSG(1, prmsg(1,
"SCOAccept: failed to allocate memory for peer addr\n", "SCOAccept: failed to allocate memory for peer addr\n");
0,0,0);
free(newciptr->addr); free(newciptr->addr);
close(fd); close(fd);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
...@@ -1467,41 +1270,42 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status) ...@@ -1467,41 +1270,42 @@ TRANS(SCOAccept)(XtransConnInfo ciptr, XtransConnInfo newciptr, int *status)
} }
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#endif /* sun */ #endif /* LOCAL_TRANS_SCO */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
#ifndef sun #ifdef LOCAL_TRANS_PTS
static int static int
TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, char *port) TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, const char *port)
{ {
#ifdef PTSNODENAME #ifdef PTSNODENAME
char server_path[64]; char server_path[64];
#endif #endif
PRMSG(2,"PTSReopenServer(%d,%s)\n", fd, port, 0 ); prmsg(2,"PTSReopenServer(%d,%s)\n", fd, port);
#if !defined(PTSNODENAME) #if !defined(PTSNODENAME)
PRMSG(1,"PTSReopenServer: Protocol is not supported by a pts connection\n", 0,0,0); prmsg(1,"PTSReopenServer: Protocol is not supported by a pts connection\n");
return 0; return 0;
#else #else
if (port && *port ) { if (port && *port ) {
if( *port == '/' ) { /* A full pathname */ if( *port == '/' ) { /* A full pathname */
(void) sprintf(server_path, "%s", port); snprintf(server_path, sizeof(server_path), "%s", port);
} else { } else {
(void) sprintf(server_path, "%s%s", PTSNODENAME, port); snprintf(server_path, sizeof(server_path), "%s%s",
PTSNODENAME, port);
} }
} else { } else {
(void) sprintf(server_path, "%s%ld", PTSNODENAME, (long)getpid()); snprintf(server_path, sizeof(server_path), "%s%ld",
PTSNODENAME, (long)getpid());
} }
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{ {
PRMSG(1,"PTSReopenServer: failed to fill in addr info\n", prmsg(1,"PTSReopenServer: failed to fill in addr info\n");
0,0,0);
return 0; return 0;
} }
...@@ -1510,36 +1314,39 @@ TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, char *port) ...@@ -1510,36 +1314,39 @@ TRANS(PTSReopenServer)(XtransConnInfo ciptr, int fd, char *port)
#endif /* !PTSNODENAME */ #endif /* !PTSNODENAME */
} }
#endif /* !sun */ #endif /* LOCAL_TRANS_PTS */
#ifdef LOCAL_TRANS_NAMED
static int static int
TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd, char *port) TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd _X_UNUSED, const char *port)
{ {
#ifdef NAMEDNODENAME #ifdef NAMEDNODENAME
char server_path[64]; char server_path[64];
#endif #endif
PRMSG(2,"NAMEDReopenServer(%s)\n", port, 0,0 ); prmsg(2,"NAMEDReopenServer(%s)\n", port);
#if !defined(NAMEDNODENAME) #if !defined(NAMEDNODENAME)
PRMSG(1,"NAMEDReopenServer: Protocol is not supported by a NAMED connection\n", 0,0,0); prmsg(1,"NAMEDReopenServer: Protocol is not supported by a NAMED connection\n");
return 0; return 0;
#else #else
if ( port && *port ) { if ( port && *port ) {
if( *port == '/' ) { /* A full pathname */ if( *port == '/' ) { /* A full pathname */
(void) sprintf(server_path, "%s", port); snprintf(server_path, sizeof(server_path),"%s", port);
} else { } else {
(void) sprintf(server_path, "%s%s", NAMEDNODENAME, port); snprintf(server_path, sizeof(server_path), "%s%s",
NAMEDNODENAME, port);
} }
} else { } else {
(void) sprintf(server_path, "%s%ld", NAMEDNODENAME, (long)getpid()); snprintf(server_path, sizeof(server_path), "%s%ld",
NAMEDNODENAME, (long)getpid());
} }
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0) if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{ {
PRMSG(1,"NAMEDReopenServer: failed to fill in addr info\n", prmsg(1,"NAMEDReopenServer: failed to fill in addr info\n");
0,0,0);
return 0; return 0;
} }
...@@ -1548,51 +1355,24 @@ TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd, char *port) ...@@ -1548,51 +1355,24 @@ TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd, char *port)
#endif /* !NAMEDNODENAME */ #endif /* !NAMEDNODENAME */
} }
#ifndef sun #endif /* LOCAL_TRANS_NAMED */
#if !defined(__SCO__) && !defined(__UNIXWARE__)
static int
TRANS(ISCReopenServer)(XtransConnInfo ciptr, int fd, char *port)
{
#ifdef ISCDEVNODENAME
char server_path[64], server_unix_path[64];
#endif
PRMSG(2,"ISCReopenServer(%s)\n", port, 0,0 );
#if !defined(ISCDEVNODENAME)
PRMSG(1,"ISCReopenServer: Protocol is not supported by a ISC connection\n", 0,0,0);
return 0;
#else
(void) sprintf(server_path, ISCDEVNODENAME, port);
(void) sprintf(server_unix_path, ISCTMPNODENAME, port);
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
{
PRMSG(1, "ISCReopenServer: failed to fill in addr info\n", 0,0,0);
return 0;
}
return 1;
#endif /* !ISCDEVNODENAME */
}
#endif /* !__SCO__ && !__UNIXWARE__ */
#ifdef LOCAL_TRANS_SCO
static int static int
TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port) TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, const char *port)
{ {
#ifdef SCORNODENAME #ifdef SCORNODENAME
char serverR_path[64], serverS_path[64]; char serverR_path[64], serverS_path[64];
#endif #endif
PRMSG(2,"SCOReopenServer(%s)\n", port, 0,0 ); prmsg(2,"SCOReopenServer(%s)\n", port);
if (!port || !port[0]) if (!port || !port[0])
port = "0"; port = "0";
#if !defined(SCORNODENAME) #if !defined(SCORNODENAME)
PRMSG(2,"SCOReopenServer: Protocol is not supported by a SCO connection\n", 0,0,0); prmsg(2,"SCOReopenServer: Protocol is not supported by a SCO connection\n");
return 0; return 0;
#else #else
(void) sprintf(serverR_path, SCORNODENAME, port); (void) sprintf(serverR_path, SCORNODENAME, port);
...@@ -1603,7 +1383,7 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port) ...@@ -1603,7 +1383,7 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port)
#endif #endif
if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0) if (TRANS(FillAddrInfo) (ciptr, serverS_path, serverR_path) == 0)
{ {
PRMSG(1, "SCOReopenServer: failed to fill in addr info\n", 0,0,0); prmsg(1, "SCOReopenServer: failed to fill in addr info\n");
return 0; return 0;
} }
...@@ -1612,7 +1392,7 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port) ...@@ -1612,7 +1392,7 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port)
#endif /* SCORNODENAME */ #endif /* SCORNODENAME */
} }
#endif /* !sun */ #endif /* LOCAL_TRANS_SCO */
#endif /* TRANS_REOPEN */ #endif /* TRANS_REOPEN */
...@@ -1624,12 +1404,12 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port) ...@@ -1624,12 +1404,12 @@ TRANS(SCOReopenServer)(XtransConnInfo ciptr, int fd, char *port)
*/ */
typedef struct _LOCALtrans2dev { typedef struct _LOCALtrans2dev {
char *transname; const char *transname;
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
int (*devcotsopenclient)( int (*devcotsopenclient)(
XtransConnInfo, char * /*port*/ XtransConnInfo, const char * /*port*/
); );
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
...@@ -1637,7 +1417,7 @@ typedef struct _LOCALtrans2dev { ...@@ -1637,7 +1417,7 @@ typedef struct _LOCALtrans2dev {
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
int (*devcotsopenserver)( int (*devcotsopenserver)(
XtransConnInfo, char * /*port*/ XtransConnInfo, const char * /*port*/
); );
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
...@@ -1645,7 +1425,7 @@ typedef struct _LOCALtrans2dev { ...@@ -1645,7 +1425,7 @@ typedef struct _LOCALtrans2dev {
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
int (*devcltsopenclient)( int (*devcltsopenclient)(
XtransConnInfo, char * /*port*/ XtransConnInfo, const char * /*port*/
); );
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
...@@ -1653,7 +1433,7 @@ typedef struct _LOCALtrans2dev { ...@@ -1653,7 +1433,7 @@ typedef struct _LOCALtrans2dev {
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
int (*devcltsopenserver)( int (*devcltsopenserver)(
XtransConnInfo, char * /*port*/ XtransConnInfo, const char * /*port*/
); );
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
...@@ -1663,19 +1443,23 @@ typedef struct _LOCALtrans2dev { ...@@ -1663,19 +1443,23 @@ typedef struct _LOCALtrans2dev {
int (*devcotsreopenserver)( int (*devcotsreopenserver)(
XtransConnInfo, XtransConnInfo,
int, /* fd */ int, /* fd */
char * /* port */ const char * /* port */
); );
int (*devcltsreopenserver)( int (*devcltsreopenserver)(
XtransConnInfo, XtransConnInfo,
int, /* fd */ int, /* fd */
char * /* port */ const char * /* port */
); );
#endif /* TRANS_REOPEN */ #endif /* TRANS_REOPEN */
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
int (*devreset)(
XtransConnInfo /* ciptr */
);
int (*devaccept)( int (*devaccept)(
XtransConnInfo, XtransConnInfo, int * XtransConnInfo, XtransConnInfo, int *
); );
...@@ -1685,7 +1469,7 @@ typedef struct _LOCALtrans2dev { ...@@ -1685,7 +1469,7 @@ typedef struct _LOCALtrans2dev {
} LOCALtrans2dev; } LOCALtrans2dev;
static LOCALtrans2dev LOCALtrans2devtab[] = { static LOCALtrans2dev LOCALtrans2devtab[] = {
#ifndef sun #ifdef LOCAL_TRANS_PTS
{"", {"",
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(PTSOpenClient), TRANS(PTSOpenClient),
...@@ -1704,6 +1488,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1704,6 +1488,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
NULL, /* ResetListener */
TRANS(PTSAccept) TRANS(PTSAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
...@@ -1726,6 +1511,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1726,6 +1511,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
NULL, /* ResetListener */
TRANS(PTSAccept) TRANS(PTSAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
...@@ -1748,10 +1534,11 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1748,10 +1534,11 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
NULL, /* ResetListener */
TRANS(PTSAccept) TRANS(PTSAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
#else /* sun */ #else /* !LOCAL_TRANS_PTS */
{"", {"",
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(NAMEDOpenClient), TRANS(NAMEDOpenClient),
...@@ -1770,6 +1557,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1770,6 +1557,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(NAMEDResetListener),
TRANS(NAMEDAccept) TRANS(NAMEDAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
...@@ -1792,12 +1580,13 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1792,12 +1580,13 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(NAMEDResetListener),
TRANS(NAMEDAccept) TRANS(NAMEDAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
#endif /* sun */ #endif /* !LOCAL_TRANS_PTS */
#ifdef SVR4 #ifdef LOCAL_TRANS_NAMED
{"named", {"named",
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(NAMEDOpenClient), TRANS(NAMEDOpenClient),
...@@ -1816,19 +1605,18 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1816,19 +1605,18 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(NAMEDResetListener),
TRANS(NAMEDAccept) TRANS(NAMEDAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
#endif /* SVR4 */
#ifndef sun #ifdef __sun /* Alias "pipe" to named, since that's what Solaris called it */
#if !defined(__SCO__) && !defined(__UNIXWARE__) {"pipe",
{"isc",
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(ISCOpenClient), TRANS(NAMEDOpenClient),
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(ISCOpenServer), TRANS(NAMEDOpenServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(OpenFail), TRANS(OpenFail),
...@@ -1837,15 +1625,19 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1837,15 +1625,19 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(OpenFail), TRANS(OpenFail),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(ISCReopenServer), TRANS(NAMEDReopenServer),
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(ISCAccept) TRANS(NAMEDResetListener),
TRANS(NAMEDAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
#endif /* !__SCO__ && !__UNIXWARE__ */ #endif /* __sun */
#endif /* LOCAL_TRANS_NAMED */
#ifdef LOCAL_TRANS_SCO
{"sco", {"sco",
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(SCOOpenClient), TRANS(SCOOpenClient),
...@@ -1864,15 +1656,16 @@ static LOCALtrans2dev LOCALtrans2devtab[] = { ...@@ -1864,15 +1656,16 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
TRANS(ReopenFail), TRANS(ReopenFail),
#endif #endif
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
NULL, /* ResetListener */
TRANS(SCOAccept) TRANS(SCOAccept)
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
}, },
#endif /* sun */ #endif /* LOCAL_TRANS_SCO */
}; };
#define NUMTRANSPORTS (sizeof(LOCALtrans2devtab)/sizeof(LOCALtrans2dev)) #define NUMTRANSPORTS (sizeof(LOCALtrans2devtab)/sizeof(LOCALtrans2dev))
static char *XLOCAL=NULL; static const char *XLOCAL=NULL;
static char *workingXLOCAL=NULL; static char *workingXLOCAL=NULL;
static char *freeXLOCAL=NULL; static char *freeXLOCAL=NULL;
...@@ -1880,29 +1673,27 @@ static char *freeXLOCAL=NULL; ...@@ -1880,29 +1673,27 @@ static char *freeXLOCAL=NULL;
#define DEF_XLOCAL "SCO:UNIX:PTS" #define DEF_XLOCAL "SCO:UNIX:PTS"
#elif defined(__UNIXWARE__) #elif defined(__UNIXWARE__)
#define DEF_XLOCAL "UNIX:PTS:NAMED:SCO" #define DEF_XLOCAL "UNIX:PTS:NAMED:SCO"
#elif defined(__sun)
#define DEF_XLOCAL "UNIX:NAMED"
#else #else
#define DEF_XLOCAL "UNIX:PTS:NAMED:ISC:SCO" #define DEF_XLOCAL "UNIX:PTS:NAMED:SCO"
#endif #endif
static void static void
TRANS(LocalInitTransports)(char *protocol) TRANS(LocalInitTransports)(const char *protocol)
{ {
PRMSG(3,"LocalInitTransports(%s)\n", protocol, 0,0 ); prmsg(3,"LocalInitTransports(%s)\n", protocol);
if( strcmp(protocol,"local") && strcmp(protocol,"LOCAL") ) if( strcmp(protocol,"local") && strcmp(protocol,"LOCAL") )
{ {
workingXLOCAL=freeXLOCAL=(char *)malloc (strlen (protocol) + 1); workingXLOCAL = freeXLOCAL = strdup (protocol);
if (workingXLOCAL)
strcpy (workingXLOCAL, protocol);
} }
else { else {
XLOCAL=(char *)getenv("XLOCAL"); XLOCAL=(char *)getenv("XLOCAL");
if(XLOCAL==NULL) if(XLOCAL==NULL)
XLOCAL=DEF_XLOCAL; XLOCAL=DEF_XLOCAL;
workingXLOCAL=freeXLOCAL=(char *)malloc (strlen (XLOCAL) + 1); workingXLOCAL = freeXLOCAL = strdup (XLOCAL);
if (workingXLOCAL)
strcpy (workingXLOCAL, XLOCAL);
} }
} }
...@@ -1910,7 +1701,7 @@ static void ...@@ -1910,7 +1701,7 @@ static void
TRANS(LocalEndTransports)(void) TRANS(LocalEndTransports)(void)
{ {
PRMSG(3,"LocalEndTransports()\n", 0,0,0 ); prmsg(3,"LocalEndTransports()\n");
free(freeXLOCAL); free(freeXLOCAL);
} }
...@@ -1925,7 +1716,7 @@ TRANS(LocalGetNextTransport)(void) ...@@ -1925,7 +1716,7 @@ TRANS(LocalGetNextTransport)(void)
int i,j; int i,j;
char *typetocheck; char *typetocheck;
char typebuf[TYPEBUFSIZE]; char typebuf[TYPEBUFSIZE];
PRMSG(3,"LocalGetNextTransport()\n", 0,0,0 ); prmsg(3,"LocalGetNextTransport()\n");
while(1) while(1)
{ {
...@@ -1940,7 +1731,7 @@ TRANS(LocalGetNextTransport)(void) ...@@ -1940,7 +1731,7 @@ TRANS(LocalGetNextTransport)(void)
for(i=0;i<NUMTRANSPORTS;i++) for(i=0;i<NUMTRANSPORTS;i++)
{ {
/* /*
* This is equivilent to a case insensitive strcmp(), * This is equivalent to a case insensitive strcmp(),
* but should be more portable. * but should be more portable.
*/ */
strncpy(typebuf,typetocheck,TYPEBUFSIZE); strncpy(typebuf,typetocheck,TYPEBUFSIZE);
...@@ -1968,7 +1759,7 @@ TRANS(LocalGetNextTransport)(void) ...@@ -1968,7 +1759,7 @@ TRANS(LocalGetNextTransport)(void)
*/ */
static int static int
HostReallyLocal (char *host) HostReallyLocal (const char *host)
{ {
/* /*
...@@ -1998,14 +1789,15 @@ HostReallyLocal (char *host) ...@@ -1998,14 +1789,15 @@ HostReallyLocal (char *host)
static XtransConnInfo static XtransConnInfo
TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port) TRANS(LocalOpenClient)(int type, const char *protocol,
const char *host, const char *port)
{ {
LOCALtrans2dev *transptr; LOCALtrans2dev *transptr;
XtransConnInfo ciptr; XtransConnInfo ciptr;
int index; int index;
PRMSG(3,"LocalOpenClient()\n", 0,0,0 ); prmsg(3,"LocalOpenClient()\n");
/* /*
* Make sure 'host' is really local. If not, we return failure. * Make sure 'host' is really local. If not, we return failure.
...@@ -2017,9 +1809,9 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port) ...@@ -2017,9 +1809,9 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port)
if (strcmp (host, "unix") != 0 && !HostReallyLocal (host)) if (strcmp (host, "unix") != 0 && !HostReallyLocal (host))
{ {
PRMSG (1, prmsg (1,
"LocalOpenClient: Cannot connect to non-local host %s\n", "LocalOpenClient: Cannot connect to non-local host %s\n",
host, 0, 0); host);
return NULL; return NULL;
} }
...@@ -2036,10 +1828,10 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port) ...@@ -2036,10 +1828,10 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port)
*/ */
#endif /* X11_t */ #endif /* X11_t */
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL ) if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{ {
PRMSG(1,"LocalOpenClient: calloc(1,%d) failed\n", prmsg(1,"LocalOpenClient: calloc(1,%lu) failed\n",
sizeof(struct _XtransConnInfo),0,0 ); sizeof(struct _XtransConnInfo));
return NULL; return NULL;
} }
...@@ -2056,19 +1848,14 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port) ...@@ -2056,19 +1848,14 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port)
case XTRANS_OPEN_COTS_CLIENT: case XTRANS_OPEN_COTS_CLIENT:
ciptr->fd=transptr->devcotsopenclient(ciptr,port); ciptr->fd=transptr->devcotsopenclient(ciptr,port);
break; break;
case XTRANS_OPEN_CLTS_CLIENT:
ciptr->fd=transptr->devcltsopenclient(ciptr,port);
break;
case XTRANS_OPEN_COTS_SERVER: case XTRANS_OPEN_COTS_SERVER:
case XTRANS_OPEN_CLTS_SERVER: prmsg(1,
PRMSG(1, "LocalOpenClient: Should not be opening a server with this function\n");
"LocalOpenClient: Should not be opening a server with this function\n",
0,0,0);
break; break;
default: default:
PRMSG(1, prmsg(1,
"LocalOpenClient: Unknown Open type %d\n", "LocalOpenClient: Unknown Open type %d\n",
type, 0,0 ); type);
} }
if( ciptr->fd >= 0 ) if( ciptr->fd >= 0 )
break; break;
...@@ -2094,13 +1881,14 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port) ...@@ -2094,13 +1881,14 @@ TRANS(LocalOpenClient)(int type, char *protocol, char *host, char *port)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static XtransConnInfo static XtransConnInfo
TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port) TRANS(LocalOpenServer)(int type, const char *protocol,
const char *host _X_UNUSED, const char *port)
{ {
int i; int i;
XtransConnInfo ciptr; XtransConnInfo ciptr;
PRMSG(2,"LocalOpenServer(%d,%s,%s)\n", type, protocol, port); prmsg(2,"LocalOpenServer(%d,%s,%s)\n", type, protocol, port);
#if defined(X11_t) #if defined(X11_t)
/* /*
...@@ -2111,10 +1899,10 @@ TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port) ...@@ -2111,10 +1899,10 @@ TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port)
*/ */
#endif /* X11_t */ #endif /* X11_t */
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL ) if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{ {
PRMSG(1,"LocalOpenServer: calloc(1,%d) failed\n", prmsg(1,"LocalOpenServer: calloc(1,%lu) failed\n",
sizeof(struct _XtransConnInfo),0,0 ); sizeof(struct _XtransConnInfo));
return NULL; return NULL;
} }
...@@ -2125,20 +1913,15 @@ TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port) ...@@ -2125,20 +1913,15 @@ TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port)
switch( type ) switch( type )
{ {
case XTRANS_OPEN_COTS_CLIENT: case XTRANS_OPEN_COTS_CLIENT:
case XTRANS_OPEN_CLTS_CLIENT: prmsg(1,
PRMSG(1, "LocalOpenServer: Should not be opening a client with this function\n");
"LocalOpenServer: Should not be opening a client with this function\n",
0,0,0);
break; break;
case XTRANS_OPEN_COTS_SERVER: case XTRANS_OPEN_COTS_SERVER:
ciptr->fd=LOCALtrans2devtab[i].devcotsopenserver(ciptr,port); ciptr->fd=LOCALtrans2devtab[i].devcotsopenserver(ciptr,port);
break; break;
case XTRANS_OPEN_CLTS_SERVER:
ciptr->fd=LOCALtrans2devtab[i].devcltsopenserver(ciptr,port);
break;
default: default:
PRMSG(1,"LocalOpenServer: Unknown Open type %d\n", prmsg(1,"LocalOpenServer: Unknown Open type %d\n",
type ,0,0); type );
} }
if( ciptr->fd >= 0 ) { if( ciptr->fd >= 0 ) {
ciptr->priv=(char *)&LOCALtrans2devtab[i]; ciptr->priv=(char *)&LOCALtrans2devtab[i];
...@@ -2158,18 +1941,18 @@ TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port) ...@@ -2158,18 +1941,18 @@ TRANS(LocalOpenServer)(int type, char *protocol, char *host, char *port)
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
static XtransConnInfo static XtransConnInfo
TRANS(LocalReopenServer)(int type, int index, int fd, char *port) TRANS(LocalReopenServer)(int type, int index, int fd, const char *port)
{ {
XtransConnInfo ciptr; XtransConnInfo ciptr;
int stat = 0; int stat = 0;
PRMSG(2,"LocalReopenServer(%d,%d,%d)\n", type, index, fd); prmsg(2,"LocalReopenServer(%d,%d,%d)\n", type, index, fd);
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL ) if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{ {
PRMSG(1,"LocalReopenServer: calloc(1,%d) failed\n", prmsg(1,"LocalReopenServer: calloc(1,%lu) failed\n",
sizeof(struct _XtransConnInfo),0,0 ); sizeof(struct _XtransConnInfo));
return NULL; return NULL;
} }
...@@ -2180,12 +1963,9 @@ TRANS(LocalReopenServer)(int type, int index, int fd, char *port) ...@@ -2180,12 +1963,9 @@ TRANS(LocalReopenServer)(int type, int index, int fd, char *port)
case XTRANS_OPEN_COTS_SERVER: case XTRANS_OPEN_COTS_SERVER:
stat = LOCALtrans2devtab[index].devcotsreopenserver(ciptr,fd,port); stat = LOCALtrans2devtab[index].devcotsreopenserver(ciptr,fd,port);
break; break;
case XTRANS_OPEN_CLTS_SERVER: default:
stat = LOCALtrans2devtab[index].devcltsreopenserver(ciptr,fd,port); prmsg(1,"LocalReopenServer: Unknown Open type %d\n",
break; type );
default:
PRMSG(1,"LocalReopenServer: Unknown Open type %d\n",
type ,0,0);
} }
if( stat > 0 ) { if( stat > 0 ) {
...@@ -2210,11 +1990,11 @@ TRANS(LocalReopenServer)(int type, int index, int fd, char *port) ...@@ -2210,11 +1990,11 @@ TRANS(LocalReopenServer)(int type, int index, int fd, char *port)
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
static XtransConnInfo static XtransConnInfo
TRANS(LocalOpenCOTSClient)(Xtransport *thistrans, char *protocol, TRANS(LocalOpenCOTSClient)(Xtransport *thistrans _X_UNUSED, const char *protocol,
char *host, char *port) const char *host, const char *port)
{ {
PRMSG(2,"LocalOpenCOTSClient(%s,%s,%s)\n",protocol,host,port); prmsg(2,"LocalOpenCOTSClient(%s,%s,%s)\n",protocol,host,port);
return TRANS(LocalOpenClient)(XTRANS_OPEN_COTS_CLIENT, protocol, host, port); return TRANS(LocalOpenClient)(XTRANS_OPEN_COTS_CLIENT, protocol, host, port);
} }
...@@ -2225,15 +2005,15 @@ TRANS(LocalOpenCOTSClient)(Xtransport *thistrans, char *protocol, ...@@ -2225,15 +2005,15 @@ TRANS(LocalOpenCOTSClient)(Xtransport *thistrans, char *protocol,
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static XtransConnInfo static XtransConnInfo
TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, char *protocol, TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, const char *protocol,
char *host, char *port) const char *host, const char *port)
{ {
char *typetocheck = NULL; char *typetocheck = NULL;
int found = 0; int found = 0;
char typebuf[TYPEBUFSIZE]; char typebuf[TYPEBUFSIZE];
PRMSG(2,"LocalOpenCOTSServer(%s,%s,%s)\n",protocol,host,port); prmsg(2,"LocalOpenCOTSServer(%s,%s,%s)\n",protocol,host,port);
/* Check if this local type is in the XLOCAL list */ /* Check if this local type is in the XLOCAL list */
TRANS(LocalInitTransports)("local"); TRANS(LocalInitTransports)("local");
...@@ -2255,7 +2035,7 @@ TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, char *protocol, ...@@ -2255,7 +2035,7 @@ TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, char *protocol,
TRANS(LocalEndTransports)(); TRANS(LocalEndTransports)();
if (!found) { if (!found) {
PRMSG(3,"LocalOpenCOTSServer: disabling %s\n",thistrans->TransName,0,0); prmsg(3,"LocalOpenCOTSServer: disabling %s\n",thistrans->TransName);
thistrans->flags |= TRANS_DISABLED; thistrans->flags |= TRANS_DISABLED;
return NULL; return NULL;
} }
...@@ -2265,46 +2045,15 @@ TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, char *protocol, ...@@ -2265,46 +2045,15 @@ TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, char *protocol,
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(LocalOpenCLTSClient)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
PRMSG(2,"LocalOpenCLTSClient(%s,%s,%s)\n",protocol,host,port);
return TRANS(LocalOpenClient)(XTRANS_OPEN_CLTS_CLIENT, protocol, host, port);
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(LocalOpenCLTSServer)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
PRMSG(2,"LocalOpenCLTSServer(%s,%s,%s)\n",protocol,host,port);
return TRANS(LocalOpenServer)(XTRANS_OPEN_CLTS_SERVER, protocol, host, port);
}
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
static XtransConnInfo static XtransConnInfo
TRANS(LocalReopenCOTSServer)(Xtransport *thistrans, int fd, char *port) TRANS(LocalReopenCOTSServer)(Xtransport *thistrans, int fd, const char *port)
{ {
int index; int index;
PRMSG(2,"LocalReopenCOTSServer(%d,%s)\n", fd, port, 0); prmsg(2,"LocalReopenCOTSServer(%d,%s)\n", fd, port);
for(index=1;index<NUMTRANSPORTS;index++) for(index=1;index<NUMTRANSPORTS;index++)
{ {
...@@ -2322,30 +2071,6 @@ TRANS(LocalReopenCOTSServer)(Xtransport *thistrans, int fd, char *port) ...@@ -2322,30 +2071,6 @@ TRANS(LocalReopenCOTSServer)(Xtransport *thistrans, int fd, char *port)
index, fd, port); index, fd, port);
} }
static XtransConnInfo
TRANS(LocalReopenCLTSServer)(Xtransport *thistrans, int fd, char *port)
{
int index;
PRMSG(2,"LocalReopenCLTSServer(%d,%s)\n", fd, port, 0);
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_CLTS_SERVER,
index, fd, port);
}
#endif /* TRANS_REOPEN */ #endif /* TRANS_REOPEN */
...@@ -2354,7 +2079,7 @@ static int ...@@ -2354,7 +2079,7 @@ static int
TRANS(LocalSetOption)(XtransConnInfo ciptr, int option, int arg) TRANS(LocalSetOption)(XtransConnInfo ciptr, int option, int arg)
{ {
PRMSG(2,"LocalSetOption(%d,%d,%d)\n",ciptr->fd,option,arg); prmsg(2,"LocalSetOption(%d,%d,%d)\n",ciptr->fd,option,arg);
return -1; return -1;
} }
...@@ -2363,14 +2088,31 @@ TRANS(LocalSetOption)(XtransConnInfo ciptr, int option, int arg) ...@@ -2363,14 +2088,31 @@ TRANS(LocalSetOption)(XtransConnInfo ciptr, int option, int arg)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static int static int
TRANS(LocalCreateListener)(XtransConnInfo ciptr, char *port, unsigned int flags) TRANS(LocalCreateListener)(XtransConnInfo ciptr, const char *port,
unsigned int flags _X_UNUSED)
{ {
PRMSG(2,"LocalCreateListener(%x->%d,%s)\n",ciptr,ciptr->fd,port); prmsg(2,"LocalCreateListener(%p->%d,%s)\n",ciptr,ciptr->fd,port);
return 0; 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 static XtransConnInfo
TRANS(LocalAccept)(XtransConnInfo ciptr, int *status) TRANS(LocalAccept)(XtransConnInfo ciptr, int *status)
...@@ -2378,14 +2120,14 @@ TRANS(LocalAccept)(XtransConnInfo ciptr, int *status) ...@@ -2378,14 +2120,14 @@ TRANS(LocalAccept)(XtransConnInfo ciptr, int *status)
XtransConnInfo newciptr; XtransConnInfo newciptr;
LOCALtrans2dev *transptr; LOCALtrans2dev *transptr;
PRMSG(2,"LocalAccept(%x->%d)\n", ciptr, ciptr->fd,0); prmsg(2,"LocalAccept(%p->%d)\n", ciptr, ciptr->fd);
transptr=(LOCALtrans2dev *)ciptr->priv; transptr=(LOCALtrans2dev *)ciptr->priv;
if( (newciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo)))==NULL ) if( (newciptr = calloc(1,sizeof(struct _XtransConnInfo)))==NULL )
{ {
PRMSG(1,"LocalAccept: calloc(1,%d) failed\n", prmsg(1,"LocalAccept: calloc(1,%lu) failed\n",
sizeof(struct _XtransConnInfo),0,0 ); sizeof(struct _XtransConnInfo));
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return NULL; return NULL;
} }
...@@ -2412,10 +2154,11 @@ TRANS(LocalAccept)(XtransConnInfo ciptr, int *status) ...@@ -2412,10 +2154,11 @@ TRANS(LocalAccept)(XtransConnInfo ciptr, int *status)
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
static int static int
TRANS(LocalConnect)(XtransConnInfo ciptr, char *host, char *port) TRANS(LocalConnect)(XtransConnInfo ciptr,
const char *host _X_UNUSED, const char *port)
{ {
PRMSG(2,"LocalConnect(%x->%d,%s)\n", ciptr, ciptr->fd, port); prmsg(2,"LocalConnect(%p->%d,%s)\n", ciptr, ciptr->fd, port);
return 0; return 0;
} }
...@@ -2427,9 +2170,9 @@ static int ...@@ -2427,9 +2170,9 @@ static int
TRANS(LocalBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend ) TRANS(LocalBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend )
{ {
PRMSG(2,"LocalBytesReadable(%x->%d,%x)\n", ciptr, ciptr->fd, pend); prmsg(2,"LocalBytesReadable(%p->%d,%p)\n", ciptr, ciptr->fd, pend);
#if defined(ISC) || defined(SCO325) #if defined(SCO325)
return ioctl(ciptr->fd, I_NREAD, (char *)pend); return ioctl(ciptr->fd, I_NREAD, (char *)pend);
#else #else
return ioctl(ciptr->fd, FIONREAD, (char *)pend); return ioctl(ciptr->fd, FIONREAD, (char *)pend);
...@@ -2440,7 +2183,7 @@ static int ...@@ -2440,7 +2183,7 @@ static int
TRANS(LocalRead)(XtransConnInfo ciptr, char *buf, int size) TRANS(LocalRead)(XtransConnInfo ciptr, char *buf, int size)
{ {
PRMSG(2,"LocalRead(%d,%x,%d)\n", ciptr->fd, buf, size ); prmsg(2,"LocalRead(%d,%p,%d)\n", ciptr->fd, buf, size );
return read(ciptr->fd,buf,size); return read(ciptr->fd,buf,size);
} }
...@@ -2449,7 +2192,7 @@ static int ...@@ -2449,7 +2192,7 @@ static int
TRANS(LocalWrite)(XtransConnInfo ciptr, char *buf, int size) TRANS(LocalWrite)(XtransConnInfo ciptr, char *buf, int size)
{ {
PRMSG(2,"LocalWrite(%d,%x,%d)\n", ciptr->fd, buf, size ); prmsg(2,"LocalWrite(%d,%p,%d)\n", ciptr->fd, buf, size );
return write(ciptr->fd,buf,size); return write(ciptr->fd,buf,size);
} }
...@@ -2458,7 +2201,7 @@ static int ...@@ -2458,7 +2201,7 @@ static int
TRANS(LocalReadv)(XtransConnInfo ciptr, struct iovec *buf, int size) TRANS(LocalReadv)(XtransConnInfo ciptr, struct iovec *buf, int size)
{ {
PRMSG(2,"LocalReadv(%d,%x,%d)\n", ciptr->fd, buf, size ); prmsg(2,"LocalReadv(%d,%p,%d)\n", ciptr->fd, buf, size );
return READV(ciptr,buf,size); return READV(ciptr,buf,size);
} }
...@@ -2467,7 +2210,7 @@ static int ...@@ -2467,7 +2210,7 @@ static int
TRANS(LocalWritev)(XtransConnInfo ciptr, struct iovec *buf, int size) TRANS(LocalWritev)(XtransConnInfo ciptr, struct iovec *buf, int size)
{ {
PRMSG(2,"LocalWritev(%d,%x,%d)\n", ciptr->fd, buf, size ); prmsg(2,"LocalWritev(%d,%p,%d)\n", ciptr->fd, buf, size );
return WRITEV(ciptr,buf,size); return WRITEV(ciptr,buf,size);
} }
...@@ -2476,7 +2219,7 @@ static int ...@@ -2476,7 +2219,7 @@ static int
TRANS(LocalDisconnect)(XtransConnInfo ciptr) TRANS(LocalDisconnect)(XtransConnInfo ciptr)
{ {
PRMSG(2,"LocalDisconnect(%x->%d)\n", ciptr, ciptr->fd, 0); prmsg(2,"LocalDisconnect(%p->%d)\n", ciptr, ciptr->fd);
return 0; return 0;
} }
...@@ -2488,7 +2231,7 @@ TRANS(LocalClose)(XtransConnInfo ciptr) ...@@ -2488,7 +2231,7 @@ TRANS(LocalClose)(XtransConnInfo ciptr)
struct sockaddr_un *sockname=(struct sockaddr_un *) ciptr->addr; struct sockaddr_un *sockname=(struct sockaddr_un *) ciptr->addr;
int ret; int ret;
PRMSG(2,"LocalClose(%x->%d)\n", ciptr, ciptr->fd ,0); prmsg(2,"LocalClose(%p->%d)\n", ciptr, ciptr->fd );
ret=close(ciptr->fd); ret=close(ciptr->fd);
...@@ -2510,7 +2253,7 @@ TRANS(LocalCloseForCloning)(XtransConnInfo ciptr) ...@@ -2510,7 +2253,7 @@ TRANS(LocalCloseForCloning)(XtransConnInfo ciptr)
{ {
int ret; int ret;
PRMSG(2,"LocalCloseForCloning(%x->%d)\n", ciptr, ciptr->fd ,0); prmsg(2,"LocalCloseForCloning(%p->%d)\n", ciptr, ciptr->fd );
/* Don't unlink path */ /* Don't unlink path */
...@@ -2524,22 +2267,22 @@ TRANS(LocalCloseForCloning)(XtransConnInfo ciptr) ...@@ -2524,22 +2267,22 @@ TRANS(LocalCloseForCloning)(XtransConnInfo ciptr)
* MakeAllCOTSServerListeners() will go through the entire Xtransports[] * MakeAllCOTSServerListeners() will go through the entire Xtransports[]
* array defined in Xtrans.c and try to OpenCOTSServer() for each entry. * array defined in Xtrans.c and try to OpenCOTSServer() for each entry.
* We will add duplicate entries to that table so that the OpenCOTSServer() * We will add duplicate entries to that table so that the OpenCOTSServer()
* function will get called once for each type of local transport. * function will get called once for each type of local transport.
* *
* The TransName is in lowercase, so it will never match during a normal * The TransName is in lowercase, so it will never match during a normal
* call to SelectTransport() in Xtrans.c. * call to SelectTransport() in Xtrans.c.
*/ */
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static char * local_aliases[] = { static const char * local_aliases[] = {
# ifndef sun # ifdef LOCAL_TRANS_PTS
"pts", "pts",
# endif # endif
"named", "named",
# ifndef sun # ifdef __sun
# if !defined(__SCO__) && !defined(__UNIXWARE__) "pipe", /* compatibility with Solaris Xlib */
"isc",
# endif # endif
# ifdef LOCAL_TRANS_SCO
"sco", "sco",
# endif # endif
NULL }; NULL };
...@@ -2556,20 +2299,13 @@ Xtransport TRANS(LocalFuncs) = { ...@@ -2556,20 +2299,13 @@ Xtransport TRANS(LocalFuncs) = {
local_aliases, local_aliases,
TRANS(LocalOpenCOTSServer), TRANS(LocalOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(LocalOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(LocalOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(LocalReopenCOTSServer), TRANS(LocalReopenCOTSServer),
TRANS(LocalReopenCLTSServer),
#endif #endif
TRANS(LocalSetOption), TRANS(LocalSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(LocalCreateListener), TRANS(LocalCreateListener),
NULL, /* ResetListener */ TRANS(LocalResetListener),
TRANS(LocalAccept), TRANS(LocalAccept),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
...@@ -2580,12 +2316,16 @@ Xtransport TRANS(LocalFuncs) = { ...@@ -2580,12 +2316,16 @@ Xtransport TRANS(LocalFuncs) = {
TRANS(LocalWrite), TRANS(LocalWrite),
TRANS(LocalReadv), TRANS(LocalReadv),
TRANS(LocalWritev), TRANS(LocalWritev),
#if XTRANS_SEND_FDS
TRANS(LocalSendFdInvalid),
TRANS(LocalRecvFdInvalid),
#endif
TRANS(LocalDisconnect), TRANS(LocalDisconnect),
TRANS(LocalClose), TRANS(LocalClose),
TRANS(LocalCloseForCloning), TRANS(LocalCloseForCloning),
}; };
#ifndef sun #ifdef LOCAL_TRANS_PTS
Xtransport TRANS(PTSFuncs) = { Xtransport TRANS(PTSFuncs) = {
/* Local Interface */ /* Local Interface */
...@@ -2598,20 +2338,13 @@ Xtransport TRANS(PTSFuncs) = { ...@@ -2598,20 +2338,13 @@ Xtransport TRANS(PTSFuncs) = {
NULL, NULL,
TRANS(LocalOpenCOTSServer), TRANS(LocalOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(LocalOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(LocalOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(LocalReopenCOTSServer), TRANS(LocalReopenCOTSServer),
TRANS(LocalReopenCLTSServer),
#endif #endif
TRANS(LocalSetOption), TRANS(LocalSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(LocalCreateListener), TRANS(LocalCreateListener),
NULL, /* ResetListener */ TRANS(LocalResetListener),
TRANS(LocalAccept), TRANS(LocalAccept),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
...@@ -2622,12 +2355,18 @@ Xtransport TRANS(PTSFuncs) = { ...@@ -2622,12 +2355,18 @@ Xtransport TRANS(PTSFuncs) = {
TRANS(LocalWrite), TRANS(LocalWrite),
TRANS(LocalReadv), TRANS(LocalReadv),
TRANS(LocalWritev), TRANS(LocalWritev),
#if XTRANS_SEND_FDS
TRANS(LocalSendFdInvalid),
TRANS(LocalRecvFdInvalid),
#endif
TRANS(LocalDisconnect), TRANS(LocalDisconnect),
TRANS(LocalClose), TRANS(LocalClose),
TRANS(LocalCloseForCloning), TRANS(LocalCloseForCloning),
}; };
#endif /* sun */ #endif /* LOCAL_TRANS_PTS */
#ifdef LOCAL_TRANS_NAMED
Xtransport TRANS(NAMEDFuncs) = { Xtransport TRANS(NAMEDFuncs) = {
/* Local Interface */ /* Local Interface */
...@@ -2640,20 +2379,13 @@ Xtransport TRANS(NAMEDFuncs) = { ...@@ -2640,20 +2379,13 @@ Xtransport TRANS(NAMEDFuncs) = {
NULL, NULL,
TRANS(LocalOpenCOTSServer), TRANS(LocalOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(LocalOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(LocalOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(LocalReopenCOTSServer), TRANS(LocalReopenCOTSServer),
TRANS(LocalReopenCLTSServer),
#endif #endif
TRANS(LocalSetOption), TRANS(LocalSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(LocalCreateListener), TRANS(LocalCreateListener),
NULL, /* ResetListener */ TRANS(LocalResetListener),
TRANS(LocalAccept), TRANS(LocalAccept),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
...@@ -2664,17 +2396,20 @@ Xtransport TRANS(NAMEDFuncs) = { ...@@ -2664,17 +2396,20 @@ Xtransport TRANS(NAMEDFuncs) = {
TRANS(LocalWrite), TRANS(LocalWrite),
TRANS(LocalReadv), TRANS(LocalReadv),
TRANS(LocalWritev), TRANS(LocalWritev),
#if XTRANS_SEND_FDS
TRANS(LocalSendFdInvalid),
TRANS(LocalRecvFdInvalid),
#endif
TRANS(LocalDisconnect), TRANS(LocalDisconnect),
TRANS(LocalClose), TRANS(LocalClose),
TRANS(LocalCloseForCloning), TRANS(LocalCloseForCloning),
}; };
#ifndef sun #ifdef __sun
#if !defined(__SCO__) && !defined(__UNIXWARE__) Xtransport TRANS(PIPEFuncs) = {
Xtransport TRANS(ISCFuncs) = {
/* Local Interface */ /* Local Interface */
"isc", "pipe",
TRANS_LOCAL, TRANS_ALIAS | TRANS_LOCAL,
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
TRANS(LocalOpenCOTSClient), TRANS(LocalOpenCOTSClient),
#endif /* TRANS_CLIENT */ #endif /* TRANS_CLIENT */
...@@ -2682,20 +2417,13 @@ Xtransport TRANS(ISCFuncs) = { ...@@ -2682,20 +2417,13 @@ Xtransport TRANS(ISCFuncs) = {
NULL, NULL,
TRANS(LocalOpenCOTSServer), TRANS(LocalOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(LocalOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(LocalOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(LocalReopenCOTSServer), TRANS(LocalReopenCOTSServer),
TRANS(LocalReopenCLTSServer),
#endif #endif
TRANS(LocalSetOption), TRANS(LocalSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(LocalCreateListener), TRANS(LocalCreateListener),
NULL, /* ResetListener */ TRANS(LocalResetListener),
TRANS(LocalAccept), TRANS(LocalAccept),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
...@@ -2706,11 +2434,19 @@ Xtransport TRANS(ISCFuncs) = { ...@@ -2706,11 +2434,19 @@ Xtransport TRANS(ISCFuncs) = {
TRANS(LocalWrite), TRANS(LocalWrite),
TRANS(LocalReadv), TRANS(LocalReadv),
TRANS(LocalWritev), TRANS(LocalWritev),
#if XTRANS_SEND_FDS
TRANS(LocalSendFdInvalid),
TRANS(LocalRecvFdInvalid),
#endif
TRANS(LocalDisconnect), TRANS(LocalDisconnect),
TRANS(LocalClose), TRANS(LocalClose),
TRANS(LocalCloseForCloning), TRANS(LocalCloseForCloning),
}; };
#endif /* !__SCO__ && !__UNIXWARE__ */ #endif /* __sun */
#endif /* LOCAL_TRANS_NAMED */
#ifdef LOCAL_TRANS_SCO
Xtransport TRANS(SCOFuncs) = { Xtransport TRANS(SCOFuncs) = {
/* Local Interface */ /* Local Interface */
"sco", "sco",
...@@ -2722,20 +2458,13 @@ Xtransport TRANS(SCOFuncs) = { ...@@ -2722,20 +2458,13 @@ Xtransport TRANS(SCOFuncs) = {
NULL, NULL,
TRANS(LocalOpenCOTSServer), TRANS(LocalOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(LocalOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(LocalOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(LocalReopenCOTSServer), TRANS(LocalReopenCOTSServer),
TRANS(LocalReopenCLTSServer),
#endif #endif
TRANS(LocalSetOption), TRANS(LocalSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
TRANS(LocalCreateListener), TRANS(LocalCreateListener),
NULL, /* ResetListener */ TRANS(LocalResetListener),
TRANS(LocalAccept), TRANS(LocalAccept),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
...@@ -2746,8 +2475,12 @@ Xtransport TRANS(SCOFuncs) = { ...@@ -2746,8 +2475,12 @@ Xtransport TRANS(SCOFuncs) = {
TRANS(LocalWrite), TRANS(LocalWrite),
TRANS(LocalReadv), TRANS(LocalReadv),
TRANS(LocalWritev), TRANS(LocalWritev),
#if XTRANS_SEND_FDS
TRANS(LocalSendFdInvalid),
TRANS(LocalRecvFdInvalid),
#endif
TRANS(LocalDisconnect), TRANS(LocalDisconnect),
TRANS(LocalClose), TRANS(LocalClose),
TRANS(LocalCloseForCloning), TRANS(LocalCloseForCloning),
}; };
#endif /* sun */ #endif /* LOCAL_TRANS_SCO */
/*
* (c) Copyright 1996 by Sebastien Marineau and Holger Veit
* <marineau@genie.uottawa.ca>
* <Holger.Veit@gmd.de>
*
* 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 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
* HOLGER VEIT 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 Sebastien Marineau or Holger Veit shall not be
* used in advertising or otherwise to promote the sale, use or other dealings
* in this Software without prior written authorization from Holger Veit or Sebastien Marineau.
*
*/
/* Implementation of the OS/2 local pipe transport layer */
#define INCL_DOSNMPIPES
#define INCL_DOSPROCESS
#define INCL_DOSERRORS
#define INCL_DOSFILEMGR
#undef BYTE
#undef BOOL
#include <os2.h>
#ifdef XSERV_t
extern HEV hPipeSem;
BOOL init_server_pipes();
#endif
/*************************************************************************
* Independent Layer
*************************************************************************/
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(Os2OpenClient)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
APIRET rc;
HFILE hfd,hServer;
ULONG action,byteWritten,State;
char pipename[256],clientname[256];
char server_string[256];
struct sockaddr *addr_name;
unsigned char pipe_len;
XtransConnInfo ciptr;
static int unique_id=0;
int i,namelen,try;
PRMSG(2,"Os2OpenClient(%s,%s,%s)\n",protocol,host,port);
/* test, whether the host is really local, i.e. either
* "os2" or "local"
*/
if (strcmp(protocol,"os2") && strcmp(protocol,"local")) {
PRMSG (1,
"Os2OpenClient: Cannot connect to non-local host %s\n",
host, 0, 0);
return NULL;
}
/* make the pipename */
if (port && *port ) {
if( *port == '/' ) { /* A full pathname */
(void) sprintf(pipename, "\\PIPE\\X\\%s,", port);
} else {
(void) sprintf(pipename, "%s%s", "\\PIPE\\X\\xf86.", port);
}
} else {
(void) sprintf(pipename, "\\PIPE\\X\\xfree86"); }
PRMSG(5, "Os2OpenClient: Creating pipe %s\n",pipename, 0,0 );
/* make a connection entry */
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL ) {
PRMSG(1,"Os2OpenClient: calloc(1,%d) failed\n",
sizeof(struct _XtransConnInfo),0,0 );
return NULL;
}
/* open the pipe. Try ten times before giving up at 500ms intervals*/
try = 0;
do {
rc = DosOpen(pipename,&hServer, &action, 0,
FILE_NORMAL, FILE_OPEN,
OPEN_ACCESS_WRITEONLY | OPEN_SHARE_DENYWRITE,
(PEAOP2)NULL);
if(rc == 0) break;
if (try >=10) {
PRMSG(1,"Os2OpenClient: Open server pipe %s failed, rc=%d\n",
pipename,rc,0 );
PRMSG(1,"\tProbable causes: either the XServer is not running, or has not started properly,\n",
0,0,0 );
PRMSG(1,"\tor the DISPLAY variable is set incorrectly.\n",
0,0,0 );
free(ciptr);
return NULL;
}
try ++;
DosSleep(500);
} while (rc != 0);
/* OK, now we are talking to the server. Generate a unique pipe name and pass it to
* the server. Make the pipe and wait for server to connect */
sprintf(clientname,"\\PIPE\\X\\%d.%d",getpid(),unique_id++);
rc = DosCreateNPipe (clientname, &hfd,
NP_NOINHERIT | NP_ACCESS_DUPLEX,
1 | NP_NOWAIT | NP_TYPE_BYTE | NP_READMODE_BYTE,
16384, 16384, 0);
if (rc != 0){
PRMSG(1, "Os2OpenClient: Unable to create pipe %s\n", pipename,0,0 );
DosClose(hfd);
pipe_len=0;
DosWrite(hServer,&pipe_len,1,&byteWritten);
DosClose(hServer);
free(ciptr);
return(NULL);
}
/* Connect to the pipe. */
rc = DosConnectNPipe (hfd);
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2OpenClient: Unable to connect to pipe %s\n", pipename,0,0 );
DosClose (hfd);
DosClose(hServer);
free(ciptr);
return (NULL);
}
/* Now write name to server on hServer */
server_string[0]=(char) strlen(clientname)+1;
strcpy(&server_string[1],clientname);
rc = DosWrite(hServer,server_string,(ULONG)server_string[0]+1,&byteWritten);
if(rc != 0){ /* Could not write to server pipe? */
PRMSG(1, "Os2OpenClient: Error writing to server pipe, handle=%d, rc=%d, w=%d\n",
hServer,rc,byteWritten );
DosClose(hServer);
DosClose(hfd);
free(ciptr);
return(NULL);
}
PRMSG (5, "Os2OpenCLient: Wrote pipename %s to server; len %d written %d \n",
&server_string[1],server_string[0]+1,byteWritten);
/* The server will respond by opening the pipe. Wait for that for 30 secs */
i=0;
DosSleep(50); /* Give it time to catch up but minimize race condition*/
rc = DosConnectNPipe(hfd);
while((rc == ERROR_PIPE_NOT_CONNECTED)&&(i++<60)) {
DosSleep(500);
rc = DosConnectNPipe(hfd);
}
if(rc != 0){ /* Server has not responded! */
PRMSG(1, "Os2OpenClient: Timeout on wait for server response, handle=%d, rc=%d\n",hServer,rc,0 );
PRMSG(1, "\tProbable cause: the XServer has exited or crashed while the connection was being established\n",0,0,0 );
PRMSG(1, "\tor the XServer is too busy to respond.\n",0,0,0 );
DosClose(hServer);
DosClose(hfd);
free(ciptr);
return(NULL);
}
/* OK, the server has connected! Fill-in the info and return */
DosClose(hServer);
/* Last check: make sure client is connected! */
rc = DosQueryNPHState(hfd,&State);
if(rc != 0){ /* Client is not connected! */
PRMSG(1, "Os2OpenClient: Client pipe does not appear connected. rc=%d, h=%d\n",rc,hfd,0 );
PRMSG(1, "\tProbable cause: the XServer has just exited.\n",0,0,0 );
DosClose(hfd);
free(ciptr);
return(NULL);
}
namelen=sizeof(struct sockaddr);
if ((ciptr->addr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2OpenClient: Can't allocate space for the addr\n",
0, 0, 0);
DosClose(hfd);
free(ciptr);
return(NULL);
}
ciptr->addrlen = namelen;
((struct sockaddr *)ciptr->addr)->sa_family = AF_UNIX;
strcpy(((struct sockaddr *)ciptr->addr)->sa_data, "local");
if ((ciptr->peeraddr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2OpenCLient: Can't allocate space for the addr\n",
0, 0, 0);
DosClose(hfd);
free(ciptr->addr);
free(ciptr);
return(NULL);
}
ciptr->peeraddrlen = namelen;
((struct sockaddr *)ciptr->peeraddr)->sa_family = AF_UNIX;
strcpy (((struct sockaddr *)ciptr->peeraddr)->sa_data,"local");
PRMSG (5, "Os2OpenCLient: Filled in struct: len %d %d name %s\n",
ciptr->addrlen,ciptr->peeraddrlen,((struct sockaddr *)ciptr->peeraddr)->sa_data);
ciptr->index=hfd;
ciptr->family=AF_UNIX;
if((ciptr->fd=_imphandle(hfd))<0){
PRMSG(1, "Os2OpenClient: Could not import the pipe handle into EMX\n",0,0,0 );
PRMSG(1, "\tProbable cause: EMX has run out of free file handles.\n",0,0,0 );
DosClose(hfd);
free(ciptr->addr);
free(ciptr->peeraddr);
free(ciptr);
return(NULL);
}
PRMSG(5, "Os2OpenClient: pipe handle %d EMX handle %d\n",ciptr->index,ciptr->fd,0 );
fcntl(ciptr->fd,F_SETFL,O_NDELAY);
fcntl(ciptr->fd,F_SETFD,FD_CLOEXEC);
return ciptr;
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(Os2OpenServer)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
APIRET rc;
HFILE hfd;
ULONG action;
char pipename[256];
struct sockaddr *addr_name;
XtransConnInfo ciptr;
int namelen;
#ifdef XSERV_t
if (! init_server_pipes()) return(NULL);
#endif
PRMSG(2,"Os2OpenServer(%s,%s,%s)\n",protocol,host,port);
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{
PRMSG(1,"Os2OpenServer: calloc(1,%d) failed\n",
sizeof(struct _XtransConnInfo),0,0 );
return NULL;
}
if (port && *port ) {
if( *port == '/' ) { /* A full pathname */
(void) sprintf(pipename, "\\PIPE\\X\\%s", port);
} else {
(void) sprintf(pipename, "%s%s", "\\PIPE\\X\\xf86.", port);
}
} else {
(void) sprintf(pipename, "\\PIPE\\X\\xfree86");
}
PRMSG(5, "Os2OpenServer: Creating pipe %s\n",pipename, 0,0 );
rc = DosCreateNPipe (pipename, &hfd,
NP_NOINHERIT | NP_ACCESS_INBOUND,
1 | NP_NOWAIT | NP_TYPE_BYTE | NP_READMODE_BYTE,
0, 8192, 0);
if (rc != 0){
PRMSG(1, "Os2OpenServer: Unable to create pipe %s, rc=%d\n", pipename,rc,0 );
PRMSG(1, "\tProbable cause: there is already another XServer running on display :%s\n",port,0,0 );
DosClose(hfd);
free(ciptr);
return(NULL);
}
/* Connect to the pipe. */
rc = DosConnectNPipe (hfd);
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2OpenServer: Unable to connect to pipe %s\n", pipename,0,0 );
DosClose (hfd);
free(ciptr);
return (NULL);
}
/* Pipe is now connected and waiting for client connect */
/*** Put in info ***/
namelen=sizeof(struct sockaddr);
if ((ciptr->addr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2OpenServer: Can't allocate space for the addr\n",
0, 0, 0);
DosClose(hfd);
free(ciptr);
return(NULL);
}
ciptr->addrlen = namelen;
((struct sockaddr *)ciptr->addr)->sa_family = AF_UNIX;
strcpy (((struct sockaddr *)ciptr->addr)->sa_data, "local");
if ((ciptr->peeraddr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2OpenServer: Can't allocate space for the addr\n",
0, 0, 0);
DosClose(hfd);
free(ciptr->addr);
free(ciptr);
return(NULL);
}
ciptr->peeraddrlen = namelen;
((struct sockaddr *)ciptr->peeraddr)->sa_family = AF_UNIX;
strcpy(((struct sockaddr *)ciptr->peeraddr)->sa_data,"local");
PRMSG (5, "Os2OpenServer: Filled in struct: len %d %d name %s\n",
ciptr->addrlen,ciptr->peeraddrlen,((struct sockaddr *)ciptr->peeraddr)->sa_data);
ciptr->index=hfd; /* Save this for later use in this unused member of struct */
ciptr->flags=1; /* Listener */
ciptr->family=AF_UNIX;
if((ciptr->fd=_imphandle(hfd))<0){
DosClose(hfd);
free(ciptr->addr);
free(ciptr->peeraddr);
free(ciptr);
return(NULL);
}
PRMSG(5, "Os2OpenServer: Pipe handle %d EMX handle %d",ciptr->index,ciptr->fd,0 );
#ifdef XSERV_t
/* Attach the pipe sem to the pipe. Use handle index as key */
rc = DosSetNPipeSem(ciptr->fd, (HSEM)hPipeSem, ciptr->fd);
if (rc){
PRMSG(1, "Os2OpenCOTSServer: Could not attach sem %d to pipe %d, rc=%d\n",
hPipeSem,ciptr->fd,rc);
DosClose(ciptr->fd);
free(ciptr->addr);
free(ciptr->peeraddr);
free(ciptr);
return(NULL);
}
#endif
fcntl(ciptr->fd,F_SETFL,O_NDELAY);
fcntl(ciptr->fd,F_SETFD,FD_CLOEXEC);
return(ciptr);
}
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(Os2OpenCLTSClient)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
PRMSG(2,"Os2OpenCLTSClient(%s,%s,%s)\n",protocol,host,port);
return TRANS(Os2OpenClient)(thistrans, protocol, host, port);
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(Os2OpenCOTSClient)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
PRMSG(2,"Os2OpenCOTSClient(%s,%s,%s)\n",protocol,host,port);
return TRANS(Os2OpenClient)(thistrans, protocol, host, port);
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(Os2OpenCLTSServer)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
PRMSG(2,"Os2OpenCLTSServer(%s,%s,%s)\n",protocol,host,port);
return TRANS(Os2OpenServer)(thistrans, protocol, host, port);
}
#endif /* TRANS_SERVER */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(Os2OpenCOTSServer)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
PRMSG(2,"Os2OpenCOTSServer(%s,%s,%s)\n",protocol,host,port);
return TRANS(Os2OpenServer)(thistrans, protocol, host, port);
}
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
static XtransConnInfo
TRANS(Os2ReopenCOTSServer)(Xtransport *thistrans, int fd, char *port)
{
XtransConnInfo ciptr;
char addr_name[256];
int namelen;
PRMSG(2,"Os2ReopenCOTSServer(%d,%s)\n", fd, port, 0);
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{
PRMSG(1,"Os2ReopenCOTSServer: calloc(1,%d) failed\n",
sizeof(struct _XtransConnInfo),0,0 );
return NULL;
}
strcpy(addr_name,"local");
namelen=sizeof(addr_name);
if ((ciptr->addr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2ReopenCOTSServer: Can't allocate space for the addr\n",
0, 0, 0);
free(ciptr);
return(NULL);
}
ciptr->addrlen = namelen;
memcpy (ciptr->addr, addr_name, ciptr->addrlen);
if ((ciptr->peeraddr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2ReopenCOTSServer: Can't allocate space for the addr\n",
0, 0, 0);
free(ciptr);
return(NULL);
}
ciptr->peeraddrlen = namelen;
memcpy (ciptr->peeraddr,addr_name, ciptr->addrlen);
ciptr->fd = fd;
ciptr->family=AF_UNIX;
ciptr->flags=1;
PRMSG(1,"Os2ReopenCOTSServer: Filled-in info for handle %d on port %s.\n", fd, port, 0);
return(ciptr);
}
static XtransConnInfo
TRANS(Os2ReopenCLTSServer)(Xtransport *thistrans, int fd, char *port)
{
PRMSG(2,"Os2ReopenCLTSServer(%d,%s)\n", fd, port, 0);
return TRANS(Os2ReopenCOTSServer)(thistrans, fd, port);
}
#endif
static
TRANS(Os2SetOption)(XtransConnInfo ciptr, int option, int arg)
{
PRMSG(2,"Os2SetOption(%d,%d,%d)\n",ciptr->fd,option,arg);
return -1;
}
#ifdef TRANS_SERVER
static
TRANS(Os2CreateListener)(XtransConnInfo ciptr, char *port, unsigned int flags)
{
PRMSG(2,"Os2CreateListener(%x->%d,%s)\n",ciptr,ciptr->fd,port);
return 0;
}
static XtransConnInfo
TRANS(Os2Accept)(XtransConnInfo ciptr, int *status)
{
XtransConnInfo newciptr;
HFILE hClient;
unsigned char length;
ULONG action;
char clientname[256];
struct sockaddr *addr_name;
int in,namelen;
APIRET rc;
PRMSG(2,"Os2Accept(%x->%d)\n", ciptr, ciptr->fd,0);
if( (newciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo)))==NULL )
{
PRMSG(1,"Os2Accept: calloc(1,%d) failed\n",
sizeof(struct _XtransConnInfo),0,0 );
*status = TRANS_ACCEPT_BAD_MALLOC;
return NULL;
}
/* Read in length of client pipe name. If fails, then reset server pipe */
if((in=read(ciptr->fd,&length,1))<=0){
PRMSG(2,"Os2Accept: Error reading incoming connection, in=%d, error=%d\n",
in,errno,0 );
*status = TRANS_ACCEPT_MISC_ERROR;
free(newciptr);
rc = DosDisConnectNPipe(ciptr->fd);
rc = DosConnectNPipe (ciptr->fd);
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2Accept: Unable to reconnect server pipe %d\n", ciptr->fd,0,0 );
}
return NULL;
}
PRMSG(5, "Os2Accept: Bytes to read for name: %d\n",length,0,0 );
/* Check length for valid length ?? */
/* Now read in length bytes from pipe for client pipe name */
if((in=read(ciptr->fd,clientname,length))<=0){
PRMSG(2,"Os2Accept: Error reading incoming connection, in=%d, error=%d\n",
in,errno,0 );
*status = TRANS_ACCEPT_MISC_ERROR;
free(newciptr);
rc = DosDisConnectNPipe(ciptr->fd);
rc = DosConnectNPipe (ciptr->fd);
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2Accept: Unable to reconnect server pipe %d\n", ciptr->fd,0,0 );
}
return NULL;
}
clientname[length]='\0';
PRMSG(5, "Os2Accept: Server name %s length %d\n",clientname,length,0 );
/* Now we have the client pipe name. Open it with DosOpen */
rc = DosOpen(clientname,&hClient, &action, 0,
FILE_NORMAL, FILE_OPEN,
OPEN_FLAGS_NOINHERIT | OPEN_ACCESS_READWRITE | OPEN_SHARE_DENYREADWRITE,
(PEAOP2)NULL);
PRMSG(5, "Os2Accept: Open pipe %s, handle = %d, rc=%d\n",clientname,hClient,rc );
if (rc) {
PRMSG(1,"Os2Accept: Open pipe %s to client failed, rc=%d\n",
clientname,rc,0 );
PRMSG(1, "\tProbable cause: the client has exited or timed-out.\n",0,0,0 );
free(newciptr);
rc = DosDisConnectNPipe(ciptr->fd);
rc = DosConnectNPipe (ciptr->fd);
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2Accept: Unable to reconnect server pipe %d\n", ciptr->fd,0,0 );
}
return NULL;
}
rc = DosSetNPHState (hClient, NP_NOWAIT | NP_READMODE_BYTE);
if (rc != 0)
{
PRMSG(1,"Os2Accept: Could not set pipe %s to non-blocking mode, rc=%d\n",
hClient,rc,0 );
free(newciptr);
rc = DosDisConnectNPipe(ciptr->fd);
rc = DosConnectNPipe (ciptr->fd);
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2Accept: Unable to reconnect server pipe %d\n", ciptr->fd,0,0 );
}
return NULL;
}
/* OK, we seem to be well connected to client. Now disconnect server pipe and put again in listen */
rc = DosDisConnectNPipe(ciptr->fd);
rc = DosConnectNPipe (ciptr->fd);
PRMSG(5, "Os2Accept: Reconnecting server pipe %d, rc = %d\n",ciptr->fd,rc,0 );
if (rc != 0 && rc != ERROR_PIPE_NOT_CONNECTED)
{
PRMSG(1, "Os2Accept: Unable to reconnect server pipe %d\n", ciptr->fd,0,0 );
} /* Consider this non-fatal for present connection */
/* And finally fill-in info in newciptr */
namelen=sizeof(struct sockaddr);
if ((newciptr->addr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2Accept: Can't allocate space for the addr\n",
0, 0, 0);
DosClose(hClient);
free(newciptr);
return(NULL);
}
newciptr->addrlen = namelen;
((struct sockaddr *)newciptr->addr)->sa_family = AF_UNIX;
strcpy (((struct sockaddr *)newciptr->addr)->sa_data, "local");
if ((newciptr->peeraddr = (char *) malloc (namelen)) == NULL)
{
PRMSG (1, "Os2Accept: Can't allocate space for the addr\n",
0, 0, 0);
DosClose(hClient);
free(ciptr->addr);
free(newciptr);
return(NULL);
}
newciptr->peeraddrlen = namelen;
((struct sockaddr *)newciptr->peeraddr)->sa_family = AF_UNIX;
strcpy (((struct sockaddr *)newciptr->peeraddr)->sa_data, "local");
PRMSG (5, "Os2Accept: Filled in struct: len %d %d name %s\n",
newciptr->addrlen,newciptr->peeraddrlen,newciptr->peeraddr);
newciptr->index=hClient;
newciptr->family=AF_UNIX;
if((newciptr->fd=_imphandle(hClient))<0){
PRMSG(1,"Os2Accept: Could not import pipe %d into EMX, errno=%d\n",
hClient,errno,0 );
PRMSG(1, "\tProbable cause: EMX has run out of file handles.\n",0,0,0 );
DosClose(hClient);
free(newciptr->addr);
free(newciptr->peeraddr);
free(newciptr);
return(NULL);
}
PRMSG(5, "Os2Accept: Pipe handle %d EMX handle %d",newciptr->index,newciptr->fd,0 );
#ifdef XSERV_t
/* Attach the pipe sem to the pipe. Use handle index as key */
rc = DosSetNPipeSem(newciptr->fd, (HSEM)hPipeSem, newciptr->fd);
if (rc){
PRMSG(1, "Os2OpenCOTSServer: Could not attach sem %d to pipe %d, rc=%d\n",
hPipeSem,newciptr->fd,rc);
DosClose(newciptr->fd);
free(newciptr->addr);
free(newciptr->peeraddr);
free(newciptr);
return(NULL);
}
#endif
fcntl(ciptr->fd,F_SETFL,O_NDELAY);
fcntl(ciptr->fd,F_SETFD,FD_CLOEXEC);
*status=0;
return newciptr;
}
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static
TRANS(Os2Connect)(XtransConnInfo ciptr, char *host, char *port)
{
PRMSG(2,"Os2Connect(%x->%d,%s)\n", ciptr, ciptr->fd, port);
return 0;
}
#endif /* TRANS_CLIENT */
static int
TRANS(Os2BytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend )
{
ULONG rc, state, nread;
AVAILDATA avail;
char buffer;
PRMSG(2,"Os2BytesReadable(%x->%d,%x)\n", ciptr, ciptr->fd, pend);
rc = DosPeekNPipe (ciptr->fd, &buffer, 0, &nread, &avail, &state);
if (rc != 0)
{
errno = EPIPE;
*pend = 0;
return -1;
}
if (state == NP_STATE_CLOSING)
{
errno = EPIPE;
*pend = 0;
return -1;
}
errno = 0;
*pend = avail.cbpipe;
return 0;
}
static int
TRANS(Os2Read)(XtransConnInfo ciptr, char *buf, int size)
{
int ret;
APIRET rc;
ULONG ulRead;
PRMSG(2,"Os2Read(%d,%x,%d)\n", ciptr->fd, buf, size );
errno = 0;
rc = DosRead(ciptr->fd, buf, size, &ulRead);
if (rc == 0){
ret = ulRead;
}
else if ((rc == 232) || (rc == 231)){
errno = EAGAIN;
ret = -1;
}
else if (rc == 6){
errno = EBADF;
ret = -1;
}
else if ((rc == 109) || (rc == 230) || (rc == 233)){
errno = EPIPE;
ret = -1;
}
else {
PRMSG(2,"Os2Read: Unknown return code from DosRead, fd %d rc=%d\n", ciptr->fd,rc,0 );
errno = EINVAL;
ret = -1;
}
return (ret);
}
static int
TRANS(Os2Write)(XtransConnInfo ciptr, char *buf, int size)
{
int ret;
APIRET rc;
ULONG nWritten;
PRMSG(2,"Os2Write(%d,%x,%d)\n", ciptr->fd, buf, size );
rc = DosWrite(ciptr->fd, buf, size, &nWritten);
if (rc == 0){
ret = nWritten;
if(nWritten == 0) {
errno=EAGAIN;
ret = -1;
}
}
else if ((rc == 39) || (rc == 112)){
errno = EAGAIN;
ret = -1;
}
else if ((rc == 109) || (rc == 230) || (rc == 233)){
errno = EPIPE;
ret = -1;
}
else if (rc == 6){
errno=EBADF;
ret = -1;
}
else {
PRMSG(2,"(Os2Write)Unknown return code from DosWrite, fd %d rc=%d\n", ciptr->fd,rc,0 );
errno = EINVAL;
ret = -1;
}
return (ret);
}
static int
TRANS(Os2Readv)(XtransConnInfo ciptr, struct iovec *buf, int size)
{
int ret;
PRMSG(2,"Os2Readv(%d,%x,%d)\n", ciptr->fd, buf, size );
ret = READV(ciptr,buf,size);
if ((ret <0) && (errno == EINVAL)) errno = EPIPE;
return (ret);
}
static int
TRANS(Os2Writev)(XtransConnInfo ciptr, struct iovec *buf, int size)
{
int ret;
PRMSG(2,"Os2Writev(%d,%x,%d)\n", ciptr->fd, buf, size );
ret = WRITEV(ciptr,buf,size);
if ((ret <0) && (errno == EINVAL)) errno = EPIPE;
if ((ret <0) && (errno == ENOSPC)) errno = EAGAIN;
return (ret);
}
static int
TRANS(Os2Disconnect)(XtransConnInfo ciptr)
{
PRMSG(2,"Os2Disconnect(%x->%d)\n", ciptr, ciptr->fd, 0);
return 0;
}
static int
TRANS(Os2Close)(XtransConnInfo ciptr)
{
int ret;
PRMSG(2,"Os2Close(%x->%d)\n", ciptr, ciptr->fd ,0);
ret=close(ciptr->fd);
return ret;
}
static int
TRANS(Os2CloseForCloning)(XtransConnInfo ciptr)
{
int ret;
PRMSG(2,"Os2CloseForCloning(%x->%d)\n", ciptr, ciptr->fd ,0);
ret=close(ciptr->fd);
return ret;
}
Xtransport TRANS(OS2LocalFuncs) = {
/* Local Interface */
"local",
TRANS_LOCAL,
#ifdef TRANS_CLIENT
TRANS(Os2OpenCOTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
NULL,
TRANS(Os2OpenCOTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(Os2OpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(Os2OpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
TRANS(Os2ReopenCOTSServer),
TRANS(Os2ReopenCLTSServer),
#endif
TRANS(Os2SetOption),
#ifdef TRANS_SERVER
TRANS(Os2CreateListener),
NULL, /* ResetListener */
TRANS(Os2Accept),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(Os2Connect),
#endif /* TRANS_CLIENT */
TRANS(Os2BytesReadable),
TRANS(Os2Read),
TRANS(Os2Write),
TRANS(Os2Readv),
TRANS(Os2Writev),
TRANS(Os2Disconnect),
TRANS(Os2Close),
TRANS(Os2CloseForCloning),
};
#ifdef XSERV_t
/* This function is used in the server to initialize the semaphore used with pipes */
BOOL init_server_pipes()
{
static BOOL first_time=TRUE;
ULONG rc;
if(first_time){
rc = DosCreateEventSem(NULL, &hPipeSem,DC_SEM_SHARED,FALSE);
if (rc){
PRMSG(1,"Os2OpenListener (init_server_pipes): Could not create pipe semaphore, rc=%d\n",
rc,0,0);
return(FALSE);
}
first_time=FALSE;
}
return(TRUE);
}
#endif /* XSERV_t */
...@@ -24,9 +24,30 @@ ...@@ -24,9 +24,30 @@
/**************************************************************************/ /**************************************************************************/
/* /*
* 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 Copyright 1993, 1994, 1998 The Open Group
Copyright 2002 Sun Microsystems, Inc. All rights reserved.
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that
...@@ -50,9 +71,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -50,9 +71,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from the copyright holders. from the copyright holders.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -108,21 +127,14 @@ from the copyright holders. ...@@ -108,21 +127,14 @@ from the copyright holders.
#ifdef UNIXCONN #ifdef UNIXCONN
#ifndef X_NO_SYS_UN #ifndef X_NO_SYS_UN
#ifndef Lynx
#include <sys/un.h> #include <sys/un.h>
#else
#include <un.h>
#endif
#endif #endif
#include <sys/stat.h> #include <sys/stat.h>
#endif #endif
#if defined(hpux) || (defined(MOTOROLA) && defined(SYSV))
#define NO_TCP_H
#endif
#ifndef NO_TCP_H #ifndef NO_TCP_H
#if defined(__osf__) || defined(linux) || defined(__GLIBC__) || defined(AIXV5) #if defined(linux) || defined(__GLIBC__)
#include <sys/param.h> #include <sys/param.h>
#endif /* osf */ #endif /* osf */
#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__) #if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__DragonFly__)
...@@ -133,17 +145,11 @@ from the copyright holders. ...@@ -133,17 +145,11 @@ from the copyright holders.
#endif /* !NO_TCP_H */ #endif /* !NO_TCP_H */
#include <sys/ioctl.h> #include <sys/ioctl.h>
#if defined(SVR4) && !defined(DGUX) && !defined(_SEQUENT_) #if defined(SVR4) || defined(__SVR4)
#include <sys/filio.h> #include <sys/filio.h>
#endif #endif
#if (defined(i386) && defined(SYSV)) && !defined(SCO325) && !defined(sun) #include <unistd.h>
#include <net/errno.h>
#endif
#if (defined(i386) && defined(SYSV)) && (!defined(ISC) || !defined(I_NREAD) || defined(SCO325)) || defined(_SEQUENT_)
#include <sys/stropts.h>
#endif
#else /* !WIN32 */ #else /* !WIN32 */
...@@ -169,37 +175,10 @@ from the copyright holders. ...@@ -169,37 +175,10 @@ from the copyright holders.
#undef SO_DONTLINGER #undef SO_DONTLINGER
#endif #endif
#if defined(__UNIXOS2__)
#if defined(NOT_EMX09A)
static int IBMsockInit = 0;
#define SocketInitOnce()\
if (!IBMsockInit) {\
sock_init();\
IBMsockInit = 1;\
}
#undef EINTR
#define EINTR SOCEINTR
#undef EINVAL
#define EINVAL SOCEINVAL
#undef errno
#define errno sock_errno()
#undef close
#define close soclose
#undef ioctl
#define ioctl sockioctl
#else
#define SocketInitOnce() /**/
#endif
/* this is still not there */
#define SOCKET int
#else
/* others don't need this */ /* others don't need this */
#define SocketInitOnce() /**/ #define SocketInitOnce() /**/
#endif
#if defined(linux) #ifdef linux
#define HAVE_ABSTRACT_SOCKETS #define HAVE_ABSTRACT_SOCKETS
#endif #endif
...@@ -212,6 +191,7 @@ static int IBMsockInit = 0; ...@@ -212,6 +191,7 @@ static int IBMsockInit = 0;
#ifndef BACKLOG #ifndef BACKLOG
#define BACKLOG MIN_BACKLOG #define BACKLOG MIN_BACKLOG
#endif #endif
/* /*
* This is the Socket implementation of the X Transport service layer * This is the Socket implementation of the X Transport service layer
* *
...@@ -220,8 +200,8 @@ static int IBMsockInit = 0; ...@@ -220,8 +200,8 @@ static int IBMsockInit = 0;
* *
*/ */
typedef struct _Sockettrans2dev { typedef struct _Sockettrans2dev {
char *transname; const char *transname;
int family; int family;
int devcotsname; int devcotsname;
int devcltsname; int devcltsname;
...@@ -255,36 +235,6 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr); ...@@ -255,36 +235,6 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr);
#ifdef UNIXCONN #ifdef UNIXCONN
#ifdef hpux
#if defined(X11_t)
#define UNIX_PATH "/usr/spool/sockets/X11/"
#define UNIX_DIR "/usr/spool/sockets/X11"
#define OLD_UNIX_PATH "/tmp/.X11-unix/X"
#endif /* X11_t */
#if defined(XIM_t)
#define UNIX_PATH "/usr/spool/sockets/XIM/"
#define UNIX_DIR "/usr/spool/sockets/XIM"
#define OLD_UNIX_PATH "/tmp/.XIM-unix/XIM"
#endif /* XIM_t */
#if defined(FS_t) || defined(FONT_t)
#define UNIX_PATH "/usr/spool/sockets/fontserv/"
#define UNIX_DIR "/usr/spool/sockets/fontserv"
#endif /* FS_t || FONT_t */
#if defined(ICE_t)
#define UNIX_PATH "/usr/spool/sockets/ICE/"
#define UNIX_DIR "/usr/spool/sockets/ICE"
#endif /* ICE_t */
#if defined(TEST_t)
#define UNIX_PATH "/usr/spool/sockets/xtrans_test/"
#define UNIX_DIR "/usr/spool/sockets/xtrans_test"
#endif
#if defined(LBXPROXY_t)
#define UNIX_PATH "/usr/spool/sockets/X11/"
#define UNIX_DIR "/usr/spool/sockets/X11"
#endif
#else /* !hpux */
#if defined(X11_t) #if defined(X11_t)
#define UNIX_PATH "/tmp/.X11-unix/X" #define UNIX_PATH "/tmp/.X11-unix/X"
...@@ -302,16 +252,7 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr); ...@@ -302,16 +252,7 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr);
#define UNIX_PATH "/tmp/.ICE-unix/" #define UNIX_PATH "/tmp/.ICE-unix/"
#define UNIX_DIR "/tmp/.ICE-unix" #define UNIX_DIR "/tmp/.ICE-unix"
#endif /* ICE_t */ #endif /* ICE_t */
#if defined(TEST_t)
#define UNIX_PATH "/tmp/.Test-unix/test"
#define UNIX_DIR "/tmp/.Test-unix"
#endif
#if defined(LBXPROXY_t)
#define UNIX_PATH "/tmp/.X11-unix/X"
#define UNIX_DIR "/tmp/.X11-unix"
#endif
#endif /* hpux */
#endif /* UNIXCONN */ #endif /* UNIXCONN */
...@@ -321,17 +262,12 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr); ...@@ -321,17 +262,12 @@ static int TRANS(SocketINETClose) (XtransConnInfo ciptr);
#define MAXHOSTNAMELEN 255 #define MAXHOSTNAMELEN 255
#endif #endif
/* #if defined HAVE_SOCKLEN_T || (defined(IPv6) && defined(AF_INET6))
* This provides compatibility for apps linked against system libraries # define SOCKLEN_T socklen_t
* that don't have IPv6 support. #elif defined(SVR4) || defined(__SVR4) || defined(__SCO__)
*/ # define SOCKLEN_T size_t
#if defined(IPv6) && defined(AF_INET6) #else
static const struct in6_addr local_in6addr_any = IN6ADDR_ANY_INIT; # define SOCKLEN_T int
#pragma weak in6addr_any = local_in6addr_any
#ifndef __USLC__
#pragma weak getaddrinfo
#endif
static int haveIPv6 = 1;
#endif #endif
#ifndef X11_t #ifndef X11_t
...@@ -347,6 +283,10 @@ static int haveIPv6 = 1; ...@@ -347,6 +283,10 @@ static int haveIPv6 = 1;
#ifdef NX_TRANS_SOCKET #ifdef NX_TRANS_SOCKET
#ifdef XTRANS_SEND_FDS
#error XTRANS_SEND_FDS is unsupported for NX!
#endif
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
#include <nx/NX.h> #include <nx/NX.h>
...@@ -366,172 +306,8 @@ static _NXProxyConnInfo *_NXProxyConnInfoTab[NX_PROXY_CONN_LIMIT]; ...@@ -366,172 +306,8 @@ static _NXProxyConnInfo *_NXProxyConnInfoTab[NX_PROXY_CONN_LIMIT];
#endif /* #ifdef TRANS_CLIENT */ #endif /* #ifdef TRANS_CLIENT */
/* static char *_NXGetUnixDir(char *dir);
* Override the UNIX_DIR and UNIX_PATH settings and static char *_NXGetUnixPath(char *path);
* 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, 0, 0);
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, 0, 0);
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;
}
#ifdef hpux
static char *_NXGetOldUnixPath(char *path)
{
PRMSG (3, "_NXGetOldUnixPath(%s)\n", path, 0, 0);
if (strcmp(path, OLD_UNIX_PATH) == 0)
{
#ifdef NX_TRANS_TEST
fprintf(stderr, "_NXGetOldUnixPath: Returning X11 Unix path [%s].\n",
_NXGetUnixPath(path));
#endif
return _NXGetUnixPath(path);
}
#ifdef NX_TRANS_TEST
fprintf(stderr, "_NXGetOldUnixPath: Returning other old X11 Unix path [%s].\n", path);
#endif
return path;
}
#endif /* #ifdef hpux */
/* /*
* Forcibly close any connection attempt on the * Forcibly close any connection attempt on the
...@@ -549,7 +325,7 @@ void TRANS(SocketRejectConnection) (XtransConnInfo ciptr) ...@@ -549,7 +325,7 @@ void TRANS(SocketRejectConnection) (XtransConnInfo ciptr)
struct timeval t; struct timeval t;
int f; int f;
PRMSG (3, "SocketRejectConnection(%x)\n", ciptr, 0, 0); prmsg (3, "SocketRejectConnection(%p)\n", ciptr);
FD_ZERO(&fs); FD_ZERO(&fs);
FD_SET(ciptr -> fd, &fs); FD_SET(ciptr -> fd, &fs);
...@@ -570,7 +346,7 @@ void TRANS(SocketRejectConnection) (XtransConnInfo ciptr) ...@@ -570,7 +346,7 @@ void TRANS(SocketRejectConnection) (XtransConnInfo ciptr)
/* /*
* If there is one, close it. * If there is one, close it.
*/ */
if ((f = accept(ciptr -> fd, &sa, &sa_l)) >= 0) if ((f = accept(ciptr -> fd, &sa, &sa_l)) >= 0)
{ {
#ifdef NX_TRANS_TEST #ifdef NX_TRANS_TEST
...@@ -608,7 +384,7 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) () ...@@ -608,7 +384,7 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) ()
if ((ciptr = (XtransConnInfo) calloc (1, sizeof(struct _XtransConnInfo))) == NULL) if ((ciptr = (XtransConnInfo) calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
{ {
PRMSG (1, "SocketCreateConnInfo: malloc failed\n", 0, 0, 0); prmsg (1, "SocketCreateConnInfo: malloc failed\n");
return NULL; return NULL;
} }
...@@ -623,7 +399,7 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) () ...@@ -623,7 +399,7 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) ()
if (socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0) if (socketpair(PF_LOCAL, SOCK_STREAM, 0, fds) < 0)
{ {
PRMSG (1, "SocketCreateConnInfo: socketpair() failed.\n", 0, 0, 0); prmsg (1, "SocketCreateConnInfo: socketpair() failed.\n");
free ((char *) ciptr); free ((char *) ciptr);
return NULL; return NULL;
} }
...@@ -646,15 +422,15 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) () ...@@ -646,15 +422,15 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) ()
if (ciptr->fd >= NX_PROXY_CONN_LIMIT) if (ciptr->fd >= NX_PROXY_CONN_LIMIT)
{ {
PRMSG (1, "SocketCreateConnInfo: No space for a new _NXProxyConnInfo for [%d].\n", prmsg (1, "SocketCreateConnInfo: No space for a new _NXProxyConnInfo for [%d].\n",
ciptr->fd, 0, 0); ciptr->fd);
free ((char *) ciptr); free ((char *) ciptr);
return NULL; return NULL;
} }
else if (_NXProxyConnInfoTab[ciptr->fd] != NULL) else if (_NXProxyConnInfoTab[ciptr->fd] != NULL)
{ {
PRMSG (1, "SocketCreateConnInfo: _NXProxyConnInfo for [%d] is not NULL. Exiting.\n", prmsg (1, "SocketCreateConnInfo: _NXProxyConnInfo for [%d] is not NULL. Exiting.\n",
ciptr->fd, 0, 0); ciptr->fd);
exit(1); exit(1);
} }
...@@ -662,7 +438,7 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) () ...@@ -662,7 +438,7 @@ static XtransConnInfo TRANS(SocketCreateConnInfo) ()
if (_NXProxyConnInfoTab[ciptr->fd] == NULL) if (_NXProxyConnInfoTab[ciptr->fd] == NULL)
{ {
PRMSG (1, "SocketCreateConnInfo: Alloc of _NXProxyConnInfo failed.\n", 0, 0, 0); prmsg (1, "SocketCreateConnInfo: Alloc of _NXProxyConnInfo failed.\n");
free ((char *) ciptr); free ((char *) ciptr);
return NULL; return NULL;
} }
...@@ -702,21 +478,20 @@ static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, char *host, char ...@@ -702,21 +478,20 @@ static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, char *host, char
if (proxy_conn == NULL) if (proxy_conn == NULL)
{ {
PRMSG (1, "SocketConnectConnInfo: Pointer to _NXProxyConnInfo is NULL. Exiting.\n", 0, 0, 0); prmsg (1, "SocketConnectConnInfo: Pointer to _NXProxyConnInfo is NULL. Exiting.\n");
exit(1); exit(1);
} }
else if (_NXProxyConnInfoTab[ciptr->fd] != (_NXProxyConnInfo *) ciptr->priv) else if (_NXProxyConnInfoTab[ciptr->fd] != (_NXProxyConnInfo *) ciptr->priv)
{ {
PRMSG (1, "SocketConnectConnInfo: Can't find _NXProxyConnInfo in table. Exiting.\n", prmsg (1, "SocketConnectConnInfo: Can't find _NXProxyConnInfo in table. Exiting.\n");
0, 0, 0);
exit(1); exit(1);
} }
if (strlen(host) + strlen(port) + 1 >= 1023) if (strlen(host) + strlen(port) + 1 >= 1023)
{ {
PRMSG (1, "SocketConnectConnInfo: Length of NX display string '%s:%s' would exceed %d characters.\n", prmsg (1, "SocketConnectConnInfo: Length of NX display string '%s:%s' would exceed %d characters.\n",
host, port, 1023); host, port, 1023);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
...@@ -737,8 +512,8 @@ static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, char *host, char ...@@ -737,8 +512,8 @@ static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, char *host, char
#endif #endif
#endif #endif
{ {
PRMSG (1, "SocketConnectConnInfo: Cannot set close-on-exec on local NX descriptor [%d].\n", prmsg (1, "SocketConnectConnInfo: Cannot set close-on-exec on local NX descriptor [%d].\n",
proxy_conn -> local, 0, 0); proxy_conn -> local);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
...@@ -750,8 +525,7 @@ static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, char *host, char ...@@ -750,8 +525,7 @@ static int TRANS(SocketConnectConnInfo) (XtransConnInfo ciptr, char *host, char
if (NXTransCreate(NX_FD_ANY, NX_MODE_CLIENT, display) < 0) if (NXTransCreate(NX_FD_ANY, NX_MODE_CLIENT, display) < 0)
{ {
PRMSG (1, "SocketConnectConnInfo: Cannot create the NX transport.\n", prmsg (1, "SocketConnectConnInfo: Cannot create the NX transport.\n");
0, 0, 0);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
...@@ -781,28 +555,27 @@ static void TRANS(SocketCloseConnInfo) (XtransConnInfo ciptr) ...@@ -781,28 +555,27 @@ static void TRANS(SocketCloseConnInfo) (XtransConnInfo ciptr)
if (proxy_conn == NULL) if (proxy_conn == NULL)
{ {
PRMSG (1, "SocketCloseConnInfo: Pointer to _NXProxyConnInfo is NULL. Exiting.\n", 0, 0, 0); prmsg (1, "SocketCloseConnInfo: Pointer to _NXProxyConnInfo is NULL. Exiting.\n");
exit(1); exit(1);
} }
else if (ciptr->fd >= NX_PROXY_CONN_LIMIT || else if (ciptr->fd >= NX_PROXY_CONN_LIMIT ||
_NXProxyConnInfoTab[ciptr->fd] != (_NXProxyConnInfo *) ciptr->priv) _NXProxyConnInfoTab[ciptr->fd] != (_NXProxyConnInfo *) ciptr->priv)
{ {
PRMSG (1, "SocketCloseConnInfo: Can't find _NXProxyConnInfo in table. Exiting.\n", prmsg (1, "SocketCloseConnInfo: Can't find _NXProxyConnInfo in table. Exiting.\n");
0, 0, 0);
exit(1); exit(1);
} }
else if (_NXProxyConnInfoTab[ciptr->fd] -> info != ciptr || else if (_NXProxyConnInfoTab[ciptr->fd] -> info != ciptr ||
_NXProxyConnInfoTab[ciptr->fd] -> local != ciptr->fd) _NXProxyConnInfoTab[ciptr->fd] -> local != ciptr->fd)
{ {
PRMSG (1, "SocketCloseConnInfo: Invalid _NXProxyConnInfo structure for [%d]. Exiting.\n", prmsg (1, "SocketCloseConnInfo: Invalid _NXProxyConnInfo structure for [%d]. Exiting.\n",
ciptr->fd, 0, 0); ciptr->fd);
exit(1); exit(1);
} }
else if (proxy_conn->local < 0 || proxy_conn->remote < 0) else if (proxy_conn->local < 0 || proxy_conn->remote < 0)
{ {
PRMSG (1, "SocketCloseConnInfo: Invalid socket pair in NX connection for [%d]. Exiting.\n", prmsg (1, "SocketCloseConnInfo: Invalid socket pair in NX connection for [%d]. Exiting.\n",
ciptr->fd, 0, 0); ciptr->fd);
exit(1); exit(1);
} }
...@@ -846,7 +619,7 @@ int TRANS(SocketCongestionChange) (XtransConnInfo ciptr, int *state) ...@@ -846,7 +619,7 @@ int TRANS(SocketCongestionChange) (XtransConnInfo ciptr, int *state)
_NXProxyConnInfo *proxy_conn; _NXProxyConnInfo *proxy_conn;
PRMSG (3, "SocketCongestionChange(%x)\n", ciptr, 0, 0); prmsg (3, "SocketCongestionChange(%p)\n", ciptr);
proxy_conn = (_NXProxyConnInfo *) ciptr->priv; proxy_conn = (_NXProxyConnInfo *) ciptr->priv;
...@@ -893,12 +666,12 @@ int TRANS(SocketCongestionChange) (XtransConnInfo ciptr, int *state) ...@@ -893,12 +666,12 @@ int TRANS(SocketCongestionChange) (XtransConnInfo ciptr, int *state)
*/ */
static int static int
TRANS(SocketSelectFamily) (int first, char *family) TRANS(SocketSelectFamily) (int first, const char *family)
{ {
int i; int i;
PRMSG (3,"SocketSelectFamily(%s)\n", family, 0, 0); prmsg (3,"SocketSelectFamily(%s)\n", family);
for (i = first + 1; i < NUMSOCKETFAMILIES;i++) for (i = first + 1; i < NUMSOCKETFAMILIES;i++)
{ {
...@@ -921,40 +694,32 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr) ...@@ -921,40 +694,32 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
{ {
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
struct sockaddr_storage socknamev6; struct sockaddr_storage socknamev6;
#endif
struct sockaddr_in socknamev4;
void *socknamePtr;
#if defined(SVR4) || defined(__SCO__)
# define SOCKLEN_T_PTR void*
size_t namelen;
#else #else
# define SOCKLEN_T_PTR socklen_t* struct sockaddr_in socknamev4;
socklen_t namelen;
#endif #endif
void *socknamePtr;
SOCKLEN_T namelen;
PRMSG (3,"SocketINETGetAddr(%p)\n", ciptr, 0, 0); prmsg (3,"SocketINETGetAddr(%p)\n", ciptr);
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
if (haveIPv6)
{
namelen = sizeof(socknamev6); namelen = sizeof(socknamev6);
socknamePtr = &socknamev6; socknamePtr = &socknamev6;
} #else
else
#endif
{
namelen = sizeof(socknamev4); namelen = sizeof(socknamev4);
socknamePtr = &socknamev4; socknamePtr = &socknamev4;
} #endif
bzero(socknamePtr, namelen);
if (getsockname (ciptr->fd,(struct sockaddr *) socknamePtr, if (getsockname (ciptr->fd,(struct sockaddr *) socknamePtr,
(SOCKLEN_T_PTR)&namelen) < 0) (void *)&namelen) < 0)
{ {
#ifdef WIN32 #ifdef WIN32
errno = WSAGetLastError(); errno = WSAGetLastError();
#endif #endif
PRMSG (1,"SocketINETGetAddr: getsockname() failed: %d\n", prmsg (1,"SocketINETGetAddr: getsockname() failed: %d\n",
EGET(),0, 0); EGET());
return -1; return -1;
} }
...@@ -962,24 +727,18 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr) ...@@ -962,24 +727,18 @@ TRANS(SocketINETGetAddr) (XtransConnInfo ciptr)
* Everything looks good: fill in the XtransConnInfo structure. * Everything looks good: fill in the XtransConnInfo structure.
*/ */
if ((ciptr->addr = (char *) malloc (namelen)) == NULL) if ((ciptr->addr = malloc (namelen)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketINETGetAddr: Can't allocate space for the addr\n", "SocketINETGetAddr: Can't allocate space for the addr\n");
0, 0, 0);
return -1; return -1;
} }
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
if (haveIPv6)
{
ciptr->family = ((struct sockaddr *)socknamePtr)->sa_family; ciptr->family = ((struct sockaddr *)socknamePtr)->sa_family;
} #else
else
#endif
{
ciptr->family = socknamev4.sin_family; ciptr->family = socknamev4.sin_family;
} #endif
ciptr->addrlen = namelen; ciptr->addrlen = namelen;
memcpy (ciptr->addr, socknamePtr, ciptr->addrlen); memcpy (ciptr->addr, socknamePtr, ciptr->addrlen);
...@@ -1001,14 +760,10 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr) ...@@ -1001,14 +760,10 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr)
#endif #endif
struct sockaddr_in socknamev4; struct sockaddr_in socknamev4;
void *socknamePtr; void *socknamePtr;
#if defined(SVR4) || defined(__SCO__) SOCKLEN_T namelen;
size_t namelen;
#else
int namelen;
#endif
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
if (haveIPv6 && ciptr->family == AF_INET6) if (ciptr->family == AF_INET6)
{ {
namelen = sizeof(socknamev6); namelen = sizeof(socknamev6);
socknamePtr = &socknamev6; socknamePtr = &socknamev6;
...@@ -1020,7 +775,9 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr) ...@@ -1020,7 +775,9 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr)
socknamePtr = &socknamev4; socknamePtr = &socknamev4;
} }
PRMSG (3,"SocketINETGetPeerAddr(%p)\n", ciptr, 0, 0); bzero(socknamePtr, namelen);
prmsg (3,"SocketINETGetPeerAddr(%p)\n", ciptr);
if (getpeername (ciptr->fd, (struct sockaddr *) socknamePtr, if (getpeername (ciptr->fd, (struct sockaddr *) socknamePtr,
(void *)&namelen) < 0) (void *)&namelen) < 0)
...@@ -1028,8 +785,8 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr) ...@@ -1028,8 +785,8 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr)
#ifdef WIN32 #ifdef WIN32
errno = WSAGetLastError(); errno = WSAGetLastError();
#endif #endif
PRMSG (1,"SocketINETGetPeerAddr: getpeername() failed: %d\n", prmsg (1,"SocketINETGetPeerAddr: getpeername() failed: %d\n",
EGET(), 0, 0); EGET());
return -1; return -1;
} }
...@@ -1037,11 +794,10 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr) ...@@ -1037,11 +794,10 @@ TRANS(SocketINETGetPeerAddr) (XtransConnInfo ciptr)
* Everything looks good: fill in the XtransConnInfo structure. * Everything looks good: fill in the XtransConnInfo structure.
*/ */
if ((ciptr->peeraddr = (char *) malloc (namelen)) == NULL) if ((ciptr->peeraddr = malloc (namelen)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketINETGetPeerAddr: Can't allocate space for the addr\n", "SocketINETGetPeerAddr: Can't allocate space for the addr\n");
0, 0, 0);
return -1; return -1;
} }
...@@ -1058,20 +814,11 @@ TRANS(SocketOpen) (int i, int type) ...@@ -1058,20 +814,11 @@ TRANS(SocketOpen) (int i, int type)
{ {
XtransConnInfo ciptr; XtransConnInfo ciptr;
PRMSG (3,"SocketOpen(%d,%d)\n", i, type, 0); prmsg (3,"SocketOpen(%d,%d)\n", i, type);
#if defined(IPv6) && defined(AF_INET6)
if (getaddrinfo == NULL)
haveIPv6 = 0;
if (!haveIPv6 && Sockettrans2devtab[i].family == AF_INET6)
return NULL;
#endif
if ((ciptr = (XtransConnInfo) calloc ( if ((ciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
1, sizeof(struct _XtransConnInfo))) == NULL)
{ {
PRMSG (1, "SocketOpen: malloc failed\n", 0, 0, 0); prmsg (1, "SocketOpen: malloc failed\n");
return NULL; return NULL;
} }
...@@ -1079,17 +826,17 @@ TRANS(SocketOpen) (int i, int type) ...@@ -1079,17 +826,17 @@ TRANS(SocketOpen) (int i, int type)
Sockettrans2devtab[i].protocol)) < 0 Sockettrans2devtab[i].protocol)) < 0
#ifndef WIN32 #ifndef WIN32
#if (defined(X11_t) && !defined(USE_POLL)) || defined(FS_t) || defined(FONT_t) #if (defined(X11_t) && !defined(USE_POLL)) || defined(FS_t) || defined(FONT_t)
|| ciptr->fd >= TRANS_OPEN_MAX || ciptr->fd >= sysconf(_SC_OPEN_MAX)
#endif #endif
#endif #endif
) { ) {
#ifdef WIN32 #ifdef WIN32
errno = WSAGetLastError(); errno = WSAGetLastError();
#endif #endif
PRMSG (2, "SocketOpen: socket() failed for %s\n", prmsg (2, "SocketOpen: socket() failed for %s\n",
Sockettrans2devtab[i].transname, 0, 0); Sockettrans2devtab[i].transname);
free ((char *) ciptr); free (ciptr);
return NULL; return NULL;
} }
...@@ -1110,6 +857,27 @@ TRANS(SocketOpen) (int i, int type) ...@@ -1110,6 +857,27 @@ TRANS(SocketOpen) (int i, int type)
} }
#endif #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; return ciptr;
} }
...@@ -1117,22 +885,82 @@ TRANS(SocketOpen) (int i, int type) ...@@ -1117,22 +885,82 @@ TRANS(SocketOpen) (int i, int type)
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
static XtransConnInfo static XtransConnInfo
TRANS(SocketReopen) (int i, int type, int fd, char *port) TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, const char *port)
{ {
XtransConnInfo ciptr; XtransConnInfo ciptr;
int portlen;
struct sockaddr *addr;
size_t addrlen;
PRMSG (3,"SocketReopen(%d,%d,%s)\n", type, fd, port); 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 = (XtransConnInfo) calloc ( if ((ciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
1, sizeof(struct _XtransConnInfo))) == NULL)
{ {
PRMSG (1, "SocketReopen: malloc failed\n", 0, 0, 0); prmsg (1, "SocketReopen: malloc(ciptr) failed\n");
return NULL; return NULL;
} }
ciptr->fd = fd; 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; return ciptr;
} }
...@@ -1146,13 +974,13 @@ TRANS(SocketReopen) (int i, int type, int fd, char *port) ...@@ -1146,13 +974,13 @@ TRANS(SocketReopen) (int i, int type, int fd, char *port)
#ifdef TRANS_CLIENT #ifdef TRANS_CLIENT
static XtransConnInfo static XtransConnInfo
TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol, TRANS(SocketOpenCOTSClientBase) (const char *transname, const char *protocol,
char *host, char *port, int previndex) const char *host, const char *port, int previndex)
{ {
XtransConnInfo ciptr; XtransConnInfo ciptr;
int i = previndex; int i = previndex;
PRMSG (2, "SocketOpenCOTSClient(%s,%s,%s)\n", prmsg (2, "SocketOpenCOTSClient(%s,%s,%s)\n",
protocol, host, port); protocol, host, port);
SocketInitOnce(); SocketInitOnce();
...@@ -1168,8 +996,8 @@ TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol, ...@@ -1168,8 +996,8 @@ TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol,
if (ciptr == NULL) if (ciptr == NULL)
{ {
PRMSG (1, "SocketOpenCOTSClient: Unable to create the NX connection info for %s.\n", prmsg (1, "SocketOpenCOTSClient: Unable to create the NX connection info for %s.\n",
transname, 0, 0); transname);
return NULL; return NULL;
} }
...@@ -1182,16 +1010,20 @@ TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol, ...@@ -1182,16 +1010,20 @@ TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol,
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
if ((ciptr = TRANS(SocketOpen) ( if ((ciptr = TRANS(SocketOpen) (
i, Sockettrans2devtab[i].devcotsname)) != NULL) i, Sockettrans2devtab[i].devcotsname)) != NULL) {
/* Save the index for later use */
ciptr->index = i;
break; break;
}
} }
if (i < 0) { if (i < 0) {
if (i == -1) if (i == -1)
PRMSG (1,"SocketOpenCOTSClient: Unable to open socket for %s\n", prmsg (1,"SocketOpenCOTSClient: Unable to open socket for %s\n",
transname, 0, 0); transname);
else else
PRMSG (1,"SocketOpenCOTSClient: Unable to determine socket type for %s\n", prmsg (1,"SocketOpenCOTSClient: Unable to determine socket type for %s\n",
transname, 0, 0); transname);
return NULL; return NULL;
} }
...@@ -1201,16 +1033,12 @@ TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol, ...@@ -1201,16 +1033,12 @@ TRANS(SocketOpenCOTSClientBase) (char *transname, char *protocol,
#endif #endif
/* Save the index for later use */
ciptr->index = i;
return ciptr; return ciptr;
} }
static XtransConnInfo static XtransConnInfo
TRANS(SocketOpenCOTSClient) (Xtransport *thistrans, char *protocol, TRANS(SocketOpenCOTSClient) (Xtransport *thistrans, const char *protocol,
char *host, char *port) const char *host, const char *port)
{ {
return TRANS(SocketOpenCOTSClientBase)( return TRANS(SocketOpenCOTSClientBase)(
thistrans->TransName, protocol, host, port, -1); thistrans->TransName, protocol, host, port, -1);
...@@ -1223,14 +1051,14 @@ TRANS(SocketOpenCOTSClient) (Xtransport *thistrans, char *protocol, ...@@ -1223,14 +1051,14 @@ TRANS(SocketOpenCOTSClient) (Xtransport *thistrans, char *protocol,
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static XtransConnInfo static XtransConnInfo
TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, char *protocol, TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, const char *protocol,
char *host, char *port) const char *host, const char *port)
{ {
XtransConnInfo ciptr; XtransConnInfo ciptr;
int i = -1; int i = -1;
PRMSG (2,"SocketOpenCOTSServer(%s,%s,%s)\n", protocol, host, port); prmsg (2,"SocketOpenCOTSServer(%s,%s,%s)\n", protocol, host, port);
SocketInitOnce(); SocketInitOnce();
...@@ -1241,11 +1069,11 @@ TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, char *protocol, ...@@ -1241,11 +1069,11 @@ TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, char *protocol,
} }
if (i < 0) { if (i < 0) {
if (i == -1) if (i == -1)
PRMSG (1,"SocketOpenCOTSServer: Unable to open socket for %s\n", prmsg (1,"SocketOpenCOTSServer: Unable to open socket for %s\n",
thistrans->TransName, 0, 0); thistrans->TransName);
else else
PRMSG (1,"SocketOpenCOTSServer: Unable to determine socket type for %s\n", prmsg (1,"SocketOpenCOTSServer: Unable to determine socket type for %s\n",
thistrans->TransName, 0, 0); thistrans->TransName);
return NULL; return NULL;
} }
...@@ -1287,165 +1115,17 @@ TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, char *protocol, ...@@ -1287,165 +1115,17 @@ TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, char *protocol,
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(SocketOpenCLTSClient) (Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
int i = -1;
PRMSG (2,"SocketOpenCLTSClient(%s,%s,%s)\n", protocol, host, port);
SocketInitOnce();
while ((i = TRANS(SocketSelectFamily) (i, thistrans->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, "SocketOpenCLTSClient: Unable to create the NX connection info for %s.\n",
thistrans->TransName, 0, 0);
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)
break;
}
if (i < 0) {
if (i == -1)
PRMSG (1,"SocketOpenCLTSClient: Unable to open socket for %s\n",
thistrans->TransName, 0, 0);
else
PRMSG (1,"SocketOpenCLTSClient: Unable to determine socket type for %s\n",
thistrans->TransName, 0, 0);
return NULL;
}
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
ciptr->priv = NULL;
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
/* Save the index for later use */
ciptr->index = i;
return ciptr;
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(SocketOpenCLTSServer) (Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
int i = -1;
PRMSG (2,"SocketOpenCLTSServer(%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,"SocketOpenCLTSServer: Unable to open socket for %s\n",
thistrans->TransName, 0, 0);
else
PRMSG (1,"SocketOpenCLTSServer: Unable to determine socket type for %s\n",
thistrans->TransName, 0, 0);
return NULL;
}
#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 #ifdef TRANS_REOPEN
static XtransConnInfo static XtransConnInfo
TRANS(SocketReopenCOTSServer) (Xtransport *thistrans, int fd, char *port) TRANS(SocketReopenCOTSServer) (Xtransport *thistrans, int fd, const char *port)
{
XtransConnInfo ciptr;
int i = -1;
PRMSG (2,
"SocketReopenCOTSServer(%d, %s)\n", fd, port, 0);
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, 0, 0);
else
PRMSG (1,"SocketReopenCOTSServer: Unable to determine socket type for %s\n",
thistrans->TransName, 0, 0);
return NULL;
}
/* Save the index for later use */
ciptr->index = i;
return ciptr;
}
static XtransConnInfo
TRANS(SocketReopenCLTSServer) (Xtransport *thistrans, int fd, char *port)
{ {
XtransConnInfo ciptr; XtransConnInfo ciptr;
int i = -1; int i = -1;
PRMSG (2, prmsg (2,
"SocketReopenCLTSServer(%d, %s)\n", fd, port, 0); "SocketReopenCOTSServer(%d, %s)\n", fd, port);
SocketInitOnce(); SocketInitOnce();
...@@ -1456,11 +1136,11 @@ TRANS(SocketReopenCLTSServer) (Xtransport *thistrans, int fd, char *port) ...@@ -1456,11 +1136,11 @@ TRANS(SocketReopenCLTSServer) (Xtransport *thistrans, int fd, char *port)
} }
if (i < 0) { if (i < 0) {
if (i == -1) if (i == -1)
PRMSG (1,"SocketReopenCLTSServer: Unable to open socket for %s\n", prmsg (1,"SocketReopenCOTSServer: Unable to open socket for %s\n",
thistrans->TransName, 0, 0); thistrans->TransName);
else else
PRMSG (1,"SocketReopenCLTSServer: Unable to determine socket type for %s\n", prmsg (1,"SocketReopenCOTSServer: Unable to determine socket type for %s\n",
thistrans->TransName, 0, 0); thistrans->TransName);
return NULL; return NULL;
} }
...@@ -1478,7 +1158,7 @@ static int ...@@ -1478,7 +1158,7 @@ static int
TRANS(SocketSetOption) (XtransConnInfo ciptr, int option, int arg) TRANS(SocketSetOption) (XtransConnInfo ciptr, int option, int arg)
{ {
PRMSG (2,"SocketSetOption(%d,%d,%d)\n", ciptr->fd, option, arg); prmsg (2,"SocketSetOption(%d,%d,%d)\n", ciptr->fd, option, arg);
#ifdef NX_TRANS_TEST #ifdef NX_TRANS_TEST
fprintf(stderr, "SocketSetOption: WARNING! Not setting option [%d] with value [%d] on descriptor [%d].\n", fprintf(stderr, "SocketSetOption: WARNING! Not setting option [%d] with value [%d] on descriptor [%d].\n",
...@@ -1519,16 +1199,16 @@ set_sun_path(const char *port, const char *upath, char *path, int abstract) ...@@ -1519,16 +1199,16 @@ set_sun_path(const char *port, const char *upath, char *path, int abstract)
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
static int static int
TRANS(SocketCreateListener) (XtransConnInfo ciptr, TRANS(SocketCreateListener) (XtransConnInfo ciptr,
struct sockaddr *sockname, struct sockaddr *sockname,
int socknamelen, unsigned int flags) int socknamelen, unsigned int flags)
{ {
int namelen = socknamelen; SOCKLEN_T namelen = socknamelen;
int fd = ciptr->fd; int fd = ciptr->fd;
int retry; int retry;
PRMSG (3, "SocketCreateListener(%x,%p)\n", ciptr, fd, 0); prmsg (3, "SocketCreateListener(%p,%d)\n", ciptr, fd);
if (Sockettrans2devtab[ciptr->index].family == AF_INET if (Sockettrans2devtab[ciptr->index].family == AF_INET
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
...@@ -1552,10 +1232,9 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr, ...@@ -1552,10 +1232,9 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr,
else else
return TRANS_ADDR_IN_USE; return TRANS_ADDR_IN_USE;
} }
if (retry-- == 0) { if (retry-- == 0) {
PRMSG (1, "SocketCreateListener: failed to bind listener\n", prmsg (1, "SocketCreateListener: failed to bind listener\n");
0, 0, 0);
close (fd); close (fd);
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
} }
...@@ -1586,11 +1265,11 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr, ...@@ -1586,11 +1265,11 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr,
if (listen (fd, BACKLOG) < 0) if (listen (fd, BACKLOG) < 0)
{ {
PRMSG (1, "SocketCreateListener: listen() failed\n", 0, 0, 0); prmsg (1, "SocketCreateListener: listen() failed\n");
close (fd); close (fd);
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
} }
/* Set a flag to indicate that this connection is a listener */ /* Set a flag to indicate that this connection is a listener */
ciptr->flags = 1 | (ciptr->flags & TRANS_KEEPFLAGS); ciptr->flags = 1 | (ciptr->flags & TRANS_KEEPFLAGS);
...@@ -1605,7 +1284,8 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr, ...@@ -1605,7 +1284,8 @@ TRANS(SocketCreateListener) (XtransConnInfo ciptr,
#ifdef TCPCONN #ifdef TCPCONN
static int static int
TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int flags) TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, const char *port,
unsigned int flags)
{ {
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
...@@ -1614,7 +1294,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int ...@@ -1614,7 +1294,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int
struct sockaddr_in sockname; struct sockaddr_in sockname;
#endif #endif
unsigned short sport; unsigned short sport;
int namelen = sizeof(sockname); SOCKLEN_T namelen = sizeof(sockname);
int status; int status;
long tmpport; long tmpport;
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS #ifdef XTHREADS_NEEDS_BYNAMEPARAMS
...@@ -1625,8 +1305,8 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int ...@@ -1625,8 +1305,8 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int
#ifdef X11_t #ifdef X11_t
char portbuf[PORTBUFSIZE]; char portbuf[PORTBUFSIZE];
#endif #endif
PRMSG (2, "SocketINETCreateListener(%s)\n", port, 0, 0); prmsg (2, "SocketINETCreateListener(%s)\n", port);
#ifdef X11_t #ifdef X11_t
/* /*
...@@ -1642,7 +1322,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int ...@@ -1642,7 +1322,7 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int
{ {
/* fixup the server port address */ /* fixup the server port address */
tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10); tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
sprintf (portbuf,"%lu", tmpport); snprintf (portbuf, sizeof(portbuf), "%lu", tmpport);
port = portbuf; port = portbuf;
} }
#endif #endif
...@@ -1655,9 +1335,9 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int ...@@ -1655,9 +1335,9 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int
{ {
if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL) if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketINETCreateListener: Unable to get service for %s\n", "SocketINETCreateListener: Unable to get service for %s\n",
port, 0, 0); port);
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
} }
/* we trust getservbyname to return a valid number */ /* we trust getservbyname to return a valid number */
...@@ -1666,11 +1346,11 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int ...@@ -1666,11 +1346,11 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int
else else
{ {
tmpport = strtol (port, (char**)NULL, 10); tmpport = strtol (port, (char**)NULL, 10);
/* /*
* check that somehow the port address isn't negative or in * check that somehow the port address isn't negative or in
* the range of reserved port addresses. This can happen and * the range of reserved port addresses. This can happen and
* be very bad if the server is suid-root and the user does * be very bad if the server is suid-root and the user does
* something (dumb) like `X :60049`. * something (dumb) like `X :60049`.
*/ */
if (tmpport < 1024 || tmpport > USHRT_MAX) if (tmpport < 1024 || tmpport > USHRT_MAX)
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
...@@ -1712,30 +1392,28 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int ...@@ -1712,30 +1392,28 @@ TRANS(SocketINETCreateListener) (XtransConnInfo ciptr, char *port, unsigned int
if ((status = TRANS(SocketCreateListener) (ciptr, if ((status = TRANS(SocketCreateListener) (ciptr,
(struct sockaddr *) &sockname, namelen, flags)) < 0) (struct sockaddr *) &sockname, namelen, flags)) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketINETCreateListener: ...SocketCreateListener() failed\n", "SocketINETCreateListener: ...SocketCreateListener() failed\n");
0, 0, 0);
return status; return status;
} }
if (TRANS(SocketINETGetAddr) (ciptr) < 0) if (TRANS(SocketINETGetAddr) (ciptr) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketINETCreateListener: ...SocketINETGetAddr() failed\n", "SocketINETCreateListener: ...SocketINETGetAddr() failed\n");
0, 0, 0);
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
} }
return 0; return 0;
} }
#endif /* SOCKCONN */ #endif /* TCPCONN */
#ifdef UNIXCONN #ifdef UNIXCONN
static int static int
TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, const char *port,
unsigned int flags) unsigned int flags)
{ {
...@@ -1751,8 +1429,8 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, ...@@ -1751,8 +1429,8 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
abstract = ciptr->transptr->flags & TRANS_ABSTRACT; abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
#endif #endif
PRMSG (2, "SocketUNIXCreateListener(%s)\n", prmsg (2, "SocketUNIXCreateListener(%s)\n",
port ? port : "NULL", 0, 0); port ? port : "NULL");
/* Make sure the directory is created */ /* Make sure the directory is created */
...@@ -1766,12 +1444,12 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, ...@@ -1766,12 +1444,12 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
#endif #endif
#ifdef NX_TRANS_SOCKET #ifdef NX_TRANS_SOCKET
if (!abstract && trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) { if (!abstract && trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) {
PRMSG (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n", prmsg (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n",
_NXGetUnixDir(UNIX_DIR), errno, 0); _NXGetUnixDir(UNIX_DIR), errno);
#else #else
if (!abstract && trans_mkdir(UNIX_DIR, mode) == -1) { if (!abstract && trans_mkdir(UNIX_DIR, mode) == -1) {
PRMSG (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n", prmsg (1, "SocketUNIXCreateListener: mkdir(%s) failed, errno = %d\n",
UNIX_DIR, errno, 0); UNIX_DIR, errno);
#endif #endif
(void) umask (oldUmask); (void) umask (oldUmask);
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
...@@ -1785,28 +1463,23 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, ...@@ -1785,28 +1463,23 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
snprintf (tmpport, sizeof(tmpport), "%s%ld", UNIX_PATH, (long)getpid()); snprintf (tmpport, sizeof(tmpport), "%s%ld", UNIX_PATH, (long)getpid());
port = tmpport; port = tmpport;
} }
if (port && *port) {
#ifdef NX_TRANS_SOCKET #ifdef NX_TRANS_SOCKET
if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path, abstract) != 0) { if (set_sun_path(port, _NXGetUnixPath(UNIX_PATH), sockname.sun_path, abstract) != 0) {
#else #else
if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) { if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) {
#endif #endif
PRMSG (1, "SocketUNIXCreateListener: path too long\n", 0, 0, 0); prmsg (1, "SocketUNIXCreateListener: path too long\n");
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
} }
} else {
#ifdef NX_TRANS_SOCKET
sprintf (sockname.sun_path, "%s%ld", _NXGetUnixPath(UNIX_PATH), (long)getpid());
#else
sprintf (sockname.sun_path, "%s%ld", UNIX_PATH, (long)getpid());
#endif
}
#if (defined(BSD44SOCKETS) || defined(__UNIXWARE__)) && !defined(Lynx) #if (defined(BSD44SOCKETS) || defined(__UNIXWARE__))
sockname.sun_len = strlen(sockname.sun_path); sockname.sun_len = strlen(sockname.sun_path);
#endif
#if defined(BSD44SOCKETS) || defined(SUN_LEN)
namelen = SUN_LEN(&sockname); namelen = SUN_LEN(&sockname);
#else #else
namelen = strlen(sockname.sun_path) + sizeof(sockname.sun_family); namelen = strlen(sockname.sun_path) + offsetof(struct sockaddr_un, sun_path);
#endif #endif
#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST) #if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
...@@ -1823,9 +1496,8 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, ...@@ -1823,9 +1496,8 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
if ((status = TRANS(SocketCreateListener) (ciptr, if ((status = TRANS(SocketCreateListener) (ciptr,
(struct sockaddr *) &sockname, namelen, flags)) < 0) (struct sockaddr *) &sockname, namelen, flags)) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketUNIXCreateListener: ...SocketCreateListener() failed\n", "SocketUNIXCreateListener: ...SocketCreateListener() failed\n");
0, 0, 0);
(void) umask (oldUmask); (void) umask (oldUmask);
return status; return status;
} }
...@@ -1839,11 +1511,10 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, ...@@ -1839,11 +1511,10 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
namelen = sizeof (sockname); /* this will always make it the same size */ namelen = sizeof (sockname); /* this will always make it the same size */
if ((ciptr->addr = (char *) malloc (namelen)) == NULL) if ((ciptr->addr = malloc (namelen)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketUNIXCreateListener: Can't allocate space for the addr\n", "SocketUNIXCreateListener: Can't allocate space for the addr\n");
0, 0, 0);
(void) umask (oldUmask); (void) umask (oldUmask);
return TRANS_CREATE_LISTENER_FAILED; return TRANS_CREATE_LISTENER_FAILED;
} }
...@@ -1860,6 +1531,7 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port, ...@@ -1860,6 +1531,7 @@ TRANS(SocketUNIXCreateListener) (XtransConnInfo ciptr, char *port,
return 0; return 0;
} }
static int static int
TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr) TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr)
...@@ -1877,16 +1549,17 @@ TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr) ...@@ -1877,16 +1549,17 @@ TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr)
abstract = ciptr->transptr->flags & TRANS_ABSTRACT; abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
#endif #endif
PRMSG (3, "SocketUNIXResetListener(%p,%d)\n", ciptr, ciptr->fd, 0); prmsg (3, "SocketUNIXResetListener(%p,%d)\n", ciptr, ciptr->fd);
if (!abstract && ( if (!abstract && (
stat (unsock->sun_path, &statb) == -1 || stat (unsock->sun_path, &statb) == -1 ||
((statb.st_mode & S_IFMT) != ((statb.st_mode & S_IFMT) !=
#if (defined (sun) && defined(SVR4)) || defined(NCR) || defined(SCO325) || !defined(S_IFSOCK) #if defined(NCR) || defined(SCO325) || !defined(S_IFSOCK)
S_IFIFO)) S_IFIFO
#else #else
S_IFSOCK))) S_IFSOCK
#endif #endif
)))
{ {
int oldUmask = umask (0); int oldUmask = umask (0);
...@@ -1898,12 +1571,12 @@ TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr) ...@@ -1898,12 +1571,12 @@ TRANS(SocketUNIXResetListener) (XtransConnInfo ciptr)
#endif #endif
#ifdef NX_TRANS_SOCKET #ifdef NX_TRANS_SOCKET
if (trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) { if (trans_mkdir(_NXGetUnixDir(UNIX_DIR), mode) == -1) {
PRMSG (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n", prmsg (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n",
_NXGetUnixDir(UNIX_DIR), errno, 0); _NXGetUnixDir(UNIX_DIR), errno);
#else #else
if (trans_mkdir(UNIX_DIR, mode) == -1) { if (trans_mkdir(UNIX_DIR, mode) == -1) {
PRMSG (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n", prmsg (1, "SocketUNIXResetListener: mkdir(%s) failed, errno = %d\n",
UNIX_DIR, errno, 0); UNIX_DIR, errno);
#endif #endif
(void) umask (oldUmask); (void) umask (oldUmask);
return TRANS_RESET_FAILURE; return TRANS_RESET_FAILURE;
...@@ -1954,14 +1627,13 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status) ...@@ -1954,14 +1627,13 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status)
{ {
XtransConnInfo newciptr; XtransConnInfo newciptr;
struct sockaddr_in sockname; struct sockaddr_in sockname;
int namelen = sizeof(sockname); SOCKLEN_T namelen = sizeof(sockname);
PRMSG (2, "SocketINETAccept(%p,%d)\n", ciptr, ciptr->fd, 0); prmsg (2, "SocketINETAccept(%p,%d)\n", ciptr, ciptr->fd);
if ((newciptr = (XtransConnInfo) calloc ( if ((newciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
1, sizeof(struct _XtransConnInfo))) == NULL)
{ {
PRMSG (1, "SocketINETAccept: malloc failed\n", 0, 0, 0); prmsg (1, "SocketINETAccept: malloc failed\n");
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return NULL; return NULL;
} }
...@@ -1972,7 +1644,7 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status) ...@@ -1972,7 +1644,7 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status)
#ifdef WIN32 #ifdef WIN32
errno = WSAGetLastError(); errno = WSAGetLastError();
#endif #endif
PRMSG (1, "SocketINETAccept: accept() failed\n", 0, 0, 0); prmsg (1, "SocketINETAccept: accept() failed\n");
free (newciptr); free (newciptr);
*status = TRANS_ACCEPT_FAILED; *status = TRANS_ACCEPT_FAILED;
return NULL; return NULL;
...@@ -1991,15 +1663,14 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status) ...@@ -1991,15 +1663,14 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status)
#endif #endif
/* /*
* Get this address again because the transport may give a more * Get this address again because the transport may give a more
* specific address now that a connection is established. * specific address now that a connection is established.
*/ */
if (TRANS(SocketINETGetAddr) (newciptr) < 0) if (TRANS(SocketINETGetAddr) (newciptr) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketINETAccept: ...SocketINETGetAddr() failed:\n", "SocketINETAccept: ...SocketINETGetAddr() failed:\n");
0, 0, 0);
close (newciptr->fd); close (newciptr->fd);
free (newciptr); free (newciptr);
*status = TRANS_ACCEPT_MISC_ERROR; *status = TRANS_ACCEPT_MISC_ERROR;
...@@ -2008,9 +1679,8 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status) ...@@ -2008,9 +1679,8 @@ TRANS(SocketINETAccept) (XtransConnInfo ciptr, int *status)
if (TRANS(SocketINETGetPeerAddr) (newciptr) < 0) if (TRANS(SocketINETGetPeerAddr) (newciptr) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketINETAccept: ...SocketINETGetPeerAddr() failed:\n", "SocketINETAccept: ...SocketINETGetPeerAddr() failed:\n");
0, 0, 0);
close (newciptr->fd); close (newciptr->fd);
if (newciptr->addr) free (newciptr->addr); if (newciptr->addr) free (newciptr->addr);
free (newciptr); free (newciptr);
...@@ -2033,18 +1703,13 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status) ...@@ -2033,18 +1703,13 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
{ {
XtransConnInfo newciptr; XtransConnInfo newciptr;
struct sockaddr_un sockname; struct sockaddr_un sockname;
#if defined(SVR4) || defined(__SCO__) SOCKLEN_T namelen = sizeof sockname;
size_t namelen = sizeof sockname;
#else
int namelen = sizeof sockname;
#endif
PRMSG (2, "SocketUNIXAccept(%p,%d)\n", ciptr, ciptr->fd, 0); prmsg (2, "SocketUNIXAccept(%p,%d)\n", ciptr, ciptr->fd);
if ((newciptr = (XtransConnInfo) calloc ( if ((newciptr = calloc (1, sizeof(struct _XtransConnInfo))) == NULL)
1, sizeof(struct _XtransConnInfo))) == NULL)
{ {
PRMSG (1, "SocketUNIXAccept: malloc() failed\n", 0, 0, 0); prmsg (1, "SocketUNIXAccept: malloc() failed\n");
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return NULL; return NULL;
} }
...@@ -2052,29 +1717,28 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status) ...@@ -2052,29 +1717,28 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
if ((newciptr->fd = accept (ciptr->fd, if ((newciptr->fd = accept (ciptr->fd,
(struct sockaddr *) &sockname, (void *)&namelen)) < 0) (struct sockaddr *) &sockname, (void *)&namelen)) < 0)
{ {
PRMSG (1, "SocketUNIXAccept: accept() failed\n", 0, 0, 0); prmsg (1, "SocketUNIXAccept: accept() failed\n");
free (newciptr); free (newciptr);
*status = TRANS_ACCEPT_FAILED; *status = TRANS_ACCEPT_FAILED;
return NULL; return NULL;
} }
ciptr->addrlen = namelen;
/* /*
* Get the socket name and the peer name from the listener socket, * Get the socket name and the peer name from the listener socket,
* since this is unix domain. * since this is unix domain.
*/ */
if ((newciptr->addr = (char *) malloc (ciptr->addrlen)) == NULL) if ((newciptr->addr = malloc (ciptr->addrlen)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketUNIXAccept: Can't allocate space for the addr\n", "SocketUNIXAccept: Can't allocate space for the addr\n");
0, 0, 0);
close (newciptr->fd); close (newciptr->fd);
free (newciptr); free (newciptr);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return NULL; return NULL;
} }
/* /*
* if the socket is abstract, we already modified the address to have a * 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. * @ instead of the initial NUL, so no need to do that again here.
...@@ -2083,18 +1747,17 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status) ...@@ -2083,18 +1747,17 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
newciptr->addrlen = ciptr->addrlen; newciptr->addrlen = ciptr->addrlen;
memcpy (newciptr->addr, ciptr->addr, newciptr->addrlen); memcpy (newciptr->addr, ciptr->addr, newciptr->addrlen);
if ((newciptr->peeraddr = (char *) malloc (ciptr->addrlen)) == NULL) if ((newciptr->peeraddr = malloc (ciptr->addrlen)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketUNIXAccept: Can't allocate space for the addr\n", "SocketUNIXAccept: Can't allocate space for the addr\n");
0, 0, 0);
close (newciptr->fd); close (newciptr->fd);
if (newciptr->addr) free (newciptr->addr); if (newciptr->addr) free (newciptr->addr);
free (newciptr); free (newciptr);
*status = TRANS_ACCEPT_BAD_MALLOC; *status = TRANS_ACCEPT_BAD_MALLOC;
return NULL; return NULL;
} }
newciptr->peeraddrlen = ciptr->addrlen; newciptr->peeraddrlen = ciptr->addrlen;
memcpy (newciptr->peeraddr, ciptr->addr, newciptr->addrlen); memcpy (newciptr->peeraddr, ciptr->addr, newciptr->addrlen);
...@@ -2117,7 +1780,7 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status) ...@@ -2117,7 +1780,7 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
struct addrlist { struct addrlist {
struct addrinfo * addr; struct addrinfo * addr;
struct addrinfo * firstaddr; struct addrinfo * firstaddr;
char port[PORTBUFSIZE]; char port[PORTBUFSIZE];
char host[MAXHOSTNAMELEN]; char host[MAXHOSTNAMELEN];
}; };
...@@ -2126,7 +1789,8 @@ static struct addrlist *addrlist = NULL; ...@@ -2126,7 +1789,8 @@ static struct addrlist *addrlist = NULL;
static int static int
TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) TRANS(SocketINETConnect) (XtransConnInfo ciptr,
const char *host, const char *port)
{ {
struct sockaddr * socketaddr = NULL; struct sockaddr * socketaddr = NULL;
...@@ -2136,23 +1800,23 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2136,23 +1800,23 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
struct addrinfo hints; struct addrinfo hints;
char ntopbuf[INET6_ADDRSTRLEN]; char ntopbuf[INET6_ADDRSTRLEN];
int resetonce = 0; int resetonce = 0;
#endif #else
struct sockaddr_in sockname; struct sockaddr_in sockname;
struct hostent *hostp;
struct servent *servp;
unsigned long tmpaddr;
#endif
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS #ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams; _Xgethostbynameparams hparams;
_Xgetservbynameparams sparams; _Xgetservbynameparams sparams;
#endif #endif
struct hostent *hostp;
struct servent *servp;
unsigned long tmpaddr;
#ifdef X11_t #ifdef X11_t
char portbuf[PORTBUFSIZE]; char portbuf[PORTBUFSIZE];
#endif #endif
long tmpport;
char hostnamebuf[256]; /* tmp space */ char hostnamebuf[256]; /* tmp space */
PRMSG (2,"SocketINETConnect(%d,%s,%s)\n", ciptr->fd, host, port); prmsg (2,"SocketINETConnect(%d,%s,%s)\n", ciptr->fd, host, port);
if (!host) if (!host)
{ {
...@@ -2173,14 +1837,14 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2173,14 +1837,14 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
if (is_numeric (port)) if (is_numeric (port))
{ {
tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10); long tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
sprintf (portbuf, "%lu", tmpport); snprintf (portbuf, sizeof(portbuf), "%lu", tmpport);
port = portbuf; port = portbuf;
} }
#endif #endif
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
if (haveIPv6) { {
if (addrlist != NULL) { if (addrlist != NULL) {
if (strcmp(host,addrlist->host) || strcmp(port,addrlist->port)) { if (strcmp(host,addrlist->host) || strcmp(port,addrlist->port)) {
if (addrlist->firstaddr) if (addrlist->firstaddr)
...@@ -2203,7 +1867,7 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2203,7 +1867,7 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
res = getaddrinfo(host,port,&hints,&addrlist->firstaddr); res = getaddrinfo(host,port,&hints,&addrlist->firstaddr);
if (res != 0) { if (res != 0) {
PRMSG (1, "SocketINETConnect() can't get address " prmsg (1, "SocketINETConnect() can't get address "
"for %s:%s: %s\n", host, port, gai_strerror(res)); "for %s:%s: %s\n", host, port, gai_strerror(res));
ESET(EINVAL); ESET(EINVAL);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
...@@ -2212,24 +1876,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2212,24 +1876,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
addrlist->addr ; res++) { addrlist->addr ; res++) {
addrlist->addr = addrlist->addr->ai_next; addrlist->addr = addrlist->addr->ai_next;
} }
PRMSG(4,"Got New Address list with %d addresses\n", res, 0, 0); prmsg(4,"Got New Address list with %d addresses\n", res);
res = 0; res = 0;
addrlist->addr = NULL; addrlist->addr = NULL;
} }
while (socketaddr == NULL) { while (socketaddr == NULL) {
if (addrlist->addr == NULL) { if (addrlist->addr == NULL) {
if (resetonce) { if (resetonce) {
/* Already checked entire list - no usable addresses */ /* Already checked entire list - no usable addresses */
PRMSG (1, "SocketINETConnect() no usable address " prmsg (1, "SocketINETConnect() no usable address "
"for %s:%s\n", host, port, 0); "for %s:%s\n", host, port);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} else { } else {
/* Go back to beginning of list */ /* Go back to beginning of list */
resetonce = 1; resetonce = 1;
addrlist->addr = addrlist->firstaddr; addrlist->addr = addrlist->firstaddr;
} }
} }
socketaddr = addrlist->addr->ai_addr; socketaddr = addrlist->addr->ai_addr;
socketaddrlen = addrlist->addr->ai_addrlen; socketaddrlen = addrlist->addr->ai_addrlen;
...@@ -2237,12 +1901,12 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2237,12 +1901,12 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
if (addrlist->addr->ai_family == AF_INET) { if (addrlist->addr->ai_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in *) socketaddr; struct sockaddr_in *sin = (struct sockaddr_in *) socketaddr;
PRMSG (4,"SocketINETConnect() sockname.sin_addr = %s\n", prmsg (4,"SocketINETConnect() sockname.sin_addr = %s\n",
inet_ntop(addrlist->addr->ai_family,&sin->sin_addr, inet_ntop(addrlist->addr->ai_family,&sin->sin_addr,
ntopbuf,sizeof(ntopbuf)), 0, 0); ntopbuf,sizeof(ntopbuf)));
PRMSG (4,"SocketINETConnect() sockname.sin_port = %d\n", prmsg (4,"SocketINETConnect() sockname.sin_port = %d\n",
ntohs(sin->sin_port), 0, 0); ntohs(sin->sin_port));
if (Sockettrans2devtab[ciptr->index].family == AF_INET6) { if (Sockettrans2devtab[ciptr->index].family == AF_INET6) {
if (strcmp(Sockettrans2devtab[ciptr->index].transname, if (strcmp(Sockettrans2devtab[ciptr->index].transname,
...@@ -2264,26 +1928,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2264,26 +1928,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
Sockettrans2devtab[newciptr->index].family != Sockettrans2devtab[newciptr->index].family !=
AF_INET) { AF_INET) {
socketaddr = NULL; socketaddr = NULL;
PRMSG (4,"SocketINETConnect() Cannot get IPv4 " prmsg (4,"SocketINETConnect() Cannot get IPv4 "
" socketfor IPv4 address\n", 0,0,0); " socketfor IPv4 address\n");
} }
if (newciptr) if (newciptr)
free(newciptr); free(newciptr);
} else { } else {
socketaddr = NULL; socketaddr = NULL;
PRMSG (4,"SocketINETConnect Skipping IPv4 address\n", prmsg (4,"SocketINETConnect Skipping IPv4 address\n");
0,0,0);
} }
} }
} else if (addrlist->addr->ai_family == AF_INET6) { } else if (addrlist->addr->ai_family == AF_INET6) {
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) socketaddr; struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) socketaddr;
PRMSG (4,"SocketINETConnect() sockname.sin6_addr = %s\n", prmsg (4,"SocketINETConnect() sockname.sin6_addr = %s\n",
inet_ntop(addrlist->addr->ai_family, inet_ntop(addrlist->addr->ai_family,
&sin6->sin6_addr,ntopbuf,sizeof(ntopbuf)), &sin6->sin6_addr,ntopbuf,sizeof(ntopbuf)));
0, 0); prmsg (4,"SocketINETConnect() sockname.sin6_port = %d\n",
PRMSG (4,"SocketINETConnect() sockname.sin6_port = %d\n", ntohs(sin6->sin6_port));
ntohs(sin6->sin6_port), 0, 0);
if (Sockettrans2devtab[ciptr->index].family == AF_INET) { if (Sockettrans2devtab[ciptr->index].family == AF_INET) {
if (strcmp(Sockettrans2devtab[ciptr->index].transname, if (strcmp(Sockettrans2devtab[ciptr->index].transname,
...@@ -2302,8 +1964,8 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2302,8 +1964,8 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
Sockettrans2devtab[newciptr->index].family != Sockettrans2devtab[newciptr->index].family !=
AF_INET6) { AF_INET6) {
socketaddr = NULL; socketaddr = NULL;
PRMSG (4,"SocketINETConnect() Cannot get IPv6 " prmsg (4,"SocketINETConnect() Cannot get IPv6 "
"socket for IPv6 address\n", 0,0,0); "socket for IPv6 address\n");
} }
if (newciptr) if (newciptr)
free(newciptr); free(newciptr);
...@@ -2311,8 +1973,7 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2311,8 +1973,7 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
else else
{ {
socketaddr = NULL; socketaddr = NULL;
PRMSG (4,"SocketINETConnect() Skipping IPv6 address\n", prmsg (4,"SocketINETConnect() Skipping IPv6 address\n");
0,0,0);
} }
} }
} else { } else {
...@@ -2321,9 +1982,9 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2321,9 +1982,9 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
if (socketaddr == NULL) { if (socketaddr == NULL) {
addrlist->addr = addrlist->addr->ai_next; addrlist->addr = addrlist->addr->ai_next;
} }
} }
} else }
#endif #else
{ {
/* /*
* Build the socket name. * Build the socket name.
...@@ -2350,22 +2011,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2350,22 +2011,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
tmpaddr = INADDR_NONE; tmpaddr = INADDR_NONE;
} }
PRMSG (4,"SocketINETConnect() inet_addr(%s) = %x\n", host, tmpaddr, 0); prmsg (4,"SocketINETConnect() inet_addr(%s) = %x\n", host, tmpaddr);
if (tmpaddr == INADDR_NONE) { if (tmpaddr == INADDR_NONE) {
if ((hostp = _XGethostbyname(host,hparams)) == NULL) { if ((hostp = _XGethostbyname(host,hparams)) == NULL) {
PRMSG (1,"SocketINETConnect: Can't get address for %s\n", prmsg (1,"SocketINETConnect: Can't get address for %s\n",
host, 0, 0); host);
ESET(EINVAL); ESET(EINVAL);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
if (hostp->h_addrtype != AF_INET) { /* is IP host? */ if (hostp->h_addrtype != AF_INET) { /* is IP host? */
PRMSG (1,"SocketINETConnect: not INET host%s\n", host, 0, 0); prmsg (1,"SocketINETConnect: not INET host%s\n", host);
ESET(EPROTOTYPE); ESET(EPROTOTYPE);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
memcpy ((char *) &sockname.sin_addr, (char *) hostp->h_addr, memcpy ((char *) &sockname.sin_addr, (char *) hostp->h_addr,
sizeof (sockname.sin_addr)); sizeof (sockname.sin_addr));
} else { } else {
sockname.sin_addr.s_addr = tmpaddr; sockname.sin_addr.s_addr = tmpaddr;
} }
...@@ -2378,23 +2041,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2378,23 +2041,24 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
if (!is_numeric (port)) { if (!is_numeric (port)) {
if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL) { if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL) {
PRMSG (1,"SocketINETConnect: can't get service for %s\n", prmsg (1,"SocketINETConnect: can't get service for %s\n",
port, 0, 0); port);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
sockname.sin_port = htons (servp->s_port); sockname.sin_port = htons (servp->s_port);
} else { } else {
tmpport = strtol (port, (char**)NULL, 10); long tmpport = strtol (port, (char**)NULL, 10);
if (tmpport < 1024 || tmpport > USHRT_MAX) if (tmpport < 1024 || tmpport > USHRT_MAX)
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
sockname.sin_port = htons (((unsigned short) tmpport)); sockname.sin_port = htons (((unsigned short) tmpport));
} }
PRMSG (4,"SocketINETConnect: sockname.sin_port = %d\n", prmsg (4,"SocketINETConnect: sockname.sin_port = %d\n",
ntohs(sockname.sin_port), 0, 0); ntohs(sockname.sin_port));
socketaddr = (struct sockaddr *) &sockname; socketaddr = (struct sockaddr *) &sockname;
socketaddrlen = sizeof(sockname); socketaddrlen = sizeof(sockname);
} }
#endif
/* /*
* Turn on socket keepalive so the client process will eventually * Turn on socket keepalive so the client process will eventually
...@@ -2440,12 +2104,12 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2440,12 +2104,12 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
* number of errors that made us quit before, since those * number of errors that made us quit before, since those
* could be caused by trying to use an IPv6 address to contact * could be caused by trying to use an IPv6 address to contact
* a machine with an IPv4-only server or other reasons that * a machine with an IPv4-only server or other reasons that
* only affect one of a set of addresses. * only affect one of a set of addresses.
*/ */
if (olderrno == ECONNREFUSED || olderrno == EINTR if (olderrno == ECONNREFUSED || olderrno == EINTR
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
|| (haveIPv6 && ((addrlist->addr->ai_next != NULL) || || (((addrlist->addr->ai_next != NULL) ||
(addrlist->addr != addrlist->firstaddr)) && (addrlist->addr != addrlist->firstaddr)) &&
(olderrno == ENETUNREACH || olderrno == EAFNOSUPPORT || (olderrno == ENETUNREACH || olderrno == EAFNOSUPPORT ||
olderrno == EADDRNOTAVAIL || olderrno == ETIMEDOUT olderrno == EADDRNOTAVAIL || olderrno == ETIMEDOUT
...@@ -2460,38 +2124,36 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2460,38 +2124,36 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
res = TRANS_IN_PROGRESS; res = TRANS_IN_PROGRESS;
else else
{ {
PRMSG (2,"SocketINETConnect: Can't connect: errno = %d\n", prmsg (2,"SocketINETConnect: Can't connect: errno = %d\n",
olderrno,0, 0); olderrno);
res = TRANS_CONNECT_FAILED; res = TRANS_CONNECT_FAILED;
} }
} else { } else {
res = 0; res = 0;
/* /*
* Sync up the address fields of ciptr. * Sync up the address fields of ciptr.
*/ */
if (TRANS(SocketINETGetAddr) (ciptr) < 0) if (TRANS(SocketINETGetAddr) (ciptr) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketINETConnect: ...SocketINETGetAddr() failed:\n", "SocketINETConnect: ...SocketINETGetAddr() failed:\n");
0, 0, 0);
res = TRANS_CONNECT_FAILED; res = TRANS_CONNECT_FAILED;
} }
else if (TRANS(SocketINETGetPeerAddr) (ciptr) < 0) else if (TRANS(SocketINETGetPeerAddr) (ciptr) < 0)
{ {
PRMSG (1, prmsg (1,
"SocketINETConnect: ...SocketINETGetPeerAddr() failed:\n", "SocketINETConnect: ...SocketINETGetPeerAddr() failed:\n");
0, 0, 0);
res = TRANS_CONNECT_FAILED; res = TRANS_CONNECT_FAILED;
} }
} }
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
if (haveIPv6 && res != 0) { if (res != 0) {
addrlist->addr = addrlist->addr->ai_next; addrlist->addr = addrlist->addr->ai_next;
} }
#endif #endif
...@@ -2510,25 +2172,18 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2510,25 +2172,18 @@ TRANS(SocketINETConnect) (XtransConnInfo ciptr, char *host, char *port)
*/ */
static int static int
UnixHostReallyLocal (char *host) UnixHostReallyLocal (const char *host)
{ {
char hostnamebuf[256]; char hostnamebuf[256];
#if defined(IPv6) && defined(AF_INET6)
if (getaddrinfo == NULL)
haveIPv6 = 0;
#endif
TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf)); TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf));
if (strcmp (hostnamebuf, host) == 0) if (strcmp (hostnamebuf, host) == 0)
{ {
return (1); return (1);
} } else {
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
else if (haveIPv6)
{
struct addrinfo *localhostaddr; struct addrinfo *localhostaddr;
struct addrinfo *otherhostaddr; struct addrinfo *otherhostaddr;
struct addrinfo *i, *j; struct addrinfo *i, *j;
...@@ -2545,7 +2200,7 @@ UnixHostReallyLocal (char *host) ...@@ -2545,7 +2200,7 @@ UnixHostReallyLocal (char *host)
for (j = otherhostaddr; j != NULL && equiv == 0; j = j->ai_next) { for (j = otherhostaddr; j != NULL && equiv == 0; j = j->ai_next) {
if (i->ai_family == j->ai_family) { if (i->ai_family == j->ai_family) {
if (i->ai_family == AF_INET) { if (i->ai_family == AF_INET) {
struct sockaddr_in *sinA struct sockaddr_in *sinA
= (struct sockaddr_in *) i->ai_addr; = (struct sockaddr_in *) i->ai_addr;
struct sockaddr_in *sinB struct sockaddr_in *sinB
= (struct sockaddr_in *) j->ai_addr; = (struct sockaddr_in *) j->ai_addr;
...@@ -2556,9 +2211,9 @@ UnixHostReallyLocal (char *host) ...@@ -2556,9 +2211,9 @@ UnixHostReallyLocal (char *host)
equiv = 1; equiv = 1;
} }
} else if (i->ai_family == AF_INET6) { } else if (i->ai_family == AF_INET6) {
struct sockaddr_in6 *sinA struct sockaddr_in6 *sinA
= (struct sockaddr_in6 *) i->ai_addr; = (struct sockaddr_in6 *) i->ai_addr;
struct sockaddr_in6 *sinB struct sockaddr_in6 *sinB
= (struct sockaddr_in6 *) j->ai_addr; = (struct sockaddr_in6 *) j->ai_addr;
struct in6_addr *A = &sinA->sin6_addr; struct in6_addr *A = &sinA->sin6_addr;
struct in6_addr *B = &sinB->sin6_addr; struct in6_addr *B = &sinB->sin6_addr;
...@@ -2570,14 +2225,11 @@ UnixHostReallyLocal (char *host) ...@@ -2570,14 +2225,11 @@ UnixHostReallyLocal (char *host)
} }
} }
} }
freeaddrinfo(localhostaddr); freeaddrinfo(localhostaddr);
freeaddrinfo(otherhostaddr); freeaddrinfo(otherhostaddr);
return equiv; return equiv;
} #else
#endif
else
{
/* /*
* A host may have more than one network address. If any of the * A host may have more than one network address. If any of the
* network addresses of 'host' (specified to the connect call) * network addresses of 'host' (specified to the connect call)
...@@ -2603,13 +2255,13 @@ UnixHostReallyLocal (char *host) ...@@ -2603,13 +2255,13 @@ UnixHostReallyLocal (char *host)
* from the 1st call, so we must save the address list. * from the 1st call, so we must save the address list.
*/ */
specified_local_addr_list[scount][0] = specified_local_addr_list[scount][0] =
hostp->h_addr_list[scount][0]; hostp->h_addr_list[scount][0];
specified_local_addr_list[scount][1] = specified_local_addr_list[scount][1] =
hostp->h_addr_list[scount][1]; hostp->h_addr_list[scount][1];
specified_local_addr_list[scount][2] = specified_local_addr_list[scount][2] =
hostp->h_addr_list[scount][2]; hostp->h_addr_list[scount][2];
specified_local_addr_list[scount][3] = specified_local_addr_list[scount][3] =
hostp->h_addr_list[scount][3]; hostp->h_addr_list[scount][3];
scount++; scount++;
} }
...@@ -2625,17 +2277,17 @@ UnixHostReallyLocal (char *host) ...@@ -2625,17 +2277,17 @@ UnixHostReallyLocal (char *host)
while (hostp->h_addr_list[j]) while (hostp->h_addr_list[j])
{ {
if ((specified_local_addr_list[i][0] == if ((specified_local_addr_list[i][0] ==
hostp->h_addr_list[j][0]) && hostp->h_addr_list[j][0]) &&
(specified_local_addr_list[i][1] == (specified_local_addr_list[i][1] ==
hostp->h_addr_list[j][1]) && hostp->h_addr_list[j][1]) &&
(specified_local_addr_list[i][2] == (specified_local_addr_list[i][2] ==
hostp->h_addr_list[j][2]) && hostp->h_addr_list[j][2]) &&
(specified_local_addr_list[i][3] == (specified_local_addr_list[i][3] ==
hostp->h_addr_list[j][3])) hostp->h_addr_list[j][3]))
{ {
/* They're equal, so we're done */ /* They're equal, so we're done */
equiv = 1; equiv = 1;
break; break;
} }
...@@ -2646,15 +2298,17 @@ UnixHostReallyLocal (char *host) ...@@ -2646,15 +2298,17 @@ UnixHostReallyLocal (char *host)
i++; i++;
} }
return (equiv); return (equiv);
#endif
} }
} }
static int static int
TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) TRANS(SocketUNIXConnect) (XtransConnInfo ciptr,
const char *host, const char *port)
{ {
struct sockaddr_un sockname; struct sockaddr_un sockname;
int namelen; SOCKLEN_T namelen;
int abstract = 0; int abstract = 0;
...@@ -2662,14 +2316,8 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2662,14 +2316,8 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
abstract = ciptr->transptr->flags & TRANS_ABSTRACT; abstract = ciptr->transptr->flags & TRANS_ABSTRACT;
#endif #endif
#if defined(hpux) && defined(X11_t) prmsg (2,"SocketUNIXConnect(%d,%s,%s)\n", ciptr->fd, host, port);
struct sockaddr_un old_sockname;
int old_namelen;
#endif
PRMSG (2,"SocketUNIXConnect(%d,%s,%s)\n", ciptr->fd, host, port);
/* /*
* Make sure 'host' is really local. If not, we return failure. * Make sure 'host' is really local. If not, we return failure.
* The reason we make this check is because a process may advertise * The reason we make this check is because a process may advertise
...@@ -2679,15 +2327,15 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2679,15 +2327,15 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
*/ */
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
if (strcmp(host, "unix") != 0 && strcasecmp(host, "nx") != 0 && if (host && *host && host[0]!='/' && strcmp(host, "unix") != 0 && strcasecmp(host, "nx") != 0 &&
strncasecmp(host, "nx,", 3) != 0 && !UnixHostReallyLocal (host)) strncasecmp(host, "nx,", 3) != 0 && !UnixHostReallyLocal (host))
#else #else
if (strcmp (host, "unix") != 0 && !UnixHostReallyLocal (host)) if (host && *host && host[0]!='/' && strcmp (host, "unix") != 0 && !UnixHostReallyLocal (host))
#endif #endif
{ {
PRMSG (1, prmsg (1,
"SocketUNIXConnect: Cannot connect to non-local host %s\n", "SocketUNIXConnect: Cannot connect to non-local host %s\n",
host, 0, 0); host);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
...@@ -2698,15 +2346,14 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2698,15 +2346,14 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
if (!port || !*port) if (!port || !*port)
{ {
PRMSG (1,"SocketUNIXConnect: Missing port specification\n", prmsg (1,"SocketUNIXConnect: Missing port specification\n");
0, 0, 0);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
/* /*
* Build the socket name. * Build the socket name.
*/ */
sockname.sun_family = AF_UNIX; sockname.sun_family = AF_UNIX;
#ifdef NX_TRANS_SOCKET #ifdef NX_TRANS_SOCKET
...@@ -2714,34 +2361,21 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2714,34 +2361,21 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
#else #else
if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) { if (set_sun_path(port, UNIX_PATH, sockname.sun_path, abstract) != 0) {
#endif #endif
PRMSG (1, "SocketUNIXConnect: path too long\n", 0, 0, 0); prmsg (1, "SocketUNIXConnect: path too long\n");
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
#if (defined(BSD44SOCKETS) || defined(__UNIXWARE__)) && !defined(Lynx) #if (defined(BSD44SOCKETS) || defined(__UNIXWARE__))
sockname.sun_len = strlen (sockname.sun_path); sockname.sun_len = strlen (sockname.sun_path);
#endif
#if defined(BSD44SOCKETS) || defined(SUN_LEN)
namelen = SUN_LEN (&sockname); namelen = SUN_LEN (&sockname);
#else #else
namelen = strlen (sockname.sun_path) + sizeof (sockname.sun_family); namelen = strlen (sockname.sun_path) + offsetof(struct sockaddr_un, sun_path);
#endif #endif
#if defined(hpux) && defined(X11_t)
/*
* This is gross, but it was in Xlib
*/
old_sockname.sun_family = AF_UNIX;
#ifdef NX_TRANS_SOCKET
if (set_sun_path(port, _NXGetOldUnixPath(OLD_UNIX_PATH), old_sockname.sun_path) != 0) {
#else
if (set_sun_path(port, OLD_UNIX_PATH, old_sockname.sun_path) != 0) {
#endif
PRMSG (1, "SocketUNIXConnect: path too long\n", 0, 0, 0);
return TRANS_CONNECT_FAILED;
}
old_namelen = strlen (old_sockname.sun_path) +
sizeof (old_sockname.sun_family);
#endif
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
...@@ -2762,8 +2396,9 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2762,8 +2396,9 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
* Done here because otherwise all the strlen() calls above would fail. * Done here because otherwise all the strlen() calls above would fail.
*/ */
if (abstract) if (abstract) {
sockname.sun_path[0] = '\0'; sockname.sun_path[0] = '\0';
}
/* /*
* Do the connect() * Do the connect()
...@@ -2773,26 +2408,19 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2773,26 +2408,19 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
{ {
int olderrno = errno; int olderrno = errno;
int connected = 0; int connected = 0;
#if defined(hpux) && defined(X11_t)
if (olderrno == ENOENT)
{
if (connect (ciptr->fd,
(struct sockaddr *) &old_sockname, old_namelen) >= 0)
{
connected = 1;
}
else
olderrno = errno;
}
#endif
if (!connected) if (!connected)
{ {
errno = olderrno; errno = olderrno;
/* /*
* If the error was ENOENT, the server may be starting up * If the error was ENOENT, the server may be starting up; we used
* and we should try again. * 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 * If the error was EWOULDBLOCK or EINPROGRESS then the socket
* was non-blocking and we should poll using select * was non-blocking and we should poll using select
...@@ -2805,16 +2433,17 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port) ...@@ -2805,16 +2433,17 @@ TRANS(SocketUNIXConnect) (XtransConnInfo ciptr, char *host, char *port)
return TRANS_IN_PROGRESS; return TRANS_IN_PROGRESS;
else if (olderrno == EINTR) else if (olderrno == EINTR)
return TRANS_TRY_CONNECT_AGAIN; return TRANS_TRY_CONNECT_AGAIN;
else if (olderrno == ENOENT || olderrno == ECONNREFUSED) else if (olderrno == ENOENT || olderrno == ECONNREFUSED) {
/* If opening as abstract failed, try again normally */ /* If opening as abstract socket failed, try again normally */
if (abstract) { if (abstract) {
ciptr->transptr->flags &= ~(TRANS_ABSTRACT); ciptr->transptr->flags &= ~(TRANS_ABSTRACT);
return TRANS_TRY_CONNECT_AGAIN; return TRANS_TRY_CONNECT_AGAIN;
} else { } else {
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
}
} else { } else {
PRMSG (2,"SocketUNIXConnect: Can't connect: errno = %d\n", prmsg (2,"SocketUNIXConnect: Can't connect: errno = %d\n",
EGET(),0, 0); EGET());
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
...@@ -2832,12 +2461,11 @@ SocketUNIXConnectPost: ...@@ -2832,12 +2461,11 @@ SocketUNIXConnectPost:
* since this is unix domain. * since this is unix domain.
*/ */
if ((ciptr->addr = (char *) malloc(namelen)) == NULL || if ((ciptr->addr = malloc(namelen)) == NULL ||
(ciptr->peeraddr = (char *) malloc(namelen)) == NULL) (ciptr->peeraddr = malloc(namelen)) == NULL)
{ {
PRMSG (1, prmsg (1,
"SocketUNIXCreateListener: Can't allocate space for the addr\n", "SocketUNIXCreateListener: Can't allocate space for the addr\n");
0, 0, 0);
return TRANS_CONNECT_FAILED; return TRANS_CONNECT_FAILED;
} }
...@@ -2849,7 +2477,7 @@ SocketUNIXConnectPost: ...@@ -2849,7 +2477,7 @@ SocketUNIXConnectPost:
ciptr->peeraddrlen = namelen; ciptr->peeraddrlen = namelen;
memcpy (ciptr->addr, &sockname, ciptr->addrlen); memcpy (ciptr->addr, &sockname, ciptr->addrlen);
memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen); memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen);
return 0; return 0;
} }
...@@ -2862,7 +2490,7 @@ static int ...@@ -2862,7 +2490,7 @@ static int
TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend) TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
{ {
PRMSG (2,"SocketBytesReadable(%p,%d,%p)\n", prmsg (2,"SocketBytesReadable(%p,%d,%p)\n",
ciptr, ciptr->fd, pend); ciptr, ciptr->fd, pend);
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
...@@ -2895,7 +2523,7 @@ TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend) ...@@ -2895,7 +2523,7 @@ TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
* NX _XSelect(), so it is generally possible to let the client * 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 * yield the control to NX and let it handle the I/O on the proxy
* descriptors even if the application is not explicitly designed * descriptors even if the application is not explicitly designed
* to work as a NX agent. * to work as a NX agent.
*/ */
#ifdef NX_TRANS_DEBUG #ifdef NX_TRANS_DEBUG
...@@ -2916,115 +2544,153 @@ TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend) ...@@ -2916,115 +2544,153 @@ TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
#if defined(QNX4)
*pend = 0L; /* FIONREAD only returns a short. Zero out upper bits */
#endif
#ifdef WIN32 #ifdef WIN32
{ {
int ret = ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend); int ret = ioctlsocket ((SOCKET) ciptr->fd, FIONREAD, (u_long *) pend);
errno = WSAGetLastError(); if (ret == SOCKET_ERROR) errno = WSAGetLastError();
return ret; return ret;
} }
#else #else
#if (defined(i386) && defined(SYSV) && !defined(SCO325)) || (defined(_SEQUENT_) && _SOCKET_VERSION == 1)
return ioctl (ciptr->fd, I_NREAD, (char *) pend);
#else
#if defined(__UNIXOS2__)
return ioctl (ciptr->fd, FIONREAD, (char*) pend, sizeof(int));
#else
return ioctl (ciptr->fd, FIONREAD, (char *) pend); return ioctl (ciptr->fd, FIONREAD, (char *) pend);
#endif /* __UNIXOS2__ */
#endif /* i386 && SYSV || _SEQUENT_ && _SOCKET_VERSION == 1 */
#endif /* WIN32 */ #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 static int
TRANS(SocketRead) (XtransConnInfo ciptr, char *buf, int size) 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)
{ {
PRMSG (2,"SocketRead(%d,%p,%d)\n", ciptr->fd, buf, size); struct _XtransConnFd *cf, *next;
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) 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
* If we have a valid priv pointer then this cleanupFds(XtransConnInfo ciptr)
* is an internal connection to the proxy. {
* In this case we should emulate the read. /* 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);
}
if (ciptr->priv) static int
{ nFd(struct _XtransConnFd **prev)
int result; {
struct _XtransConnFd *cf;
int n = 0;
result = NXTransRead(ciptr->fd, buf, size); for (cf = *prev; cf; cf = cf->next)
n++;
return n;
}
#ifdef NX_TRANS_DEBUG static int
if (result < 0 && EGET() == EAGAIN) TRANS(SocketRecvFd) (XtransConnInfo ciptr)
{ {
fprintf(stderr, "SocketRead: Read from descriptor [%d] would block.\n", prmsg (2, "SocketRecvFd(%d)\n", ciptr->fd);
ciptr->fd); return removeFd(&ciptr->recv_fds);
} }
else
{
fprintf(stderr, "SocketRead: Read [%d] bytes from descriptor [%d].\n",
result, ciptr->fd);
}
#endif
return result;
}
else
{
return read (ciptr->fd, buf, size);
}
#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ static int
TRANS(SocketSendFd) (XtransConnInfo ciptr, int fd, int do_close)
{
appendFd(&ciptr->send_fds, fd, do_close);
return 0;
}
#if defined(WIN32) || defined(__UNIXOS2__) static int
{ TRANS(SocketRecvFdInvalid)(XtransConnInfo ciptr)
int ret = recv ((SOCKET)ciptr->fd, buf, size, 0); {
#ifdef WIN32 errno = EINVAL;
errno = WSAGetLastError(); return -1;
#endif }
return ret;
}
#else
return read (ciptr->fd, buf, size);
#endif /* WIN32 */
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ 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 static int
TRANS(SocketWrite) (XtransConnInfo ciptr, char *buf, int size) TRANS(SocketRead) (XtransConnInfo ciptr, char *buf, int size)
{ {
PRMSG (2,"SocketWrite(%d,%p,%d)\n", ciptr->fd, buf, size); prmsg (2,"SocketRead(%d,%p,%d)\n", ciptr->fd, buf, size);
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
/* /*
* If we have a valid priv pointer then this * If we have a valid priv pointer then this
* is an internal connection to the proxy. * is an internal connection to the proxy.
* In this case we should emulate the write. * In this case we should emulate the read.
*/ */
if (ciptr->priv) if (ciptr->priv)
{ {
int result; int result;
result = NXTransWrite(ciptr->fd, buf, size); result = NXTransRead(ciptr->fd, buf, size);
#ifdef NX_TRANS_DEBUG #ifdef NX_TRANS_DEBUG
if (result < 0 && EGET() == EAGAIN) if (result < 0 && EGET() == EAGAIN)
{ {
fprintf(stderr, "SocketWrite: Write on descriptor [%d] would block.\n", fprintf(stderr, "SocketRead: Read from descriptor [%d] would block.\n",
ciptr->fd); ciptr->fd);
} }
else else
{ {
fprintf(stderr, "SocketWrite: Written [%d] bytes on descriptor [%d].\n", fprintf(stderr, "SocketRead: Read [%d] bytes from descriptor [%d].\n",
result, ciptr->fd); result, ciptr->fd);
} }
#endif #endif
...@@ -3032,32 +2698,100 @@ TRANS(SocketWrite) (XtransConnInfo ciptr, char *buf, int size) ...@@ -3032,32 +2698,100 @@ TRANS(SocketWrite) (XtransConnInfo ciptr, char *buf, int size)
} }
else else
{ {
return write (ciptr->fd, buf, size); /* 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) */ #else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
#if defined(WIN32) || defined(__UNIXOS2__) #if defined(WIN32)
{ {
int ret = send ((SOCKET)ciptr->fd, buf, size, 0); int ret = recv ((SOCKET)ciptr->fd, buf, size, 0);
#ifdef WIN32 #ifdef WIN32
errno = WSAGetLastError(); if (ret == SOCKET_ERROR) errno = WSAGetLastError();
#endif #endif
return ret; return ret;
} }
#else #else
return write (ciptr->fd, buf, size); #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 /* WIN32 */
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
} }
static int static int
TRANS(SocketReadv) (XtransConnInfo ciptr, struct iovec *buf, int size) TRANS(SocketReadv) (XtransConnInfo ciptr, struct iovec *buf, int size)
{ {
PRMSG (2,"SocketReadv(%d,%p,%d)\n", ciptr->fd, buf, size); prmsg (2,"SocketReadv(%d,%p,%d)\n", ciptr->fd, buf, size);
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
...@@ -3073,12 +2807,73 @@ TRANS(SocketReadv) (XtransConnInfo ciptr, struct iovec *buf, int size) ...@@ -3073,12 +2807,73 @@ TRANS(SocketReadv) (XtransConnInfo ciptr, struct iovec *buf, int size)
} }
else 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); return READV (ciptr, buf, size);
#endif
} }
#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #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); return READV (ciptr, buf, size);
#endif
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
} }
...@@ -3088,7 +2883,7 @@ static int ...@@ -3088,7 +2883,7 @@ static int
TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size) TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size)
{ {
PRMSG (2,"SocketWritev(%d,%p,%d)\n", ciptr->fd, buf, size); prmsg (2,"SocketWritev(%d,%p,%d)\n", ciptr->fd, buf, size);
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
...@@ -3104,11 +2899,82 @@ TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size) ...@@ -3104,11 +2899,82 @@ TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size)
} }
else 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); return WRITEV (ciptr, buf, size);
} }
#else /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #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); return WRITEV (ciptr, buf, size);
#endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */ #endif /* #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) */
...@@ -3116,15 +2982,92 @@ TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size) ...@@ -3116,15 +2982,92 @@ TRANS(SocketWritev) (XtransConnInfo ciptr, struct iovec *buf, int size)
static int static int
TRANS(SocketWrite) (XtransConnInfo ciptr, char *buf, int size)
{
prmsg (2,"SocketWrite(%d,%p,%d)\n", ciptr->fd, 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) TRANS(SocketDisconnect) (XtransConnInfo ciptr)
{ {
PRMSG (2,"SocketDisconnect(%p,%d)\n", ciptr, ciptr->fd, 0); prmsg (2,"SocketDisconnect(%p,%d)\n", ciptr, ciptr->fd);
#ifdef WIN32 #ifdef WIN32
{ {
int ret = shutdown (ciptr->fd, 2); int ret = shutdown (ciptr->fd, 2);
errno = WSAGetLastError(); if (ret == SOCKET_ERROR) errno = WSAGetLastError();
return ret; return ret;
} }
#else #else
...@@ -3138,12 +3081,12 @@ static int ...@@ -3138,12 +3081,12 @@ static int
TRANS(SocketINETClose) (XtransConnInfo ciptr) TRANS(SocketINETClose) (XtransConnInfo ciptr)
{ {
PRMSG (2,"SocketINETClose(%p,%d)\n", ciptr, ciptr->fd, 0); prmsg (2,"SocketINETClose(%p,%d)\n", ciptr, ciptr->fd);
#ifdef WIN32 #ifdef WIN32
{ {
int ret = close (ciptr->fd); int ret = close (ciptr->fd);
errno = WSAGetLastError(); if (ret == SOCKET_ERROR) errno = WSAGetLastError();
return ret; return ret;
} }
#else #else
...@@ -3157,7 +3100,6 @@ TRANS(SocketINETClose) (XtransConnInfo ciptr) ...@@ -3157,7 +3100,6 @@ TRANS(SocketINETClose) (XtransConnInfo ciptr)
#ifdef UNIXCONN #ifdef UNIXCONN
static int static int
TRANS(SocketUNIXClose) (XtransConnInfo ciptr) TRANS(SocketUNIXClose) (XtransConnInfo ciptr)
{ {
/* /*
* If this is the server side, then once the socket is closed, * If this is the server side, then once the socket is closed,
...@@ -3167,7 +3109,7 @@ TRANS(SocketUNIXClose) (XtransConnInfo ciptr) ...@@ -3167,7 +3109,7 @@ TRANS(SocketUNIXClose) (XtransConnInfo ciptr)
struct sockaddr_un *sockname = (struct sockaddr_un *) ciptr->addr; struct sockaddr_un *sockname = (struct sockaddr_un *) ciptr->addr;
int ret; int ret;
PRMSG (2,"SocketUNIXClose(%x,%d)\n", ciptr, ciptr->fd, 0); prmsg (2,"SocketUNIXClose(%p,%d)\n", ciptr, ciptr->fd);
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
...@@ -3178,6 +3120,9 @@ TRANS(SocketUNIXClose) (XtransConnInfo ciptr) ...@@ -3178,6 +3120,9 @@ TRANS(SocketUNIXClose) (XtransConnInfo ciptr)
#endif #endif
#if XTRANS_SEND_FDS
cleanupFds(ciptr);
#endif
ret = close(ciptr->fd); ret = close(ciptr->fd);
#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST) #if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
...@@ -3192,14 +3137,16 @@ TRANS(SocketUNIXClose) (XtransConnInfo ciptr) ...@@ -3192,14 +3137,16 @@ TRANS(SocketUNIXClose) (XtransConnInfo ciptr)
&& sockname->sun_path[0]) && sockname->sun_path[0])
{ {
#if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST) #if defined(NX_TRANS_SOCKET) && defined(NX_TRANS_TEST)
if (!(ciptr->flags & TRANS_NOUNLINK)) if (!(ciptr->flags & TRANS_NOUNLINK
|| ciptr->transptr->flags & TRANS_ABSTRACT))
{ {
fprintf(stderr, "SocketUNIXClose: Unlinking path [%s] for ciptr at [%p].\n", fprintf(stderr, "SocketUNIXClose: Unlinking path [%s] for ciptr at [%p].\n",
sockname->sun_path, (void *) ciptr); sockname->sun_path, (void *) ciptr);
unlink (sockname->sun_path); unlink (sockname->sun_path);
} }
#else #else
if (!(ciptr->flags & TRANS_NOUNLINK)) if (!(ciptr->flags & TRANS_NOUNLINK
|| ciptr->transptr->flags & TRANS_ABSTRACT))
unlink (sockname->sun_path); unlink (sockname->sun_path);
#endif #endif
} }
...@@ -3217,8 +3164,8 @@ TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr) ...@@ -3217,8 +3164,8 @@ TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr)
int ret; int ret;
PRMSG (2,"SocketUNIXCloseForCloning(%p,%d)\n", prmsg (2,"SocketUNIXCloseForCloning(%p,%d)\n",
ciptr, ciptr->fd, 0); ciptr, ciptr->fd);
#if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT) #if defined(NX_TRANS_SOCKET) && defined(TRANS_CLIENT)
...@@ -3229,6 +3176,9 @@ TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr) ...@@ -3229,6 +3176,9 @@ TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr)
#endif #endif
#if XTRANS_SEND_FDS
cleanupFds(ciptr);
#endif
ret = close(ciptr->fd); ret = close(ciptr->fd);
return ret; return ret;
...@@ -3239,7 +3189,7 @@ TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr) ...@@ -3239,7 +3189,7 @@ TRANS(SocketUNIXCloseForCloning) (XtransConnInfo ciptr)
#ifdef TCPCONN #ifdef TCPCONN
# ifdef TRANS_SERVER # ifdef TRANS_SERVER
static char* tcp_nolisten[] = { static const char* tcp_nolisten[] = {
"inet", "inet",
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
"inet6", "inet6",
...@@ -3259,15 +3209,8 @@ Xtransport TRANS(SocketTCPFuncs) = { ...@@ -3259,15 +3209,8 @@ Xtransport TRANS(SocketTCPFuncs) = {
tcp_nolisten, tcp_nolisten,
TRANS(SocketOpenCOTSServer), TRANS(SocketOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(SocketOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(SocketOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCOTSServer),
TRANS(SocketReopenCLTSServer),
#endif #endif
TRANS(SocketSetOption), TRANS(SocketSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
...@@ -3283,6 +3226,10 @@ Xtransport TRANS(SocketTCPFuncs) = { ...@@ -3283,6 +3226,10 @@ Xtransport TRANS(SocketTCPFuncs) = {
TRANS(SocketWrite), TRANS(SocketWrite),
TRANS(SocketReadv), TRANS(SocketReadv),
TRANS(SocketWritev), TRANS(SocketWritev),
#if XTRANS_SEND_FDS
TRANS(SocketSendFdInvalid),
TRANS(SocketRecvFdInvalid),
#endif
TRANS(SocketDisconnect), TRANS(SocketDisconnect),
TRANS(SocketINETClose), TRANS(SocketINETClose),
TRANS(SocketINETClose), TRANS(SocketINETClose),
...@@ -3299,15 +3246,8 @@ Xtransport TRANS(SocketINETFuncs) = { ...@@ -3299,15 +3246,8 @@ Xtransport TRANS(SocketINETFuncs) = {
NULL, NULL,
TRANS(SocketOpenCOTSServer), TRANS(SocketOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(SocketOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(SocketOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCOTSServer),
TRANS(SocketReopenCLTSServer),
#endif #endif
TRANS(SocketSetOption), TRANS(SocketSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
...@@ -3323,6 +3263,10 @@ Xtransport TRANS(SocketINETFuncs) = { ...@@ -3323,6 +3263,10 @@ Xtransport TRANS(SocketINETFuncs) = {
TRANS(SocketWrite), TRANS(SocketWrite),
TRANS(SocketReadv), TRANS(SocketReadv),
TRANS(SocketWritev), TRANS(SocketWritev),
#if XTRANS_SEND_FDS
TRANS(SocketSendFdInvalid),
TRANS(SocketRecvFdInvalid),
#endif
TRANS(SocketDisconnect), TRANS(SocketDisconnect),
TRANS(SocketINETClose), TRANS(SocketINETClose),
TRANS(SocketINETClose), TRANS(SocketINETClose),
...@@ -3340,15 +3284,8 @@ Xtransport TRANS(SocketINET6Funcs) = { ...@@ -3340,15 +3284,8 @@ Xtransport TRANS(SocketINET6Funcs) = {
NULL, NULL,
TRANS(SocketOpenCOTSServer), TRANS(SocketOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(SocketOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(SocketOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCOTSServer),
TRANS(SocketReopenCLTSServer),
#endif #endif
TRANS(SocketSetOption), TRANS(SocketSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
...@@ -3364,6 +3301,10 @@ Xtransport TRANS(SocketINET6Funcs) = { ...@@ -3364,6 +3301,10 @@ Xtransport TRANS(SocketINET6Funcs) = {
TRANS(SocketWrite), TRANS(SocketWrite),
TRANS(SocketReadv), TRANS(SocketReadv),
TRANS(SocketWritev), TRANS(SocketWritev),
#if XTRANS_SEND_FDS
TRANS(SocketSendFdInvalid),
TRANS(SocketRecvFdInvalid),
#endif
TRANS(SocketDisconnect), TRANS(SocketDisconnect),
TRANS(SocketINETClose), TRANS(SocketINETClose),
TRANS(SocketINETClose), TRANS(SocketINETClose),
...@@ -3388,15 +3329,8 @@ Xtransport TRANS(SocketLocalFuncs) = { ...@@ -3388,15 +3329,8 @@ Xtransport TRANS(SocketLocalFuncs) = {
NULL, NULL,
TRANS(SocketOpenCOTSServer), TRANS(SocketOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(SocketOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(SocketOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCOTSServer),
TRANS(SocketReopenCLTSServer),
#endif #endif
TRANS(SocketSetOption), TRANS(SocketSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
...@@ -3412,6 +3346,10 @@ Xtransport TRANS(SocketLocalFuncs) = { ...@@ -3412,6 +3346,10 @@ Xtransport TRANS(SocketLocalFuncs) = {
TRANS(SocketWrite), TRANS(SocketWrite),
TRANS(SocketReadv), TRANS(SocketReadv),
TRANS(SocketWritev), TRANS(SocketWritev),
#if XTRANS_SEND_FDS
TRANS(SocketSendFd),
TRANS(SocketRecvFd),
#endif
TRANS(SocketDisconnect), TRANS(SocketDisconnect),
TRANS(SocketUNIXClose), TRANS(SocketUNIXClose),
TRANS(SocketUNIXCloseForCloning), TRANS(SocketUNIXCloseForCloning),
...@@ -3419,10 +3357,10 @@ Xtransport TRANS(SocketLocalFuncs) = { ...@@ -3419,10 +3357,10 @@ Xtransport TRANS(SocketLocalFuncs) = {
#endif /* !LOCALCONN */ #endif /* !LOCALCONN */
# ifdef TRANS_SERVER # ifdef TRANS_SERVER
# if !defined(LOCALCONN) # if !defined(LOCALCONN)
static char* unix_nolisten[] = { "local" , NULL }; static const char* unix_nolisten[] = { "local" , NULL };
# endif # endif
# endif # endif
Xtransport TRANS(SocketUNIXFuncs) = { Xtransport TRANS(SocketUNIXFuncs) = {
/* Socket Interface */ /* Socket Interface */
"unix", "unix",
...@@ -3442,15 +3380,8 @@ Xtransport TRANS(SocketUNIXFuncs) = { ...@@ -3442,15 +3380,8 @@ Xtransport TRANS(SocketUNIXFuncs) = {
#endif #endif
TRANS(SocketOpenCOTSServer), TRANS(SocketOpenCOTSServer),
#endif /* TRANS_SERVER */ #endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(SocketOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(SocketOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN #ifdef TRANS_REOPEN
TRANS(SocketReopenCOTSServer), TRANS(SocketReopenCOTSServer),
TRANS(SocketReopenCLTSServer),
#endif #endif
TRANS(SocketSetOption), TRANS(SocketSetOption),
#ifdef TRANS_SERVER #ifdef TRANS_SERVER
...@@ -3466,9 +3397,158 @@ Xtransport TRANS(SocketUNIXFuncs) = { ...@@ -3466,9 +3397,158 @@ Xtransport TRANS(SocketUNIXFuncs) = {
TRANS(SocketWrite), TRANS(SocketWrite),
TRANS(SocketReadv), TRANS(SocketReadv),
TRANS(SocketWritev), TRANS(SocketWritev),
#if XTRANS_SEND_FDS
TRANS(SocketSendFd),
TRANS(SocketRecvFd),
#endif
TRANS(SocketDisconnect), TRANS(SocketDisconnect),
TRANS(SocketUNIXClose), TRANS(SocketUNIXClose),
TRANS(SocketUNIXCloseForCloning), TRANS(SocketUNIXCloseForCloning),
}; };
#endif /* UNIXCONN */ #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 */
/*
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 <sys/un.h>
#include <stropts.h>
#include <poll.h>
#include <tiuser.h>
#include <netdir.h>
#include <netconfig.h>
/*
* This is the TLI implementation of the X Transport service layer
*/
typedef struct _TLItrans2dev {
char *transname;
char *protofamily;
char *devcotsname;
char *devcltsname;
int family;
} TLItrans2dev;
static TLItrans2dev TLItrans2devtab[] = {
{"inet","inet","/dev/tcp","/dev/udp",AF_INET},
{"tcp","inet","/dev/tcp","/dev/udp",AF_INET},
{"tli","loopback","/dev/ticots","/dev/ticlts",AF_UNIX},
};
#define NUMTLIFAMILIES (sizeof(TLItrans2devtab)/sizeof(TLItrans2dev))
/*
* The local TLI connection, is a form of a local connection, so use a
* sockaddr_un for the address so that it will be treated just like the other
* local transports such as UNIX domain sockets, pts, and named.
*/
#if defined(X11_t)
#define TLINODENAME "TLI:xserver"
#endif
#if defined(XIM_t)
#define TLINODENAME "TLI:xim"
#endif
#if defined(FS_t) || defined(FONT_t)
#define TLINODENAME "TLI:fontserver"
#endif
#if defined(ICE_t)
#define TLINODENAME "TLI:ICE"
#endif
#if defined(TEST_t)
#define TLINODENAME "TLI:test"
#endif
#ifndef PORTBUFSIZE
#ifdef TRANS_SERVER
#define PORTBUFSIZE 64
#else
#ifdef TRANS_CLIENT
#define PORTBUFSIZE 64
#endif
#endif
#endif
/*
* These are some utility function used by the real interface function below.
*/
static int
TRANS(TLISelectFamily)(char *family)
{
int i;
PRMSG(3,"TLISelectFamily(%s)\n", family, 0,0 );
for(i=0;i<NUMTLIFAMILIES;i++)
{
if( !strcmp(family,TLItrans2devtab[i].transname) )
return i;
}
return -1;
}
/*
* This function gets the local address of the transport and stores it in the
* XtransConnInfo structure for the connection.
*/
static int
TRANS(TLIGetAddr)(XtransConnInfo ciptr)
{
Xtransaddr sockname;
struct netbuf netbuf;
PRMSG(3,"TLIGetAddr(%x)\n", ciptr, 0,0 );
netbuf.buf=(char *)&sockname;
netbuf.len=sizeof(sockname);
netbuf.maxlen=sizeof(sockname);
if( t_getname(ciptr->fd,&netbuf,LOCALNAME) < 0 )
{
PRMSG(1,"TLIGetAddr: t_getname(LOCALNAME) failed: %d\n",
errno, 0,0 );
return -1;
}
PRMSG(4,"TLIGetAddr: got family %d len %d\n",
((struct sockaddr *) &sockname)->sa_family ,netbuf.len, 0 );
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if( ciptr->addr )
free(ciptr->addr);
if( (ciptr->addr=(char *)malloc(netbuf.len)) == NULL )
{
PRMSG(1, "TLIGetAddr: Can't allocate space for the addr\n",
0,0,0);
return -1;
}
ciptr->family=((struct sockaddr *) &sockname)->sa_family;
ciptr->addrlen=netbuf.len;
memcpy(ciptr->addr,&sockname,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(TLIGetPeerAddr)(XtransConnInfo ciptr)
{
Xtransaddr sockname;
struct netbuf netbuf;
PRMSG(3,"TLIGetPeerAddr(%x)\n", ciptr, 0,0 );
netbuf.buf=(char *)&sockname;
netbuf.len=sizeof(sockname);
netbuf.maxlen=sizeof(sockname);
if( t_getname(ciptr->fd,&netbuf,REMOTENAME) < 0 )
{
PRMSG(1,"TLIGetPeerAddr: t_getname(REMOTENAME) failed: %d\n",
errno, 0,0 );
return -1;
}
PRMSG(4,"TLIGetPeerAddr: got family %d len %d\n",
((struct sockaddr *) &sockname)->sa_family ,netbuf.len, 0 );
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if( ciptr->peeraddr )
free(ciptr->peeraddr);
if( (ciptr->peeraddr=(char *)malloc(netbuf.len)) == NULL )
{
PRMSG(1,
"TLIGetPeerAddr: Can't allocate space for the addr\n",
0,0,0);
return -1;
}
ciptr->peeraddrlen=netbuf.len;
memcpy(ciptr->peeraddr,&sockname,ciptr->peeraddrlen);
return 0;
}
/*
* This function will establish a local name for the transport. This function
* do extra work for the local tli connection. It must create a sockaddr_un
* format address so that it will look like an AF_UNIX connection to the
* higher layer.
*
* This function will only be called by the OPENC?TSClient() functions since
* the local address is set up in the CreateListner() for the server ends.
*/
static int
TRANS(TLITLIBindLocal)(int fd, int family, char *port)
{
struct sockaddr_un *sunaddr=NULL;
struct t_bind *req=NULL;
PRMSG(2, "TLITLIBindLocal(%d,%d,%s)\n", fd, family, port);
if( family == AF_UNIX )
{
if( (req=(struct t_bind *)t_alloc(fd,T_BIND,0)) == NULL )
{
PRMSG(1,
"TLITLIBindLocal() failed to allocate a t_bind\n",
0,0,0 );
return -1;
}
if( (sunaddr=(struct sockaddr_un *)
malloc(sizeof(struct sockaddr_un))) == NULL )
{
PRMSG(1,
"TLITLIBindLocal: failed to allocate a sockaddr_un\n",
0,0,0 );
t_free((char *)req,T_BIND);
return -1;
}
sunaddr->sun_family=AF_UNIX;
#ifdef nuke
if( *port == '/' ) { /* A full pathname */
(void) strcpy(sunaddr->sun_path, port);
} else {
(void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port );
}
#endif /*NUKE*/
(void) sprintf(sunaddr->sun_path,"%s%d",
TLINODENAME, getpid()^time(NULL) );
PRMSG(4, "TLITLIBindLocal: binding to %s\n",
sunaddr->sun_path, 0,0);
req->addr.buf=(char *)sunaddr;
req->addr.len=sizeof(*sunaddr);
req->addr.maxlen=sizeof(*sunaddr);
}
if( t_bind(fd, req, NULL) < 0 )
{
PRMSG(1,
"TLIBindLocal: Unable to bind TLI device to %s\n",
port, 0,0 );
if (sunaddr)
free((char *) sunaddr);
if (req)
t_free((char *)req,T_BIND);
return -1;
}
return 0;
}
static XtransConnInfo
TRANS(TLIOpen)(char *device)
{
XtransConnInfo ciptr;
PRMSG(3,"TLIOpen(%s)\n", device, 0,0 );
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{
PRMSG(1, "TLIOpen: calloc failed\n", 0,0,0 );
return NULL;
}
if( (ciptr->fd=t_open( device, O_RDWR, NULL )) < 0 )
{
PRMSG(1, "TLIOpen: t_open failed for %s\n", device, 0,0 );
free(ciptr);
return NULL;
}
return ciptr;
}
#ifdef TRANS_REOPEN
static XtransConnInfo
TRANS(TLIReopen)(char *device, int fd, char *port)
{
XtransConnInfo ciptr;
PRMSG(3,"TLIReopen(%s,%d, %s)\n", device, fd, port );
if (t_sync (fd) < 0)
{
PRMSG(1, "TLIReopen: t_sync failed\n", 0,0,0 );
return NULL;
}
if( (ciptr=(XtransConnInfo)calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
{
PRMSG(1, "TLIReopen: calloc failed\n", 0,0,0 );
return NULL;
}
ciptr->fd = fd;
return ciptr;
}
#endif /* TRANS_REOPEN */
static int
TRANS(TLIAddrToNetbuf)(int tlifamily, char *host, char *port,
struct netbuf *netbufp)
{
struct netconfig *netconfigp;
struct nd_hostserv nd_hostserv;
struct nd_addrlist *nd_addrlistp = NULL;
void *handlep;
long lport;
PRMSG(3,"TLIAddrToNetbuf(%d,%s,%s)\n", tlifamily, host, port );
if( (handlep=setnetconfig()) == NULL )
return -1;
lport = strtol (port, (char**)NULL, 10);
if (lport < 1024 || lport > USHRT_MAX)
return -1;
nd_hostserv.h_host = host;
if( port && *port ) {
nd_hostserv.h_serv = port;
} else {
nd_hostserv.h_serv = NULL;
}
while( (netconfigp=getnetconfig(handlep)) != NULL )
{
if( strcmp(netconfigp->nc_protofmly,
TLItrans2devtab[tlifamily].protofamily) != 0 )
continue;
PRMSG(5,"TLIAddrToNetbuf: Trying to resolve %s.%s for %s\n",
host, port, TLItrans2devtab[tlifamily].protofamily );
if( netdir_getbyname(netconfigp,&nd_hostserv, &nd_addrlistp) == 0 )
{
/* we have at least one address to use */
PRMSG(5, "TLIAddrToNetbuf: found address for %s.%s\n", host, port, 0 );
PRMSG(5, "TLIAddrToNetbuf: %s\n",taddr2uaddr(netconfigp,nd_addrlistp->n_addrs),
0,0 );
memcpy(netbufp->buf,nd_addrlistp->n_addrs->buf,
nd_addrlistp->n_addrs->len);
netbufp->len=nd_addrlistp->n_addrs->len;
endnetconfig(handlep);
return 0;
}
}
endnetconfig(handlep);
return -1;
}
/*
* These functions are the interface supplied in the Xtransport structure
*/
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(TLIOpenCOTSClient)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
int i;
PRMSG(2,"TLIOpenCOTSClient(%s,%s,%s)\n", protocol, host, port );
if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
{
PRMSG(1,"TLIOpenCOTSClient: Unable to determine device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL )
{
PRMSG(1,"TLIOpenCOTSClient: Unable to open device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( TRANS(TLITLIBindLocal)(ciptr->fd,TLItrans2devtab[i].family,port) < 0 )
{
PRMSG(1,
"TLIOpenCOTSClient: ...TLITLIBindLocal() failed: %d\n",
errno, 0,0 );
t_close(ciptr->fd);
free(ciptr);
return NULL;
}
if( TRANS(TLIGetAddr)(ciptr) < 0 )
{
PRMSG(1,
"TLIOpenCOTSClient: ...TLIGetAddr() failed: %d\n",
errno, 0,0 );
t_close(ciptr->fd);
free(ciptr);
return NULL;
}
/* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */
ciptr->index = i;
return ciptr;
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(TLIOpenCOTSServer)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
int i;
PRMSG(2,"TLIOpenCOTSServer(%s,%s,%s)\n", protocol, host, port );
if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
{
PRMSG(1,
"TLIOpenCOTSServer: Unable to determine device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL )
{
PRMSG(1,
"TLIOpenCOTSServer: Unable to open device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
/* Set the family type */
ciptr->family = TLItrans2devtab[i].family;
/* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */
ciptr->index = i;
return ciptr;
}
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static XtransConnInfo
TRANS(TLIOpenCLTSClient)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
int i;
PRMSG(2,"TLIOpenCLTSClient(%s,%s,%s)\n", protocol, host, port );
if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
{
PRMSG(1,
"TLIOpenCLTSClient: Unable to determine device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcltsname)) == NULL )
{
PRMSG(1,
"TLIOpenCLTSClient: Unable to open device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( TRANS(TLITLIBindLocal)(ciptr->fd,TLItrans2devtab[i].family,port) < 0 )
{
PRMSG(1,
"TLIOpenCLTSClient: ...TLITLIBindLocal() failed: %d\n",
errno, 0,0 );
t_close(ciptr->fd);
free(ciptr);
return NULL;
}
if( TRANS(TLIGetAddr)(ciptr) < 0 )
{
PRMSG(1,
"TLIOpenCLTSClient: ...TLIGetPeerAddr() failed: %d\n",
errno, 0,0 );
t_close(ciptr->fd);
free(ciptr);
return NULL;
}
return ciptr;
}
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
static XtransConnInfo
TRANS(TLIOpenCLTSServer)(Xtransport *thistrans, char *protocol,
char *host, char *port)
{
XtransConnInfo ciptr;
int i;
PRMSG(2,"TLIOpenCLTSServer(%s,%s,%s)\n", protocol, host, port );
if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
{
PRMSG(1,
"TLIOpenCLTSServer: Unable to determine device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( (ciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcltsname)) == NULL )
{
PRMSG(1,
"TLIOpenCLTSServer: Unable to open device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
return ciptr;
}
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
static XtransConnInfo
TRANS(TLIReopenCOTSServer)(Xtransport *thistrans, int fd, char *port)
{
XtransConnInfo ciptr;
int i;
PRMSG(2,"TLIReopenCOTSServer(%d, %s)\n", fd, port, 0 );
if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
{
PRMSG(1,
"TLIReopenCOTSServer: Unable to determine device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( (ciptr=TRANS(TLIReopen)(
TLItrans2devtab[i].devcotsname, fd, port)) == NULL )
{
PRMSG(1,
"TLIReopenCOTSServer: Unable to open device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
/* Save the TLIFamily for later use in TLIAddrToNetbuf() lookups */
ciptr->index = i;
return ciptr;
}
static XtransConnInfo
TRANS(TLIReopenCLTSServer)(Xtransport *thistrans, int fd, char *port)
{
XtransConnInfo ciptr;
int i;
PRMSG(2,"TLIReopenCLTSServer(%d, %s)\n", fd, port, 0 );
if( (i=TRANS(TLISelectFamily)(thistrans->TransName)) < 0 )
{
PRMSG(1,
"TLIReopenCLTSServer: Unable to determine device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
if( (ciptr=TRANS(TLIReopen)(
TLItrans2devtab[i].devcltsname, fd, port)) == NULL )
{
PRMSG(1,
"TLIReopenCLTSServer: Unable to open device for %s\n",
thistrans->TransName, 0,0 );
return NULL;
}
ciptr->index = i;
return ciptr;
}
#endif /* TRANS_REOPEN */
static int
TRANS(TLISetOption)(XtransConnInfo ciptr, int option, int arg)
{
PRMSG(2,"TLISetOption(%d,%d,%d)\n", ciptr->fd, option, arg );
return -1;
}
#ifdef TRANS_SERVER
static int
TRANS(TLICreateListener)(XtransConnInfo ciptr, struct t_bind *req)
{
struct t_bind *ret;
PRMSG(2,"TLICreateListener(%x->%d,%x)\n", ciptr, ciptr->fd, req );
if( (ret=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,T_ALL)) == NULL )
{
PRMSG(1, "TLICreateListener: failed to allocate a t_bind\n",
0,0,0 );
t_free((char *)req,T_BIND);
return TRANS_CREATE_LISTENER_FAILED;
}
if( t_bind(ciptr->fd, req, ret) < 0 )
{
PRMSG(1, "TLICreateListener: t_bind failed\n", 0,0,0 );
t_free((char *)req,T_BIND);
t_free((char *)ret,T_BIND);
return TRANS_CREATE_LISTENER_FAILED;
}
if( memcmp(req->addr.buf,ret->addr.buf,req->addr.len) != 0 )
{
PRMSG(1, "TLICreateListener: unable to bind to %x\n",
req, 0,0 );
t_free((char *)req,T_BIND);
t_free((char *)ret,T_BIND);
return TRANS_ADDR_IN_USE;
}
/*
* Everything looks good: fill in the XtransConnInfo structure.
*/
if( (ciptr->addr=(char *)malloc(ret->addr.len)) == NULL )
{
PRMSG(1,
"TLICreateListener: Unable to allocate space for the address\n",
0,0,0 );
t_free((char *)req,T_BIND);
t_free((char *)ret, T_BIND);
return TRANS_CREATE_LISTENER_FAILED;
}
ciptr->addrlen=ret->addr.len;
memcpy(ciptr->addr,ret->addr.buf,ret->addr.len);
t_free((char *)req,T_BIND);
t_free((char *)ret, T_BIND);
return 0;
}
static int
TRANS(TLIINETCreateListener)(XtransConnInfo ciptr, char *port, unsigned int flags)
{
char portbuf[PORTBUFSIZE];
struct t_bind *req;
struct sockaddr_in *sinaddr;
long tmpport;
PRMSG(2,"TLIINETCreateListener(%x->%d,%s)\n", ciptr,
ciptr->fd, port ? port : "NULL" );
#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))
{
tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
sprintf(portbuf,"%u", tmpport);
port = portbuf;
}
#endif
if( (req=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,T_ALL)) == NULL )
{
PRMSG(1,
"TLIINETCreateListener: failed to allocate a t_bind\n",
0,0,0 );
return TRANS_CREATE_LISTENER_FAILED;
}
if( port && *port ) {
if(TRANS(TLIAddrToNetbuf)(ciptr->index,HOST_SELF,port,&(req->addr)) < 0)
{
PRMSG(1,
"TLIINETCreateListener: can't resolve name:HOST_SELF.%s\n",
port, 0,0 );
t_free((char *)req,T_BIND);
return TRANS_CREATE_LISTENER_FAILED;
}
} else {
sinaddr=(struct sockaddr_in *) req->addr.buf;
sinaddr->sin_family=AF_INET;
sinaddr->sin_port=htons(0);
sinaddr->sin_addr.s_addr=0;
}
/* Set the qlen */
req->qlen=1;
return TRANS(TLICreateListener)(ciptr, req);
}
static int
TRANS(TLITLICreateListener)(XtransConnInfo ciptr, char *port, unsigned int flags)
{
struct t_bind *req;
struct sockaddr_un *sunaddr;
int ret_value;
PRMSG(2,"TLITLICreateListener(%x->%d,%s)\n", ciptr, ciptr->fd,
port ? port : "NULL");
if( (req=(struct t_bind *)t_alloc(ciptr->fd,T_BIND,0)) == NULL )
{
PRMSG(1,
"TLITLICreateListener: failed to allocate a t_bind\n",
0,0,0 );
return TRANS_CREATE_LISTENER_FAILED;
}
if( (sunaddr=(struct sockaddr_un *)
malloc(sizeof(struct sockaddr_un))) == NULL )
{
PRMSG(1,
"TLITLICreateListener: failed to allocate a sockaddr_un\n",
0,0,0 );
t_free((char *)req,T_BIND);
return TRANS_CREATE_LISTENER_FAILED;
}
sunaddr->sun_family=AF_UNIX;
if( port && *port ) {
if( *port == '/' ) { /* A full pathname */
(void) strcpy(sunaddr->sun_path, port);
} else {
(void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port );
}
} else {
(void) sprintf(sunaddr->sun_path,"%s%d", TLINODENAME, getpid());
}
req->addr.buf=(char *)sunaddr;
req->addr.len=sizeof(*sunaddr);
req->addr.maxlen=sizeof(*sunaddr);
/* Set the qlen */
req->qlen=1;
ret_value = TRANS(TLICreateListener)(ciptr, req);
free((char *) sunaddr);
return ret_value;
}
static XtransConnInfo
TRANS(TLIAccept)(XtransConnInfo ciptr, int *status)
{
struct t_call *call;
XtransConnInfo newciptr;
int i;
PRMSG(2,"TLIAccept(%x->%d)\n", ciptr, ciptr->fd, 0 );
if( (call=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_ALL)) == NULL )
{
PRMSG(1, "TLIAccept() failed to allocate a t_call\n", 0,0,0 );
*status = TRANS_ACCEPT_BAD_MALLOC;
return NULL;
}
if( t_listen(ciptr->fd,call) < 0 )
{
extern char *t_errlist[];
extern int t_errno;
PRMSG(1, "TLIAccept() t_listen() failed\n", 0,0,0 );
PRMSG(1, "TLIAccept: %s\n", t_errlist[t_errno], 0,0 );
t_free((char *)call,T_CALL);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
/*
* Now we need to set up the new endpoint for the incoming connection.
*/
i=ciptr->index; /* Makes the next line more readable */
if( (newciptr=TRANS(TLIOpen)(TLItrans2devtab[i].devcotsname)) == NULL )
{
PRMSG(1, "TLIAccept() failed to open a new endpoint\n", 0,0,0 );
t_free((char *)call,T_CALL);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
if( TRANS(TLITLIBindLocal)(newciptr->fd,TLItrans2devtab[i].family,"") < 0 )
{
PRMSG(1,
"TLIAccept: TRANS(TLITLIBindLocal)() failed: %d\n",
errno, 0,0 );
t_free((char *)call,T_CALL);
t_close(newciptr->fd);
free(newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
if( t_accept(ciptr->fd,newciptr->fd,call) < 0 )
{
extern char *t_errlist[];
extern int t_errno;
PRMSG(1, "TLIAccept() t_accept() failed\n", 0,0,0 );
PRMSG(1, "TLIAccept: %s\n", t_errlist[t_errno], 0,0 );
if( t_errno == TLOOK )
{
int evtype = t_look(ciptr->fd);
PRMSG(1, "TLIAccept() t_look() returned %d\n", evtype,0,0 );
switch( evtype )
{
case T_DISCONNECT:
if( t_rcvdis(ciptr->fd, NULL) < 0 )
{
PRMSG(1, "TLIAccept() t_rcvdis() failed\n", 0,0,0 );
PRMSG(1, "TLIAccept: %s\n", t_errlist[t_errno], 0,0 );
}
break;
default:
break;
}
}
t_free((char *)call,T_CALL);
t_close(newciptr->fd);
free(newciptr);
*status = TRANS_ACCEPT_FAILED;
return NULL;
}
t_free((char *)call,T_CALL);
if( TRANS(TLIGetAddr)(newciptr) < 0 )
{
PRMSG(1,
"TLIAccept: TRANS(TLIGetPeerAddr)() failed: %d\n",
errno, 0,0 );
t_close(newciptr->fd);
free(newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
if( TRANS(TLIGetPeerAddr)(newciptr) < 0 )
{
PRMSG(1,
"TLIAccept: TRANS(TLIGetPeerAddr)() failed: %d\n",
errno, 0,0 );
t_close(newciptr->fd);
free(newciptr->addr);
free(newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
if( ioctl(newciptr->fd, I_POP,"timod") < 0 )
{
PRMSG(1, "TLIAccept() ioctl(I_POP, \"timod\") failed %d\n",
errno,0,0 );
t_close(newciptr->fd);
free(newciptr->addr);
free(newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
if( ioctl(newciptr->fd, I_PUSH,"tirdwr") < 0 )
{
PRMSG(1, "TLIAccept() ioctl(I_PUSH,\"tirdwr\") failed %d\n",
errno,0,0 );
t_close(newciptr->fd);
free(newciptr->addr);
free(newciptr);
*status = TRANS_ACCEPT_MISC_ERROR;
return NULL;
}
*status = 0;
return newciptr;
}
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
static int
TRANS(TLIConnect)(XtransConnInfo ciptr, struct t_call *sndcall )
{
PRMSG(2, "TLIConnect(%x->%d,%x)\n", ciptr, ciptr->fd, sndcall);
if( t_connect(ciptr->fd,sndcall,NULL) < 0 )
{
extern char *t_errlist[];
extern int t_errno;
PRMSG(1, "TLIConnect() t_connect() failed\n", 0,0,0 );
PRMSG(1, "TLIConnect: %s\n", t_errlist[t_errno], 0,0 );
t_free((char *)sndcall,T_CALL);
if (t_errno == TLOOK && t_look(ciptr->fd) == T_DISCONNECT)
{
t_rcvdis(ciptr->fd,NULL);
return TRANS_TRY_CONNECT_AGAIN;
}
else
return TRANS_CONNECT_FAILED;
}
t_free((char *)sndcall,T_CALL);
/*
* Sync up the address fields of ciptr.
*/
if( TRANS(TLIGetAddr)(ciptr) < 0 )
{
PRMSG(1,
"TLIConnect: ...TLIGetAddr() failed: %d\n",
errno, 0,0 );
return TRANS_CONNECT_FAILED;
}
if( TRANS(TLIGetPeerAddr)(ciptr) < 0 )
{
PRMSG(1,
"TLIConnect: ...TLIGetPeerAddr() failed: %d\n",
errno, 0,0 );
return TRANS_CONNECT_FAILED;
}
if( ioctl(ciptr->fd, I_POP,"timod") < 0 )
{
PRMSG(1, "TLIConnect() ioctl(I_POP,\"timod\") failed %d\n",
errno,0,0 );
return TRANS_CONNECT_FAILED;
}
if( ioctl(ciptr->fd, I_PUSH,"tirdwr") < 0 )
{
PRMSG(1, "TLIConnect() ioctl(I_PUSH,\"tirdwr\") failed %d\n",
errno,0,0 );
return TRANS_CONNECT_FAILED;
}
return 0;
}
static int
TRANS(TLIINETConnect)(XtransConnInfo ciptr, char *host, char *port)
{
char portbuf[PORTBUFSIZE];
struct t_call *sndcall;
long tmpport;
PRMSG(2, "TLIINETConnect(%s,%s)\n", host, port, 0);
#ifdef 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().
*/
if (is_numeric (port))
{
tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
sprintf(portbuf,"%u", tmpport );
port = portbuf;
}
#endif
if( (sndcall=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_ALL)) == NULL )
{
PRMSG(1, "TLIINETConnect() failed to allocate a t_call\n", 0,0,0 );
return TRANS_CONNECT_FAILED;
}
if( TRANS(TLIAddrToNetbuf)(ciptr->index, host, port, &(sndcall->addr) ) < 0 )
{
PRMSG(1, "TLIINETConnect() unable to resolve name:%s.%s\n",
host, port, 0 );
t_free((char *)sndcall,T_CALL);
return TRANS_CONNECT_FAILED;
}
return TRANS(TLIConnect)(ciptr, sndcall );
}
static int
TRANS(TLITLIConnect)(XtransConnInfo ciptr, char *host, char *port)
{
struct t_call *sndcall;
struct sockaddr_un *sunaddr;
int ret_value;
PRMSG(2, "TLITLIConnect(%s,%s)\n", host, port, 0);
if( (sndcall=(struct t_call *)t_alloc(ciptr->fd,T_CALL,T_OPT|T_UDATA)) == NULL )
{
PRMSG(1, "TLITLIConnect() failed to allocate a t_call\n", 0,0,0 );
return TRANS_CONNECT_FAILED;
}
if( (sunaddr=(struct sockaddr_un *)
malloc(sizeof(struct sockaddr_un))) == NULL )
{
PRMSG(1,
"TLITLIConnect: failed to allocate a sockaddr_un\n",
0,0,0 );
t_free((char *)sndcall,T_CALL);
return TRANS_CONNECT_FAILED;
}
sunaddr->sun_family=AF_UNIX;
if( *port == '/' ||
strncmp (port, TLINODENAME, strlen (TLINODENAME)) == 0) {
/* Use the port as is */
(void) strcpy(sunaddr->sun_path, port);
} else {
(void) sprintf(sunaddr->sun_path,"%s%s", TLINODENAME, port );
}
sndcall->addr.buf=(char *)sunaddr;
sndcall->addr.len=sizeof(*sunaddr);
sndcall->addr.maxlen=sizeof(*sunaddr);
ret_value = TRANS(TLIConnect)(ciptr, sndcall );
free((char *) sunaddr);
return ret_value;
}
#endif /* TRANS_CLIENT */
static int
TRANS(TLIBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend)
{
int ret;
struct pollfd filedes;
PRMSG(2, "TLIByteReadable(%x->%d,%x)\n", ciptr, ciptr->fd, pend );
/*
* This function should detect hangup conditions. Use poll to check
* if no data is present. On SVR4, the M_HANGUP message sits on the
* streams head, and ioctl(N_READ) keeps returning 0 because there is
* no data available. The hangup goes undetected, and the client hangs.
*/
ret=ioctl(ciptr->fd, I_NREAD, (char *)pend);
if( ret != 0 )
return ret; /* Data present or error */
/* Zero data, or POLLHUP message */
filedes.fd=ciptr->fd;
filedes.events=POLLIN;
ret=poll(&filedes, 1, 0);
if( ret == 0 ) {
*pend=0;
return 0; /* Really, no data */
}
if( ret < 0 )
return -1; /* just pass back the error */
if( filedes.revents & (POLLHUP|POLLERR) ) /* check for hangup */
return -1;
/* Should only get here if data arrived after the first ioctl() */
return ioctl(ciptr->fd, I_NREAD, (char *)pend);
}
static int
TRANS(TLIRead)(XtransConnInfo ciptr, char *buf, int size)
{
PRMSG(2, "TLIRead(%d,%x,%d)\n", ciptr->fd, buf, size );
return read(ciptr->fd,buf,size);
}
static int
TRANS(TLIWrite)(XtransConnInfo ciptr, char *buf, int size)
{
PRMSG(2, "TLIWrite(%d,%x,%d)\n", ciptr->fd, buf, size );
return write(ciptr->fd,buf,size);
}
static int
TRANS(TLIReadv)(XtransConnInfo ciptr, struct iovec *buf, int size)
{
PRMSG(2, "TLIReadv(%d,%x,%d)\n", ciptr->fd, buf, size );
return READV(ciptr,buf,size);
}
static int
TRANS(TLIWritev)(XtransConnInfo ciptr, struct iovec *buf, int size)
{
PRMSG(2, "TLIWritev(%d,%x,%d)\n", ciptr->fd, buf, size );
return WRITEV(ciptr,buf,size);
}
static int
TRANS(TLIDisconnect)(XtransConnInfo ciptr)
{
PRMSG(2, "TLIDisconnect(%x->%d)\n", ciptr, ciptr->fd, 0 );
/*
* Restore the TLI modules so that the connection can be properly shutdown.
* This avoids the situation where a connection goes into the TIME_WAIT
* state, and the address remains unavailable for a while.
*/
ioctl(ciptr->fd, I_POP,"tirdwr");
ioctl(ciptr->fd, I_PUSH,"timod");
t_snddis(ciptr->fd,NULL);
return 0;
}
static int
TRANS(TLIClose)(XtransConnInfo ciptr)
{
PRMSG(2, "TLIClose(%x->%d)\n", ciptr, ciptr->fd, 0 );
t_unbind(ciptr->fd);
return (t_close(ciptr->fd));
}
static int
TRANS(TLICloseForCloning)(XtransConnInfo ciptr)
{
/*
* Don't unbind.
*/
PRMSG(2, "TLICloseForCloning(%x->%d)\n", ciptr, ciptr->fd, 0 );
return (t_close(ciptr->fd));
}
Xtransport TRANS(TLITCPFuncs) = {
/* TLI Interface */
"tcp",
0,
#ifdef TRANS_CLIENT
TRANS(TLIOpenCOTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
NULL,
TRANS(TLIOpenCOTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(TLIOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(TLIOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
TRANS(TLIReopenCOTSServer),
TRANS(TLIReopenCLTSServer),
#endif
TRANS(TLISetOption),
#ifdef TRANS_SERVER
TRANS(TLIINETCreateListener),
NULL, /* ResetListener */
TRANS(TLIAccept),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(TLIINETConnect),
#endif /* TRANS_CLIENT */
TRANS(TLIBytesReadable),
TRANS(TLIRead),
TRANS(TLIWrite),
TRANS(TLIReadv),
TRANS(TLIWritev),
TRANS(TLIDisconnect),
TRANS(TLIClose),
TRANS(TLICloseForCloning),
};
#ifdef TRANS_SERVER
static char * inet_aliases[] = { "tcp", NULL };
#endif
Xtransport TRANS(TLIINETFuncs) = {
/* TLI Interface */
"inet",
TRANS_ALIAS,
#ifdef TRANS_CLIENT
TRANS(TLIOpenCOTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
inet_aliases,
TRANS(TLIOpenCOTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(TLIOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(TLIOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
TRANS(TLIReopenCOTSServer),
TRANS(TLIReopenCLTSServer),
#endif
TRANS(TLISetOption),
#ifdef TRANS_SERVER
TRANS(TLIINETCreateListener),
NULL, /* ResetListener */
TRANS(TLIAccept),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(TLIINETConnect),
#endif /* TRANS_CLIENT */
TRANS(TLIBytesReadable),
TRANS(TLIRead),
TRANS(TLIWrite),
TRANS(TLIReadv),
TRANS(TLIWritev),
TRANS(TLIDisconnect),
TRANS(TLIClose),
TRANS(TLICloseForCloning),
};
Xtransport TRANS(TLITLIFuncs) = {
/* TLI Interface */
"tli",
0,
#ifdef TRANS_CLIENT
TRANS(TLIOpenCOTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
NULL,
TRANS(TLIOpenCOTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(TLIOpenCLTSClient),
#endif /* TRANS_CLIENT */
#ifdef TRANS_SERVER
TRANS(TLIOpenCLTSServer),
#endif /* TRANS_SERVER */
#ifdef TRANS_REOPEN
TRANS(TLIReopenCOTSServer),
TRANS(TLIReopenCLTSServer),
#endif
TRANS(TLISetOption),
#ifdef TRANS_SERVER
TRANS(TLITLICreateListener),
NULL, /* ResetListener */
TRANS(TLIAccept),
#endif /* TRANS_SERVER */
#ifdef TRANS_CLIENT
TRANS(TLITLIConnect),
#endif /* TRANS_CLIENT */
TRANS(TLIBytesReadable),
TRANS(TLIRead),
TRANS(TLIWrite),
TRANS(TLIReadv),
TRANS(TLIWritev),
TRANS(TLIDisconnect),
TRANS(TLIClose),
TRANS(TLICloseForCloning),
};
...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from The Open Group. from The Open Group.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -57,7 +55,11 @@ from The Open Group. ...@@ -57,7 +55,11 @@ from The Open Group.
*/ */
#ifdef XTHREADS #ifdef XTHREADS
#include <nx-X11/Xthreads.h> #include <X11/Xthreads.h>
#endif
#ifdef WIN32
#include <X11/Xlibint.h>
#include <X11/Xwinsock.h>
#endif #endif
#ifdef X11_t #ifdef X11_t
...@@ -89,11 +91,11 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -89,11 +91,11 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
{ {
PRMSG(2,"ConvertAddress(%d,%d,%x)\n",*familyp,*addrlenp,*addrp); prmsg(2,"ConvertAddress(%d,%d,%p)\n",*familyp,*addrlenp,*addrp);
switch( *familyp ) switch( *familyp )
{ {
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
case AF_INET: case AF_INET:
{ {
/* /*
...@@ -140,7 +142,7 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -140,7 +142,7 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
{ {
*familyp=FamilyLocal; *familyp=FamilyLocal;
} }
else else
{ {
*familyp=FamilyInternet; *familyp=FamilyInternet;
*addrlenp = sizeof (struct in_addr); *addrlenp = sizeof (struct in_addr);
...@@ -156,30 +158,16 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -156,30 +158,16 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
break; break;
} }
#endif /* IPv6 */ #endif /* IPv6 */
#endif /* defined(TCPCONN) || defined(STREAMSCONN) */ #endif /* defined(TCPCONN) */
#if defined(DNETCONN)
case AF_DECnet:
{
struct sockaddr_dn saddr;
memcpy (&saddr, *addrp, sizeof (struct sockaddr_dn));
*familyp=FamilyDECnet;
*addrlenp=sizeof(struct dn_naddr);
memcpy(*addrp,&saddr.sdn_add,*addrlenp);
break; #if defined(UNIXCONN) || defined(LOCALCONN)
}
#endif /* defined(DNETCONN) */
#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)
case AF_UNIX: case AF_UNIX:
{ {
*familyp=FamilyLocal; *familyp=FamilyLocal;
break; break;
} }
#endif /* defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN)*/ #endif /* defined(UNIXCONN) || defined(LOCALCONN) */
#if (defined(__SCO__) || defined(__UNIXWARE__)) && defined(LOCALCONN) #if (defined(__SCO__) || defined(__UNIXWARE__)) && defined(LOCALCONN)
case 0: case 0:
...@@ -190,8 +178,8 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -190,8 +178,8 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
#endif #endif
default: default:
PRMSG(1,"ConvertAddress: Unknown family type %d\n", prmsg(1,"ConvertAddress: Unknown family type %d\n",
*familyp, 0,0 ); *familyp);
return -1; return -1;
} }
...@@ -202,18 +190,18 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -202,18 +190,18 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
* In the case of a local connection, we need to get the * In the case of a local connection, we need to get the
* host name for authentication. * host name for authentication.
*/ */
char hostnamebuf[256]; char hostnamebuf[256];
int len = TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf); int len = TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf);
if (len > 0) { if (len > 0) {
if (*addrp && *addrlenp < (len + 1)) if (*addrp && *addrlenp < (len + 1))
{ {
free ((char *) *addrp); free (*addrp);
*addrp = NULL; *addrp = NULL;
} }
if (!*addrp) if (!*addrp)
*addrp = (Xtransaddr *) malloc (len + 1); *addrp = malloc (len + 1);
if (*addrp) { if (*addrp) {
strcpy ((char *) *addrp, hostnamebuf); strcpy ((char *) *addrp, hostnamebuf);
*addrlenp = len; *addrlenp = len;
...@@ -224,7 +212,7 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -224,7 +212,7 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
else else
{ {
if (*addrp) if (*addrp)
free ((char *) *addrp); free (*addrp);
*addrp = NULL; *addrp = NULL;
*addrlenp = 0; *addrlenp = 0;
} }
...@@ -237,6 +225,13 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp) ...@@ -237,6 +225,13 @@ TRANS(ConvertAddress)(int *familyp, int *addrlenp, Xtransaddr **addrp)
#ifdef ICE_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> #include <signal.h>
char * char *
...@@ -247,7 +242,7 @@ TRANS(GetMyNetworkId) (XtransConnInfo ciptr) ...@@ -247,7 +242,7 @@ TRANS(GetMyNetworkId) (XtransConnInfo ciptr)
char *addr = ciptr->addr; char *addr = ciptr->addr;
char hostnamebuf[256]; char hostnamebuf[256];
char *networkId = NULL; char *networkId = NULL;
char *transName = ciptr->transptr->TransName; const char *transName = ciptr->transptr->TransName;
if (gethostname (hostnamebuf, sizeof (hostnamebuf)) < 0) if (gethostname (hostnamebuf, sizeof (hostnamebuf)) < 0)
{ {
...@@ -256,19 +251,19 @@ TRANS(GetMyNetworkId) (XtransConnInfo ciptr) ...@@ -256,19 +251,19 @@ TRANS(GetMyNetworkId) (XtransConnInfo ciptr)
switch (family) switch (family)
{ {
#if defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) #if defined(UNIXCONN) || defined(LOCALCONN)
case AF_UNIX: case AF_UNIX:
{ {
struct sockaddr_un *saddr = (struct sockaddr_un *) addr; struct sockaddr_un *saddr = (struct sockaddr_un *) addr;
networkId = (char *) malloc (3 + strlen (transName) + networkId = malloc (3 + strlen (transName) +
strlen (hostnamebuf) + strlen (saddr->sun_path)); strlen (hostnamebuf) + strlen (saddr->sun_path));
sprintf (networkId, "%s/%s:%s", transName, sprintf (networkId, "%s/%s:%s", transName,
hostnamebuf, saddr->sun_path); hostnamebuf, saddr->sun_path);
break; break;
} }
#endif /* defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) */ #endif /* defined(UNIXCONN) || defined(LOCALCONN) */
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
case AF_INET: case AF_INET:
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
case AF_INET6: case AF_INET6:
...@@ -289,26 +284,14 @@ TRANS(GetMyNetworkId) (XtransConnInfo ciptr) ...@@ -289,26 +284,14 @@ TRANS(GetMyNetworkId) (XtransConnInfo ciptr)
#endif #endif
portnum = ntohs (saddr->sin_port); portnum = ntohs (saddr->sin_port);
sprintf (portnumbuf, "%d", portnum); snprintf (portnumbuf, sizeof(portnumbuf), "%d", portnum);
networkId = (char *) malloc (3 + strlen (transName) + networkId = malloc (3 + strlen (transName) +
strlen (hostnamebuf) + strlen (portnumbuf)); strlen (hostnamebuf) + strlen (portnumbuf));
sprintf (networkId, "%s/%s:%s", transName, hostnamebuf, portnumbuf); sprintf (networkId, "%s/%s:%s", transName, hostnamebuf, portnumbuf);
break; break;
} }
#endif /* defined(TCPCONN) || defined(STREAMSCONN) */ #endif /* defined(TCPCONN) */
#if defined(DNETCONN)
case AF_DECnet:
{
struct sockaddr_dn *saddr = (struct sockaddr_dn *) addr;
networkId = (char *) malloc (
13 + strlen (hostnamebuf) + saddr->sdn_objnamel);
sprintf (networkId, "dnet/%s::%s",
hostnamebuf, saddr->sdn_objname);
break;
}
#endif /* defined(DNETCONN) */
default: default:
break; break;
...@@ -323,24 +306,12 @@ static jmp_buf env; ...@@ -323,24 +306,12 @@ static jmp_buf env;
#ifdef SIGALRM #ifdef SIGALRM
static volatile int nameserver_timedout = 0; static volatile int nameserver_timedout = 0;
static static void
#ifdef RETSIGTYPE /* set by autoconf AC_TYPE_SIGNAL */ nameserver_lost(int sig _X_UNUSED)
RETSIGTYPE
#else /* Imake */
#ifdef SIGNALRETURNSINT
int
#else
void
#endif
#endif
nameserver_lost(int sig)
{ {
nameserver_timedout = 1; nameserver_timedout = 1;
longjmp (env, -1); longjmp (env, -1);
/* NOTREACHED */ /* NOTREACHED */
#ifdef SIGNALRETURNSINT
return -1; /* for picky compilers */
#endif
} }
#endif /* SIGALARM */ #endif /* SIGALARM */
...@@ -358,16 +329,16 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) ...@@ -358,16 +329,16 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr)
switch (family) switch (family)
{ {
case AF_UNSPEC: case AF_UNSPEC:
#if defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) #if defined(UNIXCONN) || defined(LOCALCONN)
case AF_UNIX: case AF_UNIX:
{ {
if (gethostname (addrbuf, sizeof (addrbuf)) == 0) if (gethostname (addrbuf, sizeof (addrbuf)) == 0)
addr = addrbuf; addr = addrbuf;
break; break;
} }
#endif /* defined(UNIXCONN) || defined(STREAMSCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) */ #endif /* defined(UNIXCONN) || defined(LOCALCONN) */
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
case AF_INET: case AF_INET:
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
case AF_INET6: case AF_INET6:
...@@ -403,7 +374,7 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) ...@@ -403,7 +374,7 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr)
* Assume that if it does not respond in NAMESERVER_TIMEOUT seconds * Assume that if it does not respond in NAMESERVER_TIMEOUT seconds
* that something is wrong and do not make the user wait. * that something is wrong and do not make the user wait.
* gethostbyaddr will continue after a signal, so we have to * gethostbyaddr will continue after a signal, so we have to
* jump out of it. * jump out of it.
*/ */
nameserver_timedout = 0; nameserver_timedout = 0;
...@@ -427,32 +398,15 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) ...@@ -427,32 +398,15 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr)
break; break;
} }
#endif /* defined(TCPCONN) || defined(STREAMSCONN) */ #endif /* defined(TCPCONN) */
#if defined(DNETCONN)
case AF_DECnet:
{
struct sockaddr_dn *saddr = (struct sockaddr_dn *) peer_addr;
struct nodeent *np;
if (np = getnodebyaddr(saddr->sdn_add.a_addr,
saddr->sdn_add.a_len, AF_DECnet)) {
sprintf(addrbuf, "%s:", np->n_name);
} else {
sprintf(addrbuf, "%s:", dnet_htoa(&saddr->sdn_add));
}
addr = addrbuf;
break;
}
#endif /* defined(DNETCONN) */
default: default:
return (NULL); return (NULL);
} }
hostname = (char *) malloc ( hostname = malloc (strlen (ciptr->transptr->TransName) + strlen (addr) + 2);
strlen (ciptr->transptr->TransName) + strlen (addr) + 2);
strcpy (hostname, ciptr->transptr->TransName); strcpy (hostname, ciptr->transptr->TransName);
strcat (hostname, "/"); strcat (hostname, "/");
if (addr) if (addr)
...@@ -464,24 +418,24 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr) ...@@ -464,24 +418,24 @@ TRANS(GetPeerNetworkId) (XtransConnInfo ciptr)
#endif /* ICE_t */ #endif /* ICE_t */
#if defined(WIN32) && (defined(TCPCONN) || defined(DNETCONN)) #if defined(WIN32) && defined(TCPCONN)
int int
TRANS(WSAStartup) (void) TRANS(WSAStartup) (void)
{ {
static WSADATA wsadata; static WSADATA wsadata;
PRMSG (2,"WSAStartup()\n", 0, 0, 0); prmsg (2,"WSAStartup()\n");
if (!wsadata.wVersion && WSAStartup(0x0101, &wsadata)) if (!wsadata.wVersion && WSAStartup(MAKEWORD(2,2), &wsadata))
return 1; return 1;
return 0; return 0;
} }
#endif #endif
#include <ctype.h>
static int static int
is_numeric (char *str) is_numeric (const char *str)
{ {
int i; int i;
...@@ -511,20 +465,20 @@ is_numeric (char *str) ...@@ -511,20 +465,20 @@ is_numeric (char *str)
* it's not save if the directory has non-root ownership or the sticky * it's not save if the directory has non-root ownership or the sticky
* bit cannot be set and fail. * bit cannot be set and fail.
*/ */
static int static int
trans_mkdir(char *path, int mode) trans_mkdir(const char *path, int mode)
{ {
struct stat buf; struct stat buf;
if (lstat(path, &buf) != 0) { if (lstat(path, &buf) != 0) {
if (errno != ENOENT) { if (errno != ENOENT) {
PRMSG(1, "mkdir: ERROR: (l)stat failed for %s (%d)\n", prmsg(1, "mkdir: ERROR: (l)stat failed for %s (%d)\n",
path, errno, 0); path, errno);
return -1; return -1;
} }
/* Dir doesn't exist. Try to create it */ /* Dir doesn't exist. Try to create it */
#ifndef WIN32 #if !defined(WIN32) && !defined(__CYGWIN__)
/* /*
* 'sticky' bit requested: assume application makes * 'sticky' bit requested: assume application makes
* certain security implications. If effective user ID * certain security implications. If effective user ID
...@@ -532,15 +486,15 @@ trans_mkdir(char *path, int mode) ...@@ -532,15 +486,15 @@ trans_mkdir(char *path, int mode)
*/ */
if (geteuid() != 0) { if (geteuid() != 0) {
if (mode & 01000) { if (mode & 01000) {
PRMSG(1, "mkdir: ERROR: euid != 0," prmsg(1, "mkdir: ERROR: euid != 0,"
"directory %s will not be created.\n", "directory %s will not be created.\n",
path, 0, 0); path);
#ifdef FAIL_HARD #ifdef FAIL_HARD
return -1; return -1;
#endif #endif
} else { } else {
PRMSG(1, "mkdir: Cannot create %s with root ownership\n", prmsg(1, "mkdir: Cannot create %s with root ownership\n",
path, 0, 0); path);
} }
} }
#endif #endif
...@@ -548,8 +502,8 @@ trans_mkdir(char *path, int mode) ...@@ -548,8 +502,8 @@ trans_mkdir(char *path, int mode)
#ifndef WIN32 #ifndef WIN32
if (mkdir(path, mode) == 0) { if (mkdir(path, mode) == 0) {
if (chmod(path, mode)) { if (chmod(path, mode)) {
PRMSG(1, "mkdir: ERROR: Mode of %s should be set to %04o\n", prmsg(1, "mkdir: ERROR: Mode of %s should be set to %04o\n",
path, mode, 0); path, mode);
#ifdef FAIL_HARD #ifdef FAIL_HARD
return -1; return -1;
#endif #endif
...@@ -558,13 +512,13 @@ trans_mkdir(char *path, int mode) ...@@ -558,13 +512,13 @@ trans_mkdir(char *path, int mode)
if (mkdir(path) == 0) { if (mkdir(path) == 0) {
#endif #endif
} else { } else {
PRMSG(1, "mkdir: ERROR: Cannot create %s\n", prmsg(1, "mkdir: ERROR: Cannot create %s\n",
path, 0, 0); path);
return -1; return -1;
} }
return 0; return 0;
} else { } else {
if (S_ISDIR(buf.st_mode)) { if (S_ISDIR(buf.st_mode)) {
int updateOwner = 0; int updateOwner = 0;
...@@ -583,7 +537,7 @@ trans_mkdir(char *path, int mode) ...@@ -583,7 +537,7 @@ trans_mkdir(char *path, int mode)
*/ */
if ((~mode) & 0077 & buf.st_mode) if ((~mode) & 0077 & buf.st_mode)
updateMode = 1; updateMode = 1;
/* /*
* If the directory is not writeable not everybody may * If the directory is not writeable not everybody may
* be able to create sockets. Therefore warn if mode * be able to create sockets. Therefore warn if mode
...@@ -593,7 +547,7 @@ trans_mkdir(char *path, int mode) ...@@ -593,7 +547,7 @@ trans_mkdir(char *path, int mode)
updateMode = 1; updateMode = 1;
status |= WARN_NO_ACCESS; status |= WARN_NO_ACCESS;
} }
/* /*
* If 'sticky' bit is requested fail if owner isn't root * If 'sticky' bit is requested fail if owner isn't root
* as we assume the caller makes certain security implications * as we assume the caller makes certain security implications
...@@ -605,7 +559,7 @@ trans_mkdir(char *path, int mode) ...@@ -605,7 +559,7 @@ trans_mkdir(char *path, int mode)
updateMode = 1; updateMode = 1;
} }
} }
#ifdef HAS_FCHOWN #ifdef HAS_FCHOWN
/* /*
* If fchown(2) and fchmod(2) are available, try to correct the * If fchown(2) and fchmod(2) are available, try to correct the
...@@ -617,8 +571,9 @@ trans_mkdir(char *path, int mode) ...@@ -617,8 +571,9 @@ trans_mkdir(char *path, int mode)
struct stat fbuf; struct stat fbuf;
if ((fd = open(path, O_RDONLY)) != -1) { if ((fd = open(path, O_RDONLY)) != -1) {
if (fstat(fd, &fbuf) == -1) { if (fstat(fd, &fbuf) == -1) {
PRMSG(1, "mkdir: ERROR: fstat failed for %s (%d)\n", prmsg(1, "mkdir: ERROR: fstat failed for %s (%d)\n",
path, errno, 0); path, errno);
close(fd);
return -1; return -1;
} }
/* /*
...@@ -628,8 +583,9 @@ trans_mkdir(char *path, int mode) ...@@ -628,8 +583,9 @@ trans_mkdir(char *path, int mode)
if (!S_ISDIR(fbuf.st_mode) || if (!S_ISDIR(fbuf.st_mode) ||
buf.st_dev != fbuf.st_dev || buf.st_dev != fbuf.st_dev ||
buf.st_ino != fbuf.st_ino) { buf.st_ino != fbuf.st_ino) {
PRMSG(1, "mkdir: ERROR: inode for %s changed\n", prmsg(1, "mkdir: ERROR: inode for %s changed\n",
path, 0, 0); path);
close(fd);
return -1; return -1;
} }
if (updateOwner && fchown(fd, 0, 0) == 0) if (updateOwner && fchown(fd, 0, 0) == 0)
...@@ -640,32 +596,33 @@ trans_mkdir(char *path, int mode) ...@@ -640,32 +596,33 @@ trans_mkdir(char *path, int mode)
} }
} }
#endif #endif
if (updateOwner && !updatedOwner) { if (updateOwner && !updatedOwner) {
#ifdef FAIL_HARD #ifdef FAIL_HARD
if (status & FAIL_IF_NOT_ROOT) { if (status & FAIL_IF_NOT_ROOT) {
PRMSG(1, "mkdir: ERROR: Owner of %s must be set to root\n", prmsg(1, "mkdir: ERROR: Owner of %s must be set to root\n",
path, 0, 0); path);
return -1; return -1;
} }
#endif #endif
PRMSG(1, "mkdir: Owner of %s should be set to root\n", #if !defined(__APPLE_CC__) && !defined(__CYGWIN__)
path, 0, 0); prmsg(1, "mkdir: Owner of %s should be set to root\n",
path);
#endif
} }
if (updateMode && !updatedMode) { if (updateMode && !updatedMode) {
#ifdef FAIL_HARD #ifdef FAIL_HARD
if (status & FAIL_IF_NOMODE) { if (status & FAIL_IF_NOMODE) {
PRMSG(1, "mkdir: ERROR: Mode of %s must be set to %04o\n", prmsg(1, "mkdir: ERROR: Mode of %s must be set to %04o\n",
path, mode, 0); path, mode);
return -1; return -1;
} }
#endif #endif
PRMSG(1, "mkdir: Mode of %s should be set to %04o\n", prmsg(1, "mkdir: Mode of %s should be set to %04o\n",
path, mode, 0); path, mode);
if (status & WARN_NO_ACCESS) { if (status & WARN_NO_ACCESS) {
PRMSG(1, "mkdir: this may cause subsequent errors\n", prmsg(1, "mkdir: this may cause subsequent errors\n");
0, 0, 0);
} }
} }
return 0; return 0;
......
...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or ...@@ -24,9 +24,7 @@ not be used in advertising or otherwise to promote the sale, use or
other dealings in this Software without prior written authorization other dealings in this Software without prior written authorization
from The Open Group. from The Open Group.
*/ * Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
/* Copyright 1993, 1994 NCR Corporation - Dayton, Ohio, USA
* *
* All Rights Reserved * All Rights Reserved
* *
...@@ -49,32 +47,28 @@ from The Open Group. ...@@ -49,32 +47,28 @@ from The Open Group.
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/ */
#ifdef __UNIXOS2__
#define I_NEED_OS2_H
#endif
#ifdef XSERV_t
#include "os.h"
#else
#include <stdlib.h> #include <stdlib.h>
#endif
#define XTRANS_TRANSPORT_C /* used to flag Xtransint.h that it's being used
here, not just #included in another file */
#include "Xtransint.h" #include "Xtransint.h"
#ifdef DNETCONN #ifdef __clang__
#include "Xtransdnet.c" #pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wformat-nonliteral"
#pragma clang diagnostic ignored "-Wdeprecated-declarations"
#endif #endif
#ifdef LOCALCONN #ifdef LOCALCONN
#include "Xtranslcl.c" #include "Xtranslcl.c"
#endif #endif
#ifdef OS2PIPECONN
#include "Xtransos2.c"
#endif
#if defined(TCPCONN) || defined(UNIXCONN) #if defined(TCPCONN) || defined(UNIXCONN)
#include "Xtranssock.c" #include "Xtranssock.c"
#endif #endif
#ifdef STREAMSCONN
#include "Xtranstli.c"
#endif
#include "Xtrans.c" #include "Xtrans.c"
#include "Xtransutil.c" #include "Xtransutil.c"
#ifdef __clang__
#pragma clang diagnostic pop
#endif
...@@ -852,7 +852,7 @@ property Woo-Hoo OhBoy = "*son" ad ...@@ -852,7 +852,7 @@ property Woo-Hoo OhBoy = "*son" ad
.fi .fi
.SH "NETWORK CONNECTIONS" .SH "NETWORK CONNECTIONS"
The X server supports client connections via a platform-dependent subset of The X server supports client connections via a platform-dependent subset of
the following transport types: TCP\/IP, Unix Domain sockets, DECnet, the following transport types: TCP\/IP, Unix Domain sockets
and several varieties of SVR4 local connections. See the DISPLAY and several varieties of SVR4 local connections. See the DISPLAY
NAMES section of the \fIX\fP(__miscmansuffix__) manual page to learn how to NAMES section of the \fIX\fP(__miscmansuffix__) manual page to learn how to
specify which transport type clients should try to use. specify which transport type clients should try to use.
...@@ -882,9 +882,9 @@ If no other authorization mechanism is being used, ...@@ -882,9 +882,9 @@ If no other authorization mechanism is being used,
this list initially consists of the host on which the server is running as this list initially consists of the host on which the server is running as
well as any machines listed in the file \fI/etc/X\fBn\fI.hosts\fR, where well as any machines listed in the file \fI/etc/X\fBn\fI.hosts\fR, where
\fBn\fP is the display number of the server. Each line of the file should \fBn\fP is the display number of the server. Each line of the file should
contain either an Internet hostname (e.g. expo.lcs.mit.edu) or a DECnet contain either an Internet hostname (e.g. expo.lcs.mit.edu) or a complete
hostname in double colon format (e.g. hydra::) or a complete name in the format name in the format \fIfamily\fP:\fIname\fP as described in the
\fIfamily\fP:\fIname\fP as described in the \fIxhost\fP(1) manual page. \fIxhost\fP(1) manual page.
There should be no leading or trailing spaces on any lines. For example: There should be no leading or trailing spaces on any lines. For example:
.sp .sp
.in +8 .in +8
......
...@@ -84,13 +84,9 @@ SOFTWARE. ...@@ -84,13 +84,9 @@ SOFTWARE.
#include <sys/ioctl.h> #include <sys/ioctl.h>
#include <ctype.h> #include <ctype.h>
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(ISC) || defined(__SCO__) #if defined(TCPCONN) || defined(ISC) || defined(__SCO__)
#include <netinet/in.h> #include <netinet/in.h>
#endif /* TCPCONN || STREAMSCONN || ISC || __SCO__ */ #endif /* TCPCONN || ISC || __SCO__ */
#ifdef DNETCONN
#include <netdnet/dn.h>
#include <netdnet/dnetdb.h>
#endif
#ifdef HAS_GETPEERUCRED #ifdef HAS_GETPEERUCRED
# include <ucred.h> # include <ucred.h>
...@@ -529,7 +525,7 @@ DefineSelf (int fd) ...@@ -529,7 +525,7 @@ DefineSelf (int fd)
void void
DefineSelf (int fd) DefineSelf (int fd)
{ {
#if !defined(TCPCONN) && !defined(STREAMSCONN) && !defined(UNIXCONN) && !defined(MNX_TCPCONN) #if !defined(TCPCONN) && !defined(UNIXCONN) && !defined(MNX_TCPCONN)
return; return;
#else #else
register int n; register int n;
...@@ -672,7 +668,7 @@ DefineLocalHost: ...@@ -672,7 +668,7 @@ DefineLocalHost:
selfhosts = host; selfhosts = host;
} }
} }
#endif /* !TCPCONN && !STREAMSCONN && !UNIXCONN && !MNX_TCPCONN */ #endif /* !TCPCONN && !UNIXCONN && !MNX_TCPCONN */
} }
#else #else
...@@ -740,35 +736,6 @@ DefineSelf (int fd) ...@@ -740,35 +736,6 @@ DefineSelf (int fd)
int family; int family;
register HOST *host; register HOST *host;
#ifdef DNETCONN
struct dn_naddr *dnaddr = getnodeadd();
/*
* AF_DECnet may not be listed in the interface list. Instead use
* the supported library call to find out the local address (if any).
*/
if (dnaddr)
{
addr = (unsigned char *) dnaddr;
len = dnaddr->a_len + sizeof(dnaddr->a_len);
family = FamilyDECnet;
for (host = selfhosts;
host && !addrEqual (family, addr, len, host);
host = host->next)
;
if (!host)
{
MakeHost(host,len)
if (host)
{
host->family = family;
host->len = len;
acopy(addr, host->addr, len);
host->next = selfhosts;
selfhosts = host;
}
}
}
#endif /* DNETCONN */
#ifndef HAS_GETIFADDRS #ifndef HAS_GETIFADDRS
len = sizeof(buf); len = sizeof(buf);
...@@ -823,13 +790,6 @@ DefineSelf (int fd) ...@@ -823,13 +790,6 @@ DefineSelf (int fd)
len = ifraddr_size (IFR_IFR_ADDR); len = ifraddr_size (IFR_IFR_ADDR);
family = ConvertAddr ((struct sockaddr *) &IFR_IFR_ADDR, family = ConvertAddr ((struct sockaddr *) &IFR_IFR_ADDR,
&len, (void **)&addr); &len, (void **)&addr);
#ifdef DNETCONN
/*
* DECnet was handled up above.
*/
if (family == AF_DECnet)
continue;
#endif /* DNETCONN */
if (family == -1 || family == FamilyLocal) if (family == -1 || family == FamilyLocal)
continue; continue;
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
...@@ -975,10 +935,6 @@ DefineSelf (int fd) ...@@ -975,10 +935,6 @@ DefineSelf (int fd)
return; return;
} }
for (ifr = ifap; ifr != NULL; ifr = ifr->ifa_next) { for (ifr = ifap; ifr != NULL; ifr = ifr->ifa_next) {
#ifdef DNETCONN
if (ifr->ifa_addr.sa_family == AF_DECnet)
continue;
#endif /* DNETCONN */
len = sizeof(*(ifr->ifa_addr)); len = sizeof(*(ifr->ifa_addr));
family = ConvertAddr(ifr->ifa_addr, &len, (void **)&addr); family = ConvertAddr(ifr->ifa_addr, &len, (void **)&addr);
if (family == -1 || family == FamilyLocal) if (family == -1 || family == FamilyLocal)
...@@ -1154,22 +1110,15 @@ ResetHosts (char *display) ...@@ -1154,22 +1110,15 @@ ResetHosts (char *display)
FILE *fd; FILE *fd;
char *ptr; char *ptr;
int i, hostlen; int i, hostlen;
#if ((defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN)) && \ #if ((defined(TCPCONN) || defined(MNX_TCPCONN)) && \
(!defined(IPv6) || !defined(AF_INET6))) || defined(DNETCONN) (!defined(IPv6) || !defined(AF_INET6)))
union { union {
struct sockaddr sa; struct sockaddr sa;
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) #if defined(TCPCONN) || defined(MNX_TCPCONN)
struct sockaddr_in in; struct sockaddr_in in;
#endif /* TCPCONN || STREAMSCONN */ #endif /* TCPCONN */
#ifdef DNETCONN
struct sockaddr_dn dn;
#endif
} saddr; } saddr;
#endif #endif
#ifdef DNETCONN
struct nodeent *np;
struct dn_naddr dnaddr, *dnaddrp, *dnet_addr();
#endif
int family = 0; int family = 0;
void *addr = NULL; void *addr = NULL;
int len; int len;
...@@ -1217,7 +1166,7 @@ ResetHosts (char *display) ...@@ -1217,7 +1166,7 @@ ResetHosts (char *display)
NewHost(family, "", 0, FALSE); NewHost(family, "", 0, FALSE);
LocalHostRequested = TRUE; /* Fix for XFree86 bug #156 */ LocalHostRequested = TRUE; /* Fix for XFree86 bug #156 */
} }
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) #if defined(TCPCONN) || defined(MNX_TCPCONN)
else if (!strncmp("inet:", lhostname, 5)) else if (!strncmp("inet:", lhostname, 5))
{ {
family = FamilyInternet; family = FamilyInternet;
...@@ -1231,13 +1180,6 @@ ResetHosts (char *display) ...@@ -1231,13 +1180,6 @@ ResetHosts (char *display)
} }
#endif #endif
#endif #endif
#ifdef DNETCONN
else if (!strncmp("dnet:", lhostname, 5))
{
family = FamilyDECnet;
hostname = ohostname + 5;
}
#endif
#ifdef SECURE_RPC #ifdef SECURE_RPC
else if (!strncmp("nis:", lhostname, 4)) else if (!strncmp("nis:", lhostname, 4))
{ {
...@@ -1261,32 +1203,6 @@ ResetHosts (char *display) ...@@ -1261,32 +1203,6 @@ ResetHosts (char *display)
} }
} }
else else
#ifdef DNETCONN
if ((family == FamilyDECnet) || ((family == FamilyWild) &&
(ptr = strchr(hostname, ':')) && (*(ptr + 1) == ':') &&
!(*ptr = '\0'))) /* bash trailing colons if necessary */
{
/* node name (DECnet names end in "::") */
dnaddrp = dnet_addr(hostname);
if (!dnaddrp && (np = getnodebyname (hostname)))
{
/* node was specified by name */
saddr.sa.sa_family = np->n_addrtype;
len = sizeof(saddr.sa);
if (ConvertAddr (&saddr.sa, &len, (void **)&addr) == FamilyDECnet)
{
bzero ((char *) &dnaddr, sizeof (dnaddr));
dnaddr.a_len = np->n_length;
acopy (np->n_addr, dnaddr.a_addr, np->n_length);
dnaddrp = &dnaddr;
}
}
if (dnaddrp)
(void) NewHost(FamilyDECnet, (void *)dnaddrp,
(int)(dnaddrp->a_len + sizeof(dnaddrp->a_len)), FALSE);
}
else
#endif /* DNETCONN */
#ifdef SECURE_RPC #ifdef SECURE_RPC
if ((family == FamilyNetname) || (strchr(hostname, '@'))) if ((family == FamilyNetname) || (strchr(hostname, '@')))
{ {
...@@ -1295,7 +1211,7 @@ ResetHosts (char *display) ...@@ -1295,7 +1211,7 @@ ResetHosts (char *display)
} }
else else
#endif /* SECURE_RPC */ #endif /* SECURE_RPC */
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) #if defined(TCPCONN) || defined(MNX_TCPCONN)
{ {
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
if ( (family == FamilyInternet) || (family == FamilyInternet6) || if ( (family == FamilyInternet) || (family == FamilyInternet6) ||
...@@ -1345,7 +1261,7 @@ ResetHosts (char *display) ...@@ -1345,7 +1261,7 @@ ResetHosts (char *display)
} }
#endif /* IPv6 */ #endif /* IPv6 */
} }
#endif /* TCPCONN || STREAMSCONN */ #endif /* TCPCONN */
family = FamilyWild; family = FamilyWild;
} }
fclose (fd); fclose (fd);
...@@ -1542,7 +1458,6 @@ AddHost (ClientPtr client, ...@@ -1542,7 +1458,6 @@ AddHost (ClientPtr client,
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
case FamilyInternet6: case FamilyInternet6:
#endif #endif
case FamilyDECnet:
case FamilyChaos: case FamilyChaos:
case FamilyServerInterpreted: case FamilyServerInterpreted:
if ((len = CheckAddr (family, pAddr, length)) < 0) if ((len = CheckAddr (family, pAddr, length)) < 0)
...@@ -1639,7 +1554,6 @@ RemoveHost ( ...@@ -1639,7 +1554,6 @@ RemoveHost (
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
case FamilyInternet6: case FamilyInternet6:
#endif #endif
case FamilyDECnet:
case FamilyChaos: case FamilyChaos:
case FamilyServerInterpreted: case FamilyServerInterpreted:
if ((len = CheckAddr (family, pAddr, length)) < 0) if ((len = CheckAddr (family, pAddr, length)) < 0)
...@@ -1728,7 +1642,7 @@ CheckAddr ( ...@@ -1728,7 +1642,7 @@ CheckAddr (
switch (family) switch (family)
{ {
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) #if defined(TCPCONN) || defined(MNX_TCPCONN)
case FamilyInternet: case FamilyInternet:
if (length == sizeof (struct in_addr)) if (length == sizeof (struct in_addr))
len = length; len = length;
...@@ -1744,21 +1658,6 @@ CheckAddr ( ...@@ -1744,21 +1658,6 @@ CheckAddr (
break; break;
#endif #endif
#endif #endif
#ifdef DNETCONN
case FamilyDECnet:
{
struct dn_naddr *dnaddr = (struct dn_naddr *) pAddr;
if ((length < sizeof(dnaddr->a_len)) ||
(length < dnaddr->a_len + sizeof(dnaddr->a_len)))
len = -1;
else
len = dnaddr->a_len + sizeof(dnaddr->a_len);
if (len > sizeof(struct dn_naddr))
len = -1;
}
break;
#endif
case FamilyServerInterpreted: case FamilyServerInterpreted:
len = siCheckAddr(pAddr, length); len = siCheckAddr(pAddr, length);
break; break;
...@@ -1832,11 +1731,11 @@ ConvertAddr ( ...@@ -1832,11 +1731,11 @@ ConvertAddr (
switch (saddr->sa_family) switch (saddr->sa_family)
{ {
case AF_UNSPEC: case AF_UNSPEC:
#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) #if defined(UNIXCONN) || defined(LOCALCONN)
case AF_UNIX: case AF_UNIX:
#endif #endif
return FamilyLocal; return FamilyLocal;
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) #if defined(TCPCONN) || defined(MNX_TCPCONN)
case AF_INET: case AF_INET:
#ifdef WIN32 #ifdef WIN32
if (16777343 == *(long*)&((struct sockaddr_in *) saddr)->sin_addr) if (16777343 == *(long*)&((struct sockaddr_in *) saddr)->sin_addr)
...@@ -1861,15 +1760,6 @@ ConvertAddr ( ...@@ -1861,15 +1760,6 @@ ConvertAddr (
} }
#endif #endif
#endif #endif
#ifdef DNETCONN
case AF_DECnet:
{
struct sockaddr_dn *sdn = (struct sockaddr_dn *) saddr;
*len = sdn->sdn_nodeaddrl + sizeof(sdn->sdn_nodeaddrl);
*addr = (void *) &(sdn->sdn_add);
}
return FamilyDECnet;
#endif
#ifdef CHAOSCONN #ifdef CHAOSCONN
case AF_CHAOS: case AF_CHAOS:
{ {
......
...@@ -112,7 +112,7 @@ SOFTWARE. ...@@ -112,7 +112,7 @@ SOFTWARE.
extern __const__ int _nfiles; extern __const__ int _nfiles;
#endif #endif
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
# include <netinet/in.h> # include <netinet/in.h>
# include <arpa/inet.h> # include <arpa/inet.h>
# if !defined(hpux) # if !defined(hpux)
...@@ -156,10 +156,6 @@ extern __const__ int _nfiles; ...@@ -156,10 +156,6 @@ extern __const__ int _nfiles;
#define Pid_t pid_t #define Pid_t pid_t
#endif #endif
#ifdef DNETCONN
#include <netdnet/dn.h>
#endif /* DNETCONN */
int lastfdesc; /* maximum file descriptor */ int lastfdesc; /* maximum file descriptor */
fd_set WellKnownConnections; /* Listener mask */ fd_set WellKnownConnections; /* Listener mask */
...@@ -600,12 +596,12 @@ AuthAudit (ClientPtr client, Bool letin, ...@@ -600,12 +596,12 @@ AuthAudit (ClientPtr client, Bool letin,
switch (saddr->sa_family) switch (saddr->sa_family)
{ {
case AF_UNSPEC: case AF_UNSPEC:
#if defined(UNIXCONN) || defined(LOCALCONN) || defined(OS2PIPECONN) #if defined(UNIXCONN) || defined(LOCALCONN)
case AF_UNIX: case AF_UNIX:
#endif #endif
strcpy(out, "local host"); strcpy(out, "local host");
break; break;
#if defined(TCPCONN) || defined(STREAMSCONN) || defined(MNX_TCPCONN) #if defined(TCPCONN) || defined(MNX_TCPCONN)
case AF_INET: case AF_INET:
sprintf(out, "IP %s", sprintf(out, "IP %s",
inet_ntoa(((struct sockaddr_in *) saddr)->sin_addr)); inet_ntoa(((struct sockaddr_in *) saddr)->sin_addr));
...@@ -620,12 +616,6 @@ AuthAudit (ClientPtr client, Bool letin, ...@@ -620,12 +616,6 @@ AuthAudit (ClientPtr client, Bool letin,
break; break;
#endif #endif
#endif #endif
#ifdef DNETCONN
case AF_DECnet:
sprintf(out, "DN %s",
dnet_ntoa(&((struct sockaddr_dn *) saddr)->sdn_add));
break;
#endif
default: default:
strcpy(out, "unknown address"); strcpy(out, "unknown address");
} }
......
...@@ -131,7 +131,7 @@ OR PERFORMANCE OF THIS SOFTWARE. ...@@ -131,7 +131,7 @@ OR PERFORMANCE OF THIS SOFTWARE.
#include <stdlib.h> /* for malloc() */ #include <stdlib.h> /* for malloc() */
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
# ifndef WIN32 # ifndef WIN32
# include <netdb.h> # include <netdb.h>
# endif # endif
...@@ -1285,7 +1285,7 @@ int ...@@ -1285,7 +1285,7 @@ int
set_font_authorizations(char **authorizations, int *authlen, void * client) set_font_authorizations(char **authorizations, int *authlen, void * client)
{ {
#define AUTHORIZATION_NAME "hp-hostname-1" #define AUTHORIZATION_NAME "hp-hostname-1"
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
static char *result = NULL; static char *result = NULL;
static char *p = NULL; static char *p = NULL;
......
...@@ -284,7 +284,7 @@ XdmAuthorizationValidate (unsigned char *plain, int length, ...@@ -284,7 +284,7 @@ XdmAuthorizationValidate (unsigned char *plain, int length,
if (_XSERVTransGetPeerAddr(((OsCommPtr)xclient->osPrivate)->trans_conn, if (_XSERVTransGetPeerAddr(((OsCommPtr)xclient->osPrivate)->trans_conn,
&family, &addr_len, &addr) == 0 &family, &addr_len, &addr) == 0
&& _XSERVTransConvertAddress(&family, &addr_len, &addr) == 0) { && _XSERVTransConvertAddress(&family, &addr_len, &addr) == 0) {
#if defined(TCPCONN) || defined(STREAMSCONN) #if defined(TCPCONN)
if (family == FamilyInternet && if (family == FamilyInternet &&
memcmp((char *)addr, client->client, 4) != 0) { memcmp((char *)addr, client->client, 4) != 0) {
free (client); free (client);
......
...@@ -54,11 +54,6 @@ ...@@ -54,11 +54,6 @@
#include <sys/ioctl.h> #include <sys/ioctl.h>
#endif #endif
#ifdef STREAMSCONN
#include <tiuser.h>
#include <netconfig.h>
#include <netdir.h>
#endif
#ifndef NX_TRANS_SOCKET #ifndef NX_TRANS_SOCKET
...@@ -1029,43 +1024,6 @@ XdmcpAddAuthorization ( ...@@ -1029,43 +1024,6 @@ XdmcpAddAuthorization (
static void static void
get_xdmcp_sock(void) get_xdmcp_sock(void)
{ {
#ifdef STREAMSCONN
struct netconfig *nconf;
if ((xdmcpSocket = t_open("/dev/udp", O_RDWR, 0)) < 0) {
XdmcpWarning("t_open() of /dev/udp failed");
return;
}
if( t_bind(xdmcpSocket,NULL,NULL) < 0 ) {
XdmcpWarning("UDP socket creation failed");
t_error("t_bind(xdmcpSocket) failed" );
t_close(xdmcpSocket);
return;
}
/*
* This part of the code looks contrived. It will actually fit in nicely
* when the CLTS part of Xtrans is implemented.
*/
if( (nconf=getnetconfigent("udp")) == NULL ) {
XdmcpWarning("UDP socket creation failed: getnetconfigent()");
t_unbind(xdmcpSocket);
t_close(xdmcpSocket);
return;
}
if( netdir_options(nconf, ND_SET_BROADCAST, xdmcpSocket, NULL) ) {
XdmcpWarning("UDP set broadcast option failed: netdir_options()");
freenetconfigent(nconf);
t_unbind(xdmcpSocket);
t_close(xdmcpSocket);
return;
}
freenetconfigent(nconf);
#else
int soopts = 1; int soopts = 1;
#if defined(IPv6) && defined(AF_INET6) #if defined(IPv6) && defined(AF_INET6)
...@@ -1085,7 +1043,6 @@ get_xdmcp_sock(void) ...@@ -1085,7 +1043,6 @@ get_xdmcp_sock(void)
FatalError("Xserver: failed to bind to -from address: %s\n", xdm_from); FatalError("Xserver: failed to bind to -from address: %s\n", xdm_from);
} }
} }
#endif /* STREAMSCONN */
} }
static void static void
...@@ -1572,7 +1529,7 @@ get_addr_by_name( ...@@ -1572,7 +1529,7 @@ get_addr_by_name(
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS #ifdef XTHREADS_NEEDS_BYNAMEPARAMS
_Xgethostbynameparams hparams; _Xgethostbynameparams hparams;
#endif #endif
#if defined(WIN32) && (defined(TCPCONN) || defined(DNETCONN)) #if defined(WIN32) && defined(TCPCONN)
_XSERVTransWSAStartup(); _XSERVTransWSAStartup();
#endif #endif
if (!(hep = _XGethostbyname(namestr, hparams))) if (!(hep = _XGethostbyname(namestr, hparams)))
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment