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