|
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 <limits.h>
|
|
Packit Service |
752078 |
#include "SMlibint.h"
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* Check for bad length
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
#define CHECK_SIZE_MATCH(_iceConn, _majorOp, _minorOp, _expected_len, _actual_len, _severity) \
|
|
Packit Service |
752078 |
if ((((_actual_len) - SIZEOF (iceMsg)) >> 3) != _expected_len) \
|
|
Packit Service |
752078 |
{ \
|
|
Packit Service |
752078 |
_IceErrorBadLength (_iceConn, _majorOp, _minorOp, _severity); \
|
|
Packit Service |
752078 |
return; \
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
#define CHECK_AT_LEAST_SIZE(_iceConn, _majorOp, _minorOp, _expected_len, _actual_len, _severity) \
|
|
Packit Service |
752078 |
if ((((_actual_len) - SIZEOF (iceMsg)) >> 3) > _expected_len) \
|
|
Packit Service |
752078 |
{ \
|
|
Packit Service |
752078 |
_IceErrorBadLength (_iceConn, _majorOp, _minorOp, _severity); \
|
|
Packit Service |
752078 |
return; \
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
static char *
|
|
Packit Service |
752078 |
extractArray8(char **pBuf, char *pEnd, Bool swap, int *len)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
char *p;
|
|
Packit Service |
752078 |
int n;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pEnd - *pBuf < 4)
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
EXTRACT_CARD32 (*pBuf, swap, n);
|
|
Packit Service |
752078 |
if (n < 0 || n > INT_MAX - 7)
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if ((p = malloc (n + 1)) == NULL)
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
memcpy(p, *pBuf, n);
|
|
Packit Service |
752078 |
p[n] = '\0';
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
*pBuf += n + PAD64 (4 + n);
|
|
Packit Service |
752078 |
if (len != NULL)
|
|
Packit Service |
752078 |
*len = n;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return p;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
static SmProp **
|
|
Packit Service |
752078 |
extractListofProperty(char *pBuf, char *pEnd, Bool swap, int *count)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
int i, j, n;
|
|
Packit Service |
752078 |
SmProp **props;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pEnd - pBuf < 4)
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
EXTRACT_CARD32 (pBuf, swap, n);
|
|
Packit Service |
752078 |
if (n < 0 || n > INT_MAX / sizeof (SmProp *))
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
pBuf += 4;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
props = malloc (n * sizeof(SmProp *));
|
|
Packit Service |
752078 |
if (props == NULL)
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
for (i = 0; i < n; i++)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
props[i] = calloc (1, sizeof (SmProp));
|
|
Packit Service |
752078 |
if (props[i] == NULL)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
if ((props[i]->name = extractArray8 (&pBuf, pEnd, swap, NULL)) == NULL)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
if ((props[i]->type = extractArray8 (&pBuf, pEnd, swap, NULL)) == NULL)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pEnd - pBuf < 4)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
EXTRACT_CARD32 (pBuf, swap, props[i]->num_vals);
|
|
Packit Service |
752078 |
if (props[i]->num_vals < 0)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
pBuf += 4;
|
|
Packit Service |
752078 |
props[i]->vals = calloc (props[i]->num_vals, sizeof (SmPropValue));
|
|
Packit Service |
752078 |
if (props[i]->vals == NULL)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
for (j = 0; j < props[i]->num_vals; j++)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
props[i]->vals[j].value = extractArray8 (&pBuf, pEnd, swap,
|
|
Packit Service |
752078 |
&props[i]->vals[j].length);
|
|
Packit Service |
752078 |
if (props[i]->vals[j].value == NULL)
|
|
Packit Service |
752078 |
goto fail;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
*count = n;
|
|
Packit Service |
752078 |
return props;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
fail:
|
|
Packit Service |
752078 |
for (; i >= 0; i--)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
if (props[i] != NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
free (props[i]->name);
|
|
Packit Service |
752078 |
free (props[i]->type);
|
|
Packit Service |
752078 |
if (props[i]->vals != NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
for (j = 0; j < props[i]->num_vals; j++)
|
|
Packit Service |
752078 |
free (props[i]->vals[j].value);
|
|
Packit Service |
752078 |
free (props[i]->vals);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
free (props[i]);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
free (props);
|
|
Packit Service |
752078 |
return NULL;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
static Bool
|
|
Packit Service |
752078 |
validErrorMessage(char *pData, char *pEnd, int errorClass, Bool swap)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
if (errorClass == IceBadValue)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
unsigned int length;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pEnd - pData < 8)
|
|
Packit Service |
752078 |
return False;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pData += 4;
|
|
Packit Service |
752078 |
EXTRACT_CARD32 (pData, swap, length);
|
|
Packit Service |
752078 |
if (length > pEnd - pData)
|
|
Packit Service |
752078 |
return False;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return True;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
_SmcProcessMessage(IceConn iceConn, IcePointer clientData, int opcode,
|
|
Packit Service |
752078 |
unsigned long length, Bool swap,
|
|
Packit Service |
752078 |
IceReplyWaitInfo *replyWait, Bool *replyReadyRet)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
SmcConn smcConn = (SmcConn) clientData;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (replyWait)
|
|
Packit Service |
752078 |
*replyReadyRet = False;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smcConn->client_id &&
|
|
Packit Service |
752078 |
opcode != SM_RegisterClientReply && opcode != SM_Error)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceReadSkip (iceConn, length << 3);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode, opcode, IceFatalToProtocol);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
switch (opcode)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
case SM_Error:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
iceErrorMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData, *pEnd;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (iceErrorMsg), IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (iceErrorMsg),
|
|
Packit Service |
752078 |
iceErrorMsg, pMsg, pData);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pData);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (swap)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
pMsg->errorClass = lswaps (pMsg->errorClass);
|
|
Packit Service |
752078 |
pMsg->offendingSequenceNum = lswapl (pMsg->offendingSequenceNum);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pEnd = pData + (length << 3) - (SIZEOF (iceErrorMsg) - SIZEOF(iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (replyWait &&
|
|
Packit Service |
752078 |
replyWait->minor_opcode_of_request == SM_RegisterClient &&
|
|
Packit Service |
752078 |
pMsg->errorClass == IceBadValue &&
|
|
Packit Service |
752078 |
pMsg->offendingMinorOpcode == SM_RegisterClient &&
|
|
Packit Service |
752078 |
pMsg->offendingSequenceNum == replyWait->sequence_of_request)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* For Register Client, the previous ID was bad.
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_SmcRegisterClientReply *reply =
|
|
Packit Service |
752078 |
(_SmcRegisterClientReply *) (replyWait->reply);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
reply->status = 0;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
*replyReadyRet = True;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (!validErrorMessage(pData, pEnd, pMsg->errorClass, swap))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pData);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
(*_SmcErrorHandler) (smcConn, swap,
|
|
Packit Service |
752078 |
pMsg->offendingMinorOpcode,
|
|
Packit Service |
752078 |
pMsg->offendingSequenceNum,
|
|
Packit Service |
752078 |
pMsg->errorClass, pMsg->severity,
|
|
Packit Service |
752078 |
(SmPointer) pData);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pData);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_RegisterClientReply:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!replyWait ||
|
|
Packit Service |
752078 |
replyWait->minor_opcode_of_request != SM_RegisterClient)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceReadSkip (iceConn, length << 3);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_RegisterClientReply, IceFatalToProtocol);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smRegisterClientReplyMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData, *pStart, *pEnd;
|
|
Packit Service |
752078 |
_SmcRegisterClientReply *reply =
|
|
Packit Service |
752078 |
(_SmcRegisterClientReply *) (replyWait->reply);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smRegisterClientReplyMsg), IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (smRegisterClientReplyMsg),
|
|
Packit Service |
752078 |
smRegisterClientReplyMsg, pMsg, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pData = pStart;
|
|
Packit Service |
752078 |
pEnd = pStart + (length << 3) -
|
|
Packit Service |
752078 |
(SIZEOF (smRegisterClientReplyMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
reply->client_id = extractArray8(&pData, pEnd, swap, NULL);
|
|
Packit Service |
752078 |
if (reply->client_id == NULL) {
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
reply->status = 1;
|
|
Packit Service |
752078 |
*replyReadyRet = True;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SaveYourself:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smSaveYourselfMsg *pMsg;
|
|
Packit Service |
752078 |
unsigned char errVal;
|
|
Packit Service |
752078 |
int errOffset = -1;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSaveYourselfMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadMessageHeader (iceConn, SIZEOF (smSaveYourselfMsg),
|
|
Packit Service |
752078 |
smSaveYourselfMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pMsg->saveType != SmSaveGlobal &&
|
|
Packit Service |
752078 |
pMsg->saveType != SmSaveLocal &&
|
|
Packit Service |
752078 |
pMsg->saveType != SmSaveBoth)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->saveType;
|
|
Packit Service |
752078 |
errOffset = 8;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->shutdown != 1 && pMsg->shutdown != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->shutdown;
|
|
Packit Service |
752078 |
errOffset = 9;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->interactStyle != SmInteractStyleNone &&
|
|
Packit Service |
752078 |
pMsg->interactStyle != SmInteractStyleErrors &&
|
|
Packit Service |
752078 |
pMsg->interactStyle != SmInteractStyleAny)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->interactStyle;
|
|
Packit Service |
752078 |
errOffset = 10;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->fast != 1 && pMsg->fast != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->fast;
|
|
Packit Service |
752078 |
errOffset = 11;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (errOffset >= 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadValue (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_SaveYourself, errOffset, 1, (IcePointer) &errVal);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
(*smcConn->callbacks.save_yourself.callback) (smcConn,
|
|
Packit Service |
752078 |
smcConn->callbacks.save_yourself.client_data,
|
|
Packit Service |
752078 |
pMsg->saveType, pMsg->shutdown,
|
|
Packit Service |
752078 |
pMsg->interactStyle, pMsg->fast);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smcConn->save_yourself_in_progress = True;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pMsg->shutdown)
|
|
Packit Service |
752078 |
smcConn->shutdown_in_progress = True;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SaveYourselfPhase2:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smcConn->phase2_wait)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_SaveYourselfPhase2, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSaveYourselfPhase2Msg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smcConn->phase2_wait->phase2_proc) (smcConn,
|
|
Packit Service |
752078 |
smcConn->phase2_wait->client_data);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
free (smcConn->phase2_wait);
|
|
Packit Service |
752078 |
smcConn->phase2_wait = NULL;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_Interact:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smcConn->interact_waits)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_Interact, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_SmcInteractWait *next = smcConn->interact_waits->next;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smInteractMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smcConn->interact_waits->interact_proc) (smcConn,
|
|
Packit Service |
752078 |
smcConn->interact_waits->client_data);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
free (smcConn->interact_waits);
|
|
Packit Service |
752078 |
smcConn->interact_waits = next;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SaveComplete:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smcConn->save_yourself_in_progress)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_SaveComplete, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSaveCompleteMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smcConn->save_yourself_in_progress = False;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smcConn->callbacks.save_complete.callback) (smcConn,
|
|
Packit Service |
752078 |
smcConn->callbacks.save_complete.client_data);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_Die:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smDieMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smcConn->callbacks.die.callback) (smcConn,
|
|
Packit Service |
752078 |
smcConn->callbacks.die.client_data);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_ShutdownCancelled:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smcConn->shutdown_in_progress)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_ShutdownCancelled, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smShutdownCancelledMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
smcConn->shutdown_in_progress = False;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smcConn->callbacks.shutdown_cancelled.callback) (smcConn,
|
|
Packit Service |
752078 |
smcConn->callbacks.shutdown_cancelled.client_data);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_PropertiesReply:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smcConn->prop_reply_waits)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceReadSkip (iceConn, length << 3);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmcOpcode,
|
|
Packit Service |
752078 |
SM_PropertiesReply, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smPropertiesReplyMsg *pMsg;
|
|
Packit Service |
752078 |
char *pStart, *pEnd;
|
|
Packit Service |
752078 |
int numProps = 0;
|
|
Packit Service |
752078 |
SmProp **props = NULL;
|
|
Packit Service |
752078 |
_SmcPropReplyWait *next;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smPropertiesReplyMsg), IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (smPropertiesReplyMsg),
|
|
Packit Service |
752078 |
smPropertiesReplyMsg, pMsg, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pEnd = pStart + (length << 3) -
|
|
Packit Service |
752078 |
(SIZEOF (smPropertiesReplyMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
props = extractListofProperty(pStart, pEnd, swap, &numProps);
|
|
Packit Service |
752078 |
if (props == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
next = smcConn->prop_reply_waits->next;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smcConn->prop_reply_waits->prop_reply_proc) (smcConn,
|
|
Packit Service |
752078 |
smcConn->prop_reply_waits->client_data, numProps, props);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
free (smcConn->prop_reply_waits);
|
|
Packit Service |
752078 |
smcConn->prop_reply_waits = next;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
default:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadMinor (iceConn, _SmcOpcode, opcode, IceCanContinue);
|
|
Packit Service |
752078 |
_IceReadSkip (iceConn, length << 3);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
void
|
|
Packit Service |
752078 |
_SmsProcessMessage(IceConn iceConn, IcePointer clientData, int opcode,
|
|
Packit Service |
752078 |
unsigned long length, Bool swap)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
SmsConn smsConn = (SmsConn) clientData;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smsConn->client_id &&
|
|
Packit Service |
752078 |
opcode != SM_RegisterClient && opcode != SM_Error)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceReadSkip (iceConn, length << 3);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode, opcode, IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
switch (opcode)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
case SM_Error:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
iceErrorMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData, *pEnd;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (iceErrorMsg), IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (iceErrorMsg),
|
|
Packit Service |
752078 |
iceErrorMsg, pMsg, pData);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pData);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (swap)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
pMsg->errorClass = lswaps (pMsg->errorClass);
|
|
Packit Service |
752078 |
pMsg->offendingSequenceNum = lswapl (pMsg->offendingSequenceNum);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pEnd = pData + (length << 3) - (SIZEOF (iceErrorMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!validErrorMessage(pData, pEnd, pMsg->errorClass, swap))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pData);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*_SmsErrorHandler) (smsConn, swap,
|
|
Packit Service |
752078 |
pMsg->offendingMinorOpcode,
|
|
Packit Service |
752078 |
pMsg->offendingSequenceNum,
|
|
Packit Service |
752078 |
pMsg->errorClass, pMsg->severity,
|
|
Packit Service |
752078 |
(SmPointer) pData);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pData);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_RegisterClient:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smRegisterClientMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData, *pStart, *pEnd;
|
|
Packit Service |
752078 |
char *previousId;
|
|
Packit Service |
752078 |
int idLen;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smRegisterClientMsg), IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (smRegisterClientMsg),
|
|
Packit Service |
752078 |
smRegisterClientMsg, pMsg, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pData = pStart;
|
|
Packit Service |
752078 |
pEnd = pStart + (length << 3) -
|
|
Packit Service |
752078 |
(SIZEOF (smRegisterClientMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
previousId = extractArray8(&pData, pEnd, swap, &idLen);
|
|
Packit Service |
752078 |
if (previousId == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (*previousId == '\0')
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
free (previousId);
|
|
Packit Service |
752078 |
previousId = NULL;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!(*smsConn->callbacks.register_client.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.register_client.manager_data, previousId))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
/*
|
|
Packit Service |
752078 |
* The previoudId was bad. Generate BadValue error.
|
|
Packit Service |
752078 |
*/
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadValue (smsConn->iceConn, _SmsOpcode, SM_RegisterClient,
|
|
Packit Service |
752078 |
8, ARRAY8_BYTES (idLen), (IcePointer) pStart);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_InteractRequest:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smsConn->save_yourself_in_progress ||
|
|
Packit Service |
752078 |
smsConn->interaction_allowed == SmInteractStyleNone)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_InteractRequest, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smInteractRequestMsg *pMsg;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smInteractRequestMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadSimpleMessage (iceConn, smInteractRequestMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pMsg->dialogType != SmDialogNormal &&
|
|
Packit Service |
752078 |
pMsg->dialogType != SmDialogError)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
unsigned char errVal = pMsg->dialogType;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadValue (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_InteractRequest, 2, 1, (IcePointer) &errVal);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->dialogType == SmDialogNormal &&
|
|
Packit Service |
752078 |
smsConn->interaction_allowed != SmInteractStyleAny)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_InteractRequest, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
(*smsConn->callbacks.interact_request.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.interact_request.manager_data,
|
|
Packit Service |
752078 |
pMsg->dialogType);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_InteractDone:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smsConn->interact_in_progress)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_InteractDone, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smInteractDoneMsg *pMsg;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smInteractDoneMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadSimpleMessage (iceConn, smInteractDoneMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pMsg->cancelShutdown != 1 &&
|
|
Packit Service |
752078 |
pMsg->cancelShutdown != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
unsigned char errVal = pMsg->cancelShutdown;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadValue (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_InteractDone, 2, 1, (IcePointer) &errVal);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->cancelShutdown && !smsConn->can_cancel_shutdown)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_InteractDone, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smsConn->interact_in_progress = False;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.interact_done.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.interact_done.manager_data,
|
|
Packit Service |
752078 |
pMsg->cancelShutdown);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SaveYourselfRequest:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smSaveYourselfRequestMsg *pMsg;
|
|
Packit Service |
752078 |
unsigned char errVal;
|
|
Packit Service |
752078 |
int errOffset = -1;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSaveYourselfRequestMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadMessageHeader (iceConn, SIZEOF (smSaveYourselfRequestMsg),
|
|
Packit Service |
752078 |
smSaveYourselfRequestMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pMsg);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pMsg->saveType != SmSaveGlobal &&
|
|
Packit Service |
752078 |
pMsg->saveType != SmSaveLocal &&
|
|
Packit Service |
752078 |
pMsg->saveType != SmSaveBoth)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->saveType;
|
|
Packit Service |
752078 |
errOffset = 8;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->shutdown != 1 && pMsg->shutdown != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->shutdown;
|
|
Packit Service |
752078 |
errOffset = 9;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->interactStyle != SmInteractStyleNone &&
|
|
Packit Service |
752078 |
pMsg->interactStyle != SmInteractStyleErrors &&
|
|
Packit Service |
752078 |
pMsg->interactStyle != SmInteractStyleAny)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->interactStyle;
|
|
Packit Service |
752078 |
errOffset = 10;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->fast != 1 && pMsg->fast != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->fast;
|
|
Packit Service |
752078 |
errOffset = 11;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else if (pMsg->global != 1 && pMsg->global != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
errVal = pMsg->fast;
|
|
Packit Service |
752078 |
errOffset = 11;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (errOffset >= 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadValue (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_SaveYourselfRequest, errOffset, 1, (IcePointer) &errVal);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
(*smsConn->callbacks.save_yourself_request.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.save_yourself_request.manager_data,
|
|
Packit Service |
752078 |
pMsg->saveType, pMsg->shutdown, pMsg->interactStyle,
|
|
Packit Service |
752078 |
pMsg->fast, pMsg->global);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SaveYourselfPhase2Request:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smsConn->save_yourself_in_progress)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_SaveYourselfPhase2Request, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSaveYourselfPhase2RequestMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.save_yourself_phase2_request.callback) (
|
|
Packit Service |
752078 |
smsConn, smsConn->callbacks.
|
|
Packit Service |
752078 |
save_yourself_phase2_request.manager_data);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SaveYourselfDone:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!smsConn->save_yourself_in_progress)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadState (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_SaveYourselfDone, IceCanContinue);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smSaveYourselfDoneMsg *pMsg;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSaveYourselfDoneMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadSimpleMessage (iceConn, smSaveYourselfDoneMsg, pMsg);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (pMsg->success != 1 && pMsg->success != 0)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
unsigned char errVal = pMsg->success;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
_IceErrorBadValue (iceConn, _SmsOpcode,
|
|
Packit Service |
752078 |
SM_SaveYourselfDone, 2, 1, (IcePointer) &errVal);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
else
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smsConn->save_yourself_in_progress = False;
|
|
Packit Service |
752078 |
smsConn->interaction_allowed = SmInteractStyleNone;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.save_yourself_done.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.save_yourself_done.manager_data,
|
|
Packit Service |
752078 |
pMsg->success);
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_CloseConnection:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smCloseConnectionMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData, *pStart, *pEnd;
|
|
Packit Service |
752078 |
int count, i;
|
|
Packit Service |
752078 |
char **reasonMsgs = NULL;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smCloseConnectionMsg) + 8, IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (smCloseConnectionMsg),
|
|
Packit Service |
752078 |
smCloseConnectionMsg, pMsg, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pData = pStart;
|
|
Packit Service |
752078 |
pEnd = pStart + (length << 3) -
|
|
Packit Service |
752078 |
(SIZEOF (smCloseConnectionMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
EXTRACT_CARD32 (pData, swap, count);
|
|
Packit Service |
752078 |
pData += 4;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (count < 0 || count > INT_MAX / sizeof (char *) ||
|
|
Packit Service |
752078 |
(reasonMsgs = malloc (count * sizeof (char *))) == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode, IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
for (i = 0; i < count; i++)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
reasonMsgs[i] = extractArray8(&pData, pEnd, swap, NULL);
|
|
Packit Service |
752078 |
if (reasonMsgs[i] == NULL)
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
if (i != count) {
|
|
Packit Service |
752078 |
while (i-- > 0)
|
|
Packit Service |
752078 |
free (reasonMsgs[i]);
|
|
Packit Service |
752078 |
free (reasonMsgs);
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.close_connection.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.close_connection.manager_data,
|
|
Packit Service |
752078 |
count, reasonMsgs);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_SetProperties:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smSetPropertiesMsg *pMsg;
|
|
Packit Service |
752078 |
char *pStart, *pEnd;
|
|
Packit Service |
752078 |
SmProp **props = NULL;
|
|
Packit Service |
752078 |
int numProps = 0;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smSetPropertiesMsg), IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (smSetPropertiesMsg),
|
|
Packit Service |
752078 |
smSetPropertiesMsg, pMsg, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pEnd = pStart + (length << 3) -
|
|
Packit Service |
752078 |
(SIZEOF (smSetPropertiesMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
props = extractListofProperty(pStart, pEnd, swap, &numProps);
|
|
Packit Service |
752078 |
if (props == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.set_properties.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.set_properties.manager_data, numProps, props);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_DeleteProperties:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
smDeletePropertiesMsg *pMsg;
|
|
Packit Service |
752078 |
char *pData, *pStart, *pEnd;
|
|
Packit Service |
752078 |
int count, i;
|
|
Packit Service |
752078 |
char **propNames = NULL;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_AT_LEAST_SIZE (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smDeletePropertiesMsg) + 8, IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceReadCompleteMessage (iceConn, SIZEOF (smDeletePropertiesMsg),
|
|
Packit Service |
752078 |
smDeletePropertiesMsg, pMsg, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (!IceValidIO (iceConn))
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
pData = pStart;
|
|
Packit Service |
752078 |
pEnd = pStart + (length << 3) -
|
|
Packit Service |
752078 |
(SIZEOF (smDeletePropertiesMsg) - SIZEOF (iceMsg));
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
EXTRACT_CARD32 (pData, swap, count);
|
|
Packit Service |
752078 |
pData += 4;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
if (count < 0 || count > INT_MAX / sizeof (char *) ||
|
|
Packit Service |
752078 |
(propNames = malloc (count * sizeof (char *))) == NULL)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
for (i = 0; i < count; i++)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
propNames[i] = extractArray8(&pData, pEnd, swap, NULL);
|
|
Packit Service |
752078 |
if (propNames[i] == NULL)
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
if (i != count)
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
while (i-- > 0)
|
|
Packit Service |
752078 |
free (propNames[i]);
|
|
Packit Service |
752078 |
free (propNames);
|
|
Packit Service |
752078 |
_IceErrorBadLength (iceConn, _SmcOpcode, opcode,
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
return;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
IceDisposeCompleteMessage (iceConn, pStart);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.delete_properties.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.delete_properties.manager_data,
|
|
Packit Service |
752078 |
count, propNames);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
case SM_GetProperties:
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
CHECK_SIZE_MATCH (iceConn, _SmsOpcode, opcode,
|
|
Packit Service |
752078 |
length, SIZEOF (smGetPropertiesMsg),
|
|
Packit Service |
752078 |
IceFatalToProtocol);
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
(*smsConn->callbacks.get_properties.callback) (smsConn,
|
|
Packit Service |
752078 |
smsConn->callbacks.get_properties.manager_data);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
|
|
Packit Service |
752078 |
default:
|
|
Packit Service |
752078 |
{
|
|
Packit Service |
752078 |
_IceErrorBadMinor (iceConn, _SmsOpcode, opcode, IceCanContinue);
|
|
Packit Service |
752078 |
_IceReadSkip (iceConn, length << 3);
|
|
Packit Service |
752078 |
break;
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|
|
Packit Service |
752078 |
}
|