#include <ctype.h>
#define TRANS_TLI_INET_INDEX 1
#define TRANS_TLI_TCP_INDEX 2
#define TRANS_TLI_TLI_INDEX 3
#define TRANS_SOCKET_UNIX_INDEX 4
#define TRANS_SOCKET_LOCAL_INDEX 5
#define TRANS_SOCKET_INET_INDEX 6
#define TRANS_SOCKET_TCP_INDEX 7
#define TRANS_DNET_INDEX 8
#define TRANS_LOCAL_LOCAL_INDEX 9
#define TRANS_LOCAL_PTS_INDEX 10
#define TRANS_LOCAL_NAMED_INDEX 11
#define TRANS_LOCAL_SCO_INDEX 13
#define TRANS_SOCKET_INET6_INDEX 14
#define TRANS_LOCAL_PIPE_INDEX 15
static
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
#if defined(TCPCONN)
{ &TRANS(SocketTCPFuncs), TRANS_SOCKET_TCP_INDEX },
#if defined(IPv6) && defined(AF_INET6)
{ &TRANS(SocketINET6Funcs), TRANS_SOCKET_INET6_INDEX },
#endif
{ &TRANS(SocketINETFuncs), TRANS_SOCKET_INET_INDEX },
#endif
#if defined(UNIXCONN)
#if !defined(LOCALCONN)
{ &TRANS(SocketLocalFuncs), TRANS_SOCKET_LOCAL_INDEX },
#endif
{ &TRANS(SocketUNIXFuncs), TRANS_SOCKET_UNIX_INDEX },
#endif
#if defined(LOCALCONN)
{ &TRANS(LocalFuncs), TRANS_LOCAL_LOCAL_INDEX },
#ifndef sun
{ &TRANS(PTSFuncs), TRANS_LOCAL_PTS_INDEX },
#endif
#if defined(SVR4) || defined(__SVR4)
{ &TRANS(NAMEDFuncs), TRANS_LOCAL_NAMED_INDEX },
#endif
#ifdef sun
{ &TRANS(PIPEFuncs), TRANS_LOCAL_PIPE_INDEX },
#endif
#if defined(__SCO__) || defined(__UNIXWARE__)
{ &TRANS(SCOFuncs), TRANS_LOCAL_SCO_INDEX },
#endif
#endif
};
#define NUMTRANS (sizeof(Xtransports)/sizeof(Xtransport_table))
#ifdef WIN32
#define ioctl ioctlsocket
#endif
void
TRANS(FreeConnInfo) (XtransConnInfo ciptr)
{
PRMSG (3,"FreeConnInfo(%p)\n", ciptr, 0, 0);
if (ciptr->addr)
xfree (ciptr->addr);
if (ciptr->peeraddr)
xfree (ciptr->peeraddr);
if (ciptr->port)
xfree (ciptr->port);
xfree ((char *) ciptr);
}
#define PROTOBUFSIZE 20
static Xtransport *
TRANS(SelectTransport) (char *protocol)
{
char protobuf[PROTOBUFSIZE];
int i;
PRMSG (3,"SelectTransport(%s)\n", protocol, 0, 0);
strncpy (protobuf, protocol, PROTOBUFSIZE - 1);
protobuf[PROTOBUFSIZE-1] = '\0';
for (i = 0; i < PROTOBUFSIZE && protobuf[i] != '\0'; i++)
if (isupper (protobuf[i]))
protobuf[i] = tolower (protobuf[i]);
for (i = 0; i < NUMTRANS; i++)
{
if (!strcmp (protobuf, Xtransports[i].transport->TransName))
return Xtransports[i].transport;
}
return NULL;
}
#ifndef TEST_t
static
#endif
int
TRANS(ParseAddress) (char *address, char **protocol, char **host, char **port)
{
char *mybuf, *tmpptr;
char *_protocol, *_host, *_port;
char hostnamebuf[256];
int _host_len;
PRMSG (3,"ParseAddress(%s)\n", address, 0, 0);
tmpptr = mybuf = (char *) xalloc (strlen (address) + 1);
strcpy (mybuf, address);
_protocol = mybuf;
if ( ((mybuf = strchr (mybuf,'/')) == NULL) &&
((mybuf = strrchr (tmpptr,':')) == NULL) )
{
*protocol = NULL;
*host = NULL;
*port = NULL;
xfree (tmpptr);
return 0;
}
if (*mybuf == ':')
{
if (mybuf == tmpptr)
{
_protocol = "local";
}
else
{
_protocol = "tcp";
mybuf = tmpptr;
}
}
else
{
*mybuf ++= '\0';
if (strlen(_protocol) == 0)
{
if (*mybuf != ':')
_protocol = "tcp";
else
_protocol = "local";
}
}
_host = mybuf;
if ((mybuf = strrchr (mybuf,':')) == NULL)
{
*protocol = NULL;
*host = NULL;
*port = NULL;
xfree (tmpptr);
return 0;
}
if ((mybuf != _host) && (*(mybuf - 1) == ':')
#if defined(IPv6) && defined(AF_INET6)
&& ( ((mybuf - 1) == _host) || (*(mybuf - 2) != ':') ||
((_protocol != NULL) && (strcmp(_protocol, "dnet") == 0)) )
#endif
)
{
_protocol = "dnet";
*(mybuf - 1) = '\0';
}
*mybuf ++= '\0';
_host_len = strlen(_host);
if (_host_len == 0)
{
TRANS(GetHostname) (hostnamebuf, sizeof (hostnamebuf));
_host = hostnamebuf;
}
#if defined(IPv6) && defined(AF_INET6)
else if ( (_host_len > 3) &&
((strcmp(_protocol, "tcp") == 0) || (strcmp(_protocol, "inet6") == 0))
&& (*_host == '[') && (*(_host + _host_len - 1) == ']') ) {
struct sockaddr_in6 sin6;
*(_host + _host_len - 1) = '\0';
if (inet_pton(AF_INET6, _host + 1, &sin6) == 1) {
_host++;
_protocol = "inet6";
} else {
*(_host + _host_len - 1) = ']';
}
}
#endif
_port = mybuf;
#if defined(FONT_t) || defined(FS_t)
if ((mybuf = strchr (mybuf,'/')) != NULL)
*mybuf ++= '\0';
#endif
#ifdef HAVE_LAUNCHD
if(address != NULL && strlen(address)>8 && (!strncmp(address,"local//",7))) {
_protocol="local";
_host="";
_port=address+6;
}
#endif
if ((*protocol = (char *) xalloc(strlen (_protocol) + 1)) == NULL)
{
*port = NULL;
*host = NULL;
*protocol = NULL;
xfree (tmpptr);
return 0;
}
else
strcpy (*protocol, _protocol);
if ((*host = (char *) xalloc (strlen (_host) + 1)) == NULL)
{
*port = NULL;
*host = NULL;
xfree (*protocol);
*protocol = NULL;
xfree (tmpptr);
return 0;
}
else
strcpy (*host, _host);
if ((*port = (char *) xalloc (strlen (_port) + 1)) == NULL)
{
*port = NULL;
xfree (*host);
*host = NULL;
xfree (*protocol);
*protocol = NULL;
xfree (tmpptr);
return 0;
}
else
strcpy (*port, _port);
xfree (tmpptr);
return 1;
}
static XtransConnInfo
TRANS(Open) (int type, char *address)
{
char *protocol = NULL, *host = NULL, *port = NULL;
XtransConnInfo ciptr = NULL;
Xtransport *thistrans;
PRMSG (2,"Open(%d,%s)\n", type, address, 0);
#if defined(WIN32) && defined(TCPCONN)
if (TRANS(WSAStartup)())
{
PRMSG (1,"Open: WSAStartup failed\n", 0, 0, 0);
return NULL;
}
#endif
if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
{
PRMSG (1,"Open: Unable to Parse address %s\n", address, 0, 0);
return NULL;
}
if ((thistrans = TRANS(SelectTransport) (protocol)) == NULL)
{
PRMSG (1,"Open: Unable to find transport for %s\n",
protocol, 0, 0);
xfree (protocol);
xfree (host);
xfree (port);
return NULL;
}
switch (type)
{
case XTRANS_OPEN_COTS_CLIENT:
#ifdef TRANS_CLIENT
ciptr = thistrans->OpenCOTSClient(thistrans, protocol, host, port);
#endif
break;
case XTRANS_OPEN_COTS_SERVER:
#ifdef TRANS_SERVER
ciptr = thistrans->OpenCOTSServer(thistrans, protocol, host, port);
#endif
break;
case XTRANS_OPEN_CLTS_CLIENT:
#ifdef TRANS_CLIENT
ciptr = thistrans->OpenCLTSClient(thistrans, protocol, host, port);
#endif
break;
case XTRANS_OPEN_CLTS_SERVER:
#ifdef TRANS_SERVER
ciptr = thistrans->OpenCLTSServer(thistrans, protocol, host, port);
#endif
break;
default:
PRMSG (1,"Open: Unknown Open type %d\n", type, 0, 0);
}
if (ciptr == NULL)
{
if (!(thistrans->flags & TRANS_DISABLED))
{
PRMSG (1,"Open: transport open failed for %s/%s:%s\n",
protocol, host, port);
}
xfree (protocol);
xfree (host);
xfree (port);
return NULL;
}
ciptr->transptr = thistrans;
ciptr->port = port;
xfree (protocol);
xfree (host);
return ciptr;
}
#ifdef TRANS_REOPEN
static XtransConnInfo
TRANS(Reopen) (int type, int trans_id, int fd, char *port)
{
XtransConnInfo ciptr = NULL;
Xtransport *thistrans = NULL;
char *save_port;
int i;
PRMSG (2,"Reopen(%d,%d,%s)\n", trans_id, fd, port);
for (i = 0; i < NUMTRANS; i++)
if (Xtransports[i].transport_id == trans_id)
{
thistrans = Xtransports[i].transport;
break;
}
if (thistrans == NULL)
{
PRMSG (1,"Reopen: Unable to find transport id %d\n",
trans_id, 0, 0);
return NULL;
}
if ((save_port = (char *) xalloc (strlen (port) + 1)) == NULL)
{
PRMSG (1,"Reopen: Unable to malloc port string\n", 0, 0, 0);
return NULL;
}
strcpy (save_port, port);
switch (type)
{
case XTRANS_OPEN_COTS_SERVER:
ciptr = thistrans->ReopenCOTSServer(thistrans, fd, port);
break;
case XTRANS_OPEN_CLTS_SERVER:
ciptr = thistrans->ReopenCLTSServer(thistrans, fd, port);
break;
default:
PRMSG (1,"Reopen: Bad Open type %d\n", type, 0, 0);
}
if (ciptr == NULL)
{
PRMSG (1,"Reopen: transport open failed\n", 0, 0, 0);
return NULL;
}
ciptr->transptr = thistrans;
ciptr->port = save_port;
return ciptr;
}
#endif
#ifdef TRANS_CLIENT
XtransConnInfo
TRANS(OpenCOTSClient) (char *address)
{
PRMSG (2,"OpenCOTSClient(%s)\n", address, 0, 0);
return TRANS(Open) (XTRANS_OPEN_COTS_CLIENT, address);
}
#endif
#ifdef TRANS_SERVER
XtransConnInfo
TRANS(OpenCOTSServer) (char *address)
{
PRMSG (2,"OpenCOTSServer(%s)\n", address, 0, 0);
return TRANS(Open) (XTRANS_OPEN_COTS_SERVER, address);
}
#endif
#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
#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
#ifdef TRANS_REOPEN
XtransConnInfo
TRANS(ReopenCOTSServer) (int trans_id, int fd, char *port)
{
PRMSG (2,"ReopenCOTSServer(%d, %d, %s)\n", 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
TRANS(GetReopenInfo) (XtransConnInfo ciptr,
int *trans_id, int *fd, char **port)
{
int i;
for (i = 0; i < NUMTRANS; i++)
if (Xtransports[i].transport == ciptr->transptr)
{
*trans_id = Xtransports[i].transport_id;
*fd = ciptr->fd;
if ((*port = (char *) xalloc (strlen (ciptr->port) + 1)) == NULL)
return 0;
else
{
strcpy (*port, ciptr->port);
return 1;
}
}
return 0;
}
#endif
int
TRANS(SetOption) (XtransConnInfo ciptr, int option, int arg)
{
int fd = ciptr->fd;
int ret = 0;
PRMSG (2,"SetOption(%d,%d,%d)\n", fd, option, arg);
switch (option)
{
case TRANS_NONBLOCKING:
switch (arg)
{
case 0:
break;
case 1:
#if defined(O_NONBLOCK) && !defined(SCO325)
ret = fcntl (fd, F_GETFL, 0);
if (ret != -1)
ret = fcntl (fd, F_SETFL, ret | O_NONBLOCK);
#else
#ifdef FIOSNBIO
{
int arg;
arg = 1;
ret = ioctl (fd, FIOSNBIO, &arg);
}
#else
#if defined(WIN32)
{
#ifdef WIN32
u_long arg;
#else
int arg;
#endif
arg = 1;
ret = ioctl (fd, FIONBIO, &arg);
}
#else
ret = fcntl (fd, F_GETFL, 0);
#ifdef FNDELAY
ret = fcntl (fd, F_SETFL, ret | FNDELAY);
#else
ret = fcntl (fd, F_SETFL, ret | O_NDELAY);
#endif
#endif
#endif
#endif
break;
default:
break;
}
break;
case TRANS_CLOSEONEXEC:
#ifdef F_SETFD
#ifdef FD_CLOEXEC
ret = fcntl (fd, F_SETFD, FD_CLOEXEC);
#else
ret = fcntl (fd, F_SETFD, 1);
#endif
#endif
break;
}
return ret;
}
#ifdef TRANS_SERVER
int
TRANS(CreateListener) (XtransConnInfo ciptr, char *port, unsigned int flags)
{
return ciptr->transptr->CreateListener (ciptr, port, flags);
}
int
TRANS(NoListen) (char * protocol)
{
Xtransport *trans;
int i = 0, ret = 0;
if ((trans = TRANS(SelectTransport)(protocol)) == NULL)
{
PRMSG (1,"TransNoListen: unable to find transport: %s\n",
protocol, 0, 0);
return -1;
}
if (trans->flags & TRANS_ALIAS) {
if (trans->nolisten)
while (trans->nolisten[i]) {
ret |= TRANS(NoListen)(trans->nolisten[i]);
i++;
}
}
trans->flags |= TRANS_NOLISTEN;
return ret;
}
int
TRANS(ResetListener) (XtransConnInfo ciptr)
{
if (ciptr->transptr->ResetListener)
return ciptr->transptr->ResetListener (ciptr);
else
return TRANS_RESET_NOOP;
}
XtransConnInfo
TRANS(Accept) (XtransConnInfo ciptr, int *status)
{
XtransConnInfo newciptr;
PRMSG (2,"Accept(%d)\n", ciptr->fd, 0, 0);
newciptr = ciptr->transptr->Accept (ciptr, status);
if (newciptr)
newciptr->transptr = ciptr->transptr;
return newciptr;
}
#endif
#ifdef TRANS_CLIENT
int
TRANS(Connect) (XtransConnInfo ciptr, char *address)
{
char *protocol;
char *host;
char *port;
int ret;
PRMSG (2,"Connect(%d,%s)\n", ciptr->fd, address, 0);
if (TRANS(ParseAddress) (address, &protocol, &host, &port) == 0)
{
PRMSG (1,"Connect: Unable to Parse address %s\n",
address, 0, 0);
return -1;
}
#ifdef HAVE_LAUNCHD
if (!host) host=strdup("");
#endif
if (!port || !*port)
{
PRMSG (1,"Connect: Missing port specification in %s\n",
address, 0, 0);
if (protocol) xfree (protocol);
if (host) xfree (host);
return -1;
}
ret = ciptr->transptr->Connect (ciptr, host, port);
if (protocol) xfree (protocol);
if (host) xfree (host);
if (port) xfree (port);
return ret;
}
#endif
int
TRANS(BytesReadable) (XtransConnInfo ciptr, BytesReadable_t *pend)
{
return ciptr->transptr->BytesReadable (ciptr, pend);
}
int
TRANS(Read) (XtransConnInfo ciptr, char *buf, int size)
{
return ciptr->transptr->Read (ciptr, buf, size);
}
int
TRANS(Write) (XtransConnInfo ciptr, char *buf, int size)
{
return ciptr->transptr->Write (ciptr, buf, size);
}
int
TRANS(Readv) (XtransConnInfo ciptr, struct iovec *buf, int size)
{
return ciptr->transptr->Readv (ciptr, buf, size);
}
int
TRANS(Writev) (XtransConnInfo ciptr, struct iovec *buf, int size)
{
return ciptr->transptr->Writev (ciptr, buf, size);
}
int
TRANS(Disconnect) (XtransConnInfo ciptr)
{
return ciptr->transptr->Disconnect (ciptr);
}
int
TRANS(Close) (XtransConnInfo ciptr)
{
int ret;
PRMSG (2,"Close(%d)\n", ciptr->fd, 0, 0);
ret = ciptr->transptr->Close (ciptr);
TRANS(FreeConnInfo) (ciptr);
return ret;
}
int
TRANS(CloseForCloning) (XtransConnInfo ciptr)
{
int ret;
PRMSG (2,"CloseForCloning(%d)\n", ciptr->fd, 0, 0);
ret = ciptr->transptr->CloseForCloning (ciptr);
TRANS(FreeConnInfo) (ciptr);
return ret;
}
int
TRANS(IsLocal) (XtransConnInfo ciptr)
{
return (ciptr->family == AF_UNIX);
}
int
TRANS(GetMyAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp,
Xtransaddr **addrp)
{
PRMSG (2,"GetMyAddr(%d)\n", ciptr->fd, 0, 0);
*familyp = ciptr->family;
*addrlenp = ciptr->addrlen;
if ((*addrp = (Xtransaddr *) xalloc (ciptr->addrlen)) == NULL)
{
PRMSG (1,"GetMyAddr: malloc failed\n", 0, 0, 0);
return -1;
}
memcpy(*addrp, ciptr->addr, ciptr->addrlen);
return 0;
}
int
TRANS(GetPeerAddr) (XtransConnInfo ciptr, int *familyp, int *addrlenp,
Xtransaddr **addrp)
{
PRMSG (2,"GetPeerAddr(%d)\n", ciptr->fd, 0, 0);
*familyp = ciptr->family;
*addrlenp = ciptr->peeraddrlen;
if ((*addrp = (Xtransaddr *) xalloc (ciptr->peeraddrlen)) == NULL)
{
PRMSG (1,"GetPeerAddr: malloc failed\n", 0, 0, 0);
return -1;
}
memcpy(*addrp, ciptr->peeraddr, ciptr->peeraddrlen);
return 0;
}
int
TRANS(GetConnectionNumber) (XtransConnInfo ciptr)
{
return ciptr->fd;
}
#ifdef TRANS_SERVER
static int
complete_network_count (void)
{
int count = 0;
int found_local = 0;
int i;
for (i = 0; i < NUMTRANS; i++)
{
if (Xtransports[i].transport->flags & TRANS_ALIAS
|| Xtransports[i].transport->flags & TRANS_NOLISTEN)
continue;
if (Xtransports[i].transport->flags & TRANS_LOCAL)
found_local = 1;
else
count++;
}
return (count + found_local);
}
#ifdef XQUARTZ_EXPORTS_LAUNCHD_FD
extern int xquartz_launchd_fd;
#endif
int
TRANS(MakeAllCOTSServerListeners) (char *port, int *partial, int *count_ret,
XtransConnInfo **ciptrs_ret)
{
char buffer[256];
XtransConnInfo ciptr, temp_ciptrs[NUMTRANS];
int status, i, j;
#if defined(IPv6) && defined(AF_INET6)
int ipv6_succ = 0;
#endif
PRMSG (2,"MakeAllCOTSServerListeners(%s,%p)\n",
port ? port : "NULL", ciptrs_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
for (i = 0; i < NUMTRANS; i++)
{
Xtransport *trans = Xtransports[i].transport;
unsigned int flags = 0;
if (trans->flags&TRANS_ALIAS || trans->flags&TRANS_NOLISTEN)
continue;
snprintf(buffer, sizeof(buffer), "%s/:%s",
trans->TransName, port ? port : "");
PRMSG (5,"MakeAllCOTSServerListeners: opening %s\n",
buffer, 0, 0);
if ((ciptr = TRANS(OpenCOTSServer(buffer))) == NULL)
{
if (trans->flags & TRANS_DISABLED)
continue;
PRMSG (1,
"MakeAllCOTSServerListeners: failed to open listener for %s\n",
trans->TransName, 0, 0);
continue;
}
#if defined(IPv6) && defined(AF_INET6)
if ((Xtransports[i].transport_id == TRANS_SOCKET_INET_INDEX
&& ipv6_succ))
flags |= ADDR_IN_USE_ALLOWED;
#endif
if ((status = TRANS(CreateListener (ciptr, port, flags))) < 0)
{
if (status == TRANS_ADDR_IN_USE)
{
PRMSG (1,
"MakeAllCOTSServerListeners: 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,
"MakeAllCOTSServerListeners: failed to create listener for %s\n",
trans->TransName, 0, 0);
continue;
}
}
#if defined(IPv6) && defined(AF_INET6)
if (Xtransports[i].transport_id == TRANS_SOCKET_INET6_INDEX)
ipv6_succ = 1;
#endif
PRMSG (5,
"MakeAllCOTSServerListeners: opened listener for %s, %d\n",
trans->TransName, ciptr->fd, 0);
temp_ciptrs[*count_ret] = ciptr;
(*count_ret)++;
}
*partial = (*count_ret < complete_network_count());
PRMSG (5,
"MakeAllCOTSServerListeners: partial=%d, actual=%d, complete=%d \n",
*partial, *count_ret, complete_network_count());
if (*count_ret > 0)
{
if ((*ciptrs_ret = (XtransConnInfo *) xalloc (
*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;
}
int
TRANS(MakeAllCLTSServerListeners) (char *port, int *partial, int *count_ret,
XtransConnInfo **ciptrs_ret)
{
char buffer[256];
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;
snprintf(buffer, sizeof(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)
{
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 *) xalloc (
*count_ret * sizeof (XtransConnInfo))) == NULL)
{
return -1;
}
for (i = 0; i < *count_ret; i++)
{
(*ciptrs_ret)[i] = temp_ciptrs[i];
}
}
else
*ciptrs_ret = NULL;
return 0;
}
#endif
#if defined(SYSV) && defined(__i386__) && !defined(__SCO__) && !defined(sun) || defined(WIN32)
static int TRANS(ReadV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt)
{
int i, len, total;
char *base;
ESET(0);
for (i = 0, total = 0; i < iovcnt; i++, iov++) {
len = iov->iov_len;
base = iov->iov_base;
while (len > 0) {
register int nbytes;
nbytes = TRANS(Read) (ciptr, base, len);
if (nbytes < 0 && total == 0) return -1;
if (nbytes <= 0) return total;
ESET(0);
len -= nbytes;
total += nbytes;
base += nbytes;
}
}
return total;
}
#endif
#if defined(SYSV) && defined(__i386__) && !defined(__SCO__) && !defined(sun) || defined(WIN32)
static int TRANS(WriteV) (XtransConnInfo ciptr, struct iovec *iov, int iovcnt)
{
int i, len, total;
char *base;
ESET(0);
for (i = 0, total = 0; i < iovcnt; i++, iov++) {
len = iov->iov_len;
base = iov->iov_base;
while (len > 0) {
register int nbytes;
nbytes = TRANS(Write) (ciptr, base, len);
if (nbytes < 0 && total == 0) return -1;
if (nbytes <= 0) return total;
ESET(0);
len -= nbytes;
total += nbytes;
base += nbytes;
}
}
return total;
}
#endif
#if defined(_POSIX_SOURCE) || defined(USG) || defined(SVR4) || defined(__SVR4) || defined(__SCO__)
#ifndef NEED_UTSNAME
#define NEED_UTSNAME
#endif
#include <sys/utsname.h>
#endif
int TRANS(GetHostname) (char *buf, int maxlen)
{
int len;
#ifdef NEED_UTSNAME
struct utsname name;
uname (&name);
len = strlen (name.nodename);
if (len >= maxlen) len = maxlen - 1;
strncpy (buf, name.nodename, len);
buf[len] = '\0';
#else
buf[0] = '\0';
(void) gethostname (buf, maxlen);
buf [maxlen - 1] = '\0';
len = strlen(buf);
#endif
return len;
}