#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/ICE/ICElib.h>
#include "ICElibint.h"
#include <X11/Xtrans/Xtrans.h>
IceConn
IceAcceptConnection (listenObj, statusRet)
IceListenObj listenObj;
IceAcceptStatus *statusRet;
{
IceConn iceConn;
XtransConnInfo newconn;
iceByteOrderMsg *pMsg;
int endian, status;
if ((newconn = _IceTransAccept (listenObj->trans_conn, &status)) == 0)
{
if (status == TRANS_ACCEPT_BAD_MALLOC)
*statusRet = IceAcceptBadMalloc;
else
*statusRet = IceAcceptFailure;
return (NULL);
}
_IceTransSetOption (newconn, TRANS_CLOSEONEXEC, 1);
if ((iceConn = (IceConn) malloc (sizeof (struct _IceConn))) == NULL)
{
_IceTransClose (newconn);
*statusRet = IceAcceptBadMalloc;
return (NULL);
}
iceConn->listen_obj = listenObj;
iceConn->waiting_for_byteorder = True;
iceConn->connection_status = IceConnectPending;
iceConn->io_ok = True;
iceConn->dispatch_level = 0;
iceConn->context = NULL;
iceConn->my_ice_version_index = 0;
iceConn->trans_conn = newconn;
iceConn->send_sequence = 0;
iceConn->receive_sequence = 0;
iceConn->connection_string = (char *) malloc (
strlen (listenObj->network_id) + 1);
if (iceConn->connection_string == NULL)
{
_IceTransClose (newconn);
free ((char *) iceConn);
*statusRet = IceAcceptBadMalloc;
return (NULL);
}
else
strcpy (iceConn->connection_string, listenObj->network_id);
iceConn->vendor = NULL;
iceConn->release = NULL;
if ((iceConn->inbuf = iceConn->inbufptr =
(char *) malloc (ICE_INBUFSIZE)) != NULL)
{
iceConn->inbufmax = iceConn->inbuf + ICE_INBUFSIZE;
}
else
{
_IceTransClose (newconn);
free ((char *) iceConn);
*statusRet = IceAcceptBadMalloc;
return (NULL);
}
if ((iceConn->outbuf = iceConn->outbufptr =
(char *) malloc (ICE_OUTBUFSIZE)) != NULL)
{
iceConn->outbufmax = iceConn->outbuf + ICE_OUTBUFSIZE;
}
else
{
_IceTransClose (newconn);
free (iceConn->inbuf);
free ((char *) iceConn);
*statusRet = IceAcceptBadMalloc;
return (NULL);
}
iceConn->scratch = NULL;
iceConn->scratch_size = 0;
iceConn->open_ref_count = 1;
iceConn->proto_ref_count = 0;
iceConn->skip_want_to_close = False;
iceConn->want_to_close = False;
iceConn->free_asap = False;
iceConn->saved_reply_waits = NULL;
iceConn->ping_waits = NULL;
iceConn->process_msg_info = NULL;
iceConn->connect_to_you = NULL;
iceConn->protosetup_to_you = NULL;
iceConn->connect_to_me = NULL;
iceConn->protosetup_to_me = NULL;
IceGetHeader (iceConn, 0, ICE_ByteOrder,
SIZEOF (iceByteOrderMsg), iceByteOrderMsg, pMsg);
endian = 1;
if (*(char *) &endian)
pMsg->byteOrder = IceLSBfirst;
else
pMsg->byteOrder = IceMSBfirst;
IceFlush (iceConn);
if (_IceWatchProcs)
{
_IceConnectionOpened (iceConn);
}
*statusRet = IceAcceptSuccess;
return (iceConn);
}