error.c revision 9ef0b394
1266e564dSmrg/******************************************************************************
2266e564dSmrg
3266e564dSmrg
4266e564dSmrgCopyright 1993, 1998  The Open Group
5266e564dSmrg
6266e564dSmrgPermission to use, copy, modify, distribute, and sell this software and its
7266e564dSmrgdocumentation for any purpose is hereby granted without fee, provided that
8266e564dSmrgthe above copyright notice appear in all copies and that both that
9266e564dSmrgcopyright notice and this permission notice appear in supporting
10266e564dSmrgdocumentation.
11266e564dSmrg
12266e564dSmrgThe above copyright notice and this permission notice shall be included in
13266e564dSmrgall copies or substantial portions of the Software.
14266e564dSmrg
15266e564dSmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16266e564dSmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17266e564dSmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
18266e564dSmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19266e564dSmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20266e564dSmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21266e564dSmrg
22266e564dSmrgExcept as contained in this notice, the name of The Open Group shall not be
23266e564dSmrgused in advertising or otherwise to promote the sale, use or other dealings
24266e564dSmrgin this Software without prior written authorization from The Open Group.
25266e564dSmrg
26266e564dSmrgAuthor: Ralph Mor, X Consortium
27266e564dSmrg******************************************************************************/
28266e564dSmrg
29266e564dSmrg#ifdef HAVE_CONFIG_H
30266e564dSmrg#include <config.h>
31266e564dSmrg#endif
32266e564dSmrg#include <X11/ICE/ICElib.h>
33266e564dSmrg#include "ICElibint.h"
34266e564dSmrg#include <stdio.h>
35266e564dSmrg
36266e564dSmrg#include <errno.h>
37266e564dSmrg
38266e564dSmrg
39266e564dSmrgvoid
40c5629e66Smrg_IceErrorBadMinor (
41c5629e66Smrg	IceConn	iceConn,
42c5629e66Smrg	int	majorOpcode,
43c5629e66Smrg	int	offendingMinor,
44c5629e66Smrg	int	severity
45c5629e66Smrg)
46266e564dSmrg{
47266e564dSmrg    IceErrorHeader (iceConn,
48266e564dSmrg	majorOpcode, offendingMinor,
49266e564dSmrg	iceConn->receive_sequence,
50266e564dSmrg	severity,
51266e564dSmrg	IceBadMinor,
52266e564dSmrg	0);
53266e564dSmrg
54266e564dSmrg    IceFlush (iceConn);
55266e564dSmrg}
56266e564dSmrg
57266e564dSmrg
58266e564dSmrgvoid
59c5629e66Smrg_IceErrorBadState (
60c5629e66Smrg	IceConn	iceConn,
61c5629e66Smrg	int	majorOpcode,
62c5629e66Smrg	int	offendingMinor,
63c5629e66Smrg	int	severity
64c5629e66Smrg)
65266e564dSmrg{
66266e564dSmrg    IceErrorHeader (iceConn,
67266e564dSmrg	majorOpcode, offendingMinor,
68266e564dSmrg	iceConn->receive_sequence,
69266e564dSmrg	severity,
70266e564dSmrg	IceBadState,
71266e564dSmrg	0);
72266e564dSmrg
73266e564dSmrg    IceFlush (iceConn);
74266e564dSmrg}
75266e564dSmrg
76266e564dSmrg
77266e564dSmrgvoid
78c5629e66Smrg_IceErrorBadLength (
79c5629e66Smrg	IceConn	iceConn,
80c5629e66Smrg	int	majorOpcode,
81c5629e66Smrg	int	offendingMinor,
82c5629e66Smrg	int	severity
83c5629e66Smrg)
84266e564dSmrg{
85266e564dSmrg    IceErrorHeader (iceConn,
86266e564dSmrg	majorOpcode, offendingMinor,
87266e564dSmrg	iceConn->receive_sequence,
88266e564dSmrg	severity,
89266e564dSmrg	IceBadLength,
90266e564dSmrg	0);
91266e564dSmrg
92266e564dSmrg    IceFlush (iceConn);
93266e564dSmrg}
94266e564dSmrg
95266e564dSmrg
96266e564dSmrgvoid
97c5629e66Smrg_IceErrorBadValue (
98c5629e66Smrg	IceConn		iceConn,
99c5629e66Smrg	int		majorOpcode,
100c5629e66Smrg	int		offendingMinor,
101c5629e66Smrg	int		offset,
102c5629e66Smrg	int		length,		/* in bytes */
103c5629e66Smrg	IcePointer	value
104c5629e66Smrg)
105266e564dSmrg{
106266e564dSmrg    IceErrorHeader (iceConn,
107266e564dSmrg	majorOpcode, offendingMinor,
108266e564dSmrg	iceConn->receive_sequence,
109266e564dSmrg	IceCanContinue,
110266e564dSmrg	IceBadValue,
111266e564dSmrg	WORD64COUNT (8 + length));
112266e564dSmrg
113266e564dSmrg    IceWriteData32 (iceConn, 4, &offset);
114266e564dSmrg    IceWriteData32 (iceConn, 4, &length);
115266e564dSmrg    IceWriteData (iceConn, length, (char *) value);
116266e564dSmrg
117266e564dSmrg    if (PAD64 (length))
118266e564dSmrg	IceWritePad (iceConn, PAD64 (length));
1199ef0b394Smrg
120266e564dSmrg    IceFlush (iceConn);
121266e564dSmrg}
122266e564dSmrg
123266e564dSmrg
124266e564dSmrgvoid
125c5629e66Smrg_IceErrorNoAuthentication (
126c5629e66Smrg	IceConn	iceConn,
127c5629e66Smrg	int	offendingMinor
128c5629e66Smrg)
129266e564dSmrg{
130266e564dSmrg    int severity = (offendingMinor == ICE_ConnectionSetup) ?
131266e564dSmrg	IceFatalToConnection : IceFatalToProtocol;
132266e564dSmrg
133266e564dSmrg    IceErrorHeader (iceConn,
134266e564dSmrg	0, offendingMinor,
135266e564dSmrg	iceConn->receive_sequence,
136266e564dSmrg	severity,
137266e564dSmrg	IceNoAuth,
138266e564dSmrg	0);
139266e564dSmrg
140266e564dSmrg    IceFlush (iceConn);
141266e564dSmrg}
142266e564dSmrg
143266e564dSmrg
144266e564dSmrgvoid
145c5629e66Smrg_IceErrorNoVersion (
146c5629e66Smrg	IceConn	iceConn,
147c5629e66Smrg	int	offendingMinor
148c5629e66Smrg)
149266e564dSmrg{
150266e564dSmrg    int severity = (offendingMinor == ICE_ConnectionSetup) ?
151266e564dSmrg	IceFatalToConnection : IceFatalToProtocol;
152266e564dSmrg
153266e564dSmrg    IceErrorHeader (iceConn,
154266e564dSmrg	0, offendingMinor,
155266e564dSmrg	iceConn->receive_sequence,
156266e564dSmrg	severity,
157266e564dSmrg	IceNoVersion,
158266e564dSmrg	0);
159266e564dSmrg
160266e564dSmrg    IceFlush (iceConn);
161266e564dSmrg}
162266e564dSmrg
163266e564dSmrg
164266e564dSmrgvoid
165c5629e66Smrg_IceErrorSetupFailed (
166c5629e66Smrg	IceConn	iceConn,
167c5629e66Smrg	int	offendingMinor,
1689ef0b394Smrg	const char	*reason
169c5629e66Smrg)
170266e564dSmrg{
171266e564dSmrg    char *pBuf, *pStart;
172266e564dSmrg    int bytes;
173266e564dSmrg    int severity = (offendingMinor == ICE_ConnectionSetup) ?
174266e564dSmrg	IceFatalToConnection : IceFatalToProtocol;
175266e564dSmrg
176266e564dSmrg    if (!reason)
177266e564dSmrg	reason = "";
178266e564dSmrg    bytes = STRING_BYTES (reason);
179266e564dSmrg
180266e564dSmrg    IceErrorHeader (iceConn,
181266e564dSmrg	0, offendingMinor,
182266e564dSmrg	iceConn->receive_sequence,
183266e564dSmrg	severity,
184266e564dSmrg	IceSetupFailed,
185266e564dSmrg	WORD64COUNT (bytes));
186266e564dSmrg
187266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
188266e564dSmrg    STORE_STRING (pBuf, reason);
189266e564dSmrg
190266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
191266e564dSmrg    IceFlush (iceConn);
192266e564dSmrg}
193266e564dSmrg
194266e564dSmrg
195266e564dSmrgvoid
196c5629e66Smrg_IceErrorAuthenticationRejected (
197c5629e66Smrg	IceConn	iceConn,
198c5629e66Smrg	int	offendingMinor,
1999ef0b394Smrg	const char	*reason
200c5629e66Smrg)
201266e564dSmrg{
202266e564dSmrg    char *pBuf, *pStart;
203266e564dSmrg    int bytes;
204266e564dSmrg
205266e564dSmrg    if (!reason)
206266e564dSmrg	reason = "";
207266e564dSmrg    bytes = STRING_BYTES (reason);
208266e564dSmrg
209266e564dSmrg    IceErrorHeader (iceConn,
210266e564dSmrg	0, offendingMinor,
211266e564dSmrg	iceConn->receive_sequence,
212266e564dSmrg	IceFatalToProtocol,
213266e564dSmrg	IceAuthRejected,
214266e564dSmrg	WORD64COUNT (bytes));
215266e564dSmrg
216266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
217266e564dSmrg    STORE_STRING (pBuf, reason);
218266e564dSmrg
219266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
220266e564dSmrg    IceFlush (iceConn);
221266e564dSmrg}
222266e564dSmrg
223266e564dSmrg
224266e564dSmrgvoid
225c5629e66Smrg_IceErrorAuthenticationFailed (
226c5629e66Smrg	IceConn	iceConn,
227c5629e66Smrg	int	offendingMinor,
2289ef0b394Smrg	const char	*reason
229c5629e66Smrg)
230266e564dSmrg{
231266e564dSmrg    char *pBuf, *pStart;
232266e564dSmrg    int bytes;
233266e564dSmrg
234266e564dSmrg    if (!reason)
235266e564dSmrg	reason = "";
236266e564dSmrg    bytes = STRING_BYTES (reason);
237266e564dSmrg
238266e564dSmrg    IceErrorHeader (iceConn,
239266e564dSmrg	0, offendingMinor,
240266e564dSmrg	iceConn->receive_sequence,
241266e564dSmrg	IceFatalToProtocol,
242266e564dSmrg	IceAuthFailed,
243266e564dSmrg	WORD64COUNT (bytes));
244266e564dSmrg
245266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
246266e564dSmrg    STORE_STRING (pBuf, reason);
247266e564dSmrg
248266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
249266e564dSmrg    IceFlush (iceConn);
250266e564dSmrg}
251266e564dSmrg
252266e564dSmrg
253266e564dSmrgvoid
254c5629e66Smrg_IceErrorProtocolDuplicate (
255c5629e66Smrg	IceConn	iceConn,
2569ef0b394Smrg	const char	*protocolName
257c5629e66Smrg)
258266e564dSmrg{
259266e564dSmrg    char *pBuf, *pStart;
260266e564dSmrg    int bytes;
261266e564dSmrg
262266e564dSmrg    if (!protocolName)
263266e564dSmrg	protocolName = "";
264266e564dSmrg    bytes = STRING_BYTES (protocolName);
265266e564dSmrg
266266e564dSmrg    IceErrorHeader (iceConn,
267266e564dSmrg	0, ICE_ProtocolSetup,
268266e564dSmrg	iceConn->receive_sequence,
269266e564dSmrg	IceFatalToProtocol,
270266e564dSmrg	IceProtocolDuplicate,
271266e564dSmrg	WORD64COUNT (bytes));
272266e564dSmrg
273266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
274266e564dSmrg    STORE_STRING (pBuf, protocolName);
275266e564dSmrg
276266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
277266e564dSmrg    IceFlush (iceConn);
278266e564dSmrg}
279266e564dSmrg
280266e564dSmrg
281266e564dSmrgvoid
282c5629e66Smrg_IceErrorMajorOpcodeDuplicate (
283c5629e66Smrg	IceConn	iceConn,
284c5629e66Smrg	int	majorOpcode
285c5629e66Smrg)
286266e564dSmrg{
2879ef0b394Smrg    char mOp[8] = { (char) majorOpcode };
288266e564dSmrg
289266e564dSmrg    IceErrorHeader (iceConn,
290266e564dSmrg	0, ICE_ProtocolSetup,
291266e564dSmrg	iceConn->receive_sequence,
292266e564dSmrg	IceFatalToProtocol,
293266e564dSmrg	IceMajorOpcodeDuplicate,
294266e564dSmrg	1 /* length */);
295266e564dSmrg
2969ef0b394Smrg    IceWriteData (iceConn, 8, mOp);
297266e564dSmrg    IceFlush (iceConn);
298266e564dSmrg}
299266e564dSmrg
300266e564dSmrg
301266e564dSmrgvoid
302c5629e66Smrg_IceErrorUnknownProtocol (
303c5629e66Smrg	IceConn	iceConn,
3049ef0b394Smrg	const char	*protocolName
305c5629e66Smrg)
306266e564dSmrg{
307266e564dSmrg    char *pBuf, *pStart;
308266e564dSmrg    int bytes;
309266e564dSmrg
310266e564dSmrg    if (!protocolName)
311266e564dSmrg	protocolName = "";
312266e564dSmrg    bytes = STRING_BYTES (protocolName);
313266e564dSmrg
314266e564dSmrg    IceErrorHeader (iceConn,
315266e564dSmrg	0, ICE_ProtocolSetup,
316266e564dSmrg	iceConn->receive_sequence,
317266e564dSmrg	IceFatalToProtocol,
318266e564dSmrg	IceUnknownProtocol,
319266e564dSmrg	WORD64COUNT (bytes));
320266e564dSmrg
321266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
322266e564dSmrg    STORE_STRING (pBuf, protocolName);
323266e564dSmrg
324266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
325266e564dSmrg    IceFlush (iceConn);
326266e564dSmrg}
327266e564dSmrg
328266e564dSmrg
329266e564dSmrgvoid
330c5629e66Smrg_IceErrorBadMajor (
331c5629e66Smrg	IceConn	iceConn,
332c5629e66Smrg	int     offendingMajor,
333c5629e66Smrg	int     offendingMinor,
334c5629e66Smrg	int	severity
335c5629e66Smrg)
336266e564dSmrg{
3379ef0b394Smrg    char maj[8] = { (char) offendingMajor };
338266e564dSmrg
339266e564dSmrg    IceErrorHeader (iceConn,
340266e564dSmrg	0, offendingMinor,
341266e564dSmrg	iceConn->receive_sequence,
342266e564dSmrg	severity,
343266e564dSmrg	IceBadMajor,
344266e564dSmrg	1 /* length */);
345266e564dSmrg
3469ef0b394Smrg    IceWriteData (iceConn, 8, maj);
347266e564dSmrg    IceFlush (iceConn);
348266e564dSmrg}
349266e564dSmrg
350266e564dSmrg
351266e564dSmrg
352266e564dSmrg/*
353266e564dSmrg * Default error handler.
354266e564dSmrg */
355266e564dSmrg
356c5629e66Smrgstatic void
357c5629e66Smrg_IceDefaultErrorHandler (
358c5629e66Smrg	IceConn		iceConn,
359c5629e66Smrg	Bool		swap,
360c5629e66Smrg	int		offendingMinorOpcode,
361c5629e66Smrg	unsigned long	offendingSequence,
362c5629e66Smrg	int 		errorClass,
363c5629e66Smrg	int		severity,
364c5629e66Smrg	IcePointer	values
365c5629e66Smrg)
366266e564dSmrg{
3679ef0b394Smrg    const char *str;
3689ef0b394Smrg    char *estr;
369266e564dSmrg    char *pData = (char *) values;
370266e564dSmrg
371266e564dSmrg    switch (offendingMinorOpcode)
372266e564dSmrg    {
373266e564dSmrg        case ICE_ConnectionSetup:
374266e564dSmrg            str = "ConnectionSetup";
375266e564dSmrg	    break;
376266e564dSmrg        case ICE_AuthRequired:
377266e564dSmrg            str = "AuthRequired";
378266e564dSmrg	    break;
379266e564dSmrg        case ICE_AuthReply:
380266e564dSmrg            str = "AuthReply";
381266e564dSmrg	    break;
382266e564dSmrg        case ICE_AuthNextPhase:
383266e564dSmrg            str = "AuthNextPhase";
384266e564dSmrg	    break;
385266e564dSmrg        case ICE_ConnectionReply:
386266e564dSmrg            str = "ConnectionReply";
387266e564dSmrg	    break;
388266e564dSmrg        case ICE_ProtocolSetup:
389266e564dSmrg            str = "ProtocolSetup";
390266e564dSmrg	    break;
391266e564dSmrg        case ICE_ProtocolReply:
392266e564dSmrg            str = "ProtocolReply";
393266e564dSmrg	    break;
394266e564dSmrg        case ICE_Ping:
395266e564dSmrg            str = "Ping";
396266e564dSmrg	    break;
397266e564dSmrg        case ICE_PingReply:
398266e564dSmrg            str = "PingReply";
399266e564dSmrg	    break;
400266e564dSmrg        case ICE_WantToClose:
401266e564dSmrg            str = "WantToClose";
402266e564dSmrg	    break;
403266e564dSmrg        case ICE_NoClose:
404266e564dSmrg            str = "NoClose";
405266e564dSmrg	    break;
406266e564dSmrg	default:
407266e564dSmrg	    str = "";
408266e564dSmrg	}
409266e564dSmrg
410266e564dSmrg    fprintf (stderr, "\n");
411266e564dSmrg
412266e564dSmrg    fprintf (stderr, "ICE error:  Offending minor opcode    = %d (%s)\n",
413266e564dSmrg	offendingMinorOpcode, str);
414266e564dSmrg
415266e564dSmrg    fprintf (stderr, "            Offending sequence number = %lu\n",
416266e564dSmrg	offendingSequence);
417266e564dSmrg
418266e564dSmrg    switch (errorClass)
419266e564dSmrg    {
420266e564dSmrg        case IceBadMinor:
421266e564dSmrg            str = "BadMinor";
422266e564dSmrg            break;
423266e564dSmrg        case IceBadState:
424266e564dSmrg            str = "BadState";
425266e564dSmrg            break;
426266e564dSmrg        case IceBadLength:
427266e564dSmrg            str = "BadLength";
428266e564dSmrg            break;
429266e564dSmrg        case IceBadValue:
430266e564dSmrg            str = "BadValue";
431266e564dSmrg            break;
432266e564dSmrg        case IceBadMajor:
433266e564dSmrg            str = "BadMajor";
434266e564dSmrg            break;
435266e564dSmrg        case IceNoAuth:
436266e564dSmrg            str = "NoAuthentication";
437266e564dSmrg            break;
438266e564dSmrg        case IceNoVersion:
439266e564dSmrg            str = "NoVersion";
440266e564dSmrg            break;
441266e564dSmrg        case IceSetupFailed:
442266e564dSmrg            str = "SetupFailed";
443266e564dSmrg            break;
444266e564dSmrg        case IceAuthRejected:
445266e564dSmrg            str = "AuthenticationRejected";
446266e564dSmrg            break;
447266e564dSmrg        case IceAuthFailed:
448266e564dSmrg            str = "AuthenticationFailed";
449266e564dSmrg            break;
450266e564dSmrg        case IceProtocolDuplicate:
451266e564dSmrg            str = "ProtocolDuplicate";
452266e564dSmrg            break;
453266e564dSmrg        case IceMajorOpcodeDuplicate:
454266e564dSmrg            str = "MajorOpcodeDuplicate";
455266e564dSmrg            break;
456266e564dSmrg        case IceUnknownProtocol:
457266e564dSmrg            str = "UnknownProtocol";
458266e564dSmrg            break;
459266e564dSmrg	default:
460266e564dSmrg	    str = "???";
461266e564dSmrg    }
462266e564dSmrg
463266e564dSmrg    fprintf (stderr, "            Error class               = %s\n", str);
464266e564dSmrg
465266e564dSmrg    if (severity == IceCanContinue)
466266e564dSmrg	str = "CanContinue";
467266e564dSmrg    else if (severity == IceFatalToProtocol)
468266e564dSmrg	str = "FatalToProtocol";
469266e564dSmrg    else if (severity == IceFatalToConnection)
470266e564dSmrg	str = "FatalToConnection";
471266e564dSmrg    else
472266e564dSmrg	str = "???";
473266e564dSmrg
474266e564dSmrg    fprintf (stderr, "            Severity                  = %s\n", str);
475266e564dSmrg
476266e564dSmrg    switch (errorClass)
477266e564dSmrg    {
478266e564dSmrg        case IceBadValue:
479266e564dSmrg        {
480266e564dSmrg	    int offset, length, val;
481266e564dSmrg
482266e564dSmrg	    EXTRACT_CARD32 (pData, swap, offset);
483266e564dSmrg	    EXTRACT_CARD32 (pData, swap, length);
484266e564dSmrg
485266e564dSmrg	    fprintf (stderr,
486266e564dSmrg		"            BadValue Offset           = %d\n", offset);
487266e564dSmrg	    fprintf (stderr,
488266e564dSmrg		"            BadValue Length           = %d\n", length);
489266e564dSmrg
490266e564dSmrg	    if (length <= 4)
491266e564dSmrg	    {
492266e564dSmrg		if (length == 1)
493266e564dSmrg		    val = (int) *pData;
494266e564dSmrg		else if (length == 2)
495266e564dSmrg		{
496266e564dSmrg		    EXTRACT_CARD16 (pData, swap, val);
497266e564dSmrg		}
498266e564dSmrg		else
499266e564dSmrg		{
500266e564dSmrg		    EXTRACT_CARD32 (pData, swap, val);
501266e564dSmrg		}
502266e564dSmrg
503266e564dSmrg		fprintf (stderr,
504266e564dSmrg	            "            BadValue                  = %d\n", val);
505266e564dSmrg	    }
506266e564dSmrg            break;
507266e564dSmrg	}
508266e564dSmrg
509266e564dSmrg        case IceBadMajor:
510266e564dSmrg
511266e564dSmrg	    fprintf (stderr, "Major opcode : %d\n", (int) *pData);
512266e564dSmrg            break;
513266e564dSmrg
514266e564dSmrg        case IceSetupFailed:
515266e564dSmrg
5169ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5179ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5189ef0b394Smrg            free(estr);
519266e564dSmrg            break;
520266e564dSmrg
521266e564dSmrg        case IceAuthRejected:
522266e564dSmrg
5239ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5249ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5259ef0b394Smrg            free(estr);
526266e564dSmrg            break;
527266e564dSmrg
528266e564dSmrg        case IceAuthFailed:
529266e564dSmrg
5309ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5319ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5329ef0b394Smrg            free(estr);
533266e564dSmrg            break;
534266e564dSmrg
535266e564dSmrg        case IceProtocolDuplicate:
536266e564dSmrg
5379ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5389ef0b394Smrg            fprintf (stderr, "Protocol name : %s\n", estr);
5399ef0b394Smrg            free(estr);
540266e564dSmrg            break;
541266e564dSmrg
542266e564dSmrg        case IceMajorOpcodeDuplicate:
543266e564dSmrg
5449ef0b394Smrg            fprintf (stderr, "Major opcode : %d\n", (int) *pData);
545266e564dSmrg            break;
546266e564dSmrg
547266e564dSmrg        case IceUnknownProtocol:
548266e564dSmrg
5499ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5509ef0b394Smrg            fprintf (stderr, "Protocol name : %s\n", estr);
5519ef0b394Smrg            free(estr);
552266e564dSmrg            break;
553266e564dSmrg
554266e564dSmrg	default:
555266e564dSmrg	    break;
556266e564dSmrg    }
557266e564dSmrg
558266e564dSmrg    fprintf (stderr, "\n");
559266e564dSmrg
560266e564dSmrg    if (severity != IceCanContinue)
561266e564dSmrg	exit (1);
562266e564dSmrg}
563266e564dSmrg
564c5629e66SmrgIceErrorHandler   _IceErrorHandler   = _IceDefaultErrorHandler;
565266e564dSmrg
566266e564dSmrg
5679ef0b394Smrg/*
568266e564dSmrg * This procedure sets the ICE error handler to be the specified
569266e564dSmrg * routine.  If NULL is passed in the default error handler is restored.
570266e564dSmrg * The function's return value is the previous error handler.
571266e564dSmrg */
5729ef0b394Smrg
573266e564dSmrgIceErrorHandler
574c5629e66SmrgIceSetErrorHandler (
575c5629e66Smrg	IceErrorHandler handler
576c5629e66Smrg)
577266e564dSmrg{
578266e564dSmrg    IceErrorHandler oldHandler = _IceErrorHandler;
579266e564dSmrg
580266e564dSmrg    if (handler != NULL)
581266e564dSmrg	_IceErrorHandler = handler;
582266e564dSmrg    else
583266e564dSmrg	_IceErrorHandler = _IceDefaultErrorHandler;
584266e564dSmrg
585266e564dSmrg    return (oldHandler);
586266e564dSmrg}
587266e564dSmrg
588266e564dSmrg
589266e564dSmrg
590266e564dSmrg/*
591266e564dSmrg * Default IO error handler.
592266e564dSmrg */
593266e564dSmrg
594c5629e66Smrgstatic void
595c5629e66Smrg_IceDefaultIOErrorHandler (
596c5629e66Smrg	IceConn		iceConn
597c5629e66Smrg)
598266e564dSmrg{
599266e564dSmrg    fprintf (stderr,
600266e564dSmrg	"ICE default IO error handler doing an exit(), pid = %ld, errno = %d\n",
601266e564dSmrg	(long)getpid(), errno);
602266e564dSmrg
603266e564dSmrg    exit (1);
604266e564dSmrg}
605266e564dSmrg
606c5629e66SmrgIceIOErrorHandler _IceIOErrorHandler = _IceDefaultIOErrorHandler;
607266e564dSmrg
608266e564dSmrg
6099ef0b394Smrg/*
610266e564dSmrg * This procedure sets the ICE fatal I/O error handler to be the
611266e564dSmrg * specified routine.  If NULL is passed in the default error
612266e564dSmrg * handler is restored.   The function's return value is the
613266e564dSmrg * previous error handler.
614266e564dSmrg */
6159ef0b394Smrg
616266e564dSmrgIceIOErrorHandler
617c5629e66SmrgIceSetIOErrorHandler (
618c5629e66Smrg	IceIOErrorHandler handler
619c5629e66Smrg)
620266e564dSmrg{
621266e564dSmrg    IceIOErrorHandler oldHandler = _IceIOErrorHandler;
622266e564dSmrg
623266e564dSmrg    if (handler != NULL)
624266e564dSmrg	_IceIOErrorHandler = handler;
625266e564dSmrg    else
626266e564dSmrg	_IceIOErrorHandler = _IceDefaultIOErrorHandler;
627266e564dSmrg
628266e564dSmrg    return (oldHandler);
629266e564dSmrg}
630