os: xtrans: drop TRANS_CLIENT code pathes
Not needed in server-only code base. Signed-off-by: Enrico Weigelt, metux IT consult <info@metux.net>
This commit is contained in:
parent
c62c0f093f
commit
1d57896358
60
os/Xtrans.c
60
os/Xtrans.c
|
@ -438,9 +438,6 @@ TRANS(Open) (int type, const char *address)
|
||||||
switch (type)
|
switch (type)
|
||||||
{
|
{
|
||||||
case XTRANS_OPEN_COTS_CLIENT:
|
case XTRANS_OPEN_COTS_CLIENT:
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
ciptr = thistrans->OpenCOTSClient(thistrans, protocol, host, port);
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
break;
|
break;
|
||||||
case XTRANS_OPEN_COTS_SERVER:
|
case XTRANS_OPEN_COTS_SERVER:
|
||||||
ciptr = thistrans->OpenCOTSServer(thistrans, protocol, host, port);
|
ciptr = thistrans->OpenCOTSServer(thistrans, protocol, host, port);
|
||||||
|
@ -543,18 +540,6 @@ TRANS(Reopen) (int type, int trans_id, int fd, const char *port)
|
||||||
* table.
|
* table.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
XtransConnInfo
|
|
||||||
TRANS(OpenCOTSClient) (const char *address)
|
|
||||||
|
|
||||||
{
|
|
||||||
prmsg (2,"OpenCOTSClient(%s)\n", address);
|
|
||||||
return TRANS(Open) (XTRANS_OPEN_COTS_CLIENT, address);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
XtransConnInfo
|
XtransConnInfo
|
||||||
TRANS(OpenCOTSServer) (const char *address)
|
TRANS(OpenCOTSServer) (const char *address)
|
||||||
|
|
||||||
|
@ -799,51 +784,6 @@ TRANS(Accept) (XtransConnInfo ciptr, int *status)
|
||||||
return newciptr;
|
return newciptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
int
|
|
||||||
TRANS(Connect) (XtransConnInfo ciptr, const char *address)
|
|
||||||
|
|
||||||
{
|
|
||||||
char *protocol;
|
|
||||||
char *host;
|
|
||||||
char *port;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
prmsg (2,"Connect(%d,%s)\n", ciptr->fd, address);
|
|
||||||
|
|
||||||
if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
|
|
||||||
{
|
|
||||||
prmsg (1,"Connect: Unable to Parse address %s\n",
|
|
||||||
address);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_LAUNCHD
|
|
||||||
if (!host) host=strdup("");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if (!port || !*port)
|
|
||||||
{
|
|
||||||
prmsg (1,"Connect: Missing port specification in %s\n",
|
|
||||||
address);
|
|
||||||
if (protocol) free (protocol);
|
|
||||||
if (host) free (host);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = ciptr->transptr->Connect (ciptr, host, port);
|
|
||||||
|
|
||||||
if (protocol) free (protocol);
|
|
||||||
if (host) free (host);
|
|
||||||
if (port) free (port);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
TRANS(BytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
|
TRANS(BytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
|
||||||
|
|
||||||
|
|
17
os/Xtrans.h
17
os/Xtrans.h
|
@ -180,14 +180,6 @@ void TRANS(FreeConnInfo) (
|
||||||
XtransConnInfo /* ciptr */
|
XtransConnInfo /* ciptr */
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
XtransConnInfo TRANS(OpenCOTSClient)(
|
|
||||||
const char * /* address */
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
XtransConnInfo TRANS(OpenCOTSServer)(
|
XtransConnInfo TRANS(OpenCOTSServer)(
|
||||||
const char * /* address */
|
const char * /* address */
|
||||||
);
|
);
|
||||||
|
@ -242,15 +234,6 @@ XtransConnInfo TRANS(Accept)(
|
||||||
int * /* status */
|
int * /* status */
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
int TRANS(Connect)(
|
|
||||||
XtransConnInfo, /* ciptr */
|
|
||||||
const char * /* address */
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
int TRANS(BytesReadable)(
|
int TRANS(BytesReadable)(
|
||||||
XtransConnInfo, /* ciptr */
|
XtransConnInfo, /* ciptr */
|
||||||
BytesReadable_t * /* pend */
|
BytesReadable_t * /* pend */
|
||||||
|
|
|
@ -132,18 +132,6 @@ struct _XtransConnInfo {
|
||||||
typedef struct _Xtransport {
|
typedef struct _Xtransport {
|
||||||
const char *TransName;
|
const char *TransName;
|
||||||
int flags;
|
int flags;
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
XtransConnInfo (*OpenCOTSClient)(
|
|
||||||
struct _Xtransport *, /* transport */
|
|
||||||
const char *, /* protocol */
|
|
||||||
const char *, /* host */
|
|
||||||
const char * /* port */
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
const char ** nolisten;
|
const char ** nolisten;
|
||||||
XtransConnInfo (*OpenCOTSServer)(
|
XtransConnInfo (*OpenCOTSServer)(
|
||||||
struct _Xtransport *, /* transport */
|
struct _Xtransport *, /* transport */
|
||||||
|
@ -182,16 +170,6 @@ typedef struct _Xtransport {
|
||||||
int * /* status */
|
int * /* status */
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
int (*Connect)(
|
|
||||||
XtransConnInfo, /* connection */
|
|
||||||
const char *, /* host */
|
|
||||||
const char * /* port */
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
int (*BytesReadable)(
|
int (*BytesReadable)(
|
||||||
XtransConnInfo, /* connection */
|
XtransConnInfo, /* connection */
|
||||||
BytesReadable_t * /* pend */
|
BytesReadable_t * /* pend */
|
||||||
|
|
326
os/Xtranslcl.c
326
os/Xtranslcl.c
|
@ -212,77 +212,6 @@ TRANS(FillAddrInfo)(XtransConnInfo ciptr,
|
||||||
|
|
||||||
/* NAMED */
|
/* NAMED */
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
static int
|
|
||||||
TRANS(NAMEDOpenClient)(XtransConnInfo ciptr, const char *port)
|
|
||||||
|
|
||||||
{
|
|
||||||
#ifdef NAMEDNODENAME
|
|
||||||
int fd;
|
|
||||||
char server_path[64];
|
|
||||||
struct stat filestat;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
prmsg(2,"NAMEDOpenClient(%s)\n", port);
|
|
||||||
|
|
||||||
#if !defined(NAMEDNODENAME)
|
|
||||||
prmsg(1,"NAMEDOpenClient: Protocol is not supported by a NAMED connection\n");
|
|
||||||
return -1;
|
|
||||||
#else
|
|
||||||
if ( port && *port ) {
|
|
||||||
if( *port == '/' ) { /* A full pathname */
|
|
||||||
(void) snprintf(server_path, sizeof(server_path), "%s", port);
|
|
||||||
} else {
|
|
||||||
(void) snprintf(server_path, sizeof(server_path), "%s%s", NAMEDNODENAME, port);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
(void) snprintf(server_path, sizeof(server_path), "%s%ld", NAMEDNODENAME, (long)getpid());
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((fd = open(server_path, O_RDWR)) < 0) {
|
|
||||||
prmsg(1,"NAMEDOpenClient: Cannot open %s for NAMED connection\n", server_path);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fstat(fd, &filestat) < 0 ) {
|
|
||||||
prmsg(1,"NAMEDOpenClient: Cannot stat %s for NAMED connection\n", server_path);
|
|
||||||
(void) close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((filestat.st_mode & S_IFMT) != S_IFIFO) {
|
|
||||||
prmsg(1,"NAMEDOpenClient: Device %s is not a FIFO\n", server_path);
|
|
||||||
/* Is this really a failure? */
|
|
||||||
(void) close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (isastream(fd) <= 0) {
|
|
||||||
prmsg(1,"NAMEDOpenClient: %s is not a streams device\n", server_path);
|
|
||||||
(void) close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Everything looks good: fill in the XtransConnInfo structure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (TRANS(FillAddrInfo) (ciptr, server_path, server_path) == 0)
|
|
||||||
{
|
|
||||||
prmsg(1,"NAMEDOpenClient: failed to fill in addr info\n");
|
|
||||||
close(fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return(fd);
|
|
||||||
|
|
||||||
#endif /* !NAMEDNODENAME */
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
#ifdef NAMEDNODENAME
|
#ifdef NAMEDNODENAME
|
||||||
static int
|
static int
|
||||||
TRANS(NAMEDOpenPipe)(const char *server_path)
|
TRANS(NAMEDOpenPipe)(const char *server_path)
|
||||||
|
@ -516,27 +445,9 @@ TRANS(NAMEDReopenServer)(XtransConnInfo ciptr, int fd _X_UNUSED, const char *por
|
||||||
|
|
||||||
typedef struct _LOCALtrans2dev {
|
typedef struct _LOCALtrans2dev {
|
||||||
const char *transname;
|
const char *transname;
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
int (*devcotsopenclient)(
|
|
||||||
XtransConnInfo, const char * /*port*/
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
int (*devcotsopenserver)(
|
int (*devcotsopenserver)(
|
||||||
XtransConnInfo, const char * /*port*/
|
XtransConnInfo, const char * /*port*/
|
||||||
);
|
);
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
int (*devcltsopenclient)(
|
|
||||||
XtransConnInfo, const char * /*port*/
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
int (*devcltsopenserver)(
|
int (*devcltsopenserver)(
|
||||||
XtransConnInfo, const char * /*port*/
|
XtransConnInfo, const char * /*port*/
|
||||||
);
|
);
|
||||||
|
@ -565,13 +476,7 @@ typedef struct _LOCALtrans2dev {
|
||||||
|
|
||||||
static LOCALtrans2dev LOCALtrans2devtab[] = {
|
static LOCALtrans2dev LOCALtrans2devtab[] = {
|
||||||
{"",
|
{"",
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(NAMEDOpenClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(NAMEDOpenServer),
|
TRANS(NAMEDOpenServer),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(OpenFail),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(OpenFail),
|
TRANS(OpenFail),
|
||||||
TRANS(NAMEDReopenServer),
|
TRANS(NAMEDReopenServer),
|
||||||
TRANS(ReopenFail),
|
TRANS(ReopenFail),
|
||||||
|
@ -580,13 +485,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
|
||||||
},
|
},
|
||||||
|
|
||||||
{"local",
|
{"local",
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(NAMEDOpenClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(NAMEDOpenServer),
|
TRANS(NAMEDOpenServer),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(OpenFail),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(OpenFail),
|
TRANS(OpenFail),
|
||||||
TRANS(NAMEDReopenServer),
|
TRANS(NAMEDReopenServer),
|
||||||
TRANS(ReopenFail),
|
TRANS(ReopenFail),
|
||||||
|
@ -596,13 +495,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
|
||||||
|
|
||||||
#ifdef LOCAL_TRANS_NAMED
|
#ifdef LOCAL_TRANS_NAMED
|
||||||
{"named",
|
{"named",
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(NAMEDOpenClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(NAMEDOpenServer),
|
TRANS(NAMEDOpenServer),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(OpenFail),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(OpenFail),
|
TRANS(OpenFail),
|
||||||
TRANS(NAMEDReopenServer),
|
TRANS(NAMEDReopenServer),
|
||||||
TRANS(ReopenFail),
|
TRANS(ReopenFail),
|
||||||
|
@ -611,13 +504,7 @@ static LOCALtrans2dev LOCALtrans2devtab[] = {
|
||||||
},
|
},
|
||||||
|
|
||||||
{"pipe",
|
{"pipe",
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(NAMEDOpenClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(NAMEDOpenServer),
|
TRANS(NAMEDOpenServer),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(OpenFail),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(OpenFail),
|
TRANS(OpenFail),
|
||||||
TRANS(NAMEDReopenServer),
|
TRANS(NAMEDReopenServer),
|
||||||
TRANS(ReopenFail),
|
TRANS(ReopenFail),
|
||||||
|
@ -666,172 +553,6 @@ TRANS(LocalEndTransports)(void)
|
||||||
|
|
||||||
#define TYPEBUFSIZE 32
|
#define TYPEBUFSIZE 32
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
static LOCALtrans2dev *
|
|
||||||
TRANS(LocalGetNextTransport)(void)
|
|
||||||
|
|
||||||
{
|
|
||||||
char *typetocheck;
|
|
||||||
prmsg(3,"LocalGetNextTransport()\n");
|
|
||||||
|
|
||||||
while(1)
|
|
||||||
{
|
|
||||||
if( workingXLOCAL == NULL || *workingXLOCAL == '\0' )
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
typetocheck=workingXLOCAL;
|
|
||||||
workingXLOCAL=strchr(workingXLOCAL,':');
|
|
||||||
if(workingXLOCAL && *workingXLOCAL)
|
|
||||||
*workingXLOCAL++='\0';
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < NUMTRANSPORTS; i++)
|
|
||||||
{
|
|
||||||
#ifndef HAVE_STRCASECMP
|
|
||||||
int j;
|
|
||||||
char typebuf[TYPEBUFSIZE];
|
|
||||||
/*
|
|
||||||
* This is equivalent to a case insensitive strcmp(),
|
|
||||||
* but should be more portable.
|
|
||||||
*/
|
|
||||||
strncpy(typebuf,typetocheck,TYPEBUFSIZE);
|
|
||||||
for(j=0;j<TYPEBUFSIZE;j++)
|
|
||||||
if (isupper(typebuf[j]))
|
|
||||||
typebuf[j]=tolower(typebuf[j]);
|
|
||||||
|
|
||||||
/* Now, see if they match */
|
|
||||||
if(!strcmp(LOCALtrans2devtab[i].transname,typebuf))
|
|
||||||
#else
|
|
||||||
if(!strcasecmp(LOCALtrans2devtab[i].transname,typetocheck))
|
|
||||||
#endif
|
|
||||||
return &LOCALtrans2devtab[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#if 0
|
|
||||||
/*NOTREACHED*/
|
|
||||||
return NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure 'host' is really local.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
HostReallyLocal (const char *host)
|
|
||||||
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The 'host' passed to this function may have been generated
|
|
||||||
* by either uname() or gethostname(). We try both if possible.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct utsname name;
|
|
||||||
char buf[256];
|
|
||||||
|
|
||||||
if (uname (&name) >= 0 && strcmp (host, name.nodename) == 0)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
buf[0] = '\0';
|
|
||||||
(void) gethostname (buf, 256);
|
|
||||||
buf[255] = '\0';
|
|
||||||
|
|
||||||
if (strcmp (host, buf) == 0)
|
|
||||||
return (1);
|
|
||||||
|
|
||||||
return (0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static XtransConnInfo
|
|
||||||
TRANS(LocalOpenClient)(int type, const char *protocol,
|
|
||||||
const char *host, const char *port)
|
|
||||||
|
|
||||||
{
|
|
||||||
LOCALtrans2dev *transptr;
|
|
||||||
XtransConnInfo ciptr;
|
|
||||||
int index;
|
|
||||||
|
|
||||||
prmsg(3,"LocalOpenClient()\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure 'host' is really local. If not, we return failure.
|
|
||||||
* The reason we make this check is because a process may advertise
|
|
||||||
* a "local" address for which it can accept connections, but if a
|
|
||||||
* process on a remote machine tries to connect to this address,
|
|
||||||
* we know for sure it will fail.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (strcmp (host, "unix") != 0 && !HostReallyLocal (host))
|
|
||||||
{
|
|
||||||
prmsg (1,
|
|
||||||
"LocalOpenClient: Cannot connect to non-local host %s\n",
|
|
||||||
host);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* 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(). Since that is what we want for the local transports,
|
|
||||||
* we don't have to do anything special.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if( (ciptr = calloc(1,sizeof(struct _XtransConnInfo))) == NULL )
|
|
||||||
{
|
|
||||||
prmsg(1,"LocalOpenClient: calloc(1,%lu) failed\n",
|
|
||||||
sizeof(struct _XtransConnInfo));
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ciptr->fd = -1;
|
|
||||||
|
|
||||||
TRANS(LocalInitTransports)(protocol);
|
|
||||||
|
|
||||||
index = 0;
|
|
||||||
for(transptr=TRANS(LocalGetNextTransport)();
|
|
||||||
transptr!=NULL;transptr=TRANS(LocalGetNextTransport)(), index++)
|
|
||||||
{
|
|
||||||
switch( type )
|
|
||||||
{
|
|
||||||
case XTRANS_OPEN_COTS_CLIENT:
|
|
||||||
ciptr->fd=transptr->devcotsopenclient(ciptr,port);
|
|
||||||
break;
|
|
||||||
case XTRANS_OPEN_COTS_SERVER:
|
|
||||||
prmsg(1,
|
|
||||||
"LocalOpenClient: Should not be opening a server with this function\n");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
prmsg(1,
|
|
||||||
"LocalOpenClient: Unknown Open type %d\n",
|
|
||||||
type);
|
|
||||||
}
|
|
||||||
if( ciptr->fd >= 0 )
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
TRANS(LocalEndTransports)();
|
|
||||||
|
|
||||||
if( ciptr->fd < 0 )
|
|
||||||
{
|
|
||||||
free(ciptr);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ciptr->priv=(char *)transptr;
|
|
||||||
ciptr->index = index;
|
|
||||||
|
|
||||||
return ciptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
static XtransConnInfo
|
static XtransConnInfo
|
||||||
TRANS(LocalOpenServer)(int type, const char *protocol,
|
TRANS(LocalOpenServer)(int type, const char *protocol,
|
||||||
const char *host _X_UNUSED, const char *port)
|
const char *host _X_UNUSED, const char *port)
|
||||||
|
@ -927,20 +648,6 @@ TRANS(LocalReopenServer)(int type, int index, int fd, const char *port)
|
||||||
* This is the Local implementation of the X Transport service layer
|
* This is the Local implementation of the X Transport service layer
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
static XtransConnInfo
|
|
||||||
TRANS(LocalOpenCOTSClient)(Xtransport *thistrans _X_UNUSED, const char *protocol,
|
|
||||||
const char *host, const char *port)
|
|
||||||
|
|
||||||
{
|
|
||||||
prmsg(2,"LocalOpenCOTSClient(%s,%s,%s)\n",protocol,host,port);
|
|
||||||
|
|
||||||
return TRANS(LocalOpenClient)(XTRANS_OPEN_COTS_CLIENT, protocol, host, port);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
static XtransConnInfo
|
static XtransConnInfo
|
||||||
TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, const char *protocol,
|
TRANS(LocalOpenCOTSServer)(Xtransport *thistrans, const char *protocol,
|
||||||
const char *host, const char *port)
|
const char *host, const char *port)
|
||||||
|
@ -1080,21 +787,6 @@ TRANS(LocalAccept)(XtransConnInfo ciptr, int *status)
|
||||||
return newciptr;
|
return newciptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
static int
|
|
||||||
TRANS(LocalConnect)(XtransConnInfo ciptr,
|
|
||||||
const char *host _X_UNUSED, const char *port)
|
|
||||||
|
|
||||||
{
|
|
||||||
prmsg(2,"LocalConnect(%p->%d,%s)\n", (void *) ciptr, ciptr->fd, port);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
TRANS(LocalBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend )
|
TRANS(LocalBytesReadable)(XtransConnInfo ciptr, BytesReadable_t *pend )
|
||||||
|
|
||||||
|
@ -1207,9 +899,6 @@ static Xtransport TRANS(LocalFuncs) = {
|
||||||
/* Local Interface */
|
/* Local Interface */
|
||||||
"local",
|
"local",
|
||||||
TRANS_ALIAS | TRANS_LOCAL,
|
TRANS_ALIAS | TRANS_LOCAL,
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(LocalOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
local_aliases,
|
local_aliases,
|
||||||
TRANS(LocalOpenCOTSServer),
|
TRANS(LocalOpenCOTSServer),
|
||||||
TRANS(LocalReopenCOTSServer),
|
TRANS(LocalReopenCOTSServer),
|
||||||
|
@ -1217,9 +906,6 @@ static Xtransport TRANS(LocalFuncs) = {
|
||||||
TRANS(LocalCreateListener),
|
TRANS(LocalCreateListener),
|
||||||
TRANS(LocalResetListener),
|
TRANS(LocalResetListener),
|
||||||
TRANS(LocalAccept),
|
TRANS(LocalAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(LocalConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(LocalBytesReadable),
|
TRANS(LocalBytesReadable),
|
||||||
TRANS(LocalRead),
|
TRANS(LocalRead),
|
||||||
TRANS(LocalWrite),
|
TRANS(LocalWrite),
|
||||||
|
@ -1241,9 +927,6 @@ static Xtransport TRANS(NAMEDFuncs) = {
|
||||||
/* Local Interface */
|
/* Local Interface */
|
||||||
"named",
|
"named",
|
||||||
TRANS_LOCAL,
|
TRANS_LOCAL,
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(LocalOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
NULL,
|
NULL,
|
||||||
TRANS(LocalOpenCOTSServer),
|
TRANS(LocalOpenCOTSServer),
|
||||||
TRANS(LocalReopenCOTSServer),
|
TRANS(LocalReopenCOTSServer),
|
||||||
|
@ -1251,9 +934,6 @@ static Xtransport TRANS(NAMEDFuncs) = {
|
||||||
TRANS(LocalCreateListener),
|
TRANS(LocalCreateListener),
|
||||||
TRANS(LocalResetListener),
|
TRANS(LocalResetListener),
|
||||||
TRANS(LocalAccept),
|
TRANS(LocalAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(LocalConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(LocalBytesReadable),
|
TRANS(LocalBytesReadable),
|
||||||
TRANS(LocalRead),
|
TRANS(LocalRead),
|
||||||
TRANS(LocalWrite),
|
TRANS(LocalWrite),
|
||||||
|
@ -1272,9 +952,6 @@ static Xtransport TRANS(PIPEFuncs) = {
|
||||||
/* Local Interface */
|
/* Local Interface */
|
||||||
"pipe",
|
"pipe",
|
||||||
TRANS_ALIAS | TRANS_LOCAL,
|
TRANS_ALIAS | TRANS_LOCAL,
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(LocalOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
NULL,
|
NULL,
|
||||||
TRANS(LocalOpenCOTSServer),
|
TRANS(LocalOpenCOTSServer),
|
||||||
TRANS(LocalReopenCOTSServer),
|
TRANS(LocalReopenCOTSServer),
|
||||||
|
@ -1282,9 +959,6 @@ static Xtransport TRANS(PIPEFuncs) = {
|
||||||
TRANS(LocalCreateListener),
|
TRANS(LocalCreateListener),
|
||||||
TRANS(LocalResetListener),
|
TRANS(LocalResetListener),
|
||||||
TRANS(LocalAccept),
|
TRANS(LocalAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(LocalConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(LocalBytesReadable),
|
TRANS(LocalBytesReadable),
|
||||||
TRANS(LocalRead),
|
TRANS(LocalRead),
|
||||||
TRANS(LocalWrite),
|
TRANS(LocalWrite),
|
||||||
|
|
745
os/Xtranssock.c
745
os/Xtranssock.c
|
@ -533,53 +533,6 @@ TRANS(SocketReopen) (int i _X_UNUSED, int type, int fd, const char *port)
|
||||||
* These functions are the interface supplied in the Xtransport structure
|
* These functions are the interface supplied in the Xtransport structure
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
static XtransConnInfo
|
|
||||||
TRANS(SocketOpenCOTSClientBase) (const char *transname, const char *protocol,
|
|
||||||
const char *host, const char *port, int previndex)
|
|
||||||
{
|
|
||||||
XtransConnInfo ciptr = NULL;
|
|
||||||
int i = previndex;
|
|
||||||
|
|
||||||
prmsg (2, "SocketOpenCOTSClient(%s,%s,%s)\n",
|
|
||||||
protocol, host, port);
|
|
||||||
|
|
||||||
SocketInitOnce();
|
|
||||||
|
|
||||||
while ((i = TRANS(SocketSelectFamily) (i, transname)) >= 0) {
|
|
||||||
if ((ciptr = TRANS(SocketOpen) (
|
|
||||||
i, Sockettrans2devtab[i].devcotsname)) != NULL) {
|
|
||||||
/* Save the index for later use */
|
|
||||||
|
|
||||||
ciptr->index = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i < 0) {
|
|
||||||
if (i == -1)
|
|
||||||
prmsg (1,"SocketOpenCOTSClient: Unable to open socket for %s\n",
|
|
||||||
transname);
|
|
||||||
else
|
|
||||||
prmsg (1,"SocketOpenCOTSClient: Unable to determine socket type for %s\n",
|
|
||||||
transname);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ciptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
static XtransConnInfo
|
|
||||||
TRANS(SocketOpenCOTSClient) (Xtransport *thistrans, const char *protocol,
|
|
||||||
const char *host, const char *port)
|
|
||||||
{
|
|
||||||
return TRANS(SocketOpenCOTSClientBase)(
|
|
||||||
thistrans->TransName, protocol, host, port, -1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
static XtransConnInfo
|
static XtransConnInfo
|
||||||
TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, const char *protocol,
|
TRANS(SocketOpenCOTSServer) (Xtransport *thistrans, const char *protocol,
|
||||||
const char *host, const char *port)
|
const char *host, const char *port)
|
||||||
|
@ -1256,674 +1209,6 @@ TRANS(SocketUNIXAccept) (XtransConnInfo ciptr, int *status)
|
||||||
|
|
||||||
#endif /* UNIXCONN */
|
#endif /* UNIXCONN */
|
||||||
|
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
|
|
||||||
#ifdef TCPCONN
|
|
||||||
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
struct addrlist {
|
|
||||||
struct addrinfo * addr;
|
|
||||||
struct addrinfo * firstaddr;
|
|
||||||
char port[PORTBUFSIZE];
|
|
||||||
char host[MAXHOSTNAMELEN];
|
|
||||||
};
|
|
||||||
static struct addrlist *addrlist = NULL;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
|
||||||
TRANS(SocketINETConnect) (XtransConnInfo ciptr,
|
|
||||||
const char *host, const char *port)
|
|
||||||
|
|
||||||
{
|
|
||||||
struct sockaddr * socketaddr = NULL;
|
|
||||||
int socketaddrlen = 0;
|
|
||||||
int res;
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
struct addrinfo hints;
|
|
||||||
char ntopbuf[INET6_ADDRSTRLEN];
|
|
||||||
int resetonce = 0;
|
|
||||||
#else
|
|
||||||
struct sockaddr_in sockname;
|
|
||||||
struct hostent *hostp;
|
|
||||||
struct servent *servp;
|
|
||||||
unsigned long tmpaddr;
|
|
||||||
#endif
|
|
||||||
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
|
|
||||||
_Xgethostbynameparams hparams;
|
|
||||||
_Xgetservbynameparams sparams;
|
|
||||||
#endif
|
|
||||||
char portbuf[PORTBUFSIZE];
|
|
||||||
|
|
||||||
char hostnamebuf[256]; /* tmp space */
|
|
||||||
|
|
||||||
prmsg (2,"SocketINETConnect(%d,%s,%s)\n", ciptr->fd, host, port);
|
|
||||||
|
|
||||||
if (!host)
|
|
||||||
{
|
|
||||||
hostnamebuf[0] = '\0';
|
|
||||||
(void) TRANS(GetHostname) (hostnamebuf, sizeof hostnamebuf);
|
|
||||||
host = hostnamebuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* X has a well known port, that is transport dependent. It is easier
|
|
||||||
* to handle it here, than try and come up with a transport independent
|
|
||||||
* representation that can be passed in and resolved the usual way.
|
|
||||||
*
|
|
||||||
* The port that is passed here is really a string containing the idisplay
|
|
||||||
* from ConnectDisplay().
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (is_numeric (port))
|
|
||||||
{
|
|
||||||
long tmpport = X_TCP_PORT + strtol (port, (char**)NULL, 10);
|
|
||||||
snprintf (portbuf, sizeof(portbuf), "%lu", tmpport);
|
|
||||||
port = portbuf;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
{
|
|
||||||
if (addrlist != NULL) {
|
|
||||||
if (strcmp(host,addrlist->host) || strcmp(port,addrlist->port)) {
|
|
||||||
if (addrlist->firstaddr)
|
|
||||||
freeaddrinfo(addrlist->firstaddr);
|
|
||||||
addrlist->firstaddr = NULL;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
addrlist = malloc(sizeof(struct addrlist));
|
|
||||||
if (addrlist == NULL) {
|
|
||||||
prmsg (1, "SocketINETConnect() can't allocate memory "
|
|
||||||
"for addrlist: %s\n", strerror(errno));
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
addrlist->firstaddr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (addrlist->firstaddr == NULL) {
|
|
||||||
strncpy(addrlist->port, port, sizeof(addrlist->port));
|
|
||||||
addrlist->port[sizeof(addrlist->port) - 1] = '\0';
|
|
||||||
strncpy(addrlist->host, host, sizeof(addrlist->host));
|
|
||||||
addrlist->host[sizeof(addrlist->host) - 1] = '\0';
|
|
||||||
|
|
||||||
memset(&hints, 0, sizeof(hints));
|
|
||||||
#ifdef IPv6
|
|
||||||
if (strcmp(Sockettrans2devtab[ciptr->index].transname, "tcp") == 0)
|
|
||||||
hints.ai_family = AF_UNSPEC;
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
hints.ai_family = Sockettrans2devtab[ciptr->index].family;
|
|
||||||
hints.ai_socktype = Sockettrans2devtab[ciptr->index].devcotsname;
|
|
||||||
|
|
||||||
res = getaddrinfo(host,port,&hints,&addrlist->firstaddr);
|
|
||||||
if (res != 0) {
|
|
||||||
prmsg (1, "SocketINETConnect() can't get address "
|
|
||||||
"for %s:%s: %s\n", host, port, gai_strerror(res));
|
|
||||||
ESET(EINVAL);
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
for (res = 0, addrlist->addr = addrlist->firstaddr;
|
|
||||||
addrlist->addr ; res++) {
|
|
||||||
addrlist->addr = addrlist->addr->ai_next;
|
|
||||||
}
|
|
||||||
prmsg(4,"Got New Address list with %d addresses\n", res);
|
|
||||||
res = 0;
|
|
||||||
addrlist->addr = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (socketaddr == NULL) {
|
|
||||||
if (addrlist->addr == NULL) {
|
|
||||||
if (resetonce) {
|
|
||||||
/* Already checked entire list - no usable addresses */
|
|
||||||
prmsg (1, "SocketINETConnect() no usable address "
|
|
||||||
"for %s:%s\n", host, port);
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
} else {
|
|
||||||
/* Go back to beginning of list */
|
|
||||||
resetonce = 1;
|
|
||||||
addrlist->addr = addrlist->firstaddr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
socketaddr = addrlist->addr->ai_addr;
|
|
||||||
socketaddrlen = addrlist->addr->ai_addrlen;
|
|
||||||
|
|
||||||
if (addrlist->addr->ai_family == AF_INET) {
|
|
||||||
struct sockaddr_in *sin = (struct sockaddr_in *) socketaddr;
|
|
||||||
|
|
||||||
prmsg (4,"SocketINETConnect() sockname.sin_addr = %s\n",
|
|
||||||
inet_ntop(addrlist->addr->ai_family,&sin->sin_addr,
|
|
||||||
ntopbuf,sizeof(ntopbuf)));
|
|
||||||
|
|
||||||
prmsg (4,"SocketINETConnect() sockname.sin_port = %d\n",
|
|
||||||
ntohs(sin->sin_port));
|
|
||||||
|
|
||||||
#ifdef IPv6
|
|
||||||
if (Sockettrans2devtab[ciptr->index].family == AF_INET6) {
|
|
||||||
if (strcmp(Sockettrans2devtab[ciptr->index].transname,
|
|
||||||
"tcp") == 0) {
|
|
||||||
XtransConnInfo newciptr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Our socket is an IPv6 socket, but the address is
|
|
||||||
* IPv4. Close it and get an IPv4 socket. This is
|
|
||||||
* needed for IPv4 connections to work on platforms
|
|
||||||
* that don't allow IPv4 over IPv6 sockets.
|
|
||||||
*/
|
|
||||||
TRANS(SocketINETClose)(ciptr);
|
|
||||||
newciptr = TRANS(SocketOpenCOTSClientBase)(
|
|
||||||
"tcp", "tcp", host, port, ciptr->index);
|
|
||||||
if (newciptr)
|
|
||||||
ciptr->fd = newciptr->fd;
|
|
||||||
if (!newciptr ||
|
|
||||||
Sockettrans2devtab[newciptr->index].family !=
|
|
||||||
AF_INET) {
|
|
||||||
socketaddr = NULL;
|
|
||||||
prmsg (4,"SocketINETConnect() Cannot get IPv4 "
|
|
||||||
" socketfor IPv4 address\n");
|
|
||||||
}
|
|
||||||
if (newciptr)
|
|
||||||
free(newciptr);
|
|
||||||
} else {
|
|
||||||
socketaddr = NULL;
|
|
||||||
prmsg (4,"SocketINETConnect Skipping IPv4 address\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (addrlist->addr->ai_family == AF_INET6) {
|
|
||||||
struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *) socketaddr;
|
|
||||||
|
|
||||||
prmsg (4,"SocketINETConnect() sockname.sin6_addr = %s\n",
|
|
||||||
inet_ntop(addrlist->addr->ai_family,
|
|
||||||
&sin6->sin6_addr,ntopbuf,sizeof(ntopbuf)));
|
|
||||||
prmsg (4,"SocketINETConnect() sockname.sin6_port = %d\n",
|
|
||||||
ntohs(sin6->sin6_port));
|
|
||||||
|
|
||||||
if (Sockettrans2devtab[ciptr->index].family == AF_INET) {
|
|
||||||
if (strcmp(Sockettrans2devtab[ciptr->index].transname,
|
|
||||||
"tcp") == 0) {
|
|
||||||
XtransConnInfo newciptr;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Close the IPv4 socket and try to open an IPv6 socket.
|
|
||||||
*/
|
|
||||||
TRANS(SocketINETClose)(ciptr);
|
|
||||||
newciptr = TRANS(SocketOpenCOTSClientBase)(
|
|
||||||
"tcp", "tcp", host, port, -1);
|
|
||||||
if (newciptr)
|
|
||||||
ciptr->fd = newciptr->fd;
|
|
||||||
if (!newciptr ||
|
|
||||||
Sockettrans2devtab[newciptr->index].family !=
|
|
||||||
AF_INET6) {
|
|
||||||
socketaddr = NULL;
|
|
||||||
prmsg (4,"SocketINETConnect() Cannot get IPv6 "
|
|
||||||
"socket for IPv6 address\n");
|
|
||||||
}
|
|
||||||
if (newciptr)
|
|
||||||
free(newciptr);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
socketaddr = NULL;
|
|
||||||
prmsg (4,"SocketINETConnect() Skipping IPv6 address\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif /* IPv6 */
|
|
||||||
} else {
|
|
||||||
socketaddr = NULL; /* Unsupported address type */
|
|
||||||
}
|
|
||||||
if (socketaddr == NULL) {
|
|
||||||
addrlist->addr = addrlist->addr->ai_next;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#else /* !HAVE_GETADDRINFO */
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Build the socket name.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifdef BSD44SOCKETS
|
|
||||||
sockname.sin_len = sizeof (struct sockaddr_in);
|
|
||||||
#endif
|
|
||||||
sockname.sin_family = AF_INET;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fill in sin_addr
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef INADDR_NONE
|
|
||||||
#define INADDR_NONE ((in_addr_t) 0xffffffff)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* check for ww.xx.yy.zz host string */
|
|
||||||
|
|
||||||
if (isascii (host[0]) && isdigit (host[0])) {
|
|
||||||
tmpaddr = inet_addr (host); /* returns network byte order */
|
|
||||||
} else {
|
|
||||||
tmpaddr = INADDR_NONE;
|
|
||||||
}
|
|
||||||
|
|
||||||
prmsg (4,"SocketINETConnect() inet_addr(%s) = %lx\n", host, tmpaddr);
|
|
||||||
|
|
||||||
if (tmpaddr == INADDR_NONE) {
|
|
||||||
if ((hostp = _XGethostbyname(host,hparams)) == NULL) {
|
|
||||||
prmsg (1,"SocketINETConnect: Can't get address for %s\n",
|
|
||||||
host);
|
|
||||||
ESET(EINVAL);
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
if (hostp->h_addrtype != AF_INET) { /* is IP host? */
|
|
||||||
prmsg (1,"SocketINETConnect: not INET host%s\n", host);
|
|
||||||
ESET(EPROTOTYPE);
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy ((char *) &sockname.sin_addr, (char *) hostp->h_addr,
|
|
||||||
sizeof (sockname.sin_addr));
|
|
||||||
|
|
||||||
} else {
|
|
||||||
sockname.sin_addr.s_addr = tmpaddr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* fill in sin_port
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Check for number in the port string */
|
|
||||||
|
|
||||||
if (!is_numeric (port)) {
|
|
||||||
if ((servp = _XGetservbyname (port,"tcp",sparams)) == NULL) {
|
|
||||||
prmsg (1,"SocketINETConnect: can't get service for %s\n",
|
|
||||||
port);
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
sockname.sin_port = htons (servp->s_port);
|
|
||||||
} else {
|
|
||||||
long tmpport = strtol (port, (char**)NULL, 10);
|
|
||||||
if (tmpport < 1024 || tmpport > USHRT_MAX)
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
sockname.sin_port = htons (((unsigned short) tmpport));
|
|
||||||
}
|
|
||||||
|
|
||||||
prmsg (4,"SocketINETConnect: sockname.sin_port = %d\n",
|
|
||||||
ntohs(sockname.sin_port));
|
|
||||||
socketaddr = (struct sockaddr *) &sockname;
|
|
||||||
socketaddrlen = sizeof(sockname);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Turn on socket keepalive so the client process will eventually
|
|
||||||
* be notified with a SIGPIPE signal if the display server fails
|
|
||||||
* to respond to a periodic transmission of messages
|
|
||||||
* on the connected socket.
|
|
||||||
* This is useful to avoid hung application processes when the
|
|
||||||
* processes are not spawned from the xdm session and
|
|
||||||
* the display server terminates abnormally.
|
|
||||||
* (Someone turned off the power switch.)
|
|
||||||
*/
|
|
||||||
|
|
||||||
{
|
|
||||||
int tmp = 1;
|
|
||||||
setsockopt (ciptr->fd, SOL_SOCKET, SO_KEEPALIVE,
|
|
||||||
(char *) &tmp, sizeof (int));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do the connect()
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (connect (ciptr->fd, socketaddr, socketaddrlen ) < 0)
|
|
||||||
{
|
|
||||||
#ifdef WIN32
|
|
||||||
int olderrno = WSAGetLastError();
|
|
||||||
#else
|
|
||||||
int olderrno = errno;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the error was ECONNREFUSED, the server may be overloaded
|
|
||||||
* and we should try again.
|
|
||||||
*
|
|
||||||
* If the error was EWOULDBLOCK or EINPROGRESS then the socket
|
|
||||||
* was non-blocking and we should poll using select
|
|
||||||
*
|
|
||||||
* If the error was EINTR, the connect was interrupted and we
|
|
||||||
* should try again.
|
|
||||||
*
|
|
||||||
* If multiple addresses are found for a host then we should
|
|
||||||
* try to connect again with a different address for a larger
|
|
||||||
* number of errors that made us quit before, since those
|
|
||||||
* could be caused by trying to use an IPv6 address to contact
|
|
||||||
* a machine with an IPv4-only server or other reasons that
|
|
||||||
* only affect one of a set of addresses.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (olderrno == ECONNREFUSED || olderrno == EINTR
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
|| (((addrlist->addr->ai_next != NULL) ||
|
|
||||||
(addrlist->addr != addrlist->firstaddr)) &&
|
|
||||||
(olderrno == ENETUNREACH || olderrno == EAFNOSUPPORT ||
|
|
||||||
olderrno == EADDRNOTAVAIL || olderrno == ETIMEDOUT
|
|
||||||
#if defined(EHOSTDOWN)
|
|
||||||
|| olderrno == EHOSTDOWN
|
|
||||||
#endif
|
|
||||||
))
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
res = TRANS_TRY_CONNECT_AGAIN;
|
|
||||||
else if (olderrno == EWOULDBLOCK || olderrno == EINPROGRESS)
|
|
||||||
res = TRANS_IN_PROGRESS;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
prmsg (2,"SocketINETConnect: Can't connect: errno = %d\n",
|
|
||||||
olderrno);
|
|
||||||
|
|
||||||
res = TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
res = 0;
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Sync up the address fields of ciptr.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (TRANS(SocketINETGetAddr) (ciptr) < 0)
|
|
||||||
{
|
|
||||||
prmsg (1,
|
|
||||||
"SocketINETConnect: ...SocketINETGetAddr() failed:\n");
|
|
||||||
res = TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
else if (TRANS(SocketINETGetPeerAddr) (ciptr) < 0)
|
|
||||||
{
|
|
||||||
prmsg (1,
|
|
||||||
"SocketINETConnect: ...SocketINETGetPeerAddr() failed:\n");
|
|
||||||
res = TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
if (res != 0) {
|
|
||||||
addrlist->addr = addrlist->addr->ai_next;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TCPCONN */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef UNIXCONN
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure 'host' is really local.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int
|
|
||||||
UnixHostReallyLocal (const char *host)
|
|
||||||
|
|
||||||
{
|
|
||||||
char hostnamebuf[256];
|
|
||||||
|
|
||||||
TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf));
|
|
||||||
|
|
||||||
if (strcmp (hostnamebuf, host) == 0)
|
|
||||||
{
|
|
||||||
return (1);
|
|
||||||
} else {
|
|
||||||
#ifdef HAVE_GETADDRINFO
|
|
||||||
struct addrinfo *localhostaddr;
|
|
||||||
struct addrinfo *otherhostaddr;
|
|
||||||
struct addrinfo *i, *j;
|
|
||||||
int equiv = 0;
|
|
||||||
|
|
||||||
if (getaddrinfo(hostnamebuf, NULL, NULL, &localhostaddr) != 0)
|
|
||||||
return 0;
|
|
||||||
if (getaddrinfo(host, NULL, NULL, &otherhostaddr) != 0) {
|
|
||||||
freeaddrinfo(localhostaddr);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = localhostaddr; i != NULL && equiv == 0; i = i->ai_next) {
|
|
||||||
for (j = otherhostaddr; j != NULL && equiv == 0; j = j->ai_next) {
|
|
||||||
if (i->ai_family == j->ai_family) {
|
|
||||||
if (i->ai_family == AF_INET) {
|
|
||||||
struct sockaddr_in *sinA
|
|
||||||
= (struct sockaddr_in *) i->ai_addr;
|
|
||||||
struct sockaddr_in *sinB
|
|
||||||
= (struct sockaddr_in *) j->ai_addr;
|
|
||||||
struct in_addr *A = &sinA->sin_addr;
|
|
||||||
struct in_addr *B = &sinB->sin_addr;
|
|
||||||
|
|
||||||
if (memcmp(A,B,sizeof(struct in_addr)) == 0) {
|
|
||||||
equiv = 1;
|
|
||||||
}
|
|
||||||
#ifdef IPv6
|
|
||||||
} else if (i->ai_family == AF_INET6) {
|
|
||||||
struct sockaddr_in6 *sinA
|
|
||||||
= (struct sockaddr_in6 *) i->ai_addr;
|
|
||||||
struct sockaddr_in6 *sinB
|
|
||||||
= (struct sockaddr_in6 *) j->ai_addr;
|
|
||||||
struct in6_addr *A = &sinA->sin6_addr;
|
|
||||||
struct in6_addr *B = &sinB->sin6_addr;
|
|
||||||
|
|
||||||
if (memcmp(A,B,sizeof(struct in6_addr)) == 0) {
|
|
||||||
equiv = 1;
|
|
||||||
}
|
|
||||||
#endif /* IPv6 */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
freeaddrinfo(localhostaddr);
|
|
||||||
freeaddrinfo(otherhostaddr);
|
|
||||||
return equiv;
|
|
||||||
#else /* !HAVE_GETADDRINFO */
|
|
||||||
/*
|
|
||||||
* A host may have more than one network address. If any of the
|
|
||||||
* network addresses of 'host' (specified to the connect call)
|
|
||||||
* match any of the network addresses of 'hostname' (determined
|
|
||||||
* by TRANS(GetHostname)), then the two hostnames are equivalent,
|
|
||||||
* and we know that 'host' is really a local host.
|
|
||||||
*/
|
|
||||||
char specified_local_addr_list[10][4];
|
|
||||||
int scount, equiv, i, j;
|
|
||||||
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
|
|
||||||
_Xgethostbynameparams hparams;
|
|
||||||
#endif
|
|
||||||
struct hostent *hostp;
|
|
||||||
|
|
||||||
if ((hostp = _XGethostbyname (host,hparams)) == NULL)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
scount = 0;
|
|
||||||
while (hostp->h_addr_list[scount] && scount <= 8)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* The 2nd call to gethostname() overrides the data
|
|
||||||
* from the 1st call, so we must save the address list.
|
|
||||||
*/
|
|
||||||
|
|
||||||
specified_local_addr_list[scount][0] =
|
|
||||||
hostp->h_addr_list[scount][0];
|
|
||||||
specified_local_addr_list[scount][1] =
|
|
||||||
hostp->h_addr_list[scount][1];
|
|
||||||
specified_local_addr_list[scount][2] =
|
|
||||||
hostp->h_addr_list[scount][2];
|
|
||||||
specified_local_addr_list[scount][3] =
|
|
||||||
hostp->h_addr_list[scount][3];
|
|
||||||
scount++;
|
|
||||||
}
|
|
||||||
if ((hostp = _XGethostbyname (hostnamebuf,hparams)) == NULL)
|
|
||||||
return (0);
|
|
||||||
|
|
||||||
equiv = 0;
|
|
||||||
i = 0;
|
|
||||||
|
|
||||||
while (i < scount && !equiv)
|
|
||||||
{
|
|
||||||
j = 0;
|
|
||||||
|
|
||||||
while (hostp->h_addr_list[j])
|
|
||||||
{
|
|
||||||
if ((specified_local_addr_list[i][0] ==
|
|
||||||
hostp->h_addr_list[j][0]) &&
|
|
||||||
(specified_local_addr_list[i][1] ==
|
|
||||||
hostp->h_addr_list[j][1]) &&
|
|
||||||
(specified_local_addr_list[i][2] ==
|
|
||||||
hostp->h_addr_list[j][2]) &&
|
|
||||||
(specified_local_addr_list[i][3] ==
|
|
||||||
hostp->h_addr_list[j][3]))
|
|
||||||
{
|
|
||||||
/* They're equal, so we're done */
|
|
||||||
|
|
||||||
equiv = 1;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
j++;
|
|
||||||
}
|
|
||||||
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
return (equiv);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
|
||||||
TRANS(SocketUNIXConnect) (XtransConnInfo ciptr,
|
|
||||||
const char *host, const char *port)
|
|
||||||
|
|
||||||
{
|
|
||||||
struct sockaddr_un sockname;
|
|
||||||
SOCKLEN_T namelen;
|
|
||||||
|
|
||||||
prmsg (2,"SocketUNIXConnect(%d,%s,%s)\n", ciptr->fd, host, port);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Make sure 'host' is really local. If not, we return failure.
|
|
||||||
* The reason we make this check is because a process may advertise
|
|
||||||
* a "local" network ID for which it can accept connections, but if
|
|
||||||
* a process on a remote machine tries to connect to this network ID,
|
|
||||||
* we know for sure it will fail.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (host && *host && host[0]!='/' && strcmp (host, "unix") != 0 && !UnixHostReallyLocal (host))
|
|
||||||
{
|
|
||||||
prmsg (1,
|
|
||||||
"SocketUNIXConnect: Cannot connect to non-local host %s\n",
|
|
||||||
host);
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check the port.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (!port || !*port)
|
|
||||||
{
|
|
||||||
prmsg (1,"SocketUNIXConnect: Missing port specification\n");
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Build the socket name.
|
|
||||||
*/
|
|
||||||
|
|
||||||
sockname.sun_family = AF_UNIX;
|
|
||||||
|
|
||||||
if (set_sun_path(port, UNIX_PATH, sockname.sun_path, 0) != 0) {
|
|
||||||
prmsg (1, "SocketUNIXConnect: path too long\n");
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(BSD44SOCKETS)
|
|
||||||
sockname.sun_len = strlen (sockname.sun_path);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(BSD44SOCKETS) || defined(SUN_LEN)
|
|
||||||
namelen = SUN_LEN (&sockname);
|
|
||||||
#else
|
|
||||||
namelen = strlen (sockname.sun_path) + offsetof(struct sockaddr_un, sun_path);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Do the connect()
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (connect (ciptr->fd, (struct sockaddr *) &sockname, namelen) < 0)
|
|
||||||
{
|
|
||||||
int olderrno = errno;
|
|
||||||
int connected = 0;
|
|
||||||
|
|
||||||
if (!connected)
|
|
||||||
{
|
|
||||||
errno = olderrno;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If the error was ENOENT, the server may be starting up; we used
|
|
||||||
* to suggest to try again in this case with
|
|
||||||
* TRANS_TRY_CONNECT_AGAIN, but this introduced problems for
|
|
||||||
* processes still referencing stale sockets in their environment.
|
|
||||||
* Hence, we now return a hard error, TRANS_CONNECT_FAILED, and it
|
|
||||||
* is suggested that higher level stacks handle retries on their
|
|
||||||
* level when they face a slow starting server.
|
|
||||||
*
|
|
||||||
* If the error was EWOULDBLOCK or EINPROGRESS then the socket
|
|
||||||
* was non-blocking and we should poll using select
|
|
||||||
*
|
|
||||||
* If the error was EINTR, the connect was interrupted and we
|
|
||||||
* should try again.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if (olderrno == EWOULDBLOCK || olderrno == EINPROGRESS)
|
|
||||||
return TRANS_IN_PROGRESS;
|
|
||||||
else if (olderrno == EINTR)
|
|
||||||
return TRANS_TRY_CONNECT_AGAIN;
|
|
||||||
else {
|
|
||||||
prmsg (2,"SocketUNIXConnect: Can't connect: errno = %d\n",
|
|
||||||
EGET());
|
|
||||||
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Get the socket name and the peer name from the connect socket,
|
|
||||||
* since this is unix domain.
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ((ciptr->addr = malloc(namelen)) == NULL ||
|
|
||||||
(ciptr->peeraddr = malloc(namelen)) == NULL)
|
|
||||||
{
|
|
||||||
prmsg (1,
|
|
||||||
"SocketUNIXCreateListener: Can't allocate space for the addr\n");
|
|
||||||
return TRANS_CONNECT_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
ciptr->family = AF_UNIX;
|
|
||||||
ciptr->addrlen = namelen;
|
|
||||||
ciptr->peeraddrlen = namelen;
|
|
||||||
memcpy (ciptr->addr, &sockname, ciptr->addrlen);
|
|
||||||
memcpy (ciptr->peeraddr, &sockname, ciptr->peeraddrlen);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* UNIXCONN */
|
|
||||||
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
|
TRANS(SocketBytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
|
||||||
|
|
||||||
|
@ -2325,9 +1610,6 @@ static Xtransport TRANS(SocketTCPFuncs) = {
|
||||||
/* Socket Interface */
|
/* Socket Interface */
|
||||||
"tcp",
|
"tcp",
|
||||||
TRANS_ALIAS,
|
TRANS_ALIAS,
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
tcp_nolisten,
|
tcp_nolisten,
|
||||||
TRANS(SocketOpenCOTSServer),
|
TRANS(SocketOpenCOTSServer),
|
||||||
TRANS(SocketReopenCOTSServer),
|
TRANS(SocketReopenCOTSServer),
|
||||||
|
@ -2335,9 +1617,6 @@ static Xtransport TRANS(SocketTCPFuncs) = {
|
||||||
TRANS(SocketINETCreateListener),
|
TRANS(SocketINETCreateListener),
|
||||||
NULL, /* ResetListener */
|
NULL, /* ResetListener */
|
||||||
TRANS(SocketINETAccept),
|
TRANS(SocketINETAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketINETConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(SocketBytesReadable),
|
TRANS(SocketBytesReadable),
|
||||||
TRANS(SocketRead),
|
TRANS(SocketRead),
|
||||||
TRANS(SocketWrite),
|
TRANS(SocketWrite),
|
||||||
|
@ -2356,9 +1635,6 @@ static Xtransport TRANS(SocketINETFuncs) = {
|
||||||
/* Socket Interface */
|
/* Socket Interface */
|
||||||
"inet",
|
"inet",
|
||||||
0,
|
0,
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
NULL,
|
NULL,
|
||||||
TRANS(SocketOpenCOTSServer),
|
TRANS(SocketOpenCOTSServer),
|
||||||
TRANS(SocketReopenCOTSServer),
|
TRANS(SocketReopenCOTSServer),
|
||||||
|
@ -2366,9 +1642,6 @@ static Xtransport TRANS(SocketINETFuncs) = {
|
||||||
TRANS(SocketINETCreateListener),
|
TRANS(SocketINETCreateListener),
|
||||||
NULL, /* ResetListener */
|
NULL, /* ResetListener */
|
||||||
TRANS(SocketINETAccept),
|
TRANS(SocketINETAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketINETConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(SocketBytesReadable),
|
TRANS(SocketBytesReadable),
|
||||||
TRANS(SocketRead),
|
TRANS(SocketRead),
|
||||||
TRANS(SocketWrite),
|
TRANS(SocketWrite),
|
||||||
|
@ -2388,9 +1661,6 @@ static Xtransport TRANS(SocketINET6Funcs) = {
|
||||||
/* Socket Interface */
|
/* Socket Interface */
|
||||||
"inet6",
|
"inet6",
|
||||||
0,
|
0,
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
NULL,
|
NULL,
|
||||||
TRANS(SocketOpenCOTSServer),
|
TRANS(SocketOpenCOTSServer),
|
||||||
TRANS(SocketReopenCOTSServer),
|
TRANS(SocketReopenCOTSServer),
|
||||||
|
@ -2398,9 +1668,6 @@ static Xtransport TRANS(SocketINET6Funcs) = {
|
||||||
TRANS(SocketINETCreateListener),
|
TRANS(SocketINETCreateListener),
|
||||||
NULL, /* ResetListener */
|
NULL, /* ResetListener */
|
||||||
TRANS(SocketINETAccept),
|
TRANS(SocketINETAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketINETConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(SocketBytesReadable),
|
TRANS(SocketBytesReadable),
|
||||||
TRANS(SocketRead),
|
TRANS(SocketRead),
|
||||||
TRANS(SocketWrite),
|
TRANS(SocketWrite),
|
||||||
|
@ -2427,9 +1694,6 @@ static Xtransport TRANS(SocketLocalFuncs) = {
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
NULL,
|
NULL,
|
||||||
TRANS(SocketOpenCOTSServer),
|
TRANS(SocketOpenCOTSServer),
|
||||||
TRANS(SocketReopenCOTSServer),
|
TRANS(SocketReopenCOTSServer),
|
||||||
|
@ -2437,9 +1701,6 @@ static Xtransport TRANS(SocketLocalFuncs) = {
|
||||||
TRANS(SocketUNIXCreateListener),
|
TRANS(SocketUNIXCreateListener),
|
||||||
TRANS(SocketUNIXResetListener),
|
TRANS(SocketUNIXResetListener),
|
||||||
TRANS(SocketUNIXAccept),
|
TRANS(SocketUNIXAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketUNIXConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(SocketBytesReadable),
|
TRANS(SocketBytesReadable),
|
||||||
TRANS(SocketRead),
|
TRANS(SocketRead),
|
||||||
TRANS(SocketWrite),
|
TRANS(SocketWrite),
|
||||||
|
@ -2466,9 +1727,6 @@ static Xtransport TRANS(SocketUNIXFuncs) = {
|
||||||
#else
|
#else
|
||||||
0,
|
0,
|
||||||
#endif
|
#endif
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketOpenCOTSClient),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
#if !defined(LOCALCONN)
|
#if !defined(LOCALCONN)
|
||||||
unix_nolisten,
|
unix_nolisten,
|
||||||
#else
|
#else
|
||||||
|
@ -2480,9 +1738,6 @@ static Xtransport TRANS(SocketUNIXFuncs) = {
|
||||||
TRANS(SocketUNIXCreateListener),
|
TRANS(SocketUNIXCreateListener),
|
||||||
TRANS(SocketUNIXResetListener),
|
TRANS(SocketUNIXResetListener),
|
||||||
TRANS(SocketUNIXAccept),
|
TRANS(SocketUNIXAccept),
|
||||||
#ifdef TRANS_CLIENT
|
|
||||||
TRANS(SocketUNIXConnect),
|
|
||||||
#endif /* TRANS_CLIENT */
|
|
||||||
TRANS(SocketBytesReadable),
|
TRANS(SocketBytesReadable),
|
||||||
TRANS(SocketRead),
|
TRANS(SocketRead),
|
||||||
TRANS(SocketWrite),
|
TRANS(SocketWrite),
|
||||||
|
|
Loading…
Reference in New Issue