error.c revision a3129944
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>
35a3129944Smrg#include <unistd.h>
36266e564dSmrg#include <errno.h>
37266e564dSmrg
38266e564dSmrgvoid
39c5629e66Smrg_IceErrorBadMinor (
40c5629e66Smrg	IceConn	iceConn,
41c5629e66Smrg	int	majorOpcode,
42c5629e66Smrg	int	offendingMinor,
43c5629e66Smrg	int	severity
44c5629e66Smrg)
45266e564dSmrg{
46266e564dSmrg    IceErrorHeader (iceConn,
47266e564dSmrg	majorOpcode, offendingMinor,
48266e564dSmrg	iceConn->receive_sequence,
49266e564dSmrg	severity,
50266e564dSmrg	IceBadMinor,
51266e564dSmrg	0);
52266e564dSmrg
53266e564dSmrg    IceFlush (iceConn);
54266e564dSmrg}
55266e564dSmrg
56266e564dSmrg
57266e564dSmrgvoid
58c5629e66Smrg_IceErrorBadState (
59c5629e66Smrg	IceConn	iceConn,
60c5629e66Smrg	int	majorOpcode,
61c5629e66Smrg	int	offendingMinor,
62c5629e66Smrg	int	severity
63c5629e66Smrg)
64266e564dSmrg{
65266e564dSmrg    IceErrorHeader (iceConn,
66266e564dSmrg	majorOpcode, offendingMinor,
67266e564dSmrg	iceConn->receive_sequence,
68266e564dSmrg	severity,
69266e564dSmrg	IceBadState,
70266e564dSmrg	0);
71266e564dSmrg
72266e564dSmrg    IceFlush (iceConn);
73266e564dSmrg}
74266e564dSmrg
75266e564dSmrg
76266e564dSmrgvoid
77c5629e66Smrg_IceErrorBadLength (
78c5629e66Smrg	IceConn	iceConn,
79c5629e66Smrg	int	majorOpcode,
80c5629e66Smrg	int	offendingMinor,
81c5629e66Smrg	int	severity
82c5629e66Smrg)
83266e564dSmrg{
84266e564dSmrg    IceErrorHeader (iceConn,
85266e564dSmrg	majorOpcode, offendingMinor,
86266e564dSmrg	iceConn->receive_sequence,
87266e564dSmrg	severity,
88266e564dSmrg	IceBadLength,
89266e564dSmrg	0);
90266e564dSmrg
91266e564dSmrg    IceFlush (iceConn);
92266e564dSmrg}
93266e564dSmrg
94266e564dSmrg
95266e564dSmrgvoid
96c5629e66Smrg_IceErrorBadValue (
97c5629e66Smrg	IceConn		iceConn,
98c5629e66Smrg	int		majorOpcode,
99c5629e66Smrg	int		offendingMinor,
100c5629e66Smrg	int		offset,
101c5629e66Smrg	int		length,		/* in bytes */
102c5629e66Smrg	IcePointer	value
103c5629e66Smrg)
104266e564dSmrg{
105266e564dSmrg    IceErrorHeader (iceConn,
106266e564dSmrg	majorOpcode, offendingMinor,
107266e564dSmrg	iceConn->receive_sequence,
108266e564dSmrg	IceCanContinue,
109266e564dSmrg	IceBadValue,
110266e564dSmrg	WORD64COUNT (8 + length));
111266e564dSmrg
112266e564dSmrg    IceWriteData32 (iceConn, 4, &offset);
113266e564dSmrg    IceWriteData32 (iceConn, 4, &length);
114266e564dSmrg    IceWriteData (iceConn, length, (char *) value);
115266e564dSmrg
116266e564dSmrg    if (PAD64 (length))
117266e564dSmrg	IceWritePad (iceConn, PAD64 (length));
1189ef0b394Smrg
119266e564dSmrg    IceFlush (iceConn);
120266e564dSmrg}
121266e564dSmrg
122266e564dSmrg
123266e564dSmrgvoid
124c5629e66Smrg_IceErrorNoAuthentication (
125c5629e66Smrg	IceConn	iceConn,
126c5629e66Smrg	int	offendingMinor
127c5629e66Smrg)
128266e564dSmrg{
129266e564dSmrg    int severity = (offendingMinor == ICE_ConnectionSetup) ?
130266e564dSmrg	IceFatalToConnection : IceFatalToProtocol;
131266e564dSmrg
132266e564dSmrg    IceErrorHeader (iceConn,
133266e564dSmrg	0, offendingMinor,
134266e564dSmrg	iceConn->receive_sequence,
135266e564dSmrg	severity,
136266e564dSmrg	IceNoAuth,
137266e564dSmrg	0);
138266e564dSmrg
139266e564dSmrg    IceFlush (iceConn);
140266e564dSmrg}
141266e564dSmrg
142266e564dSmrg
143266e564dSmrgvoid
144c5629e66Smrg_IceErrorNoVersion (
145c5629e66Smrg	IceConn	iceConn,
146c5629e66Smrg	int	offendingMinor
147c5629e66Smrg)
148266e564dSmrg{
149266e564dSmrg    int severity = (offendingMinor == ICE_ConnectionSetup) ?
150266e564dSmrg	IceFatalToConnection : IceFatalToProtocol;
151266e564dSmrg
152266e564dSmrg    IceErrorHeader (iceConn,
153266e564dSmrg	0, offendingMinor,
154266e564dSmrg	iceConn->receive_sequence,
155266e564dSmrg	severity,
156266e564dSmrg	IceNoVersion,
157266e564dSmrg	0);
158266e564dSmrg
159266e564dSmrg    IceFlush (iceConn);
160266e564dSmrg}
161266e564dSmrg
162266e564dSmrg
163266e564dSmrgvoid
164c5629e66Smrg_IceErrorSetupFailed (
165c5629e66Smrg	IceConn	iceConn,
166c5629e66Smrg	int	offendingMinor,
1679ef0b394Smrg	const char	*reason
168c5629e66Smrg)
169266e564dSmrg{
170266e564dSmrg    char *pBuf, *pStart;
171266e564dSmrg    int bytes;
172266e564dSmrg    int severity = (offendingMinor == ICE_ConnectionSetup) ?
173266e564dSmrg	IceFatalToConnection : IceFatalToProtocol;
174266e564dSmrg
175266e564dSmrg    if (!reason)
176266e564dSmrg	reason = "";
177266e564dSmrg    bytes = STRING_BYTES (reason);
178266e564dSmrg
179266e564dSmrg    IceErrorHeader (iceConn,
180266e564dSmrg	0, offendingMinor,
181266e564dSmrg	iceConn->receive_sequence,
182266e564dSmrg	severity,
183266e564dSmrg	IceSetupFailed,
184266e564dSmrg	WORD64COUNT (bytes));
185266e564dSmrg
186266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
187266e564dSmrg    STORE_STRING (pBuf, reason);
188266e564dSmrg
189266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
190266e564dSmrg    IceFlush (iceConn);
191266e564dSmrg}
192266e564dSmrg
193266e564dSmrg
194266e564dSmrgvoid
195c5629e66Smrg_IceErrorAuthenticationRejected (
196c5629e66Smrg	IceConn	iceConn,
197c5629e66Smrg	int	offendingMinor,
1989ef0b394Smrg	const char	*reason
199c5629e66Smrg)
200266e564dSmrg{
201266e564dSmrg    char *pBuf, *pStart;
202266e564dSmrg    int bytes;
203266e564dSmrg
204266e564dSmrg    if (!reason)
205266e564dSmrg	reason = "";
206266e564dSmrg    bytes = STRING_BYTES (reason);
207266e564dSmrg
208266e564dSmrg    IceErrorHeader (iceConn,
209266e564dSmrg	0, offendingMinor,
210266e564dSmrg	iceConn->receive_sequence,
211266e564dSmrg	IceFatalToProtocol,
212266e564dSmrg	IceAuthRejected,
213266e564dSmrg	WORD64COUNT (bytes));
214266e564dSmrg
215266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
216266e564dSmrg    STORE_STRING (pBuf, reason);
217266e564dSmrg
218266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
219266e564dSmrg    IceFlush (iceConn);
220266e564dSmrg}
221266e564dSmrg
222266e564dSmrg
223266e564dSmrgvoid
224c5629e66Smrg_IceErrorAuthenticationFailed (
225c5629e66Smrg	IceConn	iceConn,
226c5629e66Smrg	int	offendingMinor,
2279ef0b394Smrg	const char	*reason
228c5629e66Smrg)
229266e564dSmrg{
230266e564dSmrg    char *pBuf, *pStart;
231266e564dSmrg    int bytes;
232266e564dSmrg
233266e564dSmrg    if (!reason)
234266e564dSmrg	reason = "";
235266e564dSmrg    bytes = STRING_BYTES (reason);
236266e564dSmrg
237266e564dSmrg    IceErrorHeader (iceConn,
238266e564dSmrg	0, offendingMinor,
239266e564dSmrg	iceConn->receive_sequence,
240266e564dSmrg	IceFatalToProtocol,
241266e564dSmrg	IceAuthFailed,
242266e564dSmrg	WORD64COUNT (bytes));
243266e564dSmrg
244266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
245266e564dSmrg    STORE_STRING (pBuf, reason);
246266e564dSmrg
247266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
248266e564dSmrg    IceFlush (iceConn);
249266e564dSmrg}
250266e564dSmrg
251266e564dSmrg
252266e564dSmrgvoid
253c5629e66Smrg_IceErrorProtocolDuplicate (
254c5629e66Smrg	IceConn	iceConn,
2559ef0b394Smrg	const char	*protocolName
256c5629e66Smrg)
257266e564dSmrg{
258266e564dSmrg    char *pBuf, *pStart;
259266e564dSmrg    int bytes;
260266e564dSmrg
261266e564dSmrg    if (!protocolName)
262266e564dSmrg	protocolName = "";
263266e564dSmrg    bytes = STRING_BYTES (protocolName);
264266e564dSmrg
265266e564dSmrg    IceErrorHeader (iceConn,
266266e564dSmrg	0, ICE_ProtocolSetup,
267266e564dSmrg	iceConn->receive_sequence,
268266e564dSmrg	IceFatalToProtocol,
269266e564dSmrg	IceProtocolDuplicate,
270266e564dSmrg	WORD64COUNT (bytes));
271266e564dSmrg
272266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
273266e564dSmrg    STORE_STRING (pBuf, protocolName);
274266e564dSmrg
275266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
276266e564dSmrg    IceFlush (iceConn);
277266e564dSmrg}
278266e564dSmrg
279266e564dSmrg
280266e564dSmrgvoid
281c5629e66Smrg_IceErrorMajorOpcodeDuplicate (
282c5629e66Smrg	IceConn	iceConn,
283c5629e66Smrg	int	majorOpcode
284c5629e66Smrg)
285266e564dSmrg{
2869ef0b394Smrg    char mOp[8] = { (char) majorOpcode };
287266e564dSmrg
288266e564dSmrg    IceErrorHeader (iceConn,
289266e564dSmrg	0, ICE_ProtocolSetup,
290266e564dSmrg	iceConn->receive_sequence,
291266e564dSmrg	IceFatalToProtocol,
292266e564dSmrg	IceMajorOpcodeDuplicate,
293266e564dSmrg	1 /* length */);
294266e564dSmrg
2959ef0b394Smrg    IceWriteData (iceConn, 8, mOp);
296266e564dSmrg    IceFlush (iceConn);
297266e564dSmrg}
298266e564dSmrg
299266e564dSmrg
300266e564dSmrgvoid
301c5629e66Smrg_IceErrorUnknownProtocol (
302c5629e66Smrg	IceConn	iceConn,
3039ef0b394Smrg	const char	*protocolName
304c5629e66Smrg)
305266e564dSmrg{
306266e564dSmrg    char *pBuf, *pStart;
307266e564dSmrg    int bytes;
308266e564dSmrg
309266e564dSmrg    if (!protocolName)
310266e564dSmrg	protocolName = "";
311266e564dSmrg    bytes = STRING_BYTES (protocolName);
312266e564dSmrg
313266e564dSmrg    IceErrorHeader (iceConn,
314266e564dSmrg	0, ICE_ProtocolSetup,
315266e564dSmrg	iceConn->receive_sequence,
316266e564dSmrg	IceFatalToProtocol,
317266e564dSmrg	IceUnknownProtocol,
318266e564dSmrg	WORD64COUNT (bytes));
319266e564dSmrg
320266e564dSmrg    pBuf = pStart = IceAllocScratch (iceConn, PADDED_BYTES64 (bytes));
321266e564dSmrg    STORE_STRING (pBuf, protocolName);
322266e564dSmrg
323266e564dSmrg    IceWriteData (iceConn, PADDED_BYTES64 (bytes), pStart);
324266e564dSmrg    IceFlush (iceConn);
325266e564dSmrg}
326266e564dSmrg
327266e564dSmrg
328266e564dSmrgvoid
329c5629e66Smrg_IceErrorBadMajor (
330c5629e66Smrg	IceConn	iceConn,
331c5629e66Smrg	int     offendingMajor,
332c5629e66Smrg	int     offendingMinor,
333c5629e66Smrg	int	severity
334c5629e66Smrg)
335266e564dSmrg{
3369ef0b394Smrg    char maj[8] = { (char) offendingMajor };
337266e564dSmrg
338266e564dSmrg    IceErrorHeader (iceConn,
339266e564dSmrg	0, offendingMinor,
340266e564dSmrg	iceConn->receive_sequence,
341266e564dSmrg	severity,
342266e564dSmrg	IceBadMajor,
343266e564dSmrg	1 /* length */);
344266e564dSmrg
3459ef0b394Smrg    IceWriteData (iceConn, 8, maj);
346266e564dSmrg    IceFlush (iceConn);
347266e564dSmrg}
348266e564dSmrg
349266e564dSmrg
350a3129944Smrg
351266e564dSmrg/*
352266e564dSmrg * Default error handler.
353266e564dSmrg */
354266e564dSmrg
355c5629e66Smrgstatic void
356c5629e66Smrg_IceDefaultErrorHandler (
357c5629e66Smrg	IceConn		iceConn,
358c5629e66Smrg	Bool		swap,
359c5629e66Smrg	int		offendingMinorOpcode,
360c5629e66Smrg	unsigned long	offendingSequence,
361c5629e66Smrg	int 		errorClass,
362c5629e66Smrg	int		severity,
363c5629e66Smrg	IcePointer	values
364c5629e66Smrg)
365266e564dSmrg{
3669ef0b394Smrg    const char *str;
3679ef0b394Smrg    char *estr;
368266e564dSmrg    char *pData = (char *) values;
369266e564dSmrg
370266e564dSmrg    switch (offendingMinorOpcode)
371266e564dSmrg    {
372266e564dSmrg        case ICE_ConnectionSetup:
373266e564dSmrg            str = "ConnectionSetup";
374266e564dSmrg	    break;
375266e564dSmrg        case ICE_AuthRequired:
376266e564dSmrg            str = "AuthRequired";
377266e564dSmrg	    break;
378266e564dSmrg        case ICE_AuthReply:
379266e564dSmrg            str = "AuthReply";
380266e564dSmrg	    break;
381266e564dSmrg        case ICE_AuthNextPhase:
382266e564dSmrg            str = "AuthNextPhase";
383266e564dSmrg	    break;
384266e564dSmrg        case ICE_ConnectionReply:
385266e564dSmrg            str = "ConnectionReply";
386266e564dSmrg	    break;
387266e564dSmrg        case ICE_ProtocolSetup:
388266e564dSmrg            str = "ProtocolSetup";
389266e564dSmrg	    break;
390266e564dSmrg        case ICE_ProtocolReply:
391266e564dSmrg            str = "ProtocolReply";
392266e564dSmrg	    break;
393266e564dSmrg        case ICE_Ping:
394266e564dSmrg            str = "Ping";
395266e564dSmrg	    break;
396266e564dSmrg        case ICE_PingReply:
397266e564dSmrg            str = "PingReply";
398266e564dSmrg	    break;
399266e564dSmrg        case ICE_WantToClose:
400266e564dSmrg            str = "WantToClose";
401266e564dSmrg	    break;
402266e564dSmrg        case ICE_NoClose:
403266e564dSmrg            str = "NoClose";
404266e564dSmrg	    break;
405266e564dSmrg	default:
406266e564dSmrg	    str = "";
407266e564dSmrg	}
408266e564dSmrg
409266e564dSmrg    fprintf (stderr, "\n");
410266e564dSmrg
411266e564dSmrg    fprintf (stderr, "ICE error:  Offending minor opcode    = %d (%s)\n",
412266e564dSmrg	offendingMinorOpcode, str);
413266e564dSmrg
414266e564dSmrg    fprintf (stderr, "            Offending sequence number = %lu\n",
415266e564dSmrg	offendingSequence);
416266e564dSmrg
417266e564dSmrg    switch (errorClass)
418266e564dSmrg    {
419266e564dSmrg        case IceBadMinor:
420266e564dSmrg            str = "BadMinor";
421266e564dSmrg            break;
422266e564dSmrg        case IceBadState:
423266e564dSmrg            str = "BadState";
424266e564dSmrg            break;
425266e564dSmrg        case IceBadLength:
426266e564dSmrg            str = "BadLength";
427266e564dSmrg            break;
428266e564dSmrg        case IceBadValue:
429266e564dSmrg            str = "BadValue";
430266e564dSmrg            break;
431266e564dSmrg        case IceBadMajor:
432266e564dSmrg            str = "BadMajor";
433266e564dSmrg            break;
434266e564dSmrg        case IceNoAuth:
435266e564dSmrg            str = "NoAuthentication";
436266e564dSmrg            break;
437266e564dSmrg        case IceNoVersion:
438266e564dSmrg            str = "NoVersion";
439266e564dSmrg            break;
440266e564dSmrg        case IceSetupFailed:
441266e564dSmrg            str = "SetupFailed";
442266e564dSmrg            break;
443266e564dSmrg        case IceAuthRejected:
444266e564dSmrg            str = "AuthenticationRejected";
445266e564dSmrg            break;
446266e564dSmrg        case IceAuthFailed:
447266e564dSmrg            str = "AuthenticationFailed";
448266e564dSmrg            break;
449266e564dSmrg        case IceProtocolDuplicate:
450266e564dSmrg            str = "ProtocolDuplicate";
451266e564dSmrg            break;
452266e564dSmrg        case IceMajorOpcodeDuplicate:
453266e564dSmrg            str = "MajorOpcodeDuplicate";
454266e564dSmrg            break;
455266e564dSmrg        case IceUnknownProtocol:
456266e564dSmrg            str = "UnknownProtocol";
457266e564dSmrg            break;
458266e564dSmrg	default:
459266e564dSmrg	    str = "???";
460266e564dSmrg    }
461266e564dSmrg
462266e564dSmrg    fprintf (stderr, "            Error class               = %s\n", str);
463266e564dSmrg
464266e564dSmrg    if (severity == IceCanContinue)
465266e564dSmrg	str = "CanContinue";
466266e564dSmrg    else if (severity == IceFatalToProtocol)
467266e564dSmrg	str = "FatalToProtocol";
468266e564dSmrg    else if (severity == IceFatalToConnection)
469266e564dSmrg	str = "FatalToConnection";
470266e564dSmrg    else
471266e564dSmrg	str = "???";
472266e564dSmrg
473266e564dSmrg    fprintf (stderr, "            Severity                  = %s\n", str);
474266e564dSmrg
475266e564dSmrg    switch (errorClass)
476266e564dSmrg    {
477266e564dSmrg        case IceBadValue:
478266e564dSmrg        {
479266e564dSmrg	    int offset, length, val;
480266e564dSmrg
481266e564dSmrg	    EXTRACT_CARD32 (pData, swap, offset);
482266e564dSmrg	    EXTRACT_CARD32 (pData, swap, length);
483266e564dSmrg
484266e564dSmrg	    fprintf (stderr,
485266e564dSmrg		"            BadValue Offset           = %d\n", offset);
486266e564dSmrg	    fprintf (stderr,
487266e564dSmrg		"            BadValue Length           = %d\n", length);
488266e564dSmrg
489266e564dSmrg	    if (length <= 4)
490266e564dSmrg	    {
491266e564dSmrg		if (length == 1)
492266e564dSmrg		    val = (int) *pData;
493266e564dSmrg		else if (length == 2)
494266e564dSmrg		{
495266e564dSmrg		    EXTRACT_CARD16 (pData, swap, val);
496266e564dSmrg		}
497266e564dSmrg		else
498266e564dSmrg		{
499266e564dSmrg		    EXTRACT_CARD32 (pData, swap, val);
500266e564dSmrg		}
501266e564dSmrg
502266e564dSmrg		fprintf (stderr,
503266e564dSmrg	            "            BadValue                  = %d\n", val);
504266e564dSmrg	    }
505266e564dSmrg            break;
506266e564dSmrg	}
507266e564dSmrg
508266e564dSmrg        case IceBadMajor:
509266e564dSmrg
510266e564dSmrg	    fprintf (stderr, "Major opcode : %d\n", (int) *pData);
511266e564dSmrg            break;
512266e564dSmrg
513266e564dSmrg        case IceSetupFailed:
514266e564dSmrg
5159ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5169ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5179ef0b394Smrg            free(estr);
518266e564dSmrg            break;
519266e564dSmrg
520266e564dSmrg        case IceAuthRejected:
521266e564dSmrg
5229ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5239ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5249ef0b394Smrg            free(estr);
525266e564dSmrg            break;
526266e564dSmrg
527266e564dSmrg        case IceAuthFailed:
528266e564dSmrg
5299ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5309ef0b394Smrg            fprintf (stderr, "Reason : %s\n", estr);
5319ef0b394Smrg            free(estr);
532266e564dSmrg            break;
533266e564dSmrg
534266e564dSmrg        case IceProtocolDuplicate:
535266e564dSmrg
5369ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5379ef0b394Smrg            fprintf (stderr, "Protocol name : %s\n", estr);
5389ef0b394Smrg            free(estr);
539266e564dSmrg            break;
540266e564dSmrg
541266e564dSmrg        case IceMajorOpcodeDuplicate:
542266e564dSmrg
5439ef0b394Smrg            fprintf (stderr, "Major opcode : %d\n", (int) *pData);
544266e564dSmrg            break;
545266e564dSmrg
546266e564dSmrg        case IceUnknownProtocol:
547266e564dSmrg
5489ef0b394Smrg            EXTRACT_STRING (pData, swap, estr);
5499ef0b394Smrg            fprintf (stderr, "Protocol name : %s\n", estr);
5509ef0b394Smrg            free(estr);
551266e564dSmrg            break;
552266e564dSmrg
553266e564dSmrg	default:
554266e564dSmrg	    break;
555266e564dSmrg    }
556266e564dSmrg
557266e564dSmrg    fprintf (stderr, "\n");
558266e564dSmrg
559266e564dSmrg    if (severity != IceCanContinue)
560266e564dSmrg	exit (1);
561266e564dSmrg}
562266e564dSmrg
563c5629e66SmrgIceErrorHandler   _IceErrorHandler   = _IceDefaultErrorHandler;
564266e564dSmrg
565a3129944Smrg
5669ef0b394Smrg/*
567266e564dSmrg * This procedure sets the ICE error handler to be the specified
568266e564dSmrg * routine.  If NULL is passed in the default error handler is restored.
569266e564dSmrg * The function's return value is the previous error handler.
570266e564dSmrg */
5719ef0b394Smrg
572266e564dSmrgIceErrorHandler
573c5629e66SmrgIceSetErrorHandler (
574c5629e66Smrg	IceErrorHandler handler
575c5629e66Smrg)
576266e564dSmrg{
577266e564dSmrg    IceErrorHandler oldHandler = _IceErrorHandler;
578266e564dSmrg
579266e564dSmrg    if (handler != NULL)
580266e564dSmrg	_IceErrorHandler = handler;
581266e564dSmrg    else
582266e564dSmrg	_IceErrorHandler = _IceDefaultErrorHandler;
583266e564dSmrg
584266e564dSmrg    return (oldHandler);
585266e564dSmrg}
586266e564dSmrg
587266e564dSmrg
588a3129944Smrg
589266e564dSmrg/*
590266e564dSmrg * Default IO error handler.
591266e564dSmrg */
592266e564dSmrg
593c5629e66Smrgstatic void
594c5629e66Smrg_IceDefaultIOErrorHandler (
595c5629e66Smrg	IceConn		iceConn
596c5629e66Smrg)
597266e564dSmrg{
598266e564dSmrg    fprintf (stderr,
599266e564dSmrg	"ICE default IO error handler doing an exit(), pid = %ld, errno = %d\n",
600266e564dSmrg	(long)getpid(), errno);
601266e564dSmrg
602266e564dSmrg    exit (1);
603266e564dSmrg}
604266e564dSmrg
605c5629e66SmrgIceIOErrorHandler _IceIOErrorHandler = _IceDefaultIOErrorHandler;
606266e564dSmrg
607a3129944Smrg
6089ef0b394Smrg/*
609266e564dSmrg * This procedure sets the ICE fatal I/O error handler to be the
610266e564dSmrg * specified routine.  If NULL is passed in the default error
611266e564dSmrg * handler is restored.   The function's return value is the
612266e564dSmrg * previous error handler.
613266e564dSmrg */
6149ef0b394Smrg
615266e564dSmrgIceIOErrorHandler
616c5629e66SmrgIceSetIOErrorHandler (
617c5629e66Smrg	IceIOErrorHandler handler
618c5629e66Smrg)
619266e564dSmrg{
620266e564dSmrg    IceIOErrorHandler oldHandler = _IceIOErrorHandler;
621266e564dSmrg
622266e564dSmrg    if (handler != NULL)
623266e564dSmrg	_IceIOErrorHandler = handler;
624266e564dSmrg    else
625266e564dSmrg	_IceIOErrorHandler = _IceDefaultIOErrorHandler;
626266e564dSmrg
627266e564dSmrg    return (oldHandler);
628266e564dSmrg}
629