diff options
author | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:36 +0000 |
---|---|---|
committer | Kaleb Keithley <kaleb@freedesktop.org> | 2003-11-14 15:54:36 +0000 |
commit | abe0fd5d586b52a851a423a79b95070da418eb10 (patch) | |
tree | 7755dc0bbc85775e65fc39281e3b89d594767c94 /src/sm_error.c |
R6.6 is the Xorg base-lineXORG-MAINXORG-STABLE
Diffstat (limited to 'src/sm_error.c')
-rw-r--r-- | src/sm_error.c | 337 |
1 files changed, 337 insertions, 0 deletions
diff --git a/src/sm_error.c b/src/sm_error.c new file mode 100644 index 0000000..241d587 --- /dev/null +++ b/src/sm_error.c @@ -0,0 +1,337 @@ +/* $Xorg: sm_error.c,v 1.4 2001/02/09 02:03:30 xorgcvs Exp $ */ + +/* + +Copyright 1993, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + +*/ + +/* + * Author: Ralph Mor, X Consortium + */ + +#include <X11/SM/SMlib.h> +#include "SMlibint.h" +#include <stdio.h> + + + +/* + * Default Smc error handler. + */ + +void +_SmcDefaultErrorHandler (smcConn, swap, + offendingMinorOpcode, offendingSequence, + errorClass, severity, values) + +SmcConn smcConn; +Bool swap; +int offendingMinorOpcode; +unsigned long offendingSequence; +int errorClass; +int severity; +SmPointer values; + +{ + char *pData = (char *) values; + char *str; + + switch (offendingMinorOpcode) + { + case SM_RegisterClient: + str = "RegisterClient"; + break; + case SM_InteractRequest: + str = "InteractRequest"; + break; + case SM_InteractDone: + str = "InteractDone"; + break; + case SM_SaveYourselfDone: + str = "SaveYourselfDone"; + break; + case SM_CloseConnection: + str = "CloseConnection"; + break; + case SM_SetProperties: + str = "SetProperties"; + break; + case SM_GetProperties: + str = "GetProperties"; + break; + default: + str = ""; + } + + fprintf (stderr, "\n"); + + fprintf (stderr, "XSMP error: Offending minor opcode = %d (%s)\n", + offendingMinorOpcode, str); + + fprintf (stderr, " Offending sequence number = %d\n", + offendingSequence); + + switch (errorClass) + { + case IceBadMinor: + str = "BadMinor"; + break; + case IceBadState: + str = "BadState"; + break; + case IceBadLength: + str = "BadLength"; + break; + case IceBadValue: + str = "BadValue"; + break; + default: + str = "???"; + } + + fprintf (stderr, " Error class = %s\n", str); + + if (severity == IceCanContinue) + str = "CanContinue"; + else if (severity == IceFatalToProtocol) + str = "FatalToProtocol"; + else if (severity == IceFatalToConnection) + str = "FatalToConnection"; + else + str = "???"; + + fprintf (stderr, " Severity = %s\n", str); + + switch (errorClass) + { + case IceBadValue: + { + int offset, length, val; + + EXTRACT_CARD32 (pData, swap, offset); + EXTRACT_CARD32 (pData, swap, length); + + fprintf (stderr, + " BadValue Offset = %d\n", offset); + fprintf (stderr, + " BadValue Length = %d\n", length); + + if (length <= 4) + { + if (length == 1) + val = (int) *pData; + else if (length == 2) + { + EXTRACT_CARD16 (pData, swap, val); + } + else + { + EXTRACT_CARD32 (pData, swap, val); + } + + fprintf (stderr, + " BadValue = %d\n", val); + } + break; + } + + default: + break; + } + + fprintf (stderr, "\n"); + + if (severity != IceCanContinue) + exit (1); +} + + + +/* + * Default Sms error handler. + */ + +void +_SmsDefaultErrorHandler (smsConn, swap, + offendingMinorOpcode, offendingSequence, + errorClass, severity, values) + +SmsConn smsConn; +Bool swap; +int offendingMinorOpcode; +unsigned long offendingSequence; +int errorClass; +int severity; +SmPointer values; + +{ + char *pData = (char *) values; + char *str; + + switch (offendingMinorOpcode) + { + case SM_SaveYourself: + str = "SaveYourself"; + break; + case SM_Interact: + str = "Interact"; + break; + case SM_Die: + str = "Die"; + break; + case SM_ShutdownCancelled: + str = "ShutdownCancelled"; + break; + default: + str = ""; + } + + fprintf (stderr, "\n"); + + fprintf (stderr, "XSMP error: Offending minor opcode = %d (%s)\n", + offendingMinorOpcode, str); + + fprintf (stderr, " Offending sequence number = %d\n", + offendingSequence); + + switch (errorClass) + { + case IceBadMinor: + str = "BadMinor"; + break; + case IceBadState: + str = "BadState"; + break; + case IceBadLength: + str = "BadLength"; + break; + case IceBadValue: + str = "BadValue"; + break; + default: + str = "???"; + } + + fprintf (stderr, " Error class = %s\n", str); + + if (severity == IceCanContinue) + str = "CanContinue"; + else if (severity == IceFatalToProtocol) + str = "FatalToProtocol"; + else if (severity == IceFatalToConnection) + str = "FatalToConnection"; + else + str = "???"; + + fprintf (stderr, " Severity = %s\n", str); + + switch (errorClass) + { + case IceBadValue: + { + int offset, length, val; + + EXTRACT_CARD32 (pData, swap, offset); + EXTRACT_CARD32 (pData, swap, length); + + fprintf (stderr, + " BadValue Offset = %d\n", offset); + fprintf (stderr, + " BadValue Length = %d\n", length); + + if (length <= 4) + { + if (length == 1) + val = (int) *pData; + else if (length == 2) + { + EXTRACT_CARD16 (pData, swap, val); + } + else + { + EXTRACT_CARD32 (pData, swap, val); + } + + fprintf (stderr, + " BadValue = %d\n", val); + } + break; + } + + default: + break; + } + + fprintf (stderr, "\n\n"); + + /* don't exit() - that would kill the SM - pretty devastating */ +} + + + +/* + * This procedure sets the Smc error handler to be the specified + * routine. If NULL is passed in the default error handler is restored. + * The function's return value is the previous error handler. + */ + +SmcErrorHandler +SmcSetErrorHandler (handler) + +SmcErrorHandler handler; + +{ + SmcErrorHandler oldHandler = _SmcErrorHandler; + + if (handler != NULL) + _SmcErrorHandler = handler; + else + _SmcErrorHandler = _SmcDefaultErrorHandler; + + return (oldHandler); +} + + + +/* + * This procedure sets the Sms error handler to be the specified + * routine. If NULL is passed in the default error handler is restored. + * The function's return value is the previous error handler. + */ + +SmsErrorHandler +SmsSetErrorHandler (handler) + +SmsErrorHandler handler; + +{ + SmsErrorHandler oldHandler = _SmsErrorHandler; + + if (handler != NULL) + _SmsErrorHandler = handler; + else + _SmsErrorHandler = _SmsDefaultErrorHandler; + + return (oldHandler); +} |