|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
Copyright 1993, 1998 The Open Group
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
Permission to use, copy, modify, distribute, and sell this software and its
|
|
Packit Service |
752078 |
documentation for any purpose is hereby granted without fee, provided that
|
|
Packit Service |
752078 |
the above copyright notice appear in all copies and that both that
|
|
Packit Service |
752078 |
copyright notice and this permission notice appear in supporting
|
|
Packit Service |
752078 |
documentation.
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
The above copyright notice and this permission notice shall be included in
|
|
Packit Service |
752078 |
all copies or substantial portions of the Software.
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
Packit Service |
752078 |
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
Packit Service |
752078 |
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
Packit Service |
752078 |
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
Packit Service |
752078 |
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
Packit Service |
752078 |
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
Except as contained in this notice, the name of The Open Group shall not be
|
|
Packit Service |
752078 |
used in advertising or otherwise to promote the sale, use or other dealings
|
|
Packit Service |
752078 |
in this Software without prior written authorization from The Open Group.
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* Author: Ralph Mor, X Consortium
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
#ifdef HAVE_CONFIG_H
|
|
Packit Service |
752078 |
#include <config.h>
|
|
Packit Service |
752078 |
#endif
|
|
Packit Service |
752078 |
#include <X11/SM/SMlib.h>
|
|
Packit Service |
752078 |
#include "SMlibint.h"
|
|
Packit Service |
752078 |
#include <X11/Xtrans/Xtrans.h>
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
#ifdef __UNIXWARE__
|
|
Packit Service |
752078 |
#undef shutdown
|
|
Packit Service |
752078 |
#endif
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
static Status
|
|
Packit Service |
752078 |
_SmsProtocolSetupProc (IceConn iceConn,
|
|
Packit Service |
752078 |
int majorVersion,
|
|
Packit Service |
752078 |
int minorVersion,
|
|
Packit Service |
752078 |
char *vendor,
|
|
Packit Service |
752078 |
char *release,
|
|
Packit Service |
752078 |
IcePointer *clientDataRet,
|
|
Packit Service |
752078 |
char **failureReasonRet)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
SmsConn smsConn;
|
|
Packit Service |
752078 |
unsigned long mask;
|
|
Packit Service |
752078 |
Status status;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* vendor/release are undefined for ProtocolSetup in XSMP.
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (vendor)
|
|
Packit Service |
752078 |
free (vendor);
|
|
Packit Service |
752078 |
if (release)
|
|
Packit Service |
752078 |
free (release);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* Allocate new SmsConn.
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if ((smsConn = malloc (sizeof (struct _SmsConn))) == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
const char *str = "Memory allocation failed";
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
*failureReasonRet = strdup (str);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return (0);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smsConn->iceConn = iceConn;
|
|
Packit Service |
752078 |
smsConn->proto_major_version = majorVersion;
|
|
Packit Service |
752078 |
smsConn->proto_minor_version = minorVersion;
|
|
Packit Service |
752078 |
smsConn->client_id = NULL;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smsConn->save_yourself_in_progress = False;
|
|
Packit Service |
752078 |
smsConn->interaction_allowed = SmInteractStyleNone;
|
|
Packit Service |
752078 |
smsConn->can_cancel_shutdown = False;
|
|
Packit Service |
752078 |
smsConn->interact_in_progress = False;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
*clientDataRet = (IcePointer) smsConn;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* Now give the session manager the new smsConn and get back the
|
|
Packit Service |
752078 |
* callbacks to invoke when messages arrive from the client.
|
|
Packit Service |
752078 |
*
|
|
Packit Service |
752078 |
* In the future, we can use the mask return value to check
|
|
Packit Service |
752078 |
* if the SM is expecting an older rev of SMlib.
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
bzero ((char *) &smsConn->callbacks, sizeof (SmsCallbacks));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
status = (*_SmsNewClientProc) (smsConn, _SmsNewClientData,
|
|
Packit Service |
752078 |
&mask, &smsConn->callbacks, failureReasonRet);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return (status);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
Status
|
|
Packit Service |
752078 |
SmsInitialize(const char *vendor, const char *release,
|
|
Packit Service |
752078 |
SmsNewClientProc newClientProc,
|
|
Packit Service |
752078 |
SmPointer managerData, IceHostBasedAuthProc hostBasedAuthProc,
|
|
Packit Service |
752078 |
int errorLength, char *errorStringRet)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
const char *auth_names[] = {"MIT-MAGIC-COOKIE-1"};
|
|
Packit Service |
752078 |
IcePaAuthProc auth_procs[] = {_IcePaMagicCookie1Proc};
|
|
Packit Service |
752078 |
int auth_count = 1;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IcePaVersionRec versions[] = {
|
|
Packit Service |
752078 |
{SmProtoMajor, SmProtoMinor, _SmsProcessMessage}
|
|
Packit Service |
752078 |
};
|
|
Packit Service |
752078 |
int version_count = 1;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (errorStringRet && errorLength > 0)
|
|
Packit Service |
752078 |
*errorStringRet = '\0';
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!newClientProc)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
if (errorStringRet && errorLength > 0) {
|
|
Packit Service |
752078 |
strncpy (errorStringRet,
|
|
Packit Service |
752078 |
"The SmsNewClientProc callback can't be NULL",
|
|
Packit Service |
752078 |
errorLength);
|
|
Packit Service |
752078 |
errorStringRet[errorLength - 1] = '\0';
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return (0);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!_SmsOpcode)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if ((_SmsOpcode = IceRegisterForProtocolReply ("XSMP",
|
|
Packit Service |
752078 |
vendor, release, version_count, versions,
|
|
Packit Service |
752078 |
auth_count, auth_names, auth_procs, hostBasedAuthProc,
|
|
Packit Service |
752078 |
_SmsProtocolSetupProc,
|
|
Packit Service |
752078 |
NULL, /* IceProtocolActivateProc - we don't care about
|
|
Packit Service |
752078 |
when the Protocol Reply is sent, because the
|
|
Packit Service |
752078 |
session manager can not immediately send a
|
|
Packit Service |
752078 |
message - it must wait for RegisterClient. */
|
|
Packit Service |
752078 |
NULL /* IceIOErrorProc */
|
|
Packit Service |
752078 |
)) < 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
if (errorStringRet && errorLength > 0) {
|
|
Packit Service |
752078 |
strncpy (errorStringRet,
|
|
Packit Service |
752078 |
"Could not register XSMP protocol with ICE",
|
|
Packit Service |
752078 |
errorLength);
|
|
Packit Service |
752078 |
errorStringRet[errorLength - 1] = '\0';
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
return (0);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_SmsNewClientProc = newClientProc;
|
|
Packit Service |
752078 |
_SmsNewClientData = managerData;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return (1);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
char *
|
|
Packit Service |
752078 |
SmsClientHostName(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
return (IceGetPeerName (smsConn->iceConn));
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
Status
|
|
Packit Service |
752078 |
SmsRegisterClientReply(SmsConn smsConn, char *clientId)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
size_t extra;
|
|
Packit Service |
752078 |
smRegisterClientReplyMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if ((smsConn->client_id = strdup (clientId)) == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
return (0);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
extra = ARRAY8_BYTES (strlen (clientId));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceGetHeaderExtra (iceConn, _SmsOpcode, SM_RegisterClientReply,
|
|
Packit Service |
752078 |
SIZEOF (smRegisterClientReplyMsg), WORD64COUNT (extra),
|
|
Packit Service |
752078 |
smRegisterClientReplyMsg, pMsg, pData);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
STORE_ARRAY8 (pData, strlen (clientId), clientId);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return (1);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsSaveYourself(SmsConn smsConn, int saveType, Bool shutdown,
|
|
Packit Service |
752078 |
int interactStyle, Bool fast)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
smSaveYourselfMsg *pMsg;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceGetHeader (iceConn, _SmsOpcode, SM_SaveYourself,
|
|
Packit Service |
752078 |
SIZEOF (smSaveYourselfMsg), smSaveYourselfMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pMsg->saveType = saveType;
|
|
Packit Service |
752078 |
pMsg->shutdown = shutdown;
|
|
Packit Service |
752078 |
pMsg->interactStyle = interactStyle;
|
|
Packit Service |
752078 |
pMsg->fast = fast;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smsConn->save_yourself_in_progress = True;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (interactStyle == SmInteractStyleNone ||
|
|
Packit Service |
752078 |
interactStyle == SmInteractStyleErrors ||
|
|
Packit Service |
752078 |
interactStyle == SmInteractStyleAny)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smsConn->interaction_allowed = interactStyle;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smsConn->interaction_allowed = SmInteractStyleNone;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smsConn->can_cancel_shutdown = shutdown &&
|
|
Packit Service |
752078 |
(interactStyle == SmInteractStyleAny ||
|
|
Packit Service |
752078 |
interactStyle == SmInteractStyleErrors);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsSaveYourselfPhase2(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceSimpleMessage (iceConn, _SmsOpcode, SM_SaveYourselfPhase2);
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsInteract(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceSimpleMessage (iceConn, _SmsOpcode, SM_Interact);
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smsConn->interact_in_progress = True;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsDie(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceSimpleMessage (iceConn, _SmsOpcode, SM_Die);
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsSaveComplete(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceSimpleMessage (iceConn, _SmsOpcode, SM_SaveComplete);
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsShutdownCancelled(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceSimpleMessage (iceConn, _SmsOpcode, SM_ShutdownCancelled);
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smsConn->can_cancel_shutdown = False;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsReturnProperties(SmsConn smsConn, int numProps, SmProp **props)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceConn iceConn = smsConn->iceConn;
|
|
Packit Service |
752078 |
unsigned int bytes;
|
|
Packit Service |
752078 |
smPropertiesReplyMsg *pMsg;
|
|
Packit Service |
752078 |
char *pBuf;
|
|
Packit Service |
752078 |
char *pStart;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceGetHeader (iceConn, _SmsOpcode, SM_PropertiesReply,
|
|
Packit Service |
752078 |
SIZEOF (smPropertiesReplyMsg), smPropertiesReplyMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
LISTOF_PROP_BYTES (numProps, props, bytes);
|
|
Packit Service |
752078 |
pMsg->length += WORD64COUNT (bytes);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pBuf = pStart = IceAllocScratch (iceConn, bytes);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
STORE_LISTOF_PROPERTY (pBuf, numProps, props);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceWriteData (iceConn, bytes, pStart);
|
|
Packit Service |
752078 |
IceFlush (iceConn);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
SmsCleanUp(SmsConn smsConn)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceProtocolShutdown (smsConn->iceConn, _SmsOpcode);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (smsConn->client_id)
|
|
Packit Service |
752078 |
free (smsConn->client_id);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
free (smsConn);
|
|
Packit Service |
752078 |
}
|