|
Packit |
e18bd3 |
/******************************************************************************
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Copyright 1993, 1998 The Open Group
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit |
e18bd3 |
documentation for any purpose is hereby granted without fee, provided that
|
|
Packit |
e18bd3 |
the above copyright notice appear in all copies and that both that
|
|
Packit |
e18bd3 |
copyright notice and this permission notice appear in supporting
|
|
Packit |
e18bd3 |
documentation.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
The above copyright notice and this permission notice shall be included in
|
|
Packit |
e18bd3 |
all copies or substantial portions of the Software.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit |
e18bd3 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit |
e18bd3 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
Packit |
e18bd3 |
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
Packit |
e18bd3 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit |
e18bd3 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Except as contained in this notice, the name of The Open Group shall not be
|
|
Packit |
e18bd3 |
used in advertising or otherwise to promote the sale, use or other dealings
|
|
Packit |
e18bd3 |
in this Software without prior written authorization from The Open Group.
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
Author: Ralph Mor, X Consortium
|
|
Packit |
e18bd3 |
******************************************************************************/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
e18bd3 |
#include <config.h>
|
|
Packit |
e18bd3 |
#endif
|
|
Packit |
e18bd3 |
#include <X11/ICE/ICElib.h>
|
|
Packit |
e18bd3 |
#include "ICElibint.h"
|
|
Packit |
e18bd3 |
#include <X11/Xtrans/Xtrans.h>
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
IceConn
|
|
Packit |
e18bd3 |
IceAcceptConnection (
|
|
Packit |
e18bd3 |
IceListenObj listenObj,
|
|
Packit |
e18bd3 |
IceAcceptStatus *statusRet
|
|
Packit |
e18bd3 |
)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
IceConn iceConn;
|
|
Packit |
e18bd3 |
XtransConnInfo newconn;
|
|
Packit |
e18bd3 |
iceByteOrderMsg *pMsg;
|
|
Packit |
e18bd3 |
int endian, status;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Accept the connection.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if ((newconn = _IceTransAccept (listenObj->trans_conn, &status)) == NULL)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
if (status == TRANS_ACCEPT_BAD_MALLOC)
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptBadMalloc;
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptFailure;
|
|
Packit |
e18bd3 |
return (NULL);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Set close-on-exec so that programs that fork() don't get confused.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
_IceTransSetOption (newconn, TRANS_CLOSEONEXEC, 1);
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Create an ICE object for this connection.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if ((iceConn = malloc (sizeof (struct _IceConn))) == NULL)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
_IceTransClose (newconn);
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptBadMalloc;
|
|
Packit |
e18bd3 |
return (NULL);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->listen_obj = listenObj;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->waiting_for_byteorder = True;
|
|
Packit |
e18bd3 |
iceConn->connection_status = IceConnectPending;
|
|
Packit |
e18bd3 |
iceConn->io_ok = True;
|
|
Packit |
e18bd3 |
iceConn->dispatch_level = 0;
|
|
Packit |
e18bd3 |
iceConn->context = NULL;
|
|
Packit |
e18bd3 |
iceConn->my_ice_version_index = 0;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->trans_conn = newconn;
|
|
Packit |
e18bd3 |
iceConn->send_sequence = 0;
|
|
Packit |
e18bd3 |
iceConn->receive_sequence = 0;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->connection_string = strdup(listenObj->network_id);
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (iceConn->connection_string == NULL)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
_IceTransClose (newconn);
|
|
Packit |
e18bd3 |
free (iceConn);
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptBadMalloc;
|
|
Packit |
e18bd3 |
return (NULL);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->vendor = NULL;
|
|
Packit |
e18bd3 |
iceConn->release = NULL;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if ((iceConn->inbuf = iceConn->inbufptr = malloc (ICE_INBUFSIZE)) != NULL)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
iceConn->inbufmax = iceConn->inbuf + ICE_INBUFSIZE;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
_IceTransClose (newconn);
|
|
Packit |
e18bd3 |
free (iceConn->connection_string);
|
|
Packit |
e18bd3 |
free (iceConn);
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptBadMalloc;
|
|
Packit |
e18bd3 |
return (NULL);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if ((iceConn->outbuf = iceConn->outbufptr = malloc (ICE_OUTBUFSIZE)) != NULL)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
iceConn->outbufmax = iceConn->outbuf + ICE_OUTBUFSIZE;
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
_IceTransClose (newconn);
|
|
Packit |
e18bd3 |
free (iceConn->connection_string);
|
|
Packit |
e18bd3 |
free (iceConn->inbuf);
|
|
Packit |
e18bd3 |
free (iceConn);
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptBadMalloc;
|
|
Packit |
e18bd3 |
return (NULL);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->scratch = NULL;
|
|
Packit |
e18bd3 |
iceConn->scratch_size = 0;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->open_ref_count = 1;
|
|
Packit |
e18bd3 |
iceConn->proto_ref_count = 0;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->skip_want_to_close = False;
|
|
Packit |
e18bd3 |
iceConn->want_to_close = False;
|
|
Packit |
e18bd3 |
iceConn->free_asap = False;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->saved_reply_waits = NULL;
|
|
Packit |
e18bd3 |
iceConn->ping_waits = NULL;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->process_msg_info = NULL;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->connect_to_you = NULL;
|
|
Packit |
e18bd3 |
iceConn->protosetup_to_you = NULL;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
iceConn->connect_to_me = NULL;
|
|
Packit |
e18bd3 |
iceConn->protosetup_to_me = NULL;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Send our byte order.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
IceGetHeader (iceConn, 0, ICE_ByteOrder,
|
|
Packit |
e18bd3 |
SIZEOF (iceByteOrderMsg), iceByteOrderMsg, pMsg);
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
endian = 1;
|
|
Packit |
e18bd3 |
if (*(char *) &endian)
|
|
Packit |
e18bd3 |
pMsg->byteOrder = IceLSBfirst;
|
|
Packit |
e18bd3 |
else
|
|
Packit |
e18bd3 |
pMsg->byteOrder = IceMSBfirst;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
IceFlush (iceConn);
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
if (_IceWatchProcs)
|
|
Packit |
e18bd3 |
{
|
|
Packit |
e18bd3 |
/*
|
|
Packit |
e18bd3 |
* Notify the watch procedures that an iceConn was opened.
|
|
Packit |
e18bd3 |
*/
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
_IceConnectionOpened (iceConn);
|
|
Packit |
e18bd3 |
}
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
*statusRet = IceAcceptSuccess;
|
|
Packit |
e18bd3 |
|
|
Packit |
e18bd3 |
return (iceConn);
|
|
Packit |
e18bd3 |
}
|