sm_error.c revision 126a8a12
1126a8a12Smrg/* $Xorg: sm_error.c,v 1.4 2001/02/09 02:03:30 xorgcvs Exp $ */ 2126a8a12Smrg 3126a8a12Smrg/* 4126a8a12Smrg 5126a8a12SmrgCopyright 1993, 1998 The Open Group 6126a8a12Smrg 7126a8a12SmrgPermission to use, copy, modify, distribute, and sell this software and its 8126a8a12Smrgdocumentation for any purpose is hereby granted without fee, provided that 9126a8a12Smrgthe above copyright notice appear in all copies and that both that 10126a8a12Smrgcopyright notice and this permission notice appear in supporting 11126a8a12Smrgdocumentation. 12126a8a12Smrg 13126a8a12SmrgThe above copyright notice and this permission notice shall be included in 14126a8a12Smrgall copies or substantial portions of the Software. 15126a8a12Smrg 16126a8a12SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17126a8a12SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18126a8a12SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19126a8a12SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 20126a8a12SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 21126a8a12SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 22126a8a12Smrg 23126a8a12SmrgExcept as contained in this notice, the name of The Open Group shall not be 24126a8a12Smrgused in advertising or otherwise to promote the sale, use or other dealings 25126a8a12Smrgin this Software without prior written authorization from The Open Group. 26126a8a12Smrg 27126a8a12Smrg*/ 28126a8a12Smrg/* $XFree86: xc/lib/SM/sm_error.c,v 1.2 2001/10/28 03:32:29 tsi Exp $ */ 29126a8a12Smrg 30126a8a12Smrg/* 31126a8a12Smrg * Author: Ralph Mor, X Consortium 32126a8a12Smrg */ 33126a8a12Smrg 34126a8a12Smrg#ifdef HAVE_CONFIG_H 35126a8a12Smrg#include <config.h> 36126a8a12Smrg#endif 37126a8a12Smrg#include <X11/SM/SMlib.h> 38126a8a12Smrg#include "SMlibint.h" 39126a8a12Smrg#include <stdio.h> 40126a8a12Smrg 41126a8a12Smrg 42126a8a12Smrg 43126a8a12Smrg/* 44126a8a12Smrg * Default Smc error handler. 45126a8a12Smrg */ 46126a8a12Smrg 47126a8a12Smrgvoid 48126a8a12Smrg_SmcDefaultErrorHandler (smcConn, swap, 49126a8a12Smrg offendingMinorOpcode, offendingSequence, 50126a8a12Smrg errorClass, severity, values) 51126a8a12Smrg 52126a8a12SmrgSmcConn smcConn; 53126a8a12SmrgBool swap; 54126a8a12Smrgint offendingMinorOpcode; 55126a8a12Smrgunsigned long offendingSequence; 56126a8a12Smrgint errorClass; 57126a8a12Smrgint severity; 58126a8a12SmrgSmPointer values; 59126a8a12Smrg 60126a8a12Smrg{ 61126a8a12Smrg char *pData = (char *) values; 62126a8a12Smrg const char *str; 63126a8a12Smrg 64126a8a12Smrg switch (offendingMinorOpcode) 65126a8a12Smrg { 66126a8a12Smrg case SM_RegisterClient: 67126a8a12Smrg str = "RegisterClient"; 68126a8a12Smrg break; 69126a8a12Smrg case SM_InteractRequest: 70126a8a12Smrg str = "InteractRequest"; 71126a8a12Smrg break; 72126a8a12Smrg case SM_InteractDone: 73126a8a12Smrg str = "InteractDone"; 74126a8a12Smrg break; 75126a8a12Smrg case SM_SaveYourselfDone: 76126a8a12Smrg str = "SaveYourselfDone"; 77126a8a12Smrg break; 78126a8a12Smrg case SM_CloseConnection: 79126a8a12Smrg str = "CloseConnection"; 80126a8a12Smrg break; 81126a8a12Smrg case SM_SetProperties: 82126a8a12Smrg str = "SetProperties"; 83126a8a12Smrg break; 84126a8a12Smrg case SM_GetProperties: 85126a8a12Smrg str = "GetProperties"; 86126a8a12Smrg break; 87126a8a12Smrg default: 88126a8a12Smrg str = ""; 89126a8a12Smrg } 90126a8a12Smrg 91126a8a12Smrg fprintf (stderr, "\n"); 92126a8a12Smrg 93126a8a12Smrg fprintf (stderr, "XSMP error: Offending minor opcode = %d (%s)\n", 94126a8a12Smrg offendingMinorOpcode, str); 95126a8a12Smrg 96126a8a12Smrg fprintf (stderr, " Offending sequence number = %ld\n", 97126a8a12Smrg offendingSequence); 98126a8a12Smrg 99126a8a12Smrg switch (errorClass) 100126a8a12Smrg { 101126a8a12Smrg case IceBadMinor: 102126a8a12Smrg str = "BadMinor"; 103126a8a12Smrg break; 104126a8a12Smrg case IceBadState: 105126a8a12Smrg str = "BadState"; 106126a8a12Smrg break; 107126a8a12Smrg case IceBadLength: 108126a8a12Smrg str = "BadLength"; 109126a8a12Smrg break; 110126a8a12Smrg case IceBadValue: 111126a8a12Smrg str = "BadValue"; 112126a8a12Smrg break; 113126a8a12Smrg default: 114126a8a12Smrg str = "???"; 115126a8a12Smrg } 116126a8a12Smrg 117126a8a12Smrg fprintf (stderr, " Error class = %s\n", str); 118126a8a12Smrg 119126a8a12Smrg if (severity == IceCanContinue) 120126a8a12Smrg str = "CanContinue"; 121126a8a12Smrg else if (severity == IceFatalToProtocol) 122126a8a12Smrg str = "FatalToProtocol"; 123126a8a12Smrg else if (severity == IceFatalToConnection) 124126a8a12Smrg str = "FatalToConnection"; 125126a8a12Smrg else 126126a8a12Smrg str = "???"; 127126a8a12Smrg 128126a8a12Smrg fprintf (stderr, " Severity = %s\n", str); 129126a8a12Smrg 130126a8a12Smrg switch (errorClass) 131126a8a12Smrg { 132126a8a12Smrg case IceBadValue: 133126a8a12Smrg { 134126a8a12Smrg int offset, length, val; 135126a8a12Smrg 136126a8a12Smrg EXTRACT_CARD32 (pData, swap, offset); 137126a8a12Smrg EXTRACT_CARD32 (pData, swap, length); 138126a8a12Smrg 139126a8a12Smrg fprintf (stderr, 140126a8a12Smrg " BadValue Offset = %d\n", offset); 141126a8a12Smrg fprintf (stderr, 142126a8a12Smrg " BadValue Length = %d\n", length); 143126a8a12Smrg 144126a8a12Smrg if (length <= 4) 145126a8a12Smrg { 146126a8a12Smrg if (length == 1) 147126a8a12Smrg val = (int) *pData; 148126a8a12Smrg else if (length == 2) 149126a8a12Smrg { 150126a8a12Smrg EXTRACT_CARD16 (pData, swap, val); 151126a8a12Smrg } 152126a8a12Smrg else 153126a8a12Smrg { 154126a8a12Smrg EXTRACT_CARD32 (pData, swap, val); 155126a8a12Smrg } 156126a8a12Smrg 157126a8a12Smrg fprintf (stderr, 158126a8a12Smrg " BadValue = %d\n", val); 159126a8a12Smrg } 160126a8a12Smrg break; 161126a8a12Smrg } 162126a8a12Smrg 163126a8a12Smrg default: 164126a8a12Smrg break; 165126a8a12Smrg } 166126a8a12Smrg 167126a8a12Smrg fprintf (stderr, "\n"); 168126a8a12Smrg 169126a8a12Smrg if (severity != IceCanContinue) 170126a8a12Smrg exit (1); 171126a8a12Smrg} 172126a8a12Smrg 173126a8a12Smrg 174126a8a12Smrg 175126a8a12Smrg/* 176126a8a12Smrg * Default Sms error handler. 177126a8a12Smrg */ 178126a8a12Smrg 179126a8a12Smrgvoid 180126a8a12Smrg_SmsDefaultErrorHandler (smsConn, swap, 181126a8a12Smrg offendingMinorOpcode, offendingSequence, 182126a8a12Smrg errorClass, severity, values) 183126a8a12Smrg 184126a8a12SmrgSmsConn smsConn; 185126a8a12SmrgBool swap; 186126a8a12Smrgint offendingMinorOpcode; 187126a8a12Smrgunsigned long offendingSequence; 188126a8a12Smrgint errorClass; 189126a8a12Smrgint severity; 190126a8a12SmrgSmPointer values; 191126a8a12Smrg 192126a8a12Smrg{ 193126a8a12Smrg char *pData = (char *) values; 194126a8a12Smrg const char *str; 195126a8a12Smrg 196126a8a12Smrg switch (offendingMinorOpcode) 197126a8a12Smrg { 198126a8a12Smrg case SM_SaveYourself: 199126a8a12Smrg str = "SaveYourself"; 200126a8a12Smrg break; 201126a8a12Smrg case SM_Interact: 202126a8a12Smrg str = "Interact"; 203126a8a12Smrg break; 204126a8a12Smrg case SM_Die: 205126a8a12Smrg str = "Die"; 206126a8a12Smrg break; 207126a8a12Smrg case SM_ShutdownCancelled: 208126a8a12Smrg str = "ShutdownCancelled"; 209126a8a12Smrg break; 210126a8a12Smrg default: 211126a8a12Smrg str = ""; 212126a8a12Smrg } 213126a8a12Smrg 214126a8a12Smrg fprintf (stderr, "\n"); 215126a8a12Smrg 216126a8a12Smrg fprintf (stderr, "XSMP error: Offending minor opcode = %d (%s)\n", 217126a8a12Smrg offendingMinorOpcode, str); 218126a8a12Smrg 219126a8a12Smrg fprintf (stderr, " Offending sequence number = %ld\n", 220126a8a12Smrg offendingSequence); 221126a8a12Smrg 222126a8a12Smrg switch (errorClass) 223126a8a12Smrg { 224126a8a12Smrg case IceBadMinor: 225126a8a12Smrg str = "BadMinor"; 226126a8a12Smrg break; 227126a8a12Smrg case IceBadState: 228126a8a12Smrg str = "BadState"; 229126a8a12Smrg break; 230126a8a12Smrg case IceBadLength: 231126a8a12Smrg str = "BadLength"; 232126a8a12Smrg break; 233126a8a12Smrg case IceBadValue: 234126a8a12Smrg str = "BadValue"; 235126a8a12Smrg break; 236126a8a12Smrg default: 237126a8a12Smrg str = "???"; 238126a8a12Smrg } 239126a8a12Smrg 240126a8a12Smrg fprintf (stderr, " Error class = %s\n", str); 241126a8a12Smrg 242126a8a12Smrg if (severity == IceCanContinue) 243126a8a12Smrg str = "CanContinue"; 244126a8a12Smrg else if (severity == IceFatalToProtocol) 245126a8a12Smrg str = "FatalToProtocol"; 246126a8a12Smrg else if (severity == IceFatalToConnection) 247126a8a12Smrg str = "FatalToConnection"; 248126a8a12Smrg else 249126a8a12Smrg str = "???"; 250126a8a12Smrg 251126a8a12Smrg fprintf (stderr, " Severity = %s\n", str); 252126a8a12Smrg 253126a8a12Smrg switch (errorClass) 254126a8a12Smrg { 255126a8a12Smrg case IceBadValue: 256126a8a12Smrg { 257126a8a12Smrg int offset, length, val; 258126a8a12Smrg 259126a8a12Smrg EXTRACT_CARD32 (pData, swap, offset); 260126a8a12Smrg EXTRACT_CARD32 (pData, swap, length); 261126a8a12Smrg 262126a8a12Smrg fprintf (stderr, 263126a8a12Smrg " BadValue Offset = %d\n", offset); 264126a8a12Smrg fprintf (stderr, 265126a8a12Smrg " BadValue Length = %d\n", length); 266126a8a12Smrg 267126a8a12Smrg if (length <= 4) 268126a8a12Smrg { 269126a8a12Smrg if (length == 1) 270126a8a12Smrg val = (int) *pData; 271126a8a12Smrg else if (length == 2) 272126a8a12Smrg { 273126a8a12Smrg EXTRACT_CARD16 (pData, swap, val); 274126a8a12Smrg } 275126a8a12Smrg else 276126a8a12Smrg { 277126a8a12Smrg EXTRACT_CARD32 (pData, swap, val); 278126a8a12Smrg } 279126a8a12Smrg 280126a8a12Smrg fprintf (stderr, 281126a8a12Smrg " BadValue = %d\n", val); 282126a8a12Smrg } 283126a8a12Smrg break; 284126a8a12Smrg } 285126a8a12Smrg 286126a8a12Smrg default: 287126a8a12Smrg break; 288126a8a12Smrg } 289126a8a12Smrg 290126a8a12Smrg fprintf (stderr, "\n\n"); 291126a8a12Smrg 292126a8a12Smrg /* don't exit() - that would kill the SM - pretty devastating */ 293126a8a12Smrg} 294126a8a12Smrg 295126a8a12Smrg 296126a8a12Smrg 297126a8a12Smrg/* 298126a8a12Smrg * This procedure sets the Smc error handler to be the specified 299126a8a12Smrg * routine. If NULL is passed in the default error handler is restored. 300126a8a12Smrg * The function's return value is the previous error handler. 301126a8a12Smrg */ 302126a8a12Smrg 303126a8a12SmrgSmcErrorHandler 304126a8a12SmrgSmcSetErrorHandler (handler) 305126a8a12Smrg 306126a8a12SmrgSmcErrorHandler handler; 307126a8a12Smrg 308126a8a12Smrg{ 309126a8a12Smrg SmcErrorHandler oldHandler = _SmcErrorHandler; 310126a8a12Smrg 311126a8a12Smrg if (handler != NULL) 312126a8a12Smrg _SmcErrorHandler = handler; 313126a8a12Smrg else 314126a8a12Smrg _SmcErrorHandler = _SmcDefaultErrorHandler; 315126a8a12Smrg 316126a8a12Smrg return (oldHandler); 317126a8a12Smrg} 318126a8a12Smrg 319126a8a12Smrg 320126a8a12Smrg 321126a8a12Smrg/* 322126a8a12Smrg * This procedure sets the Sms error handler to be the specified 323126a8a12Smrg * routine. If NULL is passed in the default error handler is restored. 324126a8a12Smrg * The function's return value is the previous error handler. 325126a8a12Smrg */ 326126a8a12Smrg 327126a8a12SmrgSmsErrorHandler 328126a8a12SmrgSmsSetErrorHandler (handler) 329126a8a12Smrg 330126a8a12SmrgSmsErrorHandler handler; 331126a8a12Smrg 332126a8a12Smrg{ 333126a8a12Smrg SmsErrorHandler oldHandler = _SmsErrorHandler; 334126a8a12Smrg 335126a8a12Smrg if (handler != NULL) 336126a8a12Smrg _SmsErrorHandler = handler; 337126a8a12Smrg else 338126a8a12Smrg _SmsErrorHandler = _SmsDefaultErrorHandler; 339126a8a12Smrg 340126a8a12Smrg return (oldHandler); 341126a8a12Smrg} 342