Blame src/sm_manager.c

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
}